Repository: GoogleContainerTools/kaniko Branch: main Commit: 236ba5690eda Files: 6691 Total size: 67.8 MB Directory structure: gitextract_j9trgfvp/ ├── .dockerignore ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ └── bug_report.md │ ├── dependabot.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── images.yaml │ ├── integration-tests.yaml │ ├── nightly-vulnerability-scan.yml │ └── unit-tests.yaml ├── .gitignore ├── .golangci.yaml ├── .prettierrc ├── CHANGELOG.md ├── CONTRIBUTING.md ├── DEVELOPMENT.md ├── LICENSE ├── MAINTAINERS ├── Makefile ├── README.md ├── RELEASE.md ├── ROADMAP.md ├── SECURITY.md ├── Vagrantfile ├── benchmark.sh ├── cmd/ │ ├── executor/ │ │ ├── cmd/ │ │ │ ├── root.go │ │ │ ├── root_test.go │ │ │ └── version.go │ │ └── main.go │ └── warmer/ │ ├── cmd/ │ │ └── root.go │ └── main.go ├── code-of-conduct.md ├── cosign.pub ├── deploy/ │ └── Dockerfile ├── docs/ │ ├── design_proposals/ │ │ ├── design-proposal-template.md │ │ └── filesystem-resolution-proposal-01.md │ ├── designdoc.md │ ├── testplan.md │ └── tutorial.md ├── examples/ │ ├── kaniko-cache-claim.yaml │ ├── kaniko-cache-volume.yaml │ ├── kaniko-test.yaml │ ├── kaniko-warmer.yaml │ ├── pod-blobstorage.yaml │ ├── pod-build-profile.yaml │ ├── pod.yaml │ ├── volume-claim.yaml │ └── volume.yaml ├── files/ │ └── nsswitch.conf ├── go.mod ├── go.sum ├── hack/ │ ├── .gitignore │ ├── boilerplate/ │ │ ├── boilerplate.Dockerfile.txt │ │ ├── boilerplate.Makefile.txt │ │ ├── boilerplate.go.txt │ │ ├── boilerplate.py │ │ ├── boilerplate.py.txt │ │ └── boilerplate.sh.txt │ ├── boilerplate.sh │ ├── gofmt.sh │ ├── install_golint.sh │ ├── linter.sh │ ├── release.sh │ └── release_notes/ │ ├── changelog_template.txt │ └── listpullreqs.go ├── integration/ │ ├── .dockerignore │ ├── .gitignore │ ├── BUILD │ ├── benchmark_fs/ │ │ ├── Dockerfile │ │ ├── cloudbuild.yaml │ │ ├── context.txt │ │ └── make.sh │ ├── benchmark_test.go │ ├── cleanup.go │ ├── cmd.go │ ├── config.go │ ├── context/ │ │ ├── arr[0].txt │ │ ├── bar/ │ │ │ ├── bam/ │ │ │ │ └── bat │ │ │ ├── bat │ │ │ └── baz │ │ ├── empty/ │ │ │ └── .gitignore │ │ ├── foo │ │ ├── qux/ │ │ │ ├── qup │ │ │ ├── quw/ │ │ │ │ └── que │ │ │ └── quz │ │ ├── tars/ │ │ │ ├── file │ │ │ └── file.bz2 │ │ └── workspace/ │ │ └── test │ ├── dockerfiles/ │ │ ├── 1097 │ │ ├── Dockerfile_dockerignore_relative │ │ ├── Dockerfile_dockerignore_relative.dockerignore │ │ ├── Dockerfile_git_buildcontext │ │ ├── Dockerfile_hardlink_base │ │ ├── Dockerfile_onbuild_base │ │ ├── Dockerfile_registry_mirror │ │ ├── Dockerfile_relative_copy │ │ ├── Dockerfile_test_add │ │ ├── Dockerfile_test_add_404 │ │ ├── Dockerfile_test_add_chown_intermediate_dirs │ │ ├── Dockerfile_test_add_dest_symlink_dir │ │ ├── Dockerfile_test_add_url_with_arg │ │ ├── Dockerfile_test_arg_blank_with_quotes │ │ ├── Dockerfile_test_arg_from_quotes │ │ ├── Dockerfile_test_arg_from_single_quotes │ │ ├── Dockerfile_test_arg_multi │ │ ├── Dockerfile_test_arg_multi_empty_val │ │ ├── Dockerfile_test_arg_multi_with_quotes │ │ ├── Dockerfile_test_arg_secret │ │ ├── Dockerfile_test_arg_two_level │ │ ├── Dockerfile_test_cache │ │ ├── Dockerfile_test_cache_copy │ │ ├── Dockerfile_test_cache_copy_oci │ │ ├── Dockerfile_test_cache_install │ │ ├── Dockerfile_test_cache_install_oci │ │ ├── Dockerfile_test_cache_oci │ │ ├── Dockerfile_test_cache_perm │ │ ├── Dockerfile_test_cache_perm_oci │ │ ├── Dockerfile_test_cmd │ │ ├── Dockerfile_test_complex_substitution │ │ ├── Dockerfile_test_copy │ │ ├── Dockerfile_test_copy_bucket │ │ ├── Dockerfile_test_copy_chown_intermediate_dirs │ │ ├── Dockerfile_test_copy_chown_nonexisting_user │ │ ├── Dockerfile_test_copy_reproducible │ │ ├── Dockerfile_test_copy_root_multistage │ │ ├── Dockerfile_test_copy_same_file_many_times │ │ ├── Dockerfile_test_copy_symlink │ │ ├── Dockerfile_test_copyadd_chmod │ │ ├── Dockerfile_test_daemons │ │ ├── Dockerfile_test_dangling_symlink │ │ ├── Dockerfile_test_deleted_file_cached │ │ ├── Dockerfile_test_dockerignore │ │ ├── Dockerfile_test_env │ │ ├── Dockerfile_test_expose │ │ ├── Dockerfile_test_extract_fs │ │ ├── Dockerfile_test_extraction │ │ ├── Dockerfile_test_from_multistage_capital │ │ ├── Dockerfile_test_hardlink │ │ ├── Dockerfile_test_ignore │ │ ├── Dockerfile_test_issue_1039 │ │ ├── Dockerfile_test_issue_1837 │ │ ├── Dockerfile_test_issue_2049 │ │ ├── Dockerfile_test_issue_2066 │ │ ├── Dockerfile_test_issue_519 │ │ ├── Dockerfile_test_issue_647 │ │ ├── Dockerfile_test_issue_684 │ │ ├── Dockerfile_test_issue_704 │ │ ├── Dockerfile_test_label │ │ ├── Dockerfile_test_maintainer │ │ ├── Dockerfile_test_meta_arg │ │ ├── Dockerfile_test_metadata │ │ ├── Dockerfile_test_multistage │ │ ├── Dockerfile_test_multistage_args_issue_1911 │ │ ├── Dockerfile_test_mv_add │ │ ├── Dockerfile_test_onbuild │ │ ├── Dockerfile_test_parent_dir_perms │ │ ├── Dockerfile_test_registry │ │ ├── Dockerfile_test_replaced_hardlinks │ │ ├── Dockerfile_test_replaced_symlinks │ │ ├── Dockerfile_test_run │ │ ├── Dockerfile_test_run_2 │ │ ├── Dockerfile_test_run_new │ │ ├── Dockerfile_test_run_redo │ │ ├── Dockerfile_test_scratch │ │ ├── Dockerfile_test_snapshotter_ignorelist │ │ ├── Dockerfile_test_target │ │ ├── Dockerfile_test_user │ │ ├── Dockerfile_test_user_home │ │ ├── Dockerfile_test_user_nonexisting │ │ ├── Dockerfile_test_user_run │ │ ├── Dockerfile_test_volume │ │ ├── Dockerfile_test_volume_2 │ │ ├── Dockerfile_test_volume_3 │ │ ├── Dockerfile_test_volume_4 │ │ ├── Dockerfile_test_whitelist │ │ ├── Dockerfile_test_workdir │ │ ├── Dockerfile_test_workdir_with_user │ │ ├── TestReplaceFolderWithFile │ │ └── TestReplaceFolderWithLink │ ├── dockerfiles-with-context/ │ │ ├── issue-1020/ │ │ │ ├── Dockerfile │ │ │ └── package.json │ │ ├── issue-1315/ │ │ │ └── Dockerfile │ │ ├── issue-2075/ │ │ │ ├── Dockerfile │ │ │ └── top1 │ │ ├── issue-57/ │ │ │ ├── Dockerfile │ │ │ ├── a.txt │ │ │ └── b.txt │ │ ├── issue-721/ │ │ │ ├── Dockerfile │ │ │ └── test.txt │ │ └── issue-774/ │ │ ├── Dockerfile │ │ └── test-file │ ├── ignore/ │ │ ├── bar │ │ ├── baz │ │ └── foo │ ├── ignore_relative/ │ │ ├── bar │ │ ├── baz │ │ └── foo │ ├── images.go │ ├── integration_test.go │ ├── integration_with_context_test.go │ ├── integration_with_stdin_test.go │ ├── k8s-job.yaml │ ├── k8s_test.go │ ├── tar.go │ └── testdata/ │ ├── Dockerfile.trivial │ ├── build.yaml │ ├── exec.yaml │ ├── exit-code-propagation/ │ │ └── Dockerfile_exit_code_propagation │ ├── files.yaml │ └── testfiles.yaml ├── logo/ │ └── README.md ├── pkg/ │ ├── buildcontext/ │ │ ├── azureblob.go │ │ ├── buildcontext.go │ │ ├── dir.go │ │ ├── gcs.go │ │ ├── git.go │ │ ├── git_test.go │ │ ├── https.go │ │ ├── https_test.go │ │ ├── s3.go │ │ ├── tar.go │ │ └── tar_test.go │ ├── cache/ │ │ ├── cache.go │ │ ├── doc_test.go │ │ ├── errors.go │ │ ├── warm.go │ │ └── warm_test.go │ ├── commands/ │ │ ├── add.go │ │ ├── add_test.go │ │ ├── arg.go │ │ ├── base_command.go │ │ ├── cache.go │ │ ├── cache_test.go │ │ ├── cmd.go │ │ ├── cmd_test.go │ │ ├── commands.go │ │ ├── copy.go │ │ ├── copy_test.go │ │ ├── entrypoint.go │ │ ├── entrypoint_test.go │ │ ├── env.go │ │ ├── env_test.go │ │ ├── expose.go │ │ ├── expose_test.go │ │ ├── fake_commands.go │ │ ├── healthcheck.go │ │ ├── label.go │ │ ├── label_test.go │ │ ├── onbuild.go │ │ ├── onbuild_test.go │ │ ├── run.go │ │ ├── run_marker.go │ │ ├── run_test.go │ │ ├── shell.go │ │ ├── shell_test.go │ │ ├── stopsignal.go │ │ ├── stopsignal_test.go │ │ ├── user.go │ │ ├── user_test.go │ │ ├── volume.go │ │ ├── volume_test.go │ │ ├── workdir.go │ │ └── workdir_test.go │ ├── config/ │ │ ├── args.go │ │ ├── args_test.go │ │ ├── init.go │ │ ├── options.go │ │ ├── options_test.go │ │ └── stage.go │ ├── constants/ │ │ └── constants.go │ ├── creds/ │ │ └── creds.go │ ├── dockerfile/ │ │ ├── buildargs.go │ │ ├── dockerfile.go │ │ └── dockerfile_test.go │ ├── executor/ │ │ ├── build.go │ │ ├── build_test.go │ │ ├── composite_cache.go │ │ ├── composite_cache_test.go │ │ ├── copy_multistage_test.go │ │ ├── fakes.go │ │ ├── push.go │ │ └── push_test.go │ ├── fakes/ │ │ └── image.go │ ├── filesystem/ │ │ ├── resolve.go │ │ └── resolve_test.go │ ├── image/ │ │ ├── image_util.go │ │ ├── image_util_test.go │ │ └── remote/ │ │ ├── remote.go │ │ └── remote_test.go │ ├── logging/ │ │ └── logging.go │ ├── mocks/ │ │ └── go-containerregistry/ │ │ └── mockv1/ │ │ └── mocks.go │ ├── snapshot/ │ │ ├── layered_map.go │ │ ├── layered_map_test.go │ │ ├── snapshot.go │ │ └── snapshot_test.go │ ├── timing/ │ │ ├── timing.go │ │ └── timing_test.go │ ├── util/ │ │ ├── .editorconfig │ │ ├── azureblob_util.go │ │ ├── azureblob_util_test.go │ │ ├── bucket/ │ │ │ ├── bucket_util.go │ │ │ └── bucket_util_test.go │ │ ├── command_util.go │ │ ├── command_util_test.go │ │ ├── fs_util.go │ │ ├── fs_util_test.go │ │ ├── gcr_util.go │ │ ├── gcr_util_test.go │ │ ├── groupids_cgo.go │ │ ├── groupids_fallback.go │ │ ├── proc/ │ │ │ ├── proc.go │ │ │ └── proc_test.go │ │ ├── syscall_credentials.go │ │ ├── syscall_credentials_test.go │ │ ├── tar_util.go │ │ ├── tar_util_test.go │ │ ├── transport_util.go │ │ ├── transport_util_test.go │ │ ├── util.go │ │ └── util_test.go │ └── version/ │ └── version.go ├── run_in_docker.sh ├── scripts/ │ ├── boxed_warm_in_docker.sh │ ├── integration-test.sh │ ├── k3s-setup.sh │ ├── local-registry-helm.yaml │ ├── misc-integration-test.sh │ └── test.sh ├── testutil/ │ ├── constants.go │ └── util.go ├── tools/ │ └── tools.go └── vendor/ ├── cel.dev/ │ └── expr/ │ ├── .bazelversion │ ├── .gitattributes │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── GOVERNANCE.md │ ├── LICENSE │ ├── MAINTAINERS.md │ ├── MODULE.bazel │ ├── README.md │ ├── WORKSPACE │ ├── WORKSPACE.bzlmod │ ├── checked.pb.go │ ├── cloudbuild.yaml │ ├── eval.pb.go │ ├── explain.pb.go │ ├── regen_go_proto.sh │ ├── regen_go_proto_canonical_protos.sh │ ├── syntax.pb.go │ └── value.pb.go ├── cloud.google.com/ │ └── go/ │ ├── LICENSE │ ├── auth/ │ │ ├── CHANGES.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── auth.go │ │ ├── credentials/ │ │ │ ├── compute.go │ │ │ ├── detect.go │ │ │ ├── doc.go │ │ │ ├── filetypes.go │ │ │ ├── internal/ │ │ │ │ ├── externalaccount/ │ │ │ │ │ ├── aws_provider.go │ │ │ │ │ ├── executable_provider.go │ │ │ │ │ ├── externalaccount.go │ │ │ │ │ ├── file_provider.go │ │ │ │ │ ├── info.go │ │ │ │ │ ├── programmatic_provider.go │ │ │ │ │ ├── url_provider.go │ │ │ │ │ └── x509_provider.go │ │ │ │ ├── externalaccountuser/ │ │ │ │ │ └── externalaccountuser.go │ │ │ │ ├── gdch/ │ │ │ │ │ └── gdch.go │ │ │ │ ├── impersonate/ │ │ │ │ │ ├── idtoken.go │ │ │ │ │ └── impersonate.go │ │ │ │ └── stsexchange/ │ │ │ │ └── sts_exchange.go │ │ │ └── selfsignedjwt.go │ │ ├── grpctransport/ │ │ │ ├── dial_socketopt.go │ │ │ ├── directpath.go │ │ │ ├── grpctransport.go │ │ │ └── pool.go │ │ ├── httptransport/ │ │ │ ├── httptransport.go │ │ │ └── transport.go │ │ ├── internal/ │ │ │ ├── compute/ │ │ │ │ ├── compute.go │ │ │ │ ├── manufacturer.go │ │ │ │ ├── manufacturer_linux.go │ │ │ │ └── manufacturer_windows.go │ │ │ ├── credsfile/ │ │ │ │ ├── credsfile.go │ │ │ │ ├── filetype.go │ │ │ │ └── parse.go │ │ │ ├── internal.go │ │ │ ├── jwt/ │ │ │ │ └── jwt.go │ │ │ └── transport/ │ │ │ ├── cba.go │ │ │ ├── cert/ │ │ │ │ ├── default_cert.go │ │ │ │ ├── enterprise_cert.go │ │ │ │ ├── secureconnect_cert.go │ │ │ │ └── workload_cert.go │ │ │ ├── s2a.go │ │ │ └── transport.go │ │ ├── oauth2adapt/ │ │ │ ├── CHANGES.md │ │ │ ├── LICENSE │ │ │ └── oauth2adapt.go │ │ └── threelegged.go │ ├── compute/ │ │ └── metadata/ │ │ ├── CHANGES.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── log.go │ │ ├── metadata.go │ │ ├── retry.go │ │ ├── retry_linux.go │ │ ├── syscheck.go │ │ ├── syscheck_linux.go │ │ └── syscheck_windows.go │ ├── iam/ │ │ ├── CHANGES.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── apiv1/ │ │ │ └── iampb/ │ │ │ ├── iam_policy.pb.go │ │ │ ├── options.pb.go │ │ │ ├── policy.pb.go │ │ │ └── resource_policy_member.pb.go │ │ └── iam.go │ ├── internal/ │ │ ├── .repo-metadata-full.json │ │ ├── README.md │ │ ├── annotate.go │ │ ├── gen_info.sh │ │ ├── optional/ │ │ │ └── optional.go │ │ ├── retry.go │ │ ├── trace/ │ │ │ └── trace.go │ │ └── version/ │ │ ├── update_version.sh │ │ └── version.go │ ├── monitoring/ │ │ ├── LICENSE │ │ ├── apiv3/ │ │ │ └── v2/ │ │ │ ├── alert_policy_client.go │ │ │ ├── auxiliary.go │ │ │ ├── auxiliary_go123.go │ │ │ ├── doc.go │ │ │ ├── gapic_metadata.json │ │ │ ├── group_client.go │ │ │ ├── helpers.go │ │ │ ├── metric_client.go │ │ │ ├── monitoringpb/ │ │ │ │ ├── alert.pb.go │ │ │ │ ├── alert_service.pb.go │ │ │ │ ├── common.pb.go │ │ │ │ ├── dropped_labels.pb.go │ │ │ │ ├── group.pb.go │ │ │ │ ├── group_service.pb.go │ │ │ │ ├── metric.pb.go │ │ │ │ ├── metric_service.pb.go │ │ │ │ ├── mutation_record.pb.go │ │ │ │ ├── notification.pb.go │ │ │ │ ├── notification_service.pb.go │ │ │ │ ├── query_service.pb.go │ │ │ │ ├── service.pb.go │ │ │ │ ├── service_service.pb.go │ │ │ │ ├── snooze.pb.go │ │ │ │ ├── snooze_service.pb.go │ │ │ │ ├── span_context.pb.go │ │ │ │ ├── uptime.pb.go │ │ │ │ └── uptime_service.pb.go │ │ │ ├── notification_channel_client.go │ │ │ ├── query_client.go │ │ │ ├── service_monitoring_client.go │ │ │ ├── snooze_client.go │ │ │ ├── uptime_check_client.go │ │ │ └── version.go │ │ └── internal/ │ │ └── version.go │ └── storage/ │ ├── CHANGES.md │ ├── LICENSE │ ├── README.md │ ├── acl.go │ ├── bucket.go │ ├── client.go │ ├── copy.go │ ├── doc.go │ ├── dynamic_delay.go │ ├── emulator_test.sh │ ├── experimental/ │ │ └── experimental.go │ ├── grpc_client.go │ ├── grpc_dp.go │ ├── grpc_metrics.go │ ├── grpc_reader.go │ ├── grpc_reader_multi_range.go │ ├── grpc_writer.go │ ├── hmac.go │ ├── http_client.go │ ├── iam.go │ ├── internal/ │ │ ├── apiv2/ │ │ │ ├── auxiliary.go │ │ │ ├── auxiliary_go123.go │ │ │ ├── doc.go │ │ │ ├── gapic_metadata.json │ │ │ ├── helpers.go │ │ │ ├── storage_client.go │ │ │ ├── storagepb/ │ │ │ │ └── storage.pb.go │ │ │ └── version.go │ │ ├── experimental.go │ │ └── version.go │ ├── invoke.go │ ├── notifications.go │ ├── option.go │ ├── post_policy_v4.go │ ├── reader.go │ ├── storage.go │ ├── storage.replay │ ├── trace.go │ └── writer.go ├── dario.cat/ │ └── mergo/ │ ├── .deepsource.toml │ ├── .gitignore │ ├── .travis.yml │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── FUNDING.json │ ├── LICENSE │ ├── README.md │ ├── SECURITY.md │ ├── doc.go │ ├── map.go │ ├── merge.go │ └── mergo.go ├── github.com/ │ ├── Azure/ │ │ ├── azure-sdk-for-go/ │ │ │ ├── LICENSE.txt │ │ │ ├── NOTICE.txt │ │ │ ├── sdk/ │ │ │ │ ├── azcore/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── README.md │ │ │ │ │ ├── ci.yml │ │ │ │ │ ├── cloud/ │ │ │ │ │ │ ├── cloud.go │ │ │ │ │ │ └── doc.go │ │ │ │ │ ├── core.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── etag.go │ │ │ │ │ ├── internal/ │ │ │ │ │ │ ├── exported/ │ │ │ │ │ │ │ ├── exported.go │ │ │ │ │ │ │ ├── pipeline.go │ │ │ │ │ │ │ ├── request.go │ │ │ │ │ │ │ └── response_error.go │ │ │ │ │ │ ├── log/ │ │ │ │ │ │ │ └── log.go │ │ │ │ │ │ ├── pollers/ │ │ │ │ │ │ │ ├── async/ │ │ │ │ │ │ │ │ └── async.go │ │ │ │ │ │ │ ├── body/ │ │ │ │ │ │ │ │ └── body.go │ │ │ │ │ │ │ ├── fake/ │ │ │ │ │ │ │ │ └── fake.go │ │ │ │ │ │ │ ├── loc/ │ │ │ │ │ │ │ │ └── loc.go │ │ │ │ │ │ │ ├── op/ │ │ │ │ │ │ │ │ └── op.go │ │ │ │ │ │ │ ├── poller.go │ │ │ │ │ │ │ └── util.go │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ ├── constants.go │ │ │ │ │ │ └── shared.go │ │ │ │ │ ├── log/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ └── log.go │ │ │ │ │ ├── policy/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ └── policy.go │ │ │ │ │ ├── runtime/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── errors.go │ │ │ │ │ │ ├── pager.go │ │ │ │ │ │ ├── pipeline.go │ │ │ │ │ │ ├── policy_api_version.go │ │ │ │ │ │ ├── policy_bearer_token.go │ │ │ │ │ │ ├── policy_body_download.go │ │ │ │ │ │ ├── policy_http_header.go │ │ │ │ │ │ ├── policy_http_trace.go │ │ │ │ │ │ ├── policy_include_response.go │ │ │ │ │ │ ├── policy_key_credential.go │ │ │ │ │ │ ├── policy_logging.go │ │ │ │ │ │ ├── policy_request_id.go │ │ │ │ │ │ ├── policy_retry.go │ │ │ │ │ │ ├── policy_sas_credential.go │ │ │ │ │ │ ├── policy_telemetry.go │ │ │ │ │ │ ├── poller.go │ │ │ │ │ │ ├── request.go │ │ │ │ │ │ ├── response.go │ │ │ │ │ │ ├── transport_default_dialer_other.go │ │ │ │ │ │ ├── transport_default_dialer_wasm.go │ │ │ │ │ │ └── transport_default_http_client.go │ │ │ │ │ ├── streaming/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ └── progress.go │ │ │ │ │ ├── to/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ └── to.go │ │ │ │ │ └── tracing/ │ │ │ │ │ ├── constants.go │ │ │ │ │ └── tracing.go │ │ │ │ ├── internal/ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── diag/ │ │ │ │ │ │ ├── diag.go │ │ │ │ │ │ └── doc.go │ │ │ │ │ ├── errorinfo/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ └── errorinfo.go │ │ │ │ │ ├── exported/ │ │ │ │ │ │ └── exported.go │ │ │ │ │ ├── log/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ └── log.go │ │ │ │ │ ├── poller/ │ │ │ │ │ │ └── util.go │ │ │ │ │ ├── temporal/ │ │ │ │ │ │ └── resource.go │ │ │ │ │ └── uuid/ │ │ │ │ │ ├── doc.go │ │ │ │ │ └── uuid.go │ │ │ │ └── storage/ │ │ │ │ └── azblob/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── README.md │ │ │ │ ├── appendblob/ │ │ │ │ │ ├── client.go │ │ │ │ │ ├── models.go │ │ │ │ │ └── responses.go │ │ │ │ ├── assets.json │ │ │ │ ├── blob/ │ │ │ │ │ ├── client.go │ │ │ │ │ ├── constants.go │ │ │ │ │ ├── models.go │ │ │ │ │ ├── responses.go │ │ │ │ │ ├── retry_reader.go │ │ │ │ │ └── utils.go │ │ │ │ ├── bloberror/ │ │ │ │ │ └── error_codes.go │ │ │ │ ├── blockblob/ │ │ │ │ │ ├── chunkwriting.go │ │ │ │ │ ├── client.go │ │ │ │ │ ├── constants.go │ │ │ │ │ ├── models.go │ │ │ │ │ └── responses.go │ │ │ │ ├── ci.yml │ │ │ │ ├── client.go │ │ │ │ ├── common.go │ │ │ │ ├── constants.go │ │ │ │ ├── container/ │ │ │ │ │ ├── batch_builder.go │ │ │ │ │ ├── client.go │ │ │ │ │ ├── constants.go │ │ │ │ │ ├── models.go │ │ │ │ │ └── responses.go │ │ │ │ ├── doc.go │ │ │ │ ├── internal/ │ │ │ │ │ ├── base/ │ │ │ │ │ │ └── clients.go │ │ │ │ │ ├── exported/ │ │ │ │ │ │ ├── access_conditions.go │ │ │ │ │ │ ├── access_policy.go │ │ │ │ │ │ ├── blob_batch.go │ │ │ │ │ │ ├── exported.go │ │ │ │ │ │ ├── log_events.go │ │ │ │ │ │ ├── set_expiry.go │ │ │ │ │ │ ├── shared_key_credential.go │ │ │ │ │ │ ├── transfer_validation_option.go │ │ │ │ │ │ ├── user_delegation_credential.go │ │ │ │ │ │ └── version.go │ │ │ │ │ ├── generated/ │ │ │ │ │ │ ├── appendblob_client.go │ │ │ │ │ │ ├── autorest.md │ │ │ │ │ │ ├── blob_client.go │ │ │ │ │ │ ├── block_blob_client.go │ │ │ │ │ │ ├── build.go │ │ │ │ │ │ ├── constants.go │ │ │ │ │ │ ├── container_client.go │ │ │ │ │ │ ├── models.go │ │ │ │ │ │ ├── pageblob_client.go │ │ │ │ │ │ ├── service_client.go │ │ │ │ │ │ ├── zz_appendblob_client.go │ │ │ │ │ │ ├── zz_blob_client.go │ │ │ │ │ │ ├── zz_blockblob_client.go │ │ │ │ │ │ ├── zz_constants.go │ │ │ │ │ │ ├── zz_container_client.go │ │ │ │ │ │ ├── zz_models.go │ │ │ │ │ │ ├── zz_models_serde.go │ │ │ │ │ │ ├── zz_options.go │ │ │ │ │ │ ├── zz_pageblob_client.go │ │ │ │ │ │ ├── zz_responses.go │ │ │ │ │ │ ├── zz_service_client.go │ │ │ │ │ │ ├── zz_time_rfc1123.go │ │ │ │ │ │ ├── zz_time_rfc3339.go │ │ │ │ │ │ └── zz_xml_helper.go │ │ │ │ │ └── shared/ │ │ │ │ │ ├── batch_transfer.go │ │ │ │ │ ├── buffer_manager.go │ │ │ │ │ ├── bytes_writer.go │ │ │ │ │ ├── challenge_policy.go │ │ │ │ │ ├── mmf_unix.go │ │ │ │ │ ├── mmf_windows.go │ │ │ │ │ ├── section_writer.go │ │ │ │ │ └── shared.go │ │ │ │ ├── log.go │ │ │ │ ├── migrationguide.md │ │ │ │ ├── models.go │ │ │ │ ├── pageblob/ │ │ │ │ │ ├── client.go │ │ │ │ │ ├── constants.go │ │ │ │ │ ├── models.go │ │ │ │ │ └── responses.go │ │ │ │ ├── responses.go │ │ │ │ ├── sas/ │ │ │ │ │ ├── account.go │ │ │ │ │ ├── query_params.go │ │ │ │ │ ├── service.go │ │ │ │ │ └── url_parts.go │ │ │ │ ├── service/ │ │ │ │ │ ├── batch_builder.go │ │ │ │ │ ├── client.go │ │ │ │ │ ├── constants.go │ │ │ │ │ ├── models.go │ │ │ │ │ └── responses.go │ │ │ │ └── test-resources.json │ │ │ ├── services/ │ │ │ │ └── preview/ │ │ │ │ └── containerregistry/ │ │ │ │ └── runtime/ │ │ │ │ └── 2019-08-15-preview/ │ │ │ │ └── containerregistry/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── accesstokens.go │ │ │ │ ├── blob.go │ │ │ │ ├── client.go │ │ │ │ ├── dataplane_meta.json │ │ │ │ ├── manifests.go │ │ │ │ ├── models.go │ │ │ │ ├── refreshtokens.go │ │ │ │ ├── repository.go │ │ │ │ ├── tag.go │ │ │ │ ├── v2support.go │ │ │ │ └── version.go │ │ │ └── version/ │ │ │ └── version.go │ │ └── go-ansiterm/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── constants.go │ │ ├── context.go │ │ ├── csi_entry_state.go │ │ ├── csi_param_state.go │ │ ├── escape_intermediate_state.go │ │ ├── escape_state.go │ │ ├── event_handler.go │ │ ├── ground_state.go │ │ ├── osc_string_state.go │ │ ├── parser.go │ │ ├── parser_action_helpers.go │ │ ├── parser_actions.go │ │ ├── states.go │ │ ├── utilities.go │ │ └── winterm/ │ │ ├── ansi.go │ │ ├── api.go │ │ ├── attr_translation.go │ │ ├── cursor_helpers.go │ │ ├── erase_helpers.go │ │ ├── scroll_helper.go │ │ ├── utilities.go │ │ └── win_event_handler.go │ ├── GoogleCloudPlatform/ │ │ └── opentelemetry-operations-go/ │ │ ├── detectors/ │ │ │ └── gcp/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── app_engine.go │ │ │ ├── bms.go │ │ │ ├── detector.go │ │ │ ├── faas.go │ │ │ ├── gce.go │ │ │ └── gke.go │ │ ├── exporter/ │ │ │ └── metric/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── cloudmonitoring.go │ │ │ ├── constants.go │ │ │ ├── error.go │ │ │ ├── metric.go │ │ │ ├── option.go │ │ │ └── version.go │ │ └── internal/ │ │ └── resourcemapping/ │ │ ├── LICENSE │ │ └── resourcemapping.go │ ├── Microsoft/ │ │ ├── go-winio/ │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── .golangci.yml │ │ │ ├── CODEOWNERS │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── SECURITY.md │ │ │ ├── backup.go │ │ │ ├── backuptar/ │ │ │ │ ├── doc.go │ │ │ │ ├── strconv.go │ │ │ │ └── tar.go │ │ │ ├── doc.go │ │ │ ├── ea.go │ │ │ ├── file.go │ │ │ ├── fileinfo.go │ │ │ ├── hvsock.go │ │ │ ├── internal/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── fs.go │ │ │ │ │ ├── security.go │ │ │ │ │ └── zsyscall_windows.go │ │ │ │ ├── socket/ │ │ │ │ │ ├── rawaddr.go │ │ │ │ │ ├── socket.go │ │ │ │ │ └── zsyscall_windows.go │ │ │ │ └── stringbuffer/ │ │ │ │ └── wstring.go │ │ │ ├── pipe.go │ │ │ ├── pkg/ │ │ │ │ ├── bindfilter/ │ │ │ │ │ ├── bind_filter.go │ │ │ │ │ └── zsyscall_windows.go │ │ │ │ └── guid/ │ │ │ │ ├── guid.go │ │ │ │ ├── guid_nonwindows.go │ │ │ │ ├── guid_windows.go │ │ │ │ └── variant_string.go │ │ │ ├── privilege.go │ │ │ ├── reparse.go │ │ │ ├── sd.go │ │ │ ├── syscall.go │ │ │ ├── vhd/ │ │ │ │ ├── vhd.go │ │ │ │ └── zvhd_windows.go │ │ │ └── zsyscall_windows.go │ │ └── hcsshim/ │ │ ├── .clang-format │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── .golangci.yml │ │ ├── CODEOWNERS │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── Makefile.bootfiles │ │ ├── Protobuild.toml │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── cmd/ │ │ │ └── containerd-shim-runhcs-v1/ │ │ │ └── options/ │ │ │ ├── doc.go │ │ │ ├── runhcs.pb.go │ │ │ └── runhcs.proto │ │ ├── computestorage/ │ │ │ ├── attach.go │ │ │ ├── destroy.go │ │ │ ├── detach.go │ │ │ ├── export.go │ │ │ ├── format.go │ │ │ ├── helpers.go │ │ │ ├── import.go │ │ │ ├── initialize.go │ │ │ ├── mount.go │ │ │ ├── setup.go │ │ │ ├── storage.go │ │ │ └── zsyscall_windows.go │ │ ├── container.go │ │ ├── errors.go │ │ ├── hcsshim.go │ │ ├── hnsaccelnet.go │ │ ├── hnsendpoint.go │ │ ├── hnsglobals.go │ │ ├── hnsnetwork.go │ │ ├── hnspolicy.go │ │ ├── hnspolicylist.go │ │ ├── hnssupport.go │ │ ├── interface.go │ │ ├── internal/ │ │ │ ├── cow/ │ │ │ │ └── cow.go │ │ │ ├── hcs/ │ │ │ │ ├── callback.go │ │ │ │ ├── doc.go │ │ │ │ ├── errors.go │ │ │ │ ├── process.go │ │ │ │ ├── schema1/ │ │ │ │ │ └── schema1.go │ │ │ │ ├── schema2/ │ │ │ │ │ ├── attachment.go │ │ │ │ │ ├── battery.go │ │ │ │ │ ├── cache_query_stats_response.go │ │ │ │ │ ├── chipset.go │ │ │ │ │ ├── cimfs.go │ │ │ │ │ ├── close_handle.go │ │ │ │ │ ├── com_port.go │ │ │ │ │ ├── compute_system.go │ │ │ │ │ ├── configuration.go │ │ │ │ │ ├── console_size.go │ │ │ │ │ ├── container.go │ │ │ │ │ ├── container_credential_guard_add_instance_request.go │ │ │ │ │ ├── container_credential_guard_hv_socket_service_config.go │ │ │ │ │ ├── container_credential_guard_instance.go │ │ │ │ │ ├── container_credential_guard_modify_operation.go │ │ │ │ │ ├── container_credential_guard_operation_request.go │ │ │ │ │ ├── container_credential_guard_remove_instance_request.go │ │ │ │ │ ├── container_credential_guard_state.go │ │ │ │ │ ├── container_credential_guard_system_info.go │ │ │ │ │ ├── container_memory_information.go │ │ │ │ │ ├── cpu_group.go │ │ │ │ │ ├── cpu_group_affinity.go │ │ │ │ │ ├── cpu_group_config.go │ │ │ │ │ ├── cpu_group_configurations.go │ │ │ │ │ ├── cpu_group_operations.go │ │ │ │ │ ├── cpu_group_property.go │ │ │ │ │ ├── create_group_operation.go │ │ │ │ │ ├── debug_options.go │ │ │ │ │ ├── delete_group_operation.go │ │ │ │ │ ├── device.go │ │ │ │ │ ├── devices.go │ │ │ │ │ ├── enhanced_mode_video.go │ │ │ │ │ ├── firmware.go │ │ │ │ │ ├── flexible_io_device.go │ │ │ │ │ ├── guest_connection.go │ │ │ │ │ ├── guest_connection_info.go │ │ │ │ │ ├── guest_crash_reporting.go │ │ │ │ │ ├── guest_os.go │ │ │ │ │ ├── guest_state.go │ │ │ │ │ ├── host_processor_modify_request.go │ │ │ │ │ ├── hosted_system.go │ │ │ │ │ ├── hv_socket.go │ │ │ │ │ ├── hv_socket_2.go │ │ │ │ │ ├── hv_socket_address.go │ │ │ │ │ ├── hv_socket_service_config.go │ │ │ │ │ ├── hv_socket_system_config.go │ │ │ │ │ ├── interrupt_moderation_mode.go │ │ │ │ │ ├── iov_settings.go │ │ │ │ │ ├── isolation_settings.go │ │ │ │ │ ├── keyboard.go │ │ │ │ │ ├── layer.go │ │ │ │ │ ├── linux_kernel_direct.go │ │ │ │ │ ├── logical_processor.go │ │ │ │ │ ├── mapped_directory.go │ │ │ │ │ ├── mapped_pipe.go │ │ │ │ │ ├── memory.go │ │ │ │ │ ├── memory_backing_type.go │ │ │ │ │ ├── memory_information_for_vm.go │ │ │ │ │ ├── memory_stats.go │ │ │ │ │ ├── model_container_definition_device.go │ │ │ │ │ ├── model_device_category.go │ │ │ │ │ ├── model_device_extension.go │ │ │ │ │ ├── model_device_instance.go │ │ │ │ │ ├── model_device_namespace.go │ │ │ │ │ ├── model_interface_class.go │ │ │ │ │ ├── model_namespace.go │ │ │ │ │ ├── model_object_directory.go │ │ │ │ │ ├── model_object_namespace.go │ │ │ │ │ ├── model_object_symlink.go │ │ │ │ │ ├── modification_request.go │ │ │ │ │ ├── modify_setting_request.go │ │ │ │ │ ├── mouse.go │ │ │ │ │ ├── network_adapter.go │ │ │ │ │ ├── networking.go │ │ │ │ │ ├── numa.go │ │ │ │ │ ├── numa_node.go │ │ │ │ │ ├── numa_node_memory.go │ │ │ │ │ ├── numa_node_processor.go │ │ │ │ │ ├── numa_processors.go │ │ │ │ │ ├── numa_setting.go │ │ │ │ │ ├── pause_notification.go │ │ │ │ │ ├── pause_options.go │ │ │ │ │ ├── plan9.go │ │ │ │ │ ├── plan9_share.go │ │ │ │ │ ├── process_details.go │ │ │ │ │ ├── process_modify_request.go │ │ │ │ │ ├── process_parameters.go │ │ │ │ │ ├── process_status.go │ │ │ │ │ ├── processor.go │ │ │ │ │ ├── processor_stats.go │ │ │ │ │ ├── processor_topology.go │ │ │ │ │ ├── properties.go │ │ │ │ │ ├── property_query.go │ │ │ │ │ ├── property_type.go │ │ │ │ │ ├── rdp_connection_options.go │ │ │ │ │ ├── registry_changes.go │ │ │ │ │ ├── registry_hive.go │ │ │ │ │ ├── registry_key.go │ │ │ │ │ ├── registry_value.go │ │ │ │ │ ├── registry_value_type.go │ │ │ │ │ ├── restore_state.go │ │ │ │ │ ├── save_options.go │ │ │ │ │ ├── scsi.go │ │ │ │ │ ├── security_settings.go │ │ │ │ │ ├── service_properties.go │ │ │ │ │ ├── shared_memory_configuration.go │ │ │ │ │ ├── shared_memory_region.go │ │ │ │ │ ├── shared_memory_region_info.go │ │ │ │ │ ├── silo_properties.go │ │ │ │ │ ├── statistics.go │ │ │ │ │ ├── storage.go │ │ │ │ │ ├── storage_qo_s.go │ │ │ │ │ ├── storage_stats.go │ │ │ │ │ ├── system_time.go │ │ │ │ │ ├── time_zone_information.go │ │ │ │ │ ├── topology.go │ │ │ │ │ ├── uefi.go │ │ │ │ │ ├── uefi_boot_entry.go │ │ │ │ │ ├── version.go │ │ │ │ │ ├── video_monitor.go │ │ │ │ │ ├── virtual_machine.go │ │ │ │ │ ├── virtual_machine_memory.go │ │ │ │ │ ├── virtual_machine_processor.go │ │ │ │ │ ├── virtual_node_info.go │ │ │ │ │ ├── virtual_p_mem_controller.go │ │ │ │ │ ├── virtual_p_mem_device.go │ │ │ │ │ ├── virtual_p_mem_mapping.go │ │ │ │ │ ├── virtual_pci_device.go │ │ │ │ │ ├── virtual_pci_function.go │ │ │ │ │ ├── virtual_slit_type.go │ │ │ │ │ ├── virtual_smb.go │ │ │ │ │ ├── virtual_smb_share.go │ │ │ │ │ ├── virtual_smb_share_options.go │ │ │ │ │ ├── vm_memory.go │ │ │ │ │ ├── vm_processor_limits.go │ │ │ │ │ └── windows_crash_reporting.go │ │ │ │ ├── service.go │ │ │ │ ├── system.go │ │ │ │ ├── utils.go │ │ │ │ └── waithelper.go │ │ │ ├── hcserror/ │ │ │ │ ├── doc.go │ │ │ │ └── hcserror.go │ │ │ ├── hns/ │ │ │ │ ├── doc.go │ │ │ │ ├── hns.go │ │ │ │ ├── hnsaccelnet.go │ │ │ │ ├── hnsendpoint.go │ │ │ │ ├── hnsfuncs.go │ │ │ │ ├── hnsglobals.go │ │ │ │ ├── hnsnetwork.go │ │ │ │ ├── hnspolicy.go │ │ │ │ ├── hnspolicylist.go │ │ │ │ ├── hnssupport.go │ │ │ │ ├── namespace.go │ │ │ │ └── zsyscall_windows.go │ │ │ ├── interop/ │ │ │ │ ├── doc.go │ │ │ │ ├── interop.go │ │ │ │ └── zsyscall_windows.go │ │ │ ├── jobobject/ │ │ │ │ ├── doc.go │ │ │ │ ├── iocp.go │ │ │ │ ├── jobobject.go │ │ │ │ └── limits.go │ │ │ ├── log/ │ │ │ │ ├── context.go │ │ │ │ ├── format.go │ │ │ │ ├── hook.go │ │ │ │ ├── nopformatter.go │ │ │ │ └── scrub.go │ │ │ ├── logfields/ │ │ │ │ └── fields.go │ │ │ ├── longpath/ │ │ │ │ └── longpath.go │ │ │ ├── memory/ │ │ │ │ ├── pool.go │ │ │ │ └── types.go │ │ │ ├── mergemaps/ │ │ │ │ └── merge.go │ │ │ ├── oc/ │ │ │ │ ├── errors.go │ │ │ │ ├── exporter.go │ │ │ │ └── span.go │ │ │ ├── protocol/ │ │ │ │ └── guestrequest/ │ │ │ │ └── types.go │ │ │ ├── queue/ │ │ │ │ └── mq.go │ │ │ ├── safefile/ │ │ │ │ ├── do.go │ │ │ │ └── safeopen.go │ │ │ ├── security/ │ │ │ │ ├── grantvmgroupaccess.go │ │ │ │ ├── syscall_windows.go │ │ │ │ └── zsyscall_windows.go │ │ │ ├── timeout/ │ │ │ │ └── timeout.go │ │ │ ├── vmcompute/ │ │ │ │ ├── doc.go │ │ │ │ ├── vmcompute.go │ │ │ │ └── zsyscall_windows.go │ │ │ ├── wclayer/ │ │ │ │ ├── activatelayer.go │ │ │ │ ├── baselayerreader.go │ │ │ │ ├── baselayerwriter.go │ │ │ │ ├── converttobaselayer.go │ │ │ │ ├── createlayer.go │ │ │ │ ├── createscratchlayer.go │ │ │ │ ├── deactivatelayer.go │ │ │ │ ├── destroylayer.go │ │ │ │ ├── doc.go │ │ │ │ ├── expandscratchsize.go │ │ │ │ ├── exportlayer.go │ │ │ │ ├── getlayermountpath.go │ │ │ │ ├── getsharedbaseimages.go │ │ │ │ ├── grantvmaccess.go │ │ │ │ ├── importlayer.go │ │ │ │ ├── layerexists.go │ │ │ │ ├── layerid.go │ │ │ │ ├── layerutils.go │ │ │ │ ├── legacy.go │ │ │ │ ├── nametoguid.go │ │ │ │ ├── preparelayer.go │ │ │ │ ├── processimage.go │ │ │ │ ├── unpreparelayer.go │ │ │ │ ├── wclayer.go │ │ │ │ └── zsyscall_windows.go │ │ │ └── winapi/ │ │ │ ├── bindflt.go │ │ │ ├── cimfs.go │ │ │ ├── console.go │ │ │ ├── devices.go │ │ │ ├── doc.go │ │ │ ├── elevation.go │ │ │ ├── errors.go │ │ │ ├── filesystem.go │ │ │ ├── jobobject.go │ │ │ ├── logon.go │ │ │ ├── memory.go │ │ │ ├── net.go │ │ │ ├── offlinereg.go │ │ │ ├── path.go │ │ │ ├── process.go │ │ │ ├── processor.go │ │ │ ├── system.go │ │ │ ├── thread.go │ │ │ ├── user.go │ │ │ ├── utils.go │ │ │ ├── winapi.go │ │ │ └── zsyscall_windows.go │ │ ├── layer.go │ │ ├── osversion/ │ │ │ ├── osversion_windows.go │ │ │ ├── platform_compat_windows.go │ │ │ └── windowsbuilds.go │ │ ├── pkg/ │ │ │ └── ociwclayer/ │ │ │ ├── doc.go │ │ │ ├── export.go │ │ │ └── import.go │ │ ├── process.go │ │ └── zsyscall_windows.go │ ├── ProtonMail/ │ │ └── go-crypto/ │ │ ├── AUTHORS │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── bitcurves/ │ │ │ └── bitcurve.go │ │ ├── brainpool/ │ │ │ ├── brainpool.go │ │ │ └── rcurve.go │ │ ├── eax/ │ │ │ ├── eax.go │ │ │ ├── eax_test_vectors.go │ │ │ └── random_vectors.go │ │ ├── internal/ │ │ │ └── byteutil/ │ │ │ └── byteutil.go │ │ ├── ocb/ │ │ │ ├── ocb.go │ │ │ ├── random_vectors.go │ │ │ ├── rfc7253_test_vectors_suite_a.go │ │ │ └── rfc7253_test_vectors_suite_b.go │ │ └── openpgp/ │ │ ├── aes/ │ │ │ └── keywrap/ │ │ │ └── keywrap.go │ │ ├── armor/ │ │ │ ├── armor.go │ │ │ └── encode.go │ │ ├── canonical_text.go │ │ ├── ecdh/ │ │ │ └── ecdh.go │ │ ├── ecdsa/ │ │ │ └── ecdsa.go │ │ ├── ed25519/ │ │ │ └── ed25519.go │ │ ├── ed448/ │ │ │ └── ed448.go │ │ ├── eddsa/ │ │ │ └── eddsa.go │ │ ├── elgamal/ │ │ │ └── elgamal.go │ │ ├── errors/ │ │ │ └── errors.go │ │ ├── hash.go │ │ ├── internal/ │ │ │ ├── algorithm/ │ │ │ │ ├── aead.go │ │ │ │ ├── cipher.go │ │ │ │ └── hash.go │ │ │ ├── ecc/ │ │ │ │ ├── curve25519.go │ │ │ │ ├── curve_info.go │ │ │ │ ├── curves.go │ │ │ │ ├── ed25519.go │ │ │ │ ├── ed448.go │ │ │ │ ├── generic.go │ │ │ │ └── x448.go │ │ │ └── encoding/ │ │ │ ├── encoding.go │ │ │ ├── mpi.go │ │ │ └── oid.go │ │ ├── key_generation.go │ │ ├── keys.go │ │ ├── keys_test_data.go │ │ ├── packet/ │ │ │ ├── aead_config.go │ │ │ ├── aead_crypter.go │ │ │ ├── aead_encrypted.go │ │ │ ├── compressed.go │ │ │ ├── config.go │ │ │ ├── config_v5.go │ │ │ ├── encrypted_key.go │ │ │ ├── literal.go │ │ │ ├── marker.go │ │ │ ├── notation.go │ │ │ ├── ocfb.go │ │ │ ├── one_pass_signature.go │ │ │ ├── opaque.go │ │ │ ├── packet.go │ │ │ ├── packet_sequence.go │ │ │ ├── packet_unsupported.go │ │ │ ├── padding.go │ │ │ ├── private_key.go │ │ │ ├── private_key_test_data.go │ │ │ ├── public_key.go │ │ │ ├── public_key_test_data.go │ │ │ ├── reader.go │ │ │ ├── recipient.go │ │ │ ├── signature.go │ │ │ ├── symmetric_key_encrypted.go │ │ │ ├── symmetrically_encrypted.go │ │ │ ├── symmetrically_encrypted_aead.go │ │ │ ├── symmetrically_encrypted_mdc.go │ │ │ ├── userattribute.go │ │ │ └── userid.go │ │ ├── read.go │ │ ├── read_write_test_data.go │ │ ├── s2k/ │ │ │ ├── s2k.go │ │ │ ├── s2k_cache.go │ │ │ └── s2k_config.go │ │ ├── write.go │ │ ├── x25519/ │ │ │ └── x25519.go │ │ └── x448/ │ │ └── x448.go │ ├── agext/ │ │ └── levenshtein/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── DCO │ │ ├── LICENSE │ │ ├── MAINTAINERS │ │ ├── NOTICE │ │ ├── README.md │ │ ├── levenshtein.go │ │ ├── params.go │ │ └── test.sh │ ├── aws/ │ │ ├── aws-sdk-go-v2/ │ │ │ ├── LICENSE.txt │ │ │ ├── NOTICE.txt │ │ │ ├── aws/ │ │ │ │ ├── accountid_endpoint_mode.go │ │ │ │ ├── arn/ │ │ │ │ │ └── arn.go │ │ │ │ ├── checksum.go │ │ │ │ ├── config.go │ │ │ │ ├── context.go │ │ │ │ ├── credential_cache.go │ │ │ │ ├── credentials.go │ │ │ │ ├── defaults/ │ │ │ │ │ ├── auto.go │ │ │ │ │ ├── configuration.go │ │ │ │ │ ├── defaults.go │ │ │ │ │ └── doc.go │ │ │ │ ├── defaultsmode.go │ │ │ │ ├── doc.go │ │ │ │ ├── endpoints.go │ │ │ │ ├── errors.go │ │ │ │ ├── from_ptr.go │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── logging.go │ │ │ │ ├── logging_generate.go │ │ │ │ ├── middleware/ │ │ │ │ │ ├── metadata.go │ │ │ │ │ ├── middleware.go │ │ │ │ │ ├── osname.go │ │ │ │ │ ├── osname_go115.go │ │ │ │ │ ├── recursion_detection.go │ │ │ │ │ ├── request_id.go │ │ │ │ │ ├── request_id_retriever.go │ │ │ │ │ └── user_agent.go │ │ │ │ ├── protocol/ │ │ │ │ │ ├── eventstream/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ │ ├── debug.go │ │ │ │ │ │ ├── decode.go │ │ │ │ │ │ ├── encode.go │ │ │ │ │ │ ├── error.go │ │ │ │ │ │ ├── eventstreamapi/ │ │ │ │ │ │ │ ├── headers.go │ │ │ │ │ │ │ ├── middleware.go │ │ │ │ │ │ │ ├── transport.go │ │ │ │ │ │ │ └── transport_go117.go │ │ │ │ │ │ ├── go_module_metadata.go │ │ │ │ │ │ ├── header.go │ │ │ │ │ │ ├── header_value.go │ │ │ │ │ │ └── message.go │ │ │ │ │ ├── query/ │ │ │ │ │ │ ├── array.go │ │ │ │ │ │ ├── encoder.go │ │ │ │ │ │ ├── map.go │ │ │ │ │ │ ├── middleware.go │ │ │ │ │ │ ├── object.go │ │ │ │ │ │ └── value.go │ │ │ │ │ ├── restjson/ │ │ │ │ │ │ └── decoder_util.go │ │ │ │ │ └── xml/ │ │ │ │ │ └── error_utils.go │ │ │ │ ├── ratelimit/ │ │ │ │ │ ├── none.go │ │ │ │ │ ├── token_bucket.go │ │ │ │ │ └── token_rate_limit.go │ │ │ │ ├── request.go │ │ │ │ ├── retry/ │ │ │ │ │ ├── adaptive.go │ │ │ │ │ ├── adaptive_ratelimit.go │ │ │ │ │ ├── adaptive_token_bucket.go │ │ │ │ │ ├── attempt_metrics.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── jitter_backoff.go │ │ │ │ │ ├── metadata.go │ │ │ │ │ ├── middleware.go │ │ │ │ │ ├── retry.go │ │ │ │ │ ├── retryable_error.go │ │ │ │ │ ├── standard.go │ │ │ │ │ ├── throttle_error.go │ │ │ │ │ └── timeout_error.go │ │ │ │ ├── retryer.go │ │ │ │ ├── runtime.go │ │ │ │ ├── signer/ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ └── v4/ │ │ │ │ │ │ ├── cache.go │ │ │ │ │ │ ├── const.go │ │ │ │ │ │ ├── header_rules.go │ │ │ │ │ │ ├── headers.go │ │ │ │ │ │ ├── hmac.go │ │ │ │ │ │ ├── host.go │ │ │ │ │ │ ├── scope.go │ │ │ │ │ │ ├── time.go │ │ │ │ │ │ └── util.go │ │ │ │ │ └── v4/ │ │ │ │ │ ├── middleware.go │ │ │ │ │ ├── presign_middleware.go │ │ │ │ │ ├── stream.go │ │ │ │ │ └── v4.go │ │ │ │ ├── to_ptr.go │ │ │ │ ├── transport/ │ │ │ │ │ └── http/ │ │ │ │ │ ├── client.go │ │ │ │ │ ├── content_type.go │ │ │ │ │ ├── response_error.go │ │ │ │ │ ├── response_error_middleware.go │ │ │ │ │ └── timeout_read_closer.go │ │ │ │ ├── types.go │ │ │ │ └── version.go │ │ │ ├── config/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── config.go │ │ │ │ ├── defaultsmode.go │ │ │ │ ├── doc.go │ │ │ │ ├── env_config.go │ │ │ │ ├── generate.go │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── load_options.go │ │ │ │ ├── local.go │ │ │ │ ├── provider.go │ │ │ │ ├── resolve.go │ │ │ │ ├── resolve_bearer_token.go │ │ │ │ ├── resolve_credentials.go │ │ │ │ └── shared_config.go │ │ │ ├── credentials/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── doc.go │ │ │ │ ├── ec2rolecreds/ │ │ │ │ │ ├── doc.go │ │ │ │ │ └── provider.go │ │ │ │ ├── endpointcreds/ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ └── client/ │ │ │ │ │ │ ├── auth.go │ │ │ │ │ │ ├── client.go │ │ │ │ │ │ ├── endpoints.go │ │ │ │ │ │ └── middleware.go │ │ │ │ │ └── provider.go │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── processcreds/ │ │ │ │ │ ├── doc.go │ │ │ │ │ └── provider.go │ │ │ │ ├── ssocreds/ │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── sso_cached_token.go │ │ │ │ │ ├── sso_credentials_provider.go │ │ │ │ │ └── sso_token_provider.go │ │ │ │ ├── static_provider.go │ │ │ │ └── stscreds/ │ │ │ │ ├── assume_role_provider.go │ │ │ │ └── web_identity_provider.go │ │ │ ├── feature/ │ │ │ │ ├── ec2/ │ │ │ │ │ └── imds/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── api_client.go │ │ │ │ │ ├── api_op_GetDynamicData.go │ │ │ │ │ ├── api_op_GetIAMInfo.go │ │ │ │ │ ├── api_op_GetInstanceIdentityDocument.go │ │ │ │ │ ├── api_op_GetMetadata.go │ │ │ │ │ ├── api_op_GetRegion.go │ │ │ │ │ ├── api_op_GetToken.go │ │ │ │ │ ├── api_op_GetUserData.go │ │ │ │ │ ├── auth.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── endpoints.go │ │ │ │ │ ├── go_module_metadata.go │ │ │ │ │ ├── internal/ │ │ │ │ │ │ └── config/ │ │ │ │ │ │ └── resolvers.go │ │ │ │ │ ├── request_middleware.go │ │ │ │ │ └── token_provider.go │ │ │ │ └── s3/ │ │ │ │ └── manager/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── api.go │ │ │ │ ├── arn.go │ │ │ │ ├── bucket_region.go │ │ │ │ ├── buffered_read_seeker.go │ │ │ │ ├── default_read_seeker_write_to.go │ │ │ │ ├── default_read_seeker_write_to_windows.go │ │ │ │ ├── default_writer_read_from.go │ │ │ │ ├── default_writer_read_from_windows.go │ │ │ │ ├── doc.go │ │ │ │ ├── download.go │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── pool.go │ │ │ │ ├── read_seeker_write_to.go │ │ │ │ ├── types.go │ │ │ │ ├── upload.go │ │ │ │ └── writer_read_from.go │ │ │ ├── internal/ │ │ │ │ ├── auth/ │ │ │ │ │ ├── auth.go │ │ │ │ │ ├── scheme.go │ │ │ │ │ └── smithy/ │ │ │ │ │ ├── bearer_token_adapter.go │ │ │ │ │ ├── bearer_token_signer_adapter.go │ │ │ │ │ ├── credentials_adapter.go │ │ │ │ │ ├── smithy.go │ │ │ │ │ └── v4signer_adapter.go │ │ │ │ ├── awsutil/ │ │ │ │ │ ├── copy.go │ │ │ │ │ ├── equal.go │ │ │ │ │ ├── prettify.go │ │ │ │ │ └── string_value.go │ │ │ │ ├── configsources/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── config.go │ │ │ │ │ ├── endpoints.go │ │ │ │ │ └── go_module_metadata.go │ │ │ │ ├── context/ │ │ │ │ │ └── context.go │ │ │ │ ├── endpoints/ │ │ │ │ │ ├── awsrulesfn/ │ │ │ │ │ │ ├── arn.go │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── generate.go │ │ │ │ │ │ ├── host.go │ │ │ │ │ │ ├── partition.go │ │ │ │ │ │ ├── partitions.go │ │ │ │ │ │ └── partitions.json │ │ │ │ │ ├── endpoints.go │ │ │ │ │ └── v2/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── endpoints.go │ │ │ │ │ └── go_module_metadata.go │ │ │ │ ├── ini/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── go_module_metadata.go │ │ │ │ │ ├── ini.go │ │ │ │ │ ├── parse.go │ │ │ │ │ ├── sections.go │ │ │ │ │ ├── strings.go │ │ │ │ │ ├── token.go │ │ │ │ │ ├── tokenize.go │ │ │ │ │ └── value.go │ │ │ │ ├── middleware/ │ │ │ │ │ └── middleware.go │ │ │ │ ├── rand/ │ │ │ │ │ └── rand.go │ │ │ │ ├── sdk/ │ │ │ │ │ ├── interfaces.go │ │ │ │ │ └── time.go │ │ │ │ ├── sdkio/ │ │ │ │ │ └── byte.go │ │ │ │ ├── shareddefaults/ │ │ │ │ │ └── shared_config.go │ │ │ │ ├── strings/ │ │ │ │ │ └── strings.go │ │ │ │ ├── sync/ │ │ │ │ │ └── singleflight/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── docs.go │ │ │ │ │ └── singleflight.go │ │ │ │ ├── timeconv/ │ │ │ │ │ └── duration.go │ │ │ │ └── v4a/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── credentials.go │ │ │ │ ├── error.go │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── internal/ │ │ │ │ │ ├── crypto/ │ │ │ │ │ │ ├── compare.go │ │ │ │ │ │ └── ecc.go │ │ │ │ │ └── v4/ │ │ │ │ │ ├── const.go │ │ │ │ │ ├── header_rules.go │ │ │ │ │ ├── headers.go │ │ │ │ │ ├── hmac.go │ │ │ │ │ ├── host.go │ │ │ │ │ ├── time.go │ │ │ │ │ └── util.go │ │ │ │ ├── middleware.go │ │ │ │ ├── presign_middleware.go │ │ │ │ ├── smithy.go │ │ │ │ └── v4a.go │ │ │ └── service/ │ │ │ ├── ecr/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── api_client.go │ │ │ │ ├── api_op_BatchCheckLayerAvailability.go │ │ │ │ ├── api_op_BatchDeleteImage.go │ │ │ │ ├── api_op_BatchGetImage.go │ │ │ │ ├── api_op_BatchGetRepositoryScanningConfiguration.go │ │ │ │ ├── api_op_CompleteLayerUpload.go │ │ │ │ ├── api_op_CreatePullThroughCacheRule.go │ │ │ │ ├── api_op_CreateRepository.go │ │ │ │ ├── api_op_CreateRepositoryCreationTemplate.go │ │ │ │ ├── api_op_DeleteLifecyclePolicy.go │ │ │ │ ├── api_op_DeletePullThroughCacheRule.go │ │ │ │ ├── api_op_DeleteRegistryPolicy.go │ │ │ │ ├── api_op_DeleteRepository.go │ │ │ │ ├── api_op_DeleteRepositoryCreationTemplate.go │ │ │ │ ├── api_op_DeleteRepositoryPolicy.go │ │ │ │ ├── api_op_DescribeImageReplicationStatus.go │ │ │ │ ├── api_op_DescribeImageScanFindings.go │ │ │ │ ├── api_op_DescribeImages.go │ │ │ │ ├── api_op_DescribePullThroughCacheRules.go │ │ │ │ ├── api_op_DescribeRegistry.go │ │ │ │ ├── api_op_DescribeRepositories.go │ │ │ │ ├── api_op_DescribeRepositoryCreationTemplates.go │ │ │ │ ├── api_op_GetAccountSetting.go │ │ │ │ ├── api_op_GetAuthorizationToken.go │ │ │ │ ├── api_op_GetDownloadUrlForLayer.go │ │ │ │ ├── api_op_GetLifecyclePolicy.go │ │ │ │ ├── api_op_GetLifecyclePolicyPreview.go │ │ │ │ ├── api_op_GetRegistryPolicy.go │ │ │ │ ├── api_op_GetRegistryScanningConfiguration.go │ │ │ │ ├── api_op_GetRepositoryPolicy.go │ │ │ │ ├── api_op_InitiateLayerUpload.go │ │ │ │ ├── api_op_ListImages.go │ │ │ │ ├── api_op_ListTagsForResource.go │ │ │ │ ├── api_op_PutAccountSetting.go │ │ │ │ ├── api_op_PutImage.go │ │ │ │ ├── api_op_PutImageScanningConfiguration.go │ │ │ │ ├── api_op_PutImageTagMutability.go │ │ │ │ ├── api_op_PutLifecyclePolicy.go │ │ │ │ ├── api_op_PutRegistryPolicy.go │ │ │ │ ├── api_op_PutRegistryScanningConfiguration.go │ │ │ │ ├── api_op_PutReplicationConfiguration.go │ │ │ │ ├── api_op_SetRepositoryPolicy.go │ │ │ │ ├── api_op_StartImageScan.go │ │ │ │ ├── api_op_StartLifecyclePolicyPreview.go │ │ │ │ ├── api_op_TagResource.go │ │ │ │ ├── api_op_UntagResource.go │ │ │ │ ├── api_op_UpdatePullThroughCacheRule.go │ │ │ │ ├── api_op_UpdateRepositoryCreationTemplate.go │ │ │ │ ├── api_op_UploadLayerPart.go │ │ │ │ ├── api_op_ValidatePullThroughCacheRule.go │ │ │ │ ├── auth.go │ │ │ │ ├── deserializers.go │ │ │ │ ├── doc.go │ │ │ │ ├── endpoints.go │ │ │ │ ├── generated.json │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── internal/ │ │ │ │ │ └── endpoints/ │ │ │ │ │ └── endpoints.go │ │ │ │ ├── options.go │ │ │ │ ├── serializers.go │ │ │ │ ├── types/ │ │ │ │ │ ├── enums.go │ │ │ │ │ ├── errors.go │ │ │ │ │ └── types.go │ │ │ │ └── validators.go │ │ │ ├── ecrpublic/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── api_client.go │ │ │ │ ├── api_op_BatchCheckLayerAvailability.go │ │ │ │ ├── api_op_BatchDeleteImage.go │ │ │ │ ├── api_op_CompleteLayerUpload.go │ │ │ │ ├── api_op_CreateRepository.go │ │ │ │ ├── api_op_DeleteRepository.go │ │ │ │ ├── api_op_DeleteRepositoryPolicy.go │ │ │ │ ├── api_op_DescribeImageTags.go │ │ │ │ ├── api_op_DescribeImages.go │ │ │ │ ├── api_op_DescribeRegistries.go │ │ │ │ ├── api_op_DescribeRepositories.go │ │ │ │ ├── api_op_GetAuthorizationToken.go │ │ │ │ ├── api_op_GetRegistryCatalogData.go │ │ │ │ ├── api_op_GetRepositoryCatalogData.go │ │ │ │ ├── api_op_GetRepositoryPolicy.go │ │ │ │ ├── api_op_InitiateLayerUpload.go │ │ │ │ ├── api_op_ListTagsForResource.go │ │ │ │ ├── api_op_PutImage.go │ │ │ │ ├── api_op_PutRegistryCatalogData.go │ │ │ │ ├── api_op_PutRepositoryCatalogData.go │ │ │ │ ├── api_op_SetRepositoryPolicy.go │ │ │ │ ├── api_op_TagResource.go │ │ │ │ ├── api_op_UntagResource.go │ │ │ │ ├── api_op_UploadLayerPart.go │ │ │ │ ├── auth.go │ │ │ │ ├── deserializers.go │ │ │ │ ├── doc.go │ │ │ │ ├── endpoints.go │ │ │ │ ├── generated.json │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── internal/ │ │ │ │ │ └── endpoints/ │ │ │ │ │ └── endpoints.go │ │ │ │ ├── options.go │ │ │ │ ├── serializers.go │ │ │ │ ├── types/ │ │ │ │ │ ├── enums.go │ │ │ │ │ ├── errors.go │ │ │ │ │ └── types.go │ │ │ │ └── validators.go │ │ │ ├── internal/ │ │ │ │ ├── accept-encoding/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── accept_encoding_gzip.go │ │ │ │ │ ├── doc.go │ │ │ │ │ └── go_module_metadata.go │ │ │ │ ├── checksum/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── algorithms.go │ │ │ │ │ ├── aws_chunked_encoding.go │ │ │ │ │ ├── go_module_metadata.go │ │ │ │ │ ├── middleware_add.go │ │ │ │ │ ├── middleware_checksum_metrics_tracking.go │ │ │ │ │ ├── middleware_compute_input_checksum.go │ │ │ │ │ ├── middleware_setup_context.go │ │ │ │ │ └── middleware_validate_output.go │ │ │ │ ├── presigned-url/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE.txt │ │ │ │ │ ├── context.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── go_module_metadata.go │ │ │ │ │ └── middleware.go │ │ │ │ └── s3shared/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── arn/ │ │ │ │ │ ├── accesspoint_arn.go │ │ │ │ │ ├── arn.go │ │ │ │ │ ├── arn_member.go │ │ │ │ │ ├── outpost_arn.go │ │ │ │ │ └── s3_object_lambda_arn.go │ │ │ │ ├── arn_lookup.go │ │ │ │ ├── config/ │ │ │ │ │ └── config.go │ │ │ │ ├── endpoint_error.go │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── host_id.go │ │ │ │ ├── metadata.go │ │ │ │ ├── metadata_retriever.go │ │ │ │ ├── resource_request.go │ │ │ │ ├── response_error.go │ │ │ │ ├── response_error_middleware.go │ │ │ │ ├── s3100continue.go │ │ │ │ ├── update_endpoint.go │ │ │ │ └── xml_utils.go │ │ │ ├── s3/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── api_client.go │ │ │ │ ├── api_op_AbortMultipartUpload.go │ │ │ │ ├── api_op_CompleteMultipartUpload.go │ │ │ │ ├── api_op_CopyObject.go │ │ │ │ ├── api_op_CreateBucket.go │ │ │ │ ├── api_op_CreateBucketMetadataTableConfiguration.go │ │ │ │ ├── api_op_CreateMultipartUpload.go │ │ │ │ ├── api_op_CreateSession.go │ │ │ │ ├── api_op_DeleteBucket.go │ │ │ │ ├── api_op_DeleteBucketAnalyticsConfiguration.go │ │ │ │ ├── api_op_DeleteBucketCors.go │ │ │ │ ├── api_op_DeleteBucketEncryption.go │ │ │ │ ├── api_op_DeleteBucketIntelligentTieringConfiguration.go │ │ │ │ ├── api_op_DeleteBucketInventoryConfiguration.go │ │ │ │ ├── api_op_DeleteBucketLifecycle.go │ │ │ │ ├── api_op_DeleteBucketMetadataTableConfiguration.go │ │ │ │ ├── api_op_DeleteBucketMetricsConfiguration.go │ │ │ │ ├── api_op_DeleteBucketOwnershipControls.go │ │ │ │ ├── api_op_DeleteBucketPolicy.go │ │ │ │ ├── api_op_DeleteBucketReplication.go │ │ │ │ ├── api_op_DeleteBucketTagging.go │ │ │ │ ├── api_op_DeleteBucketWebsite.go │ │ │ │ ├── api_op_DeleteObject.go │ │ │ │ ├── api_op_DeleteObjectTagging.go │ │ │ │ ├── api_op_DeleteObjects.go │ │ │ │ ├── api_op_DeletePublicAccessBlock.go │ │ │ │ ├── api_op_GetBucketAccelerateConfiguration.go │ │ │ │ ├── api_op_GetBucketAcl.go │ │ │ │ ├── api_op_GetBucketAnalyticsConfiguration.go │ │ │ │ ├── api_op_GetBucketCors.go │ │ │ │ ├── api_op_GetBucketEncryption.go │ │ │ │ ├── api_op_GetBucketIntelligentTieringConfiguration.go │ │ │ │ ├── api_op_GetBucketInventoryConfiguration.go │ │ │ │ ├── api_op_GetBucketLifecycleConfiguration.go │ │ │ │ ├── api_op_GetBucketLocation.go │ │ │ │ ├── api_op_GetBucketLogging.go │ │ │ │ ├── api_op_GetBucketMetadataTableConfiguration.go │ │ │ │ ├── api_op_GetBucketMetricsConfiguration.go │ │ │ │ ├── api_op_GetBucketNotificationConfiguration.go │ │ │ │ ├── api_op_GetBucketOwnershipControls.go │ │ │ │ ├── api_op_GetBucketPolicy.go │ │ │ │ ├── api_op_GetBucketPolicyStatus.go │ │ │ │ ├── api_op_GetBucketReplication.go │ │ │ │ ├── api_op_GetBucketRequestPayment.go │ │ │ │ ├── api_op_GetBucketTagging.go │ │ │ │ ├── api_op_GetBucketVersioning.go │ │ │ │ ├── api_op_GetBucketWebsite.go │ │ │ │ ├── api_op_GetObject.go │ │ │ │ ├── api_op_GetObjectAcl.go │ │ │ │ ├── api_op_GetObjectAttributes.go │ │ │ │ ├── api_op_GetObjectLegalHold.go │ │ │ │ ├── api_op_GetObjectLockConfiguration.go │ │ │ │ ├── api_op_GetObjectRetention.go │ │ │ │ ├── api_op_GetObjectTagging.go │ │ │ │ ├── api_op_GetObjectTorrent.go │ │ │ │ ├── api_op_GetPublicAccessBlock.go │ │ │ │ ├── api_op_HeadBucket.go │ │ │ │ ├── api_op_HeadObject.go │ │ │ │ ├── api_op_ListBucketAnalyticsConfigurations.go │ │ │ │ ├── api_op_ListBucketIntelligentTieringConfigurations.go │ │ │ │ ├── api_op_ListBucketInventoryConfigurations.go │ │ │ │ ├── api_op_ListBucketMetricsConfigurations.go │ │ │ │ ├── api_op_ListBuckets.go │ │ │ │ ├── api_op_ListDirectoryBuckets.go │ │ │ │ ├── api_op_ListMultipartUploads.go │ │ │ │ ├── api_op_ListObjectVersions.go │ │ │ │ ├── api_op_ListObjects.go │ │ │ │ ├── api_op_ListObjectsV2.go │ │ │ │ ├── api_op_ListParts.go │ │ │ │ ├── api_op_PutBucketAccelerateConfiguration.go │ │ │ │ ├── api_op_PutBucketAcl.go │ │ │ │ ├── api_op_PutBucketAnalyticsConfiguration.go │ │ │ │ ├── api_op_PutBucketCors.go │ │ │ │ ├── api_op_PutBucketEncryption.go │ │ │ │ ├── api_op_PutBucketIntelligentTieringConfiguration.go │ │ │ │ ├── api_op_PutBucketInventoryConfiguration.go │ │ │ │ ├── api_op_PutBucketLifecycleConfiguration.go │ │ │ │ ├── api_op_PutBucketLogging.go │ │ │ │ ├── api_op_PutBucketMetricsConfiguration.go │ │ │ │ ├── api_op_PutBucketNotificationConfiguration.go │ │ │ │ ├── api_op_PutBucketOwnershipControls.go │ │ │ │ ├── api_op_PutBucketPolicy.go │ │ │ │ ├── api_op_PutBucketReplication.go │ │ │ │ ├── api_op_PutBucketRequestPayment.go │ │ │ │ ├── api_op_PutBucketTagging.go │ │ │ │ ├── api_op_PutBucketVersioning.go │ │ │ │ ├── api_op_PutBucketWebsite.go │ │ │ │ ├── api_op_PutObject.go │ │ │ │ ├── api_op_PutObjectAcl.go │ │ │ │ ├── api_op_PutObjectLegalHold.go │ │ │ │ ├── api_op_PutObjectLockConfiguration.go │ │ │ │ ├── api_op_PutObjectRetention.go │ │ │ │ ├── api_op_PutObjectTagging.go │ │ │ │ ├── api_op_PutPublicAccessBlock.go │ │ │ │ ├── api_op_RestoreObject.go │ │ │ │ ├── api_op_SelectObjectContent.go │ │ │ │ ├── api_op_UploadPart.go │ │ │ │ ├── api_op_UploadPartCopy.go │ │ │ │ ├── api_op_WriteGetObjectResponse.go │ │ │ │ ├── auth.go │ │ │ │ ├── bucket_context.go │ │ │ │ ├── bucketer.go │ │ │ │ ├── create_mpu_checksum.go │ │ │ │ ├── deserializers.go │ │ │ │ ├── doc.go │ │ │ │ ├── endpoint_auth_resolver.go │ │ │ │ ├── endpoints.go │ │ │ │ ├── eventstream.go │ │ │ │ ├── express.go │ │ │ │ ├── express_default.go │ │ │ │ ├── express_resolve.go │ │ │ │ ├── express_user_agent.go │ │ │ │ ├── generated.json │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── handwritten_paginators.go │ │ │ │ ├── internal/ │ │ │ │ │ ├── arn/ │ │ │ │ │ │ └── arn_parser.go │ │ │ │ │ ├── customizations/ │ │ │ │ │ │ ├── context.go │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── express.go │ │ │ │ │ │ ├── express_config.go │ │ │ │ │ │ ├── express_default_checksum.go │ │ │ │ │ │ ├── express_properties.go │ │ │ │ │ │ ├── express_signer.go │ │ │ │ │ │ ├── express_signer_smithy.go │ │ │ │ │ │ ├── handle_200_error.go │ │ │ │ │ │ ├── host.go │ │ │ │ │ │ ├── presigned_expires.go │ │ │ │ │ │ ├── process_arn_resource.go │ │ │ │ │ │ ├── remove_bucket_middleware.go │ │ │ │ │ │ ├── s3_object_lambda.go │ │ │ │ │ │ ├── signer_wrapper.go │ │ │ │ │ │ └── update_endpoint.go │ │ │ │ │ └── endpoints/ │ │ │ │ │ └── endpoints.go │ │ │ │ ├── options.go │ │ │ │ ├── presign_post.go │ │ │ │ ├── serialize_immutable_hostname_bucket.go │ │ │ │ ├── serializers.go │ │ │ │ ├── types/ │ │ │ │ │ ├── enums.go │ │ │ │ │ ├── errors.go │ │ │ │ │ └── types.go │ │ │ │ ├── uri_context.go │ │ │ │ └── validators.go │ │ │ ├── sso/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── api_client.go │ │ │ │ ├── api_op_GetRoleCredentials.go │ │ │ │ ├── api_op_ListAccountRoles.go │ │ │ │ ├── api_op_ListAccounts.go │ │ │ │ ├── api_op_Logout.go │ │ │ │ ├── auth.go │ │ │ │ ├── deserializers.go │ │ │ │ ├── doc.go │ │ │ │ ├── endpoints.go │ │ │ │ ├── generated.json │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── internal/ │ │ │ │ │ └── endpoints/ │ │ │ │ │ └── endpoints.go │ │ │ │ ├── options.go │ │ │ │ ├── serializers.go │ │ │ │ ├── types/ │ │ │ │ │ ├── errors.go │ │ │ │ │ └── types.go │ │ │ │ └── validators.go │ │ │ ├── ssooidc/ │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── api_client.go │ │ │ │ ├── api_op_CreateToken.go │ │ │ │ ├── api_op_CreateTokenWithIAM.go │ │ │ │ ├── api_op_RegisterClient.go │ │ │ │ ├── api_op_StartDeviceAuthorization.go │ │ │ │ ├── auth.go │ │ │ │ ├── deserializers.go │ │ │ │ ├── doc.go │ │ │ │ ├── endpoints.go │ │ │ │ ├── generated.json │ │ │ │ ├── go_module_metadata.go │ │ │ │ ├── internal/ │ │ │ │ │ └── endpoints/ │ │ │ │ │ └── endpoints.go │ │ │ │ ├── options.go │ │ │ │ ├── serializers.go │ │ │ │ ├── types/ │ │ │ │ │ ├── errors.go │ │ │ │ │ └── types.go │ │ │ │ └── validators.go │ │ │ └── sts/ │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE.txt │ │ │ ├── api_client.go │ │ │ ├── api_op_AssumeRole.go │ │ │ ├── api_op_AssumeRoleWithSAML.go │ │ │ ├── api_op_AssumeRoleWithWebIdentity.go │ │ │ ├── api_op_AssumeRoot.go │ │ │ ├── api_op_DecodeAuthorizationMessage.go │ │ │ ├── api_op_GetAccessKeyInfo.go │ │ │ ├── api_op_GetCallerIdentity.go │ │ │ ├── api_op_GetFederationToken.go │ │ │ ├── api_op_GetSessionToken.go │ │ │ ├── auth.go │ │ │ ├── deserializers.go │ │ │ ├── doc.go │ │ │ ├── endpoints.go │ │ │ ├── generated.json │ │ │ ├── go_module_metadata.go │ │ │ ├── internal/ │ │ │ │ └── endpoints/ │ │ │ │ └── endpoints.go │ │ │ ├── options.go │ │ │ ├── serializers.go │ │ │ ├── types/ │ │ │ │ ├── errors.go │ │ │ │ └── types.go │ │ │ └── validators.go │ │ └── smithy-go/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── CHANGELOG.md │ │ ├── CODE_OF_CONDUCT.md │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── NOTICE │ │ ├── README.md │ │ ├── auth/ │ │ │ ├── auth.go │ │ │ ├── bearer/ │ │ │ │ ├── docs.go │ │ │ │ ├── middleware.go │ │ │ │ ├── token.go │ │ │ │ └── token_cache.go │ │ │ ├── identity.go │ │ │ ├── option.go │ │ │ └── scheme_id.go │ │ ├── changelog-template.json │ │ ├── container/ │ │ │ └── private/ │ │ │ └── cache/ │ │ │ ├── cache.go │ │ │ └── lru/ │ │ │ └── lru.go │ │ ├── context/ │ │ │ └── suppress_expired.go │ │ ├── doc.go │ │ ├── document/ │ │ │ ├── doc.go │ │ │ ├── document.go │ │ │ └── errors.go │ │ ├── document.go │ │ ├── encoding/ │ │ │ ├── doc.go │ │ │ ├── encoding.go │ │ │ ├── httpbinding/ │ │ │ │ ├── encode.go │ │ │ │ ├── header.go │ │ │ │ ├── path_replace.go │ │ │ │ ├── query.go │ │ │ │ └── uri.go │ │ │ ├── json/ │ │ │ │ ├── array.go │ │ │ │ ├── constants.go │ │ │ │ ├── decoder_util.go │ │ │ │ ├── encoder.go │ │ │ │ ├── escape.go │ │ │ │ ├── object.go │ │ │ │ └── value.go │ │ │ └── xml/ │ │ │ ├── array.go │ │ │ ├── constants.go │ │ │ ├── doc.go │ │ │ ├── element.go │ │ │ ├── encoder.go │ │ │ ├── error_utils.go │ │ │ ├── escape.go │ │ │ ├── map.go │ │ │ ├── value.go │ │ │ └── xml_decoder.go │ │ ├── endpoints/ │ │ │ ├── endpoint.go │ │ │ └── private/ │ │ │ └── rulesfn/ │ │ │ ├── doc.go │ │ │ ├── strings.go │ │ │ └── uri.go │ │ ├── errors.go │ │ ├── go_module_metadata.go │ │ ├── internal/ │ │ │ └── sync/ │ │ │ └── singleflight/ │ │ │ ├── LICENSE │ │ │ ├── docs.go │ │ │ └── singleflight.go │ │ ├── io/ │ │ │ ├── byte.go │ │ │ ├── doc.go │ │ │ ├── reader.go │ │ │ └── ringbuffer.go │ │ ├── local-mod-replace.sh │ │ ├── logging/ │ │ │ └── logger.go │ │ ├── metrics/ │ │ │ ├── metrics.go │ │ │ └── nop.go │ │ ├── middleware/ │ │ │ ├── context.go │ │ │ ├── doc.go │ │ │ ├── logging.go │ │ │ ├── metadata.go │ │ │ ├── middleware.go │ │ │ ├── ordered_group.go │ │ │ ├── stack.go │ │ │ ├── stack_values.go │ │ │ ├── step_build.go │ │ │ ├── step_deserialize.go │ │ │ ├── step_finalize.go │ │ │ ├── step_initialize.go │ │ │ └── step_serialize.go │ │ ├── modman.toml │ │ ├── private/ │ │ │ └── requestcompression/ │ │ │ ├── gzip.go │ │ │ ├── middleware_capture_request_compression.go │ │ │ └── request_compression.go │ │ ├── properties.go │ │ ├── ptr/ │ │ │ ├── doc.go │ │ │ ├── from_ptr.go │ │ │ ├── gen_scalars.go │ │ │ └── to_ptr.go │ │ ├── rand/ │ │ │ ├── doc.go │ │ │ ├── rand.go │ │ │ └── uuid.go │ │ ├── sync/ │ │ │ └── error.go │ │ ├── time/ │ │ │ └── time.go │ │ ├── tracing/ │ │ │ ├── context.go │ │ │ ├── nop.go │ │ │ └── tracing.go │ │ ├── transport/ │ │ │ └── http/ │ │ │ ├── auth.go │ │ │ ├── auth_schemes.go │ │ │ ├── checksum_middleware.go │ │ │ ├── client.go │ │ │ ├── doc.go │ │ │ ├── headerlist.go │ │ │ ├── host.go │ │ │ ├── internal/ │ │ │ │ └── io/ │ │ │ │ └── safe.go │ │ │ ├── md5_checksum.go │ │ │ ├── metrics.go │ │ │ ├── middleware_close_response_body.go │ │ │ ├── middleware_content_length.go │ │ │ ├── middleware_header_comment.go │ │ │ ├── middleware_headers.go │ │ │ ├── middleware_http_logging.go │ │ │ ├── middleware_metadata.go │ │ │ ├── middleware_min_proto.go │ │ │ ├── properties.go │ │ │ ├── request.go │ │ │ ├── response.go │ │ │ ├── time.go │ │ │ ├── url.go │ │ │ └── user_agent.go │ │ ├── validation.go │ │ └── waiter/ │ │ ├── logger.go │ │ └── waiter.go │ ├── awslabs/ │ │ └── amazon-ecr-credential-helper/ │ │ └── ecr-login/ │ │ ├── LICENSE │ │ ├── api/ │ │ │ ├── client.go │ │ │ └── factory.go │ │ ├── cache/ │ │ │ ├── build.go │ │ │ ├── credentials.go │ │ │ ├── file.go │ │ │ └── null.go │ │ ├── cli/ │ │ │ └── docker-credential-ecr-login/ │ │ │ └── main.go │ │ ├── config/ │ │ │ ├── cache_dir.go │ │ │ └── log.go │ │ ├── ecr.go │ │ └── version/ │ │ └── version.go │ ├── beorn7/ │ │ └── perks/ │ │ ├── LICENSE │ │ └── quantile/ │ │ ├── exampledata.txt │ │ └── stream.go │ ├── cespare/ │ │ └── xxhash/ │ │ └── v2/ │ │ ├── LICENSE.txt │ │ ├── README.md │ │ ├── testall.sh │ │ ├── xxhash.go │ │ ├── xxhash_amd64.s │ │ ├── xxhash_arm64.s │ │ ├── xxhash_asm.go │ │ ├── xxhash_other.go │ │ ├── xxhash_safe.go │ │ └── xxhash_unsafe.go │ ├── chrismellard/ │ │ └── docker-credential-acr-env/ │ │ ├── .gitignore │ │ ├── .goreleaser.yml │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.md │ │ ├── cmd/ │ │ │ ├── get.go │ │ │ └── root.go │ │ ├── main.go │ │ └── pkg/ │ │ ├── credhelper/ │ │ │ └── helper.go │ │ ├── registry/ │ │ │ ├── const.go │ │ │ └── registry.go │ │ └── token/ │ │ └── token.go │ ├── cloudflare/ │ │ └── circl/ │ │ ├── LICENSE │ │ ├── dh/ │ │ │ ├── x25519/ │ │ │ │ ├── curve.go │ │ │ │ ├── curve_amd64.go │ │ │ │ ├── curve_amd64.h │ │ │ │ ├── curve_amd64.s │ │ │ │ ├── curve_generic.go │ │ │ │ ├── curve_noasm.go │ │ │ │ ├── doc.go │ │ │ │ ├── key.go │ │ │ │ └── table.go │ │ │ └── x448/ │ │ │ ├── curve.go │ │ │ ├── curve_amd64.go │ │ │ ├── curve_amd64.h │ │ │ ├── curve_amd64.s │ │ │ ├── curve_generic.go │ │ │ ├── curve_noasm.go │ │ │ ├── doc.go │ │ │ ├── key.go │ │ │ └── table.go │ │ ├── ecc/ │ │ │ └── goldilocks/ │ │ │ ├── constants.go │ │ │ ├── curve.go │ │ │ ├── isogeny.go │ │ │ ├── point.go │ │ │ ├── scalar.go │ │ │ ├── twist.go │ │ │ ├── twistPoint.go │ │ │ ├── twistTables.go │ │ │ └── twist_basemult.go │ │ ├── internal/ │ │ │ ├── conv/ │ │ │ │ └── conv.go │ │ │ └── sha3/ │ │ │ ├── doc.go │ │ │ ├── hashes.go │ │ │ ├── keccakf.go │ │ │ ├── rc.go │ │ │ ├── sha3.go │ │ │ ├── sha3_s390x.s │ │ │ ├── shake.go │ │ │ ├── xor.go │ │ │ ├── xor_generic.go │ │ │ └── xor_unaligned.go │ │ ├── math/ │ │ │ ├── fp25519/ │ │ │ │ ├── fp.go │ │ │ │ ├── fp_amd64.go │ │ │ │ ├── fp_amd64.h │ │ │ │ ├── fp_amd64.s │ │ │ │ ├── fp_generic.go │ │ │ │ └── fp_noasm.go │ │ │ ├── fp448/ │ │ │ │ ├── fp.go │ │ │ │ ├── fp_amd64.go │ │ │ │ ├── fp_amd64.h │ │ │ │ ├── fp_amd64.s │ │ │ │ ├── fp_generic.go │ │ │ │ ├── fp_noasm.go │ │ │ │ └── fuzzer.go │ │ │ ├── integer.go │ │ │ ├── mlsbset/ │ │ │ │ ├── mlsbset.go │ │ │ │ └── power.go │ │ │ ├── primes.go │ │ │ └── wnaf.go │ │ └── sign/ │ │ ├── ed25519/ │ │ │ ├── ed25519.go │ │ │ ├── modular.go │ │ │ ├── mult.go │ │ │ ├── point.go │ │ │ ├── pubkey.go │ │ │ ├── pubkey112.go │ │ │ ├── signapi.go │ │ │ └── tables.go │ │ ├── ed448/ │ │ │ ├── ed448.go │ │ │ └── signapi.go │ │ └── sign.go │ ├── cncf/ │ │ └── xds/ │ │ └── go/ │ │ ├── LICENSE │ │ ├── udpa/ │ │ │ ├── annotations/ │ │ │ │ ├── migrate.pb.go │ │ │ │ ├── migrate.pb.validate.go │ │ │ │ ├── security.pb.go │ │ │ │ ├── security.pb.validate.go │ │ │ │ ├── sensitive.pb.go │ │ │ │ ├── sensitive.pb.validate.go │ │ │ │ ├── status.pb.go │ │ │ │ ├── status.pb.validate.go │ │ │ │ ├── versioning.pb.go │ │ │ │ └── versioning.pb.validate.go │ │ │ └── type/ │ │ │ └── v1/ │ │ │ ├── typed_struct.pb.go │ │ │ └── typed_struct.pb.validate.go │ │ └── xds/ │ │ ├── annotations/ │ │ │ └── v3/ │ │ │ ├── migrate.pb.go │ │ │ ├── migrate.pb.validate.go │ │ │ ├── security.pb.go │ │ │ ├── security.pb.validate.go │ │ │ ├── sensitive.pb.go │ │ │ ├── sensitive.pb.validate.go │ │ │ ├── status.pb.go │ │ │ ├── status.pb.validate.go │ │ │ ├── versioning.pb.go │ │ │ └── versioning.pb.validate.go │ │ ├── core/ │ │ │ └── v3/ │ │ │ ├── authority.pb.go │ │ │ ├── authority.pb.validate.go │ │ │ ├── cidr.pb.go │ │ │ ├── cidr.pb.validate.go │ │ │ ├── collection_entry.pb.go │ │ │ ├── collection_entry.pb.validate.go │ │ │ ├── context_params.pb.go │ │ │ ├── context_params.pb.validate.go │ │ │ ├── extension.pb.go │ │ │ ├── extension.pb.validate.go │ │ │ ├── resource.pb.go │ │ │ ├── resource.pb.validate.go │ │ │ ├── resource_locator.pb.go │ │ │ ├── resource_locator.pb.validate.go │ │ │ ├── resource_name.pb.go │ │ │ └── resource_name.pb.validate.go │ │ ├── data/ │ │ │ └── orca/ │ │ │ └── v3/ │ │ │ ├── orca_load_report.pb.go │ │ │ └── orca_load_report.pb.validate.go │ │ ├── service/ │ │ │ └── orca/ │ │ │ └── v3/ │ │ │ ├── orca.pb.go │ │ │ ├── orca.pb.validate.go │ │ │ └── orca_grpc.pb.go │ │ └── type/ │ │ ├── matcher/ │ │ │ └── v3/ │ │ │ ├── cel.pb.go │ │ │ ├── cel.pb.validate.go │ │ │ ├── domain.pb.go │ │ │ ├── domain.pb.validate.go │ │ │ ├── http_inputs.pb.go │ │ │ ├── http_inputs.pb.validate.go │ │ │ ├── ip.pb.go │ │ │ ├── ip.pb.validate.go │ │ │ ├── matcher.pb.go │ │ │ ├── matcher.pb.validate.go │ │ │ ├── range.pb.go │ │ │ ├── range.pb.validate.go │ │ │ ├── regex.pb.go │ │ │ ├── regex.pb.validate.go │ │ │ ├── string.pb.go │ │ │ └── string.pb.validate.go │ │ └── v3/ │ │ ├── cel.pb.go │ │ ├── cel.pb.validate.go │ │ ├── range.pb.go │ │ ├── range.pb.validate.go │ │ ├── typed_struct.pb.go │ │ └── typed_struct.pb.validate.go │ ├── containerd/ │ │ ├── cgroups/ │ │ │ └── v3/ │ │ │ ├── LICENSE │ │ │ └── cgroup1/ │ │ │ └── stats/ │ │ │ ├── doc.go │ │ │ ├── metrics.pb.go │ │ │ ├── metrics.pb.txt │ │ │ └── metrics.proto │ │ ├── containerd/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ ├── api/ │ │ │ │ ├── LICENSE │ │ │ │ ├── runtime/ │ │ │ │ │ └── sandbox/ │ │ │ │ │ └── v1/ │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── sandbox.pb.go │ │ │ │ │ ├── sandbox.proto │ │ │ │ │ ├── sandbox_grpc.pb.go │ │ │ │ │ └── sandbox_ttrpc.pb.go │ │ │ │ ├── services/ │ │ │ │ │ ├── containers/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── containers.pb.go │ │ │ │ │ │ ├── containers.proto │ │ │ │ │ │ ├── containers_grpc.pb.go │ │ │ │ │ │ ├── containers_ttrpc.pb.go │ │ │ │ │ │ └── doc.go │ │ │ │ │ ├── content/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── content.pb.go │ │ │ │ │ │ ├── content.proto │ │ │ │ │ │ ├── content_grpc.pb.go │ │ │ │ │ │ ├── content_ttrpc.pb.go │ │ │ │ │ │ └── doc.go │ │ │ │ │ ├── diff/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── diff.pb.go │ │ │ │ │ │ ├── diff.proto │ │ │ │ │ │ ├── diff_grpc.pb.go │ │ │ │ │ │ ├── diff_ttrpc.pb.go │ │ │ │ │ │ └── doc.go │ │ │ │ │ ├── events/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── events.pb.go │ │ │ │ │ │ ├── events.proto │ │ │ │ │ │ ├── events_grpc.pb.go │ │ │ │ │ │ └── events_ttrpc.pb.go │ │ │ │ │ ├── images/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── docs.go │ │ │ │ │ │ ├── images.pb.go │ │ │ │ │ │ ├── images.proto │ │ │ │ │ │ ├── images_grpc.pb.go │ │ │ │ │ │ └── images_ttrpc.pb.go │ │ │ │ │ ├── introspection/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── introspection.pb.go │ │ │ │ │ │ ├── introspection.proto │ │ │ │ │ │ ├── introspection_grpc.pb.go │ │ │ │ │ │ └── introspection_ttrpc.pb.go │ │ │ │ │ ├── leases/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── leases.pb.go │ │ │ │ │ │ ├── leases.proto │ │ │ │ │ │ ├── leases_grpc.pb.go │ │ │ │ │ │ └── leases_ttrpc.pb.go │ │ │ │ │ ├── namespaces/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── namespace.pb.go │ │ │ │ │ │ ├── namespace.proto │ │ │ │ │ │ ├── namespace_grpc.pb.go │ │ │ │ │ │ └── namespace_ttrpc.pb.go │ │ │ │ │ ├── sandbox/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── sandbox.pb.go │ │ │ │ │ │ ├── sandbox.proto │ │ │ │ │ │ ├── sandbox_grpc.pb.go │ │ │ │ │ │ └── sandbox_ttrpc.pb.go │ │ │ │ │ ├── snapshots/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── snapshots.pb.go │ │ │ │ │ │ ├── snapshots.proto │ │ │ │ │ │ ├── snapshots_grpc.pb.go │ │ │ │ │ │ └── snapshots_ttrpc.pb.go │ │ │ │ │ ├── streaming/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── streaming.pb.go │ │ │ │ │ │ ├── streaming.proto │ │ │ │ │ │ ├── streaming_grpc.pb.go │ │ │ │ │ │ └── streaming_ttrpc.pb.go │ │ │ │ │ ├── tasks/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── tasks.pb.go │ │ │ │ │ │ ├── tasks.proto │ │ │ │ │ │ ├── tasks_grpc.pb.go │ │ │ │ │ │ └── tasks_ttrpc.pb.go │ │ │ │ │ ├── transfer/ │ │ │ │ │ │ └── v1/ │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── transfer.pb.go │ │ │ │ │ │ ├── transfer.proto │ │ │ │ │ │ ├── transfer_grpc.pb.go │ │ │ │ │ │ └── transfer_ttrpc.pb.go │ │ │ │ │ └── version/ │ │ │ │ │ └── v1/ │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── version.pb.go │ │ │ │ │ ├── version.proto │ │ │ │ │ ├── version_grpc.pb.go │ │ │ │ │ └── version_ttrpc.pb.go │ │ │ │ └── types/ │ │ │ │ ├── descriptor.pb.go │ │ │ │ ├── descriptor.proto │ │ │ │ ├── doc.go │ │ │ │ ├── event.pb.go │ │ │ │ ├── event.proto │ │ │ │ ├── fieldpath.pb.go │ │ │ │ ├── fieldpath.proto │ │ │ │ ├── introspection.pb.go │ │ │ │ ├── introspection.proto │ │ │ │ ├── metrics.pb.go │ │ │ │ ├── metrics.proto │ │ │ │ ├── mount.pb.go │ │ │ │ ├── mount.proto │ │ │ │ ├── platform.pb.go │ │ │ │ ├── platform.proto │ │ │ │ ├── platform_helpers.go │ │ │ │ ├── runc/ │ │ │ │ │ └── options/ │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── next.pb.txt │ │ │ │ │ ├── oci.pb.go │ │ │ │ │ └── oci.proto │ │ │ │ ├── sandbox.pb.go │ │ │ │ ├── sandbox.proto │ │ │ │ ├── task/ │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── task.pb.go │ │ │ │ │ └── task.proto │ │ │ │ └── transfer/ │ │ │ │ ├── doc.go │ │ │ │ ├── imagestore.pb.go │ │ │ │ ├── imagestore.proto │ │ │ │ ├── importexport.pb.go │ │ │ │ ├── importexport.proto │ │ │ │ ├── progress.pb.go │ │ │ │ ├── progress.proto │ │ │ │ ├── registry.pb.go │ │ │ │ ├── registry.proto │ │ │ │ ├── streaming.pb.go │ │ │ │ └── streaming.proto │ │ │ ├── platforms/ │ │ │ │ ├── platforms_deprecated.go │ │ │ │ ├── platforms_deprecated_other.go │ │ │ │ └── platforms_deprecated_windows.go │ │ │ └── v2/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ ├── client/ │ │ │ │ ├── client.go │ │ │ │ ├── client_opts.go │ │ │ │ ├── container.go │ │ │ │ ├── container_checkpoint_opts.go │ │ │ │ ├── container_opts.go │ │ │ │ ├── container_opts_unix.go │ │ │ │ ├── container_restore_opts.go │ │ │ │ ├── containerstore.go │ │ │ │ ├── diff.go │ │ │ │ ├── events.go │ │ │ │ ├── export.go │ │ │ │ ├── grpc.go │ │ │ │ ├── image.go │ │ │ │ ├── image_store.go │ │ │ │ ├── import.go │ │ │ │ ├── install.go │ │ │ │ ├── install_opts.go │ │ │ │ ├── lease.go │ │ │ │ ├── namespaces.go │ │ │ │ ├── process.go │ │ │ │ ├── pull.go │ │ │ │ ├── sandbox.go │ │ │ │ ├── services.go │ │ │ │ ├── signals.go │ │ │ │ ├── snapshotter_opts_unix.go │ │ │ │ ├── snapshotter_opts_windows.go │ │ │ │ ├── task.go │ │ │ │ ├── task_opts.go │ │ │ │ ├── task_opts_unix.go │ │ │ │ └── transfer.go │ │ │ ├── core/ │ │ │ │ ├── containers/ │ │ │ │ │ └── containers.go │ │ │ │ ├── content/ │ │ │ │ │ ├── adaptor.go │ │ │ │ │ ├── content.go │ │ │ │ │ ├── helpers.go │ │ │ │ │ └── proxy/ │ │ │ │ │ ├── content_reader.go │ │ │ │ │ ├── content_store.go │ │ │ │ │ └── content_writer.go │ │ │ │ ├── diff/ │ │ │ │ │ ├── diff.go │ │ │ │ │ ├── proxy/ │ │ │ │ │ │ └── differ.go │ │ │ │ │ ├── stream.go │ │ │ │ │ ├── stream_unix.go │ │ │ │ │ └── stream_windows.go │ │ │ │ ├── events/ │ │ │ │ │ ├── events.go │ │ │ │ │ └── proxy/ │ │ │ │ │ └── remote_events.go │ │ │ │ ├── images/ │ │ │ │ │ ├── annotations.go │ │ │ │ │ ├── archive/ │ │ │ │ │ │ ├── exporter.go │ │ │ │ │ │ ├── importer.go │ │ │ │ │ │ └── reference.go │ │ │ │ │ ├── diffid.go │ │ │ │ │ ├── handlers.go │ │ │ │ │ ├── image.go │ │ │ │ │ ├── importexport.go │ │ │ │ │ ├── mediatypes.go │ │ │ │ │ └── usage/ │ │ │ │ │ └── calculator.go │ │ │ │ ├── introspection/ │ │ │ │ │ ├── introspection.go │ │ │ │ │ └── proxy/ │ │ │ │ │ └── remote.go │ │ │ │ ├── leases/ │ │ │ │ │ ├── context.go │ │ │ │ │ ├── grpc.go │ │ │ │ │ ├── id.go │ │ │ │ │ ├── lease.go │ │ │ │ │ └── proxy/ │ │ │ │ │ └── manager.go │ │ │ │ ├── mount/ │ │ │ │ │ ├── fuse_linux.go │ │ │ │ │ ├── fuse_unsupported.go │ │ │ │ │ ├── lookup_unix.go │ │ │ │ │ ├── lookup_unsupported.go │ │ │ │ │ ├── losetup_linux.go │ │ │ │ │ ├── mount.go │ │ │ │ │ ├── mount_darwin.go │ │ │ │ │ ├── mount_freebsd.go │ │ │ │ │ ├── mount_idmapped_linux.go │ │ │ │ │ ├── mount_idmapped_utils_linux.go │ │ │ │ │ ├── mount_idmapped_utils_linux_go122.go │ │ │ │ │ ├── mount_linux.go │ │ │ │ │ ├── mount_unix.go │ │ │ │ │ ├── mount_unsupported.go │ │ │ │ │ ├── mount_windows.go │ │ │ │ │ ├── mountinfo.go │ │ │ │ │ ├── temp.go │ │ │ │ │ ├── temp_unix.go │ │ │ │ │ └── temp_unsupported.go │ │ │ │ ├── remotes/ │ │ │ │ │ ├── docker/ │ │ │ │ │ │ ├── auth/ │ │ │ │ │ │ │ ├── fetch.go │ │ │ │ │ │ │ └── parse.go │ │ │ │ │ │ ├── authorizer.go │ │ │ │ │ │ ├── converter.go │ │ │ │ │ │ ├── errcode.go │ │ │ │ │ │ ├── errdesc.go │ │ │ │ │ │ ├── fetcher.go │ │ │ │ │ │ ├── handler.go │ │ │ │ │ │ ├── httpreadseeker.go │ │ │ │ │ │ ├── pusher.go │ │ │ │ │ │ ├── registry.go │ │ │ │ │ │ ├── resolver.go │ │ │ │ │ │ ├── resolver_unix.go │ │ │ │ │ │ ├── resolver_windows.go │ │ │ │ │ │ ├── scope.go │ │ │ │ │ │ └── status.go │ │ │ │ │ ├── errors/ │ │ │ │ │ │ └── errors.go │ │ │ │ │ ├── handlers.go │ │ │ │ │ └── resolver.go │ │ │ │ ├── sandbox/ │ │ │ │ │ ├── bridge.go │ │ │ │ │ ├── controller.go │ │ │ │ │ ├── helpers.go │ │ │ │ │ ├── proxy/ │ │ │ │ │ │ ├── controller.go │ │ │ │ │ │ └── store.go │ │ │ │ │ └── store.go │ │ │ │ ├── snapshots/ │ │ │ │ │ ├── proxy/ │ │ │ │ │ │ ├── convert.go │ │ │ │ │ │ └── proxy.go │ │ │ │ │ └── snapshotter.go │ │ │ │ ├── streaming/ │ │ │ │ │ ├── proxy/ │ │ │ │ │ │ └── streaming.go │ │ │ │ │ └── streaming.go │ │ │ │ ├── transfer/ │ │ │ │ │ ├── proxy/ │ │ │ │ │ │ └── transfer.go │ │ │ │ │ ├── streaming/ │ │ │ │ │ │ ├── reader.go │ │ │ │ │ │ ├── stream.go │ │ │ │ │ │ └── writer.go │ │ │ │ │ └── transfer.go │ │ │ │ └── unpack/ │ │ │ │ └── unpacker.go │ │ │ ├── defaults/ │ │ │ │ ├── defaults.go │ │ │ │ ├── defaults_darwin.go │ │ │ │ ├── defaults_freebsd.go │ │ │ │ ├── defaults_linux.go │ │ │ │ ├── defaults_unix.go │ │ │ │ ├── defaults_unix_nolinux.go │ │ │ │ ├── defaults_windows.go │ │ │ │ └── doc.go │ │ │ ├── internal/ │ │ │ │ ├── cleanup/ │ │ │ │ │ └── context.go │ │ │ │ ├── kmutex/ │ │ │ │ │ ├── kmutex.go │ │ │ │ │ └── noop.go │ │ │ │ ├── lazyregexp/ │ │ │ │ │ └── lazyregexp.go │ │ │ │ ├── randutil/ │ │ │ │ │ └── randutil.go │ │ │ │ └── userns/ │ │ │ │ └── idmap.go │ │ │ ├── pkg/ │ │ │ │ ├── archive/ │ │ │ │ │ ├── compression/ │ │ │ │ │ │ └── compression.go │ │ │ │ │ ├── link_default.go │ │ │ │ │ ├── link_freebsd.go │ │ │ │ │ ├── tar.go │ │ │ │ │ ├── tar_freebsd.go │ │ │ │ │ ├── tar_mostunix.go │ │ │ │ │ ├── tar_opts.go │ │ │ │ │ ├── tar_opts_linux.go │ │ │ │ │ ├── tar_opts_windows.go │ │ │ │ │ ├── tar_unix.go │ │ │ │ │ ├── tar_windows.go │ │ │ │ │ ├── tarheader/ │ │ │ │ │ │ ├── tarheader.go │ │ │ │ │ │ └── tarheader_unix.go │ │ │ │ │ ├── time.go │ │ │ │ │ ├── time_unix.go │ │ │ │ │ └── time_windows.go │ │ │ │ ├── cap/ │ │ │ │ │ └── cap_linux.go │ │ │ │ ├── cio/ │ │ │ │ │ ├── io.go │ │ │ │ │ ├── io_unix.go │ │ │ │ │ └── io_windows.go │ │ │ │ ├── dialer/ │ │ │ │ │ ├── dialer.go │ │ │ │ │ ├── dialer_unix.go │ │ │ │ │ └── dialer_windows.go │ │ │ │ ├── epoch/ │ │ │ │ │ ├── context.go │ │ │ │ │ └── epoch.go │ │ │ │ ├── filters/ │ │ │ │ │ ├── adaptor.go │ │ │ │ │ ├── filter.go │ │ │ │ │ ├── parser.go │ │ │ │ │ ├── quote.go │ │ │ │ │ └── scanner.go │ │ │ │ ├── identifiers/ │ │ │ │ │ └── validate.go │ │ │ │ ├── kernelversion/ │ │ │ │ │ └── kernel_linux.go │ │ │ │ ├── labels/ │ │ │ │ │ ├── labels.go │ │ │ │ │ └── validate.go │ │ │ │ ├── namespaces/ │ │ │ │ │ ├── context.go │ │ │ │ │ ├── grpc.go │ │ │ │ │ ├── store.go │ │ │ │ │ └── ttrpc.go │ │ │ │ ├── oci/ │ │ │ │ │ ├── client.go │ │ │ │ │ ├── mounts.go │ │ │ │ │ ├── mounts_freebsd.go │ │ │ │ │ ├── spec.go │ │ │ │ │ ├── spec_opts.go │ │ │ │ │ ├── spec_opts_linux.go │ │ │ │ │ ├── spec_opts_nonlinux.go │ │ │ │ │ ├── spec_opts_nonwindows.go │ │ │ │ │ ├── spec_opts_unix.go │ │ │ │ │ ├── spec_opts_windows.go │ │ │ │ │ └── utils_unix.go │ │ │ │ ├── protobuf/ │ │ │ │ │ ├── compare.go │ │ │ │ │ ├── proto/ │ │ │ │ │ │ └── proto.go │ │ │ │ │ ├── timestamp.go │ │ │ │ │ └── types/ │ │ │ │ │ └── types.go │ │ │ │ ├── reference/ │ │ │ │ │ └── reference.go │ │ │ │ ├── rootfs/ │ │ │ │ │ ├── apply.go │ │ │ │ │ ├── diff.go │ │ │ │ │ ├── init.go │ │ │ │ │ ├── init_linux.go │ │ │ │ │ └── init_other.go │ │ │ │ ├── sys/ │ │ │ │ │ ├── eintr_unix.go │ │ │ │ │ ├── filesys_unix.go │ │ │ │ │ ├── filesys_windows.go │ │ │ │ │ ├── namespace_linux.go │ │ │ │ │ ├── oom_linux.go │ │ │ │ │ ├── oom_unsupported.go │ │ │ │ │ ├── pidfd_linux.go │ │ │ │ │ ├── socket_unix.go │ │ │ │ │ ├── socket_windows.go │ │ │ │ │ └── unshare_linux.go │ │ │ │ └── tracing/ │ │ │ │ ├── helpers.go │ │ │ │ ├── log.go │ │ │ │ └── tracing.go │ │ │ ├── plugins/ │ │ │ │ ├── services/ │ │ │ │ │ └── services.go │ │ │ │ └── types.go │ │ │ └── version/ │ │ │ └── version.go │ │ ├── continuity/ │ │ │ ├── AUTHORS │ │ │ ├── LICENSE │ │ │ ├── devices/ │ │ │ │ ├── devices.go │ │ │ │ ├── devices_unix.go │ │ │ │ ├── devices_windows.go │ │ │ │ ├── mknod_freebsd.go │ │ │ │ └── mknod_unix.go │ │ │ ├── driver/ │ │ │ │ ├── driver.go │ │ │ │ ├── driver_unix.go │ │ │ │ ├── driver_windows.go │ │ │ │ ├── lchmod_linux.go │ │ │ │ ├── lchmod_unix.go │ │ │ │ └── utils.go │ │ │ ├── fs/ │ │ │ │ ├── copy.go │ │ │ │ ├── copy_darwin.go │ │ │ │ ├── copy_irregular_freebsd.go │ │ │ │ ├── copy_irregular_unix.go │ │ │ │ ├── copy_linux.go │ │ │ │ ├── copy_nondarwin.go │ │ │ │ ├── copy_unix.go │ │ │ │ ├── copy_windows.go │ │ │ │ ├── diff.go │ │ │ │ ├── diff_linux.go │ │ │ │ ├── diff_nonlinux.go │ │ │ │ ├── diff_unix.go │ │ │ │ ├── diff_windows.go │ │ │ │ ├── dir.go │ │ │ │ ├── dtype_linux.go │ │ │ │ ├── du.go │ │ │ │ ├── du_unix.go │ │ │ │ ├── du_windows.go │ │ │ │ ├── hardlink.go │ │ │ │ ├── hardlink_unix.go │ │ │ │ ├── hardlink_windows.go │ │ │ │ ├── magic_linux.go │ │ │ │ ├── path.go │ │ │ │ ├── stat_darwinbsd.go │ │ │ │ ├── stat_unix.go │ │ │ │ ├── stat_windows.go │ │ │ │ ├── time.go │ │ │ │ └── utimesnanoat.go │ │ │ └── sysx/ │ │ │ ├── README.md │ │ │ ├── nodata_linux.go │ │ │ ├── nodata_solaris.go │ │ │ ├── nodata_unix.go │ │ │ ├── xattr.go │ │ │ └── xattr_unsupported.go │ │ ├── errdefs/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── errors.go │ │ │ ├── pkg/ │ │ │ │ ├── LICENSE │ │ │ │ ├── errgrpc/ │ │ │ │ │ └── grpc.go │ │ │ │ └── internal/ │ │ │ │ ├── cause/ │ │ │ │ │ └── cause.go │ │ │ │ └── types/ │ │ │ │ └── collapsible.go │ │ │ └── resolve.go │ │ ├── log/ │ │ │ ├── .golangci.yml │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── context.go │ │ ├── platforms/ │ │ │ ├── .gitattributes │ │ │ ├── .golangci.yml │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── compare.go │ │ │ ├── cpuinfo.go │ │ │ ├── cpuinfo_linux.go │ │ │ ├── cpuinfo_other.go │ │ │ ├── database.go │ │ │ ├── defaults.go │ │ │ ├── defaults_darwin.go │ │ │ ├── defaults_freebsd.go │ │ │ ├── defaults_unix.go │ │ │ ├── defaults_windows.go │ │ │ ├── errors.go │ │ │ ├── platform_windows_compat.go │ │ │ └── platforms.go │ │ ├── plugin/ │ │ │ ├── .golangci.yml │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── context.go │ │ │ └── plugin.go │ │ ├── stargz-snapshotter/ │ │ │ └── estargz/ │ │ │ ├── LICENSE │ │ │ ├── build.go │ │ │ ├── errorutil/ │ │ │ │ └── errors.go │ │ │ ├── estargz.go │ │ │ ├── gzip.go │ │ │ ├── testutil.go │ │ │ └── types.go │ │ ├── ttrpc/ │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── .golangci.yml │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── PROTOCOL.md │ │ │ ├── Protobuild.toml │ │ │ ├── README.md │ │ │ ├── channel.go │ │ │ ├── client.go │ │ │ ├── codec.go │ │ │ ├── config.go │ │ │ ├── doc.go │ │ │ ├── errors.go │ │ │ ├── handshake.go │ │ │ ├── interceptor.go │ │ │ ├── metadata.go │ │ │ ├── request.pb.go │ │ │ ├── request.proto │ │ │ ├── server.go │ │ │ ├── services.go │ │ │ ├── stream.go │ │ │ ├── stream_server.go │ │ │ ├── test.proto │ │ │ └── unixcreds_linux.go │ │ └── typeurl/ │ │ └── v2/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── doc.go │ │ ├── types.go │ │ └── types_gogo.go │ ├── cyphar/ │ │ └── filepath-securejoin/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── VERSION │ │ ├── doc.go │ │ ├── gocompat_errors_go120.go │ │ ├── gocompat_errors_unsupported.go │ │ ├── gocompat_generics_go121.go │ │ ├── gocompat_generics_unsupported.go │ │ ├── join.go │ │ ├── lookup_linux.go │ │ ├── mkdir_linux.go │ │ ├── open_linux.go │ │ ├── openat2_linux.go │ │ ├── openat_linux.go │ │ ├── procfs_linux.go │ │ └── vfs.go │ ├── dimchansky/ │ │ └── utfbom/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── LICENSE │ │ ├── README.md │ │ └── utfbom.go │ ├── distribution/ │ │ └── reference/ │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── .golangci.yml │ │ ├── CODE-OF-CONDUCT.md │ │ ├── CONTRIBUTING.md │ │ ├── GOVERNANCE.md │ │ ├── LICENSE │ │ ├── MAINTAINERS │ │ ├── Makefile │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── helpers.go │ │ ├── normalize.go │ │ ├── reference.go │ │ ├── regexp.go │ │ └── sort.go │ ├── docker/ │ │ ├── cli/ │ │ │ ├── AUTHORS │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ └── cli/ │ │ │ └── config/ │ │ │ ├── config.go │ │ │ ├── configfile/ │ │ │ │ ├── file.go │ │ │ │ ├── file_unix.go │ │ │ │ └── file_windows.go │ │ │ ├── credentials/ │ │ │ │ ├── credentials.go │ │ │ │ ├── default_store.go │ │ │ │ ├── default_store_darwin.go │ │ │ │ ├── default_store_linux.go │ │ │ │ ├── default_store_unsupported.go │ │ │ │ ├── default_store_windows.go │ │ │ │ ├── file_store.go │ │ │ │ └── native_store.go │ │ │ └── types/ │ │ │ └── authconfig.go │ │ ├── distribution/ │ │ │ ├── .dockerignore │ │ │ ├── .gitignore │ │ │ ├── .golangci.yml │ │ │ ├── .mailmap │ │ │ ├── BUILDING.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── Dockerfile │ │ │ ├── LICENSE │ │ │ ├── MAINTAINERS │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── ROADMAP.md │ │ │ ├── blobs.go │ │ │ ├── doc.go │ │ │ ├── docker-bake.hcl │ │ │ ├── errors.go │ │ │ ├── manifests.go │ │ │ ├── registry/ │ │ │ │ └── client/ │ │ │ │ └── auth/ │ │ │ │ └── challenge/ │ │ │ │ ├── addr.go │ │ │ │ └── authchallenge.go │ │ │ ├── registry.go │ │ │ ├── tags.go │ │ │ └── vendor.conf │ │ ├── docker/ │ │ │ ├── AUTHORS │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ ├── api/ │ │ │ │ ├── README.md │ │ │ │ ├── common.go │ │ │ │ ├── swagger-gen.yaml │ │ │ │ ├── swagger.yaml │ │ │ │ └── types/ │ │ │ │ ├── backend/ │ │ │ │ │ ├── backend.go │ │ │ │ │ └── build.go │ │ │ │ ├── blkiodev/ │ │ │ │ │ └── blkio.go │ │ │ │ ├── checkpoint/ │ │ │ │ │ ├── list.go │ │ │ │ │ └── options.go │ │ │ │ ├── client.go │ │ │ │ ├── common/ │ │ │ │ │ └── id_response.go │ │ │ │ ├── container/ │ │ │ │ │ ├── change_type.go │ │ │ │ │ ├── change_types.go │ │ │ │ │ ├── commit.go │ │ │ │ │ ├── config.go │ │ │ │ │ ├── container.go │ │ │ │ │ ├── create_request.go │ │ │ │ │ ├── create_response.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── exec.go │ │ │ │ │ ├── filesystem_change.go │ │ │ │ │ ├── health.go │ │ │ │ │ ├── hostconfig.go │ │ │ │ │ ├── hostconfig_unix.go │ │ │ │ │ ├── hostconfig_windows.go │ │ │ │ │ ├── network_settings.go │ │ │ │ │ ├── options.go │ │ │ │ │ ├── port.go │ │ │ │ │ ├── stats.go │ │ │ │ │ ├── top_response.go │ │ │ │ │ ├── update_response.go │ │ │ │ │ ├── wait_exit_error.go │ │ │ │ │ ├── wait_response.go │ │ │ │ │ └── waitcondition.go │ │ │ │ ├── error_response.go │ │ │ │ ├── error_response_ext.go │ │ │ │ ├── events/ │ │ │ │ │ └── events.go │ │ │ │ ├── filters/ │ │ │ │ │ ├── errors.go │ │ │ │ │ └── parse.go │ │ │ │ ├── image/ │ │ │ │ │ ├── delete_response.go │ │ │ │ │ ├── image.go │ │ │ │ │ ├── image_history.go │ │ │ │ │ ├── image_inspect.go │ │ │ │ │ ├── manifest.go │ │ │ │ │ ├── opts.go │ │ │ │ │ └── summary.go │ │ │ │ ├── mount/ │ │ │ │ │ └── mount.go │ │ │ │ ├── network/ │ │ │ │ │ ├── create_response.go │ │ │ │ │ ├── endpoint.go │ │ │ │ │ ├── ipam.go │ │ │ │ │ └── network.go │ │ │ │ ├── plugin.go │ │ │ │ ├── plugin_device.go │ │ │ │ ├── plugin_env.go │ │ │ │ ├── plugin_interface_type.go │ │ │ │ ├── plugin_mount.go │ │ │ │ ├── plugin_responses.go │ │ │ │ ├── plugins/ │ │ │ │ │ └── logdriver/ │ │ │ │ │ ├── entry.pb.go │ │ │ │ │ ├── entry.proto │ │ │ │ │ ├── gen.go │ │ │ │ │ └── io.go │ │ │ │ ├── registry/ │ │ │ │ │ ├── authconfig.go │ │ │ │ │ ├── authenticate.go │ │ │ │ │ ├── registry.go │ │ │ │ │ └── search.go │ │ │ │ ├── storage/ │ │ │ │ │ └── driver_data.go │ │ │ │ ├── strslice/ │ │ │ │ │ └── strslice.go │ │ │ │ ├── swarm/ │ │ │ │ │ ├── common.go │ │ │ │ │ ├── config.go │ │ │ │ │ ├── container.go │ │ │ │ │ ├── network.go │ │ │ │ │ ├── node.go │ │ │ │ │ ├── runtime/ │ │ │ │ │ │ ├── gen.go │ │ │ │ │ │ ├── plugin.pb.go │ │ │ │ │ │ └── plugin.proto │ │ │ │ │ ├── runtime.go │ │ │ │ │ ├── secret.go │ │ │ │ │ ├── service.go │ │ │ │ │ ├── service_create_response.go │ │ │ │ │ ├── service_update_response.go │ │ │ │ │ ├── swarm.go │ │ │ │ │ └── task.go │ │ │ │ ├── system/ │ │ │ │ │ ├── info.go │ │ │ │ │ ├── runtime.go │ │ │ │ │ └── security_opts.go │ │ │ │ ├── time/ │ │ │ │ │ └── timestamp.go │ │ │ │ ├── types.go │ │ │ │ ├── types_deprecated.go │ │ │ │ ├── versions/ │ │ │ │ │ └── compare.go │ │ │ │ └── volume/ │ │ │ │ ├── cluster_volume.go │ │ │ │ ├── create_options.go │ │ │ │ ├── list_response.go │ │ │ │ ├── options.go │ │ │ │ ├── volume.go │ │ │ │ └── volume_update.go │ │ │ ├── builder/ │ │ │ │ ├── builder.go │ │ │ │ ├── dockerfile/ │ │ │ │ │ ├── buildargs.go │ │ │ │ │ ├── builder.go │ │ │ │ │ ├── builder_unix.go │ │ │ │ │ ├── builder_windows.go │ │ │ │ │ ├── containerbackend.go │ │ │ │ │ ├── copy.go │ │ │ │ │ ├── copy_unix.go │ │ │ │ │ ├── copy_windows.go │ │ │ │ │ ├── dispatchers.go │ │ │ │ │ ├── dispatchers_unix.go │ │ │ │ │ ├── dispatchers_windows.go │ │ │ │ │ ├── evaluator.go │ │ │ │ │ ├── imagecontext.go │ │ │ │ │ ├── imageprobe.go │ │ │ │ │ ├── internals.go │ │ │ │ │ ├── internals_linux.go │ │ │ │ │ ├── internals_windows.go │ │ │ │ │ └── metrics.go │ │ │ │ └── remotecontext/ │ │ │ │ ├── archive.go │ │ │ │ ├── detect.go │ │ │ │ ├── filehash.go │ │ │ │ ├── git/ │ │ │ │ │ └── gitutils.go │ │ │ │ ├── git.go │ │ │ │ ├── lazycontext.go │ │ │ │ ├── mimetype.go │ │ │ │ ├── remote.go │ │ │ │ └── urlutil/ │ │ │ │ └── urlutil.go │ │ │ ├── client/ │ │ │ │ ├── README.md │ │ │ │ ├── build_cancel.go │ │ │ │ ├── build_prune.go │ │ │ │ ├── checkpoint.go │ │ │ │ ├── checkpoint_create.go │ │ │ │ ├── checkpoint_delete.go │ │ │ │ ├── checkpoint_list.go │ │ │ │ ├── client.go │ │ │ │ ├── client_deprecated.go │ │ │ │ ├── client_interfaces.go │ │ │ │ ├── client_unix.go │ │ │ │ ├── client_windows.go │ │ │ │ ├── config_create.go │ │ │ │ ├── config_inspect.go │ │ │ │ ├── config_list.go │ │ │ │ ├── config_remove.go │ │ │ │ ├── config_update.go │ │ │ │ ├── container_attach.go │ │ │ │ ├── container_commit.go │ │ │ │ ├── container_copy.go │ │ │ │ ├── container_create.go │ │ │ │ ├── container_diff.go │ │ │ │ ├── container_exec.go │ │ │ │ ├── container_export.go │ │ │ │ ├── container_inspect.go │ │ │ │ ├── container_kill.go │ │ │ │ ├── container_list.go │ │ │ │ ├── container_logs.go │ │ │ │ ├── container_pause.go │ │ │ │ ├── container_prune.go │ │ │ │ ├── container_remove.go │ │ │ │ ├── container_rename.go │ │ │ │ ├── container_resize.go │ │ │ │ ├── container_restart.go │ │ │ │ ├── container_start.go │ │ │ │ ├── container_stats.go │ │ │ │ ├── container_stop.go │ │ │ │ ├── container_top.go │ │ │ │ ├── container_unpause.go │ │ │ │ ├── container_update.go │ │ │ │ ├── container_wait.go │ │ │ │ ├── disk_usage.go │ │ │ │ ├── distribution_inspect.go │ │ │ │ ├── envvars.go │ │ │ │ ├── errors.go │ │ │ │ ├── events.go │ │ │ │ ├── hijack.go │ │ │ │ ├── image_build.go │ │ │ │ ├── image_create.go │ │ │ │ ├── image_history.go │ │ │ │ ├── image_history_opts.go │ │ │ │ ├── image_import.go │ │ │ │ ├── image_inspect.go │ │ │ │ ├── image_inspect_opts.go │ │ │ │ ├── image_list.go │ │ │ │ ├── image_load.go │ │ │ │ ├── image_load_opts.go │ │ │ │ ├── image_prune.go │ │ │ │ ├── image_pull.go │ │ │ │ ├── image_push.go │ │ │ │ ├── image_remove.go │ │ │ │ ├── image_save.go │ │ │ │ ├── image_save_opts.go │ │ │ │ ├── image_search.go │ │ │ │ ├── image_tag.go │ │ │ │ ├── info.go │ │ │ │ ├── login.go │ │ │ │ ├── network_connect.go │ │ │ │ ├── network_create.go │ │ │ │ ├── network_disconnect.go │ │ │ │ ├── network_inspect.go │ │ │ │ ├── network_list.go │ │ │ │ ├── network_prune.go │ │ │ │ ├── network_remove.go │ │ │ │ ├── node_inspect.go │ │ │ │ ├── node_list.go │ │ │ │ ├── node_remove.go │ │ │ │ ├── node_update.go │ │ │ │ ├── options.go │ │ │ │ ├── ping.go │ │ │ │ ├── plugin_create.go │ │ │ │ ├── plugin_disable.go │ │ │ │ ├── plugin_enable.go │ │ │ │ ├── plugin_inspect.go │ │ │ │ ├── plugin_install.go │ │ │ │ ├── plugin_list.go │ │ │ │ ├── plugin_push.go │ │ │ │ ├── plugin_remove.go │ │ │ │ ├── plugin_set.go │ │ │ │ ├── plugin_upgrade.go │ │ │ │ ├── request.go │ │ │ │ ├── secret_create.go │ │ │ │ ├── secret_inspect.go │ │ │ │ ├── secret_list.go │ │ │ │ ├── secret_remove.go │ │ │ │ ├── secret_update.go │ │ │ │ ├── service_create.go │ │ │ │ ├── service_inspect.go │ │ │ │ ├── service_list.go │ │ │ │ ├── service_logs.go │ │ │ │ ├── service_remove.go │ │ │ │ ├── service_update.go │ │ │ │ ├── swarm_get_unlock_key.go │ │ │ │ ├── swarm_init.go │ │ │ │ ├── swarm_inspect.go │ │ │ │ ├── swarm_join.go │ │ │ │ ├── swarm_leave.go │ │ │ │ ├── swarm_unlock.go │ │ │ │ ├── swarm_update.go │ │ │ │ ├── task_inspect.go │ │ │ │ ├── task_list.go │ │ │ │ ├── task_logs.go │ │ │ │ ├── utils.go │ │ │ │ ├── version.go │ │ │ │ ├── volume_create.go │ │ │ │ ├── volume_inspect.go │ │ │ │ ├── volume_list.go │ │ │ │ ├── volume_prune.go │ │ │ │ ├── volume_remove.go │ │ │ │ └── volume_update.go │ │ │ ├── container/ │ │ │ │ ├── archive_windows.go │ │ │ │ ├── attach_context.go │ │ │ │ ├── container.go │ │ │ │ ├── container_unix.go │ │ │ │ ├── container_windows.go │ │ │ │ ├── env.go │ │ │ │ ├── exec.go │ │ │ │ ├── health.go │ │ │ │ ├── history.go │ │ │ │ ├── memory_store.go │ │ │ │ ├── monitor.go │ │ │ │ ├── mounts_unix.go │ │ │ │ ├── mounts_windows.go │ │ │ │ ├── rwlayer.go │ │ │ │ ├── state.go │ │ │ │ ├── store.go │ │ │ │ ├── stream/ │ │ │ │ │ ├── attach.go │ │ │ │ │ ├── bytespipe/ │ │ │ │ │ │ ├── buffer.go │ │ │ │ │ │ └── bytespipe.go │ │ │ │ │ ├── streams.go │ │ │ │ │ └── unbuffered.go │ │ │ │ └── view.go │ │ │ ├── daemon/ │ │ │ │ ├── cluster/ │ │ │ │ │ └── provider/ │ │ │ │ │ └── network.go │ │ │ │ ├── graphdriver/ │ │ │ │ │ ├── driver.go │ │ │ │ │ ├── driver_freebsd.go │ │ │ │ │ ├── driver_linux.go │ │ │ │ │ ├── driver_unsupported.go │ │ │ │ │ ├── driver_windows.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── fsdiff.go │ │ │ │ │ └── utils.go │ │ │ │ ├── logger/ │ │ │ │ │ ├── adapter.go │ │ │ │ │ ├── copier.go │ │ │ │ │ ├── factory.go │ │ │ │ │ ├── jsonfilelog/ │ │ │ │ │ │ ├── jsonfilelog.go │ │ │ │ │ │ ├── jsonlog/ │ │ │ │ │ │ │ ├── jsonlog.go │ │ │ │ │ │ │ ├── jsonlogbytes.go │ │ │ │ │ │ │ └── time_marshalling.go │ │ │ │ │ │ └── read.go │ │ │ │ │ ├── local/ │ │ │ │ │ │ ├── config.go │ │ │ │ │ │ ├── doc.go │ │ │ │ │ │ ├── local.go │ │ │ │ │ │ └── read.go │ │ │ │ │ ├── log_cache_opts.go │ │ │ │ │ ├── logger.go │ │ │ │ │ ├── logger_error.go │ │ │ │ │ ├── loggerutils/ │ │ │ │ │ │ ├── cache/ │ │ │ │ │ │ │ ├── local_cache.go │ │ │ │ │ │ │ └── validate.go │ │ │ │ │ │ ├── file_unix.go │ │ │ │ │ │ ├── file_windows.go │ │ │ │ │ │ ├── follow.go │ │ │ │ │ │ ├── log_tag.go │ │ │ │ │ │ ├── logfile.go │ │ │ │ │ │ ├── queue.go │ │ │ │ │ │ └── sharedtemp.go │ │ │ │ │ ├── loginfo.go │ │ │ │ │ ├── metrics.go │ │ │ │ │ ├── plugin.go │ │ │ │ │ ├── plugin_unix.go │ │ │ │ │ ├── plugin_unsupported.go │ │ │ │ │ ├── proxy.go │ │ │ │ │ ├── ring.go │ │ │ │ │ └── templates/ │ │ │ │ │ └── templates.go │ │ │ │ └── network/ │ │ │ │ ├── filter.go │ │ │ │ ├── network_mode.go │ │ │ │ ├── network_mode_unix.go │ │ │ │ ├── network_mode_windows.go │ │ │ │ └── settings.go │ │ │ ├── dockerversion/ │ │ │ │ ├── useragent.go │ │ │ │ └── version_lib.go │ │ │ ├── errdefs/ │ │ │ │ ├── defs.go │ │ │ │ ├── doc.go │ │ │ │ ├── helpers.go │ │ │ │ ├── http_helpers.go │ │ │ │ └── is.go │ │ │ ├── image/ │ │ │ │ ├── fs.go │ │ │ │ ├── image.go │ │ │ │ ├── image_os.go │ │ │ │ ├── rootfs.go │ │ │ │ └── store.go │ │ │ ├── internal/ │ │ │ │ ├── cleanups/ │ │ │ │ │ └── composite.go │ │ │ │ ├── lazyregexp/ │ │ │ │ │ └── lazyregexp.go │ │ │ │ ├── multierror/ │ │ │ │ │ └── multierror.go │ │ │ │ ├── platform/ │ │ │ │ │ ├── platform.go │ │ │ │ │ ├── platform_linux.go │ │ │ │ │ ├── platform_unix.go │ │ │ │ │ └── platform_windows.go │ │ │ │ ├── safepath/ │ │ │ │ │ ├── common.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── join_linux.go │ │ │ │ │ ├── join_windows.go │ │ │ │ │ ├── k8s_safeopen_linux.go │ │ │ │ │ └── safepath.go │ │ │ │ ├── unix_noeintr/ │ │ │ │ │ ├── epoll_linux.go │ │ │ │ │ └── fs_unix.go │ │ │ │ └── usergroup/ │ │ │ │ ├── add_linux.go │ │ │ │ ├── add_unsupported.go │ │ │ │ ├── const_windows.go │ │ │ │ ├── lookup_unix.go │ │ │ │ ├── parser.go │ │ │ │ └── utils_unix.go │ │ │ ├── layer/ │ │ │ │ ├── empty.go │ │ │ │ ├── filestore.go │ │ │ │ ├── layer.go │ │ │ │ ├── layer_store.go │ │ │ │ ├── layer_store_windows.go │ │ │ │ ├── layer_unix.go │ │ │ │ ├── layer_windows.go │ │ │ │ ├── migration.go │ │ │ │ ├── mounted_layer.go │ │ │ │ ├── ro_layer.go │ │ │ │ └── ro_layer_windows.go │ │ │ ├── libcontainerd/ │ │ │ │ └── types/ │ │ │ │ ├── types.go │ │ │ │ ├── types_linux.go │ │ │ │ └── types_windows.go │ │ │ ├── oci/ │ │ │ │ ├── caps/ │ │ │ │ │ ├── defaults.go │ │ │ │ │ ├── utils.go │ │ │ │ │ ├── utils_linux.go │ │ │ │ │ └── utils_other.go │ │ │ │ ├── defaults.go │ │ │ │ ├── devices_linux.go │ │ │ │ ├── namespaces.go │ │ │ │ └── oci.go │ │ │ ├── pkg/ │ │ │ │ ├── archive/ │ │ │ │ │ ├── archive_deprecated.go │ │ │ │ │ ├── changes_deprecated.go │ │ │ │ │ ├── copy_deprecated.go │ │ │ │ │ ├── diff_deprecated.go │ │ │ │ │ ├── path_deprecated.go │ │ │ │ │ ├── utils.go │ │ │ │ │ ├── whiteouts_deprecated.go │ │ │ │ │ └── wrap_deprecated.go │ │ │ │ ├── homedir/ │ │ │ │ │ ├── homedir.go │ │ │ │ │ ├── homedir_linux.go │ │ │ │ │ └── homedir_others.go │ │ │ │ ├── idtools/ │ │ │ │ │ ├── idtools.go │ │ │ │ │ └── idtools_windows.go │ │ │ │ ├── ioutils/ │ │ │ │ │ ├── fswriters_deprecated.go │ │ │ │ │ ├── readers.go │ │ │ │ │ ├── writeflusher.go │ │ │ │ │ └── writers.go │ │ │ │ ├── jsonmessage/ │ │ │ │ │ └── jsonmessage.go │ │ │ │ ├── longpath/ │ │ │ │ │ └── longpath.go │ │ │ │ ├── parsers/ │ │ │ │ │ └── kernel/ │ │ │ │ │ ├── kernel.go │ │ │ │ │ ├── kernel_darwin.go │ │ │ │ │ ├── kernel_unix.go │ │ │ │ │ ├── kernel_windows.go │ │ │ │ │ ├── uname_linux.go │ │ │ │ │ └── uname_unsupported.go │ │ │ │ ├── plugingetter/ │ │ │ │ │ └── getter.go │ │ │ │ ├── plugins/ │ │ │ │ │ ├── client.go │ │ │ │ │ ├── discovery.go │ │ │ │ │ ├── discovery_unix.go │ │ │ │ │ ├── discovery_windows.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── plugins.go │ │ │ │ │ └── transport/ │ │ │ │ │ ├── http.go │ │ │ │ │ └── mimetype.go │ │ │ │ ├── pools/ │ │ │ │ │ └── pools.go │ │ │ │ ├── progress/ │ │ │ │ │ ├── progress.go │ │ │ │ │ └── progressreader.go │ │ │ │ ├── rootless/ │ │ │ │ │ └── rootless.go │ │ │ │ ├── streamformatter/ │ │ │ │ │ ├── streamformatter.go │ │ │ │ │ └── streamwriter.go │ │ │ │ ├── stringid/ │ │ │ │ │ └── stringid.go │ │ │ │ ├── system/ │ │ │ │ │ ├── args_windows.go │ │ │ │ │ ├── chtimes.go │ │ │ │ │ ├── chtimes_nowindows.go │ │ │ │ │ ├── chtimes_windows.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── filesys.go │ │ │ │ │ ├── filesys_unix.go │ │ │ │ │ ├── filesys_windows.go │ │ │ │ │ ├── init_windows.go │ │ │ │ │ ├── utimes_unix.go │ │ │ │ │ ├── utimes_unsupported.go │ │ │ │ │ ├── xattrs.go │ │ │ │ │ ├── xattrs_linux.go │ │ │ │ │ └── xattrs_unsupported.go │ │ │ │ ├── tailfile/ │ │ │ │ │ └── tailfile.go │ │ │ │ ├── tarsum/ │ │ │ │ │ ├── builder_context.go │ │ │ │ │ ├── fileinfosums.go │ │ │ │ │ ├── tarsum.go │ │ │ │ │ ├── tarsum_spec.md │ │ │ │ │ ├── versioning.go │ │ │ │ │ └── writercloser.go │ │ │ │ └── useragent/ │ │ │ │ ├── README.md │ │ │ │ └── useragent.go │ │ │ ├── restartmanager/ │ │ │ │ └── restartmanager.go │ │ │ └── volume/ │ │ │ ├── mounts/ │ │ │ │ ├── lcow_parser.go │ │ │ │ ├── linux_parser.go │ │ │ │ ├── mounts.go │ │ │ │ ├── parser.go │ │ │ │ ├── validate.go │ │ │ │ ├── volume_copy.go │ │ │ │ ├── volume_unix.go │ │ │ │ ├── volume_windows.go │ │ │ │ └── windows_parser.go │ │ │ └── volume.go │ │ ├── docker-credential-helpers/ │ │ │ ├── LICENSE │ │ │ ├── client/ │ │ │ │ ├── client.go │ │ │ │ └── command.go │ │ │ └── credentials/ │ │ │ ├── credentials.go │ │ │ ├── error.go │ │ │ ├── helper.go │ │ │ └── version.go │ │ ├── go-connections/ │ │ │ ├── LICENSE │ │ │ ├── nat/ │ │ │ │ ├── nat.go │ │ │ │ ├── parse.go │ │ │ │ └── sort.go │ │ │ ├── sockets/ │ │ │ │ ├── README.md │ │ │ │ ├── inmem_socket.go │ │ │ │ ├── proxy.go │ │ │ │ ├── sockets.go │ │ │ │ ├── sockets_unix.go │ │ │ │ ├── sockets_windows.go │ │ │ │ ├── tcp_socket.go │ │ │ │ └── unix_socket.go │ │ │ └── tlsconfig/ │ │ │ ├── certpool.go │ │ │ ├── config.go │ │ │ └── config_client_ciphers.go │ │ ├── go-events/ │ │ │ ├── .gitignore │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE │ │ │ ├── MAINTAINERS │ │ │ ├── README.md │ │ │ ├── SECURITY.md │ │ │ ├── broadcast.go │ │ │ ├── channel.go │ │ │ ├── errors.go │ │ │ ├── event.go │ │ │ ├── filter.go │ │ │ ├── queue.go │ │ │ ├── retry.go │ │ │ ├── vendor.mod │ │ │ └── vendor.sum │ │ ├── go-metrics/ │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE │ │ │ ├── LICENSE.docs │ │ │ ├── NOTICE │ │ │ ├── README.md │ │ │ ├── counter.go │ │ │ ├── docs.go │ │ │ ├── gauge.go │ │ │ ├── handler.go │ │ │ ├── helpers.go │ │ │ ├── namespace.go │ │ │ ├── register.go │ │ │ ├── timer.go │ │ │ └── unit.go │ │ └── go-units/ │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── MAINTAINERS │ │ ├── README.md │ │ ├── circle.yml │ │ ├── duration.go │ │ ├── size.go │ │ └── ulimit.go │ ├── ePirat/ │ │ └── docker-credential-gitlabci/ │ │ ├── LICENSE │ │ └── pkg/ │ │ └── credhelper/ │ │ └── credhelper.go │ ├── emirpasic/ │ │ └── gods/ │ │ ├── LICENSE │ │ ├── containers/ │ │ │ ├── containers.go │ │ │ ├── enumerable.go │ │ │ ├── iterator.go │ │ │ └── serialization.go │ │ ├── lists/ │ │ │ ├── arraylist/ │ │ │ │ ├── arraylist.go │ │ │ │ ├── enumerable.go │ │ │ │ ├── iterator.go │ │ │ │ └── serialization.go │ │ │ └── lists.go │ │ ├── trees/ │ │ │ ├── binaryheap/ │ │ │ │ ├── binaryheap.go │ │ │ │ ├── iterator.go │ │ │ │ └── serialization.go │ │ │ └── trees.go │ │ └── utils/ │ │ ├── comparator.go │ │ ├── sort.go │ │ └── utils.go │ ├── envoyproxy/ │ │ ├── go-control-plane/ │ │ │ └── envoy/ │ │ │ ├── LICENSE │ │ │ ├── admin/ │ │ │ │ └── v3/ │ │ │ │ ├── certs.pb.go │ │ │ │ ├── certs.pb.validate.go │ │ │ │ ├── certs_vtproto.pb.go │ │ │ │ ├── clusters.pb.go │ │ │ │ ├── clusters.pb.validate.go │ │ │ │ ├── clusters_vtproto.pb.go │ │ │ │ ├── config_dump.pb.go │ │ │ │ ├── config_dump.pb.validate.go │ │ │ │ ├── config_dump_shared.pb.go │ │ │ │ ├── config_dump_shared.pb.validate.go │ │ │ │ ├── config_dump_shared_vtproto.pb.go │ │ │ │ ├── config_dump_vtproto.pb.go │ │ │ │ ├── init_dump.pb.go │ │ │ │ ├── init_dump.pb.validate.go │ │ │ │ ├── init_dump_vtproto.pb.go │ │ │ │ ├── listeners.pb.go │ │ │ │ ├── listeners.pb.validate.go │ │ │ │ ├── listeners_vtproto.pb.go │ │ │ │ ├── memory.pb.go │ │ │ │ ├── memory.pb.validate.go │ │ │ │ ├── memory_vtproto.pb.go │ │ │ │ ├── metrics.pb.go │ │ │ │ ├── metrics.pb.validate.go │ │ │ │ ├── metrics_vtproto.pb.go │ │ │ │ ├── mutex_stats.pb.go │ │ │ │ ├── mutex_stats.pb.validate.go │ │ │ │ ├── mutex_stats_vtproto.pb.go │ │ │ │ ├── server_info.pb.go │ │ │ │ ├── server_info.pb.validate.go │ │ │ │ ├── server_info_vtproto.pb.go │ │ │ │ ├── tap.pb.go │ │ │ │ ├── tap.pb.validate.go │ │ │ │ └── tap_vtproto.pb.go │ │ │ ├── annotations/ │ │ │ │ ├── deprecation.pb.go │ │ │ │ ├── deprecation.pb.validate.go │ │ │ │ ├── resource.pb.go │ │ │ │ ├── resource.pb.validate.go │ │ │ │ └── resource_vtproto.pb.go │ │ │ ├── config/ │ │ │ │ ├── accesslog/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── accesslog.pb.go │ │ │ │ │ ├── accesslog.pb.validate.go │ │ │ │ │ └── accesslog_vtproto.pb.go │ │ │ │ ├── bootstrap/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── bootstrap.pb.go │ │ │ │ │ ├── bootstrap.pb.validate.go │ │ │ │ │ └── bootstrap_vtproto.pb.go │ │ │ │ ├── cluster/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── circuit_breaker.pb.go │ │ │ │ │ ├── circuit_breaker.pb.validate.go │ │ │ │ │ ├── circuit_breaker_vtproto.pb.go │ │ │ │ │ ├── cluster.pb.go │ │ │ │ │ ├── cluster.pb.validate.go │ │ │ │ │ ├── cluster_vtproto.pb.go │ │ │ │ │ ├── filter.pb.go │ │ │ │ │ ├── filter.pb.validate.go │ │ │ │ │ ├── filter_vtproto.pb.go │ │ │ │ │ ├── outlier_detection.pb.go │ │ │ │ │ ├── outlier_detection.pb.validate.go │ │ │ │ │ └── outlier_detection_vtproto.pb.go │ │ │ │ ├── common/ │ │ │ │ │ └── matcher/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── matcher.pb.go │ │ │ │ │ ├── matcher.pb.validate.go │ │ │ │ │ └── matcher_vtproto.pb.go │ │ │ │ ├── core/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── address.pb.go │ │ │ │ │ ├── address.pb.validate.go │ │ │ │ │ ├── address_vtproto.pb.go │ │ │ │ │ ├── backoff.pb.go │ │ │ │ │ ├── backoff.pb.validate.go │ │ │ │ │ ├── backoff_vtproto.pb.go │ │ │ │ │ ├── base.pb.go │ │ │ │ │ ├── base.pb.validate.go │ │ │ │ │ ├── base_vtproto.pb.go │ │ │ │ │ ├── config_source.pb.go │ │ │ │ │ ├── config_source.pb.validate.go │ │ │ │ │ ├── config_source_vtproto.pb.go │ │ │ │ │ ├── event_service_config.pb.go │ │ │ │ │ ├── event_service_config.pb.validate.go │ │ │ │ │ ├── event_service_config_vtproto.pb.go │ │ │ │ │ ├── extension.pb.go │ │ │ │ │ ├── extension.pb.validate.go │ │ │ │ │ ├── extension_vtproto.pb.go │ │ │ │ │ ├── grpc_method_list.pb.go │ │ │ │ │ ├── grpc_method_list.pb.validate.go │ │ │ │ │ ├── grpc_method_list_vtproto.pb.go │ │ │ │ │ ├── grpc_service.pb.go │ │ │ │ │ ├── grpc_service.pb.validate.go │ │ │ │ │ ├── grpc_service_vtproto.pb.go │ │ │ │ │ ├── health_check.pb.go │ │ │ │ │ ├── health_check.pb.validate.go │ │ │ │ │ ├── health_check_vtproto.pb.go │ │ │ │ │ ├── http_service.pb.go │ │ │ │ │ ├── http_service.pb.validate.go │ │ │ │ │ ├── http_service_vtproto.pb.go │ │ │ │ │ ├── http_uri.pb.go │ │ │ │ │ ├── http_uri.pb.validate.go │ │ │ │ │ ├── http_uri_vtproto.pb.go │ │ │ │ │ ├── protocol.pb.go │ │ │ │ │ ├── protocol.pb.validate.go │ │ │ │ │ ├── protocol_vtproto.pb.go │ │ │ │ │ ├── proxy_protocol.pb.go │ │ │ │ │ ├── proxy_protocol.pb.validate.go │ │ │ │ │ ├── proxy_protocol_vtproto.pb.go │ │ │ │ │ ├── resolver.pb.go │ │ │ │ │ ├── resolver.pb.validate.go │ │ │ │ │ ├── resolver_vtproto.pb.go │ │ │ │ │ ├── socket_cmsg_headers.pb.go │ │ │ │ │ ├── socket_cmsg_headers.pb.validate.go │ │ │ │ │ ├── socket_cmsg_headers_vtproto.pb.go │ │ │ │ │ ├── socket_option.pb.go │ │ │ │ │ ├── socket_option.pb.validate.go │ │ │ │ │ ├── socket_option_vtproto.pb.go │ │ │ │ │ ├── substitution_format_string.pb.go │ │ │ │ │ ├── substitution_format_string.pb.validate.go │ │ │ │ │ ├── substitution_format_string_vtproto.pb.go │ │ │ │ │ ├── udp_socket_config.pb.go │ │ │ │ │ ├── udp_socket_config.pb.validate.go │ │ │ │ │ └── udp_socket_config_vtproto.pb.go │ │ │ │ ├── endpoint/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── endpoint.pb.go │ │ │ │ │ ├── endpoint.pb.validate.go │ │ │ │ │ ├── endpoint_components.pb.go │ │ │ │ │ ├── endpoint_components.pb.validate.go │ │ │ │ │ ├── endpoint_components_vtproto.pb.go │ │ │ │ │ ├── endpoint_vtproto.pb.go │ │ │ │ │ ├── load_report.pb.go │ │ │ │ │ ├── load_report.pb.validate.go │ │ │ │ │ └── load_report_vtproto.pb.go │ │ │ │ ├── listener/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── api_listener.pb.go │ │ │ │ │ ├── api_listener.pb.validate.go │ │ │ │ │ ├── api_listener_vtproto.pb.go │ │ │ │ │ ├── listener.pb.go │ │ │ │ │ ├── listener.pb.validate.go │ │ │ │ │ ├── listener_components.pb.go │ │ │ │ │ ├── listener_components.pb.validate.go │ │ │ │ │ ├── listener_components_vtproto.pb.go │ │ │ │ │ ├── listener_vtproto.pb.go │ │ │ │ │ ├── quic_config.pb.go │ │ │ │ │ ├── quic_config.pb.validate.go │ │ │ │ │ ├── quic_config_vtproto.pb.go │ │ │ │ │ ├── udp_listener_config.pb.go │ │ │ │ │ ├── udp_listener_config.pb.validate.go │ │ │ │ │ └── udp_listener_config_vtproto.pb.go │ │ │ │ ├── metrics/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── metrics_service.pb.go │ │ │ │ │ ├── metrics_service.pb.validate.go │ │ │ │ │ ├── metrics_service_vtproto.pb.go │ │ │ │ │ ├── stats.pb.go │ │ │ │ │ ├── stats.pb.validate.go │ │ │ │ │ └── stats_vtproto.pb.go │ │ │ │ ├── overload/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── overload.pb.go │ │ │ │ │ ├── overload.pb.validate.go │ │ │ │ │ └── overload_vtproto.pb.go │ │ │ │ ├── rbac/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── rbac.pb.go │ │ │ │ │ ├── rbac.pb.validate.go │ │ │ │ │ └── rbac_vtproto.pb.go │ │ │ │ ├── route/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── route.pb.go │ │ │ │ │ ├── route.pb.validate.go │ │ │ │ │ ├── route_components.pb.go │ │ │ │ │ ├── route_components.pb.validate.go │ │ │ │ │ ├── route_components_vtproto.pb.go │ │ │ │ │ ├── route_vtproto.pb.go │ │ │ │ │ ├── scoped_route.pb.go │ │ │ │ │ ├── scoped_route.pb.validate.go │ │ │ │ │ └── scoped_route_vtproto.pb.go │ │ │ │ ├── tap/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── common.pb.go │ │ │ │ │ ├── common.pb.validate.go │ │ │ │ │ └── common_vtproto.pb.go │ │ │ │ └── trace/ │ │ │ │ └── v3/ │ │ │ │ ├── datadog.pb.go │ │ │ │ ├── datadog.pb.validate.go │ │ │ │ ├── datadog_vtproto.pb.go │ │ │ │ ├── dynamic_ot.pb.go │ │ │ │ ├── dynamic_ot.pb.validate.go │ │ │ │ ├── dynamic_ot_vtproto.pb.go │ │ │ │ ├── http_tracer.pb.go │ │ │ │ ├── http_tracer.pb.validate.go │ │ │ │ ├── http_tracer_vtproto.pb.go │ │ │ │ ├── lightstep.pb.go │ │ │ │ ├── lightstep.pb.validate.go │ │ │ │ ├── lightstep_vtproto.pb.go │ │ │ │ ├── opentelemetry.pb.go │ │ │ │ ├── opentelemetry.pb.validate.go │ │ │ │ ├── opentelemetry_vtproto.pb.go │ │ │ │ ├── service.pb.go │ │ │ │ ├── service.pb.validate.go │ │ │ │ ├── service_vtproto.pb.go │ │ │ │ ├── skywalking.pb.go │ │ │ │ ├── skywalking.pb.validate.go │ │ │ │ ├── skywalking_vtproto.pb.go │ │ │ │ ├── trace.pb.go │ │ │ │ ├── trace.pb.validate.go │ │ │ │ ├── xray.pb.go │ │ │ │ ├── xray.pb.validate.go │ │ │ │ ├── xray_vtproto.pb.go │ │ │ │ ├── zipkin.pb.go │ │ │ │ ├── zipkin.pb.validate.go │ │ │ │ └── zipkin_vtproto.pb.go │ │ │ ├── data/ │ │ │ │ └── accesslog/ │ │ │ │ └── v3/ │ │ │ │ ├── accesslog.pb.go │ │ │ │ ├── accesslog.pb.validate.go │ │ │ │ └── accesslog_vtproto.pb.go │ │ │ ├── extensions/ │ │ │ │ ├── clusters/ │ │ │ │ │ └── aggregate/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── cluster.pb.go │ │ │ │ │ ├── cluster.pb.validate.go │ │ │ │ │ └── cluster_vtproto.pb.go │ │ │ │ ├── filters/ │ │ │ │ │ ├── common/ │ │ │ │ │ │ └── fault/ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ ├── fault.pb.go │ │ │ │ │ │ ├── fault.pb.validate.go │ │ │ │ │ │ └── fault_vtproto.pb.go │ │ │ │ │ ├── http/ │ │ │ │ │ │ ├── fault/ │ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ │ ├── fault.pb.go │ │ │ │ │ │ │ ├── fault.pb.validate.go │ │ │ │ │ │ │ └── fault_vtproto.pb.go │ │ │ │ │ │ ├── rbac/ │ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ │ ├── rbac.pb.go │ │ │ │ │ │ │ ├── rbac.pb.validate.go │ │ │ │ │ │ │ └── rbac_vtproto.pb.go │ │ │ │ │ │ └── router/ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ ├── router.pb.go │ │ │ │ │ │ ├── router.pb.validate.go │ │ │ │ │ │ └── router_vtproto.pb.go │ │ │ │ │ └── network/ │ │ │ │ │ └── http_connection_manager/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── http_connection_manager.pb.go │ │ │ │ │ ├── http_connection_manager.pb.validate.go │ │ │ │ │ └── http_connection_manager_vtproto.pb.go │ │ │ │ ├── load_balancing_policies/ │ │ │ │ │ ├── client_side_weighted_round_robin/ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ ├── client_side_weighted_round_robin.pb.go │ │ │ │ │ │ ├── client_side_weighted_round_robin.pb.validate.go │ │ │ │ │ │ └── client_side_weighted_round_robin_vtproto.pb.go │ │ │ │ │ ├── common/ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ ├── common.pb.go │ │ │ │ │ │ ├── common.pb.validate.go │ │ │ │ │ │ └── common_vtproto.pb.go │ │ │ │ │ ├── least_request/ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ ├── least_request.pb.go │ │ │ │ │ │ ├── least_request.pb.validate.go │ │ │ │ │ │ └── least_request_vtproto.pb.go │ │ │ │ │ ├── pick_first/ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ ├── pick_first.pb.go │ │ │ │ │ │ ├── pick_first.pb.validate.go │ │ │ │ │ │ └── pick_first_vtproto.pb.go │ │ │ │ │ ├── ring_hash/ │ │ │ │ │ │ └── v3/ │ │ │ │ │ │ ├── ring_hash.pb.go │ │ │ │ │ │ ├── ring_hash.pb.validate.go │ │ │ │ │ │ └── ring_hash_vtproto.pb.go │ │ │ │ │ └── wrr_locality/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── wrr_locality.pb.go │ │ │ │ │ ├── wrr_locality.pb.validate.go │ │ │ │ │ └── wrr_locality_vtproto.pb.go │ │ │ │ ├── rbac/ │ │ │ │ │ └── audit_loggers/ │ │ │ │ │ └── stream/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── stream.pb.go │ │ │ │ │ ├── stream.pb.validate.go │ │ │ │ │ └── stream_vtproto.pb.go │ │ │ │ └── transport_sockets/ │ │ │ │ └── tls/ │ │ │ │ └── v3/ │ │ │ │ ├── cert.pb.go │ │ │ │ ├── cert.pb.validate.go │ │ │ │ ├── common.pb.go │ │ │ │ ├── common.pb.validate.go │ │ │ │ ├── common_vtproto.pb.go │ │ │ │ ├── secret.pb.go │ │ │ │ ├── secret.pb.validate.go │ │ │ │ ├── secret_vtproto.pb.go │ │ │ │ ├── tls.pb.go │ │ │ │ ├── tls.pb.validate.go │ │ │ │ ├── tls_spiffe_validator_config.pb.go │ │ │ │ ├── tls_spiffe_validator_config.pb.validate.go │ │ │ │ ├── tls_spiffe_validator_config_vtproto.pb.go │ │ │ │ └── tls_vtproto.pb.go │ │ │ ├── service/ │ │ │ │ ├── discovery/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── ads.pb.go │ │ │ │ │ ├── ads.pb.validate.go │ │ │ │ │ ├── ads_grpc.pb.go │ │ │ │ │ ├── ads_vtproto.pb.go │ │ │ │ │ ├── discovery.pb.go │ │ │ │ │ ├── discovery.pb.validate.go │ │ │ │ │ └── discovery_vtproto.pb.go │ │ │ │ ├── load_stats/ │ │ │ │ │ └── v3/ │ │ │ │ │ ├── lrs.pb.go │ │ │ │ │ ├── lrs.pb.validate.go │ │ │ │ │ ├── lrs_grpc.pb.go │ │ │ │ │ └── lrs_vtproto.pb.go │ │ │ │ └── status/ │ │ │ │ └── v3/ │ │ │ │ ├── csds.pb.go │ │ │ │ ├── csds.pb.validate.go │ │ │ │ ├── csds_grpc.pb.go │ │ │ │ └── csds_vtproto.pb.go │ │ │ └── type/ │ │ │ ├── http/ │ │ │ │ └── v3/ │ │ │ │ ├── cookie.pb.go │ │ │ │ ├── cookie.pb.validate.go │ │ │ │ ├── cookie_vtproto.pb.go │ │ │ │ ├── path_transformation.pb.go │ │ │ │ ├── path_transformation.pb.validate.go │ │ │ │ └── path_transformation_vtproto.pb.go │ │ │ ├── matcher/ │ │ │ │ └── v3/ │ │ │ │ ├── address.pb.go │ │ │ │ ├── address.pb.validate.go │ │ │ │ ├── address_vtproto.pb.go │ │ │ │ ├── filter_state.pb.go │ │ │ │ ├── filter_state.pb.validate.go │ │ │ │ ├── filter_state_vtproto.pb.go │ │ │ │ ├── http_inputs.pb.go │ │ │ │ ├── http_inputs.pb.validate.go │ │ │ │ ├── http_inputs_vtproto.pb.go │ │ │ │ ├── metadata.pb.go │ │ │ │ ├── metadata.pb.validate.go │ │ │ │ ├── metadata_vtproto.pb.go │ │ │ │ ├── node.pb.go │ │ │ │ ├── node.pb.validate.go │ │ │ │ ├── node_vtproto.pb.go │ │ │ │ ├── number.pb.go │ │ │ │ ├── number.pb.validate.go │ │ │ │ ├── number_vtproto.pb.go │ │ │ │ ├── path.pb.go │ │ │ │ ├── path.pb.validate.go │ │ │ │ ├── path_vtproto.pb.go │ │ │ │ ├── regex.pb.go │ │ │ │ ├── regex.pb.validate.go │ │ │ │ ├── regex_vtproto.pb.go │ │ │ │ ├── status_code_input.pb.go │ │ │ │ ├── status_code_input.pb.validate.go │ │ │ │ ├── status_code_input_vtproto.pb.go │ │ │ │ ├── string.pb.go │ │ │ │ ├── string.pb.validate.go │ │ │ │ ├── string_vtproto.pb.go │ │ │ │ ├── struct.pb.go │ │ │ │ ├── struct.pb.validate.go │ │ │ │ ├── struct_vtproto.pb.go │ │ │ │ ├── value.pb.go │ │ │ │ ├── value.pb.validate.go │ │ │ │ └── value_vtproto.pb.go │ │ │ ├── metadata/ │ │ │ │ └── v3/ │ │ │ │ ├── metadata.pb.go │ │ │ │ ├── metadata.pb.validate.go │ │ │ │ └── metadata_vtproto.pb.go │ │ │ ├── tracing/ │ │ │ │ └── v3/ │ │ │ │ ├── custom_tag.pb.go │ │ │ │ ├── custom_tag.pb.validate.go │ │ │ │ └── custom_tag_vtproto.pb.go │ │ │ └── v3/ │ │ │ ├── hash_policy.pb.go │ │ │ ├── hash_policy.pb.validate.go │ │ │ ├── hash_policy_vtproto.pb.go │ │ │ ├── http.pb.go │ │ │ ├── http.pb.validate.go │ │ │ ├── http_status.pb.go │ │ │ ├── http_status.pb.validate.go │ │ │ ├── http_status_vtproto.pb.go │ │ │ ├── percent.pb.go │ │ │ ├── percent.pb.validate.go │ │ │ ├── percent_vtproto.pb.go │ │ │ ├── range.pb.go │ │ │ ├── range.pb.validate.go │ │ │ ├── range_vtproto.pb.go │ │ │ ├── ratelimit_strategy.pb.go │ │ │ ├── ratelimit_strategy.pb.validate.go │ │ │ ├── ratelimit_strategy_vtproto.pb.go │ │ │ ├── ratelimit_unit.pb.go │ │ │ ├── ratelimit_unit.pb.validate.go │ │ │ ├── semantic_version.pb.go │ │ │ ├── semantic_version.pb.validate.go │ │ │ ├── semantic_version_vtproto.pb.go │ │ │ ├── token_bucket.pb.go │ │ │ ├── token_bucket.pb.validate.go │ │ │ └── token_bucket_vtproto.pb.go │ │ └── protoc-gen-validate/ │ │ ├── LICENSE │ │ └── validate/ │ │ ├── BUILD │ │ ├── validate.h │ │ ├── validate.pb.go │ │ └── validate.proto │ ├── felixge/ │ │ └── httpsnoop/ │ │ ├── .gitignore │ │ ├── LICENSE.txt │ │ ├── Makefile │ │ ├── README.md │ │ ├── capture_metrics.go │ │ ├── docs.go │ │ ├── wrap_generated_gteq_1.8.go │ │ └── wrap_generated_lt_1.8.go │ ├── fsnotify/ │ │ └── fsnotify/ │ │ ├── .cirrus.yml │ │ ├── .gitignore │ │ ├── .mailmap │ │ ├── CHANGELOG.md │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── backend_fen.go │ │ ├── backend_inotify.go │ │ ├── backend_kqueue.go │ │ ├── backend_other.go │ │ ├── backend_windows.go │ │ ├── fsnotify.go │ │ ├── internal/ │ │ │ ├── darwin.go │ │ │ ├── debug_darwin.go │ │ │ ├── debug_dragonfly.go │ │ │ ├── debug_freebsd.go │ │ │ ├── debug_kqueue.go │ │ │ ├── debug_linux.go │ │ │ ├── debug_netbsd.go │ │ │ ├── debug_openbsd.go │ │ │ ├── debug_solaris.go │ │ │ ├── debug_windows.go │ │ │ ├── freebsd.go │ │ │ ├── internal.go │ │ │ ├── unix.go │ │ │ ├── unix2.go │ │ │ └── windows.go │ │ ├── shared.go │ │ ├── staticcheck.conf │ │ ├── system_bsd.go │ │ └── system_darwin.go │ ├── go-git/ │ │ ├── gcfg/ │ │ │ ├── .gitignore │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README │ │ │ ├── doc.go │ │ │ ├── errors.go │ │ │ ├── read.go │ │ │ ├── scanner/ │ │ │ │ ├── errors.go │ │ │ │ └── scanner.go │ │ │ ├── set.go │ │ │ ├── token/ │ │ │ │ ├── position.go │ │ │ │ ├── serialize.go │ │ │ │ └── token.go │ │ │ └── types/ │ │ │ ├── bool.go │ │ │ ├── doc.go │ │ │ ├── enum.go │ │ │ ├── int.go │ │ │ └── scan.go │ │ └── go-git/ │ │ └── v5/ │ │ ├── .gitignore │ │ ├── CODE_OF_CONDUCT.md │ │ ├── COMPATIBILITY.md │ │ ├── CONTRIBUTING.md │ │ ├── EXTENDING.md │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── blame.go │ │ ├── common.go │ │ ├── config/ │ │ │ ├── branch.go │ │ │ ├── config.go │ │ │ ├── modules.go │ │ │ ├── refspec.go │ │ │ └── url.go │ │ ├── doc.go │ │ ├── internal/ │ │ │ ├── path_util/ │ │ │ │ └── path_util.go │ │ │ ├── revision/ │ │ │ │ ├── parser.go │ │ │ │ ├── scanner.go │ │ │ │ └── token.go │ │ │ └── url/ │ │ │ └── url.go │ │ ├── object_walker.go │ │ ├── options.go │ │ ├── oss-fuzz.sh │ │ ├── plumbing/ │ │ │ ├── cache/ │ │ │ │ ├── buffer_lru.go │ │ │ │ ├── common.go │ │ │ │ └── object_lru.go │ │ │ ├── color/ │ │ │ │ └── color.go │ │ │ ├── error.go │ │ │ ├── filemode/ │ │ │ │ └── filemode.go │ │ │ ├── format/ │ │ │ │ ├── config/ │ │ │ │ │ ├── common.go │ │ │ │ │ ├── decoder.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── encoder.go │ │ │ │ │ ├── format.go │ │ │ │ │ ├── option.go │ │ │ │ │ └── section.go │ │ │ │ ├── diff/ │ │ │ │ │ ├── colorconfig.go │ │ │ │ │ ├── patch.go │ │ │ │ │ └── unified_encoder.go │ │ │ │ ├── gitignore/ │ │ │ │ │ ├── dir.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── matcher.go │ │ │ │ │ └── pattern.go │ │ │ │ ├── idxfile/ │ │ │ │ │ ├── decoder.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── encoder.go │ │ │ │ │ ├── idxfile.go │ │ │ │ │ └── writer.go │ │ │ │ ├── index/ │ │ │ │ │ ├── decoder.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── encoder.go │ │ │ │ │ ├── index.go │ │ │ │ │ └── match.go │ │ │ │ ├── objfile/ │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── reader.go │ │ │ │ │ └── writer.go │ │ │ │ ├── packfile/ │ │ │ │ │ ├── common.go │ │ │ │ │ ├── delta_index.go │ │ │ │ │ ├── delta_selector.go │ │ │ │ │ ├── diff_delta.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── encoder.go │ │ │ │ │ ├── error.go │ │ │ │ │ ├── fsobject.go │ │ │ │ │ ├── object_pack.go │ │ │ │ │ ├── packfile.go │ │ │ │ │ ├── parser.go │ │ │ │ │ ├── patch_delta.go │ │ │ │ │ └── scanner.go │ │ │ │ └── pktline/ │ │ │ │ ├── encoder.go │ │ │ │ ├── error.go │ │ │ │ └── scanner.go │ │ │ ├── hash/ │ │ │ │ ├── hash.go │ │ │ │ ├── hash_sha1.go │ │ │ │ └── hash_sha256.go │ │ │ ├── hash.go │ │ │ ├── memory.go │ │ │ ├── object/ │ │ │ │ ├── blob.go │ │ │ │ ├── change.go │ │ │ │ ├── change_adaptor.go │ │ │ │ ├── commit.go │ │ │ │ ├── commit_walker.go │ │ │ │ ├── commit_walker_bfs.go │ │ │ │ ├── commit_walker_bfs_filtered.go │ │ │ │ ├── commit_walker_ctime.go │ │ │ │ ├── commit_walker_limit.go │ │ │ │ ├── commit_walker_path.go │ │ │ │ ├── difftree.go │ │ │ │ ├── file.go │ │ │ │ ├── merge_base.go │ │ │ │ ├── object.go │ │ │ │ ├── patch.go │ │ │ │ ├── rename.go │ │ │ │ ├── signature.go │ │ │ │ ├── tag.go │ │ │ │ ├── tree.go │ │ │ │ └── treenoder.go │ │ │ ├── object.go │ │ │ ├── protocol/ │ │ │ │ └── packp/ │ │ │ │ ├── advrefs.go │ │ │ │ ├── advrefs_decode.go │ │ │ │ ├── advrefs_encode.go │ │ │ │ ├── capability/ │ │ │ │ │ ├── capability.go │ │ │ │ │ └── list.go │ │ │ │ ├── common.go │ │ │ │ ├── doc.go │ │ │ │ ├── filter.go │ │ │ │ ├── gitproto.go │ │ │ │ ├── report_status.go │ │ │ │ ├── shallowupd.go │ │ │ │ ├── sideband/ │ │ │ │ │ ├── common.go │ │ │ │ │ ├── demux.go │ │ │ │ │ ├── doc.go │ │ │ │ │ └── muxer.go │ │ │ │ ├── srvresp.go │ │ │ │ ├── ulreq.go │ │ │ │ ├── ulreq_decode.go │ │ │ │ ├── ulreq_encode.go │ │ │ │ ├── updreq.go │ │ │ │ ├── updreq_decode.go │ │ │ │ ├── updreq_encode.go │ │ │ │ ├── uppackreq.go │ │ │ │ └── uppackresp.go │ │ │ ├── reference.go │ │ │ ├── revision.go │ │ │ ├── revlist/ │ │ │ │ └── revlist.go │ │ │ ├── storer/ │ │ │ │ ├── doc.go │ │ │ │ ├── index.go │ │ │ │ ├── object.go │ │ │ │ ├── reference.go │ │ │ │ ├── shallow.go │ │ │ │ └── storer.go │ │ │ └── transport/ │ │ │ ├── client/ │ │ │ │ └── client.go │ │ │ ├── common.go │ │ │ ├── file/ │ │ │ │ ├── client.go │ │ │ │ └── server.go │ │ │ ├── git/ │ │ │ │ └── common.go │ │ │ ├── http/ │ │ │ │ ├── common.go │ │ │ │ ├── receive_pack.go │ │ │ │ ├── transport.go │ │ │ │ └── upload_pack.go │ │ │ ├── internal/ │ │ │ │ └── common/ │ │ │ │ ├── common.go │ │ │ │ ├── mocks.go │ │ │ │ └── server.go │ │ │ ├── server/ │ │ │ │ ├── loader.go │ │ │ │ └── server.go │ │ │ └── ssh/ │ │ │ ├── auth_method.go │ │ │ └── common.go │ │ ├── prune.go │ │ ├── remote.go │ │ ├── repository.go │ │ ├── signer.go │ │ ├── status.go │ │ ├── storage/ │ │ │ ├── filesystem/ │ │ │ │ ├── config.go │ │ │ │ ├── deltaobject.go │ │ │ │ ├── dotgit/ │ │ │ │ │ ├── dotgit.go │ │ │ │ │ ├── dotgit_rewrite_packed_refs.go │ │ │ │ │ ├── dotgit_setref.go │ │ │ │ │ ├── reader.go │ │ │ │ │ ├── repository_filesystem.go │ │ │ │ │ └── writers.go │ │ │ │ ├── index.go │ │ │ │ ├── module.go │ │ │ │ ├── object.go │ │ │ │ ├── reference.go │ │ │ │ ├── shallow.go │ │ │ │ └── storage.go │ │ │ ├── memory/ │ │ │ │ └── storage.go │ │ │ └── storer.go │ │ ├── submodule.go │ │ ├── utils/ │ │ │ ├── binary/ │ │ │ │ ├── read.go │ │ │ │ └── write.go │ │ │ ├── diff/ │ │ │ │ └── diff.go │ │ │ ├── ioutil/ │ │ │ │ └── common.go │ │ │ ├── merkletrie/ │ │ │ │ ├── change.go │ │ │ │ ├── difftree.go │ │ │ │ ├── doc.go │ │ │ │ ├── doubleiter.go │ │ │ │ ├── filesystem/ │ │ │ │ │ └── node.go │ │ │ │ ├── index/ │ │ │ │ │ └── node.go │ │ │ │ ├── internal/ │ │ │ │ │ └── frame/ │ │ │ │ │ └── frame.go │ │ │ │ ├── iter.go │ │ │ │ └── noder/ │ │ │ │ ├── noder.go │ │ │ │ └── path.go │ │ │ ├── sync/ │ │ │ │ ├── bufio.go │ │ │ │ ├── bytes.go │ │ │ │ └── zlib.go │ │ │ └── trace/ │ │ │ └── trace.go │ │ ├── worktree.go │ │ ├── worktree_bsd.go │ │ ├── worktree_commit.go │ │ ├── worktree_js.go │ │ ├── worktree_linux.go │ │ ├── worktree_plan9.go │ │ ├── worktree_status.go │ │ ├── worktree_unix_other.go │ │ └── worktree_windows.go │ ├── go-jose/ │ │ └── go-jose/ │ │ └── v4/ │ │ ├── .gitignore │ │ ├── .golangci.yml │ │ ├── .travis.yml │ │ ├── CHANGELOG.md │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── asymmetric.go │ │ ├── cipher/ │ │ │ ├── cbc_hmac.go │ │ │ ├── concat_kdf.go │ │ │ ├── ecdh_es.go │ │ │ └── key_wrap.go │ │ ├── crypter.go │ │ ├── doc.go │ │ ├── encoding.go │ │ ├── json/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── decode.go │ │ │ ├── encode.go │ │ │ ├── indent.go │ │ │ ├── scanner.go │ │ │ ├── stream.go │ │ │ └── tags.go │ │ ├── jwe.go │ │ ├── jwk.go │ │ ├── jws.go │ │ ├── opaque.go │ │ ├── shared.go │ │ ├── signing.go │ │ └── symmetric.go │ ├── go-logr/ │ │ ├── logr/ │ │ │ ├── .golangci.yaml │ │ │ ├── CHANGELOG.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── SECURITY.md │ │ │ ├── context.go │ │ │ ├── context_noslog.go │ │ │ ├── context_slog.go │ │ │ ├── discard.go │ │ │ ├── funcr/ │ │ │ │ ├── funcr.go │ │ │ │ └── slogsink.go │ │ │ ├── logr.go │ │ │ ├── sloghandler.go │ │ │ ├── slogr.go │ │ │ └── slogsink.go │ │ └── stdr/ │ │ ├── LICENSE │ │ ├── README.md │ │ └── stdr.go │ ├── gogo/ │ │ └── protobuf/ │ │ ├── AUTHORS │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ ├── gogoproto/ │ │ │ ├── Makefile │ │ │ ├── doc.go │ │ │ ├── gogo.pb.go │ │ │ ├── gogo.pb.golden │ │ │ ├── gogo.proto │ │ │ └── helper.go │ │ ├── proto/ │ │ │ ├── Makefile │ │ │ ├── clone.go │ │ │ ├── custom_gogo.go │ │ │ ├── decode.go │ │ │ ├── deprecated.go │ │ │ ├── discard.go │ │ │ ├── duration.go │ │ │ ├── duration_gogo.go │ │ │ ├── encode.go │ │ │ ├── encode_gogo.go │ │ │ ├── equal.go │ │ │ ├── extensions.go │ │ │ ├── extensions_gogo.go │ │ │ ├── lib.go │ │ │ ├── lib_gogo.go │ │ │ ├── message_set.go │ │ │ ├── pointer_reflect.go │ │ │ ├── pointer_reflect_gogo.go │ │ │ ├── pointer_unsafe.go │ │ │ ├── pointer_unsafe_gogo.go │ │ │ ├── properties.go │ │ │ ├── properties_gogo.go │ │ │ ├── skip_gogo.go │ │ │ ├── table_marshal.go │ │ │ ├── table_marshal_gogo.go │ │ │ ├── table_merge.go │ │ │ ├── table_unmarshal.go │ │ │ ├── table_unmarshal_gogo.go │ │ │ ├── text.go │ │ │ ├── text_gogo.go │ │ │ ├── text_parser.go │ │ │ ├── timestamp.go │ │ │ ├── timestamp_gogo.go │ │ │ ├── wrappers.go │ │ │ └── wrappers_gogo.go │ │ ├── protoc-gen-gogo/ │ │ │ └── descriptor/ │ │ │ ├── Makefile │ │ │ ├── descriptor.go │ │ │ ├── descriptor.pb.go │ │ │ ├── descriptor_gostring.gen.go │ │ │ └── helper.go │ │ ├── sortkeys/ │ │ │ └── sortkeys.go │ │ └── types/ │ │ ├── any.go │ │ ├── any.pb.go │ │ ├── api.pb.go │ │ ├── doc.go │ │ ├── duration.go │ │ ├── duration.pb.go │ │ ├── duration_gogo.go │ │ ├── empty.pb.go │ │ ├── field_mask.pb.go │ │ ├── protosize.go │ │ ├── source_context.pb.go │ │ ├── struct.pb.go │ │ ├── timestamp.go │ │ ├── timestamp.pb.go │ │ ├── timestamp_gogo.go │ │ ├── type.pb.go │ │ ├── wrappers.pb.go │ │ └── wrappers_gogo.go │ ├── golang/ │ │ ├── groupcache/ │ │ │ ├── LICENSE │ │ │ └── lru/ │ │ │ └── lru.go │ │ ├── mock/ │ │ │ ├── AUTHORS │ │ │ ├── CONTRIBUTORS │ │ │ ├── LICENSE │ │ │ └── gomock/ │ │ │ ├── call.go │ │ │ ├── callset.go │ │ │ ├── controller.go │ │ │ └── matchers.go │ │ └── protobuf/ │ │ ├── AUTHORS │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ └── proto/ │ │ ├── buffer.go │ │ ├── defaults.go │ │ ├── deprecated.go │ │ ├── discard.go │ │ ├── extensions.go │ │ ├── properties.go │ │ ├── proto.go │ │ ├── registry.go │ │ ├── text_decode.go │ │ ├── text_encode.go │ │ ├── wire.go │ │ └── wrappers.go │ ├── golang-jwt/ │ │ └── jwt/ │ │ └── v4/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── MIGRATION_GUIDE.md │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── VERSION_HISTORY.md │ │ ├── claims.go │ │ ├── doc.go │ │ ├── ecdsa.go │ │ ├── ecdsa_utils.go │ │ ├── ed25519.go │ │ ├── ed25519_utils.go │ │ ├── errors.go │ │ ├── hmac.go │ │ ├── map_claims.go │ │ ├── none.go │ │ ├── parser.go │ │ ├── parser_option.go │ │ ├── rsa.go │ │ ├── rsa_pss.go │ │ ├── rsa_utils.go │ │ ├── signing_method.go │ │ ├── staticcheck.conf │ │ ├── token.go │ │ └── types.go │ ├── google/ │ │ ├── go-cmp/ │ │ │ ├── LICENSE │ │ │ └── cmp/ │ │ │ ├── compare.go │ │ │ ├── export.go │ │ │ ├── internal/ │ │ │ │ ├── diff/ │ │ │ │ │ ├── debug_disable.go │ │ │ │ │ ├── debug_enable.go │ │ │ │ │ └── diff.go │ │ │ │ ├── flags/ │ │ │ │ │ └── flags.go │ │ │ │ ├── function/ │ │ │ │ │ └── func.go │ │ │ │ └── value/ │ │ │ │ ├── name.go │ │ │ │ ├── pointer.go │ │ │ │ └── sort.go │ │ │ ├── options.go │ │ │ ├── path.go │ │ │ ├── report.go │ │ │ ├── report_compare.go │ │ │ ├── report_references.go │ │ │ ├── report_reflect.go │ │ │ ├── report_slices.go │ │ │ ├── report_text.go │ │ │ └── report_value.go │ │ ├── go-containerregistry/ │ │ │ ├── LICENSE │ │ │ ├── internal/ │ │ │ │ ├── and/ │ │ │ │ │ └── and_closer.go │ │ │ │ ├── compression/ │ │ │ │ │ └── compression.go │ │ │ │ ├── estargz/ │ │ │ │ │ └── estargz.go │ │ │ │ ├── gzip/ │ │ │ │ │ └── zip.go │ │ │ │ ├── redact/ │ │ │ │ │ └── redact.go │ │ │ │ ├── retry/ │ │ │ │ │ ├── retry.go │ │ │ │ │ └── wait/ │ │ │ │ │ └── kubernetes_apimachinery_wait.go │ │ │ │ ├── verify/ │ │ │ │ │ └── verify.go │ │ │ │ └── zstd/ │ │ │ │ └── zstd.go │ │ │ └── pkg/ │ │ │ ├── authn/ │ │ │ │ ├── README.md │ │ │ │ ├── anon.go │ │ │ │ ├── auth.go │ │ │ │ ├── authn.go │ │ │ │ ├── basic.go │ │ │ │ ├── bearer.go │ │ │ │ ├── doc.go │ │ │ │ ├── keychain.go │ │ │ │ └── multikeychain.go │ │ │ ├── compression/ │ │ │ │ └── compression.go │ │ │ ├── logs/ │ │ │ │ └── logs.go │ │ │ ├── name/ │ │ │ │ ├── README.md │ │ │ │ ├── check.go │ │ │ │ ├── digest.go │ │ │ │ ├── doc.go │ │ │ │ ├── errors.go │ │ │ │ ├── options.go │ │ │ │ ├── ref.go │ │ │ │ ├── registry.go │ │ │ │ ├── repository.go │ │ │ │ └── tag.go │ │ │ └── v1/ │ │ │ ├── config.go │ │ │ ├── daemon/ │ │ │ │ ├── README.md │ │ │ │ ├── doc.go │ │ │ │ ├── image.go │ │ │ │ ├── options.go │ │ │ │ └── write.go │ │ │ ├── doc.go │ │ │ ├── empty/ │ │ │ │ ├── README.md │ │ │ │ ├── doc.go │ │ │ │ ├── image.go │ │ │ │ └── index.go │ │ │ ├── google/ │ │ │ │ ├── README.md │ │ │ │ ├── auth.go │ │ │ │ ├── doc.go │ │ │ │ ├── keychain.go │ │ │ │ ├── list.go │ │ │ │ └── options.go │ │ │ ├── hash.go │ │ │ ├── image.go │ │ │ ├── index.go │ │ │ ├── layer.go │ │ │ ├── layout/ │ │ │ │ ├── README.md │ │ │ │ ├── blob.go │ │ │ │ ├── doc.go │ │ │ │ ├── gc.go │ │ │ │ ├── image.go │ │ │ │ ├── index.go │ │ │ │ ├── layoutpath.go │ │ │ │ ├── options.go │ │ │ │ ├── read.go │ │ │ │ └── write.go │ │ │ ├── manifest.go │ │ │ ├── match/ │ │ │ │ └── match.go │ │ │ ├── mutate/ │ │ │ │ ├── README.md │ │ │ │ ├── doc.go │ │ │ │ ├── image.go │ │ │ │ ├── index.go │ │ │ │ ├── mutate.go │ │ │ │ └── rebase.go │ │ │ ├── partial/ │ │ │ │ ├── README.md │ │ │ │ ├── compressed.go │ │ │ │ ├── doc.go │ │ │ │ ├── image.go │ │ │ │ ├── index.go │ │ │ │ ├── uncompressed.go │ │ │ │ └── with.go │ │ │ ├── platform.go │ │ │ ├── progress.go │ │ │ ├── random/ │ │ │ │ ├── doc.go │ │ │ │ ├── image.go │ │ │ │ ├── index.go │ │ │ │ └── options.go │ │ │ ├── remote/ │ │ │ │ ├── README.md │ │ │ │ ├── catalog.go │ │ │ │ ├── check.go │ │ │ │ ├── delete.go │ │ │ │ ├── descriptor.go │ │ │ │ ├── doc.go │ │ │ │ ├── fetcher.go │ │ │ │ ├── image.go │ │ │ │ ├── index.go │ │ │ │ ├── layer.go │ │ │ │ ├── list.go │ │ │ │ ├── mount.go │ │ │ │ ├── multi_write.go │ │ │ │ ├── options.go │ │ │ │ ├── progress.go │ │ │ │ ├── puller.go │ │ │ │ ├── pusher.go │ │ │ │ ├── referrers.go │ │ │ │ ├── schema1.go │ │ │ │ ├── transport/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── basic.go │ │ │ │ │ ├── bearer.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── error.go │ │ │ │ │ ├── logger.go │ │ │ │ │ ├── ping.go │ │ │ │ │ ├── retry.go │ │ │ │ │ ├── schemer.go │ │ │ │ │ ├── scope.go │ │ │ │ │ ├── transport.go │ │ │ │ │ └── useragent.go │ │ │ │ └── write.go │ │ │ ├── stream/ │ │ │ │ ├── README.md │ │ │ │ └── layer.go │ │ │ ├── tarball/ │ │ │ │ ├── README.md │ │ │ │ ├── doc.go │ │ │ │ ├── image.go │ │ │ │ ├── layer.go │ │ │ │ └── write.go │ │ │ ├── types/ │ │ │ │ └── types.go │ │ │ ├── validate/ │ │ │ │ ├── doc.go │ │ │ │ ├── image.go │ │ │ │ ├── index.go │ │ │ │ ├── layer.go │ │ │ │ └── options.go │ │ │ └── zz_deepcopy_generated.go │ │ ├── go-github/ │ │ │ ├── AUTHORS │ │ │ ├── LICENSE │ │ │ └── github/ │ │ │ ├── activity.go │ │ │ ├── activity_events.go │ │ │ ├── activity_notifications.go │ │ │ ├── activity_star.go │ │ │ ├── activity_watching.go │ │ │ ├── admin.go │ │ │ ├── admin_stats.go │ │ │ ├── apps.go │ │ │ ├── apps_installation.go │ │ │ ├── apps_marketplace.go │ │ │ ├── authorizations.go │ │ │ ├── checks.go │ │ │ ├── doc.go │ │ │ ├── event_types.go │ │ │ ├── gists.go │ │ │ ├── gists_comments.go │ │ │ ├── git.go │ │ │ ├── git_blobs.go │ │ │ ├── git_commits.go │ │ │ ├── git_refs.go │ │ │ ├── git_tags.go │ │ │ ├── git_trees.go │ │ │ ├── github-accessors.go │ │ │ ├── github.go │ │ │ ├── gitignore.go │ │ │ ├── issues.go │ │ │ ├── issues_assignees.go │ │ │ ├── issues_comments.go │ │ │ ├── issues_events.go │ │ │ ├── issues_labels.go │ │ │ ├── issues_milestones.go │ │ │ ├── issues_timeline.go │ │ │ ├── licenses.go │ │ │ ├── messages.go │ │ │ ├── migrations.go │ │ │ ├── migrations_source_import.go │ │ │ ├── migrations_user.go │ │ │ ├── misc.go │ │ │ ├── orgs.go │ │ │ ├── orgs_hooks.go │ │ │ ├── orgs_members.go │ │ │ ├── orgs_outside_collaborators.go │ │ │ ├── orgs_projects.go │ │ │ ├── orgs_users_blocking.go │ │ │ ├── projects.go │ │ │ ├── pulls.go │ │ │ ├── pulls_comments.go │ │ │ ├── pulls_reviewers.go │ │ │ ├── pulls_reviews.go │ │ │ ├── reactions.go │ │ │ ├── repos.go │ │ │ ├── repos_collaborators.go │ │ │ ├── repos_comments.go │ │ │ ├── repos_commits.go │ │ │ ├── repos_community_health.go │ │ │ ├── repos_contents.go │ │ │ ├── repos_deployments.go │ │ │ ├── repos_forks.go │ │ │ ├── repos_hooks.go │ │ │ ├── repos_invitations.go │ │ │ ├── repos_keys.go │ │ │ ├── repos_merging.go │ │ │ ├── repos_pages.go │ │ │ ├── repos_prereceive_hooks.go │ │ │ ├── repos_projects.go │ │ │ ├── repos_releases.go │ │ │ ├── repos_stats.go │ │ │ ├── repos_statuses.go │ │ │ ├── repos_traffic.go │ │ │ ├── search.go │ │ │ ├── strings.go │ │ │ ├── teams.go │ │ │ ├── teams_discussion_comments.go │ │ │ ├── teams_discussions.go │ │ │ ├── teams_members.go │ │ │ ├── timestamp.go │ │ │ ├── users.go │ │ │ ├── users_administration.go │ │ │ ├── users_blocking.go │ │ │ ├── users_emails.go │ │ │ ├── users_followers.go │ │ │ ├── users_gpg_keys.go │ │ │ ├── users_keys.go │ │ │ ├── with_appengine.go │ │ │ └── without_appengine.go │ │ ├── go-querystring/ │ │ │ ├── LICENSE │ │ │ └── query/ │ │ │ └── encode.go │ │ ├── s2a-go/ │ │ │ ├── .gitignore │ │ │ ├── CODE_OF_CONDUCT.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE.md │ │ │ ├── README.md │ │ │ ├── fallback/ │ │ │ │ └── s2a_fallback.go │ │ │ ├── internal/ │ │ │ │ ├── authinfo/ │ │ │ │ │ └── authinfo.go │ │ │ │ ├── handshaker/ │ │ │ │ │ ├── handshaker.go │ │ │ │ │ └── service/ │ │ │ │ │ └── service.go │ │ │ │ ├── proto/ │ │ │ │ │ ├── common_go_proto/ │ │ │ │ │ │ └── common.pb.go │ │ │ │ │ ├── s2a_context_go_proto/ │ │ │ │ │ │ └── s2a_context.pb.go │ │ │ │ │ ├── s2a_go_proto/ │ │ │ │ │ │ ├── s2a.pb.go │ │ │ │ │ │ └── s2a_grpc.pb.go │ │ │ │ │ └── v2/ │ │ │ │ │ ├── common_go_proto/ │ │ │ │ │ │ └── common.pb.go │ │ │ │ │ ├── s2a_context_go_proto/ │ │ │ │ │ │ └── s2a_context.pb.go │ │ │ │ │ └── s2a_go_proto/ │ │ │ │ │ ├── s2a.pb.go │ │ │ │ │ └── s2a_grpc.pb.go │ │ │ │ ├── record/ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ ├── aeadcrypter/ │ │ │ │ │ │ │ ├── aeadcrypter.go │ │ │ │ │ │ │ ├── aesgcm.go │ │ │ │ │ │ │ ├── chachapoly.go │ │ │ │ │ │ │ └── common.go │ │ │ │ │ │ └── halfconn/ │ │ │ │ │ │ ├── ciphersuite.go │ │ │ │ │ │ ├── counter.go │ │ │ │ │ │ ├── expander.go │ │ │ │ │ │ └── halfconn.go │ │ │ │ │ ├── record.go │ │ │ │ │ └── ticketsender.go │ │ │ │ ├── tokenmanager/ │ │ │ │ │ └── tokenmanager.go │ │ │ │ └── v2/ │ │ │ │ ├── README.md │ │ │ │ ├── certverifier/ │ │ │ │ │ └── certverifier.go │ │ │ │ ├── remotesigner/ │ │ │ │ │ └── remotesigner.go │ │ │ │ ├── s2av2.go │ │ │ │ └── tlsconfigstore/ │ │ │ │ └── tlsconfigstore.go │ │ │ ├── retry/ │ │ │ │ └── retry.go │ │ │ ├── s2a.go │ │ │ ├── s2a_options.go │ │ │ ├── s2a_utils.go │ │ │ └── stream/ │ │ │ └── s2a_stream.go │ │ ├── slowjam/ │ │ │ ├── LICENSE │ │ │ └── pkg/ │ │ │ └── stacklog/ │ │ │ └── stacklog.go │ │ ├── subcommands/ │ │ │ ├── CONTRIBUTING │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── subcommands.go │ │ └── uuid/ │ │ ├── CHANGELOG.md │ │ ├── CONTRIBUTING.md │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ ├── README.md │ │ ├── dce.go │ │ ├── doc.go │ │ ├── hash.go │ │ ├── marshal.go │ │ ├── node.go │ │ ├── node_js.go │ │ ├── node_net.go │ │ ├── null.go │ │ ├── sql.go │ │ ├── time.go │ │ ├── util.go │ │ ├── uuid.go │ │ ├── version1.go │ │ ├── version4.go │ │ ├── version6.go │ │ └── version7.go │ ├── googleapis/ │ │ ├── enterprise-certificate-proxy/ │ │ │ ├── LICENSE │ │ │ └── client/ │ │ │ ├── client.go │ │ │ └── util/ │ │ │ └── util.go │ │ └── gax-go/ │ │ └── v2/ │ │ ├── .release-please-manifest.json │ │ ├── CHANGES.md │ │ ├── LICENSE │ │ ├── apierror/ │ │ │ ├── apierror.go │ │ │ └── internal/ │ │ │ └── proto/ │ │ │ ├── README.md │ │ │ ├── custom_error.pb.go │ │ │ ├── custom_error.proto │ │ │ ├── error.pb.go │ │ │ └── error.proto │ │ ├── call_option.go │ │ ├── callctx/ │ │ │ └── callctx.go │ │ ├── content_type.go │ │ ├── gax.go │ │ ├── header.go │ │ ├── internal/ │ │ │ └── version.go │ │ ├── internallog/ │ │ │ ├── grpclog/ │ │ │ │ └── grpclog.go │ │ │ ├── internal/ │ │ │ │ └── internal.go │ │ │ └── internallog.go │ │ ├── invoke.go │ │ ├── iterator/ │ │ │ └── iterator.go │ │ ├── proto_json_stream.go │ │ └── release-please-config.json │ ├── hashicorp/ │ │ ├── go-immutable-radix/ │ │ │ ├── .gitignore │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── edges.go │ │ │ ├── iradix.go │ │ │ ├── iter.go │ │ │ ├── node.go │ │ │ ├── raw_iter.go │ │ │ └── reverse_iter.go │ │ ├── go-memdb/ │ │ │ ├── .gitignore │ │ │ ├── CODEOWNERS │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── changes.go │ │ │ ├── filter.go │ │ │ ├── index.go │ │ │ ├── memdb.go │ │ │ ├── schema.go │ │ │ ├── txn.go │ │ │ ├── watch.go │ │ │ └── watch_few.go │ │ ├── golang-lru/ │ │ │ ├── LICENSE │ │ │ └── simplelru/ │ │ │ ├── lru.go │ │ │ └── lru_interface.go │ │ └── hcl/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.md │ │ ├── appveyor.yml │ │ ├── decoder.go │ │ ├── hcl/ │ │ │ ├── ast/ │ │ │ │ ├── ast.go │ │ │ │ └── walk.go │ │ │ ├── parser/ │ │ │ │ ├── error.go │ │ │ │ └── parser.go │ │ │ ├── printer/ │ │ │ │ ├── nodes.go │ │ │ │ └── printer.go │ │ │ ├── scanner/ │ │ │ │ └── scanner.go │ │ │ ├── strconv/ │ │ │ │ └── quote.go │ │ │ └── token/ │ │ │ ├── position.go │ │ │ └── token.go │ │ ├── hcl.go │ │ ├── json/ │ │ │ ├── parser/ │ │ │ │ ├── flatten.go │ │ │ │ └── parser.go │ │ │ ├── scanner/ │ │ │ │ └── scanner.go │ │ │ └── token/ │ │ │ ├── position.go │ │ │ └── token.go │ │ ├── lex.go │ │ └── parse.go │ ├── inconshreveable/ │ │ └── mousetrap/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── trap_others.go │ │ └── trap_windows.go │ ├── jbenet/ │ │ └── go-context/ │ │ ├── LICENSE │ │ └── io/ │ │ └── ctxio.go │ ├── karrick/ │ │ └── godirwalk/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── azure-pipelines.yml │ │ ├── bench.sh │ │ ├── debug_development.go │ │ ├── debug_release.go │ │ ├── dirent.go │ │ ├── doc.go │ │ ├── inoWithFileno.go │ │ ├── inoWithIno.go │ │ ├── modeType.go │ │ ├── modeTypeWithType.go │ │ ├── modeTypeWithoutType.go │ │ ├── nameWithNamlen.go │ │ ├── nameWithoutNamlen.go │ │ ├── readdir.go │ │ ├── readdir_unix.go │ │ ├── readdir_windows.go │ │ ├── reclenFromNamlen.go │ │ ├── reclenFromReclen.go │ │ ├── scandir_unix.go │ │ ├── scandir_windows.go │ │ ├── scanner.go │ │ └── walk.go │ ├── kevinburke/ │ │ └── ssh_config/ │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── .mailmap │ │ ├── AUTHORS.txt │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.md │ │ ├── config.go │ │ ├── lexer.go │ │ ├── parser.go │ │ ├── position.go │ │ ├── token.go │ │ └── validators.go │ ├── klauspost/ │ │ └── compress/ │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── .goreleaser.yml │ │ ├── LICENSE │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── compressible.go │ │ ├── fse/ │ │ │ ├── README.md │ │ │ ├── bitreader.go │ │ │ ├── bitwriter.go │ │ │ ├── bytereader.go │ │ │ ├── compress.go │ │ │ ├── decompress.go │ │ │ └── fse.go │ │ ├── gen.sh │ │ ├── huff0/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── bitreader.go │ │ │ ├── bitwriter.go │ │ │ ├── compress.go │ │ │ ├── decompress.go │ │ │ ├── decompress_amd64.go │ │ │ ├── decompress_amd64.s │ │ │ ├── decompress_generic.go │ │ │ └── huff0.go │ │ ├── internal/ │ │ │ ├── cpuinfo/ │ │ │ │ ├── cpuinfo.go │ │ │ │ ├── cpuinfo_amd64.go │ │ │ │ └── cpuinfo_amd64.s │ │ │ ├── le/ │ │ │ │ ├── le.go │ │ │ │ ├── unsafe_disabled.go │ │ │ │ └── unsafe_enabled.go │ │ │ └── snapref/ │ │ │ ├── LICENSE │ │ │ ├── decode.go │ │ │ ├── decode_other.go │ │ │ ├── encode.go │ │ │ ├── encode_other.go │ │ │ └── snappy.go │ │ ├── s2sx.mod │ │ ├── s2sx.sum │ │ └── zstd/ │ │ ├── README.md │ │ ├── bitreader.go │ │ ├── bitwriter.go │ │ ├── blockdec.go │ │ ├── blockenc.go │ │ ├── blocktype_string.go │ │ ├── bytebuf.go │ │ ├── bytereader.go │ │ ├── decodeheader.go │ │ ├── decoder.go │ │ ├── decoder_options.go │ │ ├── dict.go │ │ ├── enc_base.go │ │ ├── enc_best.go │ │ ├── enc_better.go │ │ ├── enc_dfast.go │ │ ├── enc_fast.go │ │ ├── encoder.go │ │ ├── encoder_options.go │ │ ├── framedec.go │ │ ├── frameenc.go │ │ ├── fse_decoder.go │ │ ├── fse_decoder_amd64.go │ │ ├── fse_decoder_amd64.s │ │ ├── fse_decoder_generic.go │ │ ├── fse_encoder.go │ │ ├── fse_predefined.go │ │ ├── hash.go │ │ ├── history.go │ │ ├── internal/ │ │ │ └── xxhash/ │ │ │ ├── LICENSE.txt │ │ │ ├── README.md │ │ │ ├── xxhash.go │ │ │ ├── xxhash_amd64.s │ │ │ ├── xxhash_arm64.s │ │ │ ├── xxhash_asm.go │ │ │ ├── xxhash_other.go │ │ │ └── xxhash_safe.go │ │ ├── matchlen_amd64.go │ │ ├── matchlen_amd64.s │ │ ├── matchlen_generic.go │ │ ├── seqdec.go │ │ ├── seqdec_amd64.go │ │ ├── seqdec_amd64.s │ │ ├── seqdec_generic.go │ │ ├── seqenc.go │ │ ├── snappy.go │ │ ├── zip.go │ │ └── zstd.go │ ├── magiconair/ │ │ └── properties/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE.md │ │ ├── README.md │ │ ├── decode.go │ │ ├── doc.go │ │ ├── integrate.go │ │ ├── lex.go │ │ ├── load.go │ │ ├── parser.go │ │ ├── properties.go │ │ └── rangecheck.go │ ├── minio/ │ │ └── highwayhash/ │ │ ├── .gitignore │ │ ├── .golangci.yml │ │ ├── LICENSE │ │ ├── README.md │ │ ├── highwayhash.go │ │ ├── highwayhashAVX2_amd64.s │ │ ├── highwayhashSVE_arm64.s │ │ ├── highwayhash_amd64.go │ │ ├── highwayhash_amd64.s │ │ ├── highwayhash_arm64.go │ │ ├── highwayhash_arm64.s │ │ ├── highwayhash_generic.go │ │ ├── highwayhash_ppc64le.go │ │ ├── highwayhash_ppc64le.s │ │ └── highwayhash_ref.go │ ├── mitchellh/ │ │ ├── go-homedir/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── homedir.go │ │ └── mapstructure/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── decode_hooks.go │ │ ├── error.go │ │ └── mapstructure.go │ ├── moby/ │ │ ├── buildkit/ │ │ │ ├── AUTHORS │ │ │ ├── LICENSE │ │ │ ├── frontend/ │ │ │ │ └── dockerfile/ │ │ │ │ ├── command/ │ │ │ │ │ └── command.go │ │ │ │ ├── dockerignore/ │ │ │ │ │ └── dockerignore_deprecated.go │ │ │ │ ├── instructions/ │ │ │ │ │ ├── bflag.go │ │ │ │ │ ├── commands.go │ │ │ │ │ ├── commands_rundevice.go │ │ │ │ │ ├── commands_runmount.go │ │ │ │ │ ├── commands_runnetwork.go │ │ │ │ │ ├── commands_runsecurity.go │ │ │ │ │ ├── errors_unix.go │ │ │ │ │ ├── errors_windows.go │ │ │ │ │ ├── exclude_pattern_feature.go │ │ │ │ │ ├── parse.go │ │ │ │ │ ├── parse_parents.go │ │ │ │ │ └── support.go │ │ │ │ ├── linter/ │ │ │ │ │ ├── linter.go │ │ │ │ │ └── ruleset.go │ │ │ │ ├── parser/ │ │ │ │ │ ├── directives.go │ │ │ │ │ ├── errors.go │ │ │ │ │ ├── line_parsers.go │ │ │ │ │ ├── parser.go │ │ │ │ │ └── split_command.go │ │ │ │ └── shell/ │ │ │ │ ├── envVarTest │ │ │ │ ├── equal_env_unix.go │ │ │ │ ├── equal_env_windows.go │ │ │ │ ├── lex.go │ │ │ │ └── wordsTest │ │ │ └── util/ │ │ │ ├── stack/ │ │ │ │ ├── compress.go │ │ │ │ ├── stack.go │ │ │ │ ├── stack.pb.go │ │ │ │ ├── stack.proto │ │ │ │ └── stack_vtproto.pb.go │ │ │ └── suggest/ │ │ │ └── error.go │ │ ├── docker-image-spec/ │ │ │ ├── LICENSE │ │ │ └── specs-go/ │ │ │ └── v1/ │ │ │ └── image.go │ │ ├── go-archive/ │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── .golangci.yml │ │ │ ├── LICENSE │ │ │ ├── archive.go │ │ │ ├── archive_linux.go │ │ │ ├── archive_other.go │ │ │ ├── archive_unix.go │ │ │ ├── archive_windows.go │ │ │ ├── changes.go │ │ │ ├── changes_linux.go │ │ │ ├── changes_other.go │ │ │ ├── changes_unix.go │ │ │ ├── changes_windows.go │ │ │ ├── chrootarchive/ │ │ │ │ ├── archive.go │ │ │ │ ├── archive_linux.go │ │ │ │ ├── archive_unix.go │ │ │ │ ├── archive_unix_nolinux.go │ │ │ │ ├── archive_windows.go │ │ │ │ ├── chroot_linux.go │ │ │ │ ├── diff.go │ │ │ │ ├── diff_unix.go │ │ │ │ └── diff_windows.go │ │ │ ├── compression/ │ │ │ │ ├── compression.go │ │ │ │ └── compression_detect.go │ │ │ ├── copy.go │ │ │ ├── copy_unix.go │ │ │ ├── copy_windows.go │ │ │ ├── dev_freebsd.go │ │ │ ├── dev_unix.go │ │ │ ├── diff.go │ │ │ ├── diff_unix.go │ │ │ ├── diff_windows.go │ │ │ ├── internal/ │ │ │ │ ├── mounttree/ │ │ │ │ │ └── switchroot_linux.go │ │ │ │ └── unshare/ │ │ │ │ └── unshare_linux.go │ │ │ ├── path.go │ │ │ ├── path_unix.go │ │ │ ├── path_windows.go │ │ │ ├── tarheader/ │ │ │ │ ├── tarheader.go │ │ │ │ ├── tarheader_unix.go │ │ │ │ └── tarheader_windows.go │ │ │ ├── time.go │ │ │ ├── time_nonwindows.go │ │ │ ├── time_windows.go │ │ │ ├── whiteouts.go │ │ │ ├── wrap.go │ │ │ ├── xattr_supported.go │ │ │ ├── xattr_supported_linux.go │ │ │ ├── xattr_supported_unix.go │ │ │ └── xattr_unsupported.go │ │ ├── locker/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── locker.go │ │ ├── patternmatcher/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ ├── ignorefile/ │ │ │ │ └── ignorefile.go │ │ │ └── patternmatcher.go │ │ ├── swarmkit/ │ │ │ └── v2/ │ │ │ ├── LICENSE │ │ │ ├── agent/ │ │ │ │ └── exec/ │ │ │ │ ├── controller.go │ │ │ │ ├── controller_stub.go │ │ │ │ ├── errors.go │ │ │ │ └── executor.go │ │ │ ├── api/ │ │ │ │ ├── README.md │ │ │ │ ├── api.pb.txt │ │ │ │ ├── ca.pb.go │ │ │ │ ├── ca.proto │ │ │ │ ├── control.pb.go │ │ │ │ ├── control.proto │ │ │ │ ├── deepcopy/ │ │ │ │ │ └── copy.go │ │ │ │ ├── dispatcher.pb.go │ │ │ │ ├── dispatcher.proto │ │ │ │ ├── equality/ │ │ │ │ │ └── equality.go │ │ │ │ ├── health.pb.go │ │ │ │ ├── health.proto │ │ │ │ ├── logbroker.pb.go │ │ │ │ ├── logbroker.proto │ │ │ │ ├── objects.pb.go │ │ │ │ ├── objects.proto │ │ │ │ ├── raft.pb.go │ │ │ │ ├── raft.proto │ │ │ │ ├── resource.pb.go │ │ │ │ ├── resource.proto │ │ │ │ ├── snapshot.pb.go │ │ │ │ ├── snapshot.proto │ │ │ │ ├── specs.pb.go │ │ │ │ ├── specs.proto │ │ │ │ ├── storeobject.go │ │ │ │ ├── types.pb.go │ │ │ │ ├── types.proto │ │ │ │ ├── watch.pb.go │ │ │ │ └── watch.proto │ │ │ ├── log/ │ │ │ │ ├── context.go │ │ │ │ └── grpc.go │ │ │ ├── manager/ │ │ │ │ └── raftselector/ │ │ │ │ └── raftselector.go │ │ │ └── protobuf/ │ │ │ ├── plugin/ │ │ │ │ ├── helpers.go │ │ │ │ ├── plugin.pb.go │ │ │ │ └── plugin.proto │ │ │ └── ptypes/ │ │ │ ├── doc.go │ │ │ └── timestamp.go │ │ └── sys/ │ │ ├── atomicwriter/ │ │ │ ├── LICENSE │ │ │ └── atomicwriter.go │ │ ├── mount/ │ │ │ ├── LICENSE │ │ │ ├── doc.go │ │ │ ├── flags_bsd.go │ │ │ ├── flags_linux.go │ │ │ ├── flags_unix.go │ │ │ ├── mount_errors.go │ │ │ ├── mount_unix.go │ │ │ ├── mounter_freebsd.go │ │ │ ├── mounter_linux.go │ │ │ ├── mounter_openbsd.go │ │ │ ├── mounter_unsupported.go │ │ │ └── sharedsubtree_linux.go │ │ ├── mountinfo/ │ │ │ ├── LICENSE │ │ │ ├── doc.go │ │ │ ├── mounted_linux.go │ │ │ ├── mounted_unix.go │ │ │ ├── mountinfo.go │ │ │ ├── mountinfo_bsd.go │ │ │ ├── mountinfo_filters.go │ │ │ ├── mountinfo_freebsdlike.go │ │ │ ├── mountinfo_linux.go │ │ │ ├── mountinfo_openbsd.go │ │ │ ├── mountinfo_unsupported.go │ │ │ └── mountinfo_windows.go │ │ ├── reexec/ │ │ │ ├── LICENSE │ │ │ ├── reexec.go │ │ │ ├── reexec_linux.go │ │ │ └── reexec_other.go │ │ ├── sequential/ │ │ │ ├── LICENSE │ │ │ ├── doc.go │ │ │ ├── sequential_unix.go │ │ │ └── sequential_windows.go │ │ ├── signal/ │ │ │ ├── LICENSE │ │ │ ├── signal.go │ │ │ ├── signal_darwin.go │ │ │ ├── signal_freebsd.go │ │ │ ├── signal_linux.go │ │ │ ├── signal_linux_mipsx.go │ │ │ ├── signal_unix.go │ │ │ ├── signal_unsupported.go │ │ │ └── signal_windows.go │ │ ├── symlink/ │ │ │ ├── LICENSE │ │ │ ├── LICENSE.APACHE │ │ │ ├── LICENSE.BSD │ │ │ ├── doc.go │ │ │ ├── fs.go │ │ │ ├── fs_unix.go │ │ │ └── fs_windows.go │ │ ├── user/ │ │ │ ├── LICENSE │ │ │ ├── idtools.go │ │ │ ├── idtools_unix.go │ │ │ ├── idtools_windows.go │ │ │ ├── lookup_unix.go │ │ │ ├── user.go │ │ │ └── user_fuzzer.go │ │ └── userns/ │ │ ├── LICENSE │ │ ├── userns.go │ │ ├── userns_linux.go │ │ ├── userns_linux_fuzzer.go │ │ └── userns_unsupported.go │ ├── morikuni/ │ │ └── aec/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── aec.go │ │ ├── ansi.go │ │ ├── builder.go │ │ └── sgr.go │ ├── munnerz/ │ │ └── goautoneg/ │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.txt │ │ └── autoneg.go │ ├── opencontainers/ │ │ ├── go-digest/ │ │ │ ├── .mailmap │ │ │ ├── .pullapprove.yml │ │ │ ├── .travis.yml │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE │ │ │ ├── LICENSE.docs │ │ │ ├── MAINTAINERS │ │ │ ├── README.md │ │ │ ├── algorithm.go │ │ │ ├── digest.go │ │ │ ├── digester.go │ │ │ ├── digestset/ │ │ │ │ └── set.go │ │ │ ├── doc.go │ │ │ └── verifiers.go │ │ ├── image-spec/ │ │ │ ├── LICENSE │ │ │ ├── identity/ │ │ │ │ ├── chainid.go │ │ │ │ └── helpers.go │ │ │ └── specs-go/ │ │ │ ├── v1/ │ │ │ │ ├── annotations.go │ │ │ │ ├── config.go │ │ │ │ ├── descriptor.go │ │ │ │ ├── index.go │ │ │ │ ├── layout.go │ │ │ │ ├── manifest.go │ │ │ │ └── mediatype.go │ │ │ ├── version.go │ │ │ └── versioned.go │ │ ├── runtime-spec/ │ │ │ ├── LICENSE │ │ │ └── specs-go/ │ │ │ ├── config.go │ │ │ ├── features/ │ │ │ │ └── features.go │ │ │ ├── state.go │ │ │ └── version.go │ │ └── selinux/ │ │ ├── LICENSE │ │ ├── go-selinux/ │ │ │ ├── doc.go │ │ │ ├── label/ │ │ │ │ ├── label.go │ │ │ │ ├── label_linux.go │ │ │ │ └── label_stub.go │ │ │ ├── selinux.go │ │ │ ├── selinux_linux.go │ │ │ ├── selinux_stub.go │ │ │ └── xattrs_linux.go │ │ └── pkg/ │ │ └── pwalkdir/ │ │ ├── README.md │ │ └── pwalkdir.go │ ├── pelletier/ │ │ └── go-toml/ │ │ └── v2/ │ │ ├── .dockerignore │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── .golangci.toml │ │ ├── .goreleaser.yaml │ │ ├── CONTRIBUTING.md │ │ ├── Dockerfile │ │ ├── LICENSE │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── ci.sh │ │ ├── decode.go │ │ ├── doc.go │ │ ├── errors.go │ │ ├── internal/ │ │ │ ├── characters/ │ │ │ │ ├── ascii.go │ │ │ │ └── utf8.go │ │ │ ├── danger/ │ │ │ │ ├── danger.go │ │ │ │ └── typeid.go │ │ │ └── tracker/ │ │ │ ├── key.go │ │ │ ├── seen.go │ │ │ └── tracker.go │ │ ├── localtime.go │ │ ├── marshaler.go │ │ ├── strict.go │ │ ├── toml.abnf │ │ ├── types.go │ │ ├── unmarshaler.go │ │ └── unstable/ │ │ ├── ast.go │ │ ├── builder.go │ │ ├── doc.go │ │ ├── kind.go │ │ ├── parser.go │ │ ├── scanner.go │ │ └── unmarshaler.go │ ├── pjbgf/ │ │ └── sha1cd/ │ │ ├── Dockerfile.arm │ │ ├── Dockerfile.arm64 │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.md │ │ ├── detection.go │ │ ├── internal/ │ │ │ └── const.go │ │ ├── sha1cd.go │ │ ├── sha1cdblock_amd64.go │ │ ├── sha1cdblock_amd64.s │ │ ├── sha1cdblock_generic.go │ │ ├── sha1cdblock_noasm.go │ │ └── ubc/ │ │ ├── const.go │ │ ├── ubc.go │ │ ├── ubc_amd64.go │ │ ├── ubc_amd64.s │ │ ├── ubc_generic.go │ │ └── ubc_noasm.go │ ├── pkg/ │ │ └── errors/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.md │ │ ├── appveyor.yml │ │ ├── errors.go │ │ ├── go113.go │ │ └── stack.go │ ├── planetscale/ │ │ └── vtprotobuf/ │ │ ├── LICENSE │ │ ├── protohelpers/ │ │ │ └── protohelpers.go │ │ └── types/ │ │ └── known/ │ │ ├── anypb/ │ │ │ └── any_vtproto.pb.go │ │ ├── durationpb/ │ │ │ └── duration_vtproto.pb.go │ │ ├── emptypb/ │ │ │ └── empty_vtproto.pb.go │ │ ├── structpb/ │ │ │ └── struct_vtproto.pb.go │ │ ├── timestamppb/ │ │ │ └── timestamp_vtproto.pb.go │ │ └── wrapperspb/ │ │ └── wrappers_vtproto.pb.go │ ├── prometheus/ │ │ ├── client_golang/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ ├── internal/ │ │ │ │ └── github.com/ │ │ │ │ └── golang/ │ │ │ │ └── gddo/ │ │ │ │ ├── LICENSE │ │ │ │ └── httputil/ │ │ │ │ ├── header/ │ │ │ │ │ └── header.go │ │ │ │ └── negotiate.go │ │ │ └── prometheus/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── build_info_collector.go │ │ │ ├── collector.go │ │ │ ├── collectorfunc.go │ │ │ ├── counter.go │ │ │ ├── desc.go │ │ │ ├── doc.go │ │ │ ├── expvar_collector.go │ │ │ ├── fnv.go │ │ │ ├── gauge.go │ │ │ ├── get_pid.go │ │ │ ├── get_pid_gopherjs.go │ │ │ ├── go_collector.go │ │ │ ├── go_collector_go116.go │ │ │ ├── go_collector_latest.go │ │ │ ├── histogram.go │ │ │ ├── internal/ │ │ │ │ ├── almost_equal.go │ │ │ │ ├── difflib.go │ │ │ │ ├── go_collector_options.go │ │ │ │ ├── go_runtime_metrics.go │ │ │ │ └── metric.go │ │ │ ├── labels.go │ │ │ ├── metric.go │ │ │ ├── num_threads.go │ │ │ ├── num_threads_gopherjs.go │ │ │ ├── observer.go │ │ │ ├── process_collector.go │ │ │ ├── process_collector_darwin.go │ │ │ ├── process_collector_mem_cgo_darwin.c │ │ │ ├── process_collector_mem_cgo_darwin.go │ │ │ ├── process_collector_mem_nocgo_darwin.go │ │ │ ├── process_collector_not_supported.go │ │ │ ├── process_collector_procfsenabled.go │ │ │ ├── process_collector_windows.go │ │ │ ├── promhttp/ │ │ │ │ ├── delegator.go │ │ │ │ ├── http.go │ │ │ │ ├── instrument_client.go │ │ │ │ ├── instrument_server.go │ │ │ │ ├── internal/ │ │ │ │ │ └── compression.go │ │ │ │ └── option.go │ │ │ ├── registry.go │ │ │ ├── summary.go │ │ │ ├── timer.go │ │ │ ├── untyped.go │ │ │ ├── value.go │ │ │ ├── vec.go │ │ │ ├── vnext.go │ │ │ └── wrap.go │ │ ├── client_model/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ └── go/ │ │ │ └── metrics.pb.go │ │ ├── common/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ ├── expfmt/ │ │ │ │ ├── decode.go │ │ │ │ ├── encode.go │ │ │ │ ├── expfmt.go │ │ │ │ ├── fuzz.go │ │ │ │ ├── openmetrics_create.go │ │ │ │ ├── text_create.go │ │ │ │ └── text_parse.go │ │ │ └── model/ │ │ │ ├── alert.go │ │ │ ├── fingerprinting.go │ │ │ ├── fnv.go │ │ │ ├── labels.go │ │ │ ├── labelset.go │ │ │ ├── labelset_string.go │ │ │ ├── metadata.go │ │ │ ├── metric.go │ │ │ ├── model.go │ │ │ ├── signature.go │ │ │ ├── silence.go │ │ │ ├── time.go │ │ │ ├── value.go │ │ │ ├── value_float.go │ │ │ ├── value_histogram.go │ │ │ └── value_type.go │ │ └── procfs/ │ │ ├── .gitignore │ │ ├── .golangci.yml │ │ ├── CODE_OF_CONDUCT.md │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── MAINTAINERS.md │ │ ├── Makefile │ │ ├── Makefile.common │ │ ├── NOTICE │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── arp.go │ │ ├── buddyinfo.go │ │ ├── cmdline.go │ │ ├── cpuinfo.go │ │ ├── cpuinfo_armx.go │ │ ├── cpuinfo_loong64.go │ │ ├── cpuinfo_mipsx.go │ │ ├── cpuinfo_others.go │ │ ├── cpuinfo_ppcx.go │ │ ├── cpuinfo_riscvx.go │ │ ├── cpuinfo_s390x.go │ │ ├── cpuinfo_x86.go │ │ ├── crypto.go │ │ ├── doc.go │ │ ├── fs.go │ │ ├── fs_statfs_notype.go │ │ ├── fs_statfs_type.go │ │ ├── fscache.go │ │ ├── internal/ │ │ │ ├── fs/ │ │ │ │ └── fs.go │ │ │ └── util/ │ │ │ ├── parse.go │ │ │ ├── readfile.go │ │ │ ├── sysreadfile.go │ │ │ ├── sysreadfile_compat.go │ │ │ └── valueparser.go │ │ ├── ipvs.go │ │ ├── kernel_random.go │ │ ├── loadavg.go │ │ ├── mdstat.go │ │ ├── meminfo.go │ │ ├── mountinfo.go │ │ ├── mountstats.go │ │ ├── net_conntrackstat.go │ │ ├── net_dev.go │ │ ├── net_dev_snmp6.go │ │ ├── net_ip_socket.go │ │ ├── net_protocols.go │ │ ├── net_route.go │ │ ├── net_sockstat.go │ │ ├── net_softnet.go │ │ ├── net_tcp.go │ │ ├── net_tls_stat.go │ │ ├── net_udp.go │ │ ├── net_unix.go │ │ ├── net_wireless.go │ │ ├── net_xfrm.go │ │ ├── netstat.go │ │ ├── proc.go │ │ ├── proc_cgroup.go │ │ ├── proc_cgroups.go │ │ ├── proc_environ.go │ │ ├── proc_fdinfo.go │ │ ├── proc_interrupts.go │ │ ├── proc_io.go │ │ ├── proc_limits.go │ │ ├── proc_maps.go │ │ ├── proc_netstat.go │ │ ├── proc_ns.go │ │ ├── proc_psi.go │ │ ├── proc_smaps.go │ │ ├── proc_snmp.go │ │ ├── proc_snmp6.go │ │ ├── proc_stat.go │ │ ├── proc_status.go │ │ ├── proc_sys.go │ │ ├── schedstat.go │ │ ├── slab.go │ │ ├── softirqs.go │ │ ├── stat.go │ │ ├── swaps.go │ │ ├── thread.go │ │ ├── ttar │ │ ├── vm.go │ │ └── zoneinfo.go │ ├── sagikazarmark/ │ │ └── slog-shim/ │ │ ├── .editorconfig │ │ ├── .envrc │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── attr.go │ │ ├── attr_120.go │ │ ├── flake.nix │ │ ├── handler.go │ │ ├── handler_120.go │ │ ├── json_handler.go │ │ ├── json_handler_120.go │ │ ├── level.go │ │ ├── level_120.go │ │ ├── logger.go │ │ ├── logger_120.go │ │ ├── record.go │ │ ├── record_120.go │ │ ├── text_handler.go │ │ ├── text_handler_120.go │ │ ├── value.go │ │ └── value_120.go │ ├── sergi/ │ │ └── go-diff/ │ │ ├── AUTHORS │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ └── diffmatchpatch/ │ │ ├── diff.go │ │ ├── diffmatchpatch.go │ │ ├── match.go │ │ ├── mathutil.go │ │ ├── operation_string.go │ │ ├── patch.go │ │ └── stringutil.go │ ├── skeema/ │ │ └── knownhosts/ │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── NOTICE │ │ ├── README.md │ │ └── knownhosts.go │ ├── sourcegraph/ │ │ └── conc/ │ │ ├── .golangci.yml │ │ ├── LICENSE │ │ ├── README.md │ │ ├── internal/ │ │ │ └── multierror/ │ │ │ ├── multierror_go119.go │ │ │ └── multierror_go120.go │ │ ├── iter/ │ │ │ ├── iter.go │ │ │ └── map.go │ │ ├── panics/ │ │ │ ├── panics.go │ │ │ └── try.go │ │ └── waitgroup.go │ ├── spf13/ │ │ ├── afero/ │ │ │ ├── .editorconfig │ │ │ ├── .gitignore │ │ │ ├── .golangci.yaml │ │ │ ├── LICENSE.txt │ │ │ ├── README.md │ │ │ ├── afero.go │ │ │ ├── appveyor.yml │ │ │ ├── basepath.go │ │ │ ├── cacheOnReadFs.go │ │ │ ├── const_bsds.go │ │ │ ├── const_win_unix.go │ │ │ ├── copyOnWriteFs.go │ │ │ ├── httpFs.go │ │ │ ├── internal/ │ │ │ │ └── common/ │ │ │ │ └── adapters.go │ │ │ ├── iofs.go │ │ │ ├── ioutil.go │ │ │ ├── lstater.go │ │ │ ├── match.go │ │ │ ├── mem/ │ │ │ │ ├── dir.go │ │ │ │ ├── dirmap.go │ │ │ │ └── file.go │ │ │ ├── memmap.go │ │ │ ├── os.go │ │ │ ├── path.go │ │ │ ├── readonlyfs.go │ │ │ ├── regexpfs.go │ │ │ ├── symlink.go │ │ │ ├── unionFile.go │ │ │ └── util.go │ │ ├── cast/ │ │ │ ├── .gitignore │ │ │ ├── LICENSE │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── cast.go │ │ │ ├── caste.go │ │ │ └── timeformattype_string.go │ │ ├── cobra/ │ │ │ ├── .gitignore │ │ │ ├── .golangci.yml │ │ │ ├── .mailmap │ │ │ ├── CONDUCT.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── LICENSE.txt │ │ │ ├── MAINTAINERS │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── active_help.go │ │ │ ├── args.go │ │ │ ├── bash_completions.go │ │ │ ├── bash_completionsV2.go │ │ │ ├── cobra.go │ │ │ ├── command.go │ │ │ ├── command_notwin.go │ │ │ ├── command_win.go │ │ │ ├── completions.go │ │ │ ├── fish_completions.go │ │ │ ├── flag_groups.go │ │ │ ├── powershell_completions.go │ │ │ ├── shell_completions.go │ │ │ └── zsh_completions.go │ │ └── pflag/ │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .golangci.yaml │ │ ├── .travis.yml │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bool.go │ │ ├── bool_slice.go │ │ ├── bytes.go │ │ ├── count.go │ │ ├── duration.go │ │ ├── duration_slice.go │ │ ├── flag.go │ │ ├── float32.go │ │ ├── float32_slice.go │ │ ├── float64.go │ │ ├── float64_slice.go │ │ ├── golangflag.go │ │ ├── int.go │ │ ├── int16.go │ │ ├── int32.go │ │ ├── int32_slice.go │ │ ├── int64.go │ │ ├── int64_slice.go │ │ ├── int8.go │ │ ├── int_slice.go │ │ ├── ip.go │ │ ├── ip_slice.go │ │ ├── ipmask.go │ │ ├── ipnet.go │ │ ├── ipnet_slice.go │ │ ├── string.go │ │ ├── string_array.go │ │ ├── string_slice.go │ │ ├── string_to_int.go │ │ ├── string_to_int64.go │ │ ├── string_to_string.go │ │ ├── uint.go │ │ ├── uint16.go │ │ ├── uint32.go │ │ ├── uint64.go │ │ ├── uint8.go │ │ └── uint_slice.go │ ├── spiffe/ │ │ └── go-spiffe/ │ │ └── v2/ │ │ ├── LICENSE │ │ ├── bundle/ │ │ │ ├── jwtbundle/ │ │ │ │ ├── bundle.go │ │ │ │ ├── doc.go │ │ │ │ ├── set.go │ │ │ │ └── source.go │ │ │ ├── spiffebundle/ │ │ │ │ ├── bundle.go │ │ │ │ ├── doc.go │ │ │ │ ├── set.go │ │ │ │ └── source.go │ │ │ └── x509bundle/ │ │ │ ├── bundle.go │ │ │ ├── doc.go │ │ │ ├── set.go │ │ │ └── source.go │ │ ├── internal/ │ │ │ ├── cryptoutil/ │ │ │ │ └── keys.go │ │ │ ├── jwtutil/ │ │ │ │ └── util.go │ │ │ ├── pemutil/ │ │ │ │ └── pem.go │ │ │ └── x509util/ │ │ │ └── util.go │ │ └── spiffeid/ │ │ ├── charset_backcompat_allow.go │ │ ├── charset_backcompat_deny.go │ │ ├── errors.go │ │ ├── id.go │ │ ├── match.go │ │ ├── path.go │ │ ├── require.go │ │ └── trustdomain.go │ ├── subosito/ │ │ └── gotenv/ │ │ ├── .gitignore │ │ ├── .golangci.yaml │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ └── gotenv.go │ ├── tonistiigi/ │ │ └── go-csvvalue/ │ │ ├── .golangci.yml │ │ ├── .yamllint.yml │ │ ├── Dockerfile │ │ ├── LICENSE │ │ ├── codecov.yml │ │ ├── csvvalue.go │ │ ├── docker-bake.hcl │ │ └── readme.md │ ├── toqueteos/ │ │ └── webbrowser/ │ │ ├── .travis.yml │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE.md │ │ ├── README.md │ │ └── webbrowser.go │ ├── vbatts/ │ │ └── tar-split/ │ │ ├── LICENSE │ │ ├── archive/ │ │ │ └── tar/ │ │ │ ├── common.go │ │ │ ├── format.go │ │ │ ├── reader.go │ │ │ ├── stat_actime1.go │ │ │ ├── stat_actime2.go │ │ │ ├── stat_unix.go │ │ │ ├── strconv.go │ │ │ └── writer.go │ │ └── tar/ │ │ ├── asm/ │ │ │ ├── README.md │ │ │ ├── assemble.go │ │ │ ├── disassemble.go │ │ │ ├── doc.go │ │ │ └── iterate.go │ │ └── storage/ │ │ ├── doc.go │ │ ├── entry.go │ │ ├── getter.go │ │ └── packer.go │ ├── xanzy/ │ │ └── ssh-agent/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── pageant_windows.go │ │ ├── sshagent.go │ │ └── sshagent_windows.go │ └── zeebo/ │ └── errs/ │ ├── .gitignore │ ├── AUTHORS │ ├── LICENSE │ ├── README.md │ ├── errs.go │ ├── group.go │ ├── is_go1.20.go │ └── is_go_other.go ├── go.etcd.io/ │ └── etcd/ │ └── raft/ │ └── v3/ │ ├── LICENSE │ └── raftpb/ │ ├── confchange.go │ ├── confstate.go │ ├── raft.pb.go │ └── raft.proto ├── go.opencensus.io/ │ ├── .gitignore │ ├── AUTHORS │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── appveyor.yml │ ├── internal/ │ │ ├── internal.go │ │ ├── sanitize.go │ │ └── traceinternals.go │ ├── opencensus.go │ └── trace/ │ ├── basetypes.go │ ├── config.go │ ├── doc.go │ ├── evictedqueue.go │ ├── export.go │ ├── internal/ │ │ └── internal.go │ ├── lrumap.go │ ├── sampling.go │ ├── spanbucket.go │ ├── spanstore.go │ ├── status_codes.go │ ├── trace.go │ ├── trace_api.go │ ├── trace_go11.go │ ├── trace_nongo11.go │ └── tracestate/ │ └── tracestate.go ├── go.opentelemetry.io/ │ ├── auto/ │ │ └── sdk/ │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── VERSIONING.md │ │ ├── doc.go │ │ ├── internal/ │ │ │ └── telemetry/ │ │ │ ├── attr.go │ │ │ ├── doc.go │ │ │ ├── id.go │ │ │ ├── number.go │ │ │ ├── resource.go │ │ │ ├── scope.go │ │ │ ├── span.go │ │ │ ├── status.go │ │ │ ├── traces.go │ │ │ └── value.go │ │ ├── limit.go │ │ ├── span.go │ │ ├── tracer.go │ │ └── tracer_provider.go │ ├── contrib/ │ │ ├── detectors/ │ │ │ └── gcp/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── cloud-function.go │ │ │ ├── cloud-run.go │ │ │ ├── detector.go │ │ │ ├── gce.go │ │ │ ├── gke.go │ │ │ ├── types.go │ │ │ └── version.go │ │ └── instrumentation/ │ │ ├── google.golang.org/ │ │ │ └── grpc/ │ │ │ └── otelgrpc/ │ │ │ ├── LICENSE │ │ │ ├── config.go │ │ │ ├── doc.go │ │ │ ├── interceptor.go │ │ │ ├── interceptorinfo.go │ │ │ ├── internal/ │ │ │ │ └── parse.go │ │ │ ├── metadata_supplier.go │ │ │ ├── semconv.go │ │ │ ├── stats_handler.go │ │ │ └── version.go │ │ └── net/ │ │ └── http/ │ │ └── otelhttp/ │ │ ├── LICENSE │ │ ├── client.go │ │ ├── common.go │ │ ├── config.go │ │ ├── doc.go │ │ ├── handler.go │ │ ├── internal/ │ │ │ ├── request/ │ │ │ │ ├── body_wrapper.go │ │ │ │ ├── gen.go │ │ │ │ └── resp_writer_wrapper.go │ │ │ ├── semconv/ │ │ │ │ ├── env.go │ │ │ │ ├── gen.go │ │ │ │ ├── httpconv.go │ │ │ │ ├── util.go │ │ │ │ └── v1.20.0.go │ │ │ └── semconvutil/ │ │ │ ├── gen.go │ │ │ ├── httpconv.go │ │ │ └── netconv.go │ │ ├── labeler.go │ │ ├── start_time_context.go │ │ ├── transport.go │ │ └── version.go │ └── otel/ │ ├── .codespellignore │ ├── .codespellrc │ ├── .gitattributes │ ├── .gitignore │ ├── .golangci.yml │ ├── .lycheeignore │ ├── .markdownlint.yaml │ ├── CHANGELOG.md │ ├── CODEOWNERS │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── RELEASING.md │ ├── VERSIONING.md │ ├── attribute/ │ │ ├── README.md │ │ ├── doc.go │ │ ├── encoder.go │ │ ├── filter.go │ │ ├── internal/ │ │ │ └── attribute.go │ │ ├── iterator.go │ │ ├── key.go │ │ ├── kv.go │ │ ├── rawhelpers.go │ │ ├── set.go │ │ ├── type_string.go │ │ └── value.go │ ├── baggage/ │ │ ├── README.md │ │ ├── baggage.go │ │ ├── context.go │ │ └── doc.go │ ├── codes/ │ │ ├── README.md │ │ ├── codes.go │ │ └── doc.go │ ├── dependencies.Dockerfile │ ├── doc.go │ ├── error_handler.go │ ├── handler.go │ ├── internal/ │ │ ├── baggage/ │ │ │ ├── baggage.go │ │ │ └── context.go │ │ └── global/ │ │ ├── handler.go │ │ ├── instruments.go │ │ ├── internal_logging.go │ │ ├── meter.go │ │ ├── propagator.go │ │ ├── state.go │ │ └── trace.go │ ├── internal_logging.go │ ├── metric/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── asyncfloat64.go │ │ ├── asyncint64.go │ │ ├── config.go │ │ ├── doc.go │ │ ├── embedded/ │ │ │ ├── README.md │ │ │ └── embedded.go │ │ ├── instrument.go │ │ ├── meter.go │ │ ├── noop/ │ │ │ ├── README.md │ │ │ └── noop.go │ │ ├── syncfloat64.go │ │ └── syncint64.go │ ├── metric.go │ ├── propagation/ │ │ ├── README.md │ │ ├── baggage.go │ │ ├── doc.go │ │ ├── propagation.go │ │ └── trace_context.go │ ├── propagation.go │ ├── renovate.json │ ├── requirements.txt │ ├── sdk/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── instrumentation/ │ │ │ ├── README.md │ │ │ ├── doc.go │ │ │ ├── library.go │ │ │ └── scope.go │ │ ├── internal/ │ │ │ └── x/ │ │ │ ├── README.md │ │ │ └── x.go │ │ ├── metric/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── aggregation.go │ │ │ ├── cache.go │ │ │ ├── config.go │ │ │ ├── doc.go │ │ │ ├── env.go │ │ │ ├── exemplar/ │ │ │ │ ├── README.md │ │ │ │ ├── doc.go │ │ │ │ ├── exemplar.go │ │ │ │ ├── filter.go │ │ │ │ ├── fixed_size_reservoir.go │ │ │ │ ├── histogram_reservoir.go │ │ │ │ ├── reservoir.go │ │ │ │ ├── storage.go │ │ │ │ └── value.go │ │ │ ├── exemplar.go │ │ │ ├── exporter.go │ │ │ ├── instrument.go │ │ │ ├── instrumentkind_string.go │ │ │ ├── internal/ │ │ │ │ ├── aggregate/ │ │ │ │ │ ├── aggregate.go │ │ │ │ │ ├── doc.go │ │ │ │ │ ├── drop.go │ │ │ │ │ ├── exemplar.go │ │ │ │ │ ├── exponential_histogram.go │ │ │ │ │ ├── filtered_reservoir.go │ │ │ │ │ ├── histogram.go │ │ │ │ │ ├── lastvalue.go │ │ │ │ │ ├── limit.go │ │ │ │ │ └── sum.go │ │ │ │ ├── reuse_slice.go │ │ │ │ └── x/ │ │ │ │ ├── README.md │ │ │ │ └── x.go │ │ │ ├── manual_reader.go │ │ │ ├── meter.go │ │ │ ├── metricdata/ │ │ │ │ ├── README.md │ │ │ │ ├── data.go │ │ │ │ ├── temporality.go │ │ │ │ └── temporality_string.go │ │ │ ├── periodic_reader.go │ │ │ ├── pipeline.go │ │ │ ├── provider.go │ │ │ ├── reader.go │ │ │ ├── version.go │ │ │ └── view.go │ │ ├── resource/ │ │ │ ├── README.md │ │ │ ├── auto.go │ │ │ ├── builtin.go │ │ │ ├── config.go │ │ │ ├── container.go │ │ │ ├── doc.go │ │ │ ├── env.go │ │ │ ├── host_id.go │ │ │ ├── host_id_bsd.go │ │ │ ├── host_id_darwin.go │ │ │ ├── host_id_exec.go │ │ │ ├── host_id_linux.go │ │ │ ├── host_id_readfile.go │ │ │ ├── host_id_unsupported.go │ │ │ ├── host_id_windows.go │ │ │ ├── os.go │ │ │ ├── os_release_darwin.go │ │ │ ├── os_release_unix.go │ │ │ ├── os_unix.go │ │ │ ├── os_unsupported.go │ │ │ ├── os_windows.go │ │ │ ├── process.go │ │ │ └── resource.go │ │ └── version.go │ ├── semconv/ │ │ ├── v1.17.0/ │ │ │ ├── README.md │ │ │ ├── doc.go │ │ │ ├── event.go │ │ │ ├── exception.go │ │ │ ├── http.go │ │ │ ├── resource.go │ │ │ ├── schema.go │ │ │ └── trace.go │ │ ├── v1.20.0/ │ │ │ ├── README.md │ │ │ ├── attribute_group.go │ │ │ ├── doc.go │ │ │ ├── event.go │ │ │ ├── exception.go │ │ │ ├── http.go │ │ │ ├── resource.go │ │ │ ├── schema.go │ │ │ └── trace.go │ │ ├── v1.21.0/ │ │ │ ├── README.md │ │ │ ├── attribute_group.go │ │ │ ├── doc.go │ │ │ ├── event.go │ │ │ ├── exception.go │ │ │ ├── resource.go │ │ │ ├── schema.go │ │ │ └── trace.go │ │ ├── v1.24.0/ │ │ │ ├── README.md │ │ │ ├── attribute_group.go │ │ │ ├── doc.go │ │ │ ├── event.go │ │ │ ├── exception.go │ │ │ ├── metric.go │ │ │ ├── resource.go │ │ │ ├── schema.go │ │ │ └── trace.go │ │ └── v1.26.0/ │ │ ├── README.md │ │ ├── attribute_group.go │ │ ├── doc.go │ │ ├── exception.go │ │ ├── metric.go │ │ └── schema.go │ ├── trace/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── auto.go │ │ ├── config.go │ │ ├── context.go │ │ ├── doc.go │ │ ├── embedded/ │ │ │ ├── README.md │ │ │ └── embedded.go │ │ ├── internal/ │ │ │ └── telemetry/ │ │ │ ├── attr.go │ │ │ ├── doc.go │ │ │ ├── id.go │ │ │ ├── number.go │ │ │ ├── resource.go │ │ │ ├── scope.go │ │ │ ├── span.go │ │ │ ├── status.go │ │ │ ├── traces.go │ │ │ └── value.go │ │ ├── nonrecording.go │ │ ├── noop/ │ │ │ ├── README.md │ │ │ └── noop.go │ │ ├── noop.go │ │ ├── provider.go │ │ ├── span.go │ │ ├── trace.go │ │ ├── tracer.go │ │ └── tracestate.go │ ├── trace.go │ ├── verify_released_changelog.sh │ ├── version.go │ └── versions.yaml ├── golang.org/ │ └── x/ │ ├── crypto/ │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── argon2/ │ │ │ ├── argon2.go │ │ │ ├── blake2b.go │ │ │ ├── blamka_amd64.go │ │ │ ├── blamka_amd64.s │ │ │ ├── blamka_generic.go │ │ │ └── blamka_ref.go │ │ ├── blake2b/ │ │ │ ├── blake2b.go │ │ │ ├── blake2bAVX2_amd64.go │ │ │ ├── blake2bAVX2_amd64.s │ │ │ ├── blake2b_amd64.s │ │ │ ├── blake2b_generic.go │ │ │ ├── blake2b_ref.go │ │ │ ├── blake2x.go │ │ │ └── register.go │ │ ├── blowfish/ │ │ │ ├── block.go │ │ │ ├── cipher.go │ │ │ └── const.go │ │ ├── cast5/ │ │ │ └── cast5.go │ │ ├── chacha20/ │ │ │ ├── chacha_arm64.go │ │ │ ├── chacha_arm64.s │ │ │ ├── chacha_generic.go │ │ │ ├── chacha_noasm.go │ │ │ ├── chacha_ppc64x.go │ │ │ ├── chacha_ppc64x.s │ │ │ ├── chacha_s390x.go │ │ │ ├── chacha_s390x.s │ │ │ └── xor.go │ │ ├── chacha20poly1305/ │ │ │ ├── chacha20poly1305.go │ │ │ ├── chacha20poly1305_amd64.go │ │ │ ├── chacha20poly1305_amd64.s │ │ │ ├── chacha20poly1305_generic.go │ │ │ ├── chacha20poly1305_noasm.go │ │ │ └── xchacha20poly1305.go │ │ ├── cryptobyte/ │ │ │ ├── asn1/ │ │ │ │ └── asn1.go │ │ │ ├── asn1.go │ │ │ ├── builder.go │ │ │ └── string.go │ │ ├── curve25519/ │ │ │ └── curve25519.go │ │ ├── hkdf/ │ │ │ └── hkdf.go │ │ ├── internal/ │ │ │ ├── alias/ │ │ │ │ ├── alias.go │ │ │ │ └── alias_purego.go │ │ │ └── poly1305/ │ │ │ ├── mac_noasm.go │ │ │ ├── poly1305.go │ │ │ ├── sum_amd64.s │ │ │ ├── sum_asm.go │ │ │ ├── sum_generic.go │ │ │ ├── sum_loong64.s │ │ │ ├── sum_ppc64x.s │ │ │ ├── sum_s390x.go │ │ │ └── sum_s390x.s │ │ ├── pkcs12/ │ │ │ ├── bmp-string.go │ │ │ ├── crypto.go │ │ │ ├── errors.go │ │ │ ├── internal/ │ │ │ │ └── rc2/ │ │ │ │ └── rc2.go │ │ │ ├── mac.go │ │ │ ├── pbkdf.go │ │ │ ├── pkcs12.go │ │ │ └── safebags.go │ │ ├── sha3/ │ │ │ ├── doc.go │ │ │ ├── hashes.go │ │ │ ├── hashes_noasm.go │ │ │ ├── keccakf.go │ │ │ ├── keccakf_amd64.go │ │ │ ├── keccakf_amd64.s │ │ │ ├── sha3.go │ │ │ ├── sha3_s390x.go │ │ │ ├── sha3_s390x.s │ │ │ ├── shake.go │ │ │ └── shake_noasm.go │ │ └── ssh/ │ │ ├── agent/ │ │ │ ├── client.go │ │ │ ├── forward.go │ │ │ ├── keyring.go │ │ │ └── server.go │ │ ├── buffer.go │ │ ├── certs.go │ │ ├── channel.go │ │ ├── cipher.go │ │ ├── client.go │ │ ├── client_auth.go │ │ ├── common.go │ │ ├── connection.go │ │ ├── doc.go │ │ ├── handshake.go │ │ ├── internal/ │ │ │ └── bcrypt_pbkdf/ │ │ │ └── bcrypt_pbkdf.go │ │ ├── kex.go │ │ ├── keys.go │ │ ├── knownhosts/ │ │ │ └── knownhosts.go │ │ ├── mac.go │ │ ├── messages.go │ │ ├── mlkem.go │ │ ├── mux.go │ │ ├── server.go │ │ ├── session.go │ │ ├── ssh_gss.go │ │ ├── streamlocal.go │ │ ├── tcpip.go │ │ └── transport.go │ ├── exp/ │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── slices/ │ │ │ ├── slices.go │ │ │ └── sort.go │ │ └── slog/ │ │ ├── attr.go │ │ ├── doc.go │ │ ├── handler.go │ │ ├── internal/ │ │ │ ├── buffer/ │ │ │ │ └── buffer.go │ │ │ └── ignorepc.go │ │ ├── json_handler.go │ │ ├── level.go │ │ ├── logger.go │ │ ├── noplog.bench │ │ ├── record.go │ │ ├── text_handler.go │ │ ├── value.go │ │ ├── value_119.go │ │ └── value_120.go │ ├── net/ │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── context/ │ │ │ └── context.go │ │ ├── http/ │ │ │ └── httpguts/ │ │ │ ├── guts.go │ │ │ └── httplex.go │ │ ├── http2/ │ │ │ ├── .gitignore │ │ │ ├── ascii.go │ │ │ ├── ciphers.go │ │ │ ├── client_conn_pool.go │ │ │ ├── config.go │ │ │ ├── config_go124.go │ │ │ ├── config_pre_go124.go │ │ │ ├── databuffer.go │ │ │ ├── errors.go │ │ │ ├── flow.go │ │ │ ├── frame.go │ │ │ ├── gotrack.go │ │ │ ├── hpack/ │ │ │ │ ├── encode.go │ │ │ │ ├── hpack.go │ │ │ │ ├── huffman.go │ │ │ │ ├── static_table.go │ │ │ │ └── tables.go │ │ │ ├── http2.go │ │ │ ├── pipe.go │ │ │ ├── server.go │ │ │ ├── timer.go │ │ │ ├── transport.go │ │ │ ├── unencrypted.go │ │ │ ├── write.go │ │ │ ├── writesched.go │ │ │ ├── writesched_priority.go │ │ │ ├── writesched_random.go │ │ │ └── writesched_roundrobin.go │ │ ├── idna/ │ │ │ ├── go118.go │ │ │ ├── idna10.0.0.go │ │ │ ├── idna9.0.0.go │ │ │ ├── pre_go118.go │ │ │ ├── punycode.go │ │ │ ├── tables10.0.0.go │ │ │ ├── tables11.0.0.go │ │ │ ├── tables12.0.0.go │ │ │ ├── tables13.0.0.go │ │ │ ├── tables15.0.0.go │ │ │ ├── tables9.0.0.go │ │ │ ├── trie.go │ │ │ ├── trie12.0.0.go │ │ │ ├── trie13.0.0.go │ │ │ └── trieval.go │ │ ├── internal/ │ │ │ ├── httpcommon/ │ │ │ │ ├── ascii.go │ │ │ │ ├── headermap.go │ │ │ │ └── request.go │ │ │ ├── socks/ │ │ │ │ ├── client.go │ │ │ │ └── socks.go │ │ │ └── timeseries/ │ │ │ └── timeseries.go │ │ ├── proxy/ │ │ │ ├── dial.go │ │ │ ├── direct.go │ │ │ ├── per_host.go │ │ │ ├── proxy.go │ │ │ └── socks5.go │ │ └── trace/ │ │ ├── events.go │ │ ├── histogram.go │ │ └── trace.go │ ├── oauth2/ │ │ ├── .travis.yml │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── authhandler/ │ │ │ └── authhandler.go │ │ ├── deviceauth.go │ │ ├── google/ │ │ │ ├── appengine.go │ │ │ ├── default.go │ │ │ ├── doc.go │ │ │ ├── error.go │ │ │ ├── externalaccount/ │ │ │ │ ├── aws.go │ │ │ │ ├── basecredentials.go │ │ │ │ ├── executablecredsource.go │ │ │ │ ├── filecredsource.go │ │ │ │ ├── header.go │ │ │ │ ├── programmaticrefreshcredsource.go │ │ │ │ └── urlcredsource.go │ │ │ ├── google.go │ │ │ ├── internal/ │ │ │ │ ├── externalaccountauthorizeduser/ │ │ │ │ │ └── externalaccountauthorizeduser.go │ │ │ │ ├── impersonate/ │ │ │ │ │ └── impersonate.go │ │ │ │ └── stsexchange/ │ │ │ │ ├── clientauth.go │ │ │ │ └── sts_exchange.go │ │ │ ├── jwt.go │ │ │ └── sdk.go │ │ ├── internal/ │ │ │ ├── doc.go │ │ │ ├── oauth2.go │ │ │ ├── token.go │ │ │ └── transport.go │ │ ├── jws/ │ │ │ └── jws.go │ │ ├── jwt/ │ │ │ └── jwt.go │ │ ├── oauth2.go │ │ ├── pkce.go │ │ ├── token.go │ │ └── transport.go │ ├── sync/ │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── errgroup/ │ │ │ └── errgroup.go │ │ ├── semaphore/ │ │ │ └── semaphore.go │ │ └── syncmap/ │ │ └── map.go │ ├── sys/ │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── cpu/ │ │ │ ├── asm_aix_ppc64.s │ │ │ ├── asm_darwin_x86_gc.s │ │ │ ├── byteorder.go │ │ │ ├── cpu.go │ │ │ ├── cpu_aix.go │ │ │ ├── cpu_arm.go │ │ │ ├── cpu_arm64.go │ │ │ ├── cpu_arm64.s │ │ │ ├── cpu_darwin_x86.go │ │ │ ├── cpu_gc_arm64.go │ │ │ ├── cpu_gc_s390x.go │ │ │ ├── cpu_gc_x86.go │ │ │ ├── cpu_gc_x86.s │ │ │ ├── cpu_gccgo_arm64.go │ │ │ ├── cpu_gccgo_s390x.go │ │ │ ├── cpu_gccgo_x86.c │ │ │ ├── cpu_gccgo_x86.go │ │ │ ├── cpu_linux.go │ │ │ ├── cpu_linux_arm.go │ │ │ ├── cpu_linux_arm64.go │ │ │ ├── cpu_linux_loong64.go │ │ │ ├── cpu_linux_mips64x.go │ │ │ ├── cpu_linux_noinit.go │ │ │ ├── cpu_linux_ppc64x.go │ │ │ ├── cpu_linux_riscv64.go │ │ │ ├── cpu_linux_s390x.go │ │ │ ├── cpu_loong64.go │ │ │ ├── cpu_loong64.s │ │ │ ├── cpu_mips64x.go │ │ │ ├── cpu_mipsx.go │ │ │ ├── cpu_netbsd_arm64.go │ │ │ ├── cpu_openbsd_arm64.go │ │ │ ├── cpu_openbsd_arm64.s │ │ │ ├── cpu_other_arm.go │ │ │ ├── cpu_other_arm64.go │ │ │ ├── cpu_other_mips64x.go │ │ │ ├── cpu_other_ppc64x.go │ │ │ ├── cpu_other_riscv64.go │ │ │ ├── cpu_other_x86.go │ │ │ ├── cpu_ppc64x.go │ │ │ ├── cpu_riscv64.go │ │ │ ├── cpu_s390x.go │ │ │ ├── cpu_s390x.s │ │ │ ├── cpu_wasm.go │ │ │ ├── cpu_x86.go │ │ │ ├── cpu_zos.go │ │ │ ├── cpu_zos_s390x.go │ │ │ ├── endian_big.go │ │ │ ├── endian_little.go │ │ │ ├── hwcap_linux.go │ │ │ ├── parse.go │ │ │ ├── proc_cpuinfo_linux.go │ │ │ ├── runtime_auxv.go │ │ │ ├── runtime_auxv_go121.go │ │ │ ├── syscall_aix_gccgo.go │ │ │ ├── syscall_aix_ppc64_gc.go │ │ │ └── syscall_darwin_x86_gc.go │ │ ├── execabs/ │ │ │ ├── execabs.go │ │ │ ├── execabs_go118.go │ │ │ └── execabs_go119.go │ │ ├── unix/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── affinity_linux.go │ │ │ ├── aliases.go │ │ │ ├── asm_aix_ppc64.s │ │ │ ├── asm_bsd_386.s │ │ │ ├── asm_bsd_amd64.s │ │ │ ├── asm_bsd_arm.s │ │ │ ├── asm_bsd_arm64.s │ │ │ ├── asm_bsd_ppc64.s │ │ │ ├── asm_bsd_riscv64.s │ │ │ ├── asm_linux_386.s │ │ │ ├── asm_linux_amd64.s │ │ │ ├── asm_linux_arm.s │ │ │ ├── asm_linux_arm64.s │ │ │ ├── asm_linux_loong64.s │ │ │ ├── asm_linux_mips64x.s │ │ │ ├── asm_linux_mipsx.s │ │ │ ├── asm_linux_ppc64x.s │ │ │ ├── asm_linux_riscv64.s │ │ │ ├── asm_linux_s390x.s │ │ │ ├── asm_openbsd_mips64.s │ │ │ ├── asm_solaris_amd64.s │ │ │ ├── asm_zos_s390x.s │ │ │ ├── auxv.go │ │ │ ├── auxv_unsupported.go │ │ │ ├── bluetooth_linux.go │ │ │ ├── bpxsvc_zos.go │ │ │ ├── bpxsvc_zos.s │ │ │ ├── cap_freebsd.go │ │ │ ├── constants.go │ │ │ ├── dev_aix_ppc.go │ │ │ ├── dev_aix_ppc64.go │ │ │ ├── dev_darwin.go │ │ │ ├── dev_dragonfly.go │ │ │ ├── dev_freebsd.go │ │ │ ├── dev_linux.go │ │ │ ├── dev_netbsd.go │ │ │ ├── dev_openbsd.go │ │ │ ├── dev_zos.go │ │ │ ├── dirent.go │ │ │ ├── endian_big.go │ │ │ ├── endian_little.go │ │ │ ├── env_unix.go │ │ │ ├── fcntl.go │ │ │ ├── fcntl_darwin.go │ │ │ ├── fcntl_linux_32bit.go │ │ │ ├── fdset.go │ │ │ ├── gccgo.go │ │ │ ├── gccgo_c.c │ │ │ ├── gccgo_linux_amd64.go │ │ │ ├── ifreq_linux.go │ │ │ ├── ioctl_linux.go │ │ │ ├── ioctl_signed.go │ │ │ ├── ioctl_unsigned.go │ │ │ ├── ioctl_zos.go │ │ │ ├── mkall.sh │ │ │ ├── mkerrors.sh │ │ │ ├── mmap_nomremap.go │ │ │ ├── mremap.go │ │ │ ├── pagesize_unix.go │ │ │ ├── pledge_openbsd.go │ │ │ ├── ptrace_darwin.go │ │ │ ├── ptrace_ios.go │ │ │ ├── race.go │ │ │ ├── race0.go │ │ │ ├── readdirent_getdents.go │ │ │ ├── readdirent_getdirentries.go │ │ │ ├── sockcmsg_dragonfly.go │ │ │ ├── sockcmsg_linux.go │ │ │ ├── sockcmsg_unix.go │ │ │ ├── sockcmsg_unix_other.go │ │ │ ├── sockcmsg_zos.go │ │ │ ├── symaddr_zos_s390x.s │ │ │ ├── syscall.go │ │ │ ├── syscall_aix.go │ │ │ ├── syscall_aix_ppc.go │ │ │ ├── syscall_aix_ppc64.go │ │ │ ├── syscall_bsd.go │ │ │ ├── syscall_darwin.go │ │ │ ├── syscall_darwin_amd64.go │ │ │ ├── syscall_darwin_arm64.go │ │ │ ├── syscall_darwin_libSystem.go │ │ │ ├── syscall_dragonfly.go │ │ │ ├── syscall_dragonfly_amd64.go │ │ │ ├── syscall_freebsd.go │ │ │ ├── syscall_freebsd_386.go │ │ │ ├── syscall_freebsd_amd64.go │ │ │ ├── syscall_freebsd_arm.go │ │ │ ├── syscall_freebsd_arm64.go │ │ │ ├── syscall_freebsd_riscv64.go │ │ │ ├── syscall_hurd.go │ │ │ ├── syscall_hurd_386.go │ │ │ ├── syscall_illumos.go │ │ │ ├── syscall_linux.go │ │ │ ├── syscall_linux_386.go │ │ │ ├── syscall_linux_alarm.go │ │ │ ├── syscall_linux_amd64.go │ │ │ ├── syscall_linux_amd64_gc.go │ │ │ ├── syscall_linux_arm.go │ │ │ ├── syscall_linux_arm64.go │ │ │ ├── syscall_linux_gc.go │ │ │ ├── syscall_linux_gc_386.go │ │ │ ├── syscall_linux_gc_arm.go │ │ │ ├── syscall_linux_gccgo_386.go │ │ │ ├── syscall_linux_gccgo_arm.go │ │ │ ├── syscall_linux_loong64.go │ │ │ ├── syscall_linux_mips64x.go │ │ │ ├── syscall_linux_mipsx.go │ │ │ ├── syscall_linux_ppc.go │ │ │ ├── syscall_linux_ppc64x.go │ │ │ ├── syscall_linux_riscv64.go │ │ │ ├── syscall_linux_s390x.go │ │ │ ├── syscall_linux_sparc64.go │ │ │ ├── syscall_netbsd.go │ │ │ ├── syscall_netbsd_386.go │ │ │ ├── syscall_netbsd_amd64.go │ │ │ ├── syscall_netbsd_arm.go │ │ │ ├── syscall_netbsd_arm64.go │ │ │ ├── syscall_openbsd.go │ │ │ ├── syscall_openbsd_386.go │ │ │ ├── syscall_openbsd_amd64.go │ │ │ ├── syscall_openbsd_arm.go │ │ │ ├── syscall_openbsd_arm64.go │ │ │ ├── syscall_openbsd_libc.go │ │ │ ├── syscall_openbsd_mips64.go │ │ │ ├── syscall_openbsd_ppc64.go │ │ │ ├── syscall_openbsd_riscv64.go │ │ │ ├── syscall_solaris.go │ │ │ ├── syscall_solaris_amd64.go │ │ │ ├── syscall_unix.go │ │ │ ├── syscall_unix_gc.go │ │ │ ├── syscall_unix_gc_ppc64x.go │ │ │ ├── syscall_zos_s390x.go │ │ │ ├── sysvshm_linux.go │ │ │ ├── sysvshm_unix.go │ │ │ ├── sysvshm_unix_other.go │ │ │ ├── timestruct.go │ │ │ ├── unveil_openbsd.go │ │ │ ├── vgetrandom_linux.go │ │ │ ├── vgetrandom_unsupported.go │ │ │ ├── xattr_bsd.go │ │ │ ├── zerrors_aix_ppc.go │ │ │ ├── zerrors_aix_ppc64.go │ │ │ ├── zerrors_darwin_amd64.go │ │ │ ├── zerrors_darwin_arm64.go │ │ │ ├── zerrors_dragonfly_amd64.go │ │ │ ├── zerrors_freebsd_386.go │ │ │ ├── zerrors_freebsd_amd64.go │ │ │ ├── zerrors_freebsd_arm.go │ │ │ ├── zerrors_freebsd_arm64.go │ │ │ ├── zerrors_freebsd_riscv64.go │ │ │ ├── zerrors_linux.go │ │ │ ├── zerrors_linux_386.go │ │ │ ├── zerrors_linux_amd64.go │ │ │ ├── zerrors_linux_arm.go │ │ │ ├── zerrors_linux_arm64.go │ │ │ ├── zerrors_linux_loong64.go │ │ │ ├── zerrors_linux_mips.go │ │ │ ├── zerrors_linux_mips64.go │ │ │ ├── zerrors_linux_mips64le.go │ │ │ ├── zerrors_linux_mipsle.go │ │ │ ├── zerrors_linux_ppc.go │ │ │ ├── zerrors_linux_ppc64.go │ │ │ ├── zerrors_linux_ppc64le.go │ │ │ ├── zerrors_linux_riscv64.go │ │ │ ├── zerrors_linux_s390x.go │ │ │ ├── zerrors_linux_sparc64.go │ │ │ ├── zerrors_netbsd_386.go │ │ │ ├── zerrors_netbsd_amd64.go │ │ │ ├── zerrors_netbsd_arm.go │ │ │ ├── zerrors_netbsd_arm64.go │ │ │ ├── zerrors_openbsd_386.go │ │ │ ├── zerrors_openbsd_amd64.go │ │ │ ├── zerrors_openbsd_arm.go │ │ │ ├── zerrors_openbsd_arm64.go │ │ │ ├── zerrors_openbsd_mips64.go │ │ │ ├── zerrors_openbsd_ppc64.go │ │ │ ├── zerrors_openbsd_riscv64.go │ │ │ ├── zerrors_solaris_amd64.go │ │ │ ├── zerrors_zos_s390x.go │ │ │ ├── zptrace_armnn_linux.go │ │ │ ├── zptrace_linux_arm64.go │ │ │ ├── zptrace_mipsnn_linux.go │ │ │ ├── zptrace_mipsnnle_linux.go │ │ │ ├── zptrace_x86_linux.go │ │ │ ├── zsymaddr_zos_s390x.s │ │ │ ├── zsyscall_aix_ppc.go │ │ │ ├── zsyscall_aix_ppc64.go │ │ │ ├── zsyscall_aix_ppc64_gc.go │ │ │ ├── zsyscall_aix_ppc64_gccgo.go │ │ │ ├── zsyscall_darwin_amd64.go │ │ │ ├── zsyscall_darwin_amd64.s │ │ │ ├── zsyscall_darwin_arm64.go │ │ │ ├── zsyscall_darwin_arm64.s │ │ │ ├── zsyscall_dragonfly_amd64.go │ │ │ ├── zsyscall_freebsd_386.go │ │ │ ├── zsyscall_freebsd_amd64.go │ │ │ ├── zsyscall_freebsd_arm.go │ │ │ ├── zsyscall_freebsd_arm64.go │ │ │ ├── zsyscall_freebsd_riscv64.go │ │ │ ├── zsyscall_illumos_amd64.go │ │ │ ├── zsyscall_linux.go │ │ │ ├── zsyscall_linux_386.go │ │ │ ├── zsyscall_linux_amd64.go │ │ │ ├── zsyscall_linux_arm.go │ │ │ ├── zsyscall_linux_arm64.go │ │ │ ├── zsyscall_linux_loong64.go │ │ │ ├── zsyscall_linux_mips.go │ │ │ ├── zsyscall_linux_mips64.go │ │ │ ├── zsyscall_linux_mips64le.go │ │ │ ├── zsyscall_linux_mipsle.go │ │ │ ├── zsyscall_linux_ppc.go │ │ │ ├── zsyscall_linux_ppc64.go │ │ │ ├── zsyscall_linux_ppc64le.go │ │ │ ├── zsyscall_linux_riscv64.go │ │ │ ├── zsyscall_linux_s390x.go │ │ │ ├── zsyscall_linux_sparc64.go │ │ │ ├── zsyscall_netbsd_386.go │ │ │ ├── zsyscall_netbsd_amd64.go │ │ │ ├── zsyscall_netbsd_arm.go │ │ │ ├── zsyscall_netbsd_arm64.go │ │ │ ├── zsyscall_openbsd_386.go │ │ │ ├── zsyscall_openbsd_386.s │ │ │ ├── zsyscall_openbsd_amd64.go │ │ │ ├── zsyscall_openbsd_amd64.s │ │ │ ├── zsyscall_openbsd_arm.go │ │ │ ├── zsyscall_openbsd_arm.s │ │ │ ├── zsyscall_openbsd_arm64.go │ │ │ ├── zsyscall_openbsd_arm64.s │ │ │ ├── zsyscall_openbsd_mips64.go │ │ │ ├── zsyscall_openbsd_mips64.s │ │ │ ├── zsyscall_openbsd_ppc64.go │ │ │ ├── zsyscall_openbsd_ppc64.s │ │ │ ├── zsyscall_openbsd_riscv64.go │ │ │ ├── zsyscall_openbsd_riscv64.s │ │ │ ├── zsyscall_solaris_amd64.go │ │ │ ├── zsyscall_zos_s390x.go │ │ │ ├── zsysctl_openbsd_386.go │ │ │ ├── zsysctl_openbsd_amd64.go │ │ │ ├── zsysctl_openbsd_arm.go │ │ │ ├── zsysctl_openbsd_arm64.go │ │ │ ├── zsysctl_openbsd_mips64.go │ │ │ ├── zsysctl_openbsd_ppc64.go │ │ │ ├── zsysctl_openbsd_riscv64.go │ │ │ ├── zsysnum_darwin_amd64.go │ │ │ ├── zsysnum_darwin_arm64.go │ │ │ ├── zsysnum_dragonfly_amd64.go │ │ │ ├── zsysnum_freebsd_386.go │ │ │ ├── zsysnum_freebsd_amd64.go │ │ │ ├── zsysnum_freebsd_arm.go │ │ │ ├── zsysnum_freebsd_arm64.go │ │ │ ├── zsysnum_freebsd_riscv64.go │ │ │ ├── zsysnum_linux_386.go │ │ │ ├── zsysnum_linux_amd64.go │ │ │ ├── zsysnum_linux_arm.go │ │ │ ├── zsysnum_linux_arm64.go │ │ │ ├── zsysnum_linux_loong64.go │ │ │ ├── zsysnum_linux_mips.go │ │ │ ├── zsysnum_linux_mips64.go │ │ │ ├── zsysnum_linux_mips64le.go │ │ │ ├── zsysnum_linux_mipsle.go │ │ │ ├── zsysnum_linux_ppc.go │ │ │ ├── zsysnum_linux_ppc64.go │ │ │ ├── zsysnum_linux_ppc64le.go │ │ │ ├── zsysnum_linux_riscv64.go │ │ │ ├── zsysnum_linux_s390x.go │ │ │ ├── zsysnum_linux_sparc64.go │ │ │ ├── zsysnum_netbsd_386.go │ │ │ ├── zsysnum_netbsd_amd64.go │ │ │ ├── zsysnum_netbsd_arm.go │ │ │ ├── zsysnum_netbsd_arm64.go │ │ │ ├── zsysnum_openbsd_386.go │ │ │ ├── zsysnum_openbsd_amd64.go │ │ │ ├── zsysnum_openbsd_arm.go │ │ │ ├── zsysnum_openbsd_arm64.go │ │ │ ├── zsysnum_openbsd_mips64.go │ │ │ ├── zsysnum_openbsd_ppc64.go │ │ │ ├── zsysnum_openbsd_riscv64.go │ │ │ ├── zsysnum_zos_s390x.go │ │ │ ├── ztypes_aix_ppc.go │ │ │ ├── ztypes_aix_ppc64.go │ │ │ ├── ztypes_darwin_amd64.go │ │ │ ├── ztypes_darwin_arm64.go │ │ │ ├── ztypes_dragonfly_amd64.go │ │ │ ├── ztypes_freebsd_386.go │ │ │ ├── ztypes_freebsd_amd64.go │ │ │ ├── ztypes_freebsd_arm.go │ │ │ ├── ztypes_freebsd_arm64.go │ │ │ ├── ztypes_freebsd_riscv64.go │ │ │ ├── ztypes_linux.go │ │ │ ├── ztypes_linux_386.go │ │ │ ├── ztypes_linux_amd64.go │ │ │ ├── ztypes_linux_arm.go │ │ │ ├── ztypes_linux_arm64.go │ │ │ ├── ztypes_linux_loong64.go │ │ │ ├── ztypes_linux_mips.go │ │ │ ├── ztypes_linux_mips64.go │ │ │ ├── ztypes_linux_mips64le.go │ │ │ ├── ztypes_linux_mipsle.go │ │ │ ├── ztypes_linux_ppc.go │ │ │ ├── ztypes_linux_ppc64.go │ │ │ ├── ztypes_linux_ppc64le.go │ │ │ ├── ztypes_linux_riscv64.go │ │ │ ├── ztypes_linux_s390x.go │ │ │ ├── ztypes_linux_sparc64.go │ │ │ ├── ztypes_netbsd_386.go │ │ │ ├── ztypes_netbsd_amd64.go │ │ │ ├── ztypes_netbsd_arm.go │ │ │ ├── ztypes_netbsd_arm64.go │ │ │ ├── ztypes_openbsd_386.go │ │ │ ├── ztypes_openbsd_amd64.go │ │ │ ├── ztypes_openbsd_arm.go │ │ │ ├── ztypes_openbsd_arm64.go │ │ │ ├── ztypes_openbsd_mips64.go │ │ │ ├── ztypes_openbsd_ppc64.go │ │ │ ├── ztypes_openbsd_riscv64.go │ │ │ ├── ztypes_solaris_amd64.go │ │ │ └── ztypes_zos_s390x.go │ │ └── windows/ │ │ ├── aliases.go │ │ ├── dll_windows.go │ │ ├── env_windows.go │ │ ├── eventlog.go │ │ ├── exec_windows.go │ │ ├── memory_windows.go │ │ ├── mkerrors.bash │ │ ├── mkknownfolderids.bash │ │ ├── mksyscall.go │ │ ├── race.go │ │ ├── race0.go │ │ ├── registry/ │ │ │ ├── key.go │ │ │ ├── mksyscall.go │ │ │ ├── syscall.go │ │ │ ├── value.go │ │ │ └── zsyscall_windows.go │ │ ├── security_windows.go │ │ ├── service.go │ │ ├── setupapi_windows.go │ │ ├── str.go │ │ ├── syscall.go │ │ ├── syscall_windows.go │ │ ├── types_windows.go │ │ ├── types_windows_386.go │ │ ├── types_windows_amd64.go │ │ ├── types_windows_arm.go │ │ ├── types_windows_arm64.go │ │ ├── zerrors_windows.go │ │ ├── zknownfolderids_windows.go │ │ └── zsyscall_windows.go │ ├── text/ │ │ ├── LICENSE │ │ ├── PATENTS │ │ ├── encoding/ │ │ │ ├── encoding.go │ │ │ ├── internal/ │ │ │ │ ├── identifier/ │ │ │ │ │ ├── identifier.go │ │ │ │ │ └── mib.go │ │ │ │ └── internal.go │ │ │ └── unicode/ │ │ │ ├── override.go │ │ │ └── unicode.go │ │ ├── internal/ │ │ │ └── utf8internal/ │ │ │ └── utf8internal.go │ │ ├── runes/ │ │ │ ├── cond.go │ │ │ └── runes.go │ │ ├── secure/ │ │ │ └── bidirule/ │ │ │ ├── bidirule.go │ │ │ ├── bidirule10.0.0.go │ │ │ └── bidirule9.0.0.go │ │ ├── transform/ │ │ │ └── transform.go │ │ └── unicode/ │ │ ├── bidi/ │ │ │ ├── bidi.go │ │ │ ├── bracket.go │ │ │ ├── core.go │ │ │ ├── prop.go │ │ │ ├── tables10.0.0.go │ │ │ ├── tables11.0.0.go │ │ │ ├── tables12.0.0.go │ │ │ ├── tables13.0.0.go │ │ │ ├── tables15.0.0.go │ │ │ ├── tables9.0.0.go │ │ │ └── trieval.go │ │ └── norm/ │ │ ├── composition.go │ │ ├── forminfo.go │ │ ├── input.go │ │ ├── iter.go │ │ ├── normalize.go │ │ ├── readwriter.go │ │ ├── tables10.0.0.go │ │ ├── tables11.0.0.go │ │ ├── tables12.0.0.go │ │ ├── tables13.0.0.go │ │ ├── tables15.0.0.go │ │ ├── tables9.0.0.go │ │ ├── transform.go │ │ └── trie.go │ └── time/ │ ├── LICENSE │ ├── PATENTS │ └── rate/ │ ├── rate.go │ └── sometimes.go ├── google.golang.org/ │ ├── api/ │ │ ├── AUTHORS │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ ├── googleapi/ │ │ │ ├── googleapi.go │ │ │ ├── transport/ │ │ │ │ └── apikey.go │ │ │ └── types.go │ │ ├── iamcredentials/ │ │ │ └── v1/ │ │ │ ├── iamcredentials-api.json │ │ │ └── iamcredentials-gen.go │ │ ├── internal/ │ │ │ ├── cba.go │ │ │ ├── cert/ │ │ │ │ ├── default_cert.go │ │ │ │ ├── enterprise_cert.go │ │ │ │ └── secureconnect_cert.go │ │ │ ├── conn_pool.go │ │ │ ├── creds.go │ │ │ ├── gensupport/ │ │ │ │ ├── buffer.go │ │ │ │ ├── doc.go │ │ │ │ ├── error.go │ │ │ │ ├── json.go │ │ │ │ ├── jsonfloat.go │ │ │ │ ├── media.go │ │ │ │ ├── params.go │ │ │ │ ├── resumable.go │ │ │ │ ├── retry.go │ │ │ │ ├── send.go │ │ │ │ └── version.go │ │ │ ├── impersonate/ │ │ │ │ └── impersonate.go │ │ │ ├── s2a.go │ │ │ ├── settings.go │ │ │ ├── third_party/ │ │ │ │ └── uritemplates/ │ │ │ │ ├── LICENSE │ │ │ │ ├── METADATA │ │ │ │ ├── uritemplates.go │ │ │ │ └── utils.go │ │ │ └── version.go │ │ ├── iterator/ │ │ │ └── iterator.go │ │ ├── option/ │ │ │ ├── internaloption/ │ │ │ │ └── internaloption.go │ │ │ └── option.go │ │ ├── storage/ │ │ │ └── v1/ │ │ │ ├── storage-api.json │ │ │ └── storage-gen.go │ │ └── transport/ │ │ ├── dial.go │ │ ├── doc.go │ │ ├── grpc/ │ │ │ ├── dial.go │ │ │ ├── dial_socketopt.go │ │ │ └── pool.go │ │ └── http/ │ │ └── dial.go │ ├── genproto/ │ │ ├── LICENSE │ │ └── googleapis/ │ │ ├── api/ │ │ │ ├── LICENSE │ │ │ ├── annotations/ │ │ │ │ ├── annotations.pb.go │ │ │ │ ├── client.pb.go │ │ │ │ ├── field_behavior.pb.go │ │ │ │ ├── field_info.pb.go │ │ │ │ ├── http.pb.go │ │ │ │ ├── resource.pb.go │ │ │ │ └── routing.pb.go │ │ │ ├── distribution/ │ │ │ │ └── distribution.pb.go │ │ │ ├── expr/ │ │ │ │ └── v1alpha1/ │ │ │ │ ├── checked.pb.go │ │ │ │ ├── eval.pb.go │ │ │ │ ├── explain.pb.go │ │ │ │ ├── syntax.pb.go │ │ │ │ └── value.pb.go │ │ │ ├── label/ │ │ │ │ └── label.pb.go │ │ │ ├── launch_stage.pb.go │ │ │ ├── metric/ │ │ │ │ └── metric.pb.go │ │ │ └── monitoredres/ │ │ │ └── monitored_resource.pb.go │ │ ├── rpc/ │ │ │ ├── LICENSE │ │ │ ├── code/ │ │ │ │ └── code.pb.go │ │ │ ├── errdetails/ │ │ │ │ └── error_details.pb.go │ │ │ └── status/ │ │ │ └── status.pb.go │ │ └── type/ │ │ ├── calendarperiod/ │ │ │ └── calendar_period.pb.go │ │ ├── date/ │ │ │ └── date.pb.go │ │ ├── expr/ │ │ │ └── expr.pb.go │ │ └── timeofday/ │ │ └── timeofday.pb.go │ ├── grpc/ │ │ ├── AUTHORS │ │ ├── CODE-OF-CONDUCT.md │ │ ├── CONTRIBUTING.md │ │ ├── GOVERNANCE.md │ │ ├── LICENSE │ │ ├── MAINTAINERS.md │ │ ├── Makefile │ │ ├── NOTICE.txt │ │ ├── README.md │ │ ├── SECURITY.md │ │ ├── attributes/ │ │ │ └── attributes.go │ │ ├── authz/ │ │ │ └── audit/ │ │ │ ├── audit_logger.go │ │ │ └── stdout/ │ │ │ └── stdout_logger.go │ │ ├── backoff/ │ │ │ └── backoff.go │ │ ├── backoff.go │ │ ├── balancer/ │ │ │ ├── balancer.go │ │ │ ├── base/ │ │ │ │ ├── balancer.go │ │ │ │ └── base.go │ │ │ ├── conn_state_evaluator.go │ │ │ ├── endpointsharding/ │ │ │ │ └── endpointsharding.go │ │ │ ├── grpclb/ │ │ │ │ ├── grpc_lb_v1/ │ │ │ │ │ ├── load_balancer.pb.go │ │ │ │ │ └── load_balancer_grpc.pb.go │ │ │ │ ├── grpclb.go │ │ │ │ ├── grpclb_config.go │ │ │ │ ├── grpclb_picker.go │ │ │ │ ├── grpclb_remote_balancer.go │ │ │ │ ├── grpclb_util.go │ │ │ │ └── state/ │ │ │ │ └── state.go │ │ │ ├── lazy/ │ │ │ │ └── lazy.go │ │ │ ├── leastrequest/ │ │ │ │ └── leastrequest.go │ │ │ ├── pickfirst/ │ │ │ │ ├── internal/ │ │ │ │ │ └── internal.go │ │ │ │ ├── pickfirst.go │ │ │ │ └── pickfirstleaf/ │ │ │ │ └── pickfirstleaf.go │ │ │ ├── rls/ │ │ │ │ ├── balancer.go │ │ │ │ ├── cache.go │ │ │ │ ├── child_policy.go │ │ │ │ ├── config.go │ │ │ │ ├── control_channel.go │ │ │ │ ├── internal/ │ │ │ │ │ ├── adaptive/ │ │ │ │ │ │ ├── adaptive.go │ │ │ │ │ │ └── lookback.go │ │ │ │ │ └── keys/ │ │ │ │ │ └── builder.go │ │ │ │ └── picker.go │ │ │ ├── roundrobin/ │ │ │ │ └── roundrobin.go │ │ │ ├── subconn.go │ │ │ ├── weightedroundrobin/ │ │ │ │ ├── balancer.go │ │ │ │ ├── config.go │ │ │ │ ├── internal/ │ │ │ │ │ └── internal.go │ │ │ │ ├── logging.go │ │ │ │ └── scheduler.go │ │ │ └── weightedtarget/ │ │ │ ├── logging.go │ │ │ ├── weightedaggregator/ │ │ │ │ └── aggregator.go │ │ │ ├── weightedtarget.go │ │ │ └── weightedtarget_config.go │ │ ├── balancer_wrapper.go │ │ ├── binarylog/ │ │ │ └── grpc_binarylog_v1/ │ │ │ └── binarylog.pb.go │ │ ├── call.go │ │ ├── channelz/ │ │ │ └── channelz.go │ │ ├── clientconn.go │ │ ├── codec.go │ │ ├── codes/ │ │ │ ├── code_string.go │ │ │ └── codes.go │ │ ├── connectivity/ │ │ │ └── connectivity.go │ │ ├── credentials/ │ │ │ ├── alts/ │ │ │ │ ├── alts.go │ │ │ │ ├── internal/ │ │ │ │ │ ├── authinfo/ │ │ │ │ │ │ └── authinfo.go │ │ │ │ │ ├── common.go │ │ │ │ │ ├── conn/ │ │ │ │ │ │ ├── aeadrekey.go │ │ │ │ │ │ ├── aes128gcm.go │ │ │ │ │ │ ├── aes128gcmrekey.go │ │ │ │ │ │ ├── common.go │ │ │ │ │ │ ├── counter.go │ │ │ │ │ │ ├── record.go │ │ │ │ │ │ └── utils.go │ │ │ │ │ ├── handshaker/ │ │ │ │ │ │ ├── handshaker.go │ │ │ │ │ │ └── service/ │ │ │ │ │ │ └── service.go │ │ │ │ │ └── proto/ │ │ │ │ │ └── grpc_gcp/ │ │ │ │ │ ├── altscontext.pb.go │ │ │ │ │ ├── handshaker.pb.go │ │ │ │ │ ├── handshaker_grpc.pb.go │ │ │ │ │ └── transport_security_common.pb.go │ │ │ │ └── utils.go │ │ │ ├── credentials.go │ │ │ ├── google/ │ │ │ │ ├── google.go │ │ │ │ └── xds.go │ │ │ ├── insecure/ │ │ │ │ └── insecure.go │ │ │ ├── oauth/ │ │ │ │ └── oauth.go │ │ │ ├── tls/ │ │ │ │ └── certprovider/ │ │ │ │ ├── distributor.go │ │ │ │ ├── pemfile/ │ │ │ │ │ ├── builder.go │ │ │ │ │ └── watcher.go │ │ │ │ ├── provider.go │ │ │ │ └── store.go │ │ │ └── tls.go │ │ ├── dialoptions.go │ │ ├── doc.go │ │ ├── encoding/ │ │ │ ├── encoding.go │ │ │ ├── encoding_v2.go │ │ │ ├── gzip/ │ │ │ │ └── gzip.go │ │ │ └── proto/ │ │ │ └── proto.go │ │ ├── experimental/ │ │ │ ├── opentelemetry/ │ │ │ │ └── trace_options.go │ │ │ └── stats/ │ │ │ ├── metricregistry.go │ │ │ └── metrics.go │ │ ├── grpclog/ │ │ │ ├── component.go │ │ │ ├── grpclog.go │ │ │ ├── internal/ │ │ │ │ ├── grpclog.go │ │ │ │ ├── logger.go │ │ │ │ └── loggerv2.go │ │ │ ├── logger.go │ │ │ └── loggerv2.go │ │ ├── health/ │ │ │ └── grpc_health_v1/ │ │ │ ├── health.pb.go │ │ │ └── health_grpc.pb.go │ │ ├── interceptor.go │ │ ├── internal/ │ │ │ ├── admin/ │ │ │ │ └── admin.go │ │ │ ├── backoff/ │ │ │ │ └── backoff.go │ │ │ ├── balancer/ │ │ │ │ ├── gracefulswitch/ │ │ │ │ │ ├── config.go │ │ │ │ │ └── gracefulswitch.go │ │ │ │ ├── nop/ │ │ │ │ │ └── nop.go │ │ │ │ └── weight/ │ │ │ │ └── weight.go │ │ │ ├── balancergroup/ │ │ │ │ ├── balancergroup.go │ │ │ │ └── balancerstateaggregator.go │ │ │ ├── balancerload/ │ │ │ │ └── load.go │ │ │ ├── binarylog/ │ │ │ │ ├── binarylog.go │ │ │ │ ├── binarylog_testutil.go │ │ │ │ ├── env_config.go │ │ │ │ ├── method_logger.go │ │ │ │ └── sink.go │ │ │ ├── buffer/ │ │ │ │ └── unbounded.go │ │ │ ├── cache/ │ │ │ │ └── timeoutCache.go │ │ │ ├── channelz/ │ │ │ │ ├── channel.go │ │ │ │ ├── channelmap.go │ │ │ │ ├── funcs.go │ │ │ │ ├── logging.go │ │ │ │ ├── server.go │ │ │ │ ├── socket.go │ │ │ │ ├── subchannel.go │ │ │ │ ├── syscall_linux.go │ │ │ │ ├── syscall_nonlinux.go │ │ │ │ └── trace.go │ │ │ ├── credentials/ │ │ │ │ ├── credentials.go │ │ │ │ ├── spiffe/ │ │ │ │ │ └── spiffe.go │ │ │ │ ├── spiffe.go │ │ │ │ ├── syscallconn.go │ │ │ │ ├── util.go │ │ │ │ └── xds/ │ │ │ │ └── handshake_info.go │ │ │ ├── envconfig/ │ │ │ │ ├── envconfig.go │ │ │ │ ├── observability.go │ │ │ │ └── xds.go │ │ │ ├── experimental.go │ │ │ ├── googlecloud/ │ │ │ │ ├── googlecloud.go │ │ │ │ ├── manufacturer.go │ │ │ │ ├── manufacturer_linux.go │ │ │ │ └── manufacturer_windows.go │ │ │ ├── grpclog/ │ │ │ │ └── prefix_logger.go │ │ │ ├── grpcsync/ │ │ │ │ ├── callback_serializer.go │ │ │ │ ├── event.go │ │ │ │ └── pubsub.go │ │ │ ├── grpcutil/ │ │ │ │ ├── compressor.go │ │ │ │ ├── encode_duration.go │ │ │ │ ├── grpcutil.go │ │ │ │ ├── metadata.go │ │ │ │ ├── method.go │ │ │ │ └── regex.go │ │ │ ├── hierarchy/ │ │ │ │ └── hierarchy.go │ │ │ ├── idle/ │ │ │ │ └── idle.go │ │ │ ├── internal.go │ │ │ ├── metadata/ │ │ │ │ └── metadata.go │ │ │ ├── pretty/ │ │ │ │ └── pretty.go │ │ │ ├── proto/ │ │ │ │ └── grpc_lookup_v1/ │ │ │ │ ├── rls.pb.go │ │ │ │ ├── rls_config.pb.go │ │ │ │ └── rls_grpc.pb.go │ │ │ ├── proxyattributes/ │ │ │ │ └── proxyattributes.go │ │ │ ├── resolver/ │ │ │ │ ├── config_selector.go │ │ │ │ ├── delegatingresolver/ │ │ │ │ │ └── delegatingresolver.go │ │ │ │ ├── dns/ │ │ │ │ │ ├── dns_resolver.go │ │ │ │ │ └── internal/ │ │ │ │ │ └── internal.go │ │ │ │ ├── passthrough/ │ │ │ │ │ └── passthrough.go │ │ │ │ └── unix/ │ │ │ │ └── unix.go │ │ │ ├── serviceconfig/ │ │ │ │ ├── duration.go │ │ │ │ └── serviceconfig.go │ │ │ ├── stats/ │ │ │ │ ├── labels.go │ │ │ │ └── metrics_recorder_list.go │ │ │ ├── status/ │ │ │ │ └── status.go │ │ │ ├── syscall/ │ │ │ │ ├── syscall_linux.go │ │ │ │ └── syscall_nonlinux.go │ │ │ ├── tcp_keepalive_others.go │ │ │ ├── tcp_keepalive_unix.go │ │ │ ├── tcp_keepalive_windows.go │ │ │ ├── transport/ │ │ │ │ ├── bdp_estimator.go │ │ │ │ ├── client_stream.go │ │ │ │ ├── controlbuf.go │ │ │ │ ├── defaults.go │ │ │ │ ├── flowcontrol.go │ │ │ │ ├── handler_server.go │ │ │ │ ├── http2_client.go │ │ │ │ ├── http2_server.go │ │ │ │ ├── http_util.go │ │ │ │ ├── logging.go │ │ │ │ ├── networktype/ │ │ │ │ │ └── networktype.go │ │ │ │ ├── proxy.go │ │ │ │ ├── server_stream.go │ │ │ │ └── transport.go │ │ │ ├── wrr/ │ │ │ │ ├── edf.go │ │ │ │ ├── random.go │ │ │ │ └── wrr.go │ │ │ └── xds/ │ │ │ ├── bootstrap/ │ │ │ │ ├── bootstrap.go │ │ │ │ ├── logging.go │ │ │ │ ├── template.go │ │ │ │ └── tlscreds/ │ │ │ │ └── bundle.go │ │ │ ├── matcher/ │ │ │ │ ├── matcher_header.go │ │ │ │ └── string_matcher.go │ │ │ ├── rbac/ │ │ │ │ ├── converter.go │ │ │ │ ├── matchers.go │ │ │ │ └── rbac_engine.go │ │ │ └── xds.go │ │ ├── keepalive/ │ │ │ └── keepalive.go │ │ ├── mem/ │ │ │ ├── buffer_pool.go │ │ │ ├── buffer_slice.go │ │ │ └── buffers.go │ │ ├── metadata/ │ │ │ └── metadata.go │ │ ├── orca/ │ │ │ ├── call_metrics.go │ │ │ ├── internal/ │ │ │ │ └── internal.go │ │ │ ├── orca.go │ │ │ ├── producer.go │ │ │ ├── server_metrics.go │ │ │ └── service.go │ │ ├── peer/ │ │ │ └── peer.go │ │ ├── picker_wrapper.go │ │ ├── preloader.go │ │ ├── resolver/ │ │ │ ├── dns/ │ │ │ │ └── dns_resolver.go │ │ │ ├── manual/ │ │ │ │ └── manual.go │ │ │ ├── map.go │ │ │ ├── resolver.go │ │ │ └── ringhash/ │ │ │ └── attr.go │ │ ├── resolver_wrapper.go │ │ ├── rpc_util.go │ │ ├── server.go │ │ ├── service_config.go │ │ ├── serviceconfig/ │ │ │ └── serviceconfig.go │ │ ├── stats/ │ │ │ ├── handlers.go │ │ │ ├── metrics.go │ │ │ ├── opentelemetry/ │ │ │ │ ├── client_metrics.go │ │ │ │ ├── client_tracing.go │ │ │ │ ├── grpc_trace_bin_propagator.go │ │ │ │ ├── internal/ │ │ │ │ │ ├── pluginoption.go │ │ │ │ │ └── tracing/ │ │ │ │ │ └── carrier.go │ │ │ │ ├── opentelemetry.go │ │ │ │ ├── server_metrics.go │ │ │ │ ├── server_tracing.go │ │ │ │ └── trace.go │ │ │ └── stats.go │ │ ├── status/ │ │ │ └── status.go │ │ ├── stream.go │ │ ├── stream_interfaces.go │ │ ├── tap/ │ │ │ └── tap.go │ │ ├── trace.go │ │ ├── trace_notrace.go │ │ ├── trace_withtrace.go │ │ ├── version.go │ │ └── xds/ │ │ ├── bootstrap/ │ │ │ ├── bootstrap.go │ │ │ └── credentials.go │ │ ├── csds/ │ │ │ └── csds.go │ │ ├── googledirectpath/ │ │ │ ├── googlec2p.go │ │ │ └── utils.go │ │ ├── internal/ │ │ │ ├── balancer/ │ │ │ │ ├── balancer.go │ │ │ │ ├── cdsbalancer/ │ │ │ │ │ ├── cdsbalancer.go │ │ │ │ │ ├── cluster_watcher.go │ │ │ │ │ └── logging.go │ │ │ │ ├── clusterimpl/ │ │ │ │ │ ├── clusterimpl.go │ │ │ │ │ ├── config.go │ │ │ │ │ ├── logging.go │ │ │ │ │ └── picker.go │ │ │ │ ├── clustermanager/ │ │ │ │ │ ├── balancerstateaggregator.go │ │ │ │ │ ├── clustermanager.go │ │ │ │ │ ├── config.go │ │ │ │ │ └── picker.go │ │ │ │ ├── clusterresolver/ │ │ │ │ │ ├── clusterresolver.go │ │ │ │ │ ├── config.go │ │ │ │ │ ├── configbuilder.go │ │ │ │ │ ├── configbuilder_childname.go │ │ │ │ │ ├── logging.go │ │ │ │ │ ├── resource_resolver.go │ │ │ │ │ ├── resource_resolver_dns.go │ │ │ │ │ └── resource_resolver_eds.go │ │ │ │ ├── loadstore/ │ │ │ │ │ └── load_store_wrapper.go │ │ │ │ ├── outlierdetection/ │ │ │ │ │ ├── balancer.go │ │ │ │ │ ├── callcounter.go │ │ │ │ │ ├── config.go │ │ │ │ │ ├── logging.go │ │ │ │ │ └── subconn_wrapper.go │ │ │ │ ├── priority/ │ │ │ │ │ ├── balancer.go │ │ │ │ │ ├── balancer_child.go │ │ │ │ │ ├── balancer_priority.go │ │ │ │ │ ├── config.go │ │ │ │ │ ├── ignore_resolve_now.go │ │ │ │ │ ├── logging.go │ │ │ │ │ └── utils.go │ │ │ │ ├── ringhash/ │ │ │ │ │ ├── config.go │ │ │ │ │ ├── logging.go │ │ │ │ │ ├── picker.go │ │ │ │ │ ├── ring.go │ │ │ │ │ ├── ringhash.go │ │ │ │ │ └── util.go │ │ │ │ └── wrrlocality/ │ │ │ │ ├── balancer.go │ │ │ │ └── logging.go │ │ │ ├── clusterspecifier/ │ │ │ │ ├── cluster_specifier.go │ │ │ │ └── rls/ │ │ │ │ └── rls.go │ │ │ ├── httpfilter/ │ │ │ │ ├── fault/ │ │ │ │ │ └── fault.go │ │ │ │ ├── httpfilter.go │ │ │ │ ├── rbac/ │ │ │ │ │ └── rbac.go │ │ │ │ └── router/ │ │ │ │ └── router.go │ │ │ ├── internal.go │ │ │ ├── resolver/ │ │ │ │ ├── internal/ │ │ │ │ │ └── internal.go │ │ │ │ ├── logging.go │ │ │ │ ├── serviceconfig.go │ │ │ │ ├── watch_service.go │ │ │ │ └── xds_resolver.go │ │ │ ├── server/ │ │ │ │ ├── conn_wrapper.go │ │ │ │ ├── listener_wrapper.go │ │ │ │ └── rds_handler.go │ │ │ └── xdsclient/ │ │ │ ├── attributes.go │ │ │ ├── authority.go │ │ │ ├── channel.go │ │ │ ├── client.go │ │ │ ├── clientimpl.go │ │ │ ├── clientimpl_loadreport.go │ │ │ ├── clientimpl_watchers.go │ │ │ ├── internal/ │ │ │ │ └── internal.go │ │ │ ├── load/ │ │ │ │ ├── reporter.go │ │ │ │ └── store.go │ │ │ ├── logging.go │ │ │ ├── pool.go │ │ │ ├── requests_counter.go │ │ │ ├── transport/ │ │ │ │ ├── ads/ │ │ │ │ │ └── ads_stream.go │ │ │ │ ├── grpctransport/ │ │ │ │ │ └── grpctransport.go │ │ │ │ ├── lrs/ │ │ │ │ │ └── lrs_stream.go │ │ │ │ └── transport_interface.go │ │ │ ├── xdslbregistry/ │ │ │ │ ├── converter/ │ │ │ │ │ └── converter.go │ │ │ │ └── xdslbregistry.go │ │ │ └── xdsresource/ │ │ │ ├── cluster_resource_type.go │ │ │ ├── endpoints_resource_type.go │ │ │ ├── errors.go │ │ │ ├── filter_chain.go │ │ │ ├── listener_resource_type.go │ │ │ ├── logging.go │ │ │ ├── matcher.go │ │ │ ├── matcher_path.go │ │ │ ├── name.go │ │ │ ├── resource_type.go │ │ │ ├── route_config_resource_type.go │ │ │ ├── type.go │ │ │ ├── type_cds.go │ │ │ ├── type_eds.go │ │ │ ├── type_lds.go │ │ │ ├── type_rds.go │ │ │ ├── unmarshal_cds.go │ │ │ ├── unmarshal_eds.go │ │ │ ├── unmarshal_lds.go │ │ │ ├── unmarshal_rds.go │ │ │ └── version/ │ │ │ └── version.go │ │ ├── server.go │ │ ├── server_options.go │ │ └── xds.go │ └── protobuf/ │ ├── LICENSE │ ├── PATENTS │ ├── encoding/ │ │ ├── protodelim/ │ │ │ └── protodelim.go │ │ ├── protojson/ │ │ │ ├── decode.go │ │ │ ├── doc.go │ │ │ ├── encode.go │ │ │ └── well_known_types.go │ │ ├── prototext/ │ │ │ ├── decode.go │ │ │ ├── doc.go │ │ │ └── encode.go │ │ └── protowire/ │ │ └── wire.go │ ├── internal/ │ │ ├── descfmt/ │ │ │ └── stringer.go │ │ ├── descopts/ │ │ │ └── options.go │ │ ├── detrand/ │ │ │ └── rand.go │ │ ├── editiondefaults/ │ │ │ ├── defaults.go │ │ │ └── editions_defaults.binpb │ │ ├── editionssupport/ │ │ │ └── editions.go │ │ ├── encoding/ │ │ │ ├── defval/ │ │ │ │ └── default.go │ │ │ ├── json/ │ │ │ │ ├── decode.go │ │ │ │ ├── decode_number.go │ │ │ │ ├── decode_string.go │ │ │ │ ├── decode_token.go │ │ │ │ └── encode.go │ │ │ ├── messageset/ │ │ │ │ └── messageset.go │ │ │ ├── tag/ │ │ │ │ └── tag.go │ │ │ └── text/ │ │ │ ├── decode.go │ │ │ ├── decode_number.go │ │ │ ├── decode_string.go │ │ │ ├── decode_token.go │ │ │ ├── doc.go │ │ │ └── encode.go │ │ ├── errors/ │ │ │ └── errors.go │ │ ├── filedesc/ │ │ │ ├── build.go │ │ │ ├── desc.go │ │ │ ├── desc_init.go │ │ │ ├── desc_lazy.go │ │ │ ├── desc_list.go │ │ │ ├── desc_list_gen.go │ │ │ ├── editions.go │ │ │ └── placeholder.go │ │ ├── filetype/ │ │ │ └── build.go │ │ ├── flags/ │ │ │ ├── flags.go │ │ │ ├── proto_legacy_disable.go │ │ │ └── proto_legacy_enable.go │ │ ├── genid/ │ │ │ ├── any_gen.go │ │ │ ├── api_gen.go │ │ │ ├── descriptor_gen.go │ │ │ ├── doc.go │ │ │ ├── duration_gen.go │ │ │ ├── empty_gen.go │ │ │ ├── field_mask_gen.go │ │ │ ├── go_features_gen.go │ │ │ ├── goname.go │ │ │ ├── map_entry.go │ │ │ ├── name.go │ │ │ ├── source_context_gen.go │ │ │ ├── struct_gen.go │ │ │ ├── timestamp_gen.go │ │ │ ├── type_gen.go │ │ │ ├── wrappers.go │ │ │ └── wrappers_gen.go │ │ ├── impl/ │ │ │ ├── api_export.go │ │ │ ├── api_export_opaque.go │ │ │ ├── bitmap.go │ │ │ ├── bitmap_race.go │ │ │ ├── checkinit.go │ │ │ ├── codec_extension.go │ │ │ ├── codec_field.go │ │ │ ├── codec_field_opaque.go │ │ │ ├── codec_gen.go │ │ │ ├── codec_map.go │ │ │ ├── codec_message.go │ │ │ ├── codec_message_opaque.go │ │ │ ├── codec_messageset.go │ │ │ ├── codec_tables.go │ │ │ ├── codec_unsafe.go │ │ │ ├── convert.go │ │ │ ├── convert_list.go │ │ │ ├── convert_map.go │ │ │ ├── decode.go │ │ │ ├── encode.go │ │ │ ├── enum.go │ │ │ ├── equal.go │ │ │ ├── extension.go │ │ │ ├── lazy.go │ │ │ ├── legacy_enum.go │ │ │ ├── legacy_export.go │ │ │ ├── legacy_extension.go │ │ │ ├── legacy_file.go │ │ │ ├── legacy_message.go │ │ │ ├── merge.go │ │ │ ├── merge_gen.go │ │ │ ├── message.go │ │ │ ├── message_opaque.go │ │ │ ├── message_opaque_gen.go │ │ │ ├── message_reflect.go │ │ │ ├── message_reflect_field.go │ │ │ ├── message_reflect_field_gen.go │ │ │ ├── message_reflect_gen.go │ │ │ ├── pointer_unsafe.go │ │ │ ├── pointer_unsafe_opaque.go │ │ │ ├── presence.go │ │ │ └── validate.go │ │ ├── order/ │ │ │ ├── order.go │ │ │ └── range.go │ │ ├── pragma/ │ │ │ └── pragma.go │ │ ├── protolazy/ │ │ │ ├── bufferreader.go │ │ │ ├── lazy.go │ │ │ └── pointer_unsafe.go │ │ ├── set/ │ │ │ └── ints.go │ │ ├── strs/ │ │ │ ├── strings.go │ │ │ └── strings_unsafe.go │ │ └── version/ │ │ └── version.go │ ├── proto/ │ │ ├── checkinit.go │ │ ├── decode.go │ │ ├── decode_gen.go │ │ ├── doc.go │ │ ├── encode.go │ │ ├── encode_gen.go │ │ ├── equal.go │ │ ├── extension.go │ │ ├── merge.go │ │ ├── messageset.go │ │ ├── proto.go │ │ ├── proto_methods.go │ │ ├── proto_reflect.go │ │ ├── reset.go │ │ ├── size.go │ │ ├── size_gen.go │ │ ├── wrapperopaque.go │ │ └── wrappers.go │ ├── protoadapt/ │ │ └── convert.go │ ├── reflect/ │ │ ├── protodesc/ │ │ │ ├── desc.go │ │ │ ├── desc_init.go │ │ │ ├── desc_resolve.go │ │ │ ├── desc_validate.go │ │ │ ├── editions.go │ │ │ └── proto.go │ │ ├── protoreflect/ │ │ │ ├── methods.go │ │ │ ├── proto.go │ │ │ ├── source.go │ │ │ ├── source_gen.go │ │ │ ├── type.go │ │ │ ├── value.go │ │ │ ├── value_equal.go │ │ │ ├── value_union.go │ │ │ └── value_unsafe.go │ │ └── protoregistry/ │ │ └── registry.go │ ├── runtime/ │ │ ├── protoiface/ │ │ │ ├── legacy.go │ │ │ └── methods.go │ │ └── protoimpl/ │ │ ├── impl.go │ │ └── version.go │ └── types/ │ ├── descriptorpb/ │ │ └── descriptor.pb.go │ ├── gofeaturespb/ │ │ └── go_features.pb.go │ └── known/ │ ├── anypb/ │ │ └── any.pb.go │ ├── durationpb/ │ │ └── duration.pb.go │ ├── emptypb/ │ │ └── empty.pb.go │ ├── fieldmaskpb/ │ │ └── field_mask.pb.go │ ├── structpb/ │ │ └── struct.pb.go │ ├── timestamppb/ │ │ └── timestamp.pb.go │ └── wrapperspb/ │ └── wrappers.pb.go ├── gopkg.in/ │ ├── ini.v1/ │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .golangci.yml │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── README.md │ │ ├── codecov.yml │ │ ├── data_source.go │ │ ├── deprecated.go │ │ ├── error.go │ │ ├── file.go │ │ ├── helper.go │ │ ├── ini.go │ │ ├── key.go │ │ ├── parser.go │ │ ├── section.go │ │ └── struct.go │ ├── warnings.v0/ │ │ ├── LICENSE │ │ ├── README │ │ └── warnings.go │ └── yaml.v3/ │ ├── LICENSE │ ├── NOTICE │ ├── README.md │ ├── apic.go │ ├── decode.go │ ├── emitterc.go │ ├── encode.go │ ├── parserc.go │ ├── readerc.go │ ├── resolve.go │ ├── scannerc.go │ ├── sorter.go │ ├── writerc.go │ ├── yaml.go │ ├── yamlh.go │ └── yamlprivateh.go └── modules.txt ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ integration/**/* scripts/**/* hack/**/* examples/**/* docs/**/* .github/**/* logo/**/* out/**/* ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Report a bug in kaniko --- **Actual behavior** A clear and concise description of what the bug is. **Expected behavior** A clear and concise description of what you expected to happen. **To Reproduce** Steps to reproduce the behavior: 1. ... 2. ... **Additional Information** - Dockerfile Please provide either the Dockerfile you're trying to build or one that can reproduce this error. - Build Context Please provide or clearly describe any files needed to build the Dockerfile (ADD/COPY commands) - Kaniko Image (fully qualified with digest) **Triage Notes for the Maintainers** | **Description** | **Yes/No** | |----------------|---------------| | Please check if this a new feature you are proposing | | | Please check if the build works in docker but not in kaniko | | | Please check if this error is seen when you use `--cache` flag | | | Please check if your dockerfile is a multistage dockerfile | | ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: gomod directory: / schedule: interval: weekly - package-ecosystem: github-actions directory: / schedule: interval: weekly - package-ecosystem: docker directory: /deploy schedule: interval: weekly ================================================ FILE: .github/pull_request_template.md ================================================ Fixes # _in case of a bug fix, this should point to a bug and any other related issue(s)_ **Description** **Submitter Checklist** These are the criteria that every PR should meet, please check them off as you review them: - [ ] Includes [unit tests](../DEVELOPMENT.md#creating-a-pr) - [ ] Adds integration tests if needed. _See [the contribution guide](../CONTRIBUTING.md) for more details._ **Reviewer Notes** - [ ] The code flow looks good. - [ ] Unit tests and or integration tests added. **Release Notes** Describe any changes here so maintainer can include it in the release notes, or delete this block. ``` Examples of user facing changes: - kaniko adds a new flag `--registry-repo` to override registry ``` ================================================ FILE: .github/workflows/images.yaml ================================================ name: Build images on: pull_request: branches: ['main'] push: branches: ['main'] tags: ['v[0-9]+.[0-9]+.[0-9]+*'] jobs: build-images: concurrency: # If a previous run is ongoing with the same head_ref (it's a run on the # same PR) then cancel it to save time. If it isn't a PR, only cancel the # previous run if it's on the same commit SHA. This prevents a run for a # commit push from cancelling a previous commit push's build, since we # want an image built and tagged for each commit. group: build-images-${{ matrix.image }}-${{ github.head_ref || github.sha }} cancel-in-progress: true permissions: contents: read # Read the repo contents. id-token: write # Produce identity token for keyless signing. runs-on: ubuntu-latest strategy: fail-fast: false matrix: image: - executor - executor-debug - executor-slim - warmer include: - image: executor target: kaniko-executor platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le image-name: gcr.io/kaniko-project/executor tag: ${{ github.sha }} release-tag: latest - image: executor-debug target: kaniko-debug platforms: linux/amd64,linux/arm64,linux/s390x image-name: gcr.io/kaniko-project/executor tag: ${{ github.sha }}-debug release-tag: debug - image: executor-slim target: kaniko-slim platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le image-name: gcr.io/kaniko-project/executor tag: ${{ github.sha }}-slim release-tag: slim - image: warmer target: kaniko-warmer platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le image-name: gcr.io/kaniko-project/warmer tag: ${{ github.sha }} release-tag: latest steps: - uses: actions/checkout@b0e28b5ac45a892f91e7d036f8200cf5ed489415 # v3 # Setup auth if not a PR. - if: github.event_name != 'pull_request' uses: google-github-actions/auth@ba79af03959ebeac9769e648f473a284504d9193 # v2.1.10 with: credentials_json: '${{ secrets.GCR_DEVOPS_SERVICE_ACCOUNT_KEY }}' export_environment_variables: true create_credentials_file: true - if: github.event_name != 'pull_request' uses: google-github-actions/setup-gcloud@98ddc00a17442e89a24bbf282954a3b65ce6d200 # v2.1.0 - if: github.event_name != 'pull_request' run: gcloud auth configure-docker # Don't build for all platforms on PRs. - id: platforms run: | event="${{ github.event_name }}" if [[ "$event" == "pull_request" ]]; then echo "platforms=linux/amd64" >> $GITHUB_OUTPUT else platforms="${{ matrix.platforms }}" echo "platforms=${platforms}" >> $GITHUB_OUTPUT fi # Build and push with Docker. - uses: docker/setup-qemu-action@5927c834f5b4fdf503fca6f4c7eccda82949e1ee # v3.1.0 with: platforms: ${{ matrix.platforms }} - uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 - uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 id: build-and-push with: context: . file: ./deploy/Dockerfile platforms: ${{ steps.platforms.outputs.platforms }} push: ${{ github.event_name != 'pull_request' }} # Only push if not a PR. tags: ${{ matrix.image-name }}:${{ matrix.tag }} no-cache-filters: certs # https://github.com/docker/build-push-action/blob/master/docs/advanced/cache.md#github-cache cache-from: type=gha cache-to: type=gha,mode=max target: ${{ matrix.target }} # Sign images if not a PR. - if: github.event_name != 'pull_request' uses: sigstore/cosign-installer@3454372f43399081ed03b604cb2d021dabca52bb # v3.8.2 - if: github.event_name != 'pull_request' run: | cosign sign --yes \ --key gcpkms://projects/kaniko-project/locations/global/keyRings/cosign/cryptoKeys/cosign \ ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }} cosign sign --yes \ ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }} # If a tag push, use crane to add more tags. - if: startsWith(github.ref, 'refs/tags/v') uses: imjasonh/setup-crane@31b88efe9de28ae0ffa220711af4b60be9435f6e # v0.4 - if: startsWith(github.ref, 'refs/tags/v') name: Apply release tags run: | tag=${GITHUB_REF/refs\/tags\//} # Tag :latest, :debug, :slim crane cp ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }} \ ${{ matrix.image-name }}:${{ matrix.release-tag }} if [[ "${{ matrix.release-tag }}" == "latest" ]]; then # Tag :latest images as :v1.X.Y crane cp ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }} \ ${{ matrix.image-name }}:${tag} else # Or tag :v1.X.Y-debug and :v1.X.Y-slim crane cp ${{ matrix.image-name }}@${{ steps.build-and-push.outputs.digest }} \ ${{ matrix.image-name }}:${tag}-${{ matrix.release-tag }} fi ================================================ FILE: .github/workflows/integration-tests.yaml ================================================ name: Integration tests on: push: branches: ['main'] pull_request: branches: ['main'] permissions: contents: read jobs: tests: runs-on: ubuntu-latest env: IMAGE_REPO: 'localhost:5000' REGISTRY: 'localhost:5000' DOCKER_BUILDKIT: '0' strategy: fail-fast: false matrix: make-target: - integration-test-layers - integration-test-misc - integration-test-run - k8s-executor-build-push integration-test-k8s steps: - name: Maximize build space uses: AdityaGarg8/remove-unwanted-software@v4 with: remove-android: 'true' remove-dotnet: 'true' remove-haskell: 'true' - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: go-version: '1.22' - uses: actions/checkout@b0e28b5ac45a892f91e7d036f8200cf5ed489415 # v3 - uses: docker/setup-buildx-action@4fd812986e6c8c2a69e18311145f9371337f27d4 # v1 - run: make install-container-diff k3s-setup - run: make ${{ matrix.make-target }} ================================================ FILE: .github/workflows/nightly-vulnerability-scan.yml ================================================ name: Nightly Vulnerability Scan on: schedule: # Schedule to run every night at midnight - cron: '0 0 * * *' jobs: vulnerability-scan: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Set up Grype run: | # Install Grype curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin - name: Get latest commit SHA of Kaniko project id: get-commit run: | LATEST_COMMIT_SHA=$(git rev-parse HEAD) echo "Latest commit SHA: $LATEST_COMMIT_SHA" echo "::set-output name=sha::$LATEST_COMMIT_SHA" - name: Scan the latest CI/CD image run: | IMAGE_ID="gcr.io/kaniko-project/executor:${{ steps.get-commit.outputs.sha }}" echo "Scanning image $IMAGE_ID" grype $IMAGE_ID > grype-output.txt - name: Check for vulnerabilities and create an issue run: | if grep -q 'No vulnerabilities found' grype-output.txt; then echo "No vulnerabilities found." else gh issue create --title "Vulnerabilities Found in Nightly Scan" --body "Vulnerabilities found in the latest image scan. Please check the attached report." --body-file grype-output.txt fi ================================================ FILE: .github/workflows/unit-tests.yaml ================================================ name: Unit tests on: push: branches: ['main'] pull_request: branches: ['main'] permissions: contents: read jobs: tests: runs-on: ubuntu-latest steps: - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v4.01 with: go-version: '1.22' - uses: actions/checkout@b0e28b5ac45a892f91e7d036f8200cf5ed489415 # v3 - run: make test ================================================ FILE: .gitignore ================================================ out/ bazel-* *~ BUILD.bazel .idea/** *.iml .vagrant .vscode/ ================================================ FILE: .golangci.yaml ================================================ # This file contains all available configuration options # with their default values. # options for analysis running run: # default concurrency is a available CPU number concurrency: 4 # timeout for analysis, e.g. 30s, 5m, default is 1m deadline: 1m # exit code when at least one issue was found, default is 1 issues-exit-code: 1 # include test files or not, default is true tests: true # list of build tags, all linters use it. Default is empty list. build-tags: # which dirs to skip: they won't be analyzed; # can use regexp here: generated.*, regexp is applied on full path; # default value is empty list, but next dirs are always skipped independently # from this option's value: # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ skip-dirs: # which files to skip: they will be analyzed, but issues from them # won't be reported. Default value is empty list, but there is # no need to include all autogenerated files, we confidently recognize # autogenerated files. If it's not please let us know. skip-files: # output configuration options output: # colored-line-number|line-number|json|tab|checkstyle, default is "colored-line-number" format: colored-line-number # print lines of code with issue, default is true print-issued-lines: true # print linter name in the end of issue text, default is true print-linter-name: true # all available settings of specific linters linters-settings: errcheck: # report about not checking of errors in type assetions: `a := b.(MyStruct)`; # default is false: such cases aren't reported by default. check-type-assertions: false # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; # default is false: such cases aren't reported by default. check-blank: false govet: # report about shadowed variables #check-shadowing: true # Obtain type information from installed (to $GOPATH/pkg) package files: # golangci-lint will execute `go install -i` and `go test -i` for analyzed packages # before analyzing them. # By default this option is disabled and govet gets type information by loader from source code. # Loading from source code is slow, but it's done only once for all linters. # Go-installing of packages first time is much slower than loading them from source code, # therefore this option is disabled by default. # But repeated installation is fast in go >= 1.10 because of build caching. # Enable this option only if all conditions are met: # 1. you use only "fast" linters (--fast e.g.): no program loading occurs # 2. you use go >= 1.10 # 3. you do repeated runs (false for CI) or cache $GOPATH/pkg or `go env GOCACHE` dir in CI. #use-installed-packages: false golint: # minimal confidence for issues, default is 0.8 min-confidence: 0.8 gofmt: # simplify code: gofmt with `-s` option, true by default simplify: true #gocyclo: # # minimal code complexity to report, 30 by default (but we recommend 10-20) # min-complexity: 10 maligned: # print struct with more effective memory layout or not, false by default suggest-new: true #dupl: # # tokens count to trigger issue, 150 by default # threshold: 100 goconst: # minimal length of string constant, 3 by default min-len: 3 # minimal occurrences count to trigger, 3 by default min-occurrences: 3 misspell: # Correct spellings using locale preferences for US or UK. # Default is to use a neutral variety of English. # Setting locale to US will correct the British spelling of 'colour' to 'color'. locale: US #lll: # # max line length, lines longer will be reported. Default is 120. # # '\t' is counted as 1 character by default, and can be changed with the tab-width option # line-length: 120 # # tab width in spaces. Default to 1. # tab-width: 1 unused: # treat code as a program (not a library) and report unused exported identifiers; default is false. # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: # if it's called for subdir of a project it can't find funcs usages. All text editor integrations # with golangci-lint call it on a directory with the changed file. check-exported: false unparam: # call graph construction algorithm (cha, rta). In general, use cha for libraries, # and rta for programs with main packages. Default is cha. algo: cha # Inspect exported functions, default is false. Set to true if no external program/library imports your code. # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: # if it's called for subdir of a project it can't find external interfaces. All text editor integrations # with golangci-lint call it on a directory with the changed file. check-exported: false #nakedret: # # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 # max-func-lines: 30 #prealloc: # # XXX: we don't recommend using this linter before doing performance profiling. # # For most programs usage of prealloc will be a premature optimization. # # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. # # True by default. # simple: true # range-loops: true # Report preallocation suggestions on range loops, true by default # for-loops: false # Report preallocation suggestions on for loops, false by default linters: enable: - goconst - goimports - golint - interfacer - maligned - misspell - unconvert - unparam enable-all: false disable: - errcheck - gas - scopelint - bodyclose - staticcheck disable-all: false presets: - bugs - unused fast: false issues: # List of regexps of issue texts to exclude, empty list by default. # But independently from this option we use default exclude patterns, # it can be disabled by `exclude-use-default: false`. To list all # excluded by default patterns execute `golangci-lint run --help` exclude: # Independently from option `exclude` we use default exclude patterns, # it can be disabled by this option. To list all # excluded by default patterns execute `golangci-lint run --help`. # Default value for this option is true. exclude-use-default: true # Maximum issues count per one linter. Set to 0 to disable. Default is 50. max-per-linter: 50 # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. max-same: 3 # Show only new issues: if there are unstaged changes or untracked files, # only those changes are analyzed, else only changes in HEAD~ are analyzed. # It's a super-useful option for integration of golangci-lint into existing # large codebase. It's not practical to fix all existing issues at the moment # of integration: much better don't allow issues in new code. # Default is false. new: false ## Show only new issues created after git revision `REV` #new-from-rev: REV ## Show only new issues created in git patch with set file path. #new-from-patch: path/to/patch/file ================================================ FILE: .prettierrc ================================================ printWidth: 80 tabWidth: 2 semi: false singleQuote: false overrides: [{ files: "*.md", options: { proseWrap: always } }] ================================================ FILE: CHANGELOG.md ================================================ # v1.24.0 Release 2025-05-21 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.24.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.24.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.24.0-slim ``` Huge thank you for this release towards our contributors: - Aaron Prindle - Aswin A - dependabot[bot] - Michael Plump - Mick van Gelderen - Thomas L. Kjeldsen # v1.23.2 Release 2024-07-09 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.23.2 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.23.2-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.23.2-slim ``` * deps: bump github.com/moby/buildkit and github.com/docker/docker [#3242](https://github.com/GoogleContainerTools/kaniko/pull/3242) * chore(deps): bump docker/build-push-action from 6.1.0 to 6.3.0 [#3236](https://github.com/GoogleContainerTools/kaniko/pull/3236) * chore(deps): bump docker/setup-qemu-action from 3.0.0 to 3.1.0 [#3235](https://github.com/GoogleContainerTools/kaniko/pull/3235) * chore(deps): bump docker/setup-buildx-action from 3.3.0 to 3.4.0 [#3237](https://github.com/GoogleContainerTools/kaniko/pull/3237) * chore(deps): bump google.golang.org/api from 0.185.0 to 0.187.0 [#3238](https://github.com/GoogleContainerTools/kaniko/pull/3238) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.17.1 to 1.17.5 [#3239](https://github.com/GoogleContainerTools/kaniko/pull/3239) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.24 to 1.17.1 [#3220](https://github.com/GoogleContainerTools/kaniko/pull/3220) * chore(deps): bump docker/build-push-action from 6.0.0 to 6.1.0 [#3218](https://github.com/GoogleContainerTools/kaniko/pull/3218) * chore(deps): bump google.golang.org/api from 0.183.0 to 0.185.0 [#3219](https://github.com/GoogleContainerTools/kaniko/pull/3219) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.55.1 to 1.56.1 [#3221](https://github.com/GoogleContainerTools/kaniko/pull/3221) * chore(deps): bump docker/build-push-action from 5.3.0 to 6.0.0 [#3212](https://github.com/GoogleContainerTools/kaniko/pull/3212) * chore(deps): bump cloud.google.com/go/storage from 1.41.0 to 1.42.0 [#3204](https://github.com/GoogleContainerTools/kaniko/pull/3204) * chore(deps): bump github.com/spf13/cobra from 1.8.0 to 1.8.1 [#3205](https://github.com/GoogleContainerTools/kaniko/pull/3205) * chore(deps): bump github.com/google/go-containerregistry from 0.19.1 to 0.19.2 [#3206](https://github.com/GoogleContainerTools/kaniko/pull/3206) * chore(deps): bump imjasonh/setup-crane from 0.3 to 0.4 [#3210](https://github.com/GoogleContainerTools/kaniko/pull/3210) * chore(deps): bump golang.org/x/net from 0.25.0 to 0.26.0 [#3190](https://github.com/GoogleContainerTools/kaniko/pull/3190) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.21 to 1.16.24 [#3191](https://github.com/GoogleContainerTools/kaniko/pull/3191) * chore(deps): bump google.golang.org/api from 0.182.0 to 0.183.0 [#3192](https://github.com/GoogleContainerTools/kaniko/pull/3192) * chore(deps): bump github.com/containerd/containerd from 1.7.17 to 1.7.18 [#3193](https://github.com/GoogleContainerTools/kaniko/pull/3193) * chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.27.0 to 1.27.2 [#3194](https://github.com/GoogleContainerTools/kaniko/pull/3194) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] # v1.23.1 Release 2024-06-07 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.23.1 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.23.1-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.23.1-slim ``` * Enable pushing cache with --no-push [#3181](https://github.com/GoogleContainerTools/kaniko/pull/3181) * docs: document --no-push-cache flag in README.md [#3188](https://github.com/GoogleContainerTools/kaniko/pull/3188) * chore(deps): bump google.golang.org/api from 0.181.0 to 0.182.0 [#3187](https://github.com/GoogleContainerTools/kaniko/pull/3187) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.17 to 1.16.21 [#3179](https://github.com/GoogleContainerTools/kaniko/pull/3179) * chore(deps): bump google.golang.org/api from 0.180.0 to 0.181.0 [#3170](https://github.com/GoogleContainerTools/kaniko/pull/3170) * chore(deps): bump google-github-actions/auth from 2.1.2 to 2.1.3 [#3168](https://github.com/GoogleContainerTools/kaniko/pull/3168) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.53.2 to 1.54.2 [#3169](https://github.com/GoogleContainerTools/kaniko/pull/3169) * chore(deps): bump cloud.google.com/go/storage from 1.40.0 to 1.41.0 [#3171](https://github.com/GoogleContainerTools/kaniko/pull/3171) * chore(deps): bump github.com/containerd/containerd from 1.7.16 to 1.7.17 [#3172](https://github.com/GoogleContainerTools/kaniko/pull/3172) * chore(deps): bump github.com/docker/docker from 26.1.2+incompatible to 26.1.3+incompatible [#3173](https://github.com/GoogleContainerTools/kaniko/pull/3173) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] - Leo Palmer Sunmo # v1.23.0 Release 2024-05-14 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.23.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.23.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.23.0-slim ``` * give warn instead of error when wildcard not match any files [#3127](https://github.com/GoogleContainerTools/kaniko/pull/3127) * warmer validate and copy registry mirror to registry map [#3140](https://github.com/GoogleContainerTools/kaniko/pull/3140) * docs: update docs on mirrors and registry map. [#3153](https://github.com/GoogleContainerTools/kaniko/pull/3153) * Fix: Make `--registry-map` compatible with namespaced images [#3138](https://github.com/GoogleContainerTools/kaniko/pull/3138) * "Fixes #2752" [#3132](https://github.com/GoogleContainerTools/kaniko/pull/3132) * chore(deps): bump github.com/docker/docker from 26.1.1+incompatible to 26.1.2+incompatible [#3161](https://github.com/GoogleContainerTools/kaniko/pull/3161) * chore(deps): bump google.golang.org/api from 0.177.0 to 0.180.0 [#3160](https://github.com/GoogleContainerTools/kaniko/pull/3160) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.15 to 1.16.17 [#3158](https://github.com/GoogleContainerTools/kaniko/pull/3158) * chore(deps): bump github.com/docker/docker from 26.1.0+incompatible to 26.1.1+incompatible [#3149](https://github.com/GoogleContainerTools/kaniko/pull/3149) * chore(deps): bump actions/setup-go from 5.0.0 to 5.0.1 [#3152](https://github.com/GoogleContainerTools/kaniko/pull/3152) * chore(deps): bump google.golang.org/api from 0.175.0 to 0.177.0 [#3151](https://github.com/GoogleContainerTools/kaniko/pull/3151) * chore(deps): bump golang.org/x/oauth2 from 0.19.0 to 0.20.0 [#3150](https://github.com/GoogleContainerTools/kaniko/pull/3150) * chore(deps): bump github.com/moby/buildkit from 0.13.1 to 0.13.2 [#3145](https://github.com/GoogleContainerTools/kaniko/pull/3145) * chore(deps): bump github.com/containerd/containerd from 1.7.15 to 1.7.16 [#3144](https://github.com/GoogleContainerTools/kaniko/pull/3144) * chore: bump cred helper libraries [#3133](https://github.com/GoogleContainerTools/kaniko/pull/3133) * Added --chmod for ADD and COPY commands. Fixes #2850 and #1751 [#3119](https://github.com/GoogleContainerTools/kaniko/pull/3119) * chore(deps): bump github.com/google/slowjam from 1.1.0 to 1.1.1 [#3129](https://github.com/GoogleContainerTools/kaniko/pull/3129) * chore(deps): bump google.golang.org/api from 0.172.0 to 0.175.0 [#3128](https://github.com/GoogleContainerTools/kaniko/pull/3128) * fix: integration: fail on error when build with docker [#3131](https://github.com/GoogleContainerTools/kaniko/pull/3131) * fix(doc): wiki url [#3117](https://github.com/GoogleContainerTools/kaniko/pull/3117) * chore(deps): bump golang.org/x/net from 0.22.0 to 0.24.0 [#3113](https://github.com/GoogleContainerTools/kaniko/pull/3113) * chore(deps): bump github.com/Azure/azure-sdk-for-go/sdk/storage/azblob from 1.3.1 to 1.3.2 [#3114](https://github.com/GoogleContainerTools/kaniko/pull/3114) * chore(deps): bump github.com/containerd/containerd from 1.7.14 to 1.7.15 [#3112](https://github.com/GoogleContainerTools/kaniko/pull/3112) * chore(deps): bump docker/setup-buildx-action from 3.2.0 to 3.3.0 [#3111](https://github.com/GoogleContainerTools/kaniko/pull/3111) * chore(deps): bump github.com/docker/docker from 26.0.0+incompatible to 26.0.2+incompatible [#3121](https://github.com/GoogleContainerTools/kaniko/pull/3121) * chore(deps): bump AdityaGarg8/remove-unwanted-software from 2 to 3 [#3110](https://github.com/GoogleContainerTools/kaniko/pull/3110) * chore(deps): bump sigstore/cosign-installer from 3.4.0 to 3.5.0 [#3109](https://github.com/GoogleContainerTools/kaniko/pull/3109) * chore(deps): bump golang.org/x/sys from 0.18.0 to 0.19.0 [#3103](https://github.com/GoogleContainerTools/kaniko/pull/3103) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.9 to 1.16.15 [#3104](https://github.com/GoogleContainerTools/kaniko/pull/3104) * chore(deps): bump golang.org/x/sync from 0.6.0 to 0.7.0 [#3105](https://github.com/GoogleContainerTools/kaniko/pull/3105) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.27.7 to 1.27.11 [#3106](https://github.com/GoogleContainerTools/kaniko/pull/3106) * chore(deps): bump golang.org/x/oauth2 from 0.18.0 to 0.19.0 [#3107](https://github.com/GoogleContainerTools/kaniko/pull/3107) * chore(deps): bump google.golang.org/api from 0.171.0 to 0.172.0 [#3094](https://github.com/GoogleContainerTools/kaniko/pull/3094) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.52.1 to 1.53.1 [#3096](https://github.com/GoogleContainerTools/kaniko/pull/3096) * chore(deps): bump github.com/go-git/go-git/v5 from 5.11.0 to 5.12.0 [#3095](https://github.com/GoogleContainerTools/kaniko/pull/3095) * chore(deps): bump github.com/moby/buildkit from 0.13.0 to 0.13.1 [#3093](https://github.com/GoogleContainerTools/kaniko/pull/3093) * chore(deps): bump cloud.google.com/go/storage from 1.39.1 to 1.40.0 [#3097](https://github.com/GoogleContainerTools/kaniko/pull/3097) * chore: update cred helper go libraries [#3087](https://github.com/GoogleContainerTools/kaniko/pull/3087) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] - Djabx - Marc Lallaouret - Matthias Schneider - Prima Adi Pradana - Samarth08 - Verlhac Gaëtan # v1.22.0 Release 2024-03-26 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.22.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.22.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.22.0-slim ``` * chore(deps): bump github.com/docker/docker from 25.0.4+incompatible to 26.0.0+incompatible [#3085](https://github.com/GoogleContainerTools/kaniko/pull/3085) * chore(deps): bump google.golang.org/api from 0.167.0 to 0.171.0 [#3082](https://github.com/GoogleContainerTools/kaniko/pull/3082) * chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.25.3 to 1.26.0 [#3083](https://github.com/GoogleContainerTools/kaniko/pull/3083) * chore(deps): bump github.com/containerd/containerd from 1.7.13 to 1.7.14 [#3084](https://github.com/GoogleContainerTools/kaniko/pull/3084) * chore(deps): bump docker/build-push-action from 5.2.0 to 5.3.0 [#3070](https://github.com/GoogleContainerTools/kaniko/pull/3070) * Fix #3032: Remove query parameters in ADD command when the destinatio… [#3053](https://github.com/GoogleContainerTools/kaniko/pull/3053) * Kaniko/add path regmaps [possible in registry maps and/or mirror] [#3051](https://github.com/GoogleContainerTools/kaniko/pull/3051) * chore(deps): bump docker/setup-buildx-action from 3.1.0 to 3.2.0 [#3071](https://github.com/GoogleContainerTools/kaniko/pull/3071) * chore(deps): bump github.com/moby/buildkit from 0.12.5 to 0.13.0 [#3072](https://github.com/GoogleContainerTools/kaniko/pull/3072) * chore(deps): bump github.com/google/go-containerregistry from 0.19.0 to 0.19.1 [#3073](https://github.com/GoogleContainerTools/kaniko/pull/3073) * chore(deps): bump golang.org/x/oauth2 from 0.17.0 to 0.18.0 [#3074](https://github.com/GoogleContainerTools/kaniko/pull/3074) * chore(deps): bump cloud.google.com/go/storage from 1.39.0 to 1.39.1 [#3075](https://github.com/GoogleContainerTools/kaniko/pull/3075) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.51.4 to 1.52.1 [#3076](https://github.com/GoogleContainerTools/kaniko/pull/3076) * Fix COPY fails when multiple files are copied to path specified in ENV [#3034](https://github.com/GoogleContainerTools/kaniko/pull/3034) * Add AWS ECR error message for tag Immutability [#3045](https://github.com/GoogleContainerTools/kaniko/pull/3045) * chore: update google.golang.org/protobuff to resolve CVE-2024-24786 [#3068](https://github.com/GoogleContainerTools/kaniko/pull/3068) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.6 to 1.16.9 [#3058](https://github.com/GoogleContainerTools/kaniko/pull/3058) * chore(deps): bump golang.org/x/net from 0.21.0 to 0.22.0 [#3056](https://github.com/GoogleContainerTools/kaniko/pull/3056) * chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.25.2 to 1.25.3 [#3057](https://github.com/GoogleContainerTools/kaniko/pull/3057) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.51.1 to 1.51.4 [#3059](https://github.com/GoogleContainerTools/kaniko/pull/3059) * chore(deps): bump github.com/docker/docker from 25.0.3+incompatible to 25.0.4+incompatible [#3060](https://github.com/GoogleContainerTools/kaniko/pull/3060) * chore(deps): bump docker/build-push-action from 5.1.0 to 5.2.0 [#3061](https://github.com/GoogleContainerTools/kaniko/pull/3061) Huge thank you for this release towards our contributors: - Aaron Prindle - Alessandro Bitocchi - dependabot[bot] - Jérémie Augustin - Prima Adi Pradana # v1.21.1 Release 2024-03-06 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.21.1 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.21.1-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.21.1-slim ``` * chore(deps): bump cloud.google.com/go/storage from 1.38.0 to 1.39.0 [#3040](https://github.com/GoogleContainerTools/kaniko/pull/3040) * chore(deps): bump github.com/containerd/containerd from 1.7.6 to 1.7.13 [#3038](https://github.com/GoogleContainerTools/kaniko/pull/3038) * test: fix test breakage caused by external dependency update [#3049](https://github.com/GoogleContainerTools/kaniko/pull/3049) * chore(deps): bump docker/setup-buildx-action from 3.0.0 to 3.1.0 [#3037](https://github.com/GoogleContainerTools/kaniko/pull/3037) * chore(deps): bump github.com/Azure/azure-sdk-for-go/sdk/storage/azblob from 1.3.0 to 1.3.1 [#3039](https://github.com/GoogleContainerTools/kaniko/pull/3039) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] # v1.21.0 Release 2024-02-29 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.21.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.21.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.21.0-slim ``` * Add --push-ignore-immutable-tag-errors boolean CLI option [#2774](https://github.com/GoogleContainerTools/kaniko/pull/2774) * docs: fix broken links and redirects [#3009](https://github.com/GoogleContainerTools/kaniko/pull/3009) * feat: add skip tls flag for private git context [#2854](https://github.com/GoogleContainerTools/kaniko/pull/2854) * Fix unpack tar.gz archive with ADD instruction, issue #2409 [#2991](https://github.com/GoogleContainerTools/kaniko/pull/2991) * chore: update google github-action auth version [#3030](https://github.com/GoogleContainerTools/kaniko/pull/3030) * refactor: remove artifact upload from nightly-vulnerabiliy-scan.yml [#3029](https://github.com/GoogleContainerTools/kaniko/pull/3029) * feat: add nightly grype vuln scan to kaniko executor image [#2970](https://github.com/GoogleContainerTools/kaniko/pull/2970) * chore: update docker-credential-gcr to use v2 [#3026](https://github.com/GoogleContainerTools/kaniko/pull/3026) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.16.1 to 1.16.6 [#3020](https://github.com/GoogleContainerTools/kaniko/pull/3020) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.50.0 to 1.51.1 [#3021](https://github.com/GoogleContainerTools/kaniko/pull/3021) * chore(deps): bump google.golang.org/api from 0.165.0 to 0.167.0 [#3023](https://github.com/GoogleContainerTools/kaniko/pull/3023) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.27.0 to 1.27.4 [#3024](https://github.com/GoogleContainerTools/kaniko/pull/3024) * chore(deps): bump google-github-actions/auth from 2.1.1 to 2.1.2 [#3025](https://github.com/GoogleContainerTools/kaniko/pull/3025) * feat: add support for no push environment variable [#2983](https://github.com/GoogleContainerTools/kaniko/pull/2983) * Add documentation for --chown support limitation [#3019](https://github.com/GoogleContainerTools/kaniko/pull/3019) * chore(deps): bump github.com/Azure/azure-sdk-for-go/sdk/storage/azblob from 1.2.1 to 1.3.0 [#3013](https://github.com/GoogleContainerTools/kaniko/pull/3013) * chore(deps): bump google.golang.org/api from 0.161.0 to 0.165.0 [#3016](https://github.com/GoogleContainerTools/kaniko/pull/3016) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.15 to 1.16.1 [#3014](https://github.com/GoogleContainerTools/kaniko/pull/3014) * chore(deps): bump cloud.google.com/go/storage from 1.37.0 to 1.38.0 [#3015](https://github.com/GoogleContainerTools/kaniko/pull/3015) * Add flag to remap registries for any registry mirror [#2935](https://github.com/GoogleContainerTools/kaniko/pull/2935) * FIX: missing or partial support for pattern substition in variable when cache enabled [#2968](https://github.com/GoogleContainerTools/kaniko/pull/2968) * docs: add ROADMAP.md to kaniko project [#3005](https://github.com/GoogleContainerTools/kaniko/pull/3005) * chore: update MAINTAINERS file with up-to-date information [#3003](https://github.com/GoogleContainerTools/kaniko/pull/3003) * chore(deps): bump golang.org/x/oauth2 from 0.16.0 to 0.17.0 [#3000](https://github.com/GoogleContainerTools/kaniko/pull/3000) * chore(deps): bump golang.org/x/net from 0.20.0 to 0.21.0 [#2999](https://github.com/GoogleContainerTools/kaniko/pull/2999) * chore(deps): bump golang from 1.21 to 1.22 in /deploy [#2997](https://github.com/GoogleContainerTools/kaniko/pull/2997) * chore(deps): bump cloud.google.com/go/storage from 1.36.0 to 1.37.0 [#2998](https://github.com/GoogleContainerTools/kaniko/pull/2998) * chore(deps): bump golang.org/x/sys from 0.16.0 to 0.17.0 [#3001](https://github.com/GoogleContainerTools/kaniko/pull/3001) * chore(deps): bump google-github-actions/auth from 2.1.0 to 2.1.1 [#3002](https://github.com/GoogleContainerTools/kaniko/pull/3002) Huge thank you for this release towards our contributors: - Aaron Prindle - Alessandro Bitocchi - Damien Degois - dependabot[bot] - JeromeJu - Kraev Sergei - Matheus Pimenta - Oliver Radwell - Sacha Smart - schwannden # v1.20.1 Release 2024-02-10 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.20.1 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.20.1-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.20.1-slim ``` * chore(deps): bump github.com/moby/buildkit from 0.11.6 to 0.12.5, github.com/docker/docker from 24.0.7+incompatible to 25.0.2+incompatible, and other deps [#2995](https://github.com/GoogleContainerTools/kaniko/pull/2995) * chore(deps): bump google.golang.org/api from 0.157.0 to 0.161.0 [#2987](https://github.com/GoogleContainerTools/kaniko/pull/2987) * chore(deps): bump github.com/google/go-containerregistry from 0.18.0 to 0.19.0 [#2988](https://github.com/GoogleContainerTools/kaniko/pull/2988) * chore(deps): bump sigstore/cosign-installer from 3.3.0 to 3.4.0 [#2989](https://github.com/GoogleContainerTools/kaniko/pull/2989) * chore(deps): bump github.com/opencontainers/runc from 1.1.5 to 1.1.12 [#2981](https://github.com/GoogleContainerTools/kaniko/pull/2981) * README change only: Clarify why merging into another container is a bad idea [#2965](https://github.com/GoogleContainerTools/kaniko/pull/2965) * chore(deps): bump google-github-actions/auth from 2.0.1 to 2.1.0 [#2972](https://github.com/GoogleContainerTools/kaniko/pull/2972) * chore(deps): bump google-github-actions/setup-gcloud from 2.0.1 to 2.1.0 [#2973](https://github.com/GoogleContainerTools/kaniko/pull/2973) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.14 to 1.15.15 [#2975](https://github.com/GoogleContainerTools/kaniko/pull/2975) * chore(deps): bump github.com/google/go-containerregistry from 0.17.0 to 0.18.0 [#2976](https://github.com/GoogleContainerTools/kaniko/pull/2976) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.11 to 1.15.14 [#2966](https://github.com/GoogleContainerTools/kaniko/pull/2966) * chore(deps): bump google.golang.org/api from 0.155.0 to 0.157.0 [#2960](https://github.com/GoogleContainerTools/kaniko/pull/2960) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.3 to 1.26.5 [#2963](https://github.com/GoogleContainerTools/kaniko/pull/2963) * chore(deps): update go-git/go-git, ProtonMail/go-cryto, and cloudflare/circl deps [#2959](https://github.com/GoogleContainerTools/kaniko/pull/2959) * Update clarification for release.md [#2957](https://github.com/GoogleContainerTools/kaniko/pull/2957) Huge thank you for this release towards our contributors: - Aaron Prindle - Asher - Bob Du - dependabot[bot] - JeromeJu - Maximilian Hippler - timbavtbc # v1.20.0 Release 2024-01-17 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.20.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.20.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.20.0-slim ``` * chore(deps): bump golang.org/x/oauth2 from 0.15.0 to 0.16.0 [#2948](https://github.com/GoogleContainerTools/kaniko/pull/2948) * chore(deps): bump google-github-actions/auth from 2.0.0 to 2.0.1 [#2947](https://github.com/GoogleContainerTools/kaniko/pull/2947) * chore(deps): bump golang.org/x/sync from 0.5.0 to 0.6.0 [#2950](https://github.com/GoogleContainerTools/kaniko/pull/2950) * chore(deps): bump github.com/containerd/containerd from 1.7.11 to 1.7.12 [#2951](https://github.com/GoogleContainerTools/kaniko/pull/2951) * Prevent extra snapshot with --use-new-run [#2943](https://github.com/GoogleContainerTools/kaniko/pull/2943) * replace github.com/Azure/azure-storage-blob-go => github.com/Azure/azure-sdk-for-go/sdk/storage/azblob [#2945](https://github.com/GoogleContainerTools/kaniko/pull/2945) * Fixed wrong example in README.md [#2931](https://github.com/GoogleContainerTools/kaniko/pull/2931) * chore(deps): bump golang.org/x/sys from 0.15.0 to 0.16.0 [#2936](https://github.com/GoogleContainerTools/kaniko/pull/2936) * chore(deps): bump google.golang.org/api from 0.154.0 to 0.155.0 [#2937](https://github.com/GoogleContainerTools/kaniko/pull/2937) * chore(deps): bump github.com/cloudflare/circl from 1.3.3 to 1.3.7 [#2942](https://github.com/GoogleContainerTools/kaniko/pull/2942) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.9 to 1.15.11 [#2939](https://github.com/GoogleContainerTools/kaniko/pull/2939) * chore(deps): bump AdityaGarg8/remove-unwanted-software from 1 to 2 [#2940](https://github.com/GoogleContainerTools/kaniko/pull/2940) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.47.7 to 1.47.8 [#2932](https://github.com/GoogleContainerTools/kaniko/pull/2932) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.2 to 1.26.3 [#2933](https://github.com/GoogleContainerTools/kaniko/pull/2933) * chore(deps): bump github.com/google/go-containerregistry from 0.15.2 to 0.17.0 [#2924](https://github.com/GoogleContainerTools/kaniko/pull/2924) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.7 to 1.15.9 [#2926](https://github.com/GoogleContainerTools/kaniko/pull/2926) * chore(deps): bump google-github-actions/setup-gcloud from 2.0.0 to 2.0.1 [#2927](https://github.com/GoogleContainerTools/kaniko/pull/2927) Huge thank you for this release towards our contributors: - Asher - Bob Du - dependabot[bot] - Maximilian Hippler # v1.19.2 Release 2023-12-19 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.19.2 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.19.2-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.19.2-slim ``` * chore: update gcr and acr cred helpers [#2910](https://github.com/GoogleContainerTools/kaniko/pull/2910) * chore(deps): bump sigstore/cosign-installer from 3.2.0 to 3.3.0 [#2911](https://github.com/GoogleContainerTools/kaniko/pull/2911) * chore(deps): bump google.golang.org/api from 0.152.0 to 0.154.0 [#2912](https://github.com/GoogleContainerTools/kaniko/pull/2912) * chore(deps): bump cloud.google.com/go/storage from 1.35.1 to 1.36.0 [#2913](https://github.com/GoogleContainerTools/kaniko/pull/2913) * chore(deps): bump github.com/spf13/cobra from 1.7.0 to 1.8.0 [#2914](https://github.com/GoogleContainerTools/kaniko/pull/2914) * chore(deps): bump golang.org/x/crypto from 0.16.0 to 0.17.0 [#2915](https://github.com/GoogleContainerTools/kaniko/pull/2915) * fix: resolve integration test issue issue where container-diff cannot pull OCI images properly from registry [#2918](https://github.com/GoogleContainerTools/kaniko/pull/2918) * fix: also update github.com/awslabs/amazon-ecr-credential-helper to resolve issues with AWS ECR authentication (resolves #2882) [#2908](https://github.com/GoogleContainerTools/kaniko/pull/2908) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] - Patrick Decat # v1.19.1 Release 2023-12-15 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.19.1 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.19.1-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.19.1-slim ``` * Reproducing and Fixing #2892 [#2893](https://github.com/GoogleContainerTools/kaniko/pull/2893) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.15.3 to 1.15.7 [#2897](https://github.com/GoogleContainerTools/kaniko/pull/2897) * chore(deps): bump google-github-actions/setup-gcloud from 1.1.1 to 2.0.0 [#2902](https://github.com/GoogleContainerTools/kaniko/pull/2902) * chore(deps): bump actions/setup-go from 4.1.0 to 5.0.0 [#2901](https://github.com/GoogleContainerTools/kaniko/pull/2901) * chore(deps): bump github.com/containerd/containerd from 1.7.10 to 1.7.11 [#2899](https://github.com/GoogleContainerTools/kaniko/pull/2899) * chore(deps): bump github.com/go-git/go-git/v5 from 5.10.1 to 5.11.0 [#2898](https://github.com/GoogleContainerTools/kaniko/pull/2898) * chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.23.5 to 1.24.0 [#2896](https://github.com/GoogleContainerTools/kaniko/pull/2896) * chore(deps): bump github.com/containerd/containerd from 1.7.9 to 1.7.10 [#2888](https://github.com/GoogleContainerTools/kaniko/pull/2888) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.8 to 1.25.11 [#2889](https://github.com/GoogleContainerTools/kaniko/pull/2889) * chore(deps): bump google-github-actions/auth from 1.2.0 to 2.0.0 [#2886](https://github.com/GoogleContainerTools/kaniko/pull/2886) * chore(deps): bump github.com/go-git/go-git/v5 from 5.10.0 to 5.10.1 [#2890](https://github.com/GoogleContainerTools/kaniko/pull/2890) * fix: resolve aws-sdk-go-v2 lib compat issues causing ECR failures [#2885](https://github.com/GoogleContainerTools/kaniko/pull/2885) * chore(deps): bump github.com/spf13/afero from 1.10.0 to 1.11.0 [#2891](https://github.com/GoogleContainerTools/kaniko/pull/2891) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] - Maxime BOSSARD # v1.19.0 Release 2023-11-29 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.19.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.19.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.19.0-slim ``` * fix: resolve issue with copy_multistage_test.go and broken ioutil import [#2879](https://github.com/GoogleContainerTools/kaniko/pull/2879) * Fix warmer memory leak. [#2763](https://github.com/GoogleContainerTools/kaniko/pull/2763) * Skip the /kaniko directory when copying root [#2863](https://github.com/GoogleContainerTools/kaniko/pull/2863) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.5 to 1.25.8 [#2875](https://github.com/GoogleContainerTools/kaniko/pull/2875) * fix: Remove references to deprecated io/ioutil pkg [#2867](https://github.com/GoogleContainerTools/kaniko/pull/2867) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.14.0 to 1.14.3 [#2874](https://github.com/GoogleContainerTools/kaniko/pull/2874) * Create intermediate directories in COPY with correct uid and gid [#2795](https://github.com/GoogleContainerTools/kaniko/pull/2795) * chore(deps): bump google-github-actions/auth from 1.1.1 to 1.2.0 [#2868](https://github.com/GoogleContainerTools/kaniko/pull/2868) * chore(deps): bump golang.org/x/oauth2 from 0.13.0 to 0.14.0 [#2871](https://github.com/GoogleContainerTools/kaniko/pull/2871) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.43.0 to 1.44.0 [#2872](https://github.com/GoogleContainerTools/kaniko/pull/2872) * chore(deps): bump github.com/containerd/containerd from 1.7.8 to 1.7.9 [#2873](https://github.com/GoogleContainerTools/kaniko/pull/2873) * impl: add a retry with result function (#2837) [#2853](https://github.com/GoogleContainerTools/kaniko/pull/2853) * chore(deps): bump docker/build-push-action from 5.0.0 to 5.1.0 [#2857](https://github.com/GoogleContainerTools/kaniko/pull/2857) * chore(deps): bump golang.org/x/net from 0.17.0 to 0.18.0 [#2859](https://github.com/GoogleContainerTools/kaniko/pull/2859) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.13.1 to 1.14.0 [#2861](https://github.com/GoogleContainerTools/kaniko/pull/2861) * chore(deps): bump google.golang.org/api from 0.150.0 to 0.151.0 [#2862](https://github.com/GoogleContainerTools/kaniko/pull/2862) * fix: makefile container-diff on darwin [#2842](https://github.com/GoogleContainerTools/kaniko/pull/2842) * Print error to stderr instead of stdout before exiting [#2823](https://github.com/GoogleContainerTools/kaniko/pull/2823) * refactor: rm bool param detectFilesystem in `InitIgnoreList` [#2843](https://github.com/GoogleContainerTools/kaniko/pull/2843) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.22.0 to 1.24.0 [#2851](https://github.com/GoogleContainerTools/kaniko/pull/2851) * chore(deps): bump google.golang.org/api from 0.149.0 to 0.150.0 [#2845](https://github.com/GoogleContainerTools/kaniko/pull/2845) * chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.22.1 to 1.22.2 [#2846](https://github.com/GoogleContainerTools/kaniko/pull/2846) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.42.0 to 1.42.1 [#2847](https://github.com/GoogleContainerTools/kaniko/pull/2847) * chore(deps): bump golang.org/x/sys from 0.13.0 to 0.14.0 [#2848](https://github.com/GoogleContainerTools/kaniko/pull/2848) * chore(deps): bump sigstore/cosign-installer from 3.1.2 to 3.2.0 [#2849](https://github.com/GoogleContainerTools/kaniko/pull/2849) * feat: support https URLs for digest-file [#2811](https://github.com/GoogleContainerTools/kaniko/pull/2811) * impl: add a retry with result function [#2837](https://github.com/GoogleContainerTools/kaniko/pull/2837) Huge thank you for this release towards our contributors: - Aaron Prindle - Adrià Garriga-Alonso - Anna Levenberg - Anoop S - dependabot[bot] - JeromeJu - Lio李歐 - Manish Giri - Maxime BOSSARD - tal66 # v1.18.0 Release 2023-11-07 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.18.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.18.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.18.0-slim ``` * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.92 to 1.13.1 [#2829](https://github.com/GoogleContainerTools/kaniko/pull/2829) * chore(deps): bump google.golang.org/api from 0.148.0 to 0.149.0 [#2831](https://github.com/GoogleContainerTools/kaniko/pull/2831) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.40.2 to 1.42.0 [#2828](https://github.com/GoogleContainerTools/kaniko/pull/2828) * chore(deps): bump golang.org/x/sync from 0.4.0 to 0.5.0 [#2827](https://github.com/GoogleContainerTools/kaniko/pull/2827) * fix: fix COPY command error due to missing but ignored files [#2812](https://github.com/GoogleContainerTools/kaniko/pull/2812) * snapshotter: use syncfs system call [#2816](https://github.com/GoogleContainerTools/kaniko/pull/2816) * Fix missing slash [#2658](https://github.com/GoogleContainerTools/kaniko/pull/2658) * chore(deps): bump github.com/containerd/containerd from 1.7.7 to 1.7.8 [#2819](https://github.com/GoogleContainerTools/kaniko/pull/2819) * chore(deps): bump github.com/go-git/go-git/v5 from 5.9.0 to 5.10.0 [#2818](https://github.com/GoogleContainerTools/kaniko/pull/2818) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.91 to 1.11.92 [#2814](https://github.com/GoogleContainerTools/kaniko/pull/2814) * chore(deps): bump google.golang.org/api from 0.145.0 to 0.148.0 [#2810](https://github.com/GoogleContainerTools/kaniko/pull/2810) Huge thank you for this release towards our contributors: - dependabot[bot] - Paolo Di Tommaso - Quan Zhang - zhouhaibing089 # v1.17.0 Release 2023-10-18 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.17.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.17.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.17.0-slim ``` * docs: fix readme sample typo [#2792](https://github.com/GoogleContainerTools/kaniko/pull/2792) * fix: remove log line from listpullreqs.go and additional release.sh fixes [#2790](https://github.com/GoogleContainerTools/kaniko/pull/2790) * chore(deps): bump golang.org/x/sync from 0.3.0 to 0.4.0 [#2798](https://github.com/GoogleContainerTools/kaniko/pull/2798) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.87 to 1.11.91 [#2805](https://github.com/GoogleContainerTools/kaniko/pull/2805) * chore(deps): bump github.com/containerd/containerd from 1.7.6 to 1.7.7 [#2797](https://github.com/GoogleContainerTools/kaniko/pull/2797) * chore(deps): bump github.com/google/go-cmp from 0.5.9 to 0.6.0 [#2796](https://github.com/GoogleContainerTools/kaniko/pull/2796) * chore(deps): bump golang.org/x/net from 0.16.0 to 0.17.0 [#2791](https://github.com/GoogleContainerTools/kaniko/pull/2791) * fix: resolve issue with integration tests where lack of disk space caused k3s issues [#2804](https://github.com/GoogleContainerTools/kaniko/pull/2804) * test: add test cases and docString for regex in COPY command [#2773](https://github.com/GoogleContainerTools/kaniko/pull/2773) * feat: add automated way of cutting releases w/ generation of CHANGELOG.md {{PULL_REQUESTS}} Makefile changes [#2786](https://github.com/GoogleContainerTools/kaniko/pull/2786) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.40.0 to 1.40.1 [#2780](https://github.com/GoogleContainerTools/kaniko/pull/2780) * docs: Update designdoc.md with correct link to skaffold repository [#2775](https://github.com/GoogleContainerTools/kaniko/pull/2775) * chore(deps): bump google.golang.org/api from 0.143.0 to 0.145.0 [#2778](https://github.com/GoogleContainerTools/kaniko/pull/2778) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.42 to 1.18.44 [#2777](https://github.com/GoogleContainerTools/kaniko/pull/2777) * chore(deps): bump golang.org/x/oauth2 from 0.12.0 to 0.13.0 [#2781](https://github.com/GoogleContainerTools/kaniko/pull/2781) * refactor: Remove fallbackToUID bool option from Kaniko code [#2767](https://github.com/GoogleContainerTools/kaniko/pull/2767) * chore(deps): bump github.com/otiai10/copy from 1.12.0 to 1.14.0 [#2772](https://github.com/GoogleContainerTools/kaniko/pull/2772) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.86 to 1.11.87 [#2770](https://github.com/GoogleContainerTools/kaniko/pull/2770) * chore(deps): bump google.golang.org/api from 0.142.0 to 0.143.0 [#2769](https://github.com/GoogleContainerTools/kaniko/pull/2769) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.39.0 to 1.40.0 [#2771](https://github.com/GoogleContainerTools/kaniko/pull/2771) * chore(deps): bump github.com/spf13/afero from 1.9.5 to 1.10.0 [#2758](https://github.com/GoogleContainerTools/kaniko/pull/2758) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.83 to 1.11.86 [#2757](https://github.com/GoogleContainerTools/kaniko/pull/2757) * chore(deps): bump google.golang.org/api from 0.141.0 to 0.142.0 [#2756](https://github.com/GoogleContainerTools/kaniko/pull/2756) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] - JeromeJu - Vishal Khot - vivekkoya - zhangzhiqiangcs # v1.16.0 Release 2023-09-22 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.16.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.16.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.16.0-slim ``` * fix: make it so release.sh script doesn't output duplicate change PRs [#2735](https://github.com/GoogleContainerTools/kaniko/pull/2735) * chore: update function names to be correct and representative of functionality [#2720](https://github.com/GoogleContainerTools/kaniko/pull/2720) * chore(deps): bump github.com/go-git/go-git/v5 from 5.8.1 to 5.9.0 [#2749](https://github.com/GoogleContainerTools/kaniko/pull/2749) * chore(deps): bump google.golang.org/api from 0.140.0 to 0.141.0 [#2748](https://github.com/GoogleContainerTools/kaniko/pull/2748) * chore(deps): bump github.com/containerd/containerd from 1.7.5 to 1.7.6 [#2750](https://github.com/GoogleContainerTools/kaniko/pull/2750) * fix: ensure images layers correspond with the image media type [#2719](https://github.com/GoogleContainerTools/kaniko/pull/2719) * chore(deps): bump github.com/google/slowjam from 1.0.1 to 1.1.0 [#2745](https://github.com/GoogleContainerTools/kaniko/pull/2745) * chore(deps): bump docker/setup-buildx-action from 2.10.0 to 3.0.0 [#2743](https://github.com/GoogleContainerTools/kaniko/pull/2743) * chore(deps): bump github.com/go-git/go-billy/v5 from 5.4.1 to 5.5.0 [#2746](https://github.com/GoogleContainerTools/kaniko/pull/2746) * chore(deps): bump google.golang.org/api from 0.138.0 to 0.140.0 [#2747](https://github.com/GoogleContainerTools/kaniko/pull/2747) * chore(deps): bump docker/setup-qemu-action from 2.2.0 to 3.0.0 [#2744](https://github.com/GoogleContainerTools/kaniko/pull/2744) * chore(deps): bump docker/build-push-action from 4.2.1 to 5.0.0 [#2742](https://github.com/GoogleContainerTools/kaniko/pull/2742) * chore(deps): bump google.golang.org/api from 0.138.0 to 0.139.0 [#2741](https://github.com/GoogleContainerTools/kaniko/pull/2741) * chore(deps): bump cloud.google.com/go/storage from 1.32.0 to 1.33.0 [#2740](https://github.com/GoogleContainerTools/kaniko/pull/2740) * chore(deps): bump docker/build-push-action from 4.1.1 to 4.2.1 [#2739](https://github.com/GoogleContainerTools/kaniko/pull/2739) * chore(deps): bump golang.org/x/oauth2 from 0.11.0 to 0.12.0 [#2732](https://github.com/GoogleContainerTools/kaniko/pull/2732) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.81 to 1.11.83 [#2733](https://github.com/GoogleContainerTools/kaniko/pull/2733) * chore(deps): bump golang.org/x/net from 0.14.0 to 0.15.0 [#2734](https://github.com/GoogleContainerTools/kaniko/pull/2734) * chore(deps): bump github.com/containerd/containerd from 1.7.3 to 1.7.5 [#2723](https://github.com/GoogleContainerTools/kaniko/pull/2723) * chore(deps): bump sigstore/cosign-installer from 3.1.1 to 3.1.2 [#2727](https://github.com/GoogleContainerTools/kaniko/pull/2727) * chore(deps): bump docker/setup-buildx-action from 2.9.1 to 2.10.0 [#2726](https://github.com/GoogleContainerTools/kaniko/pull/2726) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.37 to 1.18.38 [#2724](https://github.com/GoogleContainerTools/kaniko/pull/2724) * chore(deps): bump golang.org/x/sys from 0.11.0 to 0.12.0 [#2722](https://github.com/GoogleContainerTools/kaniko/pull/2722) * chore: unnecessary use of fmt.Sprintf [#2717](https://github.com/GoogleContainerTools/kaniko/pull/2717) * fix function name on comment [#2707](https://github.com/GoogleContainerTools/kaniko/pull/2707) * Avoid returning the UID when resolving the GIDs. [#2689](https://github.com/GoogleContainerTools/kaniko/pull/2689) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] - Diego Gonzalez - geekvest - guangwu - Logan Price # v1.15.0 Release 2023-08-29 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.15.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.15.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.15.0-slim ``` * Ensure New Layers Match Image Media Type [#2700](https://github.com/GoogleContainerTools/kaniko/pull/2700) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.79 to 1.11.81 [#2702](https://github.com/GoogleContainerTools/kaniko/pull/2702) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.38.4 to 1.38.5 [#2706](https://github.com/GoogleContainerTools/kaniko/pull/2706) * chore(deps): bump google.golang.org/api from 0.136.0 to 0.138.0 [#2704](https://github.com/GoogleContainerTools/kaniko/pull/2704) * chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.20.3 to 1.21.0 [#2703](https://github.com/GoogleContainerTools/kaniko/pull/2703) * docs: fix --use-new-run typo [#2698](https://github.com/GoogleContainerTools/kaniko/pull/2698) * docs: add more information regarding --use-new-run [#2687](https://github.com/GoogleContainerTools/kaniko/pull/2687) * chore(deps): bump cloud.google.com/go/storage from 1.31.0 to 1.32.0 [#2692](https://github.com/GoogleContainerTools/kaniko/pull/2692) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.77 to 1.11.79 [#2690](https://github.com/GoogleContainerTools/kaniko/pull/2690) * Fix: Change condition for the behaviour when --no-push=true without setting --destinations [#2676](https://github.com/GoogleContainerTools/kaniko/pull/2676) Huge thank you for this release towards our contributors: - Aaron Prindle - dependabot[bot] - JeromeJu - Logan Price # v1.14.0 Release 2023-08-15 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.14.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.14.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.14.0-slim ``` * chore(deps): bump actions/setup-go from 4.0.1 to 4.1.0 [#2672](https://github.com/GoogleContainerTools/kaniko/pull/2672) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.31 [#2651](https://github.com/GoogleContainerTools/kaniko/pull/2651) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.33 [#2680](https://github.com/GoogleContainerTools/kaniko/pull/2680) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.73 to 1.11.75 [#2650](https://github.com/GoogleContainerTools/kaniko/pull/2650) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.75 to 1.11.77 [#2679](https://github.com/GoogleContainerTools/kaniko/pull/2679) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.37.0 to 1.37.1 [#2648](https://github.com/GoogleContainerTools/kaniko/pull/2648) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.38.0 to 1.38.2 [#2673](https://github.com/GoogleContainerTools/kaniko/pull/2673) * chore(deps): bump github.com/containerd/containerd from 1.7.2 to 1.7.3 [#2644](https://github.com/GoogleContainerTools/kaniko/pull/2644) * chore(deps): bump github.com/go-git/go-git/v5 from 5.8.0 to 5.8.1 [#2662](https://github.com/GoogleContainerTools/kaniko/pull/2662) * chore(deps): bump golang from 1.20 to 1.21 in /deploy [#2682](https://github.com/GoogleContainerTools/kaniko/pull/2682) * chore(deps): bump golang.org/x/net from 0.12.0 to 0.14.0 [#2663](https://github.com/GoogleContainerTools/kaniko/pull/2663) * chore(deps): bump golang.org/x/oauth2 from 0.10.0 to 0.11.0 [#2661](https://github.com/GoogleContainerTools/kaniko/pull/2661) * chore(deps): bump golang.org/x/sys from 0.10.0 to 0.11.0 [#2659](https://github.com/GoogleContainerTools/kaniko/pull/2659) * chore(deps): bump google.golang.org/api from 0.133.0 to 0.134.0 [#2645](https://github.com/GoogleContainerTools/kaniko/pull/2645) * chore(deps): bump google.golang.org/api from 0.134.0 to 0.136.0 [#2681](https://github.com/GoogleContainerTools/kaniko/pull/2681) * docs: add enforcement section to code-of-conduct.md [#2654](https://github.com/GoogleContainerTools/kaniko/pull/2654) * feat: added skip-push-permission flag [#2657](https://github.com/GoogleContainerTools/kaniko/pull/2657) * fix: resolve issue where CI env was failing due to dependency change [#2668](https://github.com/GoogleContainerTools/kaniko/pull/2668) * refactor: Avoid redundant calls to filepath.Clean [#2652](https://github.com/GoogleContainerTools/kaniko/pull/2652) Huge thank you for this release towards our contributors: - Aaron Lehmann - Aaron Prindle - dependabot[bot] - Julian # v1.13.0 Release 2023-07-26 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.13.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.13.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.13.0-slim ``` * chore(deps): bump cloud.google.com/go/storage from 1.30.1 to 1.31.0 [#2611](https://github.com/GoogleContainerTools/kaniko/pull/2611) * chore(deps): bump docker/setup-buildx-action from 2.7.0 to 2.8.0 [#2606](https://github.com/GoogleContainerTools/kaniko/pull/2606) * chore(deps): bump docker/setup-buildx-action from 2.8.0 to 2.9.1 [#2626](https://github.com/GoogleContainerTools/kaniko/pull/2626) * chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.18.1 to 1.19.0 [#2623](https://github.com/GoogleContainerTools/kaniko/pull/2623) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 [#2638](https://github.com/GoogleContainerTools/kaniko/pull/2638) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.70 to 1.11.71 [#2610](https://github.com/GoogleContainerTools/kaniko/pull/2610) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.71 to 1.11.72 [#2624](https://github.com/GoogleContainerTools/kaniko/pull/2624) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.72 to 1.11.73 [#2639](https://github.com/GoogleContainerTools/kaniko/pull/2639) * chore(deps): bump github.com/go-git/go-git/v5 from 5.7.0 to 5.8.0 [#2633](https://github.com/GoogleContainerTools/kaniko/pull/2633) * chore(deps): bump golang.org/x/oauth2 from 0.9.0 to 0.10.0 [#2617](https://github.com/GoogleContainerTools/kaniko/pull/2617) * chore(deps): bump golang.org/x/sys from 0.9.0 to 0.10.0 [#2613](https://github.com/GoogleContainerTools/kaniko/pull/2613) * chore(deps): bump google.golang.org/api from 0.128.0 to 0.129.0 [#2609](https://github.com/GoogleContainerTools/kaniko/pull/2609) * chore(deps): bump google.golang.org/api from 0.129.0 to 0.131.0 [#2625](https://github.com/GoogleContainerTools/kaniko/pull/2625) * chore(deps): bump google.golang.org/api from 0.131.0 to 0.132.0 [#2634](https://github.com/GoogleContainerTools/kaniko/pull/2634) * chore(deps): bump google.golang.org/api from 0.132.0 to 0.133.0 [#2636](https://github.com/GoogleContainerTools/kaniko/pull/2636) * chore(deps): bump sigstore/cosign-installer from 3.1.0 to 3.1.1 [#2607](https://github.com/GoogleContainerTools/kaniko/pull/2607) * feat: Allows to disable the fallback to the default registry on image pull [#2637](https://github.com/GoogleContainerTools/kaniko/pull/2637) Huge thank you for this release towards our contributors: - dependabot[bot] - Fernando Giannetti # v1.12.1 Release 2023-06-29 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.12.1 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.12.1-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.12.1-slim ``` The warmer images are available at: ``` gcr.io/kaniko-project/warmer:v1.12.1 gcr.io/kaniko-project/warmer:latest ``` Fixes: * fix: resolve issue where warmer CLI always validated optional arg -> breakage for majority of users [#2603](https://github.com/GoogleContainerTools/kaniko/pull/2603) # v1.12.0 Release 2023-06-28 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.12.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.12.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.12.0-slim ``` * chore: add debug line to RedoHasher [#2591](https://github.com/GoogleContainerTools/kaniko/pull/2591) * chore(deps): bump docker/build-push-action from 4.0.0 to 4.1.0 [#2557](https://github.com/GoogleContainerTools/kaniko/pull/2557) * chore(deps): bump docker/build-push-action from 4.1.0 to 4.1.1 [#2580](https://github.com/GoogleContainerTools/kaniko/pull/2580) * chore(deps): bump docker/setup-buildx-action from 2.5.0 to 2.6.0 [#2555](https://github.com/GoogleContainerTools/kaniko/pull/2555) * chore(deps): bump docker/setup-buildx-action from 2.6.0 to 2.7.0 [#2579](https://github.com/GoogleContainerTools/kaniko/pull/2579) * chore(deps): bump docker/setup-qemu-action from 2.1.0 to 2.2.0 [#2556](https://github.com/GoogleContainerTools/kaniko/pull/2556) * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.27 [#2581](https://github.com/GoogleContainerTools/kaniko/pull/2581) * chore(deps): bump github.com/aws/aws-sdk-go-v2/feature/s3/manager from 1.11.67 to 1.11.70 [#2597](https://github.com/GoogleContainerTools/kaniko/pull/2597) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.33.1 to 1.35.0 [#2582](https://github.com/GoogleContainerTools/kaniko/pull/2582) * chore(deps): bump github.com/otiai10/copy from 1.11.0 to 1.12.0 [#2598](https://github.com/GoogleContainerTools/kaniko/pull/2598) * chore(deps): bump golang.org/x/oauth2 from 0.8.0 to 0.9.0 [#2578](https://github.com/GoogleContainerTools/kaniko/pull/2578) * chore(deps): bump golang.org/x/sync from 0.2.0 to 0.3.0 [#2573](https://github.com/GoogleContainerTools/kaniko/pull/2573) * chore(deps): bump golang.org/x/sys from 0.8.0 to 0.9.0 [#2564](https://github.com/GoogleContainerTools/kaniko/pull/2564) * chore(deps): bump google.golang.org/api from 0.125.0 to 0 * chore(deps): bump google.golang.org/api from 0.126.0 to 0.127.0 [#2565](https://github.com/GoogleContainerTools/kaniko/pull/2565) * chore(deps): bump google.golang.org/api from 0.127.0 to 0.128.0 [#2596](https://github.com/GoogleContainerTools/kaniko/pull/2596) * chore(deps): bump sigstore/cosign-installer from 3.0.5 to 3.1.0 [#2595](https://github.com/GoogleContainerTools/kaniko/pull/2595) * Don't write whiteout files to directories that were replaced with files or links [#2590](https://github.com/GoogleContainerTools/kaniko/pull/2590) * feat: cache dockerfile images through warmer [#2499](https://github.com/GoogleContainerTools/kaniko/pull/2499) * Fix fs_util tests failing on systems with /tmp mountpoint [#2583](https://github.com/GoogleContainerTools/kaniko/pull/2583) * Fix multistage caching with COPY --from [#2559](https://github.com/GoogleContainerTools/kaniko/pull/2559) * fix: hack/boilerplate.sh: fix error handling and use python3 [#2587](https://github.com/GoogleContainerTools/kaniko/pull/2587) * fix: hack/install_golint.sh: allow installation on linux/arm64 [#2585](https://github.com/GoogleContainerTools/kaniko/pull/2585) * fix: install tools using go.mod for versioning [#2562](https://github.com/GoogleContainerTools/kaniko/pull/2562) * fix: Refactors IsSrcRemoteFileURL to only validate the URL is valid [#2563](https://github.com/GoogleContainerTools/kaniko/pull/2563) * fix: update cache-ttl help text to be correct regarding unit of duration [#2568](https://github.com/GoogleContainerTools/kaniko/pull/2568) * fix: valdiateFlags typo fixed [#2554](https://github.com/GoogleContainerTools/kaniko/pull/2554) Huge thank you for this release towards our contributors: - Aaron Prindle - alexezio - Andreas Fleig - Angus Williams - dependabot[bot] - Kraev Sergei - Liam Newman - Zigelboim Misha # v1.11.0 Release 2023-06-08 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.11.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.11.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.11.0-slim ``` * chore: run go mod tidy [#2532](https://github.com/GoogleContainerTools/kaniko/pull/2532) * chore(deps): bump actions/setup-go from 3.2.0 to 4.0.1 [#2517](https://github.com/GoogleContainerTools/kaniko/pull/2517) * chore(deps): bump cloud.google.com/go/storage from 1.29.0 to 1.30.1 [#2439](https://github.com/GoogleContainerTools/kaniko/pull/2439) * chore(deps): bump docker/setup-buildx-action from 2.0.0 to 2.5.0 [#2519](https://github.com/GoogleContainerTools/kaniko/pull/2519) * chore(deps): bump github.com/containerd/containerd from 1.7.0 to 1.7.1 [#2534](https://github.com/GoogleContainerTools/kaniko/pull/2534) * chore(deps): bump github.com/containerd/containerd from 1.7.1 to 1.7.2 [#2542](https://github.com/GoogleContainerTools/kaniko/pull/2542) * chore(deps): bump github.com/go-git/go-git/v5 from 5.4.2 to 5.7.0 [#2528](https://github.com/GoogleContainerTools/kaniko/pull/2528) * chore(deps): bump github.com/google/go-containerregistry from 0.15.1 to 0.15.2 [#2546](https://github.com/GoogleContainerTools/kaniko/pull/2546) * chore(deps): bump github.com/moby/buildkit from 0.11.4 to 0.11.6 [#2520](https://github.com/GoogleContainerTools/kaniko/pull/2520) * chore(deps): bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 [#2545](https://github.com/GoogleContainerTools/kaniko/pull/2545) * chore(deps): bump google.golang.org/api from 0.121.0 to 0.124.0 [#2535](https://github.com/GoogleContainerTools/kaniko/pull/2535) * chore(deps): bump google.golang.org/api from 0.124.0 to 0.125.0 [#2544](https://github.com/GoogleContainerTools/kaniko/pull/2544) * chore(deps): bump sigstore/cosign-installer from 3.0.3 to 3.0.5 [#2518](https://github.com/GoogleContainerTools/kaniko/pull/2518) * chore(deps): update docker-credential-* binaries in kaniko images [#2531](https://github.com/GoogleContainerTools/kaniko/pull/2531) * chore(deps): Update google-github-actions/setup-gcloud to v1.1.1 [#2548](https://github.com/GoogleContainerTools/kaniko/pull/2548) * chore(deps): use aws-sdk-go-v2 [#2550](https://github.com/GoogleContainerTools/kaniko/pull/2550) * docs: Add guide on creating multi-arch manifests [#2306](https://github.com/GoogleContainerTools/kaniko/pull/2306) * docs: update changelog to correct old release tags [#2536](https://github.com/GoogleContainerTools/kaniko/pull/2536) * fix: Deduplicate paths while saving files for later use [#2504](https://github.com/GoogleContainerTools/kaniko/pull/2504) * fix: Download docker-credential-gcr from release artifacts [#2540](https://github.com/GoogleContainerTools/kaniko/pull/2540) * refactor: Use a multistage image to remove all redundancies on Dockerfiles [#2547](https://github.com/GoogleContainerTools/kaniko/pull/2547) * test: only build for linux/amd64 on PRs [#2460](https://github.com/GoogleContainerTools/kaniko/pull/2460) Huge thank you for this release towards our contributors: - Aaron Prindle - Bob Du - dependabot[bot] - Fedor V - Ferran Vidal - Jason Hall - Jasper Ben Orschulko # v1.10.0 Release 2023-05-24 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.10.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.10.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.10.0-slim ``` * chore(deps): bump github.com/sirupsen/logrus from 1.9.0 to 1.9.2 [#2522](https://github.com/GoogleContainerTools/kaniko/pull/2522) * chore(deps): bump github.com/otiai10/copy from 1.7.0 to 1.11.0 [#2523](https://github.com/GoogleContainerTools/kaniko/pull/2523) * Add mTLS (client cert) registry authentication [#2180](https://github.com/GoogleContainerTools/kaniko/pull/2180) * chore: Revert "chore(deps): bump google-github-actions/setup-gcloud from 0.5.1 to 1.1.1 (#2502)" [#2524](https://github.com/GoogleContainerTools/kaniko/pull/2524) * Light editing to scripts in hack/gofmt [#2236](https://github.com/GoogleContainerTools/kaniko/pull/2236) * chore(deps): bump golang from 1.19 to 1.20 in /deploy [#2388](https://github.com/GoogleContainerTools/kaniko/pull/2388) * chore(deps): bump imjasonh/setup-crane from 0.1 to 0.3 [#2401](https://github.com/GoogleContainerTools/kaniko/pull/2401) * chore(deps): bump golang.org/x/sync from 0.1.0 to 0.2.0 [#2497](https://github.com/GoogleContainerTools/kaniko/pull/2497) * fix: Correct deprecated flags in `README.md` [#2335](https://github.com/GoogleContainerTools/kaniko/pull/2335) * chore(deps): bump docker/setup-qemu-action from 1.2.0 to 2.1.0 [#2287](https://github.com/GoogleContainerTools/kaniko/pull/2287) * Delete scorecards-analysis.yml [#2510](https://github.com/GoogleContainerTools/kaniko/pull/2510) * chore(deps): bump docker/build-push-action from 3.2.0 to 4.0.0 [#2505](https://github.com/GoogleContainerTools/kaniko/pull/2505) * chore(deps): bump github.com/docker/distribution from 2.8.1+incompatible to 2.8.2+incompatible [#2503](https://github.com/GoogleContainerTools/kaniko/pull/2503) * chore(deps): bump ossf/scorecard-action from 1.1.1 to 2.1.3 [#2506](https://github.com/GoogleContainerTools/kaniko/pull/2506) * chore(deps): bump golang.org/x/sys from 0.7.0 to 0.8.0 [#2507](https://github.com/GoogleContainerTools/kaniko/pull/2507) * chore(deps): bump github.com/google/go-containerregistry from 0.14.0 to 0.15.1 [#2508](https://github.com/GoogleContainerTools/kaniko/pull/2508) * chore(deps): bump github.com/google/slowjam from 1.0.0 to 1.0.1 [#2498](https://github.com/GoogleContainerTools/kaniko/pull/2498) * chore(deps): bump google-github-actions/setup-gcloud from 0.5.1 to 1.1.1 [#2502](https://github.com/GoogleContainerTools/kaniko/pull/2502) * chore: add .vscode/ dir to .gitignore [#2501](https://github.com/GoogleContainerTools/kaniko/pull/2501) * chore(deps): bump sigstore/cosign-installer from 3.0.1 to 3.0.3 [#2495](https://github.com/GoogleContainerTools/kaniko/pull/2495) * chore(deps): bump google.golang.org/api from 0.120.0 to 0.121.0 [#2496](https://github.com/GoogleContainerTools/kaniko/pull/2496) * chore(deps): bump github.com/spf13/afero from 1.9.2 to 1.9.5 [#2448](https://github.com/GoogleContainerTools/kaniko/pull/2448) * chore(deps): bump google.golang.org/api from 0.110.0 to 0.120.0 [#2484](https://github.com/GoogleContainerTools/kaniko/pull/2484) * chore(deps): bump github/codeql-action from 2.1.8 to 2.3.2 [#2487](https://github.com/GoogleContainerTools/kaniko/pull/2487) * chore(deps): bump github.com/docker/docker from 23.0.1+incompatible to 23.0.5+incompatible [#2489](https://github.com/GoogleContainerTools/kaniko/pull/2489) * chore(deps): bump github.com/aws/aws-sdk-go from 1.44.24 to 1.44.253 [#2490](https://github.com/GoogleContainerTools/kaniko/pull/2490) * fix: use debian buster to fix tests using no longer supported stretch which had broken apt-get urls [#2485](https://github.com/GoogleContainerTools/kaniko/pull/2485) * chore(deps): bump google.golang.org/protobuf from 1.29.0 to 1.29.1 [#2442](https://github.com/GoogleContainerTools/kaniko/pull/2442) * Use correct media type for zstd layers [#2459](https://github.com/GoogleContainerTools/kaniko/pull/2459) * Add support for zstd compression [#2313](https://github.com/GoogleContainerTools/kaniko/pull/2313) * chore(deps): bump github.com/opencontainers/runc from 1.1.4 to 1.1.5 [#2453](https://github.com/GoogleContainerTools/kaniko/pull/2453) Huge thank you for this release towards our contributors: - Aaron Prindle - Aaruni Aggarwal - Abirdcfly - Adrian Newby - almg80 - Anbraten - Andreas Fleig - Andrei Kvapil - ankitm123 - Aris Buzachis - Benjamin Krenn - Bernardo Marques - Bryan A. S - chenggui53 - Chuang Wang - claudex - Dávid Szakállas - Dawei Ma - dependabot[bot] - Diego Gonzalez - dmr - ejose19 - Eng Zer Jun - ePirat - Eric - Florian Apolloner - François JACQUES - Gabriel Nützi - Gilbert Gilb's - Guillaume Calmettes - Herman - Hingbong Lo - Igor Scheller - Ishant Mrinal Haloi - Jack - Jake Sanders - Janosch Maier - Jason D'Amour - Jason Hall - Jasper Ben Orschulko - Jerry Jones - jeunii - Joe Kimmel - Joël Pepper - Jonas Gröger - Jose Donizetti - Junwon Kwon - Kamal Nasser - Konstantin Demin - Kun Lu - Lars Seipel - Lavrenti Frobeen - Liwen Guo - Lukas - Mark Moretto - Matt Moore - Max Walther - Mikhail Vasin - Natalie Arellano - Naveen - nihilo - Oliver Gregorius - Pat Litke - Patrick Barker - priyawadhwa - Ramy - Rhianna - Sebastiaan Tammer - Shude Li - Sigurd Spieckermann - Silvano Cirujano Cuesta - Tejal Desai - Tony De La Nuez - Travis DePrato - Viacheslav Artamonov - Víctor - Wolfgang Walther - wwade - Yahav Itzhak - ygelfand - Yonatan Koren - zhouhaibing089 # v1.9.2 Release 2023-03-27 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.9.2 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.9.2-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.9.2-slim ``` * fix(executor): make pax tar builds reproducible again [#2384](https://github.com/GoogleContainerTools/kaniko/pull/2384) * Upgrade docker [#2440](https://github.com/GoogleContainerTools/kaniko/pull/2440) * Update ACR credential helper to enable Azure Workload Identity [#2431](https://github.com/GoogleContainerTools/kaniko/pull/2431) * bump cosign version used to sign images [#2437](https://github.com/GoogleContainerTools/kaniko/pull/2437) * Fix Integration tests [#2425](https://github.com/GoogleContainerTools/kaniko/pull/2425) * chore(deps): bump golang from 1.17 to 1.19 in /deploy [#2328](https://github.com/GoogleContainerTools/kaniko/pull/2328) * chore: fix typo [#2316](https://github.com/GoogleContainerTools/kaniko/pull/2316) * ci: don't cache certs stage [#2296](https://github.com/GoogleContainerTools/kaniko/pull/2296) * fix(executor): make pax tar builds reproducible again [#2384](https://github.com/GoogleContainerTools/kaniko/pull/2384) * Upgrade docker [#2440](https://github.com/GoogleContainerTools/kaniko/pull/2440) * Update ACR credential helper to enable Azure Workload Identity [#2431](https://github.com/GoogleContainerTools/kaniko/pull/2431) * bump cosign version used to sign images [#2437](https://github.com/GoogleContainerTools/kaniko/pull/2437) * Fix Integration tests [#2425](https://github.com/GoogleContainerTools/kaniko/pull/2425) * chore(deps): bump golang from 1.17 to 1.19 in /deploy [#2328](https://github.com/GoogleContainerTools/kaniko/pull/2328) * chore: fix typo [#2316](https://github.com/GoogleContainerTools/kaniko/pull/2316) * ci: don't cache certs stage [#2296](https://github.com/GoogleContainerTools/kaniko/pull/2296) * chore: fix typo [#2289](https://github.com/GoogleContainerTools/kaniko/pull/2289) * fix(WORKDIR): use the config.User for the new dir permissions [#2269](https://github.com/GoogleContainerTools/kaniko/pull/2269) * Provide `--cache-repo` as OCI image layout path [#2250](https://github.com/GoogleContainerTools/kaniko/pull/2250) Huge thank you for this release towards our contributors: - Aaruni Aggarwal - Abirdcfly - Adrian Newby - almg80 - Anbraten - Andreas Fleig - Andrei Kvapil - ankitm123 - Aris Buzachis - Benjamin Krenn - Bernardo Marques - Bryan A. S - chenggui53 - Chuang Wang - claudex - Dávid Szakállas - Dawei Ma - dependabot[bot] - Diego Gonzalez - dmr - ejose19 - Eng Zer Jun - ePirat - Florian Apolloner - François JACQUES - Gabriel Nützi - Gilbert Gilb's - Guillaume Calmettes - Herman - Hingbong Lo - Igor Scheller - Ishant Mrinal Haloi - Jack - Jake Sanders - Janosch Maier - Jason D'Amour - Jason Hall - Jasper Ben Orschulko - Jerry Jones - jeunii - Joe Kimmel - Joël Pepper - Jonas Gröger - Jose Donizetti - Junwon Kwon - Kamal Nasser - Konstantin Demin - Kun Lu - Lars Seipel - Liwen Guo - Lukas - Matt Moore - Max Walther - Mikhail Vasin - Natalie Arellano - Naveen - nihilo - Oliver Gregorius - Pat Litke - Patrick Barker - priyawadhwa - Ramy - Rhianna - Sebastiaan Tammer - Shude Li - Sigurd Spieckermann - Silvano Cirujano Cuesta - Tejal Desai - Tony De La Nuez - Travis DePrato - Viacheslav Artamonov - Víctor - Wolfgang Walther - wwade - Yahav Itzhak - ygelfand - Yonatan Koren - zhouhaibing089 # v1.9.1 Release 2022-09-26 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.9.1 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.9.1-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.9.1-slim ``` * (fix):Pass full URI path to `bucket.GetNameAndFilepathFromURI` [#2221](https://github.com/GoogleContainerTools/kaniko/pull/2221) * Add the ability to skip unpacking the initial file system [#2234](https://github.com/GoogleContainerTools/kaniko/pull/2234) * chore: remove duplicate word in comments [#2232](https://github.com/GoogleContainerTools/kaniko/pull/2232) * docs(CHANGELOG.md): fix link to issue #2040 [#2228](https://github.com/GoogleContainerTools/kaniko/pull/2228) * feat: disable cache-copy-layers in multistage builds; closes 2065 [#2227](https://github.com/GoogleContainerTools/kaniko/pull/2227) * bump cosign version so it can sign [#2224](https://github.com/GoogleContainerTools/kaniko/pull/2224) * fix(README.md): remove duplicate caching section [#2223](https://github.com/GoogleContainerTools/kaniko/pull/2223) * refactor: Make CLI argument names consistent [#2084](https://github.com/GoogleContainerTools/kaniko/pull/2084) * fix(KanikoDir): update DOCKER_CONFIG env when use custom kanikoDir [#2202](https://github.com/GoogleContainerTools/kaniko/pull/2202) * (fix):Pass full URI path to `bucket.GetNameAndFilepathFromURI` [#2221](https://github.com/GoogleContainerTools/kaniko/pull/2221) * Add the ability to skip unpacking the initial file system [#2234](https://github.com/GoogleContainerTools/kaniko/pull/2234) * chore: remove duplicate word in comments [#2232](https://github.com/GoogleContainerTools/kaniko/pull/2232) * docs(CHANGELOG.md): fix link to issue #2040 [#2228](https://github.com/GoogleContainerTools/kaniko/pull/2228) * feat: disable cache-copy-layers in multistage builds; closes 2065 [#2227](https://github.com/GoogleContainerTools/kaniko/pull/2227) * bump cosign version so it can sign [#2224](https://github.com/GoogleContainerTools/kaniko/pull/2224) * fix(README.md): remove duplicate caching section [#2223](https://github.com/GoogleContainerTools/kaniko/pull/2223) * refactor: Make CLI argument names consistent [#2084](https://github.com/GoogleContainerTools/kaniko/pull/2084) * fix(KanikoDir): update DOCKER_CONFIG env when use custom kanikoDir [#2202](https://github.com/GoogleContainerTools/kaniko/pull/2202) Huge thank you for this release towards our contributors: - Aaruni Aggarwal - Abirdcfly - Adrian Newby - almg80 - Anbraten - Andreas Fleig - Andrei Kvapil - ankitm123 - Benjamin Krenn - Bernardo Marques - Bryan A. S - chenggui53 - Chuang Wang - claudex - Dávid Szakállas - Dawei Ma - dependabot[bot] - Diego Gonzalez - dmr - ejose19 - Eng Zer Jun - ePirat - Florian Apolloner - François JACQUES - Gabriel Nützi - Gilbert Gilb's - Guillaume Calmettes - Herman - Hingbong Lo - Igor Scheller - Ishant Mrinal Haloi - Jack - Jake Sanders - Janosch Maier - Jason D'Amour - Jason Hall - Jasper Ben Orschulko - jeunii - Jonas Gröger - Jose Donizetti - Kamal Nasser - Konstantin Demin - Kun Lu - Lars Seipel - Liwen Guo - Lukas - Matt Moore - Max Walther - Mikhail Vasin - Natalie Arellano - Naveen - nihilo - Oliver Gregorius - Pat Litke - Patrick Barker - priyawadhwa - Ramy - Rhianna - Sebastiaan Tammer - Sigurd Spieckermann - Silvano Cirujano Cuesta - Tejal Desai - Tony De La Nuez - Travis DePrato - Víctor - Wolfgang Walther - wwade - Yahav Itzhak - ygelfand - Yonatan Koren - zhouhaibing089 # v1.9.0 Release 2022-08-09 ## Highlights - Installed binaries are missing from image [#2049](https://github.com/GoogleContainerTools/kaniko/issues/2049) - proc: detect kubernetes runtime by mounts [#2054](https://github.com/GoogleContainerTools/kaniko/pull/2054) - Fixes #2046: make target stage lookup case insensitive [#2047](https://github.com/GoogleContainerTools/kaniko/pull/2047) - fix: Refactor LayersMap to correct old strange code behavior [#2066](https://github.com/GoogleContainerTools/kaniko/pull/2066) - Fix missing setuid flags on COPY --from=build operation [#2089](https://github.com/GoogleContainerTools/kaniko/pull/2089) - Fixes #2046: make target stage lookup case insensitive [#2047](https://github.com/GoogleContainerTools/kaniko/pull/2047) - Add GitLab CI credentials helper [#2040](https://github.com/GoogleContainerTools/kaniko/pull/2040) - and a number of dependency bumps The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.9.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.9.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.9.0-slim ``` * add cache option for run command [#2032](https://github.com/GoogleContainerTools/kaniko/pull/2032) * fix: kaniko dir env unused [#2067](https://github.com/GoogleContainerTools/kaniko/pull/2067) * fix: getUIDandGID is able to resolve non-existing users and groups [#2106](https://github.com/GoogleContainerTools/kaniko/pull/2106) * fix(Dockerfile): use temporary busybox mount to create /kaniko directory [#2155](https://github.com/GoogleContainerTools/kaniko/pull/2155) * Fix the /kaniko directory permissions in container [#2009](https://github.com/GoogleContainerTools/kaniko/pull/2009) * ci(setup-minikube): use cri-dockerd [#2149](https://github.com/GoogleContainerTools/kaniko/pull/2149) * CA certificates tasks in kaniko images [#2142](https://github.com/GoogleContainerTools/kaniko/pull/2142) * refactor: simpler local integration tests [#2110](https://github.com/GoogleContainerTools/kaniko/pull/2110) * fix: use refrence should after err handles [#2128](https://github.com/GoogleContainerTools/kaniko/pull/2128) * fix: Add test for issue #2049 [#2114](https://github.com/GoogleContainerTools/kaniko/pull/2114) * Bump ossf/scorecard-action from 1.0.4 to 1.1.1 [#2116](https://github.com/GoogleContainerTools/kaniko/pull/2116) * Bump github.com/aws/aws-sdk-go from 1.43.36 to 1.44.24 [#2111](https://github.com/GoogleContainerTools/kaniko/pull/2111) * Bump actions/setup-go from 3.0.0 to 3.2.0 [#2112](https://github.com/GoogleContainerTools/kaniko/pull/2112) * Write parent directories to tar before whiteout files [#2113](https://github.com/GoogleContainerTools/kaniko/pull/2113) * fix(ci): Docker build for issue 1837 [#2095](https://github.com/GoogleContainerTools/kaniko/pull/2095) * Update Azure credHelpers docs [#2109](https://github.com/GoogleContainerTools/kaniko/pull/2109) * Fix missing setuid flags on COPY --from=build operation [#2089](https://github.com/GoogleContainerTools/kaniko/pull/2089) * fix: `COPY --chown` regression tests [#2097](https://github.com/GoogleContainerTools/kaniko/pull/2097) * fix: Regression test for #2066 [#2096](https://github.com/GoogleContainerTools/kaniko/pull/2096) * fix: Refactor `LayersMap` to correct old strange code behavior [#2066](https://github.com/GoogleContainerTools/kaniko/pull/2066) * fix: Main [#2094](https://github.com/GoogleContainerTools/kaniko/pull/2094) * feat: add flag to disable pushing cache [#2038](https://github.com/GoogleContainerTools/kaniko/pull/2038) * hasher: hash security.capability attributes [#1994](https://github.com/GoogleContainerTools/kaniko/pull/1994) * Documentation: Clarify README.md blurb on `--cache-copy-layers` [#2064](https://github.com/GoogleContainerTools/kaniko/pull/2064) * Fix release tagging workflow [#2034](https://github.com/GoogleContainerTools/kaniko/pull/2034) * Bump docker/setup-buildx-action from 1.6.0 to 2 [#2081](https://github.com/GoogleContainerTools/kaniko/pull/2081) * Bump go-containerregistry dependency [#2076](https://github.com/GoogleContainerTools/kaniko/pull/2076) * Fix: Flatten layer function needs to return existing files in the layer correctly [#2057](https://github.com/GoogleContainerTools/kaniko/pull/2057) * fix: Remove hardcoded whiteout prefix [#2056](https://github.com/GoogleContainerTools/kaniko/pull/2056) * proc: detect kubernetes runtime by mounts [#2054](https://github.com/GoogleContainerTools/kaniko/pull/2054) * Fixes #2046: make target stage lookup case insensitive [#2047](https://github.com/GoogleContainerTools/kaniko/pull/2047) * Add GitLab CI credentials helper [#2040](https://github.com/GoogleContainerTools/kaniko/pull/2040) * Bump sigstore/cosign-installer from b4f55743d10d066fee1de1cf0fa26069700c0195 to 2.2.0 [#2044](https://github.com/GoogleContainerTools/kaniko/pull/2044) * Bump github/codeql-action from 2.1.6 to 2.1.8 [#2043](https://github.com/GoogleContainerTools/kaniko/pull/2043) * Bump github.com/aws/aws-sdk-go from 1.43.31 to 1.43.36 [#2042](https://github.com/GoogleContainerTools/kaniko/pull/2042) * Bump cloud.google.com/go/storage from 1.21.0 to 1.22.0 [#2041](https://github.com/GoogleContainerTools/kaniko/pull/2041) * add cache option for run command [#2032](https://github.com/GoogleContainerTools/kaniko/pull/2032) * fix: kaniko dir env unused [#2067](https://github.com/GoogleContainerTools/kaniko/pull/2067) * fix: getUIDandGID is able to resolve non-existing users and groups [#2106](https://github.com/GoogleContainerTools/kaniko/pull/2106) * fix(Dockerfile): use temporary busybox mount to create /kaniko directory [#2155](https://github.com/GoogleContainerTools/kaniko/pull/2155) * Fix the /kaniko directory permissions in container [#2009](https://github.com/GoogleContainerTools/kaniko/pull/2009) * ci(setup-minikube): use cri-dockerd [#2149](https://github.com/GoogleContainerTools/kaniko/pull/2149) * CA certificates tasks in kaniko images [#2142](https://github.com/GoogleContainerTools/kaniko/pull/2142) * refactor: simpler local integration tests [#2110](https://github.com/GoogleContainerTools/kaniko/pull/2110) * fix: use refrence should after err handles [#2128](https://github.com/GoogleContainerTools/kaniko/pull/2128) * fix: Add test for issue #2049 [#2114](https://github.com/GoogleContainerTools/kaniko/pull/2114) * Bump ossf/scorecard-action from 1.0.4 to 1.1.1 [#2116](https://github.com/GoogleContainerTools/kaniko/pull/2116) * Bump github.com/aws/aws-sdk-go from 1.43.36 to 1.44.24 [#2111](https://github.com/GoogleContainerTools/kaniko/pull/2111) * Bump actions/setup-go from 3.0.0 to 3.2.0 [#2112](https://github.com/GoogleContainerTools/kaniko/pull/2112) * Write parent directories to tar before whiteout files [#2113](https://github.com/GoogleContainerTools/kaniko/pull/2113) * fix(ci): Docker build for issue 1837 [#2095](https://github.com/GoogleContainerTools/kaniko/pull/2095) * Update Azure credHelpers docs [#2109](https://github.com/GoogleContainerTools/kaniko/pull/2109) * Fix missing setuid flags on COPY --from=build operation [#2089](https://github.com/GoogleContainerTools/kaniko/pull/2089) * fix: `COPY --chown` regression tests [#2097](https://github.com/GoogleContainerTools/kaniko/pull/2097) * fix: Regression test for #2066 [#2096](https://github.com/GoogleContainerTools/kaniko/pull/2096) * fix: Refactor `LayersMap` to correct old strange code behavior [#2066](https://github.com/GoogleContainerTools/kaniko/pull/2066) * fix: Main [#2094](https://github.com/GoogleContainerTools/kaniko/pull/2094) * feat: add flag to disable pushing cache [#2038](https://github.com/GoogleContainerTools/kaniko/pull/2038) * hasher: hash security.capability attributes [#1994](https://github.com/GoogleContainerTools/kaniko/pull/1994) * Documentation: Clarify README.md blurb on `--cache-copy-layers` [#2064](https://github.com/GoogleContainerTools/kaniko/pull/2064) * Fix release tagging workflow [#2034](https://github.com/GoogleContainerTools/kaniko/pull/2034) * Bump docker/setup-buildx-action from 1.6.0 to 2 [#2081](https://github.com/GoogleContainerTools/kaniko/pull/2081) * Bump go-containerregistry dependency [#2076](https://github.com/GoogleContainerTools/kaniko/pull/2076) * Fix: Flatten layer function needs to return existing files in the layer correctly [#2057](https://github.com/GoogleContainerTools/kaniko/pull/2057) * fix: Remove hardcoded whiteout prefix [#2056](https://github.com/GoogleContainerTools/kaniko/pull/2056) * proc: detect kubernetes runtime by mounts [#2054](https://github.com/GoogleContainerTools/kaniko/pull/2054) * Fixes #2046: make target stage lookup case insensitive [#2047](https://github.com/GoogleContainerTools/kaniko/pull/2047) * Add GitLab CI credentials helper [#2040](https://github.com/GoogleContainerTools/kaniko/pull/2040) * Bump sigstore/cosign-installer from b4f55743d10d066fee1de1cf0fa26069700c0195 to 2.2.0 [#2044](https://github.com/GoogleContainerTools/kaniko/pull/2044) * Bump github/codeql-action from 2.1.6 to 2.1.8 [#2043](https://github.com/GoogleContainerTools/kaniko/pull/2043) * Bump github.com/aws/aws-sdk-go from 1.43.31 to 1.43.36 [#2042](https://github.com/GoogleContainerTools/kaniko/pull/2042) * Bump cloud.google.com/go/storage from 1.21.0 to 1.22.0 [#2041](https://github.com/GoogleContainerTools/kaniko/pull/2041) Huge thank you for this release towards our contributors: - Aaruni Aggarwal - Adrian Newby - Anbraten - Andreas Fleig - Andrei Kvapil - ankitm123 - Benjamin Krenn - Bernardo Marques - Chuang Wang - claudex - Dávid Szakállas - Dawei Ma - dependabot[bot] - Diego Gonzalez - ejose19 - Eng Zer Jun - ePirat - Florian Apolloner - François JACQUES - Gabriel Nützi - Gilbert Gilb's - Guillaume Calmettes - Herman - Hingbong Lo - Igor Scheller - Ishant Mrinal Haloi - Jack - Jake Sanders - Janosch Maier - Jason D'Amour - Jason Hall - Jasper Ben Orschulko - jeunii - Jose Donizetti - Kamal Nasser - Konstantin Demin - Kun Lu - Lars Seipel - Liwen Guo - Lukas - Matt Moore - Max Walther - Mikhail Vasin - Naveen - nihilo - Oliver Gregorius - Pat Litke - Patrick Barker - priyawadhwa - Ramy - Rhianna - Sebastiaan Tammer - Sigurd Spieckermann - Silvano Cirujano Cuesta - Tejal Desai - Tony De La Nuez - Travis DePrato - Víctor - Wolfgang Walther - wwade - Yahav Itzhak - ygelfand - Yonatan Koren - zhouhaibing089 # v1.8.1 Release 2022-04-01 This is Apr's 2022 release. The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.8.1 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.8.1-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.8.1-slim ``` * Use canonical platform values. Fix 1995. [#2025](https://github.com/GoogleContainerTools/kaniko/pull/2025) * feat: kaniko dir config option [#1997](https://github.com/GoogleContainerTools/kaniko/pull/1997) * Bump github.com/aws/aws-sdk-go from 1.43.17 to 1.43.26 [#2018](https://github.com/GoogleContainerTools/kaniko/pull/2018) * Bump github.com/containerd/containerd from 1.6.1 to 1.6.2 [#2017](https://github.com/GoogleContainerTools/kaniko/pull/2017) * Bump github.com/docker/docker from 20.10.13+incompatible to 20.10.14+incompatible [#2016](https://github.com/GoogleContainerTools/kaniko/pull/2016) * README.md: Update docs on building for AWS ECR [#2020](https://github.com/GoogleContainerTools/kaniko/pull/2020) * Move and fix GetContainerRuntime check from bpfd proc [#1996](https://github.com/GoogleContainerTools/kaniko/pull/1996) * Fix minor glitch in the SVG logos [#2004](https://github.com/GoogleContainerTools/kaniko/pull/2004) * Add SVG logos [#2002](https://github.com/GoogleContainerTools/kaniko/pull/2002) * Bump github/codeql-action from 1.1.3 to 1.1.5 [#2000](https://github.com/GoogleContainerTools/kaniko/pull/2000) * Fix - Incomplete regular expression for hostnames [#1993](https://github.com/GoogleContainerTools/kaniko/pull/1993) * Bump github.com/spf13/cobra from 1.3.0 to 1.4.0 [#1985](https://github.com/GoogleContainerTools/kaniko/pull/1985) * Bump github.com/aws/aws-sdk-go from 1.43.12 to 1.43.17 [#1986](https://github.com/GoogleContainerTools/kaniko/pull/1986) * Bump github.com/spf13/afero from 1.8.1 to 1.8.2 [#1987](https://github.com/GoogleContainerTools/kaniko/pull/1987) * Bump github.com/docker/docker from 20.10.12+incompatible to 20.10.13+incompatible [#1988](https://github.com/GoogleContainerTools/kaniko/pull/1988) * Fix image tags in release workflow [#1977](https://github.com/GoogleContainerTools/kaniko/pull/1977) * Use canonical platform values. Fix 1995. [#2025](https://github.com/GoogleContainerTools/kaniko/pull/2025) * feat: kaniko dir config option [#1997](https://github.com/GoogleContainerTools/kaniko/pull/1997) * Bump github.com/aws/aws-sdk-go from 1.43.17 to 1.43.26 [#2018](https://github.com/GoogleContainerTools/kaniko/pull/2018) * Bump github.com/containerd/containerd from 1.6.1 to 1.6.2 [#2017](https://github.com/GoogleContainerTools/kaniko/pull/2017) * Bump github.com/docker/docker from 20.10.13+incompatible to 20.10.14+incompatible [#2016](https://github.com/GoogleContainerTools/kaniko/pull/2016) * README.md: Update docs on building for AWS ECR [#2020](https://github.com/GoogleContainerTools/kaniko/pull/2020) * Move and fix GetContainerRuntime check from bpfd proc [#1996](https://github.com/GoogleContainerTools/kaniko/pull/1996) * Fix minor glitch in the SVG logos [#2004](https://github.com/GoogleContainerTools/kaniko/pull/2004) * Add SVG logos [#2002](https://github.com/GoogleContainerTools/kaniko/pull/2002) * Bump github/codeql-action from 1.1.3 to 1.1.5 [#2000](https://github.com/GoogleContainerTools/kaniko/pull/2000) * Fix - Incomplete regular expression for hostnames [#1993](https://github.com/GoogleContainerTools/kaniko/pull/1993) * Bump github.com/spf13/cobra from 1.3.0 to 1.4.0 [#1985](https://github.com/GoogleContainerTools/kaniko/pull/1985) * Bump github.com/aws/aws-sdk-go from 1.43.12 to 1.43.17 [#1986](https://github.com/GoogleContainerTools/kaniko/pull/1986) * Bump github.com/spf13/afero from 1.8.1 to 1.8.2 [#1987](https://github.com/GoogleContainerTools/kaniko/pull/1987) * Bump github.com/docker/docker from 20.10.12+incompatible to 20.10.13+incompatible [#1988](https://github.com/GoogleContainerTools/kaniko/pull/1988) * Fix image tags in release workflow [#1977](https://github.com/GoogleContainerTools/kaniko/pull/1977) Huge thank you for this release towards our contributors: - Aaruni Aggarwal - Adrian Newby - Anbraten - Andrei Kvapil - ankitm123 - Benjamin Krenn - Bernardo Marques - Chuang Wang - Dávid Szakállas - Dawei Ma - dependabot[bot] - Diego Gonzalez - ejose19 - Eng Zer Jun - Florian Apolloner - François JACQUES - Gabriel Nützi - Gilbert Gilb's - Guillaume Calmettes - Herman - Igor Scheller - Jack - Jake Sanders - Janosch Maier - Jason Hall - Jasper Ben Orschulko - jeunii - Jose Donizetti - Kamal Nasser - Kun Lu - Lars Seipel - Liwen Guo - Matt Moore - Max Walther - Mikhail Vasin - Naveen - nihilo - Oliver Gregorius - Pat Litke - Patrick Barker - priyawadhwa - Rhianna - Sebastiaan Tammer - Sigurd Spieckermann - Silvano Cirujano Cuesta - Tejal Desai - Travis DePrato - Wolfgang Walther - wwade - Yahav Itzhak - ygelfand # v1.8.0 Release 2022-03-08 This is Mar's 2022 release. The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.8.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.8.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.8.0-slim ``` * Update dependabot settings to get updates for docker [#1969](https://github.com/GoogleContainerTools/kaniko/pull/1969) * Bump actions/setup-go from 2.2.0 to 3 [#1970](https://github.com/GoogleContainerTools/kaniko/pull/1970) * Bump google-github-actions/setup-gcloud from 0.5.0 to 0.5.1 [#1950](https://github.com/GoogleContainerTools/kaniko/pull/1950) * Pinned GitHub actions by SHA [#1963](https://github.com/GoogleContainerTools/kaniko/pull/1963) * Bump actions/upload-artifact from 2.3.1 to 3 [#1968](https://github.com/GoogleContainerTools/kaniko/pull/1968) * Bump actions/checkout from 2 to 3 [#1967](https://github.com/GoogleContainerTools/kaniko/pull/1967) * Bump github.com/aws/aws-sdk-go from 1.42.52 to 1.43.12 [#1966](https://github.com/GoogleContainerTools/kaniko/pull/1966) * Bump github.com/containerd/containerd from 1.6.0 to 1.6.1 [#1961](https://github.com/GoogleContainerTools/kaniko/pull/1961) * Fix bug with log disabling [#1959](https://github.com/GoogleContainerTools/kaniko/pull/1959) * Bump github/codeql-action from 1.1.2 to 1.1.3 [#1958](https://github.com/GoogleContainerTools/kaniko/pull/1958) * Bump github.com/aws/aws-sdk-go from 1.42.52 to 1.43.7 [#1957](https://github.com/GoogleContainerTools/kaniko/pull/1957) * Removed --whitelist-var-run normalization as this breaks functionality [#1956](https://github.com/GoogleContainerTools/kaniko/pull/1956) * Bump github.com/containerd/containerd from 1.5.9 to 1.6.0 [#1948](https://github.com/GoogleContainerTools/kaniko/pull/1948) * Bump cloud.google.com/go/storage from 1.20.0 to 1.21.0 [#1947](https://github.com/GoogleContainerTools/kaniko/pull/1947) * Bump github/codeql-action from 1.1.0 to 1.1.2 [#1951](https://github.com/GoogleContainerTools/kaniko/pull/1951) * Bump ossf/scorecard-action from 1.0.3 to 1.0.4 [#1952](https://github.com/GoogleContainerTools/kaniko/pull/1952) * Bump ecr-login dep to avoid some log spam [#1946](https://github.com/GoogleContainerTools/kaniko/pull/1946) * readme: Fix formatting for `--image-fs-extract-retry` [#1942](https://github.com/GoogleContainerTools/kaniko/pull/1942) * Pick up per-repository auth changes from go-containerregistry [#1939](https://github.com/GoogleContainerTools/kaniko/pull/1939) * Bump github.com/aws/aws-sdk-go from 1.42.47 to 1.42.52 [#1937](https://github.com/GoogleContainerTools/kaniko/pull/1937) * Bump github/codeql-action from 1.0.31 to 1.1.0 [#1938](https://github.com/GoogleContainerTools/kaniko/pull/1938) * Set DOCKER_BUILDKIT=1 in make images [#1906](https://github.com/GoogleContainerTools/kaniko/pull/1906) * Fix resolving arguments over multi-stage build [#1928](https://github.com/GoogleContainerTools/kaniko/pull/1928) * Correctly handle platforms that include CPU variants [#1929](https://github.com/GoogleContainerTools/kaniko/pull/1929) * Restore build args after optimize. Fixes #1910, #1912. [#1915](https://github.com/GoogleContainerTools/kaniko/pull/1915) * test: use `T.TempDir` to create temporary test directory [#1918](https://github.com/GoogleContainerTools/kaniko/pull/1918) * Bump github.com/spf13/afero from 1.8.0 to 1.8.1 [#1922](https://github.com/GoogleContainerTools/kaniko/pull/1922) * Bump github.com/aws/aws-sdk-go from 1.42.44 to 1.42.47 [#1923](https://github.com/GoogleContainerTools/kaniko/pull/1923) * Bump cloud.google.com/go/storage from 1.19.0 to 1.20.0 [#1924](https://github.com/GoogleContainerTools/kaniko/pull/1924) * Bump ossf/scorecard-action from 1.0.2 to 1.0.3 [#1926](https://github.com/GoogleContainerTools/kaniko/pull/1926) * Bump google-github-actions/setup-gcloud from 0.4.0 to 0.5.0 [#1925](https://github.com/GoogleContainerTools/kaniko/pull/1925) * Bump github/codeql-action from 1.0.30 to 1.0.31 [#1927](https://github.com/GoogleContainerTools/kaniko/pull/1927) * Vagrantfile should install and configure go (see #1913) [#1914](https://github.com/GoogleContainerTools/kaniko/pull/1914) * adding ppc64le support for executor and warmer image [#1908](https://github.com/GoogleContainerTools/kaniko/pull/1908) * Remove deploy/cloudbuild-*.yaml files [#1907](https://github.com/GoogleContainerTools/kaniko/pull/1907) * Bump go-containerregistry to pick up ACR fix [#1898](https://github.com/GoogleContainerTools/kaniko/pull/1898) * Bump cloud.google.com/go/storage from 1.18.2 to 1.19.0 [#1903](https://github.com/GoogleContainerTools/kaniko/pull/1903) * Bump github.com/aws/aws-sdk-go from 1.42.38 to 1.42.44 [#1902](https://github.com/GoogleContainerTools/kaniko/pull/1902) * Bump ossf/scorecard-action from 5da1b6b2680a229f2e66131f5c6a692bcd80b246 to 1.0.2 [#1899](https://github.com/GoogleContainerTools/kaniko/pull/1899) * Bump google-github-actions/setup-gcloud from 0.3.0 to 0.4.0 [#1900](https://github.com/GoogleContainerTools/kaniko/pull/1900) * Bump github/codeql-action from 1.0.26 to 1.0.30 [#1901](https://github.com/GoogleContainerTools/kaniko/pull/1901) * Enable dependabot for Go and GitHub Actions dependencies [#1884](https://github.com/GoogleContainerTools/kaniko/pull/1884) * Update readme [#1897](https://github.com/GoogleContainerTools/kaniko/pull/1897) * Remove k8schain, directly depend on cred helpers [#1891](https://github.com/GoogleContainerTools/kaniko/pull/1891) * Update golang.org/x/oauth2/google [#1890](https://github.com/GoogleContainerTools/kaniko/pull/1890) * Bump dependencies [#1885](https://github.com/GoogleContainerTools/kaniko/pull/1885) * Fix broken anchor link [#1804](https://github.com/GoogleContainerTools/kaniko/pull/1804) * Bump github.com/docker/docker to latest release [#1866](https://github.com/GoogleContainerTools/kaniko/pull/1866) * Run GitHub Actions on pushes and PRs to main, not master [#1883](https://github.com/GoogleContainerTools/kaniko/pull/1883) * Add KANIKO_REGISTRY_MIRROR env var [#1875](https://github.com/GoogleContainerTools/kaniko/pull/1875) * Bump AWS ecr-login cred helper to v0.5.0 [#1880](https://github.com/GoogleContainerTools/kaniko/pull/1880) * Pin to more recent version of scorecard [#1878](https://github.com/GoogleContainerTools/kaniko/pull/1878) * Add ossf/scorecard Github Action to kaniko [#1874](https://github.com/GoogleContainerTools/kaniko/pull/1874) * Attempt to fix erroneous build cancellation [#1867](https://github.com/GoogleContainerTools/kaniko/pull/1867) * Add s390x support to docker images [#1749](https://github.com/GoogleContainerTools/kaniko/pull/1749) * fix: ARG/ENV used in script does not invalidate build cache (#1688) [#1693](https://github.com/GoogleContainerTools/kaniko/pull/1693) * fix: change the name of the acr cred helper [#1865](https://github.com/GoogleContainerTools/kaniko/pull/1865) * Fix implicit GCR auth [#1856](https://github.com/GoogleContainerTools/kaniko/pull/1856) * Log full image ref by digest when pushing an image [#1857](https://github.com/GoogleContainerTools/kaniko/pull/1857) * Remove GitHub Actions concurrency limits [#1858](https://github.com/GoogleContainerTools/kaniko/pull/1858) * tar: read directly from stdin [#1728](https://github.com/GoogleContainerTools/kaniko/pull/1728) * Fix regression: can fetch branches and tags references without specifying commit hashes for private git repository used as context [#1823](https://github.com/GoogleContainerTools/kaniko/pull/1823) * Use pax tar format [#1809](https://github.com/GoogleContainerTools/kaniko/pull/1809) * Fix calculating path for copying ownership [#1859](https://github.com/GoogleContainerTools/kaniko/pull/1859) * Fix copying ownership [#1725](https://github.com/GoogleContainerTools/kaniko/pull/1725) * Fix typo [#1825](https://github.com/GoogleContainerTools/kaniko/pull/1825) * Fix possible nil pointer derefence in fs_util.go [#1813](https://github.com/GoogleContainerTools/kaniko/pull/1813) * include auth for FetchOptions [#1796](https://github.com/GoogleContainerTools/kaniko/pull/1796) * Update readme insecure flags [#1811](https://github.com/GoogleContainerTools/kaniko/pull/1811) * Add documentation on pushing to ACR [#1831](https://github.com/GoogleContainerTools/kaniko/pull/1831) * Fixes #1837 : keep file capabilities on archival [#1838](https://github.com/GoogleContainerTools/kaniko/pull/1838) * Use setup-gcloud@v0.3.0 instead of @master [#1854](https://github.com/GoogleContainerTools/kaniko/pull/1854) * Collapse integration test workflows into one config [#1855](https://github.com/GoogleContainerTools/kaniko/pull/1855) * Share the Go build cache when building in Dockerfiles [#1853](https://github.com/GoogleContainerTools/kaniko/pull/1853) * Call cosign sign --key [#1849](https://github.com/GoogleContainerTools/kaniko/pull/1849) * Consolidate PR and real release workflows [#1845](https://github.com/GoogleContainerTools/kaniko/pull/1845) * Use golang:1.17 and build from reproducible source [#1848](https://github.com/GoogleContainerTools/kaniko/pull/1848) * Start keyless signing kaniko releases [#1841](https://github.com/GoogleContainerTools/kaniko/pull/1841) * Attempt to speed up PR image builds by sharing a cache [#1844](https://github.com/GoogleContainerTools/kaniko/pull/1844) * Sign digests not tags. [#1840](https://github.com/GoogleContainerTools/kaniko/pull/1840) * Fix the e2e K8s test [#1842](https://github.com/GoogleContainerTools/kaniko/pull/1842) * Bump the cosign version (a lot) [#1839](https://github.com/GoogleContainerTools/kaniko/pull/1839) * Revert "Support mirror registries with path component (#1707)" [#1794](https://github.com/GoogleContainerTools/kaniko/pull/1794) * Fix syntax error in release.yaml [#1800](https://github.com/GoogleContainerTools/kaniko/pull/1800) * Update dependabot settings to get updates for docker [#1969](https://github.com/GoogleContainerTools/kaniko/pull/1969) * Bump actions/setup-go from 2.2.0 to 3 [#1970](https://github.com/GoogleContainerTools/kaniko/pull/1970) * Bump google-github-actions/setup-gcloud from 0.5.0 to 0.5.1 [#1950](https://github.com/GoogleContainerTools/kaniko/pull/1950) * Pinned GitHub actions by SHA [#1963](https://github.com/GoogleContainerTools/kaniko/pull/1963) * Bump actions/upload-artifact from 2.3.1 to 3 [#1968](https://github.com/GoogleContainerTools/kaniko/pull/1968) * Bump actions/checkout from 2 to 3 [#1967](https://github.com/GoogleContainerTools/kaniko/pull/1967) * Bump github.com/aws/aws-sdk-go from 1.42.52 to 1.43.12 [#1966](https://github.com/GoogleContainerTools/kaniko/pull/1966) * Bump github.com/containerd/containerd from 1.6.0 to 1.6.1 [#1961](https://github.com/GoogleContainerTools/kaniko/pull/1961) * Fix bug with log disabling [#1959](https://github.com/GoogleContainerTools/kaniko/pull/1959) * Bump github/codeql-action from 1.1.2 to 1.1.3 [#1958](https://github.com/GoogleContainerTools/kaniko/pull/1958) * Bump github.com/aws/aws-sdk-go from 1.42.52 to 1.43.7 [#1957](https://github.com/GoogleContainerTools/kaniko/pull/1957) * Removed --whitelist-var-run normalization as this breaks functionality [#1956](https://github.com/GoogleContainerTools/kaniko/pull/1956) * Bump github.com/containerd/containerd from 1.5.9 to 1.6.0 [#1948](https://github.com/GoogleContainerTools/kaniko/pull/1948) * Bump cloud.google.com/go/storage from 1.20.0 to 1.21.0 [#1947](https://github.com/GoogleContainerTools/kaniko/pull/1947) * Bump github/codeql-action from 1.1.0 to 1.1.2 [#1951](https://github.com/GoogleContainerTools/kaniko/pull/1951) * Bump ossf/scorecard-action from 1.0.3 to 1.0.4 [#1952](https://github.com/GoogleContainerTools/kaniko/pull/1952) * Bump ecr-login dep to avoid some log spam [#1946](https://github.com/GoogleContainerTools/kaniko/pull/1946) * readme: Fix formatting for `--image-fs-extract-retry` [#1942](https://github.com/GoogleContainerTools/kaniko/pull/1942) * Pick up per-repository auth changes from go-containerregistry [#1939](https://github.com/GoogleContainerTools/kaniko/pull/1939) * Bump github.com/aws/aws-sdk-go from 1.42.47 to 1.42.52 [#1937](https://github.com/GoogleContainerTools/kaniko/pull/1937) * Bump github/codeql-action from 1.0.31 to 1.1.0 [#1938](https://github.com/GoogleContainerTools/kaniko/pull/1938) * Set DOCKER_BUILDKIT=1 in make images [#1906](https://github.com/GoogleContainerTools/kaniko/pull/1906) * Fix resolving arguments over multi-stage build [#1928](https://github.com/GoogleContainerTools/kaniko/pull/1928) * Correctly handle platforms that include CPU variants [#1929](https://github.com/GoogleContainerTools/kaniko/pull/1929) * Restore build args after optimize. Fixes #1910, #1912. [#1915](https://github.com/GoogleContainerTools/kaniko/pull/1915) * test: use `T.TempDir` to create temporary test directory [#1918](https://github.com/GoogleContainerTools/kaniko/pull/1918) * Bump github.com/spf13/afero from 1.8.0 to 1.8.1 [#1922](https://github.com/GoogleContainerTools/kaniko/pull/1922) * Bump github.com/aws/aws-sdk-go from 1.42.44 to 1.42.47 [#1923](https://github.com/GoogleContainerTools/kaniko/pull/1923) * Bump cloud.google.com/go/storage from 1.19.0 to 1.20.0 [#1924](https://github.com/GoogleContainerTools/kaniko/pull/1924) * Bump ossf/scorecard-action from 1.0.2 to 1.0.3 [#1926](https://github.com/GoogleContainerTools/kaniko/pull/1926) * Bump google-github-actions/setup-gcloud from 0.4.0 to 0.5.0 [#1925](https://github.com/GoogleContainerTools/kaniko/pull/1925) * Bump github/codeql-action from 1.0.30 to 1.0.31 [#1927](https://github.com/GoogleContainerTools/kaniko/pull/1927) * Vagrantfile should install and configure go (see #1913) [#1914](https://github.com/GoogleContainerTools/kaniko/pull/1914) * adding ppc64le support for executor and warmer image [#1908](https://github.com/GoogleContainerTools/kaniko/pull/1908) * Remove deploy/cloudbuild-*.yaml files [#1907](https://github.com/GoogleContainerTools/kaniko/pull/1907) * Bump go-containerregistry to pick up ACR fix [#1898](https://github.com/GoogleContainerTools/kaniko/pull/1898) * Bump cloud.google.com/go/storage from 1.18.2 to 1.19.0 [#1903](https://github.com/GoogleContainerTools/kaniko/pull/1903) * Bump github.com/aws/aws-sdk-go from 1.42.38 to 1.42.44 [#1902](https://github.com/GoogleContainerTools/kaniko/pull/1902) * Bump ossf/scorecard-action from 5da1b6b2680a229f2e66131f5c6a692bcd80b246 to 1.0.2 [#1899](https://github.com/GoogleContainerTools/kaniko/pull/1899) * Bump google-github-actions/setup-gcloud from 0.3.0 to 0.4.0 [#1900](https://github.com/GoogleContainerTools/kaniko/pull/1900) * Bump github/codeql-action from 1.0.26 to 1.0.30 [#1901](https://github.com/GoogleContainerTools/kaniko/pull/1901) * Enable dependabot for Go and GitHub Actions dependencies [#1884](https://github.com/GoogleContainerTools/kaniko/pull/1884) * Update readme [#1897](https://github.com/GoogleContainerTools/kaniko/pull/1897) * Remove k8schain, directly depend on cred helpers [#1891](https://github.com/GoogleContainerTools/kaniko/pull/1891) * Update golang.org/x/oauth2/google [#1890](https://github.com/GoogleContainerTools/kaniko/pull/1890) * Bump dependencies [#1885](https://github.com/GoogleContainerTools/kaniko/pull/1885) * Fix broken anchor link [#1804](https://github.com/GoogleContainerTools/kaniko/pull/1804) * Bump github.com/docker/docker to latest release [#1866](https://github.com/GoogleContainerTools/kaniko/pull/1866) * Run GitHub Actions on pushes and PRs to main, not master [#1883](https://github.com/GoogleContainerTools/kaniko/pull/1883) * Add KANIKO_REGISTRY_MIRROR env var [#1875](https://github.com/GoogleContainerTools/kaniko/pull/1875) * Bump AWS ecr-login cred helper to v0.5.0 [#1880](https://github.com/GoogleContainerTools/kaniko/pull/1880) * Pin to more recent version of scorecard [#1878](https://github.com/GoogleContainerTools/kaniko/pull/1878) * Add ossf/scorecard Github Action to kaniko [#1874](https://github.com/GoogleContainerTools/kaniko/pull/1874) * Attempt to fix erroneous build cancellation [#1867](https://github.com/GoogleContainerTools/kaniko/pull/1867) * Add s390x support to docker images [#1749](https://github.com/GoogleContainerTools/kaniko/pull/1749) * fix: ARG/ENV used in script does not invalidate build cache (#1688) [#1693](https://github.com/GoogleContainerTools/kaniko/pull/1693) * fix: change the name of the acr cred helper [#1865](https://github.com/GoogleContainerTools/kaniko/pull/1865) * Fix implicit GCR auth [#1856](https://github.com/GoogleContainerTools/kaniko/pull/1856) * Log full image ref by digest when pushing an image [#1857](https://github.com/GoogleContainerTools/kaniko/pull/1857) * Remove GitHub Actions concurrency limits [#1858](https://github.com/GoogleContainerTools/kaniko/pull/1858) * tar: read directly from stdin [#1728](https://github.com/GoogleContainerTools/kaniko/pull/1728) * Fix regression: can fetch branches and tags references without specifying commit hashes for private git repository used as context [#1823](https://github.com/GoogleContainerTools/kaniko/pull/1823) * Use pax tar format [#1809](https://github.com/GoogleContainerTools/kaniko/pull/1809) * Fix calculating path for copying ownership [#1859](https://github.com/GoogleContainerTools/kaniko/pull/1859) * Fix copying ownership [#1725](https://github.com/GoogleContainerTools/kaniko/pull/1725) * Fix typo [#1825](https://github.com/GoogleContainerTools/kaniko/pull/1825) * Fix possible nil pointer derefence in fs_util.go [#1813](https://github.com/GoogleContainerTools/kaniko/pull/1813) * include auth for FetchOptions [#1796](https://github.com/GoogleContainerTools/kaniko/pull/1796) * Update readme insecure flags [#1811](https://github.com/GoogleContainerTools/kaniko/pull/1811) * Add documentation on pushing to ACR [#1831](https://github.com/GoogleContainerTools/kaniko/pull/1831) * Fixes #1837 : keep file capabilities on archival [#1838](https://github.com/GoogleContainerTools/kaniko/pull/1838) * Use setup-gcloud@v0.3.0 instead of @master [#1854](https://github.com/GoogleContainerTools/kaniko/pull/1854) * Collapse integration test workflows into one config [#1855](https://github.com/GoogleContainerTools/kaniko/pull/1855) * Share the Go build cache when building in Dockerfiles [#1853](https://github.com/GoogleContainerTools/kaniko/pull/1853) * Call cosign sign --key [#1849](https://github.com/GoogleContainerTools/kaniko/pull/1849) * Consolidate PR and real release workflows [#1845](https://github.com/GoogleContainerTools/kaniko/pull/1845) * Use golang:1.17 and build from reproducible source [#1848](https://github.com/GoogleContainerTools/kaniko/pull/1848) * Start keyless signing kaniko releases [#1841](https://github.com/GoogleContainerTools/kaniko/pull/1841) * Attempt to speed up PR image builds by sharing a cache [#1844](https://github.com/GoogleContainerTools/kaniko/pull/1844) * Sign digests not tags. [#1840](https://github.com/GoogleContainerTools/kaniko/pull/1840) * Fix the e2e K8s test [#1842](https://github.com/GoogleContainerTools/kaniko/pull/1842) * Bump the cosign version (a lot) [#1839](https://github.com/GoogleContainerTools/kaniko/pull/1839) * Revert "Support mirror registries with path component (#1707)" [#1794](https://github.com/GoogleContainerTools/kaniko/pull/1794) * Fix syntax error in release.yaml [#1800](https://github.com/GoogleContainerTools/kaniko/pull/1800) Huge thank you for this release towards our contributors: - Aaruni Aggarwal - Adrian Newby - Anbraten - Andrei Kvapil - ankitm123 - Benjamin Krenn - Bernardo Marques - Dávid Szakállas - Dawei Ma - dependabot[bot] - ejose19 - Eng Zer Jun - Florian Apolloner - François JACQUES - Gabriel Nützi - Gilbert Gilb's - Guillaume Calmettes - Herman - Jake Sanders - Janosch Maier - Jason Hall - jeunii - Jose Donizetti - Kamal Nasser - Kun Lu - Lars Seipel - Liwen Guo - Matt Moore - Max Walther - Mikhail Vasin - Naveen - nihilo - Oliver Gregorius - Pat Litke - Patrick Barker - priyawadhwa - Rhianna - Sebastiaan Tammer - Silvano Cirujano Cuesta - Tejal Desai - Travis DePrato - Wolfgang Walther - wwade - Yahav Itzhak - ygelfand # v1.7.0 Release 2021-10-19 This is Oct's 2021 release. ## Highights * In this release, we have kaniko **s390x** platform support for multi-arch image. * Kaniko **Self Serve** documentation is up to enableuser to build and push kaniko images themselves [here](https://github.com/GoogleContainerTools/kaniko/blob/master/RELEASE.md) The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.7.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.7.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.7.0-slim ``` * git: accept explicit commit hash for git context [#1765](https://github.com/GoogleContainerTools/kaniko/pull/1765) * Remove tarball.WithCompressedCaching flag to resolve OOM Killed error [#1722](https://github.com/GoogleContainerTools/kaniko/pull/1722) * disable github action workflow on push to master [#1770](https://github.com/GoogleContainerTools/kaniko/pull/1770) * Add s390x support to docker images [copy] [#1769](https://github.com/GoogleContainerTools/kaniko/pull/1769) * Fix typo [#1719](https://github.com/GoogleContainerTools/kaniko/pull/1719) * Fix composite cache key for multi-stage copy command [#1735](https://github.com/GoogleContainerTools/kaniko/pull/1735) * chore: add workflows for pr tests [#1766](https://github.com/GoogleContainerTools/kaniko/pull/1766) * Make /bin/sh available to debug image [#1748](https://github.com/GoogleContainerTools/kaniko/pull/1748) * Fix executor Dockerfile, which wasn't building [#1741](https://github.com/GoogleContainerTools/kaniko/pull/1741) * Support force-building metadata layers into snapshot [#1731](https://github.com/GoogleContainerTools/kaniko/pull/1731) * Add support for CPU variants [#1676](https://github.com/GoogleContainerTools/kaniko/pull/1676) * refactor: adjust bpfd container runtime detection [#1686](https://github.com/GoogleContainerTools/kaniko/pull/1686) * Fix snapshotter ignore list; do not attempt to delete whiteouts of ignored paths [#1652](https://github.com/GoogleContainerTools/kaniko/pull/1652) * Add instructions for using JFrog Artifactory [#1715](https://github.com/GoogleContainerTools/kaniko/pull/1715) * add SECURITY.md [#1710](https://github.com/GoogleContainerTools/kaniko/pull/1710) * Support mirror registries with path component [#1707](https://github.com/GoogleContainerTools/kaniko/pull/1707) * Retry extracting filesystem from image [#1685](https://github.com/GoogleContainerTools/kaniko/pull/1685) * Bugfix/trailing path separator [#1683](https://github.com/GoogleContainerTools/kaniko/pull/1683) * docs: add missing cache-copy-layers arg in README [#1672](https://github.com/GoogleContainerTools/kaniko/pull/1672) * save snaphots to tmp dir [#1662](https://github.com/GoogleContainerTools/kaniko/pull/1662) * Revert "save snaphots to tmp dir" [#1670](https://github.com/GoogleContainerTools/kaniko/pull/1670) * Try to warm all images and warn about errors [#1653](https://github.com/GoogleContainerTools/kaniko/pull/1653) * Exit Code Propagation [#1655](https://github.com/GoogleContainerTools/kaniko/pull/1655) * Fix changelog headings [#1643](https://github.com/GoogleContainerTools/kaniko/pull/1643) Huge thank you for this release towards our contributors: - Anbraten - Benjamin Krenn - Gilbert Gilb's - Jake Sanders - Janosch Maier - Jason Hall - Jose Donizetti - Kamal Nasser - Liwen Guo - Max Walther - Mikhail Vasin - Patrick Barker - Rhianna - Silvano Cirujano Cuesta - Tejal Desai - Yahav Itzhak - ankitm123 - ejose19 - nihilo - priyawadhwa - wwade # v1.6.0 Release 2021-04-23 This is April's 2021 release. The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.6.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.6.0-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.6.0-slim ``` * Support warming images by digest [#1629](https://github.com/GoogleContainerTools/kaniko/pull/1629) * Fix resolution of Dockerfile relative dockerignore [#1607](https://github.com/GoogleContainerTools/kaniko/pull/1607) * create parent directory before writing digest files [#1612](https://github.com/GoogleContainerTools/kaniko/pull/1612) * adds ignore-path command arguments to executor [#1622](https://github.com/GoogleContainerTools/kaniko/pull/1622) * Specifying a tarPath will push the image as well [#1597](https://github.com/GoogleContainerTools/kaniko/pull/1597) Huge thank you for this release towards our contributors: - Chris Hoffman - Colin - Jon Friesen - Lars Gröber - Sascha Schwarze - Tejal Desai - Viktor Farcic - Vivek Kumar - priyawadhwa # v1.5.2 Release 2021-03-30 The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.5.2 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.5.2-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.5.2-slim ``` This release is the first to be signed by [cosign](https://github.com/sigstore/cosign)! The PEM-encoded public key to validate against the released kaniko images is: ``` -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9aAfAcgAxIFMTstJUv8l/AMqnSKw P+vLu3NnnBDHCfREQpV/AJuiZ1UtgGpFpHlJLCNPmFkzQTnfyN5idzNl6Q== -----END PUBLIC KEY----- ``` # v1.5.1 Release 2021-02-22 This release is a minor release with following a fix to version number for v1.5.0 The kaniko images now report the right version number. The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.5.1 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.5.1-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:v1.5.1-slim ``` In this release, we have 1 new feature: * Improve retry behavior for push operation [#1578](https://github.com/GoogleContainerTools/kaniko/pull/1578) And followinf refactors/updates to documentation * Added a video introduction to Kaniko [#1517](https://github.com/GoogleContainerTools/kaniko/pull/1517) * Use up-to-date ca-certificates during build [#1580](https://github.com/GoogleContainerTools/kaniko/pull/1580) Huge thank you for this release towards our contributors: - Sascha Schwarze - Tejal Desai - Viktor Farcic # v1.5.0 Release 2021-01-25 This releases publishes multi-arch image kaniko images for following platforms 1. linux/amd64 2. linux/arm64 3. linux/ppc64le If you want to add other platforms, please talk to @tejal29. The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.5.0 gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:v1.5.0-debug ``` In this release, we have 2 slim executor images which don't contain any authentication binaries. 1. `gcr.io/kaniko-project/executor:slim` & 2. `gcr.io/kaniko-project/executor:v1.5.0-slim` ## New Features * Mutli-arch support [#1531](https://github.com/GoogleContainerTools/kaniko/pull/1531), [#1474](https://github.com/GoogleContainerTools/kaniko/pull/1474) * Add support to fetch a github pull request [#1543](https://github.com/GoogleContainerTools/kaniko/pull/1543) * Add --image-name-tag-with-digest flag [#1541](https://github.com/GoogleContainerTools/kaniko/pull/1541) * add caching copy layers back [#1518](https://github.com/GoogleContainerTools/kaniko/pull/1518) * Profiling for Snapshotting errors. [#1530](https://github.com/GoogleContainerTools/kaniko/pull/1530) * feat(warmer): Warmer now supports all registry-related flags [#1499](https://github.com/GoogleContainerTools/kaniko/pull/1499) * feat: Add https tar.gz remote source for context [#1519](https://github.com/GoogleContainerTools/kaniko/pull/1519) * Add option customPlatform [#1500](https://github.com/GoogleContainerTools/kaniko/pull/1500) * feat: support multiple registry mirrors with fallback [#1498](https://github.com/GoogleContainerTools/kaniko/pull/1498) * Add s390x kaniko build to multi-arch list [#1475](https://github.com/GoogleContainerTools/kaniko/pull/1475) ## Bug Fixes * reject tarball writes with no destinations [#1534](https://github.com/GoogleContainerTools/kaniko/pull/1534) * Fix travis-ci link [#1535](https://github.com/GoogleContainerTools/kaniko/pull/1535) * fix: extract file as same user for warmer docker image [#1538](https://github.com/GoogleContainerTools/kaniko/pull/1538) * fix: update busybox version to fix CVE-2018-1000500 [#1532](https://github.com/GoogleContainerTools/kaniko/pull/1532) * Fix typo in error message [#1494](https://github.com/GoogleContainerTools/kaniko/pull/1494) * Fix COPY with --chown command [#1477](https://github.com/GoogleContainerTools/kaniko/pull/1477) * Remove unused code [#1495](https://github.com/GoogleContainerTools/kaniko/pull/1495) * Fixes #1469 : Remove file that matches with the directory path [#1478](https://github.com/GoogleContainerTools/kaniko/pull/1478) * fix: CheckPushPermissions not being called when using --no-push and --cache-repo [#1471](https://github.com/GoogleContainerTools/kaniko/pull/1471) ## Refactors * Switch to runtime detection via bpfd/proc [#1502](https://github.com/GoogleContainerTools/kaniko/pull/1502) * Update ggcr to pick up estargz and caching option [#1527](https://github.com/GoogleContainerTools/kaniko/pull/1527) ## Documentation * Document flags for tarball build only [#1503](https://github.com/GoogleContainerTools/kaniko/pull/1503) * doc: clarify the format of --registry-mirror [#1504](https://github.com/GoogleContainerTools/kaniko/pull/1504) * add section to run lints [#1480](https://github.com/GoogleContainerTools/kaniko/pull/1480) * Add docs for GKE workload identity. [#1476](https://github.com/GoogleContainerTools/kaniko/pull/1476) Huge thank you for this release towards our contributors: - Alec Rajeev - Fabrice - Josh Chorlton - Lars - Lars Toenning - Matt Moore - Or Geva - Severin Strobl - Shashank - Sladyn - Tejal Desai - Theofilos Papapanagiotou - Vincent Behar - Yulia Gaponenko - ankitm123 - bahetiamit - ejose19 - mickkael - zhouhaibing089 # v1.3.0 Release 2020-10-22 This release publishes, multi-arch image kaniko executor images. Note: The muti-arch images are **only** available for executor images. Contributions Welcome!! The executor images in this release are: ``` gcr.io/kaniko-project/executor:v1.3.0 gcr.io/kaniko-project/executor:latest gcr.io/kaniko-project/executor:arm64 gcr.io/kaniko-project/executor:arm64-v1.3.0 gcr.io/kaniko-project/executor:amd64 gcr.io/kaniko-project/executor:amd64-v1.3.0 gcr.io/kaniko-project/executor:multi-arch gcr.io/kaniko-project/executor:multi-arch-v1.3.0 ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:v1.3.0-debug gcr.io/kaniko-project/executor:debug-v1.3.0 and gcr.io/kaniko-project/executor:debug ``` ## New Features * Added in docker cred helper for Azure Container Registry sourcing auth tokens directly from environment to debug image [#1458](https://github.com/GoogleContainerTools/kaniko/pull/1458) * Add multi-arch image via Bazel [#1452](https://github.com/GoogleContainerTools/kaniko/pull/1452) ## Bug Fixes * Fix docker build tag [#1460](https://github.com/GoogleContainerTools/kaniko/pull/1460) * Fix .dockerignore for build context copies in later stages [#1447](https://github.com/GoogleContainerTools/kaniko/pull/1447) * Fix permissions on cache when --no-push is set [#1445](https://github.com/GoogleContainerTools/kaniko/pull/1445) Huge thank you for this release towards our contributors: - Akram Ben Aissi - Alex Szakaly - Alexander Sharov - Anthony Davies - Art Begolli - Batuhan Apaydın - Ben Einaudi - Carlos Alexandro Becker - Carlos Sanchez - Chris Mellard - Chris Sng - Christopher Hlubek - Cole Wippern - Dani Raznikov - Daniel Marks - David Dooling - Didier Durand - DracoBlue - Gabriel Virga - Gilbert Gilb's - Giovan Isa Musthofa - Gábor Lipták - Harmen Stoppels - Ian Kerins - James Ravn - Joe Kutner - Jon Henrik Bjørnstad - Jon Johnson - Jordan GOASDOUE - Jordan Goasdoue - Jordan Goasdoué - Josh Chorlton - Josh Soref - Keisuke Umegaki - Liubov Grinkevich - Logan.Price - Lukasz Jakimczuk - Martin Treusch von Buttlar - Matt Moore - Mehdi Abaakouk - Michel Hollands - Mitchell Friedman - Moritz Wanzenböck - Or Sela - PhoenixMage - Pierre-Louis Bonicoli - Renato Suero - Sam Stoelinga - Shihab Hasan - Sladyn - Takumasa Sakao - Tejal Desai - Thomas Bonfort - Thomas Stromberg - Tinjo Schöni - Tom Prince - Vincent Latombe - Wietse Muizelaar - Yoan Blanc - Yoriyasu Yano - Yuheng Zhang - aca - cvgw - ejose19 - ohchang-kwon - priyawadhwa - tinkerborg - tsufeki - xanonid - yw-liu - 好风 # v1.2.0 Release 2020-09-30 This is 27th release of Kaniko! In this release, Copy layers are not cached there by making builds faster!! * Stop caching COPY layers [#1408](https://github.com/GoogleContainerTools/kaniko/pull/1408) Huge thank you for this release towards our contributors: - Ian Kerins # v1.1.0 Release 2020-09-30 This is the 26th release of Kaniko! ## New Features * Add support for Vagrant [#1428](https://github.com/GoogleContainerTools/kaniko/pull/1428) * Allow DOCKER_CONFIG to be a filename [#1409](https://github.com/GoogleContainerTools/kaniko/pull/1409) ## Bug Fixes * Fix docker-credential-gcr helper being called for multiple registries [#1439](https://github.com/GoogleContainerTools/kaniko/pull/1439) * Fix docker-credential-gcr not configured across regions[#1417](https://github.com/GoogleContainerTools/kaniko/pull/1417) ## Updates and Refactors * add tests for configuring docker credentials across regions. [#1426](https://github.com/GoogleContainerTools/kaniko/pull/1426) ## Documentation * Update README.md [#1437](https://github.com/GoogleContainerTools/kaniko/pull/1437) * spelling: storage [#1425](https://github.com/GoogleContainerTools/kaniko/pull/1425) * Readme.md : Kaniko -> kaniko [#1435](https://github.com/GoogleContainerTools/kaniko/pull/1435) * initial release instructions [#1419](https://github.com/GoogleContainerTools/kaniko/pull/1419) * Improve --use-new-run help text, update README with missing flags [#1405](https://github.com/GoogleContainerTools/kaniko/pull/1405) * Add func to append to ignorelist [#1397](https://github.com/GoogleContainerTools/kaniko/pull/1397) * Update README.md re: layer cache behavior [#1394](https://github.com/GoogleContainerTools/kaniko/pull/1394) * Fix links on README [#1398](https://github.com/GoogleContainerTools/kaniko/pull/1398) Huge thank you for this release towards our contributors: - aca - Akram Ben Aissi - Alexander Sharov - Alex Szakaly - Anthony Davies - Art Begolli - Batuhan Apaydın - Ben Einaudi - Carlos Alexandro Becker - Carlos Sanchez - Chris Sng - Christopher Hlubek - Cole Wippern - cvgw - Daniel Marks - Dani Raznikov - David Dooling - Didier Durand - DracoBlue - Gábor Lipták - Gabriel Virga - Gilbert Gilb's - Giovan Isa Musthofa - Harmen Stoppels - Ian Kerins - James Ravn - Joe Kutner - Jon Henrik Bjørnstad - Jon Johnson - Jordan Goasdoue - Jordan GOASDOUE - Jordan Goasdoué - Josh Chorlton - Josh Soref - Keisuke Umegaki - Liubov Grinkevich - Logan.Price - Lukasz Jakimczuk - Martin Treusch von Buttlar - Mehdi Abaakouk - Michel Hollands - Mitchell Friedman - Moritz Wanzenböck - ohchang-kwon - Or Sela - PhoenixMage - Pierre-Louis Bonicoli - priyawadhwa - Renato Suero - Sam Stoelinga - Shihab Hasan - Takumasa Sakao - Tejal Desai - Thomas Bonfort - Thomas Stromberg - Thomas Strömberg - tinkerborg - Tom Prince - tsufeki - Vincent Latombe - Wietse Muizelaar - xanonid - Yoan Blanc - Yoriyasu Yano - Yuheng Zhang - yw-liu - 好风 # v1.0.0 Release 2020-08-17 This is the 25th release of Kaniko! ## New Features * Specify advance options for git checkout branch. [#1322](https://github.com/GoogleContainerTools/kaniko/pull/1322) * To specify a branch, use `--git=branch=branchName` * To specify an option to checkout a single branch, use `--git=single-branch=true` * To change submodule recursions behavior while cloning, use `--git=recurse-submodules=true` * Checkout a specific git commit [#1153](https://github.com/GoogleContainerTools/kaniko/pull/1153) * Add ability to specify GIT_TOKEN for git source repository. [#1318](https://github.com/GoogleContainerTools/kaniko/pull/1318) * The experimental `--use-new-run` flag avoid relying on timestamp. [#1383](https://github.com/GoogleContainerTools/kaniko/pull/1383) ## Bug Fixes * Set correct PATH for exec form [#1342](https://github.com/GoogleContainerTools/kaniko/pull/1342) * executor image: fix USER environment variable [#1364](https://github.com/GoogleContainerTools/kaniko/pull/1364) * fix use new run marker [#1379](https://github.com/GoogleContainerTools/kaniko/pull/1379) * Use current platform when fetching image in warmer [#1374](https://github.com/GoogleContainerTools/kaniko/pull/1374) * Bump version number mismatch [#1338](https://github.com/GoogleContainerTools/kaniko/pull/1338) * Bugfix: Reproducible layers with whiteout [#1350](https://github.com/GoogleContainerTools/kaniko/pull/1350) * prepend image name when using `registry-mirror` so `library/` is inferred [#1264](https://github.com/GoogleContainerTools/kaniko/pull/1264) * Add command should fail on 40x when fetching remote file [#1326](https://github.com/GoogleContainerTools/kaniko/pull/1326) ## Refactors & Updates * bump go-containerregistry dep [#1371](https://github.com/GoogleContainerTools/kaniko/pull/1371) * feat: upgrade go-git [#1319](https://github.com/GoogleContainerTools/kaniko/pull/1319) * Move snapshotPathPrefix into a method [#1359](https://github.com/GoogleContainerTools/kaniko/pull/1359) ## Documentation * Added instructions to use gcr without kubernetes [#1385](https://github.com/GoogleContainerTools/kaniko/pull/1385) * Format json & yaml in README [#1358](https://github.com/GoogleContainerTools/kaniko/pull/1358) Huge thank you for this release towards our contributors: - Alex Szakaly - Alexander Sharov - Anthony Davies - Art Begolli - Batuhan Apaydın - Ben Einaudi - Carlos Alexandro Becker - Carlos Sanchez - Chris Sng - Christopher Hlubek - Cole Wippern - Dani Raznikov - Daniel Marks - David Dooling - DracoBlue - Gabriel Virga - Gilbert Gilb's - Giovan Isa Musthofa - Gábor Lipták - Harmen Stoppels - James Ravn - Joe Kutner - Jon Henrik Bjørnstad - Jon Johnson - Jordan GOASDOUE - Jordan Goasdoue - Jordan Goasdoué - Josh Chorlton - Liubov Grinkevich - Logan.Price - Lukasz Jakimczuk - Mehdi Abaakouk - Michel Hollands - Mitchell Friedman - Moritz Wanzenböck - Or Sela - PhoenixMage - Pierre-Louis Bonicoli - Renato Suero - Sam Stoelinga - Shihab Hasan - Takumasa Sakao - Tejal Desai - Thomas Bonfort - Thomas Stromberg - Thomas Strömberg - Tom Prince - Vincent Latombe - Wietse Muizelaar - Yoan Blanc - Yoriyasu Yano - Yuheng Zhang - aca - cvgw - ohchang-kwon - priyawadhwa - tinkerborg - tsufeki - xanonid - yw-liu # v0.24.0 Release 2020-07-01 This is the 24th release of Kaniko! ## New Features * Add a new run command along with a new flag [#1300](https://github.com/GoogleContainerTools/kaniko/pull/1300) * Add redo snapshotter. [#1301](https://github.com/GoogleContainerTools/kaniko/pull/1301) * Add pkg.dev to automagic config file population [#1328](https://github.com/GoogleContainerTools/kaniko/pull/1328) * kaniko now clone git repositories recursing submodules by default [#1320](https://github.com/GoogleContainerTools/kaniko/pull/1320) ## Bug Fixes * Fix README.md [#1323](https://github.com/GoogleContainerTools/kaniko/pull/1323) * Fix docker-credential-gcr owner and group id [#1307](https://github.com/GoogleContainerTools/kaniko/pull/1307) ## Refactors * check file changed in loop [#1302](https://github.com/GoogleContainerTools/kaniko/pull/1302) * ADD GCB benchmark code [#1299](https://github.com/GoogleContainerTools/kaniko/pull/1299) * benchmark FileSystem snapshot project added [#1288](https://github.com/GoogleContainerTools/kaniko/pull/1288) * [Perf] Reduce loops over files when taking FS snapshot. [#1283](https://github.com/GoogleContainerTools/kaniko/pull/1283) * Fix README.md [#1323](https://github.com/GoogleContainerTools/kaniko/pull/1323) * Fix docker-credential-gcr owner and group id [#1307](https://github.com/GoogleContainerTools/kaniko/pull/1307) * benchmark FileSystem snapshot project added [#1288](https://github.com/GoogleContainerTools/kaniko/pull/1288) * [Perf] Reduce loops over files when taking FS snapshot. [#1283](https://github.com/GoogleContainerTools/kaniko/pull/1283) Huge thank you for this release towards our contributors: - Alexander Sharov - Alex Szakaly - Anthony Davies - Art Begolli - Batuhan Apaydın - Ben Einaudi - Carlos Alexandro Becker - Carlos Sanchez - Chris Sng - Cole Wippern - cvgw - Daniel Marks - Dani Raznikov - David Dooling - DracoBlue - Gábor Lipták - Gabriel Virga - Gilbert Gilb's - Giovan Isa Musthofa - James Ravn - Jon Henrik Bjørnstad - Jon Johnson - Jordan Goasdoué - Liubov Grinkevich - Logan.Price - Lukasz Jakimczuk - Mehdi Abaakouk - Michel Hollands - Mitchell Friedman - Moritz Wanzenböck - ohchang-kwon - Or Sela - PhoenixMage - priyawadhwa - Sam Stoelinga - Tejal Desai - Thomas Bonfort - Thomas Stromberg - Thomas Strömberg - tinkerborg - Tom Prince - Vincent Latombe - Wietse Muizelaar - xanonid - Yoan Blanc - Yoriyasu Yano - Yuheng Zhang - yw-liu # v0.23.0 Release 2020-06-04 This is the 23rd release of Kaniko! ## Bug Fixes * Resolving nested meta ARGs [#1260](https://github.com/GoogleContainerTools/kaniko/pull/1260) * add 64 busybox [#1254](https://github.com/GoogleContainerTools/kaniko/pull/1254) * Apply dockefile exclude only for first stage [#1234](https://github.com/GoogleContainerTools/kaniko/pull/1234) ## New Features * Add /etc/nsswitch.conf for /etc/hosts name resolution [#1251](https://github.com/GoogleContainerTools/kaniko/pull/1251) * Add ability to set git auth token using environment variables [#1263](https://github.com/GoogleContainerTools/kaniko/pull/1263) * Add retries to image push. [#1258](https://github.com/GoogleContainerTools/kaniko/pull/1258) * Update docker-credential-gcr to support auth with GCP Artifact Registry [#1255](https://github.com/GoogleContainerTools/kaniko/pull/1255) ## Updates and Refactors * Added integration test for multi level argument [#1285](https://github.com/GoogleContainerTools/kaniko/pull/1285) * rename whitelist to ignorelist [#1295](https://github.com/GoogleContainerTools/kaniko/pull/1295) * Remove direct use of DefaultTransport [#1221](https://github.com/GoogleContainerTools/kaniko/pull/1221) * fix switching to non existent workdir [#1253](https://github.com/GoogleContainerTools/kaniko/pull/1253) * remove duplicates save for the same dir [#1252](https://github.com/GoogleContainerTools/kaniko/pull/1252) * add timings for resolving paths [#1284](https://github.com/GoogleContainerTools/kaniko/pull/1284) ## Documentation * Instructions for using stdin with kubectl [#1289](https://github.com/GoogleContainerTools/kaniko/pull/1289) * Add GoReportCard badge to README [#1249](https://github.com/GoogleContainerTools/kaniko/pull/1249) * Make support clause more bold. [#1273](https://github.com/GoogleContainerTools/kaniko/pull/1273) * Correct typo [#1250](https://github.com/GoogleContainerTools/kaniko/pull/1250) * docs: add registry-certificate flag to readme [#1276](https://github.com/GoogleContainerTools/kaniko/pull/1276) Huge thank you for this release towards our contributors: - Anthony Davies - Art Begolli - Batuhan Apaydın - Ben Einaudi - Carlos Alexandro Becker - Carlos Sanchez - Chris Sng - Cole Wippern - Dani Raznikov - Daniel Marks - David Dooling - DracoBlue - Gabriel Virga - Gilbert Gilb's - Giovan Isa Musthofa - Gábor Lipták - James Ravn - Jon Henrik Bjørnstad - Jordan GOASDOUE - Liubov Grinkevich - Logan.Price - Lukasz Jakimczuk - Mehdi Abaakouk - Michel Hollands - Mitchell Friedman - Moritz Wanzenböck - Or Sela - PhoenixMage - Sam Stoelinga - Tejal Desai - Thomas Bonfort - Thomas Stromberg - Thomas Strömberg - Tom Prince - Vincent Latombe - Wietse Muizelaar - Yoan Blanc - Yoriyasu Yano - Yuheng Zhang - cvgw - ohchang-kwon - tinkerborg - xanonid - yw-liu # v0.22.0 Release 2020-05-07 This is a minor release of kaniko fixing: - GCB Authentication issue [1242](https://github.com/GoogleContainerTools/kaniko/issues/1242) - Re-added files if removed from base imaged [1236](https://github.com/GoogleContainerTools/kaniko/issues/1236) Big thanks to - David Dooling # v0.21.0 Release - 2020-05-04 This is the 21th release of Kaniko! Thank you for patience. This is minor release which fixes the `/kaniko/.docker` being removed in executor image * Fixes #1227 - Readded the `/kaniko/.docker` directory [#1230](https://github.com/GoogleContainerTools/kaniko/pull/1230) # v0.20.0 Release - 2020-05-04 This is the 20th release of Kaniko! Thank you for patience. Please give us feedback on how we are doing by taking a short [5 question survey](https://forms.gle/HhZGEM33x4FUz9Qa6) In this release, the highlights are: 1. Fix doubling cache layers size and error due to duplicate files in cached layers 1. Kaniko now supports reading a tar context from a stdin using `--context=tar:/. 1. Kaniko adds a new flag `--context-sub-path` to represent a subpath within the given context 1. Skip buiklding unused stages using `--skip-unused-stages` flags. ## Bug Fixes * Snapshot FS on first cache miss. [#1214](https://github.com/GoogleContainerTools/kaniko/pull/1214) * Add secondary group impersonation w/ !cgo support [#1164](https://github.com/GoogleContainerTools/kaniko/pull/1164) * kaniko generates images that docker supports in the presence of dangling symlinks [#1193](https://github.com/GoogleContainerTools/kaniko/pull/1193) * Handle `MAINTAINERS` when passing `--single-snapshot`. [#1192](https://github.com/GoogleContainerTools/kaniko/pull/1192) * Multistage ONBUILD COPY Support [#1190](https://github.com/GoogleContainerTools/kaniko/pull/1190) * fix previous name checking in 'executor.build.fetchExtraStages' [#1167](https://github.com/GoogleContainerTools/kaniko/pull/1167) * Always add parent directories of files to snapshots. [#1166](https://github.com/GoogleContainerTools/kaniko/pull/1166) * Fix `workdir` command pointing to relative dir in first command. * fix stages are now resolved correctly when `--skip-unused-stages` is used ## New Features * Add ability to use public GCR repos without being authenticated [#1140](https://github.com/GoogleContainerTools/kaniko/pull/1140) * Add timestamp to logs [#1211](https://github.com/GoogleContainerTools/kaniko/pull/1211) * Add http support for git repository context [#1196](https://github.com/GoogleContainerTools/kaniko/pull/1196) * Kaniko now resolves args from all stages [#1160](https://github.com/GoogleContainerTools/kaniko/pull/1160) * kaniko adds a new flag `--context-sub-path` to represent a subpath within the given context * feat: allow injecting through stdin tar.gz on kaniko [#1139](https://github.com/GoogleContainerTools/kaniko/pull/1139) * Set image platform for any build [#1130](https://github.com/GoogleContainerTools/kaniko/pull/1130) * Add --log-format parameter to README.md [#1216](https://github.com/GoogleContainerTools/kaniko/pull/1216) * feat: multistages now respect dependencies without building unnecessary stages [#1165](https://github.com/GoogleContainerTools/kaniko/pull/1165) ## Refactors and Updates * Refactor Kaniko to test across multistages [#1155](https://github.com/GoogleContainerTools/kaniko/pull/1155) * upgrade go container registry to latest master [#1146](https://github.com/GoogleContainerTools/kaniko/pull/1146) * small perf optimizing. Only remove whiteout path if it needs to be included in base image [#1147](https://github.com/GoogleContainerTools/kaniko/pull/1147) * Don't generate cache key, if not caching builds. [#1194](https://github.com/GoogleContainerTools/kaniko/pull/1194) * Set very large logs to Trace level [#1203](https://github.com/GoogleContainerTools/kaniko/pull/1203) * optimize: don't parse Dockerfile twice, reusing stages [#1174](https://github.com/GoogleContainerTools/kaniko/pull/1174) * 32bit overflow fix [#1168](https://github.com/GoogleContainerTools/kaniko/pull/1168) ## Documentation * Update Pushing to Docker Hub to use v2 api [#1204](https://github.com/GoogleContainerTools/kaniko/pull/1204) * Fix line endings in shell script [#1199](https://github.com/GoogleContainerTools/kaniko/pull/1199) Huge thank you for this release towards our contributors: - Anthony Davies - Batuhan Apaydın - Ben Einaudi - Carlos Alexandro Becker - Carlos Sanchez - Cole Wippern - cvgw - Dani Raznikov - DracoBlue - Gilbert Gilb's - Giovan Isa Musthofa - James Ravn - Jon Henrik Bjørnstad - Jordan GOASDOUE - Jordan Goasdoué - Liubov Grinkevich - Logan.Price - Michel Hollands - Moritz Wanzenböck - ohchang-kwon - Or Sela - PhoenixMage - Sam Stoelinga - Tejal Desai - Thomas Bonfort - Thomas Stromberg - Thomas Strömberg - tinkerborg - Tom Prince - Vincent Latombe - Wietse Muizelaar - xanonid - Yoan Blanc - Yuheng Zhang - yw-liu # v0.19.0 Release - 2020-03-18 This is the 19th release of Kaniko! In this release, the highlights are: 1. Cache layer size duplication regression in v0.18.0 is fixed. [#1138](https://github.com/GoogleContainerTools/kaniko/issues/1138) 1. Cache performance when using build-args. `build-args` are only part of cache key for a layer if it is used. 1. Kaniko can support a `tar.gz` context with `tar://` prefix. 1. Users can provide registry certificates for private registries. ## Bug Fixes * Use the correct name for acr helper [#1121](https://github.com/GoogleContainerTools/kaniko/pull/1121) * remove build args from composite key and replace all build args [#1085](https://github.com/GoogleContainerTools/kaniko/pull/1085) * fix resolve link for dirs with trailing / [#1113](https://github.com/GoogleContainerTools/kaniko/pull/1113) ## New Features * feat: add support of local '.tar.gz' file inside the kaniko container [#1115](https://github.com/GoogleContainerTools/kaniko/pull/1115) * Add support to `--chown` flag to ADD command (Issue #57) [#1134](https://github.com/GoogleContainerTools/kaniko/pull/1134) * executor: add --label flag [#1075](https://github.com/GoogleContainerTools/kaniko/pull/1075) * Allow user to provide registry certificate [#1037](https://github.com/GoogleContainerTools/kaniko/pull/1037) ## Refactors And Updates * Migrate to golang 1.14 [#1098](https://github.com/GoogleContainerTools/kaniko/pull/1098) * Make cloudbuild.yaml re-usable for anyone [#1135](https://github.com/GoogleContainerTools/kaniko/pull/1135) * fix: credential typo [#1128](https://github.com/GoogleContainerTools/kaniko/pull/1128) * Travis k8s integration test [#1124](https://github.com/GoogleContainerTools/kaniko/pull/1124) * Add more tests for Copy and some fixes. [#1114](https://github.com/GoogleContainerTools/kaniko/pull/1114) ## Documentation * Update README on running in Docker [#1141](https://github.com/GoogleContainerTools/kaniko/pull/1141) Huge thank you for this release towards our contributors: - Anthony Davies - Batuhan Apaydın - Ben Einaudi - Carlos Sanchez - Cole Wippern - cvgw - Dani Raznikov - DracoBlue - James Ravn - Jordan GOASDOUE - Logan.Price - Moritz Wanzenböck - ohchang-kwon - Or Sela - Sam Stoelinga - Tejal Desai - Thomas Bonfort - Thomas Strömberg - tinkerborg - Wietse Muizelaar - xanonid - Yoan Blanc - Yuheng Zhang # v0.18.0 Release -2020-03-05 This release fixes all the regression bugs associated with v0.17.0 and v0.17.1. This release, the team did a lot of work improving our test infrastructure, more tests cases and refactored filesystem walking. Thank you all for your patience and supporting us throughout! ## Bug Fixes * fix home being reset to root [#1072](https://github.com/GoogleContainerTools/kaniko/pull/1072) * fix user metadata set to USER:GROUP if group string is not set [#1105](https://github.com/GoogleContainerTools/kaniko/pull/1105) * check for filepath.Walk error everywhere [#1086](https://github.com/GoogleContainerTools/kaniko/pull/1086) * fix #1092 TestRelativePaths [#1093](https://github.com/GoogleContainerTools/kaniko/pull/1093) * Resolve filepaths before scanning for changes [#1069](https://github.com/GoogleContainerTools/kaniko/pull/1069) * Fix #1020 os.Chtimes invalid arg [#1074](https://github.com/GoogleContainerTools/kaniko/pull/1074) * Fix #1067 - image no longer available [#1068](https://github.com/GoogleContainerTools/kaniko/pull/1068) * Ensure image SHA stays consistent when layer contents haven't changed [#1032](https://github.com/GoogleContainerTools/kaniko/pull/1032) * fix flake TestRun/Dockerfile_test_copy_symlink [#1030](https://github.com/GoogleContainerTools/kaniko/pull/1030) ## New Features * root: add --registry-mirror flag [#836](https://github.com/GoogleContainerTools/kaniko/pull/836) * set log format using a flag [#1031](https://github.com/GoogleContainerTools/kaniko/pull/1031) * Do not recompute layers retrieved from cache [#882](https://github.com/GoogleContainerTools/kaniko/pull/882) * More idiomatic logging config [#1040](https://github.com/GoogleContainerTools/kaniko/pull/1040) ## Test Refactors and Updates * Split travis integration tests [#1090](https://github.com/GoogleContainerTools/kaniko/pull/1090) * Add integration tests from Issues [#1054](https://github.com/GoogleContainerTools/kaniko/pull/1054) * add integration tests with their own context [#1088](https://github.com/GoogleContainerTools/kaniko/pull/1088) * Fixed typo in README.md [#1060](https://github.com/GoogleContainerTools/kaniko/pull/1060) * test: refactor container-diff call [#1077](https://github.com/GoogleContainerTools/kaniko/pull/1077) * Refactor integration image built [#1049](https://github.com/GoogleContainerTools/kaniko/pull/1049) * separate travis into multiple jobs for parallelization [#1055](https://github.com/GoogleContainerTools/kaniko/pull/1055) * refactor copy.chown code and add more tests [#1027](https://github.com/GoogleContainerTools/kaniko/pull/1027) * Allow contributors to launch integration tests against local registry [#1014](https://github.com/GoogleContainerTools/kaniko/pull/1014) ## Documentation * add design proposal template [#1046](https://github.com/GoogleContainerTools/kaniko/pull/1046) * Update filesystem proposal status to Reviewed [#1066](https://github.com/GoogleContainerTools/kaniko/pull/1066) * update instructions for running integration tests [#1034](https://github.com/GoogleContainerTools/kaniko/pull/1034) * design proposal 01: filesystem resolution [#1048](https://github.com/GoogleContainerTools/kaniko/pull/1048) * Document that this tool is not officially supported by Google [#1044](https://github.com/GoogleContainerTools/kaniko/pull/1044) * Fix example pod.yml to not mount to root [#1043](https://github.com/GoogleContainerTools/kaniko/pull/1043) * fixing docker run command in README.md [#1103](https://github.com/GoogleContainerTools/kaniko/pull/1103) Huge thank you for this release towards our contributors: - Anthony Davies - Batuhan Apaydın - Ben Einaudi - Cole Wippern - cvgw - DracoBlue - James Ravn - Logan.Price - Moritz Wanzenböck - ohchang-kwon - Or Sela - Sam Stoelinga - Tejal Desai - Thomas Bonfort - Thomas Strömberg - tinkerborg - Wietse Muizelaar - xanonid - Yoan Blanc # v0.17.1 Release - 2020-02-04 This is minor patch release to fix [#1002](https://github.com/GoogleContainerTools/kaniko/issues/1002) # v0.17.0 Release - 2020-02-03 ## New Features * Expand build argument from environment when no value specified [#993](https://github.com/GoogleContainerTools/kaniko/pull/993) * whitelist /tmp/apt-key-gpghome.* directory [#1000](https://github.com/GoogleContainerTools/kaniko/pull/1000) * Add flag to `--whitelist-var-run` set to true to preserver default kani… [#1011](https://github.com/GoogleContainerTools/kaniko/pull/1011) * Prefer platform that is currently running for pulling remote images and kaniko binary Makefile target [#980](https://github.com/GoogleContainerTools/kaniko/pull/980) ## Bug Fixes * Fix caching to respect .dockerignore [#854](https://github.com/GoogleContainerTools/kaniko/pull/854) * Fixes #988 run_in_docker.sh only works with gcr.io [#990](https://github.com/GoogleContainerTools/kaniko/pull/990) * Fix Symlinks not being copied across stages [#971](https://github.com/GoogleContainerTools/kaniko/pull/971) * Fix home and group set for user command [#995](https://github.com/GoogleContainerTools/kaniko/pull/995) * Fix COPY or ADD to symlink destination breaks image [#943](https://github.com/GoogleContainerTools/kaniko/pull/943) * [Caching] Fix bug with deleted files and cached run and copy commands * [Mutistage Build] Fix bug with capital letter in stage names [#983](https://github.com/GoogleContainerTools/kaniko/pull/983) * Fix #940 set modtime when extracting [#981](https://github.com/GoogleContainerTools/kaniko/pull/981) * Fix Ability for ADD to unTar a file [#792](https://github.com/GoogleContainerTools/kaniko/pull/792) ## Updates and Refactors * fix test flake [#1016](https://github.com/GoogleContainerTools/kaniko/pull/1016) * Upgrade go-containerregistry third-party library [#957](https://github.com/GoogleContainerTools/kaniko/pull/957) * Remove debug tag being built for every push to master [#1004](https://github.com/GoogleContainerTools/kaniko/pull/1004) * Run integration tests in Travis CI [#979](https://github.com/GoogleContainerTools/kaniko/pull/979) Huge thank you for this release towards our contributors: - Anthony Davies - Ben Einaudi - Cole Wippern - cvgw - Logan.Price - Moritz Wanzenböck - ohchang-kwon - Sam Stoelinga - Tejal Desai - Thomas Bonfort - Wietse Muizelaar # v0.16.0 Release - 2020-01-17 Happy New Year 2020! ## Bug Fixes * Support for private registries in the cache warmer [#941](https://github.com/GoogleContainerTools/kaniko/pull/941) * Fix bug with docker compatibility ArgsEscaped [#964](https://github.com/GoogleContainerTools/kaniko/pull/964) * Clean code (Condition is always 'false' because 'err' is always 'nil' ). [#967](https://github.com/GoogleContainerTools/kaniko/pull/967) * Fix #647 Copy dir permissions [#961](https://github.com/GoogleContainerTools/kaniko/pull/961) * Allow setting serviceAccount in integration test [#965](https://github.com/GoogleContainerTools/kaniko/pull/965) * Fix #926 cache warmer and method signature [#927](https://github.com/GoogleContainerTools/kaniko/pull/927) * Fix #948 update valid license years [#949](https://github.com/GoogleContainerTools/kaniko/pull/949) * Move hash bang to first line. [#954](https://github.com/GoogleContainerTools/kaniko/pull/954) * Fix #944 include docker-credential-acr-linux [#945](https://github.com/GoogleContainerTools/kaniko/pull/945) * Fix #925 broken insecure pull [#932](https://github.com/GoogleContainerTools/kaniko/pull/932) * Push to ECR using instance roles [#930](https://github.com/GoogleContainerTools/kaniko/pull/930) * Upgrade aws go sdk for supporting eks oidc credential chain [#832](https://github.com/GoogleContainerTools/kaniko/pull/832) * Push image [#866](https://github.com/GoogleContainerTools/kaniko/pull/866) ## Updates and Refactors * Fixes #950 integration test failing on go 1.13 [#955](https://github.com/GoogleContainerTools/kaniko/pull/955) * Tidy dependencies [#939](https://github.com/GoogleContainerTools/kaniko/pull/939) * changing to modules from dependencies [#869](https://github.com/GoogleContainerTools/kaniko/pull/869) * Changing Log to trace [#920](https://github.com/GoogleContainerTools/kaniko/pull/920) ## Documentation * docs: fix document on DoBuild [#668](https://github.com/GoogleContainerTools/kaniko/pull/668) * Update outdated toc in README.md [#867](https://github.com/GoogleContainerTools/kaniko/pull/867) Huge thank you for this release towards our contributors: - Adrian Mouat - Balint Pato - Ben Einaudi - Benjamin EINAUDI - Carlos Sanchez - Cole Wippern - Daniel Strobusch - Eduard Laur - Fahri Yardımcı - Josh Soref - lou-lan - Nao YONASHIRO - poy - Prashant Arya - priyawadhwa - Pweetoo - Remko van Hunen - Sam Stoelinga - Stijn De Haes - Tejal Desai - tommaso.doninelli - Will Ripley # v0.15.0 Release - 2019-12-20 ## Bug fixes * Fix #899 cached copy results in inconsistent key [#914](https://github.com/GoogleContainerTools/kaniko/pull/914) * Fix contribution issue sentence [#912](https://github.com/GoogleContainerTools/kaniko/pull/912) * Include source stage cache key in cache key for COPY commands using --from [#883](https://github.com/GoogleContainerTools/kaniko/pull/883) * Fix failure when using capital letters in image alias in 'FROM ... AS…' instruction [#839](https://github.com/GoogleContainerTools/kaniko/pull/839) * Add golangci.yaml file matching current config [#893](https://github.com/GoogleContainerTools/kaniko/pull/893) * when copying, skip files with the same name [#905](https://github.com/GoogleContainerTools/kaniko/pull/905) * Modified error message for writing image with digest file [#849](https://github.com/GoogleContainerTools/kaniko/pull/849) * Don't exit optimize early; record last cachekey [#892](https://github.com/GoogleContainerTools/kaniko/pull/892) * Final cachekey for stage [#891](https://github.com/GoogleContainerTools/kaniko/pull/891) * Update error handling and logging for cache [#879](https://github.com/GoogleContainerTools/kaniko/pull/879) * Resolve symlink targets to abs path before copying [#857](https://github.com/GoogleContainerTools/kaniko/pull/857) * Fix quote strip behavior for ARG values [#850](https://github.com/GoogleContainerTools/kaniko/pull/850) ## Updates and Refactors * add unit tests for caching run and copy [#888](https://github.com/GoogleContainerTools/kaniko/pull/888) * Only build required docker images for integration tests [#898](https://github.com/GoogleContainerTools/kaniko/pull/898) * Add integration test for add url with arg [#863](https://github.com/GoogleContainerTools/kaniko/pull/863) * Add unit tests for compositecache and stagebuilder [#890](https://github.com/GoogleContainerTools/kaniko/pull/890) ## Documentation * updated readme [#906](https://github.com/GoogleContainerTools/kaniko/pull/906) * nits in README [#861](https://github.com/GoogleContainerTools/kaniko/pull/861) * Invalid link to missing file config.json [#876](https://github.com/GoogleContainerTools/kaniko/pull/876) * Fix README.md anchor links [#872](https://github.com/GoogleContainerTools/kaniko/pull/872) * Update readme known issues [#874](https://github.com/GoogleContainerTools/kaniko/pull/874) Huge thank you for this release towards our contributors: - Balint Pato - Ben Einaudi - Cole Wippern - Eduard Laur - Josh Soref - Pweetoo - Tejal Desai - Will Ripley - poy - priyawadhwa - tommaso.doninelli # v0.14.0 Release - 2019-11-08 ## New Features * Added --image-name-with-digest flag [#841](https://github.com/GoogleContainerTools/kaniko/pull/841) * Add support to download context file from Azure Blob Storage [#816](https://github.com/GoogleContainerTools/kaniko/pull/816) * Add BUILD_ARGs to ease use of proxy [#810](https://github.com/GoogleContainerTools/kaniko/pull/810) ## Bug Fixes * fix tests for default home [#824](https://github.com/GoogleContainerTools/kaniko/pull/824) * Issue #439 Strip out double quotes in ARG value [#834](https://github.com/GoogleContainerTools/kaniko/pull/834) * Fixes caching with COPY command [#773](https://github.com/GoogleContainerTools/kaniko/pull/773) * 828: clean up docker doc, fix context var in run cmd [#829](https://github.com/GoogleContainerTools/kaniko/pull/829) * fix build_args in MakeFile, have Travis run make images to preven issue in future [#821](https://github.com/GoogleContainerTools/kaniko/pull/821) ## Updates and Refactors * changing debug to trace [#825](https://github.com/GoogleContainerTools/kaniko/pull/825) ## Documentation * Details about --tarPath usage improved [#811](https://github.com/GoogleContainerTools/kaniko/pull/811) # v0.13.0 Release - 2019-10-04 ## New Features * Add `kaniko version` command [#796](https://github.com/GoogleContainerTools/kaniko/pull/796) * Write data about pushed images for GCB kaniko build step if env var `BUILDER_OUTPUT` is set [#602](https://github.com/GoogleContainerTools/kaniko/pull/602) * Support `Dockerfile.dockerignore` relative to `Dockerfile` [#801](https://github.com/GoogleContainerTools/kaniko/pull/801) ## Bug Fixes * fix creating abs path for urls [#804](https://github.com/GoogleContainerTools/kaniko/pull/804) * Fix #691 - ADD does not understand ENV variables [#768](https://github.com/GoogleContainerTools/kaniko/pull/768) * Resolve relative paths to absolute paths in command line arguments [#736](https://github.com/GoogleContainerTools/kaniko/pull/736) * insecure flag is now honored with `--cache` flag. [#685](https://github.com/GoogleContainerTools/kaniko/pull/685) * Reduce log level for adding file message [#624](https://github.com/GoogleContainerTools/kaniko/pull/624) * Fix SIGSEGV on file system deletion while building [#765](https://github.com/GoogleContainerTools/kaniko/pull/765) ## Updates and Refactors * add debug level info what is the layer type [#805](https://github.com/GoogleContainerTools/kaniko/pull/805) * Update base image to golang:1.12 [#648](https://github.com/GoogleContainerTools/kaniko/pull/648) * Add some triage notes to issue template. [#794](https://github.com/GoogleContainerTools/kaniko/pull/794) * double help text about skip-verify-tls [#782](https://github.com/GoogleContainerTools/kaniko/pull/782) * Add a pull request template [#795](https://github.com/GoogleContainerTools/kaniko/pull/795) * Correct CheckPushPermission comment. [#671](https://github.com/GoogleContainerTools/kaniko/pull/671) ## Documentation * Use kaniko with docker config.json password [#129](https://github.com/GoogleContainerTools/kaniko/pull/129) * Add getting started tutorial [#790](https://github.com/GoogleContainerTools/kaniko/pull/790) ## Performance * feat: optimize build [#694](https://github.com/GoogleContainerTools/kaniko/pull/694) Huge thank you for this release towards our contributors: - alexa - Andreas Bergmeier - Carlos Alexandro Becker - Carlos Sanchez - chhsia0 - debuggy - Deniz Zoeteman - Don McCasland - Fred Cox - Herrmann Hinz - Hugues Alary - Jason Hall - Johannes 'fish' Ziemke - jonjohnsonjr - Luke Wood - Matthew Dawson - Mingliang Tao - Monard Vong - Nao YONASHIRO - Niels Denissen - Prashant - priyawadhwa - Priya Wadhwa - Sascha Askani - sharifelgamal - Sharif Elgamal - Takeaki Matsumoto - Taylor Barrella - Tejal Desai - Thao-Nguyen Do - tralexa - Victor Noel - v.rul - Warren Seymour - xanonid - Xueshan Feng - Антон Костенко - Роман Небалуев # v0.12.0 Release - 2019-09/13 ## New Features * Added `--oci-layout-path` flag to save image in OCI layout. [#744](https://github.com/GoogleContainerTools/kaniko/pull/744) * Add support for S3 custom endpoint [#698](https://github.com/GoogleContainerTools/kaniko/pull/698) ## Bug Fixes * Setting PATH [#760](https://github.com/GoogleContainerTools/kaniko/pull/760) * Remove leading slash in layer tarball paths (Closes: #726) [#729](https://github.com/GoogleContainerTools/kaniko/pull/729) ## Updates and Refactors * Remove cruft [#635](https://github.com/GoogleContainerTools/kaniko/pull/635) * Add desc for `--skip-tls-verify-pull` to README [#493](https://github.com/GoogleContainerTools/kaniko/pull/493) Huge thank you for this release towards our contributors: - Carlos Alexandro Becker - Carlos Sanchez - chhsia0 - Deniz Zoeteman - Luke Wood - Matthew Dawson - Niels Denissen - Priya Wadhwa - Sharif Elgamal - Takeaki Matsumoto - Taylor Barrella - Tejal Desai - v.rul - Warren Seymour - xanonid - Xueshan Feng - Роман Небалуев # v0.11.0 Release - 2019-08-23 ## Bug Fixes * fix unpacking archives via ADD [#717](https://github.com/GoogleContainerTools/kaniko/pull/717) * Reverted not including build args in cache key [#739](https://github.com/GoogleContainerTools/kaniko/pull/739) * Create cache directory if it doesn't already exist [#452](https://github.com/GoogleContainerTools/kaniko/pull/452) ## New Features * add multiple user agents to kaniko if upstream_client_type value is set [#750](https://github.com/GoogleContainerTools/kaniko/pull/750) * Make container layers captured using FS snapshots reproducible [#714](https://github.com/GoogleContainerTools/kaniko/pull/714) * Include warmer in debug image [#497](https://github.com/GoogleContainerTools/kaniko/pull/497) * Bailout when there is not enough input arguments [#735](https://github.com/GoogleContainerTools/kaniko/pull/735) * Add checking image presence in cache prior to downloading it [#723](https://github.com/GoogleContainerTools/kaniko/pull/723) ## Additonal PRs * Document how to build from git reference [#730](https://github.com/GoogleContainerTools/kaniko/pull/730) * Misc. small changes/refactoring [#712](https://github.com/GoogleContainerTools/kaniko/pull/712) * Update go-containerregistry [#680](https://github.com/GoogleContainerTools/kaniko/pull/680) * Update version of go-containerregistry [#724](https://github.com/GoogleContainerTools/kaniko/pull/724) * feat: support specifying branch for cloning [#703](https://github.com/GoogleContainerTools/kaniko/pull/703) Huge thank you for this release towards our contributors: - Carlos Alexandro Becker - Carlos Sanchez - Deniz Zoeteman - Luke Wood - Matthew Dawson - priyawadhwa - sharifelgamal - Sharif Elgamal - Taylor Barrella - Tejal Desai - v.rul - Warren Seymour - Xueshan Feng - Роман Небалуе # v0.10.0 Release - 2019-06-19 ## Bug Fixes * Fix kaniko caching [#639](https://github.com/GoogleContainerTools/kaniko/pull/639) * chore: fix typo [#665](https://github.com/GoogleContainerTools/kaniko/pull/665) * Fix file mode bug [#618](https://github.com/GoogleContainerTools/kaniko/pull/618) * Fix arg handling for multi-stage images in COPY instructions. [#621](https://github.com/GoogleContainerTools/kaniko/pull/621) * Fix parent directory permissions [#619](https://github.com/GoogleContainerTools/kaniko/pull/619) * Environment variables should be replaced in URLs in ADD commands. [#580](https://github.com/GoogleContainerTools/kaniko/pull/580) * Update the cache warmer to also save manifests. [#576](https://github.com/GoogleContainerTools/kaniko/pull/576) * Fix typo in error message [#569](https://github.com/GoogleContainerTools/kaniko/pull/569) ## New Features * Add SkipVerify support to CheckPushPermissions. [#663](https://github.com/GoogleContainerTools/kaniko/pull/663) * Creating github Build Context [#672](https://github.com/GoogleContainerTools/kaniko/pull/672) * Add `--digest-file` flag to output built digest to file. [#655](https://github.com/GoogleContainerTools/kaniko/pull/655) * README.md: update BuildKit/img comparison [#642](https://github.com/GoogleContainerTools/kaniko/pull/642) * Add documentation for --verbosity flag [#634](https://github.com/GoogleContainerTools/kaniko/pull/634) * Optimize file copying and stage saving between stages. [#605](https://github.com/GoogleContainerTools/kaniko/pull/605) * Add an integration test for USER unpacking. [#600](https://github.com/GoogleContainerTools/kaniko/pull/600) * Added missing documentation for --skip-tls-verify-pull arg [#593](https://github.com/GoogleContainerTools/kaniko/pull/593) * README.me: update Buildah description [#586](https://github.com/GoogleContainerTools/kaniko/pull/586) * Add missing tests for bucket util [#565](https://github.com/GoogleContainerTools/kaniko/pull/565) * Look for manifests in the local cache next to the full images. [#570](https://github.com/GoogleContainerTools/kaniko/pull/570) * Make the run_in_docker script support caching. [#564](https://github.com/GoogleContainerTools/kaniko/pull/564) * Refactor snapshotting [#561](https://github.com/GoogleContainerTools/kaniko/pull/561) * Stop storing a separate cache hash. [#560](https://github.com/GoogleContainerTools/kaniko/pull/560) * Speed up workdir by always returning an empty filelist (rather than a… [#557](https://github.com/GoogleContainerTools/kaniko/pull/557) * Refactor whitelist handling. [#559](https://github.com/GoogleContainerTools/kaniko/pull/559) * Refactor the build loop to fetch stagebuilders earlier. [#558](https://github.com/GoogleContainerTools/kaniko/pull/558) ## Additonal PRs * Improve changelog dates [#657](https://github.com/GoogleContainerTools/kaniko/pull/657) * Change verbose output from info to debug [#640](https://github.com/GoogleContainerTools/kaniko/pull/640) * Check push permissions before building images [#622](https://github.com/GoogleContainerTools/kaniko/pull/622) * Bump go-containerregistry to 8c1640add99804503b4126abc718931a4d93c31a [#609](https://github.com/GoogleContainerTools/kaniko/pull/609) * Update go-containerregistry [#599](https://github.com/GoogleContainerTools/kaniko/pull/599) * Log "Skipping paths under..." to debug [#571](https://github.com/GoogleContainerTools/kaniko/pull/571) Huge thank you for this release towards our contributors: - Achilleas Pipinellis - Adrian Duong - Akihiro Suda - Andreas Bergmeier - Andrew Rynhard - Anthony Weston - Anurag Goel - Balint Pato - Christie Wilson - Daisuke Taniwaki - Dan Cecile - Dirk Gustke - dlorenc - Fredrik Lönnegren - Gijs - Jake Shadle - James Rawlings - Jason Hall - Johan Hernandez - Johannes 'fish' Ziemke - Kartik Verma - linuxshokunin - MMeent - Myers Carpenter - Nándor István Krácser - Nao YONASHIRO - Priya Wadhwa - Sharif Elgamal - Shuhei Kitagawa - Valentin Rothberg - Vincent Demeester # v0.9.0 Release - 2019-02-08 ## Bug Fixes * Bug fix with volumes declared in base images during multi-stage builds * Bug fix during snapshotting multi-stage builds. * Bug fix for caching with tar output. # v0.8.0 Release - 2019-01-29 ## New Features * Even faster snapshotting with godirwalk * Added TTL for caching ## Updates * Change cache key calculation to be more reproducible. * Make the Digest calculation faster for locally-cached images. * Simplify snapshotting. ## Bug Fixes * Fix bug with USER command and unpacking base images. * Added COPY --from=previous stage name/number validation # v0.7.0 Release - 2018-12-10 ## New Features * Add support for COPY --from an unrelated image ## Updates * Speed up snapshotting by using filepath.SkipDir * Improve layer cache upload performance * Skip unpacking the base image in certain cases ## Bug Fixes * Fix bug with call loop * Fix caching for multi-step builds # v0.6.0 Release - 2018-11-06 ## New Features * parse arg commands at the top of dockerfiles [#404](https://github.com/GoogleContainerTools/kaniko/pull/404) * Add buffering for large layers. [#428](https://github.com/GoogleContainerTools/kaniko/pull/428) * Separate Insecure Pull Options [#409](https://github.com/GoogleContainerTools/kaniko/pull/409) * Add support for .dockerignore file [#394](https://github.com/GoogleContainerTools/kaniko/pull/394) * Support insecure pull [#401](https://github.com/GoogleContainerTools/kaniko/pull/401) ## Updates * Preserve options when doing a cache push [#423](https://github.com/GoogleContainerTools/kaniko/pull/423) * More cache cleanups: [#397](https://github.com/GoogleContainerTools/kaniko/pull/397) * adding documentation for base image caching [#421](https://github.com/GoogleContainerTools/kaniko/pull/421) * Update go-containerregistry [#420](https://github.com/GoogleContainerTools/kaniko/pull/420) * Update README [#419](https://github.com/GoogleContainerTools/kaniko/pull/419) * Use remoteImage function when getting digest for cache [#413](https://github.com/GoogleContainerTools/kaniko/pull/413) * adding exit 1 when there are not enough command line vars passed to `… [#415](https://github.com/GoogleContainerTools/kaniko/pull/415) * "Container Builder" - > "Cloud Build" [#414](https://github.com/GoogleContainerTools/kaniko/pull/414) * adding the cache warmer to the release process [#412](https://github.com/GoogleContainerTools/kaniko/pull/412) ## Bug Fixes * Fix bugs with .dockerignore and improve integration test [#424](https://github.com/GoogleContainerTools/kaniko/pull/424) * fix releasing the cache warmer [#418](https://github.com/GoogleContainerTools/kaniko/pull/418) # v0.5.0 Release - 2018-10-16 ## New Features * Persistent volume caching for base images [#383](https://github.com/GoogleContainerTools/kaniko/pull/383) ## Updates * Use only the necessary files in the cache keys. [#387](https://github.com/GoogleContainerTools/kaniko/pull/387) * Change loglevel for copying files to debug (#303) [#393](https://github.com/GoogleContainerTools/kaniko/pull/393) * Improve IsDestDir functionality with filesystem info [#390](https://github.com/GoogleContainerTools/kaniko/pull/390) * Refactor the build loop. [#385](https://github.com/GoogleContainerTools/kaniko/pull/385) * Rework cache key generation a bit. [#375](https://github.com/GoogleContainerTools/kaniko/pull/375) ## Bug Fixes * fix mispell [#396](https://github.com/GoogleContainerTools/kaniko/pull/396) * Update go-containerregistry dependency [#388](https://github.com/GoogleContainerTools/kaniko/pull/388) * chore: fix broken markdown (CHANGELOG.md) [#382](https://github.com/GoogleContainerTools/kaniko/pull/382) * Don't cut everything after an equals sign [#381](https://github.com/GoogleContainerTools/kaniko/pull/381) # v0.4.0 Release - 2018-10-01 ## New Features * Add a benchmark package to store and monitor timings. [#367](https://github.com/GoogleContainerTools/kaniko/pull/367) * Add layer caching to kaniko [#353](https://github.com/GoogleContainerTools/kaniko/pull/353) * Update issue templates [#340](https://github.com/GoogleContainerTools/kaniko/pull/340) * Separate --insecure-skip-tls-verify flag into two separate flags [#311](https://github.com/GoogleContainerTools/kaniko/pull/311) * Updated created by time for built image [#328](https://github.com/GoogleContainerTools/kaniko/pull/328) * Add Flag to Disable Push to Container Registry [#292](https://github.com/GoogleContainerTools/kaniko/pull/292) * Add a new flag to cleanup the filesystem at the end [#370](https://github.com/GoogleContainerTools/kaniko/pull/370) ## Updates * Update README to add information about layer caching [#364](https://github.com/GoogleContainerTools/kaniko/pull/364) * Suppress usage upon Run error [#356](https://github.com/GoogleContainerTools/kaniko/pull/356) * Refactor build into stageBuilder type [#343](https://github.com/GoogleContainerTools/kaniko/pull/343) * Replace gometalinter with GolangCI-Lint [#349](https://github.com/GoogleContainerTools/kaniko/pull/349) * Add Key() to LayeredMap and Snapshotter [#337](https://github.com/GoogleContainerTools/kaniko/pull/337) * Add CacheCommand to DockerCommand interface [#336](https://github.com/GoogleContainerTools/kaniko/pull/336) * Extract filesystem in order rather than in reverse [#326](https://github.com/GoogleContainerTools/kaniko/pull/326) * Configure logs to show colors [#327](https://github.com/GoogleContainerTools/kaniko/pull/327) * Enable shared config for s3 [#321](https://github.com/GoogleContainerTools/kaniko/pull/321) * Update go-containerregistry. [#305](https://github.com/GoogleContainerTools/kaniko/pull/305) * Tag latest in cloudbuild.yaml [#287](https://github.com/GoogleContainerTools/kaniko/pull/287) * Set default home value [#281](https://github.com/GoogleContainerTools/kaniko/pull/281) * Update deps [#265](https://github.com/GoogleContainerTools/kaniko/pull/265) * Update go-containerregistry dep and remove unnecessary Options [#376](https://github.com/GoogleContainerTools/kaniko/pull/376) * Add a bit more context to layer offset failures [#264](https://github.com/GoogleContainerTools/kaniko/pull/264) ## Bug Fixes * Whitelist /busybox in the debug image [#369](https://github.com/GoogleContainerTools/kaniko/pull/369) * Check --cache-repo is provided with --cache and --no-push [#374](https://github.com/GoogleContainerTools/kaniko/pull/374) * Fixes a whitelist issue when untarring files in ADD commands. [#371](https://github.com/GoogleContainerTools/kaniko/pull/371) * set default HOME env properly [#341](https://github.com/GoogleContainerTools/kaniko/pull/341) * Review config for cmd/entrypoint after building a stage [#348](https://github.com/GoogleContainerTools/kaniko/pull/348) * Enable overwriting of links (solves #351) [#360](https://github.com/GoogleContainerTools/kaniko/pull/360) * Only return stdout when running commands for integration tests [#363](https://github.com/GoogleContainerTools/kaniko/pull/363) * Whitelist /etc/mtab [#347](https://github.com/GoogleContainerTools/kaniko/pull/347) * Added a KanikoStage type for each stage of a Dockerfile [#320](https://github.com/GoogleContainerTools/kaniko/pull/320) * Make sure paths are absolute before matching files to wildcard sources [#330](https://github.com/GoogleContainerTools/kaniko/pull/330) * Build each kaniko image separately [#324](https://github.com/GoogleContainerTools/kaniko/pull/324) * support multiple tags when writing to a tarfile [#323](https://github.com/GoogleContainerTools/kaniko/pull/323) * Snapshot only specific files for COPY [#319](https://github.com/GoogleContainerTools/kaniko/pull/319) * Remove some constraints from our Gopkg.toml. [#318](https://github.com/GoogleContainerTools/kaniko/pull/318) * Always snapshot files in COPY and RUN commands [#289](https://github.com/GoogleContainerTools/kaniko/pull/289) * Refactor command line arguments and the executor [#306](https://github.com/GoogleContainerTools/kaniko/pull/306) * Fix bug in SaveStage function for multistage builds [#295](https://github.com/GoogleContainerTools/kaniko/pull/295) * Get absolute path of file before checking whitelist [#293](https://github.com/GoogleContainerTools/kaniko/pull/293) * Fix support for insecure registry [#169](https://github.com/GoogleContainerTools/kaniko/pull/169) * ignore sockets when adding to tar [#288](https://github.com/GoogleContainerTools/kaniko/pull/288) * fix add command bug when adding remote URLs [#277](https://github.com/GoogleContainerTools/kaniko/pull/277) * Environment variables with multiple '=' are not parsed correctly [#278](https://github.com/GoogleContainerTools/kaniko/pull/278) * Ensure cmd.SysProcAttr is set before modifying it [#275](https://github.com/GoogleContainerTools/kaniko/pull/275) * Don't copy same files twice in copy integration tests [#273](https://github.com/GoogleContainerTools/kaniko/pull/273) * Extract intermediate stages to filesystem [#266](https://github.com/GoogleContainerTools/kaniko/pull/266) * Fix process group handling. [#271](https://github.com/GoogleContainerTools/kaniko/pull/271) * Only add whiteout files once [#270](https://github.com/GoogleContainerTools/kaniko/pull/270) * Fix handling of the volume directive [#334](https://github.com/GoogleContainerTools/kaniko/pull/334) # v0.3.0 Release - 2018-07-31 ## New Features * Local integration testing [#256](https://github.com/GoogleContainerTools/kaniko/pull/256) * Add --target flag for multistage builds [#255](https://github.com/GoogleContainerTools/kaniko/pull/255) * Look for on cluster credentials using k8s chain [#243](https://github.com/GoogleContainerTools/kaniko/pull/243) ## Bug Fixes * Kill grandchildren spun up by child processes [#247](https://github.com/GoogleContainerTools/kaniko/issues/247) * Fix bug in copy command [#221](https://github.com/GoogleContainerTools/kaniko/issues/221) * Multi-stage errors when referencing earlier stages [#233](https://github.com/GoogleContainerTools/kaniko/issues/233) # v0.2.0 Release - 2018-07-09 ## New Features * Support for adding different source contexts, including Amazon S3 [#195](https://github.com/GoogleContainerTools/kaniko/issues/195) * Added --reproducible [#205](https://github.com/GoogleContainerTools/kaniko/pull/205) and --single-snapshot [#204](https://github.com/GoogleContainerTools/kaniko/pull/204) flags * Documented running kaniko in gVisor [#194](https://github.com/GoogleContainerTools/kaniko/pull/194) * Update go-containerregistry so kaniko works better with Harbor and Gitlab[#227](https://github.com/GoogleContainerTools/kaniko/pull/227) * Push image to multiple destinations [#184](https://github.com/GoogleContainerTools/kaniko/pull/184) # v0.1.0 Release - 2018-05-17 ## New Features * The majority of Dockerfile commands are feature complete [#1](https://github.com/GoogleContainerTools/kaniko/issues/1) * Support for multi-stage Dockerfile builds [#141](https://github.com/GoogleContainerTools/kaniko/pull/141) * Refactored integration tests [#126](https://github.com/GoogleContainerTools/kaniko/pull/126) * Added debug image with a busybox shell [#171](https://github.com/GoogleContainerTools/kaniko/pull/1710) * Added credential helper for Amazon ECR [#167](https://github.com/GoogleContainerTools/kaniko/pull/167) ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to Kaniko We'd love to accept your patches and contributions to this project!! To get started developing, see our [DEVELOPMENT.md](./DEVELOPMENT.md). In this file you'll find info on: - [Contributing to Kaniko](#contributing-to-kaniko) - [Contributor License Agreement](#contributor-license-agreement) - [Code reviews](#code-reviews) - [Standards](#standards) - [Commit Messages](#commit-messages) - [Coding standards](#coding-standards) - [Finding something to work on](#finding-something-to-work-on) [code](#coding-standards) - [Finding something to work on](#finding-something-to-work-on) ## Contributor License Agreement Contributions to this project must be accompanied by a Contributor License Agreement. You (or your employer) retain the copyright to your contribution; this simply gives us permission to use and redistribute your contributions as part of the project. Head over to to see your current agreements on file or to sign a new one. You generally only need to submit a CLA once, so if you've already submitted one (even if it was for a different project), you probably don't need to do it again. ## Code reviews All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. ## Standards This section describes the standards we will try to maintain in this repo. ### Commit Messages All commit messages should follow [these best practices](https://chris.beams.io/posts/git-commit/), specifically: - Start with a subject line - Contain a body that explains _why_ you're making the change you're making - Reference an issue number if one exists, closing it if applicable (with text such as ["Fixes #245" or "Closes #111"](https://help.github.com/articles/closing-issues-using-keywords/)) Aim for [2 paragraphs in the body](https://www.youtube.com/watch?v=PJjmw9TRB7s). Not sure what to put? Include: - What is the problem being solved? - Why is this the best approach? - What other approaches did you consider? - What side effects will this approach have? - What future work remains to be done? ### Coding standards The code in this repo should follow best practices, specifically: - [Go code review comments](https://go.dev/wiki/CodeReviewComments) ## Finding something to work on Thanks so much for considering contributing to our project!! We hope very much you can find something interesting to work on: - To find issues that we particularly would like contributors to tackle, look for [issues with the "help wanted" label](https://github.com/GoogleContainerTools/kaniko/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22). - Issues that are good for new folks will additionally be marked with ["good first issue"](https://github.com/GoogleContainerTools/kaniko/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). ================================================ FILE: DEVELOPMENT.md ================================================ # Development This doc explains the development workflow so you can get started [contributing](CONTRIBUTING.md) to Kaniko! ## Getting started First you will need to setup your GitHub account and create a fork: 1. Create [a GitHub account](https://github.com/join) 1. Setup [GitHub access via SSH](https://help.github.com/articles/connecting-to-github-with-ssh/) 1. [Create and checkout a repo fork](#checkout-your-fork) Once you have those, you can iterate on kaniko: 1. [Run your instance of kaniko](README.md#running-kaniko) 1. [Verifying kaniko builds](#verifying-kaniko-builds) 1. [Run kaniko tests](#testing-kaniko) When you're ready, you can [create a PR](#creating-a-pr)! ## Checkout your fork The Go tools require that you clone the repository to the `src/github.com/GoogleContainerTools/kaniko` directory in your [`GOPATH`](https://go.dev/wiki/SettingGOPATH). To check out this repository: 1. Create your own [fork of this repo](https://help.github.com/articles/fork-a-repo/) 2. Clone it to your machine: ```shell mkdir -p ${GOPATH}/src/github.com/GoogleContainerTools cd ${GOPATH}/src/github.com/GoogleContainerTools git clone git@github.com:${YOUR_GITHUB_USERNAME}/kaniko.git cd kaniko git remote add upstream git@github.com:GoogleContainerTools/kaniko.git git remote set-url --push upstream no_push ``` _Adding the `upstream` remote sets you up nicely for regularly [syncing your fork](https://help.github.com/articles/syncing-a-fork/)._ ## Verifying kaniko builds Images built with kaniko should be no different from images built elsewhere. While you iterate on kaniko, you can verify images built with kaniko by: 1. Build the image using another system, such as `docker build` 2. Use [`container-diff`](https://github.com/GoogleContainerTools/container-diff) to diff the images ## Testing kaniko kaniko has both [unit tests](#unit-tests) and [integration tests](#integration-tests). Please note that the tests require a Linux machine - use Vagrant to quickly set up the test environment needed if you work with macOS or Windows. ### Unit Tests The unit tests live with the code they test and can be run with: ```shell make test ``` _These tests will not run correctly unless you have [checked out your fork into your `$GOPATH`](#checkout-your-fork)._ ### Lint Checks The helper script to install and run lint is placed here at the root of project. ```shell ./hack/linter.sh ``` To fix any `gofmt` issues, you can simply run `gofmt` with `-w` flag like this ```shell find . -name "*.go" | grep -v vendor/ | xargs gofmt -l -s -w ``` ### Integration tests Currently the integration tests that live in [`integration`](./integration) can be run against your own gcloud space or a local registry. These tests will be kicked off by [reviewers](#reviews) for submitted PRs using GitHub Actions. In either case, you will need the following tools: * [`container-diff`](https://github.com/GoogleContainerTools/container-diff#installation) #### GCloud To run integration tests with your GCloud Storage, you will also need the following tools: * [`gcloud`](https://cloud.google.com/sdk/install) * [`gsutil`](https://cloud.google.com/storage/docs/gsutil_install) * A bucket in [GCS](https://cloud.google.com/storage/) which you have write access to via the user currently logged into `gcloud` * An image repo which you have write access to via the user currently logged into `gcloud` * A docker account and a `~/.docker/config.json` with login credentials if you run into rate limiting problems during tests. Once this step done, you must override the project using environment variables: * `GCS_BUCKET` - The name of your GCS bucket * `IMAGE_REPO` - The path to your docker image repo This can be done as follows: ```shell export GCS_BUCKET="gs://" export IMAGE_REPO="gcr.io/somerepo" ``` Login for both user and application credentials ```shell gcloud auth login gcloud auth application-default login ``` Then you can launch integration tests as follows: ```shell make integration-test ``` You can also run tests with `go test`, for example to run tests individually: ```shell go test ./integration -v --bucket $GCS_BUCKET --repo $IMAGE_REPO -run TestLayers/test_layer_Dockerfile_test_copy_bucket ``` These tests will be kicked off by [reviewers](#reviews) for submitted PRs by the kokoro task. #### Local integration tests To run integration tests locally against a local registry and gcs bucket, set the LOCAL environment variable ```shell LOCAL=1 make integration-test ``` #### Running integration tests for a specific dockerfile In order to test only specific dockerfiles during local integration testing, you can specify a pattern to match against inside the integration/dockerfiles directory. ```shell DOCKERFILE_PATTERN="Dockerfile_test_add*" make integration-test-run ``` This will only run dockerfiles that match the pattern `Dockerfile_test_add*` ### Benchmarking The goal is for Kaniko to be at least as fast at building Dockerfiles as Docker is, and to that end, we've built in benchmarking to check the speed of not only each full run, but also how long each step of each run takes. To turn on benchmarking, just set the `BENCHMARK_FILE` environment variable, and kaniko will output all the benchmark info of each run to that file location. ```shell docker run -v $(pwd):/workspace -v ~/.config:/root/.config \ -e BENCHMARK_FILE=/workspace/benchmark_file \ gcr.io/kaniko-project/executor:latest \ --dockerfile= --context=/workspace \ --destination=gcr.io/my-repo/my-image ``` Additionally, the integration tests can output benchmarking information to a `benchmarks` directory under the `integration` directory if the `BENCHMARK` environment variable is set to `true.` ```shell BENCHMARK=true go test -v --bucket $GCS_BUCKET --repo $IMAGE_REPO ``` #### Benchmarking your GCB runs If you are GCB builds are slow, you can check which phases in kaniko are bottlenecks or taking more time. To do this, add "BENCHMARK_ENV" to your cloudbuild.yaml like this. ```shell script steps: - name: 'gcr.io/kaniko-project/executor:latest' args: - --build-arg=NUM=${_COUNT} - --no-push - --snapshot-mode=redo env: - 'BENCHMARK_FILE=gs://$PROJECT_ID/gcb/benchmark_file' ``` You can download the file `gs://$PROJECT_ID/gcb/benchmark_file` using `gsutil cp` command. ## Creating a PR When you have changes you would like to propose to kaniko, you will need to: 1. Ensure the commit message(s) describe what issue you are fixing and how you are fixing it (include references to [issue numbers](https://help.github.com/articles/closing-issues-using-keywords/) if appropriate) 1. [Create a pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) ### Reviews Each PR must be reviewed by a maintainer. This maintainer will add the `kokoro:run` label to a PR to kick of [the integration tests](#integration-tests), which must pass for the PR to be submitted. ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: MAINTAINERS ================================================ ================================================ FILE: Makefile ================================================ # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Bump these on release VERSION_MAJOR ?= 1 VERSION_MINOR ?= 24 VERSION_BUILD ?= 0 VERSION ?= v$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD) VERSION_PACKAGE = $(REPOPATH/pkg/version) SHELL := /bin/bash GOOS ?= $(shell go env GOOS) GOARCH ?= $(shell go env GOARCH) ORG := github.com/GoogleContainerTools PROJECT := kaniko REGISTRY?=gcr.io/kaniko-project REPOPATH ?= $(ORG)/$(PROJECT) VERSION_PACKAGE = $(REPOPATH)/pkg/version GO_FILES := $(shell find . -type f -name '*.go' -not -path "./vendor/*") GO_LDFLAGS := '-extldflags "-static" GO_LDFLAGS += -X $(VERSION_PACKAGE).version=$(VERSION) GO_LDFLAGS += -w -s # Drop debugging symbols. GO_LDFLAGS += ' EXECUTOR_PACKAGE = $(REPOPATH)/cmd/executor WARMER_PACKAGE = $(REPOPATH)/cmd/warmer KANIKO_PROJECT = $(REPOPATH)/kaniko BUILD_ARG ?= # Force using Go Modules and always read the dependencies from # the `vendor` folder. export GO111MODULE = on export GOFLAGS = -mod=vendor out/executor: $(GO_FILES) GOARCH=$(GOARCH) GOOS=$(GOOS) CGO_ENABLED=0 go build -ldflags $(GO_LDFLAGS) -o $@ $(EXECUTOR_PACKAGE) out/warmer: $(GO_FILES) GOARCH=$(GOARCH) GOOS=$(GOOS) CGO_ENABLED=0 go build -ldflags $(GO_LDFLAGS) -o $@ $(WARMER_PACKAGE) .PHONY: install-container-diff install-container-diff: @ curl -LO https://github.com/GoogleContainerTools/container-diff/releases/download/v0.17.0/container-diff-$(GOOS)-amd64 && \ chmod +x container-diff-$(GOOS)-amd64 && sudo mv container-diff-$(GOOS)-amd64 /usr/local/bin/container-diff .PHONY: k3s-setup k3s-setup: @ ./scripts/k3s-setup.sh .PHONY: test test: out/executor @ ./scripts/test.sh test-with-coverage: test go tool cover -html=out/coverage.out .PHONY: integration-test integration-test: @ ./scripts/integration-test.sh .PHONY: integration-test-run integration-test-run: @ ./scripts/integration-test.sh -run "TestRun" .PHONY: integration-test-layers integration-test-layers: @ ./scripts/integration-test.sh -run "TestLayers" .PHONY: integration-test-k8s integration-test-k8s: @ ./scripts/integration-test.sh -run "TestK8s" .PHONY: integration-test-misc integration-test-misc: $(eval RUN_ARG=$(shell ./scripts/misc-integration-test.sh)) @ ./scripts/integration-test.sh -run "$(RUN_ARG)" .PHONY: k8s-executor-build-push k8s-executor-build-push: DOCKER_BUILDKIT=1 docker build ${BUILD_ARG} --build-arg=GOARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/executor:latest -f deploy/Dockerfile --target kaniko-executor . docker push $(REGISTRY)/executor:latest .PHONY: images images: DOCKER_BUILDKIT=1 images: docker build ${BUILD_ARG} --build-arg=TARGETARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/executor:latest -f deploy/Dockerfile --target kaniko-executor . docker build ${BUILD_ARG} --build-arg=TARGETARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/executor:debug -f deploy/Dockerfile --target kaniko-debug . docker build ${BUILD_ARG} --build-arg=TARGETARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/executor:slim -f deploy/Dockerfile --target kaniko-slim . docker build ${BUILD_ARG} --build-arg=TARGETARCH=$(GOARCH) --build-arg=TARGETOS=linux -t $(REGISTRY)/warmer:latest -f deploy/Dockerfile --target kaniko-warmer . .PHONY: push push: docker push $(REGISTRY)/executor:latest docker push $(REGISTRY)/executor:debug docker push $(REGISTRY)/executor:slim docker push $(REGISTRY)/warmer:latest ================================================ FILE: README.md ================================================ # 🧊 This project is archived and no longer developed or maintained. 🧊 The code remains available for historic purposes. The README as of the archival date remains unchanged below for historic purposes. ----- # kaniko - Build Images In Kubernetes ## 🚨NOTE: kaniko is not an officially supported Google product🚨 [![Unit tests](https://github.com/GoogleContainerTools/kaniko/actions/workflows/unit-tests.yaml/badge.svg)](https://github.com/GoogleContainerTools/kaniko/actions/workflows/unit-tests.yaml) [![Integration tests](https://github.com/GoogleContainerTools/kaniko/actions/workflows/integration-tests.yaml/badge.svg)](https://github.com/GoogleContainerTools/kaniko/actions/workflows/integration-tests.yaml) [![Build images](https://github.com/GoogleContainerTools/kaniko/actions/workflows/images.yaml/badge.svg)](https://github.com/GoogleContainerTools/kaniko/actions/workflows/images.yaml) [![Go Report Card](https://goreportcard.com/badge/github.com/GoogleContainerTools/kaniko)](https://goreportcard.com/report/github.com/GoogleContainerTools/kaniko) ![kaniko logo](logo/Kaniko-Logo.png) kaniko is a tool to build container images from a Dockerfile, inside a container or Kubernetes cluster. kaniko doesn't depend on a Docker daemon and executes each command within a Dockerfile completely in userspace. This enables building container images in environments that can't easily or securely run a Docker daemon, such as a standard Kubernetes cluster. kaniko is meant to be run as an image: `gcr.io/kaniko-project/executor`. We do **not** recommend running the kaniko executor binary in another image, as it might not work as you expect - see [Known Issues](#known-issues). We'd love to hear from you! Join us on [#kaniko Kubernetes Slack](https://kubernetes.slack.com/messages/CQDCHGX7Y/) :mega: **Please fill out our [quick 5-question survey](https://forms.gle/HhZGEM33x4FUz9Qa6)** so that we can learn how satisfied you are with kaniko, and what improvements we should make. Thank you! :dancers: _If you are interested in contributing to kaniko, see [DEVELOPMENT.md](DEVELOPMENT.md) and [CONTRIBUTING.md](CONTRIBUTING.md)._ **Table of Contents** _generated with [DocToc](https://github.com/thlorenz/doctoc)_ - [kaniko - Build Images In Kubernetes](#kaniko---build-images-in-kubernetes) - [🚨NOTE: kaniko is not an officially supported Google product🚨](#note-kaniko-is-not-an-officially-supported-google-product) - [Community](#community) - [How does kaniko work?](#how-does-kaniko-work) - [Known Issues](#known-issues) - [Demo](#demo) - [Tutorial](#tutorial) - [Using kaniko](#using-kaniko) - [kaniko Build Contexts](#kaniko-build-contexts) - [Using Azure Blob Storage](#using-azure-blob-storage) - [Using Private Git Repository](#using-private-git-repository) - [Using Standard Input](#using-standard-input) - [Running kaniko](#running-kaniko) - [Running kaniko in a Kubernetes cluster](#running-kaniko-in-a-kubernetes-cluster) - [Kubernetes secret](#kubernetes-secret) - [Running kaniko in gVisor](#running-kaniko-in-gvisor) - [Running kaniko in Google Cloud Build](#running-kaniko-in-google-cloud-build) - [Running kaniko in Docker](#running-kaniko-in-docker) - [Caching](#caching) - [Caching Layers](#caching-layers) - [Caching Base Images](#caching-base-images) - [Pushing to Different Registries](#pushing-to-different-registries) - [Pushing to Docker Hub](#pushing-to-docker-hub) - [Pushing to Google GCR](#pushing-to-google-gcr) - [Pushing to GCR using Workload Identity](#pushing-to-gcr-using-workload-identity) - [Pushing to Amazon ECR](#pushing-to-amazon-ecr) - [Pushing to Azure Container Registry](#pushing-to-azure-container-registry) - [Pushing to JFrog Container Registry or to JFrog Artifactory](#pushing-to-jfrog-container-registry-or-to-jfrog-artifactory) - [Additional Flags](#additional-flags) - [Flag `--build-arg`](#flag---build-arg) - [Flag `--cache`](#flag---cache) - [Flag `--cache-dir`](#flag---cache-dir) - [Flag `--cache-repo`](#flag---cache-repo) - [Flag `--cache-copy-layers`](#flag---cache-copy-layers) - [Flag `--cache-run-layers`](#flag---cache-run-layers) - [Flag `--cache-ttl duration`](#flag---cache-ttl-duration) - [Flag `--cleanup`](#flag---cleanup) - [Flag `--compressed-caching`](#flag---compressed-caching) - [Flag `--context-sub-path`](#flag---context-sub-path) - [Flag `--custom-platform`](#flag---custom-platform) - [Flag `--digest-file`](#flag---digest-file) - [Flag `--dockerfile`](#flag---dockerfile) - [Flag `--force`](#flag---force) - [Flag `--git`](#flag---git) - [Flag `--image-name-with-digest-file`](#flag---image-name-with-digest-file) - [Flag `--image-name-tag-with-digest-file`](#flag---image-name-tag-with-digest-file) - [Flag `--insecure`](#flag---insecure) - [Flag `--insecure-pull`](#flag---insecure-pull) - [Flag `--insecure-registry`](#flag---insecure-registry) - [Flag `--label`](#flag---label) - [Flag `--log-format`](#flag---log-format) - [Flag `--log-timestamp`](#flag---log-timestamp) - [Flag `--no-push`](#flag---no-push) - [Flag `--no-push-cache`](#flag---no-push-cache) - [Flag `--oci-layout-path`](#flag---oci-layout-path) - [Flag `--push-retry`](#flag---push-retry) - [Flag `--registry-certificate`](#flag---registry-certificate) - [Flag `--registry-client-cert`](#flag---registry-client-cert) - [Flag `--registry-map`](#flag---registry-map) - [Flag `--registry-mirror`](#flag---registry-mirror) - [Flag `--skip-default-registry-fallback`](#flag---skip-default-registry-fallback) - [Flag `--reproducible`](#flag---reproducible) - [Flag `--single-snapshot`](#flag---single-snapshot) - [Flag `--skip-push-permission-check`](#flag---skip-push-permission-check) - [Flag `--skip-tls-verify`](#flag---skip-tls-verify) - [Flag `--skip-tls-verify-pull`](#flag---skip-tls-verify-pull) - [Flag `--skip-tls-verify-registry`](#flag---skip-tls-verify-registry) - [Flag `--skip-unused-stages`](#flag---skip-unused-stages) - [Flag `--snapshot-mode`](#flag---snapshot-mode) - [Flag `--tar-path`](#flag---tar-path) - [Flag `--target`](#flag---target) - [Flag `--use-new-run`](#flag---use-new-run) - [Flag `--verbosity`](#flag---verbosity) - [Flag `--ignore-var-run`](#flag---ignore-var-run) - [Flag `--ignore-path`](#flag---ignore-path) - [Flag `--image-fs-extract-retry`](#flag---image-fs-extract-retry) - [Flag `--image-download-retry`](#flag---image-download-retry) - [Debug Image](#debug-image) - [Security](#security) - [Verifying Signed Kaniko Images](#verifying-signed-kaniko-images) - [Kaniko Builds - Profiling](#kaniko-builds---profiling) - [Creating Multi-arch Container Manifests Using Kaniko and Manifest-tool](#creating-multi-arch-container-manifests-using-kaniko-and-manifest-tool) - [General Workflow](#general-workflow) - [Limitations and Pitfalls](#limitations-and-pitfalls) - [Example CI Pipeline (GitLab)](#example-ci-pipeline-gitlab) - [Building the Separate Container Images](#building-the-separate-container-images) - [Merging the Container Manifests](#merging-the-container-manifests) - [On the Note of Adding Versioned Tags](#on-the-note-of-adding-versioned-tags) - [Comparison with Other Tools](#comparison-with-other-tools) - [Community](#community-1) - [Limitations](#limitations) - [mtime and snapshotting](#mtime-and-snapshotting) - [References](#references) ## Community We'd love to hear from you! Join [#kaniko on Kubernetes Slack](https://kubernetes.slack.com/messages/CQDCHGX7Y/) ## How does kaniko work? The kaniko executor image is responsible for building an image from a Dockerfile and pushing it to a registry. Within the executor image, we extract the filesystem of the base image (the FROM image in the Dockerfile). We then execute the commands in the Dockerfile, snapshotting the filesystem in userspace after each one. After each command, we append a layer of changed files to the base image (if there are any) and update image metadata. ## Known Issues - kaniko does not support building Windows containers. - Running kaniko in any Docker image other than the official kaniko image is not supported due to implementation details. - This includes copying the kaniko executables from the official image into another image (e.g. a Jenkins CI agent). - In particular, it cannot use chroot or bind-mount because its container must not require privilege, so it unpacks directly into its own container root and may overwrite anything already there. - kaniko does not support the v1 Registry API ([Registry v1 API Deprecation](https://www.docker.com/blog/registry-v1-api-deprecation/)) ## Demo ![Demo](/docs/demo.gif) ## Tutorial For a detailed example of kaniko with local storage, please refer to a [getting started tutorial](./docs/tutorial.md). Please see [References](#References) for more docs & video tutorials ## Using kaniko To use kaniko to build and push an image for you, you will need: 1. A [build context](#kaniko-build-contexts), aka something to build 2. A [running instance of kaniko](#running-kaniko) ### kaniko Build Contexts kaniko's build context is very similar to the build context you would send your Docker daemon for an image build; it represents a directory containing a Dockerfile which kaniko will use to build your image. For example, a `COPY` command in your Dockerfile should refer to a file in the build context. You will need to store your build context in a place that kaniko can access. Right now, kaniko supports these storage solutions: - GCS Bucket - S3 Bucket - Azure Blob Storage - Local Directory - Local Tar - Standard Input - Git Repository _Note about Local Directory: this option refers to a directory within the kaniko container. If you wish to use this option, you will need to mount in your build context into the container as a directory._ _Note about Local Tar: this option refers to a tar gz file within the kaniko container. If you wish to use this option, you will need to mount in your build context into the container as a file._ _Note about Standard Input: the only Standard Input allowed by kaniko is in `.tar.gz` format._ If using a GCS or S3 bucket, you will first need to create a compressed tar of your build context and upload it to your bucket. Once running, kaniko will then download and unpack the compressed tar of the build context before starting the image build. To create a compressed tar, you can run: ```shell tar -C -zcvf context.tar.gz . ``` Then, copy over the compressed tar into your bucket. For example, we can copy over the compressed tar to a GCS bucket with gsutil: ```shell gsutil cp context.tar.gz gs:// ``` When running kaniko, use the `--context` flag with the appropriate prefix to specify the location of your build context: | Source | Prefix | Example | | ------------------ | --------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | Local Directory | dir://[path to a directory in the kaniko container] | `dir:///workspace` | | Local Tar Gz | tar://[path to a .tar.gz in the kaniko container] | `tar:///path/to/context.tar.gz` | | Standard Input | tar://[stdin] | `tar://stdin` | | GCS Bucket | gs://[bucket name]/[path to .tar.gz] | `gs://kaniko-bucket/path/to/context.tar.gz` | | S3 Bucket | s3://[bucket name]/[path to .tar.gz] | `s3://kaniko-bucket/path/to/context.tar.gz` | | Azure Blob Storage | https://[account].[azureblobhostsuffix]/[container]/[path to .tar.gz] | `https://myaccount.blob.core.windows.net/container/path/to/context.tar.gz` | | Git Repository | git://[repository url][#reference][#commit-id] | `git://github.com/acme/myproject.git#refs/heads/mybranch#` | If you don't specify a prefix, kaniko will assume a local directory. For example, to use a GCS bucket called `kaniko-bucket`, you would pass in `--context=gs://kaniko-bucket/path/to/context.tar.gz`. ### Using Azure Blob Storage If you are using Azure Blob Storage for context file, you will need to pass [Azure Storage Account Access Key](https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string?toc=%2fazure%2fstorage%2fblobs%2ftoc.json) as an environment variable named `AZURE_STORAGE_ACCESS_KEY` through Kubernetes Secrets ### Using Private Git Repository You can use `Personal Access Tokens` for Build Contexts from Private Repositories from [GitHub](https://blog.github.com/2012-09-21-easier-builds-and-deployments-using-git-over-https-and-oauth/). You can either pass this in as part of the git URL (e.g., `git://TOKEN@github.com/acme/myproject.git#refs/heads/mybranch`) or using the environment variable `GIT_TOKEN`. You can also pass `GIT_USERNAME` and `GIT_PASSWORD` (password being the token) if you want to be explicit about the username. ### Using Standard Input If running kaniko and using Standard Input build context, you will need to add the docker or kubernetes `-i, --interactive` flag. Once running, kaniko will then get the data from `STDIN` and create the build context as a compressed tar. It will then unpack the compressed tar of the build context before starting the image build. If no data is piped during the interactive run, you will need to send the EOF signal by yourself by pressing `Ctrl+D`. Complete example of how to interactively run kaniko with `.tar.gz` Standard Input data, using docker: ```shell echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | tar -cf - Dockerfile | gzip -9 | docker run \ --interactive -v $(pwd):/workspace gcr.io/kaniko-project/executor:latest \ --context tar://stdin \ --destination= ``` Complete example of how to interactively run kaniko with `.tar.gz` Standard Input data, using Kubernetes command line with a temporary container and completely dockerless: ```shell echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | tar -cf - Dockerfile | gzip -9 | kubectl run kaniko \ --rm --stdin=true \ --image=gcr.io/kaniko-project/executor:latest --restart=Never \ --overrides='{ "apiVersion": "v1", "spec": { "containers": [ { "name": "kaniko", "image": "gcr.io/kaniko-project/executor:latest", "stdin": true, "stdinOnce": true, "args": [ "--dockerfile=Dockerfile", "--context=tar://stdin", "--destination=gcr.io/my-repo/my-image" ], "volumeMounts": [ { "name": "cabundle", "mountPath": "/kaniko/ssl/certs/" }, { "name": "docker-config", "mountPath": "/kaniko/.docker/" } ] } ], "volumes": [ { "name": "cabundle", "configMap": { "name": "cabundle" } }, { "name": "docker-config", "configMap": { "name": "docker-config" } } ] } }' ``` ### Running kaniko There are several different ways to deploy and run kaniko: - [In a Kubernetes cluster](#running-kaniko-in-a-kubernetes-cluster) - [In gVisor](#running-kaniko-in-gvisor) - [In Google Cloud Build](#running-kaniko-in-google-cloud-build) - [In Docker](#running-kaniko-in-docker) #### Running kaniko in a Kubernetes cluster Requirements: - Standard Kubernetes cluster (e.g. using [GKE](https://cloud.google.com/kubernetes-engine/)) - [Kubernetes Secret](#kubernetes-secret) - A [build context](#kaniko-build-contexts) ##### Kubernetes secret To run kaniko in a Kubernetes cluster, you will need a standard running Kubernetes cluster and a Kubernetes secret, which contains the auth required to push the final image. To create a secret to authenticate to Google Cloud Registry, follow these steps: 1. Create a service account in the Google Cloud Console project you want to push the final image to with `Storage Admin` permissions. 2. Download a JSON key for this service account 3. Rename the key to `kaniko-secret.json` 4. To create the secret, run: ```shell kubectl create secret generic kaniko-secret --from-file= ``` _Note: If using a GCS bucket in the same GCP project as a build context, this service account should now also have permissions to read from that bucket._ The Kubernetes Pod spec should look similar to this, with the args parameters filled in: ```yaml apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest args: - "--dockerfile=" - "--context=gs:///" - "--destination=" volumeMounts: - name: kaniko-secret mountPath: /secret env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /secret/kaniko-secret.json restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: kaniko-secret ``` This example pulls the build context from a GCS bucket. To use a local directory build context, you could consider using configMaps to mount in small build contexts. #### Running kaniko in gVisor Running kaniko in [gVisor](https://github.com/google/gvisor) provides an additional security boundary. You will need to add the `--force` flag to run kaniko in gVisor, since currently there isn't a way to determine whether or not a container is running in gVisor. ```shell docker run --runtime=runsc -v $(pwd):/workspace -v ~/.config:/root/.config \ gcr.io/kaniko-project/executor:latest \ --dockerfile= --context=/workspace \ --destination=gcr.io/my-repo/my-image --force ``` We pass in `--runtime=runsc` to use gVisor. This example mounts the current directory to `/workspace` for the build context and the `~/.config` directory for GCR credentials. #### Running kaniko in Google Cloud Build Requirements: - A [build context](#kaniko-build-contexts) To run kaniko in GCB, add it to your build config as a build step: ```yaml steps: - name: gcr.io/kaniko-project/executor:latest args: [ "--dockerfile=", "--context=dir://", "--destination=", ] ``` kaniko will build and push the final image in this build step. #### Running kaniko in Docker Requirements: - [Docker](https://docs.docker.com/install/) We can run the kaniko executor image locally in a Docker daemon to build and push an image from a Dockerfile. For example, when using gcloud and GCR you could run kaniko as follows: ```shell docker run \ -v "$HOME"/.config/gcloud:/root/.config/gcloud \ -v /path/to/context:/workspace \ gcr.io/kaniko-project/executor:latest \ --dockerfile /workspace/Dockerfile \ --destination "gcr.io/$PROJECT_ID/$IMAGE_NAME:$TAG" \ --context dir:///workspace/ ``` There is also a utility script [`run_in_docker.sh`](./run_in_docker.sh) that can be used as follows: ```shell ./run_in_docker.sh ``` _NOTE: `run_in_docker.sh` expects a path to a Dockerfile relative to the absolute path of the build context._ An example run, specifying the Dockerfile in the container directory `/workspace`, the build context in the local directory `/home/user/kaniko-project`, and a Google Container Registry as a remote image destination: ```shell ./run_in_docker.sh /workspace/Dockerfile /home/user/kaniko-project gcr.io/$PROJECT_ID/$TAG ``` ### Caching #### Caching Layers kaniko can cache layers created by `RUN`(configured by flag `--cache-run-layers`) and `COPY` (configured by flag `--cache-copy-layers`) commands in a remote repository. Before executing a command, kaniko checks the cache for the layer. If it exists, kaniko will pull and extract the cached layer instead of executing the command. If not, kaniko will execute the command and then push the newly created layer to the cache. Note that kaniko cannot read layers from the cache after a cache miss: once a layer has not been found in the cache, all subsequent layers are built locally without consulting the cache. Users can opt into caching by setting the `--cache=true` flag. A remote repository for storing cached layers can be provided via the `--cache-repo` flag. If this flag isn't provided, a cached repo will be inferred from the `--destination` provided. #### Caching Base Images kaniko can cache images in a local directory that can be volume mounted into the kaniko pod. To do so, the cache must first be populated, as it is read-only. We provide a kaniko cache warming image at `gcr.io/kaniko-project/warmer`: ```shell docker run -v $(pwd):/workspace gcr.io/kaniko-project/warmer:latest --cache-dir=/workspace/cache --image= --image= docker run -v $(pwd):/workspace gcr.io/kaniko-project/warmer:latest --cache-dir=/workspace/cache --dockerfile= docker run -v $(pwd):/workspace gcr.io/kaniko-project/warmer:latest --cache-dir=/workspace/cache --dockerfile= --build-arg version=1.19 ``` `--image` can be specified for any number of desired images. `--dockerfile` can be specified for the path of dockerfile for cache.These command will combined to cache those images by digest in a local directory named `cache`. Once the cache is populated, caching is opted into with the same `--cache=true` flag as above. The location of the local cache is provided via the `--cache-dir` flag, defaulting to `/cache` as with the cache warmer. See the `examples` directory for how to use with kubernetes clusters and persistent cache volumes. ### Pushing to Different Registries kaniko uses Docker credential helpers to push images to a registry. kaniko comes with support for GCR, Docker `config.json` and Amazon ECR, but configuring another credential helper should allow pushing to a different registry. #### Pushing to Docker Hub Get your docker registry user and password encoded in base64 echo -n USER:PASSWORD | base64 Create a `config.json` file with your Docker registry url and the previous generated base64 string **Note:** Please use v1 endpoint. See #1209 for more details ```json { "auths": { "https://index.docker.io/v1/": { "auth": "xxxxxxxxxxxxxxx" } } } ``` Run kaniko with the `config.json` inside `/kaniko/.docker/config.json` ```shell docker run -ti --rm -v `pwd`:/workspace -v `pwd`/config.json:/kaniko/.docker/config.json:ro gcr.io/kaniko-project/executor:latest --dockerfile=Dockerfile --destination=yourimagename ``` #### Pushing to Google GCR To create a credentials to authenticate to Google Cloud Registry, follow these steps: 1. Create a [service account](https://console.cloud.google.com/iam-admin/serviceaccounts) or in the Google Cloud Console project you want to push the final image to with `Storage Admin` permissions. 2. Download a JSON key for this service account 3. (optional) Rename the key to `kaniko-secret.json`, if you don't rename, you have to change the name used the command(in the volume part) 4. Run the container adding the path in GOOGLE_APPLICATION_CREDENTIALS env var ```shell docker run -ti --rm -e GOOGLE_APPLICATION_CREDENTIALS=/kaniko/config.json \ -v `pwd`:/workspace -v `pwd`/kaniko-secret.json:/kaniko/config.json:ro gcr.io/kaniko-project/executor:latest \ --dockerfile=Dockerfile --destination=yourimagename ``` #### Pushing to GCR using Workload Identity If you have enabled Workload Identity on your GKE cluster then you can use the workload identity to push built images to GCR without adding a `GOOGLE_APPLICATION_CREDENTIALS` in your kaniko pod specification. Learn more on how to [enable](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#enable_on_cluster) and [migrate existing apps](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#migrate_applications_to) to workload identity. To authenticate using workload identity you need to run the kaniko pod using the Kubernetes Service Account (KSA) bound to Google Service Account (GSA) which has `Storage.Admin` permissions to push images to Google Container registry. Please follow the detailed steps [here](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#authenticating_to) to create a Kubernetes Service Account, Google Service Account and create an IAM policy binding between the two to allow the Kubernetes Service account to act as the Google service account. To grant the Google Service account the right permission to push to GCR, run the following GCR command ``` gcloud projects add-iam-policy-binding $PROJECT \ --member=serviceAccount:[gsa-name]@${PROJECT}.iam.gserviceaccount.com \ --role=roles/storage.objectAdmin ``` Please ensure, kaniko pod is running in the namespace and with a Kubernetes Service Account. #### Pushing to Amazon ECR The Amazon ECR [credential helper](https://github.com/awslabs/amazon-ecr-credential-helper) is built into the kaniko executor image. 1. Configure credentials 1. You can use instance roles when pushing to ECR from a EC2 instance or from EKS, by [configuring the instance role permissions](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_on_EKS.html) (the AWS managed policy `EC2InstanceProfileForImageBuilderECRContainerBuilds` provides broad permissions to upload ECR images and may be used as configuration baseline). Additionally, set `AWS_SDK_LOAD_CONFIG=true` as environment variable within the kaniko pod. If running on an EC2 instance with an instance profile, you may also need to set `AWS_EC2_METADATA_DISABLED=true` for kaniko to pick up the correct credentials. 2. Or you can create a Kubernetes secret for your `~/.aws/credentials` file so that credentials can be accessed within the cluster. To create the secret, run: `shell kubectl create secret generic aws-secret --from-file= ` The Kubernetes Pod spec should look similar to this, with the args parameters filled in. Note that `aws-secret` volume mount and volume are only needed when using AWS credentials from a secret, not when using instance roles. ```yaml apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest args: - "--dockerfile=" - "--context=s3:///" - "--destination=" volumeMounts: # when not using instance role - name: aws-secret mountPath: /root/.aws/ restartPolicy: Never volumes: # when not using instance role - name: aws-secret secret: secretName: aws-secret ``` #### Pushing to Azure Container Registry An ACR [credential helper](https://github.com/chrismellard/docker-credential-acr-env) is built into the kaniko executor image, which can be used to authenticate with well-known Azure environmental information. To configure credentials, you will need to do the following: 1. Update the `credStore` section of `config.json`: ```json { "credsStore": "acr" } ``` A downside of this approach is that ACR authentication will be used for all registries, which will fail if you also pull from DockerHub, GCR, etc. Thus, it is better to configure the credential tool only for your ACR registries by using `credHelpers` instead of `credsStore`: ```json { "credHelpers": { "mycr.azurecr.io": "acr-env" } } ``` You can mount in the new config as a configMap: ```shell kubectl create configmap docker-config --from-file= ``` 2. Configure credentials You can create a Kubernetes secret with environment variables required for Service Principal authentication and expose them to the builder container. ``` AZURE_CLIENT_ID= AZURE_CLIENT_SECRET= AZURE_TENANT_ID= ``` If the above are not set then authentication falls back to managed service identities and the MSI endpoint is attempted to be contacted which will work in various Azure contexts such as App Service and Azure Kubernetes Service where the MSI endpoint will authenticate the MSI context the service is running under. The Kubernetes Pod spec should look similar to this, with the args parameters filled in. Note that `azure-secret` secret is only needed when using Azure Service Principal credentials, not when using a managed service identity. ```yaml apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest args: - "--dockerfile=" - "--context=s3:///" - "--destination=mycr.azurecr.io/my-repository:my-tag" envFrom: # when authenticating with service principal - secretRef: name: azure-secret volumeMounts: - name: docker-config mountPath: /kaniko/.docker/ volumes: - name: docker-config configMap: name: docker-config restartPolicy: Never ``` #### Pushing to JFrog Container Registry or to JFrog Artifactory Kaniko can be used with both [JFrog Container Registry](https://www.jfrog.com/confluence/display/JFROG/JFrog+Container+Registry) and JFrog Artifactory. Get your JFrog Artifactory registry user and password encoded in base64 echo -n USER:PASSWORD | base64 Create a `config.json` file with your Artifactory Docker local registry URL and the previous generated base64 string ```json { "auths": { "artprod.company.com": { "auth": "xxxxxxxxxxxxxxx" } } } ``` For example, for Artifactory cloud users, the docker registry should be: `..io`. Run kaniko with the `config.json` inside `/kaniko/.docker/config.json` docker run -ti --rm -v `pwd`:/workspace -v `pwd`/config.json:/kaniko/.docker/config.json:ro gcr.io/kaniko-project/executor:latest --dockerfile=Dockerfile --destination=yourimagename After the image is uploaded, using the JFrog CLI, you can [collect](https://www.jfrog.com/confluence/display/CLI/CLI+for+JFrog+Artifactory#CLIforJFrogArtifactory-PushingDockerImagesUsingKaniko) and [publish](https://www.jfrog.com/confluence/display/CLI/CLI+for+JFrog+Artifactory#CLIforJFrogArtifactory-PublishingBuild-Info) the build information to Artifactory and trigger [build vulnerabilities scanning](https://www.jfrog.com/confluence/display/JFROG/Declarative+Pipeline+Syntax#DeclarativePipelineSyntax-ScanningBuildswithJFrogXray) using JFrog Xray. To collect and publish the image's build information using the Jenkins Artifactory plugin, see instructions for [scripted pipeline](https://www.jfrog.com/confluence/display/JFROG/Scripted+Pipeline+Syntax#ScriptedPipelineSyntax-UsingKaniko) and [declarative pipeline](https://www.jfrog.com/confluence/display/JFROG/Declarative+Pipeline+Syntax#DeclarativePipelineSyntax-UsingKaniko). ### Additional Flags #### Flag `--build-arg` This flag allows you to pass in ARG values at build time, similarly to Docker. You can set it multiple times for multiple arguments. Note that passing values that contain spaces is not natively supported - you need to ensure that the IFS is set to null before your executor command. You can set this by adding `export IFS=''` before your executor call. See the following example ```bash export IFS='' /kaniko/executor --build-arg "MY_VAR='value with spaces'" ... ``` #### Flag `--cache` Set this flag as `--cache=true` to opt into caching with kaniko. #### Flag `--cache-dir` Set this flag to specify a local directory cache for base images. Defaults to `/cache`. _This flag must be used in conjunction with the `--cache=true` flag._ #### Flag `--cache-repo` Set this flag to specify a remote repository that will be used to store cached layers. If this flag is not provided, a cache repo will be inferred from the `--destination` flag. If `--destination=gcr.io/kaniko-project/test`, then cached layers will be stored in `gcr.io/kaniko-project/test/cache`. _This flag must be used in conjunction with the `--cache=true` flag._ #### Flag `--cache-copy-layers` Set this flag to cache copy layers. #### Flag `--cache-run-layers` Set this flag to cache run layers (default=true). #### Flag `--cache-ttl duration` Cache timeout in hours. Defaults to two weeks. #### Flag `--cleanup` Set this flag to clean the filesystem at the end of the build. #### Flag `--compressed-caching` Set this to false in order to prevent tar compression for cached layers. This will increase the runtime of the build, but decrease the memory usage especially for large builds. Try to use `--compressed-caching=false` if your build fails with an out of memory error. Defaults to true. #### Flag `--context-sub-path` Set a sub path within the given `--context`. Its particularly useful when your context is, for example, a git repository, and you want to build one of its subfolders instead of the root folder. #### Flag `--custom-platform` Allows to build with another default platform than the host, similarly to docker build --platform xxx the value has to be on the form `--custom-platform=linux/arm`, with acceptable values listed here: [GOOS/GOARCH](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63). It's also possible specifying CPU variants adding it as a third parameter (like `--custom-platform=linux/arm/v5`). Currently CPU variants are only known to be used for the ARM architecture as listed here: [GOARM](https://go.dev/wiki/GoArm#supported-architectures) _The resulting images cannot provide any metadata about CPU variant due to a limitation of the OCI-image specification._ _This is not virtualization and cannot help to build an architecture not natively supported by the build host. This is used to build i386 on an amd64 Host for example, or arm32 on an arm64 host._ #### Flag `--digest-file` Set this flag to specify a file in the container. This file will receive the digest of a built image. This can be used to automatically track the exact image built by kaniko. For example, setting the flag to `--digest-file=/dev/termination-log` will write the digest to that file, which is picked up by Kubernetes automatically as the `{{.state.terminated.message}}` of the container. #### Flag `--dockerfile` Path to the dockerfile to be built. (default "Dockerfile") #### Flag `--force` Force building outside of a container #### Flag `--git` Branch to clone if build context is a git repository (default branch=,single-branch=false,recurse-submodules=false,insecure-skip-tls=false) #### Flag `--image-name-with-digest-file` Specify a file to save the image name w/ digest of the built image to. #### Flag `--image-name-tag-with-digest-file` Specify a file to save the image name w/ image tag and digest of the built image to. #### Flag `--insecure` Set this flag if you want to push images to a plain HTTP registry. It is supposed to be used for testing purposes only and should not be used in production! #### Flag `--insecure-pull` Set this flag if you want to pull images from a plain HTTP registry. It is supposed to be used for testing purposes only and should not be used in production! #### Flag `--insecure-registry` You can set `--insecure-registry ` to use plain HTTP requests when accessing the specified registry. It is supposed to be used for testing purposes only and should not be used in production! You can set it multiple times for multiple registries. #### Flag `--label` Set this flag as `--label key=value` to set some metadata to the final image. This is equivalent as using the `LABEL` within the Dockerfile. #### Flag `--log-format` Set this flag as `--log-format=` to set the log format. Defaults to `color`. #### Flag `--log-timestamp` Set this flag as `--log-timestamp=` to add timestamps to `` log format. Defaults to `false`. #### Flag `--no-push` Set this flag if you only want to build the image, without pushing to a registry. This can also be defined through `KANIKO_NO_PUSH` environment variable. NOTE: this will still push cache layers to the repo, to disable pushing cache layers use `--no-push-cache` #### Flag `--no-push-cache` Set this flag if you do not want to push cache layers to a registry. Can be used in addition to `--no-push` to push no layers to a registry. #### Flag `--oci-layout-path` Set this flag to specify a directory in the container where the OCI image layout of a built image will be placed. This can be used to automatically track the exact image built by kaniko. For example, to surface the image digest built in a [Tekton task](https://github.com/tektoncd/pipeline/blob/v0.6.0/docs/resources.md#surfacing-the-image-digest-built-in-a-task), this flag should be set to match the image resource `outputImageDir`. _Note: Depending on the built image, the media type of the image manifest might be either `application/vnd.oci.image.manifest.v1+json` or `application/vnd.docker.distribution.manifest.v2+json`._ #### Flag `--push-ignore-immutable-tag-errors` Set this boolean flag to `true` if you want the Kaniko process to exit with success when a push error related to tag immutability occurs. This is useful for example if you have parallel builds pushing the same tag and do not care which one actually succeeds. Defaults to `false`. #### Flag `--push-retry` Set this flag to the number of retries that should happen for the push of an image to a remote destination. Defaults to `0`. #### Flag `--registry-certificate` Set this flag to provide a certificate for TLS communication with a given registry. Expected format is `my.registry.url=/path/to/the/certificate.cert` #### Flag `--registry-client-cert` Set this flag to provide a certificate/key pair for mutual TLS (mTLS) communication with a given [registry that requires mTLS](https://docs.docker.com/engine/security/certificates/) for authentication. Expected format is `my.registry.url=/path/to/client/cert.crt,/path/to/client/key.key` #### Flag `--registry-map` Set this flag if you want to remap registries references. Usefull for air gap environement for example. You can use this flag more than once, if you want to set multiple mirrors for a given registry. You can mention several remap in a single flag too, separated by semi-colon. If an image is not found on the first mirror, Kaniko will try the next mirror(s), and at the end fallback on the original registry. Registry maps can also be defined through `KANIKO_REGISTRY_MAP` environment variable. Expected format is `original-registry=remapped-registry[;another-reg=another-remap[;...]]` for example. Note that you **can** specify a URL with scheme for this flag. Some valid options are: - `index.docker.io=mirror.gcr.io` - `gcr.io=127.0.0.1` - `quay.io=192.168.0.1:5000` - `index.docker.io=docker-io.mirrors.corp.net;index.docker.io=mirror.gcr.io;gcr.io=127.0.0.1` will try `docker-io.mirrors.corp.net` then `mirror.gcr.io` for `index.docker.io` and `127.0.0.1` for `gcr.io` - `docker.io=harbor.provate.io/theproject` #### Flag `--registry-mirror` Set this flag if you want to use a registry mirror instead of the default `index.docker.io`. You can use this flag more than once, if you want to set multiple mirrors. If an image is not found on the first mirror, Kaniko will try the next mirror(s), and at the end fallback on the default registry. Mirror can also be defined through `KANIKO_REGISTRY_MIRROR` environment variable. Expected format is `mirror.gcr.io` or `mirror.gcr.io/path` for example. Note that you **can** specify a URL with scheme for this flag. Some valid options are: - `mirror.gcr.io` - `127.0.0.1` - `192.168.0.1:5000` - `mycompany-docker-virtual.jfrog.io` - `harbor.provate.io/theproject` #### Flag `--skip-default-registry-fallback` Set this flag if you want the build process to fail if none of the mirrors listed in flag [registry-mirror](#flag---registry-mirror) can pull some image. This should be used with mirrors that implements a whitelist or some image restrictions. If [registry-mirror](#flag---registry-mirror) is not set or is empty, this flag is ignored. #### Flag `--reproducible` Set this flag to strip timestamps out of the built image and make it reproducible. #### Flag `--single-snapshot` This flag takes a single snapshot of the filesystem at the end of the build, so only one layer will be appended to the base image. #### Flag `--skip-push-permission-check` Set this flag to skip push permission check. This can be useful to delay Kanikos first request for delayed network-policies. #### Flag `--skip-tls-verify` Set this flag to skip TLS certificate validation when pushing to a registry. It is supposed to be used for testing purposes only and should not be used in production! #### Flag `--skip-tls-verify-pull` Set this flag to skip TLS certificate validation when pulling from a registry. It is supposed to be used for testing purposes only and should not be used in production! #### Flag `--skip-tls-verify-registry` You can set `--skip-tls-verify-registry ` to skip TLS certificate validation when accessing the specified registry. It is supposed to be used for testing purposes only and should not be used in production! You can set it multiple times for multiple registries. #### Flag `--skip-unused-stages` This flag builds only used stages if defined to `true`. Otherwise it builds by default all stages, even the unnecessary ones until it reaches the target stage / end of Dockerfile #### Flag `--snapshot-mode` You can set the `--snapshot-mode=` flag to set how kaniko will snapshot the filesystem. - If `--snapshot-mode=full` is set, the full file contents and metadata are considered when snapshotting. This is the least performant option, but also the most robust. - If `--snapshot-mode=redo` is set, the file mtime, size, mode, owner uid and gid will be considered when snapshotting. This may be up to 50% faster than "full", particularly if your project has a large number files. - If `--snapshot-mode=time` is set, only file mtime will be considered when snapshotting (see [limitations related to mtime](#mtime-and-snapshotting)). #### Flag `--tar-path` Set this flag as `--tar-path=` to save the image as a tarball at path. You need to set `--destination` as well (for example `--destination=image`). If you want to save the image as tarball only you also need to set `--no-push`. #### Flag `--target` Set this flag to indicate which build stage is the target build stage. #### Flag `--use-new-run` Using this flag enables an experimental implementation of the Run command which does not rely on snapshotting at all. In this approach, in order to compute which files were changed, a marker file is created before executing the Run command. Then the entire filesystem is walked (takes ~1-3 seconds for 700Kfiles) to find all files whose ModTime is greater than the marker file. With this new run command implementation, the total build time is reduced seeing performance improvements in the range of ~75%. This new run mode trades off accuracy/correctness in some cases (potential for missed files in a "snapshot") for improved performance by avoiding the full filesystem snapshots. #### Flag `--verbosity` Set this flag as `--verbosity=` to set the logging level. Defaults to `info`. #### Flag `--ignore-var-run` Ignore /var/run when taking image snapshot. Set it to false to preserve /var/run/\* in destination image. (Default true). #### Flag `--ignore-path` Set this flag as `--ignore-path=` to ignore path when taking an image snapshot. Set it multiple times for multiple ignore paths. #### Flag `--image-fs-extract-retry` Set this flag to the number of retries that should happen for the extracting an image filesystem. Defaults to `0`. #### Flag `--image-download-retry` Set this flag to the number of retries that should happen when downloading the remote image. Consecutive retries occur with exponential backoff and an initial delay of 1 second. Defaults to 0`. ### Debug Image The kaniko executor image is based on scratch and doesn't contain a shell. We provide `gcr.io/kaniko-project/executor:debug`, a debug image which consists of the kaniko executor image along with a busybox shell to enter. You can launch the debug image with a shell entrypoint: ```shell docker run -it --entrypoint=/busybox/sh gcr.io/kaniko-project/executor:debug ``` ## Security kaniko by itself **does not** make it safe to run untrusted builds inside your cluster, or anywhere else. kaniko relies on the security features of your container runtime to provide build security. The minimum permissions kaniko needs inside your container are governed by a few things: - The permissions required to unpack your base image into its container - The permissions required to execute the RUN commands inside the container If you have a minimal base image (SCRATCH or similar) that doesn't require permissions to unpack, and your Dockerfile doesn't execute any commands as the root user, you can run kaniko without root permissions. It should be noted that Docker runs as root by default, so you still require (in a sense) privileges to use kaniko. You may be able to achieve the same default seccomp profile that Docker uses in your Pod by setting [seccomp](https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp) profiles with annotations on a [PodSecurityPolicy](https://cloud.google.com/kubernetes-engine/docs/how-to/pod-security-policies) to create or update security policies on your cluster. ### Verifying Signed Kaniko Images kaniko images are signed for versions >= 1.5.2 using [cosign](https://github.com/sigstore/cosign)! To verify a public image, install [cosign](https://github.com/sigstore/cosign) and use the provided [public key](cosign.pub): ``` $ cat cosign.pub -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9aAfAcgAxIFMTstJUv8l/AMqnSKw P+vLu3NnnBDHCfREQpV/AJuiZ1UtgGpFpHlJLCNPmFkzQTnfyN5idzNl6Q== -----END PUBLIC KEY----- $ cosign verify -key ./cosign.pub gcr.io/kaniko-project/executor:latest ``` ## Kaniko Builds - Profiling If your builds are taking long, we recently added support to analyze kaniko function calls using [Slow Jam](https://github.com/google/slowjam) To start profiling, 1. Add an environment variable `STACKLOG_PATH` to your [pod definition](https://github.com/GoogleContainerTools/kaniko/blob/master/examples/pod-build-profile.yaml#L15). 2. If you are using the kaniko `debug` image, you can copy the file in the `pre-stop` container lifecycle hook. ## Creating Multi-arch Container Manifests Using Kaniko and Manifest-tool While Kaniko itself currently does not support creating multi-arch manifests (contributions welcome), one can use tools such as [manifest-tool](https://github.com/estesp/manifest-tool) to stitch multiple separate builds together into a single container manifest. ### General Workflow The general workflow for creating multi-arch manifests is as follows: 1. Build separate container images using Kaniko on build hosts matching your target architecture and tag them with the appropriate ARCH tag. 2. Push the separate images to your container registry. 3. Manifest-tool identifies the separate manifests in your container registry, according to a given template. 4. Manifest-tool pushes a combined manifest referencing the separate manifests. ![Workflow Multi-arch](docs/images/multi-arch.drawio.svg) ### Limitations and Pitfalls The following conditions must be met: 1. You need access to build-machines running the desired architectures (running Kaniko in an emulator, e.g. QEMU should also be possible but goes beyond the scope of this documentation). This is something to keep in mind when using SaaS build tools such as github.com or gitlab.com, of which at the time of writing neither supports any non-x86_64 SaaS runners ([GitHub](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources),[GitLab](https://docs.gitlab.com/ee/ci/runners/saas/linux_saas_runner.html#machine-types-available-for-private-projects-x86-64)), so be prepared to bring your own machines ([GitHub](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners),[GitLab](https://docs.gitlab.com/runner/register/). 2. Kaniko needs to be able to run on the desired architectures. At the time of writing, the official Kaniko container supports [linux/amd64, linux/arm64, linux/s390x and linux/ppc64le (not on \*-debug images)](https://github.com/GoogleContainerTools/kaniko/blob/main/.github/workflows/images.yaml). 3. The container registry of your choice must be OCIv1 or Docker v2.2 compatible. ### Example CI Pipeline (GitLab) It is up to you to find an automation tool that suits your needs best. We recommend using a modern CI/CD system such as GitHub workflows or GitLab CI. As we (the authors) happen to use GitLab CI, the following examples are tailored to this specific platform but the underlying principles should apply anywhere else and the examples are kept simple enough, so that you should be able to follow along, even without any previous experiences with this specific platform. When in doubt, visit the [gitlab-ci.yml reference page](https://docs.gitlab.com/ee/ci/yaml/index.html) for a comprehensive overview of the GitLab CI keywords. #### Building the Separate Container Images gitlab-ci.yml: ```yaml # define a job for building the containers build-container: stage: container-build # run parallel builds for the desired architectures parallel: matrix: - ARCH: amd64 - ARCH: arm64 tags: # run each build on a suitable, preconfigured runner (must match the target architecture) - runner-${ARCH} image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] script: # build the container image for the current arch using kaniko - >- /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" # push the image to the GitLab container registry, add the current arch as tag. --destination "${CI_REGISTRY_IMAGE}:${ARCH}" ``` #### Merging the Container Manifests gitlab-ci.yml: ```yaml # define a job for creating and pushing a merged manifest merge-manifests: stage: container-build # all containers must be build before merging them # alternatively the job may be configured to run in a later stage needs: - job: container-build artifacts: false tags: # may run on any architecture supported by manifest-tool image - runner-xyz image: name: mplatform/manifest-tool:alpine entrypoint: [""] script: - >- manifest-tool # authorize against your container registry --username=${CI_REGISTRY_USER} --password=${CI_REGISTRY_PASSWORD} push from-args # define the architectures you want to merge --platforms linux/amd64,linux/arm64 # "ARCH" will be automatically replaced by manifest-tool # with the appropriate arch from the platform definitions --template ${CI_REGISTRY_IMAGE}:ARCH # The name of the final, combined image which will be pushed to your registry --target ${CI_REGISTRY_IMAGE} ``` #### On the Note of Adding Versioned Tags For simplicity's sake we deliberately refrained from using versioned tagged images (all builds will be tagged as "latest") in the previous examples, as we feel like this adds to much platform and workflow specific code. Nethertheless, for anyone interested in how we handle (dynamic) versioning in GitLab, here is a short rundown: - If you are only interested in building tagged releases, you can simply use the [GitLab predefined](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) `CI_COMMIT_TAG` variable when running a tag pipeline. - When you (like us) want to additionally build container images outside of releases, things get a bit messier. In our case, we added a additional job which runs before the build and merge jobs (don't forget to extend the `needs` section of the build and merge jobs accordingly), which will set the tag to `latest` when running on the default branch, to the commit hash when run on other branches and to the release tag when run on a tag pipeline. gitlab-ci.yml: ```yaml container-get-tag: stage: pre-container-build-stage tags: - runner-xyz image: busybox script: # All other branches are tagged with the currently built commit SHA hash - | # If pipeline runs on the default branch: Set tag to "latest" if test "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH"; then tag="latest" # If pipeline is a tag pipeline, set tag to the git commit tag elif test -n "$CI_COMMIT_TAG"; then tag="$CI_COMMIT_TAG" # Else set the tag to the git commit sha else tag="$CI_COMMIT_SHA" fi - echo "tag=$tag" > build.env # parse tag to the build and merge jobs. # See: https://docs.gitlab.com/ee/ci/variables/#pass-an-environment-variable-to-another-job artifacts: reports: dotenv: build.env ``` ## Comparison with Other Tools Similar tools include: - [BuildKit](https://github.com/moby/buildkit) - [img](https://github.com/genuinetools/img) - [orca-build](https://github.com/cyphar/orca-build) - [umoci](https://github.com/openSUSE/umoci) - [buildah](https://github.com/containers/buildah) - [FTL](https://github.com/GoogleCloudPlatform/runtimes-common/tree/master/ftl) - [Bazel rules_docker](https://github.com/bazelbuild/rules_docker) All of these tools build container images with different approaches. BuildKit (and `img`) can perform as a non-root user from within a container but requires seccomp and AppArmor to be disabled to create nested containers. `kaniko` does not actually create nested containers, so it does not require seccomp and AppArmor to be disabled. BuildKit supports "cross-building" multi-arch containers by leveraging QEMU. `orca-build` depends on `runc` to build images from Dockerfiles, which can not run inside a container (for similar reasons to `img` above). `kaniko` doesn't use `runc` so it doesn't require the use of kernel namespacing techniques. However, `orca-build` does not require Docker or any privileged daemon (so builds can be done entirely without privilege). `umoci` works without any privileges, and also has no restrictions on the root filesystem being extracted (though it requires additional handling if your filesystem is sufficiently complicated). However, it has no `Dockerfile`-like build tooling (it's a slightly lower-level tool that can be used to build such builders -- such as `orca-build`). `Buildah` specializes in building OCI images. Buildah's commands replicate all of the commands that are found in a Dockerfile. This allows building images with and without Dockerfiles while not requiring any root privileges. Buildah’s ultimate goal is to provide a lower-level coreutils interface to build images. The flexibility of building images without Dockerfiles allows for the integration of other scripting languages into the build process. Buildah follows a simple fork-exec model and does not run as a daemon but it is based on a comprehensive API in golang, which can be vendored into other tools. `FTL` and `Bazel` aim to achieve the fastest possible creation of Docker images for a subset of images. These can be thought of as a special-case "fast path" that can be used in conjunction with the support for general Dockerfiles kaniko provides. ## Community [kaniko-users](https://groups.google.com/forum/#!forum/kaniko-users) Google group To Contribute to kaniko, see [DEVELOPMENT.md](DEVELOPMENT.md) and [CONTRIBUTING.md](CONTRIBUTING.md). ## Limitations ### mtime and snapshotting When taking a snapshot, kaniko's hashing algorithms include (or in the case of [`--snapshot-mode=time`](#--snapshotmode), only use) a file's [`mtime`](https://en.wikipedia.org/wiki/Inode#POSIX_inode_description) to determine if the file has changed. Unfortunately, there is a delay between when changes to a file are made and when the `mtime` is updated. This means: - With the time-only snapshot mode (`--snapshot-mode=time`), kaniko may miss changes introduced by `RUN` commands entirely. - With the default snapshot mode (`--snapshot-mode=full`), whether or not kaniko will add a layer in the case where a `RUN` command modifies a file **but the contents do not** change is theoretically non-deterministic. This _does not affect the contents_ which will still be correct, but it does affect the number of layers. _Note that these issues are currently theoretical only. If you see this issue occur, please [open an issue](https://github.com/GoogleContainerTools/kaniko/issues)._ ### Dockerfile commands `--chown` support Kaniko currently supports `COPY --chown` and `ADD --chown` Dockerfile command. It does not support `RUN --chown`. ## References - [Kaniko - Building Container Images In Kubernetes Without Docker](https://youtu.be/EgwVQN6GNJg). ================================================ FILE: RELEASE.md ================================================ # Kaniko Release Process This document explains the Kaniko release process. Kaniko is not an officially supported Google product. Kaniko is maintained by Google. ## Self-Serve Kaniko Release [Non-Google contributors] Kaniko is not an officially supported Google product however only contributors part of Google organization can release Kaniko to official kaniko project at `kaniko-project`. If you are a part of [Google organization](https://github.com/orgs/google/people), please see skip to [Kaniko Release Process - Google Contributors](https://github.com/GoogleContainerTools/kaniko/blob/master/RELEASE.md#kaniko-release-process-google-contributors) Non-Google Contributors or users, please follow the following steps: 1. Follow the setup instruction to fork kaniko repository [here](https://github.com/GoogleContainerTools/kaniko/blob/master/DEVELOPMENT.md#getting-started) 2. Run the following `make` commands to build and push Kaniko image to your organization image repository. ```shell REGISTRY=gcr.io/YOUR-PROJECT make images ``` The above command will build and push all the 3 kaniko images * gcr.io/YOUR-PROJECT/executor:latest * gcr.io/YOUR-PROJECT/executor:debug * gcr.io/YOUR-PROJECT/warmer:latest 3. You can choose tag these images using `docker tag` e.g. To tag `gcr.io/YOUR-PROJECT/executor:latest` as `gcr.io/YOUR-PROJECT/executor:v1.6.0self-serve`, run ```shell docker tag gcr.io/YOUR-PROJECT/executor:latest gcr.io/YOUR-PROJECT/executor:v1.6.0self-serve ``` Please change all usages of `gcr.io/kaniko-project/executor:latest` to `gcr.io/YOUR-PROJECT/executor:latest` for executor image and so on. 4. Finally, pushed your tagged images via docker. You could also use the Makefile target `push` to push these images like this ```shell REGISTRY=gcr.io/YOUR-PROJECT make images ``` ## Kaniko Release Process [Google Contributors] ### Getting write access to the Kaniko Project In order to kick off kaniko release, you need to write access to Kaniko project. To get write access, please ping one of the [Kaniko Maintainers](https://github.com/orgs/GoogleContainerTools/teams/kaniko-maintainers/members). Once you have the correct access, you can kick off a release. ### Kicking of a release. 1. Create a release PR and update Changelog. In order to release a new version of Kaniko, you will need to first a. Create a new branch and bump the kaniko version in [Makefile](https://github.com/GoogleContainerTools/kaniko/blob/master/Makefile#L16) In most cases, you will need to bump the `VERSION_MINOR` number. In case you are doing a patch release for a hot fix, bump the `VERSION_BUILD` number. b. Run the [script](https://github.com/GoogleContainerTools/kaniko/blob/master/hack/release.sh) to create release notes. ``` ./hack/release.sh Collecting pull request that were merged since the last release: v1.0.0 (2020-08-18 02:53:46 +0000 UTC) * change repo string to just string [#1417](https://github.com/GoogleContainerTools/kaniko/pull/1417) * Improve --use-new-run help text, update README with missing flags [#1405](https://github.com/GoogleContainerTools/kaniko/pull/1405) ... Huge thank you for this release towards our contributors: - Alex Szakaly - Alexander Sharov ``` Copy the release notes and update the [CHANGELOG.md](https://github.com/GoogleContainerTools/kaniko/blob/master/CHANGELOG.md) at the root of the repository. c. Create a pull request like [this](https://github.com/GoogleContainerTools/kaniko/pull/1388) and get it approved from Kaniko maintainers. 2. Once the PR is approved and merged, create a release tag with name `vX.Y.Z` where ``` X corresponds to VERSION_MAJOR Y corresponds to VERSION_MINOR Z corresponds to VERSION_BUILD ``` E.g. to release 1.2.0 version of kaniko, please create a tag v1.2.0 like this ``` git pull remote master git tag v1.2.0 git push remote v1.2.0 ``` 3. Pushing a tag to remote with above naming convention will trigger the Github workflow action defined [here](https://github.com/GoogleContainerTools/kaniko/blob/main/.github/workflows/images.yaml) It takes 20-30 mins for the job to finish and push images to [`kaniko-project`](https://pantheon.corp.google.com/gcr/images/kaniko-project?orgonly=true&project=kaniko-project&supportedpurview=organizationId) ``` gcr.io/kaniko-project/executor:latest gcr.io/kaniko-project/executor:vX.Y.Z gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:debug-vX.Y.Z gcr.io/kaniko-project/executor:warmer gcr.io/kaniko-project/executor:warmer-vX.Y.Z ``` You could verify if the images are published using the `docker pull` command ``` docker pull gcr.io/kaniko-project/executor:vX.Y.Z docker pull gcr.io/kaniko-project/warmer:vX.Y.Z ``` In case the images are still not published, ping one of the kaniko maintainers and they will provide the cloud build trigger logs. You can also request read access to the Google `kaniko-project`. 4. Finally, once the images are published, create a release for the newly created [tag](https://github.com/GoogleContainerTools/kaniko/tags) and publish it. Summarize the change log to mention, - new features added if any - bug fixes, - refactors and - documentation changes ================================================ FILE: ROADMAP.md ================================================ # Kaniko Project Roadmap 2024 ## Introduction Kaniko is an open-source project designed to build container images from a Dockerfile, efficiently and securely, in environments that cannot run a Docker daemon. This roadmap outlines our strategic goals and key areas of development for 2024, aligning with our mission to enhance container building in cloud-native environments. ## Vision - **To be the leading tool for building container images via Dockerfile in cloud-native environments - prioritizing security, efficiency, compatibility, and portability.** ## Strategic Goals 1. **Enhanced Security**: Strengthen security measures in container image building, addressing vulnerabilities and integrating best practices. 2. **Performance Optimization**: Improve build performance to handle large-scale and complex applications. 3. **Ecosystem Compatibility**: Ensure compatibility and integration with a wide range of cloud-native tools and platforms. 4. **Community Engagement**: Foster an active community, encouraging contributions, feedback, and collaboration. ## Key Initiatives ### Q1 & Q2 2024 - **Security Automation Improvements** - Add automated image vulnerability scanning and notifications - **Release Automation Improvements** - Improve automation of Kaniko releases to ensure frequent releases with minimal overhead. - **CI/CD Integration Improvements** - Improve integration with popular CI/CD tools (e.g. GitLab CI, Jenkins, GHA, etc.). ### Q3 & Q4 2024 - **Improve Docker Compatibility** - Improve kaniko compatibility with docker related to edge cases where current Dockerfiles and resulting images can differ than what docker supports/generates from the same Dockerfile - **Performance Benchmarking** - Implement a performance benchmarking system with performance test suite. - Identify performance bottlenecks. - **Improve Layer Caching Mechanisms** - Improve layer caching generally for users (eg: reduce incorrect cache misses and usage). - **Enhanced Documentation** - Update documentation to reflect 2024 best practices and usage patterns. ================================================ FILE: SECURITY.md ================================================ To report a security issue with Kaniko, please use https://g.co/vulnz. We use https://g.co/vulnz for our intake, and do coordination and disclosure here on GitHub (including using GitHub Security Advisory). The Google Security Team will respond within 5 working days of your report on g.co/vulnz. ================================================ FILE: Vagrantfile ================================================ # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "generic/debian10" config.vm.synced_folder ".", "/go/src/github.com/GoogleContainerTools/kaniko" config.ssh.extra_args = ["-t", "cd /go/src/github.com/GoogleContainerTools/kaniko; bash --login"] config.vm.provision "shell", inline: <<-SHELL apt-get update && apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ html-xml-utils \ python \ wget \ ca-certificates \ jq \ software-properties-common curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" apt-get update apt-get install -y docker-ce-cli docker-ce containerd.io usermod -a -G docker vagrant curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64 chmod +x container-diff-linux-amd64 && mv container-diff-linux-amd64 /usr/local/bin/container-diff wget --quiet https://storage.googleapis.com/pub/gsutil.tar.gz mkdir -p /opt/gsutil tar xfz gsutil.tar.gz -C /opt/ rm gsutil.tar.gz ln -s /opt/gsutil/gsutil /usr/local/bin export GODLURL=https://go.dev/dl/$(curl --silent --show-error https://go.dev/dl/ | hxnormalize -x | hxselect -s "\n" "span, #filename" | grep linux | cut -d '>' -f 2 | cut -d '<' -f 1) echo "Downloading go from: $GODLURL" wget --quiet $GODLURL tar -C /usr/local -xzf go*.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin:/go/bin' > /etc/profile.d/go-path.sh echo 'export GOPATH=/go' >> /etc/profile.d/go-path.sh chmod a+x /etc/profile.d/go-path.sh chown vagrant /go chown vagrant /go/bin docker run --rm -d -p 5000:5000 --name registry -e DEBUG=true registry:2 echo 'export IMAGE_REPO=localhost:5000' > /etc/profile.d/local-registry.sh chmod a+x /etc/profile.d/local-registry.sh export PATH=$PATH:/usr/local/go/bin:/go/bin export GOPATH=/go go get github.com/google/go-containerregistry/cmd/crane SHELL end ================================================ FILE: benchmark.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -ex script_name=$0 script_full_path=$(dirname "$0") export BENCHMARK=true export IMAGE_REPO="gcr.io/kaniko-test/benchmarks" ./${script_full_path}/integration-test.sh ================================================ FILE: cmd/executor/cmd/root.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cmd import ( "fmt" "io/fs" "os" "os/exec" "path/filepath" "regexp" "strconv" "strings" "time" "github.com/GoogleContainerTools/kaniko/pkg/buildcontext" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/executor" "github.com/GoogleContainerTools/kaniko/pkg/logging" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/pkg/util/proc" "github.com/containerd/containerd/platforms" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/pflag" ) var ( opts = &config.KanikoOptions{} ctxSubPath string force bool logLevel string logFormat string logTimestamp bool ) func init() { RootCmd.PersistentFlags().StringVarP(&logLevel, "verbosity", "v", logging.DefaultLevel, "Log level (trace, debug, info, warn, error, fatal, panic)") RootCmd.PersistentFlags().StringVar(&logFormat, "log-format", logging.FormatColor, "Log format (text, color, json)") RootCmd.PersistentFlags().BoolVar(&logTimestamp, "log-timestamp", logging.DefaultLogTimestamp, "Timestamp in log output") RootCmd.PersistentFlags().BoolVarP(&force, "force", "", false, "Force building outside of a container") addKanikoOptionsFlags() addHiddenFlags(RootCmd) RootCmd.PersistentFlags().BoolVarP(&opts.IgnoreVarRun, "whitelist-var-run", "", true, "Ignore /var/run directory when taking image snapshot. Set it to false to preserve /var/run/ in destination image.") RootCmd.PersistentFlags().MarkDeprecated("whitelist-var-run", "Please use ignore-var-run instead.") } func validateFlags() { checkNoDeprecatedFlags() // Allow setting --registry-mirror using an environment variable. if val, ok := os.LookupEnv("KANIKO_REGISTRY_MIRROR"); ok { opts.RegistryMirrors.Set(val) } // Allow setting --no-push using an environment variable. if val, ok := os.LookupEnv("KANIKO_NO_PUSH"); ok { valBoolean, err := strconv.ParseBool(val) if err != nil { errors.New("invalid value (true/false) for KANIKO_NO_PUSH environment variable") } opts.NoPush = valBoolean } // Allow setting --registry-maps using an environment variable. if val, ok := os.LookupEnv("KANIKO_REGISTRY_MAP"); ok { opts.RegistryMaps.Set(val) } for _, target := range opts.RegistryMirrors { opts.RegistryMaps.Set(fmt.Sprintf("%s=%s", name.DefaultRegistry, target)) } if len(opts.RegistryMaps) > 0 { for src, dsts := range opts.RegistryMaps { logrus.Debugf("registry-map remaps %s to %s.", src, strings.Join(dsts, ", ")) } } // Default the custom platform flag to our current platform, and validate it. if opts.CustomPlatform == "" { opts.CustomPlatform = platforms.Format(platforms.Normalize(platforms.DefaultSpec())) } if _, err := v1.ParsePlatform(opts.CustomPlatform); err != nil { logrus.Fatalf("Invalid platform %q: %v", opts.CustomPlatform, err) } } // RootCmd is the kaniko command that is run var RootCmd = &cobra.Command{ Use: "executor", PersistentPreRunE: func(cmd *cobra.Command, args []string) error { if cmd.Use == "executor" { if err := logging.Configure(logLevel, logFormat, logTimestamp); err != nil { return err } validateFlags() // Command line flag takes precedence over the KANIKO_DIR environment variable. dir := config.KanikoDir if opts.KanikoDir != constants.DefaultKanikoPath { dir = opts.KanikoDir } if err := checkKanikoDir(dir); err != nil { return err } resolveEnvironmentBuildArgs(opts.BuildArgs, os.Getenv) if !opts.NoPush && len(opts.Destinations) == 0 { return errors.New("you must provide --destination, or use --no-push") } if err := cacheFlagsValid(); err != nil { return errors.Wrap(err, "cache flags invalid") } if err := resolveSourceContext(); err != nil { return errors.Wrap(err, "error resolving source context") } if err := resolveDockerfilePath(); err != nil { return errors.Wrap(err, "error resolving dockerfile path") } if len(opts.Destinations) == 0 && opts.ImageNameDigestFile != "" { return errors.New("you must provide --destination if setting ImageNameDigestFile") } if len(opts.Destinations) == 0 && opts.ImageNameTagDigestFile != "" { return errors.New("you must provide --destination if setting ImageNameTagDigestFile") } // Update ignored paths if opts.IgnoreVarRun { // /var/run is a special case. It's common to mount in /var/run/docker.sock // or something similar which leads to a special mount on the /var/run/docker.sock // file itself, but the directory to exist in the image with no way to tell if it came // from the base image or not. logrus.Trace("Adding /var/run to default ignore list") util.AddToDefaultIgnoreList(util.IgnoreListEntry{ Path: "/var/run", PrefixMatchOnly: false, }) } for _, p := range opts.IgnorePaths { util.AddToDefaultIgnoreList(util.IgnoreListEntry{ Path: p, PrefixMatchOnly: false, }) } } return nil }, Run: func(cmd *cobra.Command, args []string) { if !checkContained() { if !force { exit(errors.New("kaniko should only be run inside of a container, run with the --force flag if you are sure you want to continue")) } logrus.Warn("Kaniko is being run outside of a container. This can have dangerous effects on your system") } if !opts.NoPush || opts.CacheRepo != "" { if err := executor.CheckPushPermissions(opts); err != nil { exit(errors.Wrap(err, "error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try again")) } } if err := resolveRelativePaths(); err != nil { exit(errors.Wrap(err, "error resolving relative paths to absolute paths")) } if err := os.Chdir("/"); err != nil { exit(errors.Wrap(err, "error changing to root dir")) } image, err := executor.DoBuild(opts) if err != nil { exit(errors.Wrap(err, "error building image")) } if err := executor.DoPush(image, opts); err != nil { exit(errors.Wrap(err, "error pushing image")) } benchmarkFile := os.Getenv("BENCHMARK_FILE") // false is a keyword for integration tests to turn off benchmarking if benchmarkFile != "" && benchmarkFile != "false" { s, err := timing.JSON() if err != nil { logrus.Warnf("Unable to write benchmark file: %s", err) return } if strings.HasPrefix(benchmarkFile, "gs://") { logrus.Info("Uploading to gcs") if err := buildcontext.UploadToBucket(strings.NewReader(s), benchmarkFile); err != nil { logrus.Infof("Unable to upload %s due to %v", benchmarkFile, err) } logrus.Infof("Benchmark file written at %s", benchmarkFile) } else { f, err := os.Create(benchmarkFile) if err != nil { logrus.Warnf("Unable to create benchmarking file %s: %s", benchmarkFile, err) return } defer f.Close() f.WriteString(s) logrus.Infof("Benchmark file written at %s", benchmarkFile) } } }, } // addKanikoOptionsFlags configures opts func addKanikoOptionsFlags() { RootCmd.PersistentFlags().StringVarP(&opts.DockerfilePath, "dockerfile", "f", "Dockerfile", "Path to the dockerfile to be built.") RootCmd.PersistentFlags().StringVarP(&opts.SrcContext, "context", "c", "/workspace/", "Path to the dockerfile build context.") RootCmd.PersistentFlags().StringVarP(&ctxSubPath, "context-sub-path", "", "", "Sub path within the given context.") RootCmd.PersistentFlags().StringVarP(&opts.Bucket, "bucket", "b", "", "Name of the GCS bucket from which to access build context as tarball.") RootCmd.PersistentFlags().VarP(&opts.Destinations, "destination", "d", "Registry the final image should be pushed to. Set it repeatedly for multiple destinations.") RootCmd.PersistentFlags().StringVarP(&opts.SnapshotMode, "snapshot-mode", "", "full", "Change the file attributes inspected during snapshotting") RootCmd.PersistentFlags().StringVarP(&opts.CustomPlatform, "custom-platform", "", "", "Specify the build platform if different from the current host") RootCmd.PersistentFlags().VarP(&opts.BuildArgs, "build-arg", "", "This flag allows you to pass in ARG values at build time. Set it repeatedly for multiple values.") RootCmd.PersistentFlags().BoolVarP(&opts.Insecure, "insecure", "", false, "Push to insecure registry using plain HTTP") RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerify, "skip-tls-verify", "", false, "Push to insecure registry ignoring TLS verify") RootCmd.PersistentFlags().BoolVarP(&opts.InsecurePull, "insecure-pull", "", false, "Pull from insecure registry using plain HTTP") RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerifyPull, "skip-tls-verify-pull", "", false, "Pull from insecure registry ignoring TLS verify") RootCmd.PersistentFlags().IntVar(&opts.PushRetry, "push-retry", 0, "Number of retries for the push operation") RootCmd.PersistentFlags().BoolVar(&opts.PushIgnoreImmutableTagErrors, "push-ignore-immutable-tag-errors", false, "If true, known tag immutability errors are ignored and the push finishes with success.") RootCmd.PersistentFlags().IntVar(&opts.ImageFSExtractRetry, "image-fs-extract-retry", 0, "Number of retries for image FS extraction") RootCmd.PersistentFlags().IntVar(&opts.ImageDownloadRetry, "image-download-retry", 0, "Number of retries for downloading the remote image") RootCmd.PersistentFlags().StringVarP(&opts.KanikoDir, "kaniko-dir", "", constants.DefaultKanikoPath, "Path to the kaniko directory, this takes precedence over the KANIKO_DIR environment variable.") RootCmd.PersistentFlags().StringVarP(&opts.TarPath, "tar-path", "", "", "Path to save the image in as a tarball instead of pushing") RootCmd.PersistentFlags().BoolVarP(&opts.SingleSnapshot, "single-snapshot", "", false, "Take a single snapshot at the end of the build.") RootCmd.PersistentFlags().BoolVarP(&opts.Reproducible, "reproducible", "", false, "Strip timestamps out of the image to make it reproducible") RootCmd.PersistentFlags().StringVarP(&opts.Target, "target", "", "", "Set the target build stage to build") RootCmd.PersistentFlags().BoolVarP(&opts.NoPush, "no-push", "", false, "Do not push the image to the registry") RootCmd.PersistentFlags().BoolVarP(&opts.NoPushCache, "no-push-cache", "", false, "Do not push the cache layers to the registry") RootCmd.PersistentFlags().StringVarP(&opts.CacheRepo, "cache-repo", "", "", "Specify a repository to use as a cache, otherwise one will be inferred from the destination provided; when prefixed with 'oci:' the repository will be written in OCI image layout format at the path provided") RootCmd.PersistentFlags().StringVarP(&opts.CacheDir, "cache-dir", "", "/cache", "Specify a local directory to use as a cache.") RootCmd.PersistentFlags().StringVarP(&opts.DigestFile, "digest-file", "", "", "Specify a file to save the digest of the built image to.") RootCmd.PersistentFlags().StringVarP(&opts.ImageNameDigestFile, "image-name-with-digest-file", "", "", "Specify a file to save the image name w/ digest of the built image to.") RootCmd.PersistentFlags().StringVarP(&opts.ImageNameTagDigestFile, "image-name-tag-with-digest-file", "", "", "Specify a file to save the image name w/ image tag w/ digest of the built image to.") RootCmd.PersistentFlags().StringVarP(&opts.OCILayoutPath, "oci-layout-path", "", "", "Path to save the OCI image layout of the built image.") RootCmd.PersistentFlags().VarP(&opts.Compression, "compression", "", "Compression algorithm (gzip, zstd)") RootCmd.PersistentFlags().IntVarP(&opts.CompressionLevel, "compression-level", "", -1, "Compression level") RootCmd.PersistentFlags().BoolVarP(&opts.Cache, "cache", "", false, "Use cache when building image") RootCmd.PersistentFlags().BoolVarP(&opts.CompressedCaching, "compressed-caching", "", true, "Compress the cached layers. Decreases build time, but increases memory usage.") RootCmd.PersistentFlags().BoolVarP(&opts.Cleanup, "cleanup", "", false, "Clean the filesystem at the end") RootCmd.PersistentFlags().DurationVarP(&opts.CacheTTL, "cache-ttl", "", time.Hour*336, "Cache timeout, requires value and unit of duration -> ex: 6h. Defaults to two weeks.") RootCmd.PersistentFlags().VarP(&opts.InsecureRegistries, "insecure-registry", "", "Insecure registry using plain HTTP to push and pull. Set it repeatedly for multiple registries.") RootCmd.PersistentFlags().VarP(&opts.SkipTLSVerifyRegistries, "skip-tls-verify-registry", "", "Insecure registry ignoring TLS verify to push and pull. Set it repeatedly for multiple registries.") opts.RegistriesCertificates = make(map[string]string) RootCmd.PersistentFlags().VarP(&opts.RegistriesCertificates, "registry-certificate", "", "Use the provided certificate for TLS communication with the given registry. Expected format is 'my.registry.url=/path/to/the/server/certificate'.") opts.RegistriesClientCertificates = make(map[string]string) RootCmd.PersistentFlags().VarP(&opts.RegistriesClientCertificates, "registry-client-cert", "", "Use the provided client certificate for mutual TLS (mTLS) communication with the given registry. Expected format is 'my.registry.url=/path/to/client/cert,/path/to/client/key'.") opts.RegistryMaps = make(map[string][]string) RootCmd.PersistentFlags().VarP(&opts.RegistryMaps, "registry-map", "", "Registry map of mirror to use as pull-through cache instead. Expected format is 'orignal.registry=new.registry;other-original.registry=other-remap.registry'") RootCmd.PersistentFlags().VarP(&opts.RegistryMirrors, "registry-mirror", "", "Registry mirror to use as pull-through cache instead of docker.io. Set it repeatedly for multiple mirrors.") RootCmd.PersistentFlags().BoolVarP(&opts.SkipDefaultRegistryFallback, "skip-default-registry-fallback", "", false, "If an image is not found on any mirrors (defined with registry-mirror) do not fallback to the default registry. If registry-mirror is not defined, this flag is ignored.") RootCmd.PersistentFlags().BoolVarP(&opts.IgnoreVarRun, "ignore-var-run", "", true, "Ignore /var/run directory when taking image snapshot. Set it to false to preserve /var/run/ in destination image.") RootCmd.PersistentFlags().VarP(&opts.Labels, "label", "", "Set metadata for an image. Set it repeatedly for multiple labels.") RootCmd.PersistentFlags().BoolVarP(&opts.SkipUnusedStages, "skip-unused-stages", "", false, "Build only used stages if defined to true. Otherwise it builds by default all stages, even the unnecessaries ones until it reaches the target stage / end of Dockerfile") RootCmd.PersistentFlags().BoolVarP(&opts.RunV2, "use-new-run", "", false, "Use the experimental run implementation for detecting changes without requiring file system snapshots.") RootCmd.PersistentFlags().Var(&opts.Git, "git", "Branch to clone if build context is a git repository") RootCmd.PersistentFlags().BoolVarP(&opts.CacheCopyLayers, "cache-copy-layers", "", false, "Caches copy layers") RootCmd.PersistentFlags().BoolVarP(&opts.CacheRunLayers, "cache-run-layers", "", true, "Caches run layers") RootCmd.PersistentFlags().VarP(&opts.IgnorePaths, "ignore-path", "", "Ignore these paths when taking a snapshot. Set it repeatedly for multiple paths.") RootCmd.PersistentFlags().BoolVarP(&opts.ForceBuildMetadata, "force-build-metadata", "", false, "Force add metadata layers to build image") RootCmd.PersistentFlags().BoolVarP(&opts.SkipPushPermissionCheck, "skip-push-permission-check", "", false, "Skip check of the push permission") // Deprecated flags. RootCmd.PersistentFlags().StringVarP(&opts.SnapshotModeDeprecated, "snapshotMode", "", "", "This flag is deprecated. Please use '--snapshot-mode'.") RootCmd.PersistentFlags().StringVarP(&opts.CustomPlatformDeprecated, "customPlatform", "", "", "This flag is deprecated. Please use '--custom-platform'.") RootCmd.PersistentFlags().StringVarP(&opts.TarPath, "tarPath", "", "", "This flag is deprecated. Please use '--tar-path'.") } // addHiddenFlags marks certain flags as hidden from the executor help text func addHiddenFlags(cmd *cobra.Command) { // This flag is added in a vendored directory, hide so that it doesn't come up via --help pflag.CommandLine.MarkHidden("azure-container-registry-config") // Hide this flag as we want to encourage people to use the --context flag instead cmd.PersistentFlags().MarkHidden("bucket") } // checkKanikoDir will check whether the executor is operating in the default '/kaniko' directory, // conducting the relevant operations if it is not func checkKanikoDir(dir string) error { if dir != constants.DefaultKanikoPath { // The destination directory may be across a different partition, so we cannot simply rename/move the directory in this case. if _, err := util.CopyDir(constants.DefaultKanikoPath, dir, util.FileContext{}, util.DoNotChangeUID, util.DoNotChangeGID, fs.FileMode(0o600), true); err != nil { return err } if err := os.RemoveAll(constants.DefaultKanikoPath); err != nil { return err } // After remove DefaultKankoPath, the DOKCER_CONFIG env will point to a non-exist dir, so we should update DOCKER_CONFIG env to new dir if err := os.Setenv("DOCKER_CONFIG", filepath.Join(dir, "/.docker")); err != nil { return err } } return nil } func checkContained() bool { return proc.GetContainerRuntime(0, 0) != proc.RuntimeNotFound } // checkNoDeprecatedFlags return an error if deprecated flags are used. func checkNoDeprecatedFlags() { // In version >=2.0.0 make it fail (`Warn` -> `Fatal`) if opts.CustomPlatformDeprecated != "" { logrus.Warn("Flag --customPlatform is deprecated. Use: --custom-platform") opts.CustomPlatform = opts.CustomPlatformDeprecated } if opts.SnapshotModeDeprecated != "" { logrus.Warn("Flag --snapshotMode is deprecated. Use: --snapshot-mode") opts.SnapshotMode = opts.SnapshotModeDeprecated } if opts.TarPathDeprecated != "" { logrus.Warn("Flag --tarPath is deprecated. Use: --tar-path") opts.TarPath = opts.TarPathDeprecated } } // cacheFlagsValid makes sure the flags passed in related to caching are valid func cacheFlagsValid() error { if !opts.Cache { return nil } // If --cache=true and --no-push=true, then cache repo must be provided // since cache can't be inferred from destination if opts.CacheRepo == "" && opts.NoPush { return errors.New("if using cache with --no-push, specify cache repo with --cache-repo") } return nil } // resolveDockerfilePath resolves the Dockerfile path to an absolute path func resolveDockerfilePath() error { if isURL(opts.DockerfilePath) { return nil } if util.FilepathExists(opts.DockerfilePath) { abs, err := filepath.Abs(opts.DockerfilePath) if err != nil { return errors.Wrap(err, "getting absolute path for dockerfile") } opts.DockerfilePath = abs return copyDockerfile() } // Otherwise, check if the path relative to the build context exists if util.FilepathExists(filepath.Join(opts.SrcContext, opts.DockerfilePath)) { abs, err := filepath.Abs(filepath.Join(opts.SrcContext, opts.DockerfilePath)) if err != nil { return errors.Wrap(err, "getting absolute path for src context/dockerfile path") } opts.DockerfilePath = abs return copyDockerfile() } return errors.New("please provide a valid path to a Dockerfile within the build context with --dockerfile") } // resolveEnvironmentBuildArgs replace build args without value by the same named environment variable func resolveEnvironmentBuildArgs(arguments []string, resolver func(string) string) { for index, argument := range arguments { i := strings.Index(argument, "=") if i < 0 { value := resolver(argument) arguments[index] = fmt.Sprintf("%s=%s", argument, value) } } } // copy Dockerfile to /kaniko/Dockerfile so that if it's specified in the .dockerignore // it won't be copied into the image func copyDockerfile() error { if _, err := util.CopyFile(opts.DockerfilePath, config.DockerfilePath, util.FileContext{}, util.DoNotChangeUID, util.DoNotChangeGID, fs.FileMode(0o600), true); err != nil { return errors.Wrap(err, "copying dockerfile") } dockerignorePath := opts.DockerfilePath + ".dockerignore" if util.FilepathExists(dockerignorePath) { if _, err := util.CopyFile(dockerignorePath, config.DockerfilePath+".dockerignore", util.FileContext{}, util.DoNotChangeUID, util.DoNotChangeGID, fs.FileMode(0o600), true); err != nil { return errors.Wrap(err, "copying Dockerfile.dockerignore") } } opts.DockerfilePath = config.DockerfilePath return nil } // resolveSourceContext unpacks the source context if it is a tar in a bucket or in kaniko container // it resets srcContext to be the path to the unpacked build context within the image func resolveSourceContext() error { if opts.SrcContext == "" && opts.Bucket == "" { return errors.New("please specify a path to the build context with the --context flag or a bucket with the --bucket flag") } if opts.SrcContext != "" && !strings.Contains(opts.SrcContext, "://") { return nil } if opts.Bucket != "" { if !strings.Contains(opts.Bucket, "://") { // if no prefix use Google Cloud Storage as default for backwards compatibility opts.SrcContext = constants.GCSBuildContextPrefix + opts.Bucket } else { opts.SrcContext = opts.Bucket } } contextExecutor, err := buildcontext.GetBuildContext(opts.SrcContext, buildcontext.BuildOptions{ GitBranch: opts.Git.Branch, GitSingleBranch: opts.Git.SingleBranch, GitRecurseSubmodules: opts.Git.RecurseSubmodules, InsecureSkipTLS: opts.Git.InsecureSkipTLS, }) if err != nil { return err } logrus.Debugf("Getting source context from %s", opts.SrcContext) opts.SrcContext, err = contextExecutor.UnpackTarFromBuildContext() if err != nil { return err } if ctxSubPath != "" { opts.SrcContext = filepath.Join(opts.SrcContext, ctxSubPath) if _, err := os.Stat(opts.SrcContext); os.IsNotExist(err) { return err } } logrus.Debugf("Build context located at %s", opts.SrcContext) return nil } func resolveRelativePaths() error { optsPaths := []*string{ &opts.DockerfilePath, &opts.SrcContext, &opts.CacheDir, &opts.TarPath, &opts.DigestFile, &opts.ImageNameDigestFile, &opts.ImageNameTagDigestFile, } for _, p := range optsPaths { if path := *p; shdSkip(path) { logrus.Debugf("Skip resolving path %s", path) continue } // Resolve relative path to absolute path var err error relp := *p // save original relative path if *p, err = filepath.Abs(*p); err != nil { return errors.Wrapf(err, "Couldn't resolve relative path %s to an absolute path", *p) } logrus.Debugf("Resolved relative path %s to %s", relp, *p) } return nil } func exit(err error) { var execErr *exec.ExitError if errors.As(err, &execErr) { // if there is an exit code propagate it exitWithCode(err, execErr.ExitCode()) } // otherwise exit with catch all 1 exitWithCode(err, 1) } // exits with the given error and exit code func exitWithCode(err error, exitCode int) { fmt.Fprintln(os.Stderr, err) os.Exit(exitCode) } func isURL(path string) bool { if match, _ := regexp.MatchString("^https?://", path); match { return true } return false } func shdSkip(path string) bool { return path == "" || isURL(path) || filepath.IsAbs(path) } ================================================ FILE: cmd/executor/cmd/root_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cmd import ( "testing" "github.com/GoogleContainerTools/kaniko/testutil" ) func TestSkipPath(t *testing.T) { tests := []struct { description string path string expected bool }{ { description: "path is a http url", path: "http://test", expected: true, }, { description: "path is a https url", path: "https://test", expected: true, }, { description: "path is a empty", path: "", expected: true, }, { description: "path is already abs", path: "/tmp/test", expected: true, }, { description: "path is relative", path: ".././test", }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { testutil.CheckDeepEqual(t, tt.expected, shdSkip(tt.path)) }) } } func TestIsUrl(t *testing.T) { tests := []struct { description string path string expected bool }{ { description: "path is a http url", path: "http://test", expected: true, }, { description: "path is a https url", path: "https://test", expected: true, }, { description: "path is a empty", path: "", }, { description: "path is already abs", path: "/tmp/test", }, { description: "path is relative", path: ".././test", }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { testutil.CheckDeepEqual(t, tt.expected, isURL(tt.path)) }) } } func TestResolveEnvironmentBuildArgs(t *testing.T) { tests := []struct { description string input []string expected []string mockedEnvironmentResolver func(string) string }{ { description: "replace when environment variable is present and value is not specified", input: []string{"variable1"}, expected: []string{"variable1=value1"}, mockedEnvironmentResolver: func(variable string) string { if variable == "variable1" { return "value1" } return "" }, }, { description: "do not replace when environment variable is present and value is specified", input: []string{"variable1=value1", "variable2=value2"}, expected: []string{"variable1=value1", "variable2=value2"}, mockedEnvironmentResolver: func(variable string) string { return "unexpected" }, }, { description: "do not replace when environment variable is present and empty value is specified", input: []string{"variable1="}, expected: []string{"variable1="}, mockedEnvironmentResolver: func(variable string) string { return "unexpected" }, }, { description: "replace with empty value when environment variable is not present or empty and value is not specified", input: []string{"variable1", "variable2=value2"}, expected: []string{"variable1=", "variable2=value2"}, mockedEnvironmentResolver: func(variable string) string { return "" }, }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { resolveEnvironmentBuildArgs(tt.input, tt.mockedEnvironmentResolver) testutil.CheckDeepEqual(t, tt.expected, tt.input) }) } } ================================================ FILE: cmd/executor/cmd/version.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cmd import ( "fmt" "github.com/GoogleContainerTools/kaniko/pkg/version" "github.com/spf13/cobra" ) func init() { RootCmd.AddCommand(versionCmd) } var versionCmd = &cobra.Command{ Use: "version", Short: "Print the version number of kaniko", Run: func(cmd *cobra.Command, args []string) { fmt.Println("Kaniko version : ", version.Version()) }, } ================================================ FILE: cmd/executor/main.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package main import ( "os" "github.com/GoogleContainerTools/kaniko/cmd/executor/cmd" "github.com/google/slowjam/pkg/stacklog" ) func main() { s := stacklog.MustStartFromEnv("STACKLOG_PATH") defer s.Stop() if err := cmd.RootCmd.Execute(); err != nil { os.Exit(1) } } ================================================ FILE: cmd/warmer/cmd/root.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cmd import ( "fmt" "os" "path/filepath" "regexp" "strings" "time" "github.com/GoogleContainerTools/kaniko/pkg/cache" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/logging" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/containerd/containerd/platforms" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) var ( opts = &config.WarmerOptions{} logLevel string logFormat string logTimestamp bool ) func init() { RootCmd.PersistentFlags().StringVarP(&logLevel, "verbosity", "v", logging.DefaultLevel, "Log level (trace, debug, info, warn, error, fatal, panic)") RootCmd.PersistentFlags().StringVar(&logFormat, "log-format", logging.FormatColor, "Log format (text, color, json)") RootCmd.PersistentFlags().BoolVar(&logTimestamp, "log-timestamp", logging.DefaultLogTimestamp, "Timestamp in log output") addKanikoOptionsFlags() addHiddenFlags() } var RootCmd = &cobra.Command{ Use: "cache warmer", PersistentPreRunE: func(cmd *cobra.Command, args []string) error { if err := logging.Configure(logLevel, logFormat, logTimestamp); err != nil { return err } // Allow setting --registry-maps using an environment variable. // some users use warmer with --regisry-mirror before v1.21.0 // TODO may need all executors validation in here if val, ok := os.LookupEnv("KANIKO_REGISTRY_MAP"); ok { opts.RegistryMaps.Set(val) } for _, target := range opts.RegistryMirrors { opts.RegistryMaps.Set(fmt.Sprintf("%s=%s", name.DefaultRegistry, target)) } if len(opts.RegistryMaps) > 0 { for src, dsts := range opts.RegistryMaps { logrus.Debugf("registry-map remaps %s to %s.", src, strings.Join(dsts, ", ")) } } if len(opts.Images) == 0 && opts.DockerfilePath == "" { return errors.New("You must select at least one image to cache or a dockerfilepath to parse") } if opts.DockerfilePath != "" { if err := validateDockerfilePath(); err != nil { return errors.Wrap(err, "error validating dockerfile path") } } return nil }, Run: func(cmd *cobra.Command, args []string) { if _, err := os.Stat(opts.CacheDir); os.IsNotExist(err) { err = os.MkdirAll(opts.CacheDir, 0755) if err != nil { exit(errors.Wrap(err, "Failed to create cache directory")) } } if err := cache.WarmCache(opts); err != nil { exit(errors.Wrap(err, "Failed warming cache")) } }, } // addKanikoOptionsFlags configures opts func addKanikoOptionsFlags() { RootCmd.PersistentFlags().VarP(&opts.Images, "image", "i", "Image to cache. Set it repeatedly for multiple images.") RootCmd.PersistentFlags().StringVarP(&opts.CacheDir, "cache-dir", "c", "/cache", "Directory of the cache.") RootCmd.PersistentFlags().BoolVarP(&opts.Force, "force", "f", false, "Force cache overwriting.") RootCmd.PersistentFlags().DurationVarP(&opts.CacheTTL, "cache-ttl", "", time.Hour*336, "Cache timeout in hours. Defaults to two weeks.") RootCmd.PersistentFlags().BoolVarP(&opts.InsecurePull, "insecure-pull", "", false, "Pull from insecure registry using plain HTTP") RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerifyPull, "skip-tls-verify-pull", "", false, "Pull from insecure registry ignoring TLS verify") RootCmd.PersistentFlags().VarP(&opts.InsecureRegistries, "insecure-registry", "", "Insecure registry using plain HTTP to pull. Set it repeatedly for multiple registries.") RootCmd.PersistentFlags().VarP(&opts.SkipTLSVerifyRegistries, "skip-tls-verify-registry", "", "Insecure registry ignoring TLS verify to pull. Set it repeatedly for multiple registries.") opts.RegistriesCertificates = make(map[string]string) RootCmd.PersistentFlags().VarP(&opts.RegistriesCertificates, "registry-certificate", "", "Use the provided certificate for TLS communication with the given registry. Expected format is 'my.registry.url=/path/to/the/server/certificate'.") opts.RegistriesClientCertificates = make(map[string]string) RootCmd.PersistentFlags().VarP(&opts.RegistriesClientCertificates, "registry-client-cert", "", "Use the provided client certificate for mutual TLS (mTLS) communication with the given registry. Expected format is 'my.registry.url=/path/to/client/cert,/path/to/client/key'.") opts.RegistryMaps = make(map[string][]string) RootCmd.PersistentFlags().VarP(&opts.RegistryMaps, "registry-map", "", "Registry map of mirror to use as pull-through cache instead. Expected format is 'orignal.registry=new.registry;other-original.registry=other-remap.registry'") RootCmd.PersistentFlags().VarP(&opts.RegistryMirrors, "registry-mirror", "", "Registry mirror to use as pull-through cache instead of docker.io. Set it repeatedly for multiple mirrors.") RootCmd.PersistentFlags().BoolVarP(&opts.SkipDefaultRegistryFallback, "skip-default-registry-fallback", "", false, "If an image is not found on any mirrors (defined with registry-mirror) do not fallback to the default registry. If registry-mirror is not defined, this flag is ignored.") RootCmd.PersistentFlags().StringVarP(&opts.CustomPlatform, "customPlatform", "", "", "Specify the build platform if different from the current host") RootCmd.PersistentFlags().StringVarP(&opts.DockerfilePath, "dockerfile", "d", "", "Path to the dockerfile to be cached. The kaniko warmer will parse and write out each stage's base image layers to the cache-dir. Using the same dockerfile path as what you plan to build in the kaniko executor is the expected usage.") RootCmd.PersistentFlags().VarP(&opts.BuildArgs, "build-arg", "", "This flag should be used in conjunction with the dockerfile flag for scenarios where dynamic replacement of the base image is required.") // Default the custom platform flag to our current platform, and validate it. if opts.CustomPlatform == "" { opts.CustomPlatform = platforms.Format(platforms.Normalize(platforms.DefaultSpec())) } if _, err := v1.ParsePlatform(opts.CustomPlatform); err != nil { logrus.Fatalf("Invalid platform %q: %v", opts.CustomPlatform, err) } } // addHiddenFlags marks certain flags as hidden from the executor help text func addHiddenFlags() { RootCmd.PersistentFlags().MarkHidden("azure-container-registry-config") } func validateDockerfilePath() error { if isURL(opts.DockerfilePath) { return nil } if util.FilepathExists(opts.DockerfilePath) { abs, err := filepath.Abs(opts.DockerfilePath) if err != nil { return errors.Wrap(err, "getting absolute path for dockerfile") } opts.DockerfilePath = abs return nil } return errors.New("please provide a valid path to a Dockerfile within the build context with --dockerfile") } func isURL(path string) bool { if match, _ := regexp.MatchString("^https?://", path); match { return true } return false } func exit(err error) { fmt.Println(err) os.Exit(1) } ================================================ FILE: cmd/warmer/main.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package main import ( "os" "github.com/GoogleContainerTools/kaniko/cmd/warmer/cmd" ) func main() { if err := cmd.RootCmd.Execute(); err != nil { os.Exit(1) } } ================================================ FILE: code-of-conduct.md ================================================ # Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. This Code of Conduct also applies outside the project spaces when the Project Steward has a reasonable belief that an individual's behavior may have a negative impact on the project or its community. ## Conflict Resolution We do not believe that all conflict is bad; healthy debate and disagreement often yield positive results. However, it is never okay to be disrespectful or to engage in behavior that violates the project’s code of conduct. If you see someone violating the code of conduct, you are encouraged to address the behavior directly with those involved. Many issues can be resolved quickly and easily, and this gives people more control over the outcome of their dispute. If you are unable to resolve the matter for any reason, or if the behavior is threatening or harassing, report it. We are dedicated to providing an environment where participants feel welcome and safe. Reports should be directed to the maintainers, the Project Steward(s). It is the Project Steward’s duty to receive and address reported violations of the code of conduct. They will then work with a committee consisting of representatives from the Open Source Programs Office and the Google Open Source Strategy team. If for any reason you are uncomfortable reaching out the Project Steward, please email opensource@google.com. We will investigate every complaint, but you may not receive a direct response. We will use our discretion in determining when and how to follow up on reported incidents, which may range from not taking action to permanent expulsion from the project and project-sponsored spaces. We will notify the accused of the report and provide them an opportunity to discuss it before any action is taken. The identity of the reporter will be omitted from the details of the report supplied to the accused. In potentially harmful situations, such as ongoing harassment or threats to anyone's safety, we may take action without notice. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html ================================================ FILE: cosign.pub ================================================ -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9aAfAcgAxIFMTstJUv8l/AMqnSKw P+vLu3NnnBDHCfREQpV/AJuiZ1UtgGpFpHlJLCNPmFkzQTnfyN5idzNl6Q== -----END PUBLIC KEY----- ================================================ FILE: deploy/Dockerfile ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM golang:1.24 AS builder WORKDIR /src # This arg is passed by docker buildx & contains the target CPU architecture (e.g., amd64, arm64, etc.) ARG TARGETARCH ARG TARGETOS ENV GOARCH=$TARGETARCH ENV GOOS=$TARGETOS ENV CGO_ENABLED=0 ENV GOBIN=/usr/local/bin # Add .docker config dir RUN mkdir -p /kaniko/.docker COPY . . # dependencies https://github.com/golang/go/issues/48332 # The versions of these tools and their transitive dependencies are controlled via go.mod. # To update the version of any tool installed here, run # # go get @ # go mod vendor # # Then submit a PR with the changes to `go.mod`, `go.sum`, and `vendor`. # Get GCR credential helper RUN go install github.com/GoogleCloudPlatform/docker-credential-gcr/v2 # Get Amazon ECR credential helper RUN go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login # Get ACR docker env credential helper RUN go install github.com/chrismellard/docker-credential-acr-env RUN \ --mount=type=cache,target=/root/.cache/go-build \ --mount=type=cache,target=/go/pkg \ make out/executor out/warmer # Generate latest ca-certificates FROM debian:bookworm-slim AS certs RUN apt update && apt install -y ca-certificates # use musl busybox since it's staticly compiled on all platforms FROM busybox:musl AS busybox FROM scratch AS kaniko-base-slim # Create kaniko directory with world write permission to allow non root run RUN --mount=from=busybox,dst=/usr/ ["busybox", "sh", "-c", "mkdir -p /kaniko && chmod 777 /kaniko"] COPY --from=certs /etc/ssl/certs/ca-certificates.crt /kaniko/ssl/certs/ COPY files/nsswitch.conf /etc/nsswitch.conf ENV HOME /root ENV USER root ENV PATH /usr/local/bin:/kaniko ENV SSL_CERT_DIR=/kaniko/ssl/certs FROM kaniko-base-slim AS kaniko-base COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-gcr /kaniko/docker-credential-gcr COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-ecr-login /kaniko/docker-credential-ecr-login COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-acr-env /kaniko/docker-credential-acr-env COPY --from=builder /kaniko/.docker /kaniko/.docker ENV DOCKER_CONFIG /kaniko/.docker/ ENV DOCKER_CREDENTIAL_GCR_CONFIG /kaniko/.config/gcloud/docker_credential_gcr_config.json WORKDIR /workspace ### FINAL STAGES ### FROM kaniko-base AS kaniko-warmer COPY --from=builder /src/out/warmer /kaniko/warmer ENTRYPOINT ["/kaniko/warmer"] FROM kaniko-base AS kaniko-executor COPY --from=builder /src/out/executor /kaniko/executor ENTRYPOINT ["/kaniko/executor"] FROM kaniko-executor AS kaniko-debug ENV PATH /usr/local/bin:/kaniko:/busybox COPY --from=builder /src/out/warmer /kaniko/warmer COPY --from=busybox /bin /busybox # Declare /busybox as a volume to get it automatically in the path to ignore VOLUME /busybox RUN ["/busybox/mkdir", "-p", "/bin"] RUN ["/busybox/ln", "-s", "/busybox/sh", "/bin/sh"] FROM kaniko-base-slim AS kaniko-slim COPY --from=builder /src/out/executor /kaniko/executor ENTRYPOINT ["/kaniko/executor"] ================================================ FILE: docs/design_proposals/design-proposal-template.md ================================================ # Title * Author(s): \ * Reviewers: \ If you are already working with someone mention their name. If not, please leave this empty, some one from the core team with assign it to themselves. * Date: \ * Status: [Reviewed/Cancelled/Under implementation/Complete] Here is a brief explanation of the Statuses 1. Reviewed: The proposal PR has been accepted, merged and ready for implementation. 2. Under implementation: An accepted proposal is being implemented by actual work. Note: The design might change in this phase based on issues during implementation. 3. Cancelled: During or before implementation the proposal was cancelled. It could be due to: * other features added which made the current design proposal obsolete. * No longer a priority. 4. Complete: This feature/change is implemented. ## Background In this section, please mention and describe the new feature, redesign or refactor. Please provide a brief explanation for the following questions: 1. Why is this required? 2. If this is a redesign, what are the drawbacks of the current implementation? 3. Is there any another workaround, and if so, what are its drawbacks? 4. Mention related issues, if there are any. Here is an example snippet for an enhancement: ___ Currently, Kaniko includes `build-args` when calculating layer cache key even if they are not used in the corresponding dockerfile command. This causes a 100% cache miss rate even if the layer contents are same. Change layer caching to include `build-args` in cache key computation only if they are used in command. ___ ## Design Please describe your solution. Please list any: * new command line flags * interface changes * design assumptions ### Open Issues/Questions Please list any open questions here in the following format: **\** Resolution: Please list the resolution if resolved during the design process or specify __Not Yet Resolved__ ## Implementation plan As a team, we've noticed that larger PRs can go unreviewed for long periods of time. Small incremental changes get reviewed faster and are also easier for reviewers. ___ ## Integration test plan Please describe what new test cases you are going to consider. ================================================ FILE: docs/design_proposals/filesystem-resolution-proposal-01.md ================================================ # Filesystem Resolution 01 * Author(s): cgwippern@google.com * Reviewers: Tejal Desai * Date: 2020-02-12 * Status: Reviewed ## Background Kaniko builds Docker image layers as overlay filesystem layers; specifically it creates a tar file which contains the entire content of a given layer in the overlay filesystem. Each overlay layer corresponds to one image layer. Overlay filesystems should only contain the objects changed in each layer; meaning that if only one file changes between some layer A and some B, layer B would only contain a single file (the one that changed). To accomplish this, Kaniko walks the entire filesystem to discover every object. Some of these objects may actually be a symlink to another object in the filesystem; in these cases we must consider both the link and the target object. Kaniko also maintains a set of ignored (aka ignored) filepaths. Any object which matches one of these filepaths should be ignored by kaniko. This results in a 3 dimensional search space * changed relative to previous layer * symlink * whitelisted Kaniko must also track which objects are referred to by multiple stages; this functionality is out of scope for this proposal. This search space is currently managed in an inconsistent and somewhat ad-hoc way; code that manages the various search dimensions is spread out and duplicated. There are also a number of edge cases which continue to cause bugs. The search space dimensions cannot be reduced or substituted. Currently there are a number of bugs around symlinks incorrectly resolved, whitelists not respected, and unchanged files added to layers. ## Design During snapshotting, filepaths should be resolved using a consitent API which takes into account both symlinks and whitelist. * Callers of this API should not be concerned with the type of object at a given filepath (e.g. symlink or not). * Callers of this API should not be concerned with whether a given path is whitelisted. * This API should return a set of filepaths which can be checked for changes without further link resolution or whitelist checking. The API should take a limited set of arguments * A list of absolute filepaths to scan * The whitelist The API should return only two arguments * A set of filepaths * error or nil The signature of the API should look similar to ``` ResolveFilePaths(inputPaths []string, whitelist []WhitelistEntry) (resolvedPaths []string, err error) ``` The API will iterate over the set of filepaths and for each item * check whether it is whitelisted; if it is, skip it * check whether it is a symlink * if it is a symlink * resolve the link ancestor (nearest ancestor which is a symlink) and the target * add the link ancestor to the output * check whether the target is whitelisted and if not add the target to the output All ancestors of each filepath will also be added to the list, but the previous checks will not be applied to the ancestors. This maintains the current behavior which we believe is needed to maintain correct permissions on the ancestor directories. ### Open Issues/Questions \ Given some link `/foo/link/bar` whose target is a whitelisted path such as `/var/run`, should `/foo/link/bar` be added to the layer? Resolution: Resolved Yes, it should be added. \ According to [this comment](https://github.com/GoogleContainerTools/kaniko/blob/1e9f525509d4e6a066a6e07ab9afbef69b3a3b2c/pkg/snapshot/snapshot.go#L193) the ancestor directories (parent, grandparent, etc) must also be added to the layer to preserve the permissions on those directories. This brings into question whether any filtering needs to happen on these ancestors. IIUC the current whitelist logic it is possible for `/some/dir` to be whitelisted but not `/some/dir/containing-a-file.txt`. If filtering needs to be applied to these ancestors does it make most sense to handle this within the proposed filtering API? Resolution: Resolved Yes, this should be handled in the API \ The proposal currently states that the list of files returned from the API should be immediately added to the layer, but this would imply that diff'ing existing files, finding newly created files, and handling deleted files would have already been done. It may be advantageous to handle these outside of the API in order to reduce scope and complexity. If these are handled outside of the API how can we decouple and encapsulate these two functions? Resolution: Resolved The API will not handle file diffing or whiteouts. ## Implementation plan * Write the new API * Write tests for the new API * Integrate the new API into existing code ## Integration test plan Add integration tests to the existing suite which cover the known bugs ## Notes Given some path `/usr/lib/foo` which is a link to `/etc/foo/` And `/etc/foo` contains `/etc/foo/bar.txt` Adding a link `/usr/lib/foo/bar.txt` => `/etc/foo/bar.txt` will break the image In a linux shell this raises an error ``` $ ls /usr/lib/bar => /usr/lib/bar/foo.txt $ ln -s /usr/lib/bar barlink $ ln -s /usr/lib/bar/foo.txt barlink/foo.txt => ERROR ``` Given some path `/usr/foo/bar` which is a link to `/dev/null`, and `/dev` is whitelisted `/dev/null` should not be added to the image. ================================================ FILE: docs/designdoc.md ================================================ # Kaniko Design Doc _Authors: [priyawadhwa@google.com](mailto:priyawadhwa@google.com), [dlorenc@google.com](mailto:dlorenc@google.com)_ [TOC] ## Objective {#objective} Kaniko aims to build container images, with enough Dockerfile support to be useful, without a dependency on a Docker daemon. There is nothing preventing us from adding full support other than the up-front engineering burden, but we'll know we're done when our customers are happy to use this in place of Docker. This will enable building container images in environments that cannot run a Docker daemon, such as a Kubernetes cluster (where kernel privileges are unappealing). ## Background {#background} Currently, building a container image in a cluster can't be done safely with Docker because the Docker daemon requires privileged access. Despite no solution existing for arbitrary container images and arbitrary clusters, some workarounds exist today if users don't need full Dockerfile support or the ability to run in an arbitrary cluster with no extra privileges allowed. This Kubernetes [issue](https://github.com/kubernetes/kubernetes/issues/1806) outlines many problems and other use-cases. ## Design Overview {#design-overview} Kaniko is an open source tool to build container images from a Dockerfile in a Kubernetes cluster without using Docker. The user provides a Dockerfile, source context, and destination for the built image, and kaniko will build the image and push it to the desired location. This will be accomplished as follows: 1. The user will provide a Dockerfile, source context and destination for the image via a command line tool or API 1. The builder executable will run inside a container with access to the Dockerfile and source context supplied by the user (either as an Container Builder build step or Kubernetes Job) 1. The builder executable will parse the Dockerfile, and extract the filesystem of the base image (the image in the FROM line of the Dockerfile) to root. It will then execute each command in the Dockerfile, snapshotting the filesystem after each one. Snapshots will be saved as tarballs, and then appended to the base image as layers to build the final image and push it to a registry. ## Detailed Design {#detailed-design} ### Builder executable {#builder-executable} The builder executable is responsible for parsing the Dockerfile, executing the commands within the Dockerfile, and building the final image. It first extracts the base image filesystem to root (the base image is the image declared in the FROM line of the Dockerfile). Next, it parses the Dockerfile, and executes each command in the Dockerfile in sequence. After executing each command, the executable will snapshot the filesystem, storing any changes in a tarball, which will be a layer in the final image. Once every command has been executed, the executable will append the new layers to the base image, and push the new image to the specified destination. ### Snapshotting {#snapshotting} Snapshotting the filesystem can be done by checksumming every file in the image before command execution (including permission, mode and timestamp bits), then comparing these to the checksums after the command is executed. Files that have different checksums after (including files that have been deleted) need to be added to that layer's differential tarball. This system mimics the behavior of `overlay` or `snapshotting` filesystems by moving the diffing operation into user-space. This will obviously result in lower performance than a real snapshotting filesystem, but some benchmarks show that this overhead is negligible when compared to the commands executed in a typical build. A snapshot of the entire Debian filesystem takes around .5s, unoptimized. The tradeoff here is portability - a userspace snapshotter can execute in any storage driver or container runtime. The following directories and files will be excluded from snapshotting. `workspace` is created by kaniko to store the builder executable and the Dockerfile. The other directories are injected by the Docker daemon or Kubernetes and can be ignored. * `/workspace` * `/dev` * `/sys` * `/proc` * `/var/run/secrets` * `/etc/hostname, /etc/hosts, /etc/mtab, /etc/resolv.conf` * `/.dockerenv` These directories and files can be dynamically discovered via introspection of the /proc/self/mountinfo file, allowing the build to run in more environments without manual whitelisting of directories. #### Whitelisting from /proc/self/mountinfo Documentation for /proc/self/mountinfo can be found [here](https://www.kernel.org/doc/Documentation/filesystems/proc.txt), in section 3.5. This file contains information about mounted directories, which we want to ignore when snapshotting. Each line in the file is in the form: ``` 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue (1)(2)(3) (4) (5) (6) (7) (8)(9) (10) (11) ``` Where (5) is the mount point relative to the process's root. We can parse the file line by line, storing the relative mount point in a whitelist array as we go. #### Ptrace Optimizations The above discussed snapshotting can be thought of as a "naive" approach, examining the contents of every file after every command. Several optimizations to this are possible, including using the [ptrace(2)](http://man7.org/linux/man-pages/man2/ptrace.2.html) syscall to monitor what files are actually manipulated by the command. A rough proof of concept of this approach is available at github.com/dlorenc/ptracer. It works as follows: 1. Setup ptrace to intercept syscalls from specified RUN commands. 1. Intercept syscalls that open file descriptors ([open(2), openat(2), creat(2)](http://man7.org/linux/man-pages/man2/open.2.html)) 1. Parse the syscall arguments out of the registers using PTRACE_GETREGS, PTRACE_PEEK_DATA/TEXT and the x86_64 syscall tables. 1. Resolve the paths/FDs to filenames using the process's working directory/state This can help limit the number of files that need to be examined for changes after each command. ### Dockerfile Commands {#dockerfile-commands} There are approximately [18 supported Dockerfile commands](https://docs.docker.com/engine/reference/builder/#from), many of which only operate on container metadata. The full set of commands is outlined below, but only "interesting" ones are detailed more thoroughly.
Command Description
FROM Used to unpack the initial (and subsequent base images for the mutli-step case).
RUN The command will be run, with shell prepending, and the FS snapshotted after each command.
CMD, ENTRYPOINT, LABEL, MAINTAINER, EXPOSE, VOLUME, STOPSIGNAL, HEALTHCHECK Metadata-only operations.
ENV, WORKDIR, USER, SHELL Mostly metadata only - Variables must also be applied to the build environment at the proper time for use in subsequent RUN commands.
ADD/COPY Files will be copied out of the build context and into the build environment. For multi-step builds, filesu will be saved from the previous build environment so they can be copied into later steps.
ARG ARG variables will be supplied to the build executable and substituted in appropriately during parsing.
### Source Context {#source-context} The source context can be provided as a local directory, which will be uploaded to a GCS bucket. Like [skaffold](https://github.com/GoogleContainerTools/skaffold), we could potentially parse the Dockerfile for dependencies and upload only the files we need to save time. Other possible source contexts include Git repositories or pre-packaged tarball contexts. ### Permissions in the Kubernetes cluster {#permissions-in-the-kubernetes-cluster} The Kubernetes cluster will require permission to push images to the desired registry, which will be accomplished with Secrets. ## User Experience {#user-experience} Kaniko will initially be packaged in a few formats, detailed below: * An Container Builder build step container * A command line tool for use with Kubernetes clusters ### Container Builder Build Step Container {#Container Builder-build-step-container} This container will surface an API as similar to the standard "docker build" step as possible, with changes required for the implicit "docker push". This container will expect the context to already be unpacked, and take an optional path to a Dockerfile. Authorization will be provided by Container Builder's spoofed metadata server, which provides the Container builder robot's credentials. The surface will be roughly: ``` steps: - name: 'gcr.io/some-project/kaniko args: ['build-and-push', '-t', 'NAME_OF_IMAGE', '-f', 'PATH_TO_DOCKERFILE'] # no images: stanza, image was pushed by kaniko ``` ### Command Line Tool {#command-line-tool} ``` $ kaniko --dockerfile= --context= --name= ``` The --context parameter will default to the directory of the specified dockerfile. Using a command line tool, the user will provide a Dockerfile from which the resulting image will be built, a source context, and the full name of the registry the image should be pushed to. The command line tool will upload the source context to a GCS bucket, so that it can be accessed later on (for example, when carrying out ADD/COPY command in the Dockerfile). #### Kubernetes Job {#kubernetes-job} The command line tool will then generate a Kubernetes `v1/batch Job` from the information the user has provided. The spec is shown below: ``` apiVersion: batch/v1 kind: Job metadata: name: kaniko-build spec: template: spec: containers: - name: init-static image: gcr.io/priya-wadhwa/kaniko:latest volumeMounts: - name: dockerfile mountPath: /dockerfile command: ["/work-dir/main"] restartPolicy: Never volumes: - name: dockerfile configMap: - name: build-dockerfile items: key: dockerfile data: "dockerfile contents" ``` The Job specifies one container to run, called the init-static container. This container is based off of the distroless base image, and contains a Go builder executable and some additional files necessary for authentication. The entrypoint of the image is the builder executable, which allows the executable to examine the filesystem of the image and execute commands in this mount namespace. ## Alternative Solutions {#alternative-solutions} ### Docker Socket Mounting This solution involves volume mounting the host Docker socket into the pod, essentially giving the pod full root access on the machine. This gives containers in the Pod the ability to create, delete and modify other containers running on the same node. See below for an example configuration that uses hostPath to mount the Docker socket into a pod: ``` apiVersion: v1 kind: Pod metadata: name: docker spec: containers: - image: docker command: ["docker", "ps"] name: docker volumeMounts: - name: dockersock mountPath: /var/run/ volumes: - name: dockersock hostPath: path: /var/run/ ``` This is similar to how Cloud Build exposes a Docker daemon to users. This is a security problem and a leaky abstraction - containers in a cluster should **not** know about the container runtime of the node they are running on. This would prevent a Pod from being able to run on a node backed by an alternate CRI implementation, or even a virtual kubelet. ### Docker-in-Docker {#docker-in-docker} See [jpetazzo/dind](https://github.com/jpetazzo/dind) for instructions and a more thorough explanation of this approach. This approach runs a second Docker daemon inside a container, running inside the node's Docker daemon. Docker and cgroups don't handle nesting particularly well, which can lead to bugs and strange behavior. This approach also requires the `--privileged` flag on the outer container. While this is supported in Kubernetes, it must be explicitly allowed by each node's configuration before a node will accept privileged containers. ### FTL/Bazel {#ftl-bazel} These solutions aim to improve DevEx by achieving the fastest possible creation of Docker images, at the expense of build compatibility. By restricting the set of allowed builds to an optimizable subset, we get the nice side effect of being able to run without privileges inside an arbitrary cluster. These approaches can be thought of as special-case "fast paths" that can be used in conjunction with the support for general Dockerfile builds outlined above. ================================================ FILE: docs/testplan.md ================================================ # Kaniko Test Plan ## What do we want to test? * The basic premise is to build the same Dockerfile, both through docker then through kaniko, then compare the resulting images. The goal is for the images to be identical, for some definition of identical, defined below. ## What are the testing priorities? * Speed / Parallelization * We can build all the docker-built images and the kaniko-built images in parallel using Argo. Once everything is built, we can compare each respective image using container-diff (see what's "good enough" below). Once the newest container-diff release goes out, we'll be able to compare metadata as well and will no longer need to use container-structure-test, and the necessity to differentiate between types of tests will no longer exist. * Clear error messages * Currently each test is an argo build test that runs a container-diff check after both images are built. If one of the test fails, the entire test halts and we get a cryptic Argo error message. By building everything first then comparing, we're in charge of what error gets displayed on failure and we can run all the tests instead of halting at first failure. * Easy of use / Ability to read and add tests * The goal is to able to add a test to the suite by just adding a Dockerfile to a directory. The test will scan the directory for Dockerfiles and generate a test for each file. It will assume container-diff needs to return nothing by default, which can be overridden if needed (e.g. config_test_run.json). We should also be able to test any individual Dockerfile. * Thorough testing of each command * Each command currently implemented by Kaniko should have its own Dockerfile (and therefore its own test). As bugs come in and get fixed, we should be able to just add a new Dockerfile testing the bug and watch it pass. ## What's "good enough?" * Container-diff doesn't give us enough granularity since it only checks the resulting file system and metadata, without checking the layers themselves. If we add the ability to check each layer of both images side-by-side to container-diff, we could determine whether they are the same of not with confidence, * We can potentially verify checksums of either the layers or the entire image as well. ## How are we going to do this? * Our current integration tests use` go test `to generate an Argo yaml. This yaml loops through each Dockerfile, builds it with docker and with Kaniko in parallel, then uses container-diff to test the two resulting images. If container-diff returns something unexpected, Argo exits and the entire test halts. * The plan is to use go subtests. * Setup will be building all the images at once (or if a specific test is requested, just build the two images for that specific Dockerfile). * Then for each Dockerfile, invoke container-diff. If that succeeds, unpack each image tarball (this means we either need to push both images up to GCR or to docker save them at build time. I don't see a specific advantage to either) and inspect the layers. * If we pass, add it to the list of passing tests. * If we fail, specify which Dockerfile failed, and exactly what differs. * Teardown will be deleting all generated images. ## What about testing on-cluster builds? * We should be able to have a test Kubernetes cluster that can spin up pods for each Dockerfile. This will achieve everything we want for the tests while testing our main Kaniko use case. ## Should we use this in CI? * In order to reliably use this in Travis (or any other CI system), we need to separate Dockerfiles that result in non-reproducible image into a separate smoke test category. They need to be tested, but having them in CI doesn't make sense. ================================================ FILE: docs/tutorial.md ================================================ # Getting Started Tutorial This tutorial is for beginners who want to start using kaniko and aims to establish a quick start test case. ## Table of Content 1. [Prerequisities](#Prerequisities) 2. [Prepare config files for kaniko](#Prepare-config-files-for-kaniko) 3. [Prepare the local mounted directory](#Prepare-the-local-mounted-directory) 4. [Create a Secret that holds your authorization token](#Create-a-Secret-that-holds-your-authorization-token) 5. [Create resources in kubernetes](#Create-resources-in-kubernetes) 6. [Pull the image and test](#Pull-the-image-and-test) ## Prerequisities - A Kubernetes Cluster. You could use [Minikube](https://kubernetes.io/docs/setup/minikube/) to deploy kubernetes locally, or use kubernetes service from cloud provider like [Azure Kubernetes Service](https://azure.microsoft.com/en-us/services/kubernetes-service/). - A [dockerhub](https://hub.docker.com/) account to push built image public. ## Prepare config files for kaniko Prepare several config files to create resources in kubernetes, which are: - [pod.yaml](../examples/pod.yaml) is for starting a kaniko container to build the example image. - [volume.yaml](../examples/volume.yaml) is for creating a persistent volume used as kaniko build context. - [volume-claim.yaml](../examples/volume-claim.yaml) is for creating a persistent volume claim which will mounted in the kaniko container. ## Prepare the local mounted directory SSH into the cluster, and create a local directory which will be mounted in kaniko container as build context. Create a simple dockerfile there. > Note: To ssh into cluster, if you use minikube, you could use `minikube ssh` command. If you use cloud service, please refer to official doc, such as [Azure Kubernetes Service](https://docs.microsoft.com/en-us/azure/aks/ssh#code-try-0). ```shell $ mkdir kaniko && cd kaniko $ echo 'FROM ubuntu' >> dockerfile $ echo 'ENTRYPOINT ["/bin/bash", "-c", "echo hello"]' >> dockerfile $ cat dockerfile FROM ubuntu ENTRYPOINT ["/bin/bash", "-c", "echo hello"] $ pwd /home//kaniko # copy this path in volume.yaml file ``` > Note: It is important to notice that the `hostPath` in the volume.yaml need to be replaced with the local directory you created. ## Create a Secret that holds your authorization token A Kubernetes cluster uses the Secret of docker-registry type to authenticate with a docker registry to push an image. Create this Secret, naming it regcred: ```shell kubectl create secret docker-registry regcred --docker-server= --docker-username= --docker-password= --docker-email= ``` - `` is your Private Docker Registry FQDN. (https://index.docker.io/v1/ for DockerHub) - `` is your Docker username. - `` is your Docker password. - `` is your Docker email. This secret will be used in pod.yaml config. ## Create resources in kubernetes ```shell # create persistent volume $ kubectl create -f volume.yaml persistentvolume/dockerfile created # create persistent volume claim $ kubectl create -f volume-claim.yaml persistentvolumeclaim/dockerfile-claim created # check whether the volume mounted correctly $ kubectl get pv dockerfile NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE dockerfile 10Gi RWO Retain Bound default/dockerfile-claim local-storage 1m # create pod $ kubectl create -f pod.yaml pod/kaniko created $ kubectl get pods NAME READY STATUS RESTARTS AGE kaniko 0/1 ContainerCreating 0 7s # check whether the build complete and show the build logs $ kubectl get pods NAME READY STATUS RESTARTS AGE kaniko 0/1 Completed 0 34s $ kubectl logs kaniko ➜ kubectl logs kaniko INFO[0000] Resolved base name ubuntu to ubuntu INFO[0000] Resolved base name ubuntu to ubuntu INFO[0000] Downloading base image ubuntu INFO[0000] Error while retrieving image from cache: getting file info: stat /cache/sha256:1bbdea4846231d91cce6c7ff3907d26fca444fd6b7e3c282b90c7fe4251f9f86: no such file or directory INFO[0000] Downloading base image ubuntu INFO[0001] Built cross stage deps: map[] INFO[0001] Downloading base image ubuntu INFO[0001] Error while retrieving image from cache: getting file info: stat /cache/sha256:1bbdea4846231d91cce6c7ff3907d26fca444fd6b7e3c282b90c7fe4251f9f86: no such file or directory INFO[0001] Downloading base image ubuntu INFO[0001] Skipping unpacking as no commands require it. INFO[0001] Taking snapshot of full filesystem... INFO[0001] ENTRYPOINT ["/bin/bash", "-c", "echo hello"] ``` > Note: It is important to notice that the `destination` in the pod.yaml need to be replaced with your own. ## Pull the image and test If as expected, the kaniko will build image and push to dockerhub successfully. Pull the image to local and run it to test: ```shell $ sudo docker run -it / Unable to find image 'debuggy/helloworld:latest' locally latest: Pulling from debuggy/helloworld 5667fdb72017: Pull complete d83811f270d5: Pull complete ee671aafb583: Pull complete 7fc152dfb3a6: Pull complete Digest: sha256:2707d17754ea99ce0cf15d84a7282ae746a44ff90928c2064755ee3b35c1057b Status: Downloaded newer image for debuggy/helloworld:latest hello ``` Congratulation! You have gone through the hello world successfully, please refer to project for more details. ================================================ FILE: examples/kaniko-cache-claim.yaml ================================================ kind: PersistentVolumeClaim apiVersion: v1 metadata: name: kaniko-cache-claim spec: storageClassName: manual accessModes: - ReadOnlyMany resources: requests: storage: 8Gi ================================================ FILE: examples/kaniko-cache-volume.yaml ================================================ kind: PersistentVolume apiVersion: v1 metadata: name: kaniko-cache-volume labels: type: local spec: storageClassName: manual capacity: storage: 10Gi accessModes: - ReadOnlyMany hostPath: path: "/tmp/kaniko-cache" ================================================ FILE: examples/kaniko-test.yaml ================================================ apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest args: ["--dockerfile=", "--context=", "--destination=", "--cache", "--cache-dir=/cache"] volumeMounts: - name: kaniko-secret mountPath: /secret - name: kaniko-cache mountPath: /cache env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /secret/kaniko-secret.json restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: kaniko-secret - name: kaniko-cache persistentVolumeClaim: claimName: kaniko-cache-claim ================================================ FILE: examples/kaniko-warmer.yaml ================================================ apiVersion: v1 kind: Pod metadata: name: kaniko-warmer spec: containers: - name: kaniko-warmer image: gcr.io/kaniko-project/warmer:latest args: ["--cache-dir=/cache", "--image=gcr.io/google-appengine/debian9"] volumeMounts: - name: kaniko-secret mountPath: /secret - name: kaniko-cache mountPath: /cache env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /secret/kaniko-secret.json restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: kaniko-secret - name: kaniko-cache persistentVolumeClaim: claimName: kaniko-cache-claim ================================================ FILE: examples/pod-blobstorage.yaml ================================================ apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest args: ["--dockerfile=", "--context=https://myaccount.blob.core.windows.net/container/path/to/context.tar.gz", "--destination="] ... env: - name: AZURE_STORAGE_ACCESS_KEY valueFrom: secretKeyRef: name: azure-storage-access-key key: azure-storage-access-key ... volumes: - name: azure-storage-access-key secret: secretName: azure-storage-access-key ================================================ FILE: examples/pod-build-profile.yaml ================================================ apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:debug lifecycle: preStop: exec: command: ["/bin/sh","-c","cat $STACKLOG_PATH"] env: - name: STACKLOG_PATH value: /workspace/kaniko.slog args: ["--dockerfile=/workspace/dockerfile", "--context=dir://workspace", "--destination=/"] # replace with your dockerhub account volumeMounts: - name: kaniko-secret mountPath: /kaniko/.docker - name: dockerfile-storage mountPath: /workspace restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: regcred items: - key: .dockerconfigjson path: config.json - name: dockerfile-storage persistentVolumeClaim: claimName: dockerfile-claim ================================================ FILE: examples/pod.yaml ================================================ apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: gcr.io/kaniko-project/executor:latest args: ["--dockerfile=/workspace/dockerfile", "--context=dir://workspace", "--destination=/"] # replace with your dockerhub account volumeMounts: - name: kaniko-secret mountPath: /kaniko/.docker - name: dockerfile-storage mountPath: /workspace restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: regcred items: - key: .dockerconfigjson path: config.json - name: dockerfile-storage persistentVolumeClaim: claimName: dockerfile-claim ================================================ FILE: examples/volume-claim.yaml ================================================ kind: PersistentVolumeClaim apiVersion: v1 metadata: name: dockerfile-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 8Gi storageClassName: local-storage ================================================ FILE: examples/volume.yaml ================================================ apiVersion: v1 kind: PersistentVolume metadata: name: dockerfile labels: type: local spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce storageClassName: local-storage hostPath: path: # replace with local directory, such as "/home//kaniko" ================================================ FILE: files/nsswitch.conf ================================================ # /etc/nsswitch.conf # # As described on the web page https://man7.org/linux/man-pages/man3/gethostbyname.3.html, # without the nsswitch.conf file, the gethostbyname() and gethostbyaddr() domain queries # will fail to a local name server, thus the /etc/hosts will take no effect. # # For example, when hostaliases are specified for a kubernetes pod, without proper settings # defined in this file, the hostaliases settings will not take effect. # # Following contents of this file is from the ubuntu:16.04 docker image. passwd: compat group: compat shadow: compat gshadow: files hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis ================================================ FILE: go.mod ================================================ module github.com/GoogleContainerTools/kaniko go 1.24.0 require ( cloud.google.com/go/storage v1.54.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 github.com/aws/aws-sdk-go-v2 v1.36.3 github.com/aws/aws-sdk-go-v2/config v1.29.14 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.75 github.com/aws/aws-sdk-go-v2/service/s3 v1.79.3 github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.9.1 github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 github.com/docker/docker v28.1.1+incompatible github.com/go-git/go-billy/v5 v5.6.2 github.com/go-git/go-git/v5 v5.16.0 github.com/golang/mock v1.6.0 github.com/google/go-cmp v0.7.0 github.com/google/go-containerregistry v0.20.4 github.com/google/go-github v17.0.0+incompatible github.com/google/slowjam v1.1.2 github.com/karrick/godirwalk v1.17.0 github.com/minio/highwayhash v1.0.3 github.com/moby/buildkit v0.22.0 github.com/otiai10/copy v1.14.1 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/afero v1.14.0 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 golang.org/x/net v0.40.0 golang.org/x/oauth2 v0.30.0 golang.org/x/sync v0.14.0 ) require ( github.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22 github.com/containerd/containerd v1.7.27 ) require github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect require ( cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/compute/metadata v0.7.0 // indirect cloud.google.com/go/iam v1.5.2 // indirect github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.30 // indirect github.com/Azure/go-autorest/autorest/adal v0.9.24 // indirect github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 // indirect github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 // indirect github.com/Azure/go-autorest/autorest/date v0.3.1 // indirect github.com/Azure/go-autorest/logger v0.2.2 // indirect github.com/Azure/go-autorest/tracing v0.6.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v1.2.0 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 // indirect github.com/aws/smithy-go v1.22.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/containerd/continuity v0.4.5 // indirect github.com/containerd/fifo v1.1.0 // indirect github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect github.com/docker/cli v28.1.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect github.com/docker/docker-credential-helpers v0.9.3 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-events v0.0.0-20250114142523-c867878c5e32 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ePirat/docker-credential-gitlabci v1.0.0 github.com/emirpasic/gods v1.18.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/gax-go/v2 v2.14.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-memdb v1.3.5 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/patternmatcher v0.6.0 github.com/moby/sys/mount v0.3.4 // indirect github.com/moby/sys/mountinfo v0.7.2 // indirect github.com/moby/sys/sequential v0.6.0 // indirect github.com/moby/sys/signal v0.7.1 github.com/moby/sys/symlink v0.3.0 // indirect github.com/moby/term v0.5.2 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/opencontainers/runtime-spec v1.2.1 // indirect github.com/opencontainers/selinux v1.12.0 // indirect github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.64.0 // indirect github.com/prometheus/procfs v0.16.1 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/vbatts/tar-split v0.12.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.etcd.io/etcd/raft/v3 v3.5.21 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/crypto v0.38.0 // indirect golang.org/x/sys v0.33.0 golang.org/x/text v0.25.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/api v0.233.0 google.golang.org/genproto v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/grpc v1.72.1 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect ) require ( cel.dev/expr v0.24.0 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect dario.cat/mergo v1.0.2 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/Microsoft/hcsshim v0.13.0 // indirect github.com/aws/aws-sdk-go-v2/service/ecr v1.44.0 // indirect github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect github.com/containerd/cgroups/v3 v3.0.5 // indirect github.com/containerd/containerd/api v1.9.0 // indirect github.com/containerd/containerd/v2 v2.1.1 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v1.0.0-rc.1 // indirect github.com/containerd/plugin v1.0.0 // indirect github.com/containerd/ttrpc v1.2.7 // indirect github.com/containerd/typeurl/v2 v2.2.3 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-jose/go-jose/v4 v4.1.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/subcommands v1.2.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/go-archive v0.1.0 // indirect github.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554 // indirect github.com/moby/sys/atomicwriter v0.1.0 // indirect github.com/moby/sys/reexec v0.1.0 // indirect github.com/moby/sys/user v0.4.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/otiai10/mint v1.6.3 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pjbgf/sha1cd v0.3.2 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/skeema/knownhosts v1.3.1 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/viper v1.18.2 // indirect github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 // indirect github.com/toqueteos/webbrowser v1.2.0 // indirect github.com/zeebo/errs v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect go.opentelemetry.io/otel v1.36.0 // indirect go.opentelemetry.io/otel/metric v1.36.0 // indirect go.opentelemetry.io/otel/sdk v1.36.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect go.opentelemetry.io/otel/trace v1.36.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) ================================================ FILE: go.sum ================================================ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw= cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/storage v1.54.0 h1:Du3XEyliAiftfyW0bwfdppm2MMLdpVAfiIg4T2nAI+0= cloud.google.com/go/storage v1.54.0/go.mod h1:hIi9Boe8cHxTyaeqh7KMMwKg088VblFK46C2x/BWaZE= cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0 h1:LR0kAX9ykz8G4YgLCaRDVJ3+n43R8MneB5dTy2konZo= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0/go.mod h1:DWAciXemNf++PQJLeXUB4HHH5OpsAh12HZnu2wXE1jA= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 h1:lhZdRq7TIx0GJQvSyX2Si406vrYsov2FXGp/RnSEtcs= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1/go.mod h1:8cl44BDmi+effbARHMQjgOKA2AYvcohNm7KEt42mSV8= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= github.com/Azure/go-autorest/autorest v0.11.30 h1:iaZ1RGz/ALZtN5eq4Nr1SOFSlf2E4pDI3Tcsl+dZPVE= github.com/Azure/go-autorest/autorest v0.11.30/go.mod h1:t1kpPIOpIVX7annvothKvb0stsrXa37i7b+xpmBW8Fs= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= github.com/Azure/go-autorest/autorest/adal v0.9.24 h1:BHZfgGsGwdkHDyZdtQRQk1WeUdW0m2WPAwuHZwUi5i4= github.com/Azure/go-autorest/autorest/adal v0.9.24/go.mod h1:7T1+g0PYFmACYW5LlG2fcoPiPlFHjClyRGL7dRlP5c8= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 h1:Q9R3utmFg9K1B4OYtAZ7ZUUvIUdzQt7G2MN5Hi/d670= github.com/Azure/go-autorest/autorest/azure/cli v0.4.7/go.mod h1:bVrAueELJ0CKLBpUHDIvD516TwmHmzqwCpvONWRsw3s= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/date v0.3.1 h1:o9Z8Jyt+VJJTCZ/UORishuHOusBwolhjokt9s5k8I4w= github.com/Azure/go-autorest/autorest/date v0.3.1/go.mod h1:Dz/RDmXlfiFFS/eW+b/xMUSFs1tboPVy6UjgADToWDM= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/logger v0.2.2 h1:hYqBsEBywrrOSW24kkOCXRcKfKhK76OzLTfF+MYDE2o= github.com/Azure/go-autorest/logger v0.2.2/go.mod h1:I5fg9K52o+iuydlWfa9T5K6WFos9XYr9dYTFzpqgibw= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/Azure/go-autorest/tracing v0.6.1 h1:YUMSrC/CeD1ZnnXcNYU4a/fzsO35u2Fsful9L/2nyR0= github.com/Azure/go-autorest/tracing v0.6.1/go.mod h1:/3EgjbsjraOqiicERAeu3m7/z0x1TzjQGAwDrJrXGkc= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22 h1:HevuUpLsTedep2D6wnIp6AAJbVgP0BiVxaMt3HXeOyA= github.com/GoogleCloudPlatform/docker-credential-gcr/v2 v2.1.22/go.mod h1:nzCpg7DFIIkQIZB3mdUPXVvqQ5f/GahA6xgWXTjnK7w= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= github.com/ProtonMail/go-crypto v1.2.0 h1:+PhXXn4SPGd+qk76TlEePBfOfivE0zkWFenhGhFLzWs= github.com/ProtonMail/go-crypto v1.2.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14= github.com/aws/aws-sdk-go-v2/config v1.29.14 h1:f+eEi/2cKCg9pqKBoAIwRGzVb70MRKqWX4dg1BDcSJM= github.com/aws/aws-sdk-go-v2/config v1.29.14/go.mod h1:wVPHWcIFv3WO89w0rE10gzf17ZYy+UVS1Geq8Iei34g= github.com/aws/aws-sdk-go-v2/credentials v1.17.67 h1:9KxtdcIA/5xPNQyZRgUSpYOE6j9Bc4+D7nZua0KGYOM= github.com/aws/aws-sdk-go-v2/credentials v1.17.67/go.mod h1:p3C44m+cfnbv763s52gCqrjaqyPikj9Sg47kUVaNZQQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.75 h1:S61/E3N01oral6B3y9hZ2E1iFDqCZPPOBoBQretCnBI= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.75/go.mod h1:bDMQbkI1vJbNjnvJYpPTSNYBkI/VIv18ngWb/K84tkk= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs= github.com/aws/aws-sdk-go-v2/service/ecr v1.44.0 h1:E+UTVTDH6XTSjqxHWRuY8nB6s+05UllneWxnycplHFk= github.com/aws/aws-sdk-go-v2/service/ecr v1.44.0/go.mod h1:iQ1skgw1XRK+6Lgkb0I9ODatAP72WoTILh0zXQ5DtbU= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.0 h1:wA2O6pZ2r5smqJunFP4hp7qptMW4EQxs8O6RVHPulOE= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.33.0/go.mod h1:RZL7ov7c72wSmoM8bIiVxRHgcVdzhNkVW2J36C8RF4s= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.1 h1:4nm2G6A4pV9rdlWzGMPv4BNtQp22v1hg3yrtkYpeLl8= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.1/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA= github.com/aws/aws-sdk-go-v2/service/s3 v1.79.3 h1:BRXS0U76Z8wfF+bnkilA2QwpIch6URlm++yPUt9QPmQ= github.com/aws/aws-sdk-go-v2/service/s3 v1.79.3/go.mod h1:bNXKFFyaiVvWuR6O16h/I1724+aXe/tAkA9/QS01t5k= github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8= github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY= github.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.9.1 h1:50sS0RWhGpW/yZx2KcDNEb1u1MANv5BMEkJgcieEDTA= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.9.1/go.mod h1:ErZOtbzuHabipRTDTor0inoRlYwbsV1ovwSxjGs/uJo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4= github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII= github.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0= github.com/containerd/containerd/api v1.9.0 h1:HZ/licowTRazus+wt9fM6r/9BQO7S0vD5lMcWspGIg0= github.com/containerd/containerd/api v1.9.0/go.mod h1:GhghKFmTR3hNtyznBoQ0EMWr9ju5AqHjcZPsSpTKutI= github.com/containerd/containerd/v2 v2.1.1 h1:znnkm7Ajz8lg8BcIPMhc/9yjBRN3B+OkNKqKisKfwwM= github.com/containerd/containerd/v2 v2.1.1/go.mod h1:zIfkQj4RIodclYQkX7GSSswSwgP8d/XxDOtOAoSDIGU= github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E= github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= github.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y= github.com/containerd/plugin v1.0.0/go.mod h1:hQfJe5nmWfImiqT1q8Si3jLv3ynMUIBB47bQ+KexvO8= github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ= github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/cli v28.1.1+incompatible h1:eyUemzeI45DY7eDPuwUcmDyDj1pM98oD5MdSpiItp8k= github.com/docker/cli v28.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v28.1.1+incompatible h1:49M11BFLsVO1gxY9UX9p/zwkE/rswggs8AdFmXQw51I= github.com/docker/docker v28.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-events v0.0.0-20250114142523-c867878c5e32 h1:EHZfspsnLAz8Hzccd67D5abwLiqoqym2jz/jOS39mCk= github.com/docker/go-events v0.0.0-20250114142523-c867878c5e32/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/ePirat/docker-credential-gitlabci v1.0.0 h1:YRkUSvkON6rT88vtscClAmPEYWhtltGEAuRVYtz1/+Y= github.com/ePirat/docker-credential-gitlabci v1.0.0/go.mod h1:Ptmh+D0lzBQtgb6+QHjXl9HqOn3T1P8fKUHldiSQQGA= github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.16.0 h1:k3kuOEpkc0DeY7xlL6NaaNg39xdgQbtH5mwCafHO9AQ= github.com/go-git/go-git/v5 v5.16.0/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY= github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.20.4 h1:w/Fdj3ef046SdV/GJU69cCnreaLpqbTo1X9XPyHbkd4= github.com/google/go-containerregistry v0.20.4/go.mod h1:Q14vdOOzug02bwnhMkZKD4e30pDaD9W65qzXpyzF49E= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/slowjam v1.1.2 h1:uAsv7r9f1TP5xwerte6OseOYbRur2y47jLGvn22dXk8= github.com/google/slowjam v1.1.2/go.mod h1:XGDJY4mZ5Y4BAi7itXRLZ0Hl/fcfNwx9iX06qCwZu1M= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.5 h1:b3taDMxCBCBVgyRrS1AZVHO14ubMYZB++QpNhBg+Nyo= github.com/hashicorp/go-memdb v1.3.5/go.mod h1:8IVKKBkVe+fxFgdFOYxzQQNjz+sWCyHCdIC/+5+Vy1Y= github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI= github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/buildkit v0.22.0 h1:aWN06w1YGSVN1XfeZbj2ZbgY+zi5xDAjEFI8Cy9fTjA= github.com/moby/buildkit v0.22.0/go.mod h1:j4pP5hxiTWcz7xuTK2cyxQislHl/N2WWHzOy43DlLJw= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554 h1:DMHJbgyNZWyrPKYjCYt2IxEO7KA0eSd4fo6KQsv2W84= github.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554/go.mod h1:mTTGIAz/59OGZR5Qe+QByIe3Nxc+sSuJkrsStFhr6Lg= github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= github.com/moby/sys/mount v0.3.4 h1:yn5jq4STPztkkzSKpZkLcmjue+bZJ0u2AuQY1iNI1Ww= github.com/moby/sys/mount v0.3.4/go.mod h1:KcQJMbQdJHPlq5lcYT+/CjatWM4PuxKe+XLSVS4J6Os= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= github.com/moby/sys/reexec v0.1.0 h1:RrBi8e0EBTLEgfruBOFcxtElzRGTEUkeIFaVXgU7wok= github.com/moby/sys/reexec v0.1.0/go.mod h1:EqjBg8F3X7iZe5pU6nRZnYCMUTXoxsjiIfHup5wYIN8= github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= github.com/moby/sys/signal v0.7.1 h1:PrQxdvxcGijdo6UXXo/lU/TvHUWyPhj7UOpSo8tuvk0= github.com/moby/sys/signal v0.7.1/go.mod h1:Se1VGehYokAkrSQwL4tDzHvETwUZlnY7S5XtQ50mQp8= github.com/moby/sys/symlink v0.3.0 h1:GZX89mEZ9u53f97npBy4Rc3vJKj7JBDj/PN2I22GrNU= github.com/moby/sys/symlink v0.3.0/go.mod h1:3eNdhduHmYPcgsJtZXW1W4XUJdZGBIkttZ8xKqPUJq0= github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8= github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U= github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4= github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 h1:2f304B10LaZdB8kkVEaoXvAMVan2tl9AiK4G0odjQtE= github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0/go.mod h1:278M4p8WsNh3n4a1eqiFcV2FGk7wE5fwUpUom9mK9lE= github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ= github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo= github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk= go.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.233.0 h1:iGZfjXAJiUFSSaekVB7LzXl6tRfEKhUN7FkZN++07tI= google.golang.org/api v0.233.0/go.mod h1:TCIVLLlcwunlMpZIhIp7Ltk77W+vUSdUKAAIlbxY44c= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20250519155744-55703ea1f237 h1:2zGWyk04EwQ3mmV4dd4M4U7P/igHi5p7CBJEg1rI6A8= google.golang.org/genproto v0.0.0-20250519155744-55703ea1f237/go.mod h1:LhI4bRmX3rqllzQ+BGneexULkEjBf2gsAfkbeCA8IbU= google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0= google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto= google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= ================================================ FILE: hack/.gitignore ================================================ bin ================================================ FILE: hack/boilerplate/boilerplate.Dockerfile.txt ================================================ # Copyright YEAR Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ================================================ FILE: hack/boilerplate/boilerplate.Makefile.txt ================================================ # Copyright YEAR Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ================================================ FILE: hack/boilerplate/boilerplate.go.txt ================================================ /* Copyright YEAR Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ ================================================ FILE: hack/boilerplate/boilerplate.py ================================================ #!/usr/bin/env python3 # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import print_function import argparse import glob import os import re import sys SKIPPED_DIRS = ["Godeps", "third_party", ".git", "vendor", "examples", "testdata"] SKIPPED_FILES = ["install_golint.sh"] parser = argparse.ArgumentParser() parser.add_argument("filenames", help="list of files to check, all files if unspecified", nargs='*') rootdir = os.path.dirname(__file__) + "/../" rootdir = os.path.abspath(rootdir) parser.add_argument("--rootdir", default=rootdir, help="root directory to examine") default_boilerplate_dir = os.path.join(rootdir, "/boilerplate") parser.add_argument("--boilerplate-dir", default=default_boilerplate_dir) args = parser.parse_args() def get_refs(): refs = {} for path in glob.glob(os.path.join(args.boilerplate_dir, "boilerplate.*.txt")): extension = os.path.basename(path).split(".")[1] ref_file = open(path, 'r') ref = ref_file.read().splitlines() ref_file.close() refs[extension] = ref return refs def file_passes(filename, refs, regexs): try: f = open(filename, 'r') except: return False data = f.read() f.close() basename = os.path.basename(filename) extension = file_extension(filename) if extension != "": ref = refs[extension] else: ref = refs[basename] # remove build tags from the top of Go files if extension == "go": p = regexs["go_build_constraints_go"] (data, found) = p.subn("", data, 1) if extension == "go": p = regexs["go_build_constraints"] (data, found) = p.subn("", data, 1) # remove shebang from the top of shell files elif extension == "sh": p = regexs["shebang"] (data, found) = p.subn("", data, 1) data = data.splitlines() # if our test file is smaller than the reference it surely fails! if len(ref) > len(data): return False # trim our file to the same number of lines as the reference file data = data[:len(ref)] p = regexs["year"] for d in data: if p.search(d): return False # Replace all occurrences of the date regex with "YEAR" p = regexs["date"] for i, d in enumerate(data): (data[i], found) = p.subn('YEAR', d) if found != 0: break # if we don't match the reference at this point, fail if ref != data: return False return True def file_extension(filename): return os.path.splitext(filename)[1].split(".")[-1].lower() def normalize_files(files): newfiles = [] for i, pathname in enumerate(files): if not os.path.isabs(pathname): newfiles.append(os.path.join(args.rootdir, pathname)) return newfiles def get_files(extensions): files = [] if len(args.filenames) > 0: files = args.filenames else: for root, dirs, walkfiles in os.walk(args.rootdir): for d in SKIPPED_DIRS: if d in dirs: dirs.remove(d) for name in walkfiles: if name not in SKIPPED_FILES: pathname = os.path.join(root, name) files.append(pathname) files = normalize_files(files) outfiles = [] for pathname in files: basename = os.path.basename(pathname) extension = file_extension(pathname) if extension in extensions or basename in extensions: outfiles.append(pathname) return outfiles def get_regexs(): regexs = {} # Search for "YEAR" which exists in the boilerplate, but shouldn't in the real thing regexs["year"] = re.compile( 'YEAR' ) # dates can be any year [2000-2099] company holder names can be anything regexs["date"] = re.compile( '(20\d\d)' ) # strip // go:build \n\n build constraints regexs["go_build_constraints_go"] = re.compile(r"^(//go\:build.*)+\n", re.MULTILINE) # strip // +build \n\n build constraints regexs["go_build_constraints"] = re.compile(r"^(// \+build.*\n)+\n", re.MULTILINE) # strip #!.* from shell scripts regexs["shebang"] = re.compile(r"^(#!.*\n)\n*", re.MULTILINE) return regexs def main(): regexs = get_regexs() refs = get_refs() filenames = get_files(refs.keys()) for filename in filenames: if not file_passes(filename, refs, regexs): print(filename, file=sys.stdout) if __name__ == "__main__": sys.exit(main()) ================================================ FILE: hack/boilerplate/boilerplate.py.txt ================================================ #!/usr/bin/env python3 # Copyright YEAR Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ================================================ FILE: hack/boilerplate/boilerplate.sh.txt ================================================ # Copyright YEAR Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ================================================ FILE: hack/boilerplate.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -e # Ignore these paths in the following tests. ignore="vendor\|out" BOILERPLATEDIR=./hack/boilerplate files=$(python3 ${BOILERPLATEDIR}/boilerplate.py --rootdir . --boilerplate-dir ${BOILERPLATEDIR}) # Grep returns a non-zero exit code if we don't match anything, which is good in this case. set +e relevant_files=$(echo "$files" | grep -v $ignore) set -e if [[ ! -z ${relevant_files} ]]; then echo "Boilerplate missing in:" echo "${relevant_files}" exit 1 fi ================================================ FILE: hack/gofmt.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. files=$(find . -name "*.go" | grep -v vendor/ | xargs gofmt -l -s) if [[ $files ]]; then echo "Gofmt errors in files:" echo "$files" diff=$(find . -name "*.go" | grep -v vendor/ | xargs gofmt -d -s) echo "$diff" exit 1 fi ================================================ FILE: hack/install_golint.sh ================================================ #!/bin/sh set -e # Code generated by godownloader on 2018-06-05T12:04:55Z. DO NOT EDIT. # usage() { this=$1 cat </dev/null } echoerr() { echo "$@" 1>&2 } log_prefix() { echo "$0" } _logp=6 log_set_priority() { _logp="$1" } log_priority() { if test -z "$1"; then echo "$_logp" return fi [ "$1" -le "$_logp" ] } log_tag() { case $1 in 0) echo "emerg" ;; 1) echo "alert" ;; 2) echo "crit" ;; 3) echo "err" ;; 4) echo "warning" ;; 5) echo "notice" ;; 6) echo "info" ;; 7) echo "debug" ;; *) echo "$1" ;; esac } log_debug() { log_priority 7 || return 0 echoerr "$(log_prefix)" "$(log_tag 7)" "$@" } log_info() { log_priority 6 || return 0 echoerr "$(log_prefix)" "$(log_tag 6)" "$@" } log_err() { log_priority 3 || return 0 echoerr "$(log_prefix)" "$(log_tag 3)" "$@" } log_crit() { log_priority 2 || return 0 echoerr "$(log_prefix)" "$(log_tag 2)" "$@" } uname_os() { os=$(uname -s | tr '[:upper:]' '[:lower:]') case "$os" in msys_nt) os="windows" ;; esac echo "$os" } uname_arch() { arch=$(uname -m) case $arch in x86_64) arch="amd64" ;; x86) arch="386" ;; i686) arch="386" ;; i386) arch="386" ;; aarch64) arch="arm64" ;; armv5*) arch="armv5" ;; armv6*) arch="armv6" ;; armv7*) arch="armv7" ;; esac echo ${arch} } uname_os_check() { os=$(uname_os) case "$os" in darwin) return 0 ;; dragonfly) return 0 ;; freebsd) return 0 ;; linux) return 0 ;; android) return 0 ;; nacl) return 0 ;; netbsd) return 0 ;; openbsd) return 0 ;; plan9) return 0 ;; solaris) return 0 ;; windows) return 0 ;; esac log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" return 1 } uname_arch_check() { arch=$(uname_arch) case "$arch" in 386) return 0 ;; amd64) return 0 ;; arm64) return 0 ;; armv5) return 0 ;; armv6) return 0 ;; armv7) return 0 ;; ppc64) return 0 ;; ppc64le) return 0 ;; mips) return 0 ;; mipsle) return 0 ;; mips64) return 0 ;; mips64le) return 0 ;; s390x) return 0 ;; amd64p32) return 0 ;; esac log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" return 1 } untar() { tarball=$1 case "${tarball}" in *.tar.gz | *.tgz) tar -xzf "${tarball}" ;; *.tar) tar -xf "${tarball}" ;; *.zip) unzip "${tarball}" ;; *) log_err "untar unknown archive format for ${tarball}" return 1 ;; esac } mktmpdir() { test -z "$TMPDIR" && TMPDIR="$(mktemp -d)" mkdir -p "${TMPDIR}" echo "${TMPDIR}" } http_download_curl() { local_file=$1 source_url=$2 header=$3 if [ -z "$header" ]; then code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") else code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") fi if [ "$code" != "200" ]; then log_debug "http_download_curl received HTTP status $code" return 1 fi return 0 } http_download_wget() { local_file=$1 source_url=$2 header=$3 if [ -z "$header" ]; then wget -q -O "$local_file" "$source_url" else wget -q --header "$header" -O "$local_file" "$source_url" fi } http_download() { log_debug "http_download $2" if is_command curl; then http_download_curl "$@" return elif is_command wget; then http_download_wget "$@" return fi log_crit "http_download unable to find wget or curl" return 1 } http_copy() { tmp=$(mktemp) http_download "${tmp}" "$1" "$2" || return 1 body=$(cat "$tmp") rm -f "${tmp}" echo "$body" } github_release() { owner_repo=$1 version=$2 test -z "$version" && version="latest" giturl="https://github.com/${owner_repo}/releases/${version}" json=$(http_copy "$giturl" "Accept:application/json") test -z "$json" && return 1 version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') test -z "$version" && return 1 echo "$version" } hash_sha256() { TARGET=${1:-/dev/stdin} if is_command gsha256sum; then hash=$(gsha256sum "$TARGET") || return 1 echo "$hash" | cut -d ' ' -f 1 elif is_command sha256sum; then hash=$(sha256sum "$TARGET") || return 1 echo "$hash" | cut -d ' ' -f 1 elif is_command shasum; then hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 echo "$hash" | cut -d ' ' -f 1 elif is_command openssl; then hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 echo "$hash" | cut -d ' ' -f a else log_crit "hash_sha256 unable to find command to compute sha-256 hash" return 1 fi } hash_sha256_verify() { TARGET=$1 checksums=$2 if [ -z "$checksums" ]; then log_err "hash_sha256_verify checksum file not specified in arg2" return 1 fi BASENAME=${TARGET##*/} want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) if [ -z "$want" ]; then log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" return 1 fi got=$(hash_sha256 "$TARGET") if [ "$want" != "$got" ]; then log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" return 1 fi } cat /dev/null < $TEMP_CHANGELOG # Replace '|' with '\n' in temporary changelog sed 's/|/\n/g' $TEMP_CHANGELOG > $TEMP_CHANGELOG_FIXED # Prepend to CHANGELOG.md cat $TEMP_CHANGELOG_FIXED CHANGELOG.md > TEMP && mv TEMP CHANGELOG.md echo "Prepended the following release information to CHANGELOG.md" echo "" cat $TEMP_CHANGELOG_FIXED # Optionally, clean up the fixed temporary changlog file rm $TEMP_CHANGELOG_FIXED # Cleanup rm $TEMP_CHANGELOG echo "Updated Makefile for the new version: $VERSION" # Update Makefile sed -i.bak \ -e "s|VERSION_MAJOR ?=.*|VERSION_MAJOR ?= $VERSION_MAJOR|" \ -e "s|VERSION_MINOR ?=.*|VERSION_MINOR ?= $VERSION_MINOR|" \ -e "s|VERSION_BUILD ?=.*|VERSION_BUILD ?= $VERSION_BUILD|" \ ./Makefile # Cleanup rm ./Makefile.bak ================================================ FILE: hack/release_notes/changelog_template.txt ================================================ # {{VERSION}} Release {{DATE}} The executor images in this release are: ``` gcr.io/kaniko-project/executor:{{VERSION}} gcr.io/kaniko-project/executor:latest ``` The debug images are available at: ``` gcr.io/kaniko-project/executor:debug gcr.io/kaniko-project/executor:{{VERSION}}-debug ``` The slim executor images which don't contain any authentication binaries are available at: ``` gcr.io/kaniko-project/executor:slim gcr.io/kaniko-project/executor:{{VERSION}}-slim ``` {{PULL_REQUESTS}} Huge thank you for this release towards our contributors: {{CONTRIBUTORS}} ================================================ FILE: hack/release_notes/listpullreqs.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package main import ( "context" "fmt" "github.com/google/go-github/github" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "golang.org/x/oauth2" ) var ( token string fromTag string toTag string ) var rootCmd = &cobra.Command{ Use: "listpullreqs fromTag toTag", Short: "Lists pull requests between two versions in our changelog markdown format", ArgAliases: []string{"fromTag", "toTag"}, Run: func(cmd *cobra.Command, args []string) { printPullRequests() }, } const org = "GoogleContainerTools" const repo = "kaniko" func main() { rootCmd.Flags().StringVar(&token, "token", "", "Specify personal Github Token if you are hitting a rate limit anonymously. https://github.com/settings/tokens") rootCmd.Flags().StringVar(&fromTag, "fromTag", "", "comparison of commits is based on this tag (defaults to the latest tag in the repo)") rootCmd.Flags().StringVar(&toTag, "toTag", "master", "this is the commit that is compared with fromTag") if err := rootCmd.Execute(); err != nil { logrus.Fatal(err) } } func printPullRequests() { client := getClient() releases, _, _ := client.Repositories.ListReleases(context.Background(), org, repo, &github.ListOptions{}) lastReleaseTime := *releases[0].PublishedAt listSize := 1 seen := map[int]bool{} for page := 0; listSize > 0; page++ { pullRequests, _, _ := client.PullRequests.List(context.Background(), org, repo, &github.PullRequestListOptions{ State: "closed", Sort: "updated", Direction: "desc", ListOptions: github.ListOptions{ PerPage: 100, Page: page, }, }) for idx := range pullRequests { pr := pullRequests[idx] if pr.MergedAt != nil { if _, ok := seen[*pr.Number]; !ok && pr.GetMergedAt().After(lastReleaseTime.Time) { fmt.Printf("* %s [#%d](https://github.com/%s/%s/pull/%d)\n", pr.GetTitle(), *pr.Number, org, repo, *pr.Number) seen[*pr.Number] = true } } } listSize = len(pullRequests) } } func getClient() *github.Client { if len(token) <= 0 { return github.NewClient(nil) } ctx := context.Background() ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: token}, ) tc := oauth2.NewClient(ctx, ts) return github.NewClient(tc) } ================================================ FILE: integration/.dockerignore ================================================ # A .dockerignore file to make sure dockerignore support works ignore/** !ignore/foo ================================================ FILE: integration/.gitignore ================================================ cache config.json ================================================ FILE: integration/BUILD ================================================ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "integration", srcs = [ "cleanup.go", "cmd.go", "config.go", "gcs.go", "images.go", ], importpath = "github.com/GoogleContainerTools/kaniko/integration", tags = ["manual"], visibility = ["//visibility:public"], deps = ["//pkg/timing"], ) go_test( name = "integration_test", srcs = [ "benchmark_test.go", "integration_test.go", "integration_with_context_test.go", "integration_with_stdin_test.go", "k8s_test.go", ], data = glob(["testdata/**"]), embed = [":integration"], tags = ["manual"], deps = [ "//pkg/timing", "//pkg/util", "//testutil", "//vendor/github.com/google/go-containerregistry/pkg/name", "//vendor/github.com/google/go-containerregistry/pkg/v1/daemon", "//vendor/github.com/pkg/errors", ], ) load("@io_bazel_rules_docker//container:container.bzl", "container_image") load("@io_bazel_rules_docker//contrib:test.bzl", "container_test") ARCHITECTURES = [ "amd64", "arm64", ] # Image with testdata [ container_image( name = "buildtest_image_" + arch, architecture = arch, base = "//cmd/executor:image_" + arch, directory = "/workspace", files = [ ":testdata/Dockerfile.trivial", ], ) for arch in ARCHITECTURES ] # Non-executable tests can run on any architecture, # so do not tag them. [ container_test( name = "image_files_" + arch + "_test", configs = ["testdata/files.yaml"], image = "//cmd/executor:image_" + arch, ) for arch in ARCHITECTURES ] [ container_test( name = "buildtest_image_" + arch + "_test", configs = [ "testdata/files.yaml", "testdata/testfiles.yaml", ], image = ":buildtest_image_" + arch, ) for arch in ARCHITECTURES ] [ container_test( name = "image_exec_" + arch + "_test", configs = ["testdata/exec.yaml"], image = "//cmd/executor:image_" + arch, tags = [ "manual", arch, ], ) for arch in ARCHITECTURES ] [ container_test( name = "image_build_" + arch + "_test", configs = ["testdata/build.yaml"], image = ":buildtest_image_" + arch, tags = [ "manual", arch, ], ) for arch in ARCHITECTURES ] ================================================ FILE: integration/benchmark_fs/Dockerfile ================================================ # Copyright 2020 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM bash:4.4 ARG NUM COPY context.txt . COPY make.sh . SHELL ["/usr/local/bin/bash", "-c"] RUN ./make.sh $NUM RUN ls -al /workdir | wc ================================================ FILE: integration/benchmark_fs/cloudbuild.yaml ================================================ steps: - name: 'gcr.io/kaniko-project/executor:latest' args: - --build-arg=NUM=${_COUNT} - --no-push - --snapshot-mode=redo env: - 'BENCHMARK_FILE=gs://$PROJECT_ID/gcb/benchmark_file_${_COUNT}' timeout: 2400s timeout: 2400s substitutions: _COUNT: "10000" # default value ================================================ FILE: integration/benchmark_fs/context.txt ================================================ hello world ================================================ FILE: integration/benchmark_fs/make.sh ================================================ #!/usr/local/bin/bash # Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. mkdir /workdir i=1 targetCnt=$(( $1 + 0 )) while [ $i -le $targetCnt ] do cat context.txt > /workdir/somefile$i i=$(( $i + 1 )) done ================================================ FILE: integration/benchmark_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "encoding/json" "fmt" "io" "os" "os/exec" "path/filepath" "strconv" "sync" "testing" "time" ) type result struct { totalBuildTime float64 resolvingFiles float64 walkingFiles float64 hashingFiles float64 } func TestSnapshotBenchmark(t *testing.T) { if b, err := strconv.ParseBool(os.Getenv("BENCHMARK")); err != nil || !b { t.SkipNow() } cwd, err := os.Getwd() if err != nil { t.Fatal(err) } contextDir := filepath.Join(cwd, "benchmark_fs") nums := []int{10000, 50000, 100000, 200000, 300000, 500000, 700000} var timeMap sync.Map var wg sync.WaitGroup for _, num := range nums { t.Run(fmt.Sprintf("test_benchmark_%d", num), func(t *testing.T) { wg.Add(1) var err error go func(num int, err *error) { dockerfile := "Dockerfile" kanikoImage := fmt.Sprintf("%s_%d", GetKanikoImage(config.imageRepo, dockerfile), num) buildArgs := []string{"--build-arg", fmt.Sprintf("NUM=%d", num)} var benchmarkDir string benchmarkDir, *err = buildKanikoImage(t.Logf, "", dockerfile, buildArgs, []string{}, kanikoImage, contextDir, config.gcsBucket, config.gcsClient, config.serviceAccount, false) if *err != nil { return } r := newResult(t, filepath.Join(benchmarkDir, dockerfile)) timeMap.Store(num, r) wg.Done() defer os.Remove(benchmarkDir) }(num, &err) if err != nil { t.Errorf("could not run benchmark results for num %d due to %s", num, err) } }) } wg.Wait() t.Log("Number of Files,Total Build Time,Walking Filesystem, Resolving Files") timeMap.Range(func(key interface{}, value interface{}) bool { d, _ := key.(int) v, _ := value.(result) t.Logf("%d,%f,%f,%f", d, v.totalBuildTime, v.walkingFiles, v.resolvingFiles) return true }) } func newResult(t *testing.T, f string) result { var current map[string]time.Duration jsonFile, err := os.Open(f) defer jsonFile.Close() if err != nil { t.Errorf("could not read benchmark file %s", f) } byteValue, _ := io.ReadAll(jsonFile) if err := json.Unmarshal(byteValue, ¤t); err != nil { t.Errorf("could not unmarshal benchmark file") } r := result{} if c, ok := current["Resolving Paths"]; ok { r.resolvingFiles = c.Seconds() } if c, ok := current["Walking filesystem"]; ok { r.walkingFiles = c.Seconds() } if c, ok := current["Total Build Time"]; ok { r.totalBuildTime = c.Seconds() } if c, ok := current["Hashing files"]; ok { r.hashingFiles = c.Seconds() } t.Log(r) return r } func TestSnapshotBenchmarkGcloud(t *testing.T) { if b, err := strconv.ParseBool(os.Getenv("BENCHMARK")); err != nil || !b { t.SkipNow() } cwd, err := os.Getwd() if err != nil { t.Fatal(err) } contextDir := filepath.Join(cwd, "benchmark_fs") nums := []int{10000, 50000, 100000, 200000, 300000, 500000, 700000} var wg sync.WaitGroup t.Log("Number of Files,Total Build Time,Walking Filesystem, Resolving Files") for _, num := range nums { t.Run(fmt.Sprintf("test_benchmark_%d", num), func(t *testing.T) { wg.Add(1) go func(num int) { dir, err := runInGcloud(contextDir, num) if err != nil { t.Errorf("error when running in gcloud %v", err) return } r := newResult(t, filepath.Join(dir, "results")) t.Log(fmt.Sprintf("%d,%f,%f,%f, %f", num, r.totalBuildTime, r.walkingFiles, r.resolvingFiles, r.hashingFiles)) wg.Done() defer os.Remove(dir) defer os.Chdir(cwd) }(num) }) } wg.Wait() } func runInGcloud(dir string, num int) (string, error) { os.Chdir(dir) cmd := exec.Command("gcloud", "builds", "submit", "--config=cloudbuild.yaml", fmt.Sprintf("--substitutions=_COUNT=%d", num)) _, err := RunCommandWithoutTest(cmd) if err != nil { return "", err } // grab gcs and to temp dir and return tmpDir, err := os.MkdirTemp("", fmt.Sprintf("%d", num)) if err != nil { return "", err } src := fmt.Sprintf("%s/gcb/benchmark_file_%d", config.gcsBucket, num) dest := filepath.Join(tmpDir, "results") copyCommand := exec.Command("gsutil", "cp", src, dest) _, err = RunCommandWithoutTest(copyCommand) if err != nil { return "", fmt.Errorf("failed to download file to GCS bucket %s: %w", src, err) } return tmpDir, nil } ================================================ FILE: integration/cleanup.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "log" "os" "os/signal" ) // RunOnInterrupt will execute the function f if execution is interrupted with the // interrupt signal. func RunOnInterrupt(f func()) { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) go func() { for range c { log.Println("Interrupted, cleaning up.") f() os.Exit(1) } }() } ================================================ FILE: integration/cmd.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "bytes" "os/exec" "testing" ) // RunCommandWithoutTest will run cmd and if it fails will output relevant info // for debugging before returning an error. It can be run outside the context of a test. func RunCommandWithoutTest(cmd *exec.Cmd) ([]byte, error) { output, err := cmd.CombinedOutput() return output, err } // RunCommand will run cmd and if it fails will output relevant info for debugging // before it fails. It must be run within the context of a test t and if the command // fails, it will fail the test. Returns the output from the command. func RunCommand(cmd *exec.Cmd, t *testing.T) []byte { var stderr bytes.Buffer cmd.Stderr = &stderr output, err := cmd.Output() if err != nil { t.Log(cmd.Args) t.Log(stderr.String()) t.Log(string(output)) t.Error(err) t.FailNow() } return output } ================================================ FILE: integration/config.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "strings" "cloud.google.com/go/storage" ) type integrationTestConfig struct { gcsBucket string imageRepo string onbuildBaseImage string hardlinkBaseImage string serviceAccount string dockerMajorVersion int gcsClient *storage.Client dockerfilesPattern string } const gcrRepoPrefix string = "gcr.io/" func (config *integrationTestConfig) isGcrRepository() bool { return strings.HasPrefix(config.imageRepo, gcrRepoPrefix) } ================================================ FILE: integration/context/arr[0].txt ================================================ hello ================================================ FILE: integration/context/bar/bam/bat ================================================ bat ================================================ FILE: integration/context/bar/bat ================================================ bat ================================================ FILE: integration/context/bar/baz ================================================ baz ================================================ FILE: integration/context/empty/.gitignore ================================================ ================================================ FILE: integration/context/foo ================================================ foo ================================================ FILE: integration/context/qux/qup ================================================ qup ================================================ FILE: integration/context/qux/quw/que ================================================ que ================================================ FILE: integration/context/qux/quz ================================================ quz ================================================ FILE: integration/context/tars/file ================================================ normal file ================================================ FILE: integration/context/workspace/test ================================================ test ================================================ FILE: integration/dockerfiles/1097 ================================================ FROM ubuntu:latest RUN groupadd -g 20000 bar RUN groupadd -g 10000 foo RUN useradd -c "Foo user" -u 10000 -g 10000 -G bar -m foo RUN id foo USER foo RUN id ================================================ FILE: integration/dockerfiles/Dockerfile_dockerignore_relative ================================================ # This is not included in integration tests because docker build does not exploit Dockerfile.dockerignore # See https://github.com/moby/moby/issues/12886#issuecomment-523706042 for more details # This dockerfile makes sure Dockerfile.dockerignore is working # If so then ignore_relative/foo should copy to /foo # If not, then this image won't build because it will attempt to copy three files to /foo, which is a file not a directory FROM scratch COPY ignore_relative/* /foo ================================================ FILE: integration/dockerfiles/Dockerfile_dockerignore_relative.dockerignore ================================================ # A .dockerignore file to make sure dockerignore support works ignore_relative/** !ignore_relative/foo ================================================ FILE: integration/dockerfiles/Dockerfile_git_buildcontext ================================================ FROM scratch COPY LICENSE ./LICENSE ================================================ FILE: integration/dockerfiles/Dockerfile_hardlink_base ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a AS stage1 RUN apk --no-cache add git RUN rm /usr/bin/git && ln -s /usr/libexec/git-core/git /usr/bin/git ================================================ FILE: integration/dockerfiles/Dockerfile_onbuild_base ================================================ FROM ubuntu:18.04 ENV dir /tmp/dir/ ONBUILD RUN echo "onbuild" > /tmp/onbuild ONBUILD RUN mkdir $dir ONBUILD RUN echo "onbuild 2" > ${dir}/onbuild2 ONBUILD WORKDIR /new/workdir ================================================ FILE: integration/dockerfiles/Dockerfile_registry_mirror ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Test to make sure the executor builds an image correctly # when no files are changed FROM library/debian:latest RUN echo "hey" MAINTAINER kaniko ================================================ FILE: integration/dockerfiles/Dockerfile_relative_copy ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a COPY foo foo COPY foo /foodir/ ================================================ FILE: integration/dockerfiles/Dockerfile_test_add ================================================ FROM debian:10.13 # First, try adding some regular files ADD context/foo foo ADD context/foo /foodir/ ADD context/bar/b* bar/ ADD . newdir ADD ["context/foo", "/tmp/foo" ] # Next, make sure environment replacement works ENV contextenv ./context ADD $contextenv/* /tmp/${contextenv}/ # Now, test extracting local tar archives ADD context/tars/fil* /tars/ ADD context/tars/file.tar /tars_again # This tar has some directories that should be ignored inside it. ADD context/tars/sys.tar.gz / # Test with ARG ARG file COPY $file /arg # Finally, test adding a remote URL, concurrently with a normal file ADD https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v1.4.3/docker-credential-gcr_linux_386-1.4.3.tar.gz context/foo /test/all/ # Test environment replacement in the URL ENV VERSION=v2.1.0 ADD https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/${VERSION}/docker-credential-gcr_darwin_amd64-2.1.0.tar.gz /destination # Test full url replacement ENV URL=https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v1.4.3/docker-credential-gcr_linux_386-1.4.3.tar.gz ADD $URL /otherdestination ================================================ FILE: integration/dockerfiles/Dockerfile_test_add_404 ================================================ FROM debian:10.13 # Testing that any HTTP failure is handled properly ADD https://httpstat.us/404 . ================================================ FILE: integration/dockerfiles/Dockerfile_test_add_chown_intermediate_dirs ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a # Create dev user and group, with id 1001 RUN yes | adduser -u 1001 dev ADD --chown=dev:dev context/foo /path/to/foo ADD --chown=dev:dev context/qux /path/to/qux ADD --chown=1001:1001 context/foo /path2/to/foo ADD --chown=1001:1001 context/qux /path2/to/qux USER dev # `mkdir` fails when `dev` does not own all of `/path{,2}/to{,/qux}` RUN mkdir /path/to/new_dir RUN mkdir /path/to/qux/new_dir RUN mkdir /path2/to/new_dir RUN mkdir /path2/to/qux/new_dir ================================================ FILE: integration/dockerfiles/Dockerfile_test_add_dest_symlink_dir ================================================ FROM phusion/baseimage:0.11 ADD context/foo /etc/service/foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_add_url_with_arg ================================================ FROM busybox:1.31 ARG REPO=kaniko ARG VERSION=v0.14.0 ADD https://github.com/GoogleContainerTools/$REPO/archive/$VERSION.tar.gz /tmp/release.tar.gz ================================================ FILE: integration/dockerfiles/Dockerfile_test_arg_blank_with_quotes ================================================ ARG FILE_NAME="" FROM busybox:latest AS builder ARG FILE_NAME RUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt; FROM busybox:latest ARG FILE_NAME RUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt; COPY --from=builder /$FILE_NAME.txt / ================================================ FILE: integration/dockerfiles/Dockerfile_test_arg_from_quotes ================================================ ARG IMAGE_NAME="busybox:latest" FROM $IMAGE_NAME ENV PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ================================================ FILE: integration/dockerfiles/Dockerfile_test_arg_from_single_quotes ================================================ ARG IMAGE_NAME='busybox:latest' FROM $IMAGE_NAME ENV PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ================================================ FILE: integration/dockerfiles/Dockerfile_test_arg_multi ================================================ ARG FILE_NAME=myFile FROM busybox:latest AS builder ARG FILE_NAME RUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt; FROM busybox:latest ARG FILE_NAME RUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt; COPY --from=builder /$FILE_NAME.txt / ================================================ FILE: integration/dockerfiles/Dockerfile_test_arg_multi_empty_val ================================================ ARG VARIANT="" ARG VERSION=1 FROM busybox${VARIANT}:1.3${VERSION} ================================================ FILE: integration/dockerfiles/Dockerfile_test_arg_multi_with_quotes ================================================ ARG FILE_NAME="myFile" FROM busybox:latest AS builder ARG FILE_NAME RUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt; FROM busybox:latest ARG FILE_NAME RUN echo $FILE_NAME && touch /$FILE_NAME.txt && stat /$FILE_NAME.txt; COPY --from=builder /$FILE_NAME.txt / ================================================ FILE: integration/dockerfiles/Dockerfile_test_arg_secret ================================================ FROM debian:10.13 ARG SSH_PRIVATE_KEY ARG SSH_PUBLIC_KEY RUN mkdir .ssh && \ chmod 700 .ssh && \ echo "$SSH_PRIVATE_KEY" > .ssh/id_rsa && \ echo "$SSH_PUBLIC_KEY" > .ssh/id_rsa.pub && \ chmod 600 .ssh/id_rsa .ssh/id_rsa.pub ================================================ FILE: integration/dockerfiles/Dockerfile_test_arg_two_level ================================================ ARG A=3.9 ARG B=alpine:${A} FROM ${B} ================================================ FILE: integration/dockerfiles/Dockerfile_test_cache ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Test to make sure the cache works properly # If the image is built twice, /date should be the same in both images # if the cache is implemented correctly FROM debian:10.13 RUN date > /date COPY context/foo /foo RUN echo hey ================================================ FILE: integration/dockerfiles/Dockerfile_test_cache_copy ================================================ FROM google/cloud-sdk:256.0.0-alpine COPY context/foo /usr/bin ================================================ FILE: integration/dockerfiles/Dockerfile_test_cache_copy_oci ================================================ FROM google/cloud-sdk:256.0.0-alpine COPY context/foo /usr/bin ================================================ FILE: integration/dockerfiles/Dockerfile_test_cache_install ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Test to make sure the cache works properly # /date should be the same regardless of when this image is built # if the cache is implemented correctly FROM debian:10.13 WORKDIR /foo RUN apt-get update && apt-get install -y make COPY context/bar /context RUN echo "hey" > foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_cache_install_oci ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Test to make sure the cache works properly # /date should be the same regardless of when this image is built # if the cache is implemented correctly FROM debian:10.13 WORKDIR /foo RUN apt-get update && apt-get install -y make COPY context/bar /context RUN echo "hey" > foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_cache_oci ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Test to make sure the cache works properly # If the image is built twice, /date should be the same in both images # if the cache is implemented correctly FROM debian:10.13 RUN date > /date COPY context/foo /foo RUN echo hey ================================================ FILE: integration/dockerfiles/Dockerfile_test_cache_perm ================================================ # Test to make sure the cache works with special file permissions properly. # If the image is built twice, directory foo should have the sticky bit, # and file bar should have the setuid and setgid bits. FROM busybox RUN mkdir foo && chmod +t foo RUN touch bar && chmod u+s,g+s bar ================================================ FILE: integration/dockerfiles/Dockerfile_test_cache_perm_oci ================================================ # Test to make sure the cache works with special file permissions properly. # If the image is built twice, directory foo should have the sticky bit, # and file bar should have the setuid and setgid bits. FROM busybox RUN mkdir foo && chmod +t foo RUN touch bar && chmod u+s,g+s bar ================================================ FILE: integration/dockerfiles/Dockerfile_test_cmd ================================================ FROM debian:12 AS first CMD ["mycmd"] FROM first ENTRYPOINT ["myentrypoint"] # This should clear out CMD in the config metadata ================================================ FILE: integration/dockerfiles/Dockerfile_test_complex_substitution ================================================ FROM docker.io/library/busybox:latest@sha256:afe605d272837ce1732f390966166c2afff5391208ddd57de10942748694049d RUN echo ${s%s} ================================================ FILE: integration/dockerfiles/Dockerfile_test_copy ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a COPY context/foo foo COPY context/foo /foodir/ COPY context/bar/b* bar/ COPY context/fo? /foo2 COPY context/bar/doesnotexist* context/foo hello COPY ./context/empty /empty COPY ./ dir/ COPY . newdir COPY context/bar /baz/ COPY ["context/foo", "/tmp/foo" ] COPY context/q* /qux/ COPY context/foo context/bar/ba? /test/ COPY context/arr[[]0].txt /mydir/ COPY context/bar/bat . ENV contextenv ./context COPY ${contextenv}/foo /tmp/foo2 COPY $contextenv/foo /tmp/foo3 COPY $contextenv/* /tmp/${contextenv}/ ================================================ FILE: integration/dockerfiles/Dockerfile_test_copy_bucket ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a COPY context/foo foo COPY context/foo /foodir/ COPY context/bar/b* bar/ COPY context/fo? /foo2 COPY context/bar/doesnotexist* context/foo hello COPY ./context/empty /empty COPY ./ dir/ COPY . newdir COPY context/bar /baz/ COPY ["context/foo", "/tmp/foo" ] COPY context/q* /qux/ COPY context/foo context/bar/ba? /test/ COPY context/arr[[]0].txt /mydir/ COPY context/bar/bat . ENV contextenv ./context COPY ${contextenv}/foo /tmp/foo2 COPY $contextenv/foo /tmp/foo3 COPY $contextenv/* /tmp/${contextenv}/ ================================================ FILE: integration/dockerfiles/Dockerfile_test_copy_chown_intermediate_dirs ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a # Create dev user and group, with id 1001 RUN yes | adduser -u 1001 dev COPY --chown=dev:dev context/foo /path/to/foo COPY --chown=dev:dev context/qux /path/to/qux COPY --chown=1001:1001 context/foo /path2/to/foo COPY --chown=1001:1001 context/qux /path2/to/qux USER dev # `mkdir` fails when `dev` does not own all of `/path{,2}/to{,/qux}` RUN mkdir /path/to/new_dir RUN mkdir /path/to/qux/new_dir RUN mkdir /path2/to/new_dir RUN mkdir /path2/to/qux/new_dir ================================================ FILE: integration/dockerfiles/Dockerfile_test_copy_chown_nonexisting_user ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 RUN echo "hey" > /tmp/foo FROM debian:10.13 RUN groupadd --gid 5000 testgroup COPY --from=0 --chown=1001:1001 /tmp/foo /tmp/baz # with existing group COPY --from=0 --chown=1001:testgroup /tmp/foo /tmp/baz ================================================ FILE: integration/dockerfiles/Dockerfile_test_copy_reproducible ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a COPY context/foo foo COPY context/foo /foodir/ COPY context/bar/b* bar/ COPY context/fo? /foo2 COPY context/bar/doesnotexist* context/foo hello COPY ./context/empty /empty COPY ./ dir/ COPY . newdir COPY context/bar /baz/ COPY ["context/foo", "/tmp/foo" ] COPY context/q* /qux/ COPY context/foo context/bar/ba? /test/ COPY context/arr[[]0].txt /mydir/ COPY context/bar/bat . ENV contextenv ./context COPY ${contextenv}/foo /tmp/foo2 COPY $contextenv/foo /tmp/foo3 COPY $contextenv/* /tmp/${contextenv}/ ================================================ FILE: integration/dockerfiles/Dockerfile_test_copy_root_multistage ================================================ FROM busybox:1.31 COPY context/foo foo FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a COPY / /foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_copy_same_file_many_times ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo COPY context/foo /foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_copy_symlink ================================================ FROM busybox as t RUN mkdir temp RUN echo "hello" > temp/target RUN ln -s target temp/link ## Relative link with paths RUN mkdir workdir && cd workdir && ln -s ../temp/target relative_link FROM scratch COPY --from=t temp/ dest/ COPY --from=t /workdir/relative_link /workdirAnother/ ================================================ FILE: integration/dockerfiles/Dockerfile_test_copyadd_chmod ================================================ FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a ADD --chmod=0666 context/foo /file666 ADD --chmod=777 context/qux /dir777 # ADD tests # simple file RUN test "$(stat -c "%a" /file666)" = "666" # recurive dir RUN test "$(stat -c "%a" /dir777/qup)" = "777" RUN test "$(stat -c "%a" /dir777/quw/que)" = "777" # COPY tests COPY --chmod=0755 context/foo /copyfile755 COPY --chmod=755 context/qux /copydir755 RUN test "$(stat -c "%a" /copyfile755)" = "755" RUN test "$(stat -c "%a" /copydir755/qup)" = "755" RUN test "$(stat -c "%a" /copydir755/quw/que)" = "755" ================================================ FILE: integration/dockerfiles/Dockerfile_test_daemons ================================================ FROM busybox RUN (while true; do sleep 10; dd if=/dev/zero of=file`date +%s`.txt count=16000 bs=256 > /dev/null 2>&1; done &); sleep 1 RUN echo "wait a second..." && sleep 2 && ls -lrat file*.txt || echo "test passed." ================================================ FILE: integration/dockerfiles/Dockerfile_test_dangling_symlink ================================================ FROM busybox:latest@sha256:b26cd013274a657b86e706210ddd5cc1f82f50155791199d29b9e86e935ce135 RUN ["/bin/ln", "-s", "nowhere", "/link"] ================================================ FILE: integration/dockerfiles/Dockerfile_test_deleted_file_cached ================================================ FROM alpine RUN mkdir -p /some/dir/ && echo 'first' > /some/dir/first.txt RUN rm /some/dir/first.txt ================================================ FILE: integration/dockerfiles/Dockerfile_test_dockerignore ================================================ # This dockerfile makes sure the .dockerignore is working # If so then ignore/foo should copy to /foo # If not, then this image won't build because it will attempt to copy three files to /foo, which is a file not a directory FROM scratch as base COPY ignore/* /foo From base as first COPY --from=base /foo ignore/bar # Make sure that .dockerignore also applies for later stages FROM scratch as base2 COPY ignore/* /foo From base2 as second COPY --from=base2 /foo ignore/bar FROM scratch COPY --from=first ignore/* /fooAnother/ COPY --from=second ignore/* /fooAnother2/ ================================================ FILE: integration/dockerfiles/Dockerfile_test_env ================================================ FROM debian:10.13 ENV hey hey ENV PATH /usr/local ENV testmultipleeq="this=is a=test string=with a=lot of=equals" ENV hey hello ENV first=foo second=foo2 ENV third $second:/third ENV myName="John Doe" myDog=Rex\ The\ Dog \ myCat=fluffy ENV PATH something ENV test=value\ value2 ENV test1="a'b'c" ENV test2='a"b"c' ENV test3=a\ b name2=b\ c ENV test4="a\"b" ENV test5='a\"b' ENV test6="a\'b" ENV atomic=one ENV atomic=two newatomic=$atomic ENV newenv=$doesntexist/newenv ================================================ FILE: integration/dockerfiles/Dockerfile_test_expose ================================================ FROM debian:10.13 EXPOSE 80 EXPOSE 81/udp ENV protocol tcp EXPOSE 82/$protocol ENV port 83 EXPOSE $port/udp EXPOSE $port/$protocol ================================================ FILE: integration/dockerfiles/Dockerfile_test_extract_fs ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 ================================================ FILE: integration/dockerfiles/Dockerfile_test_extraction ================================================ # Tests extraction of symlink, hardlink and regular files to a path that is a non-empty directory FROM gcr.io/kaniko-test/extraction-base-image:latest ================================================ FILE: integration/dockerfiles/Dockerfile_test_from_multistage_capital ================================================ FROM alpine as base_stage RUN echo base_stage FROM base_stage as BUG_stage RUN echo BUG_stage FROM BUG_stage as final_stage RUN echo final_stage ================================================ FILE: integration/dockerfiles/Dockerfile_test_hardlink ================================================ FROM composer@sha256:4598feb4b58b4370893a29cbc654afa9420b4debed1d574531514b78a24cd608 AS composer FROM php@sha256:13813f20fec7ded7bf3a4305ea0ccd4df3cea900e263f7f86c3d5737f86669eb COPY --from=composer /usr/bin/composer /usr/bin/composer # make sure hardlink extracts correctly FROM jboss/base-jdk@sha256:138591422fdab93a5844c13f6cbcc685631b37a16503675e9f340d2503617a41 FROM gcr.io/kaniko-test/hardlink-base:latest RUN ls -al /usr/libexec/git-core/git /usr/bin/git /usr/libexec/git-core/git-diff RUN stat /usr/bin/git RUN stat /usr/libexec/git-core/git RUN git --version > /git-version ================================================ FILE: integration/dockerfiles/Dockerfile_test_ignore ================================================ FROM scratch COPY . . ================================================ FILE: integration/dockerfiles/Dockerfile_test_issue_1039 ================================================ FROM registry.access.redhat.com/ubi7/ubi:7.7-214 # Install GCC, GCC-C++ and make libraries for build environment # Then clean caches RUN yum --disableplugin=subscription-manager update -y \ && yum --disableplugin=subscription-manager install -y \ gcc-4.8.5-39.el7 \ gcc-c++-4.8.5-39.el7 \ make-3.82-24.el7 \ && yum --disableplugin=subscription-manager clean all ================================================ FILE: integration/dockerfiles/Dockerfile_test_issue_1837 ================================================ FROM registry.access.redhat.com/ubi8/ubi:8.2 AS base # Install ping RUN yum --disableplugin=subscription-manager install -y iputils RUN setcap cap_net_raw+ep /bin/ping || exit 1 FROM base RUN [ ! -z "$(getcap /bin/ping)" ] || exit 1 ================================================ FILE: integration/dockerfiles/Dockerfile_test_issue_2049 ================================================ FROM debian:bullseye-20220328 RUN set -x; \ apt-get update && \ apt-get install -y curl openssh-client gnupg gpg-agent git make && \ rm -rf /var/lib/apt/lists/* ================================================ FILE: integration/dockerfiles/Dockerfile_test_issue_2066 ================================================ FROM ubuntu:focal as base RUN apt update RUN apt install -y libbsd0 RUN apt remove -y libbsd0 RUN apt install -y libbsd0 RUN ls -al /usr/lib/x86_64-linux-gnu/libbsd.so.0 FROM base as b # Fails on main@28432d3c before #2066, the symlink is not existing here. RUN ls -al /usr/lib/x86_64-linux-gnu/libbsd.so.0 ================================================ FILE: integration/dockerfiles/Dockerfile_test_issue_519 ================================================ FROM alpine as base_stage RUN echo base_stage RUN touch meow.txt FROM base_stage as BUG_stage RUN echo BUG_stage RUN touch purr.txt FROM BUG_stage as final_stage RUN echo final_stage RUN touch mew.txt ================================================ FILE: integration/dockerfiles/Dockerfile_test_issue_647 ================================================ FROM alpine:3.8 AS foo RUN mkdir /foo WORKDIR /foo RUN mkdir some_dir RUN touch some_file RUN chmod 777 some_dir RUN chmod 666 some_file RUN ls -l FROM alpine:3.8 COPY --from=foo /foo /bar RUN ls -l /bar ================================================ FILE: integration/dockerfiles/Dockerfile_test_issue_684 ================================================ # ubuntu:bionic-20200219 FROM ubuntu@sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df as builder RUN apt-get update && apt-get -y upgrade && apt-get -y install lib32stdc++6 wget ================================================ FILE: integration/dockerfiles/Dockerfile_test_issue_704 ================================================ FROM alpine RUN mkdir -p /some/dir/ && echo 'first' > /some/dir/first.txt RUN rm /some/dir/first.txt ================================================ FILE: integration/dockerfiles/Dockerfile_test_label ================================================ FROM debian:10.13 LABEL foo=bar LABEL "baz"="bat" ENV label1 "mylabel" LABEL label1=$label1 LABEL multilabel1=multilabel1 multilabel2=multilabel2 multilabel3=multilabel3 ================================================ FILE: integration/dockerfiles/Dockerfile_test_maintainer ================================================ FROM scratch MAINTAINER nobody@domain.test # Add a file to the image to work around https://github.com/moby/moby/issues/38039 COPY context/foo /foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_meta_arg ================================================ ARG REGISTRY=docker.io ARG IMAGE=debian ARG TAG=9.11 ARG WORD=hello ARG W0RD2=hey FROM ${REGISTRY}/${IMAGE}:${TAG} as stage1 # Should evaluate WORD and create /tmp/hello ARG WORD RUN touch /${WORD} FROM ${REGISTRY}/${IMAGE}:${TAG} COPY --from=stage1 /hello /tmp # /tmp/hey should not get created without the ARG statement # Use -d 0 to force a time change because of stat resolution RUN touch -d 0 /tmp/${WORD2} ================================================ FILE: integration/dockerfiles/Dockerfile_test_metadata ================================================ FROM debian:10.2 CMD ["command", "one"] CMD ["command", "two"] CMD echo "hello" ENTRYPOINT ["execute", "something"] ENTRYPOINT ["execute", "entrypoint"] ================================================ FILE: integration/dockerfiles/Dockerfile_test_multistage ================================================ FROM debian:10.13 as base COPY . . FROM scratch as second ENV foopath context/foo COPY --from=0 $foopath context/b* /foo/ FROM second as third COPY --from=base /context/foo /new/foo FROM base as fourth # Make sure that we snapshot intermediate images correctly RUN date > /date ENV foo bar # This base image contains symlinks with relative paths to ignored directories # We need to test they're extracted correctly FROM fedora@sha256:c4cc32b09c6ae3f1353e7e33a8dda93dc41676b923d6d89afa996b421cc5aa48 FROM fourth ARG file COPY --from=second /foo ${file} COPY --from=debian:10.13 /etc/os-release /new ================================================ FILE: integration/dockerfiles/Dockerfile_test_multistage_args_issue_1911 ================================================ ARG OTHER="fix" FROM alpine:latest as base ARG NAME="base" RUN echo "base:: $NAME" >> A.txt FROM base AS base-dev ARG NAME="$NAME-dev" RUN echo "dev:: $NAME" >> B.txt FROM base-dev as base-custom ARG NAME RUN echo "custom:: $NAME" >> C.txt RUN echo "custom:: $OTHER" >> C.txt FROM base-custom as base-custom2 ARG OTHER RUN echo "custom:: $NAME" >> D.txt RUN echo "custom:: $OTHER" >> D.txt ================================================ FILE: integration/dockerfiles/Dockerfile_test_mv_add ================================================ FROM busybox@sha256:1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5 ADD context/tars /tmp/tars RUN stat /bin/sh RUN mv /tmp/tars /foo RUN echo "hi" ================================================ FILE: integration/dockerfiles/Dockerfile_test_onbuild ================================================ FROM gcr.io/kaniko-test/onbuild-base:latest COPY context/foo foo ENV dir /new/workdir/ ARG file ONBUILD RUN echo "onbuild" > $file ONBUILD RUN echo "onbuild 2" > ${dir} ONBUILD WORKDIR /new/workdir ================================================ FILE: integration/dockerfiles/Dockerfile_test_parent_dir_perms ================================================ FROM busybox RUN adduser --disabled-password --gecos "" --uid 1000 user RUN mkdir -p /home/user/foo RUN chown -R user /home/user RUN chmod 700 /home/user/foo ADD https://raw.githubusercontent.com/GoogleContainerTools/kaniko/master/README.md /home/user/foo/README.md RUN chown -R user /home/user ================================================ FILE: integration/dockerfiles/Dockerfile_test_registry ================================================ FROM busybox@sha256:1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5 RUN echo "hey" > /hey ================================================ FILE: integration/dockerfiles/Dockerfile_test_replaced_hardlinks ================================================ FROM jboss/base-jdk@sha256:70d956f632c26d1f1df57cbb99870a6141cfe470de0eb2d51bccd44929df9367 ================================================ FILE: integration/dockerfiles/Dockerfile_test_replaced_symlinks ================================================ FROM alpine@sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d RUN pwd ================================================ FILE: integration/dockerfiles/Dockerfile_test_run ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 RUN echo "hey" > /etc/foo RUN echo "baz" > /etc/baz RUN cp /etc/baz /etc/bar RUN rm /etc/baz # Test with ARG ARG file RUN echo "run" > $file RUN echo "test home" > $HOME/file COPY context/foo $HOME/foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_run_2 ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Test to make sure the executor builds an image correctly # when no files are changed FROM debian:10.13 RUN echo "hey" MAINTAINER kaniko ================================================ FILE: integration/dockerfiles/Dockerfile_test_run_new ================================================ # Copyright 2020 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 RUN echo "hey" > /etc/foo RUN echo "baz" > /etc/baz RUN cp /etc/baz /etc/bar RUN rm /etc/baz # Test with ARG ARG file RUN echo "run" > $file RUN echo "test home" > $HOME/file COPY context/foo $HOME/foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_run_redo ================================================ # Copyright 2020 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 RUN echo "hey" > /etc/foo RUN echo "baz" > /etc/baz RUN cp /etc/baz /etc/bar RUN rm /etc/baz # Test with ARG ARG file RUN echo "run" > $file RUN echo "test home" > $HOME/file COPY context/foo $HOME/foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_scratch ================================================ ARG image FROM ${image} # First, make sure simple arg replacement works ARG file COPY $file /foo # Check that setting a default value works ARG file2=context/bar/bat COPY $file2 /bat # Check that overriding a default value works ENV baz baz ENV src file3 ARG ${src}=context/bar/${baz} COPY $file3 /baz # Check that setting an ENV will override the ARG ENV file context/bar/bam/bat COPY $file /env ================================================ FILE: integration/dockerfiles/Dockerfile_test_snapshotter_ignorelist ================================================ FROM alpine@sha256:def822f9851ca422481ec6fee59a9966f12b351c62ccb9aca841526ffaa9f748 RUN ln -s /dev/null /hello ================================================ FILE: integration/dockerfiles/Dockerfile_test_target ================================================ FROM gcr.io/distroless/base:latest as base COPY . . FROM scratch as second ENV foopath context/foo COPY --from=0 $foopath context/b* /foo/ FROM base ARG file COPY --from=second /foo $file ================================================ FILE: integration/dockerfiles/Dockerfile_test_user ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 USER testuser:testgroup ================================================ FILE: integration/dockerfiles/Dockerfile_test_user_home ================================================ # Copyright 2020 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 # default values for the root user. RUN touch $HOME/hello # testuser1 with the default home created by useradd. RUN groupadd testgroup && \ useradd --create-home --gid testgroup alice && \ useradd --create-home --uid 1111 --home-dir /home/john --gid testgroup bob USER alice:testgroup RUN touch $HOME/hello USER bob RUN touch $HOME/hello USER root USER 1111 RUN touch $HOME/world ================================================ FILE: integration/dockerfiles/Dockerfile_test_user_nonexisting ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 USER 1001:1001 RUN echo "hey2" > /tmp/foo USER 1001 RUN echo "hello" > /tmp/foobar # With existing group USER root RUN groupadd testgroup USER 1001:testgroup RUN echo "hello" > /tmp/foobar ================================================ FILE: integration/dockerfiles/Dockerfile_test_user_run ================================================ # Copyright 2018 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM debian:10.13 RUN useradd testuser RUN groupadd testgroup USER testuser:testgroup RUN echo "hey" > /tmp/foo USER testuser:1001 RUN echo "hey2" >> /tmp/foo USER root RUN echo "hi" > $HOME/file COPY context/foo $HOME/foo RUN useradd -ms /bin/bash newuser USER newuser RUN echo "hi" > $HOME/file COPY context/foo $HOME/foo USER 1001 RUN echo $HOME ================================================ FILE: integration/dockerfiles/Dockerfile_test_volume ================================================ FROM debian:10.13 RUN mkdir /foo RUN echo "hello" > /foo/hey VOLUME /foo/bar /tmp /qux/quux ENV VOL /baz/bat VOLUME ["${VOL}"] RUN echo "hello again" > /tmp/hey ================================================ FILE: integration/dockerfiles/Dockerfile_test_volume_2 ================================================ FROM debian:10.13 VOLUME /foo1 RUN echo "hello" > /foo1/hello WORKDIR /foo1/bar ADD context/foo /foo1/foo COPY context/foo /foo1/foo2 RUN mkdir /bar1 VOLUME /foo2 VOLUME /foo3 RUN echo "bar2" VOLUME /foo4 RUN mkdir /bar3 VOLUME /foo5 ================================================ FILE: integration/dockerfiles/Dockerfile_test_volume_3 ================================================ FROM scratch as one VOLUME /vol FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a as two RUN mkdir /vol && echo hey > /vol/foo ================================================ FILE: integration/dockerfiles/Dockerfile_test_volume_4 ================================================ FROM rabbitmq@sha256:57b028a4bb9592ece3915e3e9cdbbaecb3eb82b753aaaf5250f8d25d81d318e2 # This base image has a volume declared at /var/lib/rabbitmq # This is important because it should not exist in the child image. COPY context/foo /usr/local/bin/ CMD ["script.sh"] ================================================ FILE: integration/dockerfiles/Dockerfile_test_whitelist ================================================ # Make sure that whitelisting (specifically, filepath.SkipDir) works correctly, and that /var/test/testfile and # /etc/test/testfile end up in the final image FROM debian@sha256:38236c068c393272ad02db100e09cac36a5465149e2924a035ee60d6c60c38fe RUN mkdir -p /var/test \ && mkdir -p /etc/test \ && touch /var/test/testfile \ && touch /etc/test/testfile \ && ls -lah /var/test \ && ls -lah /etc/test; ================================================ FILE: integration/dockerfiles/Dockerfile_test_workdir ================================================ FROM debian:10.13 COPY context/foo foo WORKDIR test # Test that this will be appended on to the previous command, to create /test/workdir WORKDIR workdir COPY context/foo ./currentfoo # Test that the RUN command will happen in the correct directory RUN cp currentfoo newfoo WORKDIR /new/dir ENV dir /another/new/dir WORKDIR $dir/newdir WORKDIR $dir/$doesntexist WORKDIR / # Test with ARG ARG workdir WORKDIR $workdir ================================================ FILE: integration/dockerfiles/Dockerfile_test_workdir_with_user ================================================ FROM debian:10.13 RUN groupadd -g 10000 bar RUN useradd -c "Foo user" -u 10000 -g 10000 -m foo # no passwd file FROM scratch # without a USER Set WORKDIR /workdir/wo/user USER 9999 WORKDIR /workdir/w/uid USER 9999:9999 WORKDIR /workdir/w/uid_gid USER 0 WORKDIR /workdir/w/root_uid USER root WORKDIR /workdir/w/root_username # with passwd file COPY --from=0 /etc/passwd /etc/passwd COPY --from=0 /etc/group /etc/group USER foo WORKDIR /workdir/w/foo_username USER foo:10000 WORKDIR /workdir/w/foo_username_gid USER 10000 WORKDIR /workdir/w/foo_uid USER 10000:10000 WORKDIR /workdir/w/foo_uid_gid USER 10000:bar WORKDIR /workdir/w/foo_uid_groupname ================================================ FILE: integration/dockerfiles/TestReplaceFolderWithFile ================================================ # Not prefixed Dockerfile_test to exclude it from TestRun() FROM busybox RUN mkdir /a /b /c && echo a > /a/d RUN rm -r /a && echo "foo" > /a ================================================ FILE: integration/dockerfiles/TestReplaceFolderWithLink ================================================ # Not prefixed Dockerfile_test to exclude it from TestRun() FROM busybox RUN mkdir /a /b /c && echo a > /a/d RUN rm -r /a && ln -sf /b /a ================================================ FILE: integration/dockerfiles-with-context/issue-1020/Dockerfile ================================================ # Copyright 2020 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM atomist/sdm-base:0.4.1 COPY package.json package-lock.json ./ RUN npm ci \ && npm cache clean --force COPY . ./ USER atomist:atomist ================================================ FILE: integration/dockerfiles-with-context/issue-1020/package.json ================================================ { "name": "foo", "version": "2.0.0", "description": "Don't forget to sanitize your inputs", "author": "Little Bobby Tables", "private": false, "devDependencies": {}, "scripts": {}, "license": "MIT", "dependencies": {} } ================================================ FILE: integration/dockerfiles-with-context/issue-1315/Dockerfile ================================================ # Copyright 2021 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM alpine:3.11 as builder RUN mkdir -p /myapp/somedir \ && touch /myapp/somedir/somefile \ && chown 123:123 /myapp/somedir \ && chown 321:321 /myapp/somedir/somefile FROM alpine:3.11 COPY --from=builder /myapp /myapp RUN printf "%s\n" \ "0 0 /myapp/" \ "123 123 /myapp/somedir" \ "321 321 /myapp/somedir/somefile" \ > /tmp/expected \ && stat -c "%u %g %n" \ /myapp/ \ /myapp/somedir \ /myapp/somedir/somefile \ > /tmp/got \ && diff -u /tmp/got /tmp/expected ================================================ FILE: integration/dockerfiles-with-context/issue-2075/Dockerfile ================================================ # Copyright 2022 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM docker.io/debian:bullseye-slim as base FROM base as build COPY ["top1", "/tmp/top1"] RUN \ set -eu; \ cp /tmp/top1 /usr/local/bin/top1; \ chown root:root /usr/local/bin/top1; \ chmod u=rxs,go=rx /usr/local/bin/top1; \ ls -lh /usr/local/bin/top1 FROM base as final COPY --from=build ["/usr/local/bin/top1", "/usr/local/bin/"] RUN [ -u /usr/local/bin/top1 ] LABEL \ description="Testing setuid behavior in Kaniko" ================================================ FILE: integration/dockerfiles-with-context/issue-57/Dockerfile ================================================ # Copyright 2020 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM busybox RUN addgroup -g 1001 -S appgroup \ && adduser -u 1005 -S al -G appgroup \ && adduser -u 1004 -S bob -G appgroup # Add local file with and without chown ADD --chown=1005:appgroup a.txt /a.txt RUN [ "$(ls -ln /a.txt | tr -s ' ' | cut -d' ' -f 3)" = 1005 ] && \ [ "$(ls -ln /a.txt | tr -s ' ' | cut -d' ' -f 4)" = 1001 ] ADD b.txt /b.txt # Add remote file with and without chown ADD --chown=bob:1001 https://raw.githubusercontent.com/GoogleContainerTools/kaniko/master/README.md /r1.txt RUN [ "$(ls -ln /r1.txt | tr -s ' ' | cut -d' ' -f 3)" = 1004 ] && \ [ "$(ls -ln /r1.txt | tr -s ' ' | cut -d' ' -f 4)" = 1001 ] ADD https://raw.githubusercontent.com/GoogleContainerTools/kaniko/master/README.md /r2.txt ================================================ FILE: integration/dockerfiles-with-context/issue-57/a.txt ================================================ ================================================ FILE: integration/dockerfiles-with-context/issue-57/b.txt ================================================ ================================================ FILE: integration/dockerfiles-with-context/issue-721/Dockerfile ================================================ # Copyright 2020 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM alpine ADD test.txt /tmp/ ================================================ FILE: integration/dockerfiles-with-context/issue-721/test.txt ================================================ meow ================================================ FILE: integration/dockerfiles-with-context/issue-774/Dockerfile ================================================ # Copyright 2020 Google, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. FROM phusion/baseimage:0.11 ADD test-file /etc/service/file ================================================ FILE: integration/dockerfiles-with-context/issue-774/test-file ================================================ ================================================ FILE: integration/ignore/bar ================================================ ================================================ FILE: integration/ignore/baz ================================================ ================================================ FILE: integration/ignore/foo ================================================ ================================================ FILE: integration/ignore_relative/bar ================================================ ================================================ FILE: integration/ignore_relative/baz ================================================ ================================================ FILE: integration/ignore_relative/foo ================================================ ================================================ FILE: integration/images.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "bytes" "context" "fmt" "os" "os/exec" "path" "path/filepath" "runtime" "strconv" "strings" "testing" "time" "cloud.google.com/go/storage" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/pkg/util/bucket" ) const ( // ExecutorImage is the name of the kaniko executor image ExecutorImage = "executor-image" // WarmerImage is the name of the kaniko cache warmer image WarmerImage = "warmer-image" dockerPrefix = "docker-" kanikoPrefix = "kaniko-" buildContextPath = "/workspace" cacheDir = "/workspace/cache" baseImageToCache = "gcr.io/google-appengine/debian9@sha256:1d6a9a6d106bd795098f60f4abb7083626354fa6735e81743c7f8cfca11259f0" ) // Arguments to build Dockerfiles with, used for both docker and kaniko builds var argsMap = map[string][]string{ "Dockerfile_test_run": {"file=/file"}, "Dockerfile_test_run_new": {"file=/file"}, "Dockerfile_test_run_redo": {"file=/file"}, "Dockerfile_test_workdir": {"workdir=/arg/workdir"}, "Dockerfile_test_add": {"file=context/foo"}, "Dockerfile_test_arg_secret": {"SSH_PRIVATE_KEY", "SSH_PUBLIC_KEY=Pµbl1cK€Y"}, "Dockerfile_test_onbuild": {"file=/tmp/onbuild"}, "Dockerfile_test_scratch": { "image=scratch", "hello=hello-value", "file=context/foo", "file3=context/b*", }, "Dockerfile_test_multistage": {"file=/foo2"}, } // Environment to build Dockerfiles with, used for both docker and kaniko builds var envsMap = map[string][]string{ "Dockerfile_test_arg_secret": {"SSH_PRIVATE_KEY=ThEPriv4t3Key"}, "Dockerfile_test_copyadd_chmod": {"DOCKER_BUILDKIT=1"}, } // Arguments to build Dockerfiles with when building with docker var additionalDockerFlagsMap = map[string][]string{ "Dockerfile_test_target": {"--target=second"}, } // Arguments to build Dockerfiles with when building with kaniko var additionalKanikoFlagsMap = map[string][]string{ "Dockerfile_test_add": {"--single-snapshot"}, "Dockerfile_test_run_new": {"--use-new-run=true"}, "Dockerfile_test_run_redo": {"--snapshot-mode=redo"}, "Dockerfile_test_scratch": {"--single-snapshot"}, "Dockerfile_test_maintainer": {"--single-snapshot"}, "Dockerfile_test_target": {"--target=second"}, "Dockerfile_test_snapshotter_ignorelist": {"--use-new-run=true", "-v=trace"}, } // output check to do when building with kaniko var outputChecks = map[string]func(string, []byte) error{ "Dockerfile_test_arg_secret": checkArgsNotPrinted, "Dockerfile_test_snapshotter_ignorelist": func(_ string, out []byte) error { for _, s := range []string{ "Adding whiteout for /dev", } { if strings.Contains(string(out), s) { return fmt.Errorf("output must not contain %s", s) } } for _, s := range []string{ "Resolved symlink /hello to /dev/null", "Path /dev/null is ignored, ignoring it", } { if !strings.Contains(string(out), s) { return fmt.Errorf("output must contain %s", s) } } return nil }, } // Checks if argument are not printed in output. // Argument may be passed through --build-arg key=value manner or --build-arg key with key in environment func checkArgsNotPrinted(dockerfile string, out []byte) error { for _, arg := range argsMap[dockerfile] { argSplitted := strings.Split(arg, "=") if len(argSplitted) == 2 { if idx := bytes.Index(out, []byte(argSplitted[1])); idx >= 0 { return fmt.Errorf("Argument value %s for argument %s displayed in output", argSplitted[1], argSplitted[0]) } } else if len(argSplitted) == 1 { if envs, ok := envsMap[dockerfile]; ok { for _, env := range envs { envSplitted := strings.Split(env, "=") if len(envSplitted) == 2 { if idx := bytes.Index(out, []byte(envSplitted[1])); idx >= 0 { return fmt.Errorf("Argument value %s for argument %s displayed in output", envSplitted[1], argSplitted[0]) } } } } } } return nil } var ( bucketContextTests = []string{"Dockerfile_test_copy_bucket"} reproducibleTests = []string{"Dockerfile_test_reproducible"} ) // GetDockerImage constructs the name of the docker image that would be built with // dockerfile if it was tagged with imageRepo. func GetDockerImage(imageRepo, dockerfile string) string { return strings.ToLower(imageRepo + dockerPrefix + dockerfile) } // GetKanikoImage constructs the name of the kaniko image that would be built with // dockerfile if it was tagged with imageRepo. func GetKanikoImage(imageRepo, dockerfile string) string { return strings.ToLower(imageRepo + kanikoPrefix + dockerfile) } // GetVersionedKanikoImage versions constructs the name of the kaniko image that would be built // with the dockerfile and versions it for cache testing func GetVersionedKanikoImage(imageRepo, dockerfile string, version int) string { return strings.ToLower(imageRepo + kanikoPrefix + dockerfile + strconv.Itoa(version)) } // FindDockerFiles will look for test docker files in the directory dir // and match the files against dockerfilesPattern. // If the file is one we are intentionally // skipping, it will not be included in the returned list. func FindDockerFiles(dir, dockerfilesPattern string) ([]string, error) { pattern := filepath.Join(dir, dockerfilesPattern) fmt.Printf("finding docker images with pattern %v\n", pattern) allDockerfiles, err := filepath.Glob(pattern) if err != nil { return []string{}, fmt.Errorf("Failed to find docker files with pattern %s: %w", dockerfilesPattern, err) } var dockerfiles []string for _, dockerfile := range allDockerfiles { // Remove the leading directory from the path dockerfile = dockerfile[len("dockerfiles/"):] dockerfiles = append(dockerfiles, dockerfile) } return dockerfiles, err } // DockerFileBuilder knows how to build docker files using both Kaniko and Docker and // keeps track of which files have been built. type DockerFileBuilder struct { // Holds all available docker files and whether or not they've been built filesBuilt map[string]struct{} DockerfilesToIgnore map[string]struct{} TestCacheDockerfiles map[string]struct{} TestOCICacheDockerfiles map[string]struct{} } type logger func(string, ...interface{}) // NewDockerFileBuilder will create a DockerFileBuilder initialized with dockerfiles, which // it will assume are all as yet unbuilt. func NewDockerFileBuilder() *DockerFileBuilder { d := DockerFileBuilder{ filesBuilt: map[string]struct{}{}, } d.DockerfilesToIgnore = map[string]struct{}{ "Dockerfile_test_add_404": {}, // TODO: remove test_user_run from this when https://github.com/GoogleContainerTools/container-diff/issues/237 is fixed "Dockerfile_test_user_run": {}, // TODO: All the below tests are fialing with errro // You don't have the needed permissions to perform this operation, and you may have invalid credentials. // To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication "Dockerfile_test_onbuild": {}, "Dockerfile_test_extraction": {}, "Dockerfile_test_hardlink": {}, } d.TestCacheDockerfiles = map[string]struct{}{ "Dockerfile_test_cache": {}, "Dockerfile_test_cache_install": {}, "Dockerfile_test_cache_perm": {}, "Dockerfile_test_cache_copy": {}, } d.TestOCICacheDockerfiles = map[string]struct{}{ "Dockerfile_test_cache_oci": {}, "Dockerfile_test_cache_install_oci": {}, "Dockerfile_test_cache_perm_oci": {}, "Dockerfile_test_cache_copy_oci": {}, } return &d } func addServiceAccountFlags(flags []string, serviceAccount string) []string { if len(serviceAccount) > 0 { flags = append(flags, "-e", "GOOGLE_APPLICATION_CREDENTIALS=/secret/"+filepath.Base(serviceAccount), "-v", filepath.Dir(serviceAccount)+":/secret/") } else { gcloudConfig := os.Getenv("HOME") + "/.config/gcloud" if util.FilepathExists(gcloudConfig) { flags = append(flags, "-v", gcloudConfig+":/root/.config/gcloud") } dockerConfig := os.Getenv("HOME") + "/.docker/config.json" if util.FilepathExists(dockerConfig) { flags = append(flags, "-v", dockerConfig+":/root/.docker/config.json", "-e", "DOCKER_CONFIG=/root/.docker") } } return flags } func (d *DockerFileBuilder) BuildDockerImage(t *testing.T, imageRepo, dockerfilesPath, dockerfile, contextDir string) error { t.Logf("Building image for Dockerfile %s\n", dockerfile) var buildArgs []string buildArgFlag := "--build-arg" for _, arg := range argsMap[dockerfile] { buildArgs = append(buildArgs, buildArgFlag, arg) } // build docker image additionalFlags := append(buildArgs, additionalDockerFlagsMap[dockerfile]...) dockerImage := strings.ToLower(imageRepo + dockerPrefix + dockerfile) dockerArgs := []string{ "build", "--no-cache", "-t", dockerImage, } if dockerfilesPath != "" { dockerArgs = append(dockerArgs, "-f", path.Join(dockerfilesPath, dockerfile)) } dockerArgs = append(dockerArgs, contextDir) dockerArgs = append(dockerArgs, additionalFlags...) dockerCmd := exec.Command("docker", dockerArgs...) if env, ok := envsMap[dockerfile]; ok { dockerCmd.Env = append(dockerCmd.Env, env...) } out, err := RunCommandWithoutTest(dockerCmd) if err != nil { return fmt.Errorf("Failed to build image %s with docker command \"%s\": %w %s", dockerImage, dockerCmd.Args, err, string(out)) } t.Logf("Build image for Dockerfile %s as %s. docker build output: %s \n", dockerfile, dockerImage, out) return nil } // BuildImage will build dockerfile (located at dockerfilesPath) using both kaniko and docker. // The resulting image will be tagged with imageRepo. If the dockerfile will be built with // context (i.e. it is in `buildContextTests`) the context will be pulled from gcsBucket. func (d *DockerFileBuilder) BuildImage(t *testing.T, config *integrationTestConfig, dockerfilesPath, dockerfile string) error { _, ex, _, _ := runtime.Caller(0) cwd := filepath.Dir(ex) return d.BuildImageWithContext(t, config, dockerfilesPath, dockerfile, cwd) } func (d *DockerFileBuilder) BuildImageWithContext(t *testing.T, config *integrationTestConfig, dockerfilesPath, dockerfile, contextDir string) error { if _, present := d.filesBuilt[dockerfile]; present { return nil } gcsBucket, gcsClient, serviceAccount, imageRepo := config.gcsBucket, config.gcsClient, config.serviceAccount, config.imageRepo var buildArgs []string buildArgFlag := "--build-arg" for _, arg := range argsMap[dockerfile] { buildArgs = append(buildArgs, buildArgFlag, arg) } timer := timing.Start(dockerfile + "_docker") if err := d.BuildDockerImage(t, imageRepo, dockerfilesPath, dockerfile, contextDir); err != nil { return err } timing.DefaultRun.Stop(timer) contextFlag := "-c" contextPath := buildContextPath for _, d := range bucketContextTests { if d == dockerfile { contextFlag = "-b" contextPath = gcsBucket } } additionalKanikoFlags := additionalKanikoFlagsMap[dockerfile] additionalKanikoFlags = append(additionalKanikoFlags, contextFlag, contextPath) for _, d := range reproducibleTests { if d == dockerfile { additionalKanikoFlags = append(additionalKanikoFlags, "--reproducible") break } } kanikoImage := GetKanikoImage(imageRepo, dockerfile) timer = timing.Start(dockerfile + "_kaniko") if _, err := buildKanikoImage(t.Logf, dockerfilesPath, dockerfile, buildArgs, additionalKanikoFlags, kanikoImage, contextDir, gcsBucket, gcsClient, serviceAccount, true); err != nil { return err } timing.DefaultRun.Stop(timer) d.filesBuilt[dockerfile] = struct{}{} return nil } func populateVolumeCache() error { _, ex, _, _ := runtime.Caller(0) cwd := filepath.Dir(ex) warmerCmd := exec.Command("docker", append([]string{ "run", "--net=host", "-d", "-v", os.Getenv("HOME") + "/.config/gcloud:/root/.config/gcloud", "-v", cwd + ":/workspace", WarmerImage, "-c", cacheDir, "-i", baseImageToCache, }, )..., ) if _, err := RunCommandWithoutTest(warmerCmd); err != nil { return fmt.Errorf("Failed to warm kaniko cache: %w", err) } return nil } // buildCachedImage builds the image for testing caching via kaniko where version is the nth time this image has been built func (d *DockerFileBuilder) buildCachedImage(config *integrationTestConfig, cacheRepo, dockerfilesPath, dockerfile string, version int, args []string) error { imageRepo, serviceAccount := config.imageRepo, config.serviceAccount _, ex, _, _ := runtime.Caller(0) cwd := filepath.Dir(ex) cacheFlag := "--cache=true" benchmarkEnv := "BENCHMARK_FILE=false" if b, err := strconv.ParseBool(os.Getenv("BENCHMARK")); err == nil && b { os.Mkdir("benchmarks", 0o755) benchmarkEnv = "BENCHMARK_FILE=/workspace/benchmarks/" + dockerfile } kanikoImage := GetVersionedKanikoImage(imageRepo, dockerfile, version) dockerRunFlags := []string{ "run", "--net=host", "-v", cwd + ":/workspace", "-e", benchmarkEnv, } dockerRunFlags = addServiceAccountFlags(dockerRunFlags, serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", path.Join(buildContextPath, dockerfilesPath, dockerfile), "-d", kanikoImage, "-c", buildContextPath, cacheFlag, "--cache-repo", cacheRepo, "--cache-dir", cacheDir) for _, v := range args { dockerRunFlags = append(dockerRunFlags, v) } kanikoCmd := exec.Command("docker", dockerRunFlags...) _, err := RunCommandWithoutTest(kanikoCmd) if err != nil { return fmt.Errorf("Failed to build cached image %s with kaniko command \"%s\": %w", kanikoImage, kanikoCmd.Args, err) } return nil } // buildRelativePathsImage builds the images for testing passing relatives paths to Kaniko func (d *DockerFileBuilder) buildRelativePathsImage(imageRepo, dockerfile, serviceAccount, buildContextPath string) error { _, ex, _, _ := runtime.Caller(0) cwd := filepath.Dir(ex) dockerImage := GetDockerImage(imageRepo, "test_relative_"+dockerfile) kanikoImage := GetKanikoImage(imageRepo, "test_relative_"+dockerfile) dockerCmd := exec.Command("docker", append([]string{ "build", "-t", dockerImage, "-f", dockerfile, "./context", }, )..., ) timer := timing.Start(dockerfile + "_docker") out, err := RunCommandWithoutTest(dockerCmd) timing.DefaultRun.Stop(timer) if err != nil { return fmt.Errorf("Failed to build image %s with docker command \"%s\": %w %s", dockerImage, dockerCmd.Args, err, string(out)) } dockerRunFlags := []string{"run", "--net=host", "-v", cwd + ":/workspace"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "-c", buildContextPath) kanikoCmd := exec.Command("docker", dockerRunFlags...) timer = timing.Start(dockerfile + "_kaniko_relative_paths") out, err = RunCommandWithoutTest(kanikoCmd) timing.DefaultRun.Stop(timer) if err != nil { return fmt.Errorf( "Failed to build relative path image %s with kaniko command \"%s\": %w\n%s", kanikoImage, kanikoCmd.Args, err, string(out)) } return nil } func buildKanikoImage( logf logger, dockerfilesPath string, dockerfile string, buildArgs []string, kanikoArgs []string, kanikoImage string, contextDir string, gcsBucket string, gcsClient *storage.Client, serviceAccount string, shdUpload bool, ) (string, error) { benchmarkEnv := "BENCHMARK_FILE=false" benchmarkDir, err := os.MkdirTemp("", "") if err != nil { return "", err } if b, err := strconv.ParseBool(os.Getenv("BENCHMARK")); err == nil && b { benchmarkEnv = "BENCHMARK_FILE=/kaniko/benchmarks/" + dockerfile if shdUpload { benchmarkFile := path.Join(benchmarkDir, dockerfile) fileName := fmt.Sprintf("run_%s_%s", time.Now().Format("2006-01-02-15:04"), dockerfile) dst := path.Join("benchmarks", fileName) file, err := os.Open(benchmarkFile) if err != nil { return "", err } defer bucket.Upload(context.Background(), gcsBucket, dst, file, gcsClient) } } // build kaniko image additionalFlags := append(buildArgs, kanikoArgs...) logf("Going to build image with kaniko: %s, flags: %s \n", kanikoImage, additionalFlags) dockerRunFlags := []string{ "run", "--net=host", "-e", benchmarkEnv, "-v", contextDir + ":/workspace", "-v", benchmarkDir + ":/kaniko/benchmarks", } if env, ok := envsMap[dockerfile]; ok { for _, envVariable := range env { dockerRunFlags = append(dockerRunFlags, "-e", envVariable) } } dockerRunFlags = addServiceAccountFlags(dockerRunFlags, serviceAccount) kanikoDockerfilePath := path.Join(buildContextPath, dockerfilesPath, dockerfile) if dockerfilesPath == "" { kanikoDockerfilePath = path.Join(buildContextPath, "Dockerfile") } dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", kanikoDockerfilePath, "-d", kanikoImage, "--force", // TODO: detection of whether kaniko is being run inside a container might be broken? ) dockerRunFlags = append(dockerRunFlags, additionalFlags...) kanikoCmd := exec.Command("docker", dockerRunFlags...) out, err := RunCommandWithoutTest(kanikoCmd) if err != nil { return "", fmt.Errorf("Failed to build image %s with kaniko command \"%s\": %w\n%s", kanikoImage, kanikoCmd.Args, err, string(out)) } if outputCheck := outputChecks[dockerfile]; outputCheck != nil { if err := outputCheck(dockerfile, out); err != nil { return "", fmt.Errorf("Output check failed for image %s with kaniko command : %w\n%s", kanikoImage, err, string(out)) } } return benchmarkDir, nil } ================================================ FILE: integration/integration_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "archive/tar" "context" "encoding/json" "flag" "fmt" "io" "log" "math" "os" "os/exec" "path/filepath" "runtime" "strconv" "strings" "testing" "time" "github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/v1/daemon" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/pkg/errors" "google.golang.org/api/option" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/pkg/util/bucket" "github.com/GoogleContainerTools/kaniko/testutil" ) var ( config *integrationTestConfig imageBuilder *DockerFileBuilder allDockerfiles []string ) const ( daemonPrefix = "daemon://" integrationPath = "integration" dockerfilesPath = "dockerfiles" emptyContainerDiff = `[ { "Image1": "%s", "Image2": "%s", "DiffType": "File", "Diff": { "Adds": null, "Dels": null, "Mods": null } }, { "Image1": "%s", "Image2": "%s", "DiffType": "Metadata", "Diff": { "Adds": [], "Dels": [] } } ]` ) func getDockerMajorVersion() int { out, err := exec.Command("docker", "version", "--format", "{{.Server.Version}}").Output() if err != nil { log.Fatal("Error getting docker version of server:", err) } versionArr := strings.Split(string(out), ".") ver, err := strconv.Atoi(versionArr[0]) if err != nil { log.Fatal("Error getting docker version of server during parsing version string:", err) } return ver } func launchTests(m *testing.M) (int, error) { if config.isGcrRepository() { contextFilePath, err := CreateIntegrationTarball() if err != nil { return 1, errors.Wrap(err, "Failed to create tarball of integration files for build context") } bucketName, item, err := bucket.GetNameAndFilepathFromURI(config.gcsBucket) if err != nil { return 1, errors.Wrap(err, "failed to get bucket name from uri") } contextFile, err := os.Open(contextFilePath) if err != nil { return 1, fmt.Errorf("failed to read file at path %v: %w", contextFilePath, err) } err = bucket.Upload(context.Background(), bucketName, item, contextFile, config.gcsClient) if err != nil { return 1, errors.Wrap(err, "Failed to upload build context") } if err = os.Remove(contextFilePath); err != nil { return 1, errors.Wrap(err, fmt.Sprintf("Failed to remove tarball at %s", contextFilePath)) } deleteFunc := func() { bucket.Delete(context.Background(), bucketName, item, config.gcsClient) } RunOnInterrupt(deleteFunc) defer deleteFunc() } if err := buildRequiredImages(); err != nil { return 1, errors.Wrap(err, "Error while building images") } imageBuilder = NewDockerFileBuilder() return m.Run(), nil } func TestMain(m *testing.M) { var err error if !meetsRequirements() { fmt.Println("Missing required tools") os.Exit(1) } config = initIntegrationTestConfig() if allDockerfiles, err = FindDockerFiles(dockerfilesPath, config.dockerfilesPattern); err != nil { fmt.Println("Coudn't create map of dockerfiles", err) os.Exit(1) } exitCode, err := launchTests(m) if err != nil { fmt.Println(err) } os.Exit(exitCode) } func buildRequiredImages() error { setupCommands := []struct { name string command []string }{{ name: "Building kaniko image", command: []string{"docker", "build", "-t", ExecutorImage, "-f", "../deploy/Dockerfile", "--target", "kaniko-executor", ".."}, }, { name: "Building cache warmer image", command: []string{"docker", "build", "-t", WarmerImage, "-f", "../deploy/Dockerfile", "--target", "kaniko-warmer", ".."}, }, { name: "Building onbuild base image", command: []string{"docker", "build", "-t", config.onbuildBaseImage, "-f", fmt.Sprintf("%s/Dockerfile_onbuild_base", dockerfilesPath), "."}, }, { name: "Pushing onbuild base image", command: []string{"docker", "push", config.onbuildBaseImage}, }, { name: "Building hardlink base image", command: []string{"docker", "build", "-t", config.hardlinkBaseImage, "-f", fmt.Sprintf("%s/Dockerfile_hardlink_base", dockerfilesPath), "."}, }, { name: "Pushing hardlink base image", command: []string{"docker", "push", config.hardlinkBaseImage}, }} for _, setupCmd := range setupCommands { fmt.Println(setupCmd.name) cmd := exec.Command(setupCmd.command[0], setupCmd.command[1:]...) cmd.Env = append(os.Environ(), "DOCKER_BUILDKIT=1") // Build with buildkit enabled. if out, err := RunCommandWithoutTest(cmd); err != nil { return errors.Wrap(err, fmt.Sprintf("%s failed: %s", setupCmd.name, string(out))) } } return nil } func TestRun(t *testing.T) { for _, dockerfile := range allDockerfiles { t.Run("test_"+dockerfile, func(t *testing.T) { dockerfile := dockerfile t.Parallel() if _, ok := imageBuilder.DockerfilesToIgnore[dockerfile]; ok { t.SkipNow() } if _, ok := imageBuilder.TestCacheDockerfiles[dockerfile]; ok { t.SkipNow() } buildImage(t, dockerfile, imageBuilder) dockerImage := GetDockerImage(config.imageRepo, dockerfile) kanikoImage := GetKanikoImage(config.imageRepo, dockerfile) diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) }) } err := logBenchmarks("benchmark") if err != nil { t.Logf("Failed to create benchmark file: %v", err) } } func getBranchCommitAndURL() (branch, commit, url string) { repo := os.Getenv("GITHUB_REPOSITORY") commit = os.Getenv("GITHUB_SHA") if _, isPR := os.LookupEnv("GITHUB_HEAD_REF"); isPR { branch = "main" } else { branch = os.Getenv("GITHUB_REF") log.Printf("GITHUB_HEAD_REF is unset (not a PR); using GITHUB_REF=%q", branch) branch = strings.TrimPrefix(branch, "refs/heads/") } if repo == "" { repo = "GoogleContainerTools/kaniko" } if branch == "" { branch = "main" } log.Printf("repo=%q / commit=%q / branch=%q", repo, commit, branch) url = "github.com/" + repo return } func getGitRepo(explicit bool) string { branch, commit, url := getBranchCommitAndURL() if explicit && commit != "" { return url + "#" + commit } return url + "#refs/heads/" + branch } func testGitBuildcontextHelper(t *testing.T, repo string) { t.Log("testGitBuildcontextHelper repo", repo) dockerfile := fmt.Sprintf("%s/%s/Dockerfile_test_run_2", integrationPath, dockerfilesPath) // Build with docker dockerImage := GetDockerImage(config.imageRepo, "Dockerfile_test_git") dockerCmd := exec.Command("docker", append([]string{ "build", "-t", dockerImage, "-f", dockerfile, repo, })...) out, err := RunCommandWithoutTest(dockerCmd) if err != nil { t.Errorf("Failed to build image %s with docker command %q: %s %s", dockerImage, dockerCmd.Args, err, string(out)) } // Build with kaniko kanikoImage := GetKanikoImage(config.imageRepo, "Dockerfile_test_git") dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "-c", fmt.Sprintf("git://%s", repo)) kanikoCmd := exec.Command("docker", dockerRunFlags...) out, err = RunCommandWithoutTest(kanikoCmd) if err != nil { t.Errorf("Failed to build image %s with kaniko command %q: %v %s", dockerImage, kanikoCmd.Args, err, string(out)) } diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) } // TestGitBuildcontext explicitly names the main branch // Example: // // git://github.com/myuser/repo#refs/heads/main func TestGitBuildcontext(t *testing.T) { repo := getGitRepo(false) testGitBuildcontextHelper(t, repo) } // TestGitBuildcontextNoRef builds without any commit / branch reference // Example: // // git://github.com/myuser/repo func TestGitBuildcontextNoRef(t *testing.T) { t.Skip("Docker's behavior is to assume a 'master' branch, which the Kaniko repo doesn't have") _, _, url := getBranchCommitAndURL() testGitBuildcontextHelper(t, url) } // TestGitBuildcontextExplicitCommit uses an explicit commit hash instead of named reference // Example: // // git://github.com/myuser/repo#b873088c4a7b60bb7e216289c58da945d0d771b6 func TestGitBuildcontextExplicitCommit(t *testing.T) { repo := getGitRepo(true) testGitBuildcontextHelper(t, repo) } func TestGitBuildcontextSubPath(t *testing.T) { repo := getGitRepo(false) dockerfile := "Dockerfile_test_run_2" // Build with docker dockerImage := GetDockerImage(config.imageRepo, "Dockerfile_test_git") dockerCmd := exec.Command("docker", append([]string{ "build", "-t", dockerImage, "-f", filepath.Join(integrationPath, dockerfilesPath, dockerfile), repo, })...) out, err := RunCommandWithoutTest(dockerCmd) if err != nil { t.Errorf("Failed to build image %s with docker command %q: %s %s", dockerImage, dockerCmd.Args, err, string(out)) } // Build with kaniko kanikoImage := GetKanikoImage(config.imageRepo, "Dockerfile_test_git") dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append( dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "-c", fmt.Sprintf("git://%s", repo), "--context-sub-path", filepath.Join(integrationPath, dockerfilesPath), ) kanikoCmd := exec.Command("docker", dockerRunFlags...) out, err = RunCommandWithoutTest(kanikoCmd) if err != nil { t.Errorf("Failed to build image %s with kaniko command %q: %v %s", dockerImage, kanikoCmd.Args, err, string(out)) } diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) } func TestBuildViaRegistryMirrors(t *testing.T) { repo := getGitRepo(false) dockerfile := fmt.Sprintf("%s/%s/Dockerfile_registry_mirror", integrationPath, dockerfilesPath) // Build with docker dockerImage := GetDockerImage(config.imageRepo, "Dockerfile_registry_mirror") dockerCmd := exec.Command("docker", append([]string{ "build", "-t", dockerImage, "-f", dockerfile, repo, })...) out, err := RunCommandWithoutTest(dockerCmd) if err != nil { t.Errorf("Failed to build image %s with docker command %q: %s %s", dockerImage, dockerCmd.Args, err, string(out)) } // Build with kaniko kanikoImage := GetKanikoImage(config.imageRepo, "Dockerfile_registry_mirror") dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "--registry-mirror", "doesnotexist.example.com", "--registry-mirror", "us-mirror.gcr.io", "-c", fmt.Sprintf("git://%s", repo)) kanikoCmd := exec.Command("docker", dockerRunFlags...) out, err = RunCommandWithoutTest(kanikoCmd) if err != nil { t.Errorf("Failed to build image %s with kaniko command %q: %v %s", dockerImage, kanikoCmd.Args, err, string(out)) } diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) } func TestBuildViaRegistryMap(t *testing.T) { repo := getGitRepo(false) dockerfile := fmt.Sprintf("%s/%s/Dockerfile_registry_mirror", integrationPath, dockerfilesPath) // Build with docker dockerImage := GetDockerImage(config.imageRepo, "Dockerfile_registry_mirror") dockerCmd := exec.Command("docker", append([]string{ "build", "-t", dockerImage, "-f", dockerfile, repo, })...) out, err := RunCommandWithoutTest(dockerCmd) if err != nil { t.Errorf("Failed to build image %s with docker command %q: %s %s", dockerImage, dockerCmd.Args, err, string(out)) } // Build with kaniko kanikoImage := GetKanikoImage(config.imageRepo, "Dockerfile_registry_mirror") dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "--registry-map", "index.docker.io=doesnotexist.example.com", "--registry-map", "index.docker.io=us-mirror.gcr.io", "-c", fmt.Sprintf("git://%s", repo)) kanikoCmd := exec.Command("docker", dockerRunFlags...) out, err = RunCommandWithoutTest(kanikoCmd) if err != nil { t.Errorf("Failed to build image %s with kaniko command %q: %v %s", dockerImage, kanikoCmd.Args, err, string(out)) } diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) } func TestBuildSkipFallback(t *testing.T) { repo := getGitRepo(false) dockerfile := fmt.Sprintf("%s/%s/Dockerfile_registry_mirror", integrationPath, dockerfilesPath) // Build with kaniko kanikoImage := GetKanikoImage(config.imageRepo, "Dockerfile_registry_mirror") dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "--registry-mirror", "doesnotexist.example.com", "--skip-default-registry-fallback", "-c", fmt.Sprintf("git://%s", repo)) kanikoCmd := exec.Command("docker", dockerRunFlags...) _, err := RunCommandWithoutTest(kanikoCmd) if err == nil { t.Errorf("Build should fail after using skip-default-registry-fallback and registry-mirror fail to pull") } } // TestKanikoDir tests that a build that sets --kaniko-dir produces the same output as the equivalent docker build. func TestKanikoDir(t *testing.T) { repo := getGitRepo(false) dockerfile := fmt.Sprintf("%s/%s/Dockerfile_registry_mirror", integrationPath, dockerfilesPath) // Build with docker dockerImage := GetDockerImage(config.imageRepo, "Dockerfile_registry_mirror") dockerCmd := exec.Command("docker", append([]string{ "build", "-t", dockerImage, "-f", dockerfile, repo, })...) out, err := RunCommandWithoutTest(dockerCmd) if err != nil { t.Errorf("Failed to build image %s with docker command %q: %s %s", dockerImage, dockerCmd.Args, err, string(out)) } // Build with kaniko kanikoImage := GetKanikoImage(config.imageRepo, "Dockerfile_registry_mirror") dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "--kaniko-dir", "/not-kaniko", "-c", fmt.Sprintf("git://%s", repo)) kanikoCmd := exec.Command("docker", dockerRunFlags...) out, err = RunCommandWithoutTest(kanikoCmd) if err != nil { t.Errorf("Failed to build image %s with kaniko command %q: %v %s", dockerImage, kanikoCmd.Args, err, string(out)) } diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) } func TestBuildWithLabels(t *testing.T) { repo := getGitRepo(false) dockerfile := fmt.Sprintf("%s/%s/Dockerfile_test_label", integrationPath, dockerfilesPath) testLabel := "mylabel=myvalue" // Build with docker dockerImage := GetDockerImage(config.imageRepo, "Dockerfile_test_label:mylabel") dockerCmd := exec.Command("docker", append([]string{ "build", "-t", dockerImage, "-f", dockerfile, "--label", testLabel, repo, })...) out, err := RunCommandWithoutTest(dockerCmd) if err != nil { t.Errorf("Failed to build image %s with docker command %q: %s %s", dockerImage, dockerCmd.Args, err, string(out)) } // Build with kaniko kanikoImage := GetKanikoImage(config.imageRepo, "Dockerfile_test_label:mylabel") dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "--label", testLabel, "-c", fmt.Sprintf("git://%s", repo), ) kanikoCmd := exec.Command("docker", dockerRunFlags...) out, err = RunCommandWithoutTest(kanikoCmd) if err != nil { t.Errorf("Failed to build image %s with kaniko command %q: %v %s", dockerImage, kanikoCmd.Args, err, string(out)) } diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) } func TestBuildWithHTTPError(t *testing.T) { repo := getGitRepo(false) dockerfile := fmt.Sprintf("%s/%s/Dockerfile_test_add_404", integrationPath, dockerfilesPath) // Build with docker dockerImage := GetDockerImage(config.imageRepo, "Dockerfile_test_add_404") dockerCmd := exec.Command("docker", append([]string{ "build", "-t", dockerImage, "-f", dockerfile, repo, })...) out, err := RunCommandWithoutTest(dockerCmd) if err == nil { t.Errorf("an error was expected, got %s", string(out)) } // Build with kaniko kanikoImage := GetKanikoImage(config.imageRepo, "Dockerfile_test_add_404") dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-d", kanikoImage, "-c", fmt.Sprintf("git://%s", repo), ) kanikoCmd := exec.Command("docker", dockerRunFlags...) out, err = RunCommandWithoutTest(kanikoCmd) if err == nil { t.Errorf("an error was expected, got %s", string(out)) } } func TestLayers(t *testing.T) { offset := map[string]int{ "Dockerfile_test_add": 12, "Dockerfile_test_scratch": 3, } if os.Getenv("CI") == "true" { // TODO: tejaldesai fix this! // This files build locally with difference 0, on CI docker // produces a different amount of layers (?). offset["Dockerfile_test_copy_same_file_many_times"] = 47 offset["Dockerfile_test_meta_arg"] = 1 offset["Dockerfile_test_copyadd_chmod"] = 6 } for _, dockerfile := range allDockerfiles { t.Run("test_layer_"+dockerfile, func(t *testing.T) { dockerfileTest := dockerfile t.Parallel() if _, ok := imageBuilder.DockerfilesToIgnore[dockerfileTest]; ok { t.SkipNow() } buildImage(t, dockerfileTest, imageBuilder) // Pull the kaniko image dockerImage := GetDockerImage(config.imageRepo, dockerfileTest) kanikoImage := GetKanikoImage(config.imageRepo, dockerfileTest) pullCmd := exec.Command("docker", "pull", kanikoImage) RunCommand(pullCmd, t) checkLayers(t, dockerImage, kanikoImage, offset[dockerfileTest]) }) } err := logBenchmarks("benchmark_layers") if err != nil { t.Logf("Failed to create benchmark file: %v", err) } } func TestReplaceFolderWithFileOrLink(t *testing.T) { dockerfiles := []string{"TestReplaceFolderWithFile", "TestReplaceFolderWithLink"} for _, dockerfile := range dockerfiles { t.Run(dockerfile, func(t *testing.T) { buildImage(t, dockerfile, imageBuilder) kanikoImage := GetKanikoImage(config.imageRepo, dockerfile) kanikoFiles, err := getLastLayerFiles(kanikoImage) if err != nil { t.Fatal(err) } fmt.Println(kanikoFiles) for _, file := range kanikoFiles { if strings.HasPrefix(file, "a/.wh.") { t.Errorf("Last layer should not add whiteout files to deleted directory but found %s", file) } } }) } } func buildImage(t *testing.T, dockerfile string, imageBuilder *DockerFileBuilder) { t.Logf("Building image '%v'...", dockerfile) if err := imageBuilder.BuildImage(t, config, dockerfilesPath, dockerfile); err != nil { t.Errorf("Error building image: %s", err) t.FailNow() } return } // Build each image with kaniko twice, and then make sure they're exactly the same func TestCache(t *testing.T) { populateVolumeCache() // Build dockerfiles with registry cache for dockerfile := range imageBuilder.TestCacheDockerfiles { t.Run("test_cache_"+dockerfile, func(t *testing.T) { dockerfile := dockerfile cache := filepath.Join(config.imageRepo, "cache", fmt.Sprintf("%v", time.Now().UnixNano())) t.Parallel() verifyBuildWith(t, cache, dockerfile) }) } // Build dockerfiles with layout cache for dockerfile := range imageBuilder.TestOCICacheDockerfiles { t.Run("test_oci_cache_"+dockerfile, func(t *testing.T) { dockerfile := dockerfile cache := filepath.Join("oci:", cacheDir, "cached", fmt.Sprintf("%v", time.Now().UnixNano())) t.Parallel() verifyBuildWith(t, cache, dockerfile) }) } if err := logBenchmarks("benchmark_cache"); err != nil { t.Logf("Failed to create benchmark file: %v", err) } } // Attempt to warm an image two times : first time should populate the cache, second time should find the image in the cache. func TestWarmerTwice(t *testing.T) { _, ex, _, _ := runtime.Caller(0) cwd := filepath.Dir(ex) + "/tmpCache" // Start a sleeping warmer container dockerRunFlags := []string{"run", "--net=host"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, "--memory=16m", "-v", cwd+":/cache", WarmerImage, "--cache-dir=/cache", "-i", "debian:trixie-slim") warmCmd := exec.Command("docker", dockerRunFlags...) out, err := RunCommandWithoutTest(warmCmd) if err != nil { t.Fatalf("Unable to perform first warming: %s", err) } t.Logf("First warm output: %s", out) warmCmd = exec.Command("docker", dockerRunFlags...) out, err = RunCommandWithoutTest(warmCmd) if err != nil { t.Fatalf("Unable to perform second warming: %s", err) } t.Logf("Second warm output: %s", out) } func verifyBuildWith(t *testing.T, cache, dockerfile string) { args := []string{} if strings.HasPrefix(dockerfile, "Dockerfile_test_cache_copy") { args = append(args, "--cache-copy-layers=true") } // Build the initial image which will cache layers if err := imageBuilder.buildCachedImage(config, cache, dockerfilesPath, dockerfile, 0, args); err != nil { t.Fatalf("error building cached image for the first time: %v", err) } // Build the second image which should pull from the cache if err := imageBuilder.buildCachedImage(config, cache, dockerfilesPath, dockerfile, 1, args); err != nil { t.Fatalf("error building cached image for the second time: %v", err) } // Make sure both images are the same kanikoVersion0 := GetVersionedKanikoImage(config.imageRepo, dockerfile, 0) kanikoVersion1 := GetVersionedKanikoImage(config.imageRepo, dockerfile, 1) diff := containerDiff(t, kanikoVersion0, kanikoVersion1) expected := fmt.Sprintf(emptyContainerDiff, kanikoVersion0, kanikoVersion1, kanikoVersion0, kanikoVersion1) checkContainerDiffOutput(t, diff, expected) } func TestRelativePaths(t *testing.T) { dockerfile := "Dockerfile_relative_copy" t.Run("test_relative_"+dockerfile, func(t *testing.T) { t.Parallel() dockerfile = filepath.Join("./dockerfiles", dockerfile) contextPath := "./context" err := imageBuilder.buildRelativePathsImage( config.imageRepo, dockerfile, config.serviceAccount, contextPath, ) if err != nil { t.Fatal(err) } dockerImage := GetDockerImage(config.imageRepo, "test_relative_"+dockerfile) kanikoImage := GetKanikoImage(config.imageRepo, "test_relative_"+dockerfile) diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) }) } func TestExitCodePropagation(t *testing.T) { currentDir, err := os.Getwd() if err != nil { t.Fatal("Could not get working dir") } context := fmt.Sprintf("%s/testdata/exit-code-propagation", currentDir) dockerfile := fmt.Sprintf("%s/Dockerfile_exit_code_propagation", context) t.Run("test error code propagation", func(t *testing.T) { // building the image with docker should fail with exit code 42 dockerImage := GetDockerImage(config.imageRepo, "Dockerfile_exit_code_propagation") dockerFlags := []string{ "build", "-t", dockerImage, "-f", dockerfile, } dockerCmd := exec.Command("docker", append(dockerFlags, context)...) out, kanikoErr := RunCommandWithoutTest(dockerCmd) if kanikoErr == nil { t.Fatalf("docker build did not produce an error:\n%s", out) } var dockerCmdExitErr *exec.ExitError var dockerExitCode int if errors.As(kanikoErr, &dockerCmdExitErr) { dockerExitCode = dockerCmdExitErr.ExitCode() testutil.CheckDeepEqual(t, 42, dockerExitCode) if t.Failed() { t.Fatalf("Output was:\n%s", out) } } else { t.Fatalf("did not produce the expected error:\n%s", out) } // try to build the same image with kaniko the error code should match with the one from the plain docker build contextVolume := fmt.Sprintf("%s:/workspace", context) dockerFlags = []string{ "run", "-v", contextVolume, } dockerFlags = addServiceAccountFlags(dockerFlags, "") dockerFlags = append(dockerFlags, ExecutorImage, "-c", "dir:///workspace/", "-f", "./Dockerfile_exit_code_propagation", "--no-push", "--force", // TODO: detection of whether kaniko is being run inside a container might be broken? ) dockerCmdWithKaniko := exec.Command("docker", dockerFlags...) out, kanikoErr = RunCommandWithoutTest(dockerCmdWithKaniko) if kanikoErr == nil { t.Fatalf("the kaniko build did not produce the expected error:\n%s", out) } var kanikoExitErr *exec.ExitError if errors.As(kanikoErr, &kanikoExitErr) { testutil.CheckDeepEqual(t, dockerExitCode, kanikoExitErr.ExitCode()) if t.Failed() { t.Fatalf("Output was:\n%s", out) } } else { t.Fatalf("did not produce the expected error:\n%s", out) } }) } type fileDiff struct { Name string `json:"Name"` Size int `json:"Size"` } type fileDiffResult struct { Adds []fileDiff `json:"Adds"` Dels []fileDiff `json:"Dels"` } type metaDiffResult struct { Adds []string `json:"Adds"` Dels []string `json:"Dels"` } type diffOutput struct { Image1 string Image2 string DiffType string Diff interface{} } func (diff *diffOutput) UnmarshalJSON(data []byte) error { type Alias diffOutput aux := &struct{ *Alias }{Alias: (*Alias)(diff)} var rawJSON json.RawMessage aux.Diff = &rawJSON err := json.Unmarshal(data, &aux) if err != nil { return err } switch diff.DiffType { case "File": var dst fileDiffResult err = json.Unmarshal(rawJSON, &dst) diff.Diff = &dst case "Metadata": var dst metaDiffResult err = json.Unmarshal(rawJSON, &dst) diff.Diff = &dst } if err != nil { return err } return err } var allowedDiffPaths = []string{"/sys"} func checkContainerDiffOutput(t *testing.T, diff []byte, expected string) { // Let's compare the json objects themselves instead of strings to avoid // issues with spaces and indents t.Helper() diffInt := []diffOutput{} expectedInt := []diffOutput{} err := json.Unmarshal(diff, &diffInt) if err != nil { t.Error(err) } err = json.Unmarshal([]byte(expected), &expectedInt) if err != nil { t.Error(err) } // Some differences (ignored paths, etc.) are known and expected. fdr := diffInt[0].Diff.(*fileDiffResult) fdr.Adds = filterFileDiff(fdr.Adds) fdr.Dels = filterFileDiff(fdr.Dels) // Remove some of the meta diffs that shouldn't be checked mdr := diffInt[1].Diff.(*metaDiffResult) mdr.Adds = filterMetaDiff(mdr.Adds) mdr.Dels = filterMetaDiff(mdr.Dels) testutil.CheckErrorAndDeepEqual(t, false, nil, expectedInt, diffInt) } func filterMetaDiff(metaDiff []string) []string { // TODO remove this once we agree testing shouldn't run on docker 18.xx // currently docker 18.xx will build an image with Metadata set // ArgsEscaped: true, however Docker 19.xx will build an image and have // ArgsEscaped: false if config.dockerMajorVersion == 19 { return metaDiff } newDiffs := []string{} for _, meta := range metaDiff { if !strings.HasPrefix(meta, "ArgsEscaped") { newDiffs = append(newDiffs, meta) } } return newDiffs } func filterFileDiff(f []fileDiff) []fileDiff { var newDiffs []fileDiff for _, diff := range f { isIgnored := false for _, p := range allowedDiffPaths { if util.HasFilepathPrefix(diff.Name, p, false) { isIgnored = true break } } if !isIgnored { newDiffs = append(newDiffs, diff) } } return newDiffs } func checkLayers(t *testing.T, image1, image2 string, offset int) { t.Helper() img1, err := getImageDetails(image1) if err != nil { t.Fatalf("Couldn't get details from image reference for (%s): %s", image1, err) } img2, err := getImageDetails(image2) if err != nil { t.Fatalf("Couldn't get details from image reference for (%s): %s", image2, err) } actualOffset := int(math.Abs(float64(img1.numLayers - img2.numLayers))) if actualOffset != offset { t.Fatalf("Difference in number of layers in each image is %d but should be %d. Image 1: %s, Image 2: %s", actualOffset, offset, img1, img2) } } func getImageDetails(image string) (*imageDetails, error) { ref, err := name.ParseReference(image, name.WeakValidation) if err != nil { return nil, fmt.Errorf("Couldn't parse referance to image %s: %w", image, err) } imgRef, err := daemon.Image(ref) if err != nil { return nil, fmt.Errorf("Couldn't get reference to image %s from daemon: %w", image, err) } layers, err := imgRef.Layers() if err != nil { return nil, fmt.Errorf("Error getting layers for image %s: %w", image, err) } digest, err := imgRef.Digest() if err != nil { return nil, fmt.Errorf("Error getting digest for image %s: %w", image, err) } return &imageDetails{ name: image, numLayers: len(layers), digest: digest.Hex, }, nil } func getLastLayerFiles(image string) ([]string, error) { ref, err := name.ParseReference(image, name.WeakValidation) if err != nil { return nil, fmt.Errorf("Couldn't parse referance to image %s: %w", image, err) } imgRef, err := remote.Image(ref) if err != nil { return nil, fmt.Errorf("Couldn't get reference to image %s from daemon: %w", image, err) } layers, err := imgRef.Layers() if err != nil { return nil, fmt.Errorf("Error getting layers for image %s: %w", image, err) } readCloser, err := layers[len(layers)-1].Uncompressed() if err != nil { return nil, err } tr := tar.NewReader(readCloser) var files []string for { hdr, err := tr.Next() if errors.Is(err, io.EOF) { break } if err != nil { return nil, err } files = append(files, hdr.Name) } return files, nil } func logBenchmarks(benchmark string) error { if b, err := strconv.ParseBool(os.Getenv("BENCHMARK")); err == nil && b { f, err := os.Create(benchmark) if err != nil { return err } f.WriteString(timing.Summary()) defer f.Close() } return nil } type imageDetails struct { name string numLayers int digest string } func (i imageDetails) String() string { return fmt.Sprintf("Image: [%s] Digest: [%s] Number of Layers: [%d]", i.name, i.digest, i.numLayers) } func initIntegrationTestConfig() *integrationTestConfig { var c integrationTestConfig var gcsEndpoint string var disableGcsAuth bool flag.StringVar(&c.gcsBucket, "bucket", "gs://kaniko-test-bucket", "The gcs bucket argument to uploaded the tar-ed contents of the `integration` dir to.") flag.StringVar(&c.imageRepo, "repo", "gcr.io/kaniko-test", "The (docker) image repo to build and push images to during the test. `gcloud` must be authenticated with this repo or serviceAccount must be set.") flag.StringVar(&c.serviceAccount, "serviceAccount", "", "The path to the service account push images to GCR and upload/download files to GCS.") flag.StringVar(&gcsEndpoint, "gcs-endpoint", "", "Custom endpoint for GCS. Used for local integration tests") flag.BoolVar(&disableGcsAuth, "disable-gcs-auth", false, "Disable GCS Authentication. Used for local integration tests") // adds the possibility to run a single dockerfile. This is useful since running all images can exhaust the dockerhub pull limit flag.StringVar(&c.dockerfilesPattern, "dockerfiles-pattern", "Dockerfile_test*", "The pattern to match dockerfiles with") flag.Parse() if len(c.serviceAccount) > 0 { absPath, err := filepath.Abs("../" + c.serviceAccount) if err != nil { log.Fatalf("Error getting absolute path for service account: %s\n", c.serviceAccount) } if _, err := os.Stat(absPath); os.IsNotExist(err) { log.Fatalf("Service account does not exist: %s\n", absPath) } c.serviceAccount = absPath os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", absPath) } if c.imageRepo == "" { log.Fatal("You must provide a image repository") } if c.isGcrRepository() && c.gcsBucket == "" { log.Fatalf("You must provide a gcs bucket when using a Google Container Registry (\"%s\" was provided)", c.imageRepo) } if !strings.HasSuffix(c.imageRepo, "/") { c.imageRepo = c.imageRepo + "/" } if c.gcsBucket != "" { var opts []option.ClientOption if gcsEndpoint != "" { opts = append(opts, option.WithEndpoint(gcsEndpoint)) } if disableGcsAuth { opts = append(opts, option.WithoutAuthentication()) } gcsClient, err := bucket.NewClient(context.Background(), opts...) if err != nil { log.Fatalf("Could not create a new Google Storage Client: %s", err) } c.gcsClient = gcsClient } c.dockerMajorVersion = getDockerMajorVersion() c.onbuildBaseImage = c.imageRepo + "onbuild-base:latest" c.hardlinkBaseImage = c.imageRepo + "hardlink-base:latest" return &c } func meetsRequirements() bool { requiredTools := []string{"container-diff"} hasRequirements := true for _, tool := range requiredTools { _, err := exec.LookPath(tool) if err != nil { fmt.Printf("You must have %s installed and on your PATH\n", tool) hasRequirements = false } } return hasRequirements } // containerDiff compares the container images image1 and image2. func containerDiff(t *testing.T, image1, image2 string, flags ...string) []byte { // workaround for container-diff OCI issue https://github.com/GoogleContainerTools/container-diff/issues/389 if !strings.HasPrefix(image1, daemonPrefix) { dockerPullCmd := exec.Command("docker", "pull", image1) out := RunCommand(dockerPullCmd, t) t.Logf("docker pull cmd output for image1 = %s", string(out)) image1 = daemonPrefix + image1 } if !strings.HasPrefix(image2, daemonPrefix) { dockerPullCmd := exec.Command("docker", "pull", image2) out := RunCommand(dockerPullCmd, t) t.Logf("docker pull cmd output for image2 = %s", string(out)) image2 = daemonPrefix + image2 } flags = append([]string{"diff"}, flags...) flags = append(flags, image1, image2, "-q", "--type=file", "--type=metadata", "--json") containerdiffCmd := exec.Command("container-diff", flags...) diff := RunCommand(containerdiffCmd, t) t.Logf("diff = %s", string(diff)) return diff } ================================================ FILE: integration/integration_with_context_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "fmt" "io/fs" "os" "path/filepath" "testing" ) func TestWithContext(t *testing.T) { cwd, err := os.Getwd() if err != nil { t.Fatal(err) } dir := filepath.Join(cwd, "dockerfiles-with-context") entries, err := os.ReadDir(dir) if err != nil { t.Fatal(err) } testDirs := make([]fs.FileInfo, 0, len(entries)) for _, entry := range entries { info, err := entry.Info() if err != nil { t.Fatal(err) } testDirs = append(testDirs, info) } builder := NewDockerFileBuilder() for _, tdInfo := range testDirs { name := tdInfo.Name() testDir := filepath.Join(dir, name) t.Run("test_with_context_"+name, func(t *testing.T) { t.Parallel() if err := builder.BuildImageWithContext( t, config, "", name, testDir, ); err != nil { t.Fatal(err) } dockerImage := GetDockerImage(config.imageRepo, name) kanikoImage := GetKanikoImage(config.imageRepo, name) diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) }) } if err := logBenchmarks("benchmark"); err != nil { t.Logf("Failed to create benchmark file: %v", err) } } ================================================ FILE: integration/integration_with_stdin_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "compress/gzip" "fmt" "os" "os/exec" "path/filepath" "runtime" "sync" "testing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/testutil" ) func TestBuildWithStdin(t *testing.T) { _, ex, _, _ := runtime.Caller(0) cwd := filepath.Dir(ex) testDir := "test_dir" testDirLongPath := filepath.Join(cwd, testDir) if err := os.MkdirAll(testDirLongPath, 0750); err != nil { t.Errorf("Failed to create dir_where_to_extract: %v", err) } dockerfile := "Dockerfile_test_stdin" files := map[string]string{ dockerfile: "FROM debian:10.13\nRUN echo \"hey\"", } if err := testutil.SetupFiles(testDir, files); err != nil { t.Errorf("Failed to setup files %v on %s: %v", files, testDir, err) } if err := os.Chdir(testDir); err != nil { t.Fatalf("Failed to Chdir on %s: %v", testDir, err) } tarPath := fmt.Sprintf("%s.tar.gz", dockerfile) var wg sync.WaitGroup wg.Add(1) // Create Tar Gz File with dockerfile inside go func(wg *sync.WaitGroup) { defer wg.Done() tarFile, err := os.Create(tarPath) if err != nil { t.Errorf("Failed to create %s: %v", tarPath, err) } defer tarFile.Close() gw := gzip.NewWriter(tarFile) defer gw.Close() tw := util.NewTar(gw) defer tw.Close() if err := tw.AddFileToTar(dockerfile); err != nil { t.Errorf("Failed to add %s to %s: %v", dockerfile, tarPath, err) } }(&wg) // Waiting for the Tar Gz file creation to be done before moving on wg.Wait() // Build with docker dockerImage := GetDockerImage(config.imageRepo, dockerfile) dockerCmd := exec.Command("docker", append([]string{"build", "-t", dockerImage, "-f", dockerfile, "."})...) _, err := RunCommandWithoutTest(dockerCmd) if err != nil { t.Fatalf("can't run %s: %v", dockerCmd.String(), err) } // Build with kaniko using Stdin kanikoImageStdin := GetKanikoImage(config.imageRepo, dockerfile) tarCmd := exec.Command("tar", "-cf", "-", dockerfile) gzCmd := exec.Command("gzip", "-9") dockerRunFlags := []string{"run", "--interactive", "--net=host", "-v", cwd + ":/workspace"} dockerRunFlags = addServiceAccountFlags(dockerRunFlags, config.serviceAccount) dockerRunFlags = append(dockerRunFlags, ExecutorImage, "-f", dockerfile, "-c", "tar://stdin", "-d", kanikoImageStdin) kanikoCmdStdin := exec.Command("docker", dockerRunFlags...) gzCmd.Stdin, err = tarCmd.StdoutPipe() if err != nil { t.Fatalf("can't set gzCmd stdin: %v", err) } kanikoCmdStdin.Stdin, err = gzCmd.StdoutPipe() if err != nil { t.Fatalf("can't set kanikoCmd stdin: %v", err) } if err := kanikoCmdStdin.Start(); err != nil { t.Fatalf("can't start %s: %v", kanikoCmdStdin.String(), err) } if err := gzCmd.Start(); err != nil { t.Fatalf("can't start %s: %v", gzCmd.String(), err) } if err := tarCmd.Run(); err != nil { t.Fatalf("can't start %s: %v", tarCmd.String(), err) } if err := gzCmd.Wait(); err != nil { t.Fatalf("can't wait %s: %v", gzCmd.String(), err) } if err := kanikoCmdStdin.Wait(); err != nil { t.Fatalf("can't wait %s: %v", kanikoCmdStdin.String(), err) } diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImageStdin, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImageStdin, dockerImage, kanikoImageStdin) checkContainerDiffOutput(t, diff, expected) if err := os.RemoveAll(testDirLongPath); err != nil { t.Errorf("Failed to remove %s: %v", testDirLongPath, err) } } ================================================ FILE: integration/k8s-job.yaml ================================================ apiVersion: batch/v1 kind: Job metadata: name: kaniko-test-{{.Name}} spec: template: spec: hostNetwork: true containers: - name: kaniko image: localhost:5000/executor:latest workingDir: /workspace args: [ "--context=dir:///workspace", "--destination={{.KanikoImage}}"] volumeMounts: - name: context mountPath: /workspace restartPolicy: Never volumes: - name: context hostPath: path: {{.Context}} backoffLimit: 1 ================================================ FILE: integration/k8s_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "fmt" "io/fs" "log" "os" "os/exec" "path/filepath" "testing" "text/template" ) type K8sConfig struct { KanikoImage string Context string Name string } func TestK8s(t *testing.T) { cwd, err := os.Getwd() if err != nil { t.Fatal(err) } dir := filepath.Join(cwd, "dockerfiles-with-context") entries, err := os.ReadDir(dir) if err != nil { t.Fatal(err) } testDirs := make([]fs.FileInfo, 0, len(entries)) for _, entry := range entries { info, err := entry.Info() if err != nil { t.Fatal(err) } testDirs = append(testDirs, info) } builder := NewDockerFileBuilder() for _, tdInfo := range testDirs { name := tdInfo.Name() testDir := filepath.Join(dir, name) t.Run("test_k8s_with_context_"+name, func(t *testing.T) { t.Parallel() if err := builder.BuildDockerImage( t, config.imageRepo, "", name, testDir, ); err != nil { t.Fatal(err) } dockerImage := GetDockerImage(config.imageRepo, name) kanikoImage := GetKanikoImage(config.imageRepo, name) tmpfile, err := os.CreateTemp("", "k8s-job-*.yaml") if err != nil { log.Fatal(err) } defer os.Remove(tmpfile.Name()) // clean up tmpl := template.Must(template.ParseFiles("k8s-job.yaml")) job := K8sConfig{KanikoImage: kanikoImage, Context: testDir, Name: name} if err := tmpl.Execute(tmpfile, job); err != nil { t.Fatal(err) } t.Logf("Testing K8s based Kaniko building of dockerfile %s and push to %s \n", testDir, kanikoImage) content, err := os.ReadFile(tmpfile.Name()) if err != nil { log.Fatal(err) } t.Logf("K8s template %s:\n%s\n", tmpfile.Name(), content) kubeCmd := exec.Command("kubectl", "apply", "-f", tmpfile.Name()) RunCommand(kubeCmd, t) t.Logf("Waiting for K8s kaniko build job to finish: %s\n", "job/kaniko-test-"+job.Name) kubeWaitCmd := exec.Command("kubectl", "wait", "--for=condition=complete", "--timeout=2m", "job/kaniko-test-"+job.Name) if out, errR := RunCommandWithoutTest(kubeWaitCmd); errR != nil { t.Log(kubeWaitCmd.Args) t.Log(string(out)) descCmd := exec.Command("kubectl", "describe", "job/kaniko-test-"+job.Name) outD, errD := RunCommandWithoutTest(descCmd) if errD != nil { t.Error(errD) } else { t.Log(string(outD)) } descCmd = exec.Command("kubectl", "describe", "pods", "--selector", "job-name=kaniko-test-"+job.Name) outD, errD = RunCommandWithoutTest(descCmd) if errD != nil { t.Error(errD) } else { t.Log(string(outD)) } logsCmd := exec.Command("kubectl", "logs", "--all-containers", "job/kaniko-test-"+job.Name) outL, errL := RunCommandWithoutTest(logsCmd) if errL != nil { t.Error(errL) } else { t.Log(string(outL)) } t.Fatal(errR) } diff := containerDiff(t, daemonPrefix+dockerImage, kanikoImage, "--no-cache") expected := fmt.Sprintf(emptyContainerDiff, dockerImage, kanikoImage, dockerImage, kanikoImage) checkContainerDiffOutput(t, diff, expected) }) } if err := logBenchmarks("benchmark"); err != nil { t.Logf("Failed to create benchmark file: %v", err) } } ================================================ FILE: integration/tar.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package integration import ( "compress/gzip" "fmt" "log" "os" "time" "github.com/GoogleContainerTools/kaniko/pkg/util" ) // CreateIntegrationTarball will take the contents of the integration directory and write // them to a tarball in a temmporary dir. It will return the path to the tarball. func CreateIntegrationTarball() (string, error) { log.Println("Creating tarball of integration test files to use as build context") dir, err := os.Getwd() if err != nil { return "nil", fmt.Errorf("Failed find path to integration dir: %w", err) } tempDir, err := os.MkdirTemp("", "") if err != nil { return "", fmt.Errorf("Failed to create temporary directory to hold tarball: %w", err) } contextFilePath := fmt.Sprintf("%s/context_%d.tar.gz", tempDir, time.Now().UnixNano()) file, err := os.OpenFile(contextFilePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { return "", err } gzipWriter := gzip.NewWriter(file) defer gzipWriter.Close() err = util.CreateTarballOfDirectory(dir, file) if err != nil { return "", fmt.Errorf("creating tarball of integration dir: %w", err) } return contextFilePath, nil } ================================================ FILE: integration/testdata/Dockerfile.trivial ================================================ FROM ubuntu RUN echo Hello ================================================ FILE: integration/testdata/build.yaml ================================================ schemaVersion: "1.0.0" commandTests: - name: Trivial build command: ["/kaniko/executor", "--no-push", "--dockerfile", "./Dockerfile.trivial"] exitCode: 0 ================================================ FILE: integration/testdata/exec.yaml ================================================ schemaVersion: "1.0.0" commandTests: - name: check fixed name command: ["/kaniko/executor"] expectedError: ['Usage:'] exitCode: 1 - name: check PATH command: ["executor"] expectedError: ['Usage:'] exitCode: 1 ================================================ FILE: integration/testdata/exit-code-propagation/Dockerfile_exit_code_propagation ================================================ FROM alpine:latest RUN exit 42 CMD ["sleep", "1"] ================================================ FILE: integration/testdata/files.yaml ================================================ schemaVersion: "1.0.0" fileExistenceTests: # Basic FS sanity checks. - name: root path: '/' shouldExist: true - name: certs path: '/kaniko/ssl/certs/ca-certificates.crt' shouldExist: true - name: certs path: '/etc/nsswitch.conf' shouldExist: true ================================================ FILE: integration/testdata/testfiles.yaml ================================================ schemaVersion: "1.0.0" fileExistenceTests: # Basic FS sanity checks. - name: trivial testdata Dockerfile path: '/workspace/Dockerfile.trivial' shouldExist: true ================================================ FILE: logo/README.md ================================================ Thank you @ggcarlosr for this awesome logo! ================================================ FILE: pkg/buildcontext/azureblob.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "context" "errors" "os" "path/filepath" "strings" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" kConfig "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/util" ) // AzureBlob struct for Azure Blob Storage processing type AzureBlob struct { context string } // Download context file from given azure blob storage url and unpack it to BuildContextDir func (b *AzureBlob) UnpackTarFromBuildContext() (string, error) { // Get Azure_STORAGE_ACCESS_KEY from environment variables accountKey := os.Getenv("AZURE_STORAGE_ACCESS_KEY") if len(accountKey) == 0 { return "", errors.New("AZURE_STORAGE_ACCESS_KEY environment variable is not set") } // Get storage accountName for Azure Blob Storage parts, err := azblob.ParseURL(b.context) if err != nil { return parts.Host, err } accountName := strings.Split(parts.Host, ".")[0] // Generate credential with accountName and accountKey credential, err := azblob.NewSharedKeyCredential(accountName, accountKey) if err != nil { return parts.Host, err } // Create directory and target file for downloading the context file directory := kConfig.BuildContextDir tarPath := filepath.Join(directory, constants.ContextTar) file, err := util.CreateTargetTarfile(tarPath) if err != nil { return tarPath, err } // Downloading context file from Azure Blob Storage client, err := azblob.NewClientWithSharedKeyCredential(b.context, credential, nil) if err != nil { return parts.Host, err } ctx := context.Background() if _, err := client.DownloadFile(ctx, parts.ContainerName, parts.BlobName, file, nil); err != nil { return parts.Host, err } if err := util.UnpackCompressedTar(tarPath, directory); err != nil { return tarPath, err } // Remove the tar so it doesn't interfere with subsequent commands return directory, os.Remove(tarPath) } ================================================ FILE: pkg/buildcontext/buildcontext.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "errors" "strings" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/util" ) const ( TarBuildContextPrefix = "tar://" ) type BuildOptions struct { GitBranch string GitSingleBranch bool GitRecurseSubmodules bool InsecureSkipTLS bool } // BuildContext unifies calls to download and unpack the build context. type BuildContext interface { // Unpacks a build context and returns the directory where it resides UnpackTarFromBuildContext() (string, error) } // GetBuildContext parses srcContext for the prefix and returns related buildcontext // parser func GetBuildContext(srcContext string, opts BuildOptions) (BuildContext, error) { split := strings.SplitAfter(srcContext, "://") if len(split) > 1 { prefix := split[0] context := split[1] switch prefix { case constants.GCSBuildContextPrefix: return &GCS{context: srcContext}, nil case constants.S3BuildContextPrefix: return &S3{context: srcContext}, nil case constants.LocalDirBuildContextPrefix: return &Dir{context: context}, nil case constants.GitBuildContextPrefix: return &Git{context: context, opts: opts}, nil case constants.HTTPSBuildContextPrefix: if util.ValidAzureBlobStorageHost(srcContext) { return &AzureBlob{context: srcContext}, nil } return &HTTPSTar{context: srcContext}, nil case TarBuildContextPrefix: return &Tar{context: context}, nil } } return nil, errors.New("unknown build context prefix provided, please use one of the following: gs://, dir://, tar://, s3://, git://, https://") } ================================================ FILE: pkg/buildcontext/dir.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext // Dir unifies calls to download and unpack the build context. type Dir struct { context string } // UnpackTarFromBuildContext just provides a directory with already extracted content func (f *Dir) UnpackTarFromBuildContext() (string, error) { return f.context, nil } ================================================ FILE: pkg/buildcontext/gcs.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "fmt" "io" "os" "path/filepath" kConfig "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/pkg/util/bucket" "github.com/sirupsen/logrus" "golang.org/x/net/context" ) // GCS struct for Google Cloud Storage processing type GCS struct { context string } func (g *GCS) UnpackTarFromBuildContext() (string, error) { bucketName, filepath, err := bucket.GetNameAndFilepathFromURI(g.context) if err != nil { return "", fmt.Errorf("getting bucketname and filepath from context: %w", err) } return kConfig.BuildContextDir, unpackTarFromGCSBucket(bucketName, filepath, kConfig.BuildContextDir) } func UploadToBucket(r io.Reader, dest string) error { ctx := context.Background() bucketName, filepath, err := bucket.GetNameAndFilepathFromURI(dest) if err != nil { return fmt.Errorf("getting bucketname and filepath from dest: %w", err) } client, err := bucket.NewClient(ctx) if err != nil { return err } return bucket.Upload(ctx, bucketName, filepath, r, client) } // unpackTarFromGCSBucket unpacks the context.tar.gz file in the given bucket to the given directory func unpackTarFromGCSBucket(bucketName, item, directory string) error { // Get the tar from the bucket tarPath, err := getTarFromBucket(bucketName, item, directory) if err != nil { return err } logrus.Debug("Unpacking source context tar...") if err := util.UnpackCompressedTar(tarPath, directory); err != nil { return err } // Remove the tar so it doesn't interfere with subsequent commands logrus.Debugf("Deleting %s", tarPath) return os.Remove(tarPath) } // getTarFromBucket gets context.tar.gz from the GCS bucket and saves it to the filesystem // It returns the path to the tar file func getTarFromBucket(bucketName, filepathInBucket, directory string) (string, error) { ctx := context.Background() client, err := bucket.NewClient(ctx) if err != nil { return "", err } // Get the tarfile context.tar.gz from the GCS bucket, and save it to a tar object reader, err := bucket.ReadCloser(ctx, bucketName, filepathInBucket, client) if err != nil { return "", err } defer reader.Close() tarPath := filepath.Join(directory, constants.ContextTar) if err := util.CreateFile(tarPath, reader, 0600, 0, 0); err != nil { return "", err } logrus.Debugf("Copied tarball %s from GCS bucket %s to %s", constants.ContextTar, bucketName, tarPath) return tarPath, nil } ================================================ FILE: pkg/buildcontext/git.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "errors" "fmt" "os" "strings" kConfig "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/go-git/go-billy/v5/osfs" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/cache" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/http" "github.com/go-git/go-git/v5/storage/filesystem" "github.com/sirupsen/logrus" ) const ( gitPullMethodEnvKey = "GIT_PULL_METHOD" gitPullMethodHTTPS = "https" gitPullMethodHTTP = "http" gitAuthUsernameEnvKey = "GIT_USERNAME" gitAuthPasswordEnvKey = "GIT_PASSWORD" gitAuthTokenEnvKey = "GIT_TOKEN" ) var ( supportedGitPullMethods = map[string]bool{gitPullMethodHTTPS: true, gitPullMethodHTTP: true} ) // Git unifies calls to download and unpack the build context. type Git struct { context string opts BuildOptions } // UnpackTarFromBuildContext will provide the directory where Git Repository is Cloned func (g *Git) UnpackTarFromBuildContext() (string, error) { directory := kConfig.BuildContextDir parts := strings.Split(g.context, "#") url := getGitPullMethod() + "://" + parts[0] options := git.CloneOptions{ URL: url, Auth: getGitAuth(), Progress: os.Stdout, SingleBranch: g.opts.GitSingleBranch, RecurseSubmodules: getRecurseSubmodules(g.opts.GitRecurseSubmodules), InsecureSkipTLS: g.opts.InsecureSkipTLS, } var fetchRef string var checkoutRef string if len(parts) > 1 { if plumbing.IsHash(parts[1]) || !strings.HasPrefix(parts[1], "refs/pull/") { // Handle any non-branch refs separately. First, clone the repo HEAD, and // then fetch and check out the fetchRef. fetchRef = parts[1] if plumbing.IsHash(parts[1]) { checkoutRef = fetchRef } else { // The ReferenceName still needs to be present in the options passed // to the clone operation for non-hash references of private repositories. options.ReferenceName = plumbing.ReferenceName(fetchRef) } } else { // Branches will be cloned directly. options.ReferenceName = plumbing.ReferenceName(parts[1]) } } if branch := g.opts.GitBranch; branch != "" { ref, err := getGitReferenceName(directory, url, branch) if err != nil { return directory, err } options.ReferenceName = ref } logrus.Debugf("Getting source from reference %s", options.ReferenceName) r, err := git.PlainClone(directory, false, &options) if err != nil { return directory, err } if fetchRef != "" { err = r.Fetch(&git.FetchOptions{ RemoteName: "origin", Auth: getGitAuth(), RefSpecs: []config.RefSpec{config.RefSpec(fetchRef + ":" + fetchRef)}, }) if err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) { return directory, err } } if len(parts) > 2 { checkoutRef = parts[2] } if checkoutRef != "" { // ... retrieving the commit being pointed by HEAD _, err := r.Head() if err != nil { return directory, err } w, err := r.Worktree() if err != nil { return directory, err } // ... checking out to desired commit err = w.Checkout(&git.CheckoutOptions{ Hash: plumbing.NewHash(checkoutRef), }) if err != nil { return directory, err } } return directory, nil } func getGitReferenceName(directory string, url string, branch string) (plumbing.ReferenceName, error) { var remote = git.NewRemote( filesystem.NewStorage( osfs.New(directory), cache.NewObjectLRUDefault(), ), &config.RemoteConfig{ URLs: []string{url}, }, ) refs, err := remote.List(&git.ListOptions{ Auth: getGitAuth(), }) if err != nil { return plumbing.HEAD, err } if ref := plumbing.NewBranchReferenceName(branch); gitRefExists(ref, refs) { return ref, nil } if ref := plumbing.NewTagReferenceName(branch); gitRefExists(ref, refs) { return ref, nil } return plumbing.HEAD, fmt.Errorf("invalid branch: %s", branch) } func gitRefExists(ref plumbing.ReferenceName, refs []*plumbing.Reference) bool { for _, ref2 := range refs { if ref.String() == ref2.Name().String() { return true } } return false } func getRecurseSubmodules(v bool) git.SubmoduleRescursivity { if v { return git.DefaultSubmoduleRecursionDepth } return git.NoRecurseSubmodules } func getGitAuth() transport.AuthMethod { username := os.Getenv(gitAuthUsernameEnvKey) password := os.Getenv(gitAuthPasswordEnvKey) token := os.Getenv(gitAuthTokenEnvKey) if token != "" { username = token password = "" } if username != "" || password != "" { return &http.BasicAuth{ Username: username, Password: password, } } return nil } func getGitPullMethod() string { gitPullMethod := os.Getenv(gitPullMethodEnvKey) if ok := supportedGitPullMethods[gitPullMethod]; !ok { gitPullMethod = gitPullMethodHTTPS } return gitPullMethod } ================================================ FILE: pkg/buildcontext/git_test.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "os" "testing" "github.com/GoogleContainerTools/kaniko/testutil" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/http" ) func TestGetGitPullMethod(t *testing.T) { tests := []struct { testName string setEnv func() (expectedValue string) }{ { testName: "noEnv", setEnv: func() (expectedValue string) { expectedValue = gitPullMethodHTTPS return }, }, { testName: "emptyEnv", setEnv: func() (expectedValue string) { _ = os.Setenv(gitPullMethodEnvKey, "") expectedValue = gitPullMethodHTTPS return }, }, { testName: "httpEnv", setEnv: func() (expectedValue string) { err := os.Setenv(gitPullMethodEnvKey, gitPullMethodHTTP) if nil != err { expectedValue = gitPullMethodHTTPS } else { expectedValue = gitPullMethodHTTP } return }, }, { testName: "httpsEnv", setEnv: func() (expectedValue string) { _ = os.Setenv(gitPullMethodEnvKey, gitPullMethodHTTPS) expectedValue = gitPullMethodHTTPS return }, }, { testName: "unknownEnv", setEnv: func() (expectedValue string) { _ = os.Setenv(gitPullMethodEnvKey, "unknown") expectedValue = gitPullMethodHTTPS return }, }, } for _, tt := range tests { t.Run(tt.testName, func(t *testing.T) { expectedValue := tt.setEnv() testutil.CheckDeepEqual(t, expectedValue, getGitPullMethod()) }) } } func TestGetGitAuth(t *testing.T) { tests := []struct { testName string setEnv func() (expectedValue transport.AuthMethod) }{ { testName: "noEnv", setEnv: func() (expectedValue transport.AuthMethod) { expectedValue = nil return }, }, { testName: "emptyUsernameEnv", setEnv: func() (expectedValue transport.AuthMethod) { _ = os.Setenv(gitAuthUsernameEnvKey, "") expectedValue = nil return }, }, { testName: "emptyPasswordEnv", setEnv: func() (expectedValue transport.AuthMethod) { _ = os.Setenv(gitAuthPasswordEnvKey, "") expectedValue = nil return }, }, { testName: "emptyEnv", setEnv: func() (expectedValue transport.AuthMethod) { _ = os.Setenv(gitAuthUsernameEnvKey, "") _ = os.Setenv(gitAuthPasswordEnvKey, "") expectedValue = nil return }, }, { testName: "withUsername", setEnv: func() (expectedValue transport.AuthMethod) { username := "foo" _ = os.Setenv(gitAuthUsernameEnvKey, username) expectedValue = &http.BasicAuth{Username: username} return }, }, { testName: "withPassword", setEnv: func() (expectedValue transport.AuthMethod) { pass := "super-secret-password-1234" _ = os.Setenv(gitAuthPasswordEnvKey, pass) expectedValue = &http.BasicAuth{Password: pass} return }, }, { testName: "withUsernamePassword", setEnv: func() (expectedValue transport.AuthMethod) { username := "foo" pass := "super-secret-password-1234" _ = os.Setenv(gitAuthUsernameEnvKey, username) _ = os.Setenv(gitAuthPasswordEnvKey, pass) expectedValue = &http.BasicAuth{Username: username, Password: pass} return }, }, { testName: "withToken", setEnv: func() (expectedValue transport.AuthMethod) { token := "some-other-token" _ = os.Setenv(gitAuthTokenEnvKey, token) expectedValue = &http.BasicAuth{Username: token} return }, }, { testName: "withTokenUsernamePassword", setEnv: func() (expectedValue transport.AuthMethod) { username := "foo-user" token := "some-token-45678" pass := "some-password-12345" _ = os.Setenv(gitAuthUsernameEnvKey, username) _ = os.Setenv(gitAuthPasswordEnvKey, pass) _ = os.Setenv(gitAuthTokenEnvKey, token) expectedValue = &http.BasicAuth{Username: token} return }, }, } for _, tt := range tests { t.Run(tt.testName, func(t *testing.T) { // Make sure to unset environment vars to get a clean test each time defer clearTestAuthEnv() expectedValue := tt.setEnv() testutil.CheckDeepEqual(t, expectedValue, getGitAuth()) }) } } func clearTestAuthEnv() { _ = os.Unsetenv(gitAuthUsernameEnvKey) _ = os.Unsetenv(gitAuthPasswordEnvKey) } ================================================ FILE: pkg/buildcontext/https.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "fmt" "io" "net/http" "os" "path/filepath" kConfig "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/sirupsen/logrus" ) // HTTPSTar struct for https tar.gz files processing type HTTPSTar struct { context string } // UnpackTarFromBuildContext downloads context file from https server func (h *HTTPSTar) UnpackTarFromBuildContext() (directory string, err error) { logrus.Info("Retrieving https tar file") // Create directory and target file for downloading the context file directory = kConfig.BuildContextDir tarPath := filepath.Join(directory, constants.ContextTar) file, err := util.CreateTargetTarfile(tarPath) if err != nil { return } // Download tar file from remote https server // and save it into the target tar file resp, err := http.Get(h.context) //nolint:noctx if err != nil { return } defer func() { if closeErr := resp.Body.Close(); err == nil && closeErr != nil { err = closeErr } }() if resp.StatusCode != http.StatusOK { return directory, fmt.Errorf("HTTPSTar bad status from server: %s", resp.Status) } if _, err = io.Copy(file, resp.Body); err != nil { return tarPath, err } logrus.Info("Retrieved https tar file") if err = util.UnpackCompressedTar(tarPath, directory); err != nil { return } logrus.Info("Extracted https tar file") // Remove the tar so it doesn't interfere with subsequent commands return directory, os.Remove(tarPath) } ================================================ FILE: pkg/buildcontext/https_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "net/http" "net/http/httptest" "testing" ) func TestBuildWithHttpsTar(t *testing.T) { tests := []struct { name string serverHandler http.HandlerFunc }{ { name: "test http bad status", serverHandler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadRequest) _, err := w.Write([]byte("corrupted message")) if err != nil { t.Fatalf("Error sending response: %v", err) } }), }, { name: "test http bad data", serverHandler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) _, err := w.Write([]byte("corrupted message")) if err != nil { t.Fatalf("Error sending response: %v", err) } }), }, } for _, tcase := range tests { t.Run(tcase.name, func(t *testing.T) { server := httptest.NewServer(tcase.serverHandler) defer server.Close() context := &HTTPSTar{ context: server.URL + "/data.tar.gz", } _, err := context.UnpackTarFromBuildContext() if err == nil { t.Fatalf("Error expected but not returned: %s", err) } }) } } ================================================ FILE: pkg/buildcontext/s3.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "context" "fmt" "os" "path/filepath" "strings" kConfig "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/pkg/util/bucket" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" s3manager "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "github.com/aws/aws-sdk-go-v2/service/s3" ) // S3 unifies calls to download and unpack the build context. type S3 struct { context string } // UnpackTarFromBuildContext download and untar a file from s3 func (s *S3) UnpackTarFromBuildContext() (string, error) { bucket, item, err := bucket.GetNameAndFilepathFromURI(s.context) if err != nil { return "", fmt.Errorf("getting bucketname and filepath from context: %w", err) } endpoint := os.Getenv(constants.S3EndpointEnv) forcePath := false if strings.ToLower(os.Getenv(constants.S3ForcePathStyle)) == "true" { forcePath = true } customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { if endpoint != "" { return aws.Endpoint{ URL: endpoint, }, nil } return aws.Endpoint{}, &aws.EndpointNotFoundError{} }) cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithEndpointResolverWithOptions(customResolver)) if err != nil { return bucket, err } client := s3.NewFromConfig(cfg, func(options *s3.Options) { if endpoint != "" { options.UsePathStyle = forcePath } }) downloader := s3manager.NewDownloader(client) directory := kConfig.BuildContextDir tarPath := filepath.Join(directory, constants.ContextTar) if err := os.MkdirAll(directory, 0750); err != nil { return directory, err } file, err := os.Create(tarPath) if err != nil { return directory, err } _, err = downloader.Download(context.TODO(), file, &s3.GetObjectInput{ Bucket: aws.String(bucket), Key: aws.String(item), }) if err != nil { return directory, err } return directory, util.UnpackCompressedTar(tarPath, directory) } ================================================ FILE: pkg/buildcontext/tar.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "compress/gzip" "fmt" "os" kConfig "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) // Tar unifies calls to download and unpack the build context. type Tar struct { context string } // UnpackTarFromBuildContext unpack the compressed tar file func (t *Tar) UnpackTarFromBuildContext() (string, error) { directory := kConfig.BuildContextDir if err := os.MkdirAll(directory, 0750); err != nil { return "", errors.Wrap(err, "unpacking tar from build context") } if t.context == "stdin" { fi, _ := os.Stdin.Stat() if (fi.Mode() & os.ModeCharDevice) != 0 { return "", fmt.Errorf("no data found.. don't forget to add the '--interactive, -i' flag") } logrus.Infof("To simulate EOF and exit, press 'Ctrl+D'") // if launched through docker in interactive mode and without piped data // process will be stuck here until EOF is sent gzr, err := gzip.NewReader(os.Stdin) if err != nil { return directory, err } defer gzr.Close() _, err = util.UnTar(gzr, directory) return directory, err } return directory, util.UnpackCompressedTar(t.context, directory) } ================================================ FILE: pkg/buildcontext/tar_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package buildcontext import ( "bytes" "compress/gzip" "fmt" "os" "path/filepath" "runtime" "sync" "testing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/testutil" ) func TestBuildWithLocalTar(t *testing.T) { _, ex, _, _ := runtime.Caller(0) cwd := filepath.Dir(ex) testDir := "test_dir" testDirLongPath := filepath.Join(cwd, testDir) dirUnpack := filepath.Join(testDirLongPath, "dir_where_to_unpack") if err := os.MkdirAll(dirUnpack, 0750); err != nil { t.Errorf("Failed to create dir_where_to_extract: %v", err) } validDockerfile := "Dockerfile_valid" invalidDockerfile := "Dockerfile_invalid" nonExistingDockerfile := "Dockerfile_non_existing" files := map[string]string{ validDockerfile: "FROM debian:10.13\nRUN echo \"valid\"", invalidDockerfile: "FROM debian:10.13\nRUN echo \"invalid\"", } if err := testutil.SetupFiles(testDir, files); err != nil { t.Errorf("Failed to setup files %v on %s: %v", files, testDir, err) } if err := os.Chdir(testDir); err != nil { t.Fatalf("Failed to Chdir on %s: %v", testDir, err) } validTarPath := fmt.Sprintf("%s.tar.gz", validDockerfile) invalidTarPath := fmt.Sprintf("%s.tar.gz", invalidDockerfile) nonExistingTarPath := fmt.Sprintf("%s.tar.gz", nonExistingDockerfile) var wg sync.WaitGroup wg.Add(1) // Create Tar Gz File with dockerfile inside go func(wg *sync.WaitGroup) { defer wg.Done() validTarFile, err := os.Create(validTarPath) if err != nil { t.Errorf("Failed to create %s: %v", validTarPath, err) } defer validTarFile.Close() invalidTarFile, err := os.Create(invalidTarPath) if err != nil { t.Errorf("Failed to create %s: %v", invalidTarPath, err) } defer invalidTarFile.Close() gw := gzip.NewWriter(validTarFile) defer gw.Close() tw := util.NewTar(gw) defer tw.Close() if err := tw.AddFileToTar(validDockerfile); err != nil { t.Errorf("Failed to add %s to %s: %v", validDockerfile, validTarPath, err) } }(&wg) // Waiting for the Tar Gz file creation to be done before moving on wg.Wait() tests := []struct { dockerfile string srcContext string unpackShouldErr bool srcShaShouldErr bool destShaShouldErr bool }{ { dockerfile: validDockerfile, srcContext: filepath.Join(testDir, validTarPath), unpackShouldErr: false, srcShaShouldErr: false, destShaShouldErr: false, }, { dockerfile: invalidDockerfile, srcContext: filepath.Join(testDir, invalidTarPath), unpackShouldErr: true, srcShaShouldErr: false, destShaShouldErr: true, }, { dockerfile: nonExistingDockerfile, srcContext: filepath.Join(testDir, nonExistingTarPath), unpackShouldErr: true, srcShaShouldErr: true, destShaShouldErr: true, }, } for _, tt := range tests { t.Run(tt.dockerfile, func(t *testing.T) { err := util.UnpackCompressedTar(filepath.Join(cwd, tt.srcContext), dirUnpack) testutil.CheckError(t, tt.unpackShouldErr, err) srcSHA, err := getSHAFromFilePath(tt.dockerfile) testutil.CheckError(t, tt.srcShaShouldErr, err) destSHA, err := getSHAFromFilePath(filepath.Join(dirUnpack, tt.dockerfile)) testutil.CheckError(t, tt.destShaShouldErr, err) if err == nil { testutil.CheckDeepEqual(t, srcSHA, destSHA) } }) } if err := os.RemoveAll(testDirLongPath); err != nil { t.Errorf("Failed to remove %s: %v", testDirLongPath, err) } } func getSHAFromFilePath(f string) (string, error) { data, err := os.ReadFile(f) if err != nil { return "", err } sha, err := util.SHA256(bytes.NewReader(data)) if err != nil { return "", err } return sha, nil } ================================================ FILE: pkg/cache/cache.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cache import ( "fmt" "os" "path" "path/filepath" "strings" "time" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/creds" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/layout" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) // LayerCache is the layer cache type LayerCache interface { RetrieveLayer(string) (v1.Image, error) } // RegistryCache is the registry cache type RegistryCache struct { Opts *config.KanikoOptions } // RetrieveLayer retrieves a layer from the cache given the cache key ck. func (rc *RegistryCache) RetrieveLayer(ck string) (v1.Image, error) { cache, err := Destination(rc.Opts, ck) if err != nil { return nil, errors.Wrap(err, "getting cache destination") } logrus.Infof("Checking for cached layer %s...", cache) cacheRef, err := name.NewTag(cache, name.WeakValidation) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("getting reference for %s", cache)) } registryName := cacheRef.Repository.Registry.Name() if rc.Opts.Insecure || rc.Opts.InsecureRegistries.Contains(registryName) { newReg, err := name.NewRegistry(registryName, name.WeakValidation, name.Insecure) if err != nil { return nil, err } cacheRef.Repository.Registry = newReg } tr, err := util.MakeTransport(rc.Opts.RegistryOptions, registryName) if err != nil { return nil, errors.Wrapf(err, "making transport for registry %q", registryName) } img, err := remote.Image(cacheRef, remote.WithTransport(tr), remote.WithAuthFromKeychain(creds.GetKeychain())) if err != nil { return nil, err } if err = verifyImage(img, rc.Opts.CacheTTL, cache); err != nil { return nil, err } return img, nil } func verifyImage(img v1.Image, cacheTTL time.Duration, cache string) error { cf, err := img.ConfigFile() if err != nil { return errors.Wrap(err, fmt.Sprintf("retrieving config file for %s", cache)) } expiry := cf.Created.Add(cacheTTL) // Layer is stale, rebuild it. if expiry.Before(time.Now()) { logrus.Infof("Cache entry expired: %s", cache) return fmt.Errorf("Cache entry expired: %s", cache) } // Force the manifest to be populated if _, err := img.RawManifest(); err != nil { return err } return nil } // LayoutCache is the OCI image layout cache type LayoutCache struct { Opts *config.KanikoOptions } func (lc *LayoutCache) RetrieveLayer(ck string) (v1.Image, error) { cache, err := Destination(lc.Opts, ck) if err != nil { return nil, errors.Wrap(err, "getting cache destination") } logrus.Infof("Checking for cached layer %s...", cache) var img v1.Image if img, err = locateImage(strings.TrimPrefix(cache, "oci:")); err != nil { return nil, errors.Wrap(err, "locating cache image") } if err = verifyImage(img, lc.Opts.CacheTTL, cache); err != nil { return nil, err } return img, nil } func locateImage(path string) (v1.Image, error) { var img v1.Image layoutPath, err := layout.FromPath(path) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("constructing layout path from %s", path)) } index, err := layoutPath.ImageIndex() if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("retrieving index file for %s", layoutPath)) } manifest, err := index.IndexManifest() if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("retrieving manifest file for %s", layoutPath)) } for _, m := range manifest.Manifests { // assume there is only one image img, err = layoutPath.Image(m.Digest) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("initializing image with digest %s", m.Digest.String())) } } if img == nil { return nil, fmt.Errorf("path contains no images") } return img, nil } // Destination returns the repo where the layer should be stored // If no cache is specified, one is inferred from the destination provided func Destination(opts *config.KanikoOptions, cacheKey string) (string, error) { cache := opts.CacheRepo if cache == "" { destination := opts.Destinations[0] destRef, err := name.NewTag(destination, name.WeakValidation) if err != nil { return "", errors.Wrap(err, "getting tag for destination") } return fmt.Sprintf("%s/cache:%s", destRef.Context(), cacheKey), nil } return fmt.Sprintf("%s:%s", cache, cacheKey), nil } // LocalSource retrieves a source image from a local cache given cacheKey func LocalSource(opts *config.CacheOptions, cacheKey string) (v1.Image, error) { cache := opts.CacheDir if cache == "" { return nil, nil } path := path.Join(cache, cacheKey) fi, err := os.Stat(path) if err != nil { msg := fmt.Sprintf("No file found for cache key %v %v", cacheKey, err) logrus.Debug(msg) return nil, NotFoundErr{msg: msg} } // A stale cache is a bad cache expiry := fi.ModTime().Add(opts.CacheTTL) if expiry.Before(time.Now()) { msg := fmt.Sprintf("Cached image is too old: %v", fi.ModTime()) logrus.Debug(msg) return nil, ExpiredErr{msg: msg} } logrus.Infof("Found %s in local cache", cacheKey) return cachedImageFromPath(path) } // cachedImage represents a v1.Tarball that is cached locally in a CAS. // Computing the digest for a v1.Tarball is very expensive. If the tarball // is named with the digest we can store this and return it directly rather // than recompute it. type cachedImage struct { digest string v1.Image mfst *v1.Manifest } func (c *cachedImage) Digest() (v1.Hash, error) { return v1.NewHash(c.digest) } func (c *cachedImage) Manifest() (*v1.Manifest, error) { if c.mfst == nil { return c.Image.Manifest() } return c.mfst, nil } func mfstFromPath(p string) (*v1.Manifest, error) { f, err := os.Open(p) if err != nil { return nil, err } defer f.Close() return v1.ParseManifest(f) } func cachedImageFromPath(p string) (v1.Image, error) { imgTar, err := tarball.ImageFromPath(p, nil) if err != nil { return nil, errors.Wrap(err, "getting image from path") } // Manifests may be present next to the tar, named with a ".json" suffix mfstPath := p + ".json" var mfst *v1.Manifest if _, err := os.Stat(mfstPath); err != nil { logrus.Debugf("Manifest does not exist at file: %s", mfstPath) } else { mfst, err = mfstFromPath(mfstPath) if err != nil { logrus.Debugf("Error parsing manifest from file: %s", mfstPath) } else { logrus.Infof("Found manifest at %s", mfstPath) } } return &cachedImage{ digest: filepath.Base(p), Image: imgTar, mfst: mfst, }, nil } ================================================ FILE: pkg/cache/doc_test.go ================================================ /* Copyright 2019 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cache import ( "bytes" "log" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/image/remote" ) func ExampleWarmer_Warm() { tarBuf := new(bytes.Buffer) manifestBuf := new(bytes.Buffer) w := &Warmer{ Remote: remote.RetrieveRemoteImage, Local: LocalSource, TarWriter: tarBuf, ManifestWriter: manifestBuf, } options := &config.WarmerOptions{} digest, err := w.Warm("ubuntu:latest", options) if err != nil { if !IsAlreadyCached(err) { log.Fatal(err) } } log.Printf("digest %v tar len %d\nmanifest:\n%s\n", digest, tarBuf.Len(), manifestBuf.String()) } ================================================ FILE: pkg/cache/errors.go ================================================ /* Copyright 2019 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cache import "errors" // IsAlreadyCached returns true if the supplied error is of the type AlreadyCachedErr // otherwise it returns false. func IsAlreadyCached(err error) bool { var e AlreadyCachedErr return errors.As(err, &e) } // AlreadyCachedErr is returned when the Docker image requested for caching is already // present in the cache. type AlreadyCachedErr struct { msg string } func (a AlreadyCachedErr) Error() string { return a.msg } // IsNotFound returns true if the supplied error is of the type NotFoundErr // otherwise it returns false. func IsNotFound(err error) bool { var e NotFoundErr return errors.As(err, &e) } // NotFoundErr is returned when the requested Docker image is not present in the cache. type NotFoundErr struct { msg string } func (e NotFoundErr) Error() string { return e.msg } // IsExpired returns true if the supplied error is of the type ExpiredErr // otherwise it returns false. func IsExpired(err error) bool { var e ExpiredErr return errors.As(err, &e) } // ExpiredErr is returned when the requested Docker image is present in the cache, but is // expired according to the supplied TTL. type ExpiredErr struct { msg string } func (e ExpiredErr) Error() string { return e.msg } ================================================ FILE: pkg/cache/warm.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cache import ( "fmt" "io" "net/http" "os" "path" "regexp" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/image/remote" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) // WarmCache populates the cache func WarmCache(opts *config.WarmerOptions) error { var dockerfileImages []string cacheDir := opts.CacheDir images := opts.Images // if opts.image is empty,we need to parse dockerfilepath to get images list if opts.DockerfilePath != "" { var err error if dockerfileImages, err = ParseDockerfile(opts); err != nil { return errors.Wrap(err, "failed to parse Dockerfile") } } // TODO: Implement deduplication logic later. images = append(images, dockerfileImages...) logrus.Debugf("%s\n", cacheDir) logrus.Debugf("%s\n", images) errs := 0 for _, img := range images { err := warmToFile(cacheDir, img, opts) if err != nil { logrus.Warnf("Error while trying to warm image: %v %v", img, err) errs++ } } if len(images) == errs { return errors.New("Failed to warm any of the given images") } return nil } // Download image in temporary files then move files to final destination func warmToFile(cacheDir, img string, opts *config.WarmerOptions) error { f, err := os.CreateTemp(cacheDir, "warmingImage.*") if err != nil { return err } // defer called in reverse order defer os.Remove(f.Name()) defer f.Close() mtfsFile, err := os.CreateTemp(cacheDir, "warmingManifest.*") if err != nil { return err } defer os.Remove(mtfsFile.Name()) defer mtfsFile.Close() cw := &Warmer{ Remote: remote.RetrieveRemoteImage, Local: LocalSource, TarWriter: f, ManifestWriter: mtfsFile, } digest, err := cw.Warm(img, opts) if err != nil { if IsAlreadyCached(err) { logrus.Infof("Image already in cache: %v", img) return nil } logrus.Warnf("Error while trying to warm image: %v %v", img, err) return err } finalCachePath := path.Join(cacheDir, digest.String()) finalMfstPath := finalCachePath + ".json" err = os.Rename(f.Name(), finalCachePath) if err != nil { return err } err = os.Rename(mtfsFile.Name(), finalMfstPath) if err != nil { return errors.Wrap(err, "Failed to rename manifest file") } logrus.Debugf("Wrote %s to cache", img) return nil } // FetchRemoteImage retrieves a Docker image manifest from a remote source. // github.com/GoogleContainerTools/kaniko/image/remote.RetrieveRemoteImage can be used as // this type. type FetchRemoteImage func(image string, opts config.RegistryOptions, customPlatform string) (v1.Image, error) // FetchLocalSource retrieves a Docker image manifest from a local source. // github.com/GoogleContainerTools/kaniko/cache.LocalSource can be used as // this type. type FetchLocalSource func(*config.CacheOptions, string) (v1.Image, error) // Warmer is used to prepopulate the cache with a Docker image type Warmer struct { Remote FetchRemoteImage Local FetchLocalSource TarWriter io.Writer ManifestWriter io.Writer } // Warm retrieves a Docker image and populates the supplied buffer with the image content and manifest // or returns an AlreadyCachedErr if the image is present in the cache. func (w *Warmer) Warm(image string, opts *config.WarmerOptions) (v1.Hash, error) { cacheRef, err := name.ParseReference(image, name.WeakValidation) if err != nil { return v1.Hash{}, errors.Wrapf(err, "Failed to verify image name: %s", image) } img, err := w.Remote(image, opts.RegistryOptions, opts.CustomPlatform) if err != nil || img == nil { return v1.Hash{}, errors.Wrapf(err, "Failed to retrieve image: %s", image) } digest, err := img.Digest() if err != nil { return v1.Hash{}, errors.Wrapf(err, "Failed to retrieve digest: %s", image) } if !opts.Force { _, err := w.Local(&opts.CacheOptions, digest.String()) if err == nil || IsExpired(err) { return v1.Hash{}, AlreadyCachedErr{} } } err = tarball.Write(cacheRef, img, w.TarWriter) if err != nil { return v1.Hash{}, errors.Wrapf(err, "Failed to write %s to tar buffer", image) } mfst, err := img.RawManifest() if err != nil { return v1.Hash{}, errors.Wrapf(err, "Failed to retrieve manifest for %s", image) } if _, err := w.ManifestWriter.Write(mfst); err != nil { return v1.Hash{}, errors.Wrapf(err, "Failed to save manifest to buffer for %s", image) } return digest, nil } func ParseDockerfile(opts *config.WarmerOptions) ([]string, error) { var err error var d []uint8 var baseNames []string match, _ := regexp.MatchString("^https?://", opts.DockerfilePath) if match { response, e := http.Get(opts.DockerfilePath) //nolint:noctx if e != nil { return nil, e } d, err = io.ReadAll(response.Body) } else { d, err = os.ReadFile(opts.DockerfilePath) } if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("reading dockerfile at path %s", opts.DockerfilePath)) } stages, _, err := dockerfile.Parse(d) if err != nil { return nil, errors.Wrap(err, "parsing dockerfile") } for i, s := range stages { resolvedBaseName, err := util.ResolveEnvironmentReplacement(s.BaseName, opts.BuildArgs, false) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("resolving base name %s", s.BaseName)) } if s.BaseName != resolvedBaseName { stages[i].BaseName = resolvedBaseName } baseNames = append(baseNames, resolvedBaseName) } return baseNames, nil } ================================================ FILE: pkg/cache/warm_test.go ================================================ /* Copyright 2019 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package cache import ( "bytes" "os" "testing" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/fakes" v1 "github.com/google/go-containerregistry/pkg/v1" ) const ( image = "foo:latest" ) func Test_Warmer_Warm_not_in_cache(t *testing.T) { tarBuf := new(bytes.Buffer) manifestBuf := new(bytes.Buffer) cw := &Warmer{ Remote: func(_ string, _ config.RegistryOptions, _ string) (v1.Image, error) { return fakes.FakeImage{}, nil }, Local: func(_ *config.CacheOptions, _ string) (v1.Image, error) { return nil, NotFoundErr{} }, TarWriter: tarBuf, ManifestWriter: manifestBuf, } opts := &config.WarmerOptions{} _, err := cw.Warm(image, opts) if err != nil { t.Errorf("expected error to be nil but was %v", err) t.FailNow() } if len(tarBuf.Bytes()) == 0 { t.Error("expected image to be written but buffer was empty") } } func Test_Warmer_Warm_in_cache_not_expired(t *testing.T) { tarBuf := new(bytes.Buffer) manifestBuf := new(bytes.Buffer) cw := &Warmer{ Remote: func(_ string, _ config.RegistryOptions, _ string) (v1.Image, error) { return fakes.FakeImage{}, nil }, Local: func(_ *config.CacheOptions, _ string) (v1.Image, error) { return fakes.FakeImage{}, nil }, TarWriter: tarBuf, ManifestWriter: manifestBuf, } opts := &config.WarmerOptions{} _, err := cw.Warm(image, opts) if !IsAlreadyCached(err) { t.Errorf("expected error to be already cached err but was %v", err) t.FailNow() } if len(tarBuf.Bytes()) != 0 { t.Errorf("expected nothing to be written") } } func Test_Warmer_Warm_in_cache_expired(t *testing.T) { tarBuf := new(bytes.Buffer) manifestBuf := new(bytes.Buffer) cw := &Warmer{ Remote: func(_ string, _ config.RegistryOptions, _ string) (v1.Image, error) { return fakes.FakeImage{}, nil }, Local: func(_ *config.CacheOptions, _ string) (v1.Image, error) { return fakes.FakeImage{}, ExpiredErr{} }, TarWriter: tarBuf, ManifestWriter: manifestBuf, } opts := &config.WarmerOptions{} _, err := cw.Warm(image, opts) if !IsAlreadyCached(err) { t.Errorf("expected error to be already cached err but was %v", err) t.FailNow() } if len(tarBuf.Bytes()) != 0 { t.Errorf("expected nothing to be written") } } func TestParseDockerfile_SingleStageDockerfile(t *testing.T) { dockerfile := `FROM alpine:latest LABEL maintainer="alexezio" ` tmpfile, err := os.CreateTemp("", "example") if err != nil { t.Fatal(err) } defer os.Remove(tmpfile.Name()) if _, err := tmpfile.Write([]byte(dockerfile)); err != nil { t.Fatal(err) } if err := tmpfile.Close(); err != nil { t.Fatal(err) } opts := &config.WarmerOptions{DockerfilePath: tmpfile.Name()} baseNames, err := ParseDockerfile(opts) if err != nil { t.Fatalf("expected no error, got %v", err) } if len(baseNames) != 1 { t.Fatalf("expected 1 base name, got %d", len(baseNames)) } if baseNames[0] != "alpine:latest" { t.Fatalf("expected 'alpine:latest', got '%s'", baseNames[0]) } } func TestParseDockerfile_MultiStageDockerfile(t *testing.T) { dockerfile := `FROM golang:1.20 as BUILDER LABEL maintainer="alexezio" FROM alpine:latest as RUNNER LABEL maintainer="alexezio" ` tmpfile, err := os.CreateTemp("", "example") if err != nil { t.Fatal(err) } defer os.Remove(tmpfile.Name()) if _, err := tmpfile.Write([]byte(dockerfile)); err != nil { t.Fatal(err) } if err := tmpfile.Close(); err != nil { t.Fatal(err) } opts := &config.WarmerOptions{DockerfilePath: tmpfile.Name()} baseNames, err := ParseDockerfile(opts) if err != nil { t.Fatalf("expected no error, got %v", err) } if len(baseNames) != 2 { t.Fatalf("expected 2 base name, got %d", len(baseNames)) } if baseNames[0] != "golang:1.20" { t.Fatalf("expected 'golang:1.20', got '%s'", baseNames[0]) } if baseNames[1] != "alpine:latest" { t.Fatalf("expected 'alpine:latest', got '%s'", baseNames[0]) } } func TestParseDockerfile_ArgsDockerfile(t *testing.T) { dockerfile := `ARG version=latest FROM golang:${version} ` tmpfile, err := os.CreateTemp("", "example") if err != nil { t.Fatal(err) } defer os.Remove(tmpfile.Name()) if _, err := tmpfile.Write([]byte(dockerfile)); err != nil { t.Fatal(err) } if err := tmpfile.Close(); err != nil { t.Fatal(err) } opts := &config.WarmerOptions{DockerfilePath: tmpfile.Name(), BuildArgs: []string{"version=1.20"}} baseNames, err := ParseDockerfile(opts) if err != nil { t.Fatalf("expected no error, got %v", err) } if len(baseNames) != 1 { t.Fatalf("expected 1 base name, got %d", len(baseNames)) } if baseNames[0] != "golang:1.20" { t.Fatalf("expected 'golang:1.20', got '%s'", baseNames[0]) } } func TestParseDockerfile_MissingsDockerfile(t *testing.T) { opts := &config.WarmerOptions{DockerfilePath: "dummy-nowhere"} baseNames, err := ParseDockerfile(opts) if err == nil { t.Fatal("expected an error, got nil") } if len(baseNames) != 0 { t.Fatalf("expected no base names, got %d", len(baseNames)) } } func TestParseDockerfile_InvalidsDockerfile(t *testing.T) { dockerfile := "This is a invalid dockerfile" tmpfile, err := os.CreateTemp("", "example") if err != nil { t.Fatal(err) } defer os.Remove(tmpfile.Name()) if _, err := tmpfile.Write([]byte(dockerfile)); err != nil { t.Fatal(err) } if err := tmpfile.Close(); err != nil { t.Fatal(err) } opts := &config.WarmerOptions{DockerfilePath: tmpfile.Name()} baseNames, err := ParseDockerfile(opts) if err == nil { t.Fatal("expected an error, got nil") } if len(baseNames) != 0 { t.Fatalf("expected no base names, got %d", len(baseNames)) } } ================================================ FILE: pkg/commands/add.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "io/fs" "path/filepath" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/pkg/errors" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/sirupsen/logrus" ) type AddCommand struct { BaseCommand cmd *instructions.AddCommand fileContext util.FileContext snapshotFiles []string } // ExecuteCommand executes the ADD command // Special stuff about ADD: // 1. If is a remote file URL: // - destination will have permissions of 0600 // - If remote file has HTTP Last-Modified header, we set the mtime of the file to that timestamp // - If dest doesn't end with a slash, the filepath is inferred to be / // 2. If is a local tar archive: // - it is unpacked at the dest, as 'tar -x' would func (a *AddCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { replacementEnvs := buildArgs.ReplacementEnvs(config.Env) chmod, useDefaultChmod, err := util.GetChmod(a.cmd.Chmod, replacementEnvs) if err != nil { return errors.Wrap(err, "getting permissions from chmod") } if useDefaultChmod { chmod = fs.FileMode(0o600) } uid, gid, err := util.GetUserGroup(a.cmd.Chown, replacementEnvs) if err != nil { return errors.Wrap(err, "getting user group from chown") } srcs, dest, err := util.ResolveEnvAndWildcards(a.cmd.SourcesAndDest, a.fileContext, replacementEnvs) if err != nil { return err } var unresolvedSrcs []string // If any of the sources are local tar archives: // 1. Unpack them to the specified destination // If any of the sources is a remote file URL: // 1. Download and copy it to the specified dest // Else, add to the list of unresolved sources for _, src := range srcs { fullPath := filepath.Join(a.fileContext.Root, src) if util.IsSrcRemoteFileURL(src) { urlDest, err := util.URLDestinationFilepath(src, dest, config.WorkingDir, replacementEnvs) if err != nil { return err } logrus.Infof("Adding remote URL %s to %s", src, urlDest) if err := util.DownloadFileToDest(src, urlDest, uid, gid, chmod); err != nil { return errors.Wrap(err, "downloading remote source file") } a.snapshotFiles = append(a.snapshotFiles, urlDest) } else if util.IsFileLocalTarArchive(fullPath) { tarDest, err := util.DestinationFilepath("", dest, config.WorkingDir) if err != nil { return errors.Wrap(err, "determining dest for tar") } logrus.Infof("Unpacking local tar archive %s to %s", src, tarDest) extractedFiles, err := util.UnpackLocalTarArchive(fullPath, tarDest) if err != nil { return errors.Wrap(err, "unpacking local tar") } logrus.Debugf("Added %v from local tar archive %s", extractedFiles, src) a.snapshotFiles = append(a.snapshotFiles, extractedFiles...) } else { unresolvedSrcs = append(unresolvedSrcs, src) } } // With the remaining "normal" sources, create and execute a standard copy command if len(unresolvedSrcs) == 0 { return nil } copyCmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: unresolvedSrcs, DestPath: dest}, Chown: a.cmd.Chown, Chmod: a.cmd.Chmod, }, fileContext: a.fileContext, } if err := copyCmd.ExecuteCommand(config, buildArgs); err != nil { return errors.Wrap(err, "executing copy command") } a.snapshotFiles = append(a.snapshotFiles, copyCmd.snapshotFiles...) return nil } // FilesToSnapshot should return an empty array if still nil; no files were changed func (a *AddCommand) FilesToSnapshot() []string { return a.snapshotFiles } // String returns some information about the command for the image config func (a *AddCommand) String() string { return a.cmd.String() } func (a *AddCommand) FilesUsedFromContext(config *v1.Config, buildArgs *dockerfile.BuildArgs) ([]string, error) { replacementEnvs := buildArgs.ReplacementEnvs(config.Env) srcs, _, err := util.ResolveEnvAndWildcards(a.cmd.SourcesAndDest, a.fileContext, replacementEnvs) if err != nil { return nil, err } files := []string{} for _, src := range srcs { if util.IsSrcRemoteFileURL(src) { continue } if util.IsFileLocalTarArchive(src) { continue } fullPath := filepath.Join(a.fileContext.Root, src) files = append(files, fullPath) } logrus.Infof("Using files from context: %v", files) return files, nil } func (a *AddCommand) MetadataOnly() bool { return false } func (a *AddCommand) RequiresUnpackedFS() bool { return true } ================================================ FILE: pkg/commands/add_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "compress/gzip" "os" "path/filepath" "sort" "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) type TarList struct { tarName string directory string compressed bool } func createFile(tempDir string) error { fileName := filepath.Join(tempDir, "text.txt") file, err := os.Create(fileName) if err != nil { return err } defer file.Close() err = os.WriteFile(fileName, []byte("This is a test!\n"), 0644) if err != nil { return err } return nil } func createTar(tempDir string, toCreate TarList) error { if toCreate.compressed { file, err := os.OpenFile(filepath.Join(tempDir, toCreate.tarName), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { return err } gzipWriter := gzip.NewWriter(file) defer gzipWriter.Close() err = util.CreateTarballOfDirectory(filepath.Join(tempDir, toCreate.directory), gzipWriter) if err != nil { return err } return nil } tarFile, err := os.Create(filepath.Join(tempDir, toCreate.tarName)) if err != nil { return err } err = util.CreateTarballOfDirectory(filepath.Join(tempDir, toCreate.directory), tarFile) if err != nil { return err } return nil } func setupAddTest(t *testing.T) string { tempDir := t.TempDir() err := createFile(tempDir) if err != nil { t.Errorf("couldn't create the file %v", err) } var tarFiles = []TarList{ { tarName: "a.tar", directory: "a", compressed: false, }, { tarName: "b.tar.gz", directory: "b", compressed: true, }, } // Create directories with files and then create tar for _, toCreate := range tarFiles { err = os.Mkdir(filepath.Join(tempDir, toCreate.directory), 0755) if err != nil { t.Errorf("couldn't create directory %v", err) } err = createFile(filepath.Join(tempDir, toCreate.directory)) if err != nil { t.Errorf("couldn't create file inside directory %v", err) } err = createTar(tempDir, toCreate) if err != nil { t.Errorf("couldn't create the tar %v", err) } } return tempDir } func Test_AddCommand(t *testing.T) { tempDir := setupAddTest(t) fileContext := util.FileContext{Root: tempDir} cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: tempDir, } buildArgs := dockerfile.NewBuildArgs([]string{}) var addTests = []struct { name string sourcesAndDest []string expectedDest []string }{ { name: "add files into tempAddExecuteTest/", sourcesAndDest: []string{"text.txt", "a.tar", "b.tar.gz", "tempAddExecuteTest/"}, expectedDest: []string{ "text.txt", filepath.Join(tempDir, "a/"), filepath.Join(tempDir, "a/text.txt"), filepath.Join(tempDir, "b/"), filepath.Join(tempDir, "b/text.txt"), }, }, } for _, testCase := range addTests { t.Run(testCase.name, func(t *testing.T) { c := AddCommand{ cmd: &instructions.AddCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: testCase.sourcesAndDest[0 : len(testCase.sourcesAndDest)-1], DestPath: testCase.sourcesAndDest[len(testCase.sourcesAndDest)-1]}, }, fileContext: fileContext, } c.ExecuteCommand(cfg, buildArgs) expected := []string{} resultDir := filepath.Join(tempDir, "tempAddExecuteTest/") for _, file := range testCase.expectedDest { expected = append(expected, filepath.Join(resultDir, file)) } sort.Strings(expected) sort.Strings(c.snapshotFiles) testutil.CheckDeepEqual(t, expected, c.snapshotFiles) }) } } ================================================ FILE: pkg/commands/arg.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) type ArgCommand struct { BaseCommand cmd *instructions.ArgCommand } // ExecuteCommand only needs to add this ARG key/value as seen func (r *ArgCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { for _, arg := range r.cmd.Args { key, val, err := ParseArg(arg.Key, arg.Value, config.Env, buildArgs) if err != nil { return err } buildArgs.AddArg(key, val) } return nil } func ParseArg(key string, val *string, env []string, ba *dockerfile.BuildArgs) (string, *string, error) { replacementEnvs := ba.ReplacementEnvs(env) resolvedKey, err := util.ResolveEnvironmentReplacement(key, replacementEnvs, false) if err != nil { return "", nil, err } var resolvedValue *string if val != nil { value, err := util.ResolveEnvironmentReplacement(*val, replacementEnvs, false) if err != nil { return "", nil, err } resolvedValue = &value } else { if value, ok := ba.GetAllAllowed()[resolvedKey]; ok { resolvedValue = &value } else if value, ok := ba.GetAllMeta()[resolvedKey]; ok { resolvedValue = &value } } return resolvedKey, resolvedValue, nil } // String returns some information about the command for the image config history func (r *ArgCommand) String() string { return r.cmd.String() } ================================================ FILE: pkg/commands/base_command.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" ) type BaseCommand struct { } func (b *BaseCommand) IsArgsEnvsRequiredInCache() bool { return false } func (b *BaseCommand) CacheCommand(v1.Image) DockerCommand { return nil } func (b *BaseCommand) FilesToSnapshot() []string { return []string{} } func (b *BaseCommand) ProvidesFilesToSnapshot() bool { return true } func (b *BaseCommand) FilesUsedFromContext(_ *v1.Config, _ *dockerfile.BuildArgs) ([]string, error) { return []string{}, nil } func (b *BaseCommand) MetadataOnly() bool { return true } func (b *BaseCommand) RequiresUnpackedFS() bool { return false } func (b *BaseCommand) ShouldCacheOutput() bool { return false } func (b *BaseCommand) ShouldDetectDeletedFiles() bool { return false } ================================================ FILE: pkg/commands/cache.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import v1 "github.com/google/go-containerregistry/pkg/v1" type Cached interface { Layer() v1.Layer } type caching struct { layer v1.Layer } func (c caching) Layer() v1.Layer { return c.layer } ================================================ FILE: pkg/commands/cache_test.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" ) func Test_caching(t *testing.T) { c := caching{layer: fakeLayer{}} actual := c.Layer().(fakeLayer) expected := fakeLayer{} actualLen, expectedLen := len(actual.TarContent), len(expected.TarContent) if actualLen != expectedLen { t.Errorf("expected layer tar content to be %v but was %v", expectedLen, actualLen) } } ================================================ FILE: pkg/commands/cmd.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "strings" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) type CmdCommand struct { BaseCommand cmd *instructions.CmdCommand } // ExecuteCommand executes the CMD command // Argument handling is the same as RUN. func (c *CmdCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { var newCommand []string if c.cmd.PrependShell { // This is the default shell on Linux var shell []string if len(config.Shell) > 0 { shell = config.Shell } else { shell = append(shell, "/bin/sh", "-c") } newCommand = append(shell, strings.Join(c.cmd.CmdLine, " ")) } else { newCommand = c.cmd.CmdLine } config.Cmd = newCommand // ArgsEscaped is only used in windows environments config.ArgsEscaped = false return nil } // String returns some information about the command for the image config history func (c *CmdCommand) String() string { return c.cmd.String() } ================================================ FILE: pkg/commands/cmd_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) var cmdTests = []struct { prependShell bool cmdLine []string expectedCmd []string }{ { prependShell: true, cmdLine: []string{"echo", "cmd1"}, expectedCmd: []string{"/bin/sh", "-c", "echo cmd1"}, }, { prependShell: false, cmdLine: []string{"echo", "cmd2"}, expectedCmd: []string{"echo", "cmd2"}, }, } func TestExecuteCmd(t *testing.T) { cfg := &v1.Config{ Cmd: nil, } for _, test := range cmdTests { cmd := CmdCommand{ cmd: &instructions.CmdCommand{ ShellDependantCmdLine: instructions.ShellDependantCmdLine{ PrependShell: test.prependShell, CmdLine: test.cmdLine, }, }, } err := cmd.ExecuteCommand(cfg, nil) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedCmd, cfg.Cmd) } } ================================================ FILE: pkg/commands/commands.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) type CurrentCacheKey func() (string, error) type DockerCommand interface { // ExecuteCommand is responsible for: // 1. Making required changes to the filesystem (ex. copying files for ADD/COPY or setting ENV variables) // 2. Updating metadata fields in the config // It should not change the config history. ExecuteCommand(*v1.Config, *dockerfile.BuildArgs) error // Returns a string representation of the command String() string // A list of files to snapshot, empty for metadata commands or nil if we don't know FilesToSnapshot() []string // ProvidesFileToSnapshot is true for all metadata commands and commands which know // list of files changed. False for Run command. ProvidesFilesToSnapshot() bool // Return a cache-aware implementation of this command, if it exists. CacheCommand(v1.Image) DockerCommand // Return true if this command depends on the build context. FilesUsedFromContext(*v1.Config, *dockerfile.BuildArgs) ([]string, error) MetadataOnly() bool RequiresUnpackedFS() bool // Whether the output layer of this command should be cached in and // retrieved from the layer cache. ShouldCacheOutput() bool // ShouldDetectDeletedFiles returns true if the command could delete files. ShouldDetectDeletedFiles() bool // True if need add ARGs and EVNs to composite cache string with resolved command // need only for RUN instruction IsArgsEnvsRequiredInCache() bool } func GetCommand(cmd instructions.Command, fileContext util.FileContext, useNewRun bool, cacheCopy bool, cacheRun bool) (DockerCommand, error) { switch c := cmd.(type) { case *instructions.RunCommand: if useNewRun { return &RunMarkerCommand{cmd: c, shdCache: cacheRun}, nil } return &RunCommand{cmd: c, shdCache: cacheRun}, nil case *instructions.CopyCommand: return &CopyCommand{cmd: c, fileContext: fileContext, shdCache: cacheCopy}, nil case *instructions.ExposeCommand: return &ExposeCommand{cmd: c}, nil case *instructions.EnvCommand: return &EnvCommand{cmd: c}, nil case *instructions.WorkdirCommand: return &WorkdirCommand{cmd: c}, nil case *instructions.AddCommand: return &AddCommand{cmd: c, fileContext: fileContext}, nil case *instructions.CmdCommand: return &CmdCommand{cmd: c}, nil case *instructions.EntrypointCommand: return &EntrypointCommand{cmd: c}, nil case *instructions.LabelCommand: return &LabelCommand{cmd: c}, nil case *instructions.UserCommand: return &UserCommand{cmd: c}, nil case *instructions.OnbuildCommand: return &OnBuildCommand{cmd: c}, nil case *instructions.VolumeCommand: return &VolumeCommand{cmd: c}, nil case *instructions.StopSignalCommand: return &StopSignalCommand{cmd: c}, nil case *instructions.ArgCommand: return &ArgCommand{cmd: c}, nil case *instructions.ShellCommand: return &ShellCommand{cmd: c}, nil case *instructions.HealthCheckCommand: return &HealthCheckCommand{cmd: c}, nil case *instructions.MaintainerCommand: logrus.Warnf("%s is deprecated, skipping", cmd.Name()) return nil, nil } return nil, errors.Errorf("%s is not a supported command", cmd.Name()) } ================================================ FILE: pkg/commands/copy.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "fmt" "os" "path/filepath" "strings" kConfig "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" ) // for testing var ( getUserGroup = util.GetUserGroup ) type CopyCommand struct { BaseCommand cmd *instructions.CopyCommand fileContext util.FileContext snapshotFiles []string shdCache bool } func (c *CopyCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { // Resolve from if c.cmd.From != "" { c.fileContext = util.FileContext{Root: filepath.Join(kConfig.KanikoDir, c.cmd.From)} } replacementEnvs := buildArgs.ReplacementEnvs(config.Env) uid, gid, err := getUserGroup(c.cmd.Chown, replacementEnvs) logrus.Debugf("found uid %v and gid %v for chown string %v", uid, gid, c.cmd.Chown) if err != nil { return errors.Wrap(err, "getting user group from chown") } // sources from the Copy command are resolved with wildcards {*?[} srcs, dest, err := util.ResolveEnvAndWildcards(c.cmd.SourcesAndDest, c.fileContext, replacementEnvs) if err != nil { return errors.Wrap(err, "resolving src") } chmod, useDefaultChmod, err := util.GetChmod(c.cmd.Chmod, replacementEnvs) if err != nil { return errors.Wrap(err, "getting permissions from chmod") } // For each source, iterate through and copy it over for _, src := range srcs { fullPath := filepath.Join(c.fileContext.Root, src) fi, err := os.Lstat(fullPath) if err != nil { return errors.Wrap(err, "could not copy source") } if fi.IsDir() && !strings.HasSuffix(fullPath, string(os.PathSeparator)) { fullPath += "/" } cwd := config.WorkingDir if cwd == "" { cwd = kConfig.RootDir } destPath, err := util.DestinationFilepath(fullPath, dest, cwd) if err != nil { return errors.Wrap(err, "find destination path") } // If the destination dir is a symlink we need to resolve the path and use // that instead of the symlink path destPath, err = resolveIfSymlink(destPath) if err != nil { return errors.Wrap(err, "resolving dest symlink") } if fi.IsDir() { copiedFiles, err := util.CopyDir(fullPath, destPath, c.fileContext, uid, gid, chmod, useDefaultChmod) if err != nil { return errors.Wrap(err, "copying dir") } c.snapshotFiles = append(c.snapshotFiles, copiedFiles...) } else if util.IsSymlink(fi) { // If file is a symlink, we want to copy the target file to destPath exclude, err := util.CopySymlink(fullPath, destPath, c.fileContext) if err != nil { return errors.Wrap(err, "copying symlink") } if exclude { continue } c.snapshotFiles = append(c.snapshotFiles, destPath) } else { // ... Else, we want to copy over a file exclude, err := util.CopyFile(fullPath, destPath, c.fileContext, uid, gid, chmod, useDefaultChmod) if err != nil { return errors.Wrap(err, "copying file") } if exclude { continue } c.snapshotFiles = append(c.snapshotFiles, destPath) } } return nil } // FilesToSnapshot should return an empty array if still nil; no files were changed func (c *CopyCommand) FilesToSnapshot() []string { return c.snapshotFiles } // String returns some information about the command for the image config func (c *CopyCommand) String() string { return c.cmd.String() } func (c *CopyCommand) FilesUsedFromContext(config *v1.Config, buildArgs *dockerfile.BuildArgs) ([]string, error) { return copyCmdFilesUsedFromContext(config, buildArgs, c.cmd, c.fileContext) } func (c *CopyCommand) MetadataOnly() bool { return false } func (c *CopyCommand) RequiresUnpackedFS() bool { return true } func (c *CopyCommand) From() string { return c.cmd.From } func (c *CopyCommand) ShouldCacheOutput() bool { return c.shdCache } // CacheCommand returns true since this command should be cached func (c *CopyCommand) CacheCommand(img v1.Image) DockerCommand { return &CachingCopyCommand{ img: img, cmd: c.cmd, fileContext: c.fileContext, extractFn: util.ExtractFile, } } type CachingCopyCommand struct { BaseCommand caching img v1.Image extractedFiles []string cmd *instructions.CopyCommand fileContext util.FileContext extractFn util.ExtractFunction } func (cr *CachingCopyCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { logrus.Infof("Found cached layer, extracting to filesystem") var err error if cr.img == nil { return errors.New(fmt.Sprintf("cached command image is nil %v", cr.String())) } layers, err := cr.img.Layers() if err != nil { return errors.Wrapf(err, "retrieve image layers") } if len(layers) != 1 { return errors.New(fmt.Sprintf("expected %d layers but got %d", 1, len(layers))) } cr.layer = layers[0] cr.extractedFiles, err = util.GetFSFromLayers(kConfig.RootDir, layers, util.ExtractFunc(cr.extractFn), util.IncludeWhiteout()) logrus.Debugf("ExtractedFiles: %s", cr.extractedFiles) if err != nil { return errors.Wrap(err, "extracting fs from image") } return nil } func (cr *CachingCopyCommand) FilesUsedFromContext(config *v1.Config, buildArgs *dockerfile.BuildArgs) ([]string, error) { return copyCmdFilesUsedFromContext(config, buildArgs, cr.cmd, cr.fileContext) } func (cr *CachingCopyCommand) FilesToSnapshot() []string { f := cr.extractedFiles logrus.Debugf("%d files extracted by caching copy command", len(f)) logrus.Tracef("Extracted files: %s", f) return f } func (cr *CachingCopyCommand) MetadataOnly() bool { return false } func (cr *CachingCopyCommand) String() string { if cr.cmd == nil { return "nil command" } return cr.cmd.String() } func (cr *CachingCopyCommand) From() string { return cr.cmd.From } func resolveIfSymlink(destPath string) (string, error) { if !filepath.IsAbs(destPath) { return "", errors.New("dest path must be abs") } var nonexistentPaths []string newPath := destPath for newPath != "/" { _, err := os.Lstat(newPath) if err != nil { if os.IsNotExist(err) { dir, file := filepath.Split(newPath) newPath = filepath.Clean(dir) nonexistentPaths = append(nonexistentPaths, file) continue } else { return "", errors.Wrap(err, "failed to lstat") } } newPath, err = filepath.EvalSymlinks(newPath) if err != nil { return "", errors.Wrap(err, "failed to eval symlinks") } break } for i := len(nonexistentPaths) - 1; i >= 0; i-- { newPath = filepath.Join(newPath, nonexistentPaths[i]) } if destPath != newPath { logrus.Tracef("Updating destination path from %v to %v due to symlink", destPath, newPath) } return filepath.Clean(newPath), nil } func copyCmdFilesUsedFromContext( config *v1.Config, buildArgs *dockerfile.BuildArgs, cmd *instructions.CopyCommand, fileContext util.FileContext, ) ([]string, error) { if cmd.From != "" { fileContext = util.FileContext{Root: filepath.Join(kConfig.KanikoDir, cmd.From)} } replacementEnvs := buildArgs.ReplacementEnvs(config.Env) srcs, _, err := util.ResolveEnvAndWildcards( cmd.SourcesAndDest, fileContext, replacementEnvs, ) if err != nil { return nil, err } files := []string{} for _, src := range srcs { fullPath := filepath.Join(fileContext.Root, src) files = append(files, fullPath) } logrus.Debugf("Using files from context: %v", files) return files, nil } // AbstractCopyCommand can either be a CopyCommand or a CachingCopyCommand. type AbstractCopyCommand interface { From() string } // CastAbstractCopyCommand tries to convert a command to an AbstractCopyCommand. func CastAbstractCopyCommand(cmd interface{}) (AbstractCopyCommand, bool) { switch v := cmd.(type) { case *CopyCommand: return v, true case *CachingCopyCommand: return v, true } return nil, false } ================================================ FILE: pkg/commands/copy_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "archive/tar" "fmt" "io" "io/fs" "os" "path/filepath" "strings" "syscall" "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) var copyTests = []struct { name string sourcesAndDest []string expectedDest []string }{ { name: "copy foo into tempCopyExecuteTest/", sourcesAndDest: []string{"foo", "tempCopyExecuteTest/"}, expectedDest: []string{"foo"}, }, { name: "copy foo into tempCopyExecuteTest", sourcesAndDest: []string{"foo", "tempCopyExecuteTest"}, expectedDest: []string{"tempCopyExecuteTest"}, }, { name: "copy f* into tempCopyExecuteTest", sourcesAndDest: []string{"foo*", "tempCopyExecuteTest"}, expectedDest: []string{"tempCopyExecuteTest"}, }, { name: "copy fo? into tempCopyExecuteTest", sourcesAndDest: []string{"fo?", "tempCopyExecuteTest"}, expectedDest: []string{"tempCopyExecuteTest"}, }, { name: "copy f[o][osp] into tempCopyExecuteTest", sourcesAndDest: []string{"f[o][osp]", "tempCopyExecuteTest"}, expectedDest: []string{"tempCopyExecuteTest"}, }, { name: "Copy into several to-be-created directories", sourcesAndDest: []string{"f[o][osp]", "tempCopyExecuteTest/foo/bar"}, expectedDest: []string{"bar"}, }, } func setupTestTemp(t *testing.T) string { tempDir := t.TempDir() logrus.Debugf("Tempdir: %s", tempDir) srcPath, err := filepath.Abs("../../integration/context") if err != nil { logrus.Fatalf("Error getting abs path %s", srcPath) } cperr := filepath.Walk(srcPath, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if path != srcPath { if err != nil { return err } tempPath := strings.TrimPrefix(path, srcPath) fileInfo, err := os.Stat(path) if err != nil { return err } if fileInfo.IsDir() { os.MkdirAll(tempDir+"/"+tempPath, 0777) } else { out, err := os.Create(tempDir + "/" + tempPath) if err != nil { return err } defer out.Close() in, err := os.Open(path) if err != nil { return err } defer in.Close() _, err = io.Copy(out, in) if err != nil { return err } } } return nil }) if cperr != nil { logrus.Fatalf("Error populating temp dir %s", cperr) } return tempDir } func readDirectory(dirName string) ([]fs.FileInfo, error) { entries, err := os.ReadDir(dirName) if err != nil { return nil, err } testDir := make([]fs.FileInfo, 0, len(entries)) for _, entry := range entries { info, err := entry.Info() if err != nil { return nil, err } testDir = append(testDir, info) } return testDir, err } func Test_CachingCopyCommand_ExecuteCommand(t *testing.T) { tempDir := setupTestTemp(t) tarContent, err := prepareTarFixture(t, []string{"foo.txt"}) if err != nil { t.Errorf("couldn't prepare tar fixture %v", err) } config := &v1.Config{} buildArgs := &dockerfile.BuildArgs{} type testCase struct { description string expectLayer bool expectErr bool count *int expectedCount int command *CachingCopyCommand extractedFiles []string contextFiles []string } testCases := []testCase{ func() testCase { err = os.WriteFile(filepath.Join(tempDir, "foo.txt"), []byte("meow"), 0644) if err != nil { t.Errorf("couldn't write tempfile %v", err) t.FailNow() } c := &CachingCopyCommand{ img: fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{TarContent: tarContent}, }, }, fileContext: util.FileContext{Root: tempDir}, cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{"foo.txt"}, DestPath: ""}}, } count := 0 tc := testCase{ description: "with valid image and valid layer", count: &count, expectedCount: 1, expectLayer: true, extractedFiles: []string{"/foo.txt"}, contextFiles: []string{"foo.txt"}, } c.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error { *tc.count++ return nil } tc.command = c return tc }(), func() testCase { c := &CachingCopyCommand{} tc := testCase{ description: "with no image", expectErr: true, } c.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error { return nil } tc.command = c return tc }(), func() testCase { c := &CachingCopyCommand{ img: fakeImage{}, } c.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error { return nil } return testCase{ description: "with image containing no layers", expectErr: true, command: c, } }(), func() testCase { c := &CachingCopyCommand{ img: fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{}, }, }, } c.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error { return nil } tc := testCase{ description: "with image one layer which has no tar content", expectErr: false, // this one probably should fail but doesn't because of how ExecuteCommand and util.GetFSFromLayers are implemented - cvgw- 2019-11-25 expectLayer: true, } tc.command = c return tc }(), } for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { c := tc.command err := c.ExecuteCommand(config, buildArgs) if !tc.expectErr && err != nil { t.Errorf("Expected err to be nil but was %v", err) } else if tc.expectErr && err == nil { t.Error("Expected err but was nil") } if tc.count != nil { if *tc.count != tc.expectedCount { t.Errorf("Expected extractFn to be called %v times but was called %v times", tc.expectedCount, *tc.count) } for _, file := range tc.extractedFiles { match := false cFiles := c.FilesToSnapshot() for _, cFile := range cFiles { if file == cFile { match = true break } } if !match { t.Errorf("Expected extracted files to include %v but did not %v", file, cFiles) } } cmdFiles, err := c.FilesUsedFromContext( config, buildArgs, ) if err != nil { t.Errorf("failed to get files used from context from command %v", err) } if len(cmdFiles) != len(tc.contextFiles) { t.Errorf("expected files used from context to equal %v but was %v", tc.contextFiles, cmdFiles) } } if c.layer == nil && tc.expectLayer { t.Error("expected the command to have a layer set but instead was nil") } else if c.layer != nil && !tc.expectLayer { t.Error("expected the command to have no layer set but instead found a layer") } }) } } func TestCopyExecuteCmd(t *testing.T) { tempDir := setupTestTemp(t) cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: tempDir, } fileContext := util.FileContext{Root: tempDir} for _, test := range copyTests { t.Run(test.name, func(t *testing.T) { dirList := []string{} cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: test.sourcesAndDest[0 : len(test.sourcesAndDest)-1], DestPath: test.sourcesAndDest[len(test.sourcesAndDest)-1]}, }, fileContext: fileContext, } buildArgs := copySetUpBuildArgs() dest := cfg.WorkingDir + "/" + test.sourcesAndDest[len(test.sourcesAndDest)-1] err := cmd.ExecuteCommand(cfg, buildArgs) if err != nil { t.Error() } fi, err := os.Open(dest) if err != nil { t.Error() } defer fi.Close() fstat, err := fi.Stat() if err != nil { t.Error() } if fstat == nil { t.Error() return // Unrecoverable, will segfault in the next line } if fstat.IsDir() { files, err := readDirectory(dest) if err != nil { t.Error() } for _, file := range files { logrus.Debugf("File: %v", file.Name()) dirList = append(dirList, file.Name()) } } else { dirList = append(dirList, filepath.Base(dest)) } testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedDest, dirList) os.RemoveAll(dest) }) } } func copySetUpBuildArgs() *dockerfile.BuildArgs { buildArgs := dockerfile.NewBuildArgs([]string{ "buildArg1=foo", "buildArg2=foo2", }) buildArgs.AddArg("buildArg1", nil) d := "default" buildArgs.AddArg("buildArg2", &d) return buildArgs } func Test_resolveIfSymlink(t *testing.T) { type testCase struct { destPath string expectedPath string err error } tmpDir := t.TempDir() baseDir, err := os.MkdirTemp(tmpDir, "not-linked") if err != nil { t.Error(err) } path, err := os.CreateTemp(baseDir, "foo.txt") if err != nil { t.Error(err) } thepath, err := filepath.Abs(filepath.Dir(path.Name())) if err != nil { t.Error(err) } cases := []testCase{ {destPath: thepath, expectedPath: thepath, err: nil}, {destPath: "/", expectedPath: "/", err: nil}, } baseDir = tmpDir symLink := filepath.Join(baseDir, "symlink") if err := os.Symlink(filepath.Base(thepath), symLink); err != nil { t.Error(err) } cases = append(cases, testCase{filepath.Join(symLink, "foo.txt"), filepath.Join(thepath, "foo.txt"), nil}, testCase{filepath.Join(symLink, "inner", "foo.txt"), filepath.Join(thepath, "inner", "foo.txt"), nil}, ) absSymlink := filepath.Join(tmpDir, "abs-symlink") if err := os.Symlink(thepath, absSymlink); err != nil { t.Error(err) } cases = append(cases, testCase{filepath.Join(absSymlink, "foo.txt"), filepath.Join(thepath, "foo.txt"), nil}, testCase{filepath.Join(absSymlink, "inner", "foo.txt"), filepath.Join(thepath, "inner", "foo.txt"), nil}, ) for i, c := range cases { t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { res, e := resolveIfSymlink(c.destPath) if !errors.Is(e, c.err) { t.Errorf("%s: expected %v but got %v", c.destPath, c.err, e) } if res != c.expectedPath { t.Errorf("%s: expected %v but got %v", c.destPath, c.expectedPath, res) } }) } } func Test_CopyEnvAndWildcards(t *testing.T) { setupDirs := func(t *testing.T) (string, string) { testDir := t.TempDir() dir := filepath.Join(testDir, "bar") if err := os.MkdirAll(dir, 0777); err != nil { t.Fatal(err) } file := filepath.Join(dir, "bam.txt") if err := os.WriteFile(file, []byte("meow"), 0777); err != nil { t.Fatal(err) } targetPath := filepath.Join(dir, "dam.txt") if err := os.WriteFile(targetPath, []byte("woof"), 0777); err != nil { t.Fatal(err) } if err := os.Symlink("dam.txt", filepath.Join(dir, "sym.link")); err != nil { t.Fatal(err) } return testDir, filepath.Base(dir) } t.Run("copy sources into a dir defined in env variable", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) expected, err := readDirectory(filepath.Join(testDir, srcDir)) if err != nil { t.Fatal(err) } targetPath := filepath.Join(testDir, "target") + "/" cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir + "/*"}, DestPath: "$TARGET_PATH"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{"TARGET_PATH=" + targetPath}, WorkingDir: testDir, } err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) if err != nil { t.Fatal(err) } testutil.CheckNoError(t, err) actual, err := readDirectory(targetPath) if err != nil { t.Fatal(err) } for i, f := range actual { testutil.CheckDeepEqual(t, expected[i].Name(), f.Name()) testutil.CheckDeepEqual(t, expected[i].Mode(), f.Mode()) } }) t.Run("copy sources into a dir defined in env variable with no file found", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) targetPath := filepath.Join(testDir, "target") + "/" cmd := CopyCommand{ cmd: &instructions.CopyCommand{ //should only dam and bam be copied SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir + "/tam[s]"}, DestPath: "$TARGET_PATH"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{"TARGET_PATH=" + targetPath}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) if err != nil { t.Fatal(err) } testutil.CheckNoError(t, err) actual, err := readDirectory(targetPath) //check it should error out since no files are copied and targetPath is not created if err == nil { t.Fatal("expected error no dirrectory but got nil") } //actual should empty since no files are copied testutil.CheckDeepEqual(t, 0, len(actual)) }) } func TestCopyCommand_ExecuteCommand_Extended(t *testing.T) { setupDirs := func(t *testing.T) (string, string) { testDir := t.TempDir() dir := filepath.Join(testDir, "bar") if err := os.MkdirAll(dir, 0777); err != nil { t.Fatal(err) } file := filepath.Join(dir, "bam.txt") if err := os.WriteFile(file, []byte("meow"), 0777); err != nil { t.Fatal(err) } targetPath := filepath.Join(dir, "dam.txt") if err := os.WriteFile(targetPath, []byte("woof"), 0777); err != nil { t.Fatal(err) } if err := os.Symlink("dam.txt", filepath.Join(dir, "sym.link")); err != nil { t.Fatal(err) } return testDir, filepath.Base(dir) } t.Run("copy dir to another dir", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) expected, err := readDirectory(filepath.Join(testDir, srcDir)) if err != nil { t.Fatal(err) } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: "dest"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) if err != nil { t.Fatal(err) } testutil.CheckNoError(t, err) // Check if "dest" dir exists with contents of srcDir actual, err := readDirectory(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } for i, f := range actual { testutil.CheckDeepEqual(t, expected[i].Name(), f.Name()) testutil.CheckDeepEqual(t, expected[i].Mode(), f.Mode()) } }) t.Run("copy dir to another dir - with ignored files", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) ignoredFile := "bam.txt" srcFiles, err := readDirectory(filepath.Join(testDir, srcDir)) if err != nil { t.Fatal(err) } expected := map[string]fs.FileInfo{} for _, sf := range srcFiles { if sf.Name() == ignoredFile { continue } expected[sf.Name()] = sf } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: "dest"}, }, fileContext: util.FileContext{ Root: testDir, ExcludedFiles: []string{filepath.Join(srcDir, ignoredFile)}}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) if err != nil { t.Fatal(err) } testutil.CheckNoError(t, err) // Check if "dest" dir exists with contents of srcDir actual, err := readDirectory(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } if len(actual) != len(expected) { t.Errorf("%v files are expected to be copied, but got %v", len(expected), len(actual)) } for _, f := range actual { if f.Name() == ignoredFile { t.Errorf("file %v is expected to be ignored, but copied", f.Name()) } testutil.CheckDeepEqual(t, expected[f.Name()].Name(), f.Name()) testutil.CheckDeepEqual(t, expected[f.Name()].Mode(), f.Mode()) } }) t.Run("copy file to a dir", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, "bam.txt")}, DestPath: "dest/"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "dest" dir exists with file bam.txt files, err := readDirectory(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 1, len(files)) testutil.CheckDeepEqual(t, files[0].Name(), "bam.txt") }) t.Run("copy file to a filepath", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, "bam.txt")}, DestPath: "dest"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if bam.txt is copied to dest file if _, err := os.Lstat(filepath.Join(testDir, "dest")); err != nil { t.Fatal(err) } }) t.Run("copy file to a dir without trailing /", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) destDir := filepath.Join(testDir, "dest") if err := os.MkdirAll(destDir, 0777); err != nil { t.Fatal(err) } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, "bam.txt")}, DestPath: "dest"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "dest" dir exists with file bam.txt files, err := readDirectory(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 1, len(files)) testutil.CheckDeepEqual(t, files[0].Name(), "bam.txt") }) t.Run("copy symlink file to a dir", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, "sym.link")}, DestPath: "dest/"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "dest" dir exists with link sym.link files, err := readDirectory(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } // bam.txt and sym.link should be present testutil.CheckDeepEqual(t, 1, len(files)) testutil.CheckDeepEqual(t, files[0].Name(), "sym.link") testutil.CheckDeepEqual(t, true, files[0].Mode()&os.ModeSymlink != 0) linkName, err := os.Readlink(filepath.Join(testDir, "dest", "sym.link")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, linkName, "dam.txt") }) t.Run("copy deadlink symlink file to a dir", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) doesNotExists := filepath.Join(testDir, "dead.txt") if err := os.WriteFile(doesNotExists, []byte("remove me"), 0777); err != nil { t.Fatal(err) } if err := os.Symlink("../dead.txt", filepath.Join(testDir, srcDir, "dead.link")); err != nil { t.Fatal(err) } if err := os.Remove(doesNotExists); err != nil { t.Fatal(err) } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{filepath.Join(srcDir, "dead.link")}, DestPath: "dest/"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "dest" dir exists with link dead.link files, err := readDirectory(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 1, len(files)) testutil.CheckDeepEqual(t, files[0].Name(), "dead.link") testutil.CheckDeepEqual(t, true, files[0].Mode()&os.ModeSymlink != 0) linkName, err := os.Readlink(filepath.Join(testDir, "dest", "dead.link")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, linkName, "../dead.txt") }) t.Run("copy src symlink dir to a dir", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) expected, err := os.ReadDir(filepath.Join(testDir, srcDir)) if err != nil { t.Fatal(err) } another := filepath.Join(testDir, "another") os.Symlink(filepath.Join(testDir, srcDir), another) cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{"another"}, DestPath: "dest"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "dest" dir exists with contents of srcDir actual, err := os.ReadDir(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } for i, f := range actual { testutil.CheckDeepEqual(t, expected[i].Name(), f.Name()) testutil.CheckDeepEqual(t, expected[i].Type(), f.Type()) } }) t.Run("copy dir with a symlink to a file outside of current src dir", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) expected, err := readDirectory(filepath.Join(testDir, srcDir)) if err != nil { t.Fatal(err) } anotherSrc := filepath.Join(testDir, "anotherSrc") if err := os.MkdirAll(anotherSrc, 0777); err != nil { t.Fatal(err) } targetPath := filepath.Join(anotherSrc, "target.txt") if err := os.WriteFile(targetPath, []byte("woof"), 0777); err != nil { t.Fatal(err) } if err := os.Symlink(targetPath, filepath.Join(testDir, srcDir, "zSym.link")); err != nil { t.Fatal(err) } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: "dest"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "dest" dir exists contents of srcDir and an extra zSym.link created // in this test actual, err := readDirectory(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 4, len(actual)) for i, f := range expected { testutil.CheckDeepEqual(t, f.Name(), actual[i].Name()) testutil.CheckDeepEqual(t, f.Mode(), actual[i].Mode()) } linkName, err := os.Readlink(filepath.Join(testDir, "dest", "zSym.link")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, linkName, targetPath) }) t.Run("copy src symlink dir to a dir", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) expected, err := os.ReadDir(filepath.Join(testDir, srcDir)) if err != nil { t.Fatal(err) } another := filepath.Join(testDir, "another") os.Symlink(filepath.Join(testDir, srcDir), another) cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{"another"}, DestPath: "dest"}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "dest" dir exists with bam.txt and "dest" dir is a symlink actual, err := os.ReadDir(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } for i, f := range actual { testutil.CheckDeepEqual(t, expected[i].Name(), f.Name()) testutil.CheckDeepEqual(t, expected[i].Type(), f.Type()) } }) t.Run("copy src dir to a dest dir which is a symlink", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) expected, err := readDirectory(filepath.Join(testDir, srcDir)) if err != nil { t.Fatal(err) } dest := filepath.Join(testDir, "dest") if err := os.MkdirAll(dest, 0777); err != nil { t.Fatal(err) } linkedDest := filepath.Join(testDir, "linkDest") if err := os.Symlink(dest, linkedDest); err != nil { t.Fatal(err) } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: linkedDest}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err = cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "linkdest" dir exists with contents of srcDir actual, err := readDirectory(filepath.Join(testDir, "linkDest")) if err != nil { t.Fatal(err) } for i, f := range expected { testutil.CheckDeepEqual(t, f.Name(), actual[i].Name()) testutil.CheckDeepEqual(t, f.Mode(), actual[i].Mode()) } // Check if linkDest -> dest linkName, err := os.Readlink(filepath.Join(testDir, "linkDest")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, linkName, dest) }) t.Run("copy src file to a dest dir which is a symlink", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) dest := filepath.Join(testDir, "dest") if err := os.MkdirAll(dest, 0777); err != nil { t.Fatal(err) } linkedDest := filepath.Join(testDir, "linkDest") if err := os.Symlink(dest, linkedDest); err != nil { t.Fatal(err) } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{fmt.Sprintf("%s/bam.txt", srcDir)}, DestPath: linkedDest}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) // Check if "linkDest" link is same. actual, err := readDirectory(filepath.Join(testDir, "dest")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, "bam.txt", actual[0].Name()) c, err := os.ReadFile(filepath.Join(testDir, "dest", "bam.txt")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, "meow", string(c)) // Check if linkDest -> dest linkName, err := os.Readlink(filepath.Join(testDir, "linkDest")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, linkName, dest) }) t.Run("copy src file to a dest dir with chown", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) original := getUserGroup defer func() { getUserGroup = original }() uid := os.Getuid() gid := os.Getgid() getUserGroup = func(userStr string, _ []string) (int64, int64, error) { return int64(uid), int64(gid), nil } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{fmt.Sprintf("%s/bam.txt", srcDir)}, DestPath: testDir}, Chown: "alice:group", }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) actual, err := readDirectory(filepath.Join(testDir)) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, "bam.txt", actual[0].Name()) if stat, ok := actual[0].Sys().(*syscall.Stat_t); ok { if int(stat.Uid) != uid { t.Errorf("uid don't match, got %d, expected %d", stat.Uid, uid) } if int(stat.Gid) != gid { t.Errorf("gid don't match, got %d, expected %d", stat.Gid, gid) } } }) t.Run("copy src file to a dest dir with chown and random user", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) original := getUserGroup defer func() { getUserGroup = original }() getUserGroup = func(userStr string, _ []string) (int64, int64, error) { return 12345, 12345, nil } cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{fmt.Sprintf("%s/bam.txt", srcDir)}, DestPath: testDir}, Chown: "missing:missing", }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) if !errors.Is(err, os.ErrPermission) { testutil.CheckNoError(t, err) } }) t.Run("copy src dir with relative symlinks in a dir", func(t *testing.T) { testDir, srcDir := setupDirs(t) defer os.RemoveAll(testDir) // Make another dir inside bar with a relative symlink dir := filepath.Join(testDir, srcDir, "another") if err := os.MkdirAll(dir, 0777); err != nil { t.Fatal(err) } os.Symlink("../bam.txt", filepath.Join(dir, "bam_relative.txt")) dest := filepath.Join(testDir, "copy") cmd := CopyCommand{ cmd: &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{srcDir}, DestPath: dest}, }, fileContext: util.FileContext{Root: testDir}, } cfg := &v1.Config{ Cmd: nil, Env: []string{}, WorkingDir: testDir, } err := cmd.ExecuteCommand(cfg, dockerfile.NewBuildArgs([]string{})) testutil.CheckNoError(t, err) actual, err := os.ReadDir(filepath.Join(dest, "another")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, "bam_relative.txt", actual[0].Name()) linkName, err := os.Readlink(filepath.Join(dest, "another", "bam_relative.txt")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, "../bam.txt", linkName) }) } ================================================ FILE: pkg/commands/entrypoint.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "strings" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) type EntrypointCommand struct { BaseCommand cmd *instructions.EntrypointCommand } // ExecuteCommand handles command processing similar to CMD and RUN, func (e *EntrypointCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { var newCommand []string if e.cmd.PrependShell { // This is the default shell on Linux var shell []string if len(config.Shell) > 0 { shell = config.Shell } else { shell = append(shell, "/bin/sh", "-c") } newCommand = append(shell, strings.Join(e.cmd.CmdLine, " ")) } else { newCommand = e.cmd.CmdLine } config.Entrypoint = newCommand return nil } // String returns some information about the command for the image config history func (e *EntrypointCommand) String() string { return e.cmd.String() } ================================================ FILE: pkg/commands/entrypoint_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) var entrypointTests = []struct { prependShell bool cmdLine []string expectedCmd []string }{ { prependShell: true, cmdLine: []string{"echo", "cmd1"}, expectedCmd: []string{"/bin/sh", "-c", "echo cmd1"}, }, { prependShell: false, cmdLine: []string{"echo", "cmd2"}, expectedCmd: []string{"echo", "cmd2"}, }, } func TestEntrypointExecuteCmd(t *testing.T) { cfg := &v1.Config{ Cmd: nil, } for _, test := range entrypointTests { cmd := EntrypointCommand{ cmd: &instructions.EntrypointCommand{ ShellDependantCmdLine: instructions.ShellDependantCmdLine{ PrependShell: test.prependShell, CmdLine: test.cmdLine, }, }, } err := cmd.ExecuteCommand(cfg, nil) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedCmd, cfg.Entrypoint) } } ================================================ FILE: pkg/commands/env.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) type EnvCommand struct { BaseCommand cmd *instructions.EnvCommand } func (e *EnvCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { newEnvs := e.cmd.Env replacementEnvs := buildArgs.ReplacementEnvs(config.Env) return util.UpdateConfigEnv(newEnvs, config, replacementEnvs) } // String returns some information about the command for the image config history func (e *EnvCommand) String() string { return e.cmd.String() } ================================================ FILE: pkg/commands/env_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) func Test_EnvExecute(t *testing.T) { cfg := &v1.Config{ Env: []string{ "path=/usr/", "home=/root", }, } envCmd := &EnvCommand{ cmd: &instructions.EnvCommand{ Env: []instructions.KeyValuePair{ { Key: "path", Value: "/some/path", }, { Key: "HOME", Value: "$home", }, { Key: "$path", Value: "$home/", }, { Key: "$buildArg1", Value: "$buildArg2", }, }, }, } expectedEnvs := []string{ "path=/some/path", "home=/root", "HOME=/root", "/usr/=/root/", "foo=foo2", } buildArgs := setUpBuildArgs() err := envCmd.ExecuteCommand(cfg, buildArgs) testutil.CheckErrorAndDeepEqual(t, false, err, expectedEnvs, cfg.Env) } func setUpBuildArgs() *dockerfile.BuildArgs { buildArgs := dockerfile.NewBuildArgs([]string{ "buildArg1=foo", "buildArg2=foo2", }) buildArgs.AddArg("buildArg1", nil) d := "default" buildArgs.AddArg("buildArg2", &d) return buildArgs } ================================================ FILE: pkg/commands/expose.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "fmt" "strings" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/sirupsen/logrus" ) type ExposeCommand struct { BaseCommand cmd *instructions.ExposeCommand } func (r *ExposeCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { logrus.Info("Cmd: EXPOSE") // Grab the currently exposed ports existingPorts := config.ExposedPorts if existingPorts == nil { existingPorts = make(map[string]struct{}) } replacementEnvs := buildArgs.ReplacementEnvs(config.Env) // Add any new ones in for _, p := range r.cmd.Ports { // Resolve any environment variables p, err := util.ResolveEnvironmentReplacement(p, replacementEnvs, false) if err != nil { return err } // Add the default protocol if one isn't specified if !strings.Contains(p, "/") { p = p + "/tcp" } protocol := strings.Split(p, "/")[1] if !validProtocol(protocol) { return fmt.Errorf("invalid protocol: %s", protocol) } logrus.Infof("Adding exposed port: %s", p) existingPorts[p] = struct{}{} } config.ExposedPorts = existingPorts return nil } func validProtocol(protocol string) bool { validProtocols := [2]string{"tcp", "udp"} for _, p := range validProtocols { if protocol == p { return true } } return false } func (r *ExposeCommand) String() string { return r.cmd.String() } ================================================ FILE: pkg/commands/expose_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/GoogleContainerTools/kaniko/testutil" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) func TestUpdateExposedPorts(t *testing.T) { cfg := &v1.Config{ ExposedPorts: map[string]struct{}{ "8080/tcp": {}, }, Env: []string{ "port=udp", "num=8085", }, } ports := []string{ "8080", "8081/tcp", "8082", "8083/udp", "8084/$port", "$num", "$num/$port", } exposeCmd := &ExposeCommand{ cmd: &instructions.ExposeCommand{ Ports: ports, }, } expectedPorts := map[string]struct{}{ "8080/tcp": {}, "8081/tcp": {}, "8082/tcp": {}, "8083/udp": {}, "8084/udp": {}, "8085/tcp": {}, "8085/udp": {}, } buildArgs := dockerfile.NewBuildArgs([]string{}) err := exposeCmd.ExecuteCommand(cfg, buildArgs) testutil.CheckErrorAndDeepEqual(t, false, err, expectedPorts, cfg.ExposedPorts) } func TestInvalidProtocol(t *testing.T) { cfg := &v1.Config{ ExposedPorts: map[string]struct{}{}, } ports := []string{ "80/garbage", } exposeCmd := &ExposeCommand{ cmd: &instructions.ExposeCommand{ Ports: ports, }, } buildArgs := dockerfile.NewBuildArgs([]string{}) err := exposeCmd.ExecuteCommand(cfg, buildArgs) testutil.CheckErrorAndDeepEqual(t, true, err, nil, nil) } ================================================ FILE: pkg/commands/fake_commands.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // used for testing in the commands package package commands import ( "bytes" "io" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/types" ) type fakeLayer struct { TarContent []byte } func (f fakeLayer) Digest() (v1.Hash, error) { return v1.Hash{}, nil } func (f fakeLayer) DiffID() (v1.Hash, error) { return v1.Hash{}, nil } func (f fakeLayer) Compressed() (io.ReadCloser, error) { return nil, nil } func (f fakeLayer) Uncompressed() (io.ReadCloser, error) { return io.NopCloser(bytes.NewReader(f.TarContent)), nil } func (f fakeLayer) Size() (int64, error) { return 0, nil } func (f fakeLayer) MediaType() (types.MediaType, error) { return "", nil } type fakeImage struct { ImageLayers []v1.Layer } func (f fakeImage) Layers() ([]v1.Layer, error) { return f.ImageLayers, nil } func (f fakeImage) MediaType() (types.MediaType, error) { return "", nil } func (f fakeImage) Size() (int64, error) { return 0, nil } func (f fakeImage) ConfigName() (v1.Hash, error) { return v1.Hash{}, nil } func (f fakeImage) ConfigFile() (*v1.ConfigFile, error) { return &v1.ConfigFile{}, nil } func (f fakeImage) RawConfigFile() ([]byte, error) { return []byte{}, nil } func (f fakeImage) Digest() (v1.Hash, error) { return v1.Hash{}, nil } func (f fakeImage) Manifest() (*v1.Manifest, error) { return &v1.Manifest{}, nil } func (f fakeImage) RawManifest() ([]byte, error) { return []byte{}, nil } func (f fakeImage) LayerByDigest(v1.Hash) (v1.Layer, error) { return fakeLayer{}, nil } func (f fakeImage) LayerByDiffID(v1.Hash) (v1.Layer, error) { return fakeLayer{}, nil } ================================================ FILE: pkg/commands/healthcheck.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/docker/docker/api/types/container" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) func convertDockerHealthConfigToContainerRegistryFormat(dockerHealthcheck container.HealthConfig) v1.HealthConfig { return v1.HealthConfig{ Test: dockerHealthcheck.Test, Interval: dockerHealthcheck.Interval, Timeout: dockerHealthcheck.Timeout, StartPeriod: dockerHealthcheck.StartPeriod, Retries: dockerHealthcheck.Retries, } } type HealthCheckCommand struct { BaseCommand cmd *instructions.HealthCheckCommand } // ExecuteCommand handles command processing similar to CMD and RUN, func (h *HealthCheckCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { check := convertDockerHealthConfigToContainerRegistryFormat(*h.cmd.Health) config.Healthcheck = &check return nil } // String returns some information about the command for the image config history func (h *HealthCheckCommand) String() string { return h.cmd.String() } ================================================ FILE: pkg/commands/label.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/sirupsen/logrus" ) type LabelCommand struct { BaseCommand cmd *instructions.LabelCommand } func (r *LabelCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { return updateLabels(r.cmd.Labels, config, buildArgs) } func updateLabels(labels []instructions.KeyValuePair, config *v1.Config, buildArgs *dockerfile.BuildArgs) error { existingLabels := config.Labels if existingLabels == nil { existingLabels = make(map[string]string) } // Let's unescape values before setting the label replacementEnvs := buildArgs.ReplacementEnvs(config.Env) for index, kvp := range labels { key, err := util.ResolveEnvironmentReplacement(kvp.Key, replacementEnvs, false) if err != nil { return err } unescaped, err := util.ResolveEnvironmentReplacement(kvp.Value, replacementEnvs, false) if err != nil { return err } labels[index] = instructions.KeyValuePair{ Key: key, Value: unescaped, } } for _, kvp := range labels { logrus.Infof("Applying label %s=%s", kvp.Key, kvp.Value) existingLabels[kvp.Key] = kvp.Value } config.Labels = existingLabels return nil } // String returns some information about the command for the image config history func (r *LabelCommand) String() string { return r.cmd.String() } ================================================ FILE: pkg/commands/label_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) func TestUpdateLabels(t *testing.T) { cfg := &v1.Config{ Labels: map[string]string{ "foo": "bar", }, } labels := []instructions.KeyValuePair{ { Key: "foo", Value: "override", }, { Key: "bar", Value: "baz", }, { Key: "multiword", Value: "lots\\ of\\ words", }, { Key: "backslashes", Value: "lots\\\\ of\\\\ words", }, { Key: "$label", Value: "foo", }, } arguments := []string{ "label=build_arg_label", } buildArgs := dockerfile.NewBuildArgs(arguments) buildArgs.AddArg("label", nil) expectedLabels := map[string]string{ "foo": "override", "bar": "baz", "multiword": "lots of words", "backslashes": "lots\\ of\\ words", "build_arg_label": "foo", } updateLabels(labels, cfg, buildArgs) testutil.CheckErrorAndDeepEqual(t, false, nil, expectedLabels, cfg.Labels) } ================================================ FILE: pkg/commands/onbuild.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/sirupsen/logrus" ) type OnBuildCommand struct { BaseCommand cmd *instructions.OnbuildCommand } // ExecuteCommand adds the specified expression in Onbuild to the config func (o *OnBuildCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { logrus.Info("Cmd: ONBUILD") logrus.Infof("Args: %s", o.cmd.Expression) if config.OnBuild == nil { config.OnBuild = []string{o.cmd.Expression} } else { config.OnBuild = append(config.OnBuild, o.cmd.Expression) } return nil } // String returns some information about the command for the image config history func (o *OnBuildCommand) String() string { return o.cmd.String() } ================================================ FILE: pkg/commands/onbuild_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/GoogleContainerTools/kaniko/testutil" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) var onbuildTests = []struct { expression string onbuildArray []string expectedArray []string }{ { expression: "RUN echo \\\"hi\\\" > $dir", onbuildArray: nil, expectedArray: []string{ "RUN echo \\\"hi\\\" > $dir", }, }, { expression: "COPY foo foo", onbuildArray: []string{ "RUN echo \"hi\" > /some/dir", }, expectedArray: []string{ "RUN echo \"hi\" > /some/dir", "COPY foo foo", }, }, } func TestExecuteOnbuild(t *testing.T) { for _, test := range onbuildTests { cfg := &v1.Config{ Env: []string{ "dir=/some/dir", }, OnBuild: test.onbuildArray, } onbuildCmd := &OnBuildCommand{ cmd: &instructions.OnbuildCommand{ Expression: test.expression, }, } buildArgs := dockerfile.NewBuildArgs([]string{}) err := onbuildCmd.ExecuteCommand(cfg, buildArgs) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedArray, cfg.OnBuild) } } ================================================ FILE: pkg/commands/run.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "fmt" "os" "os/exec" "strings" "syscall" kConfig "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) type RunCommand struct { BaseCommand cmd *instructions.RunCommand shdCache bool } // for testing var ( userLookup = util.LookupUser ) func (r *RunCommand) IsArgsEnvsRequiredInCache() bool { return true } func (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { return runCommandInExec(config, buildArgs, r.cmd) } func runCommandInExec(config *v1.Config, buildArgs *dockerfile.BuildArgs, cmdRun *instructions.RunCommand) error { var newCommand []string if cmdRun.PrependShell { // This is the default shell on Linux var shell []string if len(config.Shell) > 0 { shell = config.Shell } else { shell = append(shell, "/bin/sh", "-c") } newCommand = append(shell, strings.Join(cmdRun.CmdLine, " ")) } else { newCommand = cmdRun.CmdLine // Find and set absolute path of executable by setting PATH temporary replacementEnvs := buildArgs.ReplacementEnvs(config.Env) for _, v := range replacementEnvs { entry := strings.SplitN(v, "=", 2) if entry[0] != "PATH" { continue } oldPath := os.Getenv("PATH") defer os.Setenv("PATH", oldPath) os.Setenv("PATH", entry[1]) path, err := exec.LookPath(newCommand[0]) if err == nil { newCommand[0] = path } } } logrus.Infof("Cmd: %s", newCommand[0]) logrus.Infof("Args: %s", newCommand[1:]) cmd := exec.Command(newCommand[0], newCommand[1:]...) cmd.Dir = setWorkDirIfExists(config.WorkingDir) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr replacementEnvs := buildArgs.ReplacementEnvs(config.Env) cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} u := config.User userAndGroup := strings.Split(u, ":") userStr, err := util.ResolveEnvironmentReplacement(userAndGroup[0], replacementEnvs, false) if err != nil { return errors.Wrapf(err, "resolving user %s", userAndGroup[0]) } // If specified, run the command as a specific user if userStr != "" { cmd.SysProcAttr.Credential, err = util.SyscallCredentials(userStr) if err != nil { return errors.Wrap(err, "credentials") } } env, err := addDefaultHOME(userStr, replacementEnvs) if err != nil { return errors.Wrap(err, "adding default HOME variable") } cmd.Env = env logrus.Infof("Running: %s", cmd.Args) if err := cmd.Start(); err != nil { return errors.Wrap(err, "starting command") } pgid, err := syscall.Getpgid(cmd.Process.Pid) if err != nil { return errors.Wrap(err, "getting group id for process") } if err := cmd.Wait(); err != nil { return errors.Wrap(err, "waiting for process to exit") } //it's not an error if there are no grandchildren if err := syscall.Kill(-pgid, syscall.SIGKILL); err != nil && err.Error() != "no such process" { return err } return nil } // addDefaultHOME adds the default value for HOME if it isn't already set func addDefaultHOME(u string, envs []string) ([]string, error) { for _, env := range envs { split := strings.SplitN(env, "=", 2) if split[0] == constants.HOME { return envs, nil } } // If user isn't set, set default value of HOME if u == "" || u == constants.RootUser { return append(envs, fmt.Sprintf("%s=%s", constants.HOME, constants.DefaultHOMEValue)), nil } // If user is set to username, set value of HOME to /home/${user} // Otherwise the user is set to uid and HOME is / userObj, err := userLookup(u) if err != nil { return nil, fmt.Errorf("lookup user %v: %w", u, err) } return append(envs, fmt.Sprintf("%s=%s", constants.HOME, userObj.HomeDir)), nil } // String returns some information about the command for the image config func (r *RunCommand) String() string { return r.cmd.String() } func (r *RunCommand) FilesToSnapshot() []string { return nil } func (r *RunCommand) ProvidesFilesToSnapshot() bool { return false } // CacheCommand returns true since this command should be cached func (r *RunCommand) CacheCommand(img v1.Image) DockerCommand { return &CachingRunCommand{ img: img, cmd: r.cmd, extractFn: util.ExtractFile, } } func (r *RunCommand) MetadataOnly() bool { return false } func (r *RunCommand) RequiresUnpackedFS() bool { return true } func (r *RunCommand) ShouldCacheOutput() bool { return r.shdCache } type CachingRunCommand struct { BaseCommand caching img v1.Image extractedFiles []string cmd *instructions.RunCommand extractFn util.ExtractFunction } func (cr *CachingRunCommand) IsArgsEnvsRequiredInCache() bool { return true } func (cr *CachingRunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { logrus.Infof("Found cached layer, extracting to filesystem") var err error if cr.img == nil { return errors.New(fmt.Sprintf("command image is nil %v", cr.String())) } layers, err := cr.img.Layers() if err != nil { return errors.Wrap(err, "retrieving image layers") } if len(layers) != 1 { return errors.New(fmt.Sprintf("expected %d layers but got %d", 1, len(layers))) } cr.layer = layers[0] cr.extractedFiles, err = util.GetFSFromLayers( kConfig.RootDir, layers, util.ExtractFunc(cr.extractFn), util.IncludeWhiteout(), ) if err != nil { return errors.Wrap(err, "extracting fs from image") } return nil } func (cr *CachingRunCommand) FilesToSnapshot() []string { f := cr.extractedFiles logrus.Debugf("%d files extracted by caching run command", len(f)) logrus.Tracef("Extracted files: %s", f) return f } func (cr *CachingRunCommand) String() string { if cr.cmd == nil { return "nil command" } return cr.cmd.String() } func (cr *CachingRunCommand) MetadataOnly() bool { return false } // todo: this should create the workdir if it doesn't exist, atleast this is what docker does func setWorkDirIfExists(workdir string) string { if _, err := os.Lstat(workdir); err == nil { return workdir } return "" } ================================================ FILE: pkg/commands/run_marker.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "os" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/sirupsen/logrus" ) type RunMarkerCommand struct { BaseCommand cmd *instructions.RunCommand Files []string shdCache bool } func (r *RunMarkerCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { // run command `touch filemarker` logrus.Debugf("Using new RunMarker command") prevFilesMap, _ := util.GetFSInfoMap("/", map[string]os.FileInfo{}) if err := runCommandInExec(config, buildArgs, r.cmd); err != nil { return err } _, r.Files = util.GetFSInfoMap("/", prevFilesMap) logrus.Debugf("Files changed %s", r.Files) return nil } // String returns some information about the command for the image config func (r *RunMarkerCommand) String() string { return r.cmd.String() } func (r *RunMarkerCommand) FilesToSnapshot() []string { return r.Files } func (r *RunMarkerCommand) ProvidesFilesToSnapshot() bool { return true } func (r *RunMarkerCommand) IsArgsEnvsRequiredInCache() bool { return true } // CacheCommand returns true since this command should be cached func (r *RunMarkerCommand) CacheCommand(img v1.Image) DockerCommand { return &CachingRunCommand{ img: img, cmd: r.cmd, extractFn: util.ExtractFile, } } func (r *RunMarkerCommand) MetadataOnly() bool { return false } func (r *RunMarkerCommand) RequiresUnpackedFS() bool { return true } func (r *RunMarkerCommand) ShouldCacheOutput() bool { return r.shdCache } func (r *RunMarkerCommand) ShouldDetectDeletedFiles() bool { return true } ================================================ FILE: pkg/commands/run_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "archive/tar" "bytes" "io" "log" "os" "os/user" "path/filepath" "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" ) func Test_addDefaultHOME(t *testing.T) { tests := []struct { name string user string mockUser *user.User lookupError error initial []string expected []string }{ { name: "HOME already set", user: "", initial: []string{ "HOME=/something", "PATH=/something/else", }, expected: []string{ "HOME=/something", "PATH=/something/else", }, }, { name: "HOME not set and user not set", user: "", initial: []string{ "PATH=/something/else", }, expected: []string{ "PATH=/something/else", "HOME=/root", }, }, { name: "HOME not set and user and homedir for the user set", user: "www-add", mockUser: &user.User{ Username: "www-add", HomeDir: "/home/some-other", }, initial: []string{ "PATH=/something/else", }, expected: []string{ "PATH=/something/else", "HOME=/home/some-other", }, }, { name: "USER is set using the UID", user: "1000", mockUser: &user.User{ Username: "1000", HomeDir: "/", }, initial: []string{ "PATH=/something/else", }, expected: []string{ "PATH=/something/else", "HOME=/", }, }, { name: "HOME not set and user is set to root", user: "root", mockUser: &user.User{ Username: "root", }, initial: []string{ "PATH=/something/else", }, expected: []string{ "PATH=/something/else", "HOME=/root", }, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { original := userLookup userLookup = func(username string) (*user.User, error) { return test.mockUser, test.lookupError } defer func() { userLookup = original }() actual, err := addDefaultHOME(test.user, test.initial) testutil.CheckErrorAndDeepEqual(t, false, err, test.expected, actual) }) } } func prepareTarFixture(t *testing.T, fileNames []string) ([]byte, error) { dir := t.TempDir() content := ` Meow meow meow meow meow meow meow meow ` for _, name := range fileNames { if err := os.WriteFile(filepath.Join(dir, name), []byte(content), 0777); err != nil { return nil, err } } writer := bytes.NewBuffer([]byte{}) tw := tar.NewWriter(writer) defer tw.Close() filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if info.IsDir() { return nil } hdr, err := tar.FileInfoHeader(info, "") if err != nil { return err } if err := tw.WriteHeader(hdr); err != nil { log.Fatal(err) } body, err := os.ReadFile(path) if err != nil { return err } if _, err := tw.Write(body); err != nil { log.Fatal(err) } return nil }) return writer.Bytes(), nil } func Test_CachingRunCommand_ExecuteCommand(t *testing.T) { tarContent, err := prepareTarFixture(t, []string{"foo.txt"}) if err != nil { t.Errorf("couldn't prepare tar fixture %v", err) } config := &v1.Config{} buildArgs := &dockerfile.BuildArgs{} type testCase struct { desctiption string expectLayer bool expectErr bool count *int expectedCount int command *CachingRunCommand extractedFiles []string contextFiles []string } testCases := []testCase{ func() testCase { c := &CachingRunCommand{ img: fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{TarContent: tarContent}, }, }, } count := 0 tc := testCase{ desctiption: "with valid image and valid layer", count: &count, expectedCount: 1, expectLayer: true, extractedFiles: []string{"/foo.txt"}, contextFiles: []string{"foo.txt"}, } c.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error { *tc.count++ return nil } tc.command = c return tc }(), func() testCase { c := &CachingRunCommand{} tc := testCase{ desctiption: "with no image", expectErr: true, } c.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error { return nil } tc.command = c return tc }(), func() testCase { c := &CachingRunCommand{ img: fakeImage{}, } c.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error { return nil } return testCase{ desctiption: "with image containing no layers", expectErr: true, command: c, } }(), func() testCase { c := &CachingRunCommand{ img: fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{}, }, }, } c.extractFn = func(_ string, _ *tar.Header, _ string, _ io.Reader) error { return nil } tc := testCase{ desctiption: "with image one layer which has no tar content", expectErr: false, // this one probably should fail but doesn't because of how ExecuteCommand and util.GetFSFromLayers are implemented - cvgw- 2019-11-25 expectLayer: true, } tc.command = c return tc }(), } for _, tc := range testCases { t.Run(tc.desctiption, func(t *testing.T) { c := tc.command err := c.ExecuteCommand(config, buildArgs) if !tc.expectErr && err != nil { t.Errorf("Expected err to be nil but was %v", err) } else if tc.expectErr && err == nil { t.Error("Expected err but was nil") } if tc.count != nil { if *tc.count != tc.expectedCount { t.Errorf("Expected extractFn to be called %v times but was called %v times", 1, *tc.count) } for _, file := range tc.extractedFiles { match := false cmdFiles := c.extractedFiles for _, f := range cmdFiles { if file == f { match = true break } } if !match { t.Errorf("Expected extracted files to include %v but did not %v", file, cmdFiles) } } // CachingRunCommand does not override BaseCommand // FilesUseFromContext so this will always return an empty slice and no error // This seems like it might be a bug as it results in RunCommands and CachingRunCommands generating different cache keys - cvgw - 2019-11-27 cmdFiles, err := c.FilesUsedFromContext( config, buildArgs, ) if err != nil { t.Errorf("failed to get files used from context from command") } if len(cmdFiles) != 0 { t.Errorf("expected files used from context to be empty but was not") } } if c.layer == nil && tc.expectLayer { t.Error("expected the command to have a layer set but instead was nil") } else if c.layer != nil && !tc.expectLayer { t.Error("expected the command to have no layer set but instead found a layer") } }) } } func TestSetWorkDirIfExists(t *testing.T) { testDir := t.TempDir() testutil.CheckDeepEqual(t, testDir, setWorkDirIfExists(testDir)) testutil.CheckDeepEqual(t, "", setWorkDirIfExists("doesnot-exists")) } ================================================ FILE: pkg/commands/shell.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) type ShellCommand struct { BaseCommand cmd *instructions.ShellCommand } // ExecuteCommand handles command processing similar to CMD and RUN, func (s *ShellCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { config.Shell = s.cmd.Shell return nil } // String returns some information about the command for the image config history func (s *ShellCommand) String() string { return s.cmd.String() } ================================================ FILE: pkg/commands/shell_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) var shellTests = []struct { cmdLine []string expectedShell []string }{ { cmdLine: []string{"/bin/bash", "-c"}, expectedShell: []string{"/bin/bash", "-c"}, }, { cmdLine: []string{"/bin/bash"}, expectedShell: []string{"/bin/bash"}, }, } func TestShellExecuteCmd(t *testing.T) { cfg := &v1.Config{ Shell: nil, } for _, test := range shellTests { cmd := ShellCommand{ cmd: &instructions.ShellCommand{ Shell: test.cmdLine, }, } err := cmd.ExecuteCommand(cfg, nil) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedShell, cfg.Shell) } } ================================================ FILE: pkg/commands/stopsignal.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/moby/sys/signal" "github.com/sirupsen/logrus" ) type StopSignalCommand struct { BaseCommand cmd *instructions.StopSignalCommand } // ExecuteCommand handles command processing similar to CMD and RUN, func (s *StopSignalCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { logrus.Info("Cmd: STOPSIGNAL") // resolve possible environment variables replacementEnvs := buildArgs.ReplacementEnvs(config.Env) resolvedEnvs, err := util.ResolveEnvironmentReplacementList([]string{s.cmd.Signal}, replacementEnvs, false) if err != nil { return err } stopsignal := resolvedEnvs[0] // validate stopsignal _, err = signal.ParseSignal(stopsignal) if err != nil { return err } logrus.Infof("Replacing StopSignal in config with %v", stopsignal) config.StopSignal = stopsignal return nil } // String returns some information about the command for the image config history func (s *StopSignalCommand) String() string { return s.cmd.String() } ================================================ FILE: pkg/commands/stopsignal_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) var stopsignalTests = []struct { signal string expectedSignal string }{ { signal: "SIGKILL", expectedSignal: "SIGKILL", }, { signal: "${STOPSIG}", expectedSignal: "SIGKILL", }, { signal: "1", expectedSignal: "1", }, } func TestStopsignalExecuteCmd(t *testing.T) { cfg := &v1.Config{ StopSignal: "", Env: []string{"STOPSIG=SIGKILL"}, } for _, test := range stopsignalTests { cmd := StopSignalCommand{ cmd: &instructions.StopSignalCommand{ Signal: test.signal, }, } b := dockerfile.NewBuildArgs([]string{}) err := cmd.ExecuteCommand(cfg, b) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedSignal, cfg.StopSignal) } } ================================================ FILE: pkg/commands/user.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "fmt" "strings" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) type UserCommand struct { BaseCommand cmd *instructions.UserCommand } func (r *UserCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { logrus.Info("Cmd: USER") u := r.cmd.User userAndGroup := strings.Split(u, ":") replacementEnvs := buildArgs.ReplacementEnvs(config.Env) userStr, err := util.ResolveEnvironmentReplacement(userAndGroup[0], replacementEnvs, false) if err != nil { return errors.Wrap(err, fmt.Sprintf("resolving user %s", userAndGroup[0])) } if len(userAndGroup) > 1 { groupStr, err := util.ResolveEnvironmentReplacement(userAndGroup[1], replacementEnvs, false) if err != nil { return errors.Wrap(err, fmt.Sprintf("resolving group %s", userAndGroup[1])) } userStr = userStr + ":" + groupStr } config.User = userStr return nil } func (r *UserCommand) String() string { return r.cmd.String() } ================================================ FILE: pkg/commands/user_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "os/user" "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) var userTests = []struct { user string userObj *user.User expectedUID string expectedGID string }{ { user: "root", userObj: &user.User{Uid: "root", Gid: "root"}, expectedUID: "root", }, { user: "root-add", userObj: &user.User{Uid: "root-add", Gid: "root"}, expectedUID: "root-add", }, { user: "0", userObj: &user.User{Uid: "0", Gid: "0"}, expectedUID: "0", }, { user: "fakeUser", userObj: &user.User{Uid: "fakeUser", Gid: "fakeUser"}, expectedUID: "fakeUser", }, { user: "root", userObj: &user.User{Uid: "root", Gid: "some"}, expectedUID: "root", }, { user: "0", userObj: &user.User{Uid: "0"}, expectedUID: "0", }, { user: "root", userObj: &user.User{Uid: "root"}, expectedUID: "root", expectedGID: "f0", }, { user: "0", userObj: &user.User{Uid: "0"}, expectedUID: "0", }, { user: "$envuser", userObj: &user.User{Uid: "root", Gid: "root"}, expectedUID: "root", }, { user: "root", userObj: &user.User{Uid: "root"}, expectedUID: "root", }, { user: "some", userObj: &user.User{Uid: "some"}, expectedUID: "some", }, { user: "some", expectedUID: "some", }, } func TestUpdateUser(t *testing.T) { for _, test := range userTests { cfg := &v1.Config{ Env: []string{ "envuser=root", "envgroup=grp", }, } cmd := UserCommand{ cmd: &instructions.UserCommand{ User: test.user, }, } buildArgs := dockerfile.NewBuildArgs([]string{}) err := cmd.ExecuteCommand(cfg, buildArgs) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedUID, cfg.User) } } ================================================ FILE: pkg/commands/volume.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "fmt" "os" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/sirupsen/logrus" ) type VolumeCommand struct { BaseCommand cmd *instructions.VolumeCommand } func (v *VolumeCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { logrus.Info("Cmd: VOLUME") volumes := v.cmd.Volumes replacementEnvs := buildArgs.ReplacementEnvs(config.Env) resolvedVolumes, err := util.ResolveEnvironmentReplacementList(volumes, replacementEnvs, true) if err != nil { return err } existingVolumes := config.Volumes if existingVolumes == nil { existingVolumes = map[string]struct{}{} } for _, volume := range resolvedVolumes { var x struct{} existingVolumes[volume] = x util.AddVolumePathToIgnoreList(volume) // Only create and snapshot the dir if it didn't exist already if _, err := os.Stat(volume); os.IsNotExist(err) { logrus.Infof("Creating directory %s", volume) if err := os.MkdirAll(volume, 0755); err != nil { return fmt.Errorf("could not create directory for volume %s: %w", volume, err) } } } config.Volumes = existingVolumes return nil } func (v *VolumeCommand) FilesToSnapshot() []string { return []string{} } func (v *VolumeCommand) String() string { return v.cmd.String() } ================================================ FILE: pkg/commands/volume_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) func TestUpdateVolume(t *testing.T) { cfg := &v1.Config{ Env: []string{ "VOLUME=/etc", }, Volumes: map[string]struct{}{}, } volumes := []string{ "/tmp", "/var/lib", "$VOLUME", } volumeCmd := &VolumeCommand{ cmd: &instructions.VolumeCommand{ Volumes: volumes, }, } expectedVolumes := map[string]struct{}{ "/tmp": {}, "/var/lib": {}, "/etc": {}, } buildArgs := dockerfile.NewBuildArgs([]string{}) err := volumeCmd.ExecuteCommand(cfg, buildArgs) testutil.CheckErrorAndDeepEqual(t, false, err, expectedVolumes, cfg.Volumes) } ================================================ FILE: pkg/commands/workdir.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "os" "path/filepath" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/pkg/errors" "github.com/GoogleContainerTools/kaniko/pkg/util" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/sirupsen/logrus" ) type WorkdirCommand struct { BaseCommand cmd *instructions.WorkdirCommand snapshotFiles []string } // For testing var mkdirAllWithPermissions = util.MkdirAllWithPermissions func (w *WorkdirCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { logrus.Info("Cmd: workdir") workdirPath := w.cmd.Path replacementEnvs := buildArgs.ReplacementEnvs(config.Env) resolvedWorkingDir, err := util.ResolveEnvironmentReplacement(workdirPath, replacementEnvs, true) if err != nil { return err } if filepath.IsAbs(resolvedWorkingDir) { config.WorkingDir = resolvedWorkingDir } else { if config.WorkingDir != "" { config.WorkingDir = filepath.Join(config.WorkingDir, resolvedWorkingDir) } else { config.WorkingDir = filepath.Join("/", resolvedWorkingDir) } } logrus.Infof("Changed working directory to %s", config.WorkingDir) // Only create and snapshot the dir if it didn't exist already w.snapshotFiles = []string{} if _, err := os.Stat(config.WorkingDir); os.IsNotExist(err) { uid, gid := int64(-1), int64(-1) if config.User != "" { logrus.Debugf("Fetching uid and gid for USER '%s'", config.User) uid, gid, err = util.GetUserGroup(config.User, replacementEnvs) if err != nil { return errors.Wrapf(err, "identifying uid and gid for user %s", config.User) } } logrus.Infof("Creating directory %s with uid %d and gid %d", config.WorkingDir, uid, gid) w.snapshotFiles = append(w.snapshotFiles, config.WorkingDir) if err := mkdirAllWithPermissions(config.WorkingDir, 0755, uid, gid); err != nil { return errors.Wrapf(err, "creating workdir %s", config.WorkingDir) } } return nil } // FilesToSnapshot returns the workingdir, which should have been created if it didn't already exist func (w *WorkdirCommand) FilesToSnapshot() []string { return w.snapshotFiles } // String returns some information about the command for the image config history func (w *WorkdirCommand) String() string { return w.cmd.String() } func (w *WorkdirCommand) MetadataOnly() bool { return false } ================================================ FILE: pkg/commands/workdir_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package commands import ( "os" "testing" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) // Each test here changes the same WorkingDir field in the config // So, some of the tests build off of each other // This is needed to make sure WorkingDir handles paths correctly // For example, if WORKDIR specifies a non-absolute path, it should be appended to the current WORKDIR var workdirTests = []struct { path string expectedPath string snapshotFiles []string }{ { path: "a", expectedPath: "/a", snapshotFiles: []string{"/a"}, }, { path: "/a", expectedPath: "/a", snapshotFiles: []string{"/a"}, }, { path: "b", expectedPath: "/a/b", snapshotFiles: []string{"/a/b"}, }, { path: "c", expectedPath: "/a/b/c", snapshotFiles: []string{"/a/b/c"}, }, { path: "/d", expectedPath: "/d", snapshotFiles: []string{"/d"}, }, { path: "$path", expectedPath: "/d/usr", snapshotFiles: []string{"/d/usr"}, }, { path: "$home", expectedPath: "/root", snapshotFiles: []string{}, }, { path: "/foo/$path/$home", expectedPath: "/foo/usr/root", snapshotFiles: []string{"/foo/usr/root"}, }, { path: "/tmp", expectedPath: "/tmp", snapshotFiles: []string{}, }, } // For testing func mockDir(path string, mode os.FileMode, uid, gid int64) error { return nil } func TestWorkdirCommand(t *testing.T) { // Mock out mkdir for testing. oldMkdir := mkdirAllWithPermissions mkdirAllWithPermissions = mockDir defer func() { mkdirAllWithPermissions = oldMkdir }() cfg := &v1.Config{ WorkingDir: "", Env: []string{ "path=usr/", "home=/root", }, } for _, test := range workdirTests { cmd := WorkdirCommand{ cmd: &instructions.WorkdirCommand{ Path: test.path, }, snapshotFiles: nil, } buildArgs := dockerfile.NewBuildArgs([]string{}) cmd.ExecuteCommand(cfg, buildArgs) testutil.CheckErrorAndDeepEqual(t, false, nil, test.expectedPath, cfg.WorkingDir) testutil.CheckErrorAndDeepEqual(t, false, nil, test.snapshotFiles, cmd.snapshotFiles) } } ================================================ FILE: pkg/config/args.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package config import ( "fmt" "strings" "github.com/sirupsen/logrus" ) // This type is used to supported passing in multiple flags type multiArg []string // Now, for our new type, implement the two methods of // the flag.Value interface... // The first method is String() string func (b *multiArg) String() string { return strings.Join(*b, ",") } // The second method is Set(value string) error func (b *multiArg) Set(value string) error { logrus.Debugf("Appending to multi args %s", value) *b = append(*b, value) return nil } // The third is Type() string func (b *multiArg) Type() string { return "multi-arg type" } func (b *multiArg) Contains(v string) bool { for _, s := range *b { if s == v { return true } } return false } // This type is used to supported passing in multiple key=value flags type keyValueArg map[string]string // Now, for our new type, implement the two methods of // the flag.Value interface... // The first method is String() string func (a *keyValueArg) String() string { var result []string for key := range *a { result = append(result, fmt.Sprintf("%s=%s", key, (*a)[key])) } return strings.Join(result, ",") } // The second method is Set(value string) error func (a *keyValueArg) Set(value string) error { valueSplit := strings.SplitN(value, "=", 2) if len(valueSplit) < 2 { return fmt.Errorf("invalid argument value. expect key=value, got %s", value) } (*a)[valueSplit[0]] = valueSplit[1] return nil } // The third is Type() string func (a *keyValueArg) Type() string { return "key-value-arg type" } type multiKeyMultiValueArg map[string][]string func (c *multiKeyMultiValueArg) parseKV(value string) error { valueSplit := strings.SplitN(value, "=", 2) if len(valueSplit) < 2 { return fmt.Errorf("invalid argument value. expect key=value, got %s", value) } (*c)[valueSplit[0]] = append((*c)[valueSplit[0]], valueSplit[1]) return nil } func (c *multiKeyMultiValueArg) String() string { var result []string for key := range *c { for _, val := range (*c)[key] { result = append(result, fmt.Sprintf("%s=%s", key, val)) } } return strings.Join(result, ";") } func (c *multiKeyMultiValueArg) Set(value string) error { if value == "" { return nil } if strings.Contains(value, ";") { kvpairs := strings.Split(value, ";") for _, kv := range kvpairs { err := c.parseKV(kv) if err != nil { return err } } return nil } return c.parseKV(value) } func (c *multiKeyMultiValueArg) Type() string { return "key-multi-value-arg type" } ================================================ FILE: pkg/config/args_test.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package config import "testing" func TestMultiArg_Set_shouldAppendValue(t *testing.T) { var arg multiArg arg.Set("value1") if len(arg) != 1 || arg[0] != "value1" { t.Error("Fist value was not appended") } arg.Set("value2") if len(arg) != 2 || arg[1] != "value2" { t.Error("Second value was not appended") } } func Test_KeyValueArg_Set_shouldSplitArgument(t *testing.T) { arg := make(keyValueArg) arg.Set("key=value") if arg["key"] != "value" { t.Error("Invalid split. key=value should be split to key=>value") } } func Test_KeyValueArg_Set_shouldAcceptEqualAsValue(t *testing.T) { arg := make(keyValueArg) arg.Set("key=value=something") if arg["key"] != "value=something" { t.Error("Invalid split. key=value=something should be split to key=>value=something") } } func Test_multiKeyMultiValueArg_Set_shouldSplitArgumentLikeKVA(t *testing.T) { arg := make(multiKeyMultiValueArg) arg.Set("key=value") if arg["key"][0] != "value" { t.Error("Invalid split. key=value should be split to key=>value") } } func Test_multiKeyMultiValueArg_Set_ShouldAppendIfRepeated(t *testing.T) { arg := make(multiKeyMultiValueArg) arg.Set("key=v1") arg.Set("key=v2") if arg["key"][0] != "v1" || arg["key"][1] != "v2" { t.Error("Invalid repeat behavior. Repeated keys should append values") } } func Test_multiKeyMultiValueArg_Set_Composed(t *testing.T) { arg := make(multiKeyMultiValueArg) arg.Set("key1=value1;key2=value2") if arg["key1"][0] != "value1" || arg["key2"][0] != "value2" { t.Error("Invalid composed value parsing. key=value;key2=value2 should generate 2 keys") } } func Test_multiKeyMultiValueArg_Set_WithEmptyValueShouldWork(t *testing.T) { arg := make(multiKeyMultiValueArg) err := arg.Set("") if len(arg) != 0 || err != nil { t.Error("multiKeyMultiValueArg must handle empty value") } } ================================================ FILE: pkg/config/init.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package config import ( "fmt" "os" "github.com/GoogleContainerTools/kaniko/pkg/constants" ) var RootDir string // KanikoDir is the path to the Kaniko directory var KanikoDir = func() string { if kd, ok := os.LookupEnv("KANIKO_DIR"); ok { return kd } return constants.DefaultKanikoPath }() // DockerfilePath is the path the Dockerfile is copied to var DockerfilePath = fmt.Sprintf("%s/Dockerfile", KanikoDir) // BuildContextDir is the directory a build context will be unpacked into, // for example, a tarball from a GCS bucket will be unpacked here var BuildContextDir = fmt.Sprintf("%s/buildcontext/", KanikoDir) // KanikoIntermediateStagesDir is where we will store intermediate stages // as tarballs in case they are needed later on var KanikoIntermediateStagesDir = fmt.Sprintf("%s/stages/", KanikoDir) var MountInfoPath string func init() { RootDir = constants.RootDir MountInfoPath = constants.MountInfoPath } ================================================ FILE: pkg/config/options.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package config import ( "errors" "fmt" "strconv" "strings" "time" ) // CacheOptions are base image cache options that are set by command line arguments type CacheOptions struct { CacheDir string CacheTTL time.Duration } // RegistryOptions are all the options related to the registries, set by command line arguments. type RegistryOptions struct { RegistryMaps multiKeyMultiValueArg RegistryMirrors multiArg InsecureRegistries multiArg SkipTLSVerifyRegistries multiArg RegistriesCertificates keyValueArg RegistriesClientCertificates keyValueArg SkipDefaultRegistryFallback bool Insecure bool SkipTLSVerify bool InsecurePull bool SkipTLSVerifyPull bool PushIgnoreImmutableTagErrors bool PushRetry int ImageDownloadRetry int } // KanikoOptions are options that are set by command line arguments type KanikoOptions struct { RegistryOptions CacheOptions Destinations multiArg BuildArgs multiArg Labels multiArg Git KanikoGitOptions IgnorePaths multiArg DockerfilePath string SrcContext string SnapshotMode string SnapshotModeDeprecated string CustomPlatform string CustomPlatformDeprecated string Bucket string TarPath string TarPathDeprecated string KanikoDir string Target string CacheRepo string DigestFile string ImageNameDigestFile string ImageNameTagDigestFile string OCILayoutPath string Compression Compression CompressionLevel int ImageFSExtractRetry int SingleSnapshot bool Reproducible bool NoPush bool NoPushCache bool Cache bool Cleanup bool CompressedCaching bool IgnoreVarRun bool SkipUnusedStages bool RunV2 bool CacheCopyLayers bool CacheRunLayers bool ForceBuildMetadata bool InitialFSUnpacked bool SkipPushPermissionCheck bool } type KanikoGitOptions struct { Branch string SingleBranch bool RecurseSubmodules bool InsecureSkipTLS bool } var ErrInvalidGitFlag = errors.New("invalid git flag, must be in the key=value format") func (k *KanikoGitOptions) Type() string { return "gitoptions" } func (k *KanikoGitOptions) String() string { return fmt.Sprintf("branch=%s,single-branch=%t,recurse-submodules=%t", k.Branch, k.SingleBranch, k.RecurseSubmodules) } func (k *KanikoGitOptions) Set(s string) error { var parts = strings.SplitN(s, "=", 2) if len(parts) != 2 { return fmt.Errorf("%w: %s", ErrInvalidGitFlag, s) } switch parts[0] { case "branch": k.Branch = parts[1] case "single-branch": v, err := strconv.ParseBool(parts[1]) if err != nil { return err } k.SingleBranch = v case "recurse-submodules": v, err := strconv.ParseBool(parts[1]) if err != nil { return err } k.RecurseSubmodules = v case "insecure-skip-tls": v, err := strconv.ParseBool(parts[1]) if err != nil { return err } k.InsecureSkipTLS = v } return nil } // Compression is an enumeration of the supported compression algorithms type Compression string // The collection of known MediaType values. const ( GZip Compression = "gzip" ZStd Compression = "zstd" ) func (c *Compression) String() string { return string(*c) } func (c *Compression) Set(v string) error { switch v { case "gzip", "zstd": *c = Compression(v) return nil default: return errors.New(`must be either "gzip" or "zstd"`) } } func (c *Compression) Type() string { return "compression" } // WarmerOptions are options that are set by command line arguments to the cache warmer. type WarmerOptions struct { CacheOptions RegistryOptions CustomPlatform string Images multiArg Force bool DockerfilePath string BuildArgs multiArg } ================================================ FILE: pkg/config/options_test.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package config import ( "testing" "github.com/GoogleContainerTools/kaniko/testutil" ) func TestKanikoGitOptions(t *testing.T) { t.Run("invalid pair", func(t *testing.T) { var g = &KanikoGitOptions{} testutil.CheckError(t, true, g.Set("branch")) }) t.Run("sets values", func(t *testing.T) { var g = &KanikoGitOptions{} testutil.CheckNoError(t, g.Set("branch=foo")) testutil.CheckNoError(t, g.Set("recurse-submodules=true")) testutil.CheckNoError(t, g.Set("single-branch=true")) testutil.CheckNoError(t, g.Set("insecure-skip-tls=false")) testutil.CheckDeepEqual(t, KanikoGitOptions{ Branch: "foo", SingleBranch: true, RecurseSubmodules: true, InsecureSkipTLS: false, }, *g) }) t.Run("sets bools other than true", func(t *testing.T) { var g = KanikoGitOptions{} testutil.CheckError(t, true, g.Set("recurse-submodules=")) testutil.CheckError(t, true, g.Set("single-branch=zaza")) testutil.CheckNoError(t, g.Set("recurse-submodules=false")) testutil.CheckDeepEqual(t, KanikoGitOptions{ SingleBranch: false, RecurseSubmodules: false, }, g) }) } ================================================ FILE: pkg/config/stage.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package config import ( "github.com/moby/buildkit/frontend/dockerfile/instructions" ) // KanikoStage wraps a stage of the Dockerfile and provides extra information type KanikoStage struct { instructions.Stage BaseImageIndex int Final bool BaseImageStoredLocally bool SaveStage bool MetaArgs []instructions.ArgCommand Index int } ================================================ FILE: pkg/constants/constants.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package constants const ( // RootDir is the path to the root directory RootDir = "/" MountInfoPath = "/proc/self/mountinfo" DefaultKanikoPath = "/kaniko" Author = "kaniko" // ContextTar is the default name of the tar uploaded to GCS buckets ContextTar = "context.tar.gz" // Various snapshot modes: SnapshotModeTime = "time" SnapshotModeFull = "full" SnapshotModeRedo = "redo" // NoBaseImage is the scratch image NoBaseImage = "scratch" GCSBuildContextPrefix = "gs://" S3BuildContextPrefix = "s3://" LocalDirBuildContextPrefix = "dir://" GitBuildContextPrefix = "git://" HTTPSBuildContextPrefix = "https://" HOME = "HOME" // DefaultHOMEValue is the default value Docker sets for $HOME DefaultHOMEValue = "/root" RootUser = "root" // Docker command names Cmd = "CMD" Entrypoint = "ENTRYPOINT" // Name of the .dockerignore file Dockerignore = ".dockerignore" // S3 Custom endpoint ENV name S3EndpointEnv = "S3_ENDPOINT" S3ForcePathStyle = "S3_FORCE_PATH_STYLE" ) // ScratchEnvVars are the default environment variables needed for a scratch image. var ScratchEnvVars = []string{"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"} // AzureBlobStorageHostRegEx is ReqEX for Valid azure blob storage host suffix in url for AzureCloud, AzureChinaCloud, AzureGermanCloud and AzureUSGovernment var AzureBlobStorageHostRegEx = []string{ "https://(.+?)\\.blob\\.core\\.windows\\.net/(.+)", "https://(.+?)\\.blob\\.core\\.chinacloudapi\\.cn/(.+)", "https://(.+?)\\.blob\\.core\\.cloudapi\\.de/(.+)", "https://(.+?)\\.blob\\.core\\.usgovcloudapi\\.net/(.+)", } ================================================ FILE: pkg/creds/creds.go ================================================ /* Copyright 2022 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package creds import ( "io" ecr "github.com/awslabs/amazon-ecr-credential-helper/ecr-login" "github.com/chrismellard/docker-credential-acr-env/pkg/credhelper" gitlab "github.com/ePirat/docker-credential-gitlabci/pkg/credhelper" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/v1/google" ) // GetKeychain returns a keychain for accessing container registries. func GetKeychain() authn.Keychain { return authn.NewMultiKeychain( authn.DefaultKeychain, google.Keychain, authn.NewKeychainFromHelper(ecr.NewECRHelper(ecr.WithLogger(io.Discard))), authn.NewKeychainFromHelper(credhelper.NewACRCredentialsHelper()), authn.NewKeychainFromHelper(gitlab.NewGitLabCredentialsHelper()), ) } ================================================ FILE: pkg/dockerfile/buildargs.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package dockerfile import ( "strings" d "github.com/docker/docker/builder/dockerfile" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) type BuildArgs struct { d.BuildArgs } func NewBuildArgs(args []string) *BuildArgs { argsFromOptions := make(map[string]*string) for _, a := range args { s := strings.SplitN(a, "=", 2) if len(s) == 1 { argsFromOptions[s[0]] = nil } else { argsFromOptions[s[0]] = &s[1] } } return &BuildArgs{ BuildArgs: *d.NewBuildArgs(argsFromOptions), } } func (b *BuildArgs) Clone() *BuildArgs { clone := b.BuildArgs.Clone() return &BuildArgs{ BuildArgs: *clone, } } // ReplacementEnvs returns a list of filtered environment variables func (b *BuildArgs) ReplacementEnvs(envs []string) []string { // Ensure that we operate on a new array and do not modify the underlying array resultEnv := make([]string, len(envs)) copy(resultEnv, envs) filtered := b.FilterAllowed(envs) // Disable makezero linter, since the previous make is paired with a same sized copy return append(resultEnv, filtered...) //nolint:makezero } // AddMetaArgs adds the supplied args map to b's allowedMetaArgs func (b *BuildArgs) AddMetaArgs(metaArgs []instructions.ArgCommand) { for _, marg := range metaArgs { for _, arg := range marg.Args { v := arg.Value b.AddMetaArg(arg.Key, v) } } } ================================================ FILE: pkg/dockerfile/dockerfile.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package dockerfile import ( "bytes" "fmt" "io" "net/http" "os" "regexp" "strconv" "strings" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/sirupsen/logrus" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/moby/buildkit/frontend/dockerfile/linter" "github.com/moby/buildkit/frontend/dockerfile/parser" "github.com/pkg/errors" ) func ParseStages(opts *config.KanikoOptions) ([]instructions.Stage, []instructions.ArgCommand, error) { var err error var d []uint8 match, _ := regexp.MatchString("^https?://", opts.DockerfilePath) if match { response, e := http.Get(opts.DockerfilePath) //nolint:noctx if e != nil { return nil, nil, e } d, err = io.ReadAll(response.Body) } else { d, err = os.ReadFile(opts.DockerfilePath) } if err != nil { return nil, nil, errors.Wrap(err, fmt.Sprintf("reading dockerfile at path %s", opts.DockerfilePath)) } stages, metaArgs, err := Parse(d) if err != nil { return nil, nil, errors.Wrap(err, "parsing dockerfile") } metaArgs, err = expandNestedArgs(metaArgs, opts.BuildArgs) if err != nil { return nil, nil, errors.Wrap(err, "expanding meta ARGs") } return stages, metaArgs, nil } // baseImageIndex returns the index of the stage the current stage is built off // returns -1 if the current stage isn't built off a previous stage func baseImageIndex(currentStage int, stages []instructions.Stage) int { currentStageBaseName := strings.ToLower(stages[currentStage].BaseName) for i, stage := range stages { if i >= currentStage { break } if stage.Name == currentStageBaseName { return i } } return -1 } // Parse parses the contents of a Dockerfile and returns a list of commands func Parse(b []byte) ([]instructions.Stage, []instructions.ArgCommand, error) { p, err := parser.Parse(bytes.NewReader(b)) if err != nil { return nil, nil, err } stages, metaArgs, err := instructions.Parse(p.AST, &linter.Linter{}) if err != nil { return nil, nil, err } metaArgs, err = stripEnclosingQuotes(metaArgs) if err != nil { return nil, nil, err } return stages, metaArgs, nil } // expandNestedArgs tries to resolve nested ARG value against the previously defined ARGs func expandNestedArgs(metaArgs []instructions.ArgCommand, buildArgs []string) ([]instructions.ArgCommand, error) { var prevArgs []string for i, marg := range metaArgs { for j, arg := range marg.Args { v := arg.Value if v != nil { val, err := util.ResolveEnvironmentReplacement(*v, append(prevArgs, buildArgs...), false) if err != nil { return nil, err } prevArgs = append(prevArgs, arg.Key+"="+val) arg.Value = &val metaArgs[i].Args[j] = arg } } } return metaArgs, nil } // stripEnclosingQuotes removes quotes enclosing the value of each instructions.ArgCommand in a slice // if the quotes are escaped it leaves them func stripEnclosingQuotes(metaArgs []instructions.ArgCommand) ([]instructions.ArgCommand, error) { for i, marg := range metaArgs { for j, arg := range marg.Args { v := arg.Value if v != nil { val, err := extractValFromQuotes(*v) if err != nil { return nil, err } arg.Value = &val metaArgs[i].Args[j] = arg } } } return metaArgs, nil } func extractValFromQuotes(val string) (string, error) { backSlash := byte('\\') if len(val) < 2 { return val, nil } var leader string var tail string switch char := val[0]; char { case '\'', '"': leader = string([]byte{char}) case backSlash: switch char := val[1]; char { case '\'', '"': leader = string([]byte{backSlash, char}) } } // If the length of leader is greater than one then it must be an escaped // character. if len(leader) < 2 { switch char := val[len(val)-1]; char { case '\'', '"': tail = string([]byte{char}) } } else { switch char := val[len(val)-2:]; char { case `\'`, `\"`: tail = char } } if leader != tail { logrus.Infof("Leader %s tail %s", leader, tail) return "", errors.New("quotes wrapping arg values must be matched") } if leader == "" { return val, nil } if len(leader) == 2 { return val, nil } return val[1 : len(val)-1], nil } // targetStage returns the index of the target stage kaniko is trying to build func targetStage(stages []instructions.Stage, target string) (int, error) { if target == "" { return len(stages) - 1, nil } for i, stage := range stages { if strings.EqualFold(stage.Name, target) { return i, nil } } return -1, fmt.Errorf("%s is not a valid target build stage", target) } // ParseCommands parses an array of commands into an array of instructions.Command; used for onbuild func ParseCommands(cmdArray []string) ([]instructions.Command, error) { var cmds []instructions.Command cmdString := strings.Join(cmdArray, "\n") ast, err := parser.Parse(strings.NewReader(cmdString)) if err != nil { return nil, err } for _, child := range ast.AST.Children { cmd, err := instructions.ParseCommand(child) if err != nil { return nil, err } cmds = append(cmds, cmd) } return cmds, nil } // SaveStage returns true if the current stage will be needed later in the Dockerfile func saveStage(index int, stages []instructions.Stage) bool { currentStageName := stages[index].Name for stageIndex, stage := range stages { if stageIndex <= index { continue } if strings.ToLower(stage.BaseName) == currentStageName { if stage.BaseName != "" { return true } } } return false } // ResolveCrossStageCommands resolves any calls to previous stages with names to indices // Ex. --from=secondStage should be --from=1 for easier processing later on // As third party library lowers stage name in FROM instruction, this function resolves stage case insensitively. func ResolveCrossStageCommands(cmds []instructions.Command, stageNameToIdx map[string]string) { for _, cmd := range cmds { switch c := cmd.(type) { case *instructions.CopyCommand: if c.From != "" { if val, ok := stageNameToIdx[strings.ToLower(c.From)]; ok { c.From = val } } } } } // resolveStagesArgs resolves all the args from list of stages func resolveStagesArgs(stages []instructions.Stage, args []string) error { for i, s := range stages { resolvedBaseName, err := util.ResolveEnvironmentReplacement(s.BaseName, args, false) if err != nil { return errors.Wrap(err, fmt.Sprintf("resolving base name %s", s.BaseName)) } if s.BaseName != resolvedBaseName { stages[i].BaseName = resolvedBaseName } } return nil } func MakeKanikoStages(opts *config.KanikoOptions, stages []instructions.Stage, metaArgs []instructions.ArgCommand) ([]config.KanikoStage, error) { targetStage, err := targetStage(stages, opts.Target) if err != nil { return nil, errors.Wrap(err, "Error finding target stage") } args := unifyArgs(metaArgs, opts.BuildArgs) if err := resolveStagesArgs(stages, args); err != nil { return nil, errors.Wrap(err, "resolving args") } if opts.SkipUnusedStages { stages = skipUnusedStages(stages, &targetStage, opts.Target) } var kanikoStages []config.KanikoStage for index, stage := range stages { if len(stage.Name) > 0 { logrus.Infof("Resolved base name %s to %s", stage.BaseName, stage.Name) } baseImageIndex := baseImageIndex(index, stages) kanikoStages = append(kanikoStages, config.KanikoStage{ Stage: stage, BaseImageIndex: baseImageIndex, BaseImageStoredLocally: (baseImageIndex != -1), SaveStage: saveStage(index, stages), Final: index == targetStage, MetaArgs: metaArgs, Index: index, }) if index == targetStage { break } } return kanikoStages, nil } func GetOnBuildInstructions(config *v1.Config, stageNameToIdx map[string]string) ([]instructions.Command, error) { if config.OnBuild == nil || len(config.OnBuild) == 0 { return nil, nil } cmds, err := ParseCommands(config.OnBuild) if err != nil { return nil, err } // Iterate over commands and replace references to other stages with their index ResolveCrossStageCommands(cmds, stageNameToIdx) return cmds, nil } // unifyArgs returns the unified args between metaArgs and --build-arg // by default --build-arg overrides metaArgs except when --build-arg is empty func unifyArgs(metaArgs []instructions.ArgCommand, buildArgs []string) []string { argsMap := make(map[string]string) for _, marg := range metaArgs { for _, arg := range marg.Args { if arg.Value != nil { argsMap[arg.Key] = *arg.Value } } } splitter := "=" for _, a := range buildArgs { s := strings.Split(a, splitter) if len(s) > 1 && s[1] != "" { argsMap[s[0]] = s[1] } } var args []string for k, v := range argsMap { args = append(args, fmt.Sprintf("%s=%s", k, v)) } return args } // skipUnusedStages returns the list of used stages without the unnecessaries ones func skipUnusedStages(stages []instructions.Stage, lastStageIndex *int, target string) []instructions.Stage { stagesDependencies := make(map[string]bool) var onlyUsedStages []instructions.Stage idx := *lastStageIndex lastStageBaseName := stages[idx].BaseName for i := idx; i >= 0; i-- { s := stages[i] if (s.Name != "" && stagesDependencies[s.Name]) || s.Name == lastStageBaseName || i == idx { for _, c := range s.Commands { switch cmd := c.(type) { case *instructions.CopyCommand: stageName := cmd.From if copyFromIndex, err := strconv.Atoi(stageName); err == nil { stageName = stages[copyFromIndex].Name } if !stagesDependencies[stageName] { stagesDependencies[stageName] = true } } } if i != idx { stagesDependencies[s.BaseName] = true } } } dependenciesLen := len(stagesDependencies) if target == "" && dependenciesLen == 0 { return stages } else if dependenciesLen > 0 { for i := 0; i < idx; i++ { if stages[i].Name == "" { continue } s := stages[i] if stagesDependencies[s.Name] || s.Name == lastStageBaseName { onlyUsedStages = append(onlyUsedStages, s) } } } onlyUsedStages = append(onlyUsedStages, stages[idx]) if idx > len(onlyUsedStages)-1 { *lastStageIndex = len(onlyUsedStages) - 1 } return onlyUsedStages } ================================================ FILE: pkg/dockerfile/dockerfile_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package dockerfile import ( "fmt" "os" "reflect" "testing" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) func Test_ParseStages_ArgValueWithQuotes(t *testing.T) { dockerfile := ` ARG IMAGE="ubuntu:16.04" ARG FOO=bar ARG HELLO="Hello" ARG WORLD="World" ARG NESTED="$HELLO $WORLD" FROM ${IMAGE} RUN echo hi > /hi FROM scratch AS second COPY --from=0 /hi /hi2 FROM scratch COPY --from=second /hi2 /hi3 ` tmpfile, err := os.CreateTemp("", "Dockerfile.test") if err != nil { t.Fatal(err) } defer os.Remove(tmpfile.Name()) if _, err := tmpfile.Write([]byte(dockerfile)); err != nil { t.Fatal(err) } if err := tmpfile.Close(); err != nil { t.Fatal(err) } stages, metaArgs, err := ParseStages(&config.KanikoOptions{DockerfilePath: tmpfile.Name()}) if err != nil { t.Fatal(err) } if len(stages) == 0 { t.Fatal("length of stages expected to be greater than zero, but was zero") } if len(metaArgs) != 5 { t.Fatalf("length of stage meta args expected to be 5, but was %d", len(metaArgs)) } for i, expectedVal := range []string{"ubuntu:16.04", "bar", "Hello", "World", "Hello World"} { if metaArgs[i].Args[0].ValueString() != expectedVal { t.Fatalf("expected metaArg %d val to be %s but was %s", i, expectedVal, metaArgs[i].Args[0].ValueString()) } } } func Test_stripEnclosingQuotes(t *testing.T) { type testCase struct { name string inArgs []instructions.ArgCommand expected []string success bool } newArgCommand := func(key, val string) instructions.ArgCommand { return instructions.ArgCommand{ Args: []instructions.KeyValuePairOptional{{Key: key, Value: &val}}, } } cases := []testCase{{ name: "value with no enclosing quotes", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", "Purr")}, expected: []string{"Purr"}, success: true, }, { name: "value with unmatched leading double quote", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", "\"Purr")}, }, { name: "value with unmatched trailing double quote", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", "Purr\"")}, }, { name: "value with enclosing double quotes", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", "\"mrow\"")}, expected: []string{"mrow"}, success: true, }, { name: "value with unmatched leading single quote", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", "'Purr")}, }, { name: "value with unmatched trailing single quote", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", "Purr'")}, }, { name: "value with enclosing single quotes", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", "'mrow'")}, expected: []string{"mrow"}, success: true, }, { name: "blank value with enclosing double quotes", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", `""`)}, expected: []string{""}, success: true, }, { name: "blank value with enclosing single quotes", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", "''")}, expected: []string{""}, success: true, }, { name: "value with escaped, enclosing double quotes", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", `\"Purr\"`)}, expected: []string{`\"Purr\"`}, success: true, }, { name: "value with escaped, enclosing single quotes", inArgs: []instructions.ArgCommand{newArgCommand("MEOW", `\'Purr\'`)}, expected: []string{`\'Purr\'`}, success: true, }, { name: "multiple values enclosed with single quotes", inArgs: []instructions.ArgCommand{ newArgCommand("MEOW", `'Purr'`), newArgCommand("MEW", `'Mrow'`), }, expected: []string{"Purr", "Mrow"}, success: true, }, { name: "multiple values, one blank, one a single int", inArgs: []instructions.ArgCommand{ newArgCommand("MEOW", `""`), newArgCommand("MEW", `1`), }, expected: []string{"", "1"}, success: true, }, { name: "no values", success: true, }} for _, test := range cases { t.Run(test.name, func(t *testing.T) { inArgs := test.inArgs expected := test.expected success := test.success out, err := stripEnclosingQuotes(inArgs) if success && err != nil { t.Fatal(err) } if !success && err == nil { t.Fatal("expected an error but none received") } if len(expected) != len(out) { t.Fatalf("Expected %d args but got %d", len(expected), len(out)) } for i := range out { if expected[i] != out[i].Args[0].ValueString() { t.Errorf( "Expected arg at index %d to equal %v but instead equaled %v", i, expected[i], out[i].Args[0].ValueString()) } } }) } } func Test_GetOnBuildInstructions(t *testing.T) { type testCase struct { name string cfg *v1.Config stageToIdx map[string]string expCommands []instructions.Command } tests := []testCase{ {name: "no on-build on config", cfg: &v1.Config{}, stageToIdx: map[string]string{"builder": "0"}, expCommands: nil, }, {name: "onBuild on config, nothing to resolve", cfg: &v1.Config{OnBuild: []string{"WORKDIR /app"}}, stageToIdx: map[string]string{"builder": "0", "temp": "1"}, expCommands: []instructions.Command{&instructions.WorkdirCommand{Path: "/app"}}, }, {name: "onBuild on config, resolve multiple stages", cfg: &v1.Config{OnBuild: []string{"COPY --from=builder a.txt b.txt", "COPY --from=temp /app /app"}}, stageToIdx: map[string]string{"builder": "0", "temp": "1"}, expCommands: []instructions.Command{ &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{"a.txt"}, DestPath: "b.txt"}, From: "0", }, &instructions.CopyCommand{ SourcesAndDest: instructions.SourcesAndDest{SourcePaths: []string{"/app"}, DestPath: "/app"}, From: "1", }, }}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { cmds, err := GetOnBuildInstructions(test.cfg, test.stageToIdx) if err != nil { t.Fatalf("Failed to parse config for on-build instructions") } if len(cmds) != len(test.expCommands) { t.Fatalf("Expected %d commands, got %d", len(test.expCommands), len(cmds)) } for i, cmd := range cmds { if reflect.TypeOf(cmd) != reflect.TypeOf(test.expCommands[i]) { t.Fatalf("Got command %s, expected %s", cmd, test.expCommands[i]) } switch c := cmd.(type) { case *instructions.CopyCommand: { exp := test.expCommands[i].(*instructions.CopyCommand) testutil.CheckDeepEqual(t, exp.From, c.From) } } } }) } } func Test_targetStage(t *testing.T) { dockerfile := ` FROM scratch RUN echo hi > /hi FROM scratch AS second COPY --from=0 /hi /hi2 FROM scratch AS UPPER_CASE COPY --from=0 /hi /hi2 FROM scratch COPY --from=second /hi2 /hi3 ` stages, _, err := Parse([]byte(dockerfile)) if err != nil { t.Fatal(err) } tests := []struct { name string target string targetIndex int shouldErr bool }{ { name: "test valid target", target: "second", targetIndex: 1, shouldErr: false, }, { name: "test valid upper case target", target: "UPPER_CASE", targetIndex: 2, shouldErr: false, }, { name: "test no target", target: "", targetIndex: 3, shouldErr: false, }, { name: "test invalid target", target: "invalid", targetIndex: -1, shouldErr: true, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { target, err := targetStage(stages, test.target) testutil.CheckError(t, test.shouldErr, err) if !test.shouldErr { if target != test.targetIndex { t.Errorf("got incorrect target, expected %d got %d", test.targetIndex, target) } } }) } } func Test_SaveStage(t *testing.T) { tests := []struct { name string index int expected bool }{ { name: "reference stage in later copy command", index: 0, expected: false, }, { name: "reference stage in later from command", index: 1, expected: true, }, { name: "don't reference stage later", index: 2, expected: false, }, { name: "reference current stage in next stage", index: 4, expected: true, }, { name: "from prebuilt stage, and reference current stage in next stage", index: 5, expected: true, }, { name: "final stage", index: 6, expected: false, }, } stages, _, err := Parse([]byte(testutil.Dockerfile)) if err != nil { t.Fatalf("couldn't retrieve stages from Dockerfile: %v", err) } for _, test := range tests { t.Run(test.name, func(t *testing.T) { actual := saveStage(test.index, stages) testutil.CheckErrorAndDeepEqual(t, false, nil, test.expected, actual) }) } } func Test_baseImageIndex(t *testing.T) { tests := []struct { name string currentStage int expected int }{ { name: "stage that is built off of a previous stage", currentStage: 2, expected: 1, }, { name: "another stage that is built off of a previous stage", currentStage: 5, expected: 4, }, { name: "stage that isn't built off of a previous stage", currentStage: 4, expected: -1, }, } stages, _, err := Parse([]byte(testutil.Dockerfile)) if err != nil { t.Fatalf("couldn't retrieve stages from Dockerfile: %v", err) } for _, test := range tests { t.Run(test.name, func(t *testing.T) { actual := baseImageIndex(test.currentStage, stages) if actual != test.expected { t.Fatalf("unexpected result, expected %d got %d", test.expected, actual) } }) } } func Test_ResolveStagesArgs(t *testing.T) { dockerfile := ` ARG IMAGE="ubuntu:16.04" ARG LAST_STAGE_VARIANT FROM ${IMAGE} as base RUN echo hi > /hi FROM base AS base-dev RUN echo dev >> /hi FROM base AS base-prod RUN echo prod >> /hi FROM base-${LAST_STAGE_VARIANT} RUN cat /hi ` buildArgLastVariants := []string{"dev", "prod"} buildArgImages := []string{"alpine:3.11", ""} var expectedImage string for _, buildArgLastVariant := range buildArgLastVariants { for _, buildArgImage := range buildArgImages { if buildArgImage != "" { expectedImage = buildArgImage } else { expectedImage = "ubuntu:16.04" } buildArgs := []string{fmt.Sprintf("IMAGE=%s", buildArgImage), fmt.Sprintf("LAST_STAGE_VARIANT=%s", buildArgLastVariant)} stages, metaArgs, err := Parse([]byte(dockerfile)) if err != nil { t.Fatal(err) } stagesLen := len(stages) args := unifyArgs(metaArgs, buildArgs) if err := resolveStagesArgs(stages, args); err != nil { t.Fatalf("fail to resolves args %v: %v", buildArgs, err) } tests := []struct { name string actualSourceCode string actualBaseName string expectedSourceCode string expectedBaseName string }{ { name: "Test_BuildArg_From_First_Stage", actualSourceCode: stages[0].SourceCode, actualBaseName: stages[0].BaseName, expectedSourceCode: "FROM ${IMAGE} as base", expectedBaseName: expectedImage, }, { name: "Test_BuildArg_From_Last_Stage", actualSourceCode: stages[stagesLen-1].SourceCode, actualBaseName: stages[stagesLen-1].BaseName, expectedSourceCode: "FROM base-${LAST_STAGE_VARIANT}", expectedBaseName: fmt.Sprintf("base-%s", buildArgLastVariant), }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { testutil.CheckDeepEqual(t, test.expectedSourceCode, test.actualSourceCode) testutil.CheckDeepEqual(t, test.expectedBaseName, test.actualBaseName) }) } } } } func Test_SkipingUnusedStages(t *testing.T) { tests := []struct { description string dockerfile string targets []string expectedSourceCodes map[string][]string expectedTargetIndexBeforeSkip map[string]int expectedTargetIndexAfterSkip map[string]int }{ { description: "dockerfile_without_copyFrom", dockerfile: ` FROM alpine:3.11 AS base-dev RUN echo dev > /hi FROM alpine:3.11 AS base-prod RUN echo prod > /hi FROM base-dev as final-stage RUN cat /hi `, targets: []string{"base-dev", "base-prod", ""}, expectedSourceCodes: map[string][]string{ "base-dev": {"FROM alpine:3.11 AS base-dev"}, "base-prod": {"FROM alpine:3.11 AS base-prod"}, "": {"FROM alpine:3.11 AS base-dev", "FROM base-dev as final-stage"}, }, expectedTargetIndexBeforeSkip: map[string]int{ "base-dev": 0, "base-prod": 1, "": 2, }, expectedTargetIndexAfterSkip: map[string]int{ "base-dev": 0, "base-prod": 0, "": 1, }, }, { description: "dockerfile_with_copyFrom", dockerfile: ` FROM alpine:3.11 AS base-dev RUN echo dev > /hi FROM alpine:3.11 AS base-prod RUN echo prod > /hi FROM alpine:3.11 COPY --from=base-prod /hi /finalhi RUN cat /finalhi `, targets: []string{"base-dev", "base-prod", ""}, expectedSourceCodes: map[string][]string{ "base-dev": {"FROM alpine:3.11 AS base-dev"}, "base-prod": {"FROM alpine:3.11 AS base-prod"}, "": {"FROM alpine:3.11 AS base-prod", "FROM alpine:3.11"}, }, expectedTargetIndexBeforeSkip: map[string]int{ "base-dev": 0, "base-prod": 1, "": 2, }, expectedTargetIndexAfterSkip: map[string]int{ "base-dev": 0, "base-prod": 0, "": 1, }, }, { description: "dockerfile_with_two_copyFrom", dockerfile: ` FROM alpine:3.11 AS base-dev RUN echo dev > /hi FROM alpine:3.11 AS base-prod RUN echo prod > /hi FROM alpine:3.11 COPY --from=base-dev /hi /finalhidev COPY --from=base-prod /hi /finalhiprod RUN cat /finalhidev RUN cat /finalhiprod `, targets: []string{"base-dev", "base-prod", ""}, expectedSourceCodes: map[string][]string{ "base-dev": {"FROM alpine:3.11 AS base-dev"}, "base-prod": {"FROM alpine:3.11 AS base-prod"}, "": {"FROM alpine:3.11 AS base-dev", "FROM alpine:3.11 AS base-prod", "FROM alpine:3.11"}, }, expectedTargetIndexBeforeSkip: map[string]int{ "base-dev": 0, "base-prod": 1, "": 2, }, expectedTargetIndexAfterSkip: map[string]int{ "base-dev": 0, "base-prod": 0, "": 2, }, }, { description: "dockerfile_with_two_copyFrom_and_arg", dockerfile: ` FROM debian:10.13 as base COPY . . FROM scratch as second ENV foopath context/foo COPY --from=0 $foopath context/b* /foo/ FROM second as third COPY --from=base /context/foo /new/foo FROM base as fourth # Make sure that we snapshot intermediate images correctly RUN date > /date ENV foo bar # This base image contains symlinks with relative paths to ignored directories # We need to test they're extracted correctly FROM fedora@sha256:c4cc32b09c6ae3f1353e7e33a8dda93dc41676b923d6d89afa996b421cc5aa48 FROM fourth ARG file=/foo2 COPY --from=second /foo ${file} COPY --from=debian:10.13 /etc/os-release /new `, targets: []string{"base", ""}, expectedSourceCodes: map[string][]string{ "base": {"FROM debian:10.13 as base"}, "second": {"FROM debian:10.13 as base", "FROM scratch as second"}, "": {"FROM debian:10.13 as base", "FROM scratch as second", "FROM base as fourth", "FROM fourth"}, }, expectedTargetIndexBeforeSkip: map[string]int{ "base": 0, "second": 1, "": 5, }, expectedTargetIndexAfterSkip: map[string]int{ "base": 0, "second": 1, "": 3, }, }, { description: "dockerfile_without_final_dependencies", dockerfile: ` FROM alpine:3.11 FROM debian:10.13 as base RUN echo foo > /foo FROM debian:10.13 as fizz RUN echo fizz >> /fizz COPY --from=base /foo /fizz FROM alpine:3.11 as buzz RUN echo buzz > /buzz FROM alpine:3.11 as final RUN echo bar > /bar `, targets: []string{"final", "buzz", "fizz", ""}, expectedSourceCodes: map[string][]string{ "final": {"FROM alpine:3.11 as final"}, "buzz": {"FROM alpine:3.11 as buzz"}, "fizz": {"FROM debian:10.13 as base", "FROM debian:10.13 as fizz"}, "": {"FROM alpine:3.11", "FROM debian:10.13 as base", "FROM debian:10.13 as fizz", "FROM alpine:3.11 as buzz", "FROM alpine:3.11 as final"}, }, expectedTargetIndexBeforeSkip: map[string]int{ "final": 4, "buzz": 3, "fizz": 2, "": 4, }, expectedTargetIndexAfterSkip: map[string]int{ "final": 0, "buzz": 0, "fizz": 1, "": 4, }, }, } for _, test := range tests { stages, _, err := Parse([]byte(test.dockerfile)) testutil.CheckError(t, false, err) actualSourceCodes := make(map[string][]string) for _, target := range test.targets { targetIndex, err := targetStage(stages, target) testutil.CheckError(t, false, err) targetIndexBeforeSkip := targetIndex onlyUsedStages := skipUnusedStages(stages, &targetIndex, target) for _, s := range onlyUsedStages { actualSourceCodes[target] = append(actualSourceCodes[target], s.SourceCode) } t.Run(test.description, func(t *testing.T) { testutil.CheckDeepEqual(t, test.expectedSourceCodes[target], actualSourceCodes[target]) testutil.CheckDeepEqual(t, test.expectedTargetIndexBeforeSkip[target], targetIndexBeforeSkip) testutil.CheckDeepEqual(t, test.expectedTargetIndexAfterSkip[target], targetIndex) }) } } } ================================================ FILE: pkg/executor/build.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package executor import ( "fmt" "os" "path/filepath" "runtime" "sort" "strconv" "strings" "time" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/google/go-containerregistry/pkg/v1/types" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sync/errgroup" "github.com/GoogleContainerTools/kaniko/pkg/cache" "github.com/GoogleContainerTools/kaniko/pkg/commands" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" image_util "github.com/GoogleContainerTools/kaniko/pkg/image" "github.com/GoogleContainerTools/kaniko/pkg/image/remote" "github.com/GoogleContainerTools/kaniko/pkg/snapshot" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/google/go-containerregistry/pkg/v1/partial" ) // This is the size of an empty tar in Go const emptyTarSize = 1024 // for testing var ( initializeConfig = initConfig getFSFromImage = util.GetFSFromImage ) type cachePusher func(*config.KanikoOptions, string, string, string) error type snapShotter interface { Init() error TakeSnapshotFS() (string, error) TakeSnapshot([]string, bool, bool) (string, error) } // stageBuilder contains all fields necessary to build one stage of a Dockerfile type stageBuilder struct { stage config.KanikoStage image v1.Image cf *v1.ConfigFile baseImageDigest string finalCacheKey string opts *config.KanikoOptions fileContext util.FileContext cmds []commands.DockerCommand args *dockerfile.BuildArgs crossStageDeps map[int][]string digestToCacheKey map[string]string stageIdxToDigest map[string]string snapshotter snapShotter layerCache cache.LayerCache pushLayerToCache cachePusher } // newStageBuilder returns a new type stageBuilder which contains all the information required to build the stage func newStageBuilder(args *dockerfile.BuildArgs, opts *config.KanikoOptions, stage config.KanikoStage, crossStageDeps map[int][]string, dcm map[string]string, sid map[string]string, stageNameToIdx map[string]string, fileContext util.FileContext) (*stageBuilder, error) { sourceImage, err := image_util.RetrieveSourceImage(stage, opts) if err != nil { return nil, err } imageConfig, err := initializeConfig(sourceImage, opts) if err != nil { return nil, err } if err := resolveOnBuild(&stage, &imageConfig.Config, stageNameToIdx); err != nil { return nil, err } err = util.InitIgnoreList() if err != nil { return nil, errors.Wrap(err, "failed to initialize ignore list") } hasher, err := getHasher(opts.SnapshotMode) if err != nil { return nil, err } l := snapshot.NewLayeredMap(hasher) snapshotter := snapshot.NewSnapshotter(l, config.RootDir) digest, err := sourceImage.Digest() if err != nil { return nil, err } s := &stageBuilder{ stage: stage, image: sourceImage, cf: imageConfig, snapshotter: snapshotter, baseImageDigest: digest.String(), opts: opts, fileContext: fileContext, crossStageDeps: crossStageDeps, digestToCacheKey: dcm, stageIdxToDigest: sid, layerCache: newLayerCache(opts), pushLayerToCache: pushLayerToCache, } for _, cmd := range s.stage.Commands { command, err := commands.GetCommand(cmd, fileContext, opts.RunV2, opts.CacheCopyLayers, opts.CacheRunLayers) if err != nil { return nil, err } if command == nil { continue } s.cmds = append(s.cmds, command) } if args != nil { s.args = args.Clone() } else { s.args = dockerfile.NewBuildArgs(s.opts.BuildArgs) } s.args.AddMetaArgs(s.stage.MetaArgs) return s, nil } func initConfig(img partial.WithConfigFile, opts *config.KanikoOptions) (*v1.ConfigFile, error) { imageConfig, err := img.ConfigFile() if err != nil { return nil, err } if imageConfig.Config.Env == nil { imageConfig.Config.Env = constants.ScratchEnvVars } if opts == nil { return imageConfig, nil } if l := len(opts.Labels); l > 0 { if imageConfig.Config.Labels == nil { imageConfig.Config.Labels = make(map[string]string) } for _, label := range opts.Labels { parts := strings.SplitN(label, "=", 2) if len(parts) != 2 { return nil, fmt.Errorf("labels must be of the form key=value, got %s", label) } imageConfig.Config.Labels[parts[0]] = parts[1] } } return imageConfig, nil } func newLayerCache(opts *config.KanikoOptions) cache.LayerCache { if isOCILayout(opts.CacheRepo) { return &cache.LayoutCache{ Opts: opts, } } return &cache.RegistryCache{ Opts: opts, } } func isOCILayout(path string) bool { return strings.HasPrefix(path, "oci:") } func (s *stageBuilder) populateCompositeKey(command commands.DockerCommand, files []string, compositeKey CompositeCache, args *dockerfile.BuildArgs, env []string) (CompositeCache, error) { // First replace all the environment variables or args in the command replacementEnvs := args.ReplacementEnvs(env) // The sort order of `replacementEnvs` is basically undefined, sort it // so we can ensure a stable cache key. sort.Strings(replacementEnvs) // Use the special argument "|#" at the start of the args array. This will // avoid conflicts with any RUN command since commands can not // start with | (vertical bar). The "#" (number of build envs) is there to // help ensure proper cache matches. if command.IsArgsEnvsRequiredInCache() { if len(replacementEnvs) > 0 { compositeKey.AddKey(fmt.Sprintf("|%d", len(replacementEnvs))) compositeKey.AddKey(replacementEnvs...) } } // Add the next command to the cache key. compositeKey.AddKey(command.String()) for _, f := range files { if err := compositeKey.AddPath(f, s.fileContext); err != nil { return compositeKey, err } } return compositeKey, nil } func (s *stageBuilder) optimize(compositeKey CompositeCache, cfg v1.Config) error { if !s.opts.Cache { return nil } var buildArgs = s.args.Clone() // Restore build args back to their original values defer func() { s.args = buildArgs }() stopCache := false // Possibly replace commands with their cached implementations. // We walk through all the commands, running any commands that only operate on metadata. // We throw the metadata away after, but we need it to properly track command dependencies // for things like COPY ${FOO} or RUN commands that use environment variables. for i, command := range s.cmds { if command == nil { continue } files, err := command.FilesUsedFromContext(&cfg, s.args) if err != nil { return errors.Wrap(err, "failed to get files used from context") } compositeKey, err = s.populateCompositeKey(command, files, compositeKey, s.args, cfg.Env) if err != nil { return err } logrus.Debugf("Optimize: composite key for command %v %v", command.String(), compositeKey) ck, err := compositeKey.Hash() if err != nil { return errors.Wrap(err, "failed to hash composite key") } logrus.Debugf("Optimize: cache key for command %v %v", command.String(), ck) s.finalCacheKey = ck if command.ShouldCacheOutput() && !stopCache { img, err := s.layerCache.RetrieveLayer(ck) if err != nil { logrus.Debugf("Failed to retrieve layer: %s", err) logrus.Infof("No cached layer found for cmd %s", command.String()) logrus.Debugf("Key missing was: %s", compositeKey.Key()) stopCache = true continue } if cacheCmd := command.CacheCommand(img); cacheCmd != nil { logrus.Infof("Using caching version of cmd: %s", command.String()) s.cmds[i] = cacheCmd } } // Mutate the config for any commands that require it. if command.MetadataOnly() { if err := command.ExecuteCommand(&cfg, s.args); err != nil { return err } } } return nil } func (s *stageBuilder) build() error { // Set the initial cache key to be the base image digest, the build args and the SrcContext. var compositeKey *CompositeCache if cacheKey, ok := s.digestToCacheKey[s.baseImageDigest]; ok { compositeKey = NewCompositeCache(cacheKey) } else { compositeKey = NewCompositeCache(s.baseImageDigest) } // Apply optimizations to the instructions. if err := s.optimize(*compositeKey, s.cf.Config); err != nil { return errors.Wrap(err, "failed to optimize instructions") } // Unpack file system to root if we need to. shouldUnpack := false for _, cmd := range s.cmds { if cmd.RequiresUnpackedFS() { logrus.Infof("Unpacking rootfs as cmd %s requires it.", cmd.String()) shouldUnpack = true break } } if len(s.crossStageDeps[s.stage.Index]) > 0 { shouldUnpack = true } if s.stage.Index == 0 && s.opts.InitialFSUnpacked { shouldUnpack = false } if shouldUnpack { t := timing.Start("FS Unpacking") retryFunc := func() error { _, err := getFSFromImage(config.RootDir, s.image, util.ExtractFile) return err } if err := util.Retry(retryFunc, s.opts.ImageFSExtractRetry, 1000); err != nil { return errors.Wrap(err, "failed to get filesystem from image") } timing.DefaultRun.Stop(t) } else { logrus.Info("Skipping unpacking as no commands require it.") } initSnapshotTaken := false if s.opts.SingleSnapshot { if err := s.initSnapshotWithTimings(); err != nil { return err } initSnapshotTaken = true } cacheGroup := errgroup.Group{} for index, command := range s.cmds { if command == nil { continue } t := timing.Start("Command: " + command.String()) // If the command uses files from the context, add them. files, err := command.FilesUsedFromContext(&s.cf.Config, s.args) if err != nil { return errors.Wrap(err, "failed to get files used from context") } if s.opts.Cache { *compositeKey, err = s.populateCompositeKey(command, files, *compositeKey, s.args, s.cf.Config.Env) if err != nil && s.opts.Cache { return err } } logrus.Info(command.String()) isCacheCommand := func() bool { switch command.(type) { case commands.Cached: return true default: return false } }() if !initSnapshotTaken && !isCacheCommand && !command.ProvidesFilesToSnapshot() { // Take initial snapshot if command does not expect to return // a list of files. if err := s.initSnapshotWithTimings(); err != nil { return err } initSnapshotTaken = true } if err := command.ExecuteCommand(&s.cf.Config, s.args); err != nil { return errors.Wrap(err, "failed to execute command") } files = command.FilesToSnapshot() timing.DefaultRun.Stop(t) if !s.shouldTakeSnapshot(index, command.MetadataOnly()) && !s.opts.ForceBuildMetadata { logrus.Debugf("Build: skipping snapshot for [%v]", command.String()) continue } if isCacheCommand { v := command.(commands.Cached) layer := v.Layer() if err := s.saveLayerToImage(layer, command.String()); err != nil { return errors.Wrap(err, "failed to save layer") } } else { tarPath, err := s.takeSnapshot(files, command.ShouldDetectDeletedFiles()) if err != nil { return errors.Wrap(err, "failed to take snapshot") } if s.opts.Cache { logrus.Debugf("Build: composite key for command %v %v", command.String(), compositeKey) ck, err := compositeKey.Hash() if err != nil { return errors.Wrap(err, "failed to hash composite key") } logrus.Debugf("Build: cache key for command %v %v", command.String(), ck) // Push layer to cache (in parallel) now along with new config file if command.ShouldCacheOutput() && !s.opts.NoPushCache { cacheGroup.Go(func() error { return s.pushLayerToCache(s.opts, ck, tarPath, command.String()) }) } } if err := s.saveSnapshotToImage(command.String(), tarPath); err != nil { return errors.Wrap(err, "failed to save snapshot to image") } } } if err := cacheGroup.Wait(); err != nil { logrus.Warnf("Error uploading layer to cache: %s", err) } return nil } func (s *stageBuilder) takeSnapshot(files []string, shdDelete bool) (string, error) { var snapshot string var err error t := timing.Start("Snapshotting FS") if files == nil || s.opts.SingleSnapshot { snapshot, err = s.snapshotter.TakeSnapshotFS() } else { // Volumes are very weird. They get snapshotted in the next command. files = append(files, util.Volumes()...) snapshot, err = s.snapshotter.TakeSnapshot(files, shdDelete, s.opts.ForceBuildMetadata) } timing.DefaultRun.Stop(t) return snapshot, err } func (s *stageBuilder) shouldTakeSnapshot(index int, isMetadatCmd bool) bool { isLastCommand := index == len(s.cmds)-1 // We only snapshot the very end with single snapshot mode on. if s.opts.SingleSnapshot { return isLastCommand } // Always take snapshots if we're using the cache. if s.opts.Cache { return true } // if command is a metadata command, do not snapshot. return !isMetadatCmd } func (s *stageBuilder) saveSnapshotToImage(createdBy string, tarPath string) error { layer, err := s.saveSnapshotToLayer(tarPath) if err != nil { return err } if layer == nil { return nil } return s.saveLayerToImage(layer, createdBy) } func (s *stageBuilder) saveSnapshotToLayer(tarPath string) (v1.Layer, error) { if tarPath == "" { return nil, nil } fi, err := os.Stat(tarPath) if err != nil { return nil, errors.Wrap(err, "tar file path does not exist") } if fi.Size() <= emptyTarSize && !s.opts.ForceBuildMetadata { logrus.Info("No files were changed, appending empty layer to config. No layer added to image.") return nil, nil } layerOpts := s.getLayerOptionFromOpts() imageMediaType, err := s.image.MediaType() if err != nil { return nil, err } // Only appending MediaType for OCI images as the default is docker if extractMediaTypeVendor(imageMediaType) == types.OCIVendorPrefix { if s.opts.Compression == config.ZStd { layerOpts = append(layerOpts, tarball.WithCompression("zstd"), tarball.WithMediaType(types.OCILayerZStd)) } else { layerOpts = append(layerOpts, tarball.WithMediaType(types.OCILayer)) } } layer, err := tarball.LayerFromFile(tarPath, layerOpts...) if err != nil { return nil, err } return layer, nil } func (s *stageBuilder) getLayerOptionFromOpts() []tarball.LayerOption { var layerOpts []tarball.LayerOption if s.opts.CompressedCaching { layerOpts = append(layerOpts, tarball.WithCompressedCaching) } if s.opts.CompressionLevel > 0 { layerOpts = append(layerOpts, tarball.WithCompressionLevel(s.opts.CompressionLevel)) } return layerOpts } func extractMediaTypeVendor(mt types.MediaType) string { if strings.Contains(string(mt), types.OCIVendorPrefix) { return types.OCIVendorPrefix } return types.DockerVendorPrefix } // https://github.com/opencontainers/image-spec/blob/main/media-types.md#compatibility-matrix func convertMediaType(mt types.MediaType) types.MediaType { switch mt { case types.DockerManifestSchema1, types.DockerManifestSchema2: return types.OCIManifestSchema1 case types.DockerManifestList: return types.OCIImageIndex case types.DockerLayer: return types.OCILayer case types.DockerConfigJSON: return types.OCIConfigJSON case types.DockerForeignLayer: return types.OCIUncompressedRestrictedLayer case types.DockerUncompressedLayer: return types.OCIUncompressedLayer case types.OCIImageIndex: return types.DockerManifestList case types.OCIManifestSchema1: return types.DockerManifestSchema2 case types.OCIConfigJSON: return types.DockerConfigJSON case types.OCILayer, types.OCILayerZStd: return types.DockerLayer case types.OCIRestrictedLayer: return types.DockerForeignLayer case types.OCIUncompressedLayer: return types.DockerUncompressedLayer case types.OCIContentDescriptor, types.OCIUncompressedRestrictedLayer, types.DockerManifestSchema1Signed, types.DockerPluginConfig: return "" default: return "" } } func (s *stageBuilder) convertLayerMediaType(layer v1.Layer) (v1.Layer, error) { layerMediaType, err := layer.MediaType() if err != nil { return nil, err } imageMediaType, err := s.image.MediaType() if err != nil { return nil, err } if extractMediaTypeVendor(layerMediaType) != extractMediaTypeVendor(imageMediaType) { layerOpts := s.getLayerOptionFromOpts() targetMediaType := convertMediaType(layerMediaType) if extractMediaTypeVendor(imageMediaType) == types.OCIVendorPrefix { if s.opts.Compression == config.ZStd { targetMediaType = types.OCILayerZStd layerOpts = append(layerOpts, tarball.WithCompression("zstd")) } } layerOpts = append(layerOpts, tarball.WithMediaType(targetMediaType)) if targetMediaType != "" { return tarball.LayerFromOpener(layer.Uncompressed, layerOpts...) } return nil, fmt.Errorf( "layer with media type %v cannot be converted to a media type that matches %v", layerMediaType, imageMediaType, ) } return layer, nil } func (s *stageBuilder) saveLayerToImage(layer v1.Layer, createdBy string) error { var err error layer, err = s.convertLayerMediaType(layer) if err != nil { return err } s.image, err = mutate.Append(s.image, mutate.Addendum{ Layer: layer, History: v1.History{ Author: constants.Author, CreatedBy: createdBy, }, }, ) return err } func CalculateDependencies(stages []config.KanikoStage, opts *config.KanikoOptions, stageNameToIdx map[string]string) (map[int][]string, error) { images := []v1.Image{} depGraph := map[int][]string{} for _, s := range stages { ba := dockerfile.NewBuildArgs(opts.BuildArgs) ba.AddMetaArgs(s.MetaArgs) var image v1.Image var err error if s.BaseImageStoredLocally { image = images[s.BaseImageIndex] } else if s.Name == constants.NoBaseImage { image = empty.Image } else { image, err = image_util.RetrieveSourceImage(s, opts) if err != nil { return nil, err } } cfg, err := initializeConfig(image, opts) if err != nil { return nil, err } cmds, err := dockerfile.GetOnBuildInstructions(&cfg.Config, stageNameToIdx) cmds = append(cmds, s.Commands...) for _, c := range cmds { switch cmd := c.(type) { case *instructions.CopyCommand: if cmd.From != "" { i, err := strconv.Atoi(cmd.From) if err != nil { continue } resolved, err := util.ResolveEnvironmentReplacementList(cmd.SourcesAndDest.SourcePaths, ba.ReplacementEnvs(cfg.Config.Env), true) if err != nil { return nil, err } depGraph[i] = append(depGraph[i], resolved...) } case *instructions.EnvCommand: if err := util.UpdateConfigEnv(cmd.Env, &cfg.Config, ba.ReplacementEnvs(cfg.Config.Env)); err != nil { return nil, err } image, err = mutate.Config(image, cfg.Config) if err != nil { return nil, err } case *instructions.ArgCommand: for _, arg := range cmd.Args { k, v, err := commands.ParseArg(arg.Key, arg.Value, cfg.Config.Env, ba) if err != nil { return nil, err } ba.AddArg(k, v) } } } images = append(images, image) } return depGraph, nil } // DoBuild executes building the Dockerfile func DoBuild(opts *config.KanikoOptions) (v1.Image, error) { t := timing.Start("Total Build Time") digestToCacheKey := make(map[string]string) stageIdxToDigest := make(map[string]string) stages, metaArgs, err := dockerfile.ParseStages(opts) if err != nil { return nil, err } kanikoStages, err := dockerfile.MakeKanikoStages(opts, stages, metaArgs) if err != nil { return nil, err } stageNameToIdx := ResolveCrossStageInstructions(kanikoStages) fileContext, err := util.NewFileContextFromDockerfile(opts.DockerfilePath, opts.SrcContext) if err != nil { return nil, err } // Some stages may refer to other random images, not previous stages if err := fetchExtraStages(kanikoStages, opts); err != nil { return nil, err } crossStageDependencies, err := CalculateDependencies(kanikoStages, opts, stageNameToIdx) if err != nil { return nil, err } logrus.Infof("Built cross stage deps: %v", crossStageDependencies) var args *dockerfile.BuildArgs for index, stage := range kanikoStages { sb, err := newStageBuilder( args, opts, stage, crossStageDependencies, digestToCacheKey, stageIdxToDigest, stageNameToIdx, fileContext) logrus.Infof("Building stage '%v' [idx: '%v', base-idx: '%v']", stage.BaseName, stage.Index, stage.BaseImageIndex) if err != nil { return nil, err } args = sb.args if err := sb.build(); err != nil { return nil, errors.Wrap(err, "error building stage") } reviewConfig(stage, &sb.cf.Config) sourceImage, err := mutate.Config(sb.image, sb.cf.Config) if err != nil { return nil, err } configFile, err := sourceImage.ConfigFile() if err != nil { return nil, err } if opts.CustomPlatform == "" { configFile.OS = runtime.GOOS configFile.Architecture = runtime.GOARCH } else { configFile.OS = strings.Split(opts.CustomPlatform, "/")[0] configFile.Architecture = strings.Split(opts.CustomPlatform, "/")[1] } sourceImage, err = mutate.ConfigFile(sourceImage, configFile) if err != nil { return nil, err } d, err := sourceImage.Digest() if err != nil { return nil, err } stageIdxToDigest[fmt.Sprintf("%d", sb.stage.Index)] = d.String() logrus.Debugf("Mapping stage idx %v to digest %v", sb.stage.Index, d.String()) digestToCacheKey[d.String()] = sb.finalCacheKey logrus.Debugf("Mapping digest %v to cachekey %v", d.String(), sb.finalCacheKey) if stage.Final { sourceImage, err = mutate.CreatedAt(sourceImage, v1.Time{Time: time.Now()}) if err != nil { return nil, err } if opts.Reproducible { sourceImage, err = mutate.Canonical(sourceImage) if err != nil { return nil, err } } if opts.Cleanup { if err = util.DeleteFilesystem(); err != nil { return nil, err } } timing.DefaultRun.Stop(t) return sourceImage, nil } if stage.SaveStage { if err := saveStageAsTarball(strconv.Itoa(index), sourceImage); err != nil { return nil, err } } filesToSave, err := filesToSave(crossStageDependencies[index]) if err != nil { return nil, err } dstDir := filepath.Join(config.KanikoDir, strconv.Itoa(index)) if err := os.MkdirAll(dstDir, 0644); err != nil { return nil, errors.Wrap(err, fmt.Sprintf("to create workspace for stage %s", stageIdxToDigest[strconv.Itoa(index)], )) } for _, p := range filesToSave { logrus.Infof("Saving file %s for later use", p) if err := util.CopyFileOrSymlink(p, dstDir, config.RootDir); err != nil { return nil, errors.Wrap(err, "could not save file") } } // Delete the filesystem if err := util.DeleteFilesystem(); err != nil { return nil, errors.Wrap(err, fmt.Sprintf("deleting file system after stage %d", index)) } } return nil, err } // filesToSave returns all the files matching the given pattern in deps. // If a file is a symlink, it also returns the target file. func filesToSave(deps []string) ([]string, error) { srcFiles := []string{} for _, src := range deps { srcs, err := filepath.Glob(filepath.Join(config.RootDir, src)) if err != nil { return nil, err } for _, f := range srcs { if link, err := util.EvalSymLink(f); err == nil { link, err = filepath.Rel(config.RootDir, link) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("could not find relative path to %s", config.RootDir)) } srcFiles = append(srcFiles, link) } f, err = filepath.Rel(config.RootDir, f) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("could not find relative path to %s", config.RootDir)) } srcFiles = append(srcFiles, f) } } // remove duplicates deduped := deduplicatePaths(srcFiles) return deduped, nil } // deduplicatePaths returns a deduplicated slice of shortest paths // For example {"usr/lib", "usr/lib/ssl"} will return only {"usr/lib"} func deduplicatePaths(paths []string) []string { type node struct { children map[string]*node value bool } root := &node{children: make(map[string]*node)} // Create a tree marking all present paths for _, f := range paths { parts := strings.Split(f, "/") current := root for i := 0; i < len(parts)-1; i++ { part := parts[i] if _, ok := current.children[part]; !ok { current.children[part] = &node{children: make(map[string]*node)} } current = current.children[part] } current.children[parts[len(parts)-1]] = &node{children: make(map[string]*node), value: true} } // Collect all paths deduped := []string{} var traverse func(*node, string) traverse = func(n *node, path string) { if n.value { deduped = append(deduped, strings.TrimPrefix(path, "/")) return } for k, v := range n.children { traverse(v, path+"/"+k) } } traverse(root, "") return deduped } func fetchExtraStages(stages []config.KanikoStage, opts *config.KanikoOptions) error { t := timing.Start("Fetching Extra Stages") defer timing.DefaultRun.Stop(t) var names []string for stageIndex, s := range stages { for _, cmd := range s.Commands { c, ok := cmd.(*instructions.CopyCommand) if !ok || c.From == "" { continue } // FROMs at this point are guaranteed to be either an integer referring to a previous stage, // the name of a previous stage, or a name of a remote image. // If it is an integer stage index, validate that it is actually a previous index if fromIndex, err := strconv.Atoi(c.From); err == nil && stageIndex > fromIndex && fromIndex >= 0 { continue } // Check if the name is the alias of a previous stage if fromPreviousStage(c, names) { continue } // This must be an image name, fetch it. logrus.Debugf("Found extra base image stage %s", c.From) sourceImage, err := remote.RetrieveRemoteImage(c.From, opts.RegistryOptions, opts.CustomPlatform) if err != nil { return err } if err := saveStageAsTarball(c.From, sourceImage); err != nil { return err } if err := extractImageToDependencyDir(c.From, sourceImage); err != nil { return err } } // Store the name of the current stage in the list with names, if applicable. if s.Name != "" { names = append(names, s.Name) } } return nil } func fromPreviousStage(copyCommand *instructions.CopyCommand, previousStageNames []string) bool { for _, previousStageName := range previousStageNames { if previousStageName == copyCommand.From { return true } } return false } func extractImageToDependencyDir(name string, image v1.Image) error { t := timing.Start("Extracting Image to Dependency Dir") defer timing.DefaultRun.Stop(t) dependencyDir := filepath.Join(config.KanikoDir, name) if err := os.MkdirAll(dependencyDir, 0755); err != nil { return err } logrus.Debugf("Trying to extract to %s", dependencyDir) _, err := util.GetFSFromImage(dependencyDir, image, util.ExtractFile) return err } func saveStageAsTarball(path string, image v1.Image) error { t := timing.Start("Saving stage as tarball") defer timing.DefaultRun.Stop(t) destRef, err := name.NewTag("temp/tag", name.WeakValidation) if err != nil { return err } tarPath := filepath.Join(config.KanikoIntermediateStagesDir, path) logrus.Infof("Storing source image from stage %s at path %s", path, tarPath) if err := os.MkdirAll(filepath.Dir(tarPath), 0750); err != nil { return err } return tarball.WriteToFile(tarPath, destRef, image) } func getHasher(snapshotMode string) (func(string) (string, error), error) { switch snapshotMode { case constants.SnapshotModeTime: logrus.Info("Only file modification time will be considered when snapshotting") return util.MtimeHasher(), nil case constants.SnapshotModeFull: return util.Hasher(), nil case constants.SnapshotModeRedo: return util.RedoHasher(), nil default: return nil, fmt.Errorf("%s is not a valid snapshot mode", snapshotMode) } } func resolveOnBuild(stage *config.KanikoStage, config *v1.Config, stageNameToIdx map[string]string) error { cmds, err := dockerfile.GetOnBuildInstructions(config, stageNameToIdx) if err != nil { return err } // Append to the beginning of the commands in the stage stage.Commands = append(cmds, stage.Commands...) logrus.Infof("Executing %v build triggers", len(cmds)) // Blank out the Onbuild command list for this image config.OnBuild = nil return nil } // reviewConfig makes sure the value of CMD is correct after building the stage // If ENTRYPOINT was set in this stage but CMD wasn't, then CMD should be cleared out // See Issue #346 for more info func reviewConfig(stage config.KanikoStage, config *v1.Config) { entrypoint := false cmd := false for _, c := range stage.Commands { if c.Name() == constants.Cmd { cmd = true } if c.Name() == constants.Entrypoint { entrypoint = true } } if entrypoint && !cmd { config.Cmd = nil } } // iterates over a list of KanikoStage and resolves instructions referring to earlier stages // returns a mapping of stage name to stage id, f.e - ["first": "0", "second": "1", "target": "2"] func ResolveCrossStageInstructions(stages []config.KanikoStage) map[string]string { nameToIndex := make(map[string]string) for i, stage := range stages { index := strconv.Itoa(i) if stage.Name != "" { nameToIndex[stage.Name] = index } dockerfile.ResolveCrossStageCommands(stage.Commands, nameToIndex) } logrus.Debugf("Built stage name to index map: %v", nameToIndex) return nameToIndex } func (s stageBuilder) initSnapshotWithTimings() error { t := timing.Start("Initial FS snapshot") if err := s.snapshotter.Init(); err != nil { return err } timing.DefaultRun.Stop(t) return nil } ================================================ FILE: pkg/executor/build_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package executor import ( "archive/tar" "bytes" "fmt" "os" "path/filepath" "reflect" "sort" "strconv" "testing" "github.com/GoogleContainerTools/kaniko/pkg/cache" "github.com/GoogleContainerTools/kaniko/pkg/commands" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/testutil" "github.com/containerd/containerd/platforms" "github.com/google/go-cmp/cmp" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/partial" "github.com/google/go-containerregistry/pkg/v1/types" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) func Test_reviewConfig(t *testing.T) { tests := []struct { name string dockerfile string originalCmd []string originalEntrypoint []string expectedCmd []string }{ { name: "entrypoint and cmd declared", dockerfile: ` FROM scratch CMD ["mycmd"] ENTRYPOINT ["myentrypoint"]`, originalEntrypoint: []string{"myentrypoint"}, originalCmd: []string{"mycmd"}, expectedCmd: []string{"mycmd"}, }, { name: "only entrypoint declared", dockerfile: ` FROM scratch ENTRYPOINT ["myentrypoint"]`, originalEntrypoint: []string{"myentrypoint"}, originalCmd: []string{"mycmd"}, expectedCmd: nil, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { config := &v1.Config{ Cmd: test.originalCmd, Entrypoint: test.originalEntrypoint, } reviewConfig(stage(t, test.dockerfile), config) testutil.CheckErrorAndDeepEqual(t, false, nil, test.expectedCmd, config.Cmd) }) } } func stage(t *testing.T, d string) config.KanikoStage { stages, _, err := dockerfile.Parse([]byte(d)) if err != nil { t.Fatalf("error parsing dockerfile: %v", err) } return config.KanikoStage{ Stage: stages[0], } } func Test_stageBuilder_shouldTakeSnapshot(t *testing.T) { cmds := []commands.DockerCommand{ &MockDockerCommand{command: "command1"}, &MockDockerCommand{command: "command2"}, &MockDockerCommand{command: "command3"}, } type fields struct { stage config.KanikoStage opts *config.KanikoOptions cmds []commands.DockerCommand } type args struct { index int metadataOnly bool } tests := []struct { name string fields fields args args want bool }{ { name: "final stage not last command", fields: fields{ stage: config.KanikoStage{ Final: true, }, cmds: cmds, }, args: args{ index: 1, }, want: true, }, { name: "not final stage last command", fields: fields{ stage: config.KanikoStage{ Final: false, }, cmds: cmds, }, args: args{ index: len(cmds) - 1, }, want: true, }, { name: "not final stage not last command", fields: fields{ stage: config.KanikoStage{ Final: false, }, cmds: cmds, }, args: args{ index: 0, }, want: true, }, { name: "not final stage not last command but empty list of files", fields: fields{ stage: config.KanikoStage{}, }, args: args{ index: 0, metadataOnly: true, }, want: false, }, { name: "not final stage not last command no files provided", fields: fields{ stage: config.KanikoStage{ Final: false, }, }, args: args{ index: 0, metadataOnly: false, }, want: true, }, { name: "caching enabled intermediate container", fields: fields{ stage: config.KanikoStage{ Final: false, }, opts: &config.KanikoOptions{Cache: true}, cmds: cmds, }, args: args{ index: 0, }, want: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if tt.fields.opts == nil { tt.fields.opts = &config.KanikoOptions{} } s := &stageBuilder{ stage: tt.fields.stage, opts: tt.fields.opts, cmds: tt.fields.cmds, } if got := s.shouldTakeSnapshot(tt.args.index, tt.args.metadataOnly); got != tt.want { t.Errorf("stageBuilder.shouldTakeSnapshot() = %v, want %v", got, tt.want) } }) } } func TestCalculateDependencies(t *testing.T) { type args struct { dockerfile string mockInitConfig func(partial.WithConfigFile, *config.KanikoOptions) (*v1.ConfigFile, error) } tests := []struct { name string args args want map[int][]string }{ { name: "no deps", args: args{ dockerfile: ` FROM debian as stage1 RUN foo FROM stage1 RUN bar `, }, want: map[int][]string{}, }, { name: "args", args: args{ dockerfile: ` ARG myFile=foo FROM debian as stage1 RUN foo FROM stage1 ARG myFile COPY --from=stage1 /tmp/$myFile.txt . RUN bar `, }, want: map[int][]string{ 0: {"/tmp/foo.txt"}, }, }, { name: "simple deps", args: args{ dockerfile: ` FROM debian as stage1 FROM alpine COPY --from=stage1 /foo /bar `, }, want: map[int][]string{ 0: {"/foo"}, }, }, { name: "two sets deps", args: args{ dockerfile: ` FROM debian as stage1 FROM ubuntu as stage2 RUN foo COPY --from=stage1 /foo /bar FROM alpine COPY --from=stage2 /bar /bat `, }, want: map[int][]string{ 0: {"/foo"}, 1: {"/bar"}, }, }, { name: "double deps", args: args{ dockerfile: ` FROM debian as stage1 FROM ubuntu as stage2 RUN foo COPY --from=stage1 /foo /bar FROM alpine COPY --from=stage1 /baz /bat `, }, want: map[int][]string{ 0: {"/foo", "/baz"}, }, }, { name: "envs in deps", args: args{ dockerfile: ` FROM debian as stage1 FROM ubuntu as stage2 RUN foo ENV key1 val1 ENV key2 val2 COPY --from=stage1 /foo/$key1 /foo/$key2 /bar FROM alpine COPY --from=stage2 /bar /bat `, }, want: map[int][]string{ 0: {"/foo/val1", "/foo/val2"}, 1: {"/bar"}, }, }, { name: "envs from base image in deps", args: args{ dockerfile: ` FROM debian as stage1 ENV key1 baseval1 FROM stage1 as stage2 RUN foo ENV key2 val2 COPY --from=stage1 /foo/$key1 /foo/$key2 /bar FROM alpine COPY --from=stage2 /bar /bat `, }, want: map[int][]string{ 0: {"/foo/baseval1", "/foo/val2"}, 1: {"/bar"}, }, }, { name: "one image has onbuild config", args: args{ mockInitConfig: func(img partial.WithConfigFile, opts *config.KanikoOptions) (*v1.ConfigFile, error) { cfg, err := img.ConfigFile() // if image is "alpine" then add ONBUILD to its config if cfg != nil && cfg.Architecture != "" { cfg.Config.OnBuild = []string{"COPY --from=builder /app /app"} } return cfg, err }, dockerfile: ` FROM scratch as builder RUN foo FROM alpine as second # This image has an ONBUILD command so it will be executed COPY --from=builder /foo /bar FROM scratch as target COPY --from=second /bar /bat `, }, want: map[int][]string{ 0: {"/app", "/foo"}, 1: {"/bar"}, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if tt.args.mockInitConfig != nil { original := initializeConfig defer func() { initializeConfig = original }() initializeConfig = tt.args.mockInitConfig } f, _ := os.CreateTemp("", "") os.WriteFile(f.Name(), []byte(tt.args.dockerfile), 0755) opts := &config.KanikoOptions{ DockerfilePath: f.Name(), CustomPlatform: platforms.Format(platforms.Normalize(platforms.DefaultSpec())), } testStages, metaArgs, err := dockerfile.ParseStages(opts) if err != nil { t.Errorf("Failed to parse test dockerfile to stages: %s", err) } kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs) if err != nil { t.Errorf("Failed to parse stages to Kaniko Stages: %s", err) } stageNameToIdx := ResolveCrossStageInstructions(kanikoStages) got, err := CalculateDependencies(kanikoStages, opts, stageNameToIdx) if err != nil { t.Errorf("got error: %s,", err) } if !reflect.DeepEqual(got, tt.want) { diff := cmp.Diff(got, tt.want) t.Errorf("CalculateDependencies() = %v, want %v, diff %v", got, tt.want, diff) } }) } } func Test_filesToSave(t *testing.T) { tests := []struct { name string args []string want []string files []string }{ { name: "simple", args: []string{"foo"}, files: []string{"foo"}, want: []string{"foo"}, }, { name: "glob", args: []string{"foo*"}, files: []string{"foo", "foo2", "fooooo", "bar"}, want: []string{"foo", "foo2", "fooooo"}, }, { name: "complex glob", args: []string{"foo*", "bar?"}, files: []string{"foo", "foo2", "fooooo", "bar", "bar1", "bar2", "bar33"}, want: []string{"foo", "foo2", "fooooo", "bar1", "bar2"}, }, { name: "dir", args: []string{"foo"}, files: []string{"foo/bar", "foo/baz", "foo/bat/baz"}, want: []string{"foo"}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tmpDir := t.TempDir() original := config.RootDir config.RootDir = tmpDir defer func() { config.RootDir = original }() for _, f := range tt.files { p := filepath.Join(tmpDir, f) dir := filepath.Dir(p) if dir != "." { if err := os.MkdirAll(dir, 0755); err != nil { t.Errorf("error making dir: %s", err) } } fp, err := os.Create(p) if err != nil { t.Errorf("error making file: %s", err) } fp.Close() } got, err := filesToSave(tt.args) if err != nil { t.Errorf("got err: %s", err) } sort.Strings(tt.want) sort.Strings(got) if !reflect.DeepEqual(got, tt.want) { t.Errorf("filesToSave() = %v, want %v", got, tt.want) } }) } } func TestDeduplicatePaths(t *testing.T) { tests := []struct { name string input []string want []string }{ { name: "no duplicates", input: []string{"file1.txt", "file2.txt", "usr/lib"}, want: []string{"file1.txt", "file2.txt", "usr/lib"}, }, { name: "duplicates", input: []string{"file1.txt", "file2.txt", "file2.txt", "usr/lib"}, want: []string{"file1.txt", "file2.txt", "usr/lib"}, }, { name: "duplicates with paths", input: []string{"file1.txt", "file2.txt", "file2.txt", "usr/lib", "usr/lib/ssl"}, want: []string{"file1.txt", "file2.txt", "usr/lib"}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := deduplicatePaths(tt.input) sort.Strings(tt.want) sort.Strings(got) if !reflect.DeepEqual(got, tt.want) { t.Errorf("TestDeduplicatePaths() = %v, want %v", got, tt.want) } }) } } func TestInitializeConfig(t *testing.T) { tests := []struct { description string cfg v1.ConfigFile expected v1.Config }{ { description: "env is not set in the image", cfg: v1.ConfigFile{ Config: v1.Config{ Image: "test", }, }, expected: v1.Config{ Image: "test", Env: []string{ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", }, }, }, { description: "env is set in the image", cfg: v1.ConfigFile{ Config: v1.Config{ Env: []string{ "PATH=/usr/local/something", }, }, }, expected: v1.Config{ Env: []string{ "PATH=/usr/local/something", }, }, }, { description: "image is empty", expected: v1.Config{ Env: []string{ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", }, }, }, } for _, tt := range tests { img, err := mutate.ConfigFile(empty.Image, &tt.cfg) if err != nil { t.Errorf("error seen when running test %s", err) t.Fail() } actual, _ := initializeConfig(img, nil) testutil.CheckDeepEqual(t, tt.expected, actual.Config) } } func Test_newLayerCache_defaultCache(t *testing.T) { t.Run("default layer cache is registry cache", func(t *testing.T) { layerCache := newLayerCache(&config.KanikoOptions{CacheRepo: "some-cache-repo"}) foundCache, ok := layerCache.(*cache.RegistryCache) if !ok { t.Error("expected layer cache to be a registry cache") } if foundCache.Opts.CacheRepo != "some-cache-repo" { t.Errorf( "expected cache repo to be 'some-cache-repo'; got %q", foundCache.Opts.CacheRepo, ) } }) } func Test_newLayerCache_layoutCache(t *testing.T) { t.Run("when cache repo has 'oci:' prefix layer cache is layout cache", func(t *testing.T) { layerCache := newLayerCache(&config.KanikoOptions{CacheRepo: "oci:/some-cache-repo"}) foundCache, ok := layerCache.(*cache.LayoutCache) if !ok { t.Error("expected layer cache to be a layout cache") } if foundCache.Opts.CacheRepo != "oci:/some-cache-repo" { t.Errorf( "expected cache repo to be 'oci:/some-cache-repo'; got %q", foundCache.Opts.CacheRepo, ) } }) } func Test_stageBuilder_optimize(t *testing.T) { testCases := []struct { opts *config.KanikoOptions retrieve bool name string }{ { name: "cache enabled and layer not present in cache", opts: &config.KanikoOptions{Cache: true}, }, { name: "cache enabled and layer present in cache", opts: &config.KanikoOptions{Cache: true}, retrieve: true, }, { name: "cache disabled and layer not present in cache", opts: &config.KanikoOptions{Cache: false}, }, { name: "cache disabled and layer present in cache", opts: &config.KanikoOptions{Cache: false}, retrieve: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { cf := &v1.ConfigFile{} snap := &fakeSnapShotter{} lc := &fakeLayerCache{retrieve: tc.retrieve} sb := &stageBuilder{opts: tc.opts, cf: cf, snapshotter: snap, layerCache: lc, args: dockerfile.NewBuildArgs([]string{})} ck := CompositeCache{} file, err := os.CreateTemp("", "foo") if err != nil { t.Error(err) } command := MockDockerCommand{ contextFiles: []string{file.Name()}, cacheCommand: MockCachedDockerCommand{}, } sb.cmds = []commands.DockerCommand{command} err = sb.optimize(ck, cf.Config) if err != nil { t.Errorf("Expected error to be nil but was %v", err) } }) } } type stageContext struct { command fmt.Stringer args *dockerfile.BuildArgs env []string } func newStageContext(command string, args map[string]string, env []string) stageContext { dockerArgs := dockerfile.NewBuildArgs([]string{}) for k, v := range args { dockerArgs.AddArg(k, &v) } return stageContext{MockDockerCommand{command: command}, dockerArgs, env} } func Test_stageBuilder_populateCompositeKey(t *testing.T) { type testcase struct { description string cmd1 stageContext cmd2 stageContext shdEqual bool } testCases := []testcase{ { description: "cache key for same command [RUN] with same build args", cmd1: newStageContext( "RUN echo $ARG > test", map[string]string{"ARG": "foo"}, []string{}, ), cmd2: newStageContext( "RUN echo $ARG > test", map[string]string{"ARG": "foo"}, []string{}, ), shdEqual: true, }, { description: "cache key for same command [RUN] with same env and args", cmd1: newStageContext( "RUN echo $ENV > test", map[string]string{"ARG": "foo"}, []string{"ENV=same"}, ), cmd2: newStageContext( "RUN echo $ENV > test", map[string]string{"ARG": "foo"}, []string{"ENV=same"}, ), shdEqual: true, }, { description: "cache key for same command [RUN] with same env but different args", cmd1: newStageContext( "RUN echo $ENV > test", map[string]string{"ARG": "foo"}, []string{"ENV=same"}, ), cmd2: newStageContext( "RUN echo $ENV > test", map[string]string{"ARG": "bar"}, []string{"ENV=same"}, ), }, { description: "cache key for same command [RUN], different buildargs, args not used in command", cmd1: newStageContext( "RUN echo const > test", map[string]string{"ARG": "foo"}, []string{"ENV=foo1"}, ), cmd2: newStageContext( "RUN echo const > test", map[string]string{"ARG": "bar"}, []string{"ENV=bar1"}, ), }, { description: "cache key for same command [RUN], different buildargs, args used in script", // test.sh // #!/bin/sh // echo ${ARG} cmd1: newStageContext( "RUN ./test.sh", map[string]string{"ARG": "foo"}, []string{"ENV=foo1"}, ), cmd2: newStageContext( "RUN ./test.sh", map[string]string{"ARG": "bar"}, []string{"ENV=bar1"}, ), }, { description: "cache key for same command [RUN] with a build arg values", cmd1: newStageContext( "RUN echo $ARG > test", map[string]string{"ARG": "foo"}, []string{}, ), cmd2: newStageContext( "RUN echo $ARG > test", map[string]string{"ARG": "bar"}, []string{}, ), }, { description: "cache key for same command [RUN] with different env values", cmd1: newStageContext( "RUN echo $ENV > test", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), cmd2: newStageContext( "RUN echo $ENV > test", map[string]string{"ARG": "foo"}, []string{"ENV=2"}, ), }, { description: "cache key for different command [RUN] same context", cmd1: newStageContext( "RUN echo other > test", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), cmd2: newStageContext( "RUN echo another > test", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), }, { description: "cache key for command [RUN] with same env values [check that variable no interpolate in RUN command]", cmd1: newStageContext( "RUN echo $ENV > test", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), cmd2: newStageContext( "RUN echo 1 > test", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), shdEqual: false, }, { description: "cache key for command [RUN] with different env values [check that variable no interpolate in RUN command]", cmd1: newStageContext( "RUN echo ${APP_VERSION%.*} ${APP_VERSION%-*} > test", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), cmd2: newStageContext( "RUN echo ${APP_VERSION%.*} ${APP_VERSION%-*} > test", map[string]string{"ARG": "foo"}, []string{"ENV=2"}, ), shdEqual: false, }, func() testcase { dir, files := tempDirAndFile(t) file := files[0] filePath := filepath.Join(dir, file) return testcase{ description: "cache key for same command [COPY] with same args", cmd1: newStageContext( fmt.Sprintf("COPY %s /meow", filePath), map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), cmd2: newStageContext( fmt.Sprintf("COPY %s /meow", filePath), map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), shdEqual: true, } }(), func() testcase { dir, files := tempDirAndFile(t) file := files[0] filePath := filepath.Join(dir, file) return testcase{ description: "cache key for same command [COPY] with different args", cmd1: newStageContext( fmt.Sprintf("COPY %s /meow", filePath), map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), cmd2: newStageContext( fmt.Sprintf("COPY %s /meow", filePath), map[string]string{"ARG": "bar"}, []string{"ENV=2"}, ), shdEqual: true, } }(), { description: "cache key for same command [WORKDIR] with same args", cmd1: newStageContext( "WORKDIR /", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), cmd2: newStageContext( "WORKDIR /", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), shdEqual: true, }, { description: "cache key for same command [WORKDIR] with different args", cmd1: newStageContext( "WORKDIR /", map[string]string{"ARG": "foo"}, []string{"ENV=1"}, ), cmd2: newStageContext( "WORKDIR /", map[string]string{"ARG": "bar"}, []string{"ENV=2"}, ), shdEqual: true, }, } for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { sb := &stageBuilder{fileContext: util.FileContext{Root: "workspace"}} ck := CompositeCache{} instructions1, err := dockerfile.ParseCommands([]string{tc.cmd1.command.String()}) if err != nil { t.Fatal(err) } fc1 := util.FileContext{Root: "workspace"} dockerCommand1, err := commands.GetCommand(instructions1[0], fc1, false, true, true) if err != nil { t.Fatal(err) } instructions, err := dockerfile.ParseCommands([]string{tc.cmd2.command.String()}) if err != nil { t.Fatal(err) } fc2 := util.FileContext{Root: "workspace"} dockerCommand2, err := commands.GetCommand(instructions[0], fc2, false, true, true) if err != nil { t.Fatal(err) } ck1, err := sb.populateCompositeKey(dockerCommand1, []string{}, ck, tc.cmd1.args, tc.cmd1.env) if err != nil { t.Errorf("Expected error to be nil but was %v", err) } ck2, err := sb.populateCompositeKey(dockerCommand2, []string{}, ck, tc.cmd2.args, tc.cmd2.env) if err != nil { t.Errorf("Expected error to be nil but was %v", err) } key1, key2 := hashCompositeKeys(t, ck1, ck2) if b := key1 == key2; b != tc.shdEqual { t.Errorf("expected keys to be equal as %t but found %t", tc.shdEqual, !tc.shdEqual) } }) } } func Test_stageBuilder_build(t *testing.T) { type testcase struct { description string opts *config.KanikoOptions args map[string]string layerCache *fakeLayerCache expectedCacheKeys []string pushedCacheKeys []string commands []commands.DockerCommand fileName string rootDir string image v1.Image config *v1.ConfigFile stage config.KanikoStage crossStageDeps map[int][]string mockGetFSFromImage func(root string, img v1.Image, extract util.ExtractFunction) ([]string, error) shouldInitSnapshot bool } testCases := []testcase{ func() testcase { dir, files := tempDirAndFile(t) file := files[0] filePath := filepath.Join(dir, file) ch := NewCompositeCache("", "meow") ch.AddPath(filePath, util.FileContext{}) hash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } command := MockDockerCommand{ command: "meow", contextFiles: []string{filePath}, cacheCommand: MockCachedDockerCommand{ contextFiles: []string{filePath}, }, } destDir := t.TempDir() return testcase{ description: "fake command cache enabled but key not in cache", config: &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}}, opts: &config.KanikoOptions{Cache: true}, expectedCacheKeys: []string{hash}, pushedCacheKeys: []string{hash}, commands: []commands.DockerCommand{command}, rootDir: dir, } }(), func() testcase { dir, files := tempDirAndFile(t) file := files[0] filePath := filepath.Join(dir, file) ch := NewCompositeCache("", "meow") ch.AddPath(filePath, util.FileContext{}) hash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } command := MockDockerCommand{ command: "meow", contextFiles: []string{filePath}, cacheCommand: MockCachedDockerCommand{ contextFiles: []string{filePath}, }, } destDir := t.TempDir() return testcase{ description: "fake command cache enabled and key in cache", opts: &config.KanikoOptions{Cache: true}, config: &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}}, layerCache: &fakeLayerCache{ retrieve: true, }, expectedCacheKeys: []string{hash}, pushedCacheKeys: []string{}, commands: []commands.DockerCommand{command}, rootDir: dir, } }(), func() testcase { dir, files := tempDirAndFile(t) file := files[0] filePath := filepath.Join(dir, file) ch := NewCompositeCache("", "meow") ch.AddPath(filePath, util.FileContext{}) hash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } command := MockDockerCommand{ command: "meow", contextFiles: []string{filePath}, cacheCommand: MockCachedDockerCommand{ contextFiles: []string{filePath}, }, } destDir := t.TempDir() return testcase{ description: "fake command cache enabled with tar compression disabled and key in cache", opts: &config.KanikoOptions{Cache: true, CompressedCaching: false}, config: &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}}, layerCache: &fakeLayerCache{ retrieve: true, }, expectedCacheKeys: []string{hash}, pushedCacheKeys: []string{}, commands: []commands.DockerCommand{command}, rootDir: dir, } }(), { description: "use new run", opts: &config.KanikoOptions{RunV2: true}, }, { description: "single snapshot", opts: &config.KanikoOptions{SingleSnapshot: true}, shouldInitSnapshot: true, }, { description: "fake command cache disabled and key not in cache", opts: &config.KanikoOptions{Cache: false}, }, { description: "fake command cache disabled and key in cache", opts: &config.KanikoOptions{Cache: false}, layerCache: &fakeLayerCache{ retrieve: true, }, }, func() testcase { dir, filenames := tempDirAndFile(t) filename := filenames[0] filepath := filepath.Join(dir, filename) tarContent := generateTar(t, dir, filename) ch := NewCompositeCache("", fmt.Sprintf("COPY %s foo.txt", filename)) ch.AddPath(filepath, util.FileContext{}) hash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } copyCommandCacheKey := hash dockerFile := fmt.Sprintf(` FROM ubuntu:16.04 COPY %s foo.txt `, filename) f, _ := os.CreateTemp("", "") os.WriteFile(f.Name(), []byte(dockerFile), 0755) opts := &config.KanikoOptions{ DockerfilePath: f.Name(), Cache: true, CacheCopyLayers: true, } testStages, metaArgs, err := dockerfile.ParseStages(opts) if err != nil { t.Errorf("Failed to parse test dockerfile to stages: %s", err) } kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs) if err != nil { t.Errorf("Failed to parse stages to Kaniko Stages: %s", err) } _ = ResolveCrossStageInstructions(kanikoStages) stage := kanikoStages[0] cmds := stage.Commands return testcase{ description: "copy command cache enabled and key in cache", opts: opts, image: fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{ TarContent: tarContent, }, }, }, layerCache: &fakeLayerCache{ retrieve: true, img: fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{ TarContent: tarContent, }, }, }, }, rootDir: dir, expectedCacheKeys: []string{copyCommandCacheKey}, // CachingCopyCommand is not pushed to the cache pushedCacheKeys: []string{}, commands: getCommands(util.FileContext{Root: dir}, cmds, true, false), fileName: filename, } }(), func() testcase { dir, filenames := tempDirAndFile(t) filename := filenames[0] tarContent := []byte{} destDir := t.TempDir() filePath := filepath.Join(dir, filename) ch := NewCompositeCache("", fmt.Sprintf("COPY %s foo.txt", filename)) ch.AddPath(filePath, util.FileContext{}) hash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } dockerFile := fmt.Sprintf(` FROM ubuntu:16.04 COPY %s foo.txt `, filename) f, _ := os.CreateTemp("", "") os.WriteFile(f.Name(), []byte(dockerFile), 0755) opts := &config.KanikoOptions{ DockerfilePath: f.Name(), Cache: true, CacheCopyLayers: true, } testStages, metaArgs, err := dockerfile.ParseStages(opts) if err != nil { t.Errorf("Failed to parse test dockerfile to stages: %s", err) } kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs) if err != nil { t.Errorf("Failed to parse stages to Kaniko Stages: %s", err) } _ = ResolveCrossStageInstructions(kanikoStages) stage := kanikoStages[0] cmds := stage.Commands return testcase{ description: "copy command cache enabled and key is not in cache", opts: opts, config: &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}}, layerCache: &fakeLayerCache{}, image: fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{ TarContent: tarContent, }, }, }, rootDir: dir, expectedCacheKeys: []string{hash}, pushedCacheKeys: []string{hash}, commands: getCommands(util.FileContext{Root: dir}, cmds, true, false), fileName: filename, } }(), func() testcase { dir, filenames := tempDirAndFile(t) filename := filenames[0] tarContent := generateTar(t, filename) destDir := t.TempDir() filePath := filepath.Join(dir, filename) ch := NewCompositeCache("", "RUN foobar") hash1, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } ch.AddKey(fmt.Sprintf("COPY %s bar.txt", filename)) ch.AddPath(filePath, util.FileContext{}) hash2, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } ch = NewCompositeCache("", fmt.Sprintf("COPY %s foo.txt", filename)) ch.AddKey(fmt.Sprintf("COPY %s bar.txt", filename)) ch.AddPath(filePath, util.FileContext{}) image := fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{ TarContent: tarContent, }, }, } dockerFile := fmt.Sprintf(` FROM ubuntu:16.04 RUN foobar COPY %s bar.txt `, filename) f, _ := os.CreateTemp("", "") os.WriteFile(f.Name(), []byte(dockerFile), 0755) opts := &config.KanikoOptions{ DockerfilePath: f.Name(), } testStages, metaArgs, err := dockerfile.ParseStages(opts) if err != nil { t.Errorf("Failed to parse test dockerfile to stages: %s", err) } kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs) if err != nil { t.Errorf("Failed to parse stages to Kaniko Stages: %s", err) } _ = ResolveCrossStageInstructions(kanikoStages) stage := kanikoStages[0] cmds := stage.Commands return testcase{ description: "cached run command followed by uncached copy command results in consistent read and write hashes", opts: &config.KanikoOptions{Cache: true, CacheCopyLayers: true, CacheRunLayers: true}, rootDir: dir, config: &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}}, layerCache: &fakeLayerCache{ keySequence: []string{hash1}, img: image, }, image: image, // hash1 is the read cachekey for the first layer expectedCacheKeys: []string{hash1, hash2}, pushedCacheKeys: []string{hash2}, commands: getCommands(util.FileContext{Root: dir}, cmds, true, true), } }(), func() testcase { dir, filenames := tempDirAndFile(t) filename := filenames[0] tarContent := generateTar(t, filename) destDir := t.TempDir() filePath := filepath.Join(dir, filename) ch := NewCompositeCache("", fmt.Sprintf("COPY %s bar.txt", filename)) ch.AddPath(filePath, util.FileContext{}) // copy hash _, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } ch.AddKey("RUN foobar") // run hash runHash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } image := fakeImage{ ImageLayers: []v1.Layer{ fakeLayer{ TarContent: tarContent, }, }, } dockerFile := fmt.Sprintf(` FROM ubuntu:16.04 COPY %s bar.txt RUN foobar `, filename) f, _ := os.CreateTemp("", "") os.WriteFile(f.Name(), []byte(dockerFile), 0755) opts := &config.KanikoOptions{ DockerfilePath: f.Name(), } testStages, metaArgs, err := dockerfile.ParseStages(opts) if err != nil { t.Errorf("Failed to parse test dockerfile to stages: %s", err) } kanikoStages, err := dockerfile.MakeKanikoStages(opts, testStages, metaArgs) if err != nil { t.Errorf("Failed to parse stages to Kaniko Stages: %s", err) } _ = ResolveCrossStageInstructions(kanikoStages) stage := kanikoStages[0] cmds := stage.Commands return testcase{ description: "copy command followed by cached run command results in consistent read and write hashes", opts: &config.KanikoOptions{Cache: true, CacheRunLayers: true}, rootDir: dir, config: &v1.ConfigFile{Config: v1.Config{WorkingDir: destDir}}, layerCache: &fakeLayerCache{ keySequence: []string{runHash}, img: image, }, image: image, expectedCacheKeys: []string{runHash}, pushedCacheKeys: []string{}, commands: getCommands(util.FileContext{Root: dir}, cmds, false, true), } }(), func() testcase { dir, _ := tempDirAndFile(t) ch := NewCompositeCache("") ch.AddKey("|1") ch.AddKey("test=value") ch.AddKey("RUN foobar") hash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } command := MockDockerCommand{ command: "RUN foobar", contextFiles: []string{}, cacheCommand: MockCachedDockerCommand{ contextFiles: []string{}, }, argToCompositeCache: true, } return testcase{ description: "cached run command with no build arg value used uses cached layer and does not push anything", config: &v1.ConfigFile{Config: v1.Config{WorkingDir: dir}}, opts: &config.KanikoOptions{Cache: true}, args: map[string]string{ "test": "value", }, expectedCacheKeys: []string{hash}, commands: []commands.DockerCommand{command}, // layer key needs to be read. layerCache: &fakeLayerCache{ img: &fakeImage{ImageLayers: []v1.Layer{fakeLayer{}}}, keySequence: []string{hash}, }, rootDir: dir, } }(), func() testcase { dir, _ := tempDirAndFile(t) ch := NewCompositeCache("") ch.AddKey("|1") ch.AddKey("arg=value") ch.AddKey("RUN $arg") hash, err := ch.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } command := MockDockerCommand{ command: "RUN $arg", contextFiles: []string{}, cacheCommand: MockCachedDockerCommand{ contextFiles: []string{}, }, argToCompositeCache: true, } return testcase{ description: "cached run command with same build arg does not push layer", config: &v1.ConfigFile{Config: v1.Config{WorkingDir: dir}}, opts: &config.KanikoOptions{Cache: true}, args: map[string]string{ "arg": "value", }, // layer key that exists layerCache: &fakeLayerCache{ img: &fakeImage{ImageLayers: []v1.Layer{fakeLayer{}}}, keySequence: []string{hash}, }, expectedCacheKeys: []string{hash}, commands: []commands.DockerCommand{command}, rootDir: dir, } }(), func() testcase { dir, _ := tempDirAndFile(t) ch1 := NewCompositeCache("") ch1.AddKey("RUN value") hash1, err := ch1.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } ch2 := NewCompositeCache("") ch2.AddKey("|1") ch2.AddKey("arg=anotherValue") ch2.AddKey("RUN $arg") hash2, err := ch2.Hash() if err != nil { t.Errorf("couldn't create hash %v", err) } command := MockDockerCommand{ command: "RUN $arg", contextFiles: []string{}, cacheCommand: MockCachedDockerCommand{ contextFiles: []string{}, }, argToCompositeCache: true, } return testcase{ description: "cached run command with another build arg pushes layer", config: &v1.ConfigFile{Config: v1.Config{WorkingDir: dir}}, opts: &config.KanikoOptions{Cache: true}, args: map[string]string{ "arg": "anotherValue", }, // layer for arg=value already exists layerCache: &fakeLayerCache{ img: &fakeImage{ImageLayers: []v1.Layer{fakeLayer{}}}, keySequence: []string{hash1}, }, expectedCacheKeys: []string{hash2}, pushedCacheKeys: []string{hash2}, commands: []commands.DockerCommand{command}, rootDir: dir, } }(), { description: "fs unpacked", opts: &config.KanikoOptions{InitialFSUnpacked: true}, stage: config.KanikoStage{Index: 0}, crossStageDeps: map[int][]string{0: {"some-dep"}}, mockGetFSFromImage: func(root string, img v1.Image, extract util.ExtractFunction) ([]string, error) { return nil, fmt.Errorf("getFSFromImage shouldn't be called if fs is already unpacked") }, }, } for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { var fileName string if tc.commands == nil { file, err := os.CreateTemp("", "foo") if err != nil { t.Error(err) } command := MockDockerCommand{ contextFiles: []string{file.Name()}, cacheCommand: MockCachedDockerCommand{ contextFiles: []string{file.Name()}, }, } tc.commands = []commands.DockerCommand{command} fileName = file.Name() } else { fileName = tc.fileName } cf := tc.config if cf == nil { cf = &v1.ConfigFile{ Config: v1.Config{ Env: make([]string, 0), }, } } snap := &fakeSnapShotter{file: fileName} lc := tc.layerCache if lc == nil { lc = &fakeLayerCache{} } keys := []string{} sb := &stageBuilder{ args: dockerfile.NewBuildArgs([]string{}), //required or code will panic image: tc.image, opts: tc.opts, cf: cf, snapshotter: snap, layerCache: lc, pushLayerToCache: func(_ *config.KanikoOptions, cacheKey, _, _ string) error { keys = append(keys, cacheKey) return nil }, } sb.cmds = tc.commands for key, value := range tc.args { sb.args.AddArg(key, &value) } tmp := config.RootDir if tc.rootDir != "" { config.RootDir = tc.rootDir } sb.stage = tc.stage sb.crossStageDeps = tc.crossStageDeps if tc.mockGetFSFromImage != nil { original := getFSFromImage defer func() { getFSFromImage = original }() getFSFromImage = tc.mockGetFSFromImage } err := sb.build() if err != nil { t.Errorf("Expected error to be nil but was %v", err) } if tc.shouldInitSnapshot && !snap.initialized { t.Errorf("Snapshotter was not initialized but should have been") } else if !tc.shouldInitSnapshot && snap.initialized { t.Errorf("Snapshotter was initialized but should not have been") } assertCacheKeys(t, tc.expectedCacheKeys, lc.receivedKeys, "receive") assertCacheKeys(t, tc.pushedCacheKeys, keys, "push") config.RootDir = tmp }) } } func assertCacheKeys(t *testing.T, expectedCacheKeys, actualCacheKeys []string, description string) { if len(expectedCacheKeys) != len(actualCacheKeys) { t.Errorf("expected to %v %v keys but was %v", description, len(expectedCacheKeys), len(actualCacheKeys)) } sort.Slice(expectedCacheKeys, func(x, y int) bool { return expectedCacheKeys[x] > expectedCacheKeys[y] }) sort.Slice(actualCacheKeys, func(x, y int) bool { return actualCacheKeys[x] > actualCacheKeys[y] }) if len(expectedCacheKeys) != len(actualCacheKeys) { t.Errorf("expected %v to equal %v", actualCacheKeys, expectedCacheKeys) } for i, key := range expectedCacheKeys { if key != actualCacheKeys[i] { t.Errorf("expected to %v keys %d to be %v but was %v %v", description, i, key, actualCacheKeys[i], actualCacheKeys) } } } func getCommands(fileContext util.FileContext, cmds []instructions.Command, cacheCopy, cacheRun bool) []commands.DockerCommand { outCommands := make([]commands.DockerCommand, 0) for _, c := range cmds { cmd, err := commands.GetCommand( c, fileContext, false, cacheCopy, cacheRun, ) if err != nil { panic(err) } outCommands = append(outCommands, cmd) } return outCommands } func tempDirAndFile(t *testing.T) (string, []string) { filenames := []string{"bar.txt"} dir := t.TempDir() for _, filename := range filenames { filepath := filepath.Join(dir, filename) err := os.WriteFile(filepath, []byte(`meow`), 0777) if err != nil { t.Errorf("could not create temp file %v", err) } } return dir, filenames } func generateTar(t *testing.T, dir string, fileNames ...string) []byte { buf := bytes.NewBuffer([]byte{}) writer := tar.NewWriter(buf) defer writer.Close() for _, filename := range fileNames { filePath := filepath.Join(dir, filename) info, err := os.Stat(filePath) if err != nil { t.Errorf("could not get file info for temp file %v", err) } hdr, err := tar.FileInfoHeader(info, filename) if err != nil { t.Errorf("could not get tar header for temp file %v", err) } if err := writer.WriteHeader(hdr); err != nil { t.Errorf("could not write tar header %v", err) } content, err := os.ReadFile(filePath) if err != nil { t.Errorf("could not read tempfile %v", err) } if _, err := writer.Write(content); err != nil { t.Errorf("could not write file contents to tar") } } return buf.Bytes() } func hashCompositeKeys(t *testing.T, ck1 CompositeCache, ck2 CompositeCache) (string, string) { key1, err := ck1.Hash() if err != nil { t.Errorf("could not hash composite key due to %s", err) } key2, err := ck2.Hash() if err != nil { t.Errorf("could not hash composite key due to %s", err) } return key1, key2 } func Test_stageBuild_populateCompositeKeyForCopyCommand(t *testing.T) { // See https://github.com/GoogleContainerTools/kaniko/issues/589 for _, tc := range []struct { description string command string expectedCacheKey string }{ { description: "multi-stage copy command", // dont use digest from previoust stage for COPY command: "COPY --from=0 foo.txt bar.txt", expectedCacheKey: "COPY --from=0 foo.txt bar.txt", }, { description: "copy command", command: "COPY foo.txt bar.txt", expectedCacheKey: "COPY foo.txt bar.txt", }, } { t.Run(tc.description, func(t *testing.T) { instructions, err := dockerfile.ParseCommands([]string{tc.command}) if err != nil { t.Fatal(err) } fc := util.FileContext{Root: "workspace"} copyCommand, err := commands.GetCommand(instructions[0], fc, false, true, true) if err != nil { t.Fatal(err) } for _, useCacheCommand := range []bool{false, true} { t.Run(fmt.Sprintf("CacheCommand=%t", useCacheCommand), func(t *testing.T) { var cmd commands.DockerCommand = copyCommand if useCacheCommand { cmd = copyCommand.(*commands.CopyCommand).CacheCommand(nil) } sb := &stageBuilder{ fileContext: fc, stageIdxToDigest: map[string]string{ "0": "some-digest", }, digestToCacheKey: map[string]string{ "some-digest": "some-cache-key", }, } ck := CompositeCache{} ck, err = sb.populateCompositeKey( cmd, []string{}, ck, dockerfile.NewBuildArgs([]string{}), []string{}, ) if err != nil { t.Fatal(err) } actualCacheKey := ck.Key() if tc.expectedCacheKey != actualCacheKey { t.Errorf( "Expected cache key to be %s, was %s", tc.expectedCacheKey, actualCacheKey, ) } }) } }) } } func Test_ResolveCrossStageInstructions(t *testing.T) { df := ` FROM scratch RUN echo hi > /hi FROM scratch AS second COPY --from=0 /hi /hi2 FROM scratch AS tHiRd COPY --from=second /hi2 /hi3 COPY --from=1 /hi2 /hi3 FROM scratch COPY --from=thIrD /hi3 /hi4 COPY --from=third /hi3 /hi4 COPY --from=2 /hi3 /hi4 ` stages, metaArgs, err := dockerfile.Parse([]byte(df)) if err != nil { t.Fatal(err) } opts := &config.KanikoOptions{} kanikoStages, err := dockerfile.MakeKanikoStages(opts, stages, metaArgs) if err != nil { t.Fatal(err) } stageToIdx := ResolveCrossStageInstructions(kanikoStages) for index, stage := range stages { if index == 0 { continue } expectedStage := strconv.Itoa(index - 1) for _, command := range stage.Commands { copyCmd := command.(*instructions.CopyCommand) if copyCmd.From != expectedStage { t.Fatalf("unexpected copy command: %s resolved to stage %s, expected %s", copyCmd.String(), copyCmd.From, expectedStage) } } expectedMap := map[string]string{"second": "1", "third": "2"} testutil.CheckDeepEqual(t, expectedMap, stageToIdx) } } func Test_stageBuilder_saveSnapshotToLayer(t *testing.T) { dir, files := tempDirAndFile(t) type fields struct { stage config.KanikoStage image v1.Image cf *v1.ConfigFile baseImageDigest string finalCacheKey string opts *config.KanikoOptions fileContext util.FileContext cmds []commands.DockerCommand args *dockerfile.BuildArgs crossStageDeps map[int][]string digestToCacheKey map[string]string stageIdxToDigest map[string]string snapshotter snapShotter layerCache cache.LayerCache pushLayerToCache cachePusher } type args struct { tarPath string } tests := []struct { name string fields fields args args expectedMediaType types.MediaType expectedDiff v1.Hash expectedDigest v1.Hash wantErr bool }{ { name: "oci image", fields: fields{ image: ociFakeImage{}, opts: &config.KanikoOptions{ ForceBuildMetadata: true, }, }, args: args{ tarPath: filepath.Join(dir, files[0]), }, expectedMediaType: types.OCILayer, expectedDiff: v1.Hash{ Algorithm: "sha256", Hex: "404cdd7bc109c432f8cc2443b45bcfe95980f5107215c645236e577929ac3e52", }, expectedDigest: v1.Hash{ Algorithm: "sha256", Hex: "1dc5887a31ec6b388646be46c5f0b2036f92f4cbba50d12163a8be4074565a91", }, }, { name: "docker image", fields: fields{ image: fakeImage{}, opts: &config.KanikoOptions{ ForceBuildMetadata: true, }, }, args: args{ tarPath: filepath.Join(dir, files[0]), }, expectedMediaType: types.DockerLayer, expectedDiff: v1.Hash{ Algorithm: "sha256", Hex: "404cdd7bc109c432f8cc2443b45bcfe95980f5107215c645236e577929ac3e52", }, expectedDigest: v1.Hash{ Algorithm: "sha256", Hex: "1dc5887a31ec6b388646be46c5f0b2036f92f4cbba50d12163a8be4074565a91", }, }, { name: "oci image, zstd compression", fields: fields{ image: ociFakeImage{}, opts: &config.KanikoOptions{ ForceBuildMetadata: true, Compression: config.ZStd, }, }, args: args{ tarPath: filepath.Join(dir, files[0]), }, expectedMediaType: types.OCILayerZStd, expectedDiff: v1.Hash{ Algorithm: "sha256", Hex: "404cdd7bc109c432f8cc2443b45bcfe95980f5107215c645236e577929ac3e52", }, expectedDigest: v1.Hash{ Algorithm: "sha256", Hex: "28369c11d9b68c9877781eaf4d8faffb4d0ada1900a1fb83ad452e58a072b45b", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := &stageBuilder{ stage: tt.fields.stage, image: tt.fields.image, cf: tt.fields.cf, baseImageDigest: tt.fields.baseImageDigest, finalCacheKey: tt.fields.finalCacheKey, opts: tt.fields.opts, fileContext: tt.fields.fileContext, cmds: tt.fields.cmds, args: tt.fields.args, crossStageDeps: tt.fields.crossStageDeps, digestToCacheKey: tt.fields.digestToCacheKey, stageIdxToDigest: tt.fields.stageIdxToDigest, snapshotter: tt.fields.snapshotter, layerCache: tt.fields.layerCache, pushLayerToCache: tt.fields.pushLayerToCache, } got, err := s.saveSnapshotToLayer(tt.args.tarPath) if (err != nil) != tt.wantErr { t.Errorf("stageBuilder.saveSnapshotToLayer() error = %v, wantErr %v", err, tt.wantErr) return } if mt, _ := got.MediaType(); mt != tt.expectedMediaType { t.Errorf("expected mediatype %s, got %s", tt.expectedMediaType, mt) return } if diff, _ := got.DiffID(); diff != tt.expectedDiff { t.Errorf("expected diff %s, got %s", tt.expectedDiff, diff) return } if digest, _ := got.Digest(); digest != tt.expectedDigest { t.Errorf("expected digest %s, got %s", tt.expectedDigest, digest) return } }) } } func Test_stageBuilder_convertLayerMediaType(t *testing.T) { type fields struct { stage config.KanikoStage image v1.Image cf *v1.ConfigFile baseImageDigest string finalCacheKey string opts *config.KanikoOptions fileContext util.FileContext cmds []commands.DockerCommand args *dockerfile.BuildArgs crossStageDeps map[int][]string digestToCacheKey map[string]string stageIdxToDigest map[string]string snapshotter snapShotter layerCache cache.LayerCache pushLayerToCache cachePusher } type args struct { layer v1.Layer } tests := []struct { name string fields fields args args expectedMediaType types.MediaType wantErr bool }{ { name: "docker image w/ docker layer", fields: fields{ image: fakeImage{}, }, args: args{ layer: fakeLayer{ mediaType: types.DockerLayer, }, }, expectedMediaType: types.DockerLayer, }, { name: "oci image w/ oci layer", fields: fields{ image: ociFakeImage{}, }, args: args{ layer: fakeLayer{ mediaType: types.OCILayer, }, }, expectedMediaType: types.OCILayer, }, { name: "oci image w/ convertable docker layer", fields: fields{ image: ociFakeImage{}, opts: &config.KanikoOptions{}, }, args: args{ layer: fakeLayer{ mediaType: types.DockerLayer, }, }, expectedMediaType: types.OCILayer, }, { name: "oci image w/ convertable docker layer and zstd compression", fields: fields{ image: ociFakeImage{}, opts: &config.KanikoOptions{ Compression: config.ZStd, }, }, args: args{ layer: fakeLayer{ mediaType: types.DockerLayer, }, }, expectedMediaType: types.OCILayerZStd, }, { name: "docker image and oci zstd layer", fields: fields{ image: dockerFakeImage{}, opts: &config.KanikoOptions{}, }, args: args{ layer: fakeLayer{ mediaType: types.OCILayerZStd, }, }, expectedMediaType: types.DockerLayer, }, { name: "docker image w/ uncovertable oci image", fields: fields{ image: dockerFakeImage{}, opts: &config.KanikoOptions{}, }, args: args{ layer: fakeLayer{ mediaType: types.OCIUncompressedRestrictedLayer, }, }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := &stageBuilder{ stage: tt.fields.stage, image: tt.fields.image, cf: tt.fields.cf, baseImageDigest: tt.fields.baseImageDigest, finalCacheKey: tt.fields.finalCacheKey, opts: tt.fields.opts, fileContext: tt.fields.fileContext, cmds: tt.fields.cmds, args: tt.fields.args, crossStageDeps: tt.fields.crossStageDeps, digestToCacheKey: tt.fields.digestToCacheKey, stageIdxToDigest: tt.fields.stageIdxToDigest, snapshotter: tt.fields.snapshotter, layerCache: tt.fields.layerCache, pushLayerToCache: tt.fields.pushLayerToCache, } got, err := s.convertLayerMediaType(tt.args.layer) if (err != nil) != tt.wantErr { t.Errorf("stageBuilder.convertLayerMediaType() error = %v, wantErr %v", err, tt.wantErr) return } if err == nil { mt, _ := got.MediaType() if mt != tt.expectedMediaType { t.Errorf("stageBuilder.convertLayerMediaType() = %v, want %v", mt, tt.expectedMediaType) } } }) } } ================================================ FILE: pkg/executor/composite_cache.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package executor import ( "crypto/sha256" "fmt" "os" "path/filepath" "strings" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/pkg/errors" ) // NewCompositeCache returns an initialized composite cache object. func NewCompositeCache(initial ...string) *CompositeCache { c := CompositeCache{ keys: initial, } return &c } // CompositeCache is a type that generates a cache key from a series of keys. type CompositeCache struct { keys []string } // AddKey adds the specified key to the sequence. func (s *CompositeCache) AddKey(k ...string) { s.keys = append(s.keys, k...) } // Key returns the human readable composite key as a string. func (s *CompositeCache) Key() string { return strings.Join(s.keys, "-") } // Hash returns the composite key in a string SHA256 format. func (s *CompositeCache) Hash() (string, error) { return util.SHA256(strings.NewReader(s.Key())) } func (s *CompositeCache) AddPath(p string, context util.FileContext) error { sha := sha256.New() fi, err := os.Lstat(p) if err != nil { return errors.Wrap(err, "could not add path") } if fi.Mode().IsDir() { empty, k, err := hashDir(p, context) if err != nil { return err } // Only add the hash of this directory to the key // if there is any ignored content. if !empty || !context.ExcludesFile(p) { s.keys = append(s.keys, k) } return nil } if context.ExcludesFile(p) { return nil } fh, err := util.CacheHasher()(p) if err != nil { return err } if _, err := sha.Write([]byte(fh)); err != nil { return err } s.keys = append(s.keys, fmt.Sprintf("%x", sha.Sum(nil))) return nil } // HashDir returns a hash of the directory. func hashDir(p string, context util.FileContext) (bool, string, error) { sha := sha256.New() empty := true if err := filepath.Walk(p, func(path string, fi os.FileInfo, err error) error { if err != nil { return err } exclude := context.ExcludesFile(path) if exclude { return nil } fileHash, err := util.CacheHasher()(path) if err != nil { return err } if _, err := sha.Write([]byte(fileHash)); err != nil { return err } empty = false return nil }); err != nil { return false, "", err } return empty, fmt.Sprintf("%x", sha.Sum(nil)), nil } ================================================ FILE: pkg/executor/composite_cache_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package executor import ( "os" "path" "path/filepath" "reflect" "testing" "github.com/GoogleContainerTools/kaniko/pkg/util" ) func Test_NewCompositeCache(t *testing.T) { r := NewCompositeCache() if reflect.TypeOf(r).String() != "*executor.CompositeCache" { t.Errorf("expected return to be *executor.CompositeCache but was %v", reflect.TypeOf(r).String()) } } func Test_CompositeCache_AddKey(t *testing.T) { keys := []string{ "meow", "purr", } r := NewCompositeCache() r.AddKey(keys...) if len(r.keys) != 2 { t.Errorf("expected keys to have length 2 but was %v", len(r.keys)) } } func Test_CompositeCache_Key(t *testing.T) { r := NewCompositeCache("meow", "purr") k := r.Key() if k != "meow-purr" { t.Errorf("expected result to equal meow-purr but was %v", k) } } func Test_CompositeCache_Hash(t *testing.T) { r := NewCompositeCache("meow", "purr") h, err := r.Hash() if err != nil { t.Errorf("expected error to be nil but was %v", err) } expectedHash := "b4fd5a11af812a11a79d794007c842794cc668c8e7ebaba6d1e6d021b8e06c71" if h != expectedHash { t.Errorf("expected result to equal %v but was %v", expectedHash, h) } } func Test_CompositeCache_AddPath_dir(t *testing.T) { tmpDir := t.TempDir() content := `meow meow meow` if err := os.WriteFile(filepath.Join(tmpDir, "foo.txt"), []byte(content), 0777); err != nil { t.Errorf("got error writing temp file %v", err) } fn := func() string { r := NewCompositeCache() if err := r.AddPath(tmpDir, util.FileContext{}); err != nil { t.Errorf("expected error to be nil but was %v", err) } if len(r.keys) != 1 { t.Errorf("expected len of keys to be 1 but was %v", len(r.keys)) } hash, err := r.Hash() if err != nil { t.Errorf("couldnt generate hash from test cache") } return hash } hash1 := fn() hash2 := fn() if hash1 != hash2 { t.Errorf("expected hash %v to equal hash %v", hash1, hash2) } } func Test_CompositeCache_AddPath_file(t *testing.T) { tmpfile, err := os.CreateTemp("/tmp", "foo.txt") if err != nil { t.Errorf("got error setting up test %v", err) } defer os.Remove(tmpfile.Name()) // clean up content := `meow meow meow` if _, err := tmpfile.Write([]byte(content)); err != nil { t.Errorf("got error writing temp file %v", err) } if err := tmpfile.Close(); err != nil { t.Errorf("got error closing temp file %v", err) } p := tmpfile.Name() fn := func() string { r := NewCompositeCache() if err := r.AddPath(p, util.FileContext{}); err != nil { t.Errorf("expected error to be nil but was %v", err) } if len(r.keys) != 1 { t.Errorf("expected len of keys to be 1 but was %v", len(r.keys)) } hash, err := r.Hash() if err != nil { t.Errorf("couldnt generate hash from test cache") } return hash } hash1 := fn() hash2 := fn() if hash1 != hash2 { t.Errorf("expected hash %v to equal hash %v", hash1, hash2) } } func createFilesystemStructure(root string, directories, files []string) error { for _, d := range directories { dirPath := path.Join(root, d) if err := os.MkdirAll(dirPath, 0755); err != nil { return err } } for _, fileName := range files { filePath := path.Join(root, fileName) err := os.WriteFile(filePath, []byte(fileName), 0644) if err != nil { return err } } return nil } func setIgnoreContext(t *testing.T, content string) (util.FileContext, error) { var fileContext util.FileContext dockerIgnoreDir := t.TempDir() err := os.WriteFile(dockerIgnoreDir+".dockerignore", []byte(content), 0644) if err != nil { return fileContext, err } return util.NewFileContextFromDockerfile(dockerIgnoreDir, "") } func hashDirectory(dirpath string, fileContext util.FileContext) (string, error) { cache1 := NewCompositeCache() err := cache1.AddPath(dirpath, fileContext) if err != nil { return "", err } hash, err := cache1.Hash() if err != nil { return "", err } return hash, nil } func Test_CompositeKey_AddPath_Works(t *testing.T) { tests := []struct { name string directories []string files []string }{ { name: "empty", directories: []string{}, files: []string{}, }, { name: "dirs", directories: []string{"foo", "bar", "foobar", "f/o/o"}, files: []string{}, }, { name: "files", directories: []string{}, files: []string{"foo", "bar", "foobar"}, }, { name: "all", directories: []string{"foo", "bar"}, files: []string{"foo/bar", "bar/baz", "foobar"}, }, } fileContext := util.FileContext{} for _, test := range tests { t.Run(test.name, func(t *testing.T) { testDir1 := t.TempDir() err := createFilesystemStructure(testDir1, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } testDir2 := t.TempDir() err = createFilesystemStructure(testDir2, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } hash1, err := hashDirectory(testDir1, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } hash2, err := hashDirectory(testDir2, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } if hash1 != hash2 { t.Errorf("Expected equal hashes, got: %s and %s", hash1, hash2) } }) } } func Test_CompositeKey_AddPath_WithExtraFile_Works(t *testing.T) { tests := []struct { name string directories []string files []string extraFile string }{ { name: "empty", directories: []string{}, files: []string{}, extraFile: "file", }, { name: "dirs", directories: []string{"foo", "bar", "foobar", "f/o/o"}, files: []string{}, extraFile: "f/o/o/extra", }, { name: "files", directories: []string{}, files: []string{"foo", "bar", "foobar"}, extraFile: "foo.extra", }, { name: "all", directories: []string{"foo", "bar"}, files: []string{"foo/bar", "bar/baz", "foobar"}, extraFile: "bar/extra", }, } fileContext := util.FileContext{} for _, test := range tests { t.Run(test.name, func(t *testing.T) { testDir1 := t.TempDir() err := createFilesystemStructure(testDir1, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } testDir2 := t.TempDir() err = createFilesystemStructure(testDir2, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } extraPath := path.Join(testDir2, test.extraFile) err = os.WriteFile(extraPath, []byte(test.extraFile), 0644) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } hash1, err := hashDirectory(testDir1, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } hash2, err := hashDirectory(testDir2, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } if hash1 == hash2 { t.Errorf("Expected different hashes, got: %s and %s", hash1, hash2) } }) } } func Test_CompositeKey_AddPath_WithExtraDir_Works(t *testing.T) { tests := []struct { name string directories []string files []string extraDir string }{ { name: "empty", directories: []string{}, files: []string{}, extraDir: "extra", }, { name: "dirs", directories: []string{"foo", "bar", "foobar", "f/o/o"}, files: []string{}, extraDir: "f/o/o/extra", }, { name: "files", directories: []string{}, files: []string{"foo", "bar", "foobar"}, extraDir: "foo.extra", }, { name: "all", directories: []string{"foo", "bar"}, files: []string{"foo/bar", "bar/baz", "foobar"}, extraDir: "bar/extra", }, } fileContext := util.FileContext{} for _, test := range tests { t.Run(test.name, func(t *testing.T) { testDir1 := t.TempDir() err := createFilesystemStructure(testDir1, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } testDir2 := t.TempDir() err = createFilesystemStructure(testDir2, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } extraPath := path.Join(testDir2, test.extraDir) err = os.MkdirAll(extraPath, 0644) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } hash1, err := hashDirectory(testDir1, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } hash2, err := hashDirectory(testDir2, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } if hash1 == hash2 { t.Errorf("Expected different hashes, got: %s and %s", hash1, hash2) } }) } } func Test_CompositeKey_AddPath_WithExtraFilIgnored_Works(t *testing.T) { tests := []struct { name string directories []string files []string extraFile string }{ { name: "empty", directories: []string{}, files: []string{}, extraFile: "extra", }, { name: "dirs", directories: []string{"foo", "bar", "foobar", "f/o/o"}, files: []string{}, extraFile: "f/o/o/extra", }, { name: "files", directories: []string{}, files: []string{"foo", "bar", "foobar"}, extraFile: "extra", }, { name: "all", directories: []string{"foo", "bar"}, files: []string{"foo/bar", "bar/baz", "foobar"}, extraFile: "bar/extra", }, } fileContext, err := setIgnoreContext(t, "**/extra") if err != nil { t.Fatalf("Error setting exlusion context: %s", err) } for _, test := range tests { t.Run(test.name, func(t *testing.T) { testDir1 := t.TempDir() err = createFilesystemStructure(testDir1, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } testDir2 := t.TempDir() err = createFilesystemStructure(testDir2, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } extraPath := path.Join(testDir2, test.extraFile) err = os.WriteFile(extraPath, []byte(test.extraFile), 0644) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } hash1, err := hashDirectory(testDir1, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } hash2, err := hashDirectory(testDir2, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } if hash1 != hash2 { t.Errorf("Expected equal hashes, got: %s and %s", hash1, hash2) } }) } } func Test_CompositeKey_AddPath_WithExtraDirIgnored_Works(t *testing.T) { tests := []struct { name string directories []string files []string extraDir string }{ { name: "empty", directories: []string{}, files: []string{}, extraDir: "extra", }, { name: "dirs", directories: []string{"foo", "bar", "foobar", "f/o/o"}, files: []string{}, extraDir: "f/o/o/extra", }, { name: "files", directories: []string{}, files: []string{"foo", "bar", "foobar"}, extraDir: "extra", }, { name: "all", directories: []string{"foo", "bar"}, files: []string{"foo/bar", "bar/baz", "foobar"}, extraDir: "bar/extra", }, } fileContext, err := setIgnoreContext(t, "**/extra") if err != nil { t.Fatalf("Error setting exlusion context: %s", err) } for _, test := range tests { t.Run(test.name, func(t *testing.T) { testDir1 := t.TempDir() err := createFilesystemStructure(testDir1, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } testDir2 := t.TempDir() err = createFilesystemStructure(testDir2, test.directories, test.files) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } extraPath := path.Join(testDir2, test.extraDir) err = os.MkdirAll(extraPath, 0644) if err != nil { t.Fatalf("Error creating filesytem structure: %s", err) } hash1, err := hashDirectory(testDir1, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } hash2, err := hashDirectory(testDir2, fileContext) if err != nil { t.Fatalf("Failed to calculate hash: %s", err) } if hash1 != hash2 { t.Errorf("Expected equal hashes, got: %s and %s", hash1, hash2) } }) } } ================================================ FILE: pkg/executor/copy_multistage_test.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package executor import ( "fmt" "io/fs" "os" "path/filepath" "testing" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/testutil" ) func readDirectory(dirName string) ([]fs.FileInfo, error) { entries, err := os.ReadDir(dirName) if err != nil { return nil, err } testDir := make([]fs.FileInfo, 0, len(entries)) for _, entry := range entries { info, err := entry.Info() if err != nil { return nil, err } testDir = append(testDir, info) } return testDir, err } func TestCopyCommand_Multistage(t *testing.T) { t.Run("copy a file across multistage", func(t *testing.T) { testDir, fn := setupMultistageTests(t) defer fn() dockerFile := ` FROM scratch as first COPY foo/bam.txt copied/ ENV test test From scratch as second COPY --from=first copied/bam.txt output/bam.txt` os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755) opts := &config.KanikoOptions{ DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"), SrcContext: filepath.Join(testDir, "workspace"), SnapshotMode: constants.SnapshotModeFull, } _, err := DoBuild(opts) testutil.CheckNoError(t, err) // Check Image has one layer bam.txt files, err := readDirectory(filepath.Join(testDir, "output")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 1, len(files)) testutil.CheckDeepEqual(t, files[0].Name(), "bam.txt") }) t.Run("copy a file across multistage into a directory", func(t *testing.T) { testDir, fn := setupMultistageTests(t) defer fn() dockerFile := ` FROM scratch as first COPY foo/bam.txt copied/ ENV test test From scratch as second COPY --from=first copied/bam.txt output/` os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755) opts := &config.KanikoOptions{ DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"), SrcContext: filepath.Join(testDir, "workspace"), SnapshotMode: constants.SnapshotModeFull, } _, err := DoBuild(opts) testutil.CheckNoError(t, err) files, err := readDirectory(filepath.Join(testDir, "output")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 1, len(files)) testutil.CheckDeepEqual(t, files[0].Name(), "bam.txt") }) t.Run("copy directory across multistage into a directory", func(t *testing.T) { testDir, fn := setupMultistageTests(t) defer fn() dockerFile := ` FROM scratch as first COPY foo copied ENV test test From scratch as second COPY --from=first copied another` os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755) opts := &config.KanikoOptions{ DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"), SrcContext: filepath.Join(testDir, "workspace"), SnapshotMode: constants.SnapshotModeFull, } _, err := DoBuild(opts) testutil.CheckNoError(t, err) // Check Image has one layer bam.txt files, err := readDirectory(filepath.Join(testDir, "another")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 2, len(files)) testutil.CheckDeepEqual(t, files[0].Name(), "bam.link") testutil.CheckDeepEqual(t, files[1].Name(), "bam.txt") // TODO fix this // path := filepath.Join(testDir, "output/another", "bam.link") //linkName, err := os.Readlink(path) //if err != nil { // t.Fatal(err) //} //testutil.CheckDeepEqual(t, linkName, "bam.txt") }) t.Run("copy root across multistage", func(t *testing.T) { testDir, fn := setupMultistageTests(t) defer fn() dockerFile := ` FROM scratch as first COPY foo copied ENV test test From scratch as second COPY --from=first / output/` os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755) opts := &config.KanikoOptions{ DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"), SrcContext: filepath.Join(testDir, "workspace"), SnapshotMode: constants.SnapshotModeFull, } _, err := DoBuild(opts) testutil.CheckNoError(t, err) filesUnderRoot, err := os.ReadDir(filepath.Join(testDir, "output/")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 3, len(filesUnderRoot)) files, err := os.ReadDir(filepath.Join(testDir, "output/workspace/foo")) if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, 2, len(files)) testutil.CheckDeepEqual(t, "bam.link", files[0].Name()) testutil.CheckDeepEqual(t, "bam.txt", files[1].Name()) }) } func setupMultistageTests(t *testing.T) (string, func()) { testDir := t.TempDir() // Create workspace with files, dirs, and symlinks // workspace tree: // /root // /kaniko // /workspace // - /foo // - bam.txt // - bam.link -> bam.txt // - /bin // - exec.link -> ../exec // exec // Make directory for stage or else the executor will create with permissions 0664 // and we will run into issue https://github.com/golang/go/issues/22323 if err := os.MkdirAll(filepath.Join(testDir, "kaniko/0"), 0755); err != nil { t.Fatal(err) } workspace := filepath.Join(testDir, "workspace") // Make foo if err := os.MkdirAll(filepath.Join(workspace, "foo"), 0755); err != nil { t.Fatal(err) } file := filepath.Join(workspace, "foo", "bam.txt") if err := os.WriteFile(file, []byte("meow"), 0755); err != nil { t.Fatal(err) } os.Symlink("bam.txt", filepath.Join(workspace, "foo", "bam.link")) // Make a file with contents link file = filepath.Join(workspace, "exec") if err := os.WriteFile(file, []byte("woof"), 0755); err != nil { t.Fatal(err) } // Make bin if err := os.MkdirAll(filepath.Join(workspace, "bin"), 0755); err != nil { t.Fatal(err) } os.Symlink("../exec", filepath.Join(workspace, "bin", "exec.link")) // set up config config.RootDir = testDir config.KanikoDir = fmt.Sprintf("%s/%s", testDir, "kaniko") // Write path to ignore list if err := os.MkdirAll(filepath.Join(testDir, "proc"), 0755); err != nil { t.Fatal(err) } mFile := filepath.Join(testDir, "proc/mountinfo") mountInfo := fmt.Sprintf( `36 35 98:0 /kaniko %s/kaniko rw,noatime master:1 - ext3 /dev/root rw,errors=continue 36 35 98:0 /proc %s/proc rw,noatime master:1 - ext3 /dev/root rw,errors=continue `, testDir, testDir) if err := os.WriteFile(mFile, []byte(mountInfo), 0644); err != nil { t.Fatal(err) } config.MountInfoPath = mFile return testDir, func() { config.RootDir = constants.RootDir config.MountInfoPath = constants.MountInfoPath } } ================================================ FILE: pkg/executor/fakes.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // for use in tests package executor import ( "bytes" "errors" "io" "github.com/GoogleContainerTools/kaniko/pkg/commands" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/types" ) type fakeSnapShotter struct { file string tarPath string initialized bool } func (f *fakeSnapShotter) Init() error { f.initialized = true return nil } func (f *fakeSnapShotter) TakeSnapshotFS() (string, error) { return f.tarPath, nil } func (f *fakeSnapShotter) TakeSnapshot(_ []string, _, _ bool) (string, error) { return f.tarPath, nil } type MockDockerCommand struct { command string contextFiles []string cacheCommand commands.DockerCommand argToCompositeCache bool } func (m MockDockerCommand) ExecuteCommand(c *v1.Config, args *dockerfile.BuildArgs) error { return nil } func (m MockDockerCommand) String() string { return m.command } func (m MockDockerCommand) FilesToSnapshot() []string { return []string{"meow-snapshot-no-cache"} } func (m MockDockerCommand) ProvidesFilesToSnapshot() bool { return true } func (m MockDockerCommand) CacheCommand(image v1.Image) commands.DockerCommand { return m.cacheCommand } func (m MockDockerCommand) FilesUsedFromContext(c *v1.Config, args *dockerfile.BuildArgs) ([]string, error) { return m.contextFiles, nil } func (m MockDockerCommand) MetadataOnly() bool { return false } func (m MockDockerCommand) RequiresUnpackedFS() bool { return false } func (m MockDockerCommand) ShouldCacheOutput() bool { return true } func (m MockDockerCommand) ShouldDetectDeletedFiles() bool { return false } func (m MockDockerCommand) IsArgsEnvsRequiredInCache() bool { return m.argToCompositeCache } type MockCachedDockerCommand struct { contextFiles []string argToCompositeCache bool } func (m MockCachedDockerCommand) ExecuteCommand(c *v1.Config, args *dockerfile.BuildArgs) error { return nil } func (m MockCachedDockerCommand) String() string { return "meow" } func (m MockCachedDockerCommand) FilesToSnapshot() []string { return []string{"meow-snapshot"} } func (m MockCachedDockerCommand) ProvidesFilesToSnapshot() bool { return true } func (m MockCachedDockerCommand) CacheCommand(image v1.Image) commands.DockerCommand { return nil } func (m MockCachedDockerCommand) ShouldDetectDeletedFiles() bool { return false } func (m MockCachedDockerCommand) FilesUsedFromContext(c *v1.Config, args *dockerfile.BuildArgs) ([]string, error) { return m.contextFiles, nil } func (m MockCachedDockerCommand) MetadataOnly() bool { return false } func (m MockCachedDockerCommand) RequiresUnpackedFS() bool { return false } func (m MockCachedDockerCommand) ShouldCacheOutput() bool { return false } func (m MockCachedDockerCommand) IsArgsEnvsRequiredInCache() bool { return m.argToCompositeCache } type fakeLayerCache struct { retrieve bool receivedKeys []string img v1.Image keySequence []string } func (f *fakeLayerCache) RetrieveLayer(key string) (v1.Image, error) { f.receivedKeys = append(f.receivedKeys, key) if len(f.keySequence) > 0 { if f.keySequence[0] == key { f.keySequence = f.keySequence[1:] return f.img, nil } return f.img, errors.New("could not find layer") } if !f.retrieve { return nil, errors.New("could not find layer") } return f.img, nil } type fakeLayer struct { TarContent []byte mediaType types.MediaType } func (f fakeLayer) Digest() (v1.Hash, error) { return v1.Hash{}, nil } func (f fakeLayer) DiffID() (v1.Hash, error) { return v1.Hash{}, nil } func (f fakeLayer) Compressed() (io.ReadCloser, error) { return nil, nil } func (f fakeLayer) Uncompressed() (io.ReadCloser, error) { return io.NopCloser(bytes.NewReader(f.TarContent)), nil } func (f fakeLayer) Size() (int64, error) { return 0, nil } func (f fakeLayer) MediaType() (types.MediaType, error) { return f.mediaType, nil } type fakeImage struct { ImageLayers []v1.Layer } func (f fakeImage) Layers() ([]v1.Layer, error) { return f.ImageLayers, nil } func (f fakeImage) MediaType() (types.MediaType, error) { return "", nil } func (f fakeImage) Size() (int64, error) { return 0, nil } func (f fakeImage) ConfigName() (v1.Hash, error) { return v1.Hash{}, nil } func (f fakeImage) ConfigFile() (*v1.ConfigFile, error) { return &v1.ConfigFile{}, nil } func (f fakeImage) RawConfigFile() ([]byte, error) { return []byte{}, nil } func (f fakeImage) Digest() (v1.Hash, error) { return v1.Hash{}, nil } func (f fakeImage) Manifest() (*v1.Manifest, error) { return &v1.Manifest{}, nil } func (f fakeImage) RawManifest() ([]byte, error) { return []byte{}, nil } func (f fakeImage) LayerByDigest(v1.Hash) (v1.Layer, error) { return fakeLayer{}, nil } func (f fakeImage) LayerByDiffID(v1.Hash) (v1.Layer, error) { return fakeLayer{}, nil } type ociFakeImage struct { *fakeImage } func (f ociFakeImage) MediaType() (types.MediaType, error) { return types.OCIManifestSchema1, nil } type dockerFakeImage struct { *fakeImage } func (f dockerFakeImage) MediaType() (types.MediaType, error) { return types.DockerManifestSchema2, nil } ================================================ FILE: pkg/executor/push.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package executor import ( "bytes" "encoding/json" "fmt" "net/http" "os" "path/filepath" "strings" "time" "github.com/GoogleContainerTools/kaniko/pkg/cache" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/creds" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/pkg/version" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/layout" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/remote/transport" "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/google/go-containerregistry/pkg/v1/types" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/spf13/afero" ) type withUserAgent struct { t http.RoundTripper } // for testing var ( newRetry = transport.NewRetry DummyDestinations = []string{DummyDestination} ) const ( UpstreamClientUaKey = "UPSTREAM_CLIENT_TYPE" DummyDestination = "docker.io/unset-repo/unset-image-name" ) var ( // known tag immutability errors errTagImmutable = []string{ // https://cloud.google.com/artifact-registry/docs/docker/troubleshoot#push "The repository has enabled tag immutability", // https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html "cannot be overwritten because the repository is immutable", } ) func (w *withUserAgent) RoundTrip(r *http.Request) (*http.Response, error) { ua := []string{fmt.Sprintf("kaniko/%s", version.Version())} if upstream := os.Getenv(UpstreamClientUaKey); upstream != "" { ua = append(ua, upstream) } r.Header.Set("User-Agent", strings.Join(ua, ",")) return w.t.RoundTrip(r) } // for testing var ( newOsFs = afero.NewOsFs() checkRemotePushPermission = remote.CheckPushPermission ) // CheckPushPermissions checks that the configured credentials can be used to // push to every specified destination. func CheckPushPermissions(opts *config.KanikoOptions) error { targets := opts.Destinations // When no push and no push cache are set, we don't need to check permissions if opts.SkipPushPermissionCheck { targets = []string{} } else if opts.NoPush && opts.NoPushCache { targets = []string{} } else if opts.NoPush && !opts.NoPushCache { // When no push is set, we want to check permissions for the cache repo // instead of the destinations if isOCILayout(opts.CacheRepo) { targets = []string{} // no need to check push permissions if we're just writing to disk } else { targets = []string{opts.CacheRepo} } } checked := map[string]bool{} for _, destination := range targets { destRef, err := name.NewTag(destination, name.WeakValidation) if err != nil { return errors.Wrap(err, "getting tag for destination") } if checked[destRef.Context().String()] { continue } registryName := destRef.Repository.Registry.Name() if opts.Insecure || opts.InsecureRegistries.Contains(registryName) { newReg, err := name.NewRegistry(registryName, name.WeakValidation, name.Insecure) if err != nil { return errors.Wrap(err, "getting new insecure registry") } destRef.Repository.Registry = newReg } rt, err := util.MakeTransport(opts.RegistryOptions, registryName) if err != nil { return errors.Wrapf(err, "making transport for registry %q", registryName) } tr := newRetry(rt) if err := checkRemotePushPermission(destRef, creds.GetKeychain(), tr); err != nil { return errors.Wrapf(err, "checking push permission for %q", destRef) } checked[destRef.Context().String()] = true } return nil } func getDigest(image v1.Image) ([]byte, error) { digest, err := image.Digest() if err != nil { return nil, err } return []byte(digest.String()), nil } func writeDigestFile(path string, digestByteArray []byte) error { if strings.HasPrefix(path, "https://") { // Do a HTTP PUT to the URL; this could be a pre-signed URL to S3 or GCS or Azure req, err := http.NewRequest("PUT", path, bytes.NewReader(digestByteArray)) //nolint:noctx if err != nil { return err } req.Header.Set("Content-Type", "text/plain") _, err = http.DefaultClient.Do(req) return err } parentDir := filepath.Dir(path) if _, err := os.Stat(parentDir); os.IsNotExist(err) { if err := os.MkdirAll(parentDir, 0700); err != nil { logrus.Debugf("Error creating %s, %s", parentDir, err) return err } logrus.Tracef("Created directory %v", parentDir) } return os.WriteFile(path, digestByteArray, 0644) } // DoPush is responsible for pushing image to the destinations specified in opts. // A dummy destination would be set when --no-push is set to true and --tar-path // is not empty with empty --destinations. func DoPush(image v1.Image, opts *config.KanikoOptions) error { t := timing.Start("Total Push Time") var digestByteArray []byte var builder strings.Builder if !opts.NoPush && len(opts.Destinations) == 0 { return errors.New("must provide at least one destination to push") } if opts.DigestFile != "" || opts.ImageNameDigestFile != "" || opts.ImageNameTagDigestFile != "" { var err error digestByteArray, err = getDigest(image) if err != nil { return errors.Wrap(err, "error fetching digest") } } if opts.DigestFile != "" { err := writeDigestFile(opts.DigestFile, digestByteArray) if err != nil { return errors.Wrap(err, "writing digest to file failed") } } if opts.OCILayoutPath != "" { path, err := layout.Write(opts.OCILayoutPath, empty.Index) if err != nil { return errors.Wrap(err, "writing empty layout") } if err := path.AppendImage(image); err != nil { return errors.Wrap(err, "appending image") } } if opts.NoPush && len(opts.Destinations) == 0 { if opts.TarPath != "" { setDummyDestinations(opts) } } destRefs := []name.Tag{} for _, destination := range opts.Destinations { destRef, err := name.NewTag(destination, name.WeakValidation) if err != nil { return errors.Wrap(err, "getting tag for destination") } if opts.ImageNameDigestFile != "" || opts.ImageNameTagDigestFile != "" { tag := "" if opts.ImageNameTagDigestFile != "" && destRef.TagStr() != "" { tag = ":" + destRef.TagStr() } imageName := []byte(destRef.Repository.Name() + tag + "@") builder.Write(append(imageName, digestByteArray...)) builder.WriteString("\n") } destRefs = append(destRefs, destRef) } if opts.ImageNameDigestFile != "" { err := writeDigestFile(opts.ImageNameDigestFile, []byte(builder.String())) if err != nil { return errors.Wrap(err, "writing image name with digest to file failed") } } if opts.ImageNameTagDigestFile != "" { err := writeDigestFile(opts.ImageNameTagDigestFile, []byte(builder.String())) if err != nil { return errors.Wrap(err, "writing image name with image tag and digest to file failed") } } if opts.TarPath != "" { tagToImage := map[name.Tag]v1.Image{} for _, destRef := range destRefs { tagToImage[destRef] = image } err := tarball.MultiWriteToFile(opts.TarPath, tagToImage) if err != nil { return errors.Wrap(err, "writing tarball to file failed") } } if opts.NoPush { logrus.Info("Skipping push to container registry due to --no-push flag") return nil } // continue pushing unless an error occurs for _, destRef := range destRefs { registryName := destRef.Repository.Registry.Name() if opts.Insecure || opts.InsecureRegistries.Contains(registryName) { newReg, err := name.NewRegistry(registryName, name.WeakValidation, name.Insecure) if err != nil { return errors.Wrap(err, "getting new insecure registry") } destRef.Repository.Registry = newReg } pushAuth, err := creds.GetKeychain().Resolve(destRef.Context().Registry) if err != nil { return errors.Wrap(err, "resolving pushAuth") } localRt, err := util.MakeTransport(opts.RegistryOptions, registryName) if err != nil { return errors.Wrapf(err, "making transport for registry %q", registryName) } tr := newRetry(localRt) rt := &withUserAgent{t: tr} logrus.Infof("Pushing image to %s", destRef.String()) retryFunc := func() error { dig, err := image.Digest() if err != nil { return err } digest := destRef.Context().Digest(dig.String()) if err := remote.Write(destRef, image, remote.WithAuth(pushAuth), remote.WithTransport(rt)); err != nil { if !opts.PushIgnoreImmutableTagErrors { return err } // check for known "tag immutable" errors errStr := err.Error() for _, candidate := range errTagImmutable { if strings.Contains(errStr, candidate) { logrus.Infof("Immutable tag error ignored for %s", digest) return nil } } return err } logrus.Infof("Pushed %s", digest) return nil } if err := util.Retry(retryFunc, opts.PushRetry, 1000); err != nil { return errors.Wrap(err, fmt.Sprintf("failed to push to destination %s", destRef)) } } timing.DefaultRun.Stop(t) return writeImageOutputs(image, destRefs) } func writeImageOutputs(image v1.Image, destRefs []name.Tag) error { dir := os.Getenv("BUILDER_OUTPUT") if dir == "" { return nil } f, err := newOsFs.Create(filepath.Join(dir, "images")) if err != nil { return err } defer f.Close() d, err := image.Digest() if err != nil { return err } type imageOutput struct { Name string `json:"name"` Digest string `json:"digest"` } for _, r := range destRefs { if err := json.NewEncoder(f).Encode(imageOutput{ Name: r.String(), Digest: d.String(), }); err != nil { return err } } return nil } // pushLayerToCache pushes layer (tagged with cacheKey) to opts.CacheRepo // if opts.CacheRepo doesn't exist, infer the cache from the given destination func pushLayerToCache(opts *config.KanikoOptions, cacheKey string, tarPath string, createdBy string) error { var layerOpts []tarball.LayerOption if opts.CompressedCaching == true { layerOpts = append(layerOpts, tarball.WithCompressedCaching) } if opts.CompressionLevel > 0 { layerOpts = append(layerOpts, tarball.WithCompressionLevel(opts.CompressionLevel)) } switch opts.Compression { case config.ZStd: layerOpts = append(layerOpts, tarball.WithCompression("zstd"), tarball.WithMediaType(types.OCILayerZStd)) case config.GZip: // layer already gzipped by default } layer, err := tarball.LayerFromFile(tarPath, layerOpts...) if err != nil { return err } cache, err := cache.Destination(opts, cacheKey) if err != nil { return errors.Wrap(err, "getting cache destination") } logrus.Infof("Pushing layer %s to cache now", cache) empty := empty.Image empty, err = mutate.CreatedAt(empty, v1.Time{Time: time.Now()}) if err != nil { return errors.Wrap(err, "setting empty image created time") } empty, err = mutate.Append(empty, mutate.Addendum{ Layer: layer, History: v1.History{ Author: constants.Author, CreatedBy: createdBy, }, }, ) if err != nil { return errors.Wrap(err, "appending layer onto empty image") } cacheOpts := *opts cacheOpts.TarPath = "" // tarPath doesn't make sense for Docker layers cacheOpts.NoPush = opts.NoPushCache // we do not want to push cache if --no-push-cache is set. cacheOpts.Destinations = []string{cache} cacheOpts.InsecureRegistries = opts.InsecureRegistries cacheOpts.SkipTLSVerifyRegistries = opts.SkipTLSVerifyRegistries if isOCILayout(cache) { cacheOpts.OCILayoutPath = strings.TrimPrefix(cache, "oci:") cacheOpts.NoPush = true } return DoPush(empty, &cacheOpts) } // setDummyDestinations sets the dummy destinations required to generate new // tag names for tarPath in DoPush. func setDummyDestinations(opts *config.KanikoOptions) { opts.Destinations = DummyDestinations } ================================================ FILE: pkg/executor/push_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package executor import ( "bytes" "fmt" "io" "net/http" "net/http/httptest" "os" "path/filepath" "testing" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/testutil" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/v1/layout" "github.com/google/go-containerregistry/pkg/v1/random" "github.com/google/go-containerregistry/pkg/v1/validate" "github.com/spf13/afero" ) func mustTag(t *testing.T, s string) name.Tag { tag, err := name.NewTag(s, name.StrictValidation) if err != nil { t.Fatalf("NewTag: %v", err) } return tag } func TestWriteImageOutputs(t *testing.T) { img, err := random.Image(1024, 3) if err != nil { t.Fatalf("random.Image: %v", err) } d, err := img.Digest() if err != nil { t.Fatalf("Digest: %v", err) } for _, c := range []struct { desc, env string tags []name.Tag want string }{{ desc: "env unset, no output", env: "", }, { desc: "env set, one tag", env: "/foo", tags: []name.Tag{mustTag(t, "gcr.io/foo/bar:latest")}, want: fmt.Sprintf(`{"name":"gcr.io/foo/bar:latest","digest":%q} `, d), }, { desc: "env set, two tags", env: "/foo", tags: []name.Tag{ mustTag(t, "gcr.io/foo/bar:latest"), mustTag(t, "gcr.io/baz/qux:latest"), }, want: fmt.Sprintf(`{"name":"gcr.io/foo/bar:latest","digest":%q} {"name":"gcr.io/baz/qux:latest","digest":%q} `, d, d), }} { t.Run(c.desc, func(t *testing.T) { newOsFs = afero.NewMemMapFs() if c.want == "" { newOsFs = afero.NewReadOnlyFs(newOsFs) // No files should be written. } os.Setenv("BUILDER_OUTPUT", c.env) if err := writeImageOutputs(img, c.tags); err != nil { t.Fatalf("writeImageOutputs: %v", err) } if c.want == "" { return } b, err := afero.ReadFile(newOsFs, filepath.Join(c.env, "images")) if err != nil { t.Fatalf("ReadFile: %v", err) } if got := string(b); got != c.want { t.Fatalf(" got: %s\nwant: %s", got, c.want) } }) } } func TestHeaderAdded(t *testing.T) { tests := []struct { name string upstream string expected string }{{ name: "upstream env variable set", upstream: "skaffold-v0.25.45", expected: "kaniko/unset,skaffold-v0.25.45", }, { name: "upstream env variable not set", expected: "kaniko/unset", }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { rt := &withUserAgent{t: &mockRoundTripper{}} if test.upstream != "" { os.Setenv("UPSTREAM_CLIENT_TYPE", test.upstream) defer func() { os.Unsetenv("UPSTREAM_CLIENT_TYPE") }() } req, err := http.NewRequest("GET", "dummy", nil) //nolint:noctx if err != nil { t.Fatalf("culd not create a req due to %s", err) } resp, err := rt.RoundTrip(req) testutil.CheckError(t, false, err) defer resp.Body.Close() body, err := io.ReadAll(resp.Body) testutil.CheckErrorAndDeepEqual(t, false, err, test.expected, string(body)) }) } } type mockRoundTripper struct { } func (m *mockRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { ua := r.UserAgent() return &http.Response{Body: io.NopCloser(bytes.NewBufferString(ua))}, nil } func TestOCILayoutPath(t *testing.T) { tmpDir := t.TempDir() image, err := random.Image(1024, 4) if err != nil { t.Fatalf("could not create image: %s", err) } digest, err := image.Digest() if err != nil { t.Fatalf("could not get image digest: %s", err) } want, err := image.Manifest() if err != nil { t.Fatalf("could not get image manifest: %s", err) } opts := config.KanikoOptions{ NoPush: true, OCILayoutPath: tmpDir, } if err := DoPush(image, &opts); err != nil { t.Fatalf("could not push image: %s", err) } layoutIndex, err := layout.ImageIndexFromPath(tmpDir) if err != nil { t.Fatalf("could not get index from layout: %s", err) } testutil.CheckError(t, false, validate.Index(layoutIndex)) layoutImage, err := layoutIndex.Image(digest) if err != nil { t.Fatalf("could not get image from layout: %s", err) } got, err := layoutImage.Manifest() testutil.CheckErrorAndDeepEqual(t, false, err, want, got) } func TestImageNameDigestFile(t *testing.T) { image, err := random.Image(1024, 4) if err != nil { t.Fatalf("could not create image: %s", err) } digest, err := image.Digest() if err != nil { t.Fatalf("could not get image digest: %s", err) } opts := config.KanikoOptions{ NoPush: true, Destinations: []string{"gcr.io/foo/bar:latest", "bob/image"}, ImageNameDigestFile: "tmpFile", } defer os.Remove("tmpFile") if err := DoPush(image, &opts); err != nil { t.Fatalf("could not push image: %s", err) } want := []byte("gcr.io/foo/bar@" + digest.String() + "\nindex.docker.io/bob/image@" + digest.String() + "\n") got, err := os.ReadFile("tmpFile") testutil.CheckErrorAndDeepEqual(t, false, err, want, got) } func TestDoPushWithOpts(t *testing.T) { tarPath := "image.tar" for _, tc := range []struct { name string opts config.KanikoOptions expectedErr bool }{ { name: "no push with tarPath without destinations", opts: config.KanikoOptions{ NoPush: true, TarPath: tarPath, }, expectedErr: false, }, { name: "no push with tarPath with destinations", opts: config.KanikoOptions{ NoPush: true, TarPath: tarPath, Destinations: []string{"image"}, }, expectedErr: false, }, { name: "no push with tarPath with destinations empty", opts: config.KanikoOptions{ NoPush: true, TarPath: tarPath, Destinations: []string{}, }, expectedErr: false, }, { name: "tarPath with destinations empty", opts: config.KanikoOptions{ NoPush: false, TarPath: tarPath, Destinations: []string{}, }, expectedErr: true, }} { t.Run(tc.name, func(t *testing.T) { image, err := random.Image(1024, 4) if err != nil { t.Fatalf("could not create image: %s", err) } defer os.Remove("image.tar") err = DoPush(image, &tc.opts) if err != nil { if !tc.expectedErr { t.Errorf("unexpected error with opts: could not push image: %s", err) } } else { if tc.expectedErr { t.Error("expected error with opts not found") } } }) } } func TestImageNameTagDigestFile(t *testing.T) { image, err := random.Image(1024, 4) if err != nil { t.Fatalf("could not create image: %s", err) } digest, err := image.Digest() if err != nil { t.Fatalf("could not get image digest: %s", err) } opts := config.KanikoOptions{ NoPush: true, Destinations: []string{"gcr.io/foo/bar:123", "bob/image"}, ImageNameTagDigestFile: "tmpFile", } defer os.Remove("tmpFile") if err := DoPush(image, &opts); err != nil { t.Fatalf("could not push image: %s", err) } want := []byte("gcr.io/foo/bar:123@" + digest.String() + "\nindex.docker.io/bob/image:latest@" + digest.String() + "\n") got, err := os.ReadFile("tmpFile") testutil.CheckErrorAndDeepEqual(t, false, err, want, got) } var checkPushPermsCallCount = 0 func resetCalledCount() { checkPushPermsCallCount = 0 } func fakeCheckPushPermission(ref name.Reference, kc authn.Keychain, t http.RoundTripper) error { checkPushPermsCallCount++ return nil } func TestCheckPushPermissions(t *testing.T) { tests := []struct { description string cacheRepo string checkPushPermsExpectedCallCount int destinations []string existingConfig bool noPush bool noPushCache bool }{ {description: "a gcr image without config", destinations: []string{"gcr.io/test-image"}, checkPushPermsExpectedCallCount: 1}, {description: "a gcr image with config", destinations: []string{"gcr.io/test-image"}, existingConfig: true, checkPushPermsExpectedCallCount: 1}, {description: "a pkg.dev image without config", destinations: []string{"us-docker.pkg.dev/test-image"}, checkPushPermsExpectedCallCount: 1}, {description: "a pkg.dev image with config", destinations: []string{"us-docker.pkg.dev/test-image"}, existingConfig: true, checkPushPermsExpectedCallCount: 1}, {description: "localhost registry without config", destinations: []string{"localhost:5000/test-image"}, checkPushPermsExpectedCallCount: 1}, {description: "localhost registry with config", destinations: []string{"localhost:5000/test-image"}, existingConfig: true, checkPushPermsExpectedCallCount: 1}, {description: "any other registry", destinations: []string{"notgcr.io/test-image"}, checkPushPermsExpectedCallCount: 1}, { description: "multiple destinations pushed to different registry", destinations: []string{ "us-central1-docker.pkg.dev/prj/test-image", "us-west-docker.pkg.dev/prj/test-image", }, checkPushPermsExpectedCallCount: 2, }, { description: "same image names with different tags", destinations: []string{ "us-central1-docker.pkg.dev/prj/test-image:tag1", "us-central1-docker.pkg.dev/prj/test-image:tag2", }, checkPushPermsExpectedCallCount: 1, }, { description: "same destination image multiple times", destinations: []string{ "us-central1-docker.pkg.dev/prj/test-image", "us-central1-docker.pkg.dev/prj/test-image", }, checkPushPermsExpectedCallCount: 1, }, { description: "no push and no push cache", destinations: []string{"us-central1-docker.pkg.dev/prj/test-image"}, checkPushPermsExpectedCallCount: 0, noPush: true, noPushCache: true, }, { description: "no push and push cache", destinations: []string{"us-central1-docker.pkg.dev/prj/test-image"}, cacheRepo: "us-central1-docker.pkg.dev/prj/cache-image", checkPushPermsExpectedCallCount: 1, noPush: true, }, { description: "no push and cache repo is OCI image layout", destinations: []string{"us-central1-docker.pkg.dev/prj/test-image"}, cacheRepo: "oci:/some-layout-path", checkPushPermsExpectedCallCount: 0, noPush: true, }, } checkRemotePushPermission = fakeCheckPushPermission for _, test := range tests { t.Run(test.description, func(t *testing.T) { resetCalledCount() newOsFs = afero.NewMemMapFs() opts := config.KanikoOptions{ CacheRepo: test.cacheRepo, Destinations: test.destinations, NoPush: test.noPush, NoPushCache: test.noPushCache, } if test.existingConfig { afero.WriteFile(newOsFs, util.DockerConfLocation(), []byte(""), os.FileMode(0644)) defer newOsFs.Remove(util.DockerConfLocation()) } CheckPushPermissions(&opts) if checkPushPermsCallCount != test.checkPushPermsExpectedCallCount { t.Errorf("expected check push permissions call count to be %d but it was %d", test.checkPushPermsExpectedCallCount, checkPushPermsCallCount) } }) } } func TestSkipPushPermission(t *testing.T) { tests := []struct { description string cacheRepo string checkPushPermsExpectedCallCount int destinations []string existingConfig bool noPush bool noPushCache bool skipPushPermission bool }{ {description: "skip push permission enabled", destinations: []string{"test.io/skip"}, checkPushPermsExpectedCallCount: 0, skipPushPermission: true}, {description: "skip push permission disabled", destinations: []string{"test.io/push"}, checkPushPermsExpectedCallCount: 1, skipPushPermission: false}, } checkRemotePushPermission = fakeCheckPushPermission for _, test := range tests { t.Run(test.description, func(t *testing.T) { resetCalledCount() newOsFs = afero.NewMemMapFs() opts := config.KanikoOptions{ CacheRepo: test.cacheRepo, Destinations: test.destinations, NoPush: test.noPush, NoPushCache: test.noPushCache, SkipPushPermissionCheck: test.skipPushPermission, } if test.existingConfig { afero.WriteFile(newOsFs, util.DockerConfLocation(), []byte(""), os.FileMode(0644)) defer newOsFs.Remove(util.DockerConfLocation()) } CheckPushPermissions(&opts) if checkPushPermsCallCount != test.checkPushPermsExpectedCallCount { t.Errorf("expected check push permissions call count to be %d but it was %d", test.checkPushPermsExpectedCallCount, checkPushPermsCallCount) } }) } } func TestHelperProcess(t *testing.T) { if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" { return } fmt.Fprintf(os.Stdout, "fake result") os.Exit(0) } func TestWriteDigestFile(t *testing.T) { tmpDir := t.TempDir() t.Run("parent directory does not exist", func(t *testing.T) { err := writeDigestFile(tmpDir+"/test/df", []byte("test")) if err != nil { t.Errorf("expected file to be written successfully, but got error: %v", err) } }) t.Run("parent directory exists", func(t *testing.T) { err := writeDigestFile(tmpDir+"/df", []byte("test")) if err != nil { t.Errorf("expected file to be written successfully, but got error: %v", err) } }) t.Run("https PUT OK", func(t *testing.T) { var uploadedContent []byte // Start a test server that checks the PUT request. server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPut { w.WriteHeader(http.StatusMethodNotAllowed) return } uploadedContent, _ = io.ReadAll(r.Body) w.WriteHeader(http.StatusNoContent) })) defer server.Close() // Temporarily replace the default client with the test server client to avoid TLS verification errors. oldClient := http.DefaultClient defer func() { http.DefaultClient = oldClient }() http.DefaultClient = server.Client() err := writeDigestFile(server.URL+"/df?sig=1234", []byte("test")) if err != nil { t.Fatalf("expected file to be written successfully, but got error: %v", err) } if string(uploadedContent) != "test" { t.Errorf("expected uploaded content to be 'test', but got '%s'", uploadedContent) } }) } ================================================ FILE: pkg/fakes/image.go ================================================ /* Copyright 2019 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package fakes import ( v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/types" ) type FakeImage struct { Hash v1.Hash } func (f FakeImage) Layers() ([]v1.Layer, error) { return nil, nil } func (f FakeImage) MediaType() (types.MediaType, error) { return "", nil } func (f FakeImage) Size() (int64, error) { return 0, nil } func (f FakeImage) ConfigName() (v1.Hash, error) { return v1.Hash{}, nil } func (f FakeImage) ConfigFile() (*v1.ConfigFile, error) { return &v1.ConfigFile{}, nil } func (f FakeImage) RawConfigFile() ([]byte, error) { return []byte{}, nil } func (f FakeImage) Digest() (v1.Hash, error) { return f.Hash, nil } func (f FakeImage) Manifest() (*v1.Manifest, error) { return &v1.Manifest{}, nil } func (f FakeImage) RawManifest() ([]byte, error) { return []byte{}, nil } func (f FakeImage) LayerByDigest(v1.Hash) (v1.Layer, error) { return nil, nil } func (f FakeImage) LayerByDiffID(v1.Hash) (v1.Layer, error) { return nil, nil } ================================================ FILE: pkg/filesystem/resolve.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package filesystem import ( "os" "path/filepath" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) // ResolvePaths takes a slice of file paths and a list of skipped file paths. It resolve each // file path according to a set of rules and then returns a slice of resolved paths or error. // File paths are resolved according to the following rules: // * If path is in ignorelist, skip it. // * If path is a symlink, resolve it's ancestor link and add it to the output set. // * If path is a symlink, resolve it's target. If the target is not ignored add it to the // output set. // * Add all ancestors of each path to the output set. func ResolvePaths(paths []string, wl []util.IgnoreListEntry) (pathsToAdd []string, err error) { logrus.Tracef("Resolving paths %s", paths) fileSet := make(map[string]bool) for _, f := range paths { // If the given path is part of the ignorelist ignore it if util.IsInProvidedIgnoreList(f, wl) { logrus.Debugf("Path %s is in list to ignore, ignoring it", f) continue } link, e := resolveSymlinkAncestor(f) if e != nil { continue } if f != link { logrus.Tracef("Updated link %s to %s", f, link) } if !fileSet[link] { pathsToAdd = append(pathsToAdd, link) } fileSet[link] = true var evaled string // If the path is a symlink we need to also consider the target of that // link evaled, e = filepath.EvalSymlinks(f) if e != nil { if !os.IsNotExist(e) { logrus.Errorf("Couldn't eval %s with link %s", f, link) return } logrus.Tracef("Symlink path %s, target does not exist", f) continue } if f != evaled { logrus.Tracef("Resolved symlink %s to %s", f, evaled) } // If the given path is a symlink and the target is part of the ignorelist // ignore the target if util.CheckCleanedPathAgainstProvidedIgnoreList(evaled, wl) { logrus.Debugf("Path %s is ignored, ignoring it", evaled) continue } if !fileSet[evaled] { pathsToAdd = append(pathsToAdd, evaled) } fileSet[evaled] = true } // Also add parent directories to keep the permission of them correctly. pathsToAdd = filesWithParentDirs(pathsToAdd) return } // filesWithParentDirs returns every ancestor path for each provided file path. // I.E. /foo/bar/baz/boom.txt => [/, /foo, /foo/bar, /foo/bar/baz, /foo/bar/baz/boom.txt] func filesWithParentDirs(files []string) []string { filesSet := map[string]bool{} for _, file := range files { file = filepath.Clean(file) filesSet[file] = true for _, dir := range util.ParentDirectories(file) { dir = filepath.Clean(dir) filesSet[dir] = true } } newFiles := []string{} for file := range filesSet { newFiles = append(newFiles, file) } return newFiles } // resolveSymlinkAncestor returns the ancestor link of the provided symlink path or returns the // path if it is not a link. The ancestor link is the filenode whose type is a Symlink. // E.G /baz/boom/bar.txt links to /usr/bin/bar.txt but /baz/boom/bar.txt itself is not a link. // Instead /bar/boom is actually a link to /usr/bin. In this case resolveSymlinkAncestor would // return /bar/boom. func resolveSymlinkAncestor(path string) (string, error) { if !filepath.IsAbs(path) { return "", errors.New("dest path must be abs") } last := "" newPath := filepath.Clean(path) loop: for newPath != config.RootDir { fi, err := os.Lstat(newPath) if err != nil { return "", errors.Wrap(err, "resolvePaths: failed to lstat") } if util.IsSymlink(fi) { last = filepath.Base(newPath) newPath = filepath.Dir(newPath) } else { // Even if the filenode pointed to by newPath is a regular file, // one of its ancestors could be a symlink. We call filepath.EvalSymlinks // to test whether there are any links in the path. If the output of // EvalSymlinks is different than the input we know one of the nodes in the // path is a link. target, err := filepath.EvalSymlinks(newPath) if err != nil { return "", err } if target != newPath { last = filepath.Base(newPath) newPath = filepath.Dir(newPath) } else { break loop } } } newPath = filepath.Join(newPath, last) return filepath.Clean(newPath), nil } ================================================ FILE: pkg/filesystem/resolve_test.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package filesystem import ( "fmt" "os" "path/filepath" "reflect" "sort" "testing" "github.com/GoogleContainerTools/kaniko/pkg/util" ) func Test_ResolvePaths(t *testing.T) { validateResults := func( t *testing.T, actualFiles, expectedFiles []string, err error, ) { if err != nil { t.Errorf("expected err to be nil but was %s", err) } // Sort so that comparison is against consistent order sort.Strings(actualFiles) sort.Strings(expectedFiles) if !reflect.DeepEqual(actualFiles, expectedFiles) { t.Errorf("expected files to equal %s but was %s", expectedFiles, actualFiles, ) } } t.Run("list of files", func(t *testing.T) { dir := t.TempDir() files := []string{ "/foo/bar.txt", "/baz/boom.txt", } t.Run("all are symlinks", func(t *testing.T) { for _, f := range files { fLink := filepath.Join(dir, "link", f) fTarget := filepath.Join(dir, "target", f) if err := os.MkdirAll(filepath.Dir(fTarget), 0777); err != nil { t.Fatal(err) } if err := os.WriteFile(fTarget, []byte{}, 0777); err != nil { t.Fatal(err) } if err := os.MkdirAll(filepath.Dir(fLink), 0777); err != nil { t.Fatal(err) } if err := os.Symlink(fTarget, fLink); err != nil { t.Fatal(err) } } t.Run("none are ignored", func(t *testing.T) { wl := []util.IgnoreListEntry{} inputFiles := []string{} expectedFiles := []string{} for _, f := range files { link := filepath.Join(dir, "link", f) expectedFiles = append(expectedFiles, link) inputFiles = append(inputFiles, link) target := filepath.Join(dir, "target", f) expectedFiles = append(expectedFiles, target) } expectedFiles = filesWithParentDirs(expectedFiles) files, err := ResolvePaths(inputFiles, wl) validateResults(t, files, expectedFiles, err) }) t.Run("some are ignored", func(t *testing.T) { wl := []util.IgnoreListEntry{ { Path: filepath.Join(dir, "link", "baz"), }, { Path: filepath.Join(dir, "target", "foo"), }, } expectedFiles := []string{} inputFiles := []string{} for _, f := range files { link := filepath.Join(dir, "link", f) inputFiles = append(inputFiles, link) if util.IsInProvidedIgnoreList(link, wl) { t.Logf("skipping %s", link) continue } expectedFiles = append(expectedFiles, link) target := filepath.Join(dir, "target", f) if util.IsInProvidedIgnoreList(target, wl) { t.Logf("skipping %s", target) continue } expectedFiles = append(expectedFiles, target) } link := filepath.Join(dir, "link", "zoom/") target := filepath.Join(dir, "target", "zaam/") if err := os.MkdirAll(target, 0777); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(target, "meow.txt"), []byte{}, 0777); err != nil { t.Fatal(err) } if err := os.Symlink(target, link); err != nil { t.Fatal(err) } file := filepath.Join(link, "meow.txt") inputFiles = append(inputFiles, file) expectedFiles = append(expectedFiles, link) targetFile := filepath.Join(target, "meow.txt") expectedFiles = append(expectedFiles, targetFile) expectedFiles = filesWithParentDirs(expectedFiles) files, err := ResolvePaths(inputFiles, wl) validateResults(t, files, expectedFiles, err) }) }) }) t.Run("empty set of files", func(t *testing.T) { inputFiles := []string{} expectedFiles := []string{} wl := []util.IgnoreListEntry{} files, err := ResolvePaths(inputFiles, wl) validateResults(t, files, expectedFiles, err) }) } func Test_resolveSymlinkAncestor(t *testing.T) { setupDirs := func(t *testing.T) (string, string) { testDir := t.TempDir() targetDir := filepath.Join(testDir, "bar", "baz") if err := os.MkdirAll(targetDir, 0777); err != nil { t.Fatal(err) } targetPath := filepath.Join(targetDir, "bam.txt") if err := os.WriteFile(targetPath, []byte("meow"), 0777); err != nil { t.Fatal(err) } return testDir, targetPath } t.Run("path is a symlink", func(t *testing.T) { testDir, targetPath := setupDirs(t) defer os.RemoveAll(testDir) linkDir := filepath.Join(testDir, "foo", "buzz") if err := os.MkdirAll(linkDir, 0777); err != nil { t.Fatal(err) } linkPath := filepath.Join(linkDir, "zoom.txt") if err := os.Symlink(targetPath, linkPath); err != nil { t.Fatal(err) } expected := linkPath actual, err := resolveSymlinkAncestor(linkPath) if err != nil { t.Errorf("expected err to be nil but was %s", err) } if actual != expected { t.Errorf("expected result to be %s not %s", expected, actual) } }) t.Run("dir ends with / is not a symlink", func(t *testing.T) { testDir, _ := setupDirs(t) defer os.RemoveAll(testDir) linkDir := filepath.Join(testDir, "var", "www") if err := os.MkdirAll(linkDir, 0777); err != nil { t.Fatal(err) } expected := linkDir actual, err := resolveSymlinkAncestor(fmt.Sprintf("%s/", linkDir)) if err != nil { t.Errorf("expected err to be nil but was %s", err) } if actual != expected { t.Errorf("expected result to be %s not %s", expected, actual) } }) t.Run("path is a dead symlink", func(t *testing.T) { testDir, targetPath := setupDirs(t) defer os.RemoveAll(testDir) linkDir := filepath.Join(testDir, "foo", "buzz") if err := os.MkdirAll(linkDir, 0777); err != nil { t.Fatal(err) } linkPath := filepath.Join(linkDir, "zoom.txt") if err := os.Symlink(targetPath, linkPath); err != nil { t.Fatal(err) } if err := os.Remove(targetPath); err != nil { t.Fatal(err) } expected := linkPath actual, err := resolveSymlinkAncestor(linkPath) if err != nil { t.Errorf("expected err to be nil but was %s", err) } if actual != expected { t.Errorf("expected result to be %s not %s", expected, actual) } }) t.Run("path is not a symlink", func(t *testing.T) { testDir, targetPath := setupDirs(t) defer os.RemoveAll(testDir) expected := targetPath actual, err := resolveSymlinkAncestor(targetPath) if err != nil { t.Errorf("expected err to be nil but was %s", err) } if actual != expected { t.Errorf("expected result to be %s not %s", expected, actual) } }) t.Run("parent of path is a symlink", func(t *testing.T) { testDir, targetPath := setupDirs(t) defer os.RemoveAll(testDir) targetDir := filepath.Dir(targetPath) linkDir := filepath.Join(testDir, "foo") if err := os.MkdirAll(linkDir, 0777); err != nil { t.Fatal(err) } linkDir = filepath.Join(linkDir, "gaz") if err := os.Symlink(targetDir, linkDir); err != nil { t.Fatal(err) } linkPath := filepath.Join(linkDir, filepath.Base(targetPath)) expected := linkDir actual, err := resolveSymlinkAncestor(linkPath) if err != nil { t.Errorf("expected err to be nil but was %s", err) } if actual != expected { t.Errorf("expected result to be %s not %s", expected, actual) } }) t.Run("parent of path is a dead symlink", func(t *testing.T) { testDir, targetPath := setupDirs(t) defer os.RemoveAll(testDir) targetDir := filepath.Dir(targetPath) linkDir := filepath.Join(testDir, "foo") if err := os.MkdirAll(linkDir, 0777); err != nil { t.Fatal(err) } linkDir = filepath.Join(linkDir, "gaz") if err := os.Symlink(targetDir, linkDir); err != nil { t.Fatal(err) } if err := os.RemoveAll(targetDir); err != nil { t.Fatal(err) } linkPath := filepath.Join(linkDir, filepath.Base(targetPath)) _, err := resolveSymlinkAncestor(linkPath) if err == nil { t.Error("expected err to not be nil") } }) t.Run("great grandparent of path is a symlink", func(t *testing.T) { testDir, targetPath := setupDirs(t) defer os.RemoveAll(testDir) targetDir := filepath.Dir(targetPath) linkDir := filepath.Join(testDir, "foo") if err := os.Symlink(filepath.Dir(targetDir), linkDir); err != nil { t.Fatal(err) } linkPath := filepath.Join( linkDir, filepath.Join( filepath.Base(targetDir), filepath.Base(targetPath), ), ) expected := linkDir actual, err := resolveSymlinkAncestor(linkPath) if err != nil { t.Errorf("expected err to be nil but was %s", err) } if actual != expected { t.Errorf("expected result to be %s not %s", expected, actual) } }) } ================================================ FILE: pkg/image/image_util.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package image import ( "fmt" "path/filepath" "strconv" "github.com/GoogleContainerTools/kaniko/pkg/cache" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/image/remote" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/sirupsen/logrus" ) var ( // RetrieveRemoteImage downloads an image from a remote location RetrieveRemoteImage = remote.RetrieveRemoteImage retrieveTarImage = tarballImage ) // RetrieveSourceImage returns the base image of the stage at index func RetrieveSourceImage(stage config.KanikoStage, opts *config.KanikoOptions) (v1.Image, error) { t := timing.Start("Retrieving Source Image") defer timing.DefaultRun.Stop(t) var buildArgs []string for _, marg := range stage.MetaArgs { for _, arg := range marg.Args { buildArgs = append(buildArgs, fmt.Sprintf("%s=%s", arg.Key, arg.ValueString())) } } buildArgs = append(buildArgs, opts.BuildArgs...) currentBaseName, err := util.ResolveEnvironmentReplacement(stage.BaseName, buildArgs, false) if err != nil { return nil, err } // First, check if the base image is a scratch image if currentBaseName == constants.NoBaseImage { logrus.Info("No base image, nothing to extract") return empty.Image, nil } // Next, check if the base image of the current stage is built from a previous stage // If so, retrieve the image from the stored tarball if stage.BaseImageStoredLocally { return retrieveTarImage(stage.BaseImageIndex) } // Finally, check if local caching is enabled // If so, look in the local cache before trying the remote registry if opts.Cache && opts.CacheDir != "" { cachedImage, err := cachedImage(opts, currentBaseName) if err != nil { switch { case cache.IsNotFound(err): logrus.Debugf("Image %v not found in cache", currentBaseName) case cache.IsExpired(err): logrus.Debugf("Image %v found in cache but was expired", currentBaseName) default: logrus.Errorf("Error while retrieving image from cache: %v %v", currentBaseName, err) } } else if cachedImage != nil { return cachedImage, nil } } // Otherwise, initialize image as usual return RetrieveRemoteImage(currentBaseName, opts.RegistryOptions, opts.CustomPlatform) } func tarballImage(index int) (v1.Image, error) { tarPath := filepath.Join(config.KanikoIntermediateStagesDir, strconv.Itoa(index)) logrus.Infof("Base image from previous stage %d found, using saved tar at path %s", index, tarPath) return tarball.ImageFromPath(tarPath, nil) } func cachedImage(opts *config.KanikoOptions, image string) (v1.Image, error) { ref, err := name.ParseReference(image, name.WeakValidation) if err != nil { return nil, err } var cacheKey string if d, ok := ref.(name.Digest); ok { cacheKey = d.DigestStr() } else { image, err := remote.RetrieveRemoteImage(image, opts.RegistryOptions, opts.CustomPlatform) if err != nil { return nil, err } d, err := image.Digest() if err != nil { return nil, err } cacheKey = d.String() } return cache.LocalSource(&opts.CacheOptions, cacheKey) } ================================================ FILE: pkg/image/image_util_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package image import ( "bytes" "testing" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/empty" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/moby/buildkit/frontend/dockerfile/linter" "github.com/moby/buildkit/frontend/dockerfile/parser" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/testutil" ) var ( dockerfile = ` FROM gcr.io/distroless/base:latest as base COPY . . FROM scratch as second ENV foopath context/foo COPY --from=0 $foopath context/b* /foo/ FROM base ARG file COPY --from=second /foo $file` ) func Test_StandardImage(t *testing.T) { stages, err := parse(dockerfile) if err != nil { t.Error(err) } original := RetrieveRemoteImage defer func() { RetrieveRemoteImage = original }() mock := func(image string, opts config.RegistryOptions, _ string) (v1.Image, error) { return nil, nil } RetrieveRemoteImage = mock actual, err := RetrieveSourceImage(config.KanikoStage{ Stage: stages[0], }, &config.KanikoOptions{}) testutil.CheckErrorAndDeepEqual(t, false, err, nil, actual) } func Test_ScratchImage(t *testing.T) { stages, err := parse(dockerfile) if err != nil { t.Error(err) } actual, err := RetrieveSourceImage(config.KanikoStage{ Stage: stages[1], }, &config.KanikoOptions{}) expected := empty.Image testutil.CheckErrorAndDeepEqual(t, false, err, expected, actual) } func Test_TarImage(t *testing.T) { stages, err := parse(dockerfile) if err != nil { t.Error(err) } original := retrieveTarImage defer func() { retrieveTarImage = original }() mock := func(index int) (v1.Image, error) { return nil, nil } retrieveTarImage = mock actual, err := RetrieveSourceImage(config.KanikoStage{ BaseImageStoredLocally: true, BaseImageIndex: 0, Stage: stages[2], }, &config.KanikoOptions{}) testutil.CheckErrorAndDeepEqual(t, false, err, nil, actual) } func Test_ScratchImageFromMirror(t *testing.T) { stages, err := parse(dockerfile) if err != nil { t.Error(err) } actual, err := RetrieveSourceImage(config.KanikoStage{ Stage: stages[1], }, &config.KanikoOptions{ RegistryOptions: config.RegistryOptions{ RegistryMirrors: []string{"mirror.gcr.io"}, }, }) expected := empty.Image testutil.CheckErrorAndDeepEqual(t, false, err, expected, actual) } // parse parses the contents of a Dockerfile and returns a list of commands func parse(s string) ([]instructions.Stage, error) { p, err := parser.Parse(bytes.NewReader([]byte(s))) if err != nil { return nil, err } stages, _, err := instructions.Parse(p.AST, &linter.Linter{}) if err != nil { return nil, err } return stages, err } ================================================ FILE: pkg/image/remote/remote.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package remote import ( "fmt" "strings" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/creds" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/sirupsen/logrus" ) var ( manifestCache = make(map[string]v1.Image) remoteImageFunc = remote.Image ) // RetrieveRemoteImage retrieves the manifest for the specified image from the specified registry func RetrieveRemoteImage(image string, opts config.RegistryOptions, customPlatform string) (v1.Image, error) { logrus.Infof("Retrieving image manifest %s", image) cachedRemoteImage := manifestCache[image] if cachedRemoteImage != nil { logrus.Infof("Returning cached image manifest") return cachedRemoteImage, nil } ref, err := name.ParseReference(image, name.WeakValidation) if err != nil { return nil, err } if newRegURLs, found := opts.RegistryMaps[ref.Context().RegistryStr()]; found { for _, registryMapping := range newRegURLs { regToMapTo, repositoryPrefix := parseRegistryMapping(registryMapping) insecurePull := opts.InsecurePull || opts.InsecureRegistries.Contains(regToMapTo) remappedRepository, err := remapRepository(ref.Context(), regToMapTo, repositoryPrefix, insecurePull) if err != nil { return nil, err } remappedRef := setNewRepository(ref, remappedRepository) logrus.Infof("Retrieving image %s from mapped registry %s", remappedRef, regToMapTo) retryFunc := func() (v1.Image, error) { return remoteImageFunc(remappedRef, remoteOptions(regToMapTo, opts, customPlatform)...) } var remoteImage v1.Image if remoteImage, err = util.RetryWithResult(retryFunc, opts.ImageDownloadRetry, 1000); err != nil { logrus.Warnf("Failed to retrieve image %s from remapped registry %s: %s. Will try with the next registry, or fallback to the original registry.", remappedRef, regToMapTo, err) continue } manifestCache[image] = remoteImage return remoteImage, nil } if len(newRegURLs) > 0 && opts.SkipDefaultRegistryFallback { return nil, fmt.Errorf("image not found on any configured mapped registries for %s", ref) } } registryName := ref.Context().RegistryStr() if opts.InsecurePull || opts.InsecureRegistries.Contains(registryName) { newReg, err := name.NewRegistry(registryName, name.WeakValidation, name.Insecure) if err != nil { return nil, err } ref = setNewRegistry(ref, newReg) } logrus.Infof("Retrieving image %s from registry %s", ref, registryName) retryFunc := func() (v1.Image, error) { return remoteImageFunc(ref, remoteOptions(registryName, opts, customPlatform)...) } var remoteImage v1.Image if remoteImage, err = util.RetryWithResult(retryFunc, opts.ImageDownloadRetry, 1000); remoteImage != nil { manifestCache[image] = remoteImage } return remoteImage, err } // remapRepository adds the {repositoryPrefix}/ to the original repo, and normalizes with an additional library/ if necessary func remapRepository(repo name.Repository, regToMapTo string, repositoryPrefix string, insecurePull bool) (name.Repository, error) { if insecurePull { return name.NewRepository(repositoryPrefix+repo.RepositoryStr(), name.WithDefaultRegistry(regToMapTo), name.WeakValidation, name.Insecure) } else { return name.NewRepository(repositoryPrefix+repo.RepositoryStr(), name.WithDefaultRegistry(regToMapTo), name.WeakValidation) } } func setNewRepository(ref name.Reference, newRepo name.Repository) name.Reference { switch r := ref.(type) { case name.Tag: r.Repository = newRepo return r case name.Digest: r.Repository = newRepo return r default: return ref } } func setNewRegistry(ref name.Reference, newReg name.Registry) name.Reference { switch r := ref.(type) { case name.Tag: r.Repository.Registry = newReg return r case name.Digest: r.Repository.Registry = newReg return r default: return ref } } func remoteOptions(registryName string, opts config.RegistryOptions, customPlatform string) []remote.Option { tr, err := util.MakeTransport(opts, registryName) // The MakeTransport function will only return errors if there was a problem // with registry certificates (Verification or mTLS) if err != nil { logrus.Fatalf("Unable to setup transport for registry %q: %v", customPlatform, err) } // The platform value has previously been validated. platform, err := v1.ParsePlatform(customPlatform) if err != nil { logrus.Fatalf("Invalid platform %q: %v", customPlatform, err) } return []remote.Option{remote.WithTransport(tr), remote.WithAuthFromKeychain(creds.GetKeychain()), remote.WithPlatform(*platform)} } // Parse the registry mapping // example: regMapping = "registry.example.com/subdir1/subdir2" will return registry.example.com and subdir1/subdir2/ func parseRegistryMapping(regMapping string) (string, string) { // Split the registry mapping by first slash regURL, repositoryPrefix, _ := strings.Cut(regMapping, "/") // Normalize with a trailing slash if not empty if repositoryPrefix != "" && !strings.HasSuffix(repositoryPrefix, "/") { repositoryPrefix = repositoryPrefix + "/" } return regURL, repositoryPrefix } ================================================ FILE: pkg/image/remote/remote_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package remote import ( "errors" "testing" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/types" ) const image string = "debian" // mockImage mocks the v1.Image interface type mockImage struct { } func (m *mockImage) ConfigFile() (*v1.ConfigFile, error) { return nil, nil } func (m *mockImage) ConfigName() (v1.Hash, error) { return v1.Hash{}, nil } func (m *mockImage) Descriptor() (*v1.Descriptor, error) { return nil, nil } func (m *mockImage) Digest() (v1.Hash, error) { return v1.Hash{}, nil } func (m *mockImage) LayerByDigest(v1.Hash) (v1.Layer, error) { return nil, nil } func (m *mockImage) LayerByDiffID(v1.Hash) (v1.Layer, error) { return nil, nil } func (m *mockImage) Layers() ([]v1.Layer, error) { return nil, nil } func (m *mockImage) Manifest() (*v1.Manifest, error) { return nil, nil } func (m *mockImage) MediaType() (types.MediaType, error) { return "application/vnd.oci.descriptor.v1+json", nil } func (m *mockImage) RawManifest() ([]byte, error) { return nil, nil } func (m *mockImage) RawConfigFile() ([]byte, error) { return nil, nil } func (m *mockImage) Size() (int64, error) { return 0, nil } func Test_remapRepository(t *testing.T) { tests := []struct { name string repository string newRegistry string newRepositoryPrefix string expectedRepository string }{ { name: "Test case 1", repository: "debian", newRegistry: "newreg.io", newRepositoryPrefix: "", expectedRepository: "newreg.io/library/debian", }, { name: "Test case 2", repository: "docker.io/debian", newRegistry: "newreg.io", newRepositoryPrefix: "", expectedRepository: "newreg.io/library/debian", }, { name: "Test case 3", repository: "index.docker.io/debian", newRegistry: "newreg.io", newRepositoryPrefix: "", expectedRepository: "newreg.io/library/debian", }, { name: "Test case 4", repository: "oldreg.io/debian", newRegistry: "newreg.io", newRepositoryPrefix: "", expectedRepository: "newreg.io/debian", }, { name: "Test case 5", repository: "debian", newRegistry: "newreg.io", newRepositoryPrefix: "subdir1/subdir2/", expectedRepository: "newreg.io/subdir1/subdir2/library/debian", }, { name: "Test case 6", repository: "library/debian", newRegistry: "newreg.io", newRepositoryPrefix: "", expectedRepository: "newreg.io/library/debian", }, { name: "Test case 7", repository: "library/debian", newRegistry: "newreg.io", newRepositoryPrefix: "subdir1/subdir2/", expectedRepository: "newreg.io/subdir1/subdir2/library/debian", }, { name: "Test case 8", repository: "namespace/debian", newRegistry: "newreg.io", newRepositoryPrefix: "", expectedRepository: "newreg.io/namespace/debian", }, { name: "Test case 9", repository: "namespace/debian", newRegistry: "newreg.io", newRepositoryPrefix: "subdir1/subdir2/", expectedRepository: "newreg.io/subdir1/subdir2/namespace/debian", }, // Add more test cases here } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { repo, err := name.NewRepository(tt.repository) if err != nil { t.Fatal(err) } repo2, err := remapRepository(repo, tt.newRegistry, tt.newRepositoryPrefix, false) if err != nil { t.Fatal(err) } if repo2.Name() != tt.expectedRepository { t.Errorf("%s should have been normalized to %s, got %s", repo.Name(), tt.expectedRepository, repo2.Name()) } }) } } func Test_RetrieveRemoteImage_manifestCache(t *testing.T) { nonExistingImageName := "this_is_a_non_existing_image_reference" if _, err := RetrieveRemoteImage(nonExistingImageName, config.RegistryOptions{}, ""); err == nil { t.Fatal("Expected call to fail because there is no manifest for this image.") } manifestCache[nonExistingImageName] = &mockImage{} if image, err := RetrieveRemoteImage(nonExistingImageName, config.RegistryOptions{}, ""); image == nil || err != nil { t.Fatal("Expected call to succeed because there is a manifest for this image in the cache.") } } func Test_RetrieveRemoteImage_skipFallback(t *testing.T) { registryMirror := "some-registry" opts := config.RegistryOptions{ RegistryMaps: map[string][]string{name.DefaultRegistry: {registryMirror}}, SkipDefaultRegistryFallback: false, } remoteImageFunc = func(ref name.Reference, options ...remote.Option) (v1.Image, error) { if ref.Context().Registry.Name() == registryMirror { return nil, errors.New("no image found") } return &mockImage{}, nil } if _, err := RetrieveRemoteImage(image, opts, ""); err != nil { t.Fatalf("Expected call to succeed because fallback to default registry") } opts.SkipDefaultRegistryFallback = true //clean cached image manifestCache = make(map[string]v1.Image) if _, err := RetrieveRemoteImage(image, opts, ""); err == nil { t.Fatal("Expected call to fail because fallback to default registry is skipped") } } func Test_RetryRetrieveRemoteImageSucceeds(t *testing.T) { opts := config.RegistryOptions{ ImageDownloadRetry: 2, } attempts := 0 remoteImageFunc = func(ref name.Reference, options ...remote.Option) (v1.Image, error) { if attempts < 2 { attempts++ return nil, errors.New("no image found") } return &mockImage{}, nil } // Clean cached image manifestCache = make(map[string]v1.Image) if _, err := RetrieveRemoteImage(image, opts, ""); err != nil { t.Fatal("Expected call to succeed because of retry") } } func Test_NoRetryRetrieveRemoteImageFails(t *testing.T) { opts := config.RegistryOptions{ ImageDownloadRetry: 0, } attempts := 0 remoteImageFunc = func(ref name.Reference, options ...remote.Option) (v1.Image, error) { if attempts < 1 { attempts++ return nil, errors.New("no image found") } return &mockImage{}, nil } // Clean cached image manifestCache = make(map[string]v1.Image) if _, err := RetrieveRemoteImage(image, opts, ""); err == nil { t.Fatal("Expected call to fail because there is no retry") } } func Test_ParseRegistryMapping(t *testing.T) { tests := []struct { name string registryMapping string expectedRegistry string expectedRepositoryPrefix string }{ { name: "Test case 1", registryMapping: "registry.example.com/subdir", expectedRegistry: "registry.example.com", expectedRepositoryPrefix: "subdir/", }, { name: "Test case 2", registryMapping: "registry.example.com/subdir/", expectedRegistry: "registry.example.com", expectedRepositoryPrefix: "subdir/", }, { name: "Test case 3", registryMapping: "registry.example.com/subdir1/subdir2", expectedRegistry: "registry.example.com", expectedRepositoryPrefix: "subdir1/subdir2/", }, { name: "Test case 4", registryMapping: "registry.example.com", expectedRegistry: "registry.example.com", expectedRepositoryPrefix: "", }, { name: "Test case 5", registryMapping: "registry.example.com/", expectedRegistry: "registry.example.com", expectedRepositoryPrefix: "", }, // Add more test cases here } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { registry, repositoryPrefix := parseRegistryMapping(tt.registryMapping) if registry != tt.expectedRegistry { t.Errorf("Expected registry: %s, but got: %s", tt.expectedRegistry, registry) } if repositoryPrefix != tt.expectedRepositoryPrefix { t.Errorf("Expected repoPrefix: %s, but got: %s", tt.expectedRepositoryPrefix, repositoryPrefix) } }) } } ================================================ FILE: pkg/logging/logging.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package logging import ( "fmt" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) const ( // Default log level DefaultLevel = "info" // Default timestamp in logs DefaultLogTimestamp = false // Text format FormatText = "text" // Colored text format FormatColor = "color" // JSON format FormatJSON = "json" ) // Configure sets the logrus logging level and formatter func Configure(level, format string, logTimestamp bool) error { lvl, err := logrus.ParseLevel(level) if err != nil { return errors.Wrap(err, "parsing log level") } logrus.SetLevel(lvl) var formatter logrus.Formatter switch format { case FormatText: formatter = &logrus.TextFormatter{ DisableColors: true, FullTimestamp: logTimestamp, } case FormatColor: formatter = &logrus.TextFormatter{ ForceColors: true, FullTimestamp: logTimestamp, } case FormatJSON: formatter = &logrus.JSONFormatter{} default: return fmt.Errorf("not a valid log format: %q. Please specify one of (text, color, json)", format) } logrus.SetFormatter(formatter) return nil } ================================================ FILE: pkg/mocks/go-containerregistry/mockv1/mocks.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/google/go-containerregistry/pkg/v1 (interfaces: Layer) // Package mockv1 is a generated GoMock package. package mockv1 import ( io "io" reflect "reflect" gomock "github.com/golang/mock/gomock" v1 "github.com/google/go-containerregistry/pkg/v1" types "github.com/google/go-containerregistry/pkg/v1/types" ) // MockLayer is a mock of Layer interface type MockLayer struct { ctrl *gomock.Controller recorder *MockLayerMockRecorder } // MockLayerMockRecorder is the mock recorder for MockLayer type MockLayerMockRecorder struct { mock *MockLayer } // NewMockLayer creates a new mock instance func NewMockLayer(ctrl *gomock.Controller) *MockLayer { mock := &MockLayer{ctrl: ctrl} mock.recorder = &MockLayerMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *MockLayer) EXPECT() *MockLayerMockRecorder { return m.recorder } // Compressed mocks base method func (m *MockLayer) Compressed() (io.ReadCloser, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Compressed") ret0, _ := ret[0].(io.ReadCloser) ret1, _ := ret[1].(error) return ret0, ret1 } // Compressed indicates an expected call of Compressed func (mr *MockLayerMockRecorder) Compressed() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Compressed", reflect.TypeOf((*MockLayer)(nil).Compressed)) } // DiffID mocks base method func (m *MockLayer) DiffID() (v1.Hash, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DiffID") ret0, _ := ret[0].(v1.Hash) ret1, _ := ret[1].(error) return ret0, ret1 } // DiffID indicates an expected call of DiffID func (mr *MockLayerMockRecorder) DiffID() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DiffID", reflect.TypeOf((*MockLayer)(nil).DiffID)) } // Digest mocks base method func (m *MockLayer) Digest() (v1.Hash, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Digest") ret0, _ := ret[0].(v1.Hash) ret1, _ := ret[1].(error) return ret0, ret1 } // Digest indicates an expected call of Digest func (mr *MockLayerMockRecorder) Digest() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Digest", reflect.TypeOf((*MockLayer)(nil).Digest)) } // MediaType mocks base method func (m *MockLayer) MediaType() (types.MediaType, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MediaType") ret0, _ := ret[0].(types.MediaType) ret1, _ := ret[1].(error) return ret0, ret1 } // MediaType indicates an expected call of MediaType func (mr *MockLayerMockRecorder) MediaType() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MediaType", reflect.TypeOf((*MockLayer)(nil).MediaType)) } // Size mocks base method func (m *MockLayer) Size() (int64, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Size") ret0, _ := ret[0].(int64) ret1, _ := ret[1].(error) return ret0, ret1 } // Size indicates an expected call of Size func (mr *MockLayerMockRecorder) Size() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*MockLayer)(nil).Size)) } // Uncompressed mocks base method func (m *MockLayer) Uncompressed() (io.ReadCloser, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Uncompressed") ret0, _ := ret[0].(io.ReadCloser) ret1, _ := ret[1].(error) return ret0, ret1 } // Uncompressed indicates an expected call of Uncompressed func (mr *MockLayerMockRecorder) Uncompressed() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Uncompressed", reflect.TypeOf((*MockLayer)(nil).Uncompressed)) } ================================================ FILE: pkg/snapshot/layered_map.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package snapshot import ( "bytes" "encoding/json" "fmt" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/GoogleContainerTools/kaniko/pkg/util" ) type LayeredMap struct { adds []map[string]string // All layers with added files. deletes []map[string]struct{} // All layers with deleted files. currentImage map[string]string // All files and hashes in the current image (up to the last layer). isCurrentImageValid bool // If the currentImage is not out-of-date. layerHashCache map[string]string hasher func(string) (string, error) } // NewLayeredMap creates a new layered map which keeps track of adds and deletes. func NewLayeredMap(h func(string) (string, error)) *LayeredMap { l := LayeredMap{ hasher: h, } l.currentImage = map[string]string{} l.layerHashCache = map[string]string{} return &l } // Snapshot creates a new layer. func (l *LayeredMap) Snapshot() { // Save current state of image l.updateCurrentImage() l.adds = append(l.adds, map[string]string{}) l.deletes = append(l.deletes, map[string]struct{}{}) l.layerHashCache = map[string]string{} // Erase the hash cache for this new layer. } // Key returns a hash for added and delted files. func (l *LayeredMap) Key() (string, error) { var adds map[string]string var deletes map[string]struct{} if len(l.adds) != 0 { adds = l.adds[len(l.adds)-1] deletes = l.deletes[len(l.deletes)-1] } c := bytes.NewBuffer([]byte{}) enc := json.NewEncoder(c) err := enc.Encode(adds) if err != nil { return "", err } err = enc.Encode(deletes) if err != nil { return "", err } return util.SHA256(c) } // getCurrentImage returns the current image by merging the latest // adds and deletes on to the current image (if its not yet valid.) func (l *LayeredMap) getCurrentImage() map[string]string { if l.isCurrentImageValid || len(l.adds) == 0 { // No layers yet or current image is valid. return l.currentImage } current := map[string]string{} // Copy current image paths/hashes. for p, h := range l.currentImage { current[p] = h } // Add the last layer on top. addedFiles := l.adds[len(l.adds)-1] deletedFiles := l.deletes[len(l.deletes)-1] for add, hash := range addedFiles { current[add] = hash } for del := range deletedFiles { delete(current, del) } return current } // updateCurrentImage update the internal current image by merging the // top adds and deletes onto the current image. func (l *LayeredMap) updateCurrentImage() { if l.isCurrentImageValid { return } l.currentImage = l.getCurrentImage() l.isCurrentImageValid = true } // get returns the current hash in the current image `l.currentImage`. func (l *LayeredMap) get(s string) (string, bool) { h, ok := l.currentImage[s] return h, ok } // GetCurrentPaths returns all existing paths in the actual current image // cached by FlattenLayers. func (l *LayeredMap) GetCurrentPaths() map[string]struct{} { current := l.getCurrentImage() paths := map[string]struct{}{} for f := range current { paths[f] = struct{}{} } return paths } // AddDelete will delete the specific files in the current layer. func (l *LayeredMap) AddDelete(s string) error { l.isCurrentImageValid = false l.deletes[len(l.deletes)-1][s] = struct{}{} return nil } // Add will add the specified file s to the current layer. func (l *LayeredMap) Add(s string) error { l.isCurrentImageValid = false // Use hash function and add to layers newV, err := func(s string) (string, error) { if v, ok := l.layerHashCache[s]; ok { return v, nil } return l.hasher(s) }(s) if err != nil { return fmt.Errorf("Error creating hash for %s: %w", s, err) } l.adds[len(l.adds)-1][s] = newV return nil } // CheckFileChange checks whether a given file (needs to exist) changed // from the current layered map by its hashing function. // If the file does not exist, an error is returned. // Returns true if the file is changed. func (l *LayeredMap) CheckFileChange(s string) (bool, error) { t := timing.Start("Hashing files") defer timing.DefaultRun.Stop(t) newV, err := l.hasher(s) if err != nil { return false, err } // Save hash to not recompute it when // adding the file. l.layerHashCache[s] = newV oldV, ok := l.get(s) if ok && newV == oldV { // File hash did not change => Unchanged. return false, nil } // File does not exist in current image, // or it did change => Changed. return true, nil } ================================================ FILE: pkg/snapshot/layered_map_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package snapshot import ( "testing" ) func Test_CacheKey(t *testing.T) { tests := []struct { name string map1 map[string]string map2 map[string]string equal bool }{ { name: "maps are the same", map1: map[string]string{ "a": "apple", "b": "bat", "c": "cat", "d": "dog", "e": "egg", }, map2: map[string]string{ "c": "cat", "d": "dog", "b": "bat", "a": "apple", "e": "egg", }, equal: true, }, { name: "maps are different", map1: map[string]string{ "a": "apple", "b": "bat", "c": "cat", }, map2: map[string]string{ "c": "", "b": "bat", "a": "apple", }, equal: false, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { lm1 := LayeredMap{adds: []map[string]string{test.map1}, deletes: []map[string]struct{}{nil, nil}} lm2 := LayeredMap{adds: []map[string]string{test.map2}, deletes: []map[string]struct{}{nil, nil}} k1, err := lm1.Key() if err != nil { t.Fatalf("error getting key for map 1: %v", err) } k2, err := lm2.Key() if err != nil { t.Fatalf("error getting key for map 2: %v", err) } if test.equal != (k1 == k2) { t.Fatalf("unexpected result: \nExpected\n%s\nActual\n%s\n", k1, k2) } }) } } func Test_FlattenPaths(t *testing.T) { layers := []map[string]string{ { "a": "2", "b": "3", }, { "b": "5", "c": "6", }, { "a": "8", }, } whiteouts := []map[string]struct{}{ { "a": {}, // delete a }, { "b": {}, // delete b }, { "c": {}, // delete c }, } lm := LayeredMap{ adds: []map[string]string{layers[0]}, deletes: []map[string]struct{}{whiteouts[0]}} paths := lm.GetCurrentPaths() assertPath := func(f string, exists bool) { _, ok := paths[f] if exists && !ok { t.Fatalf("expected path '%s' to be present.", f) } else if !exists && ok { t.Fatalf("expected path '%s' not to be present.", f) } } assertPath("a", false) assertPath("b", true) lm = LayeredMap{ adds: []map[string]string{layers[0], layers[1]}, deletes: []map[string]struct{}{whiteouts[0], whiteouts[1]}} paths = lm.GetCurrentPaths() assertPath("a", false) assertPath("b", false) assertPath("c", true) lm = LayeredMap{ adds: []map[string]string{layers[0], layers[1], layers[2]}, deletes: []map[string]struct{}{whiteouts[0], whiteouts[1], whiteouts[2]}} paths = lm.GetCurrentPaths() assertPath("a", true) assertPath("b", false) assertPath("c", false) } ================================================ FILE: pkg/snapshot/snapshot.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package snapshot import ( "errors" "fmt" "os" "path/filepath" "runtime" "sort" "syscall" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/filesystem" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) // For testing var snapshotPathPrefix = "" // Snapshotter holds the root directory from which to take snapshots, and a list of snapshots taken type Snapshotter struct { l *LayeredMap directory string ignorelist []util.IgnoreListEntry } // NewSnapshotter creates a new snapshotter rooted at d func NewSnapshotter(l *LayeredMap, d string) *Snapshotter { return &Snapshotter{l: l, directory: d, ignorelist: util.IgnoreList()} } // Init initializes a new snapshotter func (s *Snapshotter) Init() error { logrus.Info("Initializing snapshotter ...") _, _, err := s.scanFullFilesystem() return err } // Key returns a string based on the current state of the file system func (s *Snapshotter) Key() (string, error) { return s.l.Key() } // TakeSnapshot takes a snapshot of the specified files, avoiding directories in the ignorelist, and creates // a tarball of the changed files. Return contents of the tarball, and whether or not any files were changed func (s *Snapshotter) TakeSnapshot(files []string, shdCheckDelete bool, forceBuildMetadata bool) (string, error) { f, err := os.CreateTemp(config.KanikoDir, "") if err != nil { return "", err } defer f.Close() s.l.Snapshot() if len(files) == 0 && !forceBuildMetadata { logrus.Info("No files changed in this command, skipping snapshotting.") return "", nil } filesToAdd, err := filesystem.ResolvePaths(files, s.ignorelist) if err != nil { return "", err } logrus.Info("Taking snapshot of files...") sort.Strings(filesToAdd) logrus.Debugf("Adding to layer: %v", filesToAdd) // Add files to current layer. for _, file := range filesToAdd { if err := s.l.Add(file); err != nil { return "", fmt.Errorf("Unable to add file %s to layered map: %w", file, err) } } // Get whiteout paths var filesToWhiteout []string if shdCheckDelete { _, deletedFiles := util.WalkFS(s.directory, s.l.GetCurrentPaths(), func(s string) (bool, error) { return true, nil }) logrus.Debugf("Deleting in layer: %v", deletedFiles) // Whiteout files in current layer. for file := range deletedFiles { if err := s.l.AddDelete(file); err != nil { return "", fmt.Errorf("Unable to whiteout file %s in layered map: %w", file, err) } } filesToWhiteout = removeObsoleteWhiteouts(deletedFiles) sort.Strings(filesToWhiteout) } t := util.NewTar(f) defer t.Close() if err := writeToTar(t, filesToAdd, filesToWhiteout); err != nil { return "", err } return f.Name(), nil } // TakeSnapshotFS takes a snapshot of the filesystem, avoiding directories in the ignorelist, and creates // a tarball of the changed files. func (s *Snapshotter) TakeSnapshotFS() (string, error) { f, err := os.CreateTemp(s.getSnashotPathPrefix(), "") if err != nil { return "", err } defer f.Close() t := util.NewTar(f) defer t.Close() filesToAdd, filesToWhiteOut, err := s.scanFullFilesystem() if err != nil { return "", err } if err := writeToTar(t, filesToAdd, filesToWhiteOut); err != nil { return "", err } return f.Name(), nil } func (s *Snapshotter) getSnashotPathPrefix() string { if snapshotPathPrefix == "" { return config.KanikoDir } return snapshotPathPrefix } func (s *Snapshotter) scanFullFilesystem() ([]string, []string, error) { logrus.Info("Taking snapshot of full filesystem...") // Some of the operations that follow (e.g. hashing) depend on the file system being synced, // for example the hashing function that determines if files are equal uses the mtime of the files, // which can lag if sync is not called. Unfortunately there can still be lag if too much data needs // to be flushed or the disk does its own caching/buffering. if runtime.GOOS == "linux" { dir, err := os.Open(s.directory) if err != nil { return nil, nil, err } defer dir.Close() _, _, errno := syscall.Syscall(unix.SYS_SYNCFS, dir.Fd(), 0, 0) if errno != 0 { return nil, nil, errno } } else { // fallback to full page cache sync syscall.Sync() } s.l.Snapshot() logrus.Debugf("Current image filesystem: %v", s.l.currentImage) changedPaths, deletedPaths := util.WalkFS(s.directory, s.l.GetCurrentPaths(), s.l.CheckFileChange) timer := timing.Start("Resolving Paths") filesToAdd := []string{} resolvedFiles, err := filesystem.ResolvePaths(changedPaths, s.ignorelist) if err != nil { return nil, nil, err } for _, path := range resolvedFiles { if util.CheckIgnoreList(path) { logrus.Debugf("Not adding %s to layer, as it's ignored", path) continue } filesToAdd = append(filesToAdd, path) } logrus.Debugf("Adding to layer: %v", filesToAdd) logrus.Debugf("Deleting in layer: %v", deletedPaths) // Add files to the layered map for _, file := range filesToAdd { if err := s.l.Add(file); err != nil { return nil, nil, fmt.Errorf("Unable to add file %s to layered map: %w", file, err) } } for file := range deletedPaths { if err := s.l.AddDelete(file); err != nil { return nil, nil, fmt.Errorf("Unable to whiteout file %s in layered map: %w", file, err) } } filesToWhiteout := removeObsoleteWhiteouts(deletedPaths) timing.DefaultRun.Stop(timer) sort.Strings(filesToAdd) sort.Strings(filesToWhiteout) return filesToAdd, filesToWhiteout, nil } // removeObsoleteWhiteouts filters deleted files according to their parents delete status. func removeObsoleteWhiteouts(deletedFiles map[string]struct{}) (filesToWhiteout []string) { for path := range deletedFiles { // Only add the whiteout if the directory for the file still exists. dir := filepath.Dir(path) if _, ok := deletedFiles[dir]; !ok { logrus.Tracef("Adding whiteout for %s", path) filesToWhiteout = append(filesToWhiteout, path) } } return filesToWhiteout } func writeToTar(t util.Tar, files, whiteouts []string) error { timer := timing.Start("Writing tar file") defer timing.DefaultRun.Stop(timer) // Now create the tar. addedPaths := make(map[string]bool) for _, path := range whiteouts { skipWhiteout, err := parentPathIncludesNonDirectory(path) if err != nil { return err } if skipWhiteout { continue } if err := addParentDirectories(t, addedPaths, path); err != nil { return err } if err := t.Whiteout(path); err != nil { return err } } for _, path := range files { if err := addParentDirectories(t, addedPaths, path); err != nil { return err } if _, pathAdded := addedPaths[path]; pathAdded { continue } if err := t.AddFileToTar(path); err != nil { return err } addedPaths[path] = true } return nil } // Returns true if a parent of the given path has been replaced with anything other than a directory func parentPathIncludesNonDirectory(path string) (bool, error) { for _, parentPath := range util.ParentDirectories(path) { lstat, err := os.Lstat(parentPath) if err != nil { return false, err } if !lstat.IsDir() { return true, nil } } return false, nil } func addParentDirectories(t util.Tar, addedPaths map[string]bool, path string) error { for _, parentPath := range util.ParentDirectories(path) { if _, pathAdded := addedPaths[parentPath]; pathAdded { continue } if err := t.AddFileToTar(parentPath); err != nil { return err } addedPaths[parentPath] = true } return nil } // filesWithLinks returns the symlink and the target path if its exists. func filesWithLinks(path string) ([]string, error) { link, err := util.GetSymLink(path) if errors.Is(err, util.ErrNotSymLink) { return []string{path}, nil } else if err != nil { return nil, err } // Add symlink if it exists in the FS if !filepath.IsAbs(link) { link = filepath.Join(filepath.Dir(path), link) } if _, err := os.Stat(link); err != nil { return []string{path}, nil //nolint:nilerr } return []string{path, link}, nil } ================================================ FILE: pkg/snapshot/snapshot_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package snapshot import ( "archive/tar" "io" "os" "path/filepath" "sort" "strings" "testing" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/util" "github.com/GoogleContainerTools/kaniko/testutil" "github.com/pkg/errors" ) func TestSnapshotFSFileChange(t *testing.T) { testDir, snapshotter, cleanup, err := setUpTest(t) testDirWithoutLeadingSlash := strings.TrimLeft(testDir, "/") defer cleanup() if err != nil { t.Fatal(err) } // Make some changes to the filesystem newFiles := map[string]string{ "foo": "newbaz1", "bar/bat": "baz", } if err := testutil.SetupFiles(testDir, newFiles); err != nil { t.Fatalf("Error setting up fs: %s", err) } // Take another snapshot tarPath, err := snapshotter.TakeSnapshotFS() if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } f, err := os.Open(tarPath) if err != nil { t.Fatal(err) } // Check contents of the snapshot, make sure contents is equivalent to snapshotFiles tr := tar.NewReader(f) fooPath := filepath.Join(testDirWithoutLeadingSlash, "foo") batPath := filepath.Join(testDirWithoutLeadingSlash, "bar/bat") snapshotFiles := map[string]string{ fooPath: "newbaz1", batPath: "baz", } for _, path := range util.ParentDirectoriesWithoutLeadingSlash(batPath) { if path == "/" { snapshotFiles["/"] = "" continue } snapshotFiles[path+"/"] = "" } actualFiles := []string{} for { hdr, err := tr.Next() if errors.Is(err, io.EOF) { break } actualFiles = append(actualFiles, hdr.Name) if _, isFile := snapshotFiles[hdr.Name]; !isFile { t.Fatalf("File %s unexpectedly in tar", hdr.Name) } if hdr.Typeflag == tar.TypeDir { continue } contents, _ := io.ReadAll(tr) if string(contents) != snapshotFiles[hdr.Name] { t.Fatalf("Contents of %s incorrect, expected: %s, actual: %s", hdr.Name, snapshotFiles[hdr.Name], string(contents)) } } if len(actualFiles) != len(snapshotFiles) { t.Fatalf("Incorrect number of files were added, expected: %d, actual: %d", len(snapshotFiles), len(actualFiles)) } } func TestSnapshotFSIsReproducible(t *testing.T) { testDir, snapshotter, cleanup, err := setUpTest(t) defer cleanup() if err != nil { t.Fatal(err) } // Make some changes to the filesystem newFiles := map[string]string{ "foo": "newbaz1", "bar/bat": "baz", } if err := testutil.SetupFiles(testDir, newFiles); err != nil { t.Fatalf("Error setting up fs: %s", err) } // Take another snapshot tarPath, err := snapshotter.TakeSnapshotFS() if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } // Check contents of the snapshot, make sure contents are sorted by name filesInTar, err := listFilesInTar(tarPath) if err != nil { t.Fatal(err) } if !sort.StringsAreSorted(filesInTar) { t.Fatalf("Expected the file in the tar archive were sorted, actual list was not sorted: %v", filesInTar) } } func TestSnapshotFSChangePermissions(t *testing.T) { testDir, snapshotter, cleanup, err := setUpTest(t) testDirWithoutLeadingSlash := strings.TrimLeft(testDir, "/") defer cleanup() if err != nil { t.Fatal(err) } // Change permissions on a file batPath := filepath.Join(testDir, "bar/bat") batPathWithoutLeadingSlash := filepath.Join(testDirWithoutLeadingSlash, "bar/bat") if err := os.Chmod(batPath, 0600); err != nil { t.Fatalf("Error changing permissions on %s: %v", batPath, err) } // Take another snapshot tarPath, err := snapshotter.TakeSnapshotFS() if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } f, err := os.Open(tarPath) if err != nil { t.Fatal(err) } // Check contents of the snapshot, make sure contents is equivalent to snapshotFiles tr := tar.NewReader(f) snapshotFiles := map[string]string{ batPathWithoutLeadingSlash: "baz2", } for _, path := range util.ParentDirectoriesWithoutLeadingSlash(batPathWithoutLeadingSlash) { if path == "/" { snapshotFiles["/"] = "" continue } snapshotFiles[path+"/"] = "" } foundFiles := []string{} for { hdr, err := tr.Next() if errors.Is(err, io.EOF) { break } foundFiles = append(foundFiles, hdr.Name) if _, isFile := snapshotFiles[hdr.Name]; !isFile { t.Fatalf("File %s unexpectedly in tar", hdr.Name) } if hdr.Typeflag == tar.TypeDir { continue } contents, _ := io.ReadAll(tr) if string(contents) != snapshotFiles[hdr.Name] { t.Fatalf("Contents of %s incorrect, expected: %s, actual: %s", hdr.Name, snapshotFiles[hdr.Name], string(contents)) } } if len(foundFiles) != len(snapshotFiles) { t.Logf("expected\n%v\not equal\n%v", foundFiles, snapshotFiles) t.Fatalf("Incorrect number of files were added, expected: %d, got: %d", len(snapshotFiles), len(foundFiles)) } } func TestSnapshotFSReplaceDirWithLink(t *testing.T) { testDir, snapshotter, cleanup, err := setUpTest(t) defer cleanup() if err != nil { t.Fatal(err) } // replace non-empty directory "bar" with link to file "foo" bar := filepath.Join(testDir, "bar") err = os.RemoveAll(bar) if err != nil { t.Fatal(err) } foo := filepath.Join(testDir, "foo") err = os.Symlink(foo, bar) if err != nil { t.Fatal(err) } tarPath, err := snapshotter.TakeSnapshotFS() if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } actualFiles, err := listFilesInTar(tarPath) if err != nil { t.Fatal(err) } // Expect "bar", which used to be a non-empty directory but now is a symlink. We don't want whiteout files for // the deleted files in bar, because without a parent directory for them the tar cannot be extracted. testDirWithoutLeadingSlash := strings.TrimLeft(testDir, "/") expectedFiles := []string{ filepath.Join(testDirWithoutLeadingSlash, "bar"), filepath.Join(testDirWithoutLeadingSlash, "foo"), } for _, path := range util.ParentDirectoriesWithoutLeadingSlash(filepath.Join(testDir, "foo")) { expectedFiles = append(expectedFiles, strings.TrimRight(path, "/")+"/") } sort.Strings(expectedFiles) sort.Strings(actualFiles) testutil.CheckErrorAndDeepEqual(t, false, nil, expectedFiles, actualFiles) } func TestSnapshotFiles(t *testing.T) { testDir, snapshotter, cleanup, err := setUpTest(t) testDirWithoutLeadingSlash := strings.TrimLeft(testDir, "/") defer cleanup() if err != nil { t.Fatal(err) } // Make some changes to the filesystem newFiles := map[string]string{ "foo": "newbaz1", } if err := testutil.SetupFiles(testDir, newFiles); err != nil { t.Fatalf("Error setting up fs: %s", err) } filesToSnapshot := []string{ filepath.Join(testDir, "foo"), } tarPath, err := snapshotter.TakeSnapshot(filesToSnapshot, false, false) if err != nil { t.Fatal(err) } defer os.Remove(tarPath) expectedFiles := []string{ filepath.Join(testDirWithoutLeadingSlash, "foo"), } for _, path := range util.ParentDirectoriesWithoutLeadingSlash(filepath.Join(testDir, "foo")) { expectedFiles = append(expectedFiles, strings.TrimRight(path, "/")+"/") } // Check contents of the snapshot, make sure contents is equivalent to snapshotFiles actualFiles, err := listFilesInTar(tarPath) if err != nil { t.Fatal(err) } sort.Strings(expectedFiles) sort.Strings(actualFiles) testutil.CheckErrorAndDeepEqual(t, false, nil, expectedFiles, actualFiles) } func TestEmptySnapshotFS(t *testing.T) { _, snapshotter, cleanup, err := setUpTest(t) if err != nil { t.Fatal(err) } defer cleanup() // Take snapshot with no changes tarPath, err := snapshotter.TakeSnapshotFS() if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } f, err := os.Open(tarPath) if err != nil { t.Fatal(err) } tr := tar.NewReader(f) if _, err := tr.Next(); !errors.Is(err, io.EOF) { t.Fatal("no files expected in tar, found files.") } } func TestFileWithLinks(t *testing.T) { link := "baz/link" tcs := []struct { name string path string linkFileTarget string expected []string shouldErr bool }{ { name: "given path is a symlink that points to a valid target", path: link, linkFileTarget: "file", expected: []string{link, "baz/file"}, }, { name: "given path is a symlink points to non existing path", path: link, linkFileTarget: "does-not-exists", expected: []string{link}, }, { name: "given path is a regular file", path: "kaniko/file", linkFileTarget: "file", expected: []string{"kaniko/file"}, }, } for _, tt := range tcs { t.Run(tt.name, func(t *testing.T) { testDir, err := setUpTestDir(t) if err != nil { t.Fatal(err) } if err := setupSymlink(testDir, link, tt.linkFileTarget); err != nil { t.Fatalf("could not set up symlink due to %s", err) } actual, err := filesWithLinks(filepath.Join(testDir, tt.path)) if err != nil { t.Fatalf("unexpected error %s", err) } sortAndCompareFilepaths(t, testDir, tt.expected, actual) }) } } func TestSnapshotPreservesFileOrder(t *testing.T) { newFiles := map[string]string{ "foo": "newbaz1", "bar/bat": "baz", "bar/qux": "quuz", "qux": "quuz", "corge": "grault", "garply": "waldo", "fred": "plugh", "xyzzy": "thud", } newFileNames := []string{} for fileName := range newFiles { newFileNames = append(newFileNames, fileName) } filesInTars := [][]string{} for i := 0; i <= 2; i++ { testDir, snapshotter, cleanup, err := setUpTest(t) testDirWithoutLeadingSlash := strings.TrimLeft(testDir, "/") defer cleanup() if err != nil { t.Fatal(err) } // Make some changes to the filesystem if err := testutil.SetupFiles(testDir, newFiles); err != nil { t.Fatalf("Error setting up fs: %s", err) } filesToSnapshot := []string{} for _, file := range newFileNames { filesToSnapshot = append(filesToSnapshot, filepath.Join(testDir, file)) } // Take a snapshot tarPath, err := snapshotter.TakeSnapshot(filesToSnapshot, false, false) if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } filesInTar, err := listFilesInTar(tarPath) if err != nil { t.Fatal(err) } filesInTars = append(filesInTars, []string{}) for _, fn := range filesInTar { filesInTars[i] = append(filesInTars[i], strings.TrimPrefix(fn, testDirWithoutLeadingSlash)) } } // Check contents of all snapshots, make sure files appear in consistent order for i := 1; i < len(filesInTars); i++ { testutil.CheckErrorAndDeepEqual(t, false, nil, filesInTars[0], filesInTars[i]) } } func TestSnapshotWithForceBuildMetadataSet(t *testing.T) { _, snapshotter, cleanup, err := setUpTest(t) defer cleanup() if err != nil { t.Fatal(err) } filesToSnapshot := []string{} // snapshot should be taken regardless, if forceBuildMetadata flag is set filename, err := snapshotter.TakeSnapshot(filesToSnapshot, false, true) if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } if filename == "" { t.Fatalf("Filename returned from snapshot is empty.") } } func TestSnapshotWithForceBuildMetadataIsNotSet(t *testing.T) { _, snapshotter, cleanup, err := setUpTest(t) defer cleanup() if err != nil { t.Fatal(err) } filesToSnapshot := []string{} // snapshot should not be taken filename, err := snapshotter.TakeSnapshot(filesToSnapshot, false, false) if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } if filename != "" { t.Fatalf("Filename returned is expected to be empty.") } } func TestSnapshotIncludesParentDirBeforeWhiteoutFile(t *testing.T) { testDir, snapshotter, cleanup, err := setUpTest(t) defer cleanup() if err != nil { t.Fatal(err) } // Take a snapshot filesToSnapshot := []string{filepath.Join(testDir, "kaniko/file", "bar/bat")} _, err = snapshotter.TakeSnapshot(filesToSnapshot, false, false) if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } // Add a file newFiles := map[string]string{ "kaniko/new-file": "baz", } if err := testutil.SetupFiles(testDir, newFiles); err != nil { t.Fatalf("Error setting up fs: %s", err) } filesToSnapshot = append(filesToSnapshot, filepath.Join(testDir, "kaniko/new-file")) // Delete files filesToDelete := []string{"kaniko/file", "bar"} for _, fn := range filesToDelete { err = os.RemoveAll(filepath.Join(testDir, fn)) if err != nil { t.Fatalf("Error deleting file: %s", err) } } // Take a snapshot again tarPath, err := snapshotter.TakeSnapshot(filesToSnapshot, true, false) if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } actualFiles, err := listFilesInTar(tarPath) if err != nil { t.Fatal(err) } testDirWithoutLeadingSlash := strings.TrimLeft(testDir, "/") expectedFiles := []string{ filepath.Join(testDirWithoutLeadingSlash, "kaniko/.wh.file"), filepath.Join(testDirWithoutLeadingSlash, "kaniko/new-file"), filepath.Join(testDirWithoutLeadingSlash, ".wh.bar"), "/", } for parentDir := filepath.Dir(expectedFiles[0]); parentDir != "."; parentDir = filepath.Dir(parentDir) { expectedFiles = append(expectedFiles, parentDir+"/") } // Sorting does the right thing in this case. The expected order for a directory is: // Parent dirs first, then whiteout files in the directory, then other files in that directory sort.Strings(expectedFiles) testutil.CheckErrorAndDeepEqual(t, false, nil, expectedFiles, actualFiles) } func TestSnapshotPreservesWhiteoutOrder(t *testing.T) { newFiles := map[string]string{ "foo": "newbaz1", "bar/bat": "baz", "bar/qux": "quuz", "qux": "quuz", "corge": "grault", "garply": "waldo", "fred": "plugh", "xyzzy": "thud", } newFileNames := []string{} for fileName := range newFiles { newFileNames = append(newFileNames, fileName) } filesInTars := [][]string{} for i := 0; i <= 2; i++ { testDir, snapshotter, cleanup, err := setUpTest(t) testDirWithoutLeadingSlash := strings.TrimLeft(testDir, "/") defer cleanup() if err != nil { t.Fatal(err) } // Make some changes to the filesystem if err := testutil.SetupFiles(testDir, newFiles); err != nil { t.Fatalf("Error setting up fs: %s", err) } filesToSnapshot := []string{} for _, file := range newFileNames { filesToSnapshot = append(filesToSnapshot, filepath.Join(testDir, file)) } // Take a snapshot _, err = snapshotter.TakeSnapshot(filesToSnapshot, false, false) if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } // Delete all files for p := range newFiles { err := os.Remove(filepath.Join(testDir, p)) if err != nil { t.Fatalf("Error deleting file: %s", err) } } // Take a snapshot again tarPath, err := snapshotter.TakeSnapshot(filesToSnapshot, true, false) if err != nil { t.Fatalf("Error taking snapshot of fs: %s", err) } filesInTar, err := listFilesInTar(tarPath) if err != nil { t.Fatal(err) } filesInTars = append(filesInTars, []string{}) for _, fn := range filesInTar { filesInTars[i] = append(filesInTars[i], strings.TrimPrefix(fn, testDirWithoutLeadingSlash)) } } // Check contents of all snapshots, make sure files appear in consistent order for i := 1; i < len(filesInTars); i++ { testutil.CheckErrorAndDeepEqual(t, false, nil, filesInTars[0], filesInTars[i]) } } func TestSnapshotOmitsUnameGname(t *testing.T) { _, snapshotter, cleanup, err := setUpTest(t) defer cleanup() if err != nil { t.Fatal(err) } tarPath, err := snapshotter.TakeSnapshotFS() if err != nil { t.Fatal(err) } f, err := os.Open(tarPath) if err != nil { t.Fatal(err) } tr := tar.NewReader(f) for { hdr, err := tr.Next() if errors.Is(err, io.EOF) { break } if err != nil { t.Fatal(err) } if hdr.Uname != "" || hdr.Gname != "" { t.Fatalf("Expected Uname/Gname for %s to be empty: Uname = '%s', Gname = '%s'", hdr.Name, hdr.Uname, hdr.Gname) } } } func setupSymlink(dir string, link string, target string) error { return os.Symlink(target, filepath.Join(dir, link)) } func sortAndCompareFilepaths(t *testing.T, testDir string, expected []string, actual []string) { expectedFullPaths := make([]string, len(expected)) for i, file := range expected { expectedFullPaths[i] = filepath.Join(testDir, file) } sort.Strings(expectedFullPaths) sort.Strings(actual) testutil.CheckDeepEqual(t, expectedFullPaths, actual) } func setUpTestDir(t *testing.T) (string, error) { testDir := t.TempDir() files := map[string]string{ "foo": "baz1", "bar/bat": "baz2", "kaniko/file": "file", "baz/file": "testfile", } // Set up initial files if err := testutil.SetupFiles(testDir, files); err != nil { return "", errors.Wrap(err, "setting up file system") } return testDir, nil } func setUpTest(t *testing.T) (string, *Snapshotter, func(), error) { testDir, err := setUpTestDir(t) if err != nil { return "", nil, nil, err } snapshotPath := t.TempDir() snapshotPathPrefix = snapshotPath // Take the initial snapshot l := NewLayeredMap(util.Hasher()) snapshotter := NewSnapshotter(l, testDir) if err := snapshotter.Init(); err != nil { return "", nil, nil, errors.Wrap(err, "initializing snapshotter") } original := config.KanikoDir config.KanikoDir = testDir cleanup := func() { config.KanikoDir = original } return testDir, snapshotter, cleanup, nil } func listFilesInTar(path string) ([]string, error) { f, err := os.Open(path) if err != nil { return nil, err } tr := tar.NewReader(f) var files []string for { hdr, err := tr.Next() if errors.Is(err, io.EOF) { break } if err != nil { return nil, err } files = append(files, hdr.Name) } return files, nil } ================================================ FILE: pkg/timing/timing.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package timing import ( "bytes" "encoding/json" "sync" "text/template" "time" ) // For testing var currentTimeFunc = time.Now // DefaultRun is the default "singleton" TimedRun instance. var DefaultRun = NewTimedRun() // TimedRun provides a running store of how long is spent in each category. type TimedRun struct { cl sync.Mutex categories map[string]time.Duration // protected by cl } // Stop stops the specified timer and increments the time spent in that category. func (tr *TimedRun) Stop(t *Timer) { stop := currentTimeFunc() tr.cl.Lock() defer tr.cl.Unlock() if _, ok := tr.categories[t.category]; !ok { tr.categories[t.category] = 0 } tr.categories[t.category] += stop.Sub(t.startTime) } // Start starts a new Timer and returns it. func Start(category string) *Timer { t := Timer{ category: category, startTime: currentTimeFunc(), } return &t } // NewTimedRun returns an initialized TimedRun instance. func NewTimedRun() *TimedRun { tr := TimedRun{ categories: map[string]time.Duration{}, } return &tr } // Timer represents a running timer. type Timer struct { category string startTime time.Time } // DefaultFormat is a default format string used by Summary. var DefaultFormat = template.Must(template.New("").Parse("{{range $c, $t := .}}{{$c}}: {{$t}}\n{{end}}")) // Summary outputs a summary of the DefaultTimedRun. func Summary() string { return DefaultRun.Summary() } func JSON() (string, error) { return DefaultRun.JSON() } // Summary outputs a summary of the specified TimedRun. func (tr *TimedRun) Summary() string { b := bytes.Buffer{} tr.cl.Lock() defer tr.cl.Unlock() DefaultFormat.Execute(&b, tr.categories) return b.String() } func (tr *TimedRun) JSON() (string, error) { b, err := json.Marshal(tr.categories) if err != nil { return "", err } return string(b), nil } ================================================ FILE: pkg/timing/timing_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package timing import ( "testing" "time" ) func patchTime(timeFunc func() time.Time) func() { old := currentTimeFunc currentTimeFunc = timeFunc return func() { currentTimeFunc = old } } func mockTimeFunc(t time.Time) func() time.Time { return func() time.Time { return t } } func TestTimedRun_StartStop(t *testing.T) { type args struct { categories map[string]time.Duration category string waitTime time.Duration } tests := []struct { name string args args want time.Duration }{ { name: "new category", args: args{ categories: map[string]time.Duration{}, category: "foo", waitTime: 3 * time.Second, }, want: 3 * time.Second, }, { name: "existing category", args: args{ categories: map[string]time.Duration{ "foo": 4 * time.Second, }, category: "foo", waitTime: 2 * time.Second, }, want: 6 * time.Second, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tr := &TimedRun{ categories: tt.args.categories, } timer := Timer{ category: tt.args.category, startTime: time.Time{}, } defer patchTime(mockTimeFunc(timer.startTime.Add(tt.args.waitTime)))() tr.Stop(&timer) if got := tr.categories[tt.args.category]; got != tt.want { t.Errorf("Expected %d, got %d", tt.want, got) } }) } } func TestTimedRun_Summary(t *testing.T) { type fields struct { categories map[string]time.Duration } tests := []struct { name string fields fields want string }{ { name: "single key", fields: fields{ categories: map[string]time.Duration{ "foo": 3 * time.Second, }, }, want: "foo: 3s\n", }, { name: "two keys", fields: fields{ categories: map[string]time.Duration{ "foo": 3 * time.Second, "bar": 1 * time.Second, }, }, want: "bar: 1s\nfoo: 3s\n", }, { name: "units", fields: fields{ categories: map[string]time.Duration{ "foo": 3 * time.Second, "bar": 1 * time.Millisecond, }, }, want: "bar: 1ms\nfoo: 3s\n", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tr := &TimedRun{ categories: tt.fields.categories, } if got := tr.Summary(); got != tt.want { t.Errorf("TimedRun.Summary() = %v, want %v", got, tt.want) } }) } } ================================================ FILE: pkg/util/.editorconfig ================================================ root = true [*] ================================================ FILE: pkg/util/azureblob_util.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "regexp" "github.com/GoogleContainerTools/kaniko/pkg/constants" ) // Validate if the host url provided is with correct suffix for AzureCloud, AzureChinaCloud, AzureGermanCloud and AzureUSGovernment // RegEX for supported suffix defined in constants.AzureBlobStorageHostRegEx func ValidAzureBlobStorageHost(context string) bool { for _, re := range constants.AzureBlobStorageHostRegEx { validBlobURL := regexp.MustCompile(re) if validBlobURL.MatchString(context) { return true } } return false } ================================================ FILE: pkg/util/azureblob_util_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "testing" "github.com/GoogleContainerTools/kaniko/testutil" ) func Test_ValidAzureBlobStorageHost(t *testing.T) { tests := []struct { name string context string expectedResult bool }{ { name: "AzureCloud", context: "https://myaccount.blob.core.windows.net/fairingcontext/context.tar.gz", expectedResult: true, }, { name: "AzureChinaCloud", context: "https://myaccount.blob.core.chinacloudapi.cn/fairingcontext/context.tar.gz", expectedResult: true, }, { name: "AzureGermanCloud", context: "https://myaccount.blob.core.cloudapi.de/fairingcontext/context.tar.gz", expectedResult: true, }, { name: "AzureUSGovernment", context: "https://myaccount.blob.core.usgovcloudapi.net/fairingcontext/context.tar.gz", expectedResult: true, }, { name: "Invalid Azure Blob Storage Hostname", context: "https://myaccount.anything.core.windows.net/fairingcontext/context.tar.gz", expectedResult: false, }, { name: "URL Missing Accountname", context: "https://blob.core.windows.net/fairingcontext/context.tar.gz", expectedResult: false, }, { name: "URL Missing Containername", context: "https://myaccount.blob.core.windows.net/", expectedResult: false, }, { name: "URL with folder structure", context: "https://myaccount.blob.core.windows.net/fairingcontext/path/to/context.tar.gz", expectedResult: true, }, { name: "URL with $root container", context: "https://myaccount.blob.core.windows.net/$root/context.tar.gz", expectedResult: true, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { result := ValidAzureBlobStorageHost(test.context) testutil.CheckDeepEqual(t, test.expectedResult, result) }) } } ================================================ FILE: pkg/util/bucket/bucket_util.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package bucket import ( "context" "fmt" "io" "net/url" "strings" "cloud.google.com/go/storage" "github.com/GoogleContainerTools/kaniko/pkg/constants" "google.golang.org/api/option" ) // Upload uploads everything from Reader to the bucket under path func Upload(ctx context.Context, bucketName string, path string, r io.Reader, client *storage.Client) error { bucket := client.Bucket(bucketName) w := bucket.Object(path).NewWriter(ctx) if _, err := io.Copy(w, r); err != nil { return err } if err := w.Close(); err != nil { return err } return nil } // Delete will remove the content at path. path should be the full path // to a file in GCS. func Delete(ctx context.Context, bucketName string, path string, client *storage.Client) error { err := client.Bucket(bucketName).Object(path).Delete(ctx) if err != nil { return fmt.Errorf("failed to delete file at %s in gcs bucket %v: %w", path, bucketName, err) } return err } // ReadCloser will create io.ReadCloser for the specified bucket and path func ReadCloser(ctx context.Context, bucketName string, path string, client *storage.Client) (io.ReadCloser, error) { bucket := client.Bucket(bucketName) r, err := bucket.Object(path).NewReader(ctx) if err != nil { return nil, err } return r, nil } // NewClient returns a new google storage client func NewClient(ctx context.Context, opts ...option.ClientOption) (*storage.Client, error) { client, err := storage.NewClient(ctx, opts...) if err != nil { return nil, err } return client, err } // GetNameAndFilepathFromURI returns the bucketname and the path to the item inside. // Will error if provided URI is not a valid URL. // If the filepath is empty, returns the contextTar filename func GetNameAndFilepathFromURI(bucketURI string) (bucketName string, path string, err error) { url, err := url.Parse(bucketURI) if err != nil { return "", "", err } bucketName = url.Host // remove leading slash filePath := strings.TrimPrefix(url.Path, "/") if filePath == "" { filePath = constants.ContextTar } return bucketName, filePath, nil } ================================================ FILE: pkg/util/bucket/bucket_util_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package bucket import ( "testing" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/testutil" ) func Test_GetBucketAndItem(t *testing.T) { tests := []struct { name string context string expectedBucket string expectedItem string expectedErr bool }{ { name: "three slashes", context: "gs://test1/test2/test3", expectedBucket: "test1", expectedItem: "test2/test3", }, { name: "two slashes", context: "gs://test1/test2", expectedBucket: "test1", expectedItem: "test2", }, { name: "one slash", context: "gs://test1/", expectedBucket: "test1", expectedItem: constants.ContextTar, }, { name: "zero slash", context: "gs://test1", expectedBucket: "test1", expectedItem: constants.ContextTar, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { gotBucket, gotItem, err := GetNameAndFilepathFromURI(test.context) testutil.CheckError(t, test.expectedErr, err) testutil.CheckDeepEqual(t, test.expectedBucket, gotBucket) testutil.CheckDeepEqual(t, test.expectedItem, gotItem) }) } } ================================================ FILE: pkg/util/command_util.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "fmt" "io/fs" "net/url" "os" "os/user" "path/filepath" "strconv" "strings" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/moby/buildkit/frontend/dockerfile/parser" "github.com/moby/buildkit/frontend/dockerfile/shell" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/GoogleContainerTools/kaniko/pkg/config" ) // for testing var ( getUIDAndGIDFunc = getUIDAndGID ) const ( pathSeparator = "/" ) // ResolveEnvironmentReplacementList resolves a list of values by calling resolveEnvironmentReplacement func ResolveEnvironmentReplacementList(values, envs []string, isFilepath bool) ([]string, error) { var resolvedValues []string for _, value := range values { resolved, err := ResolveEnvironmentReplacement(value, envs, isFilepath) logrus.Debugf("Resolved %s to %s", value, resolved) if err != nil { return nil, err } resolvedValues = append(resolvedValues, resolved) } return resolvedValues, nil } // ResolveEnvironmentReplacement resolves replacing env variables in some text from envs // It takes in a string representation of the command, the value to be resolved, and a list of envs (config.Env) // Ex: value = $foo/newdir, envs = [foo=/foodir], then this should return /foodir/newdir // The dockerfile/shell package handles processing env values // It handles escape characters and supports expansion from the config.Env array // Shlex handles some of the following use cases (these and more are tested in integration tests) // ""a'b'c"" -> "a'b'c" // "Rex\ The\ Dog \" -> "Rex The Dog" // "a\"b" -> "a"b" func ResolveEnvironmentReplacement(value string, envs []string, isFilepath bool) (string, error) { shlex := shell.NewLex(parser.DefaultEscapeToken) fp, _, err := shlex.ProcessWord(value, shell.EnvsFromSlice(envs)) // Check after replacement if value is a remote URL if !isFilepath || IsSrcRemoteFileURL(fp) { return fp, err } if err != nil { return "", err } isDir := strings.HasSuffix(fp, pathSeparator) fp = filepath.Clean(fp) if isDir && !strings.HasSuffix(fp, pathSeparator) { fp = fp + pathSeparator } return fp, nil } func ResolveEnvAndWildcards(sd instructions.SourcesAndDest, fileContext FileContext, envs []string) ([]string, string, error) { // First, resolve any environment replacement resolvedEnvs, err := ResolveEnvironmentReplacementList(sd.SourcePaths, envs, true) if err != nil { return nil, "", errors.Wrap(err, "failed to resolve environment") } if len(resolvedEnvs) == 0 { return nil, "", errors.New("resolved envs is empty") } dests, err := ResolveEnvironmentReplacementList([]string{sd.DestPath}, envs, true) if err != nil { return nil, "", errors.Wrap(err, "failed to resolve environment for dest path") } dest := dests[0] sd.DestPath = dest // Resolve wildcards and get a list of resolved sources srcs, err := ResolveSources(resolvedEnvs, fileContext.Root) if err != nil { return nil, "", errors.Wrap(err, "failed to resolve sources") } err = IsSrcsValid(sd, srcs, fileContext) return srcs, dest, err } // ContainsWildcards returns true if any entry in paths contains wildcards func ContainsWildcards(paths []string) bool { for _, path := range paths { if strings.ContainsAny(path, "*?[") { return true } } return false } // ResolveSources resolves the given sources if the sources contains wildcards // It returns a list of resolved sources func ResolveSources(srcs []string, root string) ([]string, error) { // If sources contain wildcards, we first need to resolve them to actual paths if !ContainsWildcards(srcs) { return srcs, nil } logrus.Infof("Resolving srcs %v...", srcs) files, err := RelativeFiles("", root) if err != nil { return nil, errors.Wrap(err, "resolving sources") } resolved, err := matchSources(srcs, files) if err != nil { return nil, errors.Wrap(err, "matching sources") } logrus.Debugf("Resolved sources to %v", resolved) return resolved, nil } // matchSources returns a list of sources that match wildcards func matchSources(srcs, files []string) ([]string, error) { var matchedSources []string for _, src := range srcs { if IsSrcRemoteFileURL(src) { matchedSources = append(matchedSources, src) continue } src = filepath.Clean(src) for _, file := range files { if filepath.IsAbs(src) { file = filepath.Join(config.RootDir, file) } matched, err := filepath.Match(src, file) if err != nil { return nil, err } if matched || src == file { matchedSources = append(matchedSources, file) } } } return matchedSources, nil } func IsDestDir(path string) bool { // try to stat the path fileInfo, err := os.Stat(path) if err != nil { // fall back to string-based determination return strings.HasSuffix(path, pathSeparator) || path == "." } // if it's a real path, check the fs response return fileInfo.IsDir() } // DestinationFilepath returns the destination filepath from the build context to the image filesystem // If source is a file: // // If dest is a dir, copy it to /dest/relpath // If dest is a file, copy directly to dest // // If source is a dir: // // Assume dest is also a dir, and copy to dest/ // // If dest is not an absolute filepath, add /cwd to the beginning func DestinationFilepath(src, dest, cwd string) (string, error) { _, srcFileName := filepath.Split(src) newDest := dest if !filepath.IsAbs(newDest) { newDest = filepath.Join(cwd, newDest) // join call clean on all results. if strings.HasSuffix(dest, pathSeparator) || strings.HasSuffix(dest, ".") { newDest += pathSeparator } } if IsDestDir(newDest) { newDest = filepath.Join(newDest, srcFileName) } if len(srcFileName) <= 0 && !strings.HasSuffix(newDest, pathSeparator) { newDest += pathSeparator } return newDest, nil } // URLDestinationFilepath gives the destination a file from a remote URL should be saved to func URLDestinationFilepath(rawurl, dest, cwd string, envs []string) (string, error) { if !IsDestDir(dest) { if !filepath.IsAbs(dest) { return filepath.Join(cwd, dest), nil } return dest, nil } urlBase, err := ResolveEnvironmentReplacement(rawurl, envs, true) if err != nil { return "", err } urlBase, err = extractFilename(urlBase) if err != nil { return "", err } destPath := filepath.Join(dest, urlBase) if !filepath.IsAbs(dest) { destPath = filepath.Join(cwd, destPath) } return destPath, nil } func IsSrcsValid(srcsAndDest instructions.SourcesAndDest, resolvedSources []string, fileContext FileContext) error { srcs := srcsAndDest.SourcePaths dest := srcsAndDest.DestPath if !ContainsWildcards(srcs) { totalSrcs := 0 for _, src := range srcs { if fileContext.ExcludesFile(src) { continue } totalSrcs++ } if totalSrcs > 1 && !IsDestDir(dest) { return errors.New("when specifying multiple sources in a COPY command, destination must be a directory and end in '/'") } } // If there is only one source and it's a directory, docker assumes the dest is a directory if len(resolvedSources) == 1 { if IsSrcRemoteFileURL(resolvedSources[0]) { return nil } path := filepath.Join(fileContext.Root, resolvedSources[0]) fi, err := os.Lstat(path) if err != nil { return errors.Wrap(err, fmt.Sprintf("failed to get fileinfo for %v", path)) } if fi.IsDir() { return nil } } totalFiles := 0 for _, src := range resolvedSources { if IsSrcRemoteFileURL(src) { totalFiles++ continue } src = filepath.Clean(src) files, err := RelativeFiles(src, fileContext.Root) if err != nil { return errors.Wrap(err, "failed to get relative files") } for _, file := range files { if fileContext.ExcludesFile(file) { continue } totalFiles++ } } // ignore the case where whildcards and there are no files to copy if totalFiles == 0 { // using log warning instead of return errors.New("copy failed: no source files specified") logrus.Warn("No files to copy") } // If there are wildcards, and the destination is a file, there must be exactly one file to copy over, // Otherwise, return an error if !IsDestDir(dest) && totalFiles > 1 { return errors.New("when specifying multiple sources in a COPY command, destination must be a directory and end in '/'") } return nil } func IsSrcRemoteFileURL(rawurl string) bool { u, err := url.ParseRequestURI(rawurl) return err == nil && u.Scheme != "" && u.Host != "" } func UpdateConfigEnv(envVars []instructions.KeyValuePair, config *v1.Config, replacementEnvs []string) error { newEnvs := make([]instructions.KeyValuePair, len(envVars)) for index, pair := range envVars { expandedKey, err := ResolveEnvironmentReplacement(pair.Key, replacementEnvs, false) if err != nil { return err } expandedValue, err := ResolveEnvironmentReplacement(pair.Value, replacementEnvs, false) if err != nil { return err } newEnvs[index] = instructions.KeyValuePair{ Key: expandedKey, Value: expandedValue, } } // First, convert config.Env array to []instruction.KeyValuePair var kvps []instructions.KeyValuePair for _, env := range config.Env { entry := strings.SplitN(env, "=", 2) kvps = append(kvps, instructions.KeyValuePair{ Key: entry[0], Value: entry[1], }) } // Iterate through new environment variables, and replace existing keys // We can't use a map because we need to preserve the order of the environment variables Loop: for _, newEnv := range newEnvs { for index, kvp := range kvps { // If key exists, replace the KeyValuePair... if kvp.Key == newEnv.Key { logrus.Debugf("Replacing environment variable %v with %v in config", kvp, newEnv) kvps[index] = newEnv continue Loop } } // ... Else, append it as a new env variable kvps = append(kvps, newEnv) } // Convert back to array and set in config envArray := []string{} for _, kvp := range kvps { entry := kvp.Key + "=" + kvp.Value envArray = append(envArray, entry) } config.Env = envArray return nil } func GetUserGroup(chownStr string, env []string) (int64, int64, error) { if chownStr == "" { return DoNotChangeUID, DoNotChangeGID, nil } chown, err := ResolveEnvironmentReplacement(chownStr, env, false) if err != nil { return -1, -1, err } uid32, gid32, err := getUIDAndGIDFromString(chown) if err != nil { return -1, -1, err } return int64(uid32), int64(gid32), nil } func GetChmod(chmodStr string, env []string) (chmod fs.FileMode, useDefault bool, err error) { if chmodStr == "" { return fs.FileMode(0o600), true, nil } chmodStr, err = ResolveEnvironmentReplacement(chmodStr, env, false) if err != nil { return 0, false, err } mode, err := strconv.ParseUint(chmodStr, 8, 32) if err != nil { return 0, false, errors.Wrap(err, "parsing value from chmod") } chmod = fs.FileMode(mode) return } // Extract user and group id from a string formatted 'user:group'. // UserID and GroupID don't need to be present on the system. func getUIDAndGIDFromString(userGroupString string) (uint32, uint32, error) { userAndGroup := strings.Split(userGroupString, ":") userStr := userAndGroup[0] var groupStr string if len(userAndGroup) > 1 { groupStr = userAndGroup[1] } return getUIDAndGIDFunc(userStr, groupStr) } func getUIDAndGID(userStr string, groupStr string) (uint32, uint32, error) { user, err := LookupUser(userStr) if err != nil { return 0, 0, err } uid32, err := getUID(user.Uid) if err != nil { return 0, 0, err } if groupStr != "" { gid32, err := getGIDFromName(groupStr) if err != nil { if errors.Is(err, fallbackToUIDError) { return uid32, uid32, nil } return 0, 0, err } return uid32, gid32, nil } return uid32, uid32, nil } // getGID tries to parse the gid func getGID(groupStr string) (uint32, error) { gid, err := strconv.ParseUint(groupStr, 10, 32) if err != nil { return 0, err } return uint32(gid), nil } // getGIDFromName tries to parse the groupStr into an existing group. func getGIDFromName(groupStr string) (uint32, error) { group, err := user.LookupGroup(groupStr) if err != nil { // unknown group error could relate to a non existing group var groupErr user.UnknownGroupError if errors.As(err, &groupErr) { return getGID(groupStr) } group, err = user.LookupGroupId(groupStr) if err != nil { return getGID(groupStr) } } return getGID(group.Gid) } var fallbackToUIDError = new(fallbackToUIDErrorType) type fallbackToUIDErrorType struct{} func (e fallbackToUIDErrorType) Error() string { return "fallback to uid" } // LookupUser will try to lookup the userStr inside the passwd file. // If the user does not exists, the function will fallback to parsing the userStr as an uid. func LookupUser(userStr string) (*user.User, error) { userObj, err := user.Lookup(userStr) if err != nil { unknownUserErr := new(user.UnknownUserError) // only return if it's not an unknown user error or the passwd file does not exist if !errors.As(err, unknownUserErr) && !os.IsNotExist(err) { return nil, err } // Lookup by id userObj, err = user.LookupId(userStr) if err != nil { uid, err := getUID(userStr) if err != nil { // at this point, the user does not exist and the userStr is not a valid number. return nil, fmt.Errorf("user %v is not a uid and does not exist on the system", userStr) } userObj = &user.User{ Uid: fmt.Sprint(uid), HomeDir: "/", } } } return userObj, nil } func getUID(userStr string) (uint32, error) { // checkif userStr is a valid id uid, err := strconv.ParseUint(userStr, 10, 32) if err != nil { return 0, err } return uint32(uid), nil } // ExtractFilename extracts the filename from a URL without its query url func extractFilename(rawURL string) (string, error) { parsedURL, err := url.Parse(rawURL) if err != nil { return "", err } filename := filepath.Base(parsedURL.Path) return filename, nil } ================================================ FILE: pkg/util/command_util_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "fmt" "io/fs" "os/user" "reflect" "sort" "strconv" "testing" "github.com/GoogleContainerTools/kaniko/testutil" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" ) var testURL = "https://github.com/GoogleContainerTools/runtimes-common/blob/master/LICENSE" var testEnvReplacement = []struct { path string envs []string isFilepath bool expectedPath string }{ { path: "/simple/path", envs: []string{ "simple=/path/", }, isFilepath: true, expectedPath: "/simple/path", }, { path: "/simple/path/", envs: []string{ "simple=/path/", }, isFilepath: true, expectedPath: "/simple/path/", }, { path: "$simple", envs: []string{ "simple=/path/", }, isFilepath: true, expectedPath: "/path/", }, { path: "${a}/b", envs: []string{ "a=/path/", "b=/path2/", }, isFilepath: true, expectedPath: "/path/b", }, { path: "/$a/b", envs: []string{ "a=/path/", "b=/path2/", }, isFilepath: true, expectedPath: "/path/b", }, { path: "/$a/b/", envs: []string{ "a=/path/", "b=/path2/", }, isFilepath: true, expectedPath: "/path/b/", }, { path: "\\$foo", envs: []string{ "foo=/path/", }, isFilepath: true, expectedPath: "$foo", }, { path: "8080/$protocol", envs: []string{ "protocol=udp", }, expectedPath: "8080/udp", }, { path: "8080/$protocol", envs: []string{ "protocol=udp", }, expectedPath: "8080/udp", }, { path: "$url", envs: []string{ "url=http://example.com", }, isFilepath: true, expectedPath: "http://example.com", }, { path: "$url", envs: []string{ "url=http://example.com", }, isFilepath: false, expectedPath: "http://example.com", }, } func Test_EnvReplacement(t *testing.T) { for _, test := range testEnvReplacement { actualPath, err := ResolveEnvironmentReplacement(test.path, test.envs, test.isFilepath) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedPath, actualPath) } } var buildContextPath = "../../integration/" var destinationFilepathTests = []struct { src string dest string cwd string expectedFilepath string }{ { src: "context/foo", dest: "/foo", cwd: "/", expectedFilepath: "/foo", }, { src: "context/foo", dest: "/foodir/", cwd: "/", expectedFilepath: "/foodir/foo", }, { src: "context/foo", cwd: "/", dest: "foo", expectedFilepath: "/foo", }, { src: "context/bar/", cwd: "/", dest: "pkg/", expectedFilepath: "/pkg/", }, { src: "context/bar/", cwd: "/newdir", dest: "pkg/", expectedFilepath: "/newdir/pkg/", }, { src: "./context/empty", cwd: "/", dest: "/empty", expectedFilepath: "/empty", }, { src: "./context/empty", cwd: "/dir", dest: "/empty", expectedFilepath: "/empty", }, { src: "./", cwd: "/", dest: "/dir", expectedFilepath: "/dir/", }, { src: "context/foo", cwd: "/test", dest: ".", expectedFilepath: "/test/foo", }, } func Test_DestinationFilepath(t *testing.T) { for _, test := range destinationFilepathTests { actualFilepath, err := DestinationFilepath(test.src, test.dest, test.cwd) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedFilepath, actualFilepath) } } var urlDestFilepathTests = []struct { url string cwd string dest string expectedDest string envs []string }{ { url: "https://something/something", cwd: "/test", dest: ".", expectedDest: "/test/something", }, { url: "https://something/something", cwd: "/cwd", dest: "/test", expectedDest: "/test", }, { url: "https://something/something.tar?foo=bar", cwd: "/cwd", dest: "/dir/", expectedDest: "/dir/something.tar", }, { url: "https://something/something", cwd: "/test", dest: "/dest/", expectedDest: "/dest/something", }, { url: "https://something/$foo.tar.gz", cwd: "/test", dest: "/foo/", expectedDest: "/foo/bar.tar.gz", envs: []string{"foo=bar"}, }, } func Test_UrlDestFilepath(t *testing.T) { for _, test := range urlDestFilepathTests { actualDest, err := URLDestinationFilepath(test.url, test.dest, test.cwd, test.envs) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedDest, actualDest) } } var matchSourcesTests = []struct { srcs []string files []string expectedFiles []string }{ { srcs: []string{ "pkg/*", "/root/dir?", testURL, }, files: []string{ "pkg/a", "pkg/b", "/pkg/d", "pkg/b/d/", "dir/", "root/dir1", }, expectedFiles: []string{ "/root/dir1", "pkg/a", "pkg/b", testURL, }, }, } func Test_MatchSources(t *testing.T) { for _, test := range matchSourcesTests { actualFiles, err := matchSources(test.srcs, test.files) sort.Strings(actualFiles) sort.Strings(test.expectedFiles) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedFiles, actualFiles) } } var updateConfigEnvTests = []struct { name string envVars []instructions.KeyValuePair config *v1.Config replacementEnvs []string expectedEnv []string }{ { name: "test env config update", envVars: []instructions.KeyValuePair{ { Key: "key", Value: "var", }, { Key: "foo", Value: "baz", }, }, config: &v1.Config{}, replacementEnvs: []string{}, expectedEnv: []string{"key=var", "foo=baz"}, }, { name: "test env config update with replacmenets", envVars: []instructions.KeyValuePair{ { Key: "key", Value: "/var/run", }, { Key: "env", Value: "$var", }, { Key: "foo", Value: "$argarg", }, }, config: &v1.Config{}, replacementEnvs: []string{"var=/test/with'chars'/", "not=used", "argarg=\"a\"b\""}, expectedEnv: []string{"key=/var/run", "env=/test/with'chars'/", "foo=\"a\"b\""}, }, { name: "test env config update replacing existing variable", envVars: []instructions.KeyValuePair{ { Key: "alice", Value: "nice", }, { Key: "bob", Value: "cool", }, }, config: &v1.Config{Env: []string{"bob=used", "more=test"}}, replacementEnvs: []string{}, expectedEnv: []string{"bob=cool", "more=test", "alice=nice"}, }, } func Test_UpdateConfigEnvTests(t *testing.T) { for _, test := range updateConfigEnvTests { t.Run(test.name, func(t *testing.T) { if err := UpdateConfigEnv(test.envVars, test.config, test.replacementEnvs); err != nil { t.Fatalf("error updating config with env vars: %s", err) } testutil.CheckDeepEqual(t, test.expectedEnv, test.config.Env) }) } } var isSrcValidTests = []struct { name string srcsAndDest []string resolvedSources []string shouldErr bool }{ { name: "dest isn't directory", srcsAndDest: []string{ "context/foo", "context/bar", "dest", }, resolvedSources: []string{ "context/foo", "context/bar", }, shouldErr: true, }, { name: "dest is directory", srcsAndDest: []string{ "context/foo", "context/bar", "dest/", }, resolvedSources: []string{ "context/foo", "context/bar", }, shouldErr: false, }, { name: "copy file to file", srcsAndDest: []string{ "context/bar/bam", "dest", }, resolvedSources: []string{ "context/bar/bam", }, shouldErr: false, }, { name: "copy files with wildcards to dir", srcsAndDest: []string{ "context/foo", "context/b*", "dest/", }, resolvedSources: []string{ "context/foo", "context/bar", }, shouldErr: false, }, { name: "copy multilple files with wildcards to file", srcsAndDest: []string{ "context/foo", "context/b*", "dest", }, resolvedSources: []string{ "context/foo", "context/bar", }, shouldErr: true, }, { name: "copy two files to file, one of which doesn't exist", srcsAndDest: []string{ "context/foo", "context/doesntexist*", "dest", }, resolvedSources: []string{ "context/foo", }, shouldErr: false, }, { name: "copy dir to dest not specified as dir", srcsAndDest: []string{ "context/", "dest", }, resolvedSources: []string{ "context/", }, shouldErr: false, }, { name: "copy url to file", srcsAndDest: []string{ testURL, "dest", }, resolvedSources: []string{ testURL, }, shouldErr: false, }, { name: "copy two srcs, one excluded, to file", srcsAndDest: []string{ "ignore/foo", "ignore/bar", "dest", }, resolvedSources: []string{ "ignore/foo", "ignore/bar", }, shouldErr: false, }, { name: "copy two srcs, both excluded, to file", srcsAndDest: []string{ "ignore/baz", "ignore/bar", "dest", }, resolvedSources: []string{ "ignore/baz", "ignore/bar", }, shouldErr: false, }, { name: "copy two srcs, wildcard and no file match, to file", srcsAndDest: []string{ "ignore/ba[s]", "dest", }, resolvedSources: []string{}, shouldErr: false, }, } func Test_IsSrcsValid(t *testing.T) { for _, test := range isSrcValidTests { t.Run(test.name, func(t *testing.T) { fileContext, err := NewFileContextFromDockerfile("", buildContextPath) if err != nil { t.Fatalf("error creating file context: %v", err) } err = IsSrcsValid(instructions.SourcesAndDest{SourcePaths: test.srcsAndDest[0 : len(test.srcsAndDest)-1], DestPath: test.srcsAndDest[len(test.srcsAndDest)-1]}, test.resolvedSources, fileContext) testutil.CheckError(t, test.shouldErr, err) }) } } var testResolveSources = []struct { srcsAndDest []string expectedList []string }{ { srcsAndDest: []string{ "context/foo", "context/b*", testURL, }, expectedList: []string{ "context/foo", "context/bar", testURL, }, }, } func Test_ResolveSources(t *testing.T) { for _, test := range testResolveSources { actualList, err := ResolveSources(test.srcsAndDest, buildContextPath) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedList, actualList) } } func TestGetUserGroup(t *testing.T) { tests := []struct { description string chown string env []string mockIDGetter func(userStr string, groupStr string) (uint32, uint32, error) // needed, in case uid is a valid number, but group is a name mockGroupIDGetter func(groupStr string) (*user.Group, error) expectedU int64 expectedG int64 shdErr bool }{ { description: "non empty chown", chown: "some:some", env: []string{}, mockIDGetter: func(string, string) (uint32, uint32, error) { return 100, 1000, nil }, expectedU: 100, expectedG: 1000, }, { description: "non empty chown with env replacement", chown: "some:$foo", env: []string{"foo=key"}, mockIDGetter: func(userStr string, groupStr string) (uint32, uint32, error) { if userStr == "some" && groupStr == "key" { return 10, 100, nil } return 0, 0, fmt.Errorf("did not resolve environment variable") }, expectedU: 10, expectedG: 100, }, { description: "empty chown string", mockIDGetter: func(string, string) (uint32, uint32, error) { return 0, 0, fmt.Errorf("should not be called") }, expectedU: -1, expectedG: -1, }, } for _, tc := range tests { t.Run(tc.description, func(t *testing.T) { originalIDGetter := getUIDAndGIDFunc defer func() { getUIDAndGIDFunc = originalIDGetter }() getUIDAndGIDFunc = tc.mockIDGetter uid, gid, err := GetUserGroup(tc.chown, tc.env) testutil.CheckErrorAndDeepEqual(t, tc.shdErr, err, uid, tc.expectedU) testutil.CheckErrorAndDeepEqual(t, tc.shdErr, err, gid, tc.expectedG) }) } } func TestGetChmod(t *testing.T) { tests := []struct { description string chmod string env []string expected fs.FileMode shdErr bool }{ { description: "non empty chmod", chmod: "0755", env: []string{}, expected: fs.FileMode(0o755), }, { description: "non empty chmod with env replacement", chmod: "$foo", env: []string{"foo=0750"}, expected: fs.FileMode(0o750), }, { description: "empty chmod string", expected: fs.FileMode(0o600), }, } for _, tc := range tests { t.Run(tc.description, func(t *testing.T) { defaultChmod := fs.FileMode(0o600) chmod, useDefault, err := GetChmod(tc.chmod, tc.env) if useDefault { chmod = defaultChmod } testutil.CheckErrorAndDeepEqual(t, tc.shdErr, err, tc.expected, chmod) }) } } func TestResolveEnvironmentReplacementList(t *testing.T) { type args struct { values []string envs []string isFilepath bool } tests := []struct { name string args args want []string wantErr bool }{ { name: "url", args: args{ values: []string{ "https://google.com/$foo", "$bar", "$url", }, envs: []string{ "foo=baz", "bar=bat", "url=https://google.com", }, }, want: []string{"https://google.com/baz", "bat", "https://google.com"}, }, { name: "mixed", args: args{ values: []string{ "$foo", "$bar$baz", "baz", }, envs: []string{ "foo=FOO", "bar=BAR", "baz=BAZ", }, }, want: []string{"FOO", "BARBAZ", "baz"}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := ResolveEnvironmentReplacementList(tt.args.values, tt.args.envs, tt.args.isFilepath) if (err != nil) != tt.wantErr { t.Errorf("ResolveEnvironmentReplacementList() error = %v, wantErr %v", err, tt.wantErr) return } if !reflect.DeepEqual(got, tt.want) { t.Errorf("ResolveEnvironmentReplacementList() = %v, want %v", got, tt.want) } }) } } func Test_GetUIDAndGIDFromString(t *testing.T) { currentUser := testutil.GetCurrentUser(t) type args struct { userGroupStr string } type expected struct { userID uint32 groupID uint32 } currentUserUID, _ := strconv.ParseUint(currentUser.Uid, 10, 32) currentUserGID, _ := strconv.ParseUint(currentUser.Gid, 10, 32) expectedCurrentUser := expected{ userID: uint32(currentUserUID), groupID: uint32(currentUserGID), } testCases := []struct { testname string args args expected expected wantErr bool }{ { testname: "current user uid and gid", args: args{ userGroupStr: fmt.Sprintf("%d:%d", currentUserUID, currentUserGID), }, expected: expectedCurrentUser, }, { testname: "current user username and gid", args: args{ userGroupStr: fmt.Sprintf("%s:%d", currentUser.Username, currentUserGID), }, expected: expectedCurrentUser, }, { testname: "current user username and primary group", args: args{ userGroupStr: fmt.Sprintf("%s:%s", currentUser.Username, currentUser.PrimaryGroup), }, expected: expectedCurrentUser, }, { testname: "current user uid and primary group", args: args{ userGroupStr: fmt.Sprintf("%d:%s", currentUserUID, currentUser.PrimaryGroup), }, expected: expectedCurrentUser, }, { testname: "non-existing valid uid and gid", args: args{ userGroupStr: fmt.Sprintf("%d:%d", 1001, 50000), }, expected: expected{ userID: 1001, groupID: 50000, }, }, { testname: "uid and existing group", args: args{ userGroupStr: fmt.Sprintf("%d:%s", 1001, currentUser.PrimaryGroup), }, expected: expected{ userID: 1001, groupID: expectedCurrentUser.groupID, }, }, { testname: "uid and non existing group-name", args: args{ userGroupStr: fmt.Sprintf("%d:%s", 1001, "hello-world-group"), }, wantErr: true, }, { testname: "name and non existing gid", args: args{ userGroupStr: fmt.Sprintf("%s:%d", currentUser.Username, 50000), }, expected: expected{ userID: expectedCurrentUser.userID, groupID: 50000, }, }, { testname: "only uid", args: args{ userGroupStr: fmt.Sprintf("%d", currentUserUID), }, expected: expected{ userID: expectedCurrentUser.userID, groupID: expectedCurrentUser.userID, }, }, { testname: "non-existing user without group", args: args{ userGroupStr: "helloworlduser", }, wantErr: true, }, } for _, tt := range testCases { uid, gid, err := getUIDAndGIDFromString(tt.args.userGroupStr) testutil.CheckError(t, tt.wantErr, err) if uid != tt.expected.userID || gid != tt.expected.groupID { t.Errorf("%v failed. Could not correctly decode %s to uid/gid %d:%d. Result: %d:%d", tt.testname, tt.args.userGroupStr, tt.expected.userID, tt.expected.groupID, uid, gid) } } } func TestLookupUser(t *testing.T) { currentUser := testutil.GetCurrentUser(t) type args struct { userStr string } tests := []struct { testname string args args expected *user.User wantErr bool }{ { testname: "non-existing user", args: args{ userStr: "foobazbar", }, wantErr: true, }, { testname: "uid", args: args{ userStr: "30000", }, expected: &user.User{ Uid: "30000", HomeDir: "/", }, wantErr: false, }, { testname: "current user", args: args{ userStr: currentUser.Username, }, expected: currentUser.User, wantErr: false, }, } for _, tt := range tests { t.Run(tt.testname, func(t *testing.T) { got, err := LookupUser(tt.args.userStr) testutil.CheckErrorAndDeepEqual(t, tt.wantErr, err, tt.expected, got) }) } } func TestIsSrcRemoteFileURL(t *testing.T) { type args struct { rawurl string } tests := []struct { name string args args want bool }{ { name: "valid https url", args: args{rawurl: "https://google.com?foo=bar"}, want: true, }, { name: "valid http url", args: args{rawurl: "http://example.com/foobar.tar.gz"}, want: true, }, { name: "invalid url", args: args{rawurl: "http:/not-a-url.com"}, want: false, }, { name: "invalid url filepath", args: args{rawurl: "/is/a/filepath"}, want: false, }, } for _, tt := range tests { t.Run( tt.name, func(t *testing.T) { if got := IsSrcRemoteFileURL(tt.args.rawurl); got != tt.want { t.Errorf("IsSrcRemoteFileURL() = %v, want %v", got, tt.want) } }, ) } } ================================================ FILE: pkg/util/fs_util.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "archive/tar" "bufio" "bytes" "fmt" "io" "io/fs" "math" "net/http" "os" "path/filepath" "strings" "syscall" "time" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/timing" "github.com/docker/docker/pkg/archive" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/karrick/godirwalk" "github.com/moby/buildkit/frontend/dockerfile/dockerignore" "github.com/moby/patternmatcher" otiai10Cpy "github.com/otiai10/copy" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) const ( DoNotChangeUID = -1 DoNotChangeGID = -1 ) const ( snapshotTimeout = "SNAPSHOT_TIMEOUT_DURATION" defaultTimeout = "90m" ) type IgnoreListEntry struct { Path string PrefixMatchOnly bool } var defaultIgnoreList = []IgnoreListEntry{ { Path: filepath.Clean(config.KanikoDir), PrefixMatchOnly: false, }, { // similarly, we ignore /etc/mtab, since there is no way to know if the file was mounted or came // from the base image Path: "/etc/mtab", PrefixMatchOnly: false, }, { // we ingore /tmp/apt-key-gpghome, since the apt keys are added temporarily in this directory. // from the base image Path: "/tmp/apt-key-gpghome", PrefixMatchOnly: true, }, } var ignorelist = append([]IgnoreListEntry{}, defaultIgnoreList...) var volumes = []string{} // skipKanikoDir opts to skip the '/kaniko' dir for otiai10.copy which should be ignored in root var skipKanikoDir = otiai10Cpy.Options{ Skip: func(info os.FileInfo, src, dest string) (bool, error) { return strings.HasSuffix(src, "/kaniko"), nil }, } type FileContext struct { Root string ExcludedFiles []string } type ExtractFunction func(string, *tar.Header, string, io.Reader) error type FSConfig struct { includeWhiteout bool extractFunc ExtractFunction } type FSOpt func(*FSConfig) func IgnoreList() []IgnoreListEntry { return ignorelist } func AddToIgnoreList(entry IgnoreListEntry) { ignorelist = append(ignorelist, IgnoreListEntry{ Path: filepath.Clean(entry.Path), PrefixMatchOnly: entry.PrefixMatchOnly, }) } func AddToDefaultIgnoreList(entry IgnoreListEntry) { defaultIgnoreList = append(defaultIgnoreList, IgnoreListEntry{ Path: filepath.Clean(entry.Path), PrefixMatchOnly: entry.PrefixMatchOnly, }) } func IncludeWhiteout() FSOpt { return func(opts *FSConfig) { opts.includeWhiteout = true } } func ExtractFunc(extractFunc ExtractFunction) FSOpt { return func(opts *FSConfig) { opts.extractFunc = extractFunc } } // GetFSFromImage extracts the layers of img to root // It returns a list of all files extracted func GetFSFromImage(root string, img v1.Image, extract ExtractFunction) ([]string, error) { if img == nil { return nil, errors.New("image cannot be nil") } layers, err := img.Layers() if err != nil { return nil, err } return GetFSFromLayers(root, layers, ExtractFunc(extract)) } func GetFSFromLayers(root string, layers []v1.Layer, opts ...FSOpt) ([]string, error) { volumes = []string{} cfg := new(FSConfig) if err := InitIgnoreList(); err != nil { return nil, errors.Wrap(err, "initializing filesystem ignore list") } logrus.Debugf("Ignore list: %v", ignorelist) for _, opt := range opts { opt(cfg) } if cfg.extractFunc == nil { return nil, errors.New("must supply an extract function") } extractedFiles := []string{} for i, l := range layers { if mediaType, err := l.MediaType(); err == nil { logrus.Tracef("Extracting layer %d of media type %s", i, mediaType) } else { logrus.Tracef("Extracting layer %d", i) } r, err := l.Uncompressed() if err != nil { return nil, err } defer r.Close() tr := tar.NewReader(r) for { hdr, err := tr.Next() if errors.Is(err, io.EOF) { break } if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("error reading tar %d", i)) } cleanedName := filepath.Clean(hdr.Name) path := filepath.Join(root, cleanedName) base := filepath.Base(path) dir := filepath.Dir(path) if strings.HasPrefix(base, archive.WhiteoutPrefix) { logrus.Tracef("Whiting out %s", path) name := strings.TrimPrefix(base, archive.WhiteoutPrefix) path := filepath.Join(dir, name) if CheckCleanedPathAgainstIgnoreList(path) { logrus.Tracef("Not deleting %s, as it's ignored", path) continue } if childDirInIgnoreList(path) { logrus.Tracef("Not deleting %s, as it contains a ignored path", path) continue } if err := os.RemoveAll(path); err != nil { return nil, errors.Wrapf(err, "removing whiteout %s", hdr.Name) } if !cfg.includeWhiteout { logrus.Trace("Not including whiteout files") continue } } if err := cfg.extractFunc(root, hdr, cleanedName, tr); err != nil { return nil, err } extractedFiles = append(extractedFiles, filepath.Join(root, cleanedName)) } } return extractedFiles, nil } // DeleteFilesystem deletes the extracted image file system func DeleteFilesystem() error { logrus.Info("Deleting filesystem...") return filepath.Walk(config.RootDir, func(path string, info os.FileInfo, err error) error { if err != nil { // ignore errors when deleting. return nil //nolint:nilerr } if CheckCleanedPathAgainstIgnoreList(path) { if !isExist(path) { logrus.Debugf("Path %s ignored, but not exists", path) return nil } if info.IsDir() { return filepath.SkipDir } logrus.Debugf("Not deleting %s, as it's ignored", path) return nil } if childDirInIgnoreList(path) { logrus.Debugf("Not deleting %s, as it contains a ignored path", path) return nil } if path == config.RootDir { return nil } return os.RemoveAll(path) }) } // isExists returns true if path exists func isExist(path string) bool { if _, err := os.Stat(path); err == nil { return true } return false } // childDirInIgnoreList returns true if there is a child file or directory of the path in the ignorelist func childDirInIgnoreList(path string) bool { for _, d := range ignorelist { if HasFilepathPrefix(d.Path, path, d.PrefixMatchOnly) { return true } } return false } // UnTar returns a list of files that have been extracted from the tar archive at r to the path at dest func UnTar(r io.Reader, dest string) ([]string, error) { var extractedFiles []string tr := tar.NewReader(r) for { hdr, err := tr.Next() if errors.Is(err, io.EOF) { break } if err != nil { return nil, err } cleanedName := filepath.Clean(hdr.Name) if err := ExtractFile(dest, hdr, cleanedName, tr); err != nil { return nil, err } extractedFiles = append(extractedFiles, filepath.Join(dest, cleanedName)) } return extractedFiles, nil } func ExtractFile(dest string, hdr *tar.Header, cleanedName string, tr io.Reader) error { path := filepath.Join(dest, cleanedName) base := filepath.Base(path) dir := filepath.Dir(path) mode := hdr.FileInfo().Mode() uid := hdr.Uid gid := hdr.Gid abs, err := filepath.Abs(path) if err != nil { return err } if CheckCleanedPathAgainstIgnoreList(abs) && !checkIgnoreListRoot(dest) { logrus.Debugf("Not adding %s because it is ignored", path) return nil } switch hdr.Typeflag { case tar.TypeReg: logrus.Tracef("Creating file %s", path) // It's possible a file is in the tar before its directory, // or a file was copied over a directory prior to now fi, err := os.Stat(dir) if os.IsNotExist(err) || !fi.IsDir() { logrus.Debugf("Base %s for file %s does not exist. Creating.", base, path) if err := os.MkdirAll(dir, 0o755); err != nil { return err } } // Check if something already exists at path (symlinks etc.) // If so, delete it if FilepathExists(path) { if err := os.RemoveAll(path); err != nil { return errors.Wrapf(err, "error removing %s to make way for new file.", path) } } currFile, err := os.Create(path) if err != nil { return err } if _, err = io.Copy(currFile, tr); err != nil { return err } if err = setFilePermissions(path, mode, uid, gid); err != nil { return err } if err = writeSecurityXattrToTarFile(path, hdr); err != nil { return err } if err = setFileTimes(path, hdr.AccessTime, hdr.ModTime); err != nil { return err } currFile.Close() case tar.TypeDir: logrus.Tracef("Creating dir %s", path) if err := MkdirAllWithPermissions(path, mode, int64(uid), int64(gid)); err != nil { return err } case tar.TypeLink: logrus.Tracef("Link from %s to %s", hdr.Linkname, path) abs, err := filepath.Abs(hdr.Linkname) if err != nil { return err } if CheckCleanedPathAgainstIgnoreList(abs) { logrus.Tracef("Skipping link from %s to %s because %s is ignored", hdr.Linkname, path, hdr.Linkname) return nil } // The base directory for a link may not exist before it is created. if err := os.MkdirAll(dir, 0o755); err != nil { return err } // Check if something already exists at path // If so, delete it if FilepathExists(path) { if err := os.RemoveAll(path); err != nil { return errors.Wrapf(err, "error removing %s to make way for new link", hdr.Name) } } link := filepath.Clean(filepath.Join(dest, hdr.Linkname)) if err := os.Link(link, path); err != nil { return err } case tar.TypeSymlink: logrus.Tracef("Symlink from %s to %s", hdr.Linkname, path) // The base directory for a symlink may not exist before it is created. if err := os.MkdirAll(dir, 0o755); err != nil { return err } // Check if something already exists at path // If so, delete it if FilepathExists(path) { if err := os.RemoveAll(path); err != nil { return errors.Wrapf(err, "error removing %s to make way for new symlink", hdr.Name) } } if err := os.Symlink(hdr.Linkname, path); err != nil { return err } } return nil } func IsInProvidedIgnoreList(path string, wl []IgnoreListEntry) bool { path = filepath.Clean(path) for _, entry := range wl { if !entry.PrefixMatchOnly && path == entry.Path { return true } } return false } func IsInIgnoreList(path string) bool { return IsInProvidedIgnoreList(path, ignorelist) } func CheckCleanedPathAgainstProvidedIgnoreList(path string, wl []IgnoreListEntry) bool { for _, wl := range ignorelist { if hasCleanedFilepathPrefix(path, wl.Path, wl.PrefixMatchOnly) { return true } } return false } func CheckIgnoreList(path string) bool { return CheckCleanedPathAgainstIgnoreList(filepath.Clean(path)) } func CheckCleanedPathAgainstIgnoreList(path string) bool { return CheckCleanedPathAgainstProvidedIgnoreList(path, ignorelist) } func checkIgnoreListRoot(root string) bool { if root == config.RootDir { return false } return CheckIgnoreList(root) } // Get ignorelist from roots of mounted files // Each line of /proc/self/mountinfo is in the form: // 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue // (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) // Where (5) is the mount point relative to the process's root // From: https://www.kernel.org/doc/Documentation/filesystems/proc.txt func DetectFilesystemIgnoreList(path string) error { logrus.Trace("Detecting filesystem ignore list") f, err := os.Open(path) if err != nil { return err } defer f.Close() reader := bufio.NewReader(f) for { line, err := reader.ReadString('\n') logrus.Tracef("Read the following line from %s: %s", path, line) if err != nil && !errors.Is(err, io.EOF) { return err } lineArr := strings.Split(line, " ") if len(lineArr) < 5 { if err == io.EOF { logrus.Tracef("Reached end of file %s", path) break } continue } if lineArr[4] != config.RootDir { logrus.Tracef("Adding ignore list entry %s from line: %s", lineArr[4], line) AddToIgnoreList(IgnoreListEntry{ Path: lineArr[4], PrefixMatchOnly: false, }) } if err == io.EOF { logrus.Tracef("Reached end of file %s", path) break } } return nil } // RelativeFiles returns a list of all files at the filepath relative to root func RelativeFiles(fp string, root string) ([]string, error) { var files []string fullPath := filepath.Join(root, fp) cleanedRoot := filepath.Clean(root) logrus.Debugf("Getting files and contents at root %s for %s", root, fullPath) err := filepath.Walk(fullPath, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if CheckCleanedPathAgainstIgnoreList(path) && !hasCleanedFilepathPrefix(filepath.Clean(path), cleanedRoot, false) { return nil } relPath, err := filepath.Rel(root, path) if err != nil { return err } files = append(files, relPath) return nil }) return files, err } // ParentDirectories returns a list of paths to all parent directories // Ex. /some/temp/dir -> [/, /some, /some/temp, /some/temp/dir] func ParentDirectories(path string) []string { dir := filepath.Clean(path) var paths []string for { if dir == filepath.Clean(config.RootDir) || dir == "" || dir == "." { break } dir, _ = filepath.Split(dir) dir = filepath.Clean(dir) paths = append([]string{dir}, paths...) } if len(paths) == 0 { paths = []string{config.RootDir} } return paths } // ParentDirectoriesWithoutLeadingSlash returns a list of paths to all parent directories // all subdirectories do not contain a leading / // Ex. /some/temp/dir -> [/, some, some/temp, some/temp/dir] func ParentDirectoriesWithoutLeadingSlash(path string) []string { path = filepath.Clean(path) dirs := strings.Split(path, "/") dirPath := "" paths := []string{config.RootDir} for index, dir := range dirs { if dir == "" || index == (len(dirs)-1) { continue } dirPath = filepath.Join(dirPath, dir) paths = append(paths, dirPath) } return paths } // FilepathExists returns true if the path exists func FilepathExists(path string) bool { _, err := os.Lstat(path) return !os.IsNotExist(err) } // resetFileOwnershipIfNotMatching function changes ownership of the file at path to newUID and newGID. // If the ownership already matches, chown is not executed. func resetFileOwnershipIfNotMatching(path string, newUID, newGID uint32) error { fsInfo, err := os.Lstat(path) if err != nil { return errors.Wrap(err, "getting stat of present file") } stat, ok := fsInfo.Sys().(*syscall.Stat_t) if !ok { return fmt.Errorf("can't convert fs.FileInfo of %v to linux syscall.Stat_t", path) } if stat.Uid != newUID && stat.Gid != newGID { err = os.Chown(path, int(newUID), int(newGID)) if err != nil { return errors.Wrap(err, "reseting file ownership to root") } } return nil } // CreateFile creates a file at path and copies over contents from the reader func CreateFile(path string, reader io.Reader, perm os.FileMode, uid uint32, gid uint32) error { // Create directory path if it doesn't exist if err := createParentDirectory(path, int(uid), int(gid)); err != nil { return errors.Wrap(err, "creating parent dir") } // if the file is already created with ownership other than root, reset the ownership if FilepathExists(path) { logrus.Debugf("file at %v already exists, resetting file ownership to root", path) err := resetFileOwnershipIfNotMatching(path, 0, 0) if err != nil { return errors.Wrap(err, "reseting file ownership") } } dest, err := os.Create(path) if err != nil { return errors.Wrap(err, "creating file") } defer dest.Close() if _, err := io.Copy(dest, reader); err != nil { return errors.Wrap(err, "copying file") } return setFilePermissions(path, perm, int(uid), int(gid)) } // AddVolumePath adds the given path to the volume ignorelist. func AddVolumePathToIgnoreList(path string) { logrus.Infof("Adding volume %s to ignorelist", path) AddToIgnoreList(IgnoreListEntry{ Path: path, PrefixMatchOnly: true, }) volumes = append(volumes, path) } // DownloadFileToDest downloads the file at rawurl to the given dest for the ADD command // From add command docs: // 1. If is a remote file URL: // - destination will have permissions of 0600 by default if not specified with chmod // - If remote file has HTTP Last-Modified header, we set the mtime of the file to that timestamp func DownloadFileToDest(rawurl, dest string, uid, gid int64, chmod fs.FileMode) error { resp, err := http.Get(rawurl) //nolint:noctx if err != nil { return err } defer resp.Body.Close() if resp.StatusCode >= 400 { return fmt.Errorf("invalid response status %d", resp.StatusCode) } if err := CreateFile(dest, resp.Body, chmod, uint32(uid), uint32(gid)); err != nil { return err } mTime := time.Time{} lastMod := resp.Header.Get("Last-Modified") if lastMod != "" { if parsedMTime, err := http.ParseTime(lastMod); err == nil { mTime = parsedMTime } } return os.Chtimes(dest, mTime, mTime) } // DetermineTargetFileOwnership returns the user provided uid/gid combination. // If they are set to -1, the uid/gid from the original file is used. func DetermineTargetFileOwnership(fi os.FileInfo, uid, gid int64) (int64, int64) { if uid <= DoNotChangeUID { uid = int64(fi.Sys().(*syscall.Stat_t).Uid) } if gid <= DoNotChangeGID { gid = int64(fi.Sys().(*syscall.Stat_t).Gid) } return uid, gid } // CopyDir copies the file or directory at src to dest // It returns a list of files it copied over func CopyDir(src, dest string, context FileContext, uid, gid int64, chmod fs.FileMode, useDefaultChmod bool) ([]string, error) { files, err := RelativeFiles("", src) if err != nil { return nil, errors.Wrap(err, "copying dir") } var copiedFiles []string for _, file := range files { fullPath := filepath.Join(src, file) if context.ExcludesFile(fullPath) { logrus.Debugf("%s found in .dockerignore, ignoring", src) continue } fi, err := os.Lstat(fullPath) if err != nil { return nil, errors.Wrap(err, "copying dir") } destPath := filepath.Join(dest, file) if fi.IsDir() { logrus.Tracef("Creating directory %s", destPath) mode := chmod if useDefaultChmod { mode = fi.Mode() } uid, gid := DetermineTargetFileOwnership(fi, uid, gid) if err := MkdirAllWithPermissions(destPath, mode, uid, gid); err != nil { return nil, err } } else if IsSymlink(fi) { // If file is a symlink, we want to create the same relative symlink if _, err := CopySymlink(fullPath, destPath, context); err != nil { return nil, err } } else { // ... Else, we want to copy over a file mode := chmod if useDefaultChmod { mode = fs.FileMode(0o600) } if _, err := CopyFile(fullPath, destPath, context, uid, gid, mode, useDefaultChmod); err != nil { return nil, err } } copiedFiles = append(copiedFiles, destPath) } return copiedFiles, nil } // CopySymlink copies the symlink at src to dest. func CopySymlink(src, dest string, context FileContext) (bool, error) { if context.ExcludesFile(src) { logrus.Debugf("%s found in .dockerignore, ignoring", src) return true, nil } if FilepathExists(dest) { if err := os.RemoveAll(dest); err != nil { return false, err } } if err := createParentDirectory(dest, DoNotChangeUID, DoNotChangeGID); err != nil { return false, err } link, err := os.Readlink(src) if err != nil { logrus.Debugf("Could not read link for %s", src) } return false, os.Symlink(link, dest) } // CopyFile copies the file at src to dest func CopyFile(src, dest string, context FileContext, uid, gid int64, chmod fs.FileMode, useDefaultChmod bool) (bool, error) { if context.ExcludesFile(src) { logrus.Debugf("%s found in .dockerignore, ignoring", src) return true, nil } if src == dest { // This is a no-op. Move on, but don't list it as ignored. // We have to make sure we do this so we don't overwrite our own file. // See iusse #904 for an example. return false, nil } fi, err := os.Stat(src) if err != nil { return false, err } logrus.Debugf("Copying file %s to %s", src, dest) srcFile, err := os.Open(src) if err != nil { return false, err } defer srcFile.Close() uid, gid = DetermineTargetFileOwnership(fi, uid, gid) mode := chmod if useDefaultChmod { mode = fi.Mode() } return false, CreateFile(dest, srcFile, mode, uint32(uid), uint32(gid)) } func NewFileContextFromDockerfile(dockerfilePath, buildcontext string) (FileContext, error) { fileContext := FileContext{Root: buildcontext} excludedFiles, err := getExcludedFiles(dockerfilePath, buildcontext) if err != nil { return fileContext, err } fileContext.ExcludedFiles = excludedFiles return fileContext, nil } // getExcludedFiles returns a list of files to exclude from the .dockerignore func getExcludedFiles(dockerfilePath, buildcontext string) ([]string, error) { path := dockerfilePath + ".dockerignore" if !FilepathExists(path) { path = filepath.Join(buildcontext, ".dockerignore") } if !FilepathExists(path) { return nil, nil } logrus.Infof("Using dockerignore file: %v", path) contents, err := os.ReadFile(path) if err != nil { return nil, errors.Wrap(err, "parsing .dockerignore") } reader := bytes.NewBuffer(contents) return dockerignore.ReadAll(reader) } // ExcludesFile returns true if the file context specified this file should be ignored. // Usually this is specified via .dockerignore func (c FileContext) ExcludesFile(path string) bool { if HasFilepathPrefix(path, c.Root, false) { var err error path, err = filepath.Rel(c.Root, path) if err != nil { logrus.Errorf("Unable to get relative path, including %s in build: %v", path, err) return false } } match, err := patternmatcher.Matches(path, c.ExcludedFiles) if err != nil { logrus.Errorf("Error matching, including %s in build: %v", path, err) return false } return match } // HasFilepathPrefix checks if the given file path begins with prefix func HasFilepathPrefix(path, prefix string, prefixMatchOnly bool) bool { return hasCleanedFilepathPrefix(filepath.Clean(path), filepath.Clean(prefix), prefixMatchOnly) } func hasCleanedFilepathPrefix(path, prefix string, prefixMatchOnly bool) bool { prefixArray := strings.Split(prefix, "/") pathArray := strings.SplitN(path, "/", len(prefixArray)+1) if len(pathArray) < len(prefixArray) { return false } if prefixMatchOnly && len(pathArray) == len(prefixArray) { return false } for index := range prefixArray { m, err := filepath.Match(prefixArray[index], pathArray[index]) if err != nil { return false } if !m { return false } } return true } func Volumes() []string { return volumes } func MkdirAllWithPermissions(path string, mode os.FileMode, uid, gid int64) error { // Check if a file already exists on the path, if yes then delete it info, err := os.Stat(path) if err == nil && !info.IsDir() { logrus.Tracef("Removing file because it needs to be a directory %s", path) if err := os.Remove(path); err != nil { return errors.Wrapf(err, "error removing %s to make way for new directory.", path) } } if err != nil && !os.IsNotExist(err) { return errors.Wrapf(err, "error calling stat on %s.", path) } if err := os.MkdirAll(path, mode); err != nil { return err } if uid > math.MaxUint32 || gid > math.MaxUint32 { // due to https://github.com/golang/go/issues/8537 return errors.New( fmt.Sprintf( "Numeric User-ID or Group-ID greater than %v are not properly supported.", uint64(math.MaxUint32), ), ) } if err := os.Chown(path, int(uid), int(gid)); err != nil { return err } // In some cases, MkdirAll doesn't change the permissions, so run Chmod // Must chmod after chown because chown resets the file mode. return os.Chmod(path, mode) } func setFilePermissions(path string, mode os.FileMode, uid, gid int) error { if err := os.Chown(path, uid, gid); err != nil { return err } // manually set permissions on file, since the default umask (022) will interfere // Must chmod after chown because chown resets the file mode. return os.Chmod(path, mode) } func setFileTimes(path string, aTime, mTime time.Time) error { // The zero value of time.Time is not a valid argument to os.Chtimes as it cannot be // converted into a valid argument to the syscall that os.Chtimes uses. If mTime or // aTime are zero we convert them to the zero value for Unix Epoch. if mTime.IsZero() { logrus.Tracef("Mod time for %s is zero, converting to zero for epoch", path) mTime = time.Unix(0, 0) } if aTime.IsZero() { logrus.Tracef("Access time for %s is zero, converting to zero for epoch", path) aTime = time.Unix(0, 0) } // We set AccessTime because its a required arg but we only care about // ModTime. The file will get accessed again so AccessTime will change. if err := os.Chtimes(path, aTime, mTime); err != nil { return errors.Wrapf( err, "couldn't modify times: atime %v mtime %v", aTime, mTime, ) } return nil } // CreateTargetTarfile creates target tar file for downloading the context file. // Make directory if directory does not exist func CreateTargetTarfile(tarpath string) (*os.File, error) { baseDir := filepath.Dir(tarpath) if _, err := os.Lstat(baseDir); os.IsNotExist(err) { logrus.Debugf("BaseDir %s for file %s does not exist. Creating.", baseDir, tarpath) if err := os.MkdirAll(baseDir, 0o755); err != nil { return nil, err } } return os.Create(tarpath) } // Returns true if a file is a symlink func IsSymlink(fi os.FileInfo) bool { return fi.Mode()&os.ModeSymlink != 0 } var ErrNotSymLink = fmt.Errorf("not a symlink") func GetSymLink(path string) (string, error) { if err := getSymlink(path); err != nil { return "", err } return os.Readlink(path) } func EvalSymLink(path string) (string, error) { if err := getSymlink(path); err != nil { return "", err } return filepath.EvalSymlinks(path) } func getSymlink(path string) error { fi, err := os.Lstat(path) if err != nil { return err } if !IsSymlink(fi) { return ErrNotSymLink } return nil } // For cross stage dependencies kaniko must persist the referenced path so that it can be used in // the dependent stage. For symlinks we copy the target path because copying the symlink would // result in a dead link func CopyFileOrSymlink(src string, destDir string, root string) error { destFile := filepath.Join(destDir, src) src = filepath.Join(root, src) fi, err := os.Lstat(src) if err != nil { return errors.Wrap(err, "getting file info") } if IsSymlink(fi) { link, err := os.Readlink(src) if err != nil { return errors.Wrap(err, "copying file or symlink") } if err := createParentDirectory(destFile, DoNotChangeUID, DoNotChangeGID); err != nil { return err } return os.Symlink(link, destFile) } if err := otiai10Cpy.Copy(src, destFile, skipKanikoDir); err != nil { return errors.Wrap(err, "copying file") } if err := CopyOwnership(src, destDir, root); err != nil { return errors.Wrap(err, "copying ownership") } if err := os.Chmod(destFile, fi.Mode()); err != nil { return errors.Wrap(err, "copying file mode") } return nil } // CopyOwnership copies the file or directory ownership recursively at src to dest func CopyOwnership(src string, destDir string, root string) error { return filepath.Walk(src, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if IsSymlink(info) { return nil } relPath, err := filepath.Rel(root, path) if err != nil { return err } destPath := filepath.Join(destDir, relPath) if CheckCleanedPathAgainstIgnoreList(src) && CheckCleanedPathAgainstIgnoreList(destPath) { if !isExist(destPath) { logrus.Debugf("Path %s ignored, but not exists", destPath) return nil } if info.IsDir() { return filepath.SkipDir } logrus.Debugf("Not copying ownership for %s, as it's ignored", destPath) return nil } if CheckIgnoreList(destDir) && CheckCleanedPathAgainstIgnoreList(path) { if !isExist(path) { logrus.Debugf("Path %s ignored, but not exists", path) return nil } if info.IsDir() { return filepath.SkipDir } logrus.Debugf("Not copying ownership for %s, as it's ignored", path) return nil } info, err = os.Stat(path) if err != nil { return errors.Wrap(err, "reading ownership") } stat := info.Sys().(*syscall.Stat_t) return os.Chown(destPath, int(stat.Uid), int(stat.Gid)) }) } func createParentDirectory(path string, uid int, gid int) error { baseDir := filepath.Dir(path) if info, err := os.Lstat(baseDir); os.IsNotExist(err) { logrus.Tracef("BaseDir %s for file %s does not exist. Creating.", baseDir, path) dir := baseDir dirs := []string{baseDir} for { if dir == "/" || dir == "." || dir == "" { break } dir = filepath.Dir(dir) dirs = append(dirs, dir) } for i := len(dirs) - 1; i >= 0; i-- { dir := dirs[i] if _, err := os.Lstat(dir); os.IsNotExist(err) { os.Mkdir(dir, 0o755) if uid != DoNotChangeUID { if gid != DoNotChangeGID { os.Chown(dir, uid, gid) } else { return errors.New(fmt.Sprintf("UID=%d but GID=-1, i.e. it is not set for %s", uid, dir)) } } else { if gid != DoNotChangeGID { return errors.New(fmt.Sprintf("GID=%d but UID=-1, i.e. it is not set for %s", gid, dir)) } } } else if err != nil { return err } } } else if IsSymlink(info) { logrus.Infof("Destination cannot be a symlink %v", baseDir) return errors.New("destination cannot be a symlink") } return nil } // InitIgnoreList will initialize the ignore list using: // - defaultIgnoreList // - mounted paths via DetectFilesystemIgnoreList() func InitIgnoreList() error { logrus.Trace("Initializing ignore list") ignorelist = append([]IgnoreListEntry{}, defaultIgnoreList...) if err := DetectFilesystemIgnoreList(config.MountInfoPath); err != nil { return errors.Wrap(err, "checking filesystem mount paths for ignore list") } return nil } type walkFSResult struct { filesAdded []string existingPaths map[string]struct{} } // WalkFS given a directory dir and list of existing files existingPaths, // returns a list of changed files determined by `changeFunc` and a list // of deleted files. Input existingPaths is changed inside this function and // returned as deleted files map. // It timesout after 90 mins which can be configured via setting an environment variable // SNAPSHOT_TIMEOUT in the kaniko pod definition. func WalkFS( dir string, existingPaths map[string]struct{}, changeFunc func(string) (bool, error), ) ([]string, map[string]struct{}) { timeOutStr := os.Getenv(snapshotTimeout) if timeOutStr == "" { logrus.Tracef("Environment '%s' not set. Using default snapshot timeout '%s'", snapshotTimeout, defaultTimeout) timeOutStr = defaultTimeout } timeOut, err := time.ParseDuration(timeOutStr) if err != nil { logrus.Fatalf("Could not parse duration '%s'", timeOutStr) } timer := timing.Start("Walking filesystem with timeout") ch := make(chan walkFSResult, 1) go func() { ch <- gowalkDir(dir, existingPaths, changeFunc) }() // Listen on our channel AND a timeout channel - which ever happens first. select { case res := <-ch: timing.DefaultRun.Stop(timer) return res.filesAdded, res.existingPaths case <-time.After(timeOut): timing.DefaultRun.Stop(timer) logrus.Fatalf("Timed out snapshotting FS in %s", timeOutStr) return nil, nil } } func gowalkDir(dir string, existingPaths map[string]struct{}, changeFunc func(string) (bool, error)) walkFSResult { foundPaths := make([]string, 0) deletedFiles := existingPaths // Make a reference. callback := func(path string, ent *godirwalk.Dirent) error { logrus.Tracef("Analyzing path '%s'", path) if IsInIgnoreList(path) { if IsDestDir(path) { logrus.Tracef("Skipping paths under '%s', as it is an ignored directory", path) return filepath.SkipDir } return nil } // File is existing on disk, remove it from deleted files. delete(deletedFiles, path) if isChanged, err := changeFunc(path); err != nil { return err } else if isChanged { foundPaths = append(foundPaths, path) } return nil } godirwalk.Walk(dir, &godirwalk.Options{ Callback: callback, Unsorted: true, }) return walkFSResult{foundPaths, deletedFiles} } // GetFSInfoMap given a directory gets a map of FileInfo for all files func GetFSInfoMap(dir string, existing map[string]os.FileInfo) (map[string]os.FileInfo, []string) { fileMap := map[string]os.FileInfo{} foundPaths := []string{} timer := timing.Start("Walking filesystem with Stat") godirwalk.Walk(dir, &godirwalk.Options{ Callback: func(path string, ent *godirwalk.Dirent) error { if CheckCleanedPathAgainstIgnoreList(path) { if IsDestDir(path) { logrus.Tracef("Skipping paths under %s, as it is a ignored directory", path) return filepath.SkipDir } return nil } if fi, err := os.Lstat(path); err == nil { if fiPrevious, ok := existing[path]; ok { // check if file changed if !isSame(fiPrevious, fi) { fileMap[path] = fi foundPaths = append(foundPaths, path) } } else { // new path fileMap[path] = fi foundPaths = append(foundPaths, path) } } return nil }, Unsorted: true, }, ) timing.DefaultRun.Stop(timer) return fileMap, foundPaths } func isSame(fi1, fi2 os.FileInfo) bool { return fi1.Mode() == fi2.Mode() && // file modification time fi1.ModTime() == fi2.ModTime() && // file size fi1.Size() == fi2.Size() && // file user id uint64(fi1.Sys().(*syscall.Stat_t).Uid) == uint64(fi2.Sys().(*syscall.Stat_t).Uid) && // file group id is uint64(fi1.Sys().(*syscall.Stat_t).Gid) == uint64(fi2.Sys().(*syscall.Stat_t).Gid) } ================================================ FILE: pkg/util/fs_util_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "archive/tar" "bytes" "fmt" "io" "io/fs" "os" "path/filepath" "reflect" "sort" "strings" "testing" "time" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/GoogleContainerTools/kaniko/pkg/constants" "github.com/GoogleContainerTools/kaniko/pkg/mocks/go-containerregistry/mockv1" "github.com/GoogleContainerTools/kaniko/testutil" "github.com/golang/mock/gomock" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/types" ) func Test_DetectFilesystemSkiplist(t *testing.T) { testDir := t.TempDir() fileContents := ` 228 122 0:90 / / rw,relatime - aufs none rw,si=f8e2406af90782bc,dio,dirperm1 229 228 0:98 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw 230 228 0:99 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 231 230 0:100 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 232 228 0:101 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro` path := filepath.Join(testDir, "mountinfo") if err := os.MkdirAll(filepath.Dir(path), 0o750); err != nil { t.Fatalf("Error creating tempdir: %s", err) } if err := os.WriteFile(path, []byte(fileContents), 0o644); err != nil { t.Fatalf("Error writing file contents to %s: %s", path, err) } err := DetectFilesystemIgnoreList(path) expectedSkiplist := []IgnoreListEntry{ {"/kaniko", false}, {"/proc", false}, {"/dev", false}, {"/dev/pts", false}, {"/sys", false}, {"/etc/mtab", false}, {"/tmp/apt-key-gpghome", true}, } actualSkiplist := ignorelist sort.Slice(actualSkiplist, func(i, j int) bool { return actualSkiplist[i].Path < actualSkiplist[j].Path }) sort.Slice(expectedSkiplist, func(i, j int) bool { return expectedSkiplist[i].Path < expectedSkiplist[j].Path }) testutil.CheckErrorAndDeepEqual(t, false, err, expectedSkiplist, actualSkiplist) } func Test_AddToIgnoreList(t *testing.T) { t.Cleanup(func() { ignorelist = append([]IgnoreListEntry{}, defaultIgnoreList...) }) AddToIgnoreList(IgnoreListEntry{ Path: "/tmp", PrefixMatchOnly: false, }) if !CheckIgnoreList("/tmp") { t.Errorf("CheckIgnoreList() = %v, want %v", false, true) } } var tests = []struct { files map[string]string directory string expectedFiles []string }{ { files: map[string]string{ "/workspace/foo/a": "baz1", "/workspace/foo/b": "baz2", "/kaniko/file": "file", }, directory: "/workspace/foo/", expectedFiles: []string{ "workspace/foo/a", "workspace/foo/b", "workspace/foo", }, }, { files: map[string]string{ "/workspace/foo/a": "baz1", }, directory: "/workspace/foo/a", expectedFiles: []string{ "workspace/foo/a", }, }, { files: map[string]string{ "/workspace/foo/a": "baz1", "/workspace/foo/b": "baz2", "/workspace/baz": "hey", "/kaniko/file": "file", }, directory: "/workspace", expectedFiles: []string{ "workspace/foo/a", "workspace/foo/b", "workspace/baz", "workspace", "workspace/foo", }, }, { files: map[string]string{ "/workspace/foo/a": "baz1", "/workspace/foo/b": "baz2", }, directory: "", expectedFiles: []string{ "workspace/foo/a", "workspace/foo/b", "workspace", "workspace/foo", ".", }, }, } func Test_RelativeFiles(t *testing.T) { for _, test := range tests { testDir := t.TempDir() if err := testutil.SetupFiles(testDir, test.files); err != nil { t.Fatalf("err setting up files: %v", err) } actualFiles, err := RelativeFiles(test.directory, testDir) sort.Strings(actualFiles) sort.Strings(test.expectedFiles) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedFiles, actualFiles) } } func Test_ParentDirectories(t *testing.T) { tests := []struct { name string path string rootDir string expected []string }{ { name: "regular path", path: "/path/to/dir", rootDir: "/", expected: []string{ "/", "/path", "/path/to", }, }, { name: "current directory", path: ".", rootDir: "/", expected: []string{ "/", }, }, { name: "non / root directory", path: "/tmp/kaniko/test/another/dir", rootDir: "/tmp/kaniko/", expected: []string{ "/tmp/kaniko", "/tmp/kaniko/test", "/tmp/kaniko/test/another", }, }, { name: "non / root director same path", path: "/tmp/123", rootDir: "/tmp/123", expected: []string{ "/tmp/123", }, }, { name: "non / root directory path", path: "/tmp/120162240/kaniko", rootDir: "/tmp/120162240", expected: []string{ "/tmp/120162240", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { original := config.RootDir defer func() { config.RootDir = original }() config.RootDir = tt.rootDir actual := ParentDirectories(tt.path) testutil.CheckErrorAndDeepEqual(t, false, nil, tt.expected, actual) }) } } func Test_ParentDirectoriesWithoutLeadingSlash(t *testing.T) { tests := []struct { name string path string expected []string }{ { name: "regular path", path: "/path/to/dir", expected: []string{ "/", "path", "path/to", }, }, { name: "current directory", path: ".", expected: []string{ "/", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { actual := ParentDirectoriesWithoutLeadingSlash(tt.path) testutil.CheckErrorAndDeepEqual(t, false, nil, tt.expected, actual) }) } } func Test_CheckIgnoreList(t *testing.T) { type args struct { path string ignorelist []IgnoreListEntry } tests := []struct { name string args args want bool }{ { name: "file ignored", args: args{ path: "/foo", ignorelist: []IgnoreListEntry{{"/foo", false}}, }, want: true, }, { name: "directory ignored", args: args{ path: "/foo/bar", ignorelist: []IgnoreListEntry{{"/foo", false}}, }, want: true, }, { name: "grandparent ignored", args: args{ path: "/foo/bar/baz", ignorelist: []IgnoreListEntry{{"/foo", false}}, }, want: true, }, { name: "sibling ignored", args: args{ path: "/foo/bar/baz", ignorelist: []IgnoreListEntry{{"/foo/bat", false}}, }, want: false, }, { name: "prefix match only ", args: args{ path: "/tmp/apt-key-gpghome.xft/gpg.key", ignorelist: []IgnoreListEntry{{"/tmp/apt-key-gpghome.*", true}}, }, want: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { original := ignorelist defer func() { ignorelist = original }() ignorelist = tt.args.ignorelist got := CheckIgnoreList(tt.args.path) if got != tt.want { t.Errorf("CheckIgnoreList() = %v, want %v", got, tt.want) } }) } } func TestHasFilepathPrefix(t *testing.T) { type args struct { path string prefix string prefixMatchOnly bool } tests := []struct { name string args args want bool }{ { name: "parent", args: args{ path: "/foo/bar", prefix: "/foo", prefixMatchOnly: false, }, want: true, }, { name: "nested parent", args: args{ path: "/foo/bar/baz", prefix: "/foo/bar", prefixMatchOnly: false, }, want: true, }, { name: "sibling", args: args{ path: "/foo/bar", prefix: "/bar", prefixMatchOnly: false, }, want: false, }, { name: "nested sibling", args: args{ path: "/foo/bar/baz", prefix: "/foo/bar", prefixMatchOnly: false, }, want: true, }, { name: "name prefix", args: args{ path: "/foo2/bar", prefix: "/foo", prefixMatchOnly: false, }, want: false, }, { name: "prefix match only (volume)", args: args{ path: "/foo", prefix: "/foo", prefixMatchOnly: true, }, want: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := HasFilepathPrefix(tt.args.path, tt.args.prefix, tt.args.prefixMatchOnly); got != tt.want { t.Errorf("HasFilepathPrefix() = %v, want %v", got, tt.want) } }) } } func BenchmarkHasFilepathPrefix(b *testing.B) { tests := []struct { path string prefix string prefixMatchOnly bool }{ { path: "/foo/bar", prefix: "/foo", prefixMatchOnly: true, }, { path: "/foo/bar/baz", prefix: "/foo", prefixMatchOnly: true, }, { path: "/foo/bar/baz/foo", prefix: "/foo", prefixMatchOnly: true, }, { path: "/foo/bar/baz/foo/foobar", prefix: "/foo", prefixMatchOnly: true, }, { path: "/foo/bar", prefix: "/foo/bar", prefixMatchOnly: true, }, { path: "/foo/bar/baz", prefix: "/foo/bar", prefixMatchOnly: true, }, { path: "/foo/bar/baz/foo", prefix: "/foo/bar", prefixMatchOnly: true, }, { path: "/foo/bar/baz/foo/foobar", prefix: "/foo/bar", prefixMatchOnly: true, }, { path: "/foo/bar", prefix: "/foo/bar/baz", prefixMatchOnly: true, }, { path: "/foo/bar/baz", prefix: "/foo/bar/baz", prefixMatchOnly: true, }, { path: "/foo/bar/baz/foo", prefix: "/foo/bar/baz", prefixMatchOnly: true, }, { path: "/foo/bar/baz/foo/foobar", prefix: "/foo/bar/baz", prefixMatchOnly: true, }, } for _, ts := range tests { name := fmt.Sprint("PathDepth=", strings.Count(ts.path, "/"), ",PrefixDepth=", strings.Count(ts.prefix, "/")) b.Run(name, func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { HasFilepathPrefix(ts.path, ts.prefix, ts.prefixMatchOnly) } }) } } type checker func(root string, t *testing.T) func fileExists(p string) checker { return func(root string, t *testing.T) { _, err := os.Stat(filepath.Join(root, p)) if err != nil { t.Fatalf("File %s does not exist", filepath.Join(root, p)) } } } func fileMatches(p string, c []byte) checker { return func(root string, t *testing.T) { actual, err := os.ReadFile(filepath.Join(root, p)) if err != nil { t.Fatalf("error reading file: %s", p) } if !reflect.DeepEqual(actual, c) { t.Errorf("file contents do not match. %v!=%v", actual, c) } } } func timesMatch(p string, fTime time.Time) checker { return func(root string, t *testing.T) { fi, err := os.Stat(filepath.Join(root, p)) if err != nil { t.Fatalf("error statting file %s", p) } if fi.ModTime().UTC() != fTime.UTC() { t.Errorf("Expected modtime to equal %v but was %v", fTime, fi.ModTime()) } } } func permissionsMatch(p string, perms os.FileMode) checker { return func(root string, t *testing.T) { fi, err := os.Stat(filepath.Join(root, p)) if err != nil { t.Fatalf("error statting file %s", p) } if fi.Mode() != perms { t.Errorf("Permissions do not match. %s != %s", fi.Mode(), perms) } } } func linkPointsTo(src, dst string) checker { return func(root string, t *testing.T) { link := filepath.Join(root, src) got, err := os.Readlink(link) if err != nil { t.Fatalf("error reading link %s: %s", link, err) } if got != dst { t.Errorf("link destination does not match: %s != %s", got, dst) } } } func filesAreHardlinks(first, second string) checker { return func(root string, t *testing.T) { fi1, err := os.Stat(filepath.Join(root, first)) if err != nil { t.Fatalf("error getting file %s", first) } fi2, err := os.Stat(filepath.Join(root, second)) if err != nil { t.Fatalf("error getting file %s", second) } stat1 := getSyscallStatT(fi1) stat2 := getSyscallStatT(fi2) if stat1.Ino != stat2.Ino { t.Errorf("%s and %s aren't hardlinks as they dont' have the same inode", first, second) } } } func fileHeader(name string, contents string, mode int64, fTime time.Time) *tar.Header { return &tar.Header{ Name: name, Size: int64(len(contents)), Mode: mode, Typeflag: tar.TypeReg, Uid: os.Getuid(), Gid: os.Getgid(), AccessTime: fTime, ModTime: fTime, } } func linkHeader(name, linkname string) *tar.Header { return &tar.Header{ Name: name, Size: 0, Typeflag: tar.TypeSymlink, Linkname: linkname, } } func hardlinkHeader(name, linkname string) *tar.Header { return &tar.Header{ Name: name, Size: 0, Typeflag: tar.TypeLink, Linkname: linkname, } } func dirHeader(name string, mode int64) *tar.Header { return &tar.Header{ Name: name, Size: 0, Typeflag: tar.TypeDir, Mode: mode, Uid: os.Getuid(), Gid: os.Getgid(), } } func createUncompressedTar(fileContents map[string]string, tarFileName, testDir string) error { if err := testutil.SetupFiles(testDir, fileContents); err != nil { return err } tarFile, err := os.Create(filepath.Join(testDir, tarFileName)) if err != nil { return err } t := NewTar(tarFile) defer t.Close() for file := range fileContents { filePath := filepath.Join(testDir, file) if err := t.AddFileToTar(filePath); err != nil { return err } } return nil } func Test_UnTar(t *testing.T) { tcs := []struct { name string setupTarContents map[string]string tarFileName string destination string expectedFileList []string errorExpected bool }{ { name: "multfile tar", setupTarContents: map[string]string{ "foo/file1": "hello World", "bar/file1": "hello World", "bar/file2": "hello World", "file1": "hello World", }, tarFileName: "test.tar", destination: "/", expectedFileList: []string{"foo/file1", "bar/file1", "bar/file2", "file1"}, errorExpected: false, }, { name: "empty tar", setupTarContents: map[string]string{}, tarFileName: "test.tar", destination: "/", expectedFileList: nil, errorExpected: false, }, } for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { testDir := t.TempDir() if err := createUncompressedTar(tc.setupTarContents, tc.tarFileName, testDir); err != nil { t.Fatal(err) } file, err := os.Open(filepath.Join(testDir, tc.tarFileName)) if err != nil { t.Fatal(err) } fileList, err := UnTar(file, tc.destination) if err != nil { t.Fatal(err) } // update expectedFileList to take into factor temp directory for i, file := range tc.expectedFileList { tc.expectedFileList[i] = filepath.Join(testDir, file) } // sort both slices to ensure objects are in the same order for deep equals sort.Strings(tc.expectedFileList) sort.Strings(fileList) testutil.CheckErrorAndDeepEqual(t, tc.errorExpected, err, tc.expectedFileList, fileList) }) } } func TestExtractFile(t *testing.T) { type tc struct { name string hdrs []*tar.Header tmpdir string contents []byte checkers []checker } defaultTestTime, err := time.Parse(time.RFC3339, "1912-06-23T00:00:00Z") if err != nil { t.Fatal(err) } tcs := []tc{ { name: "normal file", contents: []byte("helloworld"), hdrs: []*tar.Header{fileHeader("./bar", "helloworld", 0o644, defaultTestTime)}, checkers: []checker{ fileExists("/bar"), fileMatches("/bar", []byte("helloworld")), permissionsMatch("/bar", 0o644), timesMatch("/bar", defaultTestTime), }, }, { name: "normal file, directory does not exist", contents: []byte("helloworld"), hdrs: []*tar.Header{fileHeader("./foo/bar", "helloworld", 0o644, defaultTestTime)}, checkers: []checker{ fileExists("/foo/bar"), fileMatches("/foo/bar", []byte("helloworld")), permissionsMatch("/foo/bar", 0o644), permissionsMatch("/foo", 0o755|os.ModeDir), }, }, { name: "normal file, directory is created after", contents: []byte("helloworld"), hdrs: []*tar.Header{ fileHeader("./foo/bar", "helloworld", 0o644, defaultTestTime), dirHeader("./foo", 0o722), }, checkers: []checker{ fileExists("/foo/bar"), fileMatches("/foo/bar", []byte("helloworld")), permissionsMatch("/foo/bar", 0o644), permissionsMatch("/foo", 0o722|os.ModeDir), }, }, { name: "symlink", hdrs: []*tar.Header{linkHeader("./bar", "bar/bat")}, checkers: []checker{ linkPointsTo("/bar", "bar/bat"), }, }, { name: "symlink relative path", hdrs: []*tar.Header{linkHeader("./bar", "./foo/bar/baz")}, checkers: []checker{ linkPointsTo("/bar", "./foo/bar/baz"), }, }, { name: "symlink parent does not exist", hdrs: []*tar.Header{linkHeader("./foo/bar/baz", "../../bat")}, checkers: []checker{ linkPointsTo("/foo/bar/baz", "../../bat"), }, }, { name: "symlink parent does not exist 2", hdrs: []*tar.Header{linkHeader("./foo/bar/baz", "../../bat")}, checkers: []checker{ linkPointsTo("/foo/bar/baz", "../../bat"), permissionsMatch("/foo", 0o755|os.ModeDir), permissionsMatch("/foo/bar", 0o755|os.ModeDir), }, }, { name: "hardlink", tmpdir: "/tmp/hardlink", hdrs: []*tar.Header{ fileHeader("/bin/gzip", "gzip-binary", 0o751, defaultTestTime), hardlinkHeader("/bin/uncompress", "/bin/gzip"), }, checkers: []checker{ fileExists("/bin/gzip"), filesAreHardlinks("/bin/uncompress", "/bin/gzip"), }, }, { name: "file with setuid bit", contents: []byte("helloworld"), hdrs: []*tar.Header{fileHeader("./bar", "helloworld", 0o4644, defaultTestTime)}, checkers: []checker{ fileExists("/bar"), fileMatches("/bar", []byte("helloworld")), permissionsMatch("/bar", 0o644|os.ModeSetuid), }, }, { name: "dir with sticky bit", contents: []byte("helloworld"), hdrs: []*tar.Header{ dirHeader("./foo", 0o1755), fileHeader("./foo/bar", "helloworld", 0o644, defaultTestTime), }, checkers: []checker{ fileExists("/foo/bar"), fileMatches("/foo/bar", []byte("helloworld")), permissionsMatch("/foo/bar", 0o644), permissionsMatch("/foo", 0o755|os.ModeDir|os.ModeSticky), }, }, } for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { tc := tc t.Parallel() r := "" if tc.tmpdir != "" { r = tc.tmpdir } else { r = t.TempDir() } defer os.RemoveAll(r) for _, hdr := range tc.hdrs { if err := ExtractFile(r, hdr, filepath.Clean(hdr.Name), bytes.NewReader(tc.contents)); err != nil { t.Fatal(err) } } for _, checker := range tc.checkers { checker(r, t) } }) } } func TestCopySymlink(t *testing.T) { type tc struct { name string linkTarget string dest string beforeLink func(r string) error } tcs := []tc{{ name: "absolute symlink", linkTarget: "/abs/dest", }, { name: "relative symlink", linkTarget: "rel", }, { name: "symlink copy overwrites existing file", linkTarget: "/abs/dest", dest: "overwrite_me", beforeLink: func(r string) error { return os.WriteFile(filepath.Join(r, "overwrite_me"), nil, 0o644) }, }} for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { tc := tc t.Parallel() r := t.TempDir() os.MkdirAll(filepath.Join(r, filepath.Dir(tc.linkTarget)), 0o777) tc.linkTarget = filepath.Join(r, tc.linkTarget) os.WriteFile(tc.linkTarget, nil, 0o644) if tc.beforeLink != nil { if err := tc.beforeLink(r); err != nil { t.Fatal(err) } } link := filepath.Join(r, "link") dest := filepath.Join(r, "copy") if tc.dest != "" { dest = filepath.Join(r, tc.dest) } if err := os.Symlink(tc.linkTarget, link); err != nil { t.Fatal(err) } if _, err := CopySymlink(link, dest, FileContext{}); err != nil { t.Fatal(err) } if _, err := os.Lstat(dest); err != nil { t.Fatalf("error reading link %s: %s", link, err) } }) } } func Test_childDirInSkiplist(t *testing.T) { type args struct { path string ignorelist []IgnoreListEntry } tests := []struct { name string args args want bool }{ { name: "not in ignorelist", args: args{ path: "/foo", }, want: false, }, { name: "child in ignorelist", args: args{ path: "/foo", ignorelist: []IgnoreListEntry{ { Path: "/foo/bar", }, }, }, want: true, }, } oldIgnoreList := ignorelist defer func() { ignorelist = oldIgnoreList }() for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ignorelist = tt.args.ignorelist if got := childDirInIgnoreList(tt.args.path); got != tt.want { t.Errorf("childDirInIgnoreList() = %v, want %v", got, tt.want) } }) } } func Test_correctDockerignoreFileIsUsed(t *testing.T) { type args struct { dockerfilepath string buildcontext string excluded []string included []string } tests := []struct { name string args args }{ { name: "relative dockerfile used", args: args{ dockerfilepath: "../../integration/dockerfiles/Dockerfile_dockerignore_relative", buildcontext: "../../integration/", excluded: []string{"ignore_relative/bar"}, included: []string{"ignore_relative/foo", "ignore/bar"}, }, }, { name: "context dockerfile is used", args: args{ dockerfilepath: "../../integration/dockerfiles/Dockerfile_test_dockerignore", buildcontext: "../../integration/", excluded: []string{"ignore/bar"}, included: []string{"ignore/foo", "ignore_relative/bar"}, }, }, } for _, tt := range tests { fileContext, err := NewFileContextFromDockerfile(tt.args.dockerfilepath, tt.args.buildcontext) if err != nil { t.Fatal(err) } for _, excl := range tt.args.excluded { t.Run(tt.name+" to exclude "+excl, func(t *testing.T) { if !fileContext.ExcludesFile(excl) { t.Errorf("'%v' not excluded", excl) } }) } for _, incl := range tt.args.included { t.Run(tt.name+" to include "+incl, func(t *testing.T) { if fileContext.ExcludesFile(incl) { t.Errorf("'%v' not included", incl) } }) } } } func Test_CopyFile_skips_self(t *testing.T) { t.Parallel() tempDir := t.TempDir() tempFile := filepath.Join(tempDir, "foo") expected := "bar" if err := os.WriteFile( tempFile, []byte(expected), 0o755, ); err != nil { t.Fatal(err) } ignored, err := CopyFile(tempFile, tempFile, FileContext{}, DoNotChangeUID, DoNotChangeGID, fs.FileMode(0o600), true) if err != nil { t.Fatal(err) } if ignored { t.Fatal("expected file to NOT be ignored") } // Ensure file has expected contents actualData, err := os.ReadFile(tempFile) if err != nil { t.Fatal(err) } if actual := string(actualData); actual != expected { t.Fatalf("expected file contents to be %q, but got %q", expected, actual) } } func fakeExtract(_ string, _ *tar.Header, _ string, _ io.Reader) error { return nil } func Test_GetFSFromLayers_with_whiteouts_include_whiteout_enabled(t *testing.T) { resetMountInfoFile := provideEmptyMountinfoFile() defer resetMountInfoFile() ctrl := gomock.NewController(t) root := t.TempDir() // Write a whiteout path d1 := []byte("Hello World\n") if err := os.WriteFile(filepath.Join(root, "foobar"), d1, 0o644); err != nil { t.Fatal(err) } opts := []FSOpt{ // I'd rather use the real func (util.ExtractFile) // but you have to be root to chown ExtractFunc(fakeExtract), IncludeWhiteout(), } expectErr := false f := func(expectedFiles []string, tw *tar.Writer) { for _, f := range expectedFiles { f := strings.TrimPrefix(strings.TrimPrefix(f, root), "/") hdr := &tar.Header{ Name: f, Mode: 0o644, Size: int64(len("Hello World\n")), } if err := tw.WriteHeader(hdr); err != nil { t.Fatal(err) } if _, err := tw.Write([]byte("Hello World\n")); err != nil { t.Fatal(err) } } if err := tw.Close(); err != nil { t.Fatal(err) } } expectedFiles := []string{ filepath.Join(root, "foobar"), } buf := new(bytes.Buffer) tw := tar.NewWriter(buf) f(expectedFiles, tw) mockLayer := mockv1.NewMockLayer(ctrl) mockLayer.EXPECT().MediaType().Return(types.OCILayer, nil) rc := io.NopCloser(buf) mockLayer.EXPECT().Uncompressed().Return(rc, nil) secondLayerFiles := []string{ filepath.Join(root, ".wh.foobar"), } buf = new(bytes.Buffer) tw = tar.NewWriter(buf) f(secondLayerFiles, tw) mockLayer2 := mockv1.NewMockLayer(ctrl) mockLayer2.EXPECT().MediaType().Return(types.OCILayer, nil) rc = io.NopCloser(buf) mockLayer2.EXPECT().Uncompressed().Return(rc, nil) layers := []v1.Layer{ mockLayer, mockLayer2, } expectedFiles = append(expectedFiles, secondLayerFiles...) actualFiles, err := GetFSFromLayers(root, layers, opts...) assertGetFSFromLayers( t, actualFiles, expectedFiles, err, expectErr, ) // Make sure whiteout files are removed form the root. _, err = os.Lstat(filepath.Join(root, "foobar")) if err == nil || !os.IsNotExist(err) { t.Errorf("expected whiteout foobar file to be deleted. However found it.") } } func provideEmptyMountinfoFile() func() { // Provide empty mountinfo file to prevent /tmp from ending up in ignore list on // distributions with /tmp mountpoint. Otherwise, tests expecting operations in /tmp // can fail. config.MountInfoPath = "/dev/null" return func() { config.MountInfoPath = constants.MountInfoPath } } func Test_GetFSFromLayers_with_whiteouts_include_whiteout_disabled(t *testing.T) { resetMountInfoFile := provideEmptyMountinfoFile() defer resetMountInfoFile() ctrl := gomock.NewController(t) root := t.TempDir() // Write a whiteout path d1 := []byte("Hello World\n") if err := os.WriteFile(filepath.Join(root, "foobar"), d1, 0o644); err != nil { t.Fatal(err) } opts := []FSOpt{ // I'd rather use the real func (util.ExtractFile) // but you have to be root to chown ExtractFunc(fakeExtract), } expectErr := false f := func(expectedFiles []string, tw *tar.Writer) { for _, f := range expectedFiles { f := strings.TrimPrefix(strings.TrimPrefix(f, root), "/") hdr := &tar.Header{ Name: f, Mode: 0o644, Size: int64(len("Hello world\n")), } if err := tw.WriteHeader(hdr); err != nil { t.Fatal(err) } if _, err := tw.Write([]byte("Hello world\n")); err != nil { t.Fatal(err) } } if err := tw.Close(); err != nil { t.Fatal(err) } } expectedFiles := []string{ filepath.Join(root, "foobar"), } buf := new(bytes.Buffer) tw := tar.NewWriter(buf) f(expectedFiles, tw) mockLayer := mockv1.NewMockLayer(ctrl) mockLayer.EXPECT().MediaType().Return(types.OCILayer, nil) layerFiles := []string{ filepath.Join(root, "foobar"), } buf = new(bytes.Buffer) tw = tar.NewWriter(buf) f(layerFiles, tw) rc := io.NopCloser(buf) mockLayer.EXPECT().Uncompressed().Return(rc, nil) secondLayerFiles := []string{ filepath.Join(root, ".wh.foobar"), } buf = new(bytes.Buffer) tw = tar.NewWriter(buf) f(secondLayerFiles, tw) mockLayer2 := mockv1.NewMockLayer(ctrl) mockLayer2.EXPECT().MediaType().Return(types.OCILayer, nil) rc = io.NopCloser(buf) mockLayer2.EXPECT().Uncompressed().Return(rc, nil) layers := []v1.Layer{ mockLayer, mockLayer2, } actualFiles, err := GetFSFromLayers(root, layers, opts...) assertGetFSFromLayers( t, actualFiles, expectedFiles, err, expectErr, ) // Make sure whiteout files are removed form the root. _, err = os.Lstat(filepath.Join(root, "foobar")) if err == nil || !os.IsNotExist(err) { t.Errorf("expected whiteout foobar file to be deleted. However found it.") } } func Test_GetFSFromLayers_ignorelist(t *testing.T) { resetMountInfoFile := provideEmptyMountinfoFile() defer resetMountInfoFile() ctrl := gomock.NewController(t) root := t.TempDir() // Write a whiteout path fileContents := []byte("Hello World\n") if err := os.Mkdir(filepath.Join(root, "testdir"), 0o775); err != nil { t.Fatal(err) } opts := []FSOpt{ // I'd rather use the real func (util.ExtractFile) // but you have to be root to chown ExtractFunc(fakeExtract), IncludeWhiteout(), } f := func(expectedFiles []string, tw *tar.Writer) { for _, f := range expectedFiles { f := strings.TrimPrefix(strings.TrimPrefix(f, root), "/") hdr := &tar.Header{ Name: f, Mode: 0o644, Size: int64(len(string(fileContents))), } if err := tw.WriteHeader(hdr); err != nil { t.Fatal(err) } if _, err := tw.Write(fileContents); err != nil { t.Fatal(err) } } if err := tw.Close(); err != nil { t.Fatal(err) } } // first, testdir is not in ignorelist, so it should be deleted expectedFiles := []string{ filepath.Join(root, ".wh.testdir"), filepath.Join(root, "testdir", "file"), filepath.Join(root, "other-file"), } buf := new(bytes.Buffer) tw := tar.NewWriter(buf) f(expectedFiles, tw) mockLayer := mockv1.NewMockLayer(ctrl) mockLayer.EXPECT().MediaType().Return(types.OCILayer, nil) layerFiles := []string{ filepath.Join(root, ".wh.testdir"), filepath.Join(root, "testdir", "file"), filepath.Join(root, "other-file"), } buf = new(bytes.Buffer) tw = tar.NewWriter(buf) f(layerFiles, tw) rc := io.NopCloser(buf) mockLayer.EXPECT().Uncompressed().Return(rc, nil) layers := []v1.Layer{ mockLayer, } actualFiles, err := GetFSFromLayers(root, layers, opts...) assertGetFSFromLayers( t, actualFiles, expectedFiles, err, false, ) // Make sure whiteout files are removed form the root. _, err = os.Lstat(filepath.Join(root, "testdir")) if err == nil || !os.IsNotExist(err) { t.Errorf("expected testdir to be deleted. However found it.") } // second, testdir is in ignorelist, so it should not be deleted original := append([]IgnoreListEntry{}, defaultIgnoreList...) defer func() { defaultIgnoreList = original }() defaultIgnoreList = append(defaultIgnoreList, IgnoreListEntry{ Path: filepath.Join(root, "testdir"), }) if err := os.Mkdir(filepath.Join(root, "testdir"), 0o775); err != nil { t.Fatal(err) } expectedFiles = []string{ filepath.Join(root, "other-file"), } buf = new(bytes.Buffer) tw = tar.NewWriter(buf) f(expectedFiles, tw) mockLayer = mockv1.NewMockLayer(ctrl) mockLayer.EXPECT().MediaType().Return(types.OCILayer, nil) layerFiles = []string{ filepath.Join(root, ".wh.testdir"), filepath.Join(root, "other-file"), } buf = new(bytes.Buffer) tw = tar.NewWriter(buf) f(layerFiles, tw) rc = io.NopCloser(buf) mockLayer.EXPECT().Uncompressed().Return(rc, nil) layers = []v1.Layer{ mockLayer, } actualFiles, err = GetFSFromLayers(root, layers, opts...) assertGetFSFromLayers( t, actualFiles, expectedFiles, err, false, ) // Make sure testdir still exists. _, err = os.Lstat(filepath.Join(root, "testdir")) if err != nil { t.Errorf("expected testdir to exist, but could not Lstat it: %v", err) } } func Test_GetFSFromLayers(t *testing.T) { ctrl := gomock.NewController(t) root := t.TempDir() opts := []FSOpt{ // I'd rather use the real func (util.ExtractFile) // but you have to be root to chown ExtractFunc(fakeExtract), } expectErr := false expectedFiles := []string{ filepath.Join(root, "foobar"), } buf := new(bytes.Buffer) tw := tar.NewWriter(buf) for _, f := range expectedFiles { f := strings.TrimPrefix(strings.TrimPrefix(f, root), "/") hdr := &tar.Header{ Name: f, Mode: 0o644, Size: int64(len("Hello world\n")), } if err := tw.WriteHeader(hdr); err != nil { t.Fatal(err) } if _, err := tw.Write([]byte("Hello world\n")); err != nil { t.Fatal(err) } } if err := tw.Close(); err != nil { t.Fatal(err) } mockLayer := mockv1.NewMockLayer(ctrl) mockLayer.EXPECT().MediaType().Return(types.OCILayer, nil) rc := io.NopCloser(buf) mockLayer.EXPECT().Uncompressed().Return(rc, nil) layers := []v1.Layer{ mockLayer, } actualFiles, err := GetFSFromLayers(root, layers, opts...) assertGetFSFromLayers( t, actualFiles, expectedFiles, err, expectErr, ) } func assertGetFSFromLayers( t *testing.T, actualFiles []string, expectedFiles []string, err error, expectErr bool, //nolint:unparam ) { t.Helper() if !expectErr && err != nil { t.Error(err) t.FailNow() } else if expectErr && err == nil { t.Error("expected err to not be nil") t.FailNow() } if len(actualFiles) != len(expectedFiles) { t.Errorf("expected %s to equal %s", actualFiles, expectedFiles) t.FailNow() } for i := range expectedFiles { if actualFiles[i] != expectedFiles[i] { t.Errorf("expected %s to equal %s", actualFiles[i], expectedFiles[i]) } } } func TestInitIgnoreList(t *testing.T) { mountInfo := `36 35 98:0 /kaniko /test/kaniko rw,noatime master:1 - ext3 /dev/root rw,errors=continue 36 35 98:0 /proc /test/proc rw,noatime master:1 - ext3 /dev/root rw,errors=continue ` mFile, err := os.CreateTemp("", "mountinfo") if err != nil { t.Fatal(err) } defer mFile.Close() if _, err := mFile.WriteString(mountInfo); err != nil { t.Fatal(err) } config.MountInfoPath = mFile.Name() defer func() { config.MountInfoPath = constants.MountInfoPath }() expected := []IgnoreListEntry{ { Path: "/kaniko", PrefixMatchOnly: false, }, { Path: "/test/kaniko", PrefixMatchOnly: false, }, { Path: "/test/proc", PrefixMatchOnly: false, }, { Path: "/etc/mtab", PrefixMatchOnly: false, }, { Path: "/tmp/apt-key-gpghome", PrefixMatchOnly: true, }, } original := append([]IgnoreListEntry{}, ignorelist...) defer func() { ignorelist = original }() err = InitIgnoreList() if err != nil { t.Fatal(err) } sort.Slice(expected, func(i, j int) bool { return expected[i].Path < expected[j].Path }) sort.Slice(ignorelist, func(i, j int) bool { return ignorelist[i].Path < ignorelist[j].Path }) testutil.CheckDeepEqual(t, expected, ignorelist) } func Test_setFileTimes(t *testing.T) { testDir := t.TempDir() p := filepath.Join(testDir, "foo.txt") if err := os.WriteFile(p, []byte("meow"), 0o777); err != nil { t.Fatal(err) } type testcase struct { desc string path string aTime time.Time mTime time.Time } testCases := []testcase{ { desc: "zero for mod and access", path: p, }, { desc: "zero for mod", path: p, aTime: time.Now(), }, { desc: "zero for access", path: p, mTime: time.Now(), }, { desc: "both non-zero", path: p, mTime: time.Now(), aTime: time.Now(), }, } for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { err := setFileTimes(tc.path, tc.aTime, tc.mTime) if err != nil { t.Errorf("expected err to be nil not %s", err) } }) } } ================================================ FILE: pkg/util/gcr_util.go ================================================ /* Copyright 2021 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "os" "path/filepath" ) // DockerConfLocation returns the file system location of the Docker // configuration file under the directory set in the DOCKER_CONFIG environment // variable. If that variable is not set, it returns the OS-equivalent of // "/kaniko/.docker/config.json". func DockerConfLocation() string { configFile := "config.json" if dockerConfig := os.Getenv("DOCKER_CONFIG"); dockerConfig != "" { file, err := os.Stat(dockerConfig) if err == nil { if file.IsDir() { return filepath.Join(dockerConfig, configFile) } } else { if os.IsNotExist(err) { return string(os.PathSeparator) + filepath.Join("kaniko", ".docker", configFile) } } return filepath.Clean(dockerConfig) } return string(os.PathSeparator) + filepath.Join("kaniko", ".docker", configFile) } ================================================ FILE: pkg/util/gcr_util_test.go ================================================ /* Copyright 2021 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "os" "path/filepath" "testing" ) const ( DefaultKanikoDockerConfigJSON = "/kaniko/.docker/config.json" DockerConfigEnvKey = "DOCKER_CONFIG" ) func TestDockerConfLocationWithInvalidFileLocation(t *testing.T) { originalDockerConfig := os.Getenv(DockerConfigEnvKey) if err := os.Unsetenv(DockerConfigEnvKey); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) } tmpDir := t.TempDir() random := "fdgdsfrdfgdf-fdfsf-24dsgfd" //replace with a really random string file := filepath.Join(tmpDir, random) // an random file name, shouldn't exist if err := os.Setenv(DockerConfigEnvKey, file); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) } unset := DockerConfLocation() // as file doesn't point to a real file, DockerConfLocation() should return the default kaniko path for config.json unsetExpected := DefaultKanikoDockerConfigJSON if unset != unsetExpected { t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) } restoreOriginalDockerConfigEnv(t, originalDockerConfig) } func TestDockerConfLocation(t *testing.T) { originalDockerConfig := os.Getenv(DockerConfigEnvKey) if err := os.Unsetenv(DockerConfigEnvKey); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) } unset := DockerConfLocation() unsetExpected := DefaultKanikoDockerConfigJSON // will fail on Windows if unset != unsetExpected { t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) } tmpDir := t.TempDir() dir := filepath.Join(tmpDir, "/kaniko/.docker") os.MkdirAll(dir, os.ModePerm) if err := os.Setenv(DockerConfigEnvKey, dir); err != nil { t.Fatalf("Failed to set DOCKER_CONFIG: %v", err) } kanikoDefault := DockerConfLocation() kanikoDefaultExpected := filepath.Join(tmpDir, DefaultKanikoDockerConfigJSON) // will fail on Windows if kanikoDefault != kanikoDefaultExpected { t.Errorf("Unexpected kaniko default Docker conf file location: expected:'%s' got:'%s'", kanikoDefaultExpected, kanikoDefault) } differentPath := t.TempDir() if err := os.Setenv(DockerConfigEnvKey, differentPath); err != nil { t.Fatalf("Failed to set DOCKER_CONFIG: %v", err) } set := DockerConfLocation() setExpected := filepath.Join(differentPath, "config.json") // will fail on Windows ? if set != setExpected { t.Errorf("Unexpected DOCKER_CONF-based file location: expected:'%s' got:'%s'", setExpected, set) } restoreOriginalDockerConfigEnv(t, originalDockerConfig) } func restoreOriginalDockerConfigEnv(t *testing.T, originalDockerConfig string) { if originalDockerConfig != "" { if err := os.Setenv(DockerConfigEnvKey, originalDockerConfig); err != nil { t.Fatalf("Failed to set DOCKER_CONFIG back to original value '%s': %v", originalDockerConfig, err) } } else { if err := os.Unsetenv(DockerConfigEnvKey); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG after testing: %v", err) } } } func TestDockerConfLocationWithFileLocation(t *testing.T) { originalDockerConfig := os.Getenv(DockerConfigEnvKey) if err := os.Unsetenv(DockerConfigEnvKey); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) } file, err := os.CreateTemp("", "docker.conf") if err != nil { t.Fatalf("could not create temp file: %s", err) } defer os.Remove(file.Name()) if err := os.Setenv(DockerConfigEnvKey, file.Name()); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) } unset := DockerConfLocation() unsetExpected := file.Name() if unset != unsetExpected { t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) } restoreOriginalDockerConfigEnv(t, originalDockerConfig) } ================================================ FILE: pkg/util/groupids_cgo.go ================================================ //go:build (linux || darwin) && cgo // +build linux darwin // +build cgo /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "os/user" ) // groupIDs returns all of the group ID's a user is a member of func groupIDs(u *user.User) ([]string, error) { // user can have no gid if it's a non existing user if u.Gid == "" { return []string{}, nil } return u.GroupIds() } ================================================ FILE: pkg/util/groupids_fallback.go ================================================ //go:build (linux || darwin) && !cgo // +build linux darwin // +build !cgo /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "bufio" "bytes" "io" "os" "os/user" "strconv" "strings" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) var groupFile = "/etc/group" type group struct { id string // group ID name string // group name members []string // secondary group ids } // groupIDs returns all of the group ID's a user is a member of func groupIDs(u *user.User) ([]string, error) { logrus.Infof("Performing slow lookup of group ids for %s", u.Username) // user can have no gid if it's a non existing user if u.Gid == "" { return []string{}, nil } f, err := os.Open(groupFile) if err != nil { return nil, errors.Wrap(err, "open") } defer f.Close() gids := []string{u.Gid} for _, g := range localGroups(f) { for _, m := range g.members { if m == u.Username { gids = append(gids, g.id) } } } return gids, nil } // localGroups parses a reader in /etc/group form, returning parsed group data // based on src/os/user/lookup_unix.go - but extended to include secondary groups func localGroups(r io.Reader) []*group { var groups []*group bs := bufio.NewScanner(r) for bs.Scan() { line := bs.Bytes() // There's no spec for /etc/passwd or /etc/group, but we try to follow // the same rules as the glibc parser, which allows comments and blank // space at the beginning of a line. line = bytes.TrimSpace(line) if len(line) == 0 || line[0] == '#' { continue } // wheel:*:0:root,anotherGrp parts := strings.SplitN(string(line), ":", 4) if _, err := strconv.Atoi(parts[2]); err != nil { continue } groups = append(groups, &group{name: parts[0], id: parts[2], members: strings.Split(parts[3], ",")}) } return groups } ================================================ FILE: pkg/util/proc/proc.go ================================================ /* Copyright 2022 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Ported from https://github.com/genuinetools/bpfd/blob/a4bfa5e3e9d1bfdbc56268a36a0714911ae9b6bf/proc/proc.go package proc import ( "fmt" "os" "regexp" "strings" ) // ContainerRuntime is the type for the various container runtime strings. type ContainerRuntime string const ( // RuntimeDocker is the string for the docker runtime. RuntimeDocker ContainerRuntime = "docker" // RuntimeRkt is the string for the rkt runtime. RuntimeRkt ContainerRuntime = "rkt" // RuntimeNspawn is the string for the systemd-nspawn runtime. RuntimeNspawn ContainerRuntime = "systemd-nspawn" // RuntimeLXC is the string for the lxc runtime. RuntimeLXC ContainerRuntime = "lxc" // RuntimeLXCLibvirt is the string for the lxc-libvirt runtime. RuntimeLXCLibvirt ContainerRuntime = "lxc-libvirt" // RuntimeOpenVZ is the string for the openvz runtime. RuntimeOpenVZ ContainerRuntime = "openvz" // RuntimeKubernetes is the string for the kubernetes runtime. RuntimeKubernetes ContainerRuntime = "kube" // RuntimeGarden is the string for the garden runtime. RuntimeGarden ContainerRuntime = "garden" // RuntimePodman is the string for the podman runtime. RuntimePodman ContainerRuntime = "podman" // RuntimeGVisor is the string for the gVisor (runsc) runtime. RuntimeGVisor ContainerRuntime = "gvisor" // RuntimeFirejail is the string for the firejail runtime. RuntimeFirejail ContainerRuntime = "firejail" // RuntimeWSL is the string for the Windows Subsystem for Linux runtime. RuntimeWSL ContainerRuntime = "wsl" // RuntimeNotFound is the string for when no container runtime is found. RuntimeNotFound ContainerRuntime = "not-found" ) var ( // ContainerRuntimes contains all the container runtimes. ContainerRuntimes = []ContainerRuntime{ RuntimeDocker, RuntimeRkt, RuntimeNspawn, RuntimeLXC, RuntimeLXCLibvirt, RuntimeOpenVZ, RuntimeKubernetes, RuntimeGarden, RuntimePodman, RuntimeGVisor, RuntimeFirejail, RuntimeWSL, } ) // GetContainerRuntime returns the container runtime the process is running in. // If pid is less than one, it returns the runtime for "self". func GetContainerRuntime(tgid, pid int) ContainerRuntime { file := "/proc/self/cgroup" if pid > 0 { if tgid > 0 { file = fmt.Sprintf("/proc/%d/task/%d/cgroup", tgid, pid) } else { file = fmt.Sprintf("/proc/%d/cgroup", pid) } } // read the cgroups file a := readFileString(file) runtime := getContainerRuntime(a) if runtime != RuntimeNotFound { return runtime } // /proc/vz exists in container and outside of the container, /proc/bc only outside of the container. if osFileExists("/proc/vz") && !osFileExists("/proc/bc") { return RuntimeOpenVZ } // /__runsc_containers__ directory is present in gVisor containers. if osFileExists("/__runsc_containers__") { return RuntimeGVisor } // firejail runs with `firejail` as pid 1. // As firejail binary cannot be run with argv[0] != "firejail" // it's okay to rely on cmdline. a = readFileString("/proc/1/cmdline") runtime = getContainerRuntime(a) if runtime != RuntimeNotFound { return runtime } // WSL has /proc/version_signature starting with "Microsoft". a = readFileString("/proc/version_signature") if strings.HasPrefix(a, "Microsoft") { return RuntimeWSL } a = os.Getenv("container") runtime = getContainerRuntime(a) if runtime != RuntimeNotFound { return runtime } // PID 1 might have dropped this information into a file in /run. // Read from /run/systemd/container since it is better than accessing /proc/1/environ, // which needs CAP_SYS_PTRACE a = readFileString("/run/systemd/container") runtime = getContainerRuntime(a) if runtime != RuntimeNotFound { return runtime } // Check for container specific files runtime = detectContainerFiles() if runtime != RuntimeNotFound { return runtime } // Docker was not detected at this point. // An overlay mount on "/" may indicate we're under containerd or other runtime. a = readFileString("/proc/mounts") if m, _ := regexp.MatchString("^[^ ]+ / overlay", a); m { return RuntimeKubernetes } return RuntimeNotFound } // Related implementation: https://github.com/systemd/systemd/blob/6604fb0207ee10e8dc05d67f6fe45de0b193b5c4/src/basic/virt.c#L523-L549 func detectContainerFiles() ContainerRuntime { files := []struct { runtime ContainerRuntime location string }{ // https://github.com/containers/podman/issues/6192 // https://github.com/containers/podman/issues/3586#issuecomment-661918679 {RuntimePodman, "/run/.containerenv"}, // https://github.com/moby/moby/issues/18355 {RuntimeDocker, "/.dockerenv"}, // Detect the presence of a serviceaccount secret mounted in the default location {RuntimeKubernetes, "/var/run/secrets/kubernetes.io/serviceaccount"}, } for i := range files { if osFileExists(files[i].location) { return files[i].runtime } } return RuntimeNotFound } func getContainerRuntime(input string) ContainerRuntime { if len(strings.TrimSpace(input)) < 1 { return RuntimeNotFound } for _, runtime := range ContainerRuntimes { if strings.Contains(input, string(runtime)) { return runtime } } return RuntimeNotFound } func osFileExists(file string) bool { if _, err := os.Stat(file); !os.IsNotExist(err) { return true } return false } func readFile(file string) []byte { if !osFileExists(file) { return nil } b, _ := os.ReadFile(file) return b } func readFileString(file string) string { b := readFile(file) if b == nil { return "" } return strings.TrimSpace(string(b)) } ================================================ FILE: pkg/util/proc/proc_test.go ================================================ /* Copyright 2022 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package proc import ( "testing" ) func TestGetContainerRuntime(t *testing.T) { testcases := map[string]struct { expectedRuntime ContainerRuntime input string }{ "empty": { expectedRuntime: RuntimeNotFound, }, "typical docker": { expectedRuntime: RuntimeDocker, input: `11:pids:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 10:devices:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 9:freezer:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 8:net_cls,net_prio:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 7:perf_event:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 6:cpuset:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 5:memory:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 4:blkio:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 3:cpu,cpuacct:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 2:hugetlb:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 1:name=systemd:/docker/68fad1f9e0985989408aff30e7b83e7dada1d235ff46a22c5465ca193ddf0fac 0::/system.slice/containerd.service`, }, "uncontainerized process": { expectedRuntime: RuntimeNotFound, input: `11:pids:/system.slice/ssh.service 10:devices:/system.slice/ssh.service 9:freezer:/ 8:net_cls,net_prio:/ 7:perf_event:/ 6:cpuset:/ 5:memory:/system.slice/ssh.service 4:blkio:/system.slice/ssh.service 3:cpu,cpuacct:/system.slice/ssh.service 2:hugetlb:/ 1:name=systemd:/system.slice/ssh.service 0::/system.slice/ssh.service`, }, "kubernetes": { expectedRuntime: RuntimeKubernetes, input: `12:perf_event:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 11:freezer:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 10:pids:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 9:net_cls,net_prio:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 8:memory:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 7:cpuset:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 6:devices:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 5:blkio:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 4:rdma:/ 3:hugetlb:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 2:cpu,cpuacct:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47 1:name=systemd:/kubepods/burstable/pod98051bd2-a5fa-11e8-9bb9-0a58ac1f31f2/74998d19bd3c7423744214c344c6e814d19b7908a92f165f9d58243073a27a47`, }, "lxc": { expectedRuntime: RuntimeLXC, // this is usually in $container for lxc input: `10:cpuset:/lxc/debian2 9:pids:/lxc/debian2 8:devices:/lxc/debian2 7:net_cls,net_prio:/lxc/debian2 6:freezer:/lxc/debian2 5:blkio:/lxc/debian2 4:memory:/lxc/debian2 3:cpu,cpuacct:/lxc/debian2 2:perf_event:/lxc/debian2 1:name=systemd:/lxc/debian2`, }, "nspawn": { expectedRuntime: RuntimeNotFound, // since this variable is in $container input: `10:cpuset:/ 9:pids:/machine.slice/machine-nspawntest.scope 8:devices:/machine.slice/machine-nspawntest.scope 7:net_cls,net_prio:/ 6:freezer:/user/root/0 5:blkio:/machine.slice/machine-nspawntest.scope 4:memory:/machine.slice/machine-nspawntest.scope 3:cpu,cpuacct:/machine.slice/machine-nspawntest.scope 2:perf_event:/ 1:name=systemd:/machine.slice/machine-nspawntest.scope`, }, "rkt": { expectedRuntime: RuntimeRkt, input: `10:cpuset:/ 9:pids:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice/debian.service 8:devices:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice/debian.service 7:net_cls,net_prio:/ 6:freezer:/user/root/0 5:blkio:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice 4:memory:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice 3:cpu,cpuacct:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice 2:perf_event:/ 1:name=systemd:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice/debian.service`, }, "rkt host": { expectedRuntime: RuntimeRkt, input: `10:cpuset:/ 9:pids:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice/debian.service 8:devices:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice/debian.service 7:net_cls,net_prio:/ 6:freezer:/user/root/0 5:blkio:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice 4:memory:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice 3:cpu,cpuacct:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice 2:perf_event:/ 1:name=systemd:/machine.slice/machine-rkt\x2dbfb7d57e\x2d80ff\x2d4ef8\x2db602\x2d9b907b3f3a38.scope/system.slice/debian.service`, }, } for key, tc := range testcases { runtime := getContainerRuntime(tc.input) if runtime != tc.expectedRuntime { t.Errorf("[%s]: expected runtime %q, got %q", key, tc.expectedRuntime, runtime) } } } ================================================ FILE: pkg/util/syscall_credentials.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "fmt" "strconv" "strings" "syscall" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) func SyscallCredentials(userStr string) (*syscall.Credential, error) { uid, gid, err := getUIDAndGIDFromString(userStr) if err != nil { return nil, errors.Wrap(err, "get uid/gid") } u, err := LookupUser(fmt.Sprint(uid)) if err != nil { return nil, errors.Wrap(err, "lookup") } logrus.Infof("Util.Lookup returned: %+v", u) // initiliaze empty groups := []uint32{} gidStr, err := groupIDs(u) if err != nil { return nil, errors.Wrap(err, "group ids for user") } for _, g := range gidStr { i, err := strconv.ParseUint(g, 10, 32) if err != nil { return nil, errors.Wrap(err, "parseuint") } groups = append(groups, uint32(i)) } if !(len(strings.Split(userStr, ":")) > 1) { if u.Gid != "" { gid, _ = getGID(u.Gid) } } return &syscall.Credential{ Uid: uid, Gid: gid, Groups: groups, }, nil } ================================================ FILE: pkg/util/syscall_credentials_test.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "fmt" "strconv" "syscall" "testing" "github.com/GoogleContainerTools/kaniko/testutil" ) func TestSyscallCredentials(t *testing.T) { currentUser := testutil.GetCurrentUser(t) uid, _ := strconv.ParseUint(currentUser.Uid, 10, 32) currentUserUID32 := uint32(uid) gid, _ := strconv.ParseUint(currentUser.Gid, 10, 32) currentUserGID32 := uint32(gid) currentUserGroupIDsU32 := []uint32{} currentUserGroupIDs, _ := currentUser.GroupIds() for _, id := range currentUserGroupIDs { id32, _ := strconv.ParseUint(id, 10, 32) currentUserGroupIDsU32 = append(currentUserGroupIDsU32, uint32(id32)) } type args struct { userStr string } tests := []struct { name string args args want *syscall.Credential wantErr bool }{ { name: "non-existing user without group", args: args{ userStr: "helloworld-user", }, wantErr: true, }, { name: "non-existing uid without group", args: args{ userStr: "50000", }, want: &syscall.Credential{ Uid: 50000, // because fallback is enabled Gid: 50000, Groups: []uint32{}, }, }, { name: "non-existing uid with existing gid", args: args{ userStr: fmt.Sprintf("50000:%d", currentUserGID32), }, want: &syscall.Credential{ Uid: 50000, Gid: currentUserGID32, Groups: []uint32{}, }, }, { name: "existing username with non-existing gid", args: args{ userStr: fmt.Sprintf("%s:50000", currentUser.Username), }, want: &syscall.Credential{ Uid: currentUserUID32, Gid: 50000, Groups: currentUserGroupIDsU32, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := SyscallCredentials(tt.args.userStr) testutil.CheckErrorAndDeepEqual(t, tt.wantErr, err, tt.want, got) }) } } ================================================ FILE: pkg/util/tar_util.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "archive/tar" "compress/bzip2" "compress/gzip" "fmt" "io" "io/fs" "os" "path/filepath" "strings" "syscall" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/system" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) // Tar knows how to write files to a tar file. type Tar struct { hardlinks map[uint64]string w *tar.Writer } // NewTar will create an instance of Tar that can write files to the writer at f. func NewTar(f io.Writer) Tar { w := tar.NewWriter(f) return Tar{ w: w, hardlinks: map[uint64]string{}, } } func CreateTarballOfDirectory(pathToDir string, f io.Writer) error { if !filepath.IsAbs(pathToDir) { return errors.New("pathToDir is not absolute") } tarWriter := NewTar(f) defer tarWriter.Close() walkFn := func(path string, d fs.DirEntry, err error) error { if err != nil { return err } if !filepath.IsAbs(path) { return fmt.Errorf("path %v is not absolute, cant read file", path) } return tarWriter.AddFileToTar(path) } return filepath.WalkDir(pathToDir, walkFn) } // Close will close any open streams used by Tar. func (t *Tar) Close() { t.w.Close() } // AddFileToTar adds the file at path p to the tar func (t *Tar) AddFileToTar(p string) error { i, err := os.Lstat(p) if err != nil { return fmt.Errorf("Failed to get file info for %s: %w", p, err) } linkDst := "" if i.Mode()&os.ModeSymlink != 0 { var err error linkDst, err = os.Readlink(p) if err != nil { return err } } if i.Mode()&os.ModeSocket != 0 { logrus.Infof("Ignoring socket %s, not adding to tar", i.Name()) return nil } hdr, err := tar.FileInfoHeader(i, linkDst) if err != nil { return err } err = readSecurityXattrToTarHeader(p, hdr) if err != nil { return err } if p == config.RootDir { // allow entry for / to preserve permission changes etc. (currently ignored anyway by Docker runtime) hdr.Name = "/" } else { // Docker uses no leading / in the tarball hdr.Name = strings.TrimPrefix(p, config.RootDir) hdr.Name = strings.TrimLeft(hdr.Name, "/") } if hdr.Typeflag == tar.TypeDir && !strings.HasSuffix(hdr.Name, "/") { hdr.Name = hdr.Name + "/" } // rootfs may not have been extracted when using cache, preventing uname/gname from resolving // this makes this layer unnecessarily differ from a cached layer which does contain this information hdr.Uname = "" hdr.Gname = "" // use PAX format to preserve accurate mtime (match Docker behavior) hdr.Format = tar.FormatPAX hardlink, linkDst := t.checkHardlink(p, i) if hardlink { hdr.Linkname = linkDst hdr.Typeflag = tar.TypeLink hdr.Size = 0 } if err := t.w.WriteHeader(hdr); err != nil { return err } if !(i.Mode().IsRegular()) || hardlink { return nil } r, err := os.Open(p) if err != nil { return err } defer r.Close() if _, err := io.Copy(t.w, r); err != nil { return err } return nil } const ( securityCapabilityXattr = "security.capability" ) // writeSecurityXattrToTarFile writes security.capability // xattrs from a tar header to filesystem func writeSecurityXattrToTarFile(path string, hdr *tar.Header) error { if hdr.Xattrs == nil { return nil } if capability, ok := hdr.Xattrs[securityCapabilityXattr]; ok { err := system.Lsetxattr(path, securityCapabilityXattr, []byte(capability), 0) if err != nil && !errors.Is(err, syscall.EOPNOTSUPP) && !errors.Is(err, system.ErrNotSupportedPlatform) { return errors.Wrapf(err, "failed to write %q attribute to %q", securityCapabilityXattr, path) } } return nil } // readSecurityXattrToTarHeader reads security.capability // xattrs from filesystem to a tar header func readSecurityXattrToTarHeader(path string, hdr *tar.Header) error { if hdr.Xattrs == nil { hdr.Xattrs = make(map[string]string) } capability, err := system.Lgetxattr(path, securityCapabilityXattr) if err != nil && !errors.Is(err, syscall.EOPNOTSUPP) && !errors.Is(err, system.ErrNotSupportedPlatform) { return errors.Wrapf(err, "failed to read %q attribute from %q", securityCapabilityXattr, path) } if capability != nil { hdr.Xattrs[securityCapabilityXattr] = string(capability) } return nil } func (t *Tar) Whiteout(p string) error { dir := filepath.Dir(p) name := archive.WhiteoutPrefix + filepath.Base(p) th := &tar.Header{ // Docker uses no leading / in the tarball Name: strings.TrimLeft(filepath.Join(dir, name), "/"), Size: 0, } if err := t.w.WriteHeader(th); err != nil { return err } return nil } // Returns true if path is hardlink, and the link destination func (t *Tar) checkHardlink(p string, i os.FileInfo) (bool, string) { hardlink := false linkDst := "" stat := getSyscallStatT(i) if stat != nil { nlinks := stat.Nlink if nlinks > 1 { inode := stat.Ino if original, exists := t.hardlinks[inode]; exists && original != p { hardlink = true logrus.Debugf("%s inode exists in hardlinks map, linking to %s", p, original) linkDst = original } else { t.hardlinks[inode] = p } } } return hardlink, linkDst } func getSyscallStatT(i os.FileInfo) *syscall.Stat_t { if sys := i.Sys(); sys != nil { if stat, ok := sys.(*syscall.Stat_t); ok { return stat } } return nil } // UnpackLocalTarArchive unpacks the tar archive at path to the directory dest // Returns the files extracted from the tar archive func UnpackLocalTarArchive(path, dest string) ([]string, error) { // First, we need to check if the path is a local tar archive if compressed, compressionLevel := fileIsCompressedTar(path); compressed { file, err := os.Open(path) if err != nil { return nil, err } defer file.Close() if compressionLevel == archive.Gzip { gzr, err := gzip.NewReader(file) if err != nil { return nil, err } defer gzr.Close() return UnTar(gzr, dest) } else if compressionLevel == archive.Bzip2 { bzr := bzip2.NewReader(file) return UnTar(bzr, dest) } } if fileIsUncompressedTar(path) { file, err := os.Open(path) if err != nil { return nil, err } defer file.Close() return UnTar(file, dest) } return nil, errors.New("path does not lead to local tar archive") } // IsFileLocalTarArchive returns true if the file is a local tar archive func IsFileLocalTarArchive(src string) bool { compressed, _ := fileIsCompressedTar(src) uncompressed := fileIsUncompressedTar(src) return compressed || uncompressed } func fileIsCompressedTar(src string) (bool, archive.Compression) { r, err := os.Open(src) if err != nil { return false, -1 } defer r.Close() buf, err := io.ReadAll(r) if err != nil { return false, -1 } compressionLevel := archive.DetectCompression(buf) return (compressionLevel > 0), compressionLevel } func fileIsUncompressedTar(src string) bool { r, err := os.Open(src) if err != nil { return false } defer r.Close() fi, err := os.Lstat(src) if err != nil { return false } if fi.Size() == 0 { return false } tr := tar.NewReader(r) if tr == nil { return false } _, err = tr.Next() return err == nil } // UnpackCompressedTar unpacks the compressed tar at path to dir func UnpackCompressedTar(path, dir string) error { file, err := os.Open(path) if err != nil { return err } defer file.Close() gzr, err := gzip.NewReader(file) if err != nil { return err } defer gzr.Close() _, err = UnTar(gzr, dir) return err } ================================================ FILE: pkg/util/tar_util_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "archive/tar" "bytes" "compress/gzip" "fmt" "io" "os" "path/filepath" "testing" "time" "github.com/GoogleContainerTools/kaniko/testutil" ) var regularFiles = []string{"file", "file.tar", "file.tar.gz"} var uncompressedTars = []string{"uncompressed", "uncompressed.tar"} var compressedTars = []string{"compressed", "compressed.tar.gz"} func Test_IsLocalTarArchive(t *testing.T) { testDir := t.TempDir() if err := setUpFilesAndTars(testDir); err != nil { t.Fatal(err) } // Test we get the correct result for regular files for _, regularFile := range regularFiles { isTarArchive := IsFileLocalTarArchive(filepath.Join(testDir, regularFile)) testutil.CheckErrorAndDeepEqual(t, false, nil, false, isTarArchive) } // Test we get the correct result for uncompressed tars for _, uncompressedTar := range uncompressedTars { isTarArchive := IsFileLocalTarArchive(filepath.Join(testDir, uncompressedTar)) testutil.CheckErrorAndDeepEqual(t, false, nil, true, isTarArchive) } // Test we get the correct result for compressed tars for _, compressedTar := range compressedTars { isTarArchive := IsFileLocalTarArchive(filepath.Join(testDir, compressedTar)) testutil.CheckErrorAndDeepEqual(t, false, nil, true, isTarArchive) } } func Test_AddFileToTar(t *testing.T) { testDir := t.TempDir() path := filepath.Join(testDir, regularFiles[0]) if err := os.WriteFile(path, []byte("hello"), os.ModePerm); err != nil { t.Fatal(err) } // use a pre-determined time with non-zero microseconds to avoid flakiness mtime := time.UnixMicro(1635533172891395) if err := os.Chtimes(path, mtime, mtime); err != nil { t.Fatal(err) } buf := new(bytes.Buffer) tarw := NewTar(buf) if err := tarw.AddFileToTar(path); err != nil { t.Fatal(err) } tarw.Close() // Check that the mtime is correct (#1808) tarReader := tar.NewReader(buf) hdr, err := tarReader.Next() if err != nil { t.Fatal(err) } testutil.CheckDeepEqual(t, mtime, hdr.ModTime) } func setUpFilesAndTars(testDir string) error { regularFilesAndContents := map[string]string{ regularFiles[0]: "", regularFiles[1]: "something", regularFiles[2]: "here", } if err := testutil.SetupFiles(testDir, regularFilesAndContents); err != nil { return err } for _, uncompressedTar := range uncompressedTars { tarFile, err := os.Create(filepath.Join(testDir, uncompressedTar)) if err != nil { return err } if err := createTar(testDir, tarFile); err != nil { return err } } for _, compressedTar := range compressedTars { tarFile, err := os.Create(filepath.Join(testDir, compressedTar)) if err != nil { return err } gzr := gzip.NewWriter(tarFile) if err := createTar(testDir, gzr); err != nil { return err } } return nil } func createTar(testdir string, writer io.Writer) error { t := NewTar(writer) defer t.Close() for _, regFile := range regularFiles { filePath := filepath.Join(testdir, regFile) if err := t.AddFileToTar(filePath); err != nil { return err } } return nil } func Test_CreateTarballOfDirectory(t *testing.T) { tmpDir := t.TempDir() wantErr := false createFilesInTempDir(t, tmpDir) f := &bytes.Buffer{} err := CreateTarballOfDirectory(tmpDir, f) testutil.CheckError(t, wantErr, err) extracedFilesDir := filepath.Join(tmpDir, "extracted") err = os.Mkdir(extracedFilesDir, 0755) if err != nil { t.Error(err) return } files, err := UnTar(f, extracedFilesDir) testutil.CheckError(t, wantErr, err) for _, filePath := range files { fileInfo, err := os.Lstat(filePath) testutil.CheckError(t, wantErr, err) if fileInfo.IsDir() { // skip directory continue } file, err := os.Open(filePath) testutil.CheckError(t, wantErr, err) body, err := io.ReadAll(file) testutil.CheckError(t, wantErr, err) index := filepath.Base(filePath) testutil.CheckDeepEqual(t, string(body), fmt.Sprintf("hello from %s\n", index)) } } func createFilesInTempDir(t *testing.T, tmpDir string) { for i := 0; i < 2; i++ { fName := filepath.Join(tmpDir, fmt.Sprint(i)) content := fmt.Sprintf("hello from %d\n", i) if err := os.WriteFile(fName, []byte(content), 0666); err != nil { t.Error(err) return } } } ================================================ FILE: pkg/util/transport_util.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "crypto/tls" "crypto/x509" "fmt" "os" "strings" "net/http" "github.com/GoogleContainerTools/kaniko/pkg/config" "github.com/sirupsen/logrus" ) type CertPool interface { value() *x509.CertPool append(path string) error } type X509CertPool struct { inner x509.CertPool } func (p *X509CertPool) value() *x509.CertPool { return &p.inner } func (p *X509CertPool) append(path string) error { pem, err := os.ReadFile(path) if err != nil { return err } p.inner.AppendCertsFromPEM(pem) return nil } var systemCertLoader CertPool type KeyPairLoader interface { load(string, string) (tls.Certificate, error) } type X509KeyPairLoader struct { } func (p *X509KeyPairLoader) load(certFile, keyFile string) (tls.Certificate, error) { return tls.LoadX509KeyPair(certFile, keyFile) } var systemKeyPairLoader KeyPairLoader func init() { systemCertPool, err := x509.SystemCertPool() if err != nil { logrus.Warn("Failed to load system cert pool. Loading empty one instead.") systemCertPool = x509.NewCertPool() } systemCertLoader = &X509CertPool{ inner: *systemCertPool, } systemKeyPairLoader = &X509KeyPairLoader{} } func MakeTransport(opts config.RegistryOptions, registryName string) (http.RoundTripper, error) { // Create a transport to set our user-agent. var tr http.RoundTripper = http.DefaultTransport.(*http.Transport).Clone() if opts.SkipTLSVerify || opts.SkipTLSVerifyRegistries.Contains(registryName) { tr.(*http.Transport).TLSClientConfig = &tls.Config{ InsecureSkipVerify: true, } } else if certificatePath := opts.RegistriesCertificates[registryName]; certificatePath != "" { if err := systemCertLoader.append(certificatePath); err != nil { return nil, fmt.Errorf("failed to load certificate %s for %s: %w", certificatePath, registryName, err) } tr.(*http.Transport).TLSClientConfig = &tls.Config{ RootCAs: systemCertLoader.value(), } } if clientCertificatePath := opts.RegistriesClientCertificates[registryName]; clientCertificatePath != "" { certFiles := strings.Split(clientCertificatePath, ",") if len(certFiles) != 2 { return nil, fmt.Errorf("failed to load client certificate/key '%s=%s', expected format: %s=/path/to/cert,/path/to/key", registryName, clientCertificatePath, registryName) } cert, err := systemKeyPairLoader.load(certFiles[0], certFiles[1]) if err != nil { return nil, fmt.Errorf("failed to load client certificate/key '%s' for %s: %w", clientCertificatePath, registryName, err) } tr.(*http.Transport).TLSClientConfig.Certificates = []tls.Certificate{cert} } return tr, nil } ================================================ FILE: pkg/util/transport_util_test.go ================================================ /* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "crypto/tls" "crypto/x509" "fmt" "net/http" "testing" "github.com/GoogleContainerTools/kaniko/pkg/config" ) type mockedCertPool struct { certificatesPath []string } func (m *mockedCertPool) value() *x509.CertPool { return &x509.CertPool{} } func (m *mockedCertPool) append(path string) error { m.certificatesPath = append(m.certificatesPath, path) return nil } type mockedKeyPairLoader struct { } func (p *mockedKeyPairLoader) load(certFile, keyFile string) (tls.Certificate, error) { foo := tls.Certificate{} return foo, nil } func Test_makeTransport(t *testing.T) { registryName := "my.registry.name" tests := []struct { name string opts config.RegistryOptions check func(*tls.Config, *mockedCertPool, error) }{ { name: "SkipTLSVerify set", opts: config.RegistryOptions{SkipTLSVerify: true}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if !config.InsecureSkipVerify { t.Errorf("makeTransport().TLSClientConfig.InsecureSkipVerify not set while SkipTLSVerify set") } }, }, { name: "SkipTLSVerifyRegistries set with expected registry", opts: config.RegistryOptions{SkipTLSVerifyRegistries: []string{registryName}}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if !config.InsecureSkipVerify { t.Errorf("makeTransport().TLSClientConfig.InsecureSkipVerify not set while SkipTLSVerifyRegistries set with registry name") } }, }, { name: "SkipTLSVerifyRegistries set with other registry", opts: config.RegistryOptions{SkipTLSVerifyRegistries: []string{fmt.Sprintf("other.%s", registryName)}}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if config.InsecureSkipVerify { t.Errorf("makeTransport().TLSClientConfig.InsecureSkipVerify set while SkipTLSVerifyRegistries not set with registry name") } }, }, { name: "RegistriesCertificates set for registry", opts: config.RegistryOptions{RegistriesCertificates: map[string]string{registryName: "/path/to/the/certificate.cert"}}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if len(pool.certificatesPath) != 1 || pool.certificatesPath[0] != "/path/to/the/certificate.cert" { t.Errorf("makeTransport().RegistriesCertificates certificate not appended to system certificates") } }, }, { name: "RegistriesCertificates set for another registry", opts: config.RegistryOptions{RegistriesCertificates: map[string]string{fmt.Sprintf("other.%s=", registryName): "/path/to/the/certificate.cert"}}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if len(pool.certificatesPath) != 0 { t.Errorf("makeTransport().RegistriesCertificates certificate appended to system certificates while added for other registry") } }, }, { name: "RegistriesClientCertificates set for registry", opts: config.RegistryOptions{RegistriesClientCertificates: map[string]string{registryName: "/path/to/client/certificate.cert,/path/to/client/key.key"}}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if len(config.Certificates) != 1 { t.Errorf("makeTransport().RegistriesClientCertificates not loaded for desired registry") } }, }, { name: "RegistriesClientCertificates set for another registry", opts: config.RegistryOptions{RegistriesClientCertificates: map[string]string{fmt.Sprintf("other.%s", registryName): "/path/to/client/certificate.cert,/path/to/key.key,/path/to/extra.crt"}}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if len(config.Certificates) != 0 { t.Errorf("makeTransport().RegistriesClientCertificates certificate loaded for other registry") } }, }, { name: "RegistriesClientCertificates incorrect cert format", opts: config.RegistryOptions{RegistriesClientCertificates: map[string]string{registryName: "/path/to/client/certificate.cert"}}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if config != nil { t.Errorf("makeTransport().RegistriesClientCertificates was incorrectly loaded without both client/key (config was not nil)") } expectedError := "failed to load client certificate/key 'my.registry.name=/path/to/client/certificate.cert', expected format: my.registry.name=/path/to/cert,/path/to/key" if err == nil { t.Errorf("makeTransport().RegistriesClientCertificates was incorrectly loaded without both client/key (expected error, got nil)") } else if err.Error() != expectedError { t.Errorf("makeTransport().RegistriesClientCertificates was incorrectly loaded without both client/key (expected: %s, got: %s)", expectedError, err.Error()) } }, }, { name: "RegistriesClientCertificates incorrect cert format extra", opts: config.RegistryOptions{RegistriesClientCertificates: map[string]string{registryName: "/path/to/client/certificate.cert,/path/to/key.key,/path/to/extra.crt"}}, check: func(config *tls.Config, pool *mockedCertPool, err error) { if config != nil { t.Errorf("makeTransport().RegistriesClientCertificates was incorrectly loaded with extra paths in comma split (config was not nil)") } expectedError := "failed to load client certificate/key 'my.registry.name=/path/to/client/certificate.cert,/path/to/key.key,/path/to/extra.crt', expected format: my.registry.name=/path/to/cert,/path/to/key" if err == nil { t.Errorf("makeTransport().RegistriesClientCertificates was incorrectly loaded loaded with extra paths in comma split (expected error, got nil)") } else if err.Error() != expectedError { t.Errorf("makeTransport().RegistriesClientCertificates was incorrectly loaded loaded with extra paths in comma split (expected: %s, got: %s)", expectedError, err.Error()) } }, }, } savedSystemCertLoader := systemCertLoader savedSystemKeyPairLoader := systemKeyPairLoader defer func() { systemCertLoader = savedSystemCertLoader systemKeyPairLoader = savedSystemKeyPairLoader }() for _, tt := range tests { var certificatesPath []string certPool := &mockedCertPool{ certificatesPath: certificatesPath, } systemCertLoader = certPool systemKeyPairLoader = &mockedKeyPairLoader{} t.Run(tt.name, func(t *testing.T) { tr, err := MakeTransport(tt.opts, registryName) var tlsConfig *tls.Config if err == nil { tlsConfig = tr.(*http.Transport).TLSClientConfig } tt.check(tlsConfig, certPool, err) }) } } ================================================ FILE: pkg/util/util.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "crypto/md5" "crypto/sha256" "encoding/hex" "fmt" "io" "math" "os" "strconv" "sync" "syscall" "time" "github.com/minio/highwayhash" "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) // Hasher returns a hash function, used in snapshotting to determine if a file has changed func Hasher() func(string) (string, error) { pool := sync.Pool{ New: func() interface{} { b := make([]byte, highwayhash.Size*10*1024) return &b }, } key := make([]byte, highwayhash.Size) hasher := func(p string) (string, error) { h, _ := highwayhash.New(key) fi, err := os.Lstat(p) if err != nil { return "", err } h.Write([]byte(fi.Mode().String())) h.Write([]byte(fi.ModTime().String())) h.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36))) h.Write([]byte(",")) h.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36))) if fi.Mode().IsRegular() { capability, _ := Lgetxattr(p, "security.capability") if capability != nil { h.Write(capability) } f, err := os.Open(p) if err != nil { return "", err } defer f.Close() buf := pool.Get().(*[]byte) defer pool.Put(buf) if _, err := io.CopyBuffer(h, f, *buf); err != nil { return "", err } } else if fi.Mode()&os.ModeSymlink == os.ModeSymlink { linkPath, err := os.Readlink(p) if err != nil { return "", err } h.Write([]byte(linkPath)) } return hex.EncodeToString(h.Sum(nil)), nil } return hasher } // CacheHasher takes into account everything the regular hasher does except for mtime func CacheHasher() func(string) (string, error) { hasher := func(p string) (string, error) { h := md5.New() fi, err := os.Lstat(p) if err != nil { return "", err } h.Write([]byte(fi.Mode().String())) h.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36))) h.Write([]byte(",")) h.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36))) if fi.Mode().IsRegular() { f, err := os.Open(p) if err != nil { return "", err } defer f.Close() if _, err := io.Copy(h, f); err != nil { return "", err } } else if fi.Mode()&os.ModeSymlink == os.ModeSymlink { linkPath, err := os.Readlink(p) if err != nil { return "", err } h.Write([]byte(linkPath)) } return hex.EncodeToString(h.Sum(nil)), nil } return hasher } // MtimeHasher returns a hash function, which only looks at mtime to determine if a file has changed. // Note that the mtime can lag, so it's possible that a file will have changed but the mtime may look the same. func MtimeHasher() func(string) (string, error) { hasher := func(p string) (string, error) { h := md5.New() fi, err := os.Lstat(p) if err != nil { return "", err } h.Write([]byte(fi.ModTime().String())) return hex.EncodeToString(h.Sum(nil)), nil } return hasher } // RedoHasher returns a hash function, which looks at mtime, size, filemode, owner uid and gid // Note that the mtime can lag, so it's possible that a file will have changed but the mtime may look the same. func RedoHasher() func(string) (string, error) { hasher := func(p string) (string, error) { h := md5.New() fi, err := os.Lstat(p) if err != nil { return "", err } logrus.Debugf("Hash components for file: %s, mode: %s, mtime: %s, size: %s, user-id: %s, group-id: %s", p, []byte(fi.Mode().String()), []byte(fi.ModTime().String()), []byte(strconv.FormatInt(fi.Size(), 16)), []byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36)), []byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36))) h.Write([]byte(fi.Mode().String())) h.Write([]byte(fi.ModTime().String())) h.Write([]byte(strconv.FormatInt(fi.Size(), 16))) h.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36))) h.Write([]byte(",")) h.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36))) return hex.EncodeToString(h.Sum(nil)), nil } return hasher } // SHA256 returns the shasum of the contents of r func SHA256(r io.Reader) (string, error) { hasher := sha256.New() _, err := io.Copy(hasher, r) if err != nil { return "", err } return hex.EncodeToString(hasher.Sum(make([]byte, 0, hasher.Size()))), nil } // GetInputFrom returns Reader content func GetInputFrom(r io.Reader) ([]byte, error) { output, err := io.ReadAll(r) if err != nil { return nil, err } return output, nil } type retryFunc func() error // Retry retries an operation func Retry(operation retryFunc, retryCount int, initialDelayMilliseconds int) error { err := operation() for i := 0; err != nil && i < retryCount; i++ { sleepDuration := time.Millisecond * time.Duration(int(math.Pow(2, float64(i)))*initialDelayMilliseconds) logrus.Warnf("Retrying operation after %s due to %v", sleepDuration, err) time.Sleep(sleepDuration) err = operation() } return err } // Retry retries an operation with a return value func RetryWithResult[T any](operation func() (T, error), retryCount int, initialDelayMilliseconds int) (result T, err error) { result, err = operation() if err == nil { return result, nil } for i := 0; i < retryCount; i++ { sleepDuration := time.Millisecond * time.Duration(int(math.Pow(2, float64(i)))*initialDelayMilliseconds) logrus.Warnf("Retrying operation after %s due to %v", sleepDuration, err) time.Sleep(sleepDuration) result, err = operation() if err == nil { return result, nil } } return result, fmt.Errorf("unable to complete operation after %d attempts, last error: %w", retryCount, err) } func Lgetxattr(path string, attr string) ([]byte, error) { // Start with a 128 length byte array dest := make([]byte, 128) sz, errno := unix.Lgetxattr(path, attr, dest) for errors.Is(errno, unix.ERANGE) { // Buffer too small, use zero-sized buffer to get the actual size sz, errno = unix.Lgetxattr(path, attr, []byte{}) if errno != nil { return nil, errno } dest = make([]byte, sz) sz, errno = unix.Lgetxattr(path, attr, dest) } switch { case errors.Is(errno, unix.ENODATA): return nil, nil case errno != nil: return nil, errno } return dest[:sz], nil } ================================================ FILE: pkg/util/util_test.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package util import ( "bufio" "bytes" "fmt" "testing" "github.com/GoogleContainerTools/kaniko/testutil" ) func TestGetInputFrom(t *testing.T) { validInput := []byte("Valid\n") validReader := bufio.NewReader(bytes.NewReader((validInput))) validValue, err := GetInputFrom(validReader) testutil.CheckErrorAndDeepEqual(t, false, err, validInput, validValue) } func makeRetryFunc(numFailures int) retryFunc { i := -1 return func() error { i++ if i < numFailures { return fmt.Errorf("Failing with i=%v", i) } return nil } } func TestRetry(t *testing.T) { // test with a function that does not return an error if err := Retry(makeRetryFunc(0), 0, 10); err != nil { t.Fatalf("Not expecting error: %v", err) } if err := Retry(makeRetryFunc(0), 3, 10); err != nil { t.Fatalf("Not expecting error: %v", err) } // test with a function that returns an error twice if err := Retry(makeRetryFunc(2), 0, 10); err == nil { t.Fatal("Expecting error", err) } if err := Retry(makeRetryFunc(2), 1, 10); err == nil { t.Fatal("Expecting error", err) } if err := Retry(makeRetryFunc(2), 2, 10); err != nil { t.Fatalf("Not expecting error: %v", err) } } func makeRetryFuncWithResult(numFailures int) func() (int, error) { i := -1 return func() (int, error) { i++ if i < numFailures { return i, fmt.Errorf("Failing with i=%v", i) } return i, nil } } func TestRetryWithResult(t *testing.T) { // test with a function that does not return an error result, err := RetryWithResult(makeRetryFuncWithResult(0), 0, 10) if err != nil || result != 0 { t.Fatalf("Got result %d and error: %v", result, err) } result, err = RetryWithResult(makeRetryFuncWithResult(0), 3, 10) if err != nil || result != 0 { t.Fatalf("Got result %d and error: %v", result, err) } // test with a function that returns an error twice result, err = RetryWithResult(makeRetryFuncWithResult(2), 0, 10) if err == nil || result != 0 { t.Fatalf("Got result %d and error: %v", result, err) } result, err = RetryWithResult(makeRetryFuncWithResult(2), 1, 10) if err == nil || result != 1 { t.Fatalf("Got result %d and error: %v", result, err) } result, err = RetryWithResult(makeRetryFuncWithResult(2), 2, 10) if err != nil || result != 2 { t.Fatalf("Got result %d and error: %v", result, err) } } ================================================ FILE: pkg/version/version.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package version // Set with LDFLAGS var version = "unset" func Version() string { return version } ================================================ FILE: run_in_docker.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -e if [ $# -lt 3 ]; then echo "Usage: run_in_docker.sh " exit 1 fi dockerfile=$1 context=$2 destination=$3 cache="false" if [[ ! -z "$4" ]]; then cache=$4 fi if [[ $destination == *"gcr"* ]]; then if [[ ! -e $HOME/.config/gcloud/application_default_credentials.json ]]; then echo "Application Default Credentials do not exist. Run [gcloud auth application-default login] to configure them" exit 1 fi docker run \ -v "$HOME"/.config/gcloud:/root/.config/gcloud \ -v "$context":/workspace \ gcr.io/kaniko-project/executor:latest \ --dockerfile "${dockerfile}" --destination "${destination}" --context dir:///workspace/ \ --cache="${cache}" else docker run \ -v "$context":/workspace \ gcr.io/kaniko-project/executor:latest \ --dockerfile "${dockerfile}" --destination "${destination}" --context dir:///workspace/ \ --cache="${cache}" fi ================================================ FILE: scripts/boxed_warm_in_docker.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Test the warmer in boxed memory conditions. # Attempt to run the warmer inside a container limited to 16MB of RAM. Use gcr.io/kaniko-project/warmer:latest image." # Example: ./boxed_warm_in_docker.sh --image debian:trixie-slim # set -e rc=0 docker run \ --memory=16m --memory-swappiness=0 \ gcr.io/kaniko-project/warmer:latest \ "$@" || rc=$? >&2 echo "RC=$rc" exit $rc ================================================ FILE: scripts/integration-test.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -e function start_local_registry { docker start registry || docker run --name registry -d -p 5000:5000 registry:2 } # TODO: to get this working, we need a way to override the gcs endpoint of kaniko at runtime # If this is done, integration test main includes flags --gcs-endpoint and --disable-gcs-auth # to mock the gcs endpoints and upload files to the fake-gcs-server function start_fake_gcs_server { docker start fake-gcs-server || docker run -d -p 4443:4443 --name fake-gcs-server fsouza/fake-gcs-server -scheme http } IMAGE_REPO="${IMAGE_REPO:-gcr.io/kaniko-test}" docker version echo "Running integration tests..." make out/executor make out/warmer FLAGS=( "--timeout=50m" ) if [[ -n $DOCKERFILE_PATTERN ]]; then FLAGS+=("--dockerfiles-pattern=$DOCKERFILE_PATTERN") fi if [[ -n $LOCAL ]]; then echo "running in local mode, mocking registry and gcs bucket..." start_local_registry IMAGE_REPO="localhost:5000/kaniko-test" GCS_BUCKET="" fi FLAGS+=( "--bucket=${GCS_BUCKET}" "--repo=${IMAGE_REPO}" ) go test ./integration/... "${FLAGS[@]}" "$@" ================================================ FILE: scripts/k3s-setup.sh ================================================ # Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -ex export INSTALL_K3S_EXEC="--write-kubeconfig-mode=0644" # Sometimes there is a residual kubeconfig, export and set this explicitly mkdir -p $HOME/.kube export K3S_KUBECONFIG_OUTPUT="$HOME/.kube/config" export KUBECONFIG="$HOME/.kube/config" curl -sfL https://get.k3s.io | sh - export SCRIPT_PATH="$(realpath $(dirname $0))" timeout 5m bash -c 'until kubectl cluster-info 2>/dev/null | grep "CoreDNS" >/dev/null; do sleep 1; done' # Install local registry and have it listen on localhost:5000 sudo cp $SCRIPT_PATH/local-registry-helm.yaml /var/lib/rancher/k3s/server/manifests/ # Wait until install of the registry completes timeout 5m bash -c 'until kubectl get -n kube-system pod 2>/dev/null | grep local-registry | grep Completed >/dev/null; do sleep 1; done' # Wait until registry becomes available on localhost:5000 timeout 5m bash -c 'until nc -z localhost 5000; do sleep 1; done' echo "K3s is running and registry is available on localhost:5000" ================================================ FILE: scripts/local-registry-helm.yaml ================================================ apiVersion: helm.cattle.io/v1 kind: HelmChart metadata: name: local-registry namespace: kube-system spec: chart: https://github.com/twuni/docker-registry.helm/archive/refs/tags/v2.2.2.tar.gz set: # Expose the registry server on localhost service.type: "LoadBalancer" ================================================ FILE: scripts/misc-integration-test.sh ================================================ #!/bin/bash # Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # This script runs all integration tests except for # TestRun and TestLayers set -e TESTS=$(./scripts/integration-test.sh -list=Test -mod=vendor) TESTS=$(echo $TESTS | tr ' ' '\n' | grep 'Test'| grep -v 'TestRun' | grep -v 'TestLayers' | grep -v 'TestK8s' | grep -v 'TestSnapshotBenchmark') RUN_ARG='' count=0 for i in $TESTS; do if [ "$count" -gt "0" ]; then RUN_ARG="$RUN_ARG|$i" else RUN_ARG="$RUN_ARG$i" fi count=$((count+1)) done echo $RUN_ARG ================================================ FILE: scripts/test.sh ================================================ #!/bin/bash # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #set -e RED='\033[0;31m' GREEN='\033[0;32m' RESET='\033[0m' echo "Running go tests..." go test -cover -coverprofile=out/coverage.out -v -timeout 120s `go list ./... | grep -v vendor | grep -v integration` | sed ''/PASS/s//$(printf "${GREEN}PASS${RESET}")/'' | sed ''/FAIL/s//$(printf "${RED}FAIL${RESET}")/'' GO_TEST_EXIT_CODE=${PIPESTATUS[0]} if [[ $GO_TEST_EXIT_CODE -ne 0 ]]; then exit $GO_TEST_EXIT_CODE fi echo "Running validation scripts..." scripts=( "$DIR/../hack/boilerplate.sh" "$DIR/../hack/gofmt.sh" ) fail=0 for s in "${scripts[@]}" do echo "RUN ${s}" if "${s}"; then echo -e "${GREEN}PASSED${RESET} ${s}" else echo -e "${RED}FAILED${RESET} ${s}" fail=1 fi done exit $fail ================================================ FILE: testutil/constants.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package testutil const ( // Dockerfile is used for unit testing Dockerfile = ` FROM scratch RUN echo hi > /hi FROM scratch AS second COPY --from=0 /hi /hi2 FROM second RUN xxx FROM scratch COPY --from=second /hi2 /hi3 FROM ubuntu:16.04 AS base ENV DEBIAN_FRONTEND noninteractive ENV LC_ALL C.UTF-8 FROM base AS development ENV PS1 " 🐳 \[\033[1;36m\]\W\[\033[0;35m\] # \[\033[0m\]" FROM development AS test ENV ORG_ENV UnitTest FROM base AS production COPY . /code ` ) ================================================ FILE: testutil/util.go ================================================ /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package testutil import ( "fmt" "os" "os/user" "path/filepath" "reflect" "testing" "github.com/google/go-cmp/cmp" ) // SetupFiles creates files at path func SetupFiles(path string, files map[string]string) error { for p, c := range files { path := filepath.Join(path, p) if err := os.MkdirAll(filepath.Dir(path), 0750); err != nil { return err } if err := os.WriteFile(path, []byte(c), 0644); err != nil { return err } } return nil } type CurrentUser struct { *user.User PrimaryGroup string } func GetCurrentUser(t *testing.T) CurrentUser { currentUser, err := user.Current() if err != nil { t.Fatalf("Cannot get current user: %s", err) } groups, err := currentUser.GroupIds() if err != nil || len(groups) == 0 { t.Fatalf("Cannot get groups for current user: %s", err) } primaryGroupObj, err := user.LookupGroupId(groups[0]) if err != nil { t.Fatalf("Could not lookup name of group %s: %s", groups[0], err) } primaryGroup := primaryGroupObj.Name return CurrentUser{ User: currentUser, PrimaryGroup: primaryGroup, } } func CheckDeepEqual(t *testing.T, expected, actual interface{}) { t.Helper() if diff := cmp.Diff(actual, expected); diff != "" { t.Errorf("%T differ (-got, +want): %s", expected, diff) return } } func CheckErrorAndDeepEqual(t *testing.T, shouldErr bool, err error, expected, actual interface{}) { t.Helper() if err := checkErr(shouldErr, err); err != nil { t.Error(err) return } if !reflect.DeepEqual(expected, actual) { diff := cmp.Diff(actual, expected) t.Errorf("%T differ (-got, +want): %s", expected, diff) return } } func CheckError(t *testing.T, shouldErr bool, err error) { if err := checkErr(shouldErr, err); err != nil { t.Error(err) } } func CheckNoError(t *testing.T, err error) { if err != nil { t.Errorf("%+v", err) } } func checkErr(shouldErr bool, err error) error { if err == nil && shouldErr { return fmt.Errorf("Expected error, but returned none") } if err != nil && !shouldErr { return fmt.Errorf("Unexpected error: %w", err) } return nil } ================================================ FILE: tools/tools.go ================================================ //go:build tools // +build tools /* Copyright 2018 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package tools // dependencies https://github.com/golang/go/issues/48332 // These are placeholder imports the make go mod include these tools in its dependency graph. import ( _ "github.com/GoogleCloudPlatform/docker-credential-gcr/v2" _ "github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login" _ "github.com/chrismellard/docker-credential-acr-env" ) ================================================ FILE: vendor/cel.dev/expr/.bazelversion ================================================ 7.3.2 # Keep this pinned version in parity with cel-go ================================================ FILE: vendor/cel.dev/expr/.gitattributes ================================================ *.pb.go linguist-generated=true *.pb.go -diff -merge ================================================ FILE: vendor/cel.dev/expr/.gitignore ================================================ bazel-* MODULE.bazel.lock ================================================ FILE: vendor/cel.dev/expr/CODE_OF_CONDUCT.md ================================================ # Contributor Code of Conduct ## Version 0.1.1 (adapted from 0.3b-angular) As contributors and maintainers of the Common Expression Language (CEL) project, we pledge to respect everyone who contributes by posting issues, updating documentation, submitting pull requests, providing feedback in comments, and any other activities. Communication through any of CEL's channels (GitHub, Gitter, IRC, mailing lists, Google+, Twitter, etc.) must be constructive and never resort to personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. We promise to extend courtesy and respect to everyone involved in this project regardless of gender, gender identity, sexual orientation, disability, age, race, ethnicity, religion, or level of experience. We expect anyone contributing to the project to do the same. If any member of the community violates this code of conduct, the maintainers of the CEL project may take action, removing issues, comments, and PRs or blocking accounts as deemed appropriate. If you are subject to or witness unacceptable behavior, or have any other concerns, please email us at [cel-conduct@google.com](mailto:cel-conduct@google.com). ================================================ FILE: vendor/cel.dev/expr/CONTRIBUTING.md ================================================ # How to Contribute We'd love to accept your patches and contributions to this project. There are a few guidelines you need to follow. ## Contributor License Agreement Contributions to this project must be accompanied by a Contributor License Agreement. You (or your employer) retain the copyright to your contribution, this simply gives us permission to use and redistribute your contributions as part of the project. Head over to to see your current agreements on file or to sign a new one. You generally only need to submit a CLA once, so if you've already submitted one (even if it was for a different project), you probably don't need to do it again. ## Code reviews All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. ## What to expect from maintainers Expect maintainers to respond to new issues or pull requests within a week. For outstanding and ongoing issues and particularly for long-running pull requests, expect the maintainers to review within a week of a contributor asking for a new review. There is no commitment to resolution -- merging or closing a pull request, or fixing or closing an issue -- because some issues will require more discussion than others. ================================================ FILE: vendor/cel.dev/expr/GOVERNANCE.md ================================================ # Project Governance This document defines the governance process for the CEL language. CEL is Google-developed, but openly governed. Major contributors to the CEL specification and its corresponding implementations constitute the CEL Language Council. New members may be added by a unanimous vote of the Council. The MAINTAINERS.md file lists the members of the CEL Language Council, and unofficially indicates the "areas of expertise" of each member with respect to the publicly available CEL repos. ## Code Changes Code changes must follow the standard pull request (PR) model documented in the CONTRIBUTING.md for each CEL repo. All fixes and features must be reviewed by a maintainer. The maintainer reserves the right to request that any feature request (FR) or PR be reviewed by the language council. ## Syntax and Semantic Changes Syntactic and semantic changes must be reviewed by the CEL Language Council. Maintainers may also request language council review at their discretion. The review process is as follows: - Create a Feature Request in the CEL-Spec repo. The feature description will serve as an abstract for the detailed design document. - Co-develop a design document with the Language Council. - Once the proposer gives the design document approval, the document will be linked to the FR in the CEL-Spec repo and opened for comments to members of the cel-lang-discuss@googlegroups.com. - The Language Council will review the design doc at the next council meeting (once every three weeks) and the council decision included in the document. If the proposal is approved, the spec will be updated by a maintainer (if applicable) and a rationale will be included in the CEL-Spec wiki to ensure future developers may follow CEL's growth and direction over time. Approved proposals may be implemented by the proposer or by the maintainers as the parties see fit. At the discretion of the maintainer, changes from the approved design are permitted during implementation if they improve the user experience and clarity of the feature. ================================================ FILE: vendor/cel.dev/expr/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/cel.dev/expr/MAINTAINERS.md ================================================ # CEL Language Council | Name | Company | Area of Expertise | |-----------------|--------------|-------------------| | Alfred Fuller | Facebook | cel-cpp, cel-spec | | Jim Larson | Google | cel-go, cel-spec | | Matthais Blume | Google | cel-spec | | Tristan Swadell | Google | cel-go, cel-spec | ## Emeritus * Sanjay Ghemawat (Google) * Wolfgang Grieskamp (Facebook) ================================================ FILE: vendor/cel.dev/expr/MODULE.bazel ================================================ module( name = "cel-spec", ) bazel_dep( name = "bazel_skylib", version = "1.7.1", ) bazel_dep( name = "gazelle", version = "0.39.1", repo_name = "bazel_gazelle", ) bazel_dep( name = "googleapis", version = "0.0.0-20241220-5e258e33.bcr.1", repo_name = "com_google_googleapis", ) bazel_dep( name = "googleapis-cc", version = "1.0.0", ) bazel_dep( name = "googleapis-java", version = "1.0.0", ) bazel_dep( name = "googleapis-go", version = "1.0.0", ) bazel_dep( name = "protobuf", version = "27.0", repo_name = "com_google_protobuf", ) bazel_dep( name = "rules_cc", version = "0.0.17", ) bazel_dep( name = "rules_go", version = "0.53.0", repo_name = "io_bazel_rules_go", ) bazel_dep( name = "rules_java", version = "7.6.5", ) bazel_dep( name = "rules_proto", version = "7.0.2", ) bazel_dep( name = "rules_python", version = "0.35.0", ) ### PYTHON ### python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain( ignore_root_user_error = True, python_version = "3.11", ) go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk") go_sdk.download(version = "1.22.0") go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//:go.mod") use_repo( go_deps, "org_golang_google_genproto_googleapis_rpc", "org_golang_google_protobuf", ) ================================================ FILE: vendor/cel.dev/expr/README.md ================================================ # Common Expression Language The Common Expression Language (CEL) implements common semantics for expression evaluation, enabling different applications to more easily interoperate. Key Applications * Security policy: organizations have complex infrastructure and need common tooling to reason about the system as a whole * Protocols: expressions are a useful data type and require interoperability across programming languages and platforms. Guiding philosophy: 1. Keep it small & fast. * CEL evaluates in linear time, is mutation free, and not Turing-complete. This limitation is a feature of the language design, which allows the implementation to evaluate orders of magnitude faster than equivalently sandboxed JavaScript. 2. Make it extensible. * CEL is designed to be embedded in applications, and allows for extensibility via its context which allows for functions and data to be provided by the software that embeds it. 3. Developer-friendly. * The language is approachable to developers. The initial spec was based on the experience of developing Firebase Rules and usability testing many prior iterations. * The library itself and accompanying toolings should be easy to adopt by teams that seek to integrate CEL into their platforms. The required components of a system that supports CEL are: * The textual representation of an expression as written by a developer. It is of similar syntax to expressions in C/C++/Java/JavaScript * A representation of the program's abstract syntax tree (AST). * A compiler library that converts the textual representation to the binary representation. This can be done ahead of time (in the control plane) or just before evaluation (in the data plane). * A context containing one or more typed variables, often protobuf messages. Most use-cases will use `attribute_context.proto` * An evaluator library that takes the binary format in the context and produces a result, usually a Boolean. For use cases which require persistence or cross-process communcation, it is highly recommended to serialize the type-checked expression as a protocol buffer. The CEL team will maintains canonical protocol buffers for ASTs and will keep these versions identical and wire-compatible in perpetuity: * [CEL canonical](https://github.com/google/cel-spec/tree/master/proto/cel/expr) * [CEL v1alpha1](https://github.com/googleapis/googleapis/tree/master/google/api/expr/v1alpha1) Example of boolean conditions and object construction: ``` c // Condition account.balance >= transaction.withdrawal || (account.overdraftProtection && account.overdraftLimit >= transaction.withdrawal - account.balance) // Object construction common.GeoPoint{ latitude: 10.0, longitude: -5.5 } ``` For more detail, see: * [Introduction](doc/intro.md) * [Language Definition](doc/langdef.md) Released under the [Apache License](LICENSE). ================================================ FILE: vendor/cel.dev/expr/WORKSPACE ================================================ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "io_bazel_rules_go", sha256 = "099a9fb96a376ccbbb7d291ed4ecbdfd42f6bc822ab77ae6f1b5cb9e914e94fa", urls = [ "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.35.0/rules_go-v0.35.0.zip", "https://github.com/bazelbuild/rules_go/releases/download/v0.35.0/rules_go-v0.35.0.zip", ], ) http_archive( name = "bazel_gazelle", sha256 = "ecba0f04f96b4960a5b250c8e8eeec42281035970aa8852dda73098274d14a1d", urls = [ "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz", "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz", ], ) http_archive( name = "rules_proto", sha256 = "e017528fd1c91c5a33f15493e3a398181a9e821a804eb7ff5acdd1d2d6c2b18d", strip_prefix = "rules_proto-4.0.0-3.20.0", urls = [ "https://github.com/bazelbuild/rules_proto/archive/refs/tags/4.0.0-3.20.0.tar.gz", ], ) # googleapis as of 09/16/2024 http_archive( name = "com_google_googleapis", strip_prefix = "googleapis-4082d5e51e8481f6ccc384cacd896f4e78f19dee", sha256 = "57319889d47578b3c89bf1b3f34888d796a8913d63b32d750a4cd12ed303c4e8", urls = [ "https://github.com/googleapis/googleapis/archive/4082d5e51e8481f6ccc384cacd896f4e78f19dee.tar.gz", ], ) # protobuf http_archive( name = "com_google_protobuf", sha256 = "8242327e5df8c80ba49e4165250b8f79a76bd11765facefaaecfca7747dc8da2", strip_prefix = "protobuf-3.21.5", urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.21.5.zip"], ) # googletest http_archive( name = "com_google_googletest", urls = ["https://github.com/google/googletest/archive/master.zip"], strip_prefix = "googletest-master", ) # gflags http_archive( name = "com_github_gflags_gflags", sha256 = "6e16c8bc91b1310a44f3965e616383dbda48f83e8c1eaa2370a215057b00cabe", strip_prefix = "gflags-77592648e3f3be87d6c7123eb81cbad75f9aef5a", urls = [ "https://mirror.bazel.build/github.com/gflags/gflags/archive/77592648e3f3be87d6c7123eb81cbad75f9aef5a.tar.gz", "https://github.com/gflags/gflags/archive/77592648e3f3be87d6c7123eb81cbad75f9aef5a.tar.gz", ], ) # glog http_archive( name = "com_google_glog", sha256 = "1ee310e5d0a19b9d584a855000434bb724aa744745d5b8ab1855c85bff8a8e21", strip_prefix = "glog-028d37889a1e80e8a07da1b8945ac706259e5fd8", urls = [ "https://mirror.bazel.build/github.com/google/glog/archive/028d37889a1e80e8a07da1b8945ac706259e5fd8.tar.gz", "https://github.com/google/glog/archive/028d37889a1e80e8a07da1b8945ac706259e5fd8.tar.gz", ], ) # absl http_archive( name = "com_google_absl", strip_prefix = "abseil-cpp-master", urls = ["https://github.com/abseil/abseil-cpp/archive/master.zip"], ) load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains") load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") load("@com_google_googleapis//:repository_rules.bzl", "switched_rules_by_language") load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") switched_rules_by_language( name = "com_google_googleapis_imports", cc = True, ) # Do *not* call *_dependencies(), etc, yet. See comment at the end. # Generated Google APIs protos for Golang # Generated Google APIs protos for Golang 08/26/2024 go_repository( name = "org_golang_google_genproto_googleapis_api", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto/googleapis/api", sum = "h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=", version = "v0.0.0-20240826202546-f6391c0de4c7", ) # Generated Google APIs protos for Golang 08/26/2024 go_repository( name = "org_golang_google_genproto_googleapis_rpc", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto/googleapis/rpc", sum = "h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=", version = "v0.0.0-20240826202546-f6391c0de4c7", ) # gRPC deps go_repository( name = "org_golang_google_grpc", build_file_proto_mode = "disable_global", importpath = "google.golang.org/grpc", tag = "v1.49.0", ) go_repository( name = "org_golang_x_net", importpath = "golang.org/x/net", sum = "h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=", version = "v0.0.0-20190311183353-d8887717615a", ) go_repository( name = "org_golang_x_text", importpath = "golang.org/x/text", sum = "h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=", version = "v0.3.2", ) # Run the dependencies at the end. These will silently try to import some # of the above repositories but at different versions, so ours must come first. go_rules_dependencies() go_register_toolchains(version = "1.19.1") gazelle_dependencies() rules_proto_dependencies() rules_proto_toolchains() protobuf_deps() ================================================ FILE: vendor/cel.dev/expr/WORKSPACE.bzlmod ================================================ ================================================ FILE: vendor/cel.dev/expr/checked.pb.go ================================================ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 // protoc v3.21.5 // source: cel/expr/checked.proto package expr import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) type Type_PrimitiveType int32 const ( Type_PRIMITIVE_TYPE_UNSPECIFIED Type_PrimitiveType = 0 Type_BOOL Type_PrimitiveType = 1 Type_INT64 Type_PrimitiveType = 2 Type_UINT64 Type_PrimitiveType = 3 Type_DOUBLE Type_PrimitiveType = 4 Type_STRING Type_PrimitiveType = 5 Type_BYTES Type_PrimitiveType = 6 ) // Enum value maps for Type_PrimitiveType. var ( Type_PrimitiveType_name = map[int32]string{ 0: "PRIMITIVE_TYPE_UNSPECIFIED", 1: "BOOL", 2: "INT64", 3: "UINT64", 4: "DOUBLE", 5: "STRING", 6: "BYTES", } Type_PrimitiveType_value = map[string]int32{ "PRIMITIVE_TYPE_UNSPECIFIED": 0, "BOOL": 1, "INT64": 2, "UINT64": 3, "DOUBLE": 4, "STRING": 5, "BYTES": 6, } ) func (x Type_PrimitiveType) Enum() *Type_PrimitiveType { p := new(Type_PrimitiveType) *p = x return p } func (x Type_PrimitiveType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Type_PrimitiveType) Descriptor() protoreflect.EnumDescriptor { return file_cel_expr_checked_proto_enumTypes[0].Descriptor() } func (Type_PrimitiveType) Type() protoreflect.EnumType { return &file_cel_expr_checked_proto_enumTypes[0] } func (x Type_PrimitiveType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Type_PrimitiveType.Descriptor instead. func (Type_PrimitiveType) EnumDescriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 0} } type Type_WellKnownType int32 const ( Type_WELL_KNOWN_TYPE_UNSPECIFIED Type_WellKnownType = 0 Type_ANY Type_WellKnownType = 1 Type_TIMESTAMP Type_WellKnownType = 2 Type_DURATION Type_WellKnownType = 3 ) // Enum value maps for Type_WellKnownType. var ( Type_WellKnownType_name = map[int32]string{ 0: "WELL_KNOWN_TYPE_UNSPECIFIED", 1: "ANY", 2: "TIMESTAMP", 3: "DURATION", } Type_WellKnownType_value = map[string]int32{ "WELL_KNOWN_TYPE_UNSPECIFIED": 0, "ANY": 1, "TIMESTAMP": 2, "DURATION": 3, } ) func (x Type_WellKnownType) Enum() *Type_WellKnownType { p := new(Type_WellKnownType) *p = x return p } func (x Type_WellKnownType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Type_WellKnownType) Descriptor() protoreflect.EnumDescriptor { return file_cel_expr_checked_proto_enumTypes[1].Descriptor() } func (Type_WellKnownType) Type() protoreflect.EnumType { return &file_cel_expr_checked_proto_enumTypes[1] } func (x Type_WellKnownType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Type_WellKnownType.Descriptor instead. func (Type_WellKnownType) EnumDescriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 1} } type CheckedExpr struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields ReferenceMap map[int64]*Reference `protobuf:"bytes,2,rep,name=reference_map,json=referenceMap,proto3" json:"reference_map,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` TypeMap map[int64]*Type `protobuf:"bytes,3,rep,name=type_map,json=typeMap,proto3" json:"type_map,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` SourceInfo *SourceInfo `protobuf:"bytes,5,opt,name=source_info,json=sourceInfo,proto3" json:"source_info,omitempty"` ExprVersion string `protobuf:"bytes,6,opt,name=expr_version,json=exprVersion,proto3" json:"expr_version,omitempty"` Expr *Expr `protobuf:"bytes,4,opt,name=expr,proto3" json:"expr,omitempty"` } func (x *CheckedExpr) Reset() { *x = CheckedExpr{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *CheckedExpr) String() string { return protoimpl.X.MessageStringOf(x) } func (*CheckedExpr) ProtoMessage() {} func (x *CheckedExpr) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CheckedExpr.ProtoReflect.Descriptor instead. func (*CheckedExpr) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{0} } func (x *CheckedExpr) GetReferenceMap() map[int64]*Reference { if x != nil { return x.ReferenceMap } return nil } func (x *CheckedExpr) GetTypeMap() map[int64]*Type { if x != nil { return x.TypeMap } return nil } func (x *CheckedExpr) GetSourceInfo() *SourceInfo { if x != nil { return x.SourceInfo } return nil } func (x *CheckedExpr) GetExprVersion() string { if x != nil { return x.ExprVersion } return "" } func (x *CheckedExpr) GetExpr() *Expr { if x != nil { return x.Expr } return nil } type Type struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to TypeKind: // // *Type_Dyn // *Type_Null // *Type_Primitive // *Type_Wrapper // *Type_WellKnown // *Type_ListType_ // *Type_MapType_ // *Type_Function // *Type_MessageType // *Type_TypeParam // *Type_Type // *Type_Error // *Type_AbstractType_ TypeKind isType_TypeKind `protobuf_oneof:"type_kind"` } func (x *Type) Reset() { *x = Type{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Type) String() string { return protoimpl.X.MessageStringOf(x) } func (*Type) ProtoMessage() {} func (x *Type) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Type.ProtoReflect.Descriptor instead. func (*Type) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{1} } func (m *Type) GetTypeKind() isType_TypeKind { if m != nil { return m.TypeKind } return nil } func (x *Type) GetDyn() *emptypb.Empty { if x, ok := x.GetTypeKind().(*Type_Dyn); ok { return x.Dyn } return nil } func (x *Type) GetNull() structpb.NullValue { if x, ok := x.GetTypeKind().(*Type_Null); ok { return x.Null } return structpb.NullValue(0) } func (x *Type) GetPrimitive() Type_PrimitiveType { if x, ok := x.GetTypeKind().(*Type_Primitive); ok { return x.Primitive } return Type_PRIMITIVE_TYPE_UNSPECIFIED } func (x *Type) GetWrapper() Type_PrimitiveType { if x, ok := x.GetTypeKind().(*Type_Wrapper); ok { return x.Wrapper } return Type_PRIMITIVE_TYPE_UNSPECIFIED } func (x *Type) GetWellKnown() Type_WellKnownType { if x, ok := x.GetTypeKind().(*Type_WellKnown); ok { return x.WellKnown } return Type_WELL_KNOWN_TYPE_UNSPECIFIED } func (x *Type) GetListType() *Type_ListType { if x, ok := x.GetTypeKind().(*Type_ListType_); ok { return x.ListType } return nil } func (x *Type) GetMapType() *Type_MapType { if x, ok := x.GetTypeKind().(*Type_MapType_); ok { return x.MapType } return nil } func (x *Type) GetFunction() *Type_FunctionType { if x, ok := x.GetTypeKind().(*Type_Function); ok { return x.Function } return nil } func (x *Type) GetMessageType() string { if x, ok := x.GetTypeKind().(*Type_MessageType); ok { return x.MessageType } return "" } func (x *Type) GetTypeParam() string { if x, ok := x.GetTypeKind().(*Type_TypeParam); ok { return x.TypeParam } return "" } func (x *Type) GetType() *Type { if x, ok := x.GetTypeKind().(*Type_Type); ok { return x.Type } return nil } func (x *Type) GetError() *emptypb.Empty { if x, ok := x.GetTypeKind().(*Type_Error); ok { return x.Error } return nil } func (x *Type) GetAbstractType() *Type_AbstractType { if x, ok := x.GetTypeKind().(*Type_AbstractType_); ok { return x.AbstractType } return nil } type isType_TypeKind interface { isType_TypeKind() } type Type_Dyn struct { Dyn *emptypb.Empty `protobuf:"bytes,1,opt,name=dyn,proto3,oneof"` } type Type_Null struct { Null structpb.NullValue `protobuf:"varint,2,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"` } type Type_Primitive struct { Primitive Type_PrimitiveType `protobuf:"varint,3,opt,name=primitive,proto3,enum=cel.expr.Type_PrimitiveType,oneof"` } type Type_Wrapper struct { Wrapper Type_PrimitiveType `protobuf:"varint,4,opt,name=wrapper,proto3,enum=cel.expr.Type_PrimitiveType,oneof"` } type Type_WellKnown struct { WellKnown Type_WellKnownType `protobuf:"varint,5,opt,name=well_known,json=wellKnown,proto3,enum=cel.expr.Type_WellKnownType,oneof"` } type Type_ListType_ struct { ListType *Type_ListType `protobuf:"bytes,6,opt,name=list_type,json=listType,proto3,oneof"` } type Type_MapType_ struct { MapType *Type_MapType `protobuf:"bytes,7,opt,name=map_type,json=mapType,proto3,oneof"` } type Type_Function struct { Function *Type_FunctionType `protobuf:"bytes,8,opt,name=function,proto3,oneof"` } type Type_MessageType struct { MessageType string `protobuf:"bytes,9,opt,name=message_type,json=messageType,proto3,oneof"` } type Type_TypeParam struct { TypeParam string `protobuf:"bytes,10,opt,name=type_param,json=typeParam,proto3,oneof"` } type Type_Type struct { Type *Type `protobuf:"bytes,11,opt,name=type,proto3,oneof"` } type Type_Error struct { Error *emptypb.Empty `protobuf:"bytes,12,opt,name=error,proto3,oneof"` } type Type_AbstractType_ struct { AbstractType *Type_AbstractType `protobuf:"bytes,14,opt,name=abstract_type,json=abstractType,proto3,oneof"` } func (*Type_Dyn) isType_TypeKind() {} func (*Type_Null) isType_TypeKind() {} func (*Type_Primitive) isType_TypeKind() {} func (*Type_Wrapper) isType_TypeKind() {} func (*Type_WellKnown) isType_TypeKind() {} func (*Type_ListType_) isType_TypeKind() {} func (*Type_MapType_) isType_TypeKind() {} func (*Type_Function) isType_TypeKind() {} func (*Type_MessageType) isType_TypeKind() {} func (*Type_TypeParam) isType_TypeKind() {} func (*Type_Type) isType_TypeKind() {} func (*Type_Error) isType_TypeKind() {} func (*Type_AbstractType_) isType_TypeKind() {} type Decl struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Types that are assignable to DeclKind: // // *Decl_Ident // *Decl_Function DeclKind isDecl_DeclKind `protobuf_oneof:"decl_kind"` } func (x *Decl) Reset() { *x = Decl{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Decl) String() string { return protoimpl.X.MessageStringOf(x) } func (*Decl) ProtoMessage() {} func (x *Decl) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Decl.ProtoReflect.Descriptor instead. func (*Decl) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{2} } func (x *Decl) GetName() string { if x != nil { return x.Name } return "" } func (m *Decl) GetDeclKind() isDecl_DeclKind { if m != nil { return m.DeclKind } return nil } func (x *Decl) GetIdent() *Decl_IdentDecl { if x, ok := x.GetDeclKind().(*Decl_Ident); ok { return x.Ident } return nil } func (x *Decl) GetFunction() *Decl_FunctionDecl { if x, ok := x.GetDeclKind().(*Decl_Function); ok { return x.Function } return nil } type isDecl_DeclKind interface { isDecl_DeclKind() } type Decl_Ident struct { Ident *Decl_IdentDecl `protobuf:"bytes,2,opt,name=ident,proto3,oneof"` } type Decl_Function struct { Function *Decl_FunctionDecl `protobuf:"bytes,3,opt,name=function,proto3,oneof"` } func (*Decl_Ident) isDecl_DeclKind() {} func (*Decl_Function) isDecl_DeclKind() {} type Reference struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` OverloadId []string `protobuf:"bytes,3,rep,name=overload_id,json=overloadId,proto3" json:"overload_id,omitempty"` Value *Constant `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` } func (x *Reference) Reset() { *x = Reference{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Reference) String() string { return protoimpl.X.MessageStringOf(x) } func (*Reference) ProtoMessage() {} func (x *Reference) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Reference.ProtoReflect.Descriptor instead. func (*Reference) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{3} } func (x *Reference) GetName() string { if x != nil { return x.Name } return "" } func (x *Reference) GetOverloadId() []string { if x != nil { return x.OverloadId } return nil } func (x *Reference) GetValue() *Constant { if x != nil { return x.Value } return nil } type Type_ListType struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields ElemType *Type `protobuf:"bytes,1,opt,name=elem_type,json=elemType,proto3" json:"elem_type,omitempty"` } func (x *Type_ListType) Reset() { *x = Type_ListType{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Type_ListType) String() string { return protoimpl.X.MessageStringOf(x) } func (*Type_ListType) ProtoMessage() {} func (x *Type_ListType) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Type_ListType.ProtoReflect.Descriptor instead. func (*Type_ListType) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 0} } func (x *Type_ListType) GetElemType() *Type { if x != nil { return x.ElemType } return nil } type Type_MapType struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields KeyType *Type `protobuf:"bytes,1,opt,name=key_type,json=keyType,proto3" json:"key_type,omitempty"` ValueType *Type `protobuf:"bytes,2,opt,name=value_type,json=valueType,proto3" json:"value_type,omitempty"` } func (x *Type_MapType) Reset() { *x = Type_MapType{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Type_MapType) String() string { return protoimpl.X.MessageStringOf(x) } func (*Type_MapType) ProtoMessage() {} func (x *Type_MapType) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Type_MapType.ProtoReflect.Descriptor instead. func (*Type_MapType) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 1} } func (x *Type_MapType) GetKeyType() *Type { if x != nil { return x.KeyType } return nil } func (x *Type_MapType) GetValueType() *Type { if x != nil { return x.ValueType } return nil } type Type_FunctionType struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields ResultType *Type `protobuf:"bytes,1,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"` ArgTypes []*Type `protobuf:"bytes,2,rep,name=arg_types,json=argTypes,proto3" json:"arg_types,omitempty"` } func (x *Type_FunctionType) Reset() { *x = Type_FunctionType{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Type_FunctionType) String() string { return protoimpl.X.MessageStringOf(x) } func (*Type_FunctionType) ProtoMessage() {} func (x *Type_FunctionType) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Type_FunctionType.ProtoReflect.Descriptor instead. func (*Type_FunctionType) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 2} } func (x *Type_FunctionType) GetResultType() *Type { if x != nil { return x.ResultType } return nil } func (x *Type_FunctionType) GetArgTypes() []*Type { if x != nil { return x.ArgTypes } return nil } type Type_AbstractType struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` ParameterTypes []*Type `protobuf:"bytes,2,rep,name=parameter_types,json=parameterTypes,proto3" json:"parameter_types,omitempty"` } func (x *Type_AbstractType) Reset() { *x = Type_AbstractType{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Type_AbstractType) String() string { return protoimpl.X.MessageStringOf(x) } func (*Type_AbstractType) ProtoMessage() {} func (x *Type_AbstractType) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Type_AbstractType.ProtoReflect.Descriptor instead. func (*Type_AbstractType) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 3} } func (x *Type_AbstractType) GetName() string { if x != nil { return x.Name } return "" } func (x *Type_AbstractType) GetParameterTypes() []*Type { if x != nil { return x.ParameterTypes } return nil } type Decl_IdentDecl struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Type *Type `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` Value *Constant `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` Doc string `protobuf:"bytes,3,opt,name=doc,proto3" json:"doc,omitempty"` } func (x *Decl_IdentDecl) Reset() { *x = Decl_IdentDecl{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Decl_IdentDecl) String() string { return protoimpl.X.MessageStringOf(x) } func (*Decl_IdentDecl) ProtoMessage() {} func (x *Decl_IdentDecl) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Decl_IdentDecl.ProtoReflect.Descriptor instead. func (*Decl_IdentDecl) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 0} } func (x *Decl_IdentDecl) GetType() *Type { if x != nil { return x.Type } return nil } func (x *Decl_IdentDecl) GetValue() *Constant { if x != nil { return x.Value } return nil } func (x *Decl_IdentDecl) GetDoc() string { if x != nil { return x.Doc } return "" } type Decl_FunctionDecl struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Overloads []*Decl_FunctionDecl_Overload `protobuf:"bytes,1,rep,name=overloads,proto3" json:"overloads,omitempty"` } func (x *Decl_FunctionDecl) Reset() { *x = Decl_FunctionDecl{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Decl_FunctionDecl) String() string { return protoimpl.X.MessageStringOf(x) } func (*Decl_FunctionDecl) ProtoMessage() {} func (x *Decl_FunctionDecl) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Decl_FunctionDecl.ProtoReflect.Descriptor instead. func (*Decl_FunctionDecl) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 1} } func (x *Decl_FunctionDecl) GetOverloads() []*Decl_FunctionDecl_Overload { if x != nil { return x.Overloads } return nil } type Decl_FunctionDecl_Overload struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields OverloadId string `protobuf:"bytes,1,opt,name=overload_id,json=overloadId,proto3" json:"overload_id,omitempty"` Params []*Type `protobuf:"bytes,2,rep,name=params,proto3" json:"params,omitempty"` TypeParams []string `protobuf:"bytes,3,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"` ResultType *Type `protobuf:"bytes,4,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"` IsInstanceFunction bool `protobuf:"varint,5,opt,name=is_instance_function,json=isInstanceFunction,proto3" json:"is_instance_function,omitempty"` Doc string `protobuf:"bytes,6,opt,name=doc,proto3" json:"doc,omitempty"` } func (x *Decl_FunctionDecl_Overload) Reset() { *x = Decl_FunctionDecl_Overload{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_checked_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Decl_FunctionDecl_Overload) String() string { return protoimpl.X.MessageStringOf(x) } func (*Decl_FunctionDecl_Overload) ProtoMessage() {} func (x *Decl_FunctionDecl_Overload) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_checked_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Decl_FunctionDecl_Overload.ProtoReflect.Descriptor instead. func (*Decl_FunctionDecl_Overload) Descriptor() ([]byte, []int) { return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 1, 0} } func (x *Decl_FunctionDecl_Overload) GetOverloadId() string { if x != nil { return x.OverloadId } return "" } func (x *Decl_FunctionDecl_Overload) GetParams() []*Type { if x != nil { return x.Params } return nil } func (x *Decl_FunctionDecl_Overload) GetTypeParams() []string { if x != nil { return x.TypeParams } return nil } func (x *Decl_FunctionDecl_Overload) GetResultType() *Type { if x != nil { return x.ResultType } return nil } func (x *Decl_FunctionDecl_Overload) GetIsInstanceFunction() bool { if x != nil { return x.IsInstanceFunction } return false } func (x *Decl_FunctionDecl_Overload) GetDoc() string { if x != nil { return x.Doc } return "" } var File_cel_expr_checked_proto protoreflect.FileDescriptor var file_cel_expr_checked_proto_rawDesc = []byte{ 0x0a, 0x16, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x1a, 0x15, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xba, 0x03, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x12, 0x4c, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x3d, 0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x79, 0x70, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x35, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x1a, 0x54, 0x0a, 0x11, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4a, 0x0a, 0x0c, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe6, 0x09, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x64, 0x79, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x03, 0x64, 0x79, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0a, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x77, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x74, 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x24, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x37, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x63, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x61, 0x72, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x5b, 0x0a, 0x0c, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x73, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x06, 0x22, 0x56, 0x0a, 0x0d, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x45, 0x4c, 0x4c, 0x5f, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x42, 0x0b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xc2, 0x04, 0x0a, 0x04, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x48, 0x00, 0x52, 0x05, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x48, 0x00, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x6b, 0x0a, 0x09, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x22, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6f, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x6f, 0x63, 0x1a, 0xbe, 0x02, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x42, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x1a, 0xe9, 0x01, 0x0a, 0x08, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6f, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x6f, 0x63, 0x42, 0x0b, 0x0a, 0x09, 0x64, 0x65, 0x63, 0x6c, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x6a, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2c, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x09, 0x44, 0x65, 0x63, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_cel_expr_checked_proto_rawDescOnce sync.Once file_cel_expr_checked_proto_rawDescData = file_cel_expr_checked_proto_rawDesc ) func file_cel_expr_checked_proto_rawDescGZIP() []byte { file_cel_expr_checked_proto_rawDescOnce.Do(func() { file_cel_expr_checked_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_checked_proto_rawDescData) }) return file_cel_expr_checked_proto_rawDescData } var file_cel_expr_checked_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_cel_expr_checked_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_cel_expr_checked_proto_goTypes = []interface{}{ (Type_PrimitiveType)(0), // 0: cel.expr.Type.PrimitiveType (Type_WellKnownType)(0), // 1: cel.expr.Type.WellKnownType (*CheckedExpr)(nil), // 2: cel.expr.CheckedExpr (*Type)(nil), // 3: cel.expr.Type (*Decl)(nil), // 4: cel.expr.Decl (*Reference)(nil), // 5: cel.expr.Reference nil, // 6: cel.expr.CheckedExpr.ReferenceMapEntry nil, // 7: cel.expr.CheckedExpr.TypeMapEntry (*Type_ListType)(nil), // 8: cel.expr.Type.ListType (*Type_MapType)(nil), // 9: cel.expr.Type.MapType (*Type_FunctionType)(nil), // 10: cel.expr.Type.FunctionType (*Type_AbstractType)(nil), // 11: cel.expr.Type.AbstractType (*Decl_IdentDecl)(nil), // 12: cel.expr.Decl.IdentDecl (*Decl_FunctionDecl)(nil), // 13: cel.expr.Decl.FunctionDecl (*Decl_FunctionDecl_Overload)(nil), // 14: cel.expr.Decl.FunctionDecl.Overload (*SourceInfo)(nil), // 15: cel.expr.SourceInfo (*Expr)(nil), // 16: cel.expr.Expr (*emptypb.Empty)(nil), // 17: google.protobuf.Empty (structpb.NullValue)(0), // 18: google.protobuf.NullValue (*Constant)(nil), // 19: cel.expr.Constant } var file_cel_expr_checked_proto_depIdxs = []int32{ 6, // 0: cel.expr.CheckedExpr.reference_map:type_name -> cel.expr.CheckedExpr.ReferenceMapEntry 7, // 1: cel.expr.CheckedExpr.type_map:type_name -> cel.expr.CheckedExpr.TypeMapEntry 15, // 2: cel.expr.CheckedExpr.source_info:type_name -> cel.expr.SourceInfo 16, // 3: cel.expr.CheckedExpr.expr:type_name -> cel.expr.Expr 17, // 4: cel.expr.Type.dyn:type_name -> google.protobuf.Empty 18, // 5: cel.expr.Type.null:type_name -> google.protobuf.NullValue 0, // 6: cel.expr.Type.primitive:type_name -> cel.expr.Type.PrimitiveType 0, // 7: cel.expr.Type.wrapper:type_name -> cel.expr.Type.PrimitiveType 1, // 8: cel.expr.Type.well_known:type_name -> cel.expr.Type.WellKnownType 8, // 9: cel.expr.Type.list_type:type_name -> cel.expr.Type.ListType 9, // 10: cel.expr.Type.map_type:type_name -> cel.expr.Type.MapType 10, // 11: cel.expr.Type.function:type_name -> cel.expr.Type.FunctionType 3, // 12: cel.expr.Type.type:type_name -> cel.expr.Type 17, // 13: cel.expr.Type.error:type_name -> google.protobuf.Empty 11, // 14: cel.expr.Type.abstract_type:type_name -> cel.expr.Type.AbstractType 12, // 15: cel.expr.Decl.ident:type_name -> cel.expr.Decl.IdentDecl 13, // 16: cel.expr.Decl.function:type_name -> cel.expr.Decl.FunctionDecl 19, // 17: cel.expr.Reference.value:type_name -> cel.expr.Constant 5, // 18: cel.expr.CheckedExpr.ReferenceMapEntry.value:type_name -> cel.expr.Reference 3, // 19: cel.expr.CheckedExpr.TypeMapEntry.value:type_name -> cel.expr.Type 3, // 20: cel.expr.Type.ListType.elem_type:type_name -> cel.expr.Type 3, // 21: cel.expr.Type.MapType.key_type:type_name -> cel.expr.Type 3, // 22: cel.expr.Type.MapType.value_type:type_name -> cel.expr.Type 3, // 23: cel.expr.Type.FunctionType.result_type:type_name -> cel.expr.Type 3, // 24: cel.expr.Type.FunctionType.arg_types:type_name -> cel.expr.Type 3, // 25: cel.expr.Type.AbstractType.parameter_types:type_name -> cel.expr.Type 3, // 26: cel.expr.Decl.IdentDecl.type:type_name -> cel.expr.Type 19, // 27: cel.expr.Decl.IdentDecl.value:type_name -> cel.expr.Constant 14, // 28: cel.expr.Decl.FunctionDecl.overloads:type_name -> cel.expr.Decl.FunctionDecl.Overload 3, // 29: cel.expr.Decl.FunctionDecl.Overload.params:type_name -> cel.expr.Type 3, // 30: cel.expr.Decl.FunctionDecl.Overload.result_type:type_name -> cel.expr.Type 31, // [31:31] is the sub-list for method output_type 31, // [31:31] is the sub-list for method input_type 31, // [31:31] is the sub-list for extension type_name 31, // [31:31] is the sub-list for extension extendee 0, // [0:31] is the sub-list for field type_name } func init() { file_cel_expr_checked_proto_init() } func file_cel_expr_checked_proto_init() { if File_cel_expr_checked_proto != nil { return } file_cel_expr_syntax_proto_init() if !protoimpl.UnsafeEnabled { file_cel_expr_checked_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckedExpr); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Type); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Decl); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Reference); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Type_ListType); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Type_MapType); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Type_FunctionType); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Type_AbstractType); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Decl_IdentDecl); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Decl_FunctionDecl); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_checked_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Decl_FunctionDecl_Overload); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } file_cel_expr_checked_proto_msgTypes[1].OneofWrappers = []interface{}{ (*Type_Dyn)(nil), (*Type_Null)(nil), (*Type_Primitive)(nil), (*Type_Wrapper)(nil), (*Type_WellKnown)(nil), (*Type_ListType_)(nil), (*Type_MapType_)(nil), (*Type_Function)(nil), (*Type_MessageType)(nil), (*Type_TypeParam)(nil), (*Type_Type)(nil), (*Type_Error)(nil), (*Type_AbstractType_)(nil), } file_cel_expr_checked_proto_msgTypes[2].OneofWrappers = []interface{}{ (*Decl_Ident)(nil), (*Decl_Function)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cel_expr_checked_proto_rawDesc, NumEnums: 2, NumMessages: 13, NumExtensions: 0, NumServices: 0, }, GoTypes: file_cel_expr_checked_proto_goTypes, DependencyIndexes: file_cel_expr_checked_proto_depIdxs, EnumInfos: file_cel_expr_checked_proto_enumTypes, MessageInfos: file_cel_expr_checked_proto_msgTypes, }.Build() File_cel_expr_checked_proto = out.File file_cel_expr_checked_proto_rawDesc = nil file_cel_expr_checked_proto_goTypes = nil file_cel_expr_checked_proto_depIdxs = nil } ================================================ FILE: vendor/cel.dev/expr/cloudbuild.yaml ================================================ steps: - name: 'gcr.io/cloud-builders/bazel:7.3.2' entrypoint: bazel args: ['build', '...'] id: bazel-build waitFor: ['-'] timeout: 15m options: machineType: 'N1_HIGHCPU_32' ================================================ FILE: vendor/cel.dev/expr/eval.pb.go ================================================ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.3 // protoc v5.27.1 // source: cel/expr/eval.proto package expr import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" anypb "google.golang.org/protobuf/types/known/anypb" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) type EvalState struct { state protoimpl.MessageState `protogen:"open.v1"` Values []*ExprValue `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` Results []*EvalState_Result `protobuf:"bytes,3,rep,name=results,proto3" json:"results,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *EvalState) Reset() { *x = EvalState{} mi := &file_cel_expr_eval_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *EvalState) String() string { return protoimpl.X.MessageStringOf(x) } func (*EvalState) ProtoMessage() {} func (x *EvalState) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_eval_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use EvalState.ProtoReflect.Descriptor instead. func (*EvalState) Descriptor() ([]byte, []int) { return file_cel_expr_eval_proto_rawDescGZIP(), []int{0} } func (x *EvalState) GetValues() []*ExprValue { if x != nil { return x.Values } return nil } func (x *EvalState) GetResults() []*EvalState_Result { if x != nil { return x.Results } return nil } type ExprValue struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Kind: // // *ExprValue_Value // *ExprValue_Error // *ExprValue_Unknown Kind isExprValue_Kind `protobuf_oneof:"kind"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *ExprValue) Reset() { *x = ExprValue{} mi := &file_cel_expr_eval_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ExprValue) String() string { return protoimpl.X.MessageStringOf(x) } func (*ExprValue) ProtoMessage() {} func (x *ExprValue) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_eval_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ExprValue.ProtoReflect.Descriptor instead. func (*ExprValue) Descriptor() ([]byte, []int) { return file_cel_expr_eval_proto_rawDescGZIP(), []int{1} } func (x *ExprValue) GetKind() isExprValue_Kind { if x != nil { return x.Kind } return nil } func (x *ExprValue) GetValue() *Value { if x != nil { if x, ok := x.Kind.(*ExprValue_Value); ok { return x.Value } } return nil } func (x *ExprValue) GetError() *ErrorSet { if x != nil { if x, ok := x.Kind.(*ExprValue_Error); ok { return x.Error } } return nil } func (x *ExprValue) GetUnknown() *UnknownSet { if x != nil { if x, ok := x.Kind.(*ExprValue_Unknown); ok { return x.Unknown } } return nil } type isExprValue_Kind interface { isExprValue_Kind() } type ExprValue_Value struct { Value *Value `protobuf:"bytes,1,opt,name=value,proto3,oneof"` } type ExprValue_Error struct { Error *ErrorSet `protobuf:"bytes,2,opt,name=error,proto3,oneof"` } type ExprValue_Unknown struct { Unknown *UnknownSet `protobuf:"bytes,3,opt,name=unknown,proto3,oneof"` } func (*ExprValue_Value) isExprValue_Kind() {} func (*ExprValue_Error) isExprValue_Kind() {} func (*ExprValue_Unknown) isExprValue_Kind() {} type ErrorSet struct { state protoimpl.MessageState `protogen:"open.v1"` Errors []*Status `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *ErrorSet) Reset() { *x = ErrorSet{} mi := &file_cel_expr_eval_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ErrorSet) String() string { return protoimpl.X.MessageStringOf(x) } func (*ErrorSet) ProtoMessage() {} func (x *ErrorSet) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_eval_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ErrorSet.ProtoReflect.Descriptor instead. func (*ErrorSet) Descriptor() ([]byte, []int) { return file_cel_expr_eval_proto_rawDescGZIP(), []int{2} } func (x *ErrorSet) GetErrors() []*Status { if x != nil { return x.Errors } return nil } type Status struct { state protoimpl.MessageState `protogen:"open.v1"` Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` Details []*anypb.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *Status) Reset() { *x = Status{} mi := &file_cel_expr_eval_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Status) String() string { return protoimpl.X.MessageStringOf(x) } func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_eval_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Status.ProtoReflect.Descriptor instead. func (*Status) Descriptor() ([]byte, []int) { return file_cel_expr_eval_proto_rawDescGZIP(), []int{3} } func (x *Status) GetCode() int32 { if x != nil { return x.Code } return 0 } func (x *Status) GetMessage() string { if x != nil { return x.Message } return "" } func (x *Status) GetDetails() []*anypb.Any { if x != nil { return x.Details } return nil } type UnknownSet struct { state protoimpl.MessageState `protogen:"open.v1"` Exprs []int64 `protobuf:"varint,1,rep,packed,name=exprs,proto3" json:"exprs,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *UnknownSet) Reset() { *x = UnknownSet{} mi := &file_cel_expr_eval_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UnknownSet) String() string { return protoimpl.X.MessageStringOf(x) } func (*UnknownSet) ProtoMessage() {} func (x *UnknownSet) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_eval_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UnknownSet.ProtoReflect.Descriptor instead. func (*UnknownSet) Descriptor() ([]byte, []int) { return file_cel_expr_eval_proto_rawDescGZIP(), []int{4} } func (x *UnknownSet) GetExprs() []int64 { if x != nil { return x.Exprs } return nil } type EvalState_Result struct { state protoimpl.MessageState `protogen:"open.v1"` Expr int64 `protobuf:"varint,1,opt,name=expr,proto3" json:"expr,omitempty"` Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *EvalState_Result) Reset() { *x = EvalState_Result{} mi := &file_cel_expr_eval_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *EvalState_Result) String() string { return protoimpl.X.MessageStringOf(x) } func (*EvalState_Result) ProtoMessage() {} func (x *EvalState_Result) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_eval_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use EvalState_Result.ProtoReflect.Descriptor instead. func (*EvalState_Result) Descriptor() ([]byte, []int) { return file_cel_expr_eval_proto_rawDescGZIP(), []int{0, 0} } func (x *EvalState_Result) GetExpr() int64 { if x != nil { return x.Expr } return 0 } func (x *EvalState_Result) GetValue() int64 { if x != nil { return x.Value } return 0 } var File_cel_expr_eval_proto protoreflect.FileDescriptor var file_cel_expr_eval_proto_rawDesc = []byte{ 0x0a, 0x13, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x65, 0x76, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x32, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x34, 0x0a, 0x08, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x66, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x22, 0x0a, 0x0a, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x70, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x05, 0x65, 0x78, 0x70, 0x72, 0x73, 0x42, 0x2c, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x09, 0x45, 0x76, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_cel_expr_eval_proto_rawDescOnce sync.Once file_cel_expr_eval_proto_rawDescData = file_cel_expr_eval_proto_rawDesc ) func file_cel_expr_eval_proto_rawDescGZIP() []byte { file_cel_expr_eval_proto_rawDescOnce.Do(func() { file_cel_expr_eval_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_eval_proto_rawDescData) }) return file_cel_expr_eval_proto_rawDescData } var file_cel_expr_eval_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_cel_expr_eval_proto_goTypes = []any{ (*EvalState)(nil), // 0: cel.expr.EvalState (*ExprValue)(nil), // 1: cel.expr.ExprValue (*ErrorSet)(nil), // 2: cel.expr.ErrorSet (*Status)(nil), // 3: cel.expr.Status (*UnknownSet)(nil), // 4: cel.expr.UnknownSet (*EvalState_Result)(nil), // 5: cel.expr.EvalState.Result (*Value)(nil), // 6: cel.expr.Value (*anypb.Any)(nil), // 7: google.protobuf.Any } var file_cel_expr_eval_proto_depIdxs = []int32{ 1, // 0: cel.expr.EvalState.values:type_name -> cel.expr.ExprValue 5, // 1: cel.expr.EvalState.results:type_name -> cel.expr.EvalState.Result 6, // 2: cel.expr.ExprValue.value:type_name -> cel.expr.Value 2, // 3: cel.expr.ExprValue.error:type_name -> cel.expr.ErrorSet 4, // 4: cel.expr.ExprValue.unknown:type_name -> cel.expr.UnknownSet 3, // 5: cel.expr.ErrorSet.errors:type_name -> cel.expr.Status 7, // 6: cel.expr.Status.details:type_name -> google.protobuf.Any 7, // [7:7] is the sub-list for method output_type 7, // [7:7] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name } func init() { file_cel_expr_eval_proto_init() } func file_cel_expr_eval_proto_init() { if File_cel_expr_eval_proto != nil { return } file_cel_expr_value_proto_init() file_cel_expr_eval_proto_msgTypes[1].OneofWrappers = []any{ (*ExprValue_Value)(nil), (*ExprValue_Error)(nil), (*ExprValue_Unknown)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cel_expr_eval_proto_rawDesc, NumEnums: 0, NumMessages: 6, NumExtensions: 0, NumServices: 0, }, GoTypes: file_cel_expr_eval_proto_goTypes, DependencyIndexes: file_cel_expr_eval_proto_depIdxs, MessageInfos: file_cel_expr_eval_proto_msgTypes, }.Build() File_cel_expr_eval_proto = out.File file_cel_expr_eval_proto_rawDesc = nil file_cel_expr_eval_proto_goTypes = nil file_cel_expr_eval_proto_depIdxs = nil } ================================================ FILE: vendor/cel.dev/expr/explain.pb.go ================================================ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 // protoc v3.21.5 // source: cel/expr/explain.proto package expr import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Deprecated: Do not use. type Explain struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` ExprSteps []*Explain_ExprStep `protobuf:"bytes,2,rep,name=expr_steps,json=exprSteps,proto3" json:"expr_steps,omitempty"` } func (x *Explain) Reset() { *x = Explain{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_explain_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Explain) String() string { return protoimpl.X.MessageStringOf(x) } func (*Explain) ProtoMessage() {} func (x *Explain) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_explain_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Explain.ProtoReflect.Descriptor instead. func (*Explain) Descriptor() ([]byte, []int) { return file_cel_expr_explain_proto_rawDescGZIP(), []int{0} } func (x *Explain) GetValues() []*Value { if x != nil { return x.Values } return nil } func (x *Explain) GetExprSteps() []*Explain_ExprStep { if x != nil { return x.ExprSteps } return nil } type Explain_ExprStep struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` ValueIndex int32 `protobuf:"varint,2,opt,name=value_index,json=valueIndex,proto3" json:"value_index,omitempty"` } func (x *Explain_ExprStep) Reset() { *x = Explain_ExprStep{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_explain_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Explain_ExprStep) String() string { return protoimpl.X.MessageStringOf(x) } func (*Explain_ExprStep) ProtoMessage() {} func (x *Explain_ExprStep) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_explain_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Explain_ExprStep.ProtoReflect.Descriptor instead. func (*Explain_ExprStep) Descriptor() ([]byte, []int) { return file_cel_expr_explain_proto_rawDescGZIP(), []int{0, 0} } func (x *Explain_ExprStep) GetId() int64 { if x != nil { return x.Id } return 0 } func (x *Explain_ExprStep) GetValueIndex() int32 { if x != nil { return x.ValueIndex } return 0 } var File_cel_expr_explain_proto protoreflect.FileDescriptor var file_cel_expr_explain_proto_rawDesc = []byte{ 0x0a, 0x16, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x1a, 0x14, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xae, 0x01, 0x0a, 0x07, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x53, 0x74, 0x65, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x72, 0x53, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x72, 0x53, 0x74, 0x65, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x2f, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_cel_expr_explain_proto_rawDescOnce sync.Once file_cel_expr_explain_proto_rawDescData = file_cel_expr_explain_proto_rawDesc ) func file_cel_expr_explain_proto_rawDescGZIP() []byte { file_cel_expr_explain_proto_rawDescOnce.Do(func() { file_cel_expr_explain_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_explain_proto_rawDescData) }) return file_cel_expr_explain_proto_rawDescData } var file_cel_expr_explain_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_cel_expr_explain_proto_goTypes = []interface{}{ (*Explain)(nil), // 0: cel.expr.Explain (*Explain_ExprStep)(nil), // 1: cel.expr.Explain.ExprStep (*Value)(nil), // 2: cel.expr.Value } var file_cel_expr_explain_proto_depIdxs = []int32{ 2, // 0: cel.expr.Explain.values:type_name -> cel.expr.Value 1, // 1: cel.expr.Explain.expr_steps:type_name -> cel.expr.Explain.ExprStep 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_cel_expr_explain_proto_init() } func file_cel_expr_explain_proto_init() { if File_cel_expr_explain_proto != nil { return } file_cel_expr_value_proto_init() if !protoimpl.UnsafeEnabled { file_cel_expr_explain_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Explain); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_explain_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Explain_ExprStep); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cel_expr_explain_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_cel_expr_explain_proto_goTypes, DependencyIndexes: file_cel_expr_explain_proto_depIdxs, MessageInfos: file_cel_expr_explain_proto_msgTypes, }.Build() File_cel_expr_explain_proto = out.File file_cel_expr_explain_proto_rawDesc = nil file_cel_expr_explain_proto_goTypes = nil file_cel_expr_explain_proto_depIdxs = nil } ================================================ FILE: vendor/cel.dev/expr/regen_go_proto.sh ================================================ #!/bin/sh bazel build //proto/cel/expr/conformance/... files=($(bazel aquery 'kind(proto, //proto/cel/expr/conformance/...)' | grep Outputs | grep "[.]pb[.]go" | sed 's/Outputs: \[//' | sed 's/\]//' | tr "," "\n")) for src in ${files[@]}; do dst=$(echo $src | sed 's/\(.*\/cel.dev\/expr\/\(.*\)\)/\2/') echo "copying $dst" $(cp $src $dst) done ================================================ FILE: vendor/cel.dev/expr/regen_go_proto_canonical_protos.sh ================================================ #!/usr/bin/env bash bazel build //proto/cel/expr:all rm -vf ./*.pb.go files=( $(bazel cquery //proto/cel/expr:expr_go_proto --output=starlark --starlark:expr="'\n'.join([f.path for f in target.output_groups.go_generated_srcs.to_list()])") ) for src in "${files[@]}"; do cp -v "${src}" ./ done ================================================ FILE: vendor/cel.dev/expr/syntax.pb.go ================================================ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 // protoc v3.21.5 // source: cel/expr/syntax.proto package expr import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) type SourceInfo_Extension_Component int32 const ( SourceInfo_Extension_COMPONENT_UNSPECIFIED SourceInfo_Extension_Component = 0 SourceInfo_Extension_COMPONENT_PARSER SourceInfo_Extension_Component = 1 SourceInfo_Extension_COMPONENT_TYPE_CHECKER SourceInfo_Extension_Component = 2 SourceInfo_Extension_COMPONENT_RUNTIME SourceInfo_Extension_Component = 3 ) // Enum value maps for SourceInfo_Extension_Component. var ( SourceInfo_Extension_Component_name = map[int32]string{ 0: "COMPONENT_UNSPECIFIED", 1: "COMPONENT_PARSER", 2: "COMPONENT_TYPE_CHECKER", 3: "COMPONENT_RUNTIME", } SourceInfo_Extension_Component_value = map[string]int32{ "COMPONENT_UNSPECIFIED": 0, "COMPONENT_PARSER": 1, "COMPONENT_TYPE_CHECKER": 2, "COMPONENT_RUNTIME": 3, } ) func (x SourceInfo_Extension_Component) Enum() *SourceInfo_Extension_Component { p := new(SourceInfo_Extension_Component) *p = x return p } func (x SourceInfo_Extension_Component) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (SourceInfo_Extension_Component) Descriptor() protoreflect.EnumDescriptor { return file_cel_expr_syntax_proto_enumTypes[0].Descriptor() } func (SourceInfo_Extension_Component) Type() protoreflect.EnumType { return &file_cel_expr_syntax_proto_enumTypes[0] } func (x SourceInfo_Extension_Component) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use SourceInfo_Extension_Component.Descriptor instead. func (SourceInfo_Extension_Component) EnumDescriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2, 0} } type ParsedExpr struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Expr *Expr `protobuf:"bytes,2,opt,name=expr,proto3" json:"expr,omitempty"` SourceInfo *SourceInfo `protobuf:"bytes,3,opt,name=source_info,json=sourceInfo,proto3" json:"source_info,omitempty"` } func (x *ParsedExpr) Reset() { *x = ParsedExpr{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ParsedExpr) String() string { return protoimpl.X.MessageStringOf(x) } func (*ParsedExpr) ProtoMessage() {} func (x *ParsedExpr) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ParsedExpr.ProtoReflect.Descriptor instead. func (*ParsedExpr) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{0} } func (x *ParsedExpr) GetExpr() *Expr { if x != nil { return x.Expr } return nil } func (x *ParsedExpr) GetSourceInfo() *SourceInfo { if x != nil { return x.SourceInfo } return nil } type Expr struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Id int64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` // Types that are assignable to ExprKind: // // *Expr_ConstExpr // *Expr_IdentExpr // *Expr_SelectExpr // *Expr_CallExpr // *Expr_ListExpr // *Expr_StructExpr // *Expr_ComprehensionExpr ExprKind isExpr_ExprKind `protobuf_oneof:"expr_kind"` } func (x *Expr) Reset() { *x = Expr{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Expr) String() string { return protoimpl.X.MessageStringOf(x) } func (*Expr) ProtoMessage() {} func (x *Expr) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Expr.ProtoReflect.Descriptor instead. func (*Expr) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1} } func (x *Expr) GetId() int64 { if x != nil { return x.Id } return 0 } func (m *Expr) GetExprKind() isExpr_ExprKind { if m != nil { return m.ExprKind } return nil } func (x *Expr) GetConstExpr() *Constant { if x, ok := x.GetExprKind().(*Expr_ConstExpr); ok { return x.ConstExpr } return nil } func (x *Expr) GetIdentExpr() *Expr_Ident { if x, ok := x.GetExprKind().(*Expr_IdentExpr); ok { return x.IdentExpr } return nil } func (x *Expr) GetSelectExpr() *Expr_Select { if x, ok := x.GetExprKind().(*Expr_SelectExpr); ok { return x.SelectExpr } return nil } func (x *Expr) GetCallExpr() *Expr_Call { if x, ok := x.GetExprKind().(*Expr_CallExpr); ok { return x.CallExpr } return nil } func (x *Expr) GetListExpr() *Expr_CreateList { if x, ok := x.GetExprKind().(*Expr_ListExpr); ok { return x.ListExpr } return nil } func (x *Expr) GetStructExpr() *Expr_CreateStruct { if x, ok := x.GetExprKind().(*Expr_StructExpr); ok { return x.StructExpr } return nil } func (x *Expr) GetComprehensionExpr() *Expr_Comprehension { if x, ok := x.GetExprKind().(*Expr_ComprehensionExpr); ok { return x.ComprehensionExpr } return nil } type isExpr_ExprKind interface { isExpr_ExprKind() } type Expr_ConstExpr struct { ConstExpr *Constant `protobuf:"bytes,3,opt,name=const_expr,json=constExpr,proto3,oneof"` } type Expr_IdentExpr struct { IdentExpr *Expr_Ident `protobuf:"bytes,4,opt,name=ident_expr,json=identExpr,proto3,oneof"` } type Expr_SelectExpr struct { SelectExpr *Expr_Select `protobuf:"bytes,5,opt,name=select_expr,json=selectExpr,proto3,oneof"` } type Expr_CallExpr struct { CallExpr *Expr_Call `protobuf:"bytes,6,opt,name=call_expr,json=callExpr,proto3,oneof"` } type Expr_ListExpr struct { ListExpr *Expr_CreateList `protobuf:"bytes,7,opt,name=list_expr,json=listExpr,proto3,oneof"` } type Expr_StructExpr struct { StructExpr *Expr_CreateStruct `protobuf:"bytes,8,opt,name=struct_expr,json=structExpr,proto3,oneof"` } type Expr_ComprehensionExpr struct { ComprehensionExpr *Expr_Comprehension `protobuf:"bytes,9,opt,name=comprehension_expr,json=comprehensionExpr,proto3,oneof"` } func (*Expr_ConstExpr) isExpr_ExprKind() {} func (*Expr_IdentExpr) isExpr_ExprKind() {} func (*Expr_SelectExpr) isExpr_ExprKind() {} func (*Expr_CallExpr) isExpr_ExprKind() {} func (*Expr_ListExpr) isExpr_ExprKind() {} func (*Expr_StructExpr) isExpr_ExprKind() {} func (*Expr_ComprehensionExpr) isExpr_ExprKind() {} type Constant struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to ConstantKind: // // *Constant_NullValue // *Constant_BoolValue // *Constant_Int64Value // *Constant_Uint64Value // *Constant_DoubleValue // *Constant_StringValue // *Constant_BytesValue // *Constant_DurationValue // *Constant_TimestampValue ConstantKind isConstant_ConstantKind `protobuf_oneof:"constant_kind"` } func (x *Constant) Reset() { *x = Constant{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Constant) String() string { return protoimpl.X.MessageStringOf(x) } func (*Constant) ProtoMessage() {} func (x *Constant) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Constant.ProtoReflect.Descriptor instead. func (*Constant) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{2} } func (m *Constant) GetConstantKind() isConstant_ConstantKind { if m != nil { return m.ConstantKind } return nil } func (x *Constant) GetNullValue() structpb.NullValue { if x, ok := x.GetConstantKind().(*Constant_NullValue); ok { return x.NullValue } return structpb.NullValue(0) } func (x *Constant) GetBoolValue() bool { if x, ok := x.GetConstantKind().(*Constant_BoolValue); ok { return x.BoolValue } return false } func (x *Constant) GetInt64Value() int64 { if x, ok := x.GetConstantKind().(*Constant_Int64Value); ok { return x.Int64Value } return 0 } func (x *Constant) GetUint64Value() uint64 { if x, ok := x.GetConstantKind().(*Constant_Uint64Value); ok { return x.Uint64Value } return 0 } func (x *Constant) GetDoubleValue() float64 { if x, ok := x.GetConstantKind().(*Constant_DoubleValue); ok { return x.DoubleValue } return 0 } func (x *Constant) GetStringValue() string { if x, ok := x.GetConstantKind().(*Constant_StringValue); ok { return x.StringValue } return "" } func (x *Constant) GetBytesValue() []byte { if x, ok := x.GetConstantKind().(*Constant_BytesValue); ok { return x.BytesValue } return nil } // Deprecated: Do not use. func (x *Constant) GetDurationValue() *durationpb.Duration { if x, ok := x.GetConstantKind().(*Constant_DurationValue); ok { return x.DurationValue } return nil } // Deprecated: Do not use. func (x *Constant) GetTimestampValue() *timestamppb.Timestamp { if x, ok := x.GetConstantKind().(*Constant_TimestampValue); ok { return x.TimestampValue } return nil } type isConstant_ConstantKind interface { isConstant_ConstantKind() } type Constant_NullValue struct { NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` } type Constant_BoolValue struct { BoolValue bool `protobuf:"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof"` } type Constant_Int64Value struct { Int64Value int64 `protobuf:"varint,3,opt,name=int64_value,json=int64Value,proto3,oneof"` } type Constant_Uint64Value struct { Uint64Value uint64 `protobuf:"varint,4,opt,name=uint64_value,json=uint64Value,proto3,oneof"` } type Constant_DoubleValue struct { DoubleValue float64 `protobuf:"fixed64,5,opt,name=double_value,json=doubleValue,proto3,oneof"` } type Constant_StringValue struct { StringValue string `protobuf:"bytes,6,opt,name=string_value,json=stringValue,proto3,oneof"` } type Constant_BytesValue struct { BytesValue []byte `protobuf:"bytes,7,opt,name=bytes_value,json=bytesValue,proto3,oneof"` } type Constant_DurationValue struct { // Deprecated: Do not use. DurationValue *durationpb.Duration `protobuf:"bytes,8,opt,name=duration_value,json=durationValue,proto3,oneof"` } type Constant_TimestampValue struct { // Deprecated: Do not use. TimestampValue *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=timestamp_value,json=timestampValue,proto3,oneof"` } func (*Constant_NullValue) isConstant_ConstantKind() {} func (*Constant_BoolValue) isConstant_ConstantKind() {} func (*Constant_Int64Value) isConstant_ConstantKind() {} func (*Constant_Uint64Value) isConstant_ConstantKind() {} func (*Constant_DoubleValue) isConstant_ConstantKind() {} func (*Constant_StringValue) isConstant_ConstantKind() {} func (*Constant_BytesValue) isConstant_ConstantKind() {} func (*Constant_DurationValue) isConstant_ConstantKind() {} func (*Constant_TimestampValue) isConstant_ConstantKind() {} type SourceInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields SyntaxVersion string `protobuf:"bytes,1,opt,name=syntax_version,json=syntaxVersion,proto3" json:"syntax_version,omitempty"` Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` LineOffsets []int32 `protobuf:"varint,3,rep,packed,name=line_offsets,json=lineOffsets,proto3" json:"line_offsets,omitempty"` Positions map[int64]int32 `protobuf:"bytes,4,rep,name=positions,proto3" json:"positions,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` MacroCalls map[int64]*Expr `protobuf:"bytes,5,rep,name=macro_calls,json=macroCalls,proto3" json:"macro_calls,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Extensions []*SourceInfo_Extension `protobuf:"bytes,6,rep,name=extensions,proto3" json:"extensions,omitempty"` } func (x *SourceInfo) Reset() { *x = SourceInfo{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SourceInfo) String() string { return protoimpl.X.MessageStringOf(x) } func (*SourceInfo) ProtoMessage() {} func (x *SourceInfo) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SourceInfo.ProtoReflect.Descriptor instead. func (*SourceInfo) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3} } func (x *SourceInfo) GetSyntaxVersion() string { if x != nil { return x.SyntaxVersion } return "" } func (x *SourceInfo) GetLocation() string { if x != nil { return x.Location } return "" } func (x *SourceInfo) GetLineOffsets() []int32 { if x != nil { return x.LineOffsets } return nil } func (x *SourceInfo) GetPositions() map[int64]int32 { if x != nil { return x.Positions } return nil } func (x *SourceInfo) GetMacroCalls() map[int64]*Expr { if x != nil { return x.MacroCalls } return nil } func (x *SourceInfo) GetExtensions() []*SourceInfo_Extension { if x != nil { return x.Extensions } return nil } type Expr_Ident struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *Expr_Ident) Reset() { *x = Expr_Ident{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Expr_Ident) String() string { return protoimpl.X.MessageStringOf(x) } func (*Expr_Ident) ProtoMessage() {} func (x *Expr_Ident) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Expr_Ident.ProtoReflect.Descriptor instead. func (*Expr_Ident) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 0} } func (x *Expr_Ident) GetName() string { if x != nil { return x.Name } return "" } type Expr_Select struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Operand *Expr `protobuf:"bytes,1,opt,name=operand,proto3" json:"operand,omitempty"` Field string `protobuf:"bytes,2,opt,name=field,proto3" json:"field,omitempty"` TestOnly bool `protobuf:"varint,3,opt,name=test_only,json=testOnly,proto3" json:"test_only,omitempty"` } func (x *Expr_Select) Reset() { *x = Expr_Select{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Expr_Select) String() string { return protoimpl.X.MessageStringOf(x) } func (*Expr_Select) ProtoMessage() {} func (x *Expr_Select) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Expr_Select.ProtoReflect.Descriptor instead. func (*Expr_Select) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 1} } func (x *Expr_Select) GetOperand() *Expr { if x != nil { return x.Operand } return nil } func (x *Expr_Select) GetField() string { if x != nil { return x.Field } return "" } func (x *Expr_Select) GetTestOnly() bool { if x != nil { return x.TestOnly } return false } type Expr_Call struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Target *Expr `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` Function string `protobuf:"bytes,2,opt,name=function,proto3" json:"function,omitempty"` Args []*Expr `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"` } func (x *Expr_Call) Reset() { *x = Expr_Call{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Expr_Call) String() string { return protoimpl.X.MessageStringOf(x) } func (*Expr_Call) ProtoMessage() {} func (x *Expr_Call) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Expr_Call.ProtoReflect.Descriptor instead. func (*Expr_Call) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 2} } func (x *Expr_Call) GetTarget() *Expr { if x != nil { return x.Target } return nil } func (x *Expr_Call) GetFunction() string { if x != nil { return x.Function } return "" } func (x *Expr_Call) GetArgs() []*Expr { if x != nil { return x.Args } return nil } type Expr_CreateList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Elements []*Expr `protobuf:"bytes,1,rep,name=elements,proto3" json:"elements,omitempty"` OptionalIndices []int32 `protobuf:"varint,2,rep,packed,name=optional_indices,json=optionalIndices,proto3" json:"optional_indices,omitempty"` } func (x *Expr_CreateList) Reset() { *x = Expr_CreateList{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Expr_CreateList) String() string { return protoimpl.X.MessageStringOf(x) } func (*Expr_CreateList) ProtoMessage() {} func (x *Expr_CreateList) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Expr_CreateList.ProtoReflect.Descriptor instead. func (*Expr_CreateList) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 3} } func (x *Expr_CreateList) GetElements() []*Expr { if x != nil { return x.Elements } return nil } func (x *Expr_CreateList) GetOptionalIndices() []int32 { if x != nil { return x.OptionalIndices } return nil } type Expr_CreateStruct struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields MessageName string `protobuf:"bytes,1,opt,name=message_name,json=messageName,proto3" json:"message_name,omitempty"` Entries []*Expr_CreateStruct_Entry `protobuf:"bytes,2,rep,name=entries,proto3" json:"entries,omitempty"` } func (x *Expr_CreateStruct) Reset() { *x = Expr_CreateStruct{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Expr_CreateStruct) String() string { return protoimpl.X.MessageStringOf(x) } func (*Expr_CreateStruct) ProtoMessage() {} func (x *Expr_CreateStruct) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Expr_CreateStruct.ProtoReflect.Descriptor instead. func (*Expr_CreateStruct) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 4} } func (x *Expr_CreateStruct) GetMessageName() string { if x != nil { return x.MessageName } return "" } func (x *Expr_CreateStruct) GetEntries() []*Expr_CreateStruct_Entry { if x != nil { return x.Entries } return nil } type Expr_Comprehension struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields IterVar string `protobuf:"bytes,1,opt,name=iter_var,json=iterVar,proto3" json:"iter_var,omitempty"` IterRange *Expr `protobuf:"bytes,2,opt,name=iter_range,json=iterRange,proto3" json:"iter_range,omitempty"` AccuVar string `protobuf:"bytes,3,opt,name=accu_var,json=accuVar,proto3" json:"accu_var,omitempty"` AccuInit *Expr `protobuf:"bytes,4,opt,name=accu_init,json=accuInit,proto3" json:"accu_init,omitempty"` LoopCondition *Expr `protobuf:"bytes,5,opt,name=loop_condition,json=loopCondition,proto3" json:"loop_condition,omitempty"` LoopStep *Expr `protobuf:"bytes,6,opt,name=loop_step,json=loopStep,proto3" json:"loop_step,omitempty"` Result *Expr `protobuf:"bytes,7,opt,name=result,proto3" json:"result,omitempty"` } func (x *Expr_Comprehension) Reset() { *x = Expr_Comprehension{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Expr_Comprehension) String() string { return protoimpl.X.MessageStringOf(x) } func (*Expr_Comprehension) ProtoMessage() {} func (x *Expr_Comprehension) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Expr_Comprehension.ProtoReflect.Descriptor instead. func (*Expr_Comprehension) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 5} } func (x *Expr_Comprehension) GetIterVar() string { if x != nil { return x.IterVar } return "" } func (x *Expr_Comprehension) GetIterRange() *Expr { if x != nil { return x.IterRange } return nil } func (x *Expr_Comprehension) GetAccuVar() string { if x != nil { return x.AccuVar } return "" } func (x *Expr_Comprehension) GetAccuInit() *Expr { if x != nil { return x.AccuInit } return nil } func (x *Expr_Comprehension) GetLoopCondition() *Expr { if x != nil { return x.LoopCondition } return nil } func (x *Expr_Comprehension) GetLoopStep() *Expr { if x != nil { return x.LoopStep } return nil } func (x *Expr_Comprehension) GetResult() *Expr { if x != nil { return x.Result } return nil } type Expr_CreateStruct_Entry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Types that are assignable to KeyKind: // // *Expr_CreateStruct_Entry_FieldKey // *Expr_CreateStruct_Entry_MapKey KeyKind isExpr_CreateStruct_Entry_KeyKind `protobuf_oneof:"key_kind"` Value *Expr `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` OptionalEntry bool `protobuf:"varint,5,opt,name=optional_entry,json=optionalEntry,proto3" json:"optional_entry,omitempty"` } func (x *Expr_CreateStruct_Entry) Reset() { *x = Expr_CreateStruct_Entry{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Expr_CreateStruct_Entry) String() string { return protoimpl.X.MessageStringOf(x) } func (*Expr_CreateStruct_Entry) ProtoMessage() {} func (x *Expr_CreateStruct_Entry) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Expr_CreateStruct_Entry.ProtoReflect.Descriptor instead. func (*Expr_CreateStruct_Entry) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 4, 0} } func (x *Expr_CreateStruct_Entry) GetId() int64 { if x != nil { return x.Id } return 0 } func (m *Expr_CreateStruct_Entry) GetKeyKind() isExpr_CreateStruct_Entry_KeyKind { if m != nil { return m.KeyKind } return nil } func (x *Expr_CreateStruct_Entry) GetFieldKey() string { if x, ok := x.GetKeyKind().(*Expr_CreateStruct_Entry_FieldKey); ok { return x.FieldKey } return "" } func (x *Expr_CreateStruct_Entry) GetMapKey() *Expr { if x, ok := x.GetKeyKind().(*Expr_CreateStruct_Entry_MapKey); ok { return x.MapKey } return nil } func (x *Expr_CreateStruct_Entry) GetValue() *Expr { if x != nil { return x.Value } return nil } func (x *Expr_CreateStruct_Entry) GetOptionalEntry() bool { if x != nil { return x.OptionalEntry } return false } type isExpr_CreateStruct_Entry_KeyKind interface { isExpr_CreateStruct_Entry_KeyKind() } type Expr_CreateStruct_Entry_FieldKey struct { FieldKey string `protobuf:"bytes,2,opt,name=field_key,json=fieldKey,proto3,oneof"` } type Expr_CreateStruct_Entry_MapKey struct { MapKey *Expr `protobuf:"bytes,3,opt,name=map_key,json=mapKey,proto3,oneof"` } func (*Expr_CreateStruct_Entry_FieldKey) isExpr_CreateStruct_Entry_KeyKind() {} func (*Expr_CreateStruct_Entry_MapKey) isExpr_CreateStruct_Entry_KeyKind() {} type SourceInfo_Extension struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` AffectedComponents []SourceInfo_Extension_Component `protobuf:"varint,2,rep,packed,name=affected_components,json=affectedComponents,proto3,enum=cel.expr.SourceInfo_Extension_Component" json:"affected_components,omitempty"` Version *SourceInfo_Extension_Version `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` } func (x *SourceInfo_Extension) Reset() { *x = SourceInfo_Extension{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SourceInfo_Extension) String() string { return protoimpl.X.MessageStringOf(x) } func (*SourceInfo_Extension) ProtoMessage() {} func (x *SourceInfo_Extension) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SourceInfo_Extension.ProtoReflect.Descriptor instead. func (*SourceInfo_Extension) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2} } func (x *SourceInfo_Extension) GetId() string { if x != nil { return x.Id } return "" } func (x *SourceInfo_Extension) GetAffectedComponents() []SourceInfo_Extension_Component { if x != nil { return x.AffectedComponents } return nil } func (x *SourceInfo_Extension) GetVersion() *SourceInfo_Extension_Version { if x != nil { return x.Version } return nil } type SourceInfo_Extension_Version struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Major int64 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` Minor int64 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` } func (x *SourceInfo_Extension_Version) Reset() { *x = SourceInfo_Extension_Version{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_syntax_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SourceInfo_Extension_Version) String() string { return protoimpl.X.MessageStringOf(x) } func (*SourceInfo_Extension_Version) ProtoMessage() {} func (x *SourceInfo_Extension_Version) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_syntax_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SourceInfo_Extension_Version.ProtoReflect.Descriptor instead. func (*SourceInfo_Extension_Version) Descriptor() ([]byte, []int) { return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2, 0} } func (x *SourceInfo_Extension_Version) GetMajor() int64 { if x != nil { return x.Major } return 0 } func (x *SourceInfo_Extension_Version) GetMinor() int64 { if x != nil { return x.Minor } return 0 } var File_cel_expr_syntax_proto protoreflect.FileDescriptor var file_cel_expr_syntax_proto_rawDesc = []byte{ 0x0a, 0x15, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x67, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xfd, 0x0a, 0x0a, 0x04, 0x45, 0x78, 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x38, 0x0a, 0x0b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x48, 0x00, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x38, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x4d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x1a, 0x1b, 0x0a, 0x05, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x65, 0x0a, 0x06, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x28, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x1a, 0x6e, 0x0a, 0x04, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0x63, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x1a, 0xab, 0x02, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0xba, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0xad, 0x02, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x74, 0x65, 0x72, 0x56, 0x61, 0x72, 0x12, 0x2d, 0x0a, 0x0a, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x69, 0x74, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x75, 0x5f, 0x76, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x75, 0x56, 0x61, 0x72, 0x12, 0x2b, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x75, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x61, 0x63, 0x63, 0x75, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x35, 0x0a, 0x0e, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x09, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x6c, 0x6f, 0x6f, 0x70, 0x53, 0x74, 0x65, 0x70, 0x12, 0x26, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xc1, 0x03, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xac, 0x06, 0x0a, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4d, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xe0, 0x02, 0x0a, 0x09, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x59, 0x0a, 0x13, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x35, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x45, 0x52, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x42, 0x2e, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0b, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_cel_expr_syntax_proto_rawDescOnce sync.Once file_cel_expr_syntax_proto_rawDescData = file_cel_expr_syntax_proto_rawDesc ) func file_cel_expr_syntax_proto_rawDescGZIP() []byte { file_cel_expr_syntax_proto_rawDescOnce.Do(func() { file_cel_expr_syntax_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_syntax_proto_rawDescData) }) return file_cel_expr_syntax_proto_rawDescData } var file_cel_expr_syntax_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_cel_expr_syntax_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_cel_expr_syntax_proto_goTypes = []interface{}{ (SourceInfo_Extension_Component)(0), // 0: cel.expr.SourceInfo.Extension.Component (*ParsedExpr)(nil), // 1: cel.expr.ParsedExpr (*Expr)(nil), // 2: cel.expr.Expr (*Constant)(nil), // 3: cel.expr.Constant (*SourceInfo)(nil), // 4: cel.expr.SourceInfo (*Expr_Ident)(nil), // 5: cel.expr.Expr.Ident (*Expr_Select)(nil), // 6: cel.expr.Expr.Select (*Expr_Call)(nil), // 7: cel.expr.Expr.Call (*Expr_CreateList)(nil), // 8: cel.expr.Expr.CreateList (*Expr_CreateStruct)(nil), // 9: cel.expr.Expr.CreateStruct (*Expr_Comprehension)(nil), // 10: cel.expr.Expr.Comprehension (*Expr_CreateStruct_Entry)(nil), // 11: cel.expr.Expr.CreateStruct.Entry nil, // 12: cel.expr.SourceInfo.PositionsEntry nil, // 13: cel.expr.SourceInfo.MacroCallsEntry (*SourceInfo_Extension)(nil), // 14: cel.expr.SourceInfo.Extension (*SourceInfo_Extension_Version)(nil), // 15: cel.expr.SourceInfo.Extension.Version (structpb.NullValue)(0), // 16: google.protobuf.NullValue (*durationpb.Duration)(nil), // 17: google.protobuf.Duration (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp } var file_cel_expr_syntax_proto_depIdxs = []int32{ 2, // 0: cel.expr.ParsedExpr.expr:type_name -> cel.expr.Expr 4, // 1: cel.expr.ParsedExpr.source_info:type_name -> cel.expr.SourceInfo 3, // 2: cel.expr.Expr.const_expr:type_name -> cel.expr.Constant 5, // 3: cel.expr.Expr.ident_expr:type_name -> cel.expr.Expr.Ident 6, // 4: cel.expr.Expr.select_expr:type_name -> cel.expr.Expr.Select 7, // 5: cel.expr.Expr.call_expr:type_name -> cel.expr.Expr.Call 8, // 6: cel.expr.Expr.list_expr:type_name -> cel.expr.Expr.CreateList 9, // 7: cel.expr.Expr.struct_expr:type_name -> cel.expr.Expr.CreateStruct 10, // 8: cel.expr.Expr.comprehension_expr:type_name -> cel.expr.Expr.Comprehension 16, // 9: cel.expr.Constant.null_value:type_name -> google.protobuf.NullValue 17, // 10: cel.expr.Constant.duration_value:type_name -> google.protobuf.Duration 18, // 11: cel.expr.Constant.timestamp_value:type_name -> google.protobuf.Timestamp 12, // 12: cel.expr.SourceInfo.positions:type_name -> cel.expr.SourceInfo.PositionsEntry 13, // 13: cel.expr.SourceInfo.macro_calls:type_name -> cel.expr.SourceInfo.MacroCallsEntry 14, // 14: cel.expr.SourceInfo.extensions:type_name -> cel.expr.SourceInfo.Extension 2, // 15: cel.expr.Expr.Select.operand:type_name -> cel.expr.Expr 2, // 16: cel.expr.Expr.Call.target:type_name -> cel.expr.Expr 2, // 17: cel.expr.Expr.Call.args:type_name -> cel.expr.Expr 2, // 18: cel.expr.Expr.CreateList.elements:type_name -> cel.expr.Expr 11, // 19: cel.expr.Expr.CreateStruct.entries:type_name -> cel.expr.Expr.CreateStruct.Entry 2, // 20: cel.expr.Expr.Comprehension.iter_range:type_name -> cel.expr.Expr 2, // 21: cel.expr.Expr.Comprehension.accu_init:type_name -> cel.expr.Expr 2, // 22: cel.expr.Expr.Comprehension.loop_condition:type_name -> cel.expr.Expr 2, // 23: cel.expr.Expr.Comprehension.loop_step:type_name -> cel.expr.Expr 2, // 24: cel.expr.Expr.Comprehension.result:type_name -> cel.expr.Expr 2, // 25: cel.expr.Expr.CreateStruct.Entry.map_key:type_name -> cel.expr.Expr 2, // 26: cel.expr.Expr.CreateStruct.Entry.value:type_name -> cel.expr.Expr 2, // 27: cel.expr.SourceInfo.MacroCallsEntry.value:type_name -> cel.expr.Expr 0, // 28: cel.expr.SourceInfo.Extension.affected_components:type_name -> cel.expr.SourceInfo.Extension.Component 15, // 29: cel.expr.SourceInfo.Extension.version:type_name -> cel.expr.SourceInfo.Extension.Version 30, // [30:30] is the sub-list for method output_type 30, // [30:30] is the sub-list for method input_type 30, // [30:30] is the sub-list for extension type_name 30, // [30:30] is the sub-list for extension extendee 0, // [0:30] is the sub-list for field type_name } func init() { file_cel_expr_syntax_proto_init() } func file_cel_expr_syntax_proto_init() { if File_cel_expr_syntax_proto != nil { return } if !protoimpl.UnsafeEnabled { file_cel_expr_syntax_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ParsedExpr); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expr); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Constant); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SourceInfo); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expr_Ident); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expr_Select); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expr_Call); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expr_CreateList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expr_CreateStruct); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expr_Comprehension); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Expr_CreateStruct_Entry); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SourceInfo_Extension); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_syntax_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SourceInfo_Extension_Version); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } file_cel_expr_syntax_proto_msgTypes[1].OneofWrappers = []interface{}{ (*Expr_ConstExpr)(nil), (*Expr_IdentExpr)(nil), (*Expr_SelectExpr)(nil), (*Expr_CallExpr)(nil), (*Expr_ListExpr)(nil), (*Expr_StructExpr)(nil), (*Expr_ComprehensionExpr)(nil), } file_cel_expr_syntax_proto_msgTypes[2].OneofWrappers = []interface{}{ (*Constant_NullValue)(nil), (*Constant_BoolValue)(nil), (*Constant_Int64Value)(nil), (*Constant_Uint64Value)(nil), (*Constant_DoubleValue)(nil), (*Constant_StringValue)(nil), (*Constant_BytesValue)(nil), (*Constant_DurationValue)(nil), (*Constant_TimestampValue)(nil), } file_cel_expr_syntax_proto_msgTypes[10].OneofWrappers = []interface{}{ (*Expr_CreateStruct_Entry_FieldKey)(nil), (*Expr_CreateStruct_Entry_MapKey)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cel_expr_syntax_proto_rawDesc, NumEnums: 1, NumMessages: 15, NumExtensions: 0, NumServices: 0, }, GoTypes: file_cel_expr_syntax_proto_goTypes, DependencyIndexes: file_cel_expr_syntax_proto_depIdxs, EnumInfos: file_cel_expr_syntax_proto_enumTypes, MessageInfos: file_cel_expr_syntax_proto_msgTypes, }.Build() File_cel_expr_syntax_proto = out.File file_cel_expr_syntax_proto_rawDesc = nil file_cel_expr_syntax_proto_goTypes = nil file_cel_expr_syntax_proto_depIdxs = nil } ================================================ FILE: vendor/cel.dev/expr/value.pb.go ================================================ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 // protoc v3.21.5 // source: cel/expr/value.proto package expr import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" anypb "google.golang.org/protobuf/types/known/anypb" structpb "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) type Value struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to Kind: // // *Value_NullValue // *Value_BoolValue // *Value_Int64Value // *Value_Uint64Value // *Value_DoubleValue // *Value_StringValue // *Value_BytesValue // *Value_EnumValue // *Value_ObjectValue // *Value_MapValue // *Value_ListValue // *Value_TypeValue Kind isValue_Kind `protobuf_oneof:"kind"` } func (x *Value) Reset() { *x = Value{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_value_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Value) String() string { return protoimpl.X.MessageStringOf(x) } func (*Value) ProtoMessage() {} func (x *Value) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_value_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Value.ProtoReflect.Descriptor instead. func (*Value) Descriptor() ([]byte, []int) { return file_cel_expr_value_proto_rawDescGZIP(), []int{0} } func (m *Value) GetKind() isValue_Kind { if m != nil { return m.Kind } return nil } func (x *Value) GetNullValue() structpb.NullValue { if x, ok := x.GetKind().(*Value_NullValue); ok { return x.NullValue } return structpb.NullValue(0) } func (x *Value) GetBoolValue() bool { if x, ok := x.GetKind().(*Value_BoolValue); ok { return x.BoolValue } return false } func (x *Value) GetInt64Value() int64 { if x, ok := x.GetKind().(*Value_Int64Value); ok { return x.Int64Value } return 0 } func (x *Value) GetUint64Value() uint64 { if x, ok := x.GetKind().(*Value_Uint64Value); ok { return x.Uint64Value } return 0 } func (x *Value) GetDoubleValue() float64 { if x, ok := x.GetKind().(*Value_DoubleValue); ok { return x.DoubleValue } return 0 } func (x *Value) GetStringValue() string { if x, ok := x.GetKind().(*Value_StringValue); ok { return x.StringValue } return "" } func (x *Value) GetBytesValue() []byte { if x, ok := x.GetKind().(*Value_BytesValue); ok { return x.BytesValue } return nil } func (x *Value) GetEnumValue() *EnumValue { if x, ok := x.GetKind().(*Value_EnumValue); ok { return x.EnumValue } return nil } func (x *Value) GetObjectValue() *anypb.Any { if x, ok := x.GetKind().(*Value_ObjectValue); ok { return x.ObjectValue } return nil } func (x *Value) GetMapValue() *MapValue { if x, ok := x.GetKind().(*Value_MapValue); ok { return x.MapValue } return nil } func (x *Value) GetListValue() *ListValue { if x, ok := x.GetKind().(*Value_ListValue); ok { return x.ListValue } return nil } func (x *Value) GetTypeValue() string { if x, ok := x.GetKind().(*Value_TypeValue); ok { return x.TypeValue } return "" } type isValue_Kind interface { isValue_Kind() } type Value_NullValue struct { NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` } type Value_BoolValue struct { BoolValue bool `protobuf:"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof"` } type Value_Int64Value struct { Int64Value int64 `protobuf:"varint,3,opt,name=int64_value,json=int64Value,proto3,oneof"` } type Value_Uint64Value struct { Uint64Value uint64 `protobuf:"varint,4,opt,name=uint64_value,json=uint64Value,proto3,oneof"` } type Value_DoubleValue struct { DoubleValue float64 `protobuf:"fixed64,5,opt,name=double_value,json=doubleValue,proto3,oneof"` } type Value_StringValue struct { StringValue string `protobuf:"bytes,6,opt,name=string_value,json=stringValue,proto3,oneof"` } type Value_BytesValue struct { BytesValue []byte `protobuf:"bytes,7,opt,name=bytes_value,json=bytesValue,proto3,oneof"` } type Value_EnumValue struct { EnumValue *EnumValue `protobuf:"bytes,9,opt,name=enum_value,json=enumValue,proto3,oneof"` } type Value_ObjectValue struct { ObjectValue *anypb.Any `protobuf:"bytes,10,opt,name=object_value,json=objectValue,proto3,oneof"` } type Value_MapValue struct { MapValue *MapValue `protobuf:"bytes,11,opt,name=map_value,json=mapValue,proto3,oneof"` } type Value_ListValue struct { ListValue *ListValue `protobuf:"bytes,12,opt,name=list_value,json=listValue,proto3,oneof"` } type Value_TypeValue struct { TypeValue string `protobuf:"bytes,15,opt,name=type_value,json=typeValue,proto3,oneof"` } func (*Value_NullValue) isValue_Kind() {} func (*Value_BoolValue) isValue_Kind() {} func (*Value_Int64Value) isValue_Kind() {} func (*Value_Uint64Value) isValue_Kind() {} func (*Value_DoubleValue) isValue_Kind() {} func (*Value_StringValue) isValue_Kind() {} func (*Value_BytesValue) isValue_Kind() {} func (*Value_EnumValue) isValue_Kind() {} func (*Value_ObjectValue) isValue_Kind() {} func (*Value_MapValue) isValue_Kind() {} func (*Value_ListValue) isValue_Kind() {} func (*Value_TypeValue) isValue_Kind() {} type EnumValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` } func (x *EnumValue) Reset() { *x = EnumValue{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_value_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *EnumValue) String() string { return protoimpl.X.MessageStringOf(x) } func (*EnumValue) ProtoMessage() {} func (x *EnumValue) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_value_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use EnumValue.ProtoReflect.Descriptor instead. func (*EnumValue) Descriptor() ([]byte, []int) { return file_cel_expr_value_proto_rawDescGZIP(), []int{1} } func (x *EnumValue) GetType() string { if x != nil { return x.Type } return "" } func (x *EnumValue) GetValue() int32 { if x != nil { return x.Value } return 0 } type ListValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` } func (x *ListValue) Reset() { *x = ListValue{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_value_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ListValue) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListValue) ProtoMessage() {} func (x *ListValue) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_value_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListValue.ProtoReflect.Descriptor instead. func (*ListValue) Descriptor() ([]byte, []int) { return file_cel_expr_value_proto_rawDescGZIP(), []int{2} } func (x *ListValue) GetValues() []*Value { if x != nil { return x.Values } return nil } type MapValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Entries []*MapValue_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` } func (x *MapValue) Reset() { *x = MapValue{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_value_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MapValue) String() string { return protoimpl.X.MessageStringOf(x) } func (*MapValue) ProtoMessage() {} func (x *MapValue) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_value_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use MapValue.ProtoReflect.Descriptor instead. func (*MapValue) Descriptor() ([]byte, []int) { return file_cel_expr_value_proto_rawDescGZIP(), []int{3} } func (x *MapValue) GetEntries() []*MapValue_Entry { if x != nil { return x.Entries } return nil } type MapValue_Entry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Key *Value `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` Value *Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } func (x *MapValue_Entry) Reset() { *x = MapValue_Entry{} if protoimpl.UnsafeEnabled { mi := &file_cel_expr_value_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MapValue_Entry) String() string { return protoimpl.X.MessageStringOf(x) } func (*MapValue_Entry) ProtoMessage() {} func (x *MapValue_Entry) ProtoReflect() protoreflect.Message { mi := &file_cel_expr_value_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use MapValue_Entry.ProtoReflect.Descriptor instead. func (*MapValue_Entry) Descriptor() ([]byte, []int) { return file_cel_expr_value_proto_rawDescGZIP(), []int{3, 0} } func (x *MapValue_Entry) GetKey() *Value { if x != nil { return x.Key } return nil } func (x *MapValue_Entry) GetValue() *Value { if x != nil { return x.Value } return nil } var File_cel_expr_value_proto protoreflect.FileDescriptor var file_cel_expr_value_proto_rawDesc = []byte{ 0x0a, 0x14, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9d, 0x04, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x74, 0x79, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x34, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x08, 0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x51, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2d, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_cel_expr_value_proto_rawDescOnce sync.Once file_cel_expr_value_proto_rawDescData = file_cel_expr_value_proto_rawDesc ) func file_cel_expr_value_proto_rawDescGZIP() []byte { file_cel_expr_value_proto_rawDescOnce.Do(func() { file_cel_expr_value_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_value_proto_rawDescData) }) return file_cel_expr_value_proto_rawDescData } var file_cel_expr_value_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_cel_expr_value_proto_goTypes = []interface{}{ (*Value)(nil), // 0: cel.expr.Value (*EnumValue)(nil), // 1: cel.expr.EnumValue (*ListValue)(nil), // 2: cel.expr.ListValue (*MapValue)(nil), // 3: cel.expr.MapValue (*MapValue_Entry)(nil), // 4: cel.expr.MapValue.Entry (structpb.NullValue)(0), // 5: google.protobuf.NullValue (*anypb.Any)(nil), // 6: google.protobuf.Any } var file_cel_expr_value_proto_depIdxs = []int32{ 5, // 0: cel.expr.Value.null_value:type_name -> google.protobuf.NullValue 1, // 1: cel.expr.Value.enum_value:type_name -> cel.expr.EnumValue 6, // 2: cel.expr.Value.object_value:type_name -> google.protobuf.Any 3, // 3: cel.expr.Value.map_value:type_name -> cel.expr.MapValue 2, // 4: cel.expr.Value.list_value:type_name -> cel.expr.ListValue 0, // 5: cel.expr.ListValue.values:type_name -> cel.expr.Value 4, // 6: cel.expr.MapValue.entries:type_name -> cel.expr.MapValue.Entry 0, // 7: cel.expr.MapValue.Entry.key:type_name -> cel.expr.Value 0, // 8: cel.expr.MapValue.Entry.value:type_name -> cel.expr.Value 9, // [9:9] is the sub-list for method output_type 9, // [9:9] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name } func init() { file_cel_expr_value_proto_init() } func file_cel_expr_value_proto_init() { if File_cel_expr_value_proto != nil { return } if !protoimpl.UnsafeEnabled { file_cel_expr_value_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Value); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_value_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnumValue); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_value_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListValue); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_value_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MapValue); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_cel_expr_value_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MapValue_Entry); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } file_cel_expr_value_proto_msgTypes[0].OneofWrappers = []interface{}{ (*Value_NullValue)(nil), (*Value_BoolValue)(nil), (*Value_Int64Value)(nil), (*Value_Uint64Value)(nil), (*Value_DoubleValue)(nil), (*Value_StringValue)(nil), (*Value_BytesValue)(nil), (*Value_EnumValue)(nil), (*Value_ObjectValue)(nil), (*Value_MapValue)(nil), (*Value_ListValue)(nil), (*Value_TypeValue)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cel_expr_value_proto_rawDesc, NumEnums: 0, NumMessages: 5, NumExtensions: 0, NumServices: 0, }, GoTypes: file_cel_expr_value_proto_goTypes, DependencyIndexes: file_cel_expr_value_proto_depIdxs, MessageInfos: file_cel_expr_value_proto_msgTypes, }.Build() File_cel_expr_value_proto = out.File file_cel_expr_value_proto_rawDesc = nil file_cel_expr_value_proto_goTypes = nil file_cel_expr_value_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/cloud.google.com/go/auth/CHANGES.md ================================================ # Changelog ## [0.16.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.16.0...auth/v0.16.1) (2025-04-23) ### Bug Fixes * **auth:** Clone detectopts before assigning TokenBindingType ([#11881](https://github.com/googleapis/google-cloud-go/issues/11881)) ([2167b02](https://github.com/googleapis/google-cloud-go/commit/2167b020fdc43b517c2b6ecca264a10e357ea035)) ## [0.16.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.15.0...auth/v0.16.0) (2025-04-14) ### Features * **auth/credentials:** Return X.509 certificate chain as subject token ([#11948](https://github.com/googleapis/google-cloud-go/issues/11948)) ([d445a3f](https://github.com/googleapis/google-cloud-go/commit/d445a3f66272ffd5c39c4939af9bebad4582631c)), refs [#11757](https://github.com/googleapis/google-cloud-go/issues/11757) * **auth:** Configure DirectPath bound credentials from AllowedHardBoundTokens ([#11665](https://github.com/googleapis/google-cloud-go/issues/11665)) ([0fc40bc](https://github.com/googleapis/google-cloud-go/commit/0fc40bcf4e4673704df0973e9fa65957395d7bb4)) ### Bug Fixes * **auth:** Allow non-default SA credentials for DP ([#11828](https://github.com/googleapis/google-cloud-go/issues/11828)) ([3a996b4](https://github.com/googleapis/google-cloud-go/commit/3a996b4129e6d0a34dfda6671f535d5aefb26a82)) * **auth:** Restore calling DialContext ([#11930](https://github.com/googleapis/google-cloud-go/issues/11930)) ([9ec9a29](https://github.com/googleapis/google-cloud-go/commit/9ec9a29494e93197edbaf45aba28984801e9770a)), refs [#11118](https://github.com/googleapis/google-cloud-go/issues/11118) ## [0.15.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.14.1...auth/v0.15.0) (2025-02-19) ### Features * **auth:** Add hard-bound token request to compute token provider. ([#11588](https://github.com/googleapis/google-cloud-go/issues/11588)) ([0e608bb](https://github.com/googleapis/google-cloud-go/commit/0e608bb5ac3d694c8ad36ca4340071d3a2c78699)) ## [0.14.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.14.0...auth/v0.14.1) (2025-01-24) ### Documentation * **auth:** Add warning about externally-provided credentials ([#11462](https://github.com/googleapis/google-cloud-go/issues/11462)) ([49fb6ff](https://github.com/googleapis/google-cloud-go/commit/49fb6ff4d754895f82c9c4d502fc7547d3b5a941)) ## [0.14.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.13.0...auth/v0.14.0) (2025-01-08) ### Features * **auth:** Add universe domain support to idtoken ([#11059](https://github.com/googleapis/google-cloud-go/issues/11059)) ([72add7e](https://github.com/googleapis/google-cloud-go/commit/72add7e9f8f455af695e8ef79212a4bd3122fb3a)) ### Bug Fixes * **auth/oauth2adapt:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9)) * **auth:** Fix copy of delegates in impersonate.NewIDTokenCredentials ([#11386](https://github.com/googleapis/google-cloud-go/issues/11386)) ([ff7ef8e](https://github.com/googleapis/google-cloud-go/commit/ff7ef8e7ade7171bce3e4f30ff10a2e9f6c27ca0)), refs [#11379](https://github.com/googleapis/google-cloud-go/issues/11379) * **auth:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9)) ## [0.13.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.12.1...auth/v0.13.0) (2024-12-13) ### Features * **auth:** Add logging support ([#11079](https://github.com/googleapis/google-cloud-go/issues/11079)) ([c80e31d](https://github.com/googleapis/google-cloud-go/commit/c80e31df5ecb33a810be3dfb9d9e27ac531aa91d)) * **auth:** Pass logger from auth layer to metadata package ([#11288](https://github.com/googleapis/google-cloud-go/issues/11288)) ([b552efd](https://github.com/googleapis/google-cloud-go/commit/b552efd6ab34e5dfded18438e0fbfd925805614f)) ### Bug Fixes * **auth:** Check compute cred type before non-default flag for DP ([#11255](https://github.com/googleapis/google-cloud-go/issues/11255)) ([4347ca1](https://github.com/googleapis/google-cloud-go/commit/4347ca141892be8ae813399b4b437662a103bc90)) ## [0.12.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.12.0...auth/v0.12.1) (2024-12-10) ### Bug Fixes * **auth:** Correct typo in link ([#11160](https://github.com/googleapis/google-cloud-go/issues/11160)) ([af6fb46](https://github.com/googleapis/google-cloud-go/commit/af6fb46d7cd694ddbe8c9d63bc4cdcd62b9fb2c1)) ## [0.12.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.11.0...auth/v0.12.0) (2024-12-04) ### Features * **auth:** Add support for providing custom certificate URL ([#11006](https://github.com/googleapis/google-cloud-go/issues/11006)) ([ebf3657](https://github.com/googleapis/google-cloud-go/commit/ebf36579724afb375d3974cf1da38f703e3b7dbc)), refs [#11005](https://github.com/googleapis/google-cloud-go/issues/11005) ### Bug Fixes * **auth:** Ensure endpoints are present in Validator ([#11209](https://github.com/googleapis/google-cloud-go/issues/11209)) ([106cd53](https://github.com/googleapis/google-cloud-go/commit/106cd53309facaef1b8ea78376179f523f6912b9)), refs [#11006](https://github.com/googleapis/google-cloud-go/issues/11006) [#11190](https://github.com/googleapis/google-cloud-go/issues/11190) [#11189](https://github.com/googleapis/google-cloud-go/issues/11189) [#11188](https://github.com/googleapis/google-cloud-go/issues/11188) ## [0.11.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.10.2...auth/v0.11.0) (2024-11-21) ### Features * **auth:** Add universe domain support to mTLS ([#11159](https://github.com/googleapis/google-cloud-go/issues/11159)) ([117748b](https://github.com/googleapis/google-cloud-go/commit/117748ba1cfd4ae62a6a4feb7e30951cb2bc9344)) ## [0.10.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.10.1...auth/v0.10.2) (2024-11-12) ### Bug Fixes * **auth:** Restore use of grpc.Dial ([#11118](https://github.com/googleapis/google-cloud-go/issues/11118)) ([2456b94](https://github.com/googleapis/google-cloud-go/commit/2456b943b7b8aaabd4d8bfb7572c0f477ae0db45)), refs [#7556](https://github.com/googleapis/google-cloud-go/issues/7556) ## [0.10.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.10.0...auth/v0.10.1) (2024-11-06) ### Bug Fixes * **auth:** Restore Application Default Credentials support to idtoken ([#11083](https://github.com/googleapis/google-cloud-go/issues/11083)) ([8771f2e](https://github.com/googleapis/google-cloud-go/commit/8771f2ea9807ab822083808e0678392edff3b4f2)) * **auth:** Skip impersonate universe domain check if empty ([#11086](https://github.com/googleapis/google-cloud-go/issues/11086)) ([87159c1](https://github.com/googleapis/google-cloud-go/commit/87159c1059d4a18d1367ce62746a838a94964ab6)) ## [0.10.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.9...auth/v0.10.0) (2024-10-30) ### Features * **auth:** Add universe domain support to credentials/impersonate ([#10953](https://github.com/googleapis/google-cloud-go/issues/10953)) ([e06cb64](https://github.com/googleapis/google-cloud-go/commit/e06cb6499f7eda3aef08ab18ff197016f667684b)) ## [0.9.9](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.8...auth/v0.9.9) (2024-10-22) ### Bug Fixes * **auth:** Fallback cert lookups for missing files ([#11013](https://github.com/googleapis/google-cloud-go/issues/11013)) ([bd76695](https://github.com/googleapis/google-cloud-go/commit/bd766957ec238b7c40ddbabb369e612dc9b07313)), refs [#10844](https://github.com/googleapis/google-cloud-go/issues/10844) * **auth:** Replace MDS endpoint universe_domain with universe-domain ([#11000](https://github.com/googleapis/google-cloud-go/issues/11000)) ([6a1586f](https://github.com/googleapis/google-cloud-go/commit/6a1586f2ce9974684affaea84e7b629313b4d114)) ## [0.9.8](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.7...auth/v0.9.8) (2024-10-09) ### Bug Fixes * **auth:** Restore OpenTelemetry handling in transports ([#10968](https://github.com/googleapis/google-cloud-go/issues/10968)) ([08c6d04](https://github.com/googleapis/google-cloud-go/commit/08c6d04901c1a20e219b2d86df41dbaa6d7d7b55)), refs [#10962](https://github.com/googleapis/google-cloud-go/issues/10962) * **auth:** Try talk to plaintext S2A if credentials can not be found for mTLS-S2A ([#10941](https://github.com/googleapis/google-cloud-go/issues/10941)) ([0f0bf2d](https://github.com/googleapis/google-cloud-go/commit/0f0bf2d18c97dd8b65bcf0099f0802b5631c6287)) ## [0.9.7](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.6...auth/v0.9.7) (2024-10-01) ### Bug Fixes * **auth:** Restore support for non-default service accounts for DirectPath ([#10937](https://github.com/googleapis/google-cloud-go/issues/10937)) ([a38650e](https://github.com/googleapis/google-cloud-go/commit/a38650edbf420223077498cafa537aec74b37aad)), refs [#10907](https://github.com/googleapis/google-cloud-go/issues/10907) ## [0.9.6](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.5...auth/v0.9.6) (2024-09-30) ### Bug Fixes * **auth:** Make aws credentials provider retrieve fresh credentials ([#10920](https://github.com/googleapis/google-cloud-go/issues/10920)) ([250fbf8](https://github.com/googleapis/google-cloud-go/commit/250fbf87d858d865e399a241b7e537c4ff0c3dd8)) ## [0.9.5](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.4...auth/v0.9.5) (2024-09-25) ### Bug Fixes * **auth:** Restore support for GOOGLE_CLOUD_UNIVERSE_DOMAIN env ([#10915](https://github.com/googleapis/google-cloud-go/issues/10915)) ([94caaaa](https://github.com/googleapis/google-cloud-go/commit/94caaaa061362d0e00ef6214afcc8a0a3e7ebfb2)) * **auth:** Skip directpath credentials overwrite when it's not on GCE ([#10833](https://github.com/googleapis/google-cloud-go/issues/10833)) ([7e5e8d1](https://github.com/googleapis/google-cloud-go/commit/7e5e8d10b761b0a6e43e19a028528db361bc07b1)) * **auth:** Use new context for non-blocking token refresh ([#10919](https://github.com/googleapis/google-cloud-go/issues/10919)) ([cf7102d](https://github.com/googleapis/google-cloud-go/commit/cf7102d33a21be1e5a9d47a49456b3a57c43b350)) ## [0.9.4](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.3...auth/v0.9.4) (2024-09-11) ### Bug Fixes * **auth:** Enable self-signed JWT for non-GDU universe domain ([#10831](https://github.com/googleapis/google-cloud-go/issues/10831)) ([f9869f7](https://github.com/googleapis/google-cloud-go/commit/f9869f7903cfd34d1b97c25d0dc5669d2c5138e6)) ## [0.9.3](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.2...auth/v0.9.3) (2024-09-03) ### Bug Fixes * **auth:** Choose quota project envvar over file when both present ([#10807](https://github.com/googleapis/google-cloud-go/issues/10807)) ([2d8dd77](https://github.com/googleapis/google-cloud-go/commit/2d8dd7700eff92d4b95027be55e26e1e7aa79181)), refs [#10804](https://github.com/googleapis/google-cloud-go/issues/10804) ## [0.9.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.1...auth/v0.9.2) (2024-08-30) ### Bug Fixes * **auth:** Handle non-Transport DefaultTransport ([#10733](https://github.com/googleapis/google-cloud-go/issues/10733)) ([98d91dc](https://github.com/googleapis/google-cloud-go/commit/98d91dc8316b247498fab41ab35e57a0446fe556)), refs [#10742](https://github.com/googleapis/google-cloud-go/issues/10742) * **auth:** Make sure quota option takes precedence over env/file ([#10797](https://github.com/googleapis/google-cloud-go/issues/10797)) ([f1b050d](https://github.com/googleapis/google-cloud-go/commit/f1b050d56d804b245cab048c2980d32b0eaceb4e)), refs [#10795](https://github.com/googleapis/google-cloud-go/issues/10795) ### Documentation * **auth:** Fix Go doc comment link ([#10751](https://github.com/googleapis/google-cloud-go/issues/10751)) ([015acfa](https://github.com/googleapis/google-cloud-go/commit/015acfab4d172650928bb1119bc2cd6307b9a437)) ## [0.9.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.9.0...auth/v0.9.1) (2024-08-22) ### Bug Fixes * **auth:** Setting expireEarly to default when the value is 0 ([#10732](https://github.com/googleapis/google-cloud-go/issues/10732)) ([5e67869](https://github.com/googleapis/google-cloud-go/commit/5e67869a31e9e8ecb4eeebd2cfa11a761c3b1948)) ## [0.9.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.8.1...auth/v0.9.0) (2024-08-16) ### Features * **auth:** Auth library can talk to S2A over mTLS ([#10634](https://github.com/googleapis/google-cloud-go/issues/10634)) ([5250a13](https://github.com/googleapis/google-cloud-go/commit/5250a13ec95b8d4eefbe0158f82857ff2189cb45)) ## [0.8.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.8.0...auth/v0.8.1) (2024-08-13) ### Bug Fixes * **auth:** Make default client creation more lenient ([#10669](https://github.com/googleapis/google-cloud-go/issues/10669)) ([1afb9ee](https://github.com/googleapis/google-cloud-go/commit/1afb9ee1ee9de9810722800018133304a0ca34d1)), refs [#10638](https://github.com/googleapis/google-cloud-go/issues/10638) ## [0.8.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.3...auth/v0.8.0) (2024-08-07) ### Features * **auth:** Adds support for X509 workload identity federation ([#10373](https://github.com/googleapis/google-cloud-go/issues/10373)) ([5d07505](https://github.com/googleapis/google-cloud-go/commit/5d075056cbe27bb1da4072a26070c41f8999eb9b)) ## [0.7.3](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.2...auth/v0.7.3) (2024-08-01) ### Bug Fixes * **auth/oauth2adapt:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758)) * **auth:** Disable automatic universe domain check for MDS ([#10620](https://github.com/googleapis/google-cloud-go/issues/10620)) ([7cea5ed](https://github.com/googleapis/google-cloud-go/commit/7cea5edd5a0c1e6bca558696f5607879141910e8)) * **auth:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758)) ## [0.7.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.1...auth/v0.7.2) (2024-07-22) ### Bug Fixes * **auth:** Use default client for universe metadata lookup ([#10551](https://github.com/googleapis/google-cloud-go/issues/10551)) ([d9046fd](https://github.com/googleapis/google-cloud-go/commit/d9046fdd1435d1ce48f374806c1def4cb5ac6cd3)), refs [#10544](https://github.com/googleapis/google-cloud-go/issues/10544) ## [0.7.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.0...auth/v0.7.1) (2024-07-10) ### Bug Fixes * **auth:** Bump google.golang.org/grpc@v1.64.1 ([8ecc4e9](https://github.com/googleapis/google-cloud-go/commit/8ecc4e9622e5bbe9b90384d5848ab816027226c5)) ## [0.7.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.6.1...auth/v0.7.0) (2024-07-09) ### Features * **auth:** Add workload X509 cert provider as a default cert provider ([#10479](https://github.com/googleapis/google-cloud-go/issues/10479)) ([c51ee6c](https://github.com/googleapis/google-cloud-go/commit/c51ee6cf65ce05b4d501083e49d468c75ac1ea63)) ### Bug Fixes * **auth/oauth2adapt:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b)) * **auth:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b)) * **auth:** Check len of slices, not non-nil ([#10483](https://github.com/googleapis/google-cloud-go/issues/10483)) ([0a966a1](https://github.com/googleapis/google-cloud-go/commit/0a966a183e5f0e811977216d736d875b7233e942)) ## [0.6.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.6.0...auth/v0.6.1) (2024-07-01) ### Bug Fixes * **auth:** Support gRPC API keys ([#10460](https://github.com/googleapis/google-cloud-go/issues/10460)) ([daa6646](https://github.com/googleapis/google-cloud-go/commit/daa6646d2af5d7fb5b30489f4934c7db89868c7c)) * **auth:** Update http and grpc transports to support token exchange over mTLS ([#10397](https://github.com/googleapis/google-cloud-go/issues/10397)) ([c6dfdcf](https://github.com/googleapis/google-cloud-go/commit/c6dfdcf893c3f971eba15026c12db0a960ae81f2)) ## [0.6.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.5.2...auth/v0.6.0) (2024-06-25) ### Features * **auth:** Add non-blocking token refresh for compute MDS ([#10263](https://github.com/googleapis/google-cloud-go/issues/10263)) ([9ac350d](https://github.com/googleapis/google-cloud-go/commit/9ac350da11a49b8e2174d3fc5b1a5070fec78b4e)) ### Bug Fixes * **auth:** Return error if envvar detected file returns an error ([#10431](https://github.com/googleapis/google-cloud-go/issues/10431)) ([e52b9a7](https://github.com/googleapis/google-cloud-go/commit/e52b9a7c45468827f5d220ab00965191faeb9d05)) ## [0.5.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.5.1...auth/v0.5.2) (2024-06-24) ### Bug Fixes * **auth:** Fetch initial token when CachedTokenProviderOptions.DisableAutoRefresh is true ([#10415](https://github.com/googleapis/google-cloud-go/issues/10415)) ([3266763](https://github.com/googleapis/google-cloud-go/commit/32667635ca2efad05cd8c087c004ca07d7406913)), refs [#10414](https://github.com/googleapis/google-cloud-go/issues/10414) ## [0.5.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.5.0...auth/v0.5.1) (2024-05-31) ### Bug Fixes * **auth:** Pass through client to 2LO and 3LO flows ([#10290](https://github.com/googleapis/google-cloud-go/issues/10290)) ([685784e](https://github.com/googleapis/google-cloud-go/commit/685784ea84358c15e9214bdecb307d37aa3b6d2f)) ## [0.5.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.4.2...auth/v0.5.0) (2024-05-28) ### Features * **auth:** Adds X509 workload certificate provider ([#10233](https://github.com/googleapis/google-cloud-go/issues/10233)) ([17a9db7](https://github.com/googleapis/google-cloud-go/commit/17a9db73af35e3d1a7a25ac4fd1377a103de6150)) ## [0.4.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.4.1...auth/v0.4.2) (2024-05-16) ### Bug Fixes * **auth:** Enable client certificates by default only for GDU ([#10151](https://github.com/googleapis/google-cloud-go/issues/10151)) ([7c52978](https://github.com/googleapis/google-cloud-go/commit/7c529786275a39b7e00525f7d5e7be0d963e9e15)) * **auth:** Handle non-Transport DefaultTransport ([#10162](https://github.com/googleapis/google-cloud-go/issues/10162)) ([fa3bfdb](https://github.com/googleapis/google-cloud-go/commit/fa3bfdb23aaa45b34394a8b61e753b3587506782)), refs [#10159](https://github.com/googleapis/google-cloud-go/issues/10159) * **auth:** Have refresh time match docs ([#10147](https://github.com/googleapis/google-cloud-go/issues/10147)) ([bcb5568](https://github.com/googleapis/google-cloud-go/commit/bcb5568c07a54dd3d2e869d15f502b0741a609e8)) * **auth:** Update compute token fetching error with named prefix ([#10180](https://github.com/googleapis/google-cloud-go/issues/10180)) ([4573504](https://github.com/googleapis/google-cloud-go/commit/4573504828d2928bebedc875d87650ba227829ea)) ## [0.4.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.4.0...auth/v0.4.1) (2024-05-09) ### Bug Fixes * **auth:** Don't try to detect default creds it opt configured ([#10143](https://github.com/googleapis/google-cloud-go/issues/10143)) ([804632e](https://github.com/googleapis/google-cloud-go/commit/804632e7c5b0b85ff522f7951114485e256eb5bc)) ## [0.4.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.3.0...auth/v0.4.0) (2024-05-07) ### Features * **auth:** Enable client certificates by default ([#10102](https://github.com/googleapis/google-cloud-go/issues/10102)) ([9013e52](https://github.com/googleapis/google-cloud-go/commit/9013e5200a6ec0f178ed91acb255481ffb073a2c)) ### Bug Fixes * **auth:** Get s2a logic up to date ([#10093](https://github.com/googleapis/google-cloud-go/issues/10093)) ([4fe9ae4](https://github.com/googleapis/google-cloud-go/commit/4fe9ae4b7101af2a5221d6d6b2e77b479305bb06)) ## [0.3.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.2.2...auth/v0.3.0) (2024-04-23) ### Features * **auth/httptransport:** Add ability to customize transport ([#10023](https://github.com/googleapis/google-cloud-go/issues/10023)) ([72c7f6b](https://github.com/googleapis/google-cloud-go/commit/72c7f6bbec3136cc7a62788fc7186bc33ef6c3b3)), refs [#9812](https://github.com/googleapis/google-cloud-go/issues/9812) [#9814](https://github.com/googleapis/google-cloud-go/issues/9814) ### Bug Fixes * **auth/credentials:** Error on bad file name if explicitly set ([#10018](https://github.com/googleapis/google-cloud-go/issues/10018)) ([55beaa9](https://github.com/googleapis/google-cloud-go/commit/55beaa993aaf052d8be39766afc6777c3c2a0bdd)), refs [#9809](https://github.com/googleapis/google-cloud-go/issues/9809) ## [0.2.2](https://github.com/googleapis/google-cloud-go/compare/auth/v0.2.1...auth/v0.2.2) (2024-04-19) ### Bug Fixes * **auth:** Add internal opt to skip validation on transports ([#9999](https://github.com/googleapis/google-cloud-go/issues/9999)) ([9e20ef8](https://github.com/googleapis/google-cloud-go/commit/9e20ef89f6287d6bd03b8697d5898dc43b4a77cf)), refs [#9823](https://github.com/googleapis/google-cloud-go/issues/9823) * **auth:** Set secure flag for gRPC conn pools ([#10002](https://github.com/googleapis/google-cloud-go/issues/10002)) ([14e3956](https://github.com/googleapis/google-cloud-go/commit/14e3956dfd736399731b5ee8d9b178ae085cf7ba)), refs [#9833](https://github.com/googleapis/google-cloud-go/issues/9833) ## [0.2.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.2.0...auth/v0.2.1) (2024-04-18) ### Bug Fixes * **auth:** Default gRPC token type to Bearer if not set ([#9800](https://github.com/googleapis/google-cloud-go/issues/9800)) ([5284066](https://github.com/googleapis/google-cloud-go/commit/5284066670b6fe65d79089cfe0199c9660f87fc7)) ## [0.2.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.1.1...auth/v0.2.0) (2024-04-15) ### Breaking Changes In the below mentioned commits there were a few large breaking changes since the last release of the module. 1. The `Credentials` type has been moved to the root of the module as it is becoming the core abstraction for the whole module. 2. Because of the above mentioned change many functions that previously returned a `TokenProvider` now return `Credentials`. Similarly, these functions have been renamed to be more specific. 3. Most places that used to take an optional `TokenProvider` now accept `Credentials`. You can make a `Credentials` from a `TokenProvider` using the constructor found in the `auth` package. 4. The `detect` package has been renamed to `credentials`. With this change some function signatures were also updated for better readability. 5. Derivative auth flows like `impersonate` and `downscope` have been moved to be under the new `credentials` package. Although these changes are disruptive we think that they are for the best of the long-term health of the module. We do not expect any more large breaking changes like these in future revisions, even before 1.0.0. This version will be the first version of the auth library that our client libraries start to use and depend on. ### Features * **auth/credentials/externalaccount:** Add default TokenURL ([#9700](https://github.com/googleapis/google-cloud-go/issues/9700)) ([81830e6](https://github.com/googleapis/google-cloud-go/commit/81830e6848ceefd055aa4d08f933d1154455a0f6)) * **auth:** Add downscope.Options.UniverseDomain ([#9634](https://github.com/googleapis/google-cloud-go/issues/9634)) ([52cf7d7](https://github.com/googleapis/google-cloud-go/commit/52cf7d780853594291c4e34302d618299d1f5a1d)) * **auth:** Add universe domain to grpctransport and httptransport ([#9663](https://github.com/googleapis/google-cloud-go/issues/9663)) ([67d353b](https://github.com/googleapis/google-cloud-go/commit/67d353beefe3b607c08c891876fbd95ab89e5fe3)), refs [#9670](https://github.com/googleapis/google-cloud-go/issues/9670) * **auth:** Add UniverseDomain to DetectOptions ([#9536](https://github.com/googleapis/google-cloud-go/issues/9536)) ([3618d3f](https://github.com/googleapis/google-cloud-go/commit/3618d3f7061615c0e189f376c75abc201203b501)) * **auth:** Make package externalaccount public ([#9633](https://github.com/googleapis/google-cloud-go/issues/9633)) ([a0978d8](https://github.com/googleapis/google-cloud-go/commit/a0978d8e96968399940ebd7d092539772bf9caac)) * **auth:** Move credentials to base auth package ([#9590](https://github.com/googleapis/google-cloud-go/issues/9590)) ([1a04baf](https://github.com/googleapis/google-cloud-go/commit/1a04bafa83c27342b9308d785645e1e5423ea10d)) * **auth:** Refactor public sigs to use Credentials ([#9603](https://github.com/googleapis/google-cloud-go/issues/9603)) ([69cb240](https://github.com/googleapis/google-cloud-go/commit/69cb240c530b1f7173a9af2555c19e9a1beb56c5)) ### Bug Fixes * **auth/oauth2adapt:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a)) * **auth:** Fix uint32 conversion ([9221c7f](https://github.com/googleapis/google-cloud-go/commit/9221c7fa12cef9d5fb7ddc92f41f1d6204971c7b)) * **auth:** Port sts expires fix ([#9618](https://github.com/googleapis/google-cloud-go/issues/9618)) ([7bec97b](https://github.com/googleapis/google-cloud-go/commit/7bec97b2f51ed3ac4f9b88bf100d301da3f5d1bd)) * **auth:** Read universe_domain from all credentials files ([#9632](https://github.com/googleapis/google-cloud-go/issues/9632)) ([16efbb5](https://github.com/googleapis/google-cloud-go/commit/16efbb52e39ea4a319e5ee1e95c0e0305b6d9824)) * **auth:** Remove content-type header from idms get requests ([#9508](https://github.com/googleapis/google-cloud-go/issues/9508)) ([8589f41](https://github.com/googleapis/google-cloud-go/commit/8589f41599d265d7c3d46a3d86c9fab2329cbdd9)) * **auth:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a)) ## [0.1.1](https://github.com/googleapis/google-cloud-go/compare/auth/v0.1.0...auth/v0.1.1) (2024-03-10) ### Bug Fixes * **auth/impersonate:** Properly send default detect params ([#9529](https://github.com/googleapis/google-cloud-go/issues/9529)) ([5b6b8be](https://github.com/googleapis/google-cloud-go/commit/5b6b8bef577f82707e51f5cc5d258d5bdf90218f)), refs [#9136](https://github.com/googleapis/google-cloud-go/issues/9136) * **auth:** Update grpc-go to v1.56.3 ([343cea8](https://github.com/googleapis/google-cloud-go/commit/343cea8c43b1e31ae21ad50ad31d3b0b60143f8c)) * **auth:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7)) ## 0.1.0 (2023-10-18) ### Features * **auth:** Add base auth package ([#8465](https://github.com/googleapis/google-cloud-go/issues/8465)) ([6a45f26](https://github.com/googleapis/google-cloud-go/commit/6a45f26b809b64edae21f312c18d4205f96b180e)) * **auth:** Add cert support to httptransport ([#8569](https://github.com/googleapis/google-cloud-go/issues/8569)) ([37e3435](https://github.com/googleapis/google-cloud-go/commit/37e3435f8e98595eafab481bdfcb31a4c56fa993)) * **auth:** Add Credentials.UniverseDomain() ([#8654](https://github.com/googleapis/google-cloud-go/issues/8654)) ([af0aa1e](https://github.com/googleapis/google-cloud-go/commit/af0aa1ed8015bc8fe0dd87a7549ae029107cbdb8)) * **auth:** Add detect package ([#8491](https://github.com/googleapis/google-cloud-go/issues/8491)) ([d977419](https://github.com/googleapis/google-cloud-go/commit/d977419a3269f6acc193df77a2136a6eb4b4add7)) * **auth:** Add downscope package ([#8532](https://github.com/googleapis/google-cloud-go/issues/8532)) ([dda9bff](https://github.com/googleapis/google-cloud-go/commit/dda9bff8ec70e6d104901b4105d13dcaa4e2404c)) * **auth:** Add grpctransport package ([#8625](https://github.com/googleapis/google-cloud-go/issues/8625)) ([69a8347](https://github.com/googleapis/google-cloud-go/commit/69a83470bdcc7ed10c6c36d1abc3b7cfdb8a0ee5)) * **auth:** Add httptransport package ([#8567](https://github.com/googleapis/google-cloud-go/issues/8567)) ([6898597](https://github.com/googleapis/google-cloud-go/commit/6898597d2ea95d630fcd00fd15c58c75ea843bff)) * **auth:** Add idtoken package ([#8580](https://github.com/googleapis/google-cloud-go/issues/8580)) ([a79e693](https://github.com/googleapis/google-cloud-go/commit/a79e693e97e4e3e1c6742099af3dbc58866d88fe)) * **auth:** Add impersonate package ([#8578](https://github.com/googleapis/google-cloud-go/issues/8578)) ([e29ba0c](https://github.com/googleapis/google-cloud-go/commit/e29ba0cb7bd3888ab9e808087027dc5a32474c04)) * **auth:** Add support for external accounts in detect ([#8508](https://github.com/googleapis/google-cloud-go/issues/8508)) ([62210d5](https://github.com/googleapis/google-cloud-go/commit/62210d5d3e56e8e9f35db8e6ac0defec19582507)) * **auth:** Port external account changes ([#8697](https://github.com/googleapis/google-cloud-go/issues/8697)) ([5823db5](https://github.com/googleapis/google-cloud-go/commit/5823db5d633069999b58b9131a7f9cd77e82c899)) ### Bug Fixes * **auth/oauth2adapt:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d)) * **auth:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d)) ================================================ FILE: vendor/cloud.google.com/go/auth/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/cloud.google.com/go/auth/README.md ================================================ # Google Auth Library for Go [![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/auth.svg)](https://pkg.go.dev/cloud.google.com/go/auth) ## Install ``` bash go get cloud.google.com/go/auth@latest ``` ## Usage The most common way this library is used is transitively, by default, from any of our Go client libraries. ### Notable use-cases - To create a credential directly please see examples in the [credentials](https://pkg.go.dev/cloud.google.com/go/auth/credentials) package. - To create a authenticated HTTP client please see examples in the [httptransport](https://pkg.go.dev/cloud.google.com/go/auth/httptransport) package. - To create a authenticated gRPC connection please see examples in the [grpctransport](https://pkg.go.dev/cloud.google.com/go/auth/grpctransport) package. - To create an ID token please see examples in the [idtoken](https://pkg.go.dev/cloud.google.com/go/auth/credentials/idtoken) package. ## Contributing Contributions are welcome. Please, see the [CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md) document for details. Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms. See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md#contributor-code-of-conduct) for more information. ================================================ FILE: vendor/cloud.google.com/go/auth/auth.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package auth provides utilities for managing Google Cloud credentials, // including functionality for creating, caching, and refreshing OAuth2 tokens. // It offers customizable options for different OAuth2 flows, such as 2-legged // (2LO) and 3-legged (3LO) OAuth, along with support for PKCE and automatic // token management. package auth import ( "context" "encoding/json" "errors" "fmt" "log/slog" "net/http" "net/url" "strings" "sync" "time" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/jwt" "github.com/googleapis/gax-go/v2/internallog" ) const ( // Parameter keys for AuthCodeURL method to support PKCE. codeChallengeKey = "code_challenge" codeChallengeMethodKey = "code_challenge_method" // Parameter key for Exchange method to support PKCE. codeVerifierKey = "code_verifier" // 3 minutes and 45 seconds before expiration. The shortest MDS cache is 4 minutes, // so we give it 15 seconds to refresh it's cache before attempting to refresh a token. defaultExpiryDelta = 225 * time.Second universeDomainDefault = "googleapis.com" ) // tokenState represents different states for a [Token]. type tokenState int const ( // fresh indicates that the [Token] is valid. It is not expired or close to // expired, or the token has no expiry. fresh tokenState = iota // stale indicates that the [Token] is close to expired, and should be // refreshed. The token can be used normally. stale // invalid indicates that the [Token] is expired or invalid. The token // cannot be used for a normal operation. invalid ) var ( defaultGrantType = "urn:ietf:params:oauth:grant-type:jwt-bearer" defaultHeader = &jwt.Header{Algorithm: jwt.HeaderAlgRSA256, Type: jwt.HeaderType} // for testing timeNow = time.Now ) // TokenProvider specifies an interface for anything that can return a token. type TokenProvider interface { // Token returns a Token or an error. // The Token returned must be safe to use // concurrently. // The returned Token must not be modified. // The context provided must be sent along to any requests that are made in // the implementing code. Token(context.Context) (*Token, error) } // Token holds the credential token used to authorized requests. All fields are // considered read-only. type Token struct { // Value is the token used to authorize requests. It is usually an access // token but may be other types of tokens such as ID tokens in some flows. Value string // Type is the type of token Value is. If uninitialized, it should be // assumed to be a "Bearer" token. Type string // Expiry is the time the token is set to expire. Expiry time.Time // Metadata may include, but is not limited to, the body of the token // response returned by the server. Metadata map[string]interface{} // TODO(codyoss): maybe make a method to flatten metadata to avoid []string for url.Values } // IsValid reports that a [Token] is non-nil, has a [Token.Value], and has not // expired. A token is considered expired if [Token.Expiry] has passed or will // pass in the next 225 seconds. func (t *Token) IsValid() bool { return t.isValidWithEarlyExpiry(defaultExpiryDelta) } // MetadataString is a convenience method for accessing string values in the // token's metadata. Returns an empty string if the metadata is nil or the value // for the given key cannot be cast to a string. func (t *Token) MetadataString(k string) string { if t.Metadata == nil { return "" } s, ok := t.Metadata[k].(string) if !ok { return "" } return s } func (t *Token) isValidWithEarlyExpiry(earlyExpiry time.Duration) bool { if t.isEmpty() { return false } if t.Expiry.IsZero() { return true } return !t.Expiry.Round(0).Add(-earlyExpiry).Before(timeNow()) } func (t *Token) isEmpty() bool { return t == nil || t.Value == "" } // Credentials holds Google credentials, including // [Application Default Credentials]. // // [Application Default Credentials]: https://developers.google.com/accounts/docs/application-default-credentials type Credentials struct { json []byte projectID CredentialsPropertyProvider quotaProjectID CredentialsPropertyProvider // universeDomain is the default service domain for a given Cloud universe. universeDomain CredentialsPropertyProvider TokenProvider } // JSON returns the bytes associated with the the file used to source // credentials if one was used. func (c *Credentials) JSON() []byte { return c.json } // ProjectID returns the associated project ID from the underlying file or // environment. func (c *Credentials) ProjectID(ctx context.Context) (string, error) { if c.projectID == nil { return internal.GetProjectID(c.json, ""), nil } v, err := c.projectID.GetProperty(ctx) if err != nil { return "", err } return internal.GetProjectID(c.json, v), nil } // QuotaProjectID returns the associated quota project ID from the underlying // file or environment. func (c *Credentials) QuotaProjectID(ctx context.Context) (string, error) { if c.quotaProjectID == nil { return internal.GetQuotaProject(c.json, ""), nil } v, err := c.quotaProjectID.GetProperty(ctx) if err != nil { return "", err } return internal.GetQuotaProject(c.json, v), nil } // UniverseDomain returns the default service domain for a given Cloud universe. // The default value is "googleapis.com". func (c *Credentials) UniverseDomain(ctx context.Context) (string, error) { if c.universeDomain == nil { return universeDomainDefault, nil } v, err := c.universeDomain.GetProperty(ctx) if err != nil { return "", err } if v == "" { return universeDomainDefault, nil } return v, err } // CredentialsPropertyProvider provides an implementation to fetch a property // value for [Credentials]. type CredentialsPropertyProvider interface { GetProperty(context.Context) (string, error) } // CredentialsPropertyFunc is a type adapter to allow the use of ordinary // functions as a [CredentialsPropertyProvider]. type CredentialsPropertyFunc func(context.Context) (string, error) // GetProperty loads the properly value provided the given context. func (p CredentialsPropertyFunc) GetProperty(ctx context.Context) (string, error) { return p(ctx) } // CredentialsOptions are used to configure [Credentials]. type CredentialsOptions struct { // TokenProvider is a means of sourcing a token for the credentials. Required. TokenProvider TokenProvider // JSON is the raw contents of the credentials file if sourced from a file. JSON []byte // ProjectIDProvider resolves the project ID associated with the // credentials. ProjectIDProvider CredentialsPropertyProvider // QuotaProjectIDProvider resolves the quota project ID associated with the // credentials. QuotaProjectIDProvider CredentialsPropertyProvider // UniverseDomainProvider resolves the universe domain with the credentials. UniverseDomainProvider CredentialsPropertyProvider } // NewCredentials returns new [Credentials] from the provided options. func NewCredentials(opts *CredentialsOptions) *Credentials { creds := &Credentials{ TokenProvider: opts.TokenProvider, json: opts.JSON, projectID: opts.ProjectIDProvider, quotaProjectID: opts.QuotaProjectIDProvider, universeDomain: opts.UniverseDomainProvider, } return creds } // CachedTokenProviderOptions provides options for configuring a cached // [TokenProvider]. type CachedTokenProviderOptions struct { // DisableAutoRefresh makes the TokenProvider always return the same token, // even if it is expired. The default is false. Optional. DisableAutoRefresh bool // ExpireEarly configures the amount of time before a token expires, that it // should be refreshed. If unset, the default value is 3 minutes and 45 // seconds. Optional. ExpireEarly time.Duration // DisableAsyncRefresh configures a synchronous workflow that refreshes // tokens in a blocking manner. The default is false. Optional. DisableAsyncRefresh bool } func (ctpo *CachedTokenProviderOptions) autoRefresh() bool { if ctpo == nil { return true } return !ctpo.DisableAutoRefresh } func (ctpo *CachedTokenProviderOptions) expireEarly() time.Duration { if ctpo == nil || ctpo.ExpireEarly == 0 { return defaultExpiryDelta } return ctpo.ExpireEarly } func (ctpo *CachedTokenProviderOptions) blockingRefresh() bool { if ctpo == nil { return false } return ctpo.DisableAsyncRefresh } // NewCachedTokenProvider wraps a [TokenProvider] to cache the tokens returned // by the underlying provider. By default it will refresh tokens asynchronously // a few minutes before they expire. func NewCachedTokenProvider(tp TokenProvider, opts *CachedTokenProviderOptions) TokenProvider { if ctp, ok := tp.(*cachedTokenProvider); ok { return ctp } return &cachedTokenProvider{ tp: tp, autoRefresh: opts.autoRefresh(), expireEarly: opts.expireEarly(), blockingRefresh: opts.blockingRefresh(), } } type cachedTokenProvider struct { tp TokenProvider autoRefresh bool expireEarly time.Duration blockingRefresh bool mu sync.Mutex cachedToken *Token // isRefreshRunning ensures that the non-blocking refresh will only be // attempted once, even if multiple callers enter the Token method. isRefreshRunning bool // isRefreshErr ensures that the non-blocking refresh will only be attempted // once per refresh window if an error is encountered. isRefreshErr bool } func (c *cachedTokenProvider) Token(ctx context.Context) (*Token, error) { if c.blockingRefresh { return c.tokenBlocking(ctx) } return c.tokenNonBlocking(ctx) } func (c *cachedTokenProvider) tokenNonBlocking(ctx context.Context) (*Token, error) { switch c.tokenState() { case fresh: c.mu.Lock() defer c.mu.Unlock() return c.cachedToken, nil case stale: // Call tokenAsync with a new Context because the user-provided context // may have a short timeout incompatible with async token refresh. c.tokenAsync(context.Background()) // Return the stale token immediately to not block customer requests to Cloud services. c.mu.Lock() defer c.mu.Unlock() return c.cachedToken, nil default: // invalid return c.tokenBlocking(ctx) } } // tokenState reports the token's validity. func (c *cachedTokenProvider) tokenState() tokenState { c.mu.Lock() defer c.mu.Unlock() t := c.cachedToken now := timeNow() if t == nil || t.Value == "" { return invalid } else if t.Expiry.IsZero() { return fresh } else if now.After(t.Expiry.Round(0)) { return invalid } else if now.After(t.Expiry.Round(0).Add(-c.expireEarly)) { return stale } return fresh } // tokenAsync uses a bool to ensure that only one non-blocking token refresh // happens at a time, even if multiple callers have entered this function // concurrently. This avoids creating an arbitrary number of concurrent // goroutines. Retries should be attempted and managed within the Token method. // If the refresh attempt fails, no further attempts are made until the refresh // window expires and the token enters the invalid state, at which point the // blocking call to Token should likely return the same error on the main goroutine. func (c *cachedTokenProvider) tokenAsync(ctx context.Context) { fn := func() { c.mu.Lock() c.isRefreshRunning = true c.mu.Unlock() t, err := c.tp.Token(ctx) c.mu.Lock() defer c.mu.Unlock() c.isRefreshRunning = false if err != nil { // Discard errors from the non-blocking refresh, but prevent further // attempts. c.isRefreshErr = true return } c.cachedToken = t } c.mu.Lock() defer c.mu.Unlock() if !c.isRefreshRunning && !c.isRefreshErr { go fn() } } func (c *cachedTokenProvider) tokenBlocking(ctx context.Context) (*Token, error) { c.mu.Lock() defer c.mu.Unlock() c.isRefreshErr = false if c.cachedToken.IsValid() || (!c.autoRefresh && !c.cachedToken.isEmpty()) { return c.cachedToken, nil } t, err := c.tp.Token(ctx) if err != nil { return nil, err } c.cachedToken = t return t, nil } // Error is a error associated with retrieving a [Token]. It can hold useful // additional details for debugging. type Error struct { // Response is the HTTP response associated with error. The body will always // be already closed and consumed. Response *http.Response // Body is the HTTP response body. Body []byte // Err is the underlying wrapped error. Err error // code returned in the token response code string // description returned in the token response description string // uri returned in the token response uri string } func (e *Error) Error() string { if e.code != "" { s := fmt.Sprintf("auth: %q", e.code) if e.description != "" { s += fmt.Sprintf(" %q", e.description) } if e.uri != "" { s += fmt.Sprintf(" %q", e.uri) } return s } return fmt.Sprintf("auth: cannot fetch token: %v\nResponse: %s", e.Response.StatusCode, e.Body) } // Temporary returns true if the error is considered temporary and may be able // to be retried. func (e *Error) Temporary() bool { if e.Response == nil { return false } sc := e.Response.StatusCode return sc == http.StatusInternalServerError || sc == http.StatusServiceUnavailable || sc == http.StatusRequestTimeout || sc == http.StatusTooManyRequests } func (e *Error) Unwrap() error { return e.Err } // Style describes how the token endpoint wants to receive the ClientID and // ClientSecret. type Style int const ( // StyleUnknown means the value has not been initiated. Sending this in // a request will cause the token exchange to fail. StyleUnknown Style = iota // StyleInParams sends client info in the body of a POST request. StyleInParams // StyleInHeader sends client info using Basic Authorization header. StyleInHeader ) // Options2LO is the configuration settings for doing a 2-legged JWT OAuth2 flow. type Options2LO struct { // Email is the OAuth2 client ID. This value is set as the "iss" in the // JWT. Email string // PrivateKey contains the contents of an RSA private key or the // contents of a PEM file that contains a private key. It is used to sign // the JWT created. PrivateKey []byte // TokenURL is th URL the JWT is sent to. Required. TokenURL string // PrivateKeyID is the ID of the key used to sign the JWT. It is used as the // "kid" in the JWT header. Optional. PrivateKeyID string // Subject is the used for to impersonate a user. It is used as the "sub" in // the JWT.m Optional. Subject string // Scopes specifies requested permissions for the token. Optional. Scopes []string // Expires specifies the lifetime of the token. Optional. Expires time.Duration // Audience specifies the "aud" in the JWT. Optional. Audience string // PrivateClaims allows specifying any custom claims for the JWT. Optional. PrivateClaims map[string]interface{} // Client is the client to be used to make the underlying token requests. // Optional. Client *http.Client // UseIDToken requests that the token returned be an ID token if one is // returned from the server. Optional. UseIDToken bool // Logger is used for debug logging. If provided, logging will be enabled // at the loggers configured level. By default logging is disabled unless // enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default // logger will be used. Optional. Logger *slog.Logger } func (o *Options2LO) client() *http.Client { if o.Client != nil { return o.Client } return internal.DefaultClient() } func (o *Options2LO) validate() error { if o == nil { return errors.New("auth: options must be provided") } if o.Email == "" { return errors.New("auth: email must be provided") } if len(o.PrivateKey) == 0 { return errors.New("auth: private key must be provided") } if o.TokenURL == "" { return errors.New("auth: token URL must be provided") } return nil } // New2LOTokenProvider returns a [TokenProvider] from the provided options. func New2LOTokenProvider(opts *Options2LO) (TokenProvider, error) { if err := opts.validate(); err != nil { return nil, err } return tokenProvider2LO{opts: opts, Client: opts.client(), logger: internallog.New(opts.Logger)}, nil } type tokenProvider2LO struct { opts *Options2LO Client *http.Client logger *slog.Logger } func (tp tokenProvider2LO) Token(ctx context.Context) (*Token, error) { pk, err := internal.ParseKey(tp.opts.PrivateKey) if err != nil { return nil, err } claimSet := &jwt.Claims{ Iss: tp.opts.Email, Scope: strings.Join(tp.opts.Scopes, " "), Aud: tp.opts.TokenURL, AdditionalClaims: tp.opts.PrivateClaims, Sub: tp.opts.Subject, } if t := tp.opts.Expires; t > 0 { claimSet.Exp = time.Now().Add(t).Unix() } if aud := tp.opts.Audience; aud != "" { claimSet.Aud = aud } h := *defaultHeader h.KeyID = tp.opts.PrivateKeyID payload, err := jwt.EncodeJWS(&h, claimSet, pk) if err != nil { return nil, err } v := url.Values{} v.Set("grant_type", defaultGrantType) v.Set("assertion", payload) req, err := http.NewRequestWithContext(ctx, "POST", tp.opts.TokenURL, strings.NewReader(v.Encode())) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") tp.logger.DebugContext(ctx, "2LO token request", "request", internallog.HTTPRequest(req, []byte(v.Encode()))) resp, body, err := internal.DoRequest(tp.Client, req) if err != nil { return nil, fmt.Errorf("auth: cannot fetch token: %w", err) } tp.logger.DebugContext(ctx, "2LO token response", "response", internallog.HTTPResponse(resp, body)) if c := resp.StatusCode; c < http.StatusOK || c >= http.StatusMultipleChoices { return nil, &Error{ Response: resp, Body: body, } } // tokenRes is the JSON response body. var tokenRes struct { AccessToken string `json:"access_token"` TokenType string `json:"token_type"` IDToken string `json:"id_token"` ExpiresIn int64 `json:"expires_in"` } if err := json.Unmarshal(body, &tokenRes); err != nil { return nil, fmt.Errorf("auth: cannot fetch token: %w", err) } token := &Token{ Value: tokenRes.AccessToken, Type: tokenRes.TokenType, } token.Metadata = make(map[string]interface{}) json.Unmarshal(body, &token.Metadata) // no error checks for optional fields if secs := tokenRes.ExpiresIn; secs > 0 { token.Expiry = time.Now().Add(time.Duration(secs) * time.Second) } if v := tokenRes.IDToken; v != "" { // decode returned id token to get expiry claimSet, err := jwt.DecodeJWS(v) if err != nil { return nil, fmt.Errorf("auth: error decoding JWT token: %w", err) } token.Expiry = time.Unix(claimSet.Exp, 0) } if tp.opts.UseIDToken { if tokenRes.IDToken == "" { return nil, fmt.Errorf("auth: response doesn't have JWT token") } token.Value = tokenRes.IDToken } return token, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/compute.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package credentials import ( "context" "encoding/json" "errors" "fmt" "net/url" "strings" "time" "cloud.google.com/go/auth" "cloud.google.com/go/compute/metadata" ) var ( computeTokenMetadata = map[string]interface{}{ "auth.google.tokenSource": "compute-metadata", "auth.google.serviceAccount": "default", } computeTokenURI = "instance/service-accounts/default/token" ) // computeTokenProvider creates a [cloud.google.com/go/auth.TokenProvider] that // uses the metadata service to retrieve tokens. func computeTokenProvider(opts *DetectOptions, client *metadata.Client) auth.TokenProvider { return auth.NewCachedTokenProvider(&computeProvider{ scopes: opts.Scopes, client: client, tokenBindingType: opts.TokenBindingType, }, &auth.CachedTokenProviderOptions{ ExpireEarly: opts.EarlyTokenRefresh, DisableAsyncRefresh: opts.DisableAsyncRefresh, }) } // computeProvider fetches tokens from the google cloud metadata service. type computeProvider struct { scopes []string client *metadata.Client tokenBindingType TokenBindingType } type metadataTokenResp struct { AccessToken string `json:"access_token"` ExpiresInSec int `json:"expires_in"` TokenType string `json:"token_type"` } func (cs *computeProvider) Token(ctx context.Context) (*auth.Token, error) { tokenURI, err := url.Parse(computeTokenURI) if err != nil { return nil, err } hasScopes := len(cs.scopes) > 0 if hasScopes || cs.tokenBindingType != NoBinding { v := url.Values{} if hasScopes { v.Set("scopes", strings.Join(cs.scopes, ",")) } switch cs.tokenBindingType { case MTLSHardBinding: v.Set("transport", "mtls") v.Set("binding-enforcement", "on") case ALTSHardBinding: v.Set("transport", "alts") } tokenURI.RawQuery = v.Encode() } tokenJSON, err := cs.client.GetWithContext(ctx, tokenURI.String()) if err != nil { return nil, fmt.Errorf("credentials: cannot fetch token: %w", err) } var res metadataTokenResp if err := json.NewDecoder(strings.NewReader(tokenJSON)).Decode(&res); err != nil { return nil, fmt.Errorf("credentials: invalid token JSON from metadata: %w", err) } if res.ExpiresInSec == 0 || res.AccessToken == "" { return nil, errors.New("credentials: incomplete token received from metadata") } return &auth.Token{ Value: res.AccessToken, Type: res.TokenType, Expiry: time.Now().Add(time.Duration(res.ExpiresInSec) * time.Second), Metadata: computeTokenMetadata, }, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/detect.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package credentials import ( "context" "encoding/json" "errors" "fmt" "log/slog" "net/http" "os" "time" "cloud.google.com/go/auth" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/credsfile" "cloud.google.com/go/compute/metadata" "github.com/googleapis/gax-go/v2/internallog" ) const ( // jwtTokenURL is Google's OAuth 2.0 token URL to use with the JWT(2LO) flow. jwtTokenURL = "https://oauth2.googleapis.com/token" // Google's OAuth 2.0 default endpoints. googleAuthURL = "https://accounts.google.com/o/oauth2/auth" googleTokenURL = "https://oauth2.googleapis.com/token" // GoogleMTLSTokenURL is Google's default OAuth2.0 mTLS endpoint. GoogleMTLSTokenURL = "https://oauth2.mtls.googleapis.com/token" // Help on default credentials adcSetupURL = "https://cloud.google.com/docs/authentication/external/set-up-adc" ) var ( // for testing allowOnGCECheck = true ) // TokenBindingType specifies the type of binding used when requesting a token // whether to request a hard-bound token using mTLS or an instance identity // bound token using ALTS. type TokenBindingType int const ( // NoBinding specifies that requested tokens are not required to have a // binding. This is the default option. NoBinding TokenBindingType = iota // MTLSHardBinding specifies that a hard-bound token should be requested // using an mTLS with S2A channel. MTLSHardBinding // ALTSHardBinding specifies that an instance identity bound token should // be requested using an ALTS channel. ALTSHardBinding ) // OnGCE reports whether this process is running in Google Cloud. func OnGCE() bool { // TODO(codyoss): once all libs use this auth lib move metadata check here return allowOnGCECheck && metadata.OnGCE() } // DetectDefault searches for "Application Default Credentials" and returns // a credential based on the [DetectOptions] provided. // // It looks for credentials in the following places, preferring the first // location found: // // - A JSON file whose path is specified by the GOOGLE_APPLICATION_CREDENTIALS // environment variable. For workload identity federation, refer to // https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation // on how to generate the JSON configuration file for on-prem/non-Google // cloud platforms. // - A JSON file in a location known to the gcloud command-line tool. On // Windows, this is %APPDATA%/gcloud/application_default_credentials.json. On // other systems, $HOME/.config/gcloud/application_default_credentials.json. // - On Google Compute Engine, Google App Engine standard second generation // runtimes, and Google App Engine flexible environment, it fetches // credentials from the metadata server. func DetectDefault(opts *DetectOptions) (*auth.Credentials, error) { if err := opts.validate(); err != nil { return nil, err } if len(opts.CredentialsJSON) > 0 { return readCredentialsFileJSON(opts.CredentialsJSON, opts) } if opts.CredentialsFile != "" { return readCredentialsFile(opts.CredentialsFile, opts) } if filename := os.Getenv(credsfile.GoogleAppCredsEnvVar); filename != "" { creds, err := readCredentialsFile(filename, opts) if err != nil { return nil, err } return creds, nil } fileName := credsfile.GetWellKnownFileName() if b, err := os.ReadFile(fileName); err == nil { return readCredentialsFileJSON(b, opts) } if OnGCE() { metadataClient := metadata.NewWithOptions(&metadata.Options{ Logger: opts.logger(), }) return auth.NewCredentials(&auth.CredentialsOptions{ TokenProvider: computeTokenProvider(opts, metadataClient), ProjectIDProvider: auth.CredentialsPropertyFunc(func(ctx context.Context) (string, error) { return metadataClient.ProjectIDWithContext(ctx) }), UniverseDomainProvider: &internal.ComputeUniverseDomainProvider{ MetadataClient: metadataClient, }, }), nil } return nil, fmt.Errorf("credentials: could not find default credentials. See %v for more information", adcSetupURL) } // DetectOptions provides configuration for [DetectDefault]. type DetectOptions struct { // Scopes that credentials tokens should have. Example: // https://www.googleapis.com/auth/cloud-platform. Required if Audience is // not provided. Scopes []string // TokenBindingType specifies the type of binding used when requesting a // token whether to request a hard-bound token using mTLS or an instance // identity bound token using ALTS. Optional. TokenBindingType TokenBindingType // Audience that credentials tokens should have. Only applicable for 2LO // flows with service accounts. If specified, scopes should not be provided. Audience string // Subject is the user email used for [domain wide delegation](https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority). // Optional. Subject string // EarlyTokenRefresh configures how early before a token expires that it // should be refreshed. Once the token’s time until expiration has entered // this refresh window the token is considered valid but stale. If unset, // the default value is 3 minutes and 45 seconds. Optional. EarlyTokenRefresh time.Duration // DisableAsyncRefresh configures a synchronous workflow that refreshes // stale tokens while blocking. The default is false. Optional. DisableAsyncRefresh bool // AuthHandlerOptions configures an authorization handler and other options // for 3LO flows. It is required, and only used, for client credential // flows. AuthHandlerOptions *auth.AuthorizationHandlerOptions // TokenURL allows to set the token endpoint for user credential flows. If // unset the default value is: https://oauth2.googleapis.com/token. // Optional. TokenURL string // STSAudience is the audience sent to when retrieving an STS token. // Currently this only used for GDCH auth flow, for which it is required. STSAudience string // CredentialsFile overrides detection logic and sources a credential file // from the provided filepath. If provided, CredentialsJSON must not be. // Optional. // // Important: If you accept a credential configuration (credential // JSON/File/Stream) from an external source for authentication to Google // Cloud Platform, you must validate it before providing it to any Google // API or library. Providing an unvalidated credential configuration to // Google APIs can compromise the security of your systems and data. For // more information, refer to [Validate credential configurations from // external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials). CredentialsFile string // CredentialsJSON overrides detection logic and uses the JSON bytes as the // source for the credential. If provided, CredentialsFile must not be. // Optional. // // Important: If you accept a credential configuration (credential // JSON/File/Stream) from an external source for authentication to Google // Cloud Platform, you must validate it before providing it to any Google // API or library. Providing an unvalidated credential configuration to // Google APIs can compromise the security of your systems and data. For // more information, refer to [Validate credential configurations from // external sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials). CredentialsJSON []byte // UseSelfSignedJWT directs service account based credentials to create a // self-signed JWT with the private key found in the file, skipping any // network requests that would normally be made. Optional. UseSelfSignedJWT bool // Client configures the underlying client used to make network requests // when fetching tokens. Optional. Client *http.Client // UniverseDomain is the default service domain for a given Cloud universe. // The default value is "googleapis.com". This option is ignored for // authentication flows that do not support universe domain. Optional. UniverseDomain string // Logger is used for debug logging. If provided, logging will be enabled // at the loggers configured level. By default logging is disabled unless // enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default // logger will be used. Optional. Logger *slog.Logger } func (o *DetectOptions) validate() error { if o == nil { return errors.New("credentials: options must be provided") } if len(o.Scopes) > 0 && o.Audience != "" { return errors.New("credentials: both scopes and audience were provided") } if len(o.CredentialsJSON) > 0 && o.CredentialsFile != "" { return errors.New("credentials: both credentials file and JSON were provided") } return nil } func (o *DetectOptions) tokenURL() string { if o.TokenURL != "" { return o.TokenURL } return googleTokenURL } func (o *DetectOptions) scopes() []string { scopes := make([]string, len(o.Scopes)) copy(scopes, o.Scopes) return scopes } func (o *DetectOptions) client() *http.Client { if o.Client != nil { return o.Client } return internal.DefaultClient() } func (o *DetectOptions) logger() *slog.Logger { return internallog.New(o.Logger) } func readCredentialsFile(filename string, opts *DetectOptions) (*auth.Credentials, error) { b, err := os.ReadFile(filename) if err != nil { return nil, err } return readCredentialsFileJSON(b, opts) } func readCredentialsFileJSON(b []byte, opts *DetectOptions) (*auth.Credentials, error) { // attempt to parse jsonData as a Google Developers Console client_credentials.json. config := clientCredConfigFromJSON(b, opts) if config != nil { if config.AuthHandlerOpts == nil { return nil, errors.New("credentials: auth handler must be specified for this credential filetype") } tp, err := auth.New3LOTokenProvider(config) if err != nil { return nil, err } return auth.NewCredentials(&auth.CredentialsOptions{ TokenProvider: tp, JSON: b, }), nil } return fileCredentials(b, opts) } func clientCredConfigFromJSON(b []byte, opts *DetectOptions) *auth.Options3LO { var creds credsfile.ClientCredentialsFile var c *credsfile.Config3LO if err := json.Unmarshal(b, &creds); err != nil { return nil } switch { case creds.Web != nil: c = creds.Web case creds.Installed != nil: c = creds.Installed default: return nil } if len(c.RedirectURIs) < 1 { return nil } var handleOpts *auth.AuthorizationHandlerOptions if opts.AuthHandlerOptions != nil { handleOpts = &auth.AuthorizationHandlerOptions{ Handler: opts.AuthHandlerOptions.Handler, State: opts.AuthHandlerOptions.State, PKCEOpts: opts.AuthHandlerOptions.PKCEOpts, } } return &auth.Options3LO{ ClientID: c.ClientID, ClientSecret: c.ClientSecret, RedirectURL: c.RedirectURIs[0], Scopes: opts.scopes(), AuthURL: c.AuthURI, TokenURL: c.TokenURI, Client: opts.client(), Logger: opts.logger(), EarlyTokenExpiry: opts.EarlyTokenRefresh, AuthHandlerOpts: handleOpts, // TODO(codyoss): refactor this out. We need to add in auto-detection // for this use case. AuthStyle: auth.StyleInParams, } } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/doc.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package credentials provides support for making OAuth2 authorized and // authenticated HTTP requests to Google APIs. It supports the Web server flow, // client-side credentials, service accounts, Google Compute Engine service // accounts, Google App Engine service accounts and workload identity federation // from non-Google cloud platforms. // // A brief overview of the package follows. For more information, please read // https://developers.google.com/accounts/docs/OAuth2 // and // https://developers.google.com/accounts/docs/application-default-credentials. // For more information on using workload identity federation, refer to // https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation. // // # Credentials // // The [cloud.google.com/go/auth.Credentials] type represents Google // credentials, including Application Default Credentials. // // Use [DetectDefault] to obtain Application Default Credentials. // // Application Default Credentials support workload identity federation to // access Google Cloud resources from non-Google Cloud platforms including Amazon // Web Services (AWS), Microsoft Azure or any identity provider that supports // OpenID Connect (OIDC). Workload identity federation is recommended for // non-Google Cloud environments as it avoids the need to download, manage, and // store service account private keys locally. // // # Workforce Identity Federation // // For more information on this feature see [cloud.google.com/go/auth/credentials/externalaccount]. package credentials ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/filetypes.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package credentials import ( "errors" "fmt" "cloud.google.com/go/auth" "cloud.google.com/go/auth/credentials/internal/externalaccount" "cloud.google.com/go/auth/credentials/internal/externalaccountuser" "cloud.google.com/go/auth/credentials/internal/gdch" "cloud.google.com/go/auth/credentials/internal/impersonate" internalauth "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/credsfile" ) func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) { fileType, err := credsfile.ParseFileType(b) if err != nil { return nil, err } var projectID, universeDomain string var tp auth.TokenProvider switch fileType { case credsfile.ServiceAccountKey: f, err := credsfile.ParseServiceAccount(b) if err != nil { return nil, err } tp, err = handleServiceAccount(f, opts) if err != nil { return nil, err } projectID = f.ProjectID universeDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) case credsfile.UserCredentialsKey: f, err := credsfile.ParseUserCredentials(b) if err != nil { return nil, err } tp, err = handleUserCredential(f, opts) if err != nil { return nil, err } universeDomain = f.UniverseDomain case credsfile.ExternalAccountKey: f, err := credsfile.ParseExternalAccount(b) if err != nil { return nil, err } tp, err = handleExternalAccount(f, opts) if err != nil { return nil, err } universeDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) case credsfile.ExternalAccountAuthorizedUserKey: f, err := credsfile.ParseExternalAccountAuthorizedUser(b) if err != nil { return nil, err } tp, err = handleExternalAccountAuthorizedUser(f, opts) if err != nil { return nil, err } universeDomain = f.UniverseDomain case credsfile.ImpersonatedServiceAccountKey: f, err := credsfile.ParseImpersonatedServiceAccount(b) if err != nil { return nil, err } tp, err = handleImpersonatedServiceAccount(f, opts) if err != nil { return nil, err } universeDomain = resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) case credsfile.GDCHServiceAccountKey: f, err := credsfile.ParseGDCHServiceAccount(b) if err != nil { return nil, err } tp, err = handleGDCHServiceAccount(f, opts) if err != nil { return nil, err } projectID = f.Project universeDomain = f.UniverseDomain default: return nil, fmt.Errorf("credentials: unsupported filetype %q", fileType) } return auth.NewCredentials(&auth.CredentialsOptions{ TokenProvider: auth.NewCachedTokenProvider(tp, &auth.CachedTokenProviderOptions{ ExpireEarly: opts.EarlyTokenRefresh, }), JSON: b, ProjectIDProvider: internalauth.StaticCredentialsProperty(projectID), // TODO(codyoss): only set quota project here if there was a user override UniverseDomainProvider: internalauth.StaticCredentialsProperty(universeDomain), }), nil } // resolveUniverseDomain returns optsUniverseDomain if non-empty, in order to // support configuring universe-specific credentials in code. Auth flows // unsupported for universe domain should not use this func, but should instead // simply set the file universe domain on the credentials. func resolveUniverseDomain(optsUniverseDomain, fileUniverseDomain string) string { if optsUniverseDomain != "" { return optsUniverseDomain } return fileUniverseDomain } func handleServiceAccount(f *credsfile.ServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) { ud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain) if opts.UseSelfSignedJWT { return configureSelfSignedJWT(f, opts) } else if ud != "" && ud != internalauth.DefaultUniverseDomain { // For non-GDU universe domains, token exchange is impossible and services // must support self-signed JWTs. opts.UseSelfSignedJWT = true return configureSelfSignedJWT(f, opts) } opts2LO := &auth.Options2LO{ Email: f.ClientEmail, PrivateKey: []byte(f.PrivateKey), PrivateKeyID: f.PrivateKeyID, Scopes: opts.scopes(), TokenURL: f.TokenURL, Subject: opts.Subject, Client: opts.client(), Logger: opts.logger(), } if opts2LO.TokenURL == "" { opts2LO.TokenURL = jwtTokenURL } return auth.New2LOTokenProvider(opts2LO) } func handleUserCredential(f *credsfile.UserCredentialsFile, opts *DetectOptions) (auth.TokenProvider, error) { opts3LO := &auth.Options3LO{ ClientID: f.ClientID, ClientSecret: f.ClientSecret, Scopes: opts.scopes(), AuthURL: googleAuthURL, TokenURL: opts.tokenURL(), AuthStyle: auth.StyleInParams, EarlyTokenExpiry: opts.EarlyTokenRefresh, RefreshToken: f.RefreshToken, Client: opts.client(), Logger: opts.logger(), } return auth.New3LOTokenProvider(opts3LO) } func handleExternalAccount(f *credsfile.ExternalAccountFile, opts *DetectOptions) (auth.TokenProvider, error) { externalOpts := &externalaccount.Options{ Audience: f.Audience, SubjectTokenType: f.SubjectTokenType, TokenURL: f.TokenURL, TokenInfoURL: f.TokenInfoURL, ServiceAccountImpersonationURL: f.ServiceAccountImpersonationURL, ClientSecret: f.ClientSecret, ClientID: f.ClientID, CredentialSource: f.CredentialSource, QuotaProjectID: f.QuotaProjectID, Scopes: opts.scopes(), WorkforcePoolUserProject: f.WorkforcePoolUserProject, Client: opts.client(), Logger: opts.logger(), IsDefaultClient: opts.Client == nil, } if f.ServiceAccountImpersonation != nil { externalOpts.ServiceAccountImpersonationLifetimeSeconds = f.ServiceAccountImpersonation.TokenLifetimeSeconds } return externalaccount.NewTokenProvider(externalOpts) } func handleExternalAccountAuthorizedUser(f *credsfile.ExternalAccountAuthorizedUserFile, opts *DetectOptions) (auth.TokenProvider, error) { externalOpts := &externalaccountuser.Options{ Audience: f.Audience, RefreshToken: f.RefreshToken, TokenURL: f.TokenURL, TokenInfoURL: f.TokenInfoURL, ClientID: f.ClientID, ClientSecret: f.ClientSecret, Scopes: opts.scopes(), Client: opts.client(), Logger: opts.logger(), } return externalaccountuser.NewTokenProvider(externalOpts) } func handleImpersonatedServiceAccount(f *credsfile.ImpersonatedServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) { if f.ServiceAccountImpersonationURL == "" || f.CredSource == nil { return nil, errors.New("missing 'source_credentials' field or 'service_account_impersonation_url' in credentials") } tp, err := fileCredentials(f.CredSource, opts) if err != nil { return nil, err } return impersonate.NewTokenProvider(&impersonate.Options{ URL: f.ServiceAccountImpersonationURL, Scopes: opts.scopes(), Tp: tp, Delegates: f.Delegates, Client: opts.client(), Logger: opts.logger(), }) } func handleGDCHServiceAccount(f *credsfile.GDCHServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) { return gdch.NewTokenProvider(f, &gdch.Options{ STSAudience: opts.STSAudience, Client: opts.client(), Logger: opts.logger(), }) } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/aws_provider.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccount import ( "bytes" "context" "crypto/hmac" "crypto/sha256" "encoding/hex" "encoding/json" "errors" "fmt" "log/slog" "net/http" "net/url" "os" "path" "sort" "strings" "time" "cloud.google.com/go/auth/internal" "github.com/googleapis/gax-go/v2/internallog" ) var ( // getenv aliases os.Getenv for testing getenv = os.Getenv ) const ( // AWS Signature Version 4 signing algorithm identifier. awsAlgorithm = "AWS4-HMAC-SHA256" // The termination string for the AWS credential scope value as defined in // https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html awsRequestType = "aws4_request" // The AWS authorization header name for the security session token if available. awsSecurityTokenHeader = "x-amz-security-token" // The name of the header containing the session token for metadata endpoint calls awsIMDSv2SessionTokenHeader = "X-aws-ec2-metadata-token" awsIMDSv2SessionTTLHeader = "X-aws-ec2-metadata-token-ttl-seconds" awsIMDSv2SessionTTL = "300" // The AWS authorization header name for the auto-generated date. awsDateHeader = "x-amz-date" defaultRegionalCredentialVerificationURL = "https://sts.{region}.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15" // Supported AWS configuration environment variables. awsAccessKeyIDEnvVar = "AWS_ACCESS_KEY_ID" awsDefaultRegionEnvVar = "AWS_DEFAULT_REGION" awsRegionEnvVar = "AWS_REGION" awsSecretAccessKeyEnvVar = "AWS_SECRET_ACCESS_KEY" awsSessionTokenEnvVar = "AWS_SESSION_TOKEN" awsTimeFormatLong = "20060102T150405Z" awsTimeFormatShort = "20060102" awsProviderType = "aws" ) type awsSubjectProvider struct { EnvironmentID string RegionURL string RegionalCredVerificationURL string CredVerificationURL string IMDSv2SessionTokenURL string TargetResource string requestSigner *awsRequestSigner region string securityCredentialsProvider AwsSecurityCredentialsProvider reqOpts *RequestOptions Client *http.Client logger *slog.Logger } func (sp *awsSubjectProvider) subjectToken(ctx context.Context) (string, error) { // Set Defaults if sp.RegionalCredVerificationURL == "" { sp.RegionalCredVerificationURL = defaultRegionalCredentialVerificationURL } headers := make(map[string]string) if sp.shouldUseMetadataServer() { awsSessionToken, err := sp.getAWSSessionToken(ctx) if err != nil { return "", err } if awsSessionToken != "" { headers[awsIMDSv2SessionTokenHeader] = awsSessionToken } } awsSecurityCredentials, err := sp.getSecurityCredentials(ctx, headers) if err != nil { return "", err } if sp.region, err = sp.getRegion(ctx, headers); err != nil { return "", err } sp.requestSigner = &awsRequestSigner{ RegionName: sp.region, AwsSecurityCredentials: awsSecurityCredentials, } // Generate the signed request to AWS STS GetCallerIdentity API. // Use the required regional endpoint. Otherwise, the request will fail. req, err := http.NewRequestWithContext(ctx, "POST", strings.Replace(sp.RegionalCredVerificationURL, "{region}", sp.region, 1), nil) if err != nil { return "", err } // The full, canonical resource name of the workload identity pool // provider, with or without the HTTPS prefix. // Including this header as part of the signature is recommended to // ensure data integrity. if sp.TargetResource != "" { req.Header.Set("x-goog-cloud-target-resource", sp.TargetResource) } sp.requestSigner.signRequest(req) /* The GCP STS endpoint expects the headers to be formatted as: # [ # {key: 'x-amz-date', value: '...'}, # {key: 'Authorization', value: '...'}, # ... # ] # And then serialized as: # quote(json.dumps({ # url: '...', # method: 'POST', # headers: [{key: 'x-amz-date', value: '...'}, ...] # })) */ awsSignedReq := awsRequest{ URL: req.URL.String(), Method: "POST", } for headerKey, headerList := range req.Header { for _, headerValue := range headerList { awsSignedReq.Headers = append(awsSignedReq.Headers, awsRequestHeader{ Key: headerKey, Value: headerValue, }) } } sort.Slice(awsSignedReq.Headers, func(i, j int) bool { headerCompare := strings.Compare(awsSignedReq.Headers[i].Key, awsSignedReq.Headers[j].Key) if headerCompare == 0 { return strings.Compare(awsSignedReq.Headers[i].Value, awsSignedReq.Headers[j].Value) < 0 } return headerCompare < 0 }) result, err := json.Marshal(awsSignedReq) if err != nil { return "", err } return url.QueryEscape(string(result)), nil } func (sp *awsSubjectProvider) providerType() string { if sp.securityCredentialsProvider != nil { return programmaticProviderType } return awsProviderType } func (sp *awsSubjectProvider) getAWSSessionToken(ctx context.Context) (string, error) { if sp.IMDSv2SessionTokenURL == "" { return "", nil } req, err := http.NewRequestWithContext(ctx, "PUT", sp.IMDSv2SessionTokenURL, nil) if err != nil { return "", err } req.Header.Set(awsIMDSv2SessionTTLHeader, awsIMDSv2SessionTTL) sp.logger.DebugContext(ctx, "aws session token request", "request", internallog.HTTPRequest(req, nil)) resp, body, err := internal.DoRequest(sp.Client, req) if err != nil { return "", err } sp.logger.DebugContext(ctx, "aws session token response", "response", internallog.HTTPResponse(resp, body)) if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("credentials: unable to retrieve AWS session token: %s", body) } return string(body), nil } func (sp *awsSubjectProvider) getRegion(ctx context.Context, headers map[string]string) (string, error) { if sp.securityCredentialsProvider != nil { return sp.securityCredentialsProvider.AwsRegion(ctx, sp.reqOpts) } if canRetrieveRegionFromEnvironment() { if envAwsRegion := getenv(awsRegionEnvVar); envAwsRegion != "" { return envAwsRegion, nil } return getenv(awsDefaultRegionEnvVar), nil } if sp.RegionURL == "" { return "", errors.New("credentials: unable to determine AWS region") } req, err := http.NewRequestWithContext(ctx, "GET", sp.RegionURL, nil) if err != nil { return "", err } for name, value := range headers { req.Header.Add(name, value) } sp.logger.DebugContext(ctx, "aws region request", "request", internallog.HTTPRequest(req, nil)) resp, body, err := internal.DoRequest(sp.Client, req) if err != nil { return "", err } sp.logger.DebugContext(ctx, "aws region response", "response", internallog.HTTPResponse(resp, body)) if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("credentials: unable to retrieve AWS region - %s", body) } // This endpoint will return the region in format: us-east-2b. // Only the us-east-2 part should be used. bodyLen := len(body) if bodyLen == 0 { return "", nil } return string(body[:bodyLen-1]), nil } func (sp *awsSubjectProvider) getSecurityCredentials(ctx context.Context, headers map[string]string) (result *AwsSecurityCredentials, err error) { if sp.securityCredentialsProvider != nil { return sp.securityCredentialsProvider.AwsSecurityCredentials(ctx, sp.reqOpts) } if canRetrieveSecurityCredentialFromEnvironment() { return &AwsSecurityCredentials{ AccessKeyID: getenv(awsAccessKeyIDEnvVar), SecretAccessKey: getenv(awsSecretAccessKeyEnvVar), SessionToken: getenv(awsSessionTokenEnvVar), }, nil } roleName, err := sp.getMetadataRoleName(ctx, headers) if err != nil { return } credentials, err := sp.getMetadataSecurityCredentials(ctx, roleName, headers) if err != nil { return } if credentials.AccessKeyID == "" { return result, errors.New("credentials: missing AccessKeyId credential") } if credentials.SecretAccessKey == "" { return result, errors.New("credentials: missing SecretAccessKey credential") } return credentials, nil } func (sp *awsSubjectProvider) getMetadataSecurityCredentials(ctx context.Context, roleName string, headers map[string]string) (*AwsSecurityCredentials, error) { var result *AwsSecurityCredentials req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/%s", sp.CredVerificationURL, roleName), nil) if err != nil { return result, err } for name, value := range headers { req.Header.Add(name, value) } sp.logger.DebugContext(ctx, "aws security credential request", "request", internallog.HTTPRequest(req, nil)) resp, body, err := internal.DoRequest(sp.Client, req) if err != nil { return result, err } sp.logger.DebugContext(ctx, "aws security credential response", "response", internallog.HTTPResponse(resp, body)) if resp.StatusCode != http.StatusOK { return result, fmt.Errorf("credentials: unable to retrieve AWS security credentials - %s", body) } if err := json.Unmarshal(body, &result); err != nil { return nil, err } return result, nil } func (sp *awsSubjectProvider) getMetadataRoleName(ctx context.Context, headers map[string]string) (string, error) { if sp.CredVerificationURL == "" { return "", errors.New("credentials: unable to determine the AWS metadata server security credentials endpoint") } req, err := http.NewRequestWithContext(ctx, "GET", sp.CredVerificationURL, nil) if err != nil { return "", err } for name, value := range headers { req.Header.Add(name, value) } sp.logger.DebugContext(ctx, "aws metadata role request", "request", internallog.HTTPRequest(req, nil)) resp, body, err := internal.DoRequest(sp.Client, req) if err != nil { return "", err } sp.logger.DebugContext(ctx, "aws metadata role response", "response", internallog.HTTPResponse(resp, body)) if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("credentials: unable to retrieve AWS role name - %s", body) } return string(body), nil } // awsRequestSigner is a utility class to sign http requests using a AWS V4 signature. type awsRequestSigner struct { RegionName string AwsSecurityCredentials *AwsSecurityCredentials } // signRequest adds the appropriate headers to an http.Request // or returns an error if something prevented this. func (rs *awsRequestSigner) signRequest(req *http.Request) error { // req is assumed non-nil signedRequest := cloneRequest(req) timestamp := Now() signedRequest.Header.Set("host", requestHost(req)) if rs.AwsSecurityCredentials.SessionToken != "" { signedRequest.Header.Set(awsSecurityTokenHeader, rs.AwsSecurityCredentials.SessionToken) } if signedRequest.Header.Get("date") == "" { signedRequest.Header.Set(awsDateHeader, timestamp.Format(awsTimeFormatLong)) } authorizationCode, err := rs.generateAuthentication(signedRequest, timestamp) if err != nil { return err } signedRequest.Header.Set("Authorization", authorizationCode) req.Header = signedRequest.Header return nil } func (rs *awsRequestSigner) generateAuthentication(req *http.Request, timestamp time.Time) (string, error) { canonicalHeaderColumns, canonicalHeaderData := canonicalHeaders(req) dateStamp := timestamp.Format(awsTimeFormatShort) serviceName := "" if splitHost := strings.Split(requestHost(req), "."); len(splitHost) > 0 { serviceName = splitHost[0] } credentialScope := strings.Join([]string{dateStamp, rs.RegionName, serviceName, awsRequestType}, "/") requestString, err := canonicalRequest(req, canonicalHeaderColumns, canonicalHeaderData) if err != nil { return "", err } requestHash, err := getSha256([]byte(requestString)) if err != nil { return "", err } stringToSign := strings.Join([]string{awsAlgorithm, timestamp.Format(awsTimeFormatLong), credentialScope, requestHash}, "\n") signingKey := []byte("AWS4" + rs.AwsSecurityCredentials.SecretAccessKey) for _, signingInput := range []string{ dateStamp, rs.RegionName, serviceName, awsRequestType, stringToSign, } { signingKey, err = getHmacSha256(signingKey, []byte(signingInput)) if err != nil { return "", err } } return fmt.Sprintf("%s Credential=%s/%s, SignedHeaders=%s, Signature=%s", awsAlgorithm, rs.AwsSecurityCredentials.AccessKeyID, credentialScope, canonicalHeaderColumns, hex.EncodeToString(signingKey)), nil } func getSha256(input []byte) (string, error) { hash := sha256.New() if _, err := hash.Write(input); err != nil { return "", err } return hex.EncodeToString(hash.Sum(nil)), nil } func getHmacSha256(key, input []byte) ([]byte, error) { hash := hmac.New(sha256.New, key) if _, err := hash.Write(input); err != nil { return nil, err } return hash.Sum(nil), nil } func cloneRequest(r *http.Request) *http.Request { r2 := new(http.Request) *r2 = *r if r.Header != nil { r2.Header = make(http.Header, len(r.Header)) // Find total number of values. headerCount := 0 for _, headerValues := range r.Header { headerCount += len(headerValues) } copiedHeaders := make([]string, headerCount) // shared backing array for headers' values for headerKey, headerValues := range r.Header { headerCount = copy(copiedHeaders, headerValues) r2.Header[headerKey] = copiedHeaders[:headerCount:headerCount] copiedHeaders = copiedHeaders[headerCount:] } } return r2 } func canonicalPath(req *http.Request) string { result := req.URL.EscapedPath() if result == "" { return "/" } return path.Clean(result) } func canonicalQuery(req *http.Request) string { queryValues := req.URL.Query() for queryKey := range queryValues { sort.Strings(queryValues[queryKey]) } return queryValues.Encode() } func canonicalHeaders(req *http.Request) (string, string) { // Header keys need to be sorted alphabetically. var headers []string lowerCaseHeaders := make(http.Header) for k, v := range req.Header { k := strings.ToLower(k) if _, ok := lowerCaseHeaders[k]; ok { // include additional values lowerCaseHeaders[k] = append(lowerCaseHeaders[k], v...) } else { headers = append(headers, k) lowerCaseHeaders[k] = v } } sort.Strings(headers) var fullHeaders bytes.Buffer for _, header := range headers { headerValue := strings.Join(lowerCaseHeaders[header], ",") fullHeaders.WriteString(header) fullHeaders.WriteRune(':') fullHeaders.WriteString(headerValue) fullHeaders.WriteRune('\n') } return strings.Join(headers, ";"), fullHeaders.String() } func requestDataHash(req *http.Request) (string, error) { var requestData []byte if req.Body != nil { requestBody, err := req.GetBody() if err != nil { return "", err } defer requestBody.Close() requestData, err = internal.ReadAll(requestBody) if err != nil { return "", err } } return getSha256(requestData) } func requestHost(req *http.Request) string { if req.Host != "" { return req.Host } return req.URL.Host } func canonicalRequest(req *http.Request, canonicalHeaderColumns, canonicalHeaderData string) (string, error) { dataHash, err := requestDataHash(req) if err != nil { return "", err } return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s", req.Method, canonicalPath(req), canonicalQuery(req), canonicalHeaderData, canonicalHeaderColumns, dataHash), nil } type awsRequestHeader struct { Key string `json:"key"` Value string `json:"value"` } type awsRequest struct { URL string `json:"url"` Method string `json:"method"` Headers []awsRequestHeader `json:"headers"` } // The AWS region can be provided through AWS_REGION or AWS_DEFAULT_REGION. Only one is // required. func canRetrieveRegionFromEnvironment() bool { return getenv(awsRegionEnvVar) != "" || getenv(awsDefaultRegionEnvVar) != "" } // Check if both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are available. func canRetrieveSecurityCredentialFromEnvironment() bool { return getenv(awsAccessKeyIDEnvVar) != "" && getenv(awsSecretAccessKeyEnvVar) != "" } func (sp *awsSubjectProvider) shouldUseMetadataServer() bool { return sp.securityCredentialsProvider == nil && (!canRetrieveRegionFromEnvironment() || !canRetrieveSecurityCredentialFromEnvironment()) } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/executable_provider.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccount import ( "bytes" "context" "encoding/json" "errors" "fmt" "net/http" "os" "os/exec" "regexp" "strings" "time" "cloud.google.com/go/auth/internal" ) const ( executableSupportedMaxVersion = 1 executableDefaultTimeout = 30 * time.Second executableSource = "response" executableProviderType = "executable" outputFileSource = "output file" allowExecutablesEnvVar = "GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES" jwtTokenType = "urn:ietf:params:oauth:token-type:jwt" idTokenType = "urn:ietf:params:oauth:token-type:id_token" saml2TokenType = "urn:ietf:params:oauth:token-type:saml2" ) var ( serviceAccountImpersonationRE = regexp.MustCompile(`https://iamcredentials..+/v1/projects/-/serviceAccounts/(.*@.*):generateAccessToken`) ) type nonCacheableError struct { message string } func (nce nonCacheableError) Error() string { return nce.message } // environment is a contract for testing type environment interface { existingEnv() []string getenv(string) string run(ctx context.Context, command string, env []string) ([]byte, error) now() time.Time } type runtimeEnvironment struct{} func (r runtimeEnvironment) existingEnv() []string { return os.Environ() } func (r runtimeEnvironment) getenv(key string) string { return os.Getenv(key) } func (r runtimeEnvironment) now() time.Time { return time.Now().UTC() } func (r runtimeEnvironment) run(ctx context.Context, command string, env []string) ([]byte, error) { splitCommand := strings.Fields(command) cmd := exec.CommandContext(ctx, splitCommand[0], splitCommand[1:]...) cmd.Env = env var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr if err := cmd.Run(); err != nil { if ctx.Err() == context.DeadlineExceeded { return nil, context.DeadlineExceeded } if exitError, ok := err.(*exec.ExitError); ok { return nil, exitCodeError(exitError) } return nil, executableError(err) } bytesStdout := bytes.TrimSpace(stdout.Bytes()) if len(bytesStdout) > 0 { return bytesStdout, nil } return bytes.TrimSpace(stderr.Bytes()), nil } type executableSubjectProvider struct { Command string Timeout time.Duration OutputFile string client *http.Client opts *Options env environment } type executableResponse struct { Version int `json:"version,omitempty"` Success *bool `json:"success,omitempty"` TokenType string `json:"token_type,omitempty"` ExpirationTime int64 `json:"expiration_time,omitempty"` IDToken string `json:"id_token,omitempty"` SamlResponse string `json:"saml_response,omitempty"` Code string `json:"code,omitempty"` Message string `json:"message,omitempty"` } func (sp *executableSubjectProvider) parseSubjectTokenFromSource(response []byte, source string, now int64) (string, error) { var result executableResponse if err := json.Unmarshal(response, &result); err != nil { return "", jsonParsingError(source, string(response)) } // Validate if result.Version == 0 { return "", missingFieldError(source, "version") } if result.Success == nil { return "", missingFieldError(source, "success") } if !*result.Success { if result.Code == "" || result.Message == "" { return "", malformedFailureError() } return "", userDefinedError(result.Code, result.Message) } if result.Version > executableSupportedMaxVersion || result.Version < 0 { return "", unsupportedVersionError(source, result.Version) } if result.ExpirationTime == 0 && sp.OutputFile != "" { return "", missingFieldError(source, "expiration_time") } if result.TokenType == "" { return "", missingFieldError(source, "token_type") } if result.ExpirationTime != 0 && result.ExpirationTime < now { return "", tokenExpiredError() } switch result.TokenType { case jwtTokenType, idTokenType: if result.IDToken == "" { return "", missingFieldError(source, "id_token") } return result.IDToken, nil case saml2TokenType: if result.SamlResponse == "" { return "", missingFieldError(source, "saml_response") } return result.SamlResponse, nil default: return "", tokenTypeError(source) } } func (sp *executableSubjectProvider) subjectToken(ctx context.Context) (string, error) { if token, err := sp.getTokenFromOutputFile(); token != "" || err != nil { return token, err } return sp.getTokenFromExecutableCommand(ctx) } func (sp *executableSubjectProvider) providerType() string { return executableProviderType } func (sp *executableSubjectProvider) getTokenFromOutputFile() (token string, err error) { if sp.OutputFile == "" { // This ExecutableCredentialSource doesn't use an OutputFile. return "", nil } file, err := os.Open(sp.OutputFile) if err != nil { // No OutputFile found. Hasn't been created yet, so skip it. return "", nil } defer file.Close() data, err := internal.ReadAll(file) if err != nil || len(data) == 0 { // Cachefile exists, but no data found. Get new credential. return "", nil } token, err = sp.parseSubjectTokenFromSource(data, outputFileSource, sp.env.now().Unix()) if err != nil { if _, ok := err.(nonCacheableError); ok { // If the cached token is expired we need a new token, // and if the cache contains a failure, we need to try again. return "", nil } // There was an error in the cached token, and the developer should be aware of it. return "", err } // Token parsing succeeded. Use found token. return token, nil } func (sp *executableSubjectProvider) executableEnvironment() []string { result := sp.env.existingEnv() result = append(result, fmt.Sprintf("GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE=%v", sp.opts.Audience)) result = append(result, fmt.Sprintf("GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE=%v", sp.opts.SubjectTokenType)) result = append(result, "GOOGLE_EXTERNAL_ACCOUNT_INTERACTIVE=0") if sp.opts.ServiceAccountImpersonationURL != "" { matches := serviceAccountImpersonationRE.FindStringSubmatch(sp.opts.ServiceAccountImpersonationURL) if matches != nil { result = append(result, fmt.Sprintf("GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL=%v", matches[1])) } } if sp.OutputFile != "" { result = append(result, fmt.Sprintf("GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE=%v", sp.OutputFile)) } return result } func (sp *executableSubjectProvider) getTokenFromExecutableCommand(ctx context.Context) (string, error) { // For security reasons, we need our consumers to set this environment variable to allow executables to be run. if sp.env.getenv(allowExecutablesEnvVar) != "1" { return "", errors.New("credentials: executables need to be explicitly allowed (set GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES to '1') to run") } ctx, cancel := context.WithDeadline(ctx, sp.env.now().Add(sp.Timeout)) defer cancel() output, err := sp.env.run(ctx, sp.Command, sp.executableEnvironment()) if err != nil { return "", err } return sp.parseSubjectTokenFromSource(output, executableSource, sp.env.now().Unix()) } func missingFieldError(source, field string) error { return fmt.Errorf("credentials: %q missing %q field", source, field) } func jsonParsingError(source, data string) error { return fmt.Errorf("credentials: unable to parse %q: %v", source, data) } func malformedFailureError() error { return nonCacheableError{"credentials: response must include `error` and `message` fields when unsuccessful"} } func userDefinedError(code, message string) error { return nonCacheableError{fmt.Sprintf("credentials: response contains unsuccessful response: (%v) %v", code, message)} } func unsupportedVersionError(source string, version int) error { return fmt.Errorf("credentials: %v contains unsupported version: %v", source, version) } func tokenExpiredError() error { return nonCacheableError{"credentials: the token returned by the executable is expired"} } func tokenTypeError(source string) error { return fmt.Errorf("credentials: %v contains unsupported token type", source) } func exitCodeError(err *exec.ExitError) error { return fmt.Errorf("credentials: executable command failed with exit code %v: %w", err.ExitCode(), err) } func executableError(err error) error { return fmt.Errorf("credentials: executable command failed: %w", err) } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/externalaccount.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccount import ( "context" "errors" "fmt" "log/slog" "net/http" "regexp" "strconv" "strings" "time" "cloud.google.com/go/auth" "cloud.google.com/go/auth/credentials/internal/impersonate" "cloud.google.com/go/auth/credentials/internal/stsexchange" "cloud.google.com/go/auth/internal/credsfile" "github.com/googleapis/gax-go/v2/internallog" ) const ( timeoutMinimum = 5 * time.Second timeoutMaximum = 120 * time.Second universeDomainPlaceholder = "UNIVERSE_DOMAIN" defaultTokenURL = "https://sts.UNIVERSE_DOMAIN/v1/token" defaultUniverseDomain = "googleapis.com" ) var ( // Now aliases time.Now for testing Now = func() time.Time { return time.Now().UTC() } validWorkforceAudiencePattern *regexp.Regexp = regexp.MustCompile(`//iam\.googleapis\.com/locations/[^/]+/workforcePools/`) ) // Options stores the configuration for fetching tokens with external credentials. type Options struct { // Audience is the Secure Token Service (STS) audience which contains the resource name for the workload // identity pool or the workforce pool and the provider identifier in that pool. Audience string // SubjectTokenType is the STS token type based on the Oauth2.0 token exchange spec // e.g. `urn:ietf:params:oauth:token-type:jwt`. SubjectTokenType string // TokenURL is the STS token exchange endpoint. TokenURL string // TokenInfoURL is the token_info endpoint used to retrieve the account related information ( // user attributes like account identifier, eg. email, username, uid, etc). This is // needed for gCloud session account identification. TokenInfoURL string // ServiceAccountImpersonationURL is the URL for the service account impersonation request. This is only // required for workload identity pools when APIs to be accessed have not integrated with UberMint. ServiceAccountImpersonationURL string // ServiceAccountImpersonationLifetimeSeconds is the number of seconds the service account impersonation // token will be valid for. ServiceAccountImpersonationLifetimeSeconds int // ClientSecret is currently only required if token_info endpoint also // needs to be called with the generated GCP access token. When provided, STS will be // called with additional basic authentication using client_id as username and client_secret as password. ClientSecret string // ClientID is only required in conjunction with ClientSecret, as described above. ClientID string // CredentialSource contains the necessary information to retrieve the token itself, as well // as some environmental information. CredentialSource *credsfile.CredentialSource // QuotaProjectID is injected by gCloud. If the value is non-empty, the Auth libraries // will set the x-goog-user-project which overrides the project associated with the credentials. QuotaProjectID string // Scopes contains the desired scopes for the returned access token. Scopes []string // WorkforcePoolUserProject should be set when it is a workforce pool and // not a workload identity pool. The underlying principal must still have // serviceusage.services.use IAM permission to use the project for // billing/quota. Optional. WorkforcePoolUserProject string // UniverseDomain is the default service domain for a given Cloud universe. // This value will be used in the default STS token URL. The default value // is "googleapis.com". It will not be used if TokenURL is set. Optional. UniverseDomain string // SubjectTokenProvider is an optional token provider for OIDC/SAML // credentials. One of SubjectTokenProvider, AWSSecurityCredentialProvider // or CredentialSource must be provided. Optional. SubjectTokenProvider SubjectTokenProvider // AwsSecurityCredentialsProvider is an AWS Security Credential provider // for AWS credentials. One of SubjectTokenProvider, // AWSSecurityCredentialProvider or CredentialSource must be provided. Optional. AwsSecurityCredentialsProvider AwsSecurityCredentialsProvider // Client for token request. Client *http.Client // IsDefaultClient marks whether the client passed in is a default client that can be overriden. // This is important for X509 credentials which should create a new client if the default was used // but should respect a client explicitly passed in by the user. IsDefaultClient bool // Logger is used for debug logging. If provided, logging will be enabled // at the loggers configured level. By default logging is disabled unless // enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default // logger will be used. Optional. Logger *slog.Logger } // SubjectTokenProvider can be used to supply a subject token to exchange for a // GCP access token. type SubjectTokenProvider interface { // SubjectToken should return a valid subject token or an error. // The external account token provider does not cache the returned subject // token, so caching logic should be implemented in the provider to prevent // multiple requests for the same subject token. SubjectToken(ctx context.Context, opts *RequestOptions) (string, error) } // RequestOptions contains information about the requested subject token or AWS // security credentials from the Google external account credential. type RequestOptions struct { // Audience is the requested audience for the external account credential. Audience string // Subject token type is the requested subject token type for the external // account credential. Expected values include: // “urn:ietf:params:oauth:token-type:jwt” // “urn:ietf:params:oauth:token-type:id-token” // “urn:ietf:params:oauth:token-type:saml2” // “urn:ietf:params:aws:token-type:aws4_request” SubjectTokenType string } // AwsSecurityCredentialsProvider can be used to supply AwsSecurityCredentials // and an AWS Region to exchange for a GCP access token. type AwsSecurityCredentialsProvider interface { // AwsRegion should return the AWS region or an error. AwsRegion(ctx context.Context, opts *RequestOptions) (string, error) // GetAwsSecurityCredentials should return a valid set of // AwsSecurityCredentials or an error. The external account token provider // does not cache the returned security credentials, so caching logic should // be implemented in the provider to prevent multiple requests for the // same security credentials. AwsSecurityCredentials(ctx context.Context, opts *RequestOptions) (*AwsSecurityCredentials, error) } // AwsSecurityCredentials models AWS security credentials. type AwsSecurityCredentials struct { // AccessKeyId is the AWS Access Key ID - Required. AccessKeyID string `json:"AccessKeyID"` // SecretAccessKey is the AWS Secret Access Key - Required. SecretAccessKey string `json:"SecretAccessKey"` // SessionToken is the AWS Session token. This should be provided for // temporary AWS security credentials - Optional. SessionToken string `json:"Token"` } func (o *Options) validate() error { if o.Audience == "" { return fmt.Errorf("externalaccount: Audience must be set") } if o.SubjectTokenType == "" { return fmt.Errorf("externalaccount: Subject token type must be set") } if o.WorkforcePoolUserProject != "" { if valid := validWorkforceAudiencePattern.MatchString(o.Audience); !valid { return fmt.Errorf("externalaccount: workforce_pool_user_project should not be set for non-workforce pool credentials") } } count := 0 if o.CredentialSource != nil { count++ } if o.SubjectTokenProvider != nil { count++ } if o.AwsSecurityCredentialsProvider != nil { count++ } if count == 0 { return fmt.Errorf("externalaccount: one of CredentialSource, SubjectTokenProvider, or AwsSecurityCredentialsProvider must be set") } if count > 1 { return fmt.Errorf("externalaccount: only one of CredentialSource, SubjectTokenProvider, or AwsSecurityCredentialsProvider must be set") } return nil } // client returns the http client that should be used for the token exchange. If a non-default client // is provided, then the client configured in the options will always be returned. If a default client // is provided and the options are configured for X509 credentials, a new client will be created. func (o *Options) client() (*http.Client, error) { // If a client was provided and no override certificate config location was provided, use the provided client. if o.CredentialSource == nil || o.CredentialSource.Certificate == nil || (!o.IsDefaultClient && o.CredentialSource.Certificate.CertificateConfigLocation == "") { return o.Client, nil } // If a new client should be created, validate and use the certificate source to create a new mTLS client. cert := o.CredentialSource.Certificate if !cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation == "" { return nil, errors.New("credentials: \"certificate\" object must either specify a certificate_config_location or use_default_certificate_config should be true") } if cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation != "" { return nil, errors.New("credentials: \"certificate\" object cannot specify both a certificate_config_location and use_default_certificate_config=true") } return createX509Client(cert.CertificateConfigLocation) } // resolveTokenURL sets the default STS token endpoint with the configured // universe domain. func (o *Options) resolveTokenURL() { if o.TokenURL != "" { return } else if o.UniverseDomain != "" { o.TokenURL = strings.Replace(defaultTokenURL, universeDomainPlaceholder, o.UniverseDomain, 1) } else { o.TokenURL = strings.Replace(defaultTokenURL, universeDomainPlaceholder, defaultUniverseDomain, 1) } } // NewTokenProvider returns a [cloud.google.com/go/auth.TokenProvider] // configured with the provided options. func NewTokenProvider(opts *Options) (auth.TokenProvider, error) { if err := opts.validate(); err != nil { return nil, err } opts.resolveTokenURL() logger := internallog.New(opts.Logger) stp, err := newSubjectTokenProvider(opts) if err != nil { return nil, err } client, err := opts.client() if err != nil { return nil, err } tp := &tokenProvider{ client: client, opts: opts, stp: stp, logger: logger, } if opts.ServiceAccountImpersonationURL == "" { return auth.NewCachedTokenProvider(tp, nil), nil } scopes := make([]string, len(opts.Scopes)) copy(scopes, opts.Scopes) // needed for impersonation tp.opts.Scopes = []string{"https://www.googleapis.com/auth/cloud-platform"} imp, err := impersonate.NewTokenProvider(&impersonate.Options{ Client: client, URL: opts.ServiceAccountImpersonationURL, Scopes: scopes, Tp: auth.NewCachedTokenProvider(tp, nil), TokenLifetimeSeconds: opts.ServiceAccountImpersonationLifetimeSeconds, Logger: logger, }) if err != nil { return nil, err } return auth.NewCachedTokenProvider(imp, nil), nil } type subjectTokenProvider interface { subjectToken(ctx context.Context) (string, error) providerType() string } // tokenProvider is the provider that handles external credentials. It is used to retrieve Tokens. type tokenProvider struct { client *http.Client logger *slog.Logger opts *Options stp subjectTokenProvider } func (tp *tokenProvider) Token(ctx context.Context) (*auth.Token, error) { subjectToken, err := tp.stp.subjectToken(ctx) if err != nil { return nil, err } stsRequest := &stsexchange.TokenRequest{ GrantType: stsexchange.GrantType, Audience: tp.opts.Audience, Scope: tp.opts.Scopes, RequestedTokenType: stsexchange.TokenType, SubjectToken: subjectToken, SubjectTokenType: tp.opts.SubjectTokenType, } header := make(http.Header) header.Set("Content-Type", "application/x-www-form-urlencoded") header.Add("x-goog-api-client", getGoogHeaderValue(tp.opts, tp.stp)) clientAuth := stsexchange.ClientAuthentication{ AuthStyle: auth.StyleInHeader, ClientID: tp.opts.ClientID, ClientSecret: tp.opts.ClientSecret, } var options map[string]interface{} // Do not pass workforce_pool_user_project when client authentication is used. // The client ID is sufficient for determining the user project. if tp.opts.WorkforcePoolUserProject != "" && tp.opts.ClientID == "" { options = map[string]interface{}{ "userProject": tp.opts.WorkforcePoolUserProject, } } stsResp, err := stsexchange.ExchangeToken(ctx, &stsexchange.Options{ Client: tp.client, Endpoint: tp.opts.TokenURL, Request: stsRequest, Authentication: clientAuth, Headers: header, ExtraOpts: options, Logger: tp.logger, }) if err != nil { return nil, err } tok := &auth.Token{ Value: stsResp.AccessToken, Type: stsResp.TokenType, } // The RFC8693 doesn't define the explicit 0 of "expires_in" field behavior. if stsResp.ExpiresIn <= 0 { return nil, fmt.Errorf("credentials: got invalid expiry from security token service") } tok.Expiry = Now().Add(time.Duration(stsResp.ExpiresIn) * time.Second) return tok, nil } // newSubjectTokenProvider determines the type of credsfile.CredentialSource needed to create a // subjectTokenProvider func newSubjectTokenProvider(o *Options) (subjectTokenProvider, error) { logger := internallog.New(o.Logger) reqOpts := &RequestOptions{Audience: o.Audience, SubjectTokenType: o.SubjectTokenType} if o.AwsSecurityCredentialsProvider != nil { return &awsSubjectProvider{ securityCredentialsProvider: o.AwsSecurityCredentialsProvider, TargetResource: o.Audience, reqOpts: reqOpts, logger: logger, }, nil } else if o.SubjectTokenProvider != nil { return &programmaticProvider{stp: o.SubjectTokenProvider, opts: reqOpts}, nil } else if len(o.CredentialSource.EnvironmentID) > 3 && o.CredentialSource.EnvironmentID[:3] == "aws" { if awsVersion, err := strconv.Atoi(o.CredentialSource.EnvironmentID[3:]); err == nil { if awsVersion != 1 { return nil, fmt.Errorf("credentials: aws version '%d' is not supported in the current build", awsVersion) } awsProvider := &awsSubjectProvider{ EnvironmentID: o.CredentialSource.EnvironmentID, RegionURL: o.CredentialSource.RegionURL, RegionalCredVerificationURL: o.CredentialSource.RegionalCredVerificationURL, CredVerificationURL: o.CredentialSource.URL, TargetResource: o.Audience, Client: o.Client, logger: logger, } if o.CredentialSource.IMDSv2SessionTokenURL != "" { awsProvider.IMDSv2SessionTokenURL = o.CredentialSource.IMDSv2SessionTokenURL } return awsProvider, nil } } else if o.CredentialSource.File != "" { return &fileSubjectProvider{File: o.CredentialSource.File, Format: o.CredentialSource.Format}, nil } else if o.CredentialSource.URL != "" { return &urlSubjectProvider{ URL: o.CredentialSource.URL, Headers: o.CredentialSource.Headers, Format: o.CredentialSource.Format, Client: o.Client, Logger: logger, }, nil } else if o.CredentialSource.Executable != nil { ec := o.CredentialSource.Executable if ec.Command == "" { return nil, errors.New("credentials: missing `command` field — executable command must be provided") } execProvider := &executableSubjectProvider{} execProvider.Command = ec.Command if ec.TimeoutMillis == 0 { execProvider.Timeout = executableDefaultTimeout } else { execProvider.Timeout = time.Duration(ec.TimeoutMillis) * time.Millisecond if execProvider.Timeout < timeoutMinimum || execProvider.Timeout > timeoutMaximum { return nil, fmt.Errorf("credentials: invalid `timeout_millis` field — executable timeout must be between %v and %v seconds", timeoutMinimum.Seconds(), timeoutMaximum.Seconds()) } } execProvider.OutputFile = ec.OutputFile execProvider.client = o.Client execProvider.opts = o execProvider.env = runtimeEnvironment{} return execProvider, nil } else if o.CredentialSource.Certificate != nil { cert := o.CredentialSource.Certificate if !cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation == "" { return nil, errors.New("credentials: \"certificate\" object must either specify a certificate_config_location or use_default_certificate_config should be true") } if cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation != "" { return nil, errors.New("credentials: \"certificate\" object cannot specify both a certificate_config_location and use_default_certificate_config=true") } return &x509Provider{ TrustChainPath: o.CredentialSource.Certificate.TrustChainPath, ConfigFilePath: o.CredentialSource.Certificate.CertificateConfigLocation, }, nil } return nil, errors.New("credentials: unable to parse credential source") } func getGoogHeaderValue(conf *Options, p subjectTokenProvider) string { return fmt.Sprintf("gl-go/%s auth/%s google-byoid-sdk source/%s sa-impersonation/%t config-lifetime/%t", goVersion(), "unknown", p.providerType(), conf.ServiceAccountImpersonationURL != "", conf.ServiceAccountImpersonationLifetimeSeconds != 0) } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/file_provider.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccount import ( "bytes" "context" "encoding/json" "errors" "fmt" "os" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/credsfile" ) const ( fileProviderType = "file" ) type fileSubjectProvider struct { File string Format *credsfile.Format } func (sp *fileSubjectProvider) subjectToken(context.Context) (string, error) { tokenFile, err := os.Open(sp.File) if err != nil { return "", fmt.Errorf("credentials: failed to open credential file %q: %w", sp.File, err) } defer tokenFile.Close() tokenBytes, err := internal.ReadAll(tokenFile) if err != nil { return "", fmt.Errorf("credentials: failed to read credential file: %w", err) } tokenBytes = bytes.TrimSpace(tokenBytes) if sp.Format == nil { return string(tokenBytes), nil } switch sp.Format.Type { case fileTypeJSON: jsonData := make(map[string]interface{}) err = json.Unmarshal(tokenBytes, &jsonData) if err != nil { return "", fmt.Errorf("credentials: failed to unmarshal subject token file: %w", err) } val, ok := jsonData[sp.Format.SubjectTokenFieldName] if !ok { return "", errors.New("credentials: provided subject_token_field_name not found in credentials") } token, ok := val.(string) if !ok { return "", errors.New("credentials: improperly formatted subject token") } return token, nil case fileTypeText: return string(tokenBytes), nil default: return "", errors.New("credentials: invalid credential_source file format type: " + sp.Format.Type) } } func (sp *fileSubjectProvider) providerType() string { return fileProviderType } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/info.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccount import ( "runtime" "strings" "unicode" ) var ( // version is a package internal global variable for testing purposes. version = runtime.Version ) // versionUnknown is only used when the runtime version cannot be determined. const versionUnknown = "UNKNOWN" // goVersion returns a Go runtime version derived from the runtime environment // that is modified to be suitable for reporting in a header, meaning it has no // whitespace. If it is unable to determine the Go runtime version, it returns // versionUnknown. func goVersion() string { const develPrefix = "devel +" s := version() if strings.HasPrefix(s, develPrefix) { s = s[len(develPrefix):] if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { s = s[:p] } return s } else if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { s = s[:p] } notSemverRune := func(r rune) bool { return !strings.ContainsRune("0123456789.", r) } if strings.HasPrefix(s, "go1") { s = s[2:] var prerelease string if p := strings.IndexFunc(s, notSemverRune); p >= 0 { s, prerelease = s[:p], s[p:] } if strings.HasSuffix(s, ".") { s += "0" } else if strings.Count(s, ".") < 2 { s += ".0" } if prerelease != "" { // Some release candidates already have a dash in them. if !strings.HasPrefix(prerelease, "-") { prerelease = "-" + prerelease } s += prerelease } return s } return versionUnknown } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/programmatic_provider.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccount import "context" type programmaticProvider struct { opts *RequestOptions stp SubjectTokenProvider } func (pp *programmaticProvider) providerType() string { return programmaticProviderType } func (pp *programmaticProvider) subjectToken(ctx context.Context) (string, error) { return pp.stp.SubjectToken(ctx, pp.opts) } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/url_provider.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccount import ( "context" "encoding/json" "errors" "fmt" "log/slog" "net/http" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/credsfile" "github.com/googleapis/gax-go/v2/internallog" ) const ( fileTypeText = "text" fileTypeJSON = "json" urlProviderType = "url" programmaticProviderType = "programmatic" x509ProviderType = "x509" ) type urlSubjectProvider struct { URL string Headers map[string]string Format *credsfile.Format Client *http.Client Logger *slog.Logger } func (sp *urlSubjectProvider) subjectToken(ctx context.Context) (string, error) { req, err := http.NewRequestWithContext(ctx, "GET", sp.URL, nil) if err != nil { return "", fmt.Errorf("credentials: HTTP request for URL-sourced credential failed: %w", err) } for key, val := range sp.Headers { req.Header.Add(key, val) } sp.Logger.DebugContext(ctx, "url subject token request", "request", internallog.HTTPRequest(req, nil)) resp, body, err := internal.DoRequest(sp.Client, req) if err != nil { return "", fmt.Errorf("credentials: invalid response when retrieving subject token: %w", err) } sp.Logger.DebugContext(ctx, "url subject token response", "response", internallog.HTTPResponse(resp, body)) if c := resp.StatusCode; c < http.StatusOK || c >= http.StatusMultipleChoices { return "", fmt.Errorf("credentials: status code %d: %s", c, body) } if sp.Format == nil { return string(body), nil } switch sp.Format.Type { case "json": jsonData := make(map[string]interface{}) err = json.Unmarshal(body, &jsonData) if err != nil { return "", fmt.Errorf("credentials: failed to unmarshal subject token file: %w", err) } val, ok := jsonData[sp.Format.SubjectTokenFieldName] if !ok { return "", errors.New("credentials: provided subject_token_field_name not found in credentials") } token, ok := val.(string) if !ok { return "", errors.New("credentials: improperly formatted subject token") } return token, nil case fileTypeText: return string(body), nil default: return "", errors.New("credentials: invalid credential_source file format type: " + sp.Format.Type) } } func (sp *urlSubjectProvider) providerType() string { return urlProviderType } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/x509_provider.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccount import ( "context" "crypto/tls" "crypto/x509" "encoding/base64" "encoding/json" "encoding/pem" "errors" "fmt" "io/fs" "net/http" "os" "strings" "time" "cloud.google.com/go/auth/internal/transport/cert" ) // x509Provider implements the subjectTokenProvider type for x509 workload // identity credentials. This provider retrieves and formats a JSON array // containing the leaf certificate and trust chain (if provided) as // base64-encoded strings. This JSON array serves as the subject token for // mTLS authentication. type x509Provider struct { // TrustChainPath is the path to the file containing the trust chain certificates. // The file should contain one or more PEM-encoded certificates. TrustChainPath string // ConfigFilePath is the path to the configuration file containing the path // to the leaf certificate file. ConfigFilePath string } const pemCertificateHeader = "-----BEGIN CERTIFICATE-----" func (xp *x509Provider) providerType() string { return x509ProviderType } // loadLeafCertificate loads and parses the leaf certificate from the specified // configuration file. It retrieves the certificate path from the config file, // reads the certificate file, and parses the certificate data. func loadLeafCertificate(configFilePath string) (*x509.Certificate, error) { // Get the path to the certificate file from the configuration file. path, err := cert.GetCertificatePath(configFilePath) if err != nil { return nil, fmt.Errorf("failed to get certificate path from config file: %w", err) } leafCertBytes, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("failed to read leaf certificate file: %w", err) } // Parse the certificate bytes. return parseCertificate(leafCertBytes) } // encodeCert encodes a x509.Certificate to a base64 string. func encodeCert(cert *x509.Certificate) string { // cert.Raw contains the raw DER-encoded certificate. Encode the raw certificate bytes to base64. return base64.StdEncoding.EncodeToString(cert.Raw) } // parseCertificate parses a PEM-encoded certificate from the given byte slice. func parseCertificate(certData []byte) (*x509.Certificate, error) { if len(certData) == 0 { return nil, errors.New("invalid certificate data: empty input") } // Decode the PEM-encoded data. block, _ := pem.Decode(certData) if block == nil { return nil, errors.New("invalid PEM-encoded certificate data: no PEM block found") } if block.Type != "CERTIFICATE" { return nil, fmt.Errorf("invalid PEM-encoded certificate data: expected CERTIFICATE block type, got %s", block.Type) } // Parse the DER-encoded certificate. certificate, err := x509.ParseCertificate(block.Bytes) if err != nil { return nil, fmt.Errorf("failed to parse certificate: %w", err) } return certificate, nil } // readTrustChain reads a file of PEM-encoded X.509 certificates and returns a slice of parsed certificates. // It splits the file content into PEM certificate blocks and parses each one. func readTrustChain(trustChainPath string) ([]*x509.Certificate, error) { certificateTrustChain := []*x509.Certificate{} // If no trust chain path is provided, return an empty slice. if trustChainPath == "" { return certificateTrustChain, nil } // Read the trust chain file. trustChainData, err := os.ReadFile(trustChainPath) if err != nil { if errors.Is(err, fs.ErrNotExist) { return nil, fmt.Errorf("trust chain file not found: %w", err) } return nil, fmt.Errorf("failed to read trust chain file: %w", err) } // Split the file content into PEM certificate blocks. certBlocks := strings.Split(string(trustChainData), pemCertificateHeader) // Iterate over each certificate block. for _, certBlock := range certBlocks { // Trim whitespace from the block. certBlock = strings.TrimSpace(certBlock) if certBlock != "" { // Add the PEM header to the block. certData := pemCertificateHeader + "\n" + certBlock // Parse the certificate data. cert, err := parseCertificate([]byte(certData)) if err != nil { return nil, fmt.Errorf("error parsing certificate from trust chain file: %w", err) } // Append the certificate to the trust chain. certificateTrustChain = append(certificateTrustChain, cert) } } return certificateTrustChain, nil } // subjectToken retrieves the X.509 subject token. It loads the leaf // certificate and, if a trust chain path is configured, the trust chain // certificates. It then constructs a JSON array containing the base64-encoded // leaf certificate and each base64-encoded certificate in the trust chain. // The leaf certificate must be at the top of the trust chain file. This JSON // array is used as the subject token for mTLS authentication. func (xp *x509Provider) subjectToken(context.Context) (string, error) { // Load the leaf certificate. leafCert, err := loadLeafCertificate(xp.ConfigFilePath) if err != nil { return "", fmt.Errorf("failed to load leaf certificate: %w", err) } // Read the trust chain. trustChain, err := readTrustChain(xp.TrustChainPath) if err != nil { return "", fmt.Errorf("failed to read trust chain: %w", err) } // Initialize the certificate chain with the leaf certificate. certChain := []string{encodeCert(leafCert)} // If there is a trust chain, add certificates to the certificate chain. if len(trustChain) > 0 { firstCert := encodeCert(trustChain[0]) // If the first certificate in the trust chain is not the same as the leaf certificate, add it to the chain. if firstCert != certChain[0] { certChain = append(certChain, firstCert) } // Iterate over the remaining certificates in the trust chain. for i := 1; i < len(trustChain); i++ { encoded := encodeCert(trustChain[i]) // Return an error if the current certificate is the same as the leaf certificate. if encoded == certChain[0] { return "", errors.New("the leaf certificate must be at the top of the trust chain file") } // Add the current certificate to the chain. certChain = append(certChain, encoded) } } // Convert the certificate chain to a JSON array of base64-encoded strings. jsonChain, err := json.Marshal(certChain) if err != nil { return "", fmt.Errorf("failed to format certificate data: %w", err) } // Return the JSON-formatted certificate chain. return string(jsonChain), nil } // createX509Client creates a new client that is configured with mTLS, using the // certificate configuration specified in the credential source. func createX509Client(certificateConfigLocation string) (*http.Client, error) { certProvider, err := cert.NewWorkloadX509CertProvider(certificateConfigLocation) if err != nil { return nil, err } trans := http.DefaultTransport.(*http.Transport).Clone() trans.TLSClientConfig = &tls.Config{ GetClientCertificate: certProvider, } // Create a client with default settings plus the X509 workload cert and key. client := &http.Client{ Transport: trans, Timeout: 30 * time.Second, } return client, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/externalaccountuser/externalaccountuser.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package externalaccountuser import ( "context" "errors" "log/slog" "net/http" "time" "cloud.google.com/go/auth" "cloud.google.com/go/auth/credentials/internal/stsexchange" "cloud.google.com/go/auth/internal" "github.com/googleapis/gax-go/v2/internallog" ) // Options stores the configuration for fetching tokens with external authorized // user credentials. type Options struct { // Audience is the Secure Token Service (STS) audience which contains the // resource name for the workforce pool and the provider identifier in that // pool. Audience string // RefreshToken is the OAuth 2.0 refresh token. RefreshToken string // TokenURL is the STS token exchange endpoint for refresh. TokenURL string // TokenInfoURL is the STS endpoint URL for token introspection. Optional. TokenInfoURL string // ClientID is only required in conjunction with ClientSecret, as described // below. ClientID string // ClientSecret is currently only required if token_info endpoint also needs // to be called with the generated a cloud access token. When provided, STS // will be called with additional basic authentication using client_id as // username and client_secret as password. ClientSecret string // Scopes contains the desired scopes for the returned access token. Scopes []string // Client for token request. Client *http.Client // Logger for logging. Logger *slog.Logger } func (c *Options) validate() bool { return c.ClientID != "" && c.ClientSecret != "" && c.RefreshToken != "" && c.TokenURL != "" } // NewTokenProvider returns a [cloud.google.com/go/auth.TokenProvider] // configured with the provided options. func NewTokenProvider(opts *Options) (auth.TokenProvider, error) { if !opts.validate() { return nil, errors.New("credentials: invalid external_account_authorized_user configuration") } tp := &tokenProvider{ o: opts, } return auth.NewCachedTokenProvider(tp, nil), nil } type tokenProvider struct { o *Options } func (tp *tokenProvider) Token(ctx context.Context) (*auth.Token, error) { opts := tp.o clientAuth := stsexchange.ClientAuthentication{ AuthStyle: auth.StyleInHeader, ClientID: opts.ClientID, ClientSecret: opts.ClientSecret, } headers := make(http.Header) headers.Set("Content-Type", "application/x-www-form-urlencoded") stsResponse, err := stsexchange.RefreshAccessToken(ctx, &stsexchange.Options{ Client: opts.Client, Endpoint: opts.TokenURL, RefreshToken: opts.RefreshToken, Authentication: clientAuth, Headers: headers, Logger: internallog.New(tp.o.Logger), }) if err != nil { return nil, err } if stsResponse.ExpiresIn < 0 { return nil, errors.New("credentials: invalid expiry from security token service") } // guarded by the wrapping with CachedTokenProvider if stsResponse.RefreshToken != "" { opts.RefreshToken = stsResponse.RefreshToken } return &auth.Token{ Value: stsResponse.AccessToken, Expiry: time.Now().UTC().Add(time.Duration(stsResponse.ExpiresIn) * time.Second), Type: internal.TokenTypeBearer, }, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/gdch/gdch.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gdch import ( "context" "crypto" "crypto/tls" "crypto/x509" "encoding/json" "errors" "fmt" "log/slog" "net/http" "net/url" "os" "strings" "time" "cloud.google.com/go/auth" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/credsfile" "cloud.google.com/go/auth/internal/jwt" "github.com/googleapis/gax-go/v2/internallog" ) const ( // GrantType is the grant type for the token request. GrantType = "urn:ietf:params:oauth:token-type:token-exchange" requestTokenType = "urn:ietf:params:oauth:token-type:access_token" subjectTokenType = "urn:k8s:params:oauth:token-type:serviceaccount" ) var ( gdchSupportFormatVersions map[string]bool = map[string]bool{ "1": true, } ) // Options for [NewTokenProvider]. type Options struct { STSAudience string Client *http.Client Logger *slog.Logger } // NewTokenProvider returns a [cloud.google.com/go/auth.TokenProvider] from a // GDCH cred file. func NewTokenProvider(f *credsfile.GDCHServiceAccountFile, o *Options) (auth.TokenProvider, error) { if !gdchSupportFormatVersions[f.FormatVersion] { return nil, fmt.Errorf("credentials: unsupported gdch_service_account format %q", f.FormatVersion) } if o.STSAudience == "" { return nil, errors.New("credentials: STSAudience must be set for the GDCH auth flows") } signer, err := internal.ParseKey([]byte(f.PrivateKey)) if err != nil { return nil, err } certPool, err := loadCertPool(f.CertPath) if err != nil { return nil, err } tp := gdchProvider{ serviceIdentity: fmt.Sprintf("system:serviceaccount:%s:%s", f.Project, f.Name), tokenURL: f.TokenURL, aud: o.STSAudience, signer: signer, pkID: f.PrivateKeyID, certPool: certPool, client: o.Client, logger: internallog.New(o.Logger), } return tp, nil } func loadCertPool(path string) (*x509.CertPool, error) { pool := x509.NewCertPool() pem, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("credentials: failed to read certificate: %w", err) } pool.AppendCertsFromPEM(pem) return pool, nil } type gdchProvider struct { serviceIdentity string tokenURL string aud string signer crypto.Signer pkID string certPool *x509.CertPool client *http.Client logger *slog.Logger } func (g gdchProvider) Token(ctx context.Context) (*auth.Token, error) { addCertToTransport(g.client, g.certPool) iat := time.Now() exp := iat.Add(time.Hour) claims := jwt.Claims{ Iss: g.serviceIdentity, Sub: g.serviceIdentity, Aud: g.tokenURL, Iat: iat.Unix(), Exp: exp.Unix(), } h := jwt.Header{ Algorithm: jwt.HeaderAlgRSA256, Type: jwt.HeaderType, KeyID: string(g.pkID), } payload, err := jwt.EncodeJWS(&h, &claims, g.signer) if err != nil { return nil, err } v := url.Values{} v.Set("grant_type", GrantType) v.Set("audience", g.aud) v.Set("requested_token_type", requestTokenType) v.Set("subject_token", payload) v.Set("subject_token_type", subjectTokenType) req, err := http.NewRequestWithContext(ctx, "POST", g.tokenURL, strings.NewReader(v.Encode())) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") g.logger.DebugContext(ctx, "gdch token request", "request", internallog.HTTPRequest(req, []byte(v.Encode()))) resp, body, err := internal.DoRequest(g.client, req) if err != nil { return nil, fmt.Errorf("credentials: cannot fetch token: %w", err) } g.logger.DebugContext(ctx, "gdch token response", "response", internallog.HTTPResponse(resp, body)) if c := resp.StatusCode; c < http.StatusOK || c > http.StatusMultipleChoices { return nil, &auth.Error{ Response: resp, Body: body, } } var tokenRes struct { AccessToken string `json:"access_token"` TokenType string `json:"token_type"` ExpiresIn int64 `json:"expires_in"` // relative seconds from now } if err := json.Unmarshal(body, &tokenRes); err != nil { return nil, fmt.Errorf("credentials: cannot fetch token: %w", err) } token := &auth.Token{ Value: tokenRes.AccessToken, Type: tokenRes.TokenType, } raw := make(map[string]interface{}) json.Unmarshal(body, &raw) // no error checks for optional fields token.Metadata = raw if secs := tokenRes.ExpiresIn; secs > 0 { token.Expiry = time.Now().Add(time.Duration(secs) * time.Second) } return token, nil } // addCertToTransport makes a best effort attempt at adding in the cert info to // the client. It tries to keep all configured transport settings if the // underlying transport is an http.Transport. Or else it overwrites the // transport with defaults adding in the certs. func addCertToTransport(hc *http.Client, certPool *x509.CertPool) { trans, ok := hc.Transport.(*http.Transport) if !ok { trans = http.DefaultTransport.(*http.Transport).Clone() } trans.TLSClientConfig = &tls.Config{ RootCAs: certPool, } } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/impersonate/idtoken.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package impersonate import ( "bytes" "context" "encoding/json" "fmt" "log/slog" "net/http" "strings" "time" "cloud.google.com/go/auth" "cloud.google.com/go/auth/internal" "github.com/googleapis/gax-go/v2/internallog" ) var ( universeDomainPlaceholder = "UNIVERSE_DOMAIN" iamCredentialsUniverseDomainEndpoint = "https://iamcredentials.UNIVERSE_DOMAIN" ) // IDTokenIAMOptions provides configuration for [IDTokenIAMOptions.Token]. type IDTokenIAMOptions struct { // Client is required. Client *http.Client // Logger is required. Logger *slog.Logger UniverseDomain auth.CredentialsPropertyProvider ServiceAccountEmail string GenerateIDTokenRequest } // GenerateIDTokenRequest holds the request to the IAM generateIdToken RPC. type GenerateIDTokenRequest struct { Audience string `json:"audience"` IncludeEmail bool `json:"includeEmail"` // Delegates are the ordered, fully-qualified resource name for service // accounts in a delegation chain. Each service account must be granted // roles/iam.serviceAccountTokenCreator on the next service account in the // chain. The delegates must have the following format: // projects/-/serviceAccounts/{ACCOUNT_EMAIL_OR_UNIQUEID}. The - wildcard // character is required; replacing it with a project ID is invalid. // Optional. Delegates []string `json:"delegates,omitempty"` } // GenerateIDTokenResponse holds the response from the IAM generateIdToken RPC. type GenerateIDTokenResponse struct { Token string `json:"token"` } // Token call IAM generateIdToken with the configuration provided in [IDTokenIAMOptions]. func (o IDTokenIAMOptions) Token(ctx context.Context) (*auth.Token, error) { universeDomain, err := o.UniverseDomain.GetProperty(ctx) if err != nil { return nil, err } endpoint := strings.Replace(iamCredentialsUniverseDomainEndpoint, universeDomainPlaceholder, universeDomain, 1) url := fmt.Sprintf("%s/v1/%s:generateIdToken", endpoint, internal.FormatIAMServiceAccountResource(o.ServiceAccountEmail)) bodyBytes, err := json.Marshal(o.GenerateIDTokenRequest) if err != nil { return nil, fmt.Errorf("impersonate: unable to marshal request: %w", err) } req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewReader(bodyBytes)) if err != nil { return nil, fmt.Errorf("impersonate: unable to create request: %w", err) } req.Header.Set("Content-Type", "application/json") o.Logger.DebugContext(ctx, "impersonated idtoken request", "request", internallog.HTTPRequest(req, bodyBytes)) resp, body, err := internal.DoRequest(o.Client, req) if err != nil { return nil, fmt.Errorf("impersonate: unable to generate ID token: %w", err) } o.Logger.DebugContext(ctx, "impersonated idtoken response", "response", internallog.HTTPResponse(resp, body)) if c := resp.StatusCode; c < 200 || c > 299 { return nil, fmt.Errorf("impersonate: status code %d: %s", c, body) } var tokenResp GenerateIDTokenResponse if err := json.Unmarshal(body, &tokenResp); err != nil { return nil, fmt.Errorf("impersonate: unable to parse response: %w", err) } return &auth.Token{ Value: tokenResp.Token, // Generated ID tokens are good for one hour. Expiry: time.Now().Add(1 * time.Hour), }, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/impersonate/impersonate.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package impersonate import ( "bytes" "context" "encoding/json" "errors" "fmt" "log/slog" "net/http" "time" "cloud.google.com/go/auth" "cloud.google.com/go/auth/internal" "github.com/googleapis/gax-go/v2/internallog" ) const ( defaultTokenLifetime = "3600s" authHeaderKey = "Authorization" ) // generateAccesstokenReq is used for service account impersonation type generateAccessTokenReq struct { Delegates []string `json:"delegates,omitempty"` Lifetime string `json:"lifetime,omitempty"` Scope []string `json:"scope,omitempty"` } type impersonateTokenResponse struct { AccessToken string `json:"accessToken"` ExpireTime string `json:"expireTime"` } // NewTokenProvider uses a source credential, stored in Ts, to request an access token to the provided URL. // Scopes can be defined when the access token is requested. func NewTokenProvider(opts *Options) (auth.TokenProvider, error) { if err := opts.validate(); err != nil { return nil, err } return opts, nil } // Options for [NewTokenProvider]. type Options struct { // Tp is the source credential used to generate a token on the // impersonated service account. Required. Tp auth.TokenProvider // URL is the endpoint to call to generate a token // on behalf of the service account. Required. URL string // Scopes that the impersonated credential should have. Required. Scopes []string // Delegates are the service account email addresses in a delegation chain. // Each service account must be granted roles/iam.serviceAccountTokenCreator // on the next service account in the chain. Optional. Delegates []string // TokenLifetimeSeconds is the number of seconds the impersonation token will // be valid for. Defaults to 1 hour if unset. Optional. TokenLifetimeSeconds int // Client configures the underlying client used to make network requests // when fetching tokens. Required. Client *http.Client // Logger is used for debug logging. If provided, logging will be enabled // at the loggers configured level. By default logging is disabled unless // enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default // logger will be used. Optional. Logger *slog.Logger } func (o *Options) validate() error { if o.Tp == nil { return errors.New("credentials: missing required 'source_credentials' field in impersonated credentials") } if o.URL == "" { return errors.New("credentials: missing required 'service_account_impersonation_url' field in impersonated credentials") } return nil } // Token performs the exchange to get a temporary service account token to allow access to GCP. func (o *Options) Token(ctx context.Context) (*auth.Token, error) { logger := internallog.New(o.Logger) lifetime := defaultTokenLifetime if o.TokenLifetimeSeconds != 0 { lifetime = fmt.Sprintf("%ds", o.TokenLifetimeSeconds) } reqBody := generateAccessTokenReq{ Lifetime: lifetime, Scope: o.Scopes, Delegates: o.Delegates, } b, err := json.Marshal(reqBody) if err != nil { return nil, fmt.Errorf("credentials: unable to marshal request: %w", err) } req, err := http.NewRequestWithContext(ctx, "POST", o.URL, bytes.NewReader(b)) if err != nil { return nil, fmt.Errorf("credentials: unable to create impersonation request: %w", err) } req.Header.Set("Content-Type", "application/json") if err := setAuthHeader(ctx, o.Tp, req); err != nil { return nil, err } logger.DebugContext(ctx, "impersonated token request", "request", internallog.HTTPRequest(req, b)) resp, body, err := internal.DoRequest(o.Client, req) if err != nil { return nil, fmt.Errorf("credentials: unable to generate access token: %w", err) } logger.DebugContext(ctx, "impersonated token response", "response", internallog.HTTPResponse(resp, body)) if c := resp.StatusCode; c < http.StatusOK || c >= http.StatusMultipleChoices { return nil, fmt.Errorf("credentials: status code %d: %s", c, body) } var accessTokenResp impersonateTokenResponse if err := json.Unmarshal(body, &accessTokenResp); err != nil { return nil, fmt.Errorf("credentials: unable to parse response: %w", err) } expiry, err := time.Parse(time.RFC3339, accessTokenResp.ExpireTime) if err != nil { return nil, fmt.Errorf("credentials: unable to parse expiry: %w", err) } return &auth.Token{ Value: accessTokenResp.AccessToken, Expiry: expiry, Type: internal.TokenTypeBearer, }, nil } func setAuthHeader(ctx context.Context, tp auth.TokenProvider, r *http.Request) error { t, err := tp.Token(ctx) if err != nil { return err } typ := t.Type if typ == "" { typ = internal.TokenTypeBearer } r.Header.Set(authHeaderKey, typ+" "+t.Value) return nil } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/internal/stsexchange/sts_exchange.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package stsexchange import ( "context" "encoding/base64" "encoding/json" "fmt" "log/slog" "net/http" "net/url" "strconv" "strings" "cloud.google.com/go/auth" "cloud.google.com/go/auth/internal" "github.com/googleapis/gax-go/v2/internallog" ) const ( // GrantType for a sts exchange. GrantType = "urn:ietf:params:oauth:grant-type:token-exchange" // TokenType for a sts exchange. TokenType = "urn:ietf:params:oauth:token-type:access_token" jwtTokenType = "urn:ietf:params:oauth:token-type:jwt" ) // Options stores the configuration for making an sts exchange request. type Options struct { Client *http.Client Logger *slog.Logger Endpoint string Request *TokenRequest Authentication ClientAuthentication Headers http.Header // ExtraOpts are optional fields marshalled into the `options` field of the // request body. ExtraOpts map[string]interface{} RefreshToken string } // RefreshAccessToken performs the token exchange using a refresh token flow. func RefreshAccessToken(ctx context.Context, opts *Options) (*TokenResponse, error) { data := url.Values{} data.Set("grant_type", "refresh_token") data.Set("refresh_token", opts.RefreshToken) return doRequest(ctx, opts, data) } // ExchangeToken performs an oauth2 token exchange with the provided endpoint. func ExchangeToken(ctx context.Context, opts *Options) (*TokenResponse, error) { data := url.Values{} data.Set("audience", opts.Request.Audience) data.Set("grant_type", GrantType) data.Set("requested_token_type", TokenType) data.Set("subject_token_type", opts.Request.SubjectTokenType) data.Set("subject_token", opts.Request.SubjectToken) data.Set("scope", strings.Join(opts.Request.Scope, " ")) if opts.ExtraOpts != nil { opts, err := json.Marshal(opts.ExtraOpts) if err != nil { return nil, fmt.Errorf("credentials: failed to marshal additional options: %w", err) } data.Set("options", string(opts)) } return doRequest(ctx, opts, data) } func doRequest(ctx context.Context, opts *Options, data url.Values) (*TokenResponse, error) { opts.Authentication.InjectAuthentication(data, opts.Headers) encodedData := data.Encode() logger := internallog.New(opts.Logger) req, err := http.NewRequestWithContext(ctx, "POST", opts.Endpoint, strings.NewReader(encodedData)) if err != nil { return nil, fmt.Errorf("credentials: failed to properly build http request: %w", err) } for key, list := range opts.Headers { for _, val := range list { req.Header.Add(key, val) } } req.Header.Set("Content-Length", strconv.Itoa(len(encodedData))) logger.DebugContext(ctx, "sts token request", "request", internallog.HTTPRequest(req, []byte(encodedData))) resp, body, err := internal.DoRequest(opts.Client, req) if err != nil { return nil, fmt.Errorf("credentials: invalid response from Secure Token Server: %w", err) } logger.DebugContext(ctx, "sts token response", "response", internallog.HTTPResponse(resp, body)) if c := resp.StatusCode; c < http.StatusOK || c > http.StatusMultipleChoices { return nil, fmt.Errorf("credentials: status code %d: %s", c, body) } var stsResp TokenResponse if err := json.Unmarshal(body, &stsResp); err != nil { return nil, fmt.Errorf("credentials: failed to unmarshal response body from Secure Token Server: %w", err) } return &stsResp, nil } // TokenRequest contains fields necessary to make an oauth2 token // exchange. type TokenRequest struct { ActingParty struct { ActorToken string ActorTokenType string } GrantType string Resource string Audience string Scope []string RequestedTokenType string SubjectToken string SubjectTokenType string } // TokenResponse is used to decode the remote server response during // an oauth2 token exchange. type TokenResponse struct { AccessToken string `json:"access_token"` IssuedTokenType string `json:"issued_token_type"` TokenType string `json:"token_type"` ExpiresIn int `json:"expires_in"` Scope string `json:"scope"` RefreshToken string `json:"refresh_token"` } // ClientAuthentication represents an OAuth client ID and secret and the // mechanism for passing these credentials as stated in rfc6749#2.3.1. type ClientAuthentication struct { AuthStyle auth.Style ClientID string ClientSecret string } // InjectAuthentication is used to add authentication to a Secure Token Service // exchange request. It modifies either the passed url.Values or http.Header // depending on the desired authentication format. func (c *ClientAuthentication) InjectAuthentication(values url.Values, headers http.Header) { if c.ClientID == "" || c.ClientSecret == "" || values == nil || headers == nil { return } switch c.AuthStyle { case auth.StyleInHeader: plainHeader := c.ClientID + ":" + c.ClientSecret headers.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(plainHeader))) default: values.Set("client_id", c.ClientID) values.Set("client_secret", c.ClientSecret) } } ================================================ FILE: vendor/cloud.google.com/go/auth/credentials/selfsignedjwt.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package credentials import ( "context" "crypto" "errors" "fmt" "log/slog" "strings" "time" "cloud.google.com/go/auth" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/credsfile" "cloud.google.com/go/auth/internal/jwt" ) var ( // for testing now func() time.Time = time.Now ) // configureSelfSignedJWT uses the private key in the service account to create // a JWT without making a network call. func configureSelfSignedJWT(f *credsfile.ServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) { if len(opts.scopes()) == 0 && opts.Audience == "" { return nil, errors.New("credentials: both scopes and audience are empty") } signer, err := internal.ParseKey([]byte(f.PrivateKey)) if err != nil { return nil, fmt.Errorf("credentials: could not parse key: %w", err) } return &selfSignedTokenProvider{ email: f.ClientEmail, audience: opts.Audience, scopes: opts.scopes(), signer: signer, pkID: f.PrivateKeyID, logger: opts.logger(), }, nil } type selfSignedTokenProvider struct { email string audience string scopes []string signer crypto.Signer pkID string logger *slog.Logger } func (tp *selfSignedTokenProvider) Token(context.Context) (*auth.Token, error) { iat := now() exp := iat.Add(time.Hour) scope := strings.Join(tp.scopes, " ") c := &jwt.Claims{ Iss: tp.email, Sub: tp.email, Aud: tp.audience, Scope: scope, Iat: iat.Unix(), Exp: exp.Unix(), } h := &jwt.Header{ Algorithm: jwt.HeaderAlgRSA256, Type: jwt.HeaderType, KeyID: string(tp.pkID), } tok, err := jwt.EncodeJWS(h, c, tp.signer) if err != nil { return nil, fmt.Errorf("credentials: could not encode JWT: %w", err) } tp.logger.Debug("created self-signed JWT", "token", tok) return &auth.Token{Value: tok, Type: internal.TokenTypeBearer, Expiry: exp}, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/grpctransport/dial_socketopt.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build linux // +build linux package grpctransport import ( "context" "net" "syscall" "google.golang.org/grpc" ) const ( // defaultTCPUserTimeout is the default TCP_USER_TIMEOUT socket option. By // default is 20 seconds. tcpUserTimeoutMilliseconds = 20000 // Copied from golang.org/x/sys/unix.TCP_USER_TIMEOUT. tcpUserTimeoutOp = 0x12 ) func init() { // timeoutDialerOption is a grpc.DialOption that contains dialer with // socket option TCP_USER_TIMEOUT. This dialer requires go versions 1.11+. timeoutDialerOption = grpc.WithContextDialer(dialTCPUserTimeout) } func dialTCPUserTimeout(ctx context.Context, addr string) (net.Conn, error) { control := func(network, address string, c syscall.RawConn) error { var syscallErr error controlErr := c.Control(func(fd uintptr) { syscallErr = syscall.SetsockoptInt( int(fd), syscall.IPPROTO_TCP, tcpUserTimeoutOp, tcpUserTimeoutMilliseconds) }) if syscallErr != nil { return syscallErr } if controlErr != nil { return controlErr } return nil } d := &net.Dialer{ Control: control, } return d.DialContext(ctx, "tcp", addr) } ================================================ FILE: vendor/cloud.google.com/go/auth/grpctransport/directpath.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package grpctransport import ( "context" "net" "os" "strconv" "strings" "cloud.google.com/go/auth" "cloud.google.com/go/auth/credentials" "cloud.google.com/go/auth/internal/compute" "google.golang.org/grpc" grpcgoogle "google.golang.org/grpc/credentials/google" ) func isDirectPathEnabled(endpoint string, opts *Options) bool { if opts.InternalOptions != nil && !opts.InternalOptions.EnableDirectPath { return false } if !checkDirectPathEndPoint(endpoint) { return false } if b, _ := strconv.ParseBool(os.Getenv(disableDirectPathEnvVar)); b { return false } return true } func checkDirectPathEndPoint(endpoint string) bool { // Only [dns:///]host[:port] is supported, not other schemes (e.g., "tcp://" or "unix://"). // Also don't try direct path if the user has chosen an alternate name resolver // (i.e., via ":///" prefix). if strings.Contains(endpoint, "://") && !strings.HasPrefix(endpoint, "dns:///") { return false } if endpoint == "" { return false } return true } func isTokenProviderComputeEngine(tp auth.TokenProvider) bool { if tp == nil { return false } tok, err := tp.Token(context.Background()) if err != nil { return false } if tok == nil { return false } if tok.MetadataString("auth.google.tokenSource") != "compute-metadata" { return false } if tok.MetadataString("auth.google.serviceAccount") != "default" { return false } return true } func isTokenProviderDirectPathCompatible(tp auth.TokenProvider, o *Options) bool { if tp == nil { return false } if o.InternalOptions != nil && o.InternalOptions.EnableNonDefaultSAForDirectPath { return true } return isTokenProviderComputeEngine(tp) } func isDirectPathXdsUsed(o *Options) bool { // Method 1: Enable DirectPath xDS by env; if b, _ := strconv.ParseBool(os.Getenv(enableDirectPathXdsEnvVar)); b { return true } // Method 2: Enable DirectPath xDS by option; if o.InternalOptions != nil && o.InternalOptions.EnableDirectPathXds { return true } return false } func isDirectPathBoundTokenEnabled(opts *InternalOptions) bool { for _, ev := range opts.AllowHardBoundTokens { if ev == "ALTS" { return true } } return false } // configureDirectPath returns some dial options and an endpoint to use if the // configuration allows the use of direct path. If it does not the provided // grpcOpts and endpoint are returned. func configureDirectPath(grpcOpts []grpc.DialOption, opts *Options, endpoint string, creds *auth.Credentials) ([]grpc.DialOption, string, error) { if isDirectPathEnabled(endpoint, opts) && compute.OnComputeEngine() && isTokenProviderDirectPathCompatible(creds, opts) { // Overwrite all of the previously specific DialOptions, DirectPath uses its own set of credentials and certificates. defaultCredetialsOptions := grpcgoogle.DefaultCredentialsOptions{PerRPCCreds: &grpcCredentialsProvider{creds: creds}} if isDirectPathBoundTokenEnabled(opts.InternalOptions) && isTokenProviderComputeEngine(creds) { optsClone := opts.resolveDetectOptions() optsClone.TokenBindingType = credentials.ALTSHardBinding altsCreds, err := credentials.DetectDefault(optsClone) if err != nil { return nil, "", err } defaultCredetialsOptions.ALTSPerRPCCreds = &grpcCredentialsProvider{creds: altsCreds} } grpcOpts = []grpc.DialOption{ grpc.WithCredentialsBundle(grpcgoogle.NewDefaultCredentialsWithOptions(defaultCredetialsOptions))} if timeoutDialerOption != nil { grpcOpts = append(grpcOpts, timeoutDialerOption) } // Check if google-c2p resolver is enabled for DirectPath if isDirectPathXdsUsed(opts) { // google-c2p resolver target must not have a port number if addr, _, err := net.SplitHostPort(endpoint); err == nil { endpoint = "google-c2p:///" + addr } else { endpoint = "google-c2p:///" + endpoint } } else { if !strings.HasPrefix(endpoint, "dns:///") { endpoint = "dns:///" + endpoint } grpcOpts = append(grpcOpts, // For now all DirectPath go clients will be using the following lb config, but in future // when different services need different configs, then we should change this to a // per-service config. grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig(`{"loadBalancingConfig":[{"grpclb":{"childPolicy":[{"pick_first":{}}]}}]}`)) } // TODO: add support for system parameters (quota project, request reason) via chained interceptor. } return grpcOpts, endpoint, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/grpctransport/grpctransport.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package grpctransport provides functionality for managing gRPC client // connections to Google Cloud services. package grpctransport import ( "context" "crypto/tls" "errors" "fmt" "log/slog" "net/http" "os" "sync" "cloud.google.com/go/auth" "cloud.google.com/go/auth/credentials" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/transport" "github.com/googleapis/gax-go/v2/internallog" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "google.golang.org/grpc" grpccreds "google.golang.org/grpc/credentials" grpcinsecure "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/stats" ) const ( // Check env to disable DirectPath traffic. disableDirectPathEnvVar = "GOOGLE_CLOUD_DISABLE_DIRECT_PATH" // Check env to decide if using google-c2p resolver for DirectPath traffic. enableDirectPathXdsEnvVar = "GOOGLE_CLOUD_ENABLE_DIRECT_PATH_XDS" quotaProjectHeaderKey = "X-goog-user-project" ) var ( // Set at init time by dial_socketopt.go. If nil, socketopt is not supported. timeoutDialerOption grpc.DialOption ) // otelStatsHandler is a singleton otelgrpc.clientHandler to be used across // all dial connections to avoid the memory leak documented in // https://github.com/open-telemetry/opentelemetry-go-contrib/issues/4226 // // TODO: When this module depends on a version of otelgrpc containing the fix, // replace this singleton with inline usage for simplicity. // The fix should be in https://github.com/open-telemetry/opentelemetry-go/pull/5797. var ( initOtelStatsHandlerOnce sync.Once otelStatsHandler stats.Handler ) // otelGRPCStatsHandler returns singleton otelStatsHandler for reuse across all // dial connections. func otelGRPCStatsHandler() stats.Handler { initOtelStatsHandlerOnce.Do(func() { otelStatsHandler = otelgrpc.NewClientHandler() }) return otelStatsHandler } // ClientCertProvider is a function that returns a TLS client certificate to be // used when opening TLS connections. It follows the same semantics as // [crypto/tls.Config.GetClientCertificate]. type ClientCertProvider = func(*tls.CertificateRequestInfo) (*tls.Certificate, error) // Options used to configure a [GRPCClientConnPool] from [Dial]. type Options struct { // DisableTelemetry disables default telemetry (OpenTelemetry). An example // reason to do so would be to bind custom telemetry that overrides the // defaults. DisableTelemetry bool // DisableAuthentication specifies that no authentication should be used. It // is suitable only for testing and for accessing public resources, like // public Google Cloud Storage buckets. DisableAuthentication bool // Endpoint overrides the default endpoint to be used for a service. Endpoint string // Metadata is extra gRPC metadata that will be appended to every outgoing // request. Metadata map[string]string // GRPCDialOpts are dial options that will be passed to `grpc.Dial` when // establishing a`grpc.Conn`` GRPCDialOpts []grpc.DialOption // PoolSize is specifies how many connections to balance between when making // requests. If unset or less than 1, the value defaults to 1. PoolSize int // Credentials used to add Authorization metadata to all requests. If set // DetectOpts are ignored. Credentials *auth.Credentials // ClientCertProvider is a function that returns a TLS client certificate to // be used when opening TLS connections. It follows the same semantics as // crypto/tls.Config.GetClientCertificate. ClientCertProvider ClientCertProvider // DetectOpts configures settings for detect Application Default // Credentials. DetectOpts *credentials.DetectOptions // UniverseDomain is the default service domain for a given Cloud universe. // The default value is "googleapis.com". This is the universe domain // configured for the client, which will be compared to the universe domain // that is separately configured for the credentials. UniverseDomain string // APIKey specifies an API key to be used as the basis for authentication. // If set DetectOpts are ignored. APIKey string // Logger is used for debug logging. If provided, logging will be enabled // at the loggers configured level. By default logging is disabled unless // enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default // logger will be used. Optional. Logger *slog.Logger // InternalOptions are NOT meant to be set directly by consumers of this // package, they should only be set by generated client code. InternalOptions *InternalOptions } // client returns the client a user set for the detect options or nil if one was // not set. func (o *Options) client() *http.Client { if o.DetectOpts != nil && o.DetectOpts.Client != nil { return o.DetectOpts.Client } return nil } func (o *Options) logger() *slog.Logger { return internallog.New(o.Logger) } func (o *Options) validate() error { if o == nil { return errors.New("grpctransport: opts required to be non-nil") } if o.InternalOptions != nil && o.InternalOptions.SkipValidation { return nil } hasCreds := o.APIKey != "" || o.Credentials != nil || (o.DetectOpts != nil && len(o.DetectOpts.CredentialsJSON) > 0) || (o.DetectOpts != nil && o.DetectOpts.CredentialsFile != "") if o.DisableAuthentication && hasCreds { return errors.New("grpctransport: DisableAuthentication is incompatible with options that set or detect credentials") } return nil } func (o *Options) resolveDetectOptions() *credentials.DetectOptions { io := o.InternalOptions // soft-clone these so we are not updating a ref the user holds and may reuse do := transport.CloneDetectOptions(o.DetectOpts) // If scoped JWTs are enabled user provided an aud, allow self-signed JWT. if (io != nil && io.EnableJWTWithScope) || do.Audience != "" { do.UseSelfSignedJWT = true } // Only default scopes if user did not also set an audience. if len(do.Scopes) == 0 && do.Audience == "" && io != nil && len(io.DefaultScopes) > 0 { do.Scopes = make([]string, len(io.DefaultScopes)) copy(do.Scopes, io.DefaultScopes) } if len(do.Scopes) == 0 && do.Audience == "" && io != nil { do.Audience = o.InternalOptions.DefaultAudience } if o.ClientCertProvider != nil { tlsConfig := &tls.Config{ GetClientCertificate: o.ClientCertProvider, } do.Client = transport.DefaultHTTPClientWithTLS(tlsConfig) do.TokenURL = credentials.GoogleMTLSTokenURL } if do.Logger == nil { do.Logger = o.logger() } return do } // InternalOptions are only meant to be set by generated client code. These are // not meant to be set directly by consumers of this package. Configuration in // this type is considered EXPERIMENTAL and may be removed at any time in the // future without warning. type InternalOptions struct { // EnableNonDefaultSAForDirectPath overrides the default requirement for // using the default service account for DirectPath. EnableNonDefaultSAForDirectPath bool // EnableDirectPath overrides the default attempt to use DirectPath. EnableDirectPath bool // EnableDirectPathXds overrides the default DirectPath type. It is only // valid when DirectPath is enabled. EnableDirectPathXds bool // EnableJWTWithScope specifies if scope can be used with self-signed JWT. EnableJWTWithScope bool // AllowHardBoundTokens allows libraries to request a hard-bound token. // Obtaining hard-bound tokens requires the connection to be established // using either ALTS or mTLS with S2A. AllowHardBoundTokens []string // DefaultAudience specifies a default audience to be used as the audience // field ("aud") for the JWT token authentication. DefaultAudience string // DefaultEndpointTemplate combined with UniverseDomain specifies // the default endpoint. DefaultEndpointTemplate string // DefaultMTLSEndpoint specifies the default mTLS endpoint. DefaultMTLSEndpoint string // DefaultScopes specifies the default OAuth2 scopes to be used for a // service. DefaultScopes []string // SkipValidation bypasses validation on Options. It should only be used // internally for clients that needs more control over their transport. SkipValidation bool } // Dial returns a GRPCClientConnPool that can be used to communicate with a // Google cloud service, configured with the provided [Options]. It // automatically appends Authorization metadata to all outgoing requests. func Dial(ctx context.Context, secure bool, opts *Options) (GRPCClientConnPool, error) { if err := opts.validate(); err != nil { return nil, err } if opts.PoolSize <= 1 { conn, err := dial(ctx, secure, opts) if err != nil { return nil, err } return &singleConnPool{conn}, nil } pool := &roundRobinConnPool{} for i := 0; i < opts.PoolSize; i++ { conn, err := dial(ctx, secure, opts) if err != nil { // ignore close error, if any defer pool.Close() return nil, err } pool.conns = append(pool.conns, conn) } return pool, nil } // return a GRPCClientConnPool if pool == 1 or else a pool of of them if >1 func dial(ctx context.Context, secure bool, opts *Options) (*grpc.ClientConn, error) { tOpts := &transport.Options{ Endpoint: opts.Endpoint, ClientCertProvider: opts.ClientCertProvider, Client: opts.client(), UniverseDomain: opts.UniverseDomain, Logger: opts.logger(), } if io := opts.InternalOptions; io != nil { tOpts.DefaultEndpointTemplate = io.DefaultEndpointTemplate tOpts.DefaultMTLSEndpoint = io.DefaultMTLSEndpoint tOpts.EnableDirectPath = io.EnableDirectPath tOpts.EnableDirectPathXds = io.EnableDirectPathXds } transportCreds, err := transport.GetGRPCTransportCredsAndEndpoint(tOpts) if err != nil { return nil, err } if !secure { transportCreds.TransportCredentials = grpcinsecure.NewCredentials() } // Initialize gRPC dial options with transport-level security options. grpcOpts := []grpc.DialOption{ grpc.WithTransportCredentials(transportCreds), } // Ensure the token exchange HTTP transport uses the same ClientCertProvider as the GRPC API transport. opts.ClientCertProvider, err = transport.GetClientCertificateProvider(tOpts) if err != nil { return nil, err } if opts.APIKey != "" { grpcOpts = append(grpcOpts, grpc.WithPerRPCCredentials(&grpcKeyProvider{ apiKey: opts.APIKey, metadata: opts.Metadata, secure: secure, }), ) } else if !opts.DisableAuthentication { metadata := opts.Metadata var creds *auth.Credentials if opts.Credentials != nil { creds = opts.Credentials } else { // This condition is only met for non-DirectPath clients because // TransportTypeMTLSS2A is used only when InternalOptions.EnableDirectPath // is false. optsClone := opts.resolveDetectOptions() if transportCreds.TransportType == transport.TransportTypeMTLSS2A { // Check that the client allows requesting hard-bound token for the transport type mTLS using S2A. for _, ev := range opts.InternalOptions.AllowHardBoundTokens { if ev == "MTLS_S2A" { optsClone.TokenBindingType = credentials.MTLSHardBinding break } } } var err error creds, err = credentials.DetectDefault(optsClone) if err != nil { return nil, err } } qp, err := creds.QuotaProjectID(ctx) if err != nil { return nil, err } if qp != "" { if metadata == nil { metadata = make(map[string]string, 1) } // Don't overwrite user specified quota if _, ok := metadata[quotaProjectHeaderKey]; !ok { metadata[quotaProjectHeaderKey] = qp } } grpcOpts = append(grpcOpts, grpc.WithPerRPCCredentials(&grpcCredentialsProvider{ creds: creds, metadata: metadata, clientUniverseDomain: opts.UniverseDomain, }), ) // Attempt Direct Path grpcOpts, transportCreds.Endpoint, err = configureDirectPath(grpcOpts, opts, transportCreds.Endpoint, creds) if err != nil { return nil, err } } // Add tracing, but before the other options, so that clients can override the // gRPC stats handler. // This assumes that gRPC options are processed in order, left to right. grpcOpts = addOpenTelemetryStatsHandler(grpcOpts, opts) grpcOpts = append(grpcOpts, opts.GRPCDialOpts...) return grpc.DialContext(ctx, transportCreds.Endpoint, grpcOpts...) } // grpcKeyProvider satisfies https://pkg.go.dev/google.golang.org/grpc/credentials#PerRPCCredentials. type grpcKeyProvider struct { apiKey string metadata map[string]string secure bool } func (g *grpcKeyProvider) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { metadata := make(map[string]string, len(g.metadata)+1) metadata["X-goog-api-key"] = g.apiKey for k, v := range g.metadata { metadata[k] = v } return metadata, nil } func (g *grpcKeyProvider) RequireTransportSecurity() bool { return g.secure } // grpcCredentialsProvider satisfies https://pkg.go.dev/google.golang.org/grpc/credentials#PerRPCCredentials. type grpcCredentialsProvider struct { creds *auth.Credentials secure bool // Additional metadata attached as headers. metadata map[string]string clientUniverseDomain string } // getClientUniverseDomain returns the default service domain for a given Cloud // universe, with the following precedence: // // 1. A non-empty option.WithUniverseDomain or similar client option. // 2. A non-empty environment variable GOOGLE_CLOUD_UNIVERSE_DOMAIN. // 3. The default value "googleapis.com". // // This is the universe domain configured for the client, which will be compared // to the universe domain that is separately configured for the credentials. func (c *grpcCredentialsProvider) getClientUniverseDomain() string { if c.clientUniverseDomain != "" { return c.clientUniverseDomain } if envUD := os.Getenv(internal.UniverseDomainEnvVar); envUD != "" { return envUD } return internal.DefaultUniverseDomain } func (c *grpcCredentialsProvider) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { token, err := c.creds.Token(ctx) if err != nil { return nil, err } if token.MetadataString("auth.google.tokenSource") != "compute-metadata" { credentialsUniverseDomain, err := c.creds.UniverseDomain(ctx) if err != nil { return nil, err } if err := transport.ValidateUniverseDomain(c.getClientUniverseDomain(), credentialsUniverseDomain); err != nil { return nil, err } } if c.secure { ri, _ := grpccreds.RequestInfoFromContext(ctx) if err = grpccreds.CheckSecurityLevel(ri.AuthInfo, grpccreds.PrivacyAndIntegrity); err != nil { return nil, fmt.Errorf("unable to transfer credentials PerRPCCredentials: %v", err) } } metadata := make(map[string]string, len(c.metadata)+1) setAuthMetadata(token, metadata) for k, v := range c.metadata { metadata[k] = v } return metadata, nil } // setAuthMetadata uses the provided token to set the Authorization metadata. // If the token.Type is empty, the type is assumed to be Bearer. func setAuthMetadata(token *auth.Token, m map[string]string) { typ := token.Type if typ == "" { typ = internal.TokenTypeBearer } m["authorization"] = typ + " " + token.Value } func (c *grpcCredentialsProvider) RequireTransportSecurity() bool { return c.secure } func addOpenTelemetryStatsHandler(dialOpts []grpc.DialOption, opts *Options) []grpc.DialOption { if opts.DisableTelemetry { return dialOpts } return append(dialOpts, grpc.WithStatsHandler(otelGRPCStatsHandler())) } ================================================ FILE: vendor/cloud.google.com/go/auth/grpctransport/pool.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package grpctransport import ( "context" "fmt" "sync/atomic" "google.golang.org/grpc" ) // GRPCClientConnPool is an interface that satisfies // [google.golang.org/grpc.ClientConnInterface] and has some utility functions // that are needed for connection lifecycle when using in a client library. It // may be a pool or a single connection. This interface is not intended to, and // can't be, implemented by others. type GRPCClientConnPool interface { // Connection returns a [google.golang.org/grpc.ClientConn] from the pool. // // ClientConn aren't returned to the pool and should not be closed directly. Connection() *grpc.ClientConn // Len returns the number of connections in the pool. It will always return // the same value. Len() int // Close closes every ClientConn in the pool. The error returned by Close // may be a single error or multiple errors. Close() error grpc.ClientConnInterface // private ensure others outside this package can't implement this type private() } // singleConnPool is a special case for a single connection. type singleConnPool struct { *grpc.ClientConn } func (p *singleConnPool) Connection() *grpc.ClientConn { return p.ClientConn } func (p *singleConnPool) Len() int { return 1 } func (p *singleConnPool) private() {} type roundRobinConnPool struct { conns []*grpc.ClientConn idx uint32 // access via sync/atomic } func (p *roundRobinConnPool) Len() int { return len(p.conns) } func (p *roundRobinConnPool) Connection() *grpc.ClientConn { i := atomic.AddUint32(&p.idx, 1) return p.conns[i%uint32(len(p.conns))] } func (p *roundRobinConnPool) Close() error { var errs multiError for _, conn := range p.conns { if err := conn.Close(); err != nil { errs = append(errs, err) } } if len(errs) == 0 { return nil } return errs } func (p *roundRobinConnPool) Invoke(ctx context.Context, method string, args interface{}, reply interface{}, opts ...grpc.CallOption) error { return p.Connection().Invoke(ctx, method, args, reply, opts...) } func (p *roundRobinConnPool) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { return p.Connection().NewStream(ctx, desc, method, opts...) } func (p *roundRobinConnPool) private() {} // multiError represents errors from multiple conns in the group. type multiError []error func (m multiError) Error() string { s, n := "", 0 for _, e := range m { if e != nil { if n == 0 { s = e.Error() } n++ } } switch n { case 0: return "(0 errors)" case 1: return s case 2: return s + " (and 1 other error)" } return fmt.Sprintf("%s (and %d other errors)", s, n-1) } ================================================ FILE: vendor/cloud.google.com/go/auth/httptransport/httptransport.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package httptransport provides functionality for managing HTTP client // connections to Google Cloud services. package httptransport import ( "crypto/tls" "errors" "fmt" "log/slog" "net/http" "cloud.google.com/go/auth" detect "cloud.google.com/go/auth/credentials" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/transport" "github.com/googleapis/gax-go/v2/internallog" ) // ClientCertProvider is a function that returns a TLS client certificate to be // used when opening TLS connections. It follows the same semantics as // [crypto/tls.Config.GetClientCertificate]. type ClientCertProvider = func(*tls.CertificateRequestInfo) (*tls.Certificate, error) // Options used to configure a [net/http.Client] from [NewClient]. type Options struct { // DisableTelemetry disables default telemetry (OpenTelemetry). An example // reason to do so would be to bind custom telemetry that overrides the // defaults. DisableTelemetry bool // DisableAuthentication specifies that no authentication should be used. It // is suitable only for testing and for accessing public resources, like // public Google Cloud Storage buckets. DisableAuthentication bool // Headers are extra HTTP headers that will be appended to every outgoing // request. Headers http.Header // BaseRoundTripper overrides the base transport used for serving requests. // If specified ClientCertProvider is ignored. BaseRoundTripper http.RoundTripper // Endpoint overrides the default endpoint to be used for a service. Endpoint string // APIKey specifies an API key to be used as the basis for authentication. // If set DetectOpts are ignored. APIKey string // Credentials used to add Authorization header to all requests. If set // DetectOpts are ignored. Credentials *auth.Credentials // ClientCertProvider is a function that returns a TLS client certificate to // be used when opening TLS connections. It follows the same semantics as // crypto/tls.Config.GetClientCertificate. ClientCertProvider ClientCertProvider // DetectOpts configures settings for detect Application Default // Credentials. DetectOpts *detect.DetectOptions // UniverseDomain is the default service domain for a given Cloud universe. // The default value is "googleapis.com". This is the universe domain // configured for the client, which will be compared to the universe domain // that is separately configured for the credentials. UniverseDomain string // Logger is used for debug logging. If provided, logging will be enabled // at the loggers configured level. By default logging is disabled unless // enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default // logger will be used. Optional. Logger *slog.Logger // InternalOptions are NOT meant to be set directly by consumers of this // package, they should only be set by generated client code. InternalOptions *InternalOptions } func (o *Options) validate() error { if o == nil { return errors.New("httptransport: opts required to be non-nil") } if o.InternalOptions != nil && o.InternalOptions.SkipValidation { return nil } hasCreds := o.APIKey != "" || o.Credentials != nil || (o.DetectOpts != nil && len(o.DetectOpts.CredentialsJSON) > 0) || (o.DetectOpts != nil && o.DetectOpts.CredentialsFile != "") if o.DisableAuthentication && hasCreds { return errors.New("httptransport: DisableAuthentication is incompatible with options that set or detect credentials") } return nil } // client returns the client a user set for the detect options or nil if one was // not set. func (o *Options) client() *http.Client { if o.DetectOpts != nil && o.DetectOpts.Client != nil { return o.DetectOpts.Client } return nil } func (o *Options) logger() *slog.Logger { return internallog.New(o.Logger) } func (o *Options) resolveDetectOptions() *detect.DetectOptions { io := o.InternalOptions // soft-clone these so we are not updating a ref the user holds and may reuse do := transport.CloneDetectOptions(o.DetectOpts) // If scoped JWTs are enabled user provided an aud, allow self-signed JWT. if (io != nil && io.EnableJWTWithScope) || do.Audience != "" { do.UseSelfSignedJWT = true } // Only default scopes if user did not also set an audience. if len(do.Scopes) == 0 && do.Audience == "" && io != nil && len(io.DefaultScopes) > 0 { do.Scopes = make([]string, len(io.DefaultScopes)) copy(do.Scopes, io.DefaultScopes) } if len(do.Scopes) == 0 && do.Audience == "" && io != nil { do.Audience = o.InternalOptions.DefaultAudience } if o.ClientCertProvider != nil { tlsConfig := &tls.Config{ GetClientCertificate: o.ClientCertProvider, } do.Client = transport.DefaultHTTPClientWithTLS(tlsConfig) do.TokenURL = detect.GoogleMTLSTokenURL } if do.Logger == nil { do.Logger = o.logger() } return do } // InternalOptions are only meant to be set by generated client code. These are // not meant to be set directly by consumers of this package. Configuration in // this type is considered EXPERIMENTAL and may be removed at any time in the // future without warning. type InternalOptions struct { // EnableJWTWithScope specifies if scope can be used with self-signed JWT. EnableJWTWithScope bool // DefaultAudience specifies a default audience to be used as the audience // field ("aud") for the JWT token authentication. DefaultAudience string // DefaultEndpointTemplate combined with UniverseDomain specifies the // default endpoint. DefaultEndpointTemplate string // DefaultMTLSEndpoint specifies the default mTLS endpoint. DefaultMTLSEndpoint string // DefaultScopes specifies the default OAuth2 scopes to be used for a // service. DefaultScopes []string // SkipValidation bypasses validation on Options. It should only be used // internally for clients that need more control over their transport. SkipValidation bool // SkipUniverseDomainValidation skips the verification that the universe // domain configured for the client matches the universe domain configured // for the credentials. It should only be used internally for clients that // need more control over their transport. The default is false. SkipUniverseDomainValidation bool } // AddAuthorizationMiddleware adds a middleware to the provided client's // transport that sets the Authorization header with the value produced by the // provided [cloud.google.com/go/auth.Credentials]. An error is returned only // if client or creds is nil. // // This function does not support setting a universe domain value on the client. func AddAuthorizationMiddleware(client *http.Client, creds *auth.Credentials) error { if client == nil || creds == nil { return fmt.Errorf("httptransport: client and tp must not be nil") } base := client.Transport if base == nil { if dt, ok := http.DefaultTransport.(*http.Transport); ok { base = dt.Clone() } else { // Directly reuse the DefaultTransport if the application has // replaced it with an implementation of RoundTripper other than // http.Transport. base = http.DefaultTransport } } client.Transport = &authTransport{ creds: creds, base: base, } return nil } // NewClient returns a [net/http.Client] that can be used to communicate with a // Google cloud service, configured with the provided [Options]. It // automatically appends Authorization headers to all outgoing requests. func NewClient(opts *Options) (*http.Client, error) { if err := opts.validate(); err != nil { return nil, err } tOpts := &transport.Options{ Endpoint: opts.Endpoint, ClientCertProvider: opts.ClientCertProvider, Client: opts.client(), UniverseDomain: opts.UniverseDomain, Logger: opts.logger(), } if io := opts.InternalOptions; io != nil { tOpts.DefaultEndpointTemplate = io.DefaultEndpointTemplate tOpts.DefaultMTLSEndpoint = io.DefaultMTLSEndpoint } clientCertProvider, dialTLSContext, err := transport.GetHTTPTransportConfig(tOpts) if err != nil { return nil, err } baseRoundTripper := opts.BaseRoundTripper if baseRoundTripper == nil { baseRoundTripper = defaultBaseTransport(clientCertProvider, dialTLSContext) } // Ensure the token exchange transport uses the same ClientCertProvider as the API transport. opts.ClientCertProvider = clientCertProvider trans, err := newTransport(baseRoundTripper, opts) if err != nil { return nil, err } return &http.Client{ Transport: trans, }, nil } // SetAuthHeader uses the provided token to set the Authorization header on a // request. If the token.Type is empty, the type is assumed to be Bearer. func SetAuthHeader(token *auth.Token, req *http.Request) { typ := token.Type if typ == "" { typ = internal.TokenTypeBearer } req.Header.Set("Authorization", typ+" "+token.Value) } ================================================ FILE: vendor/cloud.google.com/go/auth/httptransport/transport.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package httptransport import ( "context" "crypto/tls" "net" "net/http" "os" "time" "cloud.google.com/go/auth" "cloud.google.com/go/auth/credentials" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/transport" "cloud.google.com/go/auth/internal/transport/cert" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "golang.org/x/net/http2" ) const ( quotaProjectHeaderKey = "X-goog-user-project" ) func newTransport(base http.RoundTripper, opts *Options) (http.RoundTripper, error) { var headers = opts.Headers ht := &headerTransport{ base: base, headers: headers, } var trans http.RoundTripper = ht trans = addOpenTelemetryTransport(trans, opts) switch { case opts.DisableAuthentication: // Do nothing. case opts.APIKey != "": qp := internal.GetQuotaProject(nil, opts.Headers.Get(quotaProjectHeaderKey)) if qp != "" { if headers == nil { headers = make(map[string][]string, 1) } headers.Set(quotaProjectHeaderKey, qp) } trans = &apiKeyTransport{ Transport: trans, Key: opts.APIKey, } default: var creds *auth.Credentials if opts.Credentials != nil { creds = opts.Credentials } else { var err error creds, err = credentials.DetectDefault(opts.resolveDetectOptions()) if err != nil { return nil, err } } qp, err := creds.QuotaProjectID(context.Background()) if err != nil { return nil, err } if qp != "" { if headers == nil { headers = make(map[string][]string, 1) } // Don't overwrite user specified quota if v := headers.Get(quotaProjectHeaderKey); v == "" { headers.Set(quotaProjectHeaderKey, qp) } } var skipUD bool if iOpts := opts.InternalOptions; iOpts != nil { skipUD = iOpts.SkipUniverseDomainValidation } creds.TokenProvider = auth.NewCachedTokenProvider(creds.TokenProvider, nil) trans = &authTransport{ base: trans, creds: creds, clientUniverseDomain: opts.UniverseDomain, skipUniverseDomainValidation: skipUD, } } return trans, nil } // defaultBaseTransport returns the base HTTP transport. // On App Engine, this is urlfetch.Transport. // Otherwise, use a default transport, taking most defaults from // http.DefaultTransport. // If TLSCertificate is available, set TLSClientConfig as well. func defaultBaseTransport(clientCertSource cert.Provider, dialTLSContext func(context.Context, string, string) (net.Conn, error)) http.RoundTripper { defaultTransport, ok := http.DefaultTransport.(*http.Transport) if !ok { defaultTransport = transport.BaseTransport() } trans := defaultTransport.Clone() trans.MaxIdleConnsPerHost = 100 if clientCertSource != nil { trans.TLSClientConfig = &tls.Config{ GetClientCertificate: clientCertSource, } } if dialTLSContext != nil { // If DialTLSContext is set, TLSClientConfig wil be ignored trans.DialTLSContext = dialTLSContext } // Configures the ReadIdleTimeout HTTP/2 option for the // transport. This allows broken idle connections to be pruned more quickly, // preventing the client from attempting to re-use connections that will no // longer work. http2Trans, err := http2.ConfigureTransports(trans) if err == nil { http2Trans.ReadIdleTimeout = time.Second * 31 } return trans } type apiKeyTransport struct { // Key is the API Key to set on requests. Key string // Transport is the underlying HTTP transport. // If nil, http.DefaultTransport is used. Transport http.RoundTripper } func (t *apiKeyTransport) RoundTrip(req *http.Request) (*http.Response, error) { newReq := *req args := newReq.URL.Query() args.Set("key", t.Key) newReq.URL.RawQuery = args.Encode() return t.Transport.RoundTrip(&newReq) } type headerTransport struct { headers http.Header base http.RoundTripper } func (t *headerTransport) RoundTrip(req *http.Request) (*http.Response, error) { rt := t.base newReq := *req newReq.Header = make(http.Header) for k, vv := range req.Header { newReq.Header[k] = vv } for k, v := range t.headers { newReq.Header[k] = v } return rt.RoundTrip(&newReq) } func addOpenTelemetryTransport(trans http.RoundTripper, opts *Options) http.RoundTripper { if opts.DisableTelemetry { return trans } return otelhttp.NewTransport(trans) } type authTransport struct { creds *auth.Credentials base http.RoundTripper clientUniverseDomain string skipUniverseDomainValidation bool } // getClientUniverseDomain returns the default service domain for a given Cloud // universe, with the following precedence: // // 1. A non-empty option.WithUniverseDomain or similar client option. // 2. A non-empty environment variable GOOGLE_CLOUD_UNIVERSE_DOMAIN. // 3. The default value "googleapis.com". // // This is the universe domain configured for the client, which will be compared // to the universe domain that is separately configured for the credentials. func (t *authTransport) getClientUniverseDomain() string { if t.clientUniverseDomain != "" { return t.clientUniverseDomain } if envUD := os.Getenv(internal.UniverseDomainEnvVar); envUD != "" { return envUD } return internal.DefaultUniverseDomain } // RoundTrip authorizes and authenticates the request with an // access token from Transport's Source. Per the RoundTripper contract we must // not modify the initial request, so we clone it, and we must close the body // on any errors that happens during our token logic. func (t *authTransport) RoundTrip(req *http.Request) (*http.Response, error) { reqBodyClosed := false if req.Body != nil { defer func() { if !reqBodyClosed { req.Body.Close() } }() } token, err := t.creds.Token(req.Context()) if err != nil { return nil, err } if !t.skipUniverseDomainValidation && token.MetadataString("auth.google.tokenSource") != "compute-metadata" { credentialsUniverseDomain, err := t.creds.UniverseDomain(req.Context()) if err != nil { return nil, err } if err := transport.ValidateUniverseDomain(t.getClientUniverseDomain(), credentialsUniverseDomain); err != nil { return nil, err } } req2 := req.Clone(req.Context()) SetAuthHeader(token, req2) reqBodyClosed = true return t.base.RoundTrip(req2) } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/compute/compute.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package compute import ( "log" "runtime" "strings" "sync" ) var ( vmOnGCEOnce sync.Once vmOnGCE bool ) // OnComputeEngine returns whether the client is running on GCE. // // This is a copy of the gRPC internal googlecloud.OnGCE() func at: // https://github.com/grpc/grpc-go/blob/master/internal/googlecloud/googlecloud.go // The functionality is similar to the metadata.OnGCE() func at: // https://github.com/googleapis/google-cloud-go/blob/main/compute/metadata/metadata.go // The difference is that OnComputeEngine() does not perform HTTP or DNS check on the metadata server. // In particular, OnComputeEngine() will return false on Serverless. func OnComputeEngine() bool { vmOnGCEOnce.Do(func() { mf, err := manufacturer() if err != nil { log.Printf("Failed to read manufacturer, vmOnGCE=false: %v", err) return } vmOnGCE = isRunningOnGCE(mf, runtime.GOOS) }) return vmOnGCE } // isRunningOnGCE checks whether the local system, without doing a network request, is // running on GCP. func isRunningOnGCE(manufacturer []byte, goos string) bool { name := string(manufacturer) switch goos { case "linux": name = strings.TrimSpace(name) return name == "Google" || name == "Google Compute Engine" case "windows": name = strings.Replace(name, " ", "", -1) name = strings.Replace(name, "\n", "", -1) name = strings.Replace(name, "\r", "", -1) return name == "Google" default: return false } } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/compute/manufacturer.go ================================================ //go:build !(linux || windows) // +build !linux,!windows // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package compute func manufacturer() ([]byte, error) { return nil, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/compute/manufacturer_linux.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package compute import "os" const linuxProductNameFile = "/sys/class/dmi/id/product_name" func manufacturer() ([]byte, error) { return os.ReadFile(linuxProductNameFile) } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/compute/manufacturer_windows.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package compute import ( "errors" "os/exec" "regexp" "strings" ) const ( windowsCheckCommand = "powershell.exe" windowsCheckCommandArgs = "Get-WmiObject -Class Win32_BIOS" powershellOutputFilter = "Manufacturer" windowsManufacturerRegex = ":(.*)" ) func manufacturer() ([]byte, error) { cmd := exec.Command(windowsCheckCommand, windowsCheckCommandArgs) out, err := cmd.Output() if err != nil { return nil, err } for _, line := range strings.Split(strings.TrimSuffix(string(out), "\n"), "\n") { if strings.HasPrefix(line, powershellOutputFilter) { re := regexp.MustCompile(windowsManufacturerRegex) name := re.FindString(line) name = strings.TrimLeft(name, ":") return []byte(name), nil } } return nil, errors.New("cannot determine the machine's manufacturer") } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/credsfile/credsfile.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package credsfile is meant to hide implementation details from the pubic // surface of the detect package. It should not import any other packages in // this module. It is located under the main internal package so other // sub-packages can use these parsed types as well. package credsfile import ( "os" "os/user" "path/filepath" "runtime" ) const ( // GoogleAppCredsEnvVar is the environment variable for setting the // application default credentials. GoogleAppCredsEnvVar = "GOOGLE_APPLICATION_CREDENTIALS" userCredsFilename = "application_default_credentials.json" ) // CredentialType represents different credential filetypes Google credentials // can be. type CredentialType int const ( // UnknownCredType is an unidentified file type. UnknownCredType CredentialType = iota // UserCredentialsKey represents a user creds file type. UserCredentialsKey // ServiceAccountKey represents a service account file type. ServiceAccountKey // ImpersonatedServiceAccountKey represents a impersonated service account // file type. ImpersonatedServiceAccountKey // ExternalAccountKey represents a external account file type. ExternalAccountKey // GDCHServiceAccountKey represents a GDCH file type. GDCHServiceAccountKey // ExternalAccountAuthorizedUserKey represents a external account authorized // user file type. ExternalAccountAuthorizedUserKey ) // parseCredentialType returns the associated filetype based on the parsed // typeString provided. func parseCredentialType(typeString string) CredentialType { switch typeString { case "service_account": return ServiceAccountKey case "authorized_user": return UserCredentialsKey case "impersonated_service_account": return ImpersonatedServiceAccountKey case "external_account": return ExternalAccountKey case "external_account_authorized_user": return ExternalAccountAuthorizedUserKey case "gdch_service_account": return GDCHServiceAccountKey default: return UnknownCredType } } // GetFileNameFromEnv returns the override if provided or detects a filename // from the environment. func GetFileNameFromEnv(override string) string { if override != "" { return override } return os.Getenv(GoogleAppCredsEnvVar) } // GetWellKnownFileName tries to locate the filepath for the user credential // file based on the environment. func GetWellKnownFileName() string { if runtime.GOOS == "windows" { return filepath.Join(os.Getenv("APPDATA"), "gcloud", userCredsFilename) } return filepath.Join(guessUnixHomeDir(), ".config", "gcloud", userCredsFilename) } // guessUnixHomeDir default to checking for HOME, but not all unix systems have // this set, do have a fallback. func guessUnixHomeDir() string { if v := os.Getenv("HOME"); v != "" { return v } if u, err := user.Current(); err == nil { return u.HomeDir } return "" } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package credsfile import ( "encoding/json" ) // Config3LO is the internals of a client creds file. type Config3LO struct { ClientID string `json:"client_id"` ClientSecret string `json:"client_secret"` RedirectURIs []string `json:"redirect_uris"` AuthURI string `json:"auth_uri"` TokenURI string `json:"token_uri"` } // ClientCredentialsFile representation. type ClientCredentialsFile struct { Web *Config3LO `json:"web"` Installed *Config3LO `json:"installed"` UniverseDomain string `json:"universe_domain"` } // ServiceAccountFile representation. type ServiceAccountFile struct { Type string `json:"type"` ProjectID string `json:"project_id"` PrivateKeyID string `json:"private_key_id"` PrivateKey string `json:"private_key"` ClientEmail string `json:"client_email"` ClientID string `json:"client_id"` AuthURL string `json:"auth_uri"` TokenURL string `json:"token_uri"` UniverseDomain string `json:"universe_domain"` } // UserCredentialsFile representation. type UserCredentialsFile struct { Type string `json:"type"` ClientID string `json:"client_id"` ClientSecret string `json:"client_secret"` QuotaProjectID string `json:"quota_project_id"` RefreshToken string `json:"refresh_token"` UniverseDomain string `json:"universe_domain"` } // ExternalAccountFile representation. type ExternalAccountFile struct { Type string `json:"type"` ClientID string `json:"client_id"` ClientSecret string `json:"client_secret"` Audience string `json:"audience"` SubjectTokenType string `json:"subject_token_type"` ServiceAccountImpersonationURL string `json:"service_account_impersonation_url"` TokenURL string `json:"token_url"` CredentialSource *CredentialSource `json:"credential_source,omitempty"` TokenInfoURL string `json:"token_info_url"` ServiceAccountImpersonation *ServiceAccountImpersonationInfo `json:"service_account_impersonation,omitempty"` QuotaProjectID string `json:"quota_project_id"` WorkforcePoolUserProject string `json:"workforce_pool_user_project"` UniverseDomain string `json:"universe_domain"` } // ExternalAccountAuthorizedUserFile representation. type ExternalAccountAuthorizedUserFile struct { Type string `json:"type"` Audience string `json:"audience"` ClientID string `json:"client_id"` ClientSecret string `json:"client_secret"` RefreshToken string `json:"refresh_token"` TokenURL string `json:"token_url"` TokenInfoURL string `json:"token_info_url"` RevokeURL string `json:"revoke_url"` QuotaProjectID string `json:"quota_project_id"` UniverseDomain string `json:"universe_domain"` } // CredentialSource stores the information necessary to retrieve the credentials for the STS exchange. // // One field amongst File, URL, Certificate, and Executable should be filled, depending on the kind of credential in question. // The EnvironmentID should start with AWS if being used for an AWS credential. type CredentialSource struct { File string `json:"file"` URL string `json:"url"` Headers map[string]string `json:"headers"` Executable *ExecutableConfig `json:"executable,omitempty"` Certificate *CertificateConfig `json:"certificate"` EnvironmentID string `json:"environment_id"` // TODO: Make type for this RegionURL string `json:"region_url"` RegionalCredVerificationURL string `json:"regional_cred_verification_url"` CredVerificationURL string `json:"cred_verification_url"` IMDSv2SessionTokenURL string `json:"imdsv2_session_token_url"` Format *Format `json:"format,omitempty"` } // Format describes the format of a [CredentialSource]. type Format struct { // Type is either "text" or "json". When not provided "text" type is assumed. Type string `json:"type"` // SubjectTokenFieldName is only required for JSON format. This would be "access_token" for azure. SubjectTokenFieldName string `json:"subject_token_field_name"` } // ExecutableConfig represents the command to run for an executable // [CredentialSource]. type ExecutableConfig struct { Command string `json:"command"` TimeoutMillis int `json:"timeout_millis"` OutputFile string `json:"output_file"` } // CertificateConfig represents the options used to set up X509 based workload // [CredentialSource] type CertificateConfig struct { UseDefaultCertificateConfig bool `json:"use_default_certificate_config"` CertificateConfigLocation string `json:"certificate_config_location"` TrustChainPath string `json:"trust_chain_path"` } // ServiceAccountImpersonationInfo has impersonation configuration. type ServiceAccountImpersonationInfo struct { TokenLifetimeSeconds int `json:"token_lifetime_seconds"` } // ImpersonatedServiceAccountFile representation. type ImpersonatedServiceAccountFile struct { Type string `json:"type"` ServiceAccountImpersonationURL string `json:"service_account_impersonation_url"` Delegates []string `json:"delegates"` CredSource json.RawMessage `json:"source_credentials"` UniverseDomain string `json:"universe_domain"` } // GDCHServiceAccountFile represents the Google Distributed Cloud Hosted (GDCH) service identity file. type GDCHServiceAccountFile struct { Type string `json:"type"` FormatVersion string `json:"format_version"` Project string `json:"project"` Name string `json:"name"` CertPath string `json:"ca_cert_path"` PrivateKeyID string `json:"private_key_id"` PrivateKey string `json:"private_key"` TokenURL string `json:"token_uri"` UniverseDomain string `json:"universe_domain"` } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/credsfile/parse.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package credsfile import ( "encoding/json" ) // ParseServiceAccount parses bytes into a [ServiceAccountFile]. func ParseServiceAccount(b []byte) (*ServiceAccountFile, error) { var f *ServiceAccountFile if err := json.Unmarshal(b, &f); err != nil { return nil, err } return f, nil } // ParseClientCredentials parses bytes into a // [credsfile.ClientCredentialsFile]. func ParseClientCredentials(b []byte) (*ClientCredentialsFile, error) { var f *ClientCredentialsFile if err := json.Unmarshal(b, &f); err != nil { return nil, err } return f, nil } // ParseUserCredentials parses bytes into a [UserCredentialsFile]. func ParseUserCredentials(b []byte) (*UserCredentialsFile, error) { var f *UserCredentialsFile if err := json.Unmarshal(b, &f); err != nil { return nil, err } return f, nil } // ParseExternalAccount parses bytes into a [ExternalAccountFile]. func ParseExternalAccount(b []byte) (*ExternalAccountFile, error) { var f *ExternalAccountFile if err := json.Unmarshal(b, &f); err != nil { return nil, err } return f, nil } // ParseExternalAccountAuthorizedUser parses bytes into a // [ExternalAccountAuthorizedUserFile]. func ParseExternalAccountAuthorizedUser(b []byte) (*ExternalAccountAuthorizedUserFile, error) { var f *ExternalAccountAuthorizedUserFile if err := json.Unmarshal(b, &f); err != nil { return nil, err } return f, nil } // ParseImpersonatedServiceAccount parses bytes into a // [ImpersonatedServiceAccountFile]. func ParseImpersonatedServiceAccount(b []byte) (*ImpersonatedServiceAccountFile, error) { var f *ImpersonatedServiceAccountFile if err := json.Unmarshal(b, &f); err != nil { return nil, err } return f, nil } // ParseGDCHServiceAccount parses bytes into a [GDCHServiceAccountFile]. func ParseGDCHServiceAccount(b []byte) (*GDCHServiceAccountFile, error) { var f *GDCHServiceAccountFile if err := json.Unmarshal(b, &f); err != nil { return nil, err } return f, nil } type fileTypeChecker struct { Type string `json:"type"` } // ParseFileType determines the [CredentialType] based on bytes provided. func ParseFileType(b []byte) (CredentialType, error) { var f fileTypeChecker if err := json.Unmarshal(b, &f); err != nil { return 0, err } return parseCredentialType(f.Type), nil } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/internal.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal import ( "context" "crypto" "crypto/x509" "encoding/json" "encoding/pem" "errors" "fmt" "io" "net/http" "os" "sync" "time" "cloud.google.com/go/compute/metadata" ) const ( // TokenTypeBearer is the auth header prefix for bearer tokens. TokenTypeBearer = "Bearer" // QuotaProjectEnvVar is the environment variable for setting the quota // project. QuotaProjectEnvVar = "GOOGLE_CLOUD_QUOTA_PROJECT" // UniverseDomainEnvVar is the environment variable for setting the default // service domain for a given Cloud universe. UniverseDomainEnvVar = "GOOGLE_CLOUD_UNIVERSE_DOMAIN" projectEnvVar = "GOOGLE_CLOUD_PROJECT" maxBodySize = 1 << 20 // DefaultUniverseDomain is the default value for universe domain. // Universe domain is the default service domain for a given Cloud universe. DefaultUniverseDomain = "googleapis.com" ) type clonableTransport interface { Clone() *http.Transport } // DefaultClient returns an [http.Client] with some defaults set. If // the current [http.DefaultTransport] is a [clonableTransport], as // is the case for an [*http.Transport], the clone will be used. // Otherwise the [http.DefaultTransport] is used directly. func DefaultClient() *http.Client { if transport, ok := http.DefaultTransport.(clonableTransport); ok { return &http.Client{ Transport: transport.Clone(), Timeout: 30 * time.Second, } } return &http.Client{ Transport: http.DefaultTransport, Timeout: 30 * time.Second, } } // ParseKey converts the binary contents of a private key file // to an crypto.Signer. It detects whether the private key is in a // PEM container or not. If so, it extracts the the private key // from PEM container before conversion. It only supports PEM // containers with no passphrase. func ParseKey(key []byte) (crypto.Signer, error) { block, _ := pem.Decode(key) if block != nil { key = block.Bytes } var parsedKey crypto.PrivateKey var err error parsedKey, err = x509.ParsePKCS8PrivateKey(key) if err != nil { parsedKey, err = x509.ParsePKCS1PrivateKey(key) if err != nil { return nil, fmt.Errorf("private key should be a PEM or plain PKCS1 or PKCS8: %w", err) } } parsed, ok := parsedKey.(crypto.Signer) if !ok { return nil, errors.New("private key is not a signer") } return parsed, nil } // GetQuotaProject retrieves quota project with precedence being: override, // environment variable, creds json file. func GetQuotaProject(b []byte, override string) string { if override != "" { return override } if env := os.Getenv(QuotaProjectEnvVar); env != "" { return env } if b == nil { return "" } var v struct { QuotaProject string `json:"quota_project_id"` } if err := json.Unmarshal(b, &v); err != nil { return "" } return v.QuotaProject } // GetProjectID retrieves project with precedence being: override, // environment variable, creds json file. func GetProjectID(b []byte, override string) string { if override != "" { return override } if env := os.Getenv(projectEnvVar); env != "" { return env } if b == nil { return "" } var v struct { ProjectID string `json:"project_id"` // standard service account key Project string `json:"project"` // gdch key } if err := json.Unmarshal(b, &v); err != nil { return "" } if v.ProjectID != "" { return v.ProjectID } return v.Project } // DoRequest executes the provided req with the client. It reads the response // body, closes it, and returns it. func DoRequest(client *http.Client, req *http.Request) (*http.Response, []byte, error) { resp, err := client.Do(req) if err != nil { return nil, nil, err } defer resp.Body.Close() body, err := ReadAll(io.LimitReader(resp.Body, maxBodySize)) if err != nil { return nil, nil, err } return resp, body, nil } // ReadAll consumes the whole reader and safely reads the content of its body // with some overflow protection. func ReadAll(r io.Reader) ([]byte, error) { return io.ReadAll(io.LimitReader(r, maxBodySize)) } // StaticCredentialsProperty is a helper for creating static credentials // properties. func StaticCredentialsProperty(s string) StaticProperty { return StaticProperty(s) } // StaticProperty always returns that value of the underlying string. type StaticProperty string // GetProperty loads the properly value provided the given context. func (p StaticProperty) GetProperty(context.Context) (string, error) { return string(p), nil } // ComputeUniverseDomainProvider fetches the credentials universe domain from // the google cloud metadata service. type ComputeUniverseDomainProvider struct { MetadataClient *metadata.Client universeDomainOnce sync.Once universeDomain string universeDomainErr error } // GetProperty fetches the credentials universe domain from the google cloud // metadata service. func (c *ComputeUniverseDomainProvider) GetProperty(ctx context.Context) (string, error) { c.universeDomainOnce.Do(func() { c.universeDomain, c.universeDomainErr = getMetadataUniverseDomain(ctx, c.MetadataClient) }) if c.universeDomainErr != nil { return "", c.universeDomainErr } return c.universeDomain, nil } // httpGetMetadataUniverseDomain is a package var for unit test substitution. var httpGetMetadataUniverseDomain = func(ctx context.Context, client *metadata.Client) (string, error) { ctx, cancel := context.WithTimeout(ctx, 1*time.Second) defer cancel() return client.GetWithContext(ctx, "universe/universe-domain") } func getMetadataUniverseDomain(ctx context.Context, client *metadata.Client) (string, error) { universeDomain, err := httpGetMetadataUniverseDomain(ctx, client) if err == nil { return universeDomain, nil } if _, ok := err.(metadata.NotDefinedError); ok { // http.StatusNotFound (404) return DefaultUniverseDomain, nil } return "", err } // FormatIAMServiceAccountResource sets a service account name in an IAM resource // name. func FormatIAMServiceAccountResource(name string) string { return fmt.Sprintf("projects/-/serviceAccounts/%s", name) } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/jwt/jwt.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package jwt import ( "bytes" "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "encoding/base64" "encoding/json" "errors" "fmt" "strings" "time" ) const ( // HeaderAlgRSA256 is the RS256 [Header.Algorithm]. HeaderAlgRSA256 = "RS256" // HeaderAlgES256 is the ES256 [Header.Algorithm]. HeaderAlgES256 = "ES256" // HeaderType is the standard [Header.Type]. HeaderType = "JWT" ) // Header represents a JWT header. type Header struct { Algorithm string `json:"alg"` Type string `json:"typ"` KeyID string `json:"kid"` } func (h *Header) encode() (string, error) { b, err := json.Marshal(h) if err != nil { return "", err } return base64.RawURLEncoding.EncodeToString(b), nil } // Claims represents the claims set of a JWT. type Claims struct { // Iss is the issuer JWT claim. Iss string `json:"iss"` // Scope is the scope JWT claim. Scope string `json:"scope,omitempty"` // Exp is the expiry JWT claim. If unset, default is in one hour from now. Exp int64 `json:"exp"` // Iat is the subject issued at claim. If unset, default is now. Iat int64 `json:"iat"` // Aud is the audience JWT claim. Optional. Aud string `json:"aud"` // Sub is the subject JWT claim. Optional. Sub string `json:"sub,omitempty"` // AdditionalClaims contains any additional non-standard JWT claims. Optional. AdditionalClaims map[string]interface{} `json:"-"` } func (c *Claims) encode() (string, error) { // Compensate for skew now := time.Now().Add(-10 * time.Second) if c.Iat == 0 { c.Iat = now.Unix() } if c.Exp == 0 { c.Exp = now.Add(time.Hour).Unix() } if c.Exp < c.Iat { return "", fmt.Errorf("jwt: invalid Exp = %d; must be later than Iat = %d", c.Exp, c.Iat) } b, err := json.Marshal(c) if err != nil { return "", err } if len(c.AdditionalClaims) == 0 { return base64.RawURLEncoding.EncodeToString(b), nil } // Marshal private claim set and then append it to b. prv, err := json.Marshal(c.AdditionalClaims) if err != nil { return "", fmt.Errorf("invalid map of additional claims %v: %w", c.AdditionalClaims, err) } // Concatenate public and private claim JSON objects. if !bytes.HasSuffix(b, []byte{'}'}) { return "", fmt.Errorf("invalid JSON %s", b) } if !bytes.HasPrefix(prv, []byte{'{'}) { return "", fmt.Errorf("invalid JSON %s", prv) } b[len(b)-1] = ',' // Replace closing curly brace with a comma. b = append(b, prv[1:]...) // Append private claims. return base64.RawURLEncoding.EncodeToString(b), nil } // EncodeJWS encodes the data using the provided key as a JSON web signature. func EncodeJWS(header *Header, c *Claims, signer crypto.Signer) (string, error) { head, err := header.encode() if err != nil { return "", err } claims, err := c.encode() if err != nil { return "", err } ss := fmt.Sprintf("%s.%s", head, claims) h := sha256.New() h.Write([]byte(ss)) sig, err := signer.Sign(rand.Reader, h.Sum(nil), crypto.SHA256) if err != nil { return "", err } return fmt.Sprintf("%s.%s", ss, base64.RawURLEncoding.EncodeToString(sig)), nil } // DecodeJWS decodes a claim set from a JWS payload. func DecodeJWS(payload string) (*Claims, error) { // decode returned id token to get expiry s := strings.Split(payload, ".") if len(s) < 2 { return nil, errors.New("invalid token received") } decoded, err := base64.RawURLEncoding.DecodeString(s[1]) if err != nil { return nil, err } c := &Claims{} if err := json.NewDecoder(bytes.NewBuffer(decoded)).Decode(c); err != nil { return nil, err } if err := json.NewDecoder(bytes.NewBuffer(decoded)).Decode(&c.AdditionalClaims); err != nil { return nil, err } return c, err } // VerifyJWS tests whether the provided JWT token's signature was produced by // the private key associated with the provided public key. func VerifyJWS(token string, key *rsa.PublicKey) error { parts := strings.Split(token, ".") if len(parts) != 3 { return errors.New("jwt: invalid token received, token must have 3 parts") } signedContent := parts[0] + "." + parts[1] signatureString, err := base64.RawURLEncoding.DecodeString(parts[2]) if err != nil { return err } h := sha256.New() h.Write([]byte(signedContent)) return rsa.VerifyPKCS1v15(key, crypto.SHA256, h.Sum(nil), signatureString) } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/transport/cba.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package transport import ( "context" "crypto/tls" "crypto/x509" "errors" "log" "log/slog" "net" "net/http" "net/url" "os" "strconv" "strings" "cloud.google.com/go/auth/internal" "cloud.google.com/go/auth/internal/transport/cert" "github.com/google/s2a-go" "github.com/google/s2a-go/fallback" "google.golang.org/grpc/credentials" ) const ( mTLSModeAlways = "always" mTLSModeNever = "never" mTLSModeAuto = "auto" // Experimental: if true, the code will try MTLS with S2A as the default for transport security. Default value is false. googleAPIUseS2AEnv = "EXPERIMENTAL_GOOGLE_API_USE_S2A" googleAPIUseCertSource = "GOOGLE_API_USE_CLIENT_CERTIFICATE" googleAPIUseMTLS = "GOOGLE_API_USE_MTLS_ENDPOINT" googleAPIUseMTLSOld = "GOOGLE_API_USE_MTLS" universeDomainPlaceholder = "UNIVERSE_DOMAIN" mtlsMDSRoot = "/run/google-mds-mtls/root.crt" mtlsMDSKey = "/run/google-mds-mtls/client.key" ) // Type represents the type of transport used. type Type int const ( // TransportTypeUnknown represents an unknown transport type and is the default option. TransportTypeUnknown Type = iota // TransportTypeMTLSS2A represents the mTLS transport type using S2A. TransportTypeMTLSS2A ) // Options is a struct that is duplicated information from the individual // transport packages in order to avoid cyclic deps. It correlates 1:1 with // fields on httptransport.Options and grpctransport.Options. type Options struct { Endpoint string DefaultEndpointTemplate string DefaultMTLSEndpoint string ClientCertProvider cert.Provider Client *http.Client UniverseDomain string EnableDirectPath bool EnableDirectPathXds bool Logger *slog.Logger } // getUniverseDomain returns the default service domain for a given Cloud // universe. func (o *Options) getUniverseDomain() string { if o.UniverseDomain == "" { return internal.DefaultUniverseDomain } return o.UniverseDomain } // isUniverseDomainGDU returns true if the universe domain is the default Google // universe. func (o *Options) isUniverseDomainGDU() bool { return o.getUniverseDomain() == internal.DefaultUniverseDomain } // defaultEndpoint returns the DefaultEndpointTemplate merged with the // universe domain if the DefaultEndpointTemplate is set, otherwise returns an // empty string. func (o *Options) defaultEndpoint() string { if o.DefaultEndpointTemplate == "" { return "" } return strings.Replace(o.DefaultEndpointTemplate, universeDomainPlaceholder, o.getUniverseDomain(), 1) } // defaultMTLSEndpoint returns the DefaultMTLSEndpointTemplate merged with the // universe domain if the DefaultMTLSEndpointTemplate is set, otherwise returns an // empty string. func (o *Options) defaultMTLSEndpoint() string { if o.DefaultMTLSEndpoint == "" { return "" } return strings.Replace(o.DefaultMTLSEndpoint, universeDomainPlaceholder, o.getUniverseDomain(), 1) } // mergedEndpoint merges a user-provided Endpoint of format host[:port] with the // default endpoint. func (o *Options) mergedEndpoint() (string, error) { defaultEndpoint := o.defaultEndpoint() u, err := url.Parse(fixScheme(defaultEndpoint)) if err != nil { return "", err } return strings.Replace(defaultEndpoint, u.Host, o.Endpoint, 1), nil } func fixScheme(baseURL string) string { if !strings.Contains(baseURL, "://") { baseURL = "https://" + baseURL } return baseURL } // GRPCTransportCredentials embeds interface TransportCredentials with additional data. type GRPCTransportCredentials struct { credentials.TransportCredentials Endpoint string TransportType Type } // GetGRPCTransportCredsAndEndpoint returns an instance of // [google.golang.org/grpc/credentials.TransportCredentials], and the // corresponding endpoint and transport type to use for GRPC client. func GetGRPCTransportCredsAndEndpoint(opts *Options) (*GRPCTransportCredentials, error) { config, err := getTransportConfig(opts) if err != nil { return nil, err } defaultTransportCreds := credentials.NewTLS(&tls.Config{ GetClientCertificate: config.clientCertSource, }) var s2aAddr string var transportCredsForS2A credentials.TransportCredentials if config.mtlsS2AAddress != "" { s2aAddr = config.mtlsS2AAddress transportCredsForS2A, err = loadMTLSMDSTransportCreds(mtlsMDSRoot, mtlsMDSKey) if err != nil { log.Printf("Loading MTLS MDS credentials failed: %v", err) if config.s2aAddress != "" { s2aAddr = config.s2aAddress } else { return &GRPCTransportCredentials{defaultTransportCreds, config.endpoint, TransportTypeUnknown}, nil } } } else if config.s2aAddress != "" { s2aAddr = config.s2aAddress } else { return &GRPCTransportCredentials{defaultTransportCreds, config.endpoint, TransportTypeUnknown}, nil } var fallbackOpts *s2a.FallbackOptions // In case of S2A failure, fall back to the endpoint that would've been used without S2A. if fallbackHandshake, err := fallback.DefaultFallbackClientHandshakeFunc(config.endpoint); err == nil { fallbackOpts = &s2a.FallbackOptions{ FallbackClientHandshakeFunc: fallbackHandshake, } } s2aTransportCreds, err := s2a.NewClientCreds(&s2a.ClientOptions{ S2AAddress: s2aAddr, TransportCreds: transportCredsForS2A, FallbackOpts: fallbackOpts, }) if err != nil { // Use default if we cannot initialize S2A client transport credentials. return &GRPCTransportCredentials{defaultTransportCreds, config.endpoint, TransportTypeUnknown}, nil } return &GRPCTransportCredentials{s2aTransportCreds, config.s2aMTLSEndpoint, TransportTypeMTLSS2A}, nil } // GetHTTPTransportConfig returns a client certificate source and a function for // dialing MTLS with S2A. func GetHTTPTransportConfig(opts *Options) (cert.Provider, func(context.Context, string, string) (net.Conn, error), error) { config, err := getTransportConfig(opts) if err != nil { return nil, nil, err } var s2aAddr string var transportCredsForS2A credentials.TransportCredentials if config.mtlsS2AAddress != "" { s2aAddr = config.mtlsS2AAddress transportCredsForS2A, err = loadMTLSMDSTransportCreds(mtlsMDSRoot, mtlsMDSKey) if err != nil { log.Printf("Loading MTLS MDS credentials failed: %v", err) if config.s2aAddress != "" { s2aAddr = config.s2aAddress } else { return config.clientCertSource, nil, nil } } } else if config.s2aAddress != "" { s2aAddr = config.s2aAddress } else { return config.clientCertSource, nil, nil } var fallbackOpts *s2a.FallbackOptions // In case of S2A failure, fall back to the endpoint that would've been used without S2A. if fallbackURL, err := url.Parse(config.endpoint); err == nil { if fallbackDialer, fallbackServerAddr, err := fallback.DefaultFallbackDialerAndAddress(fallbackURL.Hostname()); err == nil { fallbackOpts = &s2a.FallbackOptions{ FallbackDialer: &s2a.FallbackDialer{ Dialer: fallbackDialer, ServerAddr: fallbackServerAddr, }, } } } dialTLSContextFunc := s2a.NewS2ADialTLSContextFunc(&s2a.ClientOptions{ S2AAddress: s2aAddr, TransportCreds: transportCredsForS2A, FallbackOpts: fallbackOpts, }) return nil, dialTLSContextFunc, nil } func loadMTLSMDSTransportCreds(mtlsMDSRootFile, mtlsMDSKeyFile string) (credentials.TransportCredentials, error) { rootPEM, err := os.ReadFile(mtlsMDSRootFile) if err != nil { return nil, err } caCertPool := x509.NewCertPool() ok := caCertPool.AppendCertsFromPEM(rootPEM) if !ok { return nil, errors.New("failed to load MTLS MDS root certificate") } // The mTLS MDS credentials are formatted as the concatenation of a PEM-encoded certificate chain // followed by a PEM-encoded private key. For this reason, the concatenation is passed in to the // tls.X509KeyPair function as both the certificate chain and private key arguments. cert, err := tls.LoadX509KeyPair(mtlsMDSKeyFile, mtlsMDSKeyFile) if err != nil { return nil, err } tlsConfig := tls.Config{ RootCAs: caCertPool, Certificates: []tls.Certificate{cert}, MinVersion: tls.VersionTLS13, } return credentials.NewTLS(&tlsConfig), nil } func getTransportConfig(opts *Options) (*transportConfig, error) { clientCertSource, err := GetClientCertificateProvider(opts) if err != nil { return nil, err } endpoint, err := getEndpoint(opts, clientCertSource) if err != nil { return nil, err } defaultTransportConfig := transportConfig{ clientCertSource: clientCertSource, endpoint: endpoint, } if !shouldUseS2A(clientCertSource, opts) { return &defaultTransportConfig, nil } s2aAddress := GetS2AAddress(opts.Logger) mtlsS2AAddress := GetMTLSS2AAddress(opts.Logger) if s2aAddress == "" && mtlsS2AAddress == "" { return &defaultTransportConfig, nil } return &transportConfig{ clientCertSource: clientCertSource, endpoint: endpoint, s2aAddress: s2aAddress, mtlsS2AAddress: mtlsS2AAddress, s2aMTLSEndpoint: opts.defaultMTLSEndpoint(), }, nil } // GetClientCertificateProvider returns a default client certificate source, if // not provided by the user. // // A nil default source can be returned if the source does not exist. Any exceptions // encountered while initializing the default source will be reported as client // error (ex. corrupt metadata file). func GetClientCertificateProvider(opts *Options) (cert.Provider, error) { if !isClientCertificateEnabled(opts) { return nil, nil } else if opts.ClientCertProvider != nil { return opts.ClientCertProvider, nil } return cert.DefaultProvider() } // isClientCertificateEnabled returns true by default for all GDU universe domain, unless explicitly overridden by env var func isClientCertificateEnabled(opts *Options) bool { if value, ok := os.LookupEnv(googleAPIUseCertSource); ok { // error as false is OK b, _ := strconv.ParseBool(value) return b } return opts.isUniverseDomainGDU() } type transportConfig struct { // The client certificate source. clientCertSource cert.Provider // The corresponding endpoint to use based on client certificate source. endpoint string // The plaintext S2A address if it can be used, otherwise an empty string. s2aAddress string // The MTLS S2A address if it can be used, otherwise an empty string. mtlsS2AAddress string // The MTLS endpoint to use with S2A. s2aMTLSEndpoint string } // getEndpoint returns the endpoint for the service, taking into account the // user-provided endpoint override "settings.Endpoint". // // If no endpoint override is specified, we will either return the default // endpoint or the default mTLS endpoint if a client certificate is available. // // You can override the default endpoint choice (mTLS vs. regular) by setting // the GOOGLE_API_USE_MTLS_ENDPOINT environment variable. // // If the endpoint override is an address (host:port) rather than full base // URL (ex. https://...), then the user-provided address will be merged into // the default endpoint. For example, WithEndpoint("myhost:8000") and // DefaultEndpointTemplate("https://UNIVERSE_DOMAIN/bar/baz") will return // "https://myhost:8080/bar/baz". Note that this does not apply to the mTLS // endpoint. func getEndpoint(opts *Options, clientCertSource cert.Provider) (string, error) { if opts.Endpoint == "" { mtlsMode := getMTLSMode() if mtlsMode == mTLSModeAlways || (clientCertSource != nil && mtlsMode == mTLSModeAuto) { return opts.defaultMTLSEndpoint(), nil } return opts.defaultEndpoint(), nil } if strings.Contains(opts.Endpoint, "://") { // User passed in a full URL path, use it verbatim. return opts.Endpoint, nil } if opts.defaultEndpoint() == "" { // If DefaultEndpointTemplate is not configured, // use the user provided endpoint verbatim. This allows a naked // "host[:port]" URL to be used with GRPC Direct Path. return opts.Endpoint, nil } // Assume user-provided endpoint is host[:port], merge it with the default endpoint. return opts.mergedEndpoint() } func getMTLSMode() string { mode := os.Getenv(googleAPIUseMTLS) if mode == "" { mode = os.Getenv(googleAPIUseMTLSOld) // Deprecated. } if mode == "" { return mTLSModeAuto } return strings.ToLower(mode) } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/transport/cert/default_cert.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package cert import ( "crypto/tls" "errors" "sync" ) // defaultCertData holds all the variables pertaining to // the default certificate provider created by [DefaultProvider]. // // A singleton model is used to allow the provider to be reused // by the transport layer. As mentioned in [DefaultProvider] (provider nil, nil) // may be returned to indicate a default provider could not be found, which // will skip extra tls config in the transport layer . type defaultCertData struct { once sync.Once provider Provider err error } var ( defaultCert defaultCertData ) // Provider is a function that can be passed into crypto/tls.Config.GetClientCertificate. type Provider func(*tls.CertificateRequestInfo) (*tls.Certificate, error) // errSourceUnavailable is a sentinel error to indicate certificate source is unavailable. var errSourceUnavailable = errors.New("certificate source is unavailable") // DefaultProvider returns a certificate source using the preferred EnterpriseCertificateProxySource. // If EnterpriseCertificateProxySource is not available, fall back to the legacy SecureConnectSource. // // If neither source is available (due to missing configurations), a nil Source and a nil Error are // returned to indicate that a default certificate source is unavailable. func DefaultProvider() (Provider, error) { defaultCert.once.Do(func() { defaultCert.provider, defaultCert.err = NewWorkloadX509CertProvider("") if errors.Is(defaultCert.err, errSourceUnavailable) { defaultCert.provider, defaultCert.err = NewEnterpriseCertificateProxyProvider("") if errors.Is(defaultCert.err, errSourceUnavailable) { defaultCert.provider, defaultCert.err = NewSecureConnectProvider("") if errors.Is(defaultCert.err, errSourceUnavailable) { defaultCert.provider, defaultCert.err = nil, nil } } } }) return defaultCert.provider, defaultCert.err } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/transport/cert/enterprise_cert.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package cert import ( "crypto/tls" "github.com/googleapis/enterprise-certificate-proxy/client" ) type ecpSource struct { key *client.Key } // NewEnterpriseCertificateProxyProvider creates a certificate source // using the Enterprise Certificate Proxy client, which delegates // certifcate related operations to an OS-specific "signer binary" // that communicates with the native keystore (ex. keychain on MacOS). // // The configFilePath points to a config file containing relevant parameters // such as the certificate issuer and the location of the signer binary. // If configFilePath is empty, the client will attempt to load the config from // a well-known gcloud location. func NewEnterpriseCertificateProxyProvider(configFilePath string) (Provider, error) { key, err := client.Cred(configFilePath) if err != nil { // TODO(codyoss): once this is fixed upstream can handle this error a // little better here. But be safe for now and assume unavailable. return nil, errSourceUnavailable } return (&ecpSource{ key: key, }).getClientCertificate, nil } func (s *ecpSource) getClientCertificate(info *tls.CertificateRequestInfo) (*tls.Certificate, error) { var cert tls.Certificate cert.PrivateKey = s.key cert.Certificate = s.key.CertificateChain() return &cert, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/transport/cert/secureconnect_cert.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package cert import ( "crypto/tls" "crypto/x509" "encoding/json" "errors" "fmt" "os" "os/exec" "os/user" "path/filepath" "sync" "time" ) const ( metadataPath = ".secureConnect" metadataFile = "context_aware_metadata.json" ) type secureConnectSource struct { metadata secureConnectMetadata // Cache the cert to avoid executing helper command repeatedly. cachedCertMutex sync.Mutex cachedCert *tls.Certificate } type secureConnectMetadata struct { Cmd []string `json:"cert_provider_command"` } // NewSecureConnectProvider creates a certificate source using // the Secure Connect Helper and its associated metadata file. // // The configFilePath points to the location of the context aware metadata file. // If configFilePath is empty, use the default context aware metadata location. func NewSecureConnectProvider(configFilePath string) (Provider, error) { if configFilePath == "" { user, err := user.Current() if err != nil { // Error locating the default config means Secure Connect is not supported. return nil, errSourceUnavailable } configFilePath = filepath.Join(user.HomeDir, metadataPath, metadataFile) } file, err := os.ReadFile(configFilePath) if err != nil { // Config file missing means Secure Connect is not supported. // There are non-os.ErrNotExist errors that may be returned. // (e.g. if the home directory is /dev/null, *nix systems will // return ENOTDIR instead of ENOENT) return nil, errSourceUnavailable } var metadata secureConnectMetadata if err := json.Unmarshal(file, &metadata); err != nil { return nil, fmt.Errorf("cert: could not parse JSON in %q: %w", configFilePath, err) } if err := validateMetadata(metadata); err != nil { return nil, fmt.Errorf("cert: invalid config in %q: %w", configFilePath, err) } return (&secureConnectSource{ metadata: metadata, }).getClientCertificate, nil } func validateMetadata(metadata secureConnectMetadata) error { if len(metadata.Cmd) == 0 { return errors.New("empty cert_provider_command") } return nil } func (s *secureConnectSource) getClientCertificate(info *tls.CertificateRequestInfo) (*tls.Certificate, error) { s.cachedCertMutex.Lock() defer s.cachedCertMutex.Unlock() if s.cachedCert != nil && !isCertificateExpired(s.cachedCert) { return s.cachedCert, nil } // Expand OS environment variables in the cert provider command such as "$HOME". for i := 0; i < len(s.metadata.Cmd); i++ { s.metadata.Cmd[i] = os.ExpandEnv(s.metadata.Cmd[i]) } command := s.metadata.Cmd data, err := exec.Command(command[0], command[1:]...).Output() if err != nil { return nil, err } cert, err := tls.X509KeyPair(data, data) if err != nil { return nil, err } s.cachedCert = &cert return &cert, nil } // isCertificateExpired returns true if the given cert is expired or invalid. func isCertificateExpired(cert *tls.Certificate) bool { if len(cert.Certificate) == 0 { return true } parsed, err := x509.ParseCertificate(cert.Certificate[0]) if err != nil { return true } return time.Now().After(parsed.NotAfter) } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/transport/cert/workload_cert.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package cert import ( "crypto/tls" "encoding/json" "errors" "io" "os" "github.com/googleapis/enterprise-certificate-proxy/client/util" ) type certConfigs struct { Workload *workloadSource `json:"workload"` } type workloadSource struct { CertPath string `json:"cert_path"` KeyPath string `json:"key_path"` } type certificateConfig struct { CertConfigs certConfigs `json:"cert_configs"` } // getconfigFilePath determines the path to the certificate configuration file. // It first checks for the presence of an environment variable that specifies // the file path. If the environment variable is not set, it falls back to // a default configuration file path. func getconfigFilePath() string { envFilePath := util.GetConfigFilePathFromEnv() if envFilePath != "" { return envFilePath } return util.GetDefaultConfigFilePath() } // GetCertificatePath retrieves the certificate file path from the provided // configuration file. If the configFilePath is empty, it attempts to load // the configuration from a well-known gcloud location. // This function is exposed to allow other packages, such as the // externalaccount package, to retrieve the certificate path without needing // to load the entire certificate configuration. func GetCertificatePath(configFilePath string) (string, error) { if configFilePath == "" { configFilePath = getconfigFilePath() } certFile, _, err := getCertAndKeyFiles(configFilePath) if err != nil { return "", err } return certFile, nil } // NewWorkloadX509CertProvider creates a certificate source // that reads a certificate and private key file from the local file system. // This is intended to be used for workload identity federation. // // The configFilePath points to a config file containing relevant parameters // such as the certificate and key file paths. // If configFilePath is empty, the client will attempt to load the config from // a well-known gcloud location. func NewWorkloadX509CertProvider(configFilePath string) (Provider, error) { if configFilePath == "" { configFilePath = getconfigFilePath() } certFile, keyFile, err := getCertAndKeyFiles(configFilePath) if err != nil { return nil, err } source := &workloadSource{ CertPath: certFile, KeyPath: keyFile, } return source.getClientCertificate, nil } // getClientCertificate attempts to load the certificate and key from the files specified in the // certificate config. func (s *workloadSource) getClientCertificate(info *tls.CertificateRequestInfo) (*tls.Certificate, error) { cert, err := tls.LoadX509KeyPair(s.CertPath, s.KeyPath) if err != nil { return nil, err } return &cert, nil } // getCertAndKeyFiles attempts to read the provided config file and return the certificate and private // key file paths. func getCertAndKeyFiles(configFilePath string) (string, string, error) { jsonFile, err := os.Open(configFilePath) if err != nil { return "", "", errSourceUnavailable } byteValue, err := io.ReadAll(jsonFile) if err != nil { return "", "", err } var config certificateConfig if err := json.Unmarshal(byteValue, &config); err != nil { return "", "", err } if config.CertConfigs.Workload == nil { return "", "", errSourceUnavailable } certFile := config.CertConfigs.Workload.CertPath keyFile := config.CertConfigs.Workload.KeyPath if certFile == "" { return "", "", errors.New("certificate configuration is missing the certificate file location") } if keyFile == "" { return "", "", errors.New("certificate configuration is missing the key file location") } return certFile, keyFile, nil } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/transport/s2a.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package transport import ( "context" "encoding/json" "fmt" "log" "log/slog" "os" "strconv" "sync" "cloud.google.com/go/auth/internal/transport/cert" "cloud.google.com/go/compute/metadata" ) const ( configEndpointSuffix = "instance/platform-security/auto-mtls-configuration" ) var ( mtlsConfiguration *mtlsConfig mtlsOnce sync.Once ) // GetS2AAddress returns the S2A address to be reached via plaintext connection. // Returns empty string if not set or invalid. func GetS2AAddress(logger *slog.Logger) string { getMetadataMTLSAutoConfig(logger) if !mtlsConfiguration.valid() { return "" } return mtlsConfiguration.S2A.PlaintextAddress } // GetMTLSS2AAddress returns the S2A address to be reached via MTLS connection. // Returns empty string if not set or invalid. func GetMTLSS2AAddress(logger *slog.Logger) string { getMetadataMTLSAutoConfig(logger) if !mtlsConfiguration.valid() { return "" } return mtlsConfiguration.S2A.MTLSAddress } // mtlsConfig contains the configuration for establishing MTLS connections with Google APIs. type mtlsConfig struct { S2A *s2aAddresses `json:"s2a"` } func (c *mtlsConfig) valid() bool { return c != nil && c.S2A != nil } // s2aAddresses contains the plaintext and/or MTLS S2A addresses. type s2aAddresses struct { // PlaintextAddress is the plaintext address to reach S2A PlaintextAddress string `json:"plaintext_address"` // MTLSAddress is the MTLS address to reach S2A MTLSAddress string `json:"mtls_address"` } func getMetadataMTLSAutoConfig(logger *slog.Logger) { var err error mtlsOnce.Do(func() { mtlsConfiguration, err = queryConfig(logger) if err != nil { log.Printf("Getting MTLS config failed: %v", err) } }) } var httpGetMetadataMTLSConfig = func(logger *slog.Logger) (string, error) { metadataClient := metadata.NewWithOptions(&metadata.Options{ Logger: logger, }) return metadataClient.GetWithContext(context.Background(), configEndpointSuffix) } func queryConfig(logger *slog.Logger) (*mtlsConfig, error) { resp, err := httpGetMetadataMTLSConfig(logger) if err != nil { return nil, fmt.Errorf("querying MTLS config from MDS endpoint failed: %w", err) } var config mtlsConfig err = json.Unmarshal([]byte(resp), &config) if err != nil { return nil, fmt.Errorf("unmarshalling MTLS config from MDS endpoint failed: %w", err) } if config.S2A == nil { return nil, fmt.Errorf("returned MTLS config from MDS endpoint is invalid: %v", config) } return &config, nil } func shouldUseS2A(clientCertSource cert.Provider, opts *Options) bool { // If client cert is found, use that over S2A. if clientCertSource != nil { return false } // If EXPERIMENTAL_GOOGLE_API_USE_S2A is not set to true, skip S2A. if !isGoogleS2AEnabled() { return false } // If DefaultMTLSEndpoint is not set or has endpoint override, skip S2A. if opts.DefaultMTLSEndpoint == "" || opts.Endpoint != "" { return false } // If custom HTTP client is provided, skip S2A. if opts.Client != nil { return false } // If directPath is enabled, skip S2A. return !opts.EnableDirectPath && !opts.EnableDirectPathXds } func isGoogleS2AEnabled() bool { b, err := strconv.ParseBool(os.Getenv(googleAPIUseS2AEnv)) if err != nil { return false } return b } ================================================ FILE: vendor/cloud.google.com/go/auth/internal/transport/transport.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package transport provided internal helpers for the two transport packages // (grpctransport and httptransport). package transport import ( "crypto/tls" "fmt" "net" "net/http" "time" "cloud.google.com/go/auth/credentials" ) // CloneDetectOptions clones a user set detect option into some new memory that // we can internally manipulate before sending onto the detect package. func CloneDetectOptions(oldDo *credentials.DetectOptions) *credentials.DetectOptions { if oldDo == nil { // it is valid for users not to set this, but we will need to to default // some options for them in this case so return some initialized memory // to work with. return &credentials.DetectOptions{} } newDo := &credentials.DetectOptions{ // Simple types TokenBindingType: oldDo.TokenBindingType, Audience: oldDo.Audience, Subject: oldDo.Subject, EarlyTokenRefresh: oldDo.EarlyTokenRefresh, TokenURL: oldDo.TokenURL, STSAudience: oldDo.STSAudience, CredentialsFile: oldDo.CredentialsFile, UseSelfSignedJWT: oldDo.UseSelfSignedJWT, UniverseDomain: oldDo.UniverseDomain, // These fields are pointer types that we just want to use exactly as // the user set, copy the ref Client: oldDo.Client, Logger: oldDo.Logger, AuthHandlerOptions: oldDo.AuthHandlerOptions, } // Smartly size this memory and copy below. if len(oldDo.CredentialsJSON) > 0 { newDo.CredentialsJSON = make([]byte, len(oldDo.CredentialsJSON)) copy(newDo.CredentialsJSON, oldDo.CredentialsJSON) } if len(oldDo.Scopes) > 0 { newDo.Scopes = make([]string, len(oldDo.Scopes)) copy(newDo.Scopes, oldDo.Scopes) } return newDo } // ValidateUniverseDomain verifies that the universe domain configured for the // client matches the universe domain configured for the credentials. func ValidateUniverseDomain(clientUniverseDomain, credentialsUniverseDomain string) error { if clientUniverseDomain != credentialsUniverseDomain { return fmt.Errorf( "the configured universe domain (%q) does not match the universe "+ "domain found in the credentials (%q). If you haven't configured "+ "the universe domain explicitly, \"googleapis.com\" is the default", clientUniverseDomain, credentialsUniverseDomain) } return nil } // DefaultHTTPClientWithTLS constructs an HTTPClient using the provided tlsConfig, to support mTLS. func DefaultHTTPClientWithTLS(tlsConfig *tls.Config) *http.Client { trans := BaseTransport() trans.TLSClientConfig = tlsConfig return &http.Client{Transport: trans} } // BaseTransport returns a default [http.Transport] which can be used if // [http.DefaultTransport] has been overwritten. func BaseTransport() *http.Transport { return &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, DualStack: true, }).DialContext, MaxIdleConns: 100, MaxIdleConnsPerHost: 100, IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, } } ================================================ FILE: vendor/cloud.google.com/go/auth/oauth2adapt/CHANGES.md ================================================ # Changelog ## [0.2.8](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.7...auth/oauth2adapt/v0.2.8) (2025-03-17) ### Bug Fixes * **auth/oauth2adapt:** Update golang.org/x/net to 0.37.0 ([1144978](https://github.com/googleapis/google-cloud-go/commit/11449782c7fb4896bf8b8b9cde8e7441c84fb2fd)) ## [0.2.7](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.6...auth/oauth2adapt/v0.2.7) (2025-01-09) ### Bug Fixes * **auth/oauth2adapt:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9)) ## [0.2.6](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.5...auth/oauth2adapt/v0.2.6) (2024-11-21) ### Bug Fixes * **auth/oauth2adapt:** Copy map in tokenSourceAdapter.Token ([#11164](https://github.com/googleapis/google-cloud-go/issues/11164)) ([8cb0cbc](https://github.com/googleapis/google-cloud-go/commit/8cb0cbccdc32886dfb3af49fee04012937d114d2)), refs [#11161](https://github.com/googleapis/google-cloud-go/issues/11161) ## [0.2.5](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.4...auth/oauth2adapt/v0.2.5) (2024-10-30) ### Bug Fixes * **auth/oauth2adapt:** Convert token metadata where possible ([#11062](https://github.com/googleapis/google-cloud-go/issues/11062)) ([34bf1c1](https://github.com/googleapis/google-cloud-go/commit/34bf1c164465d66745c0cfdf7cd10a8e2da92e52)) ## [0.2.4](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.3...auth/oauth2adapt/v0.2.4) (2024-08-08) ### Bug Fixes * **auth/oauth2adapt:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758)) ## [0.2.3](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.2...auth/oauth2adapt/v0.2.3) (2024-07-10) ### Bug Fixes * **auth/oauth2adapt:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b)) ## [0.2.2](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.1...auth/oauth2adapt/v0.2.2) (2024-04-23) ### Bug Fixes * **auth/oauth2adapt:** Bump x/net to v0.24.0 ([ba31ed5](https://github.com/googleapis/google-cloud-go/commit/ba31ed5fda2c9664f2e1cf972469295e63deb5b4)) ## [0.2.1](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.2.0...auth/oauth2adapt/v0.2.1) (2024-04-18) ### Bug Fixes * **auth/oauth2adapt:** Adapt Token Types to be translated ([#9801](https://github.com/googleapis/google-cloud-go/issues/9801)) ([70f4115](https://github.com/googleapis/google-cloud-go/commit/70f411555ebbf2b71e6d425cc8d2030644c6b438)), refs [#9800](https://github.com/googleapis/google-cloud-go/issues/9800) ## [0.2.0](https://github.com/googleapis/google-cloud-go/compare/auth/oauth2adapt/v0.1.0...auth/oauth2adapt/v0.2.0) (2024-04-16) ### Features * **auth/oauth2adapt:** Add helpers for working with credentials types ([#9694](https://github.com/googleapis/google-cloud-go/issues/9694)) ([cf33b55](https://github.com/googleapis/google-cloud-go/commit/cf33b5514423a2ac5c2a323a1cd99aac34fd4233)) ### Bug Fixes * **auth/oauth2adapt:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a)) ## 0.1.0 (2023-10-19) ### Features * **auth/oauth2adapt:** Adds a new module to translate types ([#8595](https://github.com/googleapis/google-cloud-go/issues/8595)) ([6933c5a](https://github.com/googleapis/google-cloud-go/commit/6933c5a0c1fc8e58cbfff8bbca439d671b94672f)) * **auth/oauth2adapt:** Fixup deps for release ([#8747](https://github.com/googleapis/google-cloud-go/issues/8747)) ([749d243](https://github.com/googleapis/google-cloud-go/commit/749d243862b025a6487a4d2d339219889b4cfe70)) ### Bug Fixes * **auth/oauth2adapt:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d)) ================================================ FILE: vendor/cloud.google.com/go/auth/oauth2adapt/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/cloud.google.com/go/auth/oauth2adapt/oauth2adapt.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package oauth2adapt helps converts types used in [cloud.google.com/go/auth] // and [golang.org/x/oauth2]. package oauth2adapt import ( "context" "encoding/json" "errors" "cloud.google.com/go/auth" "golang.org/x/oauth2" "golang.org/x/oauth2/google" ) const ( oauth2TokenSourceKey = "oauth2.google.tokenSource" oauth2ServiceAccountKey = "oauth2.google.serviceAccount" authTokenSourceKey = "auth.google.tokenSource" authServiceAccountKey = "auth.google.serviceAccount" ) // TokenProviderFromTokenSource converts any [golang.org/x/oauth2.TokenSource] // into a [cloud.google.com/go/auth.TokenProvider]. func TokenProviderFromTokenSource(ts oauth2.TokenSource) auth.TokenProvider { return &tokenProviderAdapter{ts: ts} } type tokenProviderAdapter struct { ts oauth2.TokenSource } // Token fulfills the [cloud.google.com/go/auth.TokenProvider] interface. It // is a light wrapper around the underlying TokenSource. func (tp *tokenProviderAdapter) Token(context.Context) (*auth.Token, error) { tok, err := tp.ts.Token() if err != nil { var err2 *oauth2.RetrieveError if ok := errors.As(err, &err2); ok { return nil, AuthErrorFromRetrieveError(err2) } return nil, err } // Preserve compute token metadata, for both types of tokens. metadata := map[string]interface{}{} if val, ok := tok.Extra(oauth2TokenSourceKey).(string); ok { metadata[authTokenSourceKey] = val metadata[oauth2TokenSourceKey] = val } if val, ok := tok.Extra(oauth2ServiceAccountKey).(string); ok { metadata[authServiceAccountKey] = val metadata[oauth2ServiceAccountKey] = val } return &auth.Token{ Value: tok.AccessToken, Type: tok.Type(), Expiry: tok.Expiry, Metadata: metadata, }, nil } // TokenSourceFromTokenProvider converts any // [cloud.google.com/go/auth.TokenProvider] into a // [golang.org/x/oauth2.TokenSource]. func TokenSourceFromTokenProvider(tp auth.TokenProvider) oauth2.TokenSource { return &tokenSourceAdapter{tp: tp} } type tokenSourceAdapter struct { tp auth.TokenProvider } // Token fulfills the [golang.org/x/oauth2.TokenSource] interface. It // is a light wrapper around the underlying TokenProvider. func (ts *tokenSourceAdapter) Token() (*oauth2.Token, error) { tok, err := ts.tp.Token(context.Background()) if err != nil { var err2 *auth.Error if ok := errors.As(err, &err2); ok { return nil, AddRetrieveErrorToAuthError(err2) } return nil, err } tok2 := &oauth2.Token{ AccessToken: tok.Value, TokenType: tok.Type, Expiry: tok.Expiry, } // Preserve token metadata. m := tok.Metadata if m != nil { // Copy map to avoid concurrent map writes error (#11161). metadata := make(map[string]interface{}, len(m)+2) for k, v := range m { metadata[k] = v } // Append compute token metadata in converted form. if val, ok := metadata[authTokenSourceKey].(string); ok && val != "" { metadata[oauth2TokenSourceKey] = val } if val, ok := metadata[authServiceAccountKey].(string); ok && val != "" { metadata[oauth2ServiceAccountKey] = val } tok2 = tok2.WithExtra(metadata) } return tok2, nil } // AuthCredentialsFromOauth2Credentials converts a [golang.org/x/oauth2/google.Credentials] // to a [cloud.google.com/go/auth.Credentials]. func AuthCredentialsFromOauth2Credentials(creds *google.Credentials) *auth.Credentials { if creds == nil { return nil } return auth.NewCredentials(&auth.CredentialsOptions{ TokenProvider: TokenProviderFromTokenSource(creds.TokenSource), JSON: creds.JSON, ProjectIDProvider: auth.CredentialsPropertyFunc(func(ctx context.Context) (string, error) { return creds.ProjectID, nil }), UniverseDomainProvider: auth.CredentialsPropertyFunc(func(ctx context.Context) (string, error) { return creds.GetUniverseDomain() }), }) } // Oauth2CredentialsFromAuthCredentials converts a [cloud.google.com/go/auth.Credentials] // to a [golang.org/x/oauth2/google.Credentials]. func Oauth2CredentialsFromAuthCredentials(creds *auth.Credentials) *google.Credentials { if creds == nil { return nil } // Throw away errors as old credentials are not request aware. Also, no // network requests are currently happening for this use case. projectID, _ := creds.ProjectID(context.Background()) return &google.Credentials{ TokenSource: TokenSourceFromTokenProvider(creds.TokenProvider), ProjectID: projectID, JSON: creds.JSON(), UniverseDomainProvider: func() (string, error) { return creds.UniverseDomain(context.Background()) }, } } type oauth2Error struct { ErrorCode string `json:"error"` ErrorDescription string `json:"error_description"` ErrorURI string `json:"error_uri"` } // AddRetrieveErrorToAuthError returns the same error provided and adds a // [golang.org/x/oauth2.RetrieveError] to the error chain by setting the `Err` field on the // [cloud.google.com/go/auth.Error]. func AddRetrieveErrorToAuthError(err *auth.Error) *auth.Error { if err == nil { return nil } e := &oauth2.RetrieveError{ Response: err.Response, Body: err.Body, } err.Err = e if len(err.Body) > 0 { var oErr oauth2Error // ignore the error as it only fills in extra details json.Unmarshal(err.Body, &oErr) e.ErrorCode = oErr.ErrorCode e.ErrorDescription = oErr.ErrorDescription e.ErrorURI = oErr.ErrorURI } return err } // AuthErrorFromRetrieveError returns an [cloud.google.com/go/auth.Error] that // wraps the provided [golang.org/x/oauth2.RetrieveError]. func AuthErrorFromRetrieveError(err *oauth2.RetrieveError) *auth.Error { if err == nil { return nil } return &auth.Error{ Response: err.Response, Body: err.Body, Err: err, } } ================================================ FILE: vendor/cloud.google.com/go/auth/threelegged.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package auth import ( "bytes" "context" "encoding/json" "errors" "fmt" "log/slog" "mime" "net/http" "net/url" "strconv" "strings" "time" "cloud.google.com/go/auth/internal" "github.com/googleapis/gax-go/v2/internallog" ) // AuthorizationHandler is a 3-legged-OAuth helper that prompts the user for // OAuth consent at the specified auth code URL and returns an auth code and // state upon approval. type AuthorizationHandler func(authCodeURL string) (code string, state string, err error) // Options3LO are the options for doing a 3-legged OAuth2 flow. type Options3LO struct { // ClientID is the application's ID. ClientID string // ClientSecret is the application's secret. Not required if AuthHandlerOpts // is set. ClientSecret string // AuthURL is the URL for authenticating. AuthURL string // TokenURL is the URL for retrieving a token. TokenURL string // AuthStyle is used to describe how to client info in the token request. AuthStyle Style // RefreshToken is the token used to refresh the credential. Not required // if AuthHandlerOpts is set. RefreshToken string // RedirectURL is the URL to redirect users to. Optional. RedirectURL string // Scopes specifies requested permissions for the Token. Optional. Scopes []string // URLParams are the set of values to apply to the token exchange. Optional. URLParams url.Values // Client is the client to be used to make the underlying token requests. // Optional. Client *http.Client // EarlyTokenExpiry is the time before the token expires that it should be // refreshed. If not set the default value is 3 minutes and 45 seconds. // Optional. EarlyTokenExpiry time.Duration // AuthHandlerOpts provides a set of options for doing a // 3-legged OAuth2 flow with a custom [AuthorizationHandler]. Optional. AuthHandlerOpts *AuthorizationHandlerOptions // Logger is used for debug logging. If provided, logging will be enabled // at the loggers configured level. By default logging is disabled unless // enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default // logger will be used. Optional. Logger *slog.Logger } func (o *Options3LO) validate() error { if o == nil { return errors.New("auth: options must be provided") } if o.ClientID == "" { return errors.New("auth: client ID must be provided") } if o.AuthHandlerOpts == nil && o.ClientSecret == "" { return errors.New("auth: client secret must be provided") } if o.AuthURL == "" { return errors.New("auth: auth URL must be provided") } if o.TokenURL == "" { return errors.New("auth: token URL must be provided") } if o.AuthStyle == StyleUnknown { return errors.New("auth: auth style must be provided") } if o.AuthHandlerOpts == nil && o.RefreshToken == "" { return errors.New("auth: refresh token must be provided") } return nil } func (o *Options3LO) logger() *slog.Logger { return internallog.New(o.Logger) } // PKCEOptions holds parameters to support PKCE. type PKCEOptions struct { // Challenge is the un-padded, base64-url-encoded string of the encrypted code verifier. Challenge string // The un-padded, base64-url-encoded string of the encrypted code verifier. // ChallengeMethod is the encryption method (ex. S256). ChallengeMethod string // Verifier is the original, non-encrypted secret. Verifier string // The original, non-encrypted secret. } type tokenJSON struct { AccessToken string `json:"access_token"` TokenType string `json:"token_type"` RefreshToken string `json:"refresh_token"` ExpiresIn int `json:"expires_in"` // error fields ErrorCode string `json:"error"` ErrorDescription string `json:"error_description"` ErrorURI string `json:"error_uri"` } func (e *tokenJSON) expiry() (t time.Time) { if v := e.ExpiresIn; v != 0 { return time.Now().Add(time.Duration(v) * time.Second) } return } func (o *Options3LO) client() *http.Client { if o.Client != nil { return o.Client } return internal.DefaultClient() } // authCodeURL returns a URL that points to a OAuth2 consent page. func (o *Options3LO) authCodeURL(state string, values url.Values) string { var buf bytes.Buffer buf.WriteString(o.AuthURL) v := url.Values{ "response_type": {"code"}, "client_id": {o.ClientID}, } if o.RedirectURL != "" { v.Set("redirect_uri", o.RedirectURL) } if len(o.Scopes) > 0 { v.Set("scope", strings.Join(o.Scopes, " ")) } if state != "" { v.Set("state", state) } if o.AuthHandlerOpts != nil { if o.AuthHandlerOpts.PKCEOpts != nil && o.AuthHandlerOpts.PKCEOpts.Challenge != "" { v.Set(codeChallengeKey, o.AuthHandlerOpts.PKCEOpts.Challenge) } if o.AuthHandlerOpts.PKCEOpts != nil && o.AuthHandlerOpts.PKCEOpts.ChallengeMethod != "" { v.Set(codeChallengeMethodKey, o.AuthHandlerOpts.PKCEOpts.ChallengeMethod) } } for k := range values { v.Set(k, v.Get(k)) } if strings.Contains(o.AuthURL, "?") { buf.WriteByte('&') } else { buf.WriteByte('?') } buf.WriteString(v.Encode()) return buf.String() } // New3LOTokenProvider returns a [TokenProvider] based on the 3-legged OAuth2 // configuration. The TokenProvider is caches and auto-refreshes tokens by // default. func New3LOTokenProvider(opts *Options3LO) (TokenProvider, error) { if err := opts.validate(); err != nil { return nil, err } if opts.AuthHandlerOpts != nil { return new3LOTokenProviderWithAuthHandler(opts), nil } return NewCachedTokenProvider(&tokenProvider3LO{opts: opts, refreshToken: opts.RefreshToken, client: opts.client()}, &CachedTokenProviderOptions{ ExpireEarly: opts.EarlyTokenExpiry, }), nil } // AuthorizationHandlerOptions provides a set of options to specify for doing a // 3-legged OAuth2 flow with a custom [AuthorizationHandler]. type AuthorizationHandlerOptions struct { // AuthorizationHandler specifies the handler used to for the authorization // part of the flow. Handler AuthorizationHandler // State is used verify that the "state" is identical in the request and // response before exchanging the auth code for OAuth2 token. State string // PKCEOpts allows setting configurations for PKCE. Optional. PKCEOpts *PKCEOptions } func new3LOTokenProviderWithAuthHandler(opts *Options3LO) TokenProvider { return NewCachedTokenProvider(&tokenProviderWithHandler{opts: opts, state: opts.AuthHandlerOpts.State}, &CachedTokenProviderOptions{ ExpireEarly: opts.EarlyTokenExpiry, }) } // exchange handles the final exchange portion of the 3lo flow. Returns a Token, // refreshToken, and error. func (o *Options3LO) exchange(ctx context.Context, code string) (*Token, string, error) { // Build request v := url.Values{ "grant_type": {"authorization_code"}, "code": {code}, } if o.RedirectURL != "" { v.Set("redirect_uri", o.RedirectURL) } if o.AuthHandlerOpts != nil && o.AuthHandlerOpts.PKCEOpts != nil && o.AuthHandlerOpts.PKCEOpts.Verifier != "" { v.Set(codeVerifierKey, o.AuthHandlerOpts.PKCEOpts.Verifier) } for k := range o.URLParams { v.Set(k, o.URLParams.Get(k)) } return fetchToken(ctx, o, v) } // This struct is not safe for concurrent access alone, but the way it is used // in this package by wrapping it with a cachedTokenProvider makes it so. type tokenProvider3LO struct { opts *Options3LO client *http.Client refreshToken string } func (tp *tokenProvider3LO) Token(ctx context.Context) (*Token, error) { if tp.refreshToken == "" { return nil, errors.New("auth: token expired and refresh token is not set") } v := url.Values{ "grant_type": {"refresh_token"}, "refresh_token": {tp.refreshToken}, } for k := range tp.opts.URLParams { v.Set(k, tp.opts.URLParams.Get(k)) } tk, rt, err := fetchToken(ctx, tp.opts, v) if err != nil { return nil, err } if tp.refreshToken != rt && rt != "" { tp.refreshToken = rt } return tk, err } type tokenProviderWithHandler struct { opts *Options3LO state string } func (tp tokenProviderWithHandler) Token(ctx context.Context) (*Token, error) { url := tp.opts.authCodeURL(tp.state, nil) code, state, err := tp.opts.AuthHandlerOpts.Handler(url) if err != nil { return nil, err } if state != tp.state { return nil, errors.New("auth: state mismatch in 3-legged-OAuth flow") } tok, _, err := tp.opts.exchange(ctx, code) return tok, err } // fetchToken returns a Token, refresh token, and/or an error. func fetchToken(ctx context.Context, o *Options3LO, v url.Values) (*Token, string, error) { var refreshToken string if o.AuthStyle == StyleInParams { if o.ClientID != "" { v.Set("client_id", o.ClientID) } if o.ClientSecret != "" { v.Set("client_secret", o.ClientSecret) } } req, err := http.NewRequestWithContext(ctx, "POST", o.TokenURL, strings.NewReader(v.Encode())) if err != nil { return nil, refreshToken, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") if o.AuthStyle == StyleInHeader { req.SetBasicAuth(url.QueryEscape(o.ClientID), url.QueryEscape(o.ClientSecret)) } logger := o.logger() logger.DebugContext(ctx, "3LO token request", "request", internallog.HTTPRequest(req, []byte(v.Encode()))) // Make request resp, body, err := internal.DoRequest(o.client(), req) if err != nil { return nil, refreshToken, err } logger.DebugContext(ctx, "3LO token response", "response", internallog.HTTPResponse(resp, body)) failureStatus := resp.StatusCode < 200 || resp.StatusCode > 299 tokError := &Error{ Response: resp, Body: body, } var token *Token // errors ignored because of default switch on content content, _, _ := mime.ParseMediaType(resp.Header.Get("Content-Type")) switch content { case "application/x-www-form-urlencoded", "text/plain": // some endpoints return a query string vals, err := url.ParseQuery(string(body)) if err != nil { if failureStatus { return nil, refreshToken, tokError } return nil, refreshToken, fmt.Errorf("auth: cannot parse response: %w", err) } tokError.code = vals.Get("error") tokError.description = vals.Get("error_description") tokError.uri = vals.Get("error_uri") token = &Token{ Value: vals.Get("access_token"), Type: vals.Get("token_type"), Metadata: make(map[string]interface{}, len(vals)), } for k, v := range vals { token.Metadata[k] = v } refreshToken = vals.Get("refresh_token") e := vals.Get("expires_in") expires, _ := strconv.Atoi(e) if expires != 0 { token.Expiry = time.Now().Add(time.Duration(expires) * time.Second) } default: var tj tokenJSON if err = json.Unmarshal(body, &tj); err != nil { if failureStatus { return nil, refreshToken, tokError } return nil, refreshToken, fmt.Errorf("auth: cannot parse json: %w", err) } tokError.code = tj.ErrorCode tokError.description = tj.ErrorDescription tokError.uri = tj.ErrorURI token = &Token{ Value: tj.AccessToken, Type: tj.TokenType, Expiry: tj.expiry(), Metadata: make(map[string]interface{}), } json.Unmarshal(body, &token.Metadata) // optional field, skip err check refreshToken = tj.RefreshToken } // according to spec, servers should respond status 400 in error case // https://www.rfc-editor.org/rfc/rfc6749#section-5.2 // but some unorthodox servers respond 200 in error case if failureStatus || tokError.code != "" { return nil, refreshToken, tokError } if token.Value == "" { return nil, refreshToken, errors.New("auth: server response missing access_token") } return token, refreshToken, nil } ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/CHANGES.md ================================================ # Changes ## [0.7.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.6.0...compute/metadata/v0.7.0) (2025-05-13) ### Features * **compute/metadata:** Allow canceling GCE detection ([#11786](https://github.com/googleapis/google-cloud-go/issues/11786)) ([78100fe](https://github.com/googleapis/google-cloud-go/commit/78100fe7e28cd30f1e10b47191ac3c9839663b64)) ## [0.6.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.5.2...compute/metadata/v0.6.0) (2024-12-13) ### Features * **compute/metadata:** Add debug logging ([#11078](https://github.com/googleapis/google-cloud-go/issues/11078)) ([a816814](https://github.com/googleapis/google-cloud-go/commit/a81681463906e4473570a2f426eb0dc2de64e53f)) ## [0.5.2](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.5.1...compute/metadata/v0.5.2) (2024-09-20) ### Bug Fixes * **compute/metadata:** Close Response Body for failed request ([#10891](https://github.com/googleapis/google-cloud-go/issues/10891)) ([e91d45e](https://github.com/googleapis/google-cloud-go/commit/e91d45e4757a9e354114509ba9800085d9e0ff1f)) ## [0.5.1](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.5.0...compute/metadata/v0.5.1) (2024-09-12) ### Bug Fixes * **compute/metadata:** Check error chain for retryable error ([#10840](https://github.com/googleapis/google-cloud-go/issues/10840)) ([2bdedef](https://github.com/googleapis/google-cloud-go/commit/2bdedeff621b223d63cebc4355fcf83bc68412cd)) ## [0.5.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.4.0...compute/metadata/v0.5.0) (2024-07-10) ### Features * **compute/metadata:** Add sys check for windows OnGCE ([#10521](https://github.com/googleapis/google-cloud-go/issues/10521)) ([3b9a830](https://github.com/googleapis/google-cloud-go/commit/3b9a83063960d2a2ac20beb47cc15818a68bd302)) ## [0.4.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.3.0...compute/metadata/v0.4.0) (2024-07-01) ### Features * **compute/metadata:** Add context for all functions/methods ([#10370](https://github.com/googleapis/google-cloud-go/issues/10370)) ([66b8efe](https://github.com/googleapis/google-cloud-go/commit/66b8efe7ad877e052b2987bb4475477e38c67bb3)) ### Documentation * **compute/metadata:** Update OnGCE description ([#10408](https://github.com/googleapis/google-cloud-go/issues/10408)) ([6a46dca](https://github.com/googleapis/google-cloud-go/commit/6a46dca4eae4f88ec6f88822e01e5bf8aeca787f)) ## [0.3.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.2.3...compute/metadata/v0.3.0) (2024-04-15) ### Features * **compute/metadata:** Add context aware functions ([#9733](https://github.com/googleapis/google-cloud-go/issues/9733)) ([e4eb5b4](https://github.com/googleapis/google-cloud-go/commit/e4eb5b46ee2aec9d2fc18300bfd66015e25a0510)) ## [0.2.3](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.2.2...compute/metadata/v0.2.3) (2022-12-15) ### Bug Fixes * **compute/metadata:** Switch DNS lookup to an absolute lookup ([119b410](https://github.com/googleapis/google-cloud-go/commit/119b41060c7895e45e48aee5621ad35607c4d021)), refs [#7165](https://github.com/googleapis/google-cloud-go/issues/7165) ## [0.2.2](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.2.1...compute/metadata/v0.2.2) (2022-12-01) ### Bug Fixes * **compute/metadata:** Set IdleConnTimeout for http.Client ([#7084](https://github.com/googleapis/google-cloud-go/issues/7084)) ([766516a](https://github.com/googleapis/google-cloud-go/commit/766516aaf3816bfb3159efeea65aa3d1d205a3e2)), refs [#5430](https://github.com/googleapis/google-cloud-go/issues/5430) ## [0.1.0] (2022-10-26) Initial release of metadata being it's own module. ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/README.md ================================================ # Compute API [![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/compute.svg)](https://pkg.go.dev/cloud.google.com/go/compute/metadata) This is a utility library for communicating with Google Cloud metadata service on Google Cloud. ## Install ```bash go get cloud.google.com/go/compute/metadata ``` ## Go Version Support See the [Go Versions Supported](https://github.com/googleapis/google-cloud-go#go-versions-supported) section in the root directory's README. ## Contributing Contributions are welcome. Please, see the [CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md) document for details. Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms. See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md#contributor-code-of-conduct) for more information. ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/log.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metadata import ( "bytes" "context" "encoding/json" "fmt" "log/slog" "net/http" "strings" ) // Code below this point is copied from github.com/googleapis/gax-go/v2/internallog // to avoid the dependency. The compute/metadata module is used by too many // non-client library modules that can't justify the dependency. // The handler returned if logging is not enabled. type noOpHandler struct{} func (h noOpHandler) Enabled(_ context.Context, _ slog.Level) bool { return false } func (h noOpHandler) Handle(_ context.Context, _ slog.Record) error { return nil } func (h noOpHandler) WithAttrs(_ []slog.Attr) slog.Handler { return h } func (h noOpHandler) WithGroup(_ string) slog.Handler { return h } // httpRequest returns a lazily evaluated [slog.LogValuer] for a // [http.Request] and the associated body. func httpRequest(req *http.Request, body []byte) slog.LogValuer { return &request{ req: req, payload: body, } } type request struct { req *http.Request payload []byte } func (r *request) LogValue() slog.Value { if r == nil || r.req == nil { return slog.Value{} } var groupValueAttrs []slog.Attr groupValueAttrs = append(groupValueAttrs, slog.String("method", r.req.Method)) groupValueAttrs = append(groupValueAttrs, slog.String("url", r.req.URL.String())) var headerAttr []slog.Attr for k, val := range r.req.Header { headerAttr = append(headerAttr, slog.String(k, strings.Join(val, ","))) } if len(headerAttr) > 0 { groupValueAttrs = append(groupValueAttrs, slog.Any("headers", headerAttr)) } if len(r.payload) > 0 { if attr, ok := processPayload(r.payload); ok { groupValueAttrs = append(groupValueAttrs, attr) } } return slog.GroupValue(groupValueAttrs...) } // httpResponse returns a lazily evaluated [slog.LogValuer] for a // [http.Response] and the associated body. func httpResponse(resp *http.Response, body []byte) slog.LogValuer { return &response{ resp: resp, payload: body, } } type response struct { resp *http.Response payload []byte } func (r *response) LogValue() slog.Value { if r == nil { return slog.Value{} } var groupValueAttrs []slog.Attr groupValueAttrs = append(groupValueAttrs, slog.String("status", fmt.Sprint(r.resp.StatusCode))) var headerAttr []slog.Attr for k, val := range r.resp.Header { headerAttr = append(headerAttr, slog.String(k, strings.Join(val, ","))) } if len(headerAttr) > 0 { groupValueAttrs = append(groupValueAttrs, slog.Any("headers", headerAttr)) } if len(r.payload) > 0 { if attr, ok := processPayload(r.payload); ok { groupValueAttrs = append(groupValueAttrs, attr) } } return slog.GroupValue(groupValueAttrs...) } func processPayload(payload []byte) (slog.Attr, bool) { peekChar := payload[0] if peekChar == '{' { // JSON object var m map[string]any if err := json.Unmarshal(payload, &m); err == nil { return slog.Any("payload", m), true } } else if peekChar == '[' { // JSON array var m []any if err := json.Unmarshal(payload, &m); err == nil { return slog.Any("payload", m), true } } else { // Everything else buf := &bytes.Buffer{} if err := json.Compact(buf, payload); err != nil { // Write raw payload incase of error buf.Write(payload) } return slog.String("payload", buf.String()), true } return slog.Attr{}, false } ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/metadata.go ================================================ // Copyright 2014 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package metadata provides access to Google Compute Engine (GCE) // metadata and API service accounts. // // This package is a wrapper around the GCE metadata service, // as documented at https://cloud.google.com/compute/docs/metadata/overview. package metadata // import "cloud.google.com/go/compute/metadata" import ( "context" "encoding/json" "fmt" "io" "log/slog" "net" "net/http" "net/url" "os" "strings" "sync" "time" ) const ( // metadataIP is the documented metadata server IP address. metadataIP = "169.254.169.254" // metadataHostEnv is the environment variable specifying the // GCE metadata hostname. If empty, the default value of // metadataIP ("169.254.169.254") is used instead. // This is variable name is not defined by any spec, as far as // I know; it was made up for the Go package. metadataHostEnv = "GCE_METADATA_HOST" userAgent = "gcloud-golang/0.1" ) type cachedValue struct { k string trim bool mu sync.Mutex v string } var ( projID = &cachedValue{k: "project/project-id", trim: true} projNum = &cachedValue{k: "project/numeric-project-id", trim: true} instID = &cachedValue{k: "instance/id", trim: true} ) var defaultClient = &Client{ hc: newDefaultHTTPClient(), logger: slog.New(noOpHandler{}), } func newDefaultHTTPClient() *http.Client { return &http.Client{ Transport: &http.Transport{ Dial: (&net.Dialer{ Timeout: 2 * time.Second, KeepAlive: 30 * time.Second, }).Dial, IdleConnTimeout: 60 * time.Second, }, Timeout: 5 * time.Second, } } // NotDefinedError is returned when requested metadata is not defined. // // The underlying string is the suffix after "/computeMetadata/v1/". // // This error is not returned if the value is defined to be the empty // string. type NotDefinedError string func (suffix NotDefinedError) Error() string { return fmt.Sprintf("metadata: GCE metadata %q not defined", string(suffix)) } func (c *cachedValue) get(ctx context.Context, cl *Client) (v string, err error) { defer c.mu.Unlock() c.mu.Lock() if c.v != "" { return c.v, nil } if c.trim { v, err = cl.getTrimmed(ctx, c.k) } else { v, err = cl.GetWithContext(ctx, c.k) } if err == nil { c.v = v } return } var ( onGCEOnce sync.Once onGCE bool ) // OnGCE reports whether this process is running on Google Compute Platforms. // NOTE: True returned from `OnGCE` does not guarantee that the metadata server // is accessible from this process and have all the metadata defined. func OnGCE() bool { return OnGCEWithContext(context.Background()) } // OnGCEWithContext reports whether this process is running on Google Compute Platforms. // This function's return value is memoized for better performance. // NOTE: True returned from `OnGCEWithContext` does not guarantee that the metadata server // is accessible from this process and have all the metadata defined. func OnGCEWithContext(ctx context.Context) bool { onGCEOnce.Do(func() { onGCE = defaultClient.OnGCEWithContext(ctx) }) return onGCE } // Subscribe calls Client.SubscribeWithContext on the default client. // // Deprecated: Please use the context aware variant [SubscribeWithContext]. func Subscribe(suffix string, fn func(v string, ok bool) error) error { return defaultClient.SubscribeWithContext(context.Background(), suffix, func(ctx context.Context, v string, ok bool) error { return fn(v, ok) }) } // SubscribeWithContext calls Client.SubscribeWithContext on the default client. func SubscribeWithContext(ctx context.Context, suffix string, fn func(ctx context.Context, v string, ok bool) error) error { return defaultClient.SubscribeWithContext(ctx, suffix, fn) } // Get calls Client.GetWithContext on the default client. // // Deprecated: Please use the context aware variant [GetWithContext]. func Get(suffix string) (string, error) { return defaultClient.GetWithContext(context.Background(), suffix) } // GetWithContext calls Client.GetWithContext on the default client. func GetWithContext(ctx context.Context, suffix string) (string, error) { return defaultClient.GetWithContext(ctx, suffix) } // ProjectID returns the current instance's project ID string. // // Deprecated: Please use the context aware variant [ProjectIDWithContext]. func ProjectID() (string, error) { return defaultClient.ProjectIDWithContext(context.Background()) } // ProjectIDWithContext returns the current instance's project ID string. func ProjectIDWithContext(ctx context.Context) (string, error) { return defaultClient.ProjectIDWithContext(ctx) } // NumericProjectID returns the current instance's numeric project ID. // // Deprecated: Please use the context aware variant [NumericProjectIDWithContext]. func NumericProjectID() (string, error) { return defaultClient.NumericProjectIDWithContext(context.Background()) } // NumericProjectIDWithContext returns the current instance's numeric project ID. func NumericProjectIDWithContext(ctx context.Context) (string, error) { return defaultClient.NumericProjectIDWithContext(ctx) } // InternalIP returns the instance's primary internal IP address. // // Deprecated: Please use the context aware variant [InternalIPWithContext]. func InternalIP() (string, error) { return defaultClient.InternalIPWithContext(context.Background()) } // InternalIPWithContext returns the instance's primary internal IP address. func InternalIPWithContext(ctx context.Context) (string, error) { return defaultClient.InternalIPWithContext(ctx) } // ExternalIP returns the instance's primary external (public) IP address. // // Deprecated: Please use the context aware variant [ExternalIPWithContext]. func ExternalIP() (string, error) { return defaultClient.ExternalIPWithContext(context.Background()) } // ExternalIPWithContext returns the instance's primary external (public) IP address. func ExternalIPWithContext(ctx context.Context) (string, error) { return defaultClient.ExternalIPWithContext(ctx) } // Email calls Client.EmailWithContext on the default client. // // Deprecated: Please use the context aware variant [EmailWithContext]. func Email(serviceAccount string) (string, error) { return defaultClient.EmailWithContext(context.Background(), serviceAccount) } // EmailWithContext calls Client.EmailWithContext on the default client. func EmailWithContext(ctx context.Context, serviceAccount string) (string, error) { return defaultClient.EmailWithContext(ctx, serviceAccount) } // Hostname returns the instance's hostname. This will be of the form // ".c..internal". // // Deprecated: Please use the context aware variant [HostnameWithContext]. func Hostname() (string, error) { return defaultClient.HostnameWithContext(context.Background()) } // HostnameWithContext returns the instance's hostname. This will be of the form // ".c..internal". func HostnameWithContext(ctx context.Context) (string, error) { return defaultClient.HostnameWithContext(ctx) } // InstanceTags returns the list of user-defined instance tags, // assigned when initially creating a GCE instance. // // Deprecated: Please use the context aware variant [InstanceTagsWithContext]. func InstanceTags() ([]string, error) { return defaultClient.InstanceTagsWithContext(context.Background()) } // InstanceTagsWithContext returns the list of user-defined instance tags, // assigned when initially creating a GCE instance. func InstanceTagsWithContext(ctx context.Context) ([]string, error) { return defaultClient.InstanceTagsWithContext(ctx) } // InstanceID returns the current VM's numeric instance ID. // // Deprecated: Please use the context aware variant [InstanceIDWithContext]. func InstanceID() (string, error) { return defaultClient.InstanceIDWithContext(context.Background()) } // InstanceIDWithContext returns the current VM's numeric instance ID. func InstanceIDWithContext(ctx context.Context) (string, error) { return defaultClient.InstanceIDWithContext(ctx) } // InstanceName returns the current VM's instance ID string. // // Deprecated: Please use the context aware variant [InstanceNameWithContext]. func InstanceName() (string, error) { return defaultClient.InstanceNameWithContext(context.Background()) } // InstanceNameWithContext returns the current VM's instance ID string. func InstanceNameWithContext(ctx context.Context) (string, error) { return defaultClient.InstanceNameWithContext(ctx) } // Zone returns the current VM's zone, such as "us-central1-b". // // Deprecated: Please use the context aware variant [ZoneWithContext]. func Zone() (string, error) { return defaultClient.ZoneWithContext(context.Background()) } // ZoneWithContext returns the current VM's zone, such as "us-central1-b". func ZoneWithContext(ctx context.Context) (string, error) { return defaultClient.ZoneWithContext(ctx) } // InstanceAttributes calls Client.InstanceAttributesWithContext on the default client. // // Deprecated: Please use the context aware variant [InstanceAttributesWithContext. func InstanceAttributes() ([]string, error) { return defaultClient.InstanceAttributesWithContext(context.Background()) } // InstanceAttributesWithContext calls Client.ProjectAttributesWithContext on the default client. func InstanceAttributesWithContext(ctx context.Context) ([]string, error) { return defaultClient.InstanceAttributesWithContext(ctx) } // ProjectAttributes calls Client.ProjectAttributesWithContext on the default client. // // Deprecated: Please use the context aware variant [ProjectAttributesWithContext]. func ProjectAttributes() ([]string, error) { return defaultClient.ProjectAttributesWithContext(context.Background()) } // ProjectAttributesWithContext calls Client.ProjectAttributesWithContext on the default client. func ProjectAttributesWithContext(ctx context.Context) ([]string, error) { return defaultClient.ProjectAttributesWithContext(ctx) } // InstanceAttributeValue calls Client.InstanceAttributeValueWithContext on the default client. // // Deprecated: Please use the context aware variant [InstanceAttributeValueWithContext]. func InstanceAttributeValue(attr string) (string, error) { return defaultClient.InstanceAttributeValueWithContext(context.Background(), attr) } // InstanceAttributeValueWithContext calls Client.InstanceAttributeValueWithContext on the default client. func InstanceAttributeValueWithContext(ctx context.Context, attr string) (string, error) { return defaultClient.InstanceAttributeValueWithContext(ctx, attr) } // ProjectAttributeValue calls Client.ProjectAttributeValueWithContext on the default client. // // Deprecated: Please use the context aware variant [ProjectAttributeValueWithContext]. func ProjectAttributeValue(attr string) (string, error) { return defaultClient.ProjectAttributeValueWithContext(context.Background(), attr) } // ProjectAttributeValueWithContext calls Client.ProjectAttributeValueWithContext on the default client. func ProjectAttributeValueWithContext(ctx context.Context, attr string) (string, error) { return defaultClient.ProjectAttributeValueWithContext(ctx, attr) } // Scopes calls Client.ScopesWithContext on the default client. // // Deprecated: Please use the context aware variant [ScopesWithContext]. func Scopes(serviceAccount string) ([]string, error) { return defaultClient.ScopesWithContext(context.Background(), serviceAccount) } // ScopesWithContext calls Client.ScopesWithContext on the default client. func ScopesWithContext(ctx context.Context, serviceAccount string) ([]string, error) { return defaultClient.ScopesWithContext(ctx, serviceAccount) } func strsContains(ss []string, s string) bool { for _, v := range ss { if v == s { return true } } return false } // A Client provides metadata. type Client struct { hc *http.Client logger *slog.Logger } // Options for configuring a [Client]. type Options struct { // Client is the HTTP client used to make requests. Optional. Client *http.Client // Logger is used to log information about HTTP request and responses. // If not provided, nothing will be logged. Optional. Logger *slog.Logger } // NewClient returns a Client that can be used to fetch metadata. // Returns the client that uses the specified http.Client for HTTP requests. // If nil is specified, returns the default client. func NewClient(c *http.Client) *Client { return NewWithOptions(&Options{ Client: c, }) } // NewWithOptions returns a Client that is configured with the provided Options. func NewWithOptions(opts *Options) *Client { if opts == nil { return defaultClient } client := opts.Client if client == nil { client = newDefaultHTTPClient() } logger := opts.Logger if logger == nil { logger = slog.New(noOpHandler{}) } return &Client{hc: client, logger: logger} } // NOTE: metadataRequestStrategy is assigned to a variable for test stubbing purposes. var metadataRequestStrategy = func(ctx context.Context, httpClient *http.Client, resc chan bool) { req, _ := http.NewRequest("GET", "http://"+metadataIP, nil) req.Header.Set("User-Agent", userAgent) res, err := httpClient.Do(req.WithContext(ctx)) if err != nil { resc <- false return } defer res.Body.Close() resc <- res.Header.Get("Metadata-Flavor") == "Google" } // NOTE: dnsRequestStrategy is assigned to a variable for test stubbing purposes. var dnsRequestStrategy = func(ctx context.Context, resc chan bool) { resolver := &net.Resolver{} addrs, err := resolver.LookupHost(ctx, "metadata.google.internal.") if err != nil || len(addrs) == 0 { resc <- false return } resc <- strsContains(addrs, metadataIP) } // OnGCEWithContext reports whether this process is running on Google Compute Platforms. // NOTE: True returned from `OnGCEWithContext` does not guarantee that the metadata server // is accessible from this process and have all the metadata defined. func (c *Client) OnGCEWithContext(ctx context.Context) bool { // The user explicitly said they're on GCE, so trust them. if os.Getenv(metadataHostEnv) != "" { return true } ctx, cancel := context.WithCancel(ctx) defer cancel() resc := make(chan bool, 2) // Try two strategies in parallel. // See https://github.com/googleapis/google-cloud-go/issues/194 go metadataRequestStrategy(ctx, c.hc, resc) go dnsRequestStrategy(ctx, resc) tryHarder := systemInfoSuggestsGCE() if tryHarder { res := <-resc if res { // The first strategy succeeded, so let's use it. return true } // Wait for either the DNS or metadata server probe to // contradict the other one and say we are running on // GCE. Give it a lot of time to do so, since the system // info already suggests we're running on a GCE BIOS. // Ensure cancellations from the calling context are respected. waitContext, cancelWait := context.WithTimeout(ctx, 5*time.Second) defer cancelWait() select { case res = <-resc: return res case <-waitContext.Done(): // Too slow. Who knows what this system is. return false } } // There's no hint from the system info that we're running on // GCE, so use the first probe's result as truth, whether it's // true or false. The goal here is to optimize for speed for // users who are NOT running on GCE. We can't assume that // either a DNS lookup or an HTTP request to a blackholed IP // address is fast. Worst case this should return when the // metaClient's Transport.ResponseHeaderTimeout or // Transport.Dial.Timeout fires (in two seconds). return <-resc } // getETag returns a value from the metadata service as well as the associated ETag. // This func is otherwise equivalent to Get. func (c *Client) getETag(ctx context.Context, suffix string) (value, etag string, err error) { // Using a fixed IP makes it very difficult to spoof the metadata service in // a container, which is an important use-case for local testing of cloud // deployments. To enable spoofing of the metadata service, the environment // variable GCE_METADATA_HOST is first inspected to decide where metadata // requests shall go. host := os.Getenv(metadataHostEnv) if host == "" { // Using 169.254.169.254 instead of "metadata" here because Go // binaries built with the "netgo" tag and without cgo won't // know the search suffix for "metadata" is // ".google.internal", and this IP address is documented as // being stable anyway. host = metadataIP } suffix = strings.TrimLeft(suffix, "/") u := "http://" + host + "/computeMetadata/v1/" + suffix req, err := http.NewRequestWithContext(ctx, "GET", u, nil) if err != nil { return "", "", err } req.Header.Set("Metadata-Flavor", "Google") req.Header.Set("User-Agent", userAgent) var res *http.Response var reqErr error var body []byte retryer := newRetryer() for { c.logger.DebugContext(ctx, "metadata request", "request", httpRequest(req, nil)) res, reqErr = c.hc.Do(req) var code int if res != nil { code = res.StatusCode body, err = io.ReadAll(res.Body) if err != nil { res.Body.Close() return "", "", err } c.logger.DebugContext(ctx, "metadata response", "response", httpResponse(res, body)) res.Body.Close() } if delay, shouldRetry := retryer.Retry(code, reqErr); shouldRetry { if res != nil && res.Body != nil { res.Body.Close() } if err := sleep(ctx, delay); err != nil { return "", "", err } continue } break } if reqErr != nil { return "", "", reqErr } if res.StatusCode == http.StatusNotFound { return "", "", NotDefinedError(suffix) } if res.StatusCode != 200 { return "", "", &Error{Code: res.StatusCode, Message: string(body)} } return string(body), res.Header.Get("Etag"), nil } // Get returns a value from the metadata service. // The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". // // If the GCE_METADATA_HOST environment variable is not defined, a default of // 169.254.169.254 will be used instead. // // If the requested metadata is not defined, the returned error will // be of type NotDefinedError. // // Deprecated: Please use the context aware variant [Client.GetWithContext]. func (c *Client) Get(suffix string) (string, error) { return c.GetWithContext(context.Background(), suffix) } // GetWithContext returns a value from the metadata service. // The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". // // If the GCE_METADATA_HOST environment variable is not defined, a default of // 169.254.169.254 will be used instead. // // If the requested metadata is not defined, the returned error will // be of type NotDefinedError. // // NOTE: Without an extra deadline in the context this call can take in the // worst case, with internal backoff retries, up to 15 seconds (e.g. when server // is responding slowly). Pass context with additional timeouts when needed. func (c *Client) GetWithContext(ctx context.Context, suffix string) (string, error) { val, _, err := c.getETag(ctx, suffix) return val, err } func (c *Client) getTrimmed(ctx context.Context, suffix string) (s string, err error) { s, err = c.GetWithContext(ctx, suffix) s = strings.TrimSpace(s) return } func (c *Client) lines(ctx context.Context, suffix string) ([]string, error) { j, err := c.GetWithContext(ctx, suffix) if err != nil { return nil, err } s := strings.Split(strings.TrimSpace(j), "\n") for i := range s { s[i] = strings.TrimSpace(s[i]) } return s, nil } // ProjectID returns the current instance's project ID string. // // Deprecated: Please use the context aware variant [Client.ProjectIDWithContext]. func (c *Client) ProjectID() (string, error) { return c.ProjectIDWithContext(context.Background()) } // ProjectIDWithContext returns the current instance's project ID string. func (c *Client) ProjectIDWithContext(ctx context.Context) (string, error) { return projID.get(ctx, c) } // NumericProjectID returns the current instance's numeric project ID. // // Deprecated: Please use the context aware variant [Client.NumericProjectIDWithContext]. func (c *Client) NumericProjectID() (string, error) { return c.NumericProjectIDWithContext(context.Background()) } // NumericProjectIDWithContext returns the current instance's numeric project ID. func (c *Client) NumericProjectIDWithContext(ctx context.Context) (string, error) { return projNum.get(ctx, c) } // InstanceID returns the current VM's numeric instance ID. // // Deprecated: Please use the context aware variant [Client.InstanceIDWithContext]. func (c *Client) InstanceID() (string, error) { return c.InstanceIDWithContext(context.Background()) } // InstanceIDWithContext returns the current VM's numeric instance ID. func (c *Client) InstanceIDWithContext(ctx context.Context) (string, error) { return instID.get(ctx, c) } // InternalIP returns the instance's primary internal IP address. // // Deprecated: Please use the context aware variant [Client.InternalIPWithContext]. func (c *Client) InternalIP() (string, error) { return c.InternalIPWithContext(context.Background()) } // InternalIPWithContext returns the instance's primary internal IP address. func (c *Client) InternalIPWithContext(ctx context.Context) (string, error) { return c.getTrimmed(ctx, "instance/network-interfaces/0/ip") } // Email returns the email address associated with the service account. // // Deprecated: Please use the context aware variant [Client.EmailWithContext]. func (c *Client) Email(serviceAccount string) (string, error) { return c.EmailWithContext(context.Background(), serviceAccount) } // EmailWithContext returns the email address associated with the service account. // The serviceAccount parameter default value (empty string or "default" value) // will use the instance's main account. func (c *Client) EmailWithContext(ctx context.Context, serviceAccount string) (string, error) { if serviceAccount == "" { serviceAccount = "default" } return c.getTrimmed(ctx, "instance/service-accounts/"+serviceAccount+"/email") } // ExternalIP returns the instance's primary external (public) IP address. // // Deprecated: Please use the context aware variant [Client.ExternalIPWithContext]. func (c *Client) ExternalIP() (string, error) { return c.ExternalIPWithContext(context.Background()) } // ExternalIPWithContext returns the instance's primary external (public) IP address. func (c *Client) ExternalIPWithContext(ctx context.Context) (string, error) { return c.getTrimmed(ctx, "instance/network-interfaces/0/access-configs/0/external-ip") } // Hostname returns the instance's hostname. This will be of the form // ".c..internal". // // Deprecated: Please use the context aware variant [Client.HostnameWithContext]. func (c *Client) Hostname() (string, error) { return c.HostnameWithContext(context.Background()) } // HostnameWithContext returns the instance's hostname. This will be of the form // ".c..internal". func (c *Client) HostnameWithContext(ctx context.Context) (string, error) { return c.getTrimmed(ctx, "instance/hostname") } // InstanceTags returns the list of user-defined instance tags. // // Deprecated: Please use the context aware variant [Client.InstanceTagsWithContext]. func (c *Client) InstanceTags() ([]string, error) { return c.InstanceTagsWithContext(context.Background()) } // InstanceTagsWithContext returns the list of user-defined instance tags, // assigned when initially creating a GCE instance. func (c *Client) InstanceTagsWithContext(ctx context.Context) ([]string, error) { var s []string j, err := c.GetWithContext(ctx, "instance/tags") if err != nil { return nil, err } if err := json.NewDecoder(strings.NewReader(j)).Decode(&s); err != nil { return nil, err } return s, nil } // InstanceName returns the current VM's instance ID string. // // Deprecated: Please use the context aware variant [Client.InstanceNameWithContext]. func (c *Client) InstanceName() (string, error) { return c.InstanceNameWithContext(context.Background()) } // InstanceNameWithContext returns the current VM's instance ID string. func (c *Client) InstanceNameWithContext(ctx context.Context) (string, error) { return c.getTrimmed(ctx, "instance/name") } // Zone returns the current VM's zone, such as "us-central1-b". // // Deprecated: Please use the context aware variant [Client.ZoneWithContext]. func (c *Client) Zone() (string, error) { return c.ZoneWithContext(context.Background()) } // ZoneWithContext returns the current VM's zone, such as "us-central1-b". func (c *Client) ZoneWithContext(ctx context.Context) (string, error) { zone, err := c.getTrimmed(ctx, "instance/zone") // zone is of the form "projects//zones/". if err != nil { return "", err } return zone[strings.LastIndex(zone, "/")+1:], nil } // InstanceAttributes returns the list of user-defined attributes, // assigned when initially creating a GCE VM instance. The value of an // attribute can be obtained with InstanceAttributeValue. // // Deprecated: Please use the context aware variant [Client.InstanceAttributesWithContext]. func (c *Client) InstanceAttributes() ([]string, error) { return c.InstanceAttributesWithContext(context.Background()) } // InstanceAttributesWithContext returns the list of user-defined attributes, // assigned when initially creating a GCE VM instance. The value of an // attribute can be obtained with InstanceAttributeValue. func (c *Client) InstanceAttributesWithContext(ctx context.Context) ([]string, error) { return c.lines(ctx, "instance/attributes/") } // ProjectAttributes returns the list of user-defined attributes // applying to the project as a whole, not just this VM. The value of // an attribute can be obtained with ProjectAttributeValue. // // Deprecated: Please use the context aware variant [Client.ProjectAttributesWithContext]. func (c *Client) ProjectAttributes() ([]string, error) { return c.ProjectAttributesWithContext(context.Background()) } // ProjectAttributesWithContext returns the list of user-defined attributes // applying to the project as a whole, not just this VM. The value of // an attribute can be obtained with ProjectAttributeValue. func (c *Client) ProjectAttributesWithContext(ctx context.Context) ([]string, error) { return c.lines(ctx, "project/attributes/") } // InstanceAttributeValue returns the value of the provided VM // instance attribute. // // If the requested attribute is not defined, the returned error will // be of type NotDefinedError. // // InstanceAttributeValue may return ("", nil) if the attribute was // defined to be the empty string. // // Deprecated: Please use the context aware variant [Client.InstanceAttributeValueWithContext]. func (c *Client) InstanceAttributeValue(attr string) (string, error) { return c.InstanceAttributeValueWithContext(context.Background(), attr) } // InstanceAttributeValueWithContext returns the value of the provided VM // instance attribute. // // If the requested attribute is not defined, the returned error will // be of type NotDefinedError. // // InstanceAttributeValue may return ("", nil) if the attribute was // defined to be the empty string. func (c *Client) InstanceAttributeValueWithContext(ctx context.Context, attr string) (string, error) { return c.GetWithContext(ctx, "instance/attributes/"+attr) } // ProjectAttributeValue returns the value of the provided // project attribute. // // If the requested attribute is not defined, the returned error will // be of type NotDefinedError. // // ProjectAttributeValue may return ("", nil) if the attribute was // defined to be the empty string. // // Deprecated: Please use the context aware variant [Client.ProjectAttributeValueWithContext]. func (c *Client) ProjectAttributeValue(attr string) (string, error) { return c.ProjectAttributeValueWithContext(context.Background(), attr) } // ProjectAttributeValueWithContext returns the value of the provided // project attribute. // // If the requested attribute is not defined, the returned error will // be of type NotDefinedError. // // ProjectAttributeValue may return ("", nil) if the attribute was // defined to be the empty string. func (c *Client) ProjectAttributeValueWithContext(ctx context.Context, attr string) (string, error) { return c.GetWithContext(ctx, "project/attributes/"+attr) } // Scopes returns the service account scopes for the given account. // The account may be empty or the string "default" to use the instance's // main account. // // Deprecated: Please use the context aware variant [Client.ScopesWithContext]. func (c *Client) Scopes(serviceAccount string) ([]string, error) { return c.ScopesWithContext(context.Background(), serviceAccount) } // ScopesWithContext returns the service account scopes for the given account. // The account may be empty or the string "default" to use the instance's // main account. func (c *Client) ScopesWithContext(ctx context.Context, serviceAccount string) ([]string, error) { if serviceAccount == "" { serviceAccount = "default" } return c.lines(ctx, "instance/service-accounts/"+serviceAccount+"/scopes") } // Subscribe subscribes to a value from the metadata service. // The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". // The suffix may contain query parameters. // // Deprecated: Please use the context aware variant [Client.SubscribeWithContext]. func (c *Client) Subscribe(suffix string, fn func(v string, ok bool) error) error { return c.SubscribeWithContext(context.Background(), suffix, func(ctx context.Context, v string, ok bool) error { return fn(v, ok) }) } // SubscribeWithContext subscribes to a value from the metadata service. // The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". // The suffix may contain query parameters. // // SubscribeWithContext calls fn with the latest metadata value indicated by the // provided suffix. If the metadata value is deleted, fn is called with the // empty string and ok false. Subscribe blocks until fn returns a non-nil error // or the value is deleted. Subscribe returns the error value returned from the // last call to fn, which may be nil when ok == false. func (c *Client) SubscribeWithContext(ctx context.Context, suffix string, fn func(ctx context.Context, v string, ok bool) error) error { const failedSubscribeSleep = time.Second * 5 // First check to see if the metadata value exists at all. val, lastETag, err := c.getETag(ctx, suffix) if err != nil { return err } if err := fn(ctx, val, true); err != nil { return err } ok := true if strings.ContainsRune(suffix, '?') { suffix += "&wait_for_change=true&last_etag=" } else { suffix += "?wait_for_change=true&last_etag=" } for { val, etag, err := c.getETag(ctx, suffix+url.QueryEscape(lastETag)) if err != nil { if _, deleted := err.(NotDefinedError); !deleted { time.Sleep(failedSubscribeSleep) continue // Retry on other errors. } ok = false } lastETag = etag if err := fn(ctx, val, ok); err != nil || !ok { return err } } } // Error contains an error response from the server. type Error struct { // Code is the HTTP response status code. Code int // Message is the server response message. Message string } func (e *Error) Error() string { return fmt.Sprintf("compute: Received %d `%s`", e.Code, e.Message) } ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/retry.go ================================================ // Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metadata import ( "context" "io" "math/rand" "net/http" "time" ) const ( maxRetryAttempts = 5 ) var ( syscallRetryable = func(error) bool { return false } ) // defaultBackoff is basically equivalent to gax.Backoff without the need for // the dependency. type defaultBackoff struct { max time.Duration mul float64 cur time.Duration } func (b *defaultBackoff) Pause() time.Duration { d := time.Duration(1 + rand.Int63n(int64(b.cur))) b.cur = time.Duration(float64(b.cur) * b.mul) if b.cur > b.max { b.cur = b.max } return d } // sleep is the equivalent of gax.Sleep without the need for the dependency. func sleep(ctx context.Context, d time.Duration) error { t := time.NewTimer(d) select { case <-ctx.Done(): t.Stop() return ctx.Err() case <-t.C: return nil } } func newRetryer() *metadataRetryer { return &metadataRetryer{bo: &defaultBackoff{ cur: 100 * time.Millisecond, max: 30 * time.Second, mul: 2, }} } type backoff interface { Pause() time.Duration } type metadataRetryer struct { bo backoff attempts int } func (r *metadataRetryer) Retry(status int, err error) (time.Duration, bool) { if status == http.StatusOK { return 0, false } retryOk := shouldRetry(status, err) if !retryOk { return 0, false } if r.attempts == maxRetryAttempts { return 0, false } r.attempts++ return r.bo.Pause(), true } func shouldRetry(status int, err error) bool { if 500 <= status && status <= 599 { return true } if err == io.ErrUnexpectedEOF { return true } // Transient network errors should be retried. if syscallRetryable(err) { return true } if err, ok := err.(interface{ Temporary() bool }); ok { if err.Temporary() { return true } } if err, ok := err.(interface{ Unwrap() error }); ok { return shouldRetry(status, err.Unwrap()) } return false } ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/retry_linux.go ================================================ // Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build linux // +build linux package metadata import ( "errors" "syscall" ) func init() { // Initialize syscallRetryable to return true on transient socket-level // errors. These errors are specific to Linux. syscallRetryable = func(err error) bool { return errors.Is(err, syscall.ECONNRESET) || errors.Is(err, syscall.ECONNREFUSED) } } ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/syscheck.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build !windows && !linux package metadata // systemInfoSuggestsGCE reports whether the local system (without // doing network requests) suggests that we're running on GCE. If this // returns true, testOnGCE tries a bit harder to reach its metadata // server. // // NOTE: systemInfoSuggestsGCE is assigned to a varible for test stubbing purposes. var systemInfoSuggestsGCE = func() bool { // We don't currently have checks for other GOOS return false } ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/syscheck_linux.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build linux package metadata import ( "os" "strings" ) // NOTE: systemInfoSuggestsGCE is assigned to a varible for test stubbing purposes. var systemInfoSuggestsGCE = func() bool { b, _ := os.ReadFile("/sys/class/dmi/id/product_name") name := strings.TrimSpace(string(b)) return name == "Google" || name == "Google Compute Engine" } ================================================ FILE: vendor/cloud.google.com/go/compute/metadata/syscheck_windows.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:build windows package metadata import ( "strings" "golang.org/x/sys/windows/registry" ) // NOTE: systemInfoSuggestsGCE is assigned to a varible for test stubbing purposes. var systemInfoSuggestsGCE = func() bool { k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SYSTEM\HardwareConfig\Current`, registry.QUERY_VALUE) if err != nil { return false } defer k.Close() s, _, err := k.GetStringValue("SystemProductName") if err != nil { return false } s = strings.TrimSpace(s) return strings.HasPrefix(s, "Google") } ================================================ FILE: vendor/cloud.google.com/go/iam/CHANGES.md ================================================ # Changes ## [1.5.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.5.1...iam/v1.5.2) (2025-04-15) ### Bug Fixes * **iam:** Update google.golang.org/api to 0.229.0 ([3319672](https://github.com/googleapis/google-cloud-go/commit/3319672f3dba84a7150772ccb5433e02dab7e201)) ## [1.5.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.5.0...iam/v1.5.1) (2025-04-15) ### Documentation * **iam:** Formatting update for ListPolicyBindingsRequest ([dfdf404](https://github.com/googleapis/google-cloud-go/commit/dfdf404138728724aa6305c5c465ecc6fe5b1264)) * **iam:** Minor doc update for ListPrincipalAccessBoundaryPoliciesResponse ([20f762c](https://github.com/googleapis/google-cloud-go/commit/20f762c528726a3f038d3e1f37e8a4952118badf)) * **iam:** Minor doc update for ListPrincipalAccessBoundaryPoliciesResponse ([20f762c](https://github.com/googleapis/google-cloud-go/commit/20f762c528726a3f038d3e1f37e8a4952118badf)) ## [1.5.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.4.2...iam/v1.5.0) (2025-03-31) ### Features * **iam:** New client(s) ([#11933](https://github.com/googleapis/google-cloud-go/issues/11933)) ([d5cb2e5](https://github.com/googleapis/google-cloud-go/commit/d5cb2e58334c6963cc46885f565fe3b19c52cb63)) ## [1.4.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.4.1...iam/v1.4.2) (2025-03-13) ### Bug Fixes * **iam:** Update golang.org/x/net to 0.37.0 ([1144978](https://github.com/googleapis/google-cloud-go/commit/11449782c7fb4896bf8b8b9cde8e7441c84fb2fd)) ## [1.4.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.4.0...iam/v1.4.1) (2025-03-06) ### Bug Fixes * **iam:** Fix out-of-sync version.go ([28f0030](https://github.com/googleapis/google-cloud-go/commit/28f00304ebb13abfd0da2f45b9b79de093cca1ec)) ## [1.4.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.3.1...iam/v1.4.0) (2025-02-12) ### Features * **iam/admin:** Regenerate client ([#11570](https://github.com/googleapis/google-cloud-go/issues/11570)) ([eab87d7](https://github.com/googleapis/google-cloud-go/commit/eab87d73bea884c636ec88f03b9aa90102a2833f)), refs [#8219](https://github.com/googleapis/google-cloud-go/issues/8219) ## [1.3.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.3.0...iam/v1.3.1) (2025-01-02) ### Bug Fixes * **iam:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9)) ## [1.3.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.2.2...iam/v1.3.0) (2024-12-04) ### Features * **iam:** Add ResourcePolicyMember to google/iam/v1 ([8dedb87](https://github.com/googleapis/google-cloud-go/commit/8dedb878c070cc1e92d62bb9b32358425e3ceffb)) ## [1.2.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.2.1...iam/v1.2.2) (2024-10-23) ### Bug Fixes * **iam:** Update google.golang.org/api to v0.203.0 ([8bb87d5](https://github.com/googleapis/google-cloud-go/commit/8bb87d56af1cba736e0fe243979723e747e5e11e)) * **iam:** WARNING: On approximately Dec 1, 2024, an update to Protobuf will change service registration function signatures to use an interface instead of a concrete type in generated .pb.go files. This change is expected to affect very few if any users of this client library. For more information, see https://togithub.com/googleapis/google-cloud-go/issues/11020. ([8bb87d5](https://github.com/googleapis/google-cloud-go/commit/8bb87d56af1cba736e0fe243979723e747e5e11e)) ## [1.2.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.2.0...iam/v1.2.1) (2024-09-12) ### Bug Fixes * **iam:** Bump dependencies ([2ddeb15](https://github.com/googleapis/google-cloud-go/commit/2ddeb1544a53188a7592046b98913982f1b0cf04)) ## [1.2.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.13...iam/v1.2.0) (2024-08-20) ### Features * **iam:** Add support for Go 1.23 iterators ([84461c0](https://github.com/googleapis/google-cloud-go/commit/84461c0ba464ec2f951987ba60030e37c8a8fc18)) ## [1.1.13](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.12...iam/v1.1.13) (2024-08-08) ### Bug Fixes * **iam:** Update google.golang.org/api to v0.191.0 ([5b32644](https://github.com/googleapis/google-cloud-go/commit/5b32644eb82eb6bd6021f80b4fad471c60fb9d73)) ## [1.1.12](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.11...iam/v1.1.12) (2024-07-24) ### Bug Fixes * **iam:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758)) ## [1.1.11](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.10...iam/v1.1.11) (2024-07-10) ### Bug Fixes * **iam:** Bump google.golang.org/grpc@v1.64.1 ([8ecc4e9](https://github.com/googleapis/google-cloud-go/commit/8ecc4e9622e5bbe9b90384d5848ab816027226c5)) ## [1.1.10](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.9...iam/v1.1.10) (2024-07-01) ### Bug Fixes * **iam:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b)) ## [1.1.9](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.8...iam/v1.1.9) (2024-06-26) ### Bug Fixes * **iam:** Enable new auth lib ([b95805f](https://github.com/googleapis/google-cloud-go/commit/b95805f4c87d3e8d10ea23bd7a2d68d7a4157568)) ## [1.1.8](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.7...iam/v1.1.8) (2024-05-01) ### Bug Fixes * **iam:** Bump x/net to v0.24.0 ([ba31ed5](https://github.com/googleapis/google-cloud-go/commit/ba31ed5fda2c9664f2e1cf972469295e63deb5b4)) ## [1.1.7](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.6...iam/v1.1.7) (2024-03-14) ### Bug Fixes * **iam:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a)) ## [1.1.6](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.5...iam/v1.1.6) (2024-01-30) ### Bug Fixes * **iam:** Enable universe domain resolution options ([fd1d569](https://github.com/googleapis/google-cloud-go/commit/fd1d56930fa8a747be35a224611f4797b8aeb698)) ## [1.1.5](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.4...iam/v1.1.5) (2023-11-01) ### Bug Fixes * **iam:** Bump google.golang.org/api to v0.149.0 ([8d2ab9f](https://github.com/googleapis/google-cloud-go/commit/8d2ab9f320a86c1c0fab90513fc05861561d0880)) ## [1.1.4](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.3...iam/v1.1.4) (2023-10-26) ### Bug Fixes * **iam:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7)) ## [1.1.3](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.2...iam/v1.1.3) (2023-10-12) ### Bug Fixes * **iam:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d)) ## [1.1.2](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.1...iam/v1.1.2) (2023-08-08) ### Documentation * **iam:** Minor formatting ([b4349cc](https://github.com/googleapis/google-cloud-go/commit/b4349cc507870ff8629bbc07de578b63bb889626)) ## [1.1.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.0...iam/v1.1.1) (2023-06-20) ### Bug Fixes * **iam:** REST query UpdateMask bug ([df52820](https://github.com/googleapis/google-cloud-go/commit/df52820b0e7721954809a8aa8700b93c5662dc9b)) ## [1.1.0](https://github.com/googleapis/google-cloud-go/compare/iam/v1.0.1...iam/v1.1.0) (2023-05-30) ### Features * **iam:** Update all direct dependencies ([b340d03](https://github.com/googleapis/google-cloud-go/commit/b340d030f2b52a4ce48846ce63984b28583abde6)) ## [1.0.1](https://github.com/googleapis/google-cloud-go/compare/iam/v1.0.0...iam/v1.0.1) (2023-05-08) ### Bug Fixes * **iam:** Update grpc to v1.55.0 ([1147ce0](https://github.com/googleapis/google-cloud-go/commit/1147ce02a990276ca4f8ab7a1ab65c14da4450ef)) ## [1.0.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.13.0...iam/v1.0.0) (2023-04-04) ### Features * **iam:** Promote to GA ([#7627](https://github.com/googleapis/google-cloud-go/issues/7627)) ([b351906](https://github.com/googleapis/google-cloud-go/commit/b351906a10e17a02d7f7e2551bc1585fd9dc3742)) ## [0.13.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.12.0...iam/v0.13.0) (2023-03-15) ### Features * **iam:** Update iam and longrunning deps ([91a1f78](https://github.com/googleapis/google-cloud-go/commit/91a1f784a109da70f63b96414bba8a9b4254cddd)) ## [0.12.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.11.0...iam/v0.12.0) (2023-02-17) ### Features * **iam:** Migrate to new stubs ([a61ddcd](https://github.com/googleapis/google-cloud-go/commit/a61ddcd3041c7af4a15109dc4431f9b327c497fb)) ## [0.11.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.10.0...iam/v0.11.0) (2023-02-16) ### Features * **iam:** Start generating proto stubs ([970d763](https://github.com/googleapis/google-cloud-go/commit/970d763531b54b2bc75d7ff26a20b6e05150cab8)) ## [0.10.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.9.0...iam/v0.10.0) (2023-01-04) ### Features * **iam:** Add REST client ([06a54a1](https://github.com/googleapis/google-cloud-go/commit/06a54a16a5866cce966547c51e203b9e09a25bc0)) ## [0.9.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.8.0...iam/v0.9.0) (2022-12-15) ### Features * **iam:** Rewrite iam sigs and update proto import ([#7137](https://github.com/googleapis/google-cloud-go/issues/7137)) ([ad67fa3](https://github.com/googleapis/google-cloud-go/commit/ad67fa36c263c161226f7fecbab5221592374dca)) ## [0.8.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.7.0...iam/v0.8.0) (2022-12-05) ### Features * **iam:** Start generating and refresh some libraries ([#7089](https://github.com/googleapis/google-cloud-go/issues/7089)) ([a9045ff](https://github.com/googleapis/google-cloud-go/commit/a9045ff191a711089c37f1d94a63522d9939ce38)) ## [0.7.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.6.0...iam/v0.7.0) (2022-11-03) ### Features * **iam:** rewrite signatures in terms of new location ([3c4b2b3](https://github.com/googleapis/google-cloud-go/commit/3c4b2b34565795537aac1661e6af2442437e34ad)) ## [0.6.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.5.0...iam/v0.6.0) (2022-10-25) ### Features * **iam:** start generating stubs dir ([de2d180](https://github.com/googleapis/google-cloud-go/commit/de2d18066dc613b72f6f8db93ca60146dabcfdcc)) ## [0.5.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.4.0...iam/v0.5.0) (2022-09-28) ### Features * **iam:** remove ListApplicablePolicies ([52dddd1](https://github.com/googleapis/google-cloud-go/commit/52dddd1ed89fbe77e1859311c3b993a77a82bfc7)) ## [0.4.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.3.0...iam/v0.4.0) (2022-09-06) ### Features * **iam:** start generating apiv2 ([#6605](https://github.com/googleapis/google-cloud-go/issues/6605)) ([a6004e7](https://github.com/googleapis/google-cloud-go/commit/a6004e762f782869cd85688937475744f7b17e50)) ## [0.3.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.2.0...iam/v0.3.0) (2022-02-23) ### Features * **iam:** set versionClient to module version ([55f0d92](https://github.com/googleapis/google-cloud-go/commit/55f0d92bf112f14b024b4ab0076c9875a17423c9)) ## [0.2.0](https://github.com/googleapis/google-cloud-go/compare/iam/v0.1.1...iam/v0.2.0) (2022-02-14) ### Features * **iam:** add file for tracking version ([17b36ea](https://github.com/googleapis/google-cloud-go/commit/17b36ead42a96b1a01105122074e65164357519e)) ### [0.1.1](https://www.github.com/googleapis/google-cloud-go/compare/iam/v0.1.0...iam/v0.1.1) (2022-01-14) ### Bug Fixes * **iam:** run formatter ([#5277](https://www.github.com/googleapis/google-cloud-go/issues/5277)) ([8682e4e](https://www.github.com/googleapis/google-cloud-go/commit/8682e4ed57a4428a659fbc225f56c91767e2a4a9)) ## v0.1.0 This is the first tag to carve out iam as its own module. See [Add a module to a multi-module repository](https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository). ================================================ FILE: vendor/cloud.google.com/go/iam/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/cloud.google.com/go/iam/README.md ================================================ # IAM API [![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/iam.svg)](https://pkg.go.dev/cloud.google.com/go/iam) Go Client Library for IAM API. ## Install ```bash go get cloud.google.com/go/iam ``` ## Stability The stability of this module is indicated by SemVer. However, a `v1+` module may have breaking changes in two scenarios: * Packages with `alpha` or `beta` in the import path * The GoDoc has an explicit stability disclaimer (for example, for an experimental feature). ## Go Version Support See the [Go Versions Supported](https://github.com/googleapis/google-cloud-go#go-versions-supported) section in the root directory's README. ## Authorization See the [Authorization](https://github.com/googleapis/google-cloud-go#authorization) section in the root directory's README. ## Contributing Contributions are welcome. Please, see the [CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md) document for details. Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms. See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/main/CONTRIBUTING.md#contributor-code-of-conduct) for more information. ================================================ FILE: vendor/cloud.google.com/go/iam/apiv1/iampb/iam_policy.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/iam/v1/iam_policy.proto package iampb import ( context "context" reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Request message for `SetIamPolicy` method. type SetIamPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // REQUIRED: The resource for which the policy is being specified. // See the operation documentation for the appropriate value for this field. Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` // REQUIRED: The complete policy to be applied to the `resource`. The size of // the policy is limited to a few 10s of KB. An empty policy is a // valid policy but certain Cloud Platform services (such as Projects) // might reject them. Policy *Policy `protobuf:"bytes,2,opt,name=policy,proto3" json:"policy,omitempty"` // OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only // the fields in the mask will be modified. If no mask is provided, the // following default mask is used: // // `paths: "bindings, etag"` UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` } func (x *SetIamPolicyRequest) Reset() { *x = SetIamPolicyRequest{} mi := &file_google_iam_v1_iam_policy_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *SetIamPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*SetIamPolicyRequest) ProtoMessage() {} func (x *SetIamPolicyRequest) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_iam_policy_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SetIamPolicyRequest.ProtoReflect.Descriptor instead. func (*SetIamPolicyRequest) Descriptor() ([]byte, []int) { return file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{0} } func (x *SetIamPolicyRequest) GetResource() string { if x != nil { return x.Resource } return "" } func (x *SetIamPolicyRequest) GetPolicy() *Policy { if x != nil { return x.Policy } return nil } func (x *SetIamPolicyRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } // Request message for `GetIamPolicy` method. type GetIamPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // REQUIRED: The resource for which the policy is being requested. // See the operation documentation for the appropriate value for this field. Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` // OPTIONAL: A `GetPolicyOptions` object for specifying options to // `GetIamPolicy`. Options *GetPolicyOptions `protobuf:"bytes,2,opt,name=options,proto3" json:"options,omitempty"` } func (x *GetIamPolicyRequest) Reset() { *x = GetIamPolicyRequest{} mi := &file_google_iam_v1_iam_policy_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetIamPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetIamPolicyRequest) ProtoMessage() {} func (x *GetIamPolicyRequest) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_iam_policy_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetIamPolicyRequest.ProtoReflect.Descriptor instead. func (*GetIamPolicyRequest) Descriptor() ([]byte, []int) { return file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{1} } func (x *GetIamPolicyRequest) GetResource() string { if x != nil { return x.Resource } return "" } func (x *GetIamPolicyRequest) GetOptions() *GetPolicyOptions { if x != nil { return x.Options } return nil } // Request message for `TestIamPermissions` method. type TestIamPermissionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // REQUIRED: The resource for which the policy detail is being requested. // See the operation documentation for the appropriate value for this field. Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` // The set of permissions to check for the `resource`. Permissions with // wildcards (such as '*' or 'storage.*') are not allowed. For more // information see // [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions). Permissions []string `protobuf:"bytes,2,rep,name=permissions,proto3" json:"permissions,omitempty"` } func (x *TestIamPermissionsRequest) Reset() { *x = TestIamPermissionsRequest{} mi := &file_google_iam_v1_iam_policy_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TestIamPermissionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*TestIamPermissionsRequest) ProtoMessage() {} func (x *TestIamPermissionsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_iam_policy_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TestIamPermissionsRequest.ProtoReflect.Descriptor instead. func (*TestIamPermissionsRequest) Descriptor() ([]byte, []int) { return file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{2} } func (x *TestIamPermissionsRequest) GetResource() string { if x != nil { return x.Resource } return "" } func (x *TestIamPermissionsRequest) GetPermissions() []string { if x != nil { return x.Permissions } return nil } // Response message for `TestIamPermissions` method. type TestIamPermissionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A subset of `TestPermissionsRequest.permissions` that the caller is // allowed. Permissions []string `protobuf:"bytes,1,rep,name=permissions,proto3" json:"permissions,omitempty"` } func (x *TestIamPermissionsResponse) Reset() { *x = TestIamPermissionsResponse{} mi := &file_google_iam_v1_iam_policy_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TestIamPermissionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*TestIamPermissionsResponse) ProtoMessage() {} func (x *TestIamPermissionsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_iam_policy_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TestIamPermissionsResponse.ProtoReflect.Descriptor instead. func (*TestIamPermissionsResponse) Descriptor() ([]byte, []int) { return file_google_iam_v1_iam_policy_proto_rawDescGZIP(), []int{3} } func (x *TestIamPermissionsResponse) GetPermissions() []string { if x != nil { return x.Permissions } return nil } var File_google_iam_v1_iam_policy_proto protoreflect.FileDescriptor var file_google_iam_v1_iam_policy_proto_rawDesc = []byte{ 0x0a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a, 0x01, 0x2a, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x77, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a, 0x01, 0x2a, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x69, 0x0a, 0x19, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x03, 0x0a, 0x01, 0x2a, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3e, 0x0a, 0x1a, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0xb4, 0x03, 0x0a, 0x09, 0x49, 0x41, 0x4d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x74, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x74, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x3a, 0x67, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x9a, 0x01, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1e, 0xca, 0x41, 0x1b, 0x69, 0x61, 0x6d, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x2d, 0x61, 0x70, 0x69, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x7c, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x62, 0x3b, 0x69, 0x61, 0x6d, 0x70, 0x62, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_iam_v1_iam_policy_proto_rawDescOnce sync.Once file_google_iam_v1_iam_policy_proto_rawDescData = file_google_iam_v1_iam_policy_proto_rawDesc ) func file_google_iam_v1_iam_policy_proto_rawDescGZIP() []byte { file_google_iam_v1_iam_policy_proto_rawDescOnce.Do(func() { file_google_iam_v1_iam_policy_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_iam_policy_proto_rawDescData) }) return file_google_iam_v1_iam_policy_proto_rawDescData } var file_google_iam_v1_iam_policy_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_google_iam_v1_iam_policy_proto_goTypes = []any{ (*SetIamPolicyRequest)(nil), // 0: google.iam.v1.SetIamPolicyRequest (*GetIamPolicyRequest)(nil), // 1: google.iam.v1.GetIamPolicyRequest (*TestIamPermissionsRequest)(nil), // 2: google.iam.v1.TestIamPermissionsRequest (*TestIamPermissionsResponse)(nil), // 3: google.iam.v1.TestIamPermissionsResponse (*Policy)(nil), // 4: google.iam.v1.Policy (*fieldmaskpb.FieldMask)(nil), // 5: google.protobuf.FieldMask (*GetPolicyOptions)(nil), // 6: google.iam.v1.GetPolicyOptions } var file_google_iam_v1_iam_policy_proto_depIdxs = []int32{ 4, // 0: google.iam.v1.SetIamPolicyRequest.policy:type_name -> google.iam.v1.Policy 5, // 1: google.iam.v1.SetIamPolicyRequest.update_mask:type_name -> google.protobuf.FieldMask 6, // 2: google.iam.v1.GetIamPolicyRequest.options:type_name -> google.iam.v1.GetPolicyOptions 0, // 3: google.iam.v1.IAMPolicy.SetIamPolicy:input_type -> google.iam.v1.SetIamPolicyRequest 1, // 4: google.iam.v1.IAMPolicy.GetIamPolicy:input_type -> google.iam.v1.GetIamPolicyRequest 2, // 5: google.iam.v1.IAMPolicy.TestIamPermissions:input_type -> google.iam.v1.TestIamPermissionsRequest 4, // 6: google.iam.v1.IAMPolicy.SetIamPolicy:output_type -> google.iam.v1.Policy 4, // 7: google.iam.v1.IAMPolicy.GetIamPolicy:output_type -> google.iam.v1.Policy 3, // 8: google.iam.v1.IAMPolicy.TestIamPermissions:output_type -> google.iam.v1.TestIamPermissionsResponse 6, // [6:9] is the sub-list for method output_type 3, // [3:6] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name } func init() { file_google_iam_v1_iam_policy_proto_init() } func file_google_iam_v1_iam_policy_proto_init() { if File_google_iam_v1_iam_policy_proto != nil { return } file_google_iam_v1_options_proto_init() file_google_iam_v1_policy_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_iam_v1_iam_policy_proto_rawDesc, NumEnums: 0, NumMessages: 4, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_iam_v1_iam_policy_proto_goTypes, DependencyIndexes: file_google_iam_v1_iam_policy_proto_depIdxs, MessageInfos: file_google_iam_v1_iam_policy_proto_msgTypes, }.Build() File_google_iam_v1_iam_policy_proto = out.File file_google_iam_v1_iam_policy_proto_rawDesc = nil file_google_iam_v1_iam_policy_proto_goTypes = nil file_google_iam_v1_iam_policy_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // IAMPolicyClient is the client API for IAMPolicy service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type IAMPolicyClient interface { // Sets the access control policy on the specified resource. Replaces any // existing policy. // // Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors. SetIamPolicy(ctx context.Context, in *SetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) // Gets the access control policy for a resource. // Returns an empty policy if the resource exists and does not have a policy // set. GetIamPolicy(ctx context.Context, in *GetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) // Returns permissions that a caller has on the specified resource. // If the resource does not exist, this will return an empty set of // permissions, not a `NOT_FOUND` error. // // Note: This operation is designed to be used for building permission-aware // UIs and command-line tools, not for authorization checking. This operation // may "fail open" without warning. TestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error) } type iAMPolicyClient struct { cc grpc.ClientConnInterface } func NewIAMPolicyClient(cc grpc.ClientConnInterface) IAMPolicyClient { return &iAMPolicyClient{cc} } func (c *iAMPolicyClient) SetIamPolicy(ctx context.Context, in *SetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) { out := new(Policy) err := c.cc.Invoke(ctx, "/google.iam.v1.IAMPolicy/SetIamPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *iAMPolicyClient) GetIamPolicy(ctx context.Context, in *GetIamPolicyRequest, opts ...grpc.CallOption) (*Policy, error) { out := new(Policy) err := c.cc.Invoke(ctx, "/google.iam.v1.IAMPolicy/GetIamPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *iAMPolicyClient) TestIamPermissions(ctx context.Context, in *TestIamPermissionsRequest, opts ...grpc.CallOption) (*TestIamPermissionsResponse, error) { out := new(TestIamPermissionsResponse) err := c.cc.Invoke(ctx, "/google.iam.v1.IAMPolicy/TestIamPermissions", in, out, opts...) if err != nil { return nil, err } return out, nil } // IAMPolicyServer is the server API for IAMPolicy service. type IAMPolicyServer interface { // Sets the access control policy on the specified resource. Replaces any // existing policy. // // Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors. SetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error) // Gets the access control policy for a resource. // Returns an empty policy if the resource exists and does not have a policy // set. GetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error) // Returns permissions that a caller has on the specified resource. // If the resource does not exist, this will return an empty set of // permissions, not a `NOT_FOUND` error. // // Note: This operation is designed to be used for building permission-aware // UIs and command-line tools, not for authorization checking. This operation // may "fail open" without warning. TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error) } // UnimplementedIAMPolicyServer can be embedded to have forward compatible implementations. type UnimplementedIAMPolicyServer struct { } func (*UnimplementedIAMPolicyServer) SetIamPolicy(context.Context, *SetIamPolicyRequest) (*Policy, error) { return nil, status.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented") } func (*UnimplementedIAMPolicyServer) GetIamPolicy(context.Context, *GetIamPolicyRequest) (*Policy, error) { return nil, status.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented") } func (*UnimplementedIAMPolicyServer) TestIamPermissions(context.Context, *TestIamPermissionsRequest) (*TestIamPermissionsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented") } func RegisterIAMPolicyServer(s *grpc.Server, srv IAMPolicyServer) { s.RegisterService(&_IAMPolicy_serviceDesc, srv) } func _IAMPolicy_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SetIamPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(IAMPolicyServer).SetIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.iam.v1.IAMPolicy/SetIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMPolicyServer).SetIamPolicy(ctx, req.(*SetIamPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _IAMPolicy_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetIamPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(IAMPolicyServer).GetIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.iam.v1.IAMPolicy/GetIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMPolicyServer).GetIamPolicy(ctx, req.(*GetIamPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _IAMPolicy_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(TestIamPermissionsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(IAMPolicyServer).TestIamPermissions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.iam.v1.IAMPolicy/TestIamPermissions", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMPolicyServer).TestIamPermissions(ctx, req.(*TestIamPermissionsRequest)) } return interceptor(ctx, in, info, handler) } var _IAMPolicy_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.iam.v1.IAMPolicy", HandlerType: (*IAMPolicyServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "SetIamPolicy", Handler: _IAMPolicy_SetIamPolicy_Handler, }, { MethodName: "GetIamPolicy", Handler: _IAMPolicy_GetIamPolicy_Handler, }, { MethodName: "TestIamPermissions", Handler: _IAMPolicy_TestIamPermissions_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/iam/v1/iam_policy.proto", } ================================================ FILE: vendor/cloud.google.com/go/iam/apiv1/iampb/options.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/iam/v1/options.proto package iampb import ( reflect "reflect" sync "sync" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Encapsulates settings provided to GetIamPolicy. type GetPolicyOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Optional. The maximum policy version that will be used to format the // policy. // // Valid values are 0, 1, and 3. Requests specifying an invalid value will be // rejected. // // Requests for policies with any conditional role bindings must specify // version 3. Policies with no conditional role bindings may specify any valid // value or leave the field unset. // // The policy in the response might use the policy version that you specified, // or it might use a lower policy version. For example, if you specify version // 3, but the policy has no conditional role bindings, the response uses // version 1. // // To learn which resources support conditions in their IAM policies, see the // [IAM // documentation](https://cloud.google.com/iam/help/conditions/resource-policies). RequestedPolicyVersion int32 `protobuf:"varint,1,opt,name=requested_policy_version,json=requestedPolicyVersion,proto3" json:"requested_policy_version,omitempty"` } func (x *GetPolicyOptions) Reset() { *x = GetPolicyOptions{} mi := &file_google_iam_v1_options_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetPolicyOptions) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetPolicyOptions) ProtoMessage() {} func (x *GetPolicyOptions) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_options_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetPolicyOptions.ProtoReflect.Descriptor instead. func (*GetPolicyOptions) Descriptor() ([]byte, []int) { return file_google_iam_v1_options_proto_rawDescGZIP(), []int{0} } func (x *GetPolicyOptions) GetRequestedPolicyVersion() int32 { if x != nil { return x.RequestedPolicyVersion } return 0 } var File_google_iam_v1_options_proto protoreflect.FileDescriptor var file_google_iam_v1_options_proto_rawDesc = []byte{ 0x0a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x22, 0x4c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x7d, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x62, 0x3b, 0x69, 0x61, 0x6d, 0x70, 0x62, 0xf8, 0x01, 0x01, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_iam_v1_options_proto_rawDescOnce sync.Once file_google_iam_v1_options_proto_rawDescData = file_google_iam_v1_options_proto_rawDesc ) func file_google_iam_v1_options_proto_rawDescGZIP() []byte { file_google_iam_v1_options_proto_rawDescOnce.Do(func() { file_google_iam_v1_options_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_options_proto_rawDescData) }) return file_google_iam_v1_options_proto_rawDescData } var file_google_iam_v1_options_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_google_iam_v1_options_proto_goTypes = []any{ (*GetPolicyOptions)(nil), // 0: google.iam.v1.GetPolicyOptions } var file_google_iam_v1_options_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_google_iam_v1_options_proto_init() } func file_google_iam_v1_options_proto_init() { if File_google_iam_v1_options_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_iam_v1_options_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_iam_v1_options_proto_goTypes, DependencyIndexes: file_google_iam_v1_options_proto_depIdxs, MessageInfos: file_google_iam_v1_options_proto_msgTypes, }.Build() File_google_iam_v1_options_proto = out.File file_google_iam_v1_options_proto_rawDesc = nil file_google_iam_v1_options_proto_goTypes = nil file_google_iam_v1_options_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/iam/apiv1/iampb/policy.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/iam/v1/policy.proto package iampb import ( reflect "reflect" sync "sync" expr "google.golang.org/genproto/googleapis/type/expr" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The list of valid permission types for which logging can be configured. // Admin writes are always logged, and are not configurable. type AuditLogConfig_LogType int32 const ( // Default case. Should never be this. AuditLogConfig_LOG_TYPE_UNSPECIFIED AuditLogConfig_LogType = 0 // Admin reads. Example: CloudIAM getIamPolicy AuditLogConfig_ADMIN_READ AuditLogConfig_LogType = 1 // Data writes. Example: CloudSQL Users create AuditLogConfig_DATA_WRITE AuditLogConfig_LogType = 2 // Data reads. Example: CloudSQL Users list AuditLogConfig_DATA_READ AuditLogConfig_LogType = 3 ) // Enum value maps for AuditLogConfig_LogType. var ( AuditLogConfig_LogType_name = map[int32]string{ 0: "LOG_TYPE_UNSPECIFIED", 1: "ADMIN_READ", 2: "DATA_WRITE", 3: "DATA_READ", } AuditLogConfig_LogType_value = map[string]int32{ "LOG_TYPE_UNSPECIFIED": 0, "ADMIN_READ": 1, "DATA_WRITE": 2, "DATA_READ": 3, } ) func (x AuditLogConfig_LogType) Enum() *AuditLogConfig_LogType { p := new(AuditLogConfig_LogType) *p = x return p } func (x AuditLogConfig_LogType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AuditLogConfig_LogType) Descriptor() protoreflect.EnumDescriptor { return file_google_iam_v1_policy_proto_enumTypes[0].Descriptor() } func (AuditLogConfig_LogType) Type() protoreflect.EnumType { return &file_google_iam_v1_policy_proto_enumTypes[0] } func (x AuditLogConfig_LogType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AuditLogConfig_LogType.Descriptor instead. func (AuditLogConfig_LogType) EnumDescriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{3, 0} } // The type of action performed on a Binding in a policy. type BindingDelta_Action int32 const ( // Unspecified. BindingDelta_ACTION_UNSPECIFIED BindingDelta_Action = 0 // Addition of a Binding. BindingDelta_ADD BindingDelta_Action = 1 // Removal of a Binding. BindingDelta_REMOVE BindingDelta_Action = 2 ) // Enum value maps for BindingDelta_Action. var ( BindingDelta_Action_name = map[int32]string{ 0: "ACTION_UNSPECIFIED", 1: "ADD", 2: "REMOVE", } BindingDelta_Action_value = map[string]int32{ "ACTION_UNSPECIFIED": 0, "ADD": 1, "REMOVE": 2, } ) func (x BindingDelta_Action) Enum() *BindingDelta_Action { p := new(BindingDelta_Action) *p = x return p } func (x BindingDelta_Action) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (BindingDelta_Action) Descriptor() protoreflect.EnumDescriptor { return file_google_iam_v1_policy_proto_enumTypes[1].Descriptor() } func (BindingDelta_Action) Type() protoreflect.EnumType { return &file_google_iam_v1_policy_proto_enumTypes[1] } func (x BindingDelta_Action) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use BindingDelta_Action.Descriptor instead. func (BindingDelta_Action) EnumDescriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{5, 0} } // The type of action performed on an audit configuration in a policy. type AuditConfigDelta_Action int32 const ( // Unspecified. AuditConfigDelta_ACTION_UNSPECIFIED AuditConfigDelta_Action = 0 // Addition of an audit configuration. AuditConfigDelta_ADD AuditConfigDelta_Action = 1 // Removal of an audit configuration. AuditConfigDelta_REMOVE AuditConfigDelta_Action = 2 ) // Enum value maps for AuditConfigDelta_Action. var ( AuditConfigDelta_Action_name = map[int32]string{ 0: "ACTION_UNSPECIFIED", 1: "ADD", 2: "REMOVE", } AuditConfigDelta_Action_value = map[string]int32{ "ACTION_UNSPECIFIED": 0, "ADD": 1, "REMOVE": 2, } ) func (x AuditConfigDelta_Action) Enum() *AuditConfigDelta_Action { p := new(AuditConfigDelta_Action) *p = x return p } func (x AuditConfigDelta_Action) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AuditConfigDelta_Action) Descriptor() protoreflect.EnumDescriptor { return file_google_iam_v1_policy_proto_enumTypes[2].Descriptor() } func (AuditConfigDelta_Action) Type() protoreflect.EnumType { return &file_google_iam_v1_policy_proto_enumTypes[2] } func (x AuditConfigDelta_Action) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AuditConfigDelta_Action.Descriptor instead. func (AuditConfigDelta_Action) EnumDescriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{6, 0} } // An Identity and Access Management (IAM) policy, which specifies access // controls for Google Cloud resources. // // A `Policy` is a collection of `bindings`. A `binding` binds one or more // `members`, or principals, to a single `role`. Principals can be user // accounts, service accounts, Google groups, and domains (such as G Suite). A // `role` is a named list of permissions; each `role` can be an IAM predefined // role or a user-created custom role. // // For some types of Google Cloud resources, a `binding` can also specify a // `condition`, which is a logical expression that allows access to a resource // only if the expression evaluates to `true`. A condition can add constraints // based on attributes of the request, the resource, or both. To learn which // resources support conditions in their IAM policies, see the // [IAM // documentation](https://cloud.google.com/iam/help/conditions/resource-policies). // // **JSON example:** // // ``` // // { // "bindings": [ // { // "role": "roles/resourcemanager.organizationAdmin", // "members": [ // "user:mike@example.com", // "group:admins@example.com", // "domain:google.com", // "serviceAccount:my-project-id@appspot.gserviceaccount.com" // ] // }, // { // "role": "roles/resourcemanager.organizationViewer", // "members": [ // "user:eve@example.com" // ], // "condition": { // "title": "expirable access", // "description": "Does not grant access after Sep 2020", // "expression": "request.time < // timestamp('2020-10-01T00:00:00.000Z')", // } // } // ], // "etag": "BwWWja0YfJA=", // "version": 3 // } // // ``` // // **YAML example:** // // ``` // // bindings: // - members: // - user:mike@example.com // - group:admins@example.com // - domain:google.com // - serviceAccount:my-project-id@appspot.gserviceaccount.com // role: roles/resourcemanager.organizationAdmin // - members: // - user:eve@example.com // role: roles/resourcemanager.organizationViewer // condition: // title: expirable access // description: Does not grant access after Sep 2020 // expression: request.time < timestamp('2020-10-01T00:00:00.000Z') // etag: BwWWja0YfJA= // version: 3 // // ``` // // For a description of IAM and its features, see the // [IAM documentation](https://cloud.google.com/iam/docs/). type Policy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Specifies the format of the policy. // // Valid values are `0`, `1`, and `3`. Requests that specify an invalid value // are rejected. // // Any operation that affects conditional role bindings must specify version // `3`. This requirement applies to the following operations: // // - Getting a policy that includes a conditional role binding // - Adding a conditional role binding to a policy // - Changing a conditional role binding in a policy // - Removing any role binding, with or without a condition, from a policy // that includes conditions // // **Important:** If you use IAM Conditions, you must include the `etag` field // whenever you call `setIamPolicy`. If you omit this field, then IAM allows // you to overwrite a version `3` policy with a version `1` policy, and all of // the conditions in the version `3` policy are lost. // // If a policy does not include any conditions, operations on that policy may // specify any valid version or leave the field unset. // // To learn which resources support conditions in their IAM policies, see the // [IAM // documentation](https://cloud.google.com/iam/help/conditions/resource-policies). Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` // Associates a list of `members`, or principals, with a `role`. Optionally, // may specify a `condition` that determines how and when the `bindings` are // applied. Each of the `bindings` must contain at least one principal. // // The `bindings` in a `Policy` can refer to up to 1,500 principals; up to 250 // of these principals can be Google groups. Each occurrence of a principal // counts towards these limits. For example, if the `bindings` grant 50 // different roles to `user:alice@example.com`, and not to any other // principal, then you can add another 1,450 principals to the `bindings` in // the `Policy`. Bindings []*Binding `protobuf:"bytes,4,rep,name=bindings,proto3" json:"bindings,omitempty"` // Specifies cloud audit logging configuration for this policy. AuditConfigs []*AuditConfig `protobuf:"bytes,6,rep,name=audit_configs,json=auditConfigs,proto3" json:"audit_configs,omitempty"` // `etag` is used for optimistic concurrency control as a way to help // prevent simultaneous updates of a policy from overwriting each other. // It is strongly suggested that systems make use of the `etag` in the // read-modify-write cycle to perform policy updates in order to avoid race // conditions: An `etag` is returned in the response to `getIamPolicy`, and // systems are expected to put that etag in the request to `setIamPolicy` to // ensure that their change will be applied to the same version of the policy. // // **Important:** If you use IAM Conditions, you must include the `etag` field // whenever you call `setIamPolicy`. If you omit this field, then IAM allows // you to overwrite a version `3` policy with a version `1` policy, and all of // the conditions in the version `3` policy are lost. Etag []byte `protobuf:"bytes,3,opt,name=etag,proto3" json:"etag,omitempty"` } func (x *Policy) Reset() { *x = Policy{} mi := &file_google_iam_v1_policy_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Policy) String() string { return protoimpl.X.MessageStringOf(x) } func (*Policy) ProtoMessage() {} func (x *Policy) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_policy_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Policy.ProtoReflect.Descriptor instead. func (*Policy) Descriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{0} } func (x *Policy) GetVersion() int32 { if x != nil { return x.Version } return 0 } func (x *Policy) GetBindings() []*Binding { if x != nil { return x.Bindings } return nil } func (x *Policy) GetAuditConfigs() []*AuditConfig { if x != nil { return x.AuditConfigs } return nil } func (x *Policy) GetEtag() []byte { if x != nil { return x.Etag } return nil } // Associates `members`, or principals, with a `role`. type Binding struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Role that is assigned to the list of `members`, or principals. // For example, `roles/viewer`, `roles/editor`, or `roles/owner`. Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` // Specifies the principals requesting access for a Google Cloud resource. // `members` can have the following values: // // - `allUsers`: A special identifier that represents anyone who is // on the internet; with or without a Google account. // // - `allAuthenticatedUsers`: A special identifier that represents anyone // who is authenticated with a Google account or a service account. // // - `user:{emailid}`: An email address that represents a specific Google // account. For example, `alice@example.com` . // // - `serviceAccount:{emailid}`: An email address that represents a service // account. For example, `my-other-app@appspot.gserviceaccount.com`. // // - `group:{emailid}`: An email address that represents a Google group. // For example, `admins@example.com`. // // - `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique // identifier) representing a user that has been recently deleted. For // example, `alice@example.com?uid=123456789012345678901`. If the user is // recovered, this value reverts to `user:{emailid}` and the recovered user // retains the role in the binding. // // - `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus // unique identifier) representing a service account that has been recently // deleted. For example, // `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`. // If the service account is undeleted, this value reverts to // `serviceAccount:{emailid}` and the undeleted service account retains the // role in the binding. // // - `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique // identifier) representing a Google group that has been recently // deleted. For example, `admins@example.com?uid=123456789012345678901`. If // the group is recovered, this value reverts to `group:{emailid}` and the // recovered group retains the role in the binding. // // - `domain:{domain}`: The G Suite domain (primary) that represents all the // users of that domain. For example, `google.com` or `example.com`. Members []string `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"` // The condition that is associated with this binding. // // If the condition evaluates to `true`, then this binding applies to the // current request. // // If the condition evaluates to `false`, then this binding does not apply to // the current request. However, a different role binding might grant the same // role to one or more of the principals in this binding. // // To learn which resources support conditions in their IAM policies, see the // [IAM // documentation](https://cloud.google.com/iam/help/conditions/resource-policies). Condition *expr.Expr `protobuf:"bytes,3,opt,name=condition,proto3" json:"condition,omitempty"` } func (x *Binding) Reset() { *x = Binding{} mi := &file_google_iam_v1_policy_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Binding) String() string { return protoimpl.X.MessageStringOf(x) } func (*Binding) ProtoMessage() {} func (x *Binding) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_policy_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Binding.ProtoReflect.Descriptor instead. func (*Binding) Descriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{1} } func (x *Binding) GetRole() string { if x != nil { return x.Role } return "" } func (x *Binding) GetMembers() []string { if x != nil { return x.Members } return nil } func (x *Binding) GetCondition() *expr.Expr { if x != nil { return x.Condition } return nil } // Specifies the audit configuration for a service. // The configuration determines which permission types are logged, and what // identities, if any, are exempted from logging. // An AuditConfig must have one or more AuditLogConfigs. // // If there are AuditConfigs for both `allServices` and a specific service, // the union of the two AuditConfigs is used for that service: the log_types // specified in each AuditConfig are enabled, and the exempted_members in each // AuditLogConfig are exempted. // // Example Policy with multiple AuditConfigs: // // { // "audit_configs": [ // { // "service": "allServices", // "audit_log_configs": [ // { // "log_type": "DATA_READ", // "exempted_members": [ // "user:jose@example.com" // ] // }, // { // "log_type": "DATA_WRITE" // }, // { // "log_type": "ADMIN_READ" // } // ] // }, // { // "service": "sampleservice.googleapis.com", // "audit_log_configs": [ // { // "log_type": "DATA_READ" // }, // { // "log_type": "DATA_WRITE", // "exempted_members": [ // "user:aliya@example.com" // ] // } // ] // } // ] // } // // For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ // logging. It also exempts `jose@example.com` from DATA_READ logging, and // `aliya@example.com` from DATA_WRITE logging. type AuditConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Specifies a service that will be enabled for audit logging. // For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. // `allServices` is a special value that covers all services. Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` // The configuration for logging of each type of permission. AuditLogConfigs []*AuditLogConfig `protobuf:"bytes,3,rep,name=audit_log_configs,json=auditLogConfigs,proto3" json:"audit_log_configs,omitempty"` } func (x *AuditConfig) Reset() { *x = AuditConfig{} mi := &file_google_iam_v1_policy_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AuditConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*AuditConfig) ProtoMessage() {} func (x *AuditConfig) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_policy_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AuditConfig.ProtoReflect.Descriptor instead. func (*AuditConfig) Descriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{2} } func (x *AuditConfig) GetService() string { if x != nil { return x.Service } return "" } func (x *AuditConfig) GetAuditLogConfigs() []*AuditLogConfig { if x != nil { return x.AuditLogConfigs } return nil } // Provides the configuration for logging a type of permissions. // Example: // // { // "audit_log_configs": [ // { // "log_type": "DATA_READ", // "exempted_members": [ // "user:jose@example.com" // ] // }, // { // "log_type": "DATA_WRITE" // } // ] // } // // This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting // jose@example.com from DATA_READ logging. type AuditLogConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The log type that this config enables. LogType AuditLogConfig_LogType `protobuf:"varint,1,opt,name=log_type,json=logType,proto3,enum=google.iam.v1.AuditLogConfig_LogType" json:"log_type,omitempty"` // Specifies the identities that do not cause logging for this type of // permission. // Follows the same format of // [Binding.members][google.iam.v1.Binding.members]. ExemptedMembers []string `protobuf:"bytes,2,rep,name=exempted_members,json=exemptedMembers,proto3" json:"exempted_members,omitempty"` } func (x *AuditLogConfig) Reset() { *x = AuditLogConfig{} mi := &file_google_iam_v1_policy_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AuditLogConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*AuditLogConfig) ProtoMessage() {} func (x *AuditLogConfig) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_policy_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AuditLogConfig.ProtoReflect.Descriptor instead. func (*AuditLogConfig) Descriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{3} } func (x *AuditLogConfig) GetLogType() AuditLogConfig_LogType { if x != nil { return x.LogType } return AuditLogConfig_LOG_TYPE_UNSPECIFIED } func (x *AuditLogConfig) GetExemptedMembers() []string { if x != nil { return x.ExemptedMembers } return nil } // The difference delta between two policies. type PolicyDelta struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The delta for Bindings between two policies. BindingDeltas []*BindingDelta `protobuf:"bytes,1,rep,name=binding_deltas,json=bindingDeltas,proto3" json:"binding_deltas,omitempty"` // The delta for AuditConfigs between two policies. AuditConfigDeltas []*AuditConfigDelta `protobuf:"bytes,2,rep,name=audit_config_deltas,json=auditConfigDeltas,proto3" json:"audit_config_deltas,omitempty"` } func (x *PolicyDelta) Reset() { *x = PolicyDelta{} mi := &file_google_iam_v1_policy_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *PolicyDelta) String() string { return protoimpl.X.MessageStringOf(x) } func (*PolicyDelta) ProtoMessage() {} func (x *PolicyDelta) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_policy_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use PolicyDelta.ProtoReflect.Descriptor instead. func (*PolicyDelta) Descriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{4} } func (x *PolicyDelta) GetBindingDeltas() []*BindingDelta { if x != nil { return x.BindingDeltas } return nil } func (x *PolicyDelta) GetAuditConfigDeltas() []*AuditConfigDelta { if x != nil { return x.AuditConfigDeltas } return nil } // One delta entry for Binding. Each individual change (only one member in each // entry) to a binding will be a separate entry. type BindingDelta struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The action that was performed on a Binding. // Required Action BindingDelta_Action `protobuf:"varint,1,opt,name=action,proto3,enum=google.iam.v1.BindingDelta_Action" json:"action,omitempty"` // Role that is assigned to `members`. // For example, `roles/viewer`, `roles/editor`, or `roles/owner`. // Required Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` // A single identity requesting access for a Google Cloud resource. // Follows the same format of Binding.members. // Required Member string `protobuf:"bytes,3,opt,name=member,proto3" json:"member,omitempty"` // The condition that is associated with this binding. Condition *expr.Expr `protobuf:"bytes,4,opt,name=condition,proto3" json:"condition,omitempty"` } func (x *BindingDelta) Reset() { *x = BindingDelta{} mi := &file_google_iam_v1_policy_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BindingDelta) String() string { return protoimpl.X.MessageStringOf(x) } func (*BindingDelta) ProtoMessage() {} func (x *BindingDelta) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_policy_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BindingDelta.ProtoReflect.Descriptor instead. func (*BindingDelta) Descriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{5} } func (x *BindingDelta) GetAction() BindingDelta_Action { if x != nil { return x.Action } return BindingDelta_ACTION_UNSPECIFIED } func (x *BindingDelta) GetRole() string { if x != nil { return x.Role } return "" } func (x *BindingDelta) GetMember() string { if x != nil { return x.Member } return "" } func (x *BindingDelta) GetCondition() *expr.Expr { if x != nil { return x.Condition } return nil } // One delta entry for AuditConfig. Each individual change (only one // exempted_member in each entry) to a AuditConfig will be a separate entry. type AuditConfigDelta struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The action that was performed on an audit configuration in a policy. // Required Action AuditConfigDelta_Action `protobuf:"varint,1,opt,name=action,proto3,enum=google.iam.v1.AuditConfigDelta_Action" json:"action,omitempty"` // Specifies a service that was configured for Cloud Audit Logging. // For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. // `allServices` is a special value that covers all services. // Required Service string `protobuf:"bytes,2,opt,name=service,proto3" json:"service,omitempty"` // A single identity that is exempted from "data access" audit // logging for the `service` specified above. // Follows the same format of Binding.members. ExemptedMember string `protobuf:"bytes,3,opt,name=exempted_member,json=exemptedMember,proto3" json:"exempted_member,omitempty"` // Specifies the log_type that was be enabled. ADMIN_ACTIVITY is always // enabled, and cannot be configured. // Required LogType string `protobuf:"bytes,4,opt,name=log_type,json=logType,proto3" json:"log_type,omitempty"` } func (x *AuditConfigDelta) Reset() { *x = AuditConfigDelta{} mi := &file_google_iam_v1_policy_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AuditConfigDelta) String() string { return protoimpl.X.MessageStringOf(x) } func (*AuditConfigDelta) ProtoMessage() {} func (x *AuditConfigDelta) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_policy_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AuditConfigDelta.ProtoReflect.Descriptor instead. func (*AuditConfigDelta) Descriptor() ([]byte, []int) { return file_google_iam_v1_policy_proto_rawDescGZIP(), []int{6} } func (x *AuditConfigDelta) GetAction() AuditConfigDelta_Action { if x != nil { return x.Action } return AuditConfigDelta_ACTION_UNSPECIFIED } func (x *AuditConfigDelta) GetService() string { if x != nil { return x.Service } return "" } func (x *AuditConfigDelta) GetExemptedMember() string { if x != nil { return x.ExemptedMember } return "" } func (x *AuditConfigDelta) GetLogType() string { if x != nil { return x.LogType } return "" } var File_google_iam_v1_policy_proto protoreflect.FileDescriptor var file_google_iam_v1_policy_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x61, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0x68, 0x0a, 0x07, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x0b, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x11, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0xd1, 0x01, 0x0a, 0x0e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x52, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x10, 0x03, 0x22, 0xa2, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x42, 0x0a, 0x0e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x0d, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x11, 0x61, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x0c, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x22, 0xe7, 0x01, 0x0a, 0x10, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0x35, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x42, 0x7c, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x62, 0x3b, 0x69, 0x61, 0x6d, 0x70, 0x62, 0xf8, 0x01, 0x01, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_iam_v1_policy_proto_rawDescOnce sync.Once file_google_iam_v1_policy_proto_rawDescData = file_google_iam_v1_policy_proto_rawDesc ) func file_google_iam_v1_policy_proto_rawDescGZIP() []byte { file_google_iam_v1_policy_proto_rawDescOnce.Do(func() { file_google_iam_v1_policy_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_policy_proto_rawDescData) }) return file_google_iam_v1_policy_proto_rawDescData } var file_google_iam_v1_policy_proto_enumTypes = make([]protoimpl.EnumInfo, 3) var file_google_iam_v1_policy_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_google_iam_v1_policy_proto_goTypes = []any{ (AuditLogConfig_LogType)(0), // 0: google.iam.v1.AuditLogConfig.LogType (BindingDelta_Action)(0), // 1: google.iam.v1.BindingDelta.Action (AuditConfigDelta_Action)(0), // 2: google.iam.v1.AuditConfigDelta.Action (*Policy)(nil), // 3: google.iam.v1.Policy (*Binding)(nil), // 4: google.iam.v1.Binding (*AuditConfig)(nil), // 5: google.iam.v1.AuditConfig (*AuditLogConfig)(nil), // 6: google.iam.v1.AuditLogConfig (*PolicyDelta)(nil), // 7: google.iam.v1.PolicyDelta (*BindingDelta)(nil), // 8: google.iam.v1.BindingDelta (*AuditConfigDelta)(nil), // 9: google.iam.v1.AuditConfigDelta (*expr.Expr)(nil), // 10: google.type.Expr } var file_google_iam_v1_policy_proto_depIdxs = []int32{ 4, // 0: google.iam.v1.Policy.bindings:type_name -> google.iam.v1.Binding 5, // 1: google.iam.v1.Policy.audit_configs:type_name -> google.iam.v1.AuditConfig 10, // 2: google.iam.v1.Binding.condition:type_name -> google.type.Expr 6, // 3: google.iam.v1.AuditConfig.audit_log_configs:type_name -> google.iam.v1.AuditLogConfig 0, // 4: google.iam.v1.AuditLogConfig.log_type:type_name -> google.iam.v1.AuditLogConfig.LogType 8, // 5: google.iam.v1.PolicyDelta.binding_deltas:type_name -> google.iam.v1.BindingDelta 9, // 6: google.iam.v1.PolicyDelta.audit_config_deltas:type_name -> google.iam.v1.AuditConfigDelta 1, // 7: google.iam.v1.BindingDelta.action:type_name -> google.iam.v1.BindingDelta.Action 10, // 8: google.iam.v1.BindingDelta.condition:type_name -> google.type.Expr 2, // 9: google.iam.v1.AuditConfigDelta.action:type_name -> google.iam.v1.AuditConfigDelta.Action 10, // [10:10] is the sub-list for method output_type 10, // [10:10] is the sub-list for method input_type 10, // [10:10] is the sub-list for extension type_name 10, // [10:10] is the sub-list for extension extendee 0, // [0:10] is the sub-list for field type_name } func init() { file_google_iam_v1_policy_proto_init() } func file_google_iam_v1_policy_proto_init() { if File_google_iam_v1_policy_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_iam_v1_policy_proto_rawDesc, NumEnums: 3, NumMessages: 7, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_iam_v1_policy_proto_goTypes, DependencyIndexes: file_google_iam_v1_policy_proto_depIdxs, EnumInfos: file_google_iam_v1_policy_proto_enumTypes, MessageInfos: file_google_iam_v1_policy_proto_msgTypes, }.Build() File_google_iam_v1_policy_proto = out.File file_google_iam_v1_policy_proto_rawDesc = nil file_google_iam_v1_policy_proto_goTypes = nil file_google_iam_v1_policy_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/iam/apiv1/iampb/resource_policy_member.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/iam/v1/resource_policy_member.proto package iampb import ( reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Output-only policy member strings of a Google Cloud resource's built-in // identity. type ResourcePolicyMember struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // IAM policy binding member referring to a Google Cloud resource by // user-assigned name (https://google.aip.dev/122). If a resource is deleted // and recreated with the same name, the binding will be applicable to the new // resource. // // Example: // `principal://parametermanager.googleapis.com/projects/12345/name/locations/us-central1-a/parameters/my-parameter` IamPolicyNamePrincipal string `protobuf:"bytes,1,opt,name=iam_policy_name_principal,json=iamPolicyNamePrincipal,proto3" json:"iam_policy_name_principal,omitempty"` // IAM policy binding member referring to a Google Cloud resource by // system-assigned unique identifier (https://google.aip.dev/148#uid). If a // resource is deleted and recreated with the same name, the binding will not // be applicable to the new resource // // Example: // `principal://parametermanager.googleapis.com/projects/12345/uid/locations/us-central1-a/parameters/a918fed5` IamPolicyUidPrincipal string `protobuf:"bytes,2,opt,name=iam_policy_uid_principal,json=iamPolicyUidPrincipal,proto3" json:"iam_policy_uid_principal,omitempty"` } func (x *ResourcePolicyMember) Reset() { *x = ResourcePolicyMember{} mi := &file_google_iam_v1_resource_policy_member_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ResourcePolicyMember) String() string { return protoimpl.X.MessageStringOf(x) } func (*ResourcePolicyMember) ProtoMessage() {} func (x *ResourcePolicyMember) ProtoReflect() protoreflect.Message { mi := &file_google_iam_v1_resource_policy_member_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ResourcePolicyMember.ProtoReflect.Descriptor instead. func (*ResourcePolicyMember) Descriptor() ([]byte, []int) { return file_google_iam_v1_resource_policy_member_proto_rawDescGZIP(), []int{0} } func (x *ResourcePolicyMember) GetIamPolicyNamePrincipal() string { if x != nil { return x.IamPolicyNamePrincipal } return "" } func (x *ResourcePolicyMember) GetIamPolicyUidPrincipal() string { if x != nil { return x.IamPolicyUidPrincipal } return "" } var File_google_iam_v1_resource_policy_member_proto protoreflect.FileDescriptor var file_google_iam_v1_resource_policy_member_proto_rawDesc = []byte{ 0x0a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x94, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x19, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x16, 0x69, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x3c, 0x0a, 0x18, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x75, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x15, 0x69, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x55, 0x69, 0x64, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x42, 0x87, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x62, 0x3b, 0x69, 0x61, 0x6d, 0x70, 0x62, 0xaa, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x49, 0x61, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x49, 0x61, 0x6d, 0x5c, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_iam_v1_resource_policy_member_proto_rawDescOnce sync.Once file_google_iam_v1_resource_policy_member_proto_rawDescData = file_google_iam_v1_resource_policy_member_proto_rawDesc ) func file_google_iam_v1_resource_policy_member_proto_rawDescGZIP() []byte { file_google_iam_v1_resource_policy_member_proto_rawDescOnce.Do(func() { file_google_iam_v1_resource_policy_member_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_iam_v1_resource_policy_member_proto_rawDescData) }) return file_google_iam_v1_resource_policy_member_proto_rawDescData } var file_google_iam_v1_resource_policy_member_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_google_iam_v1_resource_policy_member_proto_goTypes = []any{ (*ResourcePolicyMember)(nil), // 0: google.iam.v1.ResourcePolicyMember } var file_google_iam_v1_resource_policy_member_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_google_iam_v1_resource_policy_member_proto_init() } func file_google_iam_v1_resource_policy_member_proto_init() { if File_google_iam_v1_resource_policy_member_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_iam_v1_resource_policy_member_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_iam_v1_resource_policy_member_proto_goTypes, DependencyIndexes: file_google_iam_v1_resource_policy_member_proto_depIdxs, MessageInfos: file_google_iam_v1_resource_policy_member_proto_msgTypes, }.Build() File_google_iam_v1_resource_policy_member_proto = out.File file_google_iam_v1_resource_policy_member_proto_rawDesc = nil file_google_iam_v1_resource_policy_member_proto_goTypes = nil file_google_iam_v1_resource_policy_member_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/iam/iam.go ================================================ // Copyright 2016 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package iam supports the resource-specific operations of Google Cloud // IAM (Identity and Access Management) for the Google Cloud Libraries. // See https://cloud.google.com/iam for more about IAM. // // Users of the Google Cloud Libraries will typically not use this package // directly. Instead they will begin with some resource that supports IAM, like // a pubsub topic, and call its IAM method to get a Handle for that resource. package iam import ( "context" "fmt" "time" pb "cloud.google.com/go/iam/apiv1/iampb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" ) // client abstracts the IAMPolicy API to allow multiple implementations. type client interface { Get(ctx context.Context, resource string) (*pb.Policy, error) Set(ctx context.Context, resource string, p *pb.Policy) error Test(ctx context.Context, resource string, perms []string) ([]string, error) GetWithVersion(ctx context.Context, resource string, requestedPolicyVersion int32) (*pb.Policy, error) } // grpcClient implements client for the standard gRPC-based IAMPolicy service. type grpcClient struct { c pb.IAMPolicyClient } var withRetry = gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 60 * time.Second, Multiplier: 1.3, }) }) func (g *grpcClient) Get(ctx context.Context, resource string) (*pb.Policy, error) { return g.GetWithVersion(ctx, resource, 1) } func (g *grpcClient) GetWithVersion(ctx context.Context, resource string, requestedPolicyVersion int32) (*pb.Policy, error) { var proto *pb.Policy md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "resource", resource)) ctx = insertMetadata(ctx, md) err := gax.Invoke(ctx, func(ctx context.Context, _ gax.CallSettings) error { var err error proto, err = g.c.GetIamPolicy(ctx, &pb.GetIamPolicyRequest{ Resource: resource, Options: &pb.GetPolicyOptions{ RequestedPolicyVersion: requestedPolicyVersion, }, }) return err }, withRetry) if err != nil { return nil, err } return proto, nil } func (g *grpcClient) Set(ctx context.Context, resource string, p *pb.Policy) error { md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "resource", resource)) ctx = insertMetadata(ctx, md) return gax.Invoke(ctx, func(ctx context.Context, _ gax.CallSettings) error { _, err := g.c.SetIamPolicy(ctx, &pb.SetIamPolicyRequest{ Resource: resource, Policy: p, }) return err }, withRetry) } func (g *grpcClient) Test(ctx context.Context, resource string, perms []string) ([]string, error) { var res *pb.TestIamPermissionsResponse md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "resource", resource)) ctx = insertMetadata(ctx, md) err := gax.Invoke(ctx, func(ctx context.Context, _ gax.CallSettings) error { var err error res, err = g.c.TestIamPermissions(ctx, &pb.TestIamPermissionsRequest{ Resource: resource, Permissions: perms, }) return err }, withRetry) if err != nil { return nil, err } return res.Permissions, nil } // A Handle provides IAM operations for a resource. type Handle struct { c client resource string } // A Handle3 provides IAM operations for a resource. It is similar to a Handle, but provides access to newer IAM features (e.g., conditions). type Handle3 struct { c client resource string version int32 } // InternalNewHandle is for use by the Google Cloud Libraries only. // // InternalNewHandle returns a Handle for resource. // The conn parameter refers to a server that must support the IAMPolicy service. func InternalNewHandle(conn grpc.ClientConnInterface, resource string) *Handle { return InternalNewHandleGRPCClient(pb.NewIAMPolicyClient(conn), resource) } // InternalNewHandleGRPCClient is for use by the Google Cloud Libraries only. // // InternalNewHandleClient returns a Handle for resource using the given // grpc service that implements IAM as a mixin func InternalNewHandleGRPCClient(c pb.IAMPolicyClient, resource string) *Handle { return InternalNewHandleClient(&grpcClient{c: c}, resource) } // InternalNewHandleClient is for use by the Google Cloud Libraries only. // // InternalNewHandleClient returns a Handle for resource using the given // client implementation. func InternalNewHandleClient(c client, resource string) *Handle { return &Handle{ c: c, resource: resource, } } // V3 returns a Handle3, which is like Handle except it sets // requestedPolicyVersion to 3 when retrieving a policy and policy.version to 3 // when storing a policy. func (h *Handle) V3() *Handle3 { return &Handle3{ c: h.c, resource: h.resource, version: 3, } } // Policy retrieves the IAM policy for the resource. func (h *Handle) Policy(ctx context.Context) (*Policy, error) { proto, err := h.c.Get(ctx, h.resource) if err != nil { return nil, err } return &Policy{InternalProto: proto}, nil } // SetPolicy replaces the resource's current policy with the supplied Policy. // // If policy was created from a prior call to Get, then the modification will // only succeed if the policy has not changed since the Get. func (h *Handle) SetPolicy(ctx context.Context, policy *Policy) error { return h.c.Set(ctx, h.resource, policy.InternalProto) } // TestPermissions returns the subset of permissions that the caller has on the resource. func (h *Handle) TestPermissions(ctx context.Context, permissions []string) ([]string, error) { return h.c.Test(ctx, h.resource, permissions) } // A RoleName is a name representing a collection of permissions. type RoleName string // Common role names. const ( Owner RoleName = "roles/owner" Editor RoleName = "roles/editor" Viewer RoleName = "roles/viewer" ) const ( // AllUsers is a special member that denotes all users, even unauthenticated ones. AllUsers = "allUsers" // AllAuthenticatedUsers is a special member that denotes all authenticated users. AllAuthenticatedUsers = "allAuthenticatedUsers" ) // A Policy is a list of Bindings representing roles // granted to members. // // The zero Policy is a valid policy with no bindings. type Policy struct { // TODO(jba): when type aliases are available, put Policy into an internal package // and provide an exported alias here. // This field is exported for use by the Google Cloud Libraries only. // It may become unexported in a future release. InternalProto *pb.Policy } // Members returns the list of members with the supplied role. // The return value should not be modified. Use Add and Remove // to modify the members of a role. func (p *Policy) Members(r RoleName) []string { b := p.binding(r) if b == nil { return nil } return b.Members } // HasRole reports whether member has role r. func (p *Policy) HasRole(member string, r RoleName) bool { return memberIndex(member, p.binding(r)) >= 0 } // Add adds member member to role r if it is not already present. // A new binding is created if there is no binding for the role. func (p *Policy) Add(member string, r RoleName) { b := p.binding(r) if b == nil { if p.InternalProto == nil { p.InternalProto = &pb.Policy{} } p.InternalProto.Bindings = append(p.InternalProto.Bindings, &pb.Binding{ Role: string(r), Members: []string{member}, }) return } if memberIndex(member, b) < 0 { b.Members = append(b.Members, member) return } } // Remove removes member from role r if it is present. func (p *Policy) Remove(member string, r RoleName) { bi := p.bindingIndex(r) if bi < 0 { return } bindings := p.InternalProto.Bindings b := bindings[bi] mi := memberIndex(member, b) if mi < 0 { return } // Order doesn't matter for bindings or members, so to remove, move the last item // into the removed spot and shrink the slice. if len(b.Members) == 1 { // Remove binding. last := len(bindings) - 1 bindings[bi] = bindings[last] bindings[last] = nil p.InternalProto.Bindings = bindings[:last] return } // Remove member. // TODO(jba): worry about multiple copies of m? last := len(b.Members) - 1 b.Members[mi] = b.Members[last] b.Members[last] = "" b.Members = b.Members[:last] } // Roles returns the names of all the roles that appear in the Policy. func (p *Policy) Roles() []RoleName { if p.InternalProto == nil { return nil } var rns []RoleName for _, b := range p.InternalProto.Bindings { rns = append(rns, RoleName(b.Role)) } return rns } // binding returns the Binding for the suppied role, or nil if there isn't one. func (p *Policy) binding(r RoleName) *pb.Binding { i := p.bindingIndex(r) if i < 0 { return nil } return p.InternalProto.Bindings[i] } func (p *Policy) bindingIndex(r RoleName) int { if p.InternalProto == nil { return -1 } for i, b := range p.InternalProto.Bindings { if b.Role == string(r) { return i } } return -1 } // memberIndex returns the index of m in b's Members, or -1 if not found. func memberIndex(m string, b *pb.Binding) int { if b == nil { return -1 } for i, mm := range b.Members { if mm == m { return i } } return -1 } // insertMetadata inserts metadata into the given context func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context { out, _ := metadata.FromOutgoingContext(ctx) out = out.Copy() for _, md := range mds { for k, v := range md { out[k] = append(out[k], v...) } } return metadata.NewOutgoingContext(ctx, out) } // A Policy3 is a list of Bindings representing roles granted to members. // // The zero Policy3 is a valid policy with no bindings. // // It is similar to a Policy, except a Policy3 provides direct access to the // list of Bindings. // // The policy version is always set to 3. type Policy3 struct { etag []byte Bindings []*pb.Binding } // Policy retrieves the IAM policy for the resource. // // requestedPolicyVersion is always set to 3. func (h *Handle3) Policy(ctx context.Context) (*Policy3, error) { proto, err := h.c.GetWithVersion(ctx, h.resource, h.version) if err != nil { return nil, err } return &Policy3{ Bindings: proto.Bindings, etag: proto.Etag, }, nil } // SetPolicy replaces the resource's current policy with the supplied Policy. // // If policy was created from a prior call to Get, then the modification will // only succeed if the policy has not changed since the Get. func (h *Handle3) SetPolicy(ctx context.Context, policy *Policy3) error { return h.c.Set(ctx, h.resource, &pb.Policy{ Bindings: policy.Bindings, Etag: policy.etag, Version: h.version, }) } // TestPermissions returns the subset of permissions that the caller has on the resource. func (h *Handle3) TestPermissions(ctx context.Context, permissions []string) ([]string, error) { return h.c.Test(ctx, h.resource, permissions) } ================================================ FILE: vendor/cloud.google.com/go/internal/.repo-metadata-full.json ================================================ { "cloud.google.com/go/accessapproval/apiv1": { "api_shortname": "accessapproval", "distribution_name": "cloud.google.com/go/accessapproval/apiv1", "description": "Access Approval API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/accessapproval/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/accesscontextmanager/apiv1": { "api_shortname": "accesscontextmanager", "distribution_name": "cloud.google.com/go/accesscontextmanager/apiv1", "description": "Access Context Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/accesscontextmanager/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/advisorynotifications/apiv1": { "api_shortname": "advisorynotifications", "distribution_name": "cloud.google.com/go/advisorynotifications/apiv1", "description": "Advisory Notifications API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/advisorynotifications/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/ai/generativelanguage/apiv1": { "api_shortname": "generativelanguage", "distribution_name": "cloud.google.com/go/ai/generativelanguage/apiv1", "description": "Generative Language API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/ai/latest/generativelanguage/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/ai/generativelanguage/apiv1alpha": { "api_shortname": "generativelanguage", "distribution_name": "cloud.google.com/go/ai/generativelanguage/apiv1alpha", "description": "Generative Language API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/ai/latest/generativelanguage/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/ai/generativelanguage/apiv1beta": { "api_shortname": "generativelanguage", "distribution_name": "cloud.google.com/go/ai/generativelanguage/apiv1beta", "description": "Generative Language API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/ai/latest/generativelanguage/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/ai/generativelanguage/apiv1beta2": { "api_shortname": "generativelanguage", "distribution_name": "cloud.google.com/go/ai/generativelanguage/apiv1beta2", "description": "Generative Language API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/ai/latest/generativelanguage/apiv1beta2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/aiplatform/apiv1": { "api_shortname": "aiplatform", "distribution_name": "cloud.google.com/go/aiplatform/apiv1", "description": "Vertex AI API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/aiplatform/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/aiplatform/apiv1beta1": { "api_shortname": "aiplatform", "distribution_name": "cloud.google.com/go/aiplatform/apiv1beta1", "description": "Vertex AI API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/aiplatform/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/alloydb/apiv1": { "api_shortname": "alloydb", "distribution_name": "cloud.google.com/go/alloydb/apiv1", "description": "AlloyDB API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/alloydb/apiv1alpha": { "api_shortname": "alloydb", "distribution_name": "cloud.google.com/go/alloydb/apiv1alpha", "description": "AlloyDB API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/alloydb/apiv1beta": { "api_shortname": "alloydb", "distribution_name": "cloud.google.com/go/alloydb/apiv1beta", "description": "AlloyDB API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/alloydb/connectors/apiv1": { "api_shortname": "connectors", "distribution_name": "cloud.google.com/go/alloydb/connectors/apiv1", "description": "AlloyDB connectors", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/connectors/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/alloydb/connectors/apiv1alpha": { "api_shortname": "connectors", "distribution_name": "cloud.google.com/go/alloydb/connectors/apiv1alpha", "description": "AlloyDB connectors", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/connectors/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/alloydb/connectors/apiv1beta": { "api_shortname": "connectors", "distribution_name": "cloud.google.com/go/alloydb/connectors/apiv1beta", "description": "AlloyDB connectors", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/connectors/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/analytics/admin/apiv1alpha": { "api_shortname": "analyticsadmin", "distribution_name": "cloud.google.com/go/analytics/admin/apiv1alpha", "description": "Google Analytics Admin API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/analytics/latest/admin/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apigateway/apiv1": { "api_shortname": "apigateway", "distribution_name": "cloud.google.com/go/apigateway/apiv1", "description": "API Gateway API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apigateway/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apigeeconnect/apiv1": { "api_shortname": "apigeeconnect", "distribution_name": "cloud.google.com/go/apigeeconnect/apiv1", "description": "Apigee Connect API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apigeeconnect/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apigeeregistry/apiv1": { "api_shortname": "apigeeregistry", "distribution_name": "cloud.google.com/go/apigeeregistry/apiv1", "description": "Apigee Registry API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apigeeregistry/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apihub/apiv1": { "api_shortname": "apihub", "distribution_name": "cloud.google.com/go/apihub/apiv1", "description": "API hub API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apihub/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apikeys/apiv2": { "api_shortname": "apikeys", "distribution_name": "cloud.google.com/go/apikeys/apiv2", "description": "API Keys API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apikeys/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/appengine/apiv1": { "api_shortname": "appengine", "distribution_name": "cloud.google.com/go/appengine/apiv1", "description": "App Engine Admin API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/appengine/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apphub/apiv1": { "api_shortname": "apphub", "distribution_name": "cloud.google.com/go/apphub/apiv1", "description": "App Hub API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apphub/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apps/events/subscriptions/apiv1": { "api_shortname": "workspaceevents", "distribution_name": "cloud.google.com/go/apps/events/subscriptions/apiv1", "description": "Google Workspace Events API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apps/latest/events/subscriptions/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apps/meet/apiv2": { "api_shortname": "meet", "distribution_name": "cloud.google.com/go/apps/meet/apiv2", "description": "Google Meet API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apps/latest/meet/apiv2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/apps/meet/apiv2beta": { "api_shortname": "meet", "distribution_name": "cloud.google.com/go/apps/meet/apiv2beta", "description": "Google Meet API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apps/latest/meet/apiv2beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/area120/tables/apiv1alpha1": { "api_shortname": "area120tables", "distribution_name": "cloud.google.com/go/area120/tables/apiv1alpha1", "description": "Area120 Tables API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/area120/latest/tables/apiv1alpha1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/artifactregistry/apiv1": { "api_shortname": "artifactregistry", "distribution_name": "cloud.google.com/go/artifactregistry/apiv1", "description": "Artifact Registry API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/artifactregistry/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/artifactregistry/apiv1beta2": { "api_shortname": "artifactregistry", "distribution_name": "cloud.google.com/go/artifactregistry/apiv1beta2", "description": "Artifact Registry API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/artifactregistry/latest/apiv1beta2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/asset/apiv1": { "api_shortname": "cloudasset", "distribution_name": "cloud.google.com/go/asset/apiv1", "description": "Cloud Asset API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/asset/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/asset/apiv1p2beta1": { "api_shortname": "cloudasset", "distribution_name": "cloud.google.com/go/asset/apiv1p2beta1", "description": "Cloud Asset API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/asset/latest/apiv1p2beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/asset/apiv1p5beta1": { "api_shortname": "cloudasset", "distribution_name": "cloud.google.com/go/asset/apiv1p5beta1", "description": "Cloud Asset API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/asset/latest/apiv1p5beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/assuredworkloads/apiv1": { "api_shortname": "assuredworkloads", "distribution_name": "cloud.google.com/go/assuredworkloads/apiv1", "description": "Assured Workloads API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/assuredworkloads/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/assuredworkloads/apiv1beta1": { "api_shortname": "assuredworkloads", "distribution_name": "cloud.google.com/go/assuredworkloads/apiv1beta1", "description": "Assured Workloads API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/assuredworkloads/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/automl/apiv1": { "api_shortname": "automl", "distribution_name": "cloud.google.com/go/automl/apiv1", "description": "Cloud AutoML API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/automl/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/automl/apiv1beta1": { "api_shortname": "automl", "distribution_name": "cloud.google.com/go/automl/apiv1beta1", "description": "Cloud AutoML API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/automl/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/backupdr/apiv1": { "api_shortname": "backupdr", "distribution_name": "cloud.google.com/go/backupdr/apiv1", "description": "Backup and DR Service API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/backupdr/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/baremetalsolution/apiv2": { "api_shortname": "baremetalsolution", "distribution_name": "cloud.google.com/go/baremetalsolution/apiv2", "description": "Bare Metal Solution API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/baremetalsolution/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/batch/apiv1": { "api_shortname": "batch", "distribution_name": "cloud.google.com/go/batch/apiv1", "description": "Batch API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/batch/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/beyondcorp/appconnections/apiv1": { "api_shortname": "beyondcorp", "distribution_name": "cloud.google.com/go/beyondcorp/appconnections/apiv1", "description": "BeyondCorp API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/appconnections/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/beyondcorp/appconnectors/apiv1": { "api_shortname": "beyondcorp", "distribution_name": "cloud.google.com/go/beyondcorp/appconnectors/apiv1", "description": "BeyondCorp API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/appconnectors/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/beyondcorp/appgateways/apiv1": { "api_shortname": "beyondcorp", "distribution_name": "cloud.google.com/go/beyondcorp/appgateways/apiv1", "description": "BeyondCorp API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/appgateways/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/beyondcorp/clientconnectorservices/apiv1": { "api_shortname": "beyondcorp", "distribution_name": "cloud.google.com/go/beyondcorp/clientconnectorservices/apiv1", "description": "BeyondCorp API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/clientconnectorservices/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/beyondcorp/clientgateways/apiv1": { "api_shortname": "beyondcorp", "distribution_name": "cloud.google.com/go/beyondcorp/clientgateways/apiv1", "description": "BeyondCorp API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/beyondcorp/latest/clientgateways/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery": { "api_shortname": "bigquery", "distribution_name": "cloud.google.com/go/bigquery", "description": "BigQuery", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/bigquery/analyticshub/apiv1": { "api_shortname": "analyticshub", "distribution_name": "cloud.google.com/go/bigquery/analyticshub/apiv1", "description": "Analytics Hub API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/analyticshub/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/biglake/apiv1": { "api_shortname": "biglake", "distribution_name": "cloud.google.com/go/bigquery/biglake/apiv1", "description": "BigLake API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/biglake/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/biglake/apiv1alpha1": { "api_shortname": "biglake", "distribution_name": "cloud.google.com/go/bigquery/biglake/apiv1alpha1", "description": "BigLake API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/biglake/apiv1alpha1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/connection/apiv1": { "api_shortname": "bigqueryconnection", "distribution_name": "cloud.google.com/go/bigquery/connection/apiv1", "description": "BigQuery Connection API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/connection/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/connection/apiv1beta1": { "api_shortname": "bigqueryconnection", "distribution_name": "cloud.google.com/go/bigquery/connection/apiv1beta1", "description": "BigQuery Connection API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/connection/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/dataexchange/apiv1beta1": { "api_shortname": "analyticshub", "distribution_name": "cloud.google.com/go/bigquery/dataexchange/apiv1beta1", "description": "Analytics Hub API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/dataexchange/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/datapolicies/apiv1": { "api_shortname": "bigquerydatapolicy", "distribution_name": "cloud.google.com/go/bigquery/datapolicies/apiv1", "description": "BigQuery Data Policy API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/datapolicies/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/datapolicies/apiv1beta1": { "api_shortname": "bigquerydatapolicy", "distribution_name": "cloud.google.com/go/bigquery/datapolicies/apiv1beta1", "description": "BigQuery Data Policy API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/datapolicies/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/datatransfer/apiv1": { "api_shortname": "bigquerydatatransfer", "distribution_name": "cloud.google.com/go/bigquery/datatransfer/apiv1", "description": "BigQuery Data Transfer API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/datatransfer/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/migration/apiv2": { "api_shortname": "bigquerymigration", "distribution_name": "cloud.google.com/go/bigquery/migration/apiv2", "description": "BigQuery Migration API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/migration/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/migration/apiv2alpha": { "api_shortname": "bigquerymigration", "distribution_name": "cloud.google.com/go/bigquery/migration/apiv2alpha", "description": "BigQuery Migration API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/migration/apiv2alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/reservation/apiv1": { "api_shortname": "bigqueryreservation", "distribution_name": "cloud.google.com/go/bigquery/reservation/apiv1", "description": "BigQuery Reservation API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/reservation/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/storage/apiv1": { "api_shortname": "bigquerystorage", "distribution_name": "cloud.google.com/go/bigquery/storage/apiv1", "description": "BigQuery Storage API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/storage/apiv1alpha": { "api_shortname": "bigquerystorage", "distribution_name": "cloud.google.com/go/bigquery/storage/apiv1alpha", "description": "BigQuery Storage API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/storage/apiv1beta": { "api_shortname": "bigquerystorage", "distribution_name": "cloud.google.com/go/bigquery/storage/apiv1beta", "description": "BigQuery Storage API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/storage/apiv1beta1": { "api_shortname": "bigquerystorage", "distribution_name": "cloud.google.com/go/bigquery/storage/apiv1beta1", "description": "BigQuery Storage API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigquery/storage/apiv1beta2": { "api_shortname": "bigquerystorage", "distribution_name": "cloud.google.com/go/bigquery/storage/apiv1beta2", "description": "BigQuery Storage API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/storage/apiv1beta2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigtable": { "api_shortname": "bigtable", "distribution_name": "cloud.google.com/go/bigtable", "description": "Cloud BigTable", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigtable/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/bigtable/admin/apiv2": { "api_shortname": "bigtableadmin", "distribution_name": "cloud.google.com/go/bigtable/admin/apiv2", "description": "Cloud Bigtable Admin API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigtable/latest/admin/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/bigtable/apiv2": { "api_shortname": "bigtable", "distribution_name": "cloud.google.com/go/bigtable/apiv2", "description": "Cloud Bigtable API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigtable/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/billing/apiv1": { "api_shortname": "cloudbilling", "distribution_name": "cloud.google.com/go/billing/apiv1", "description": "Cloud Billing API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/billing/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/billing/budgets/apiv1": { "api_shortname": "billingbudgets", "distribution_name": "cloud.google.com/go/billing/budgets/apiv1", "description": "Cloud Billing Budget API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/billing/latest/budgets/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/billing/budgets/apiv1beta1": { "api_shortname": "billingbudgets", "distribution_name": "cloud.google.com/go/billing/budgets/apiv1beta1", "description": "Cloud Billing Budget API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/billing/latest/budgets/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/binaryauthorization/apiv1": { "api_shortname": "binaryauthorization", "distribution_name": "cloud.google.com/go/binaryauthorization/apiv1", "description": "Binary Authorization API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/binaryauthorization/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/binaryauthorization/apiv1beta1": { "api_shortname": "binaryauthorization", "distribution_name": "cloud.google.com/go/binaryauthorization/apiv1beta1", "description": "Binary Authorization API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/binaryauthorization/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/certificatemanager/apiv1": { "api_shortname": "certificatemanager", "distribution_name": "cloud.google.com/go/certificatemanager/apiv1", "description": "Certificate Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/certificatemanager/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/channel/apiv1": { "api_shortname": "cloudchannel", "distribution_name": "cloud.google.com/go/channel/apiv1", "description": "Cloud Channel API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/channel/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/chat/apiv1": { "api_shortname": "chat", "distribution_name": "cloud.google.com/go/chat/apiv1", "description": "Google Chat API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/chat/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/chronicle/apiv1": { "api_shortname": "chronicle", "distribution_name": "cloud.google.com/go/chronicle/apiv1", "description": "Chronicle API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/chronicle/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudbuild/apiv1/v2": { "api_shortname": "cloudbuild", "distribution_name": "cloud.google.com/go/cloudbuild/apiv1/v2", "description": "Cloud Build API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudbuild/latest/apiv1/v2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudbuild/apiv2": { "api_shortname": "cloudbuild", "distribution_name": "cloud.google.com/go/cloudbuild/apiv2", "description": "Cloud Build API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudbuild/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudcontrolspartner/apiv1": { "api_shortname": "cloudcontrolspartner", "distribution_name": "cloud.google.com/go/cloudcontrolspartner/apiv1", "description": "Cloud Controls Partner API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudcontrolspartner/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudcontrolspartner/apiv1beta": { "api_shortname": "cloudcontrolspartner", "distribution_name": "cloud.google.com/go/cloudcontrolspartner/apiv1beta", "description": "Cloud Controls Partner API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudcontrolspartner/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/clouddms/apiv1": { "api_shortname": "datamigration", "distribution_name": "cloud.google.com/go/clouddms/apiv1", "description": "Database Migration API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/clouddms/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudprofiler/apiv2": { "api_shortname": "cloudprofiler", "distribution_name": "cloud.google.com/go/cloudprofiler/apiv2", "description": "Cloud Profiler API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudprofiler/latest/apiv2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudquotas/apiv1": { "api_shortname": "cloudquotas", "distribution_name": "cloud.google.com/go/cloudquotas/apiv1", "description": "Cloud Quotas API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudquotas/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudquotas/apiv1beta": { "api_shortname": "cloudquotas", "distribution_name": "cloud.google.com/go/cloudquotas/apiv1beta", "description": "Cloud Quotas API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudquotas/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudtasks/apiv2": { "api_shortname": "cloudtasks", "distribution_name": "cloud.google.com/go/cloudtasks/apiv2", "description": "Cloud Tasks API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudtasks/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudtasks/apiv2beta2": { "api_shortname": "cloudtasks", "distribution_name": "cloud.google.com/go/cloudtasks/apiv2beta2", "description": "Cloud Tasks API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudtasks/latest/apiv2beta2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/cloudtasks/apiv2beta3": { "api_shortname": "cloudtasks", "distribution_name": "cloud.google.com/go/cloudtasks/apiv2beta3", "description": "Cloud Tasks API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/cloudtasks/latest/apiv2beta3", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/commerce/consumer/procurement/apiv1": { "api_shortname": "cloudcommerceconsumerprocurement", "distribution_name": "cloud.google.com/go/commerce/consumer/procurement/apiv1", "description": "Cloud Commerce Consumer Procurement API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/commerce/latest/consumer/procurement/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/compute/apiv1": { "api_shortname": "compute", "distribution_name": "cloud.google.com/go/compute/apiv1", "description": "Google Compute Engine API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/compute/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/compute/metadata": { "api_shortname": "compute-metadata", "distribution_name": "cloud.google.com/go/compute/metadata", "description": "Service Metadata API", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/compute/latest/metadata", "release_level": "stable", "library_type": "CORE" }, "cloud.google.com/go/confidentialcomputing/apiv1": { "api_shortname": "confidentialcomputing", "distribution_name": "cloud.google.com/go/confidentialcomputing/apiv1", "description": "Confidential Computing API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/confidentialcomputing/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/confidentialcomputing/apiv1alpha1": { "api_shortname": "confidentialcomputing", "distribution_name": "cloud.google.com/go/confidentialcomputing/apiv1alpha1", "description": "Confidential Computing API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/confidentialcomputing/latest/apiv1alpha1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/config/apiv1": { "api_shortname": "config", "distribution_name": "cloud.google.com/go/config/apiv1", "description": "Infrastructure Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/config/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/contactcenterinsights/apiv1": { "api_shortname": "contactcenterinsights", "distribution_name": "cloud.google.com/go/contactcenterinsights/apiv1", "description": "Contact Center AI Insights API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/contactcenterinsights/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/container/apiv1": { "api_shortname": "container", "distribution_name": "cloud.google.com/go/container/apiv1", "description": "Kubernetes Engine API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/container/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/containeranalysis/apiv1beta1": { "api_shortname": "containeranalysis", "distribution_name": "cloud.google.com/go/containeranalysis/apiv1beta1", "description": "Container Analysis API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/containeranalysis/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datacatalog/apiv1": { "api_shortname": "datacatalog", "distribution_name": "cloud.google.com/go/datacatalog/apiv1", "description": "Google Cloud Data Catalog API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datacatalog/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datacatalog/apiv1beta1": { "api_shortname": "datacatalog", "distribution_name": "cloud.google.com/go/datacatalog/apiv1beta1", "description": "Google Cloud Data Catalog API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datacatalog/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datacatalog/lineage/apiv1": { "api_shortname": "datalineage", "distribution_name": "cloud.google.com/go/datacatalog/lineage/apiv1", "description": "Data Lineage API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datacatalog/latest/lineage/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dataflow/apiv1beta3": { "api_shortname": "dataflow", "distribution_name": "cloud.google.com/go/dataflow/apiv1beta3", "description": "Dataflow API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataflow/latest/apiv1beta3", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dataform/apiv1beta1": { "api_shortname": "dataform", "distribution_name": "cloud.google.com/go/dataform/apiv1beta1", "description": "Dataform API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataform/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datafusion/apiv1": { "api_shortname": "datafusion", "distribution_name": "cloud.google.com/go/datafusion/apiv1", "description": "Cloud Data Fusion API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datafusion/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datalabeling/apiv1beta1": { "api_shortname": "datalabeling", "distribution_name": "cloud.google.com/go/datalabeling/apiv1beta1", "description": "Data Labeling API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datalabeling/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dataplex/apiv1": { "api_shortname": "dataplex", "distribution_name": "cloud.google.com/go/dataplex/apiv1", "description": "Cloud Dataplex API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataplex/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dataproc/v2/apiv1": { "api_shortname": "dataproc", "distribution_name": "cloud.google.com/go/dataproc/v2/apiv1", "description": "Cloud Dataproc API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataproc/v2/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dataqna/apiv1alpha": { "api_shortname": "dataqna", "distribution_name": "cloud.google.com/go/dataqna/apiv1alpha", "description": "Data QnA API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dataqna/latest/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datastore": { "api_shortname": "datastore", "distribution_name": "cloud.google.com/go/datastore", "description": "Cloud Datastore", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastore/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/datastore/admin/apiv1": { "api_shortname": "datastore", "distribution_name": "cloud.google.com/go/datastore/admin/apiv1", "description": "Cloud Datastore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastore/latest/admin/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datastore/apiv1": { "api_shortname": "datastore", "distribution_name": "cloud.google.com/go/datastore/apiv1", "description": "Cloud Datastore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastore/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datastream/apiv1": { "api_shortname": "datastream", "distribution_name": "cloud.google.com/go/datastream/apiv1", "description": "Datastream API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastream/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/datastream/apiv1alpha1": { "api_shortname": "datastream", "distribution_name": "cloud.google.com/go/datastream/apiv1alpha1", "description": "Datastream API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/datastream/latest/apiv1alpha1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/deploy/apiv1": { "api_shortname": "clouddeploy", "distribution_name": "cloud.google.com/go/deploy/apiv1", "description": "Cloud Deploy API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/deploy/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/developerconnect/apiv1": { "api_shortname": "developerconnect", "distribution_name": "cloud.google.com/go/developerconnect/apiv1", "description": "Developer Connect API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/developerconnect/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/devicestreaming/apiv1": { "api_shortname": "devicestreaming", "distribution_name": "cloud.google.com/go/devicestreaming/apiv1", "description": "Device Streaming API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/devicestreaming/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dialogflow/apiv2": { "api_shortname": "dialogflow", "distribution_name": "cloud.google.com/go/dialogflow/apiv2", "description": "Dialogflow API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dialogflow/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dialogflow/apiv2beta1": { "api_shortname": "dialogflow", "distribution_name": "cloud.google.com/go/dialogflow/apiv2beta1", "description": "Dialogflow API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dialogflow/latest/apiv2beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dialogflow/cx/apiv3": { "api_shortname": "dialogflow", "distribution_name": "cloud.google.com/go/dialogflow/cx/apiv3", "description": "Dialogflow API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dialogflow/latest/cx/apiv3", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dialogflow/cx/apiv3beta1": { "api_shortname": "dialogflow", "distribution_name": "cloud.google.com/go/dialogflow/cx/apiv3beta1", "description": "Dialogflow API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dialogflow/latest/cx/apiv3beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/discoveryengine/apiv1": { "api_shortname": "discoveryengine", "distribution_name": "cloud.google.com/go/discoveryengine/apiv1", "description": "Discovery Engine API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/discoveryengine/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/discoveryengine/apiv1alpha": { "api_shortname": "discoveryengine", "distribution_name": "cloud.google.com/go/discoveryengine/apiv1alpha", "description": "Discovery Engine API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/discoveryengine/latest/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/discoveryengine/apiv1beta": { "api_shortname": "discoveryengine", "distribution_name": "cloud.google.com/go/discoveryengine/apiv1beta", "description": "Discovery Engine API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/discoveryengine/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/dlp/apiv2": { "api_shortname": "dlp", "distribution_name": "cloud.google.com/go/dlp/apiv2", "description": "Sensitive Data Protection (DLP)", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/dlp/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/documentai/apiv1": { "api_shortname": "documentai", "distribution_name": "cloud.google.com/go/documentai/apiv1", "description": "Cloud Document AI API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/documentai/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/documentai/apiv1beta3": { "api_shortname": "documentai", "distribution_name": "cloud.google.com/go/documentai/apiv1beta3", "description": "Cloud Document AI API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/documentai/latest/apiv1beta3", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/domains/apiv1beta1": { "api_shortname": "domains", "distribution_name": "cloud.google.com/go/domains/apiv1beta1", "description": "Cloud Domains API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/domains/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/edgecontainer/apiv1": { "api_shortname": "edgecontainer", "distribution_name": "cloud.google.com/go/edgecontainer/apiv1", "description": "Distributed Cloud Edge Container API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/edgecontainer/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/edgenetwork/apiv1": { "api_shortname": "edgenetwork", "distribution_name": "cloud.google.com/go/edgenetwork/apiv1", "description": "Distributed Cloud Edge Network API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/edgenetwork/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/errorreporting": { "api_shortname": "clouderrorreporting", "distribution_name": "cloud.google.com/go/errorreporting", "description": "Cloud Error Reporting API", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/errorreporting/latest", "release_level": "preview", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/errorreporting/apiv1beta1": { "api_shortname": "clouderrorreporting", "distribution_name": "cloud.google.com/go/errorreporting/apiv1beta1", "description": "Error Reporting API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/latest/errorreporting/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/essentialcontacts/apiv1": { "api_shortname": "essentialcontacts", "distribution_name": "cloud.google.com/go/essentialcontacts/apiv1", "description": "Essential Contacts API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/essentialcontacts/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/eventarc/apiv1": { "api_shortname": "eventarc", "distribution_name": "cloud.google.com/go/eventarc/apiv1", "description": "Eventarc API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/eventarc/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/eventarc/publishing/apiv1": { "api_shortname": "eventarcpublishing", "distribution_name": "cloud.google.com/go/eventarc/publishing/apiv1", "description": "Eventarc Publishing API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/eventarc/latest/publishing/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/filestore/apiv1": { "api_shortname": "file", "distribution_name": "cloud.google.com/go/filestore/apiv1", "description": "Cloud Filestore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/filestore/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/financialservices/apiv1": { "api_shortname": "financialservices", "distribution_name": "cloud.google.com/go/financialservices/apiv1", "description": "Financial Services API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/financialservices/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/firestore": { "api_shortname": "firestore", "distribution_name": "cloud.google.com/go/firestore", "description": "Cloud Firestore API", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/firestore/apiv1": { "api_shortname": "firestore", "distribution_name": "cloud.google.com/go/firestore/apiv1", "description": "Cloud Firestore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/firestore/apiv1/admin": { "api_shortname": "firestore", "distribution_name": "cloud.google.com/go/firestore/apiv1/admin", "description": "Cloud Firestore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/firestore/latest/apiv1/admin", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/functions/apiv1": { "api_shortname": "cloudfunctions", "distribution_name": "cloud.google.com/go/functions/apiv1", "description": "Cloud Functions API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/functions/apiv2": { "api_shortname": "cloudfunctions", "distribution_name": "cloud.google.com/go/functions/apiv2", "description": "Cloud Functions API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/functions/apiv2beta": { "api_shortname": "cloudfunctions", "distribution_name": "cloud.google.com/go/functions/apiv2beta", "description": "Cloud Functions API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/apiv2beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/functions/metadata": { "api_shortname": "firestore-metadata", "distribution_name": "cloud.google.com/go/functions/metadata", "description": "Cloud Functions", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/functions/latest/metadata", "release_level": "preview", "library_type": "CORE" }, "cloud.google.com/go/gkebackup/apiv1": { "api_shortname": "gkebackup", "distribution_name": "cloud.google.com/go/gkebackup/apiv1", "description": "Backup for GKE API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkebackup/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/gkeconnect/gateway/apiv1": { "api_shortname": "connectgateway", "distribution_name": "cloud.google.com/go/gkeconnect/gateway/apiv1", "description": "Connect Gateway API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkeconnect/latest/gateway/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/gkeconnect/gateway/apiv1beta1": { "api_shortname": "connectgateway", "distribution_name": "cloud.google.com/go/gkeconnect/gateway/apiv1beta1", "description": "Connect Gateway API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkeconnect/latest/gateway/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/gkehub/apiv1beta1": { "api_shortname": "gkehub", "distribution_name": "cloud.google.com/go/gkehub/apiv1beta1", "description": "GKE Hub API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkehub/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/gkemulticloud/apiv1": { "api_shortname": "gkemulticloud", "distribution_name": "cloud.google.com/go/gkemulticloud/apiv1", "description": "GKE Multi-Cloud API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/gkemulticloud/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/gsuiteaddons/apiv1": { "api_shortname": "gsuiteaddons", "distribution_name": "cloud.google.com/go/gsuiteaddons/apiv1", "description": "Google Workspace add-ons API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/gsuiteaddons/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/iam": { "api_shortname": "iam", "distribution_name": "cloud.google.com/go/iam", "description": "Cloud IAM", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest", "release_level": "stable", "library_type": "CORE" }, "cloud.google.com/go/iam/apiv1": { "api_shortname": "iam-meta-api", "distribution_name": "cloud.google.com/go/iam/apiv1", "description": "IAM Meta API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/iam/apiv2": { "api_shortname": "iam", "distribution_name": "cloud.google.com/go/iam/apiv2", "description": "Identity and Access Management (IAM) API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/iam/apiv3": { "api_shortname": "iam", "distribution_name": "cloud.google.com/go/iam/apiv3", "description": "Identity and Access Management (IAM) API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/apiv3", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/iam/apiv3beta": { "api_shortname": "iam", "distribution_name": "cloud.google.com/go/iam/apiv3beta", "description": "Identity and Access Management (IAM) API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/apiv3beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/iam/credentials/apiv1": { "api_shortname": "iamcredentials", "distribution_name": "cloud.google.com/go/iam/credentials/apiv1", "description": "IAM Service Account Credentials API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/iam/latest/credentials/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/iap/apiv1": { "api_shortname": "iap", "distribution_name": "cloud.google.com/go/iap/apiv1", "description": "Cloud Identity-Aware Proxy API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/iap/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/identitytoolkit/apiv2": { "api_shortname": "identitytoolkit", "distribution_name": "cloud.google.com/go/identitytoolkit/apiv2", "description": "Identity Toolkit API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/identitytoolkit/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/ids/apiv1": { "api_shortname": "ids", "distribution_name": "cloud.google.com/go/ids/apiv1", "description": "Cloud IDS API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/ids/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/iot/apiv1": { "api_shortname": "cloudiot", "distribution_name": "cloud.google.com/go/iot/apiv1", "description": "Cloud IoT API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/iot/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/kms/apiv1": { "api_shortname": "cloudkms", "distribution_name": "cloud.google.com/go/kms/apiv1", "description": "Cloud Key Management Service (KMS) API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/kms/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/kms/inventory/apiv1": { "api_shortname": "kmsinventory", "distribution_name": "cloud.google.com/go/kms/inventory/apiv1", "description": "KMS Inventory API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/kms/latest/inventory/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/language/apiv1": { "api_shortname": "language", "distribution_name": "cloud.google.com/go/language/apiv1", "description": "Cloud Natural Language API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/language/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/language/apiv1beta2": { "api_shortname": "language", "distribution_name": "cloud.google.com/go/language/apiv1beta2", "description": "Cloud Natural Language API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/language/latest/apiv1beta2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/language/apiv2": { "api_shortname": "language", "distribution_name": "cloud.google.com/go/language/apiv2", "description": "Cloud Natural Language API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/language/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/lifesciences/apiv2beta": { "api_shortname": "lifesciences", "distribution_name": "cloud.google.com/go/lifesciences/apiv2beta", "description": "Cloud Life Sciences API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/lifesciences/latest/apiv2beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/logging": { "api_shortname": "logging", "distribution_name": "cloud.google.com/go/logging", "description": "Cloud Logging API", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/logging/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/logging/apiv2": { "api_shortname": "logging", "distribution_name": "cloud.google.com/go/logging/apiv2", "description": "Cloud Logging API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/logging/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/longrunning/autogen": { "api_shortname": "longrunning", "distribution_name": "cloud.google.com/go/longrunning/autogen", "description": "Long Running Operations API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/longrunning/latest/autogen", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/lustre/apiv1": { "api_shortname": "lustre", "distribution_name": "cloud.google.com/go/lustre/apiv1", "description": "Google Cloud Managed Lustre API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/lustre/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/managedidentities/apiv1": { "api_shortname": "managedidentities", "distribution_name": "cloud.google.com/go/managedidentities/apiv1", "description": "Managed Service for Microsoft Active Directory API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/managedidentities/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/managedkafka/apiv1": { "api_shortname": "managedkafka", "distribution_name": "cloud.google.com/go/managedkafka/apiv1", "description": "Managed Service for Apache Kafka API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/managedkafka/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/maps/addressvalidation/apiv1": { "api_shortname": "addressvalidation", "distribution_name": "cloud.google.com/go/maps/addressvalidation/apiv1", "description": "Address Validation API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/addressvalidation/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/maps/areainsights/apiv1": { "api_shortname": "areainsights", "distribution_name": "cloud.google.com/go/maps/areainsights/apiv1", "description": "Places Aggregate API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/areainsights/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/maps/fleetengine/apiv1": { "api_shortname": "fleetengine", "distribution_name": "cloud.google.com/go/maps/fleetengine/apiv1", "description": "Local Rides and Deliveries API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/fleetengine/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/maps/fleetengine/delivery/apiv1": { "api_shortname": "fleetengine", "distribution_name": "cloud.google.com/go/maps/fleetengine/delivery/apiv1", "description": "Last Mile Fleet Solution Delivery API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/fleetengine/delivery/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/maps/places/apiv1": { "api_shortname": "places", "distribution_name": "cloud.google.com/go/maps/places/apiv1", "description": "Places API (New)", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/places/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/maps/routeoptimization/apiv1": { "api_shortname": "routeoptimization", "distribution_name": "cloud.google.com/go/maps/routeoptimization/apiv1", "description": "Route Optimization API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/routeoptimization/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/maps/routing/apiv2": { "api_shortname": "routes", "distribution_name": "cloud.google.com/go/maps/routing/apiv2", "description": "Routes API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/routing/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/maps/solar/apiv1": { "api_shortname": "solar", "distribution_name": "cloud.google.com/go/maps/solar/apiv1", "description": "Solar API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/solar/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/mediatranslation/apiv1beta1": { "api_shortname": "mediatranslation", "distribution_name": "cloud.google.com/go/mediatranslation/apiv1beta1", "description": "Media Translation API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/mediatranslation/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/memcache/apiv1": { "api_shortname": "memcache", "distribution_name": "cloud.google.com/go/memcache/apiv1", "description": "Cloud Memorystore for Memcached API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/memcache/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/memcache/apiv1beta2": { "api_shortname": "memcache", "distribution_name": "cloud.google.com/go/memcache/apiv1beta2", "description": "Cloud Memorystore for Memcached API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/memcache/latest/apiv1beta2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/memorystore/apiv1": { "api_shortname": "memorystore", "distribution_name": "cloud.google.com/go/memorystore/apiv1", "description": "Memorystore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/memorystore/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/memorystore/apiv1beta": { "api_shortname": "memorystore", "distribution_name": "cloud.google.com/go/memorystore/apiv1beta", "description": "Memorystore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/memorystore/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/metastore/apiv1": { "api_shortname": "metastore", "distribution_name": "cloud.google.com/go/metastore/apiv1", "description": "Dataproc Metastore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/metastore/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/metastore/apiv1alpha": { "api_shortname": "metastore", "distribution_name": "cloud.google.com/go/metastore/apiv1alpha", "description": "Dataproc Metastore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/metastore/latest/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/metastore/apiv1beta": { "api_shortname": "metastore", "distribution_name": "cloud.google.com/go/metastore/apiv1beta", "description": "Dataproc Metastore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/metastore/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/migrationcenter/apiv1": { "api_shortname": "migrationcenter", "distribution_name": "cloud.google.com/go/migrationcenter/apiv1", "description": "Migration Center API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/migrationcenter/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/modelarmor/apiv1": { "api_shortname": "modelarmor", "distribution_name": "cloud.google.com/go/modelarmor/apiv1", "description": "Model Armor API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/modelarmor/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/monitoring/apiv3/v2": { "api_shortname": "monitoring", "distribution_name": "cloud.google.com/go/monitoring/apiv3/v2", "description": "Cloud Monitoring API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/monitoring/latest/apiv3/v2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/monitoring/dashboard/apiv1": { "api_shortname": "monitoring", "distribution_name": "cloud.google.com/go/monitoring/dashboard/apiv1", "description": "Cloud Monitoring API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/monitoring/latest/dashboard/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/monitoring/metricsscope/apiv1": { "api_shortname": "monitoring", "distribution_name": "cloud.google.com/go/monitoring/metricsscope/apiv1", "description": "Cloud Monitoring API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/monitoring/latest/metricsscope/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/netapp/apiv1": { "api_shortname": "netapp", "distribution_name": "cloud.google.com/go/netapp/apiv1", "description": "NetApp API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/netapp/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/networkconnectivity/apiv1": { "api_shortname": "networkconnectivity", "distribution_name": "cloud.google.com/go/networkconnectivity/apiv1", "description": "Network Connectivity API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/networkconnectivity/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/networkconnectivity/apiv1alpha1": { "api_shortname": "networkconnectivity", "distribution_name": "cloud.google.com/go/networkconnectivity/apiv1alpha1", "description": "Network Connectivity API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/networkconnectivity/latest/apiv1alpha1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/networkmanagement/apiv1": { "api_shortname": "networkmanagement", "distribution_name": "cloud.google.com/go/networkmanagement/apiv1", "description": "Network Management API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/networkmanagement/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/networksecurity/apiv1beta1": { "api_shortname": "networksecurity", "distribution_name": "cloud.google.com/go/networksecurity/apiv1beta1", "description": "Network Security API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/networksecurity/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/networkservices/apiv1": { "api_shortname": "networkservices", "distribution_name": "cloud.google.com/go/networkservices/apiv1", "description": "Network Services API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/networkservices/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/notebooks/apiv1": { "api_shortname": "notebooks", "distribution_name": "cloud.google.com/go/notebooks/apiv1", "description": "Notebooks API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/notebooks/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/notebooks/apiv1beta1": { "api_shortname": "notebooks", "distribution_name": "cloud.google.com/go/notebooks/apiv1beta1", "description": "Notebooks API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/notebooks/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/notebooks/apiv2": { "api_shortname": "notebooks", "distribution_name": "cloud.google.com/go/notebooks/apiv2", "description": "Notebooks API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/notebooks/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/optimization/apiv1": { "api_shortname": "cloudoptimization", "distribution_name": "cloud.google.com/go/optimization/apiv1", "description": "Cloud Optimization API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/optimization/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/oracledatabase/apiv1": { "api_shortname": "oracledatabase", "distribution_name": "cloud.google.com/go/oracledatabase/apiv1", "description": "Oracle Database@Google Cloud API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/oracledatabase/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/orchestration/airflow/service/apiv1": { "api_shortname": "composer", "distribution_name": "cloud.google.com/go/orchestration/airflow/service/apiv1", "description": "Cloud Composer API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/orchestration/latest/airflow/service/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/orgpolicy/apiv2": { "api_shortname": "orgpolicy", "distribution_name": "cloud.google.com/go/orgpolicy/apiv2", "description": "Organization Policy API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/orgpolicy/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/osconfig/agentendpoint/apiv1": { "api_shortname": "osconfig", "distribution_name": "cloud.google.com/go/osconfig/agentendpoint/apiv1", "description": "OS Config API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/agentendpoint/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/osconfig/agentendpoint/apiv1beta": { "api_shortname": "osconfig", "distribution_name": "cloud.google.com/go/osconfig/agentendpoint/apiv1beta", "description": "OS Config API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/agentendpoint/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/osconfig/apiv1": { "api_shortname": "osconfig", "distribution_name": "cloud.google.com/go/osconfig/apiv1", "description": "OS Config API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/osconfig/apiv1alpha": { "api_shortname": "osconfig", "distribution_name": "cloud.google.com/go/osconfig/apiv1alpha", "description": "OS Config API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/apiv1alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/osconfig/apiv1beta": { "api_shortname": "osconfig", "distribution_name": "cloud.google.com/go/osconfig/apiv1beta", "description": "OS Config API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/osconfig/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/oslogin/apiv1": { "api_shortname": "oslogin", "distribution_name": "cloud.google.com/go/oslogin/apiv1", "description": "Cloud OS Login API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/oslogin/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/oslogin/apiv1beta": { "api_shortname": "oslogin", "distribution_name": "cloud.google.com/go/oslogin/apiv1beta", "description": "Cloud OS Login API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/oslogin/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/parallelstore/apiv1": { "api_shortname": "parallelstore", "distribution_name": "cloud.google.com/go/parallelstore/apiv1", "description": "Parallelstore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/parallelstore/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/parallelstore/apiv1beta": { "api_shortname": "parallelstore", "distribution_name": "cloud.google.com/go/parallelstore/apiv1beta", "description": "Parallelstore API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/parallelstore/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/parametermanager/apiv1": { "api_shortname": "parametermanager", "distribution_name": "cloud.google.com/go/parametermanager/apiv1", "description": "Parameter Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/parametermanager/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/phishingprotection/apiv1beta1": { "api_shortname": "phishingprotection", "distribution_name": "cloud.google.com/go/phishingprotection/apiv1beta1", "description": "Phishing Protection API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/phishingprotection/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/policysimulator/apiv1": { "api_shortname": "policysimulator", "distribution_name": "cloud.google.com/go/policysimulator/apiv1", "description": "Policy Simulator API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/policysimulator/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/policytroubleshooter/apiv1": { "api_shortname": "policytroubleshooter", "distribution_name": "cloud.google.com/go/policytroubleshooter/apiv1", "description": "Policy Troubleshooter API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/policytroubleshooter/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/policytroubleshooter/iam/apiv3": { "api_shortname": "policytroubleshooter", "distribution_name": "cloud.google.com/go/policytroubleshooter/iam/apiv3", "description": "Policy Troubleshooter API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/policytroubleshooter/latest/iam/apiv3", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/privatecatalog/apiv1beta1": { "api_shortname": "cloudprivatecatalog", "distribution_name": "cloud.google.com/go/privatecatalog/apiv1beta1", "description": "Cloud Private Catalog API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/privatecatalog/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/privilegedaccessmanager/apiv1": { "api_shortname": "privilegedaccessmanager", "distribution_name": "cloud.google.com/go/privilegedaccessmanager/apiv1", "description": "Privileged Access Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/privilegedaccessmanager/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/profiler": { "api_shortname": "cloudprofiler", "distribution_name": "cloud.google.com/go/profiler", "description": "Cloud Profiler", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/profiler/latest", "release_level": "stable", "library_type": "AGENT" }, "cloud.google.com/go/pubsub": { "api_shortname": "pubsub", "distribution_name": "cloud.google.com/go/pubsub", "description": "Cloud PubSub", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/pubsub/v2/apiv1": { "api_shortname": "pubsub", "distribution_name": "cloud.google.com/go/pubsub/v2/apiv1", "description": "Cloud Pub/Sub API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/latest/v2/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/pubsublite": { "api_shortname": "pubsublite", "distribution_name": "cloud.google.com/go/pubsublite", "description": "Cloud PubSub Lite", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsublite/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/pubsublite/apiv1": { "api_shortname": "pubsublite", "distribution_name": "cloud.google.com/go/pubsublite/apiv1", "description": "Pub/Sub Lite API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsublite/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/rapidmigrationassessment/apiv1": { "api_shortname": "rapidmigrationassessment", "distribution_name": "cloud.google.com/go/rapidmigrationassessment/apiv1", "description": "Rapid Migration Assessment API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/rapidmigrationassessment/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/recaptchaenterprise/v2/apiv1": { "api_shortname": "recaptchaenterprise", "distribution_name": "cloud.google.com/go/recaptchaenterprise/v2/apiv1", "description": "reCAPTCHA Enterprise API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/recaptchaenterprise/v2/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/recaptchaenterprise/v2/apiv1beta1": { "api_shortname": "recaptchaenterprise", "distribution_name": "cloud.google.com/go/recaptchaenterprise/v2/apiv1beta1", "description": "reCAPTCHA Enterprise API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/recaptchaenterprise/v2/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/recommendationengine/apiv1beta1": { "api_shortname": "recommendationengine", "distribution_name": "cloud.google.com/go/recommendationengine/apiv1beta1", "description": "Recommendations AI", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/recommendationengine/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/recommender/apiv1": { "api_shortname": "recommender", "distribution_name": "cloud.google.com/go/recommender/apiv1", "description": "Recommender API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/recommender/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/recommender/apiv1beta1": { "api_shortname": "recommender", "distribution_name": "cloud.google.com/go/recommender/apiv1beta1", "description": "Recommender API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/recommender/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/redis/apiv1": { "api_shortname": "redis", "distribution_name": "cloud.google.com/go/redis/apiv1", "description": "Google Cloud Memorystore for Redis API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/redis/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/redis/apiv1beta1": { "api_shortname": "redis", "distribution_name": "cloud.google.com/go/redis/apiv1beta1", "description": "Google Cloud Memorystore for Redis API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/redis/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/redis/cluster/apiv1": { "api_shortname": "redis", "distribution_name": "cloud.google.com/go/redis/cluster/apiv1", "description": "Google Cloud Memorystore for Redis API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/redis/latest/cluster/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/resourcemanager/apiv2": { "api_shortname": "cloudresourcemanager", "distribution_name": "cloud.google.com/go/resourcemanager/apiv2", "description": "Cloud Resource Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/resourcemanager/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/resourcemanager/apiv3": { "api_shortname": "cloudresourcemanager", "distribution_name": "cloud.google.com/go/resourcemanager/apiv3", "description": "Cloud Resource Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/resourcemanager/latest/apiv3", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/retail/apiv2": { "api_shortname": "retail", "distribution_name": "cloud.google.com/go/retail/apiv2", "description": "Vertex AI Search for commerce API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/retail/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/retail/apiv2alpha": { "api_shortname": "retail", "distribution_name": "cloud.google.com/go/retail/apiv2alpha", "description": "Vertex AI Search for commerce API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/retail/latest/apiv2alpha", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/retail/apiv2beta": { "api_shortname": "retail", "distribution_name": "cloud.google.com/go/retail/apiv2beta", "description": "Vertex AI Search for commerce API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/retail/latest/apiv2beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/rpcreplay": { "api_shortname": "rpcreplay", "distribution_name": "cloud.google.com/go/rpcreplay", "description": "RPC Replay", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/latest/rpcreplay", "release_level": "stable", "library_type": "OTHER" }, "cloud.google.com/go/run/apiv2": { "api_shortname": "run", "distribution_name": "cloud.google.com/go/run/apiv2", "description": "Cloud Run Admin API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/run/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/scheduler/apiv1": { "api_shortname": "cloudscheduler", "distribution_name": "cloud.google.com/go/scheduler/apiv1", "description": "Cloud Scheduler API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/scheduler/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/scheduler/apiv1beta1": { "api_shortname": "cloudscheduler", "distribution_name": "cloud.google.com/go/scheduler/apiv1beta1", "description": "Cloud Scheduler API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/scheduler/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/secretmanager/apiv1": { "api_shortname": "secretmanager", "distribution_name": "cloud.google.com/go/secretmanager/apiv1", "description": "Secret Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/secretmanager/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/secretmanager/apiv1beta2": { "api_shortname": "secretmanager", "distribution_name": "cloud.google.com/go/secretmanager/apiv1beta2", "description": "Secret Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/secretmanager/latest/apiv1beta2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/securesourcemanager/apiv1": { "api_shortname": "securesourcemanager", "distribution_name": "cloud.google.com/go/securesourcemanager/apiv1", "description": "Secure Source Manager API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securesourcemanager/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/security/privateca/apiv1": { "api_shortname": "privateca", "distribution_name": "cloud.google.com/go/security/privateca/apiv1", "description": "Certificate Authority API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/security/latest/privateca/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/security/publicca/apiv1": { "api_shortname": "publicca", "distribution_name": "cloud.google.com/go/security/publicca/apiv1", "description": "Public Certificate Authority API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/security/latest/publicca/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/security/publicca/apiv1beta1": { "api_shortname": "publicca", "distribution_name": "cloud.google.com/go/security/publicca/apiv1beta1", "description": "Public Certificate Authority API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/security/latest/publicca/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/securitycenter/apiv1": { "api_shortname": "securitycenter", "distribution_name": "cloud.google.com/go/securitycenter/apiv1", "description": "Security Command Center API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/securitycenter/apiv1beta1": { "api_shortname": "securitycenter", "distribution_name": "cloud.google.com/go/securitycenter/apiv1beta1", "description": "Security Command Center API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/securitycenter/apiv1p1beta1": { "api_shortname": "securitycenter", "distribution_name": "cloud.google.com/go/securitycenter/apiv1p1beta1", "description": "Security Command Center API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/apiv1p1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/securitycenter/apiv2": { "api_shortname": "securitycenter", "distribution_name": "cloud.google.com/go/securitycenter/apiv2", "description": "Security Command Center API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/apiv2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/securitycenter/settings/apiv1beta1": { "api_shortname": "securitycenter", "distribution_name": "cloud.google.com/go/securitycenter/settings/apiv1beta1", "description": "Cloud Security Command Center API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycenter/latest/settings/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/securitycentermanagement/apiv1": { "api_shortname": "securitycentermanagement", "distribution_name": "cloud.google.com/go/securitycentermanagement/apiv1", "description": "Security Command Center Management API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securitycentermanagement/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/securityposture/apiv1": { "api_shortname": "securityposture", "distribution_name": "cloud.google.com/go/securityposture/apiv1", "description": "Security Posture API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securityposture/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/servicecontrol/apiv1": { "api_shortname": "servicecontrol", "distribution_name": "cloud.google.com/go/servicecontrol/apiv1", "description": "Service Control API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicecontrol/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/servicedirectory/apiv1": { "api_shortname": "servicedirectory", "distribution_name": "cloud.google.com/go/servicedirectory/apiv1", "description": "Service Directory API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicedirectory/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/servicedirectory/apiv1beta1": { "api_shortname": "servicedirectory", "distribution_name": "cloud.google.com/go/servicedirectory/apiv1beta1", "description": "Service Directory API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicedirectory/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/servicehealth/apiv1": { "api_shortname": "servicehealth", "distribution_name": "cloud.google.com/go/servicehealth/apiv1", "description": "Service Health API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicehealth/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/servicemanagement/apiv1": { "api_shortname": "servicemanagement", "distribution_name": "cloud.google.com/go/servicemanagement/apiv1", "description": "Service Management API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/servicemanagement/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/serviceusage/apiv1": { "api_shortname": "serviceusage", "distribution_name": "cloud.google.com/go/serviceusage/apiv1", "description": "Service Usage API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/serviceusage/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shell/apiv1": { "api_shortname": "cloudshell", "distribution_name": "cloud.google.com/go/shell/apiv1", "description": "Cloud Shell API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shell/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/css/apiv1": { "api_shortname": "css", "distribution_name": "cloud.google.com/go/shopping/css/apiv1", "description": "CSS API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/css/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/accounts/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/accounts/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/accounts/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/conversions/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/conversions/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/conversions/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/datasources/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/datasources/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/datasources/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/inventories/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/inventories/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/inventories/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/issueresolution/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/issueresolution/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/issueresolution/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/lfp/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/lfp/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/lfp/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/notifications/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/notifications/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/notifications/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/ordertracking/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/ordertracking/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/ordertracking/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/products/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/products/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/products/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/promotions/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/promotions/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/promotions/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/quota/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/quota/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/quota/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/reports/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/reports/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/reports/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/shopping/merchant/reviews/apiv1beta": { "api_shortname": "merchantapi", "distribution_name": "cloud.google.com/go/shopping/merchant/reviews/apiv1beta", "description": "Merchant API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/reviews/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/spanner": { "api_shortname": "spanner", "distribution_name": "cloud.google.com/go/spanner", "description": "Cloud Spanner", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/spanner/adapter/apiv1": { "api_shortname": "spanner", "distribution_name": "cloud.google.com/go/spanner/adapter/apiv1", "description": "Cloud Spanner API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/adapter/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/spanner/admin/database/apiv1": { "api_shortname": "spanner", "distribution_name": "cloud.google.com/go/spanner/admin/database/apiv1", "description": "Cloud Spanner API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/admin/database/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/spanner/admin/instance/apiv1": { "api_shortname": "spanner", "distribution_name": "cloud.google.com/go/spanner/admin/instance/apiv1", "description": "Cloud Spanner Instance Admin API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/admin/instance/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/spanner/apiv1": { "api_shortname": "spanner", "distribution_name": "cloud.google.com/go/spanner/apiv1", "description": "Cloud Spanner API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/spanner/executor/apiv1": { "api_shortname": "spanner-cloud-executor", "distribution_name": "cloud.google.com/go/spanner/executor/apiv1", "description": "Cloud Spanner Executor test API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/spanner/latest/executor/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/speech/apiv1": { "api_shortname": "speech", "distribution_name": "cloud.google.com/go/speech/apiv1", "description": "Cloud Speech-to-Text API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/speech/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/speech/apiv1p1beta1": { "api_shortname": "speech", "distribution_name": "cloud.google.com/go/speech/apiv1p1beta1", "description": "Cloud Speech-to-Text API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/speech/latest/apiv1p1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/speech/apiv2": { "api_shortname": "speech", "distribution_name": "cloud.google.com/go/speech/apiv2", "description": "Cloud Speech-to-Text API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/speech/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/storage": { "api_shortname": "storage", "distribution_name": "cloud.google.com/go/storage", "description": "Cloud Storage (GCS)", "language": "go", "client_library_type": "manual", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest", "release_level": "stable", "library_type": "GAPIC_MANUAL" }, "cloud.google.com/go/storage/control/apiv2": { "api_shortname": "storage", "distribution_name": "cloud.google.com/go/storage/control/apiv2", "description": "Storage Control API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest/control/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/storage/internal/apiv2": { "api_shortname": "storage", "distribution_name": "cloud.google.com/go/storage/internal/apiv2", "description": "Cloud Storage API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest/internal/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/storagebatchoperations/apiv1": { "api_shortname": "storagebatchoperations", "distribution_name": "cloud.google.com/go/storagebatchoperations/apiv1", "description": "Storage Batch Operations API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/storagebatchoperations/latest/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/storageinsights/apiv1": { "api_shortname": "storageinsights", "distribution_name": "cloud.google.com/go/storageinsights/apiv1", "description": "Storage Insights API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/storageinsights/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/storagetransfer/apiv1": { "api_shortname": "storagetransfer", "distribution_name": "cloud.google.com/go/storagetransfer/apiv1", "description": "Storage Transfer API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/storagetransfer/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/streetview/publish/apiv1": { "api_shortname": "streetviewpublish", "distribution_name": "cloud.google.com/go/streetview/publish/apiv1", "description": "Street View Publish API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/streetview/latest/publish/apiv1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/support/apiv2": { "api_shortname": "cloudsupport", "distribution_name": "cloud.google.com/go/support/apiv2", "description": "Google Cloud Support API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/support/latest/apiv2", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/talent/apiv4": { "api_shortname": "jobs", "distribution_name": "cloud.google.com/go/talent/apiv4", "description": "Cloud Talent Solution API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/talent/latest/apiv4", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/talent/apiv4beta1": { "api_shortname": "jobs", "distribution_name": "cloud.google.com/go/talent/apiv4beta1", "description": "Cloud Talent Solution API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/talent/latest/apiv4beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/telcoautomation/apiv1": { "api_shortname": "telcoautomation", "distribution_name": "cloud.google.com/go/telcoautomation/apiv1", "description": "Telco Automation API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/telcoautomation/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/texttospeech/apiv1": { "api_shortname": "texttospeech", "distribution_name": "cloud.google.com/go/texttospeech/apiv1", "description": "Cloud Text-to-Speech API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/texttospeech/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/tpu/apiv1": { "api_shortname": "tpu", "distribution_name": "cloud.google.com/go/tpu/apiv1", "description": "Cloud TPU API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/tpu/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/trace/apiv1": { "api_shortname": "cloudtrace", "distribution_name": "cloud.google.com/go/trace/apiv1", "description": "Stackdriver Trace API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/trace/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/trace/apiv2": { "api_shortname": "cloudtrace", "distribution_name": "cloud.google.com/go/trace/apiv2", "description": "Stackdriver Trace API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/trace/latest/apiv2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/translate/apiv3": { "api_shortname": "translate", "distribution_name": "cloud.google.com/go/translate/apiv3", "description": "Cloud Translation API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/translate/latest/apiv3", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/video/livestream/apiv1": { "api_shortname": "livestream", "distribution_name": "cloud.google.com/go/video/livestream/apiv1", "description": "Live Stream API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/video/latest/livestream/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/video/stitcher/apiv1": { "api_shortname": "videostitcher", "distribution_name": "cloud.google.com/go/video/stitcher/apiv1", "description": "Video Stitcher API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/video/latest/stitcher/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/video/transcoder/apiv1": { "api_shortname": "transcoder", "distribution_name": "cloud.google.com/go/video/transcoder/apiv1", "description": "Transcoder API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/video/latest/transcoder/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/videointelligence/apiv1": { "api_shortname": "videointelligence", "distribution_name": "cloud.google.com/go/videointelligence/apiv1", "description": "Cloud Video Intelligence API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/videointelligence/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/videointelligence/apiv1beta2": { "api_shortname": "videointelligence", "distribution_name": "cloud.google.com/go/videointelligence/apiv1beta2", "description": "Google Cloud Video Intelligence API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/videointelligence/latest/apiv1beta2", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/videointelligence/apiv1p3beta1": { "api_shortname": "videointelligence", "distribution_name": "cloud.google.com/go/videointelligence/apiv1p3beta1", "description": "Cloud Video Intelligence API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/videointelligence/latest/apiv1p3beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/vision/v2/apiv1": { "api_shortname": "vision", "distribution_name": "cloud.google.com/go/vision/v2/apiv1", "description": "Cloud Vision API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/vision/v2/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/vision/v2/apiv1p1beta1": { "api_shortname": "vision", "distribution_name": "cloud.google.com/go/vision/v2/apiv1p1beta1", "description": "Cloud Vision API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/vision/v2/latest/apiv1p1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/visionai/apiv1": { "api_shortname": "visionai", "distribution_name": "cloud.google.com/go/visionai/apiv1", "description": "Vision AI API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/visionai/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/vmmigration/apiv1": { "api_shortname": "vmmigration", "distribution_name": "cloud.google.com/go/vmmigration/apiv1", "description": "VM Migration API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/vmmigration/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/vmwareengine/apiv1": { "api_shortname": "vmwareengine", "distribution_name": "cloud.google.com/go/vmwareengine/apiv1", "description": "VMware Engine API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/vmwareengine/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/vpcaccess/apiv1": { "api_shortname": "vpcaccess", "distribution_name": "cloud.google.com/go/vpcaccess/apiv1", "description": "Serverless VPC Access API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/vpcaccess/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/webrisk/apiv1": { "api_shortname": "webrisk", "distribution_name": "cloud.google.com/go/webrisk/apiv1", "description": "Web Risk API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/webrisk/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/webrisk/apiv1beta1": { "api_shortname": "webrisk", "distribution_name": "cloud.google.com/go/webrisk/apiv1beta1", "description": "Web Risk API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/webrisk/latest/apiv1beta1", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/websecurityscanner/apiv1": { "api_shortname": "websecurityscanner", "distribution_name": "cloud.google.com/go/websecurityscanner/apiv1", "description": "Web Security Scanner API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/websecurityscanner/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/workflows/apiv1": { "api_shortname": "workflows", "distribution_name": "cloud.google.com/go/workflows/apiv1", "description": "Workflows API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/workflows/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/workflows/apiv1beta": { "api_shortname": "workflows", "distribution_name": "cloud.google.com/go/workflows/apiv1beta", "description": "Workflows API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/workflows/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/workflows/executions/apiv1": { "api_shortname": "workflowexecutions", "distribution_name": "cloud.google.com/go/workflows/executions/apiv1", "description": "Workflow Executions API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/workflows/latest/executions/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/workflows/executions/apiv1beta": { "api_shortname": "workflowexecutions", "distribution_name": "cloud.google.com/go/workflows/executions/apiv1beta", "description": "Workflow Executions API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/workflows/latest/executions/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/workstations/apiv1": { "api_shortname": "workstations", "distribution_name": "cloud.google.com/go/workstations/apiv1", "description": "Cloud Workstations API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/workstations/latest/apiv1", "release_level": "stable", "library_type": "GAPIC_AUTO" }, "cloud.google.com/go/workstations/apiv1beta": { "api_shortname": "workstations", "distribution_name": "cloud.google.com/go/workstations/apiv1beta", "description": "Cloud Workstations API", "language": "go", "client_library_type": "generated", "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/workstations/latest/apiv1beta", "release_level": "preview", "library_type": "GAPIC_AUTO" } } ================================================ FILE: vendor/cloud.google.com/go/internal/README.md ================================================ # Internal This directory contains internal code for cloud.google.com/go packages. ## .repo-metadata-full.json `.repo-metadata-full.json` contains metadata about the packages in this repo. It is generated by `internal/gapicgen/generator`. It's processed by external tools to build lists of all of the packages. Don't make breaking changes to the format without consulting with the external tools. One day, we may want to create individual `.repo-metadata.json` files next to each package, which is the pattern followed by some other languages. External tools would then talk to pkg.go.dev or some other service to get the overall list of packages and use the `.repo-metadata.json` files to get the additional metadata required. For now, `.repo-metadata-full.json` includes everything. ### Updating OwlBot SHA You may want to manually update the which version of the post-processor will be used -- to do this you need to update the SHA in the OwlBot lock file. See the [postprocessor/README](postprocessor/README.md) for detailed instructions. *Note*: OwlBot will eventually open a pull request to update this value if it discovers a new version of the container. ================================================ FILE: vendor/cloud.google.com/go/internal/annotate.go ================================================ // Copyright 2017 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal import ( "fmt" "google.golang.org/api/googleapi" "google.golang.org/grpc/status" ) // Annotate prepends msg to the error message in err, attempting // to preserve other information in err, like an error code. // // Annotate panics if err is nil. // // Annotate knows about these error types: // - "google.golang.org/grpc/status".Status // - "google.golang.org/api/googleapi".Error // If the error is not one of these types, Annotate behaves // like // // fmt.Errorf("%s: %v", msg, err) func Annotate(err error, msg string) error { if err == nil { panic("Annotate called with nil") } if s, ok := status.FromError(err); ok { p := s.Proto() p.Message = msg + ": " + p.Message return status.ErrorProto(p) } if g, ok := err.(*googleapi.Error); ok { g.Message = msg + ": " + g.Message return g } return fmt.Errorf("%s: %v", msg, err) } // Annotatef uses format and args to format a string, then calls Annotate. func Annotatef(err error, format string, args ...interface{}) error { return Annotate(err, fmt.Sprintf(format, args...)) } ================================================ FILE: vendor/cloud.google.com/go/internal/gen_info.sh ================================================ #!/bin/sh # Script to generate info.go files with methods for all clients. if [[ $# != 2 ]]; then echo >&2 "usage: $0 DIR PACKAGE" exit 1 fi outfile=info.go cd $1 cat <<'EOF' > $outfile // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // SetGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Also passes any // provided key-value pairs. Intended for use by Google-written clients. // // Internal use only. EOF echo -e >> $outfile "package $2\n" awk '/^func \(c \*[A-Z].*\) setGoogleClientInfo/ { printf("func (c %s SetGoogleClientInfo(keyval ...string) {\n", $3); printf(" c.setGoogleClientInfo(keyval...)\n"); printf("}\n\n"); }' *_client.go >> $outfile gofmt -w $outfile ================================================ FILE: vendor/cloud.google.com/go/internal/optional/optional.go ================================================ // Copyright 2016 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package optional provides versions of primitive types that can // be nil. These are useful in methods that update some of an API object's // fields. package optional import ( "fmt" "strings" "time" ) type ( // Bool is either a bool or nil. Bool interface{} // String is either a string or nil. String interface{} // Int is either an int or nil. Int interface{} // Uint is either a uint or nil. Uint interface{} // Float64 is either a float64 or nil. Float64 interface{} // Duration is either a time.Duration or nil. Duration interface{} ) // ToBool returns its argument as a bool. // It panics if its argument is nil or not a bool. func ToBool(v Bool) bool { x, ok := v.(bool) if !ok { doPanic("Bool", v) } return x } // ToString returns its argument as a string. // It panics if its argument is nil or not a string. func ToString(v String) string { x, ok := v.(string) if !ok { doPanic("String", v) } return x } // ToInt returns its argument as an int. // It panics if its argument is nil or not an int. func ToInt(v Int) int { x, ok := v.(int) if !ok { doPanic("Int", v) } return x } // ToUint returns its argument as a uint. // It panics if its argument is nil or not a uint. func ToUint(v Uint) uint { x, ok := v.(uint) if !ok { doPanic("Uint", v) } return x } // ToFloat64 returns its argument as a float64. // It panics if its argument is nil or not a float64. func ToFloat64(v Float64) float64 { x, ok := v.(float64) if !ok { doPanic("Float64", v) } return x } // ToDuration returns its argument as a time.Duration. // It panics if its argument is nil or not a time.Duration. func ToDuration(v Duration) time.Duration { x, ok := v.(time.Duration) if !ok { doPanic("Duration", v) } return x } func doPanic(capType string, v interface{}) { panic(fmt.Sprintf("optional.%s value should be %s, got %T", capType, strings.ToLower(capType), v)) } ================================================ FILE: vendor/cloud.google.com/go/internal/retry.go ================================================ // Copyright 2016 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal import ( "context" "fmt" "time" gax "github.com/googleapis/gax-go/v2" ) // Retry calls the supplied function f repeatedly according to the provided // backoff parameters. It returns when one of the following occurs: // When f's first return value is true, Retry immediately returns with f's second // return value. // When the provided context is done, Retry returns with an error that // includes both ctx.Error() and the last error returned by f. func Retry(ctx context.Context, bo gax.Backoff, f func() (stop bool, err error)) error { return retry(ctx, bo, f, gax.Sleep) } func retry(ctx context.Context, bo gax.Backoff, f func() (stop bool, err error), sleep func(context.Context, time.Duration) error) error { var lastErr error for { stop, err := f() if stop { return err } // Remember the last "real" error from f. if err != nil && err != context.Canceled && err != context.DeadlineExceeded { lastErr = err } p := bo.Pause() if ctxErr := sleep(ctx, p); ctxErr != nil { if lastErr != nil { return wrappedCallErr{ctxErr: ctxErr, wrappedErr: lastErr} } return ctxErr } } } // Use this error type to return an error which allows introspection of both // the context error and the error from the service. type wrappedCallErr struct { ctxErr error wrappedErr error } func (e wrappedCallErr) Error() string { return fmt.Sprintf("retry failed with %v; last error: %v", e.ctxErr, e.wrappedErr) } func (e wrappedCallErr) Unwrap() error { return e.wrappedErr } // Is allows errors.Is to match the error from the call as well as context // sentinel errors. func (e wrappedCallErr) Is(err error) bool { return e.ctxErr == err || e.wrappedErr == err } ================================================ FILE: vendor/cloud.google.com/go/internal/trace/trace.go ================================================ // Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package trace import ( "context" "errors" "fmt" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" "google.golang.org/api/googleapi" "google.golang.org/grpc/status" ) const ( OpenTelemetryTracerName = "cloud.google.com/go" ) // StartSpan adds an OpenTelemetry span to the trace with the given name. // // The default experimental tracing support for OpenCensus is now deprecated in // the Google Cloud client libraries for Go. func StartSpan(ctx context.Context, name string) context.Context { ctx, _ = otel.GetTracerProvider().Tracer(OpenTelemetryTracerName).Start(ctx, name) return ctx } // EndSpan ends an OpenTelemetry span with the given error. // // The default experimental tracing support for OpenCensus is now deprecated in // the Google Cloud client libraries for Go. func EndSpan(ctx context.Context, err error) { span := trace.SpanFromContext(ctx) if err != nil { span.SetStatus(codes.Error, toOpenTelemetryStatusDescription(err)) span.RecordError(err) } span.End() } // toOpenTelemetryStatus converts an error to an equivalent OpenTelemetry status description. func toOpenTelemetryStatusDescription(err error) string { var err2 *googleapi.Error if ok := errors.As(err, &err2); ok { return err2.Message } else if s, ok := status.FromError(err); ok { return s.Message() } else { return err.Error() } } // TracePrintf retrieves the current OpenTelemetry span from context, then calls // Span.AddEvent. The expected span must be an OpenTelemetry span. The default // experimental tracing support for OpenCensus is now deprecated in the Google // Cloud client libraries for Go. func TracePrintf(ctx context.Context, attrMap map[string]interface{}, format string, args ...interface{}) { attrs := otAttrs(attrMap) trace.SpanFromContext(ctx).AddEvent(fmt.Sprintf(format, args...), trace.WithAttributes(attrs...)) } // otAttrs converts a generic map to OpenTelemetry attributes. func otAttrs(attrMap map[string]interface{}) []attribute.KeyValue { var attrs []attribute.KeyValue for k, v := range attrMap { var a attribute.KeyValue switch v := v.(type) { case string: a = attribute.Key(k).String(v) case bool: a = attribute.Key(k).Bool(v) case int: a = attribute.Key(k).Int(v) case int64: a = attribute.Key(k).Int64(v) default: a = attribute.Key(k).String(fmt.Sprintf("%#v", v)) } attrs = append(attrs, a) } return attrs } ================================================ FILE: vendor/cloud.google.com/go/internal/version/update_version.sh ================================================ #!/bin/bash # Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. today=$(date +%Y%m%d) sed -i -r -e 's/const Repo = "([0-9]{8})"/const Repo = "'$today'"/' $GOFILE ================================================ FILE: vendor/cloud.google.com/go/internal/version/version.go ================================================ // Copyright 2016 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //go:generate ./update_version.sh // Package version contains version information for Google Cloud Client // Libraries for Go, as reported in request headers. package version import ( "runtime" "strings" "unicode" ) // Repo is the current version of the client libraries in this // repo. It should be a date in YYYYMMDD format. const Repo = "20201104" // Go returns the Go runtime version. The returned string // has no whitespace. func Go() string { return goVersion } var goVersion = goVer(runtime.Version()) const develPrefix = "devel +" func goVer(s string) string { if strings.HasPrefix(s, develPrefix) { s = s[len(develPrefix):] if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { s = s[:p] } return s } if strings.HasPrefix(s, "go1") { s = s[2:] var prerelease string if p := strings.IndexFunc(s, notSemverRune); p >= 0 { s, prerelease = s[:p], s[p:] } if strings.HasSuffix(s, ".") { s += "0" } else if strings.Count(s, ".") < 2 { s += ".0" } if prerelease != "" { s += "-" + prerelease } return s } return "" } func notSemverRune(r rune) bool { return !strings.ContainsRune("0123456789.", r) } ================================================ FILE: vendor/cloud.google.com/go/monitoring/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/alert_policy_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "fmt" "log/slog" "math" "net/url" "time" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/protobuf/proto" ) var newAlertPolicyClientHook clientHook // AlertPolicyCallOptions contains the retry settings for each method of AlertPolicyClient. type AlertPolicyCallOptions struct { ListAlertPolicies []gax.CallOption GetAlertPolicy []gax.CallOption CreateAlertPolicy []gax.CallOption DeleteAlertPolicy []gax.CallOption UpdateAlertPolicy []gax.CallOption } func defaultAlertPolicyGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultAlertPolicyCallOptions() *AlertPolicyCallOptions { return &AlertPolicyCallOptions{ ListAlertPolicies: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, GetAlertPolicy: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, CreateAlertPolicy: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, DeleteAlertPolicy: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, UpdateAlertPolicy: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, } } // internalAlertPolicyClient is an interface that defines the methods available from Cloud Monitoring API. type internalAlertPolicyClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn ListAlertPolicies(context.Context, *monitoringpb.ListAlertPoliciesRequest, ...gax.CallOption) *AlertPolicyIterator GetAlertPolicy(context.Context, *monitoringpb.GetAlertPolicyRequest, ...gax.CallOption) (*monitoringpb.AlertPolicy, error) CreateAlertPolicy(context.Context, *monitoringpb.CreateAlertPolicyRequest, ...gax.CallOption) (*monitoringpb.AlertPolicy, error) DeleteAlertPolicy(context.Context, *monitoringpb.DeleteAlertPolicyRequest, ...gax.CallOption) error UpdateAlertPolicy(context.Context, *monitoringpb.UpdateAlertPolicyRequest, ...gax.CallOption) (*monitoringpb.AlertPolicy, error) } // AlertPolicyClient is a client for interacting with Cloud Monitoring API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // The AlertPolicyService API is used to manage (list, create, delete, // edit) alert policies in Cloud Monitoring. An alerting policy is // a description of the conditions under which some aspect of your // system is considered to be “unhealthy” and the ways to notify // people or services about this state. In addition to using this API, alert // policies can also be managed through // Cloud Monitoring (at https://cloud.google.com/monitoring/docs/), // which can be reached by clicking the “Monitoring” tab in // Cloud console (at https://console.cloud.google.com/). type AlertPolicyClient struct { // The internal transport-dependent client. internalClient internalAlertPolicyClient // The call options for this service. CallOptions *AlertPolicyCallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *AlertPolicyClient) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *AlertPolicyClient) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *AlertPolicyClient) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // ListAlertPolicies lists the existing alerting policies for the workspace. func (c *AlertPolicyClient) ListAlertPolicies(ctx context.Context, req *monitoringpb.ListAlertPoliciesRequest, opts ...gax.CallOption) *AlertPolicyIterator { return c.internalClient.ListAlertPolicies(ctx, req, opts...) } // GetAlertPolicy gets a single alerting policy. func (c *AlertPolicyClient) GetAlertPolicy(ctx context.Context, req *monitoringpb.GetAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { return c.internalClient.GetAlertPolicy(ctx, req, opts...) } // CreateAlertPolicy creates a new alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. func (c *AlertPolicyClient) CreateAlertPolicy(ctx context.Context, req *monitoringpb.CreateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { return c.internalClient.CreateAlertPolicy(ctx, req, opts...) } // DeleteAlertPolicy deletes an alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. func (c *AlertPolicyClient) DeleteAlertPolicy(ctx context.Context, req *monitoringpb.DeleteAlertPolicyRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteAlertPolicy(ctx, req, opts...) } // UpdateAlertPolicy updates an alerting policy. You can either replace the entire policy with // a new one or replace only certain fields in the current alerting policy by // specifying the fields to be updated via updateMask. Returns the // updated alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. func (c *AlertPolicyClient) UpdateAlertPolicy(ctx context.Context, req *monitoringpb.UpdateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { return c.internalClient.UpdateAlertPolicy(ctx, req, opts...) } // alertPolicyGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type alertPolicyGRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing AlertPolicyClient CallOptions **AlertPolicyCallOptions // The gRPC API client. alertPolicyClient monitoringpb.AlertPolicyServiceClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewAlertPolicyClient creates a new alert policy service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // The AlertPolicyService API is used to manage (list, create, delete, // edit) alert policies in Cloud Monitoring. An alerting policy is // a description of the conditions under which some aspect of your // system is considered to be “unhealthy” and the ways to notify // people or services about this state. In addition to using this API, alert // policies can also be managed through // Cloud Monitoring (at https://cloud.google.com/monitoring/docs/), // which can be reached by clicking the “Monitoring” tab in // Cloud console (at https://console.cloud.google.com/). func NewAlertPolicyClient(ctx context.Context, opts ...option.ClientOption) (*AlertPolicyClient, error) { clientOpts := defaultAlertPolicyGRPCClientOptions() if newAlertPolicyClientHook != nil { hookOpts, err := newAlertPolicyClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := AlertPolicyClient{CallOptions: defaultAlertPolicyCallOptions()} c := &alertPolicyGRPCClient{ connPool: connPool, alertPolicyClient: monitoringpb.NewAlertPolicyServiceClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *alertPolicyGRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *alertPolicyGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *alertPolicyGRPCClient) Close() error { return c.connPool.Close() } func (c *alertPolicyGRPCClient) ListAlertPolicies(ctx context.Context, req *monitoringpb.ListAlertPoliciesRequest, opts ...gax.CallOption) *AlertPolicyIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListAlertPolicies[0:len((*c.CallOptions).ListAlertPolicies):len((*c.CallOptions).ListAlertPolicies)], opts...) it := &AlertPolicyIterator{} req = proto.Clone(req).(*monitoringpb.ListAlertPoliciesRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.AlertPolicy, string, error) { resp := &monitoringpb.ListAlertPoliciesResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.alertPolicyClient.ListAlertPolicies, req, settings.GRPC, c.logger, "ListAlertPolicies") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetAlertPolicies(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *alertPolicyGRPCClient) GetAlertPolicy(ctx context.Context, req *monitoringpb.GetAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetAlertPolicy[0:len((*c.CallOptions).GetAlertPolicy):len((*c.CallOptions).GetAlertPolicy)], opts...) var resp *monitoringpb.AlertPolicy err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.alertPolicyClient.GetAlertPolicy, req, settings.GRPC, c.logger, "GetAlertPolicy") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *alertPolicyGRPCClient) CreateAlertPolicy(ctx context.Context, req *monitoringpb.CreateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateAlertPolicy[0:len((*c.CallOptions).CreateAlertPolicy):len((*c.CallOptions).CreateAlertPolicy)], opts...) var resp *monitoringpb.AlertPolicy err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.alertPolicyClient.CreateAlertPolicy, req, settings.GRPC, c.logger, "CreateAlertPolicy") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *alertPolicyGRPCClient) DeleteAlertPolicy(ctx context.Context, req *monitoringpb.DeleteAlertPolicyRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteAlertPolicy[0:len((*c.CallOptions).DeleteAlertPolicy):len((*c.CallOptions).DeleteAlertPolicy)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.alertPolicyClient.DeleteAlertPolicy, req, settings.GRPC, c.logger, "DeleteAlertPolicy") return err }, opts...) return err } func (c *alertPolicyGRPCClient) UpdateAlertPolicy(ctx context.Context, req *monitoringpb.UpdateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "alert_policy.name", url.QueryEscape(req.GetAlertPolicy().GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateAlertPolicy[0:len((*c.CallOptions).UpdateAlertPolicy):len((*c.CallOptions).UpdateAlertPolicy)], opts...) var resp *monitoringpb.AlertPolicy err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.alertPolicyClient.UpdateAlertPolicy, req, settings.GRPC, c.logger, "UpdateAlertPolicy") return err }, opts...) if err != nil { return nil, err } return resp, nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/auxiliary.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" "google.golang.org/api/iterator" metricpb "google.golang.org/genproto/googleapis/api/metric" monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" ) // AlertPolicyIterator manages a stream of *monitoringpb.AlertPolicy. type AlertPolicyIterator struct { items []*monitoringpb.AlertPolicy pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.AlertPolicy, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *AlertPolicyIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *AlertPolicyIterator) Next() (*monitoringpb.AlertPolicy, error) { var item *monitoringpb.AlertPolicy if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *AlertPolicyIterator) bufLen() int { return len(it.items) } func (it *AlertPolicyIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // GroupIterator manages a stream of *monitoringpb.Group. type GroupIterator struct { items []*monitoringpb.Group pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.Group, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *GroupIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *GroupIterator) Next() (*monitoringpb.Group, error) { var item *monitoringpb.Group if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *GroupIterator) bufLen() int { return len(it.items) } func (it *GroupIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // MetricDescriptorIterator manages a stream of *metricpb.MetricDescriptor. type MetricDescriptorIterator struct { items []*metricpb.MetricDescriptor pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*metricpb.MetricDescriptor, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *MetricDescriptorIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *MetricDescriptorIterator) Next() (*metricpb.MetricDescriptor, error) { var item *metricpb.MetricDescriptor if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *MetricDescriptorIterator) bufLen() int { return len(it.items) } func (it *MetricDescriptorIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // MonitoredResourceDescriptorIterator manages a stream of *monitoredrespb.MonitoredResourceDescriptor. type MonitoredResourceDescriptorIterator struct { items []*monitoredrespb.MonitoredResourceDescriptor pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResourceDescriptor, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *MonitoredResourceDescriptorIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *MonitoredResourceDescriptorIterator) Next() (*monitoredrespb.MonitoredResourceDescriptor, error) { var item *monitoredrespb.MonitoredResourceDescriptor if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *MonitoredResourceDescriptorIterator) bufLen() int { return len(it.items) } func (it *MonitoredResourceDescriptorIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // MonitoredResourceIterator manages a stream of *monitoredrespb.MonitoredResource. type MonitoredResourceIterator struct { items []*monitoredrespb.MonitoredResource pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResource, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *MonitoredResourceIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *MonitoredResourceIterator) Next() (*monitoredrespb.MonitoredResource, error) { var item *monitoredrespb.MonitoredResource if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *MonitoredResourceIterator) bufLen() int { return len(it.items) } func (it *MonitoredResourceIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // NotificationChannelDescriptorIterator manages a stream of *monitoringpb.NotificationChannelDescriptor. type NotificationChannelDescriptorIterator struct { items []*monitoringpb.NotificationChannelDescriptor pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.NotificationChannelDescriptor, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *NotificationChannelDescriptorIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *NotificationChannelDescriptorIterator) Next() (*monitoringpb.NotificationChannelDescriptor, error) { var item *monitoringpb.NotificationChannelDescriptor if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *NotificationChannelDescriptorIterator) bufLen() int { return len(it.items) } func (it *NotificationChannelDescriptorIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // NotificationChannelIterator manages a stream of *monitoringpb.NotificationChannel. type NotificationChannelIterator struct { items []*monitoringpb.NotificationChannel pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.NotificationChannel, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *NotificationChannelIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *NotificationChannelIterator) Next() (*monitoringpb.NotificationChannel, error) { var item *monitoringpb.NotificationChannel if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *NotificationChannelIterator) bufLen() int { return len(it.items) } func (it *NotificationChannelIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // ServiceIterator manages a stream of *monitoringpb.Service. type ServiceIterator struct { items []*monitoringpb.Service pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.Service, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *ServiceIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *ServiceIterator) Next() (*monitoringpb.Service, error) { var item *monitoringpb.Service if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *ServiceIterator) bufLen() int { return len(it.items) } func (it *ServiceIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // ServiceLevelObjectiveIterator manages a stream of *monitoringpb.ServiceLevelObjective. type ServiceLevelObjectiveIterator struct { items []*monitoringpb.ServiceLevelObjective pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.ServiceLevelObjective, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *ServiceLevelObjectiveIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *ServiceLevelObjectiveIterator) Next() (*monitoringpb.ServiceLevelObjective, error) { var item *monitoringpb.ServiceLevelObjective if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *ServiceLevelObjectiveIterator) bufLen() int { return len(it.items) } func (it *ServiceLevelObjectiveIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // SnoozeIterator manages a stream of *monitoringpb.Snooze. type SnoozeIterator struct { items []*monitoringpb.Snooze pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.Snooze, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *SnoozeIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *SnoozeIterator) Next() (*monitoringpb.Snooze, error) { var item *monitoringpb.Snooze if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *SnoozeIterator) bufLen() int { return len(it.items) } func (it *SnoozeIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // TimeSeriesDataIterator manages a stream of *monitoringpb.TimeSeriesData. type TimeSeriesDataIterator struct { items []*monitoringpb.TimeSeriesData pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.TimeSeriesData, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *TimeSeriesDataIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *TimeSeriesDataIterator) Next() (*monitoringpb.TimeSeriesData, error) { var item *monitoringpb.TimeSeriesData if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *TimeSeriesDataIterator) bufLen() int { return len(it.items) } func (it *TimeSeriesDataIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // TimeSeriesIterator manages a stream of *monitoringpb.TimeSeries. type TimeSeriesIterator struct { items []*monitoringpb.TimeSeries pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.TimeSeries, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *TimeSeriesIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *TimeSeriesIterator) Next() (*monitoringpb.TimeSeries, error) { var item *monitoringpb.TimeSeries if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *TimeSeriesIterator) bufLen() int { return len(it.items) } func (it *TimeSeriesIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // UptimeCheckConfigIterator manages a stream of *monitoringpb.UptimeCheckConfig. type UptimeCheckConfigIterator struct { items []*monitoringpb.UptimeCheckConfig pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.UptimeCheckConfig, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *UptimeCheckConfigIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *UptimeCheckConfigIterator) Next() (*monitoringpb.UptimeCheckConfig, error) { var item *monitoringpb.UptimeCheckConfig if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *UptimeCheckConfigIterator) bufLen() int { return len(it.items) } func (it *UptimeCheckConfigIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // UptimeCheckIpIterator manages a stream of *monitoringpb.UptimeCheckIp. type UptimeCheckIpIterator struct { items []*monitoringpb.UptimeCheckIp pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.UptimeCheckIp, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *UptimeCheckIpIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *UptimeCheckIpIterator) Next() (*monitoringpb.UptimeCheckIp, error) { var item *monitoringpb.UptimeCheckIp if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *UptimeCheckIpIterator) bufLen() int { return len(it.items) } func (it *UptimeCheckIpIterator) takeBuf() interface{} { b := it.items it.items = nil return b } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/auxiliary_go123.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. //go:build go1.23 package monitoring import ( "iter" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" "github.com/googleapis/gax-go/v2/iterator" metricpb "google.golang.org/genproto/googleapis/api/metric" monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" ) // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *AlertPolicyIterator) All() iter.Seq2[*monitoringpb.AlertPolicy, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *GroupIterator) All() iter.Seq2[*monitoringpb.Group, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *MetricDescriptorIterator) All() iter.Seq2[*metricpb.MetricDescriptor, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *MonitoredResourceDescriptorIterator) All() iter.Seq2[*monitoredrespb.MonitoredResourceDescriptor, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *MonitoredResourceIterator) All() iter.Seq2[*monitoredrespb.MonitoredResource, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *NotificationChannelDescriptorIterator) All() iter.Seq2[*monitoringpb.NotificationChannelDescriptor, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *NotificationChannelIterator) All() iter.Seq2[*monitoringpb.NotificationChannel, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *ServiceIterator) All() iter.Seq2[*monitoringpb.Service, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *ServiceLevelObjectiveIterator) All() iter.Seq2[*monitoringpb.ServiceLevelObjective, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *SnoozeIterator) All() iter.Seq2[*monitoringpb.Snooze, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *TimeSeriesDataIterator) All() iter.Seq2[*monitoringpb.TimeSeriesData, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *TimeSeriesIterator) All() iter.Seq2[*monitoringpb.TimeSeries, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *UptimeCheckConfigIterator) All() iter.Seq2[*monitoringpb.UptimeCheckConfig, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *UptimeCheckIpIterator) All() iter.Seq2[*monitoringpb.UptimeCheckIp, error] { return iterator.RangeAdapter(it.Next) } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. // Package monitoring is an auto-generated package for the // Cloud Monitoring API. // // Manages your Cloud Monitoring data and configurations. // // NOTE: This package is in beta. It is not stable, and may be subject to changes. // // # General documentation // // For information that is relevant for all client libraries please reference // https://pkg.go.dev/cloud.google.com/go#pkg-overview. Some information on this // page includes: // // - [Authentication and Authorization] // - [Timeouts and Cancellation] // - [Testing against Client Libraries] // - [Debugging Client Libraries] // - [Inspecting errors] // // # Example usage // // To get started with this package, create a client. // // // go get cloud.google.com/go/monitoring/apiv3/v2@latest // ctx := context.Background() // // This snippet has been automatically generated and should be regarded as a code template only. // // It will require modifications to work: // // - It may require correct/in-range values for request initialization. // // - It may require specifying regional endpoints when creating the service client as shown in: // // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options // c, err := monitoring.NewAlertPolicyClient(ctx) // if err != nil { // // TODO: Handle error. // } // defer c.Close() // // The client will use your default application credentials. Clients should be reused instead of created as needed. // The methods of Client are safe for concurrent use by multiple goroutines. // The returned client must be Closed when it is done being used. // // # Using the Client // // The following is an example of making an API call with the newly created client, mentioned above. // // req := &monitoringpb.CreateAlertPolicyRequest{ // // TODO: Fill request struct fields. // // See https://pkg.go.dev/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb#CreateAlertPolicyRequest. // } // resp, err := c.CreateAlertPolicy(ctx, req) // if err != nil { // // TODO: Handle error. // } // // TODO: Use resp. // _ = resp // // # Use of Context // // The ctx passed to NewAlertPolicyClient is used for authentication requests and // for creating the underlying connection, but is not used for subsequent calls. // Individual methods on the client use the ctx given to them. // // To close the open connection, use the Close() method. // // [Authentication and Authorization]: https://pkg.go.dev/cloud.google.com/go#hdr-Authentication_and_Authorization // [Timeouts and Cancellation]: https://pkg.go.dev/cloud.google.com/go#hdr-Timeouts_and_Cancellation // [Testing against Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Testing // [Debugging Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Debugging // [Inspecting errors]: https://pkg.go.dev/cloud.google.com/go#hdr-Inspecting_errors package monitoring // import "cloud.google.com/go/monitoring/apiv3/v2" ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/gapic_metadata.json ================================================ { "schema": "1.0", "comment": "This file maps proto services/RPCs to the corresponding library clients/methods.", "language": "go", "protoPackage": "google.monitoring.v3", "libraryPackage": "cloud.google.com/go/monitoring/apiv3/v2", "services": { "AlertPolicyService": { "clients": { "grpc": { "libraryClient": "AlertPolicyClient", "rpcs": { "CreateAlertPolicy": { "methods": [ "CreateAlertPolicy" ] }, "DeleteAlertPolicy": { "methods": [ "DeleteAlertPolicy" ] }, "GetAlertPolicy": { "methods": [ "GetAlertPolicy" ] }, "ListAlertPolicies": { "methods": [ "ListAlertPolicies" ] }, "UpdateAlertPolicy": { "methods": [ "UpdateAlertPolicy" ] } } } } }, "GroupService": { "clients": { "grpc": { "libraryClient": "GroupClient", "rpcs": { "CreateGroup": { "methods": [ "CreateGroup" ] }, "DeleteGroup": { "methods": [ "DeleteGroup" ] }, "GetGroup": { "methods": [ "GetGroup" ] }, "ListGroupMembers": { "methods": [ "ListGroupMembers" ] }, "ListGroups": { "methods": [ "ListGroups" ] }, "UpdateGroup": { "methods": [ "UpdateGroup" ] } } } } }, "MetricService": { "clients": { "grpc": { "libraryClient": "MetricClient", "rpcs": { "CreateMetricDescriptor": { "methods": [ "CreateMetricDescriptor" ] }, "CreateServiceTimeSeries": { "methods": [ "CreateServiceTimeSeries" ] }, "CreateTimeSeries": { "methods": [ "CreateTimeSeries" ] }, "DeleteMetricDescriptor": { "methods": [ "DeleteMetricDescriptor" ] }, "GetMetricDescriptor": { "methods": [ "GetMetricDescriptor" ] }, "GetMonitoredResourceDescriptor": { "methods": [ "GetMonitoredResourceDescriptor" ] }, "ListMetricDescriptors": { "methods": [ "ListMetricDescriptors" ] }, "ListMonitoredResourceDescriptors": { "methods": [ "ListMonitoredResourceDescriptors" ] }, "ListTimeSeries": { "methods": [ "ListTimeSeries" ] } } } } }, "NotificationChannelService": { "clients": { "grpc": { "libraryClient": "NotificationChannelClient", "rpcs": { "CreateNotificationChannel": { "methods": [ "CreateNotificationChannel" ] }, "DeleteNotificationChannel": { "methods": [ "DeleteNotificationChannel" ] }, "GetNotificationChannel": { "methods": [ "GetNotificationChannel" ] }, "GetNotificationChannelDescriptor": { "methods": [ "GetNotificationChannelDescriptor" ] }, "GetNotificationChannelVerificationCode": { "methods": [ "GetNotificationChannelVerificationCode" ] }, "ListNotificationChannelDescriptors": { "methods": [ "ListNotificationChannelDescriptors" ] }, "ListNotificationChannels": { "methods": [ "ListNotificationChannels" ] }, "SendNotificationChannelVerificationCode": { "methods": [ "SendNotificationChannelVerificationCode" ] }, "UpdateNotificationChannel": { "methods": [ "UpdateNotificationChannel" ] }, "VerifyNotificationChannel": { "methods": [ "VerifyNotificationChannel" ] } } } } }, "QueryService": { "clients": { "grpc": { "libraryClient": "QueryClient", "rpcs": { "QueryTimeSeries": { "methods": [ "QueryTimeSeries" ] } } } } }, "ServiceMonitoringService": { "clients": { "grpc": { "libraryClient": "ServiceMonitoringClient", "rpcs": { "CreateService": { "methods": [ "CreateService" ] }, "CreateServiceLevelObjective": { "methods": [ "CreateServiceLevelObjective" ] }, "DeleteService": { "methods": [ "DeleteService" ] }, "DeleteServiceLevelObjective": { "methods": [ "DeleteServiceLevelObjective" ] }, "GetService": { "methods": [ "GetService" ] }, "GetServiceLevelObjective": { "methods": [ "GetServiceLevelObjective" ] }, "ListServiceLevelObjectives": { "methods": [ "ListServiceLevelObjectives" ] }, "ListServices": { "methods": [ "ListServices" ] }, "UpdateService": { "methods": [ "UpdateService" ] }, "UpdateServiceLevelObjective": { "methods": [ "UpdateServiceLevelObjective" ] } } } } }, "SnoozeService": { "clients": { "grpc": { "libraryClient": "SnoozeClient", "rpcs": { "CreateSnooze": { "methods": [ "CreateSnooze" ] }, "GetSnooze": { "methods": [ "GetSnooze" ] }, "ListSnoozes": { "methods": [ "ListSnoozes" ] }, "UpdateSnooze": { "methods": [ "UpdateSnooze" ] } } } } }, "UptimeCheckService": { "clients": { "grpc": { "libraryClient": "UptimeCheckClient", "rpcs": { "CreateUptimeCheckConfig": { "methods": [ "CreateUptimeCheckConfig" ] }, "DeleteUptimeCheckConfig": { "methods": [ "DeleteUptimeCheckConfig" ] }, "GetUptimeCheckConfig": { "methods": [ "GetUptimeCheckConfig" ] }, "ListUptimeCheckConfigs": { "methods": [ "ListUptimeCheckConfigs" ] }, "ListUptimeCheckIps": { "methods": [ "ListUptimeCheckIps" ] }, "UpdateUptimeCheckConfig": { "methods": [ "UpdateUptimeCheckConfig" ] } } } } } } } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/group_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "fmt" "log/slog" "math" "net/url" "time" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/protobuf/proto" ) var newGroupClientHook clientHook // GroupCallOptions contains the retry settings for each method of GroupClient. type GroupCallOptions struct { ListGroups []gax.CallOption GetGroup []gax.CallOption CreateGroup []gax.CallOption UpdateGroup []gax.CallOption DeleteGroup []gax.CallOption ListGroupMembers []gax.CallOption } func defaultGroupGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultGroupCallOptions() *GroupCallOptions { return &GroupCallOptions{ ListGroups: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, GetGroup: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, CreateGroup: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, UpdateGroup: []gax.CallOption{ gax.WithTimeout(180000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, DeleteGroup: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, ListGroupMembers: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, } } // internalGroupClient is an interface that defines the methods available from Cloud Monitoring API. type internalGroupClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn ListGroups(context.Context, *monitoringpb.ListGroupsRequest, ...gax.CallOption) *GroupIterator GetGroup(context.Context, *monitoringpb.GetGroupRequest, ...gax.CallOption) (*monitoringpb.Group, error) CreateGroup(context.Context, *monitoringpb.CreateGroupRequest, ...gax.CallOption) (*monitoringpb.Group, error) UpdateGroup(context.Context, *monitoringpb.UpdateGroupRequest, ...gax.CallOption) (*monitoringpb.Group, error) DeleteGroup(context.Context, *monitoringpb.DeleteGroupRequest, ...gax.CallOption) error ListGroupMembers(context.Context, *monitoringpb.ListGroupMembersRequest, ...gax.CallOption) *MonitoredResourceIterator } // GroupClient is a client for interacting with Cloud Monitoring API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // The Group API lets you inspect and manage your // groups (at #google.monitoring.v3.Group). // // A group is a named filter that is used to identify // a collection of monitored resources. Groups are typically used to // mirror the physical and/or logical topology of the environment. // Because group membership is computed dynamically, monitored // resources that are started in the future are automatically placed // in matching groups. By using a group to name monitored resources in, // for example, an alert policy, the target of that alert policy is // updated automatically as monitored resources are added and removed // from the infrastructure. type GroupClient struct { // The internal transport-dependent client. internalClient internalGroupClient // The call options for this service. CallOptions *GroupCallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *GroupClient) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *GroupClient) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *GroupClient) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // ListGroups lists the existing groups. func (c *GroupClient) ListGroups(ctx context.Context, req *monitoringpb.ListGroupsRequest, opts ...gax.CallOption) *GroupIterator { return c.internalClient.ListGroups(ctx, req, opts...) } // GetGroup gets a single group. func (c *GroupClient) GetGroup(ctx context.Context, req *monitoringpb.GetGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { return c.internalClient.GetGroup(ctx, req, opts...) } // CreateGroup creates a new group. func (c *GroupClient) CreateGroup(ctx context.Context, req *monitoringpb.CreateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { return c.internalClient.CreateGroup(ctx, req, opts...) } // UpdateGroup updates an existing group. // You can change any group attributes except name. func (c *GroupClient) UpdateGroup(ctx context.Context, req *monitoringpb.UpdateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { return c.internalClient.UpdateGroup(ctx, req, opts...) } // DeleteGroup deletes an existing group. func (c *GroupClient) DeleteGroup(ctx context.Context, req *monitoringpb.DeleteGroupRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteGroup(ctx, req, opts...) } // ListGroupMembers lists the monitored resources that are members of a group. func (c *GroupClient) ListGroupMembers(ctx context.Context, req *monitoringpb.ListGroupMembersRequest, opts ...gax.CallOption) *MonitoredResourceIterator { return c.internalClient.ListGroupMembers(ctx, req, opts...) } // groupGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type groupGRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing GroupClient CallOptions **GroupCallOptions // The gRPC API client. groupClient monitoringpb.GroupServiceClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewGroupClient creates a new group service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // The Group API lets you inspect and manage your // groups (at #google.monitoring.v3.Group). // // A group is a named filter that is used to identify // a collection of monitored resources. Groups are typically used to // mirror the physical and/or logical topology of the environment. // Because group membership is computed dynamically, monitored // resources that are started in the future are automatically placed // in matching groups. By using a group to name monitored resources in, // for example, an alert policy, the target of that alert policy is // updated automatically as monitored resources are added and removed // from the infrastructure. func NewGroupClient(ctx context.Context, opts ...option.ClientOption) (*GroupClient, error) { clientOpts := defaultGroupGRPCClientOptions() if newGroupClientHook != nil { hookOpts, err := newGroupClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := GroupClient{CallOptions: defaultGroupCallOptions()} c := &groupGRPCClient{ connPool: connPool, groupClient: monitoringpb.NewGroupServiceClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *groupGRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *groupGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *groupGRPCClient) Close() error { return c.connPool.Close() } func (c *groupGRPCClient) ListGroups(ctx context.Context, req *monitoringpb.ListGroupsRequest, opts ...gax.CallOption) *GroupIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListGroups[0:len((*c.CallOptions).ListGroups):len((*c.CallOptions).ListGroups)], opts...) it := &GroupIterator{} req = proto.Clone(req).(*monitoringpb.ListGroupsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.Group, string, error) { resp := &monitoringpb.ListGroupsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.groupClient.ListGroups, req, settings.GRPC, c.logger, "ListGroups") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetGroup(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *groupGRPCClient) GetGroup(ctx context.Context, req *monitoringpb.GetGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetGroup[0:len((*c.CallOptions).GetGroup):len((*c.CallOptions).GetGroup)], opts...) var resp *monitoringpb.Group err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.groupClient.GetGroup, req, settings.GRPC, c.logger, "GetGroup") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *groupGRPCClient) CreateGroup(ctx context.Context, req *monitoringpb.CreateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateGroup[0:len((*c.CallOptions).CreateGroup):len((*c.CallOptions).CreateGroup)], opts...) var resp *monitoringpb.Group err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.groupClient.CreateGroup, req, settings.GRPC, c.logger, "CreateGroup") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *groupGRPCClient) UpdateGroup(ctx context.Context, req *monitoringpb.UpdateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "group.name", url.QueryEscape(req.GetGroup().GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateGroup[0:len((*c.CallOptions).UpdateGroup):len((*c.CallOptions).UpdateGroup)], opts...) var resp *monitoringpb.Group err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.groupClient.UpdateGroup, req, settings.GRPC, c.logger, "UpdateGroup") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *groupGRPCClient) DeleteGroup(ctx context.Context, req *monitoringpb.DeleteGroupRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteGroup[0:len((*c.CallOptions).DeleteGroup):len((*c.CallOptions).DeleteGroup)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.groupClient.DeleteGroup, req, settings.GRPC, c.logger, "DeleteGroup") return err }, opts...) return err } func (c *groupGRPCClient) ListGroupMembers(ctx context.Context, req *monitoringpb.ListGroupMembersRequest, opts ...gax.CallOption) *MonitoredResourceIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListGroupMembers[0:len((*c.CallOptions).ListGroupMembers):len((*c.CallOptions).ListGroupMembers)], opts...) it := &MonitoredResourceIterator{} req = proto.Clone(req).(*monitoringpb.ListGroupMembersRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResource, string, error) { resp := &monitoringpb.ListGroupMembersResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.groupClient.ListGroupMembers, req, settings.GRPC, c.logger, "ListGroupMembers") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetMembers(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/helpers.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "log/slog" "github.com/googleapis/gax-go/v2/internallog/grpclog" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/protobuf/proto" ) const serviceName = "monitoring.googleapis.com" // For more information on implementing a client constructor hook, see // https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors. type clientHookParams struct{} type clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error) var versionClient string func getVersionClient() string { if versionClient == "" { return "UNKNOWN" } return versionClient } // DefaultAuthScopes reports the default set of authentication scopes to use with this package. func DefaultAuthScopes() []string { return []string{ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/monitoring", "https://www.googleapis.com/auth/monitoring.read", "https://www.googleapis.com/auth/monitoring.write", } } func executeRPC[I proto.Message, O proto.Message](ctx context.Context, fn func(context.Context, I, ...grpc.CallOption) (O, error), req I, opts []grpc.CallOption, logger *slog.Logger, rpc string) (O, error) { var zero O logger.DebugContext(ctx, "api request", "serviceName", serviceName, "rpcName", rpc, "request", grpclog.ProtoMessageRequest(ctx, req)) resp, err := fn(ctx, req, opts...) if err != nil { return zero, err } logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", grpclog.ProtoMessageResponse(resp)) return resp, err } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/metric_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "fmt" "log/slog" "math" "net/url" "time" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" metricpb "google.golang.org/genproto/googleapis/api/metric" monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/protobuf/proto" ) var newMetricClientHook clientHook // MetricCallOptions contains the retry settings for each method of MetricClient. type MetricCallOptions struct { ListMonitoredResourceDescriptors []gax.CallOption GetMonitoredResourceDescriptor []gax.CallOption ListMetricDescriptors []gax.CallOption GetMetricDescriptor []gax.CallOption CreateMetricDescriptor []gax.CallOption DeleteMetricDescriptor []gax.CallOption ListTimeSeries []gax.CallOption CreateTimeSeries []gax.CallOption CreateServiceTimeSeries []gax.CallOption } func defaultMetricGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultMetricCallOptions() *MetricCallOptions { return &MetricCallOptions{ ListMonitoredResourceDescriptors: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, GetMonitoredResourceDescriptor: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, ListMetricDescriptors: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, GetMetricDescriptor: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, CreateMetricDescriptor: []gax.CallOption{ gax.WithTimeout(12000 * time.Millisecond), }, DeleteMetricDescriptor: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, ListTimeSeries: []gax.CallOption{ gax.WithTimeout(90000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, CreateTimeSeries: []gax.CallOption{ gax.WithTimeout(12000 * time.Millisecond), }, CreateServiceTimeSeries: []gax.CallOption{}, } } // internalMetricClient is an interface that defines the methods available from Cloud Monitoring API. type internalMetricClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn ListMonitoredResourceDescriptors(context.Context, *monitoringpb.ListMonitoredResourceDescriptorsRequest, ...gax.CallOption) *MonitoredResourceDescriptorIterator GetMonitoredResourceDescriptor(context.Context, *monitoringpb.GetMonitoredResourceDescriptorRequest, ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error) ListMetricDescriptors(context.Context, *monitoringpb.ListMetricDescriptorsRequest, ...gax.CallOption) *MetricDescriptorIterator GetMetricDescriptor(context.Context, *monitoringpb.GetMetricDescriptorRequest, ...gax.CallOption) (*metricpb.MetricDescriptor, error) CreateMetricDescriptor(context.Context, *monitoringpb.CreateMetricDescriptorRequest, ...gax.CallOption) (*metricpb.MetricDescriptor, error) DeleteMetricDescriptor(context.Context, *monitoringpb.DeleteMetricDescriptorRequest, ...gax.CallOption) error ListTimeSeries(context.Context, *monitoringpb.ListTimeSeriesRequest, ...gax.CallOption) *TimeSeriesIterator CreateTimeSeries(context.Context, *monitoringpb.CreateTimeSeriesRequest, ...gax.CallOption) error CreateServiceTimeSeries(context.Context, *monitoringpb.CreateTimeSeriesRequest, ...gax.CallOption) error } // MetricClient is a client for interacting with Cloud Monitoring API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // Manages metric descriptors, monitored resource descriptors, and // time series data. type MetricClient struct { // The internal transport-dependent client. internalClient internalMetricClient // The call options for this service. CallOptions *MetricCallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *MetricClient) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *MetricClient) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *MetricClient) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // ListMonitoredResourceDescriptors lists monitored resource descriptors that match a filter. func (c *MetricClient) ListMonitoredResourceDescriptors(ctx context.Context, req *monitoringpb.ListMonitoredResourceDescriptorsRequest, opts ...gax.CallOption) *MonitoredResourceDescriptorIterator { return c.internalClient.ListMonitoredResourceDescriptors(ctx, req, opts...) } // GetMonitoredResourceDescriptor gets a single monitored resource descriptor. func (c *MetricClient) GetMonitoredResourceDescriptor(ctx context.Context, req *monitoringpb.GetMonitoredResourceDescriptorRequest, opts ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error) { return c.internalClient.GetMonitoredResourceDescriptor(ctx, req, opts...) } // ListMetricDescriptors lists metric descriptors that match a filter. func (c *MetricClient) ListMetricDescriptors(ctx context.Context, req *monitoringpb.ListMetricDescriptorsRequest, opts ...gax.CallOption) *MetricDescriptorIterator { return c.internalClient.ListMetricDescriptors(ctx, req, opts...) } // GetMetricDescriptor gets a single metric descriptor. func (c *MetricClient) GetMetricDescriptor(ctx context.Context, req *monitoringpb.GetMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) { return c.internalClient.GetMetricDescriptor(ctx, req, opts...) } // CreateMetricDescriptor creates a new metric descriptor. // The creation is executed asynchronously. // User-created metric descriptors define // custom metrics (at https://cloud.google.com/monitoring/custom-metrics). // The metric descriptor is updated if it already exists, // except that metric labels are never removed. func (c *MetricClient) CreateMetricDescriptor(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) { return c.internalClient.CreateMetricDescriptor(ctx, req, opts...) } // DeleteMetricDescriptor deletes a metric descriptor. Only user-created // custom metrics (at https://cloud.google.com/monitoring/custom-metrics) can be // deleted. func (c *MetricClient) DeleteMetricDescriptor(ctx context.Context, req *monitoringpb.DeleteMetricDescriptorRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteMetricDescriptor(ctx, req, opts...) } // ListTimeSeries lists time series that match a filter. func (c *MetricClient) ListTimeSeries(ctx context.Context, req *monitoringpb.ListTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesIterator { return c.internalClient.ListTimeSeries(ctx, req, opts...) } // CreateTimeSeries creates or adds data to one or more time series. // The response is empty if all time series in the request were written. // If any time series could not be written, a corresponding failure message is // included in the error response. // This method does not support // resource locations constraint of an organization // policy (at https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy). func (c *MetricClient) CreateTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error { return c.internalClient.CreateTimeSeries(ctx, req, opts...) } // CreateServiceTimeSeries creates or adds data to one or more service time series. A service time // series is a time series for a metric from a Google Cloud service. The // response is empty if all time series in the request were written. If any // time series could not be written, a corresponding failure message is // included in the error response. This endpoint rejects writes to // user-defined metrics. // This method is only for use by Google Cloud services. Use // projects.timeSeries.create // instead. func (c *MetricClient) CreateServiceTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error { return c.internalClient.CreateServiceTimeSeries(ctx, req, opts...) } // metricGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type metricGRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing MetricClient CallOptions **MetricCallOptions // The gRPC API client. metricClient monitoringpb.MetricServiceClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewMetricClient creates a new metric service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // Manages metric descriptors, monitored resource descriptors, and // time series data. func NewMetricClient(ctx context.Context, opts ...option.ClientOption) (*MetricClient, error) { clientOpts := defaultMetricGRPCClientOptions() if newMetricClientHook != nil { hookOpts, err := newMetricClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := MetricClient{CallOptions: defaultMetricCallOptions()} c := &metricGRPCClient{ connPool: connPool, metricClient: monitoringpb.NewMetricServiceClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *metricGRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *metricGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *metricGRPCClient) Close() error { return c.connPool.Close() } func (c *metricGRPCClient) ListMonitoredResourceDescriptors(ctx context.Context, req *monitoringpb.ListMonitoredResourceDescriptorsRequest, opts ...gax.CallOption) *MonitoredResourceDescriptorIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListMonitoredResourceDescriptors[0:len((*c.CallOptions).ListMonitoredResourceDescriptors):len((*c.CallOptions).ListMonitoredResourceDescriptors)], opts...) it := &MonitoredResourceDescriptorIterator{} req = proto.Clone(req).(*monitoringpb.ListMonitoredResourceDescriptorsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResourceDescriptor, string, error) { resp := &monitoringpb.ListMonitoredResourceDescriptorsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.metricClient.ListMonitoredResourceDescriptors, req, settings.GRPC, c.logger, "ListMonitoredResourceDescriptors") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetResourceDescriptors(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *metricGRPCClient) GetMonitoredResourceDescriptor(ctx context.Context, req *monitoringpb.GetMonitoredResourceDescriptorRequest, opts ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetMonitoredResourceDescriptor[0:len((*c.CallOptions).GetMonitoredResourceDescriptor):len((*c.CallOptions).GetMonitoredResourceDescriptor)], opts...) var resp *monitoredrespb.MonitoredResourceDescriptor err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.metricClient.GetMonitoredResourceDescriptor, req, settings.GRPC, c.logger, "GetMonitoredResourceDescriptor") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *metricGRPCClient) ListMetricDescriptors(ctx context.Context, req *monitoringpb.ListMetricDescriptorsRequest, opts ...gax.CallOption) *MetricDescriptorIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListMetricDescriptors[0:len((*c.CallOptions).ListMetricDescriptors):len((*c.CallOptions).ListMetricDescriptors)], opts...) it := &MetricDescriptorIterator{} req = proto.Clone(req).(*monitoringpb.ListMetricDescriptorsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*metricpb.MetricDescriptor, string, error) { resp := &monitoringpb.ListMetricDescriptorsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.metricClient.ListMetricDescriptors, req, settings.GRPC, c.logger, "ListMetricDescriptors") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetMetricDescriptors(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *metricGRPCClient) GetMetricDescriptor(ctx context.Context, req *monitoringpb.GetMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetMetricDescriptor[0:len((*c.CallOptions).GetMetricDescriptor):len((*c.CallOptions).GetMetricDescriptor)], opts...) var resp *metricpb.MetricDescriptor err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.metricClient.GetMetricDescriptor, req, settings.GRPC, c.logger, "GetMetricDescriptor") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *metricGRPCClient) CreateMetricDescriptor(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateMetricDescriptor[0:len((*c.CallOptions).CreateMetricDescriptor):len((*c.CallOptions).CreateMetricDescriptor)], opts...) var resp *metricpb.MetricDescriptor err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.metricClient.CreateMetricDescriptor, req, settings.GRPC, c.logger, "CreateMetricDescriptor") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *metricGRPCClient) DeleteMetricDescriptor(ctx context.Context, req *monitoringpb.DeleteMetricDescriptorRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteMetricDescriptor[0:len((*c.CallOptions).DeleteMetricDescriptor):len((*c.CallOptions).DeleteMetricDescriptor)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.metricClient.DeleteMetricDescriptor, req, settings.GRPC, c.logger, "DeleteMetricDescriptor") return err }, opts...) return err } func (c *metricGRPCClient) ListTimeSeries(ctx context.Context, req *monitoringpb.ListTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListTimeSeries[0:len((*c.CallOptions).ListTimeSeries):len((*c.CallOptions).ListTimeSeries)], opts...) it := &TimeSeriesIterator{} req = proto.Clone(req).(*monitoringpb.ListTimeSeriesRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.TimeSeries, string, error) { resp := &monitoringpb.ListTimeSeriesResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.metricClient.ListTimeSeries, req, settings.GRPC, c.logger, "ListTimeSeries") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetTimeSeries(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *metricGRPCClient) CreateTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateTimeSeries[0:len((*c.CallOptions).CreateTimeSeries):len((*c.CallOptions).CreateTimeSeries)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.metricClient.CreateTimeSeries, req, settings.GRPC, c.logger, "CreateTimeSeries") return err }, opts...) return err } func (c *metricGRPCClient) CreateServiceTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateServiceTimeSeries[0:len((*c.CallOptions).CreateServiceTimeSeries):len((*c.CallOptions).CreateServiceTimeSeries)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.metricClient.CreateServiceTimeSeries, req, settings.GRPC, c.logger, "CreateServiceTimeSeries") return err }, opts...) return err } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/alert.proto package monitoringpb import ( reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" status "google.golang.org/genproto/googleapis/rpc/status" timeofday "google.golang.org/genproto/googleapis/type/timeofday" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Operators for combining conditions. type AlertPolicy_ConditionCombinerType int32 const ( // An unspecified combiner. AlertPolicy_COMBINE_UNSPECIFIED AlertPolicy_ConditionCombinerType = 0 // Combine conditions using the logical `AND` operator. An // incident is created only if all the conditions are met // simultaneously. This combiner is satisfied if all conditions are // met, even if they are met on completely different resources. AlertPolicy_AND AlertPolicy_ConditionCombinerType = 1 // Combine conditions using the logical `OR` operator. An incident // is created if any of the listed conditions is met. AlertPolicy_OR AlertPolicy_ConditionCombinerType = 2 // Combine conditions using logical `AND` operator, but unlike the regular // `AND` option, an incident is created only if all conditions are met // simultaneously on at least one resource. AlertPolicy_AND_WITH_MATCHING_RESOURCE AlertPolicy_ConditionCombinerType = 3 ) // Enum value maps for AlertPolicy_ConditionCombinerType. var ( AlertPolicy_ConditionCombinerType_name = map[int32]string{ 0: "COMBINE_UNSPECIFIED", 1: "AND", 2: "OR", 3: "AND_WITH_MATCHING_RESOURCE", } AlertPolicy_ConditionCombinerType_value = map[string]int32{ "COMBINE_UNSPECIFIED": 0, "AND": 1, "OR": 2, "AND_WITH_MATCHING_RESOURCE": 3, } ) func (x AlertPolicy_ConditionCombinerType) Enum() *AlertPolicy_ConditionCombinerType { p := new(AlertPolicy_ConditionCombinerType) *p = x return p } func (x AlertPolicy_ConditionCombinerType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AlertPolicy_ConditionCombinerType) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_alert_proto_enumTypes[0].Descriptor() } func (AlertPolicy_ConditionCombinerType) Type() protoreflect.EnumType { return &file_google_monitoring_v3_alert_proto_enumTypes[0] } func (x AlertPolicy_ConditionCombinerType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AlertPolicy_ConditionCombinerType.Descriptor instead. func (AlertPolicy_ConditionCombinerType) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 0} } // An enumeration of possible severity level for an alerting policy. type AlertPolicy_Severity int32 const ( // No severity is specified. This is the default value. AlertPolicy_SEVERITY_UNSPECIFIED AlertPolicy_Severity = 0 // This is the highest severity level. Use this if the problem could // cause significant damage or downtime. AlertPolicy_CRITICAL AlertPolicy_Severity = 1 // This is the medium severity level. Use this if the problem could // cause minor damage or downtime. AlertPolicy_ERROR AlertPolicy_Severity = 2 // This is the lowest severity level. Use this if the problem is not causing // any damage or downtime, but could potentially lead to a problem in the // future. AlertPolicy_WARNING AlertPolicy_Severity = 3 ) // Enum value maps for AlertPolicy_Severity. var ( AlertPolicy_Severity_name = map[int32]string{ 0: "SEVERITY_UNSPECIFIED", 1: "CRITICAL", 2: "ERROR", 3: "WARNING", } AlertPolicy_Severity_value = map[string]int32{ "SEVERITY_UNSPECIFIED": 0, "CRITICAL": 1, "ERROR": 2, "WARNING": 3, } ) func (x AlertPolicy_Severity) Enum() *AlertPolicy_Severity { p := new(AlertPolicy_Severity) *p = x return p } func (x AlertPolicy_Severity) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AlertPolicy_Severity) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_alert_proto_enumTypes[1].Descriptor() } func (AlertPolicy_Severity) Type() protoreflect.EnumType { return &file_google_monitoring_v3_alert_proto_enumTypes[1] } func (x AlertPolicy_Severity) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AlertPolicy_Severity.Descriptor instead. func (AlertPolicy_Severity) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1} } // A condition control that determines how metric-threshold conditions // are evaluated when data stops arriving. // This control doesn't affect metric-absence policies. type AlertPolicy_Condition_EvaluationMissingData int32 const ( // An unspecified evaluation missing data option. Equivalent to // EVALUATION_MISSING_DATA_NO_OP. AlertPolicy_Condition_EVALUATION_MISSING_DATA_UNSPECIFIED AlertPolicy_Condition_EvaluationMissingData = 0 // If there is no data to evaluate the condition, then evaluate the // condition as false. AlertPolicy_Condition_EVALUATION_MISSING_DATA_INACTIVE AlertPolicy_Condition_EvaluationMissingData = 1 // If there is no data to evaluate the condition, then evaluate the // condition as true. AlertPolicy_Condition_EVALUATION_MISSING_DATA_ACTIVE AlertPolicy_Condition_EvaluationMissingData = 2 // Do not evaluate the condition to any value if there is no data. AlertPolicy_Condition_EVALUATION_MISSING_DATA_NO_OP AlertPolicy_Condition_EvaluationMissingData = 3 ) // Enum value maps for AlertPolicy_Condition_EvaluationMissingData. var ( AlertPolicy_Condition_EvaluationMissingData_name = map[int32]string{ 0: "EVALUATION_MISSING_DATA_UNSPECIFIED", 1: "EVALUATION_MISSING_DATA_INACTIVE", 2: "EVALUATION_MISSING_DATA_ACTIVE", 3: "EVALUATION_MISSING_DATA_NO_OP", } AlertPolicy_Condition_EvaluationMissingData_value = map[string]int32{ "EVALUATION_MISSING_DATA_UNSPECIFIED": 0, "EVALUATION_MISSING_DATA_INACTIVE": 1, "EVALUATION_MISSING_DATA_ACTIVE": 2, "EVALUATION_MISSING_DATA_NO_OP": 3, } ) func (x AlertPolicy_Condition_EvaluationMissingData) Enum() *AlertPolicy_Condition_EvaluationMissingData { p := new(AlertPolicy_Condition_EvaluationMissingData) *p = x return p } func (x AlertPolicy_Condition_EvaluationMissingData) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AlertPolicy_Condition_EvaluationMissingData) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_alert_proto_enumTypes[2].Descriptor() } func (AlertPolicy_Condition_EvaluationMissingData) Type() protoreflect.EnumType { return &file_google_monitoring_v3_alert_proto_enumTypes[2] } func (x AlertPolicy_Condition_EvaluationMissingData) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AlertPolicy_Condition_EvaluationMissingData.Descriptor instead. func (AlertPolicy_Condition_EvaluationMissingData) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 0} } // Control when notifications will be sent out. type AlertPolicy_AlertStrategy_NotificationPrompt int32 const ( // No strategy specified. Treated as error. AlertPolicy_AlertStrategy_NOTIFICATION_PROMPT_UNSPECIFIED AlertPolicy_AlertStrategy_NotificationPrompt = 0 // Notify when an incident is opened. AlertPolicy_AlertStrategy_OPENED AlertPolicy_AlertStrategy_NotificationPrompt = 1 // Notify when an incident is closed. AlertPolicy_AlertStrategy_CLOSED AlertPolicy_AlertStrategy_NotificationPrompt = 3 ) // Enum value maps for AlertPolicy_AlertStrategy_NotificationPrompt. var ( AlertPolicy_AlertStrategy_NotificationPrompt_name = map[int32]string{ 0: "NOTIFICATION_PROMPT_UNSPECIFIED", 1: "OPENED", 3: "CLOSED", } AlertPolicy_AlertStrategy_NotificationPrompt_value = map[string]int32{ "NOTIFICATION_PROMPT_UNSPECIFIED": 0, "OPENED": 1, "CLOSED": 3, } ) func (x AlertPolicy_AlertStrategy_NotificationPrompt) Enum() *AlertPolicy_AlertStrategy_NotificationPrompt { p := new(AlertPolicy_AlertStrategy_NotificationPrompt) *p = x return p } func (x AlertPolicy_AlertStrategy_NotificationPrompt) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AlertPolicy_AlertStrategy_NotificationPrompt) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_alert_proto_enumTypes[3].Descriptor() } func (AlertPolicy_AlertStrategy_NotificationPrompt) Type() protoreflect.EnumType { return &file_google_monitoring_v3_alert_proto_enumTypes[3] } func (x AlertPolicy_AlertStrategy_NotificationPrompt) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AlertPolicy_AlertStrategy_NotificationPrompt.Descriptor instead. func (AlertPolicy_AlertStrategy_NotificationPrompt) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 2, 0} } // A description of the conditions under which some aspect of your system is // considered to be "unhealthy" and the ways to notify people or services about // this state. For an overview of alerting policies, see // [Introduction to Alerting](https://cloud.google.com/monitoring/alerts/). type AlertPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Identifier. Required if the policy exists. The resource name for this // policy. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID] // // `[ALERT_POLICY_ID]` is assigned by Cloud Monitoring when the policy // is created. When calling the // [alertPolicies.create][google.monitoring.v3.AlertPolicyService.CreateAlertPolicy] // method, do not include the `name` field in the alerting policy passed as // part of the request. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // A short name or phrase used to identify the policy in dashboards, // notifications, and incidents. To avoid confusion, don't use the same // display name for multiple policies in the same project. The name is // limited to 512 Unicode characters. // // The convention for the display_name of a PrometheusQueryLanguageCondition // is "{rule group name}/{alert name}", where the {rule group name} and // {alert name} should be taken from the corresponding Prometheus // configuration file. This convention is not enforced. // In any case the display_name is not a unique key of the AlertPolicy. DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // Documentation that is included with notifications and incidents related to // this policy. Best practice is for the documentation to include information // to help responders understand, mitigate, escalate, and correct the // underlying problems detected by the alerting policy. Notification channels // that have limited capacity might not show this documentation. Documentation *AlertPolicy_Documentation `protobuf:"bytes,13,opt,name=documentation,proto3" json:"documentation,omitempty"` // User-supplied key/value data to be used for organizing and // identifying the `AlertPolicy` objects. // // The field can contain up to 64 entries. Each key and value is limited to // 63 Unicode characters or 128 bytes, whichever is smaller. Labels and // values can contain only lowercase letters, numerals, underscores, and // dashes. Keys must begin with a letter. // // Note that Prometheus {alert name} is a // [valid Prometheus label // names](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels), // whereas Prometheus {rule group} is an unrestricted UTF-8 string. // This means that they cannot be stored as-is in user labels, because // they may contain characters that are not allowed in user-label values. UserLabels map[string]string `protobuf:"bytes,16,rep,name=user_labels,json=userLabels,proto3" json:"user_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // A list of conditions for the policy. The conditions are combined by AND or // OR according to the `combiner` field. If the combined conditions evaluate // to true, then an incident is created. A policy can have from one to six // conditions. // If `condition_time_series_query_language` is present, it must be the only // `condition`. // If `condition_monitoring_query_language` is present, it must be the only // `condition`. Conditions []*AlertPolicy_Condition `protobuf:"bytes,12,rep,name=conditions,proto3" json:"conditions,omitempty"` // How to combine the results of multiple conditions to determine if an // incident should be opened. // If `condition_time_series_query_language` is present, this must be // `COMBINE_UNSPECIFIED`. Combiner AlertPolicy_ConditionCombinerType `protobuf:"varint,6,opt,name=combiner,proto3,enum=google.monitoring.v3.AlertPolicy_ConditionCombinerType" json:"combiner,omitempty"` // Whether or not the policy is enabled. On write, the default interpretation // if unset is that the policy is enabled. On read, clients should not make // any assumption about the state if it has not been populated. The // field should always be populated on List and Get operations, unless // a field projection has been specified that strips it out. Enabled *wrapperspb.BoolValue `protobuf:"bytes,17,opt,name=enabled,proto3" json:"enabled,omitempty"` // Read-only description of how the alerting policy is invalid. This field is // only set when the alerting policy is invalid. An invalid alerting policy // will not generate incidents. Validity *status.Status `protobuf:"bytes,18,opt,name=validity,proto3" json:"validity,omitempty"` // Identifies the notification channels to which notifications should be sent // when incidents are opened or closed or when new violations occur on // an already opened incident. Each element of this array corresponds to // the `name` field in each of the // [`NotificationChannel`][google.monitoring.v3.NotificationChannel] // objects that are returned from the [`ListNotificationChannels`] // [google.monitoring.v3.NotificationChannelService.ListNotificationChannels] // method. The format of the entries in this field is: // // projects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID] NotificationChannels []string `protobuf:"bytes,14,rep,name=notification_channels,json=notificationChannels,proto3" json:"notification_channels,omitempty"` // A read-only record of the creation of the alerting policy. If provided // in a call to create or update, this field will be ignored. CreationRecord *MutationRecord `protobuf:"bytes,10,opt,name=creation_record,json=creationRecord,proto3" json:"creation_record,omitempty"` // A read-only record of the most recent change to the alerting policy. If // provided in a call to create or update, this field will be ignored. MutationRecord *MutationRecord `protobuf:"bytes,11,opt,name=mutation_record,json=mutationRecord,proto3" json:"mutation_record,omitempty"` // Control over how this alerting policy's notification channels are notified. AlertStrategy *AlertPolicy_AlertStrategy `protobuf:"bytes,21,opt,name=alert_strategy,json=alertStrategy,proto3" json:"alert_strategy,omitempty"` // Optional. The severity of an alerting policy indicates how important // incidents generated by that policy are. The severity level will be // displayed on the Incident detail page and in notifications. Severity AlertPolicy_Severity `protobuf:"varint,22,opt,name=severity,proto3,enum=google.monitoring.v3.AlertPolicy_Severity" json:"severity,omitempty"` } func (x *AlertPolicy) Reset() { *x = AlertPolicy{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy) ProtoMessage() {} func (x *AlertPolicy) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy.ProtoReflect.Descriptor instead. func (*AlertPolicy) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0} } func (x *AlertPolicy) GetName() string { if x != nil { return x.Name } return "" } func (x *AlertPolicy) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (x *AlertPolicy) GetDocumentation() *AlertPolicy_Documentation { if x != nil { return x.Documentation } return nil } func (x *AlertPolicy) GetUserLabels() map[string]string { if x != nil { return x.UserLabels } return nil } func (x *AlertPolicy) GetConditions() []*AlertPolicy_Condition { if x != nil { return x.Conditions } return nil } func (x *AlertPolicy) GetCombiner() AlertPolicy_ConditionCombinerType { if x != nil { return x.Combiner } return AlertPolicy_COMBINE_UNSPECIFIED } func (x *AlertPolicy) GetEnabled() *wrapperspb.BoolValue { if x != nil { return x.Enabled } return nil } func (x *AlertPolicy) GetValidity() *status.Status { if x != nil { return x.Validity } return nil } func (x *AlertPolicy) GetNotificationChannels() []string { if x != nil { return x.NotificationChannels } return nil } func (x *AlertPolicy) GetCreationRecord() *MutationRecord { if x != nil { return x.CreationRecord } return nil } func (x *AlertPolicy) GetMutationRecord() *MutationRecord { if x != nil { return x.MutationRecord } return nil } func (x *AlertPolicy) GetAlertStrategy() *AlertPolicy_AlertStrategy { if x != nil { return x.AlertStrategy } return nil } func (x *AlertPolicy) GetSeverity() AlertPolicy_Severity { if x != nil { return x.Severity } return AlertPolicy_SEVERITY_UNSPECIFIED } // Documentation that is included in the notifications and incidents // pertaining to this policy. type AlertPolicy_Documentation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The body of the documentation, interpreted according to `mime_type`. // The content may not exceed 8,192 Unicode characters and may not exceed // more than 10,240 bytes when encoded in UTF-8 format, whichever is // smaller. This text can be [templatized by using // variables](https://cloud.google.com/monitoring/alerts/doc-variables#doc-vars). Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` // The format of the `content` field. Presently, only the value // `"text/markdown"` is supported. See // [Markdown](https://en.wikipedia.org/wiki/Markdown) for more information. MimeType string `protobuf:"bytes,2,opt,name=mime_type,json=mimeType,proto3" json:"mime_type,omitempty"` // Optional. The subject line of the notification. The subject line may not // exceed 10,240 bytes. In notifications generated by this policy, the // contents of the subject line after variable expansion will be truncated // to 255 bytes or shorter at the latest UTF-8 character boundary. The // 255-byte limit is recommended by [this // thread](https://stackoverflow.com/questions/1592291/what-is-the-email-subject-length-limit). // It is both the limit imposed by some third-party ticketing products and // it is common to define textual fields in databases as VARCHAR(255). // // The contents of the subject line can be [templatized by using // variables](https://cloud.google.com/monitoring/alerts/doc-variables#doc-vars). // If this field is missing or empty, a default subject line will be // generated. Subject string `protobuf:"bytes,3,opt,name=subject,proto3" json:"subject,omitempty"` // Optional. Links to content such as playbooks, repositories, and other // resources. This field can contain up to 3 entries. Links []*AlertPolicy_Documentation_Link `protobuf:"bytes,4,rep,name=links,proto3" json:"links,omitempty"` } func (x *AlertPolicy_Documentation) Reset() { *x = AlertPolicy_Documentation{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Documentation) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Documentation) ProtoMessage() {} func (x *AlertPolicy_Documentation) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Documentation.ProtoReflect.Descriptor instead. func (*AlertPolicy_Documentation) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 0} } func (x *AlertPolicy_Documentation) GetContent() string { if x != nil { return x.Content } return "" } func (x *AlertPolicy_Documentation) GetMimeType() string { if x != nil { return x.MimeType } return "" } func (x *AlertPolicy_Documentation) GetSubject() string { if x != nil { return x.Subject } return "" } func (x *AlertPolicy_Documentation) GetLinks() []*AlertPolicy_Documentation_Link { if x != nil { return x.Links } return nil } // A condition is a true/false test that determines when an alerting policy // should open an incident. If a condition evaluates to true, it signifies // that something is wrong. type AlertPolicy_Condition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required if the condition exists. The unique resource name for this // condition. Its format is: // // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[POLICY_ID]/conditions/[CONDITION_ID] // // `[CONDITION_ID]` is assigned by Cloud Monitoring when the // condition is created as part of a new or updated alerting policy. // // When calling the // [alertPolicies.create][google.monitoring.v3.AlertPolicyService.CreateAlertPolicy] // method, do not include the `name` field in the conditions of the // requested alerting policy. Cloud Monitoring creates the // condition identifiers and includes them in the new policy. // // When calling the // [alertPolicies.update][google.monitoring.v3.AlertPolicyService.UpdateAlertPolicy] // method to update a policy, including a condition `name` causes the // existing condition to be updated. Conditions without names are added to // the updated policy. Existing conditions are deleted if they are not // updated. // // Best practice is to preserve `[CONDITION_ID]` if you make only small // changes, such as those to condition thresholds, durations, or trigger // values. Otherwise, treat the change as a new condition and let the // existing condition be deleted. Name string `protobuf:"bytes,12,opt,name=name,proto3" json:"name,omitempty"` // A short name or phrase used to identify the condition in dashboards, // notifications, and incidents. To avoid confusion, don't use the same // display name for multiple conditions in the same policy. DisplayName string `protobuf:"bytes,6,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // Only one of the following condition types will be specified. // // Types that are assignable to Condition: // // *AlertPolicy_Condition_ConditionThreshold // *AlertPolicy_Condition_ConditionAbsent // *AlertPolicy_Condition_ConditionMatchedLog // *AlertPolicy_Condition_ConditionMonitoringQueryLanguage // *AlertPolicy_Condition_ConditionPrometheusQueryLanguage // *AlertPolicy_Condition_ConditionSql Condition isAlertPolicy_Condition_Condition `protobuf_oneof:"condition"` } func (x *AlertPolicy_Condition) Reset() { *x = AlertPolicy_Condition{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition) ProtoMessage() {} func (x *AlertPolicy_Condition) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1} } func (x *AlertPolicy_Condition) GetName() string { if x != nil { return x.Name } return "" } func (x *AlertPolicy_Condition) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (m *AlertPolicy_Condition) GetCondition() isAlertPolicy_Condition_Condition { if m != nil { return m.Condition } return nil } func (x *AlertPolicy_Condition) GetConditionThreshold() *AlertPolicy_Condition_MetricThreshold { if x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionThreshold); ok { return x.ConditionThreshold } return nil } func (x *AlertPolicy_Condition) GetConditionAbsent() *AlertPolicy_Condition_MetricAbsence { if x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionAbsent); ok { return x.ConditionAbsent } return nil } func (x *AlertPolicy_Condition) GetConditionMatchedLog() *AlertPolicy_Condition_LogMatch { if x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionMatchedLog); ok { return x.ConditionMatchedLog } return nil } func (x *AlertPolicy_Condition) GetConditionMonitoringQueryLanguage() *AlertPolicy_Condition_MonitoringQueryLanguageCondition { if x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionMonitoringQueryLanguage); ok { return x.ConditionMonitoringQueryLanguage } return nil } func (x *AlertPolicy_Condition) GetConditionPrometheusQueryLanguage() *AlertPolicy_Condition_PrometheusQueryLanguageCondition { if x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionPrometheusQueryLanguage); ok { return x.ConditionPrometheusQueryLanguage } return nil } func (x *AlertPolicy_Condition) GetConditionSql() *AlertPolicy_Condition_SqlCondition { if x, ok := x.GetCondition().(*AlertPolicy_Condition_ConditionSql); ok { return x.ConditionSql } return nil } type isAlertPolicy_Condition_Condition interface { isAlertPolicy_Condition_Condition() } type AlertPolicy_Condition_ConditionThreshold struct { // A condition that compares a time series against a threshold. ConditionThreshold *AlertPolicy_Condition_MetricThreshold `protobuf:"bytes,1,opt,name=condition_threshold,json=conditionThreshold,proto3,oneof"` } type AlertPolicy_Condition_ConditionAbsent struct { // A condition that checks that a time series continues to // receive new data points. ConditionAbsent *AlertPolicy_Condition_MetricAbsence `protobuf:"bytes,2,opt,name=condition_absent,json=conditionAbsent,proto3,oneof"` } type AlertPolicy_Condition_ConditionMatchedLog struct { // A condition that checks for log messages matching given constraints. If // set, no other conditions can be present. ConditionMatchedLog *AlertPolicy_Condition_LogMatch `protobuf:"bytes,20,opt,name=condition_matched_log,json=conditionMatchedLog,proto3,oneof"` } type AlertPolicy_Condition_ConditionMonitoringQueryLanguage struct { // A condition that uses the Monitoring Query Language to define // alerts. ConditionMonitoringQueryLanguage *AlertPolicy_Condition_MonitoringQueryLanguageCondition `protobuf:"bytes,19,opt,name=condition_monitoring_query_language,json=conditionMonitoringQueryLanguage,proto3,oneof"` } type AlertPolicy_Condition_ConditionPrometheusQueryLanguage struct { // A condition that uses the Prometheus query language to define alerts. ConditionPrometheusQueryLanguage *AlertPolicy_Condition_PrometheusQueryLanguageCondition `protobuf:"bytes,21,opt,name=condition_prometheus_query_language,json=conditionPrometheusQueryLanguage,proto3,oneof"` } type AlertPolicy_Condition_ConditionSql struct { // A condition that periodically evaluates a SQL query result. ConditionSql *AlertPolicy_Condition_SqlCondition `protobuf:"bytes,22,opt,name=condition_sql,json=conditionSql,proto3,oneof"` } func (*AlertPolicy_Condition_ConditionThreshold) isAlertPolicy_Condition_Condition() {} func (*AlertPolicy_Condition_ConditionAbsent) isAlertPolicy_Condition_Condition() {} func (*AlertPolicy_Condition_ConditionMatchedLog) isAlertPolicy_Condition_Condition() {} func (*AlertPolicy_Condition_ConditionMonitoringQueryLanguage) isAlertPolicy_Condition_Condition() {} func (*AlertPolicy_Condition_ConditionPrometheusQueryLanguage) isAlertPolicy_Condition_Condition() {} func (*AlertPolicy_Condition_ConditionSql) isAlertPolicy_Condition_Condition() {} // Control over how the notification channels in `notification_channels` // are notified when this alert fires. type AlertPolicy_AlertStrategy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required for log-based alerting policies, i.e. policies with a `LogMatch` // condition. // // This limit is not implemented for alerting policies that do not have // a LogMatch condition. NotificationRateLimit *AlertPolicy_AlertStrategy_NotificationRateLimit `protobuf:"bytes,1,opt,name=notification_rate_limit,json=notificationRateLimit,proto3" json:"notification_rate_limit,omitempty"` // For log-based alert policies, the notification prompts is always // [OPENED]. For non log-based alert policies, the notification prompts can // be [OPENED] or [OPENED, CLOSED]. NotificationPrompts []AlertPolicy_AlertStrategy_NotificationPrompt `protobuf:"varint,2,rep,packed,name=notification_prompts,json=notificationPrompts,proto3,enum=google.monitoring.v3.AlertPolicy_AlertStrategy_NotificationPrompt" json:"notification_prompts,omitempty"` // If an alerting policy that was active has no data for this long, any open // incidents will close AutoClose *durationpb.Duration `protobuf:"bytes,3,opt,name=auto_close,json=autoClose,proto3" json:"auto_close,omitempty"` // Control how notifications will be sent out, on a per-channel basis. NotificationChannelStrategy []*AlertPolicy_AlertStrategy_NotificationChannelStrategy `protobuf:"bytes,4,rep,name=notification_channel_strategy,json=notificationChannelStrategy,proto3" json:"notification_channel_strategy,omitempty"` } func (x *AlertPolicy_AlertStrategy) Reset() { *x = AlertPolicy_AlertStrategy{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_AlertStrategy) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_AlertStrategy) ProtoMessage() {} func (x *AlertPolicy_AlertStrategy) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_AlertStrategy.ProtoReflect.Descriptor instead. func (*AlertPolicy_AlertStrategy) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 2} } func (x *AlertPolicy_AlertStrategy) GetNotificationRateLimit() *AlertPolicy_AlertStrategy_NotificationRateLimit { if x != nil { return x.NotificationRateLimit } return nil } func (x *AlertPolicy_AlertStrategy) GetNotificationPrompts() []AlertPolicy_AlertStrategy_NotificationPrompt { if x != nil { return x.NotificationPrompts } return nil } func (x *AlertPolicy_AlertStrategy) GetAutoClose() *durationpb.Duration { if x != nil { return x.AutoClose } return nil } func (x *AlertPolicy_AlertStrategy) GetNotificationChannelStrategy() []*AlertPolicy_AlertStrategy_NotificationChannelStrategy { if x != nil { return x.NotificationChannelStrategy } return nil } // Links to content such as playbooks, repositories, and other resources. type AlertPolicy_Documentation_Link struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A short display name for the link. The display name must not be empty // or exceed 63 characters. Example: "playbook". DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // The url of a webpage. // A url can be templatized by using variables // in the path or the query parameters. The total length of a URL should // not exceed 2083 characters before and after variable expansion. // Example: "https://my_domain.com/playbook?name=${resource.name}" Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` } func (x *AlertPolicy_Documentation_Link) Reset() { *x = AlertPolicy_Documentation_Link{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Documentation_Link) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Documentation_Link) ProtoMessage() {} func (x *AlertPolicy_Documentation_Link) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Documentation_Link.ProtoReflect.Descriptor instead. func (*AlertPolicy_Documentation_Link) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 0, 0} } func (x *AlertPolicy_Documentation_Link) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (x *AlertPolicy_Documentation_Link) GetUrl() string { if x != nil { return x.Url } return "" } // Specifies how many time series must fail a predicate to trigger a // condition. If not specified, then a `{count: 1}` trigger is used. type AlertPolicy_Condition_Trigger struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A type of trigger. // // Types that are assignable to Type: // // *AlertPolicy_Condition_Trigger_Count // *AlertPolicy_Condition_Trigger_Percent Type isAlertPolicy_Condition_Trigger_Type `protobuf_oneof:"type"` } func (x *AlertPolicy_Condition_Trigger) Reset() { *x = AlertPolicy_Condition_Trigger{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_Trigger) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_Trigger) ProtoMessage() {} func (x *AlertPolicy_Condition_Trigger) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_Trigger.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_Trigger) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 0} } func (m *AlertPolicy_Condition_Trigger) GetType() isAlertPolicy_Condition_Trigger_Type { if m != nil { return m.Type } return nil } func (x *AlertPolicy_Condition_Trigger) GetCount() int32 { if x, ok := x.GetType().(*AlertPolicy_Condition_Trigger_Count); ok { return x.Count } return 0 } func (x *AlertPolicy_Condition_Trigger) GetPercent() float64 { if x, ok := x.GetType().(*AlertPolicy_Condition_Trigger_Percent); ok { return x.Percent } return 0 } type isAlertPolicy_Condition_Trigger_Type interface { isAlertPolicy_Condition_Trigger_Type() } type AlertPolicy_Condition_Trigger_Count struct { // The absolute number of time series that must fail // the predicate for the condition to be triggered. Count int32 `protobuf:"varint,1,opt,name=count,proto3,oneof"` } type AlertPolicy_Condition_Trigger_Percent struct { // The percentage of time series that must fail the // predicate for the condition to be triggered. Percent float64 `protobuf:"fixed64,2,opt,name=percent,proto3,oneof"` } func (*AlertPolicy_Condition_Trigger_Count) isAlertPolicy_Condition_Trigger_Type() {} func (*AlertPolicy_Condition_Trigger_Percent) isAlertPolicy_Condition_Trigger_Type() {} // A condition type that compares a collection of time series // against a threshold. type AlertPolicy_Condition_MetricThreshold struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. A // [filter](https://cloud.google.com/monitoring/api/v3/filters) that // identifies which time series should be compared with the threshold. // // The filter is similar to the one that is specified in the // [`ListTimeSeries` // request](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list) // (that call is useful to verify the time series that will be retrieved / // processed). The filter must specify the metric type and the resource // type. Optionally, it can specify resource labels and metric labels. // This field must not exceed 2048 Unicode characters in length. Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` // Specifies the alignment of data points in individual time series as // well as how to combine the retrieved time series together (such as // when aggregating multiple streams on each resource to a single // stream for each resource or when aggregating streams across all // members of a group of resources). Multiple aggregations // are applied in the order specified. // // This field is similar to the one in the [`ListTimeSeries` // request](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list). // It is advisable to use the `ListTimeSeries` method when debugging this // field. Aggregations []*Aggregation `protobuf:"bytes,8,rep,name=aggregations,proto3" json:"aggregations,omitempty"` // A [filter](https://cloud.google.com/monitoring/api/v3/filters) that // identifies a time series that should be used as the denominator of a // ratio that will be compared with the threshold. If a // `denominator_filter` is specified, the time series specified by the // `filter` field will be used as the numerator. // // The filter must specify the metric type and optionally may contain // restrictions on resource type, resource labels, and metric labels. // This field may not exceed 2048 Unicode characters in length. DenominatorFilter string `protobuf:"bytes,9,opt,name=denominator_filter,json=denominatorFilter,proto3" json:"denominator_filter,omitempty"` // Specifies the alignment of data points in individual time series // selected by `denominatorFilter` as // well as how to combine the retrieved time series together (such as // when aggregating multiple streams on each resource to a single // stream for each resource or when aggregating streams across all // members of a group of resources). // // When computing ratios, the `aggregations` and // `denominator_aggregations` fields must use the same alignment period // and produce time series that have the same periodicity and labels. DenominatorAggregations []*Aggregation `protobuf:"bytes,10,rep,name=denominator_aggregations,json=denominatorAggregations,proto3" json:"denominator_aggregations,omitempty"` // When this field is present, the `MetricThreshold` condition forecasts // whether the time series is predicted to violate the threshold within // the `forecast_horizon`. When this field is not set, the // `MetricThreshold` tests the current value of the timeseries against the // threshold. ForecastOptions *AlertPolicy_Condition_MetricThreshold_ForecastOptions `protobuf:"bytes,12,opt,name=forecast_options,json=forecastOptions,proto3" json:"forecast_options,omitempty"` // The comparison to apply between the time series (indicated by `filter` // and `aggregation`) and the threshold (indicated by `threshold_value`). // The comparison is applied on each time series, with the time series // on the left-hand side and the threshold on the right-hand side. // // Only `COMPARISON_LT` and `COMPARISON_GT` are supported currently. Comparison ComparisonType `protobuf:"varint,4,opt,name=comparison,proto3,enum=google.monitoring.v3.ComparisonType" json:"comparison,omitempty"` // A value against which to compare the time series. ThresholdValue float64 `protobuf:"fixed64,5,opt,name=threshold_value,json=thresholdValue,proto3" json:"threshold_value,omitempty"` // The amount of time that a time series must violate the // threshold to be considered failing. Currently, only values // that are a multiple of a minute--e.g., 0, 60, 120, or 300 // seconds--are supported. If an invalid value is given, an // error will be returned. When choosing a duration, it is useful to // keep in mind the frequency of the underlying time series data // (which may also be affected by any alignments specified in the // `aggregations` field); a good duration is long enough so that a single // outlier does not generate spurious alerts, but short enough that // unhealthy states are detected and alerted on quickly. Duration *durationpb.Duration `protobuf:"bytes,6,opt,name=duration,proto3" json:"duration,omitempty"` // The number/percent of time series for which the comparison must hold // in order for the condition to trigger. If unspecified, then the // condition will trigger if the comparison is true for any of the // time series that have been identified by `filter` and `aggregations`, // or by the ratio, if `denominator_filter` and `denominator_aggregations` // are specified. Trigger *AlertPolicy_Condition_Trigger `protobuf:"bytes,7,opt,name=trigger,proto3" json:"trigger,omitempty"` // A condition control that determines how metric-threshold conditions // are evaluated when data stops arriving. To use this control, the value // of the `duration` field must be greater than or equal to 60 seconds. EvaluationMissingData AlertPolicy_Condition_EvaluationMissingData `protobuf:"varint,11,opt,name=evaluation_missing_data,json=evaluationMissingData,proto3,enum=google.monitoring.v3.AlertPolicy_Condition_EvaluationMissingData" json:"evaluation_missing_data,omitempty"` } func (x *AlertPolicy_Condition_MetricThreshold) Reset() { *x = AlertPolicy_Condition_MetricThreshold{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_MetricThreshold) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_MetricThreshold) ProtoMessage() {} func (x *AlertPolicy_Condition_MetricThreshold) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_MetricThreshold.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_MetricThreshold) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 1} } func (x *AlertPolicy_Condition_MetricThreshold) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *AlertPolicy_Condition_MetricThreshold) GetAggregations() []*Aggregation { if x != nil { return x.Aggregations } return nil } func (x *AlertPolicy_Condition_MetricThreshold) GetDenominatorFilter() string { if x != nil { return x.DenominatorFilter } return "" } func (x *AlertPolicy_Condition_MetricThreshold) GetDenominatorAggregations() []*Aggregation { if x != nil { return x.DenominatorAggregations } return nil } func (x *AlertPolicy_Condition_MetricThreshold) GetForecastOptions() *AlertPolicy_Condition_MetricThreshold_ForecastOptions { if x != nil { return x.ForecastOptions } return nil } func (x *AlertPolicy_Condition_MetricThreshold) GetComparison() ComparisonType { if x != nil { return x.Comparison } return ComparisonType_COMPARISON_UNSPECIFIED } func (x *AlertPolicy_Condition_MetricThreshold) GetThresholdValue() float64 { if x != nil { return x.ThresholdValue } return 0 } func (x *AlertPolicy_Condition_MetricThreshold) GetDuration() *durationpb.Duration { if x != nil { return x.Duration } return nil } func (x *AlertPolicy_Condition_MetricThreshold) GetTrigger() *AlertPolicy_Condition_Trigger { if x != nil { return x.Trigger } return nil } func (x *AlertPolicy_Condition_MetricThreshold) GetEvaluationMissingData() AlertPolicy_Condition_EvaluationMissingData { if x != nil { return x.EvaluationMissingData } return AlertPolicy_Condition_EVALUATION_MISSING_DATA_UNSPECIFIED } // A condition type that checks that monitored resources // are reporting data. The configuration defines a metric and // a set of monitored resources. The predicate is considered in violation // when a time series for the specified metric of a monitored // resource does not include any data in the specified `duration`. type AlertPolicy_Condition_MetricAbsence struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. A // [filter](https://cloud.google.com/monitoring/api/v3/filters) that // identifies which time series should be compared with the threshold. // // The filter is similar to the one that is specified in the // [`ListTimeSeries` // request](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list) // (that call is useful to verify the time series that will be retrieved / // processed). The filter must specify the metric type and the resource // type. Optionally, it can specify resource labels and metric labels. // This field must not exceed 2048 Unicode characters in length. Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` // Specifies the alignment of data points in individual time series as // well as how to combine the retrieved time series together (such as // when aggregating multiple streams on each resource to a single // stream for each resource or when aggregating streams across all // members of a group of resources). Multiple aggregations // are applied in the order specified. // // This field is similar to the one in the [`ListTimeSeries` // request](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list). // It is advisable to use the `ListTimeSeries` method when debugging this // field. Aggregations []*Aggregation `protobuf:"bytes,5,rep,name=aggregations,proto3" json:"aggregations,omitempty"` // The amount of time that a time series must fail to report new // data to be considered failing. The minimum value of this field // is 120 seconds. Larger values that are a multiple of a // minute--for example, 240 or 300 seconds--are supported. // If an invalid value is given, an // error will be returned. The `Duration.nanos` field is // ignored. Duration *durationpb.Duration `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"` // The number/percent of time series for which the comparison must hold // in order for the condition to trigger. If unspecified, then the // condition will trigger if the comparison is true for any of the // time series that have been identified by `filter` and `aggregations`. Trigger *AlertPolicy_Condition_Trigger `protobuf:"bytes,3,opt,name=trigger,proto3" json:"trigger,omitempty"` } func (x *AlertPolicy_Condition_MetricAbsence) Reset() { *x = AlertPolicy_Condition_MetricAbsence{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_MetricAbsence) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_MetricAbsence) ProtoMessage() {} func (x *AlertPolicy_Condition_MetricAbsence) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_MetricAbsence.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_MetricAbsence) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 2} } func (x *AlertPolicy_Condition_MetricAbsence) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *AlertPolicy_Condition_MetricAbsence) GetAggregations() []*Aggregation { if x != nil { return x.Aggregations } return nil } func (x *AlertPolicy_Condition_MetricAbsence) GetDuration() *durationpb.Duration { if x != nil { return x.Duration } return nil } func (x *AlertPolicy_Condition_MetricAbsence) GetTrigger() *AlertPolicy_Condition_Trigger { if x != nil { return x.Trigger } return nil } // A condition type that checks whether a log message in the [scoping // project](https://cloud.google.com/monitoring/api/v3#project_name) // satisfies the given filter. Logs from other projects in the metrics // scope are not evaluated. type AlertPolicy_Condition_LogMatch struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. A logs-based filter. See [Advanced Logs // Queries](https://cloud.google.com/logging/docs/view/advanced-queries) // for how this filter should be constructed. Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` // Optional. A map from a label key to an extractor expression, which is // used to extract the value for this label key. Each entry in this map is // a specification for how data should be extracted from log entries that // match `filter`. Each combination of extracted values is treated as a // separate rule for the purposes of triggering notifications. Label keys // and corresponding values can be used in notifications generated by this // condition. // // Please see [the documentation on logs-based metric // `valueExtractor`s](https://cloud.google.com/logging/docs/reference/v2/rest/v2/projects.metrics#LogMetric.FIELDS.value_extractor) // for syntax and examples. LabelExtractors map[string]string `protobuf:"bytes,2,rep,name=label_extractors,json=labelExtractors,proto3" json:"label_extractors,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AlertPolicy_Condition_LogMatch) Reset() { *x = AlertPolicy_Condition_LogMatch{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_LogMatch) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_LogMatch) ProtoMessage() {} func (x *AlertPolicy_Condition_LogMatch) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_LogMatch.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_LogMatch) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 3} } func (x *AlertPolicy_Condition_LogMatch) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *AlertPolicy_Condition_LogMatch) GetLabelExtractors() map[string]string { if x != nil { return x.LabelExtractors } return nil } // A condition type that allows alerting policies to be defined using // [Monitoring Query Language](https://cloud.google.com/monitoring/mql). type AlertPolicy_Condition_MonitoringQueryLanguageCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // [Monitoring Query Language](https://cloud.google.com/monitoring/mql) // query that outputs a boolean stream. Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` // The amount of time that a time series must violate the // threshold to be considered failing. Currently, only values // that are a multiple of a minute--e.g., 0, 60, 120, or 300 // seconds--are supported. If an invalid value is given, an // error will be returned. When choosing a duration, it is useful to // keep in mind the frequency of the underlying time series data // (which may also be affected by any alignments specified in the // `aggregations` field); a good duration is long enough so that a single // outlier does not generate spurious alerts, but short enough that // unhealthy states are detected and alerted on quickly. Duration *durationpb.Duration `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"` // The number/percent of time series for which the comparison must hold // in order for the condition to trigger. If unspecified, then the // condition will trigger if the comparison is true for any of the // time series that have been identified by `filter` and `aggregations`, // or by the ratio, if `denominator_filter` and `denominator_aggregations` // are specified. Trigger *AlertPolicy_Condition_Trigger `protobuf:"bytes,3,opt,name=trigger,proto3" json:"trigger,omitempty"` // A condition control that determines how metric-threshold conditions // are evaluated when data stops arriving. EvaluationMissingData AlertPolicy_Condition_EvaluationMissingData `protobuf:"varint,4,opt,name=evaluation_missing_data,json=evaluationMissingData,proto3,enum=google.monitoring.v3.AlertPolicy_Condition_EvaluationMissingData" json:"evaluation_missing_data,omitempty"` } func (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) Reset() { *x = AlertPolicy_Condition_MonitoringQueryLanguageCondition{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_MonitoringQueryLanguageCondition) ProtoMessage() {} func (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_MonitoringQueryLanguageCondition.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_MonitoringQueryLanguageCondition) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 4} } func (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) GetQuery() string { if x != nil { return x.Query } return "" } func (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) GetDuration() *durationpb.Duration { if x != nil { return x.Duration } return nil } func (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) GetTrigger() *AlertPolicy_Condition_Trigger { if x != nil { return x.Trigger } return nil } func (x *AlertPolicy_Condition_MonitoringQueryLanguageCondition) GetEvaluationMissingData() AlertPolicy_Condition_EvaluationMissingData { if x != nil { return x.EvaluationMissingData } return AlertPolicy_Condition_EVALUATION_MISSING_DATA_UNSPECIFIED } // A condition type that allows alerting policies to be defined using // [Prometheus Query Language // (PromQL)](https://prometheus.io/docs/prometheus/latest/querying/basics/). // // The PrometheusQueryLanguageCondition message contains information // from a Prometheus alerting rule and its associated rule group. // // A Prometheus alerting rule is described // [here](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/). // The semantics of a Prometheus alerting rule is described // [here](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#rule). // // A Prometheus rule group is described // [here](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/). // The semantics of a Prometheus rule group is described // [here](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#rule_group). // // Because Cloud Alerting has no representation of a Prometheus rule // group resource, we must embed the information of the parent rule // group inside each of the conditions that refer to it. We must also // update the contents of all Prometheus alerts in case the information // of their rule group changes. // // The PrometheusQueryLanguageCondition protocol buffer combines the // information of the corresponding rule group and alerting rule. // The structure of the PrometheusQueryLanguageCondition protocol buffer // does NOT mimic the structure of the Prometheus rule group and alerting // rule YAML declarations. The PrometheusQueryLanguageCondition protocol // buffer may change in the future to support future rule group and/or // alerting rule features. There are no new such features at the present // time (2023-06-26). type AlertPolicy_Condition_PrometheusQueryLanguageCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The PromQL expression to evaluate. Every evaluation cycle // this expression is evaluated at the current time, and all resultant // time series become pending/firing alerts. This field must not be empty. Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` // Optional. Alerts are considered firing once their PromQL expression was // evaluated to be "true" for this long. // Alerts whose PromQL expression was not evaluated to be "true" for // long enough are considered pending. // Must be a non-negative duration or missing. // This field is optional. Its default value is zero. Duration *durationpb.Duration `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"` // Optional. How often this rule should be evaluated. // Must be a positive multiple of 30 seconds or missing. // This field is optional. Its default value is 30 seconds. // If this PrometheusQueryLanguageCondition was generated from a // Prometheus alerting rule, then this value should be taken from the // enclosing rule group. EvaluationInterval *durationpb.Duration `protobuf:"bytes,3,opt,name=evaluation_interval,json=evaluationInterval,proto3" json:"evaluation_interval,omitempty"` // Optional. Labels to add to or overwrite in the PromQL query result. // Label names [must be // valid](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels). // Label values can be [templatized by using // variables](https://cloud.google.com/monitoring/alerts/doc-variables#doc-vars). // The only available variable names are the names of the labels in the // PromQL result, including "__name__" and "value". "labels" may be empty. Labels map[string]string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Optional. The rule group name of this alert in the corresponding // Prometheus configuration file. // // Some external tools may require this field to be populated correctly // in order to refer to the original Prometheus configuration file. // The rule group name and the alert name are necessary to update the // relevant AlertPolicies in case the definition of the rule group changes // in the future. // // This field is optional. If this field is not empty, then it must // contain a valid UTF-8 string. // This field may not exceed 2048 Unicode characters in length. RuleGroup string `protobuf:"bytes,5,opt,name=rule_group,json=ruleGroup,proto3" json:"rule_group,omitempty"` // Optional. The alerting rule name of this alert in the corresponding // Prometheus configuration file. // // Some external tools may require this field to be populated correctly // in order to refer to the original Prometheus configuration file. // The rule group name and the alert name are necessary to update the // relevant AlertPolicies in case the definition of the rule group changes // in the future. // // This field is optional. If this field is not empty, then it must be a // [valid Prometheus label // name](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels). // This field may not exceed 2048 Unicode characters in length. AlertRule string `protobuf:"bytes,6,opt,name=alert_rule,json=alertRule,proto3" json:"alert_rule,omitempty"` // Optional. Whether to disable metric existence validation for this // condition. // // This allows alerting policies to be defined on metrics that do not yet // exist, improving advanced customer workflows such as configuring // alerting policies using Terraform. // // Users with the `monitoring.alertPolicyViewer` role are able to see the // name of the non-existent metric in the alerting policy condition. DisableMetricValidation bool `protobuf:"varint,7,opt,name=disable_metric_validation,json=disableMetricValidation,proto3" json:"disable_metric_validation,omitempty"` } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) Reset() { *x = AlertPolicy_Condition_PrometheusQueryLanguageCondition{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_PrometheusQueryLanguageCondition) ProtoMessage() {} func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_PrometheusQueryLanguageCondition.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_PrometheusQueryLanguageCondition) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 5} } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetQuery() string { if x != nil { return x.Query } return "" } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetDuration() *durationpb.Duration { if x != nil { return x.Duration } return nil } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetEvaluationInterval() *durationpb.Duration { if x != nil { return x.EvaluationInterval } return nil } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetLabels() map[string]string { if x != nil { return x.Labels } return nil } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetRuleGroup() string { if x != nil { return x.RuleGroup } return "" } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetAlertRule() string { if x != nil { return x.AlertRule } return "" } func (x *AlertPolicy_Condition_PrometheusQueryLanguageCondition) GetDisableMetricValidation() bool { if x != nil { return x.DisableMetricValidation } return false } // A condition that allows alerting policies to be defined using GoogleSQL. // SQL conditions examine a sliding window of logs using GoogleSQL. // Alert policies with SQL conditions may incur additional billing. type AlertPolicy_Condition_SqlCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The Log Analytics SQL query to run, as a string. The query // must conform to the required shape. Specifically, the query must not // try to filter the input by time. A filter will automatically be // applied to filter the input so that the query receives all rows // received since the last time the query was run. // // For example, the following query extracts all log entries containing an // HTTP request: // // SELECT // timestamp, log_name, severity, http_request, resource, labels // FROM // my-project.global._Default._AllLogs // WHERE // http_request IS NOT NULL Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` // The schedule indicates how often the query should be run. // // Types that are assignable to Schedule: // // *AlertPolicy_Condition_SqlCondition_Minutes_ // *AlertPolicy_Condition_SqlCondition_Hourly_ // *AlertPolicy_Condition_SqlCondition_Daily_ Schedule isAlertPolicy_Condition_SqlCondition_Schedule `protobuf_oneof:"schedule"` // The test to be run against the SQL result set. // // Types that are assignable to Evaluate: // // *AlertPolicy_Condition_SqlCondition_RowCountTest_ // *AlertPolicy_Condition_SqlCondition_BooleanTest_ Evaluate isAlertPolicy_Condition_SqlCondition_Evaluate `protobuf_oneof:"evaluate"` } func (x *AlertPolicy_Condition_SqlCondition) Reset() { *x = AlertPolicy_Condition_SqlCondition{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_SqlCondition) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_SqlCondition) ProtoMessage() {} func (x *AlertPolicy_Condition_SqlCondition) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_SqlCondition.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_SqlCondition) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6} } func (x *AlertPolicy_Condition_SqlCondition) GetQuery() string { if x != nil { return x.Query } return "" } func (m *AlertPolicy_Condition_SqlCondition) GetSchedule() isAlertPolicy_Condition_SqlCondition_Schedule { if m != nil { return m.Schedule } return nil } func (x *AlertPolicy_Condition_SqlCondition) GetMinutes() *AlertPolicy_Condition_SqlCondition_Minutes { if x, ok := x.GetSchedule().(*AlertPolicy_Condition_SqlCondition_Minutes_); ok { return x.Minutes } return nil } func (x *AlertPolicy_Condition_SqlCondition) GetHourly() *AlertPolicy_Condition_SqlCondition_Hourly { if x, ok := x.GetSchedule().(*AlertPolicy_Condition_SqlCondition_Hourly_); ok { return x.Hourly } return nil } func (x *AlertPolicy_Condition_SqlCondition) GetDaily() *AlertPolicy_Condition_SqlCondition_Daily { if x, ok := x.GetSchedule().(*AlertPolicy_Condition_SqlCondition_Daily_); ok { return x.Daily } return nil } func (m *AlertPolicy_Condition_SqlCondition) GetEvaluate() isAlertPolicy_Condition_SqlCondition_Evaluate { if m != nil { return m.Evaluate } return nil } func (x *AlertPolicy_Condition_SqlCondition) GetRowCountTest() *AlertPolicy_Condition_SqlCondition_RowCountTest { if x, ok := x.GetEvaluate().(*AlertPolicy_Condition_SqlCondition_RowCountTest_); ok { return x.RowCountTest } return nil } func (x *AlertPolicy_Condition_SqlCondition) GetBooleanTest() *AlertPolicy_Condition_SqlCondition_BooleanTest { if x, ok := x.GetEvaluate().(*AlertPolicy_Condition_SqlCondition_BooleanTest_); ok { return x.BooleanTest } return nil } type isAlertPolicy_Condition_SqlCondition_Schedule interface { isAlertPolicy_Condition_SqlCondition_Schedule() } type AlertPolicy_Condition_SqlCondition_Minutes_ struct { // Schedule the query to execute every so many minutes. Minutes *AlertPolicy_Condition_SqlCondition_Minutes `protobuf:"bytes,2,opt,name=minutes,proto3,oneof"` } type AlertPolicy_Condition_SqlCondition_Hourly_ struct { // Schedule the query to execute every so many hours. Hourly *AlertPolicy_Condition_SqlCondition_Hourly `protobuf:"bytes,3,opt,name=hourly,proto3,oneof"` } type AlertPolicy_Condition_SqlCondition_Daily_ struct { // Schedule the query to execute every so many days. Daily *AlertPolicy_Condition_SqlCondition_Daily `protobuf:"bytes,4,opt,name=daily,proto3,oneof"` } func (*AlertPolicy_Condition_SqlCondition_Minutes_) isAlertPolicy_Condition_SqlCondition_Schedule() {} func (*AlertPolicy_Condition_SqlCondition_Hourly_) isAlertPolicy_Condition_SqlCondition_Schedule() {} func (*AlertPolicy_Condition_SqlCondition_Daily_) isAlertPolicy_Condition_SqlCondition_Schedule() {} type isAlertPolicy_Condition_SqlCondition_Evaluate interface { isAlertPolicy_Condition_SqlCondition_Evaluate() } type AlertPolicy_Condition_SqlCondition_RowCountTest_ struct { // Test the row count against a threshold. RowCountTest *AlertPolicy_Condition_SqlCondition_RowCountTest `protobuf:"bytes,5,opt,name=row_count_test,json=rowCountTest,proto3,oneof"` } type AlertPolicy_Condition_SqlCondition_BooleanTest_ struct { // Test the boolean value in the indicated column. BooleanTest *AlertPolicy_Condition_SqlCondition_BooleanTest `protobuf:"bytes,6,opt,name=boolean_test,json=booleanTest,proto3,oneof"` } func (*AlertPolicy_Condition_SqlCondition_RowCountTest_) isAlertPolicy_Condition_SqlCondition_Evaluate() { } func (*AlertPolicy_Condition_SqlCondition_BooleanTest_) isAlertPolicy_Condition_SqlCondition_Evaluate() { } // Options used when forecasting the time series and testing // the predicted value against the threshold. type AlertPolicy_Condition_MetricThreshold_ForecastOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The length of time into the future to forecast whether a // time series will violate the threshold. If the predicted value is // found to violate the threshold, and the violation is observed in all // forecasts made for the configured `duration`, then the time series is // considered to be failing. // The forecast horizon can range from 1 hour to 60 hours. ForecastHorizon *durationpb.Duration `protobuf:"bytes,1,opt,name=forecast_horizon,json=forecastHorizon,proto3" json:"forecast_horizon,omitempty"` } func (x *AlertPolicy_Condition_MetricThreshold_ForecastOptions) Reset() { *x = AlertPolicy_Condition_MetricThreshold_ForecastOptions{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_MetricThreshold_ForecastOptions) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_MetricThreshold_ForecastOptions) ProtoMessage() {} func (x *AlertPolicy_Condition_MetricThreshold_ForecastOptions) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_MetricThreshold_ForecastOptions.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_MetricThreshold_ForecastOptions) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 1, 0} } func (x *AlertPolicy_Condition_MetricThreshold_ForecastOptions) GetForecastHorizon() *durationpb.Duration { if x != nil { return x.ForecastHorizon } return nil } // Used to schedule the query to run every so many minutes. type AlertPolicy_Condition_SqlCondition_Minutes struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Number of minutes between runs. The interval must be // greater than or equal to 5 minutes and less than or equal to 1440 // minutes. Periodicity int32 `protobuf:"varint,1,opt,name=periodicity,proto3" json:"periodicity,omitempty"` } func (x *AlertPolicy_Condition_SqlCondition_Minutes) Reset() { *x = AlertPolicy_Condition_SqlCondition_Minutes{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_SqlCondition_Minutes) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_SqlCondition_Minutes) ProtoMessage() {} func (x *AlertPolicy_Condition_SqlCondition_Minutes) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_SqlCondition_Minutes.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_SqlCondition_Minutes) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 0} } func (x *AlertPolicy_Condition_SqlCondition_Minutes) GetPeriodicity() int32 { if x != nil { return x.Periodicity } return 0 } // Used to schedule the query to run every so many hours. type AlertPolicy_Condition_SqlCondition_Hourly struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The number of hours between runs. Must be greater than or // equal to 1 hour and less than or equal to 48 hours. Periodicity int32 `protobuf:"varint,1,opt,name=periodicity,proto3" json:"periodicity,omitempty"` // Optional. The number of minutes after the hour (in UTC) to run the // query. Must be greater than or equal to 0 minutes and less than or // equal to 59 minutes. If left unspecified, then an arbitrary offset // is used. MinuteOffset *int32 `protobuf:"varint,2,opt,name=minute_offset,json=minuteOffset,proto3,oneof" json:"minute_offset,omitempty"` } func (x *AlertPolicy_Condition_SqlCondition_Hourly) Reset() { *x = AlertPolicy_Condition_SqlCondition_Hourly{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_SqlCondition_Hourly) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_SqlCondition_Hourly) ProtoMessage() {} func (x *AlertPolicy_Condition_SqlCondition_Hourly) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_SqlCondition_Hourly.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_SqlCondition_Hourly) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 1} } func (x *AlertPolicy_Condition_SqlCondition_Hourly) GetPeriodicity() int32 { if x != nil { return x.Periodicity } return 0 } func (x *AlertPolicy_Condition_SqlCondition_Hourly) GetMinuteOffset() int32 { if x != nil && x.MinuteOffset != nil { return *x.MinuteOffset } return 0 } // Used to schedule the query to run every so many days. type AlertPolicy_Condition_SqlCondition_Daily struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The number of days between runs. Must be greater than or // equal to 1 day and less than or equal to 31 days. Periodicity int32 `protobuf:"varint,1,opt,name=periodicity,proto3" json:"periodicity,omitempty"` // Optional. The time of day (in UTC) at which the query should run. If // left unspecified, the server picks an arbitrary time of day and runs // the query at the same time each day. ExecutionTime *timeofday.TimeOfDay `protobuf:"bytes,2,opt,name=execution_time,json=executionTime,proto3" json:"execution_time,omitempty"` } func (x *AlertPolicy_Condition_SqlCondition_Daily) Reset() { *x = AlertPolicy_Condition_SqlCondition_Daily{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_SqlCondition_Daily) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_SqlCondition_Daily) ProtoMessage() {} func (x *AlertPolicy_Condition_SqlCondition_Daily) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_SqlCondition_Daily.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_SqlCondition_Daily) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 2} } func (x *AlertPolicy_Condition_SqlCondition_Daily) GetPeriodicity() int32 { if x != nil { return x.Periodicity } return 0 } func (x *AlertPolicy_Condition_SqlCondition_Daily) GetExecutionTime() *timeofday.TimeOfDay { if x != nil { return x.ExecutionTime } return nil } // A test that checks if the number of rows in the result set // violates some threshold. type AlertPolicy_Condition_SqlCondition_RowCountTest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The comparison to apply between the number of rows returned // by the query and the threshold. Comparison ComparisonType `protobuf:"varint,1,opt,name=comparison,proto3,enum=google.monitoring.v3.ComparisonType" json:"comparison,omitempty"` // Required. The value against which to compare the row count. Threshold int64 `protobuf:"varint,2,opt,name=threshold,proto3" json:"threshold,omitempty"` } func (x *AlertPolicy_Condition_SqlCondition_RowCountTest) Reset() { *x = AlertPolicy_Condition_SqlCondition_RowCountTest{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_SqlCondition_RowCountTest) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_SqlCondition_RowCountTest) ProtoMessage() {} func (x *AlertPolicy_Condition_SqlCondition_RowCountTest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_SqlCondition_RowCountTest.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_SqlCondition_RowCountTest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 3} } func (x *AlertPolicy_Condition_SqlCondition_RowCountTest) GetComparison() ComparisonType { if x != nil { return x.Comparison } return ComparisonType_COMPARISON_UNSPECIFIED } func (x *AlertPolicy_Condition_SqlCondition_RowCountTest) GetThreshold() int64 { if x != nil { return x.Threshold } return 0 } // A test that uses an alerting result in a boolean column produced by // the SQL query. type AlertPolicy_Condition_SqlCondition_BooleanTest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The name of the column containing the boolean value. If the // value in a row is NULL, that row is ignored. Column string `protobuf:"bytes,1,opt,name=column,proto3" json:"column,omitempty"` } func (x *AlertPolicy_Condition_SqlCondition_BooleanTest) Reset() { *x = AlertPolicy_Condition_SqlCondition_BooleanTest{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_Condition_SqlCondition_BooleanTest) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_Condition_SqlCondition_BooleanTest) ProtoMessage() {} func (x *AlertPolicy_Condition_SqlCondition_BooleanTest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_Condition_SqlCondition_BooleanTest.ProtoReflect.Descriptor instead. func (*AlertPolicy_Condition_SqlCondition_BooleanTest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 1, 6, 4} } func (x *AlertPolicy_Condition_SqlCondition_BooleanTest) GetColumn() string { if x != nil { return x.Column } return "" } // Control over the rate of notifications sent to this alerting policy's // notification channels. type AlertPolicy_AlertStrategy_NotificationRateLimit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Not more than one notification per `period`. Period *durationpb.Duration `protobuf:"bytes,1,opt,name=period,proto3" json:"period,omitempty"` } func (x *AlertPolicy_AlertStrategy_NotificationRateLimit) Reset() { *x = AlertPolicy_AlertStrategy_NotificationRateLimit{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_AlertStrategy_NotificationRateLimit) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_AlertStrategy_NotificationRateLimit) ProtoMessage() {} func (x *AlertPolicy_AlertStrategy_NotificationRateLimit) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_AlertStrategy_NotificationRateLimit.ProtoReflect.Descriptor instead. func (*AlertPolicy_AlertStrategy_NotificationRateLimit) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 2, 0} } func (x *AlertPolicy_AlertStrategy_NotificationRateLimit) GetPeriod() *durationpb.Duration { if x != nil { return x.Period } return nil } // Control over how the notification channels in `notification_channels` // are notified when this alert fires, on a per-channel basis. type AlertPolicy_AlertStrategy_NotificationChannelStrategy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The full REST resource name for the notification channels that these // settings apply to. Each of these correspond to the name field in one // of the NotificationChannel objects referenced in the // notification_channels field of this AlertPolicy. // The format is: // // projects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID] NotificationChannelNames []string `protobuf:"bytes,1,rep,name=notification_channel_names,json=notificationChannelNames,proto3" json:"notification_channel_names,omitempty"` // The frequency at which to send reminder notifications for open // incidents. RenotifyInterval *durationpb.Duration `protobuf:"bytes,2,opt,name=renotify_interval,json=renotifyInterval,proto3" json:"renotify_interval,omitempty"` } func (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) Reset() { *x = AlertPolicy_AlertStrategy_NotificationChannelStrategy{} mi := &file_google_monitoring_v3_alert_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlertPolicy_AlertStrategy_NotificationChannelStrategy) ProtoMessage() {} func (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlertPolicy_AlertStrategy_NotificationChannelStrategy.ProtoReflect.Descriptor instead. func (*AlertPolicy_AlertStrategy_NotificationChannelStrategy) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_proto_rawDescGZIP(), []int{0, 2, 1} } func (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) GetNotificationChannelNames() []string { if x != nil { return x.NotificationChannelNames } return nil } func (x *AlertPolicy_AlertStrategy_NotificationChannelStrategy) GetRenotifyInterval() *durationpb.Duration { if x != nil { return x.RenotifyInterval } return nil } var File_google_monitoring_v3_alert_proto protoreflect.FileDescriptor var file_google_monitoring_v3_alert_proto_rawDesc = []byte{ 0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x66, 0x64, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x35, 0x0a, 0x0b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x15, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x4d, 0x0a, 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0e, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x56, 0x0a, 0x0e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0d, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x4b, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x1a, 0xf3, 0x01, 0x0a, 0x0d, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4f, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x1a, 0x3b, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0xa5, 0x23, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x6e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x66, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x62, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x41, 0x62, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x62, 0x73, 0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x12, 0x9d, 0x01, 0x0a, 0x23, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x23, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x71, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x71, 0x6c, 0x1a, 0x45, 0x0a, 0x07, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0xc8, 0x06, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x5c, 0x0a, 0x18, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x76, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x79, 0x0a, 0x17, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x15, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x5c, 0x0a, 0x0f, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x1a, 0xf9, 0x01, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x41, 0x62, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x1a, 0xe1, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x74, 0x0a, 0x10, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xb9, 0x02, 0x0a, 0x20, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x79, 0x0a, 0x17, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x15, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x85, 0x04, 0x0a, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x13, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x75, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x58, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x19, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x17, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xee, 0x07, 0x0a, 0x0c, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x5c, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x06, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x48, 0x00, 0x52, 0x06, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x12, 0x56, 0x0a, 0x05, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x48, 0x00, 0x52, 0x05, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x12, 0x6d, 0x0a, 0x0e, 0x72, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x65, 0x73, 0x74, 0x48, 0x01, 0x52, 0x0c, 0x72, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x65, 0x73, 0x74, 0x12, 0x69, 0x0a, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x48, 0x01, 0x52, 0x0b, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x0a, 0x07, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x1a, 0x70, 0x0a, 0x06, 0x48, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x1a, 0x72, 0x0a, 0x05, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x66, 0x44, 0x61, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x7c, 0x0a, 0x0c, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x1a, 0x2a, 0x0a, 0x0b, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x15, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x23, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4e, 0x4f, 0x5f, 0x4f, 0x50, 0x10, 0x03, 0x3a, 0x97, 0x02, 0xea, 0x41, 0x93, 0x02, 0x0a, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x50, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x44, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x01, 0x2a, 0x42, 0x0b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x96, 0x06, 0x0a, 0x0d, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x7d, 0x0a, 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x15, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x75, 0x0a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x42, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x52, 0x13, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x1d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x1b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x1a, 0x4a, 0x0a, 0x15, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x1a, 0xa3, 0x01, 0x0a, 0x1b, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x3c, 0x0a, 0x1a, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x72, 0x65, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x51, 0x0a, 0x12, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x12, 0x23, 0x0a, 0x1f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x4d, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x50, 0x45, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x4e, 0x44, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x03, 0x22, 0x4a, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x3a, 0xc9, 0x01, 0xea, 0x41, 0xc5, 0x01, 0x0a, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x12, 0x39, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x12, 0x2d, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x7d, 0x12, 0x01, 0x2a, 0x42, 0xc5, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0a, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_alert_proto_rawDescOnce sync.Once file_google_monitoring_v3_alert_proto_rawDescData = file_google_monitoring_v3_alert_proto_rawDesc ) func file_google_monitoring_v3_alert_proto_rawDescGZIP() []byte { file_google_monitoring_v3_alert_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_alert_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_alert_proto_rawDescData) }) return file_google_monitoring_v3_alert_proto_rawDescData } var file_google_monitoring_v3_alert_proto_enumTypes = make([]protoimpl.EnumInfo, 4) var file_google_monitoring_v3_alert_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_google_monitoring_v3_alert_proto_goTypes = []any{ (AlertPolicy_ConditionCombinerType)(0), // 0: google.monitoring.v3.AlertPolicy.ConditionCombinerType (AlertPolicy_Severity)(0), // 1: google.monitoring.v3.AlertPolicy.Severity (AlertPolicy_Condition_EvaluationMissingData)(0), // 2: google.monitoring.v3.AlertPolicy.Condition.EvaluationMissingData (AlertPolicy_AlertStrategy_NotificationPrompt)(0), // 3: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationPrompt (*AlertPolicy)(nil), // 4: google.monitoring.v3.AlertPolicy (*AlertPolicy_Documentation)(nil), // 5: google.monitoring.v3.AlertPolicy.Documentation (*AlertPolicy_Condition)(nil), // 6: google.monitoring.v3.AlertPolicy.Condition (*AlertPolicy_AlertStrategy)(nil), // 7: google.monitoring.v3.AlertPolicy.AlertStrategy nil, // 8: google.monitoring.v3.AlertPolicy.UserLabelsEntry (*AlertPolicy_Documentation_Link)(nil), // 9: google.monitoring.v3.AlertPolicy.Documentation.Link (*AlertPolicy_Condition_Trigger)(nil), // 10: google.monitoring.v3.AlertPolicy.Condition.Trigger (*AlertPolicy_Condition_MetricThreshold)(nil), // 11: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold (*AlertPolicy_Condition_MetricAbsence)(nil), // 12: google.monitoring.v3.AlertPolicy.Condition.MetricAbsence (*AlertPolicy_Condition_LogMatch)(nil), // 13: google.monitoring.v3.AlertPolicy.Condition.LogMatch (*AlertPolicy_Condition_MonitoringQueryLanguageCondition)(nil), // 14: google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition (*AlertPolicy_Condition_PrometheusQueryLanguageCondition)(nil), // 15: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition (*AlertPolicy_Condition_SqlCondition)(nil), // 16: google.monitoring.v3.AlertPolicy.Condition.SqlCondition (*AlertPolicy_Condition_MetricThreshold_ForecastOptions)(nil), // 17: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.ForecastOptions nil, // 18: google.monitoring.v3.AlertPolicy.Condition.LogMatch.LabelExtractorsEntry nil, // 19: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.LabelsEntry (*AlertPolicy_Condition_SqlCondition_Minutes)(nil), // 20: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Minutes (*AlertPolicy_Condition_SqlCondition_Hourly)(nil), // 21: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Hourly (*AlertPolicy_Condition_SqlCondition_Daily)(nil), // 22: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Daily (*AlertPolicy_Condition_SqlCondition_RowCountTest)(nil), // 23: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.RowCountTest (*AlertPolicy_Condition_SqlCondition_BooleanTest)(nil), // 24: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.BooleanTest (*AlertPolicy_AlertStrategy_NotificationRateLimit)(nil), // 25: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationRateLimit (*AlertPolicy_AlertStrategy_NotificationChannelStrategy)(nil), // 26: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationChannelStrategy (*wrapperspb.BoolValue)(nil), // 27: google.protobuf.BoolValue (*status.Status)(nil), // 28: google.rpc.Status (*MutationRecord)(nil), // 29: google.monitoring.v3.MutationRecord (*durationpb.Duration)(nil), // 30: google.protobuf.Duration (*Aggregation)(nil), // 31: google.monitoring.v3.Aggregation (ComparisonType)(0), // 32: google.monitoring.v3.ComparisonType (*timeofday.TimeOfDay)(nil), // 33: google.type.TimeOfDay } var file_google_monitoring_v3_alert_proto_depIdxs = []int32{ 5, // 0: google.monitoring.v3.AlertPolicy.documentation:type_name -> google.monitoring.v3.AlertPolicy.Documentation 8, // 1: google.monitoring.v3.AlertPolicy.user_labels:type_name -> google.monitoring.v3.AlertPolicy.UserLabelsEntry 6, // 2: google.monitoring.v3.AlertPolicy.conditions:type_name -> google.monitoring.v3.AlertPolicy.Condition 0, // 3: google.monitoring.v3.AlertPolicy.combiner:type_name -> google.monitoring.v3.AlertPolicy.ConditionCombinerType 27, // 4: google.monitoring.v3.AlertPolicy.enabled:type_name -> google.protobuf.BoolValue 28, // 5: google.monitoring.v3.AlertPolicy.validity:type_name -> google.rpc.Status 29, // 6: google.monitoring.v3.AlertPolicy.creation_record:type_name -> google.monitoring.v3.MutationRecord 29, // 7: google.monitoring.v3.AlertPolicy.mutation_record:type_name -> google.monitoring.v3.MutationRecord 7, // 8: google.monitoring.v3.AlertPolicy.alert_strategy:type_name -> google.monitoring.v3.AlertPolicy.AlertStrategy 1, // 9: google.monitoring.v3.AlertPolicy.severity:type_name -> google.monitoring.v3.AlertPolicy.Severity 9, // 10: google.monitoring.v3.AlertPolicy.Documentation.links:type_name -> google.monitoring.v3.AlertPolicy.Documentation.Link 11, // 11: google.monitoring.v3.AlertPolicy.Condition.condition_threshold:type_name -> google.monitoring.v3.AlertPolicy.Condition.MetricThreshold 12, // 12: google.monitoring.v3.AlertPolicy.Condition.condition_absent:type_name -> google.monitoring.v3.AlertPolicy.Condition.MetricAbsence 13, // 13: google.monitoring.v3.AlertPolicy.Condition.condition_matched_log:type_name -> google.monitoring.v3.AlertPolicy.Condition.LogMatch 14, // 14: google.monitoring.v3.AlertPolicy.Condition.condition_monitoring_query_language:type_name -> google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition 15, // 15: google.monitoring.v3.AlertPolicy.Condition.condition_prometheus_query_language:type_name -> google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition 16, // 16: google.monitoring.v3.AlertPolicy.Condition.condition_sql:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition 25, // 17: google.monitoring.v3.AlertPolicy.AlertStrategy.notification_rate_limit:type_name -> google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationRateLimit 3, // 18: google.monitoring.v3.AlertPolicy.AlertStrategy.notification_prompts:type_name -> google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationPrompt 30, // 19: google.monitoring.v3.AlertPolicy.AlertStrategy.auto_close:type_name -> google.protobuf.Duration 26, // 20: google.monitoring.v3.AlertPolicy.AlertStrategy.notification_channel_strategy:type_name -> google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationChannelStrategy 31, // 21: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.aggregations:type_name -> google.monitoring.v3.Aggregation 31, // 22: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.denominator_aggregations:type_name -> google.monitoring.v3.Aggregation 17, // 23: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.forecast_options:type_name -> google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.ForecastOptions 32, // 24: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.comparison:type_name -> google.monitoring.v3.ComparisonType 30, // 25: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.duration:type_name -> google.protobuf.Duration 10, // 26: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.trigger:type_name -> google.monitoring.v3.AlertPolicy.Condition.Trigger 2, // 27: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.evaluation_missing_data:type_name -> google.monitoring.v3.AlertPolicy.Condition.EvaluationMissingData 31, // 28: google.monitoring.v3.AlertPolicy.Condition.MetricAbsence.aggregations:type_name -> google.monitoring.v3.Aggregation 30, // 29: google.monitoring.v3.AlertPolicy.Condition.MetricAbsence.duration:type_name -> google.protobuf.Duration 10, // 30: google.monitoring.v3.AlertPolicy.Condition.MetricAbsence.trigger:type_name -> google.monitoring.v3.AlertPolicy.Condition.Trigger 18, // 31: google.monitoring.v3.AlertPolicy.Condition.LogMatch.label_extractors:type_name -> google.monitoring.v3.AlertPolicy.Condition.LogMatch.LabelExtractorsEntry 30, // 32: google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition.duration:type_name -> google.protobuf.Duration 10, // 33: google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition.trigger:type_name -> google.monitoring.v3.AlertPolicy.Condition.Trigger 2, // 34: google.monitoring.v3.AlertPolicy.Condition.MonitoringQueryLanguageCondition.evaluation_missing_data:type_name -> google.monitoring.v3.AlertPolicy.Condition.EvaluationMissingData 30, // 35: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.duration:type_name -> google.protobuf.Duration 30, // 36: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.evaluation_interval:type_name -> google.protobuf.Duration 19, // 37: google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.labels:type_name -> google.monitoring.v3.AlertPolicy.Condition.PrometheusQueryLanguageCondition.LabelsEntry 20, // 38: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.minutes:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Minutes 21, // 39: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.hourly:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Hourly 22, // 40: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.daily:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Daily 23, // 41: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.row_count_test:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.RowCountTest 24, // 42: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.boolean_test:type_name -> google.monitoring.v3.AlertPolicy.Condition.SqlCondition.BooleanTest 30, // 43: google.monitoring.v3.AlertPolicy.Condition.MetricThreshold.ForecastOptions.forecast_horizon:type_name -> google.protobuf.Duration 33, // 44: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.Daily.execution_time:type_name -> google.type.TimeOfDay 32, // 45: google.monitoring.v3.AlertPolicy.Condition.SqlCondition.RowCountTest.comparison:type_name -> google.monitoring.v3.ComparisonType 30, // 46: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationRateLimit.period:type_name -> google.protobuf.Duration 30, // 47: google.monitoring.v3.AlertPolicy.AlertStrategy.NotificationChannelStrategy.renotify_interval:type_name -> google.protobuf.Duration 48, // [48:48] is the sub-list for method output_type 48, // [48:48] is the sub-list for method input_type 48, // [48:48] is the sub-list for extension type_name 48, // [48:48] is the sub-list for extension extendee 0, // [0:48] is the sub-list for field type_name } func init() { file_google_monitoring_v3_alert_proto_init() } func file_google_monitoring_v3_alert_proto_init() { if File_google_monitoring_v3_alert_proto != nil { return } file_google_monitoring_v3_common_proto_init() file_google_monitoring_v3_mutation_record_proto_init() file_google_monitoring_v3_alert_proto_msgTypes[2].OneofWrappers = []any{ (*AlertPolicy_Condition_ConditionThreshold)(nil), (*AlertPolicy_Condition_ConditionAbsent)(nil), (*AlertPolicy_Condition_ConditionMatchedLog)(nil), (*AlertPolicy_Condition_ConditionMonitoringQueryLanguage)(nil), (*AlertPolicy_Condition_ConditionPrometheusQueryLanguage)(nil), (*AlertPolicy_Condition_ConditionSql)(nil), } file_google_monitoring_v3_alert_proto_msgTypes[6].OneofWrappers = []any{ (*AlertPolicy_Condition_Trigger_Count)(nil), (*AlertPolicy_Condition_Trigger_Percent)(nil), } file_google_monitoring_v3_alert_proto_msgTypes[12].OneofWrappers = []any{ (*AlertPolicy_Condition_SqlCondition_Minutes_)(nil), (*AlertPolicy_Condition_SqlCondition_Hourly_)(nil), (*AlertPolicy_Condition_SqlCondition_Daily_)(nil), (*AlertPolicy_Condition_SqlCondition_RowCountTest_)(nil), (*AlertPolicy_Condition_SqlCondition_BooleanTest_)(nil), } file_google_monitoring_v3_alert_proto_msgTypes[17].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_alert_proto_rawDesc, NumEnums: 4, NumMessages: 23, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_alert_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_alert_proto_depIdxs, EnumInfos: file_google_monitoring_v3_alert_proto_enumTypes, MessageInfos: file_google_monitoring_v3_alert_proto_msgTypes, }.Build() File_google_monitoring_v3_alert_proto = out.File file_google_monitoring_v3_alert_proto_rawDesc = nil file_google_monitoring_v3_alert_proto_goTypes = nil file_google_monitoring_v3_alert_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/alert_service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/alert_service.proto package monitoringpb import ( context "context" reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The protocol for the `CreateAlertPolicy` request. type CreateAlertPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) in which // to create the alerting policy. The format is: // // projects/[PROJECT_ID_OR_NUMBER] // // Note that this field names the parent container in which the alerting // policy will be written, not the name of the created policy. |name| must be // a host project of a Metrics Scope, otherwise INVALID_ARGUMENT error will // return. The alerting policy that is returned will have a name that contains // a normalized representation of this name as a prefix but adds a suffix of // the form `/alertPolicies/[ALERT_POLICY_ID]`, identifying the policy in the // container. Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // Required. The requested alerting policy. You should omit the `name` field // in this policy. The name will be returned in the new policy, including a // new `[ALERT_POLICY_ID]` value. AlertPolicy *AlertPolicy `protobuf:"bytes,2,opt,name=alert_policy,json=alertPolicy,proto3" json:"alert_policy,omitempty"` } func (x *CreateAlertPolicyRequest) Reset() { *x = CreateAlertPolicyRequest{} mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateAlertPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateAlertPolicyRequest) ProtoMessage() {} func (x *CreateAlertPolicyRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateAlertPolicyRequest.ProtoReflect.Descriptor instead. func (*CreateAlertPolicyRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{0} } func (x *CreateAlertPolicyRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *CreateAlertPolicyRequest) GetAlertPolicy() *AlertPolicy { if x != nil { return x.AlertPolicy } return nil } // The protocol for the `GetAlertPolicy` request. type GetAlertPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The alerting policy to retrieve. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID] Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetAlertPolicyRequest) Reset() { *x = GetAlertPolicyRequest{} mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetAlertPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetAlertPolicyRequest) ProtoMessage() {} func (x *GetAlertPolicyRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetAlertPolicyRequest.ProtoReflect.Descriptor instead. func (*GetAlertPolicyRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{1} } func (x *GetAlertPolicyRequest) GetName() string { if x != nil { return x.Name } return "" } // The protocol for the `ListAlertPolicies` request. type ListAlertPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) whose // alert policies are to be listed. The format is: // // projects/[PROJECT_ID_OR_NUMBER] // // Note that this field names the parent container in which the alerting // policies to be listed are stored. To retrieve a single alerting policy // by name, use the // [GetAlertPolicy][google.monitoring.v3.AlertPolicyService.GetAlertPolicy] // operation, instead. Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` // Optional. If provided, this field specifies the criteria that must be met // by alert policies to be included in the response. // // For more details, see [sorting and // filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering). Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` // Optional. A comma-separated list of fields by which to sort the result. // Supports the same set of field references as the `filter` field. Entries // can be prefixed with a minus sign to sort by the field in descending order. // // For more details, see [sorting and // filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering). OrderBy string `protobuf:"bytes,6,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` // Optional. The maximum number of results to return in a single response. PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Optional. If this field is not empty then it must contain the // `nextPageToken` value returned by a previous call to this method. Using // this field causes the method to return more results from the previous // method call. PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListAlertPoliciesRequest) Reset() { *x = ListAlertPoliciesRequest{} mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListAlertPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListAlertPoliciesRequest) ProtoMessage() {} func (x *ListAlertPoliciesRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListAlertPoliciesRequest.ProtoReflect.Descriptor instead. func (*ListAlertPoliciesRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{2} } func (x *ListAlertPoliciesRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *ListAlertPoliciesRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListAlertPoliciesRequest) GetOrderBy() string { if x != nil { return x.OrderBy } return "" } func (x *ListAlertPoliciesRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListAlertPoliciesRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The protocol for the `ListAlertPolicies` response. type ListAlertPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The returned alert policies. AlertPolicies []*AlertPolicy `protobuf:"bytes,3,rep,name=alert_policies,json=alertPolicies,proto3" json:"alert_policies,omitempty"` // If there might be more results than were returned, then this field is set // to a non-empty value. To see the additional results, // use that value as `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` // The total number of alert policies in all pages. This number is only an // estimate, and may change in subsequent pages. https://aip.dev/158 TotalSize int32 `protobuf:"varint,4,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` } func (x *ListAlertPoliciesResponse) Reset() { *x = ListAlertPoliciesResponse{} mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListAlertPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListAlertPoliciesResponse) ProtoMessage() {} func (x *ListAlertPoliciesResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListAlertPoliciesResponse.ProtoReflect.Descriptor instead. func (*ListAlertPoliciesResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{3} } func (x *ListAlertPoliciesResponse) GetAlertPolicies() []*AlertPolicy { if x != nil { return x.AlertPolicies } return nil } func (x *ListAlertPoliciesResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } func (x *ListAlertPoliciesResponse) GetTotalSize() int32 { if x != nil { return x.TotalSize } return 0 } // The protocol for the `UpdateAlertPolicy` request. type UpdateAlertPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Optional. A list of alerting policy field names. If this field is not // empty, each listed field in the existing alerting policy is set to the // value of the corresponding field in the supplied policy (`alert_policy`), // or to the field's default value if the field is not in the supplied // alerting policy. Fields not listed retain their previous value. // // Examples of valid field masks include `display_name`, `documentation`, // `documentation.content`, `documentation.mime_type`, `user_labels`, // `user_label.nameofkey`, `enabled`, `conditions`, `combiner`, etc. // // If this field is empty, then the supplied alerting policy replaces the // existing policy. It is the same as deleting the existing policy and // adding the supplied policy, except for the following: // // - The new policy will have the same `[ALERT_POLICY_ID]` as the former // policy. This gives you continuity with the former policy in your // notifications and incidents. // - Conditions in the new policy will keep their former `[CONDITION_ID]` if // the supplied condition includes the `name` field with that // `[CONDITION_ID]`. If the supplied condition omits the `name` field, // then a new `[CONDITION_ID]` is created. UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` // Required. The updated alerting policy or the updated values for the // fields listed in `update_mask`. // If `update_mask` is not empty, any fields in this policy that are // not in `update_mask` are ignored. AlertPolicy *AlertPolicy `protobuf:"bytes,3,opt,name=alert_policy,json=alertPolicy,proto3" json:"alert_policy,omitempty"` } func (x *UpdateAlertPolicyRequest) Reset() { *x = UpdateAlertPolicyRequest{} mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateAlertPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateAlertPolicyRequest) ProtoMessage() {} func (x *UpdateAlertPolicyRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateAlertPolicyRequest.ProtoReflect.Descriptor instead. func (*UpdateAlertPolicyRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{4} } func (x *UpdateAlertPolicyRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } func (x *UpdateAlertPolicyRequest) GetAlertPolicy() *AlertPolicy { if x != nil { return x.AlertPolicy } return nil } // The protocol for the `DeleteAlertPolicy` request. type DeleteAlertPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The alerting policy to delete. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID] // // For more information, see [AlertPolicy][google.monitoring.v3.AlertPolicy]. Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *DeleteAlertPolicyRequest) Reset() { *x = DeleteAlertPolicyRequest{} mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteAlertPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteAlertPolicyRequest) ProtoMessage() {} func (x *DeleteAlertPolicyRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_alert_service_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteAlertPolicyRequest.ProtoReflect.Descriptor instead. func (*DeleteAlertPolicyRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_alert_service_proto_rawDescGZIP(), []int{5} } func (x *DeleteAlertPolicyRequest) GetName() string { if x != nil { return x.Name } return "" } var File_google_monitoring_v3_alert_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_alert_service_proto_rawDesc = []byte{ 0x0a, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa8, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x12, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x12, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xac, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x49, 0x0a, 0x0c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5d, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x9e, 0x08, 0x0a, 0x12, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa8, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x34, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb5, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x4d, 0xda, 0x41, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x0c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x23, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x34, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x2a, 0x25, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xcb, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x63, 0xda, 0x41, 0x18, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x3a, 0x0c, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x32, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xcc, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x11, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_alert_service_proto_rawDescOnce sync.Once file_google_monitoring_v3_alert_service_proto_rawDescData = file_google_monitoring_v3_alert_service_proto_rawDesc ) func file_google_monitoring_v3_alert_service_proto_rawDescGZIP() []byte { file_google_monitoring_v3_alert_service_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_alert_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_alert_service_proto_rawDescData) }) return file_google_monitoring_v3_alert_service_proto_rawDescData } var file_google_monitoring_v3_alert_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_google_monitoring_v3_alert_service_proto_goTypes = []any{ (*CreateAlertPolicyRequest)(nil), // 0: google.monitoring.v3.CreateAlertPolicyRequest (*GetAlertPolicyRequest)(nil), // 1: google.monitoring.v3.GetAlertPolicyRequest (*ListAlertPoliciesRequest)(nil), // 2: google.monitoring.v3.ListAlertPoliciesRequest (*ListAlertPoliciesResponse)(nil), // 3: google.monitoring.v3.ListAlertPoliciesResponse (*UpdateAlertPolicyRequest)(nil), // 4: google.monitoring.v3.UpdateAlertPolicyRequest (*DeleteAlertPolicyRequest)(nil), // 5: google.monitoring.v3.DeleteAlertPolicyRequest (*AlertPolicy)(nil), // 6: google.monitoring.v3.AlertPolicy (*fieldmaskpb.FieldMask)(nil), // 7: google.protobuf.FieldMask (*emptypb.Empty)(nil), // 8: google.protobuf.Empty } var file_google_monitoring_v3_alert_service_proto_depIdxs = []int32{ 6, // 0: google.monitoring.v3.CreateAlertPolicyRequest.alert_policy:type_name -> google.monitoring.v3.AlertPolicy 6, // 1: google.monitoring.v3.ListAlertPoliciesResponse.alert_policies:type_name -> google.monitoring.v3.AlertPolicy 7, // 2: google.monitoring.v3.UpdateAlertPolicyRequest.update_mask:type_name -> google.protobuf.FieldMask 6, // 3: google.monitoring.v3.UpdateAlertPolicyRequest.alert_policy:type_name -> google.monitoring.v3.AlertPolicy 2, // 4: google.monitoring.v3.AlertPolicyService.ListAlertPolicies:input_type -> google.monitoring.v3.ListAlertPoliciesRequest 1, // 5: google.monitoring.v3.AlertPolicyService.GetAlertPolicy:input_type -> google.monitoring.v3.GetAlertPolicyRequest 0, // 6: google.monitoring.v3.AlertPolicyService.CreateAlertPolicy:input_type -> google.monitoring.v3.CreateAlertPolicyRequest 5, // 7: google.monitoring.v3.AlertPolicyService.DeleteAlertPolicy:input_type -> google.monitoring.v3.DeleteAlertPolicyRequest 4, // 8: google.monitoring.v3.AlertPolicyService.UpdateAlertPolicy:input_type -> google.monitoring.v3.UpdateAlertPolicyRequest 3, // 9: google.monitoring.v3.AlertPolicyService.ListAlertPolicies:output_type -> google.monitoring.v3.ListAlertPoliciesResponse 6, // 10: google.monitoring.v3.AlertPolicyService.GetAlertPolicy:output_type -> google.monitoring.v3.AlertPolicy 6, // 11: google.monitoring.v3.AlertPolicyService.CreateAlertPolicy:output_type -> google.monitoring.v3.AlertPolicy 8, // 12: google.monitoring.v3.AlertPolicyService.DeleteAlertPolicy:output_type -> google.protobuf.Empty 6, // 13: google.monitoring.v3.AlertPolicyService.UpdateAlertPolicy:output_type -> google.monitoring.v3.AlertPolicy 9, // [9:14] is the sub-list for method output_type 4, // [4:9] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name 4, // [4:4] is the sub-list for extension extendee 0, // [0:4] is the sub-list for field type_name } func init() { file_google_monitoring_v3_alert_service_proto_init() } func file_google_monitoring_v3_alert_service_proto_init() { if File_google_monitoring_v3_alert_service_proto != nil { return } file_google_monitoring_v3_alert_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_alert_service_proto_rawDesc, NumEnums: 0, NumMessages: 6, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_monitoring_v3_alert_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_alert_service_proto_depIdxs, MessageInfos: file_google_monitoring_v3_alert_service_proto_msgTypes, }.Build() File_google_monitoring_v3_alert_service_proto = out.File file_google_monitoring_v3_alert_service_proto_rawDesc = nil file_google_monitoring_v3_alert_service_proto_goTypes = nil file_google_monitoring_v3_alert_service_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // AlertPolicyServiceClient is the client API for AlertPolicyService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type AlertPolicyServiceClient interface { // Lists the existing alerting policies for the workspace. ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) // Gets a single alerting policy. GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) // Creates a new alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) // Deletes an alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Updates an alerting policy. You can either replace the entire policy with // a new one or replace only certain fields in the current alerting policy by // specifying the fields to be updated via `updateMask`. Returns the // updated alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) } type alertPolicyServiceClient struct { cc grpc.ClientConnInterface } func NewAlertPolicyServiceClient(cc grpc.ClientConnInterface) AlertPolicyServiceClient { return &alertPolicyServiceClient{cc} } func (c *alertPolicyServiceClient) ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) { out := new(ListAlertPoliciesResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/ListAlertPolicies", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *alertPolicyServiceClient) GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { out := new(AlertPolicy) err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/GetAlertPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *alertPolicyServiceClient) CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { out := new(AlertPolicy) err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *alertPolicyServiceClient) DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *alertPolicyServiceClient) UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { out := new(AlertPolicy) err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } // AlertPolicyServiceServer is the server API for AlertPolicyService service. type AlertPolicyServiceServer interface { // Lists the existing alerting policies for the workspace. ListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) // Gets a single alerting policy. GetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error) // Creates a new alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. CreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error) // Deletes an alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. DeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*emptypb.Empty, error) // Updates an alerting policy. You can either replace the entire policy with // a new one or replace only certain fields in the current alerting policy by // specifying the fields to be updated via `updateMask`. Returns the // updated alerting policy. // // Design your application to single-thread API calls that modify the state of // alerting policies in a single project. This includes calls to // CreateAlertPolicy, DeleteAlertPolicy and UpdateAlertPolicy. UpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error) } // UnimplementedAlertPolicyServiceServer can be embedded to have forward compatible implementations. type UnimplementedAlertPolicyServiceServer struct { } func (*UnimplementedAlertPolicyServiceServer) ListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListAlertPolicies not implemented") } func (*UnimplementedAlertPolicyServiceServer) GetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAlertPolicy not implemented") } func (*UnimplementedAlertPolicyServiceServer) CreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateAlertPolicy not implemented") } func (*UnimplementedAlertPolicyServiceServer) DeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteAlertPolicy not implemented") } func (*UnimplementedAlertPolicyServiceServer) UpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateAlertPolicy not implemented") } func RegisterAlertPolicyServiceServer(s *grpc.Server, srv AlertPolicyServiceServer) { s.RegisterService(&_AlertPolicyService_serviceDesc, srv) } func _AlertPolicyService_ListAlertPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListAlertPoliciesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.AlertPolicyService/ListAlertPolicies", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, req.(*ListAlertPoliciesRequest)) } return interceptor(ctx, in, info, handler) } func _AlertPolicyService_GetAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetAlertPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.AlertPolicyService/GetAlertPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, req.(*GetAlertPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _AlertPolicyService_CreateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateAlertPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, req.(*CreateAlertPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _AlertPolicyService_DeleteAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteAlertPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, req.(*DeleteAlertPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _AlertPolicyService_UpdateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateAlertPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, req.(*UpdateAlertPolicyRequest)) } return interceptor(ctx, in, info, handler) } var _AlertPolicyService_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.monitoring.v3.AlertPolicyService", HandlerType: (*AlertPolicyServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "ListAlertPolicies", Handler: _AlertPolicyService_ListAlertPolicies_Handler, }, { MethodName: "GetAlertPolicy", Handler: _AlertPolicyService_GetAlertPolicy_Handler, }, { MethodName: "CreateAlertPolicy", Handler: _AlertPolicyService_CreateAlertPolicy_Handler, }, { MethodName: "DeleteAlertPolicy", Handler: _AlertPolicyService_DeleteAlertPolicy_Handler, }, { MethodName: "UpdateAlertPolicy", Handler: _AlertPolicyService_UpdateAlertPolicy_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/monitoring/v3/alert_service.proto", } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/common.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/common.proto package monitoringpb import ( reflect "reflect" sync "sync" distribution "google.golang.org/genproto/googleapis/api/distribution" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Specifies an ordering relationship on two arguments, called `left` and // `right`. type ComparisonType int32 const ( // No ordering relationship is specified. ComparisonType_COMPARISON_UNSPECIFIED ComparisonType = 0 // True if the left argument is greater than the right argument. ComparisonType_COMPARISON_GT ComparisonType = 1 // True if the left argument is greater than or equal to the right argument. ComparisonType_COMPARISON_GE ComparisonType = 2 // True if the left argument is less than the right argument. ComparisonType_COMPARISON_LT ComparisonType = 3 // True if the left argument is less than or equal to the right argument. ComparisonType_COMPARISON_LE ComparisonType = 4 // True if the left argument is equal to the right argument. ComparisonType_COMPARISON_EQ ComparisonType = 5 // True if the left argument is not equal to the right argument. ComparisonType_COMPARISON_NE ComparisonType = 6 ) // Enum value maps for ComparisonType. var ( ComparisonType_name = map[int32]string{ 0: "COMPARISON_UNSPECIFIED", 1: "COMPARISON_GT", 2: "COMPARISON_GE", 3: "COMPARISON_LT", 4: "COMPARISON_LE", 5: "COMPARISON_EQ", 6: "COMPARISON_NE", } ComparisonType_value = map[string]int32{ "COMPARISON_UNSPECIFIED": 0, "COMPARISON_GT": 1, "COMPARISON_GE": 2, "COMPARISON_LT": 3, "COMPARISON_LE": 4, "COMPARISON_EQ": 5, "COMPARISON_NE": 6, } ) func (x ComparisonType) Enum() *ComparisonType { p := new(ComparisonType) *p = x return p } func (x ComparisonType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ComparisonType) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_common_proto_enumTypes[0].Descriptor() } func (ComparisonType) Type() protoreflect.EnumType { return &file_google_monitoring_v3_common_proto_enumTypes[0] } func (x ComparisonType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use ComparisonType.Descriptor instead. func (ComparisonType) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{0} } // The tier of service for a Metrics Scope. Please see the // [service tiers // documentation](https://cloud.google.com/monitoring/workspaces/tiers) for more // details. // // Deprecated: Marked as deprecated in google/monitoring/v3/common.proto. type ServiceTier int32 const ( // An invalid sentinel value, used to indicate that a tier has not // been provided explicitly. ServiceTier_SERVICE_TIER_UNSPECIFIED ServiceTier = 0 // The Cloud Monitoring Basic tier, a free tier of service that provides basic // features, a moderate allotment of logs, and access to built-in metrics. // A number of features are not available in this tier. For more details, // see [the service tiers // documentation](https://cloud.google.com/monitoring/workspaces/tiers). ServiceTier_SERVICE_TIER_BASIC ServiceTier = 1 // The Cloud Monitoring Premium tier, a higher, more expensive tier of service // that provides access to all Cloud Monitoring features, lets you use Cloud // Monitoring with AWS accounts, and has a larger allotments for logs and // metrics. For more details, see [the service tiers // documentation](https://cloud.google.com/monitoring/workspaces/tiers). ServiceTier_SERVICE_TIER_PREMIUM ServiceTier = 2 ) // Enum value maps for ServiceTier. var ( ServiceTier_name = map[int32]string{ 0: "SERVICE_TIER_UNSPECIFIED", 1: "SERVICE_TIER_BASIC", 2: "SERVICE_TIER_PREMIUM", } ServiceTier_value = map[string]int32{ "SERVICE_TIER_UNSPECIFIED": 0, "SERVICE_TIER_BASIC": 1, "SERVICE_TIER_PREMIUM": 2, } ) func (x ServiceTier) Enum() *ServiceTier { p := new(ServiceTier) *p = x return p } func (x ServiceTier) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ServiceTier) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_common_proto_enumTypes[1].Descriptor() } func (ServiceTier) Type() protoreflect.EnumType { return &file_google_monitoring_v3_common_proto_enumTypes[1] } func (x ServiceTier) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use ServiceTier.Descriptor instead. func (ServiceTier) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{1} } // The `Aligner` specifies the operation that will be applied to the data // points in each alignment period in a time series. Except for // `ALIGN_NONE`, which specifies that no operation be applied, each alignment // operation replaces the set of data values in each alignment period with // a single value: the result of applying the operation to the data values. // An aligned time series has a single data value at the end of each // `alignment_period`. // // An alignment operation can change the data type of the values, too. For // example, if you apply a counting operation to boolean values, the data // `value_type` in the original time series is `BOOLEAN`, but the `value_type` // in the aligned result is `INT64`. type Aggregation_Aligner int32 const ( // No alignment. Raw data is returned. Not valid if cross-series reduction // is requested. The `value_type` of the result is the same as the // `value_type` of the input. Aggregation_ALIGN_NONE Aggregation_Aligner = 0 // Align and convert to // [DELTA][google.api.MetricDescriptor.MetricKind.DELTA]. // The output is `delta = y1 - y0`. // // This alignment is valid for // [CUMULATIVE][google.api.MetricDescriptor.MetricKind.CUMULATIVE] and // `DELTA` metrics. If the selected alignment period results in periods // with no data, then the aligned value for such a period is created by // interpolation. The `value_type` of the aligned result is the same as // the `value_type` of the input. Aggregation_ALIGN_DELTA Aggregation_Aligner = 1 // Align and convert to a rate. The result is computed as // `rate = (y1 - y0)/(t1 - t0)`, or "delta over time". // Think of this aligner as providing the slope of the line that passes // through the value at the start and at the end of the `alignment_period`. // // This aligner is valid for `CUMULATIVE` // and `DELTA` metrics with numeric values. If the selected alignment // period results in periods with no data, then the aligned value for // such a period is created by interpolation. The output is a `GAUGE` // metric with `value_type` `DOUBLE`. // // If, by "rate", you mean "percentage change", see the // `ALIGN_PERCENT_CHANGE` aligner instead. Aggregation_ALIGN_RATE Aggregation_Aligner = 2 // Align by interpolating between adjacent points around the alignment // period boundary. This aligner is valid for `GAUGE` metrics with // numeric values. The `value_type` of the aligned result is the same as the // `value_type` of the input. Aggregation_ALIGN_INTERPOLATE Aggregation_Aligner = 3 // Align by moving the most recent data point before the end of the // alignment period to the boundary at the end of the alignment // period. This aligner is valid for `GAUGE` metrics. The `value_type` of // the aligned result is the same as the `value_type` of the input. Aggregation_ALIGN_NEXT_OLDER Aggregation_Aligner = 4 // Align the time series by returning the minimum value in each alignment // period. This aligner is valid for `GAUGE` and `DELTA` metrics with // numeric values. The `value_type` of the aligned result is the same as // the `value_type` of the input. Aggregation_ALIGN_MIN Aggregation_Aligner = 10 // Align the time series by returning the maximum value in each alignment // period. This aligner is valid for `GAUGE` and `DELTA` metrics with // numeric values. The `value_type` of the aligned result is the same as // the `value_type` of the input. Aggregation_ALIGN_MAX Aggregation_Aligner = 11 // Align the time series by returning the mean value in each alignment // period. This aligner is valid for `GAUGE` and `DELTA` metrics with // numeric values. The `value_type` of the aligned result is `DOUBLE`. Aggregation_ALIGN_MEAN Aggregation_Aligner = 12 // Align the time series by returning the number of values in each alignment // period. This aligner is valid for `GAUGE` and `DELTA` metrics with // numeric or Boolean values. The `value_type` of the aligned result is // `INT64`. Aggregation_ALIGN_COUNT Aggregation_Aligner = 13 // Align the time series by returning the sum of the values in each // alignment period. This aligner is valid for `GAUGE` and `DELTA` // metrics with numeric and distribution values. The `value_type` of the // aligned result is the same as the `value_type` of the input. Aggregation_ALIGN_SUM Aggregation_Aligner = 14 // Align the time series by returning the standard deviation of the values // in each alignment period. This aligner is valid for `GAUGE` and // `DELTA` metrics with numeric values. The `value_type` of the output is // `DOUBLE`. Aggregation_ALIGN_STDDEV Aggregation_Aligner = 15 // Align the time series by returning the number of `True` values in // each alignment period. This aligner is valid for `GAUGE` metrics with // Boolean values. The `value_type` of the output is `INT64`. Aggregation_ALIGN_COUNT_TRUE Aggregation_Aligner = 16 // Align the time series by returning the number of `False` values in // each alignment period. This aligner is valid for `GAUGE` metrics with // Boolean values. The `value_type` of the output is `INT64`. Aggregation_ALIGN_COUNT_FALSE Aggregation_Aligner = 24 // Align the time series by returning the ratio of the number of `True` // values to the total number of values in each alignment period. This // aligner is valid for `GAUGE` metrics with Boolean values. The output // value is in the range [0.0, 1.0] and has `value_type` `DOUBLE`. Aggregation_ALIGN_FRACTION_TRUE Aggregation_Aligner = 17 // Align the time series by using [percentile // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting // data point in each alignment period is the 99th percentile of all data // points in the period. This aligner is valid for `GAUGE` and `DELTA` // metrics with distribution values. The output is a `GAUGE` metric with // `value_type` `DOUBLE`. Aggregation_ALIGN_PERCENTILE_99 Aggregation_Aligner = 18 // Align the time series by using [percentile // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting // data point in each alignment period is the 95th percentile of all data // points in the period. This aligner is valid for `GAUGE` and `DELTA` // metrics with distribution values. The output is a `GAUGE` metric with // `value_type` `DOUBLE`. Aggregation_ALIGN_PERCENTILE_95 Aggregation_Aligner = 19 // Align the time series by using [percentile // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting // data point in each alignment period is the 50th percentile of all data // points in the period. This aligner is valid for `GAUGE` and `DELTA` // metrics with distribution values. The output is a `GAUGE` metric with // `value_type` `DOUBLE`. Aggregation_ALIGN_PERCENTILE_50 Aggregation_Aligner = 20 // Align the time series by using [percentile // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting // data point in each alignment period is the 5th percentile of all data // points in the period. This aligner is valid for `GAUGE` and `DELTA` // metrics with distribution values. The output is a `GAUGE` metric with // `value_type` `DOUBLE`. Aggregation_ALIGN_PERCENTILE_05 Aggregation_Aligner = 21 // Align and convert to a percentage change. This aligner is valid for // `GAUGE` and `DELTA` metrics with numeric values. This alignment returns // `((current - previous)/previous) * 100`, where the value of `previous` is // determined based on the `alignment_period`. // // If the values of `current` and `previous` are both 0, then the returned // value is 0. If only `previous` is 0, the returned value is infinity. // // A 10-minute moving mean is computed at each point of the alignment period // prior to the above calculation to smooth the metric and prevent false // positives from very short-lived spikes. The moving mean is only // applicable for data whose values are `>= 0`. Any values `< 0` are // treated as a missing datapoint, and are ignored. While `DELTA` // metrics are accepted by this alignment, special care should be taken that // the values for the metric will always be positive. The output is a // `GAUGE` metric with `value_type` `DOUBLE`. Aggregation_ALIGN_PERCENT_CHANGE Aggregation_Aligner = 23 ) // Enum value maps for Aggregation_Aligner. var ( Aggregation_Aligner_name = map[int32]string{ 0: "ALIGN_NONE", 1: "ALIGN_DELTA", 2: "ALIGN_RATE", 3: "ALIGN_INTERPOLATE", 4: "ALIGN_NEXT_OLDER", 10: "ALIGN_MIN", 11: "ALIGN_MAX", 12: "ALIGN_MEAN", 13: "ALIGN_COUNT", 14: "ALIGN_SUM", 15: "ALIGN_STDDEV", 16: "ALIGN_COUNT_TRUE", 24: "ALIGN_COUNT_FALSE", 17: "ALIGN_FRACTION_TRUE", 18: "ALIGN_PERCENTILE_99", 19: "ALIGN_PERCENTILE_95", 20: "ALIGN_PERCENTILE_50", 21: "ALIGN_PERCENTILE_05", 23: "ALIGN_PERCENT_CHANGE", } Aggregation_Aligner_value = map[string]int32{ "ALIGN_NONE": 0, "ALIGN_DELTA": 1, "ALIGN_RATE": 2, "ALIGN_INTERPOLATE": 3, "ALIGN_NEXT_OLDER": 4, "ALIGN_MIN": 10, "ALIGN_MAX": 11, "ALIGN_MEAN": 12, "ALIGN_COUNT": 13, "ALIGN_SUM": 14, "ALIGN_STDDEV": 15, "ALIGN_COUNT_TRUE": 16, "ALIGN_COUNT_FALSE": 24, "ALIGN_FRACTION_TRUE": 17, "ALIGN_PERCENTILE_99": 18, "ALIGN_PERCENTILE_95": 19, "ALIGN_PERCENTILE_50": 20, "ALIGN_PERCENTILE_05": 21, "ALIGN_PERCENT_CHANGE": 23, } ) func (x Aggregation_Aligner) Enum() *Aggregation_Aligner { p := new(Aggregation_Aligner) *p = x return p } func (x Aggregation_Aligner) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Aggregation_Aligner) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_common_proto_enumTypes[2].Descriptor() } func (Aggregation_Aligner) Type() protoreflect.EnumType { return &file_google_monitoring_v3_common_proto_enumTypes[2] } func (x Aggregation_Aligner) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Aggregation_Aligner.Descriptor instead. func (Aggregation_Aligner) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2, 0} } // A Reducer operation describes how to aggregate data points from multiple // time series into a single time series, where the value of each data point // in the resulting series is a function of all the already aligned values in // the input time series. type Aggregation_Reducer int32 const ( // No cross-time series reduction. The output of the `Aligner` is // returned. Aggregation_REDUCE_NONE Aggregation_Reducer = 0 // Reduce by computing the mean value across time series for each // alignment period. This reducer is valid for // [DELTA][google.api.MetricDescriptor.MetricKind.DELTA] and // [GAUGE][google.api.MetricDescriptor.MetricKind.GAUGE] metrics with // numeric or distribution values. The `value_type` of the output is // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]. Aggregation_REDUCE_MEAN Aggregation_Reducer = 1 // Reduce by computing the minimum value across time series for each // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics // with numeric values. The `value_type` of the output is the same as the // `value_type` of the input. Aggregation_REDUCE_MIN Aggregation_Reducer = 2 // Reduce by computing the maximum value across time series for each // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics // with numeric values. The `value_type` of the output is the same as the // `value_type` of the input. Aggregation_REDUCE_MAX Aggregation_Reducer = 3 // Reduce by computing the sum across time series for each // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics // with numeric and distribution values. The `value_type` of the output is // the same as the `value_type` of the input. Aggregation_REDUCE_SUM Aggregation_Reducer = 4 // Reduce by computing the standard deviation across time series // for each alignment period. This reducer is valid for `DELTA` and // `GAUGE` metrics with numeric or distribution values. The `value_type` // of the output is `DOUBLE`. Aggregation_REDUCE_STDDEV Aggregation_Reducer = 5 // Reduce by computing the number of data points across time series // for each alignment period. This reducer is valid for `DELTA` and // `GAUGE` metrics of numeric, Boolean, distribution, and string // `value_type`. The `value_type` of the output is `INT64`. Aggregation_REDUCE_COUNT Aggregation_Reducer = 6 // Reduce by computing the number of `True`-valued data points across time // series for each alignment period. This reducer is valid for `DELTA` and // `GAUGE` metrics of Boolean `value_type`. The `value_type` of the output // is `INT64`. Aggregation_REDUCE_COUNT_TRUE Aggregation_Reducer = 7 // Reduce by computing the number of `False`-valued data points across time // series for each alignment period. This reducer is valid for `DELTA` and // `GAUGE` metrics of Boolean `value_type`. The `value_type` of the output // is `INT64`. Aggregation_REDUCE_COUNT_FALSE Aggregation_Reducer = 15 // Reduce by computing the ratio of the number of `True`-valued data points // to the total number of data points for each alignment period. This // reducer is valid for `DELTA` and `GAUGE` metrics of Boolean `value_type`. // The output value is in the range [0.0, 1.0] and has `value_type` // `DOUBLE`. Aggregation_REDUCE_FRACTION_TRUE Aggregation_Reducer = 8 // Reduce by computing the [99th // percentile](https://en.wikipedia.org/wiki/Percentile) of data points // across time series for each alignment period. This reducer is valid for // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value // of the output is `DOUBLE`. Aggregation_REDUCE_PERCENTILE_99 Aggregation_Reducer = 9 // Reduce by computing the [95th // percentile](https://en.wikipedia.org/wiki/Percentile) of data points // across time series for each alignment period. This reducer is valid for // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value // of the output is `DOUBLE`. Aggregation_REDUCE_PERCENTILE_95 Aggregation_Reducer = 10 // Reduce by computing the [50th // percentile](https://en.wikipedia.org/wiki/Percentile) of data points // across time series for each alignment period. This reducer is valid for // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value // of the output is `DOUBLE`. Aggregation_REDUCE_PERCENTILE_50 Aggregation_Reducer = 11 // Reduce by computing the [5th // percentile](https://en.wikipedia.org/wiki/Percentile) of data points // across time series for each alignment period. This reducer is valid for // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value // of the output is `DOUBLE`. Aggregation_REDUCE_PERCENTILE_05 Aggregation_Reducer = 12 ) // Enum value maps for Aggregation_Reducer. var ( Aggregation_Reducer_name = map[int32]string{ 0: "REDUCE_NONE", 1: "REDUCE_MEAN", 2: "REDUCE_MIN", 3: "REDUCE_MAX", 4: "REDUCE_SUM", 5: "REDUCE_STDDEV", 6: "REDUCE_COUNT", 7: "REDUCE_COUNT_TRUE", 15: "REDUCE_COUNT_FALSE", 8: "REDUCE_FRACTION_TRUE", 9: "REDUCE_PERCENTILE_99", 10: "REDUCE_PERCENTILE_95", 11: "REDUCE_PERCENTILE_50", 12: "REDUCE_PERCENTILE_05", } Aggregation_Reducer_value = map[string]int32{ "REDUCE_NONE": 0, "REDUCE_MEAN": 1, "REDUCE_MIN": 2, "REDUCE_MAX": 3, "REDUCE_SUM": 4, "REDUCE_STDDEV": 5, "REDUCE_COUNT": 6, "REDUCE_COUNT_TRUE": 7, "REDUCE_COUNT_FALSE": 15, "REDUCE_FRACTION_TRUE": 8, "REDUCE_PERCENTILE_99": 9, "REDUCE_PERCENTILE_95": 10, "REDUCE_PERCENTILE_50": 11, "REDUCE_PERCENTILE_05": 12, } ) func (x Aggregation_Reducer) Enum() *Aggregation_Reducer { p := new(Aggregation_Reducer) *p = x return p } func (x Aggregation_Reducer) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Aggregation_Reducer) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_common_proto_enumTypes[3].Descriptor() } func (Aggregation_Reducer) Type() protoreflect.EnumType { return &file_google_monitoring_v3_common_proto_enumTypes[3] } func (x Aggregation_Reducer) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Aggregation_Reducer.Descriptor instead. func (Aggregation_Reducer) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2, 1} } // A single strongly-typed value. type TypedValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The typed value field. // // Types that are assignable to Value: // // *TypedValue_BoolValue // *TypedValue_Int64Value // *TypedValue_DoubleValue // *TypedValue_StringValue // *TypedValue_DistributionValue Value isTypedValue_Value `protobuf_oneof:"value"` } func (x *TypedValue) Reset() { *x = TypedValue{} mi := &file_google_monitoring_v3_common_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TypedValue) String() string { return protoimpl.X.MessageStringOf(x) } func (*TypedValue) ProtoMessage() {} func (x *TypedValue) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_common_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TypedValue.ProtoReflect.Descriptor instead. func (*TypedValue) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{0} } func (m *TypedValue) GetValue() isTypedValue_Value { if m != nil { return m.Value } return nil } func (x *TypedValue) GetBoolValue() bool { if x, ok := x.GetValue().(*TypedValue_BoolValue); ok { return x.BoolValue } return false } func (x *TypedValue) GetInt64Value() int64 { if x, ok := x.GetValue().(*TypedValue_Int64Value); ok { return x.Int64Value } return 0 } func (x *TypedValue) GetDoubleValue() float64 { if x, ok := x.GetValue().(*TypedValue_DoubleValue); ok { return x.DoubleValue } return 0 } func (x *TypedValue) GetStringValue() string { if x, ok := x.GetValue().(*TypedValue_StringValue); ok { return x.StringValue } return "" } func (x *TypedValue) GetDistributionValue() *distribution.Distribution { if x, ok := x.GetValue().(*TypedValue_DistributionValue); ok { return x.DistributionValue } return nil } type isTypedValue_Value interface { isTypedValue_Value() } type TypedValue_BoolValue struct { // A Boolean value: `true` or `false`. BoolValue bool `protobuf:"varint,1,opt,name=bool_value,json=boolValue,proto3,oneof"` } type TypedValue_Int64Value struct { // A 64-bit integer. Its range is approximately ±9.2x1018. Int64Value int64 `protobuf:"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof"` } type TypedValue_DoubleValue struct { // A 64-bit double-precision floating-point number. Its magnitude // is approximately ±10±300 and it has 16 // significant digits of precision. DoubleValue float64 `protobuf:"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof"` } type TypedValue_StringValue struct { // A variable-length string value. StringValue string `protobuf:"bytes,4,opt,name=string_value,json=stringValue,proto3,oneof"` } type TypedValue_DistributionValue struct { // A distribution value. DistributionValue *distribution.Distribution `protobuf:"bytes,5,opt,name=distribution_value,json=distributionValue,proto3,oneof"` } func (*TypedValue_BoolValue) isTypedValue_Value() {} func (*TypedValue_Int64Value) isTypedValue_Value() {} func (*TypedValue_DoubleValue) isTypedValue_Value() {} func (*TypedValue_StringValue) isTypedValue_Value() {} func (*TypedValue_DistributionValue) isTypedValue_Value() {} // Describes a time interval: // // - Reads: A half-open time interval. It includes the end time but // excludes the start time: `(startTime, endTime]`. The start time // must be specified, must be earlier than the end time, and should be // no older than the data retention period for the metric. // - Writes: A closed time interval. It extends from the start time to the end // time, // and includes both: `[startTime, endTime]`. Valid time intervals // depend on the // [`MetricKind`](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricKind) // of the metric value. The end time must not be earlier than the start // time, and the end time must not be more than 25 hours in the past or more // than five minutes in the future. // - For `GAUGE` metrics, the `startTime` value is technically optional; if // no value is specified, the start time defaults to the value of the // end time, and the interval represents a single point in time. If both // start and end times are specified, they must be identical. Such an // interval is valid only for `GAUGE` metrics, which are point-in-time // measurements. The end time of a new interval must be at least a // millisecond after the end time of the previous interval. // - For `DELTA` metrics, the start time and end time must specify a // non-zero interval, with subsequent points specifying contiguous and // non-overlapping intervals. For `DELTA` metrics, the start time of // the next interval must be at least a millisecond after the end time // of the previous interval. // - For `CUMULATIVE` metrics, the start time and end time must specify a // non-zero interval, with subsequent points specifying the same // start time and increasing end times, until an event resets the // cumulative value to zero and sets a new start time for the following // points. The new start time must be at least a millisecond after the // end time of the previous interval. // - The start time of a new interval must be at least a millisecond after // the // end time of the previous interval because intervals are closed. If the // start time of a new interval is the same as the end time of the // previous interval, then data written at the new start time could // overwrite data written at the previous end time. type TimeInterval struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The end of the time interval. EndTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` // Optional. The beginning of the time interval. The default value // for the start time is the end time. The start time must not be // later than the end time. StartTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` } func (x *TimeInterval) Reset() { *x = TimeInterval{} mi := &file_google_monitoring_v3_common_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TimeInterval) String() string { return protoimpl.X.MessageStringOf(x) } func (*TimeInterval) ProtoMessage() {} func (x *TimeInterval) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_common_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TimeInterval.ProtoReflect.Descriptor instead. func (*TimeInterval) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{1} } func (x *TimeInterval) GetEndTime() *timestamppb.Timestamp { if x != nil { return x.EndTime } return nil } func (x *TimeInterval) GetStartTime() *timestamppb.Timestamp { if x != nil { return x.StartTime } return nil } // Describes how to combine multiple time series to provide a different view of // the data. Aggregation of time series is done in two steps. First, each time // series in the set is _aligned_ to the same time interval boundaries, then the // set of time series is optionally _reduced_ in number. // // Alignment consists of applying the `per_series_aligner` operation // to each time series after its data has been divided into regular // `alignment_period` time intervals. This process takes _all_ of the data // points in an alignment period, applies a mathematical transformation such as // averaging, minimum, maximum, delta, etc., and converts them into a single // data point per period. // // Reduction is when the aligned and transformed time series can optionally be // combined, reducing the number of time series through similar mathematical // transformations. Reduction involves applying a `cross_series_reducer` to // all the time series, optionally sorting the time series into subsets with // `group_by_fields`, and applying the reducer to each subset. // // The raw time series data can contain a huge amount of information from // multiple sources. Alignment and reduction transforms this mass of data into // a more manageable and representative collection of data, for example "the // 95% latency across the average of all tasks in a cluster". This // representative data can be more easily graphed and comprehended, and the // individual time series data is still available for later drilldown. For more // details, see [Filtering and // aggregation](https://cloud.google.com/monitoring/api/v3/aggregation). type Aggregation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The `alignment_period` specifies a time interval, in seconds, that is used // to divide the data in all the // [time series][google.monitoring.v3.TimeSeries] into consistent blocks of // time. This will be done before the per-series aligner can be applied to // the data. // // The value must be at least 60 seconds. If a per-series // aligner other than `ALIGN_NONE` is specified, this field is required or an // error is returned. If no per-series aligner is specified, or the aligner // `ALIGN_NONE` is specified, then this field is ignored. // // The maximum value of the `alignment_period` is 104 weeks (2 years) for // charts, and 90,000 seconds (25 hours) for alerting policies. AlignmentPeriod *durationpb.Duration `protobuf:"bytes,1,opt,name=alignment_period,json=alignmentPeriod,proto3" json:"alignment_period,omitempty"` // An `Aligner` describes how to bring the data points in a single // time series into temporal alignment. Except for `ALIGN_NONE`, all // alignments cause all the data points in an `alignment_period` to be // mathematically grouped together, resulting in a single data point for // each `alignment_period` with end timestamp at the end of the period. // // Not all alignment operations may be applied to all time series. The valid // choices depend on the `metric_kind` and `value_type` of the original time // series. Alignment can change the `metric_kind` or the `value_type` of // the time series. // // Time series data must be aligned in order to perform cross-time // series reduction. If `cross_series_reducer` is specified, then // `per_series_aligner` must be specified and not equal to `ALIGN_NONE` // and `alignment_period` must be specified; otherwise, an error is // returned. PerSeriesAligner Aggregation_Aligner `protobuf:"varint,2,opt,name=per_series_aligner,json=perSeriesAligner,proto3,enum=google.monitoring.v3.Aggregation_Aligner" json:"per_series_aligner,omitempty"` // The reduction operation to be used to combine time series into a single // time series, where the value of each data point in the resulting series is // a function of all the already aligned values in the input time series. // // Not all reducer operations can be applied to all time series. The valid // choices depend on the `metric_kind` and the `value_type` of the original // time series. Reduction can yield a time series with a different // `metric_kind` or `value_type` than the input time series. // // Time series data must first be aligned (see `per_series_aligner`) in order // to perform cross-time series reduction. If `cross_series_reducer` is // specified, then `per_series_aligner` must be specified, and must not be // `ALIGN_NONE`. An `alignment_period` must also be specified; otherwise, an // error is returned. CrossSeriesReducer Aggregation_Reducer `protobuf:"varint,4,opt,name=cross_series_reducer,json=crossSeriesReducer,proto3,enum=google.monitoring.v3.Aggregation_Reducer" json:"cross_series_reducer,omitempty"` // The set of fields to preserve when `cross_series_reducer` is // specified. The `group_by_fields` determine how the time series are // partitioned into subsets prior to applying the aggregation // operation. Each subset contains time series that have the same // value for each of the grouping fields. Each individual time // series is a member of exactly one subset. The // `cross_series_reducer` is applied to each subset of time series. // It is not possible to reduce across different resource types, so // this field implicitly contains `resource.type`. Fields not // specified in `group_by_fields` are aggregated away. If // `group_by_fields` is not specified and all the time series have // the same resource type, then the time series are aggregated into // a single output time series. If `cross_series_reducer` is not // defined, this field is ignored. GroupByFields []string `protobuf:"bytes,5,rep,name=group_by_fields,json=groupByFields,proto3" json:"group_by_fields,omitempty"` } func (x *Aggregation) Reset() { *x = Aggregation{} mi := &file_google_monitoring_v3_common_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Aggregation) String() string { return protoimpl.X.MessageStringOf(x) } func (*Aggregation) ProtoMessage() {} func (x *Aggregation) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_common_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Aggregation.ProtoReflect.Descriptor instead. func (*Aggregation) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_common_proto_rawDescGZIP(), []int{2} } func (x *Aggregation) GetAlignmentPeriod() *durationpb.Duration { if x != nil { return x.AlignmentPeriod } return nil } func (x *Aggregation) GetPerSeriesAligner() Aggregation_Aligner { if x != nil { return x.PerSeriesAligner } return Aggregation_ALIGN_NONE } func (x *Aggregation) GetCrossSeriesReducer() Aggregation_Reducer { if x != nil { return x.CrossSeriesReducer } return Aggregation_REDUCE_NONE } func (x *Aggregation) GetGroupByFields() []string { if x != nil { return x.GroupByFields } return nil } var File_google_monitoring_v3_common_proto protoreflect.FileDescriptor var file_google_monitoring_v3_common_proto_rawDesc = []byte{ 0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xee, 0x01, 0x0a, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf3, 0x07, 0x0a, 0x0b, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x10, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x57, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x10, 0x70, 0x65, 0x72, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x14, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x72, 0x52, 0x12, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x8b, 0x03, 0x0a, 0x07, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x54, 0x41, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x50, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4e, 0x45, 0x58, 0x54, 0x5f, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x0a, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x4d, 0x45, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x53, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x53, 0x54, 0x44, 0x44, 0x45, 0x56, 0x10, 0x0f, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10, 0x10, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x18, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39, 0x39, 0x10, 0x12, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39, 0x35, 0x10, 0x13, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x35, 0x30, 0x10, 0x14, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x30, 0x35, 0x10, 0x15, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x4c, 0x49, 0x47, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x17, 0x22, 0xb1, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x53, 0x55, 0x4d, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x44, 0x44, 0x45, 0x56, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x0f, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x55, 0x45, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39, 0x39, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x39, 0x35, 0x10, 0x0a, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x35, 0x30, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x49, 0x4c, 0x45, 0x5f, 0x30, 0x35, 0x10, 0x0c, 0x2a, 0x9e, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x47, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x47, 0x45, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x54, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x45, 0x51, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x45, 0x10, 0x06, 0x2a, 0x61, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x45, 0x52, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x45, 0x4d, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x1a, 0x02, 0x18, 0x01, 0x42, 0xcd, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xa2, 0x02, 0x04, 0x47, 0x4d, 0x4f, 0x4e, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_common_proto_rawDescOnce sync.Once file_google_monitoring_v3_common_proto_rawDescData = file_google_monitoring_v3_common_proto_rawDesc ) func file_google_monitoring_v3_common_proto_rawDescGZIP() []byte { file_google_monitoring_v3_common_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_common_proto_rawDescData) }) return file_google_monitoring_v3_common_proto_rawDescData } var file_google_monitoring_v3_common_proto_enumTypes = make([]protoimpl.EnumInfo, 4) var file_google_monitoring_v3_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_google_monitoring_v3_common_proto_goTypes = []any{ (ComparisonType)(0), // 0: google.monitoring.v3.ComparisonType (ServiceTier)(0), // 1: google.monitoring.v3.ServiceTier (Aggregation_Aligner)(0), // 2: google.monitoring.v3.Aggregation.Aligner (Aggregation_Reducer)(0), // 3: google.monitoring.v3.Aggregation.Reducer (*TypedValue)(nil), // 4: google.monitoring.v3.TypedValue (*TimeInterval)(nil), // 5: google.monitoring.v3.TimeInterval (*Aggregation)(nil), // 6: google.monitoring.v3.Aggregation (*distribution.Distribution)(nil), // 7: google.api.Distribution (*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp (*durationpb.Duration)(nil), // 9: google.protobuf.Duration } var file_google_monitoring_v3_common_proto_depIdxs = []int32{ 7, // 0: google.monitoring.v3.TypedValue.distribution_value:type_name -> google.api.Distribution 8, // 1: google.monitoring.v3.TimeInterval.end_time:type_name -> google.protobuf.Timestamp 8, // 2: google.monitoring.v3.TimeInterval.start_time:type_name -> google.protobuf.Timestamp 9, // 3: google.monitoring.v3.Aggregation.alignment_period:type_name -> google.protobuf.Duration 2, // 4: google.monitoring.v3.Aggregation.per_series_aligner:type_name -> google.monitoring.v3.Aggregation.Aligner 3, // 5: google.monitoring.v3.Aggregation.cross_series_reducer:type_name -> google.monitoring.v3.Aggregation.Reducer 6, // [6:6] is the sub-list for method output_type 6, // [6:6] is the sub-list for method input_type 6, // [6:6] is the sub-list for extension type_name 6, // [6:6] is the sub-list for extension extendee 0, // [0:6] is the sub-list for field type_name } func init() { file_google_monitoring_v3_common_proto_init() } func file_google_monitoring_v3_common_proto_init() { if File_google_monitoring_v3_common_proto != nil { return } file_google_monitoring_v3_common_proto_msgTypes[0].OneofWrappers = []any{ (*TypedValue_BoolValue)(nil), (*TypedValue_Int64Value)(nil), (*TypedValue_DoubleValue)(nil), (*TypedValue_StringValue)(nil), (*TypedValue_DistributionValue)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_common_proto_rawDesc, NumEnums: 4, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_common_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_common_proto_depIdxs, EnumInfos: file_google_monitoring_v3_common_proto_enumTypes, MessageInfos: file_google_monitoring_v3_common_proto_msgTypes, }.Build() File_google_monitoring_v3_common_proto = out.File file_google_monitoring_v3_common_proto_rawDesc = nil file_google_monitoring_v3_common_proto_goTypes = nil file_google_monitoring_v3_common_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/dropped_labels.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/dropped_labels.proto package monitoringpb import ( reflect "reflect" sync "sync" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // A set of (label, value) pairs that were removed from a Distribution // time series during aggregation and then added as an attachment to a // Distribution.Exemplar. // // The full label set for the exemplars is constructed by using the dropped // pairs in combination with the label values that remain on the aggregated // Distribution time series. The constructed full label set can be used to // identify the specific entity, such as the instance or job, which might be // contributing to a long-tail. However, with dropped labels, the storage // requirements are reduced because only the aggregated distribution values for // a large group of time series are stored. // // Note that there are no guarantees on ordering of the labels from // exemplar-to-exemplar and from distribution-to-distribution in the same // stream, and there may be duplicates. It is up to clients to resolve any // ambiguities. type DroppedLabels struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Map from label to its value, for all labels dropped in any aggregation. Label map[string]string `protobuf:"bytes,1,rep,name=label,proto3" json:"label,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *DroppedLabels) Reset() { *x = DroppedLabels{} mi := &file_google_monitoring_v3_dropped_labels_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DroppedLabels) String() string { return protoimpl.X.MessageStringOf(x) } func (*DroppedLabels) ProtoMessage() {} func (x *DroppedLabels) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_dropped_labels_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DroppedLabels.ProtoReflect.Descriptor instead. func (*DroppedLabels) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_dropped_labels_proto_rawDescGZIP(), []int{0} } func (x *DroppedLabels) GetLabel() map[string]string { if x != nil { return x.Label } return nil } var File_google_monitoring_v3_dropped_labels_proto protoreflect.FileDescriptor var file_google_monitoring_v3_dropped_labels_proto_rawDesc = []byte{ 0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x22, 0x8f, 0x01, 0x0a, 0x0d, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x44, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x1a, 0x38, 0x0a, 0x0a, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0xcd, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x12, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_dropped_labels_proto_rawDescOnce sync.Once file_google_monitoring_v3_dropped_labels_proto_rawDescData = file_google_monitoring_v3_dropped_labels_proto_rawDesc ) func file_google_monitoring_v3_dropped_labels_proto_rawDescGZIP() []byte { file_google_monitoring_v3_dropped_labels_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_dropped_labels_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_dropped_labels_proto_rawDescData) }) return file_google_monitoring_v3_dropped_labels_proto_rawDescData } var file_google_monitoring_v3_dropped_labels_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_google_monitoring_v3_dropped_labels_proto_goTypes = []any{ (*DroppedLabels)(nil), // 0: google.monitoring.v3.DroppedLabels nil, // 1: google.monitoring.v3.DroppedLabels.LabelEntry } var file_google_monitoring_v3_dropped_labels_proto_depIdxs = []int32{ 1, // 0: google.monitoring.v3.DroppedLabels.label:type_name -> google.monitoring.v3.DroppedLabels.LabelEntry 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_google_monitoring_v3_dropped_labels_proto_init() } func file_google_monitoring_v3_dropped_labels_proto_init() { if File_google_monitoring_v3_dropped_labels_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_dropped_labels_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_dropped_labels_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_dropped_labels_proto_depIdxs, MessageInfos: file_google_monitoring_v3_dropped_labels_proto_msgTypes, }.Build() File_google_monitoring_v3_dropped_labels_proto = out.File file_google_monitoring_v3_dropped_labels_proto_rawDesc = nil file_google_monitoring_v3_dropped_labels_proto_goTypes = nil file_google_monitoring_v3_dropped_labels_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/group.proto package monitoringpb import ( reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The description of a dynamic collection of monitored resources. Each group // has a filter that is matched against monitored resources and their associated // metadata. If a group's filter matches an available monitored resource, then // that resource is a member of that group. Groups can contain any number of // monitored resources, and each monitored resource can be a member of any // number of groups. // // Groups can be nested in parent-child hierarchies. The `parentName` field // identifies an optional parent for each group. If a group has a parent, then // the only monitored resources available to be matched by the group's filter // are the resources contained in the parent group. In other words, a group // contains the monitored resources that match its filter and the filters of all // the group's ancestors. A group without a parent can contain any monitored // resource. // // For example, consider an infrastructure running a set of instances with two // user-defined tags: `"environment"` and `"role"`. A parent group has a filter, // `environment="production"`. A child of that parent group has a filter, // `role="transcoder"`. The parent group contains all instances in the // production environment, regardless of their roles. The child group contains // instances that have the transcoder role *and* are in the production // environment. // // The monitored resources contained in a group can change at any moment, // depending on what resources exist and what filters are associated with the // group and its ancestors. type Group struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Output only. The name of this group. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] // // When creating a group, this field is ignored and a new name is created // consisting of the project specified in the call to `CreateGroup` // and a unique `[GROUP_ID]` that is generated automatically. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // A user-assigned name for this group, used only for display purposes. DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // The name of the group's parent, if it has one. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] // // For groups with no parent, `parent_name` is the empty string, `""`. ParentName string `protobuf:"bytes,3,opt,name=parent_name,json=parentName,proto3" json:"parent_name,omitempty"` // The filter used to determine which monitored resources belong to this // group. Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` // If true, the members of this group are considered to be a cluster. // The system can perform additional analysis on groups that are clusters. IsCluster bool `protobuf:"varint,6,opt,name=is_cluster,json=isCluster,proto3" json:"is_cluster,omitempty"` } func (x *Group) Reset() { *x = Group{} mi := &file_google_monitoring_v3_group_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Group) String() string { return protoimpl.X.MessageStringOf(x) } func (*Group) ProtoMessage() {} func (x *Group) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Group.ProtoReflect.Descriptor instead. func (*Group) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_proto_rawDescGZIP(), []int{0} } func (x *Group) GetName() string { if x != nil { return x.Name } return "" } func (x *Group) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (x *Group) GetParentName() string { if x != nil { return x.ParentName } return "" } func (x *Group) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *Group) GetIsCluster() bool { if x != nil { return x.IsCluster } return false } var File_google_monitoring_v3_group_proto protoreflect.FileDescriptor var file_google_monitoring_v3_group_proto_rawDesc = []byte{ 0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb2, 0x02, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x99, 0x01, 0xea, 0x41, 0x95, 0x01, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x21, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x7d, 0x12, 0x2b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x7d, 0x12, 0x1f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x7d, 0x12, 0x01, 0x2a, 0x42, 0xc5, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_group_proto_rawDescOnce sync.Once file_google_monitoring_v3_group_proto_rawDescData = file_google_monitoring_v3_group_proto_rawDesc ) func file_google_monitoring_v3_group_proto_rawDescGZIP() []byte { file_google_monitoring_v3_group_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_group_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_group_proto_rawDescData) }) return file_google_monitoring_v3_group_proto_rawDescData } var file_google_monitoring_v3_group_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_google_monitoring_v3_group_proto_goTypes = []any{ (*Group)(nil), // 0: google.monitoring.v3.Group } var file_google_monitoring_v3_group_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_google_monitoring_v3_group_proto_init() } func file_google_monitoring_v3_group_proto_init() { if File_google_monitoring_v3_group_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_group_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_group_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_group_proto_depIdxs, MessageInfos: file_google_monitoring_v3_group_proto_msgTypes, }.Build() File_google_monitoring_v3_group_proto = out.File file_google_monitoring_v3_group_proto_rawDesc = nil file_google_monitoring_v3_group_proto_goTypes = nil file_google_monitoring_v3_group_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/group_service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/group_service.proto package monitoringpb import ( context "context" reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The `ListGroup` request. type ListGroupsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) whose // groups are to be listed. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` // An optional filter consisting of a single group name. The filters limit // the groups returned based on their parent-child relationship with the // specified group. If no filter is specified, all groups are returned. // // Types that are assignable to Filter: // // *ListGroupsRequest_ChildrenOfGroup // *ListGroupsRequest_AncestorsOfGroup // *ListGroupsRequest_DescendantsOfGroup Filter isListGroupsRequest_Filter `protobuf_oneof:"filter"` // A positive number that is the maximum number of results to return. PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `next_page_token` value // returned by a previous call to this method. Using this field causes the // method to return additional results from the previous method call. PageToken string `protobuf:"bytes,6,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListGroupsRequest) Reset() { *x = ListGroupsRequest{} mi := &file_google_monitoring_v3_group_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListGroupsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListGroupsRequest) ProtoMessage() {} func (x *ListGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_service_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListGroupsRequest.ProtoReflect.Descriptor instead. func (*ListGroupsRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{0} } func (x *ListGroupsRequest) GetName() string { if x != nil { return x.Name } return "" } func (m *ListGroupsRequest) GetFilter() isListGroupsRequest_Filter { if m != nil { return m.Filter } return nil } func (x *ListGroupsRequest) GetChildrenOfGroup() string { if x, ok := x.GetFilter().(*ListGroupsRequest_ChildrenOfGroup); ok { return x.ChildrenOfGroup } return "" } func (x *ListGroupsRequest) GetAncestorsOfGroup() string { if x, ok := x.GetFilter().(*ListGroupsRequest_AncestorsOfGroup); ok { return x.AncestorsOfGroup } return "" } func (x *ListGroupsRequest) GetDescendantsOfGroup() string { if x, ok := x.GetFilter().(*ListGroupsRequest_DescendantsOfGroup); ok { return x.DescendantsOfGroup } return "" } func (x *ListGroupsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListGroupsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } type isListGroupsRequest_Filter interface { isListGroupsRequest_Filter() } type ListGroupsRequest_ChildrenOfGroup struct { // A group name. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] // // Returns groups whose `parent_name` field contains the group // name. If no groups have this parent, the results are empty. ChildrenOfGroup string `protobuf:"bytes,2,opt,name=children_of_group,json=childrenOfGroup,proto3,oneof"` } type ListGroupsRequest_AncestorsOfGroup struct { // A group name. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] // // Returns groups that are ancestors of the specified group. // The groups are returned in order, starting with the immediate parent and // ending with the most distant ancestor. If the specified group has no // immediate parent, the results are empty. AncestorsOfGroup string `protobuf:"bytes,3,opt,name=ancestors_of_group,json=ancestorsOfGroup,proto3,oneof"` } type ListGroupsRequest_DescendantsOfGroup struct { // A group name. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] // // Returns the descendants of the specified group. This is a superset of // the results returned by the `children_of_group` filter, and includes // children-of-children, and so forth. DescendantsOfGroup string `protobuf:"bytes,4,opt,name=descendants_of_group,json=descendantsOfGroup,proto3,oneof"` } func (*ListGroupsRequest_ChildrenOfGroup) isListGroupsRequest_Filter() {} func (*ListGroupsRequest_AncestorsOfGroup) isListGroupsRequest_Filter() {} func (*ListGroupsRequest_DescendantsOfGroup) isListGroupsRequest_Filter() {} // The `ListGroups` response. type ListGroupsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The groups that match the specified filters. Group []*Group `protobuf:"bytes,1,rep,name=group,proto3" json:"group,omitempty"` // If there are more results than have been returned, then this field is set // to a non-empty value. To see the additional results, // use that value as `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListGroupsResponse) Reset() { *x = ListGroupsResponse{} mi := &file_google_monitoring_v3_group_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListGroupsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListGroupsResponse) ProtoMessage() {} func (x *ListGroupsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListGroupsResponse.ProtoReflect.Descriptor instead. func (*ListGroupsResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{1} } func (x *ListGroupsResponse) GetGroup() []*Group { if x != nil { return x.Group } return nil } func (x *ListGroupsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // The `GetGroup` request. type GetGroupRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The group to retrieve. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetGroupRequest) Reset() { *x = GetGroupRequest{} mi := &file_google_monitoring_v3_group_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetGroupRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetGroupRequest) ProtoMessage() {} func (x *GetGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetGroupRequest.ProtoReflect.Descriptor instead. func (*GetGroupRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{2} } func (x *GetGroupRequest) GetName() string { if x != nil { return x.Name } return "" } // The `CreateGroup` request. type CreateGroupRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) in which // to create the group. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` // Required. A group definition. It is an error to define the `name` field // because the system assigns the name. Group *Group `protobuf:"bytes,2,opt,name=group,proto3" json:"group,omitempty"` // If true, validate this request but do not create the group. ValidateOnly bool `protobuf:"varint,3,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"` } func (x *CreateGroupRequest) Reset() { *x = CreateGroupRequest{} mi := &file_google_monitoring_v3_group_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateGroupRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateGroupRequest) ProtoMessage() {} func (x *CreateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateGroupRequest.ProtoReflect.Descriptor instead. func (*CreateGroupRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{3} } func (x *CreateGroupRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *CreateGroupRequest) GetGroup() *Group { if x != nil { return x.Group } return nil } func (x *CreateGroupRequest) GetValidateOnly() bool { if x != nil { return x.ValidateOnly } return false } // The `UpdateGroup` request. type UpdateGroupRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The new definition of the group. All fields of the existing // group, excepting `name`, are replaced with the corresponding fields of this // group. Group *Group `protobuf:"bytes,2,opt,name=group,proto3" json:"group,omitempty"` // If true, validate this request but do not update the existing group. ValidateOnly bool `protobuf:"varint,3,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"` } func (x *UpdateGroupRequest) Reset() { *x = UpdateGroupRequest{} mi := &file_google_monitoring_v3_group_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateGroupRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateGroupRequest) ProtoMessage() {} func (x *UpdateGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateGroupRequest.ProtoReflect.Descriptor instead. func (*UpdateGroupRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{4} } func (x *UpdateGroupRequest) GetGroup() *Group { if x != nil { return x.Group } return nil } func (x *UpdateGroupRequest) GetValidateOnly() bool { if x != nil { return x.ValidateOnly } return false } // The `DeleteGroup` request. The default behavior is to be able to delete a // single group without any descendants. type DeleteGroupRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The group to delete. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // If this field is true, then the request means to delete a group with all // its descendants. Otherwise, the request means to delete a group only when // it has no descendants. The default value is false. Recursive bool `protobuf:"varint,4,opt,name=recursive,proto3" json:"recursive,omitempty"` } func (x *DeleteGroupRequest) Reset() { *x = DeleteGroupRequest{} mi := &file_google_monitoring_v3_group_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteGroupRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteGroupRequest) ProtoMessage() {} func (x *DeleteGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_service_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteGroupRequest.ProtoReflect.Descriptor instead. func (*DeleteGroupRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{5} } func (x *DeleteGroupRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *DeleteGroupRequest) GetRecursive() bool { if x != nil { return x.Recursive } return false } // The `ListGroupMembers` request. type ListGroupMembersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The group whose members are listed. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` // A positive number that is the maximum number of results to return. PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `next_page_token` value // returned by a previous call to this method. Using this field causes the // method to return additional results from the previous method call. PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // An optional [list // filter](https://cloud.google.com/monitoring/api/learn_more#filtering) // describing the members to be returned. The filter may reference the type, // labels, and metadata of monitored resources that comprise the group. For // example, to return only resources representing Compute Engine VM instances, // use this filter: // // `resource.type = "gce_instance"` Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` // An optional time interval for which results should be returned. Only // members that were part of the group during the specified interval are // included in the response. If no interval is provided then the group // membership over the last minute is returned. Interval *TimeInterval `protobuf:"bytes,6,opt,name=interval,proto3" json:"interval,omitempty"` } func (x *ListGroupMembersRequest) Reset() { *x = ListGroupMembersRequest{} mi := &file_google_monitoring_v3_group_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListGroupMembersRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListGroupMembersRequest) ProtoMessage() {} func (x *ListGroupMembersRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_service_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListGroupMembersRequest.ProtoReflect.Descriptor instead. func (*ListGroupMembersRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{6} } func (x *ListGroupMembersRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *ListGroupMembersRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListGroupMembersRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } func (x *ListGroupMembersRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListGroupMembersRequest) GetInterval() *TimeInterval { if x != nil { return x.Interval } return nil } // The `ListGroupMembers` response. type ListGroupMembersResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A set of monitored resources in the group. Members []*monitoredres.MonitoredResource `protobuf:"bytes,1,rep,name=members,proto3" json:"members,omitempty"` // If there are more results than have been returned, then this field is // set to a non-empty value. To see the additional results, use that value as // `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` // The total number of elements matching this request. TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` } func (x *ListGroupMembersResponse) Reset() { *x = ListGroupMembersResponse{} mi := &file_google_monitoring_v3_group_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListGroupMembersResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListGroupMembersResponse) ProtoMessage() {} func (x *ListGroupMembersResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_group_service_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListGroupMembersResponse.ProtoReflect.Descriptor instead. func (*ListGroupMembersResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_group_service_proto_rawDescGZIP(), []int{7} } func (x *ListGroupMembersResponse) GetMembers() []*monitoredres.MonitoredResource { if x != nil { return x.Members } return nil } func (x *ListGroupMembersResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } func (x *ListGroupMembersResponse) GetTotalSize() int32 { if x != nil { return x.TotalSize } return 0 } var File_google_monitoring_v3_group_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_group_service_proto_rawDesc = []byte{ 0x0a, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9a, 0x03, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x12, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x11, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x5f, 0x6f, 0x66, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x4f, 0x66, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x54, 0x0a, 0x12, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x10, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x73, 0x4f, 0x66, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x58, 0x0a, 0x14, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x24, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x73, 0x4f, 0x66, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x6f, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x4e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xae, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x12, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x71, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x6f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0xea, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x21, 0x0a, 0x1f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x9a, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x32, 0x98, 0x08, 0x0a, 0x0c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x7d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2d, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x38, 0xda, 0x41, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x1c, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3b, 0xda, 0x41, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x24, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x7e, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x2a, 0x1e, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xcc, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x11, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_group_service_proto_rawDescOnce sync.Once file_google_monitoring_v3_group_service_proto_rawDescData = file_google_monitoring_v3_group_service_proto_rawDesc ) func file_google_monitoring_v3_group_service_proto_rawDescGZIP() []byte { file_google_monitoring_v3_group_service_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_group_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_group_service_proto_rawDescData) }) return file_google_monitoring_v3_group_service_proto_rawDescData } var file_google_monitoring_v3_group_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_google_monitoring_v3_group_service_proto_goTypes = []any{ (*ListGroupsRequest)(nil), // 0: google.monitoring.v3.ListGroupsRequest (*ListGroupsResponse)(nil), // 1: google.monitoring.v3.ListGroupsResponse (*GetGroupRequest)(nil), // 2: google.monitoring.v3.GetGroupRequest (*CreateGroupRequest)(nil), // 3: google.monitoring.v3.CreateGroupRequest (*UpdateGroupRequest)(nil), // 4: google.monitoring.v3.UpdateGroupRequest (*DeleteGroupRequest)(nil), // 5: google.monitoring.v3.DeleteGroupRequest (*ListGroupMembersRequest)(nil), // 6: google.monitoring.v3.ListGroupMembersRequest (*ListGroupMembersResponse)(nil), // 7: google.monitoring.v3.ListGroupMembersResponse (*Group)(nil), // 8: google.monitoring.v3.Group (*TimeInterval)(nil), // 9: google.monitoring.v3.TimeInterval (*monitoredres.MonitoredResource)(nil), // 10: google.api.MonitoredResource (*emptypb.Empty)(nil), // 11: google.protobuf.Empty } var file_google_monitoring_v3_group_service_proto_depIdxs = []int32{ 8, // 0: google.monitoring.v3.ListGroupsResponse.group:type_name -> google.monitoring.v3.Group 8, // 1: google.monitoring.v3.CreateGroupRequest.group:type_name -> google.monitoring.v3.Group 8, // 2: google.monitoring.v3.UpdateGroupRequest.group:type_name -> google.monitoring.v3.Group 9, // 3: google.monitoring.v3.ListGroupMembersRequest.interval:type_name -> google.monitoring.v3.TimeInterval 10, // 4: google.monitoring.v3.ListGroupMembersResponse.members:type_name -> google.api.MonitoredResource 0, // 5: google.monitoring.v3.GroupService.ListGroups:input_type -> google.monitoring.v3.ListGroupsRequest 2, // 6: google.monitoring.v3.GroupService.GetGroup:input_type -> google.monitoring.v3.GetGroupRequest 3, // 7: google.monitoring.v3.GroupService.CreateGroup:input_type -> google.monitoring.v3.CreateGroupRequest 4, // 8: google.monitoring.v3.GroupService.UpdateGroup:input_type -> google.monitoring.v3.UpdateGroupRequest 5, // 9: google.monitoring.v3.GroupService.DeleteGroup:input_type -> google.monitoring.v3.DeleteGroupRequest 6, // 10: google.monitoring.v3.GroupService.ListGroupMembers:input_type -> google.monitoring.v3.ListGroupMembersRequest 1, // 11: google.monitoring.v3.GroupService.ListGroups:output_type -> google.monitoring.v3.ListGroupsResponse 8, // 12: google.monitoring.v3.GroupService.GetGroup:output_type -> google.monitoring.v3.Group 8, // 13: google.monitoring.v3.GroupService.CreateGroup:output_type -> google.monitoring.v3.Group 8, // 14: google.monitoring.v3.GroupService.UpdateGroup:output_type -> google.monitoring.v3.Group 11, // 15: google.monitoring.v3.GroupService.DeleteGroup:output_type -> google.protobuf.Empty 7, // 16: google.monitoring.v3.GroupService.ListGroupMembers:output_type -> google.monitoring.v3.ListGroupMembersResponse 11, // [11:17] is the sub-list for method output_type 5, // [5:11] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name 5, // [5:5] is the sub-list for extension extendee 0, // [0:5] is the sub-list for field type_name } func init() { file_google_monitoring_v3_group_service_proto_init() } func file_google_monitoring_v3_group_service_proto_init() { if File_google_monitoring_v3_group_service_proto != nil { return } file_google_monitoring_v3_common_proto_init() file_google_monitoring_v3_group_proto_init() file_google_monitoring_v3_group_service_proto_msgTypes[0].OneofWrappers = []any{ (*ListGroupsRequest_ChildrenOfGroup)(nil), (*ListGroupsRequest_AncestorsOfGroup)(nil), (*ListGroupsRequest_DescendantsOfGroup)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_group_service_proto_rawDesc, NumEnums: 0, NumMessages: 8, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_monitoring_v3_group_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_group_service_proto_depIdxs, MessageInfos: file_google_monitoring_v3_group_service_proto_msgTypes, }.Build() File_google_monitoring_v3_group_service_proto = out.File file_google_monitoring_v3_group_service_proto_rawDesc = nil file_google_monitoring_v3_group_service_proto_goTypes = nil file_google_monitoring_v3_group_service_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // GroupServiceClient is the client API for GroupService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type GroupServiceClient interface { // Lists the existing groups. ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) // Gets a single group. GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) // Creates a new group. CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) // Updates an existing group. // You can change any group attributes except `name`. UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) // Deletes an existing group. DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Lists the monitored resources that are members of a group. ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) } type groupServiceClient struct { cc grpc.ClientConnInterface } func NewGroupServiceClient(cc grpc.ClientConnInterface) GroupServiceClient { return &groupServiceClient{cc} } func (c *groupServiceClient) ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) { out := new(ListGroupsResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/ListGroups", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *groupServiceClient) GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) { out := new(Group) err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/GetGroup", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *groupServiceClient) CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) { out := new(Group) err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/CreateGroup", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *groupServiceClient) UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) { out := new(Group) err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/UpdateGroup", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *groupServiceClient) DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/DeleteGroup", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *groupServiceClient) ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) { out := new(ListGroupMembersResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/ListGroupMembers", in, out, opts...) if err != nil { return nil, err } return out, nil } // GroupServiceServer is the server API for GroupService service. type GroupServiceServer interface { // Lists the existing groups. ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) // Gets a single group. GetGroup(context.Context, *GetGroupRequest) (*Group, error) // Creates a new group. CreateGroup(context.Context, *CreateGroupRequest) (*Group, error) // Updates an existing group. // You can change any group attributes except `name`. UpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error) // Deletes an existing group. DeleteGroup(context.Context, *DeleteGroupRequest) (*emptypb.Empty, error) // Lists the monitored resources that are members of a group. ListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error) } // UnimplementedGroupServiceServer can be embedded to have forward compatible implementations. type UnimplementedGroupServiceServer struct { } func (*UnimplementedGroupServiceServer) ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListGroups not implemented") } func (*UnimplementedGroupServiceServer) GetGroup(context.Context, *GetGroupRequest) (*Group, error) { return nil, status.Errorf(codes.Unimplemented, "method GetGroup not implemented") } func (*UnimplementedGroupServiceServer) CreateGroup(context.Context, *CreateGroupRequest) (*Group, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateGroup not implemented") } func (*UnimplementedGroupServiceServer) UpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateGroup not implemented") } func (*UnimplementedGroupServiceServer) DeleteGroup(context.Context, *DeleteGroupRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteGroup not implemented") } func (*UnimplementedGroupServiceServer) ListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListGroupMembers not implemented") } func RegisterGroupServiceServer(s *grpc.Server, srv GroupServiceServer) { s.RegisterService(&_GroupService_serviceDesc, srv) } func _GroupService_ListGroups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListGroupsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GroupServiceServer).ListGroups(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.GroupService/ListGroups", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GroupServiceServer).ListGroups(ctx, req.(*ListGroupsRequest)) } return interceptor(ctx, in, info, handler) } func _GroupService_GetGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetGroupRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GroupServiceServer).GetGroup(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.GroupService/GetGroup", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GroupServiceServer).GetGroup(ctx, req.(*GetGroupRequest)) } return interceptor(ctx, in, info, handler) } func _GroupService_CreateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateGroupRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GroupServiceServer).CreateGroup(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.GroupService/CreateGroup", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GroupServiceServer).CreateGroup(ctx, req.(*CreateGroupRequest)) } return interceptor(ctx, in, info, handler) } func _GroupService_UpdateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateGroupRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GroupServiceServer).UpdateGroup(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.GroupService/UpdateGroup", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GroupServiceServer).UpdateGroup(ctx, req.(*UpdateGroupRequest)) } return interceptor(ctx, in, info, handler) } func _GroupService_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteGroupRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GroupServiceServer).DeleteGroup(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.GroupService/DeleteGroup", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GroupServiceServer).DeleteGroup(ctx, req.(*DeleteGroupRequest)) } return interceptor(ctx, in, info, handler) } func _GroupService_ListGroupMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListGroupMembersRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(GroupServiceServer).ListGroupMembers(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.GroupService/ListGroupMembers", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GroupServiceServer).ListGroupMembers(ctx, req.(*ListGroupMembersRequest)) } return interceptor(ctx, in, info, handler) } var _GroupService_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.monitoring.v3.GroupService", HandlerType: (*GroupServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "ListGroups", Handler: _GroupService_ListGroups_Handler, }, { MethodName: "GetGroup", Handler: _GroupService_GetGroup_Handler, }, { MethodName: "CreateGroup", Handler: _GroupService_CreateGroup_Handler, }, { MethodName: "UpdateGroup", Handler: _GroupService_UpdateGroup_Handler, }, { MethodName: "DeleteGroup", Handler: _GroupService_DeleteGroup_Handler, }, { MethodName: "ListGroupMembers", Handler: _GroupService_ListGroupMembers_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/monitoring/v3/group_service.proto", } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/metric.proto package monitoringpb import ( reflect "reflect" sync "sync" label "google.golang.org/genproto/googleapis/api/label" metric "google.golang.org/genproto/googleapis/api/metric" monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // A single data point in a time series. type Point struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The time interval to which the data point applies. For `GAUGE` metrics, // the start time is optional, but if it is supplied, it must equal the // end time. For `DELTA` metrics, the start // and end time should specify a non-zero interval, with subsequent points // specifying contiguous and non-overlapping intervals. For `CUMULATIVE` // metrics, the start and end time should specify a non-zero interval, with // subsequent points specifying the same start time and increasing end times, // until an event resets the cumulative value to zero and sets a new start // time for the following points. Interval *TimeInterval `protobuf:"bytes,1,opt,name=interval,proto3" json:"interval,omitempty"` // The value of the data point. Value *TypedValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } func (x *Point) Reset() { *x = Point{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Point) String() string { return protoimpl.X.MessageStringOf(x) } func (*Point) ProtoMessage() {} func (x *Point) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Point.ProtoReflect.Descriptor instead. func (*Point) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{0} } func (x *Point) GetInterval() *TimeInterval { if x != nil { return x.Interval } return nil } func (x *Point) GetValue() *TypedValue { if x != nil { return x.Value } return nil } // A collection of data points that describes the time-varying values // of a metric. A time series is identified by a combination of a // fully-specified monitored resource and a fully-specified metric. // This type is used for both listing and creating time series. type TimeSeries struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The associated metric. A fully-specified metric used to identify the time // series. Metric *metric.Metric `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // The associated monitored resource. Custom metrics can use only certain // monitored resource types in their time series data. For more information, // see [Monitored resources for custom // metrics](https://cloud.google.com/monitoring/custom-metrics/creating-metrics#custom-metric-resources). Resource *monitoredres.MonitoredResource `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Output only. The associated monitored resource metadata. When reading a // time series, this field will include metadata labels that are explicitly // named in the reduction. When creating a time series, this field is ignored. Metadata *monitoredres.MonitoredResourceMetadata `protobuf:"bytes,7,opt,name=metadata,proto3" json:"metadata,omitempty"` // The metric kind of the time series. When listing time series, this metric // kind might be different from the metric kind of the associated metric if // this time series is an alignment or reduction of other time series. // // When creating a time series, this field is optional. If present, it must be // the same as the metric kind of the associated metric. If the associated // metric's descriptor must be auto-created, then this field specifies the // metric kind of the new descriptor and must be either `GAUGE` (the default) // or `CUMULATIVE`. MetricKind metric.MetricDescriptor_MetricKind `protobuf:"varint,3,opt,name=metric_kind,json=metricKind,proto3,enum=google.api.MetricDescriptor_MetricKind" json:"metric_kind,omitempty"` // The value type of the time series. When listing time series, this value // type might be different from the value type of the associated metric if // this time series is an alignment or reduction of other time series. // // When creating a time series, this field is optional. If present, it must be // the same as the type of the data in the `points` field. ValueType metric.MetricDescriptor_ValueType `protobuf:"varint,4,opt,name=value_type,json=valueType,proto3,enum=google.api.MetricDescriptor_ValueType" json:"value_type,omitempty"` // The data points of this time series. When listing time series, points are // returned in reverse time order. // // When creating a time series, this field must contain exactly one point and // the point's type must be the same as the value type of the associated // metric. If the associated metric's descriptor must be auto-created, then // the value type of the descriptor is determined by the point's type, which // must be `BOOL`, `INT64`, `DOUBLE`, or `DISTRIBUTION`. Points []*Point `protobuf:"bytes,5,rep,name=points,proto3" json:"points,omitempty"` // The units in which the metric value is reported. It is only applicable // if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit` // defines the representation of the stored metric values. This field can only // be changed through CreateTimeSeries when it is empty. Unit string `protobuf:"bytes,8,opt,name=unit,proto3" json:"unit,omitempty"` // Input only. A detailed description of the time series that will be // associated with the // [google.api.MetricDescriptor][google.api.MetricDescriptor] for the metric. // Once set, this field cannot be changed through CreateTimeSeries. Description string `protobuf:"bytes,9,opt,name=description,proto3" json:"description,omitempty"` } func (x *TimeSeries) Reset() { *x = TimeSeries{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TimeSeries) String() string { return protoimpl.X.MessageStringOf(x) } func (*TimeSeries) ProtoMessage() {} func (x *TimeSeries) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TimeSeries.ProtoReflect.Descriptor instead. func (*TimeSeries) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{1} } func (x *TimeSeries) GetMetric() *metric.Metric { if x != nil { return x.Metric } return nil } func (x *TimeSeries) GetResource() *monitoredres.MonitoredResource { if x != nil { return x.Resource } return nil } func (x *TimeSeries) GetMetadata() *monitoredres.MonitoredResourceMetadata { if x != nil { return x.Metadata } return nil } func (x *TimeSeries) GetMetricKind() metric.MetricDescriptor_MetricKind { if x != nil { return x.MetricKind } return metric.MetricDescriptor_MetricKind(0) } func (x *TimeSeries) GetValueType() metric.MetricDescriptor_ValueType { if x != nil { return x.ValueType } return metric.MetricDescriptor_ValueType(0) } func (x *TimeSeries) GetPoints() []*Point { if x != nil { return x.Points } return nil } func (x *TimeSeries) GetUnit() string { if x != nil { return x.Unit } return "" } func (x *TimeSeries) GetDescription() string { if x != nil { return x.Description } return "" } // A descriptor for the labels and points in a time series. type TimeSeriesDescriptor struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Descriptors for the labels. LabelDescriptors []*label.LabelDescriptor `protobuf:"bytes,1,rep,name=label_descriptors,json=labelDescriptors,proto3" json:"label_descriptors,omitempty"` // Descriptors for the point data value columns. PointDescriptors []*TimeSeriesDescriptor_ValueDescriptor `protobuf:"bytes,5,rep,name=point_descriptors,json=pointDescriptors,proto3" json:"point_descriptors,omitempty"` } func (x *TimeSeriesDescriptor) Reset() { *x = TimeSeriesDescriptor{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TimeSeriesDescriptor) String() string { return protoimpl.X.MessageStringOf(x) } func (*TimeSeriesDescriptor) ProtoMessage() {} func (x *TimeSeriesDescriptor) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TimeSeriesDescriptor.ProtoReflect.Descriptor instead. func (*TimeSeriesDescriptor) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{2} } func (x *TimeSeriesDescriptor) GetLabelDescriptors() []*label.LabelDescriptor { if x != nil { return x.LabelDescriptors } return nil } func (x *TimeSeriesDescriptor) GetPointDescriptors() []*TimeSeriesDescriptor_ValueDescriptor { if x != nil { return x.PointDescriptors } return nil } // Represents the values of a time series associated with a // TimeSeriesDescriptor. type TimeSeriesData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The values of the labels in the time series identifier, given in the same // order as the `label_descriptors` field of the TimeSeriesDescriptor // associated with this object. Each value must have a value of the type // given in the corresponding entry of `label_descriptors`. LabelValues []*LabelValue `protobuf:"bytes,1,rep,name=label_values,json=labelValues,proto3" json:"label_values,omitempty"` // The points in the time series. PointData []*TimeSeriesData_PointData `protobuf:"bytes,2,rep,name=point_data,json=pointData,proto3" json:"point_data,omitempty"` } func (x *TimeSeriesData) Reset() { *x = TimeSeriesData{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TimeSeriesData) String() string { return protoimpl.X.MessageStringOf(x) } func (*TimeSeriesData) ProtoMessage() {} func (x *TimeSeriesData) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TimeSeriesData.ProtoReflect.Descriptor instead. func (*TimeSeriesData) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{3} } func (x *TimeSeriesData) GetLabelValues() []*LabelValue { if x != nil { return x.LabelValues } return nil } func (x *TimeSeriesData) GetPointData() []*TimeSeriesData_PointData { if x != nil { return x.PointData } return nil } // A label value. type LabelValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The label value can be a bool, int64, or string. // // Types that are assignable to Value: // // *LabelValue_BoolValue // *LabelValue_Int64Value // *LabelValue_StringValue Value isLabelValue_Value `protobuf_oneof:"value"` } func (x *LabelValue) Reset() { *x = LabelValue{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *LabelValue) String() string { return protoimpl.X.MessageStringOf(x) } func (*LabelValue) ProtoMessage() {} func (x *LabelValue) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use LabelValue.ProtoReflect.Descriptor instead. func (*LabelValue) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{4} } func (m *LabelValue) GetValue() isLabelValue_Value { if m != nil { return m.Value } return nil } func (x *LabelValue) GetBoolValue() bool { if x, ok := x.GetValue().(*LabelValue_BoolValue); ok { return x.BoolValue } return false } func (x *LabelValue) GetInt64Value() int64 { if x, ok := x.GetValue().(*LabelValue_Int64Value); ok { return x.Int64Value } return 0 } func (x *LabelValue) GetStringValue() string { if x, ok := x.GetValue().(*LabelValue_StringValue); ok { return x.StringValue } return "" } type isLabelValue_Value interface { isLabelValue_Value() } type LabelValue_BoolValue struct { // A bool label value. BoolValue bool `protobuf:"varint,1,opt,name=bool_value,json=boolValue,proto3,oneof"` } type LabelValue_Int64Value struct { // An int64 label value. Int64Value int64 `protobuf:"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof"` } type LabelValue_StringValue struct { // A string label value. StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof"` } func (*LabelValue_BoolValue) isLabelValue_Value() {} func (*LabelValue_Int64Value) isLabelValue_Value() {} func (*LabelValue_StringValue) isLabelValue_Value() {} // An error associated with a query in the time series query language format. type QueryError struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The location of the time series query language text that this error applies // to. Locator *TextLocator `protobuf:"bytes,1,opt,name=locator,proto3" json:"locator,omitempty"` // The error message. Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` } func (x *QueryError) Reset() { *x = QueryError{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *QueryError) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueryError) ProtoMessage() {} func (x *QueryError) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use QueryError.ProtoReflect.Descriptor instead. func (*QueryError) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{5} } func (x *QueryError) GetLocator() *TextLocator { if x != nil { return x.Locator } return nil } func (x *QueryError) GetMessage() string { if x != nil { return x.Message } return "" } // A locator for text. Indicates a particular part of the text of a request or // of an object referenced in the request. // // For example, suppose the request field `text` contains: // // text: "The quick brown fox jumps over the lazy dog." // // Then the locator: // // source: "text" // start_position { // line: 1 // column: 17 // } // end_position { // line: 1 // column: 19 // } // // refers to the part of the text: "fox". type TextLocator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The source of the text. The source may be a field in the request, in which // case its format is the format of the // google.rpc.BadRequest.FieldViolation.field field in // https://cloud.google.com/apis/design/errors#error_details. It may also be // be a source other than the request field (e.g. a macro definition // referenced in the text of the query), in which case this is the name of // the source (e.g. the macro name). Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // The position of the first byte within the text. StartPosition *TextLocator_Position `protobuf:"bytes,2,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"` // The position of the last byte within the text. EndPosition *TextLocator_Position `protobuf:"bytes,3,opt,name=end_position,json=endPosition,proto3" json:"end_position,omitempty"` // If `source`, `start_position`, and `end_position` describe a call on // some object (e.g. a macro in the time series query language text) and a // location is to be designated in that object's text, `nested_locator` // identifies the location within that object. NestedLocator *TextLocator `protobuf:"bytes,4,opt,name=nested_locator,json=nestedLocator,proto3" json:"nested_locator,omitempty"` // When `nested_locator` is set, this field gives the reason for the nesting. // Usually, the reason is a macro invocation. In that case, the macro name // (including the leading '@') signals the location of the macro call // in the text and a macro argument name (including the leading '$') signals // the location of the macro argument inside the macro body that got // substituted away. NestingReason string `protobuf:"bytes,5,opt,name=nesting_reason,json=nestingReason,proto3" json:"nesting_reason,omitempty"` } func (x *TextLocator) Reset() { *x = TextLocator{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TextLocator) String() string { return protoimpl.X.MessageStringOf(x) } func (*TextLocator) ProtoMessage() {} func (x *TextLocator) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TextLocator.ProtoReflect.Descriptor instead. func (*TextLocator) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{6} } func (x *TextLocator) GetSource() string { if x != nil { return x.Source } return "" } func (x *TextLocator) GetStartPosition() *TextLocator_Position { if x != nil { return x.StartPosition } return nil } func (x *TextLocator) GetEndPosition() *TextLocator_Position { if x != nil { return x.EndPosition } return nil } func (x *TextLocator) GetNestedLocator() *TextLocator { if x != nil { return x.NestedLocator } return nil } func (x *TextLocator) GetNestingReason() string { if x != nil { return x.NestingReason } return "" } // A descriptor for the value columns in a data point. type TimeSeriesDescriptor_ValueDescriptor struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The value key. Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // The value type. ValueType metric.MetricDescriptor_ValueType `protobuf:"varint,2,opt,name=value_type,json=valueType,proto3,enum=google.api.MetricDescriptor_ValueType" json:"value_type,omitempty"` // The value stream kind. MetricKind metric.MetricDescriptor_MetricKind `protobuf:"varint,3,opt,name=metric_kind,json=metricKind,proto3,enum=google.api.MetricDescriptor_MetricKind" json:"metric_kind,omitempty"` // The unit in which `time_series` point values are reported. `unit` // follows the UCUM format for units as seen in // https://unitsofmeasure.org/ucum.html. // `unit` is only valid if `value_type` is INTEGER, DOUBLE, DISTRIBUTION. Unit string `protobuf:"bytes,4,opt,name=unit,proto3" json:"unit,omitempty"` } func (x *TimeSeriesDescriptor_ValueDescriptor) Reset() { *x = TimeSeriesDescriptor_ValueDescriptor{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TimeSeriesDescriptor_ValueDescriptor) String() string { return protoimpl.X.MessageStringOf(x) } func (*TimeSeriesDescriptor_ValueDescriptor) ProtoMessage() {} func (x *TimeSeriesDescriptor_ValueDescriptor) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TimeSeriesDescriptor_ValueDescriptor.ProtoReflect.Descriptor instead. func (*TimeSeriesDescriptor_ValueDescriptor) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{2, 0} } func (x *TimeSeriesDescriptor_ValueDescriptor) GetKey() string { if x != nil { return x.Key } return "" } func (x *TimeSeriesDescriptor_ValueDescriptor) GetValueType() metric.MetricDescriptor_ValueType { if x != nil { return x.ValueType } return metric.MetricDescriptor_ValueType(0) } func (x *TimeSeriesDescriptor_ValueDescriptor) GetMetricKind() metric.MetricDescriptor_MetricKind { if x != nil { return x.MetricKind } return metric.MetricDescriptor_MetricKind(0) } func (x *TimeSeriesDescriptor_ValueDescriptor) GetUnit() string { if x != nil { return x.Unit } return "" } // A point's value columns and time interval. Each point has one or more // point values corresponding to the entries in `point_descriptors` field in // the TimeSeriesDescriptor associated with this object. type TimeSeriesData_PointData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The values that make up the point. Values []*TypedValue `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` // The time interval associated with the point. TimeInterval *TimeInterval `protobuf:"bytes,2,opt,name=time_interval,json=timeInterval,proto3" json:"time_interval,omitempty"` } func (x *TimeSeriesData_PointData) Reset() { *x = TimeSeriesData_PointData{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TimeSeriesData_PointData) String() string { return protoimpl.X.MessageStringOf(x) } func (*TimeSeriesData_PointData) ProtoMessage() {} func (x *TimeSeriesData_PointData) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TimeSeriesData_PointData.ProtoReflect.Descriptor instead. func (*TimeSeriesData_PointData) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{3, 0} } func (x *TimeSeriesData_PointData) GetValues() []*TypedValue { if x != nil { return x.Values } return nil } func (x *TimeSeriesData_PointData) GetTimeInterval() *TimeInterval { if x != nil { return x.TimeInterval } return nil } // The position of a byte within the text. type TextLocator_Position struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The line, starting with 1, where the byte is positioned. Line int32 `protobuf:"varint,1,opt,name=line,proto3" json:"line,omitempty"` // The column within the line, starting with 1, where the byte is // positioned. This is a byte index even though the text is UTF-8. Column int32 `protobuf:"varint,2,opt,name=column,proto3" json:"column,omitempty"` } func (x *TextLocator_Position) Reset() { *x = TextLocator_Position{} mi := &file_google_monitoring_v3_metric_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TextLocator_Position) String() string { return protoimpl.X.MessageStringOf(x) } func (*TextLocator_Position) ProtoMessage() {} func (x *TextLocator_Position) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TextLocator_Position.ProtoReflect.Descriptor instead. func (*TextLocator_Position) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_proto_rawDescGZIP(), []int{6, 0} } func (x *TextLocator_Position) GetLine() int32 { if x != nil { return x.Line } return 0 } func (x *TextLocator_Position) GetColumn() int32 { if x != nil { return x.Column } return 0 } var File_google_monitoring_v3_metric_proto protoreflect.FileDescriptor var file_google_monitoring_v3_metric_proto_rawDesc = []byte{ 0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7f, 0x0a, 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb2, 0x03, 0x0a, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x39, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x03, 0x0a, 0x14, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x67, 0x0a, 0x11, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0xc8, 0x01, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0xb5, 0x02, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x8e, 0x01, 0x0a, 0x09, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x7e, 0x0a, 0x0a, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf0, 0x02, 0x0a, 0x0b, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0e, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x36, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x42, 0xc6, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_metric_proto_rawDescOnce sync.Once file_google_monitoring_v3_metric_proto_rawDescData = file_google_monitoring_v3_metric_proto_rawDesc ) func file_google_monitoring_v3_metric_proto_rawDescGZIP() []byte { file_google_monitoring_v3_metric_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_metric_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_metric_proto_rawDescData) }) return file_google_monitoring_v3_metric_proto_rawDescData } var file_google_monitoring_v3_metric_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_google_monitoring_v3_metric_proto_goTypes = []any{ (*Point)(nil), // 0: google.monitoring.v3.Point (*TimeSeries)(nil), // 1: google.monitoring.v3.TimeSeries (*TimeSeriesDescriptor)(nil), // 2: google.monitoring.v3.TimeSeriesDescriptor (*TimeSeriesData)(nil), // 3: google.monitoring.v3.TimeSeriesData (*LabelValue)(nil), // 4: google.monitoring.v3.LabelValue (*QueryError)(nil), // 5: google.monitoring.v3.QueryError (*TextLocator)(nil), // 6: google.monitoring.v3.TextLocator (*TimeSeriesDescriptor_ValueDescriptor)(nil), // 7: google.monitoring.v3.TimeSeriesDescriptor.ValueDescriptor (*TimeSeriesData_PointData)(nil), // 8: google.monitoring.v3.TimeSeriesData.PointData (*TextLocator_Position)(nil), // 9: google.monitoring.v3.TextLocator.Position (*TimeInterval)(nil), // 10: google.monitoring.v3.TimeInterval (*TypedValue)(nil), // 11: google.monitoring.v3.TypedValue (*metric.Metric)(nil), // 12: google.api.Metric (*monitoredres.MonitoredResource)(nil), // 13: google.api.MonitoredResource (*monitoredres.MonitoredResourceMetadata)(nil), // 14: google.api.MonitoredResourceMetadata (metric.MetricDescriptor_MetricKind)(0), // 15: google.api.MetricDescriptor.MetricKind (metric.MetricDescriptor_ValueType)(0), // 16: google.api.MetricDescriptor.ValueType (*label.LabelDescriptor)(nil), // 17: google.api.LabelDescriptor } var file_google_monitoring_v3_metric_proto_depIdxs = []int32{ 10, // 0: google.monitoring.v3.Point.interval:type_name -> google.monitoring.v3.TimeInterval 11, // 1: google.monitoring.v3.Point.value:type_name -> google.monitoring.v3.TypedValue 12, // 2: google.monitoring.v3.TimeSeries.metric:type_name -> google.api.Metric 13, // 3: google.monitoring.v3.TimeSeries.resource:type_name -> google.api.MonitoredResource 14, // 4: google.monitoring.v3.TimeSeries.metadata:type_name -> google.api.MonitoredResourceMetadata 15, // 5: google.monitoring.v3.TimeSeries.metric_kind:type_name -> google.api.MetricDescriptor.MetricKind 16, // 6: google.monitoring.v3.TimeSeries.value_type:type_name -> google.api.MetricDescriptor.ValueType 0, // 7: google.monitoring.v3.TimeSeries.points:type_name -> google.monitoring.v3.Point 17, // 8: google.monitoring.v3.TimeSeriesDescriptor.label_descriptors:type_name -> google.api.LabelDescriptor 7, // 9: google.monitoring.v3.TimeSeriesDescriptor.point_descriptors:type_name -> google.monitoring.v3.TimeSeriesDescriptor.ValueDescriptor 4, // 10: google.monitoring.v3.TimeSeriesData.label_values:type_name -> google.monitoring.v3.LabelValue 8, // 11: google.monitoring.v3.TimeSeriesData.point_data:type_name -> google.monitoring.v3.TimeSeriesData.PointData 6, // 12: google.monitoring.v3.QueryError.locator:type_name -> google.monitoring.v3.TextLocator 9, // 13: google.monitoring.v3.TextLocator.start_position:type_name -> google.monitoring.v3.TextLocator.Position 9, // 14: google.monitoring.v3.TextLocator.end_position:type_name -> google.monitoring.v3.TextLocator.Position 6, // 15: google.monitoring.v3.TextLocator.nested_locator:type_name -> google.monitoring.v3.TextLocator 16, // 16: google.monitoring.v3.TimeSeriesDescriptor.ValueDescriptor.value_type:type_name -> google.api.MetricDescriptor.ValueType 15, // 17: google.monitoring.v3.TimeSeriesDescriptor.ValueDescriptor.metric_kind:type_name -> google.api.MetricDescriptor.MetricKind 11, // 18: google.monitoring.v3.TimeSeriesData.PointData.values:type_name -> google.monitoring.v3.TypedValue 10, // 19: google.monitoring.v3.TimeSeriesData.PointData.time_interval:type_name -> google.monitoring.v3.TimeInterval 20, // [20:20] is the sub-list for method output_type 20, // [20:20] is the sub-list for method input_type 20, // [20:20] is the sub-list for extension type_name 20, // [20:20] is the sub-list for extension extendee 0, // [0:20] is the sub-list for field type_name } func init() { file_google_monitoring_v3_metric_proto_init() } func file_google_monitoring_v3_metric_proto_init() { if File_google_monitoring_v3_metric_proto != nil { return } file_google_monitoring_v3_common_proto_init() file_google_monitoring_v3_metric_proto_msgTypes[4].OneofWrappers = []any{ (*LabelValue_BoolValue)(nil), (*LabelValue_Int64Value)(nil), (*LabelValue_StringValue)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_metric_proto_rawDesc, NumEnums: 0, NumMessages: 10, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_metric_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_metric_proto_depIdxs, MessageInfos: file_google_monitoring_v3_metric_proto_msgTypes, }.Build() File_google_monitoring_v3_metric_proto = out.File file_google_monitoring_v3_metric_proto_rawDesc = nil file_google_monitoring_v3_metric_proto_goTypes = nil file_google_monitoring_v3_metric_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/metric_service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/metric_service.proto package monitoringpb import ( context "context" reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" metric "google.golang.org/genproto/googleapis/api/metric" monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" status "google.golang.org/genproto/googleapis/rpc/status" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status1 "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Controls which fields are returned by `ListTimeSeries*`. type ListTimeSeriesRequest_TimeSeriesView int32 const ( // Returns the identity of the metric(s), the time series, // and the time series data. ListTimeSeriesRequest_FULL ListTimeSeriesRequest_TimeSeriesView = 0 // Returns the identity of the metric and the time series resource, // but not the time series data. ListTimeSeriesRequest_HEADERS ListTimeSeriesRequest_TimeSeriesView = 1 ) // Enum value maps for ListTimeSeriesRequest_TimeSeriesView. var ( ListTimeSeriesRequest_TimeSeriesView_name = map[int32]string{ 0: "FULL", 1: "HEADERS", } ListTimeSeriesRequest_TimeSeriesView_value = map[string]int32{ "FULL": 0, "HEADERS": 1, } ) func (x ListTimeSeriesRequest_TimeSeriesView) Enum() *ListTimeSeriesRequest_TimeSeriesView { p := new(ListTimeSeriesRequest_TimeSeriesView) *p = x return p } func (x ListTimeSeriesRequest_TimeSeriesView) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ListTimeSeriesRequest_TimeSeriesView) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_metric_service_proto_enumTypes[0].Descriptor() } func (ListTimeSeriesRequest_TimeSeriesView) Type() protoreflect.EnumType { return &file_google_monitoring_v3_metric_service_proto_enumTypes[0] } func (x ListTimeSeriesRequest_TimeSeriesView) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use ListTimeSeriesRequest_TimeSeriesView.Descriptor instead. func (ListTimeSeriesRequest_TimeSeriesView) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{8, 0} } // The `ListMonitoredResourceDescriptors` request. type ListMonitoredResourceDescriptorsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) on which // to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` // An optional [filter](https://cloud.google.com/monitoring/api/v3/filters) // describing the descriptors to be returned. The filter can reference the // descriptor's type and labels. For example, the following filter returns // only Google Compute Engine descriptors that have an `id` label: // // resource.type = starts_with("gce_") AND resource.label:id Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` // A positive number that is the maximum number of results to return. PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `nextPageToken` value // returned by a previous call to this method. Using this field causes the // method to return additional results from the previous method call. PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListMonitoredResourceDescriptorsRequest) Reset() { *x = ListMonitoredResourceDescriptorsRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListMonitoredResourceDescriptorsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListMonitoredResourceDescriptorsRequest) ProtoMessage() {} func (x *ListMonitoredResourceDescriptorsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListMonitoredResourceDescriptorsRequest.ProtoReflect.Descriptor instead. func (*ListMonitoredResourceDescriptorsRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{0} } func (x *ListMonitoredResourceDescriptorsRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *ListMonitoredResourceDescriptorsRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListMonitoredResourceDescriptorsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListMonitoredResourceDescriptorsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The `ListMonitoredResourceDescriptors` response. type ListMonitoredResourceDescriptorsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The monitored resource descriptors that are available to this project // and that match `filter`, if present. ResourceDescriptors []*monitoredres.MonitoredResourceDescriptor `protobuf:"bytes,1,rep,name=resource_descriptors,json=resourceDescriptors,proto3" json:"resource_descriptors,omitempty"` // If there are more results than have been returned, then this field is set // to a non-empty value. To see the additional results, // use that value as `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListMonitoredResourceDescriptorsResponse) Reset() { *x = ListMonitoredResourceDescriptorsResponse{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListMonitoredResourceDescriptorsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListMonitoredResourceDescriptorsResponse) ProtoMessage() {} func (x *ListMonitoredResourceDescriptorsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListMonitoredResourceDescriptorsResponse.ProtoReflect.Descriptor instead. func (*ListMonitoredResourceDescriptorsResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{1} } func (x *ListMonitoredResourceDescriptorsResponse) GetResourceDescriptors() []*monitoredres.MonitoredResourceDescriptor { if x != nil { return x.ResourceDescriptors } return nil } func (x *ListMonitoredResourceDescriptorsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // The `GetMonitoredResourceDescriptor` request. type GetMonitoredResourceDescriptorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The monitored resource descriptor to get. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/monitoredResourceDescriptors/[RESOURCE_TYPE] // // The `[RESOURCE_TYPE]` is a predefined type, such as // `cloudsql_database`. Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetMonitoredResourceDescriptorRequest) Reset() { *x = GetMonitoredResourceDescriptorRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetMonitoredResourceDescriptorRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetMonitoredResourceDescriptorRequest) ProtoMessage() {} func (x *GetMonitoredResourceDescriptorRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetMonitoredResourceDescriptorRequest.ProtoReflect.Descriptor instead. func (*GetMonitoredResourceDescriptorRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{2} } func (x *GetMonitoredResourceDescriptorRequest) GetName() string { if x != nil { return x.Name } return "" } // The `ListMetricDescriptors` request. type ListMetricDescriptorsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) on which // to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` // Optional. If this field is empty, all custom and // system-defined metric descriptors are returned. // Otherwise, the [filter](https://cloud.google.com/monitoring/api/v3/filters) // specifies which metric descriptors are to be // returned. For example, the following filter matches all // [custom metrics](https://cloud.google.com/monitoring/custom-metrics): // // metric.type = starts_with("custom.googleapis.com/") Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` // Optional. A positive number that is the maximum number of results to // return. The default and maximum value is 10,000. If a page_size <= 0 or > // 10,000 is submitted, will instead return a maximum of 10,000 results. PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Optional. If this field is not empty then it must contain the // `nextPageToken` value returned by a previous call to this method. Using // this field causes the method to return additional results from the previous // method call. PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // Optional. If true, only metrics and monitored resource types that have // recent data (within roughly 25 hours) will be included in the response. // - If a metric descriptor enumerates monitored resource types, only the // monitored resource types for which the metric type has recent data will // be included in the returned metric descriptor, and if none of them have // recent data, the metric descriptor will not be returned. // - If a metric descriptor does not enumerate the compatible monitored // resource types, it will be returned only if the metric type has recent // data for some monitored resource type. The returned descriptor will not // enumerate any monitored resource types. ActiveOnly bool `protobuf:"varint,6,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` } func (x *ListMetricDescriptorsRequest) Reset() { *x = ListMetricDescriptorsRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListMetricDescriptorsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListMetricDescriptorsRequest) ProtoMessage() {} func (x *ListMetricDescriptorsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListMetricDescriptorsRequest.ProtoReflect.Descriptor instead. func (*ListMetricDescriptorsRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{3} } func (x *ListMetricDescriptorsRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *ListMetricDescriptorsRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListMetricDescriptorsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListMetricDescriptorsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } func (x *ListMetricDescriptorsRequest) GetActiveOnly() bool { if x != nil { return x.ActiveOnly } return false } // The `ListMetricDescriptors` response. type ListMetricDescriptorsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The metric descriptors that are available to the project // and that match the value of `filter`, if present. MetricDescriptors []*metric.MetricDescriptor `protobuf:"bytes,1,rep,name=metric_descriptors,json=metricDescriptors,proto3" json:"metric_descriptors,omitempty"` // If there are more results than have been returned, then this field is set // to a non-empty value. To see the additional results, // use that value as `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListMetricDescriptorsResponse) Reset() { *x = ListMetricDescriptorsResponse{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListMetricDescriptorsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListMetricDescriptorsResponse) ProtoMessage() {} func (x *ListMetricDescriptorsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListMetricDescriptorsResponse.ProtoReflect.Descriptor instead. func (*ListMetricDescriptorsResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{4} } func (x *ListMetricDescriptorsResponse) GetMetricDescriptors() []*metric.MetricDescriptor { if x != nil { return x.MetricDescriptors } return nil } func (x *ListMetricDescriptorsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // The `GetMetricDescriptor` request. type GetMetricDescriptorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The metric descriptor on which to execute the request. The format // is: // // projects/[PROJECT_ID_OR_NUMBER]/metricDescriptors/[METRIC_ID] // // An example value of `[METRIC_ID]` is // `"compute.googleapis.com/instance/disk/read_bytes_count"`. Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetMetricDescriptorRequest) Reset() { *x = GetMetricDescriptorRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetMetricDescriptorRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetMetricDescriptorRequest) ProtoMessage() {} func (x *GetMetricDescriptorRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetMetricDescriptorRequest.ProtoReflect.Descriptor instead. func (*GetMetricDescriptorRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{5} } func (x *GetMetricDescriptorRequest) GetName() string { if x != nil { return x.Name } return "" } // The `CreateMetricDescriptor` request. type CreateMetricDescriptorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) on which // to execute the request. The format is: // 4 // // projects/[PROJECT_ID_OR_NUMBER] Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // Required. The new [custom // metric](https://cloud.google.com/monitoring/custom-metrics) descriptor. MetricDescriptor *metric.MetricDescriptor `protobuf:"bytes,2,opt,name=metric_descriptor,json=metricDescriptor,proto3" json:"metric_descriptor,omitempty"` } func (x *CreateMetricDescriptorRequest) Reset() { *x = CreateMetricDescriptorRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateMetricDescriptorRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateMetricDescriptorRequest) ProtoMessage() {} func (x *CreateMetricDescriptorRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateMetricDescriptorRequest.ProtoReflect.Descriptor instead. func (*CreateMetricDescriptorRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{6} } func (x *CreateMetricDescriptorRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *CreateMetricDescriptorRequest) GetMetricDescriptor() *metric.MetricDescriptor { if x != nil { return x.MetricDescriptor } return nil } // The `DeleteMetricDescriptor` request. type DeleteMetricDescriptorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The metric descriptor on which to execute the request. The format // is: // // projects/[PROJECT_ID_OR_NUMBER]/metricDescriptors/[METRIC_ID] // // An example of `[METRIC_ID]` is: // `"custom.googleapis.com/my_test_metric"`. Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *DeleteMetricDescriptorRequest) Reset() { *x = DeleteMetricDescriptorRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteMetricDescriptorRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteMetricDescriptorRequest) ProtoMessage() {} func (x *DeleteMetricDescriptorRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteMetricDescriptorRequest.ProtoReflect.Descriptor instead. func (*DeleteMetricDescriptorRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{7} } func (x *DeleteMetricDescriptorRequest) GetName() string { if x != nil { return x.Name } return "" } // The `ListTimeSeries` request. type ListTimeSeriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name), // organization or folder on which to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER] // organizations/[ORGANIZATION_ID] // folders/[FOLDER_ID] Name string `protobuf:"bytes,10,opt,name=name,proto3" json:"name,omitempty"` // Required. A [monitoring // filter](https://cloud.google.com/monitoring/api/v3/filters) that specifies // which time series should be returned. The filter must specify a single // metric type, and can additionally specify metric labels and other // information. For example: // // metric.type = "compute.googleapis.com/instance/cpu/usage_time" AND // metric.labels.instance_name = "my-instance-name" Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` // Required. The time interval for which results should be returned. Only time // series that contain data points in the specified interval are included in // the response. Interval *TimeInterval `protobuf:"bytes,4,opt,name=interval,proto3" json:"interval,omitempty"` // Specifies the alignment of data points in individual time series as // well as how to combine the retrieved time series across specified labels. // // By default (if no `aggregation` is explicitly specified), the raw time // series data is returned. Aggregation *Aggregation `protobuf:"bytes,5,opt,name=aggregation,proto3" json:"aggregation,omitempty"` // Apply a second aggregation after `aggregation` is applied. May only be // specified if `aggregation` is specified. SecondaryAggregation *Aggregation `protobuf:"bytes,11,opt,name=secondary_aggregation,json=secondaryAggregation,proto3" json:"secondary_aggregation,omitempty"` // Unsupported: must be left blank. The points in each time series are // currently returned in reverse time order (most recent to oldest). OrderBy string `protobuf:"bytes,6,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` // Required. Specifies which information is returned about the time series. View ListTimeSeriesRequest_TimeSeriesView `protobuf:"varint,7,opt,name=view,proto3,enum=google.monitoring.v3.ListTimeSeriesRequest_TimeSeriesView" json:"view,omitempty"` // A positive number that is the maximum number of results to return. If // `page_size` is empty or more than 100,000 results, the effective // `page_size` is 100,000 results. If `view` is set to `FULL`, this is the // maximum number of `Points` returned. If `view` is set to `HEADERS`, this is // the maximum number of `TimeSeries` returned. PageSize int32 `protobuf:"varint,8,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `nextPageToken` value // returned by a previous call to this method. Using this field causes the // method to return additional results from the previous method call. PageToken string `protobuf:"bytes,9,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListTimeSeriesRequest) Reset() { *x = ListTimeSeriesRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListTimeSeriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListTimeSeriesRequest) ProtoMessage() {} func (x *ListTimeSeriesRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListTimeSeriesRequest.ProtoReflect.Descriptor instead. func (*ListTimeSeriesRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{8} } func (x *ListTimeSeriesRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *ListTimeSeriesRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListTimeSeriesRequest) GetInterval() *TimeInterval { if x != nil { return x.Interval } return nil } func (x *ListTimeSeriesRequest) GetAggregation() *Aggregation { if x != nil { return x.Aggregation } return nil } func (x *ListTimeSeriesRequest) GetSecondaryAggregation() *Aggregation { if x != nil { return x.SecondaryAggregation } return nil } func (x *ListTimeSeriesRequest) GetOrderBy() string { if x != nil { return x.OrderBy } return "" } func (x *ListTimeSeriesRequest) GetView() ListTimeSeriesRequest_TimeSeriesView { if x != nil { return x.View } return ListTimeSeriesRequest_FULL } func (x *ListTimeSeriesRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListTimeSeriesRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The `ListTimeSeries` response. type ListTimeSeriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // One or more time series that match the filter included in the request. TimeSeries []*TimeSeries `protobuf:"bytes,1,rep,name=time_series,json=timeSeries,proto3" json:"time_series,omitempty"` // If there are more results than have been returned, then this field is set // to a non-empty value. To see the additional results, // use that value as `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` // Query execution errors that may have caused the time series data returned // to be incomplete. ExecutionErrors []*status.Status `protobuf:"bytes,3,rep,name=execution_errors,json=executionErrors,proto3" json:"execution_errors,omitempty"` // The unit in which all `time_series` point values are reported. `unit` // follows the UCUM format for units as seen in // https://unitsofmeasure.org/ucum.html. // If different `time_series` have different units (for example, because they // come from different metric types, or a unit is absent), then `unit` will be // "{not_a_unit}". Unit string `protobuf:"bytes,5,opt,name=unit,proto3" json:"unit,omitempty"` } func (x *ListTimeSeriesResponse) Reset() { *x = ListTimeSeriesResponse{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListTimeSeriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListTimeSeriesResponse) ProtoMessage() {} func (x *ListTimeSeriesResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListTimeSeriesResponse.ProtoReflect.Descriptor instead. func (*ListTimeSeriesResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{9} } func (x *ListTimeSeriesResponse) GetTimeSeries() []*TimeSeries { if x != nil { return x.TimeSeries } return nil } func (x *ListTimeSeriesResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } func (x *ListTimeSeriesResponse) GetExecutionErrors() []*status.Status { if x != nil { return x.ExecutionErrors } return nil } func (x *ListTimeSeriesResponse) GetUnit() string { if x != nil { return x.Unit } return "" } // The `CreateTimeSeries` request. type CreateTimeSeriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) on which // to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // Required. The new data to be added to a list of time series. // Adds at most one data point to each of several time series. The new data // point must be more recent than any other point in its time series. Each // `TimeSeries` value must fully specify a unique time series by supplying // all label values for the metric and the monitored resource. // // The maximum number of `TimeSeries` objects per `Create` request is 200. TimeSeries []*TimeSeries `protobuf:"bytes,2,rep,name=time_series,json=timeSeries,proto3" json:"time_series,omitempty"` } func (x *CreateTimeSeriesRequest) Reset() { *x = CreateTimeSeriesRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateTimeSeriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateTimeSeriesRequest) ProtoMessage() {} func (x *CreateTimeSeriesRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateTimeSeriesRequest.ProtoReflect.Descriptor instead. func (*CreateTimeSeriesRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{10} } func (x *CreateTimeSeriesRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *CreateTimeSeriesRequest) GetTimeSeries() []*TimeSeries { if x != nil { return x.TimeSeries } return nil } // DEPRECATED. Used to hold per-time-series error status. type CreateTimeSeriesError struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // DEPRECATED. Time series ID that resulted in the `status` error. // // Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto. TimeSeries *TimeSeries `protobuf:"bytes,1,opt,name=time_series,json=timeSeries,proto3" json:"time_series,omitempty"` // DEPRECATED. The status of the requested write operation for `time_series`. // // Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto. Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` } func (x *CreateTimeSeriesError) Reset() { *x = CreateTimeSeriesError{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateTimeSeriesError) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateTimeSeriesError) ProtoMessage() {} func (x *CreateTimeSeriesError) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateTimeSeriesError.ProtoReflect.Descriptor instead. func (*CreateTimeSeriesError) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{11} } // Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto. func (x *CreateTimeSeriesError) GetTimeSeries() *TimeSeries { if x != nil { return x.TimeSeries } return nil } // Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto. func (x *CreateTimeSeriesError) GetStatus() *status.Status { if x != nil { return x.Status } return nil } // Summary of the result of a failed request to write data to a time series. type CreateTimeSeriesSummary struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The number of points in the request. TotalPointCount int32 `protobuf:"varint,1,opt,name=total_point_count,json=totalPointCount,proto3" json:"total_point_count,omitempty"` // The number of points that were successfully written. SuccessPointCount int32 `protobuf:"varint,2,opt,name=success_point_count,json=successPointCount,proto3" json:"success_point_count,omitempty"` // The number of points that failed to be written. Order is not guaranteed. Errors []*CreateTimeSeriesSummary_Error `protobuf:"bytes,3,rep,name=errors,proto3" json:"errors,omitempty"` } func (x *CreateTimeSeriesSummary) Reset() { *x = CreateTimeSeriesSummary{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateTimeSeriesSummary) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateTimeSeriesSummary) ProtoMessage() {} func (x *CreateTimeSeriesSummary) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateTimeSeriesSummary.ProtoReflect.Descriptor instead. func (*CreateTimeSeriesSummary) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{12} } func (x *CreateTimeSeriesSummary) GetTotalPointCount() int32 { if x != nil { return x.TotalPointCount } return 0 } func (x *CreateTimeSeriesSummary) GetSuccessPointCount() int32 { if x != nil { return x.SuccessPointCount } return 0 } func (x *CreateTimeSeriesSummary) GetErrors() []*CreateTimeSeriesSummary_Error { if x != nil { return x.Errors } return nil } // The `QueryTimeSeries` request. For information about the status of // Monitoring Query Language (MQL), see the [MQL deprecation // notice](https://cloud.google.com/stackdriver/docs/deprecations/mql). // // Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto. type QueryTimeSeriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) on which // to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Required. The query in the [Monitoring Query // Language](https://cloud.google.com/monitoring/mql/reference) format. // The default time zone is in UTC. Query string `protobuf:"bytes,7,opt,name=query,proto3" json:"query,omitempty"` // A positive number that is the maximum number of time_series_data to return. PageSize int32 `protobuf:"varint,9,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `nextPageToken` value // returned by a previous call to this method. Using this field causes the // method to return additional results from the previous method call. PageToken string `protobuf:"bytes,10,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *QueryTimeSeriesRequest) Reset() { *x = QueryTimeSeriesRequest{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *QueryTimeSeriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueryTimeSeriesRequest) ProtoMessage() {} func (x *QueryTimeSeriesRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use QueryTimeSeriesRequest.ProtoReflect.Descriptor instead. func (*QueryTimeSeriesRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{13} } func (x *QueryTimeSeriesRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *QueryTimeSeriesRequest) GetQuery() string { if x != nil { return x.Query } return "" } func (x *QueryTimeSeriesRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *QueryTimeSeriesRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The `QueryTimeSeries` response. For information about the status of // Monitoring Query Language (MQL), see the [MQL deprecation // notice](https://cloud.google.com/stackdriver/docs/deprecations/mql). // // Deprecated: Marked as deprecated in google/monitoring/v3/metric_service.proto. type QueryTimeSeriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The descriptor for the time series data. TimeSeriesDescriptor *TimeSeriesDescriptor `protobuf:"bytes,8,opt,name=time_series_descriptor,json=timeSeriesDescriptor,proto3" json:"time_series_descriptor,omitempty"` // The time series data. TimeSeriesData []*TimeSeriesData `protobuf:"bytes,9,rep,name=time_series_data,json=timeSeriesData,proto3" json:"time_series_data,omitempty"` // If there are more results than have been returned, then this field is set // to a non-empty value. To see the additional results, use that value as // `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,10,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` // Query execution errors that may have caused the time series data returned // to be incomplete. The available data will be available in the // response. PartialErrors []*status.Status `protobuf:"bytes,11,rep,name=partial_errors,json=partialErrors,proto3" json:"partial_errors,omitempty"` } func (x *QueryTimeSeriesResponse) Reset() { *x = QueryTimeSeriesResponse{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *QueryTimeSeriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueryTimeSeriesResponse) ProtoMessage() {} func (x *QueryTimeSeriesResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use QueryTimeSeriesResponse.ProtoReflect.Descriptor instead. func (*QueryTimeSeriesResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{14} } func (x *QueryTimeSeriesResponse) GetTimeSeriesDescriptor() *TimeSeriesDescriptor { if x != nil { return x.TimeSeriesDescriptor } return nil } func (x *QueryTimeSeriesResponse) GetTimeSeriesData() []*TimeSeriesData { if x != nil { return x.TimeSeriesData } return nil } func (x *QueryTimeSeriesResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } func (x *QueryTimeSeriesResponse) GetPartialErrors() []*status.Status { if x != nil { return x.PartialErrors } return nil } // This is an error detail intended to be used with INVALID_ARGUMENT errors. type QueryErrorList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Errors in parsing the time series query language text. The number of errors // in the response may be limited. Errors []*QueryError `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"` // A summary of all the errors. ErrorSummary string `protobuf:"bytes,2,opt,name=error_summary,json=errorSummary,proto3" json:"error_summary,omitempty"` } func (x *QueryErrorList) Reset() { *x = QueryErrorList{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *QueryErrorList) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueryErrorList) ProtoMessage() {} func (x *QueryErrorList) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use QueryErrorList.ProtoReflect.Descriptor instead. func (*QueryErrorList) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{15} } func (x *QueryErrorList) GetErrors() []*QueryError { if x != nil { return x.Errors } return nil } func (x *QueryErrorList) GetErrorSummary() string { if x != nil { return x.ErrorSummary } return "" } // Detailed information about an error category. type CreateTimeSeriesSummary_Error struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The status of the requested write operation. Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` // The number of points that couldn't be written because of `status`. PointCount int32 `protobuf:"varint,2,opt,name=point_count,json=pointCount,proto3" json:"point_count,omitempty"` } func (x *CreateTimeSeriesSummary_Error) Reset() { *x = CreateTimeSeriesSummary_Error{} mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateTimeSeriesSummary_Error) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateTimeSeriesSummary_Error) ProtoMessage() {} func (x *CreateTimeSeriesSummary_Error) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_metric_service_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateTimeSeriesSummary_Error.ProtoReflect.Descriptor instead. func (*CreateTimeSeriesSummary_Error) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_metric_service_proto_rawDescGZIP(), []int{12, 0} } func (x *CreateTimeSeriesSummary_Error) GetStatus() *status.Status { if x != nil { return x.Status } return nil } func (x *CreateTimeSeriesSummary_Error) GetPointCount() int32 { if x != nil { return x.PointCount } return 0 } var File_google_monitoring_v3_metric_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_metric_service_proto_rawDesc = []byte{ 0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd0, 0x01, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x37, 0x12, 0x35, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7a, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x37, 0x0a, 0x35, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xef, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2c, 0x12, 0x2a, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x94, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x64, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2c, 0x0a, 0x2a, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2c, 0x12, 0x2a, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x67, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x32, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2c, 0x0a, 0x2a, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xad, 0x04, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x26, 0x12, 0x24, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x56, 0x0a, 0x15, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x53, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x69, 0x65, 0x77, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x53, 0x10, 0x01, 0x22, 0xd6, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3d, 0x0a, 0x10, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, 0x54, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xb2, 0x02, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x16, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x4e, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x6f, 0x0a, 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x32, 0xbc, 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xe4, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xcc, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x44, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, 0xb8, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x39, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, 0xc8, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x5b, 0xda, 0x41, 0x16, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x27, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x2a, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x12, 0xfe, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x90, 0x01, 0xda, 0x41, 0x19, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x2c, 0x76, 0x69, 0x65, 0x77, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x6e, 0x5a, 0x27, 0x12, 0x25, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5a, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x20, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x99, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3e, 0xda, 0x41, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4c, 0xda, 0x41, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0xda, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0xba, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x89, 0x08, 0xea, 0x41, 0xf0, 0x01, 0x0a, 0x2a, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x3b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x45, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x39, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x01, 0x2a, 0x20, 0x01, 0xea, 0x41, 0xb7, 0x02, 0x0a, 0x35, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x59, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x4d, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x01, 0x2a, 0x20, 0x01, 0xea, 0x41, 0x51, 0x0a, 0x23, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x12, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x7d, 0xea, 0x41, 0xb5, 0x01, 0x0a, 0x24, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x7d, 0x12, 0x35, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x7d, 0x12, 0x29, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x7d, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_metric_service_proto_rawDescOnce sync.Once file_google_monitoring_v3_metric_service_proto_rawDescData = file_google_monitoring_v3_metric_service_proto_rawDesc ) func file_google_monitoring_v3_metric_service_proto_rawDescGZIP() []byte { file_google_monitoring_v3_metric_service_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_metric_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_metric_service_proto_rawDescData) }) return file_google_monitoring_v3_metric_service_proto_rawDescData } var file_google_monitoring_v3_metric_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_google_monitoring_v3_metric_service_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_google_monitoring_v3_metric_service_proto_goTypes = []any{ (ListTimeSeriesRequest_TimeSeriesView)(0), // 0: google.monitoring.v3.ListTimeSeriesRequest.TimeSeriesView (*ListMonitoredResourceDescriptorsRequest)(nil), // 1: google.monitoring.v3.ListMonitoredResourceDescriptorsRequest (*ListMonitoredResourceDescriptorsResponse)(nil), // 2: google.monitoring.v3.ListMonitoredResourceDescriptorsResponse (*GetMonitoredResourceDescriptorRequest)(nil), // 3: google.monitoring.v3.GetMonitoredResourceDescriptorRequest (*ListMetricDescriptorsRequest)(nil), // 4: google.monitoring.v3.ListMetricDescriptorsRequest (*ListMetricDescriptorsResponse)(nil), // 5: google.monitoring.v3.ListMetricDescriptorsResponse (*GetMetricDescriptorRequest)(nil), // 6: google.monitoring.v3.GetMetricDescriptorRequest (*CreateMetricDescriptorRequest)(nil), // 7: google.monitoring.v3.CreateMetricDescriptorRequest (*DeleteMetricDescriptorRequest)(nil), // 8: google.monitoring.v3.DeleteMetricDescriptorRequest (*ListTimeSeriesRequest)(nil), // 9: google.monitoring.v3.ListTimeSeriesRequest (*ListTimeSeriesResponse)(nil), // 10: google.monitoring.v3.ListTimeSeriesResponse (*CreateTimeSeriesRequest)(nil), // 11: google.monitoring.v3.CreateTimeSeriesRequest (*CreateTimeSeriesError)(nil), // 12: google.monitoring.v3.CreateTimeSeriesError (*CreateTimeSeriesSummary)(nil), // 13: google.monitoring.v3.CreateTimeSeriesSummary (*QueryTimeSeriesRequest)(nil), // 14: google.monitoring.v3.QueryTimeSeriesRequest (*QueryTimeSeriesResponse)(nil), // 15: google.monitoring.v3.QueryTimeSeriesResponse (*QueryErrorList)(nil), // 16: google.monitoring.v3.QueryErrorList (*CreateTimeSeriesSummary_Error)(nil), // 17: google.monitoring.v3.CreateTimeSeriesSummary.Error (*monitoredres.MonitoredResourceDescriptor)(nil), // 18: google.api.MonitoredResourceDescriptor (*metric.MetricDescriptor)(nil), // 19: google.api.MetricDescriptor (*TimeInterval)(nil), // 20: google.monitoring.v3.TimeInterval (*Aggregation)(nil), // 21: google.monitoring.v3.Aggregation (*TimeSeries)(nil), // 22: google.monitoring.v3.TimeSeries (*status.Status)(nil), // 23: google.rpc.Status (*TimeSeriesDescriptor)(nil), // 24: google.monitoring.v3.TimeSeriesDescriptor (*TimeSeriesData)(nil), // 25: google.monitoring.v3.TimeSeriesData (*QueryError)(nil), // 26: google.monitoring.v3.QueryError (*emptypb.Empty)(nil), // 27: google.protobuf.Empty } var file_google_monitoring_v3_metric_service_proto_depIdxs = []int32{ 18, // 0: google.monitoring.v3.ListMonitoredResourceDescriptorsResponse.resource_descriptors:type_name -> google.api.MonitoredResourceDescriptor 19, // 1: google.monitoring.v3.ListMetricDescriptorsResponse.metric_descriptors:type_name -> google.api.MetricDescriptor 19, // 2: google.monitoring.v3.CreateMetricDescriptorRequest.metric_descriptor:type_name -> google.api.MetricDescriptor 20, // 3: google.monitoring.v3.ListTimeSeriesRequest.interval:type_name -> google.monitoring.v3.TimeInterval 21, // 4: google.monitoring.v3.ListTimeSeriesRequest.aggregation:type_name -> google.monitoring.v3.Aggregation 21, // 5: google.monitoring.v3.ListTimeSeriesRequest.secondary_aggregation:type_name -> google.monitoring.v3.Aggregation 0, // 6: google.monitoring.v3.ListTimeSeriesRequest.view:type_name -> google.monitoring.v3.ListTimeSeriesRequest.TimeSeriesView 22, // 7: google.monitoring.v3.ListTimeSeriesResponse.time_series:type_name -> google.monitoring.v3.TimeSeries 23, // 8: google.monitoring.v3.ListTimeSeriesResponse.execution_errors:type_name -> google.rpc.Status 22, // 9: google.monitoring.v3.CreateTimeSeriesRequest.time_series:type_name -> google.monitoring.v3.TimeSeries 22, // 10: google.monitoring.v3.CreateTimeSeriesError.time_series:type_name -> google.monitoring.v3.TimeSeries 23, // 11: google.monitoring.v3.CreateTimeSeriesError.status:type_name -> google.rpc.Status 17, // 12: google.monitoring.v3.CreateTimeSeriesSummary.errors:type_name -> google.monitoring.v3.CreateTimeSeriesSummary.Error 24, // 13: google.monitoring.v3.QueryTimeSeriesResponse.time_series_descriptor:type_name -> google.monitoring.v3.TimeSeriesDescriptor 25, // 14: google.monitoring.v3.QueryTimeSeriesResponse.time_series_data:type_name -> google.monitoring.v3.TimeSeriesData 23, // 15: google.monitoring.v3.QueryTimeSeriesResponse.partial_errors:type_name -> google.rpc.Status 26, // 16: google.monitoring.v3.QueryErrorList.errors:type_name -> google.monitoring.v3.QueryError 23, // 17: google.monitoring.v3.CreateTimeSeriesSummary.Error.status:type_name -> google.rpc.Status 1, // 18: google.monitoring.v3.MetricService.ListMonitoredResourceDescriptors:input_type -> google.monitoring.v3.ListMonitoredResourceDescriptorsRequest 3, // 19: google.monitoring.v3.MetricService.GetMonitoredResourceDescriptor:input_type -> google.monitoring.v3.GetMonitoredResourceDescriptorRequest 4, // 20: google.monitoring.v3.MetricService.ListMetricDescriptors:input_type -> google.monitoring.v3.ListMetricDescriptorsRequest 6, // 21: google.monitoring.v3.MetricService.GetMetricDescriptor:input_type -> google.monitoring.v3.GetMetricDescriptorRequest 7, // 22: google.monitoring.v3.MetricService.CreateMetricDescriptor:input_type -> google.monitoring.v3.CreateMetricDescriptorRequest 8, // 23: google.monitoring.v3.MetricService.DeleteMetricDescriptor:input_type -> google.monitoring.v3.DeleteMetricDescriptorRequest 9, // 24: google.monitoring.v3.MetricService.ListTimeSeries:input_type -> google.monitoring.v3.ListTimeSeriesRequest 11, // 25: google.monitoring.v3.MetricService.CreateTimeSeries:input_type -> google.monitoring.v3.CreateTimeSeriesRequest 11, // 26: google.monitoring.v3.MetricService.CreateServiceTimeSeries:input_type -> google.monitoring.v3.CreateTimeSeriesRequest 2, // 27: google.monitoring.v3.MetricService.ListMonitoredResourceDescriptors:output_type -> google.monitoring.v3.ListMonitoredResourceDescriptorsResponse 18, // 28: google.monitoring.v3.MetricService.GetMonitoredResourceDescriptor:output_type -> google.api.MonitoredResourceDescriptor 5, // 29: google.monitoring.v3.MetricService.ListMetricDescriptors:output_type -> google.monitoring.v3.ListMetricDescriptorsResponse 19, // 30: google.monitoring.v3.MetricService.GetMetricDescriptor:output_type -> google.api.MetricDescriptor 19, // 31: google.monitoring.v3.MetricService.CreateMetricDescriptor:output_type -> google.api.MetricDescriptor 27, // 32: google.monitoring.v3.MetricService.DeleteMetricDescriptor:output_type -> google.protobuf.Empty 10, // 33: google.monitoring.v3.MetricService.ListTimeSeries:output_type -> google.monitoring.v3.ListTimeSeriesResponse 27, // 34: google.monitoring.v3.MetricService.CreateTimeSeries:output_type -> google.protobuf.Empty 27, // 35: google.monitoring.v3.MetricService.CreateServiceTimeSeries:output_type -> google.protobuf.Empty 27, // [27:36] is the sub-list for method output_type 18, // [18:27] is the sub-list for method input_type 18, // [18:18] is the sub-list for extension type_name 18, // [18:18] is the sub-list for extension extendee 0, // [0:18] is the sub-list for field type_name } func init() { file_google_monitoring_v3_metric_service_proto_init() } func file_google_monitoring_v3_metric_service_proto_init() { if File_google_monitoring_v3_metric_service_proto != nil { return } file_google_monitoring_v3_common_proto_init() file_google_monitoring_v3_metric_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_metric_service_proto_rawDesc, NumEnums: 1, NumMessages: 17, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_monitoring_v3_metric_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_metric_service_proto_depIdxs, EnumInfos: file_google_monitoring_v3_metric_service_proto_enumTypes, MessageInfos: file_google_monitoring_v3_metric_service_proto_msgTypes, }.Build() File_google_monitoring_v3_metric_service_proto = out.File file_google_monitoring_v3_metric_service_proto_rawDesc = nil file_google_monitoring_v3_metric_service_proto_goTypes = nil file_google_monitoring_v3_metric_service_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // MetricServiceClient is the client API for MetricService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type MetricServiceClient interface { // Lists monitored resource descriptors that match a filter. ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) // Gets a single monitored resource descriptor. GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) // Lists metric descriptors that match a filter. ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) // Gets a single metric descriptor. GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) // Creates a new metric descriptor. // The creation is executed asynchronously. // User-created metric descriptors define // [custom metrics](https://cloud.google.com/monitoring/custom-metrics). // The metric descriptor is updated if it already exists, // except that metric labels are never removed. CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) // Deletes a metric descriptor. Only user-created // [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be // deleted. DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Lists time series that match a filter. ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) // Creates or adds data to one or more time series. // The response is empty if all time series in the request were written. // If any time series could not be written, a corresponding failure message is // included in the error response. // This method does not support // [resource locations constraint of an organization // policy](https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy). CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Creates or adds data to one or more service time series. A service time // series is a time series for a metric from a Google Cloud service. The // response is empty if all time series in the request were written. If any // time series could not be written, a corresponding failure message is // included in the error response. This endpoint rejects writes to // user-defined metrics. // This method is only for use by Google Cloud services. Use // [projects.timeSeries.create][google.monitoring.v3.MetricService.CreateTimeSeries] // instead. CreateServiceTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) } type metricServiceClient struct { cc grpc.ClientConnInterface } func NewMetricServiceClient(cc grpc.ClientConnInterface) MetricServiceClient { return &metricServiceClient{cc} } func (c *metricServiceClient) ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) { out := new(ListMonitoredResourceDescriptorsResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *metricServiceClient) GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) { out := new(monitoredres.MonitoredResourceDescriptor) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *metricServiceClient) ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) { out := new(ListMetricDescriptorsResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListMetricDescriptors", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *metricServiceClient) GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) { out := new(metric.MetricDescriptor) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/GetMetricDescriptor", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *metricServiceClient) CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) { out := new(metric.MetricDescriptor) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/CreateMetricDescriptor", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *metricServiceClient) DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/DeleteMetricDescriptor", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *metricServiceClient) ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) { out := new(ListTimeSeriesResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListTimeSeries", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *metricServiceClient) CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/CreateTimeSeries", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *metricServiceClient) CreateServiceTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/CreateServiceTimeSeries", in, out, opts...) if err != nil { return nil, err } return out, nil } // MetricServiceServer is the server API for MetricService service. type MetricServiceServer interface { // Lists monitored resource descriptors that match a filter. ListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) // Gets a single monitored resource descriptor. GetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) // Lists metric descriptors that match a filter. ListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) // Gets a single metric descriptor. GetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) // Creates a new metric descriptor. // The creation is executed asynchronously. // User-created metric descriptors define // [custom metrics](https://cloud.google.com/monitoring/custom-metrics). // The metric descriptor is updated if it already exists, // except that metric labels are never removed. CreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) // Deletes a metric descriptor. Only user-created // [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be // deleted. DeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*emptypb.Empty, error) // Lists time series that match a filter. ListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) // Creates or adds data to one or more time series. // The response is empty if all time series in the request were written. // If any time series could not be written, a corresponding failure message is // included in the error response. // This method does not support // [resource locations constraint of an organization // policy](https://cloud.google.com/resource-manager/docs/organization-policy/defining-locations#setting_the_organization_policy). CreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) // Creates or adds data to one or more service time series. A service time // series is a time series for a metric from a Google Cloud service. The // response is empty if all time series in the request were written. If any // time series could not be written, a corresponding failure message is // included in the error response. This endpoint rejects writes to // user-defined metrics. // This method is only for use by Google Cloud services. Use // [projects.timeSeries.create][google.monitoring.v3.MetricService.CreateTimeSeries] // instead. CreateServiceTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) } // UnimplementedMetricServiceServer can be embedded to have forward compatible implementations. type UnimplementedMetricServiceServer struct { } func (*UnimplementedMetricServiceServer) ListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method ListMonitoredResourceDescriptors not implemented") } func (*UnimplementedMetricServiceServer) GetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) { return nil, status1.Errorf(codes.Unimplemented, "method GetMonitoredResourceDescriptor not implemented") } func (*UnimplementedMetricServiceServer) ListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method ListMetricDescriptors not implemented") } func (*UnimplementedMetricServiceServer) GetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) { return nil, status1.Errorf(codes.Unimplemented, "method GetMetricDescriptor not implemented") } func (*UnimplementedMetricServiceServer) CreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) { return nil, status1.Errorf(codes.Unimplemented, "method CreateMetricDescriptor not implemented") } func (*UnimplementedMetricServiceServer) DeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*emptypb.Empty, error) { return nil, status1.Errorf(codes.Unimplemented, "method DeleteMetricDescriptor not implemented") } func (*UnimplementedMetricServiceServer) ListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method ListTimeSeries not implemented") } func (*UnimplementedMetricServiceServer) CreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) { return nil, status1.Errorf(codes.Unimplemented, "method CreateTimeSeries not implemented") } func (*UnimplementedMetricServiceServer) CreateServiceTimeSeries(context.Context, *CreateTimeSeriesRequest) (*emptypb.Empty, error) { return nil, status1.Errorf(codes.Unimplemented, "method CreateServiceTimeSeries not implemented") } func RegisterMetricServiceServer(s *grpc.Server, srv MetricServiceServer) { s.RegisterService(&_MetricService_serviceDesc, srv) } func _MetricService_ListMonitoredResourceDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListMonitoredResourceDescriptorsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, req.(*ListMonitoredResourceDescriptorsRequest)) } return interceptor(ctx, in, info, handler) } func _MetricService_GetMonitoredResourceDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetMonitoredResourceDescriptorRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, req.(*GetMonitoredResourceDescriptorRequest)) } return interceptor(ctx, in, info, handler) } func _MetricService_ListMetricDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListMetricDescriptorsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).ListMetricDescriptors(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/ListMetricDescriptors", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).ListMetricDescriptors(ctx, req.(*ListMetricDescriptorsRequest)) } return interceptor(ctx, in, info, handler) } func _MetricService_GetMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetMetricDescriptorRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).GetMetricDescriptor(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/GetMetricDescriptor", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).GetMetricDescriptor(ctx, req.(*GetMetricDescriptorRequest)) } return interceptor(ctx, in, info, handler) } func _MetricService_CreateMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateMetricDescriptorRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).CreateMetricDescriptor(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/CreateMetricDescriptor", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).CreateMetricDescriptor(ctx, req.(*CreateMetricDescriptorRequest)) } return interceptor(ctx, in, info, handler) } func _MetricService_DeleteMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteMetricDescriptorRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/DeleteMetricDescriptor", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, req.(*DeleteMetricDescriptorRequest)) } return interceptor(ctx, in, info, handler) } func _MetricService_ListTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListTimeSeriesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).ListTimeSeries(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/ListTimeSeries", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).ListTimeSeries(ctx, req.(*ListTimeSeriesRequest)) } return interceptor(ctx, in, info, handler) } func _MetricService_CreateTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateTimeSeriesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).CreateTimeSeries(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/CreateTimeSeries", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).CreateTimeSeries(ctx, req.(*CreateTimeSeriesRequest)) } return interceptor(ctx, in, info, handler) } func _MetricService_CreateServiceTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateTimeSeriesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(MetricServiceServer).CreateServiceTimeSeries(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.MetricService/CreateServiceTimeSeries", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MetricServiceServer).CreateServiceTimeSeries(ctx, req.(*CreateTimeSeriesRequest)) } return interceptor(ctx, in, info, handler) } var _MetricService_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.monitoring.v3.MetricService", HandlerType: (*MetricServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "ListMonitoredResourceDescriptors", Handler: _MetricService_ListMonitoredResourceDescriptors_Handler, }, { MethodName: "GetMonitoredResourceDescriptor", Handler: _MetricService_GetMonitoredResourceDescriptor_Handler, }, { MethodName: "ListMetricDescriptors", Handler: _MetricService_ListMetricDescriptors_Handler, }, { MethodName: "GetMetricDescriptor", Handler: _MetricService_GetMetricDescriptor_Handler, }, { MethodName: "CreateMetricDescriptor", Handler: _MetricService_CreateMetricDescriptor_Handler, }, { MethodName: "DeleteMetricDescriptor", Handler: _MetricService_DeleteMetricDescriptor_Handler, }, { MethodName: "ListTimeSeries", Handler: _MetricService_ListTimeSeries_Handler, }, { MethodName: "CreateTimeSeries", Handler: _MetricService_CreateTimeSeries_Handler, }, { MethodName: "CreateServiceTimeSeries", Handler: _MetricService_CreateServiceTimeSeries_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/monitoring/v3/metric_service.proto", } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/mutation_record.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/mutation_record.proto package monitoringpb import ( reflect "reflect" sync "sync" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Describes a change made to a configuration. type MutationRecord struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // When the change occurred. MutateTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=mutate_time,json=mutateTime,proto3" json:"mutate_time,omitempty"` // The email address of the user making the change. MutatedBy string `protobuf:"bytes,2,opt,name=mutated_by,json=mutatedBy,proto3" json:"mutated_by,omitempty"` } func (x *MutationRecord) Reset() { *x = MutationRecord{} mi := &file_google_monitoring_v3_mutation_record_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *MutationRecord) String() string { return protoimpl.X.MessageStringOf(x) } func (*MutationRecord) ProtoMessage() {} func (x *MutationRecord) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_mutation_record_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use MutationRecord.ProtoReflect.Descriptor instead. func (*MutationRecord) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_mutation_record_proto_rawDescGZIP(), []int{0} } func (x *MutationRecord) GetMutateTime() *timestamppb.Timestamp { if x != nil { return x.MutateTime } return nil } func (x *MutationRecord) GetMutatedBy() string { if x != nil { return x.MutatedBy } return "" } var File_google_monitoring_v3_mutation_record_proto protoreflect.FileDescriptor var file_google_monitoring_v3_mutation_record_proto_rawDesc = []byte{ 0x0a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x0e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x42, 0xce, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x13, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_mutation_record_proto_rawDescOnce sync.Once file_google_monitoring_v3_mutation_record_proto_rawDescData = file_google_monitoring_v3_mutation_record_proto_rawDesc ) func file_google_monitoring_v3_mutation_record_proto_rawDescGZIP() []byte { file_google_monitoring_v3_mutation_record_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_mutation_record_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_mutation_record_proto_rawDescData) }) return file_google_monitoring_v3_mutation_record_proto_rawDescData } var file_google_monitoring_v3_mutation_record_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_google_monitoring_v3_mutation_record_proto_goTypes = []any{ (*MutationRecord)(nil), // 0: google.monitoring.v3.MutationRecord (*timestamppb.Timestamp)(nil), // 1: google.protobuf.Timestamp } var file_google_monitoring_v3_mutation_record_proto_depIdxs = []int32{ 1, // 0: google.monitoring.v3.MutationRecord.mutate_time:type_name -> google.protobuf.Timestamp 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_google_monitoring_v3_mutation_record_proto_init() } func file_google_monitoring_v3_mutation_record_proto_init() { if File_google_monitoring_v3_mutation_record_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_mutation_record_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_mutation_record_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_mutation_record_proto_depIdxs, MessageInfos: file_google_monitoring_v3_mutation_record_proto_msgTypes, }.Build() File_google_monitoring_v3_mutation_record_proto = out.File file_google_monitoring_v3_mutation_record_proto_rawDesc = nil file_google_monitoring_v3_mutation_record_proto_goTypes = nil file_google_monitoring_v3_mutation_record_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/notification.proto package monitoringpb import ( reflect "reflect" sync "sync" api "google.golang.org/genproto/googleapis/api" _ "google.golang.org/genproto/googleapis/api/annotations" label "google.golang.org/genproto/googleapis/api/label" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // Indicates whether the channel has been verified or not. It is illegal // to specify this field in a // [`CreateNotificationChannel`][google.monitoring.v3.NotificationChannelService.CreateNotificationChannel] // or an // [`UpdateNotificationChannel`][google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel] // operation. type NotificationChannel_VerificationStatus int32 const ( // Sentinel value used to indicate that the state is unknown, omitted, or // is not applicable (as in the case of channels that neither support // nor require verification in order to function). NotificationChannel_VERIFICATION_STATUS_UNSPECIFIED NotificationChannel_VerificationStatus = 0 // The channel has yet to be verified and requires verification to function. // Note that this state also applies to the case where the verification // process has been initiated by sending a verification code but where // the verification code has not been submitted to complete the process. NotificationChannel_UNVERIFIED NotificationChannel_VerificationStatus = 1 // It has been proven that notifications can be received on this // notification channel and that someone on the project has access // to messages that are delivered to that channel. NotificationChannel_VERIFIED NotificationChannel_VerificationStatus = 2 ) // Enum value maps for NotificationChannel_VerificationStatus. var ( NotificationChannel_VerificationStatus_name = map[int32]string{ 0: "VERIFICATION_STATUS_UNSPECIFIED", 1: "UNVERIFIED", 2: "VERIFIED", } NotificationChannel_VerificationStatus_value = map[string]int32{ "VERIFICATION_STATUS_UNSPECIFIED": 0, "UNVERIFIED": 1, "VERIFIED": 2, } ) func (x NotificationChannel_VerificationStatus) Enum() *NotificationChannel_VerificationStatus { p := new(NotificationChannel_VerificationStatus) *p = x return p } func (x NotificationChannel_VerificationStatus) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (NotificationChannel_VerificationStatus) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_notification_proto_enumTypes[0].Descriptor() } func (NotificationChannel_VerificationStatus) Type() protoreflect.EnumType { return &file_google_monitoring_v3_notification_proto_enumTypes[0] } func (x NotificationChannel_VerificationStatus) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use NotificationChannel_VerificationStatus.Descriptor instead. func (NotificationChannel_VerificationStatus) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_proto_rawDescGZIP(), []int{1, 0} } // A description of a notification channel. The descriptor includes // the properties of the channel and the set of labels or fields that // must be specified to configure channels of a given type. type NotificationChannelDescriptor struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The full REST resource name for this descriptor. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/notificationChannelDescriptors/[TYPE] // // In the above, `[TYPE]` is the value of the `type` field. Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` // The type of notification channel, such as "email" and "sms". To view the // full list of channels, see // [Channel // descriptors](https://cloud.google.com/monitoring/alerts/using-channels-api#ncd). // Notification channel types are globally unique. Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // A human-readable name for the notification channel type. This // form of the name is suitable for a user interface. DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // A human-readable description of the notification channel // type. The description may include a description of the properties // of the channel and pointers to external documentation. Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` // The set of labels that must be defined to identify a particular // channel of the corresponding type. Each label includes a // description for how that field should be populated. Labels []*label.LabelDescriptor `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` // The tiers that support this notification channel; the project service tier // must be one of the supported_tiers. // // Deprecated: Marked as deprecated in google/monitoring/v3/notification.proto. SupportedTiers []ServiceTier `protobuf:"varint,5,rep,packed,name=supported_tiers,json=supportedTiers,proto3,enum=google.monitoring.v3.ServiceTier" json:"supported_tiers,omitempty"` // The product launch stage for channels of this type. LaunchStage api.LaunchStage `protobuf:"varint,7,opt,name=launch_stage,json=launchStage,proto3,enum=google.api.LaunchStage" json:"launch_stage,omitempty"` } func (x *NotificationChannelDescriptor) Reset() { *x = NotificationChannelDescriptor{} mi := &file_google_monitoring_v3_notification_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *NotificationChannelDescriptor) String() string { return protoimpl.X.MessageStringOf(x) } func (*NotificationChannelDescriptor) ProtoMessage() {} func (x *NotificationChannelDescriptor) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use NotificationChannelDescriptor.ProtoReflect.Descriptor instead. func (*NotificationChannelDescriptor) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_proto_rawDescGZIP(), []int{0} } func (x *NotificationChannelDescriptor) GetName() string { if x != nil { return x.Name } return "" } func (x *NotificationChannelDescriptor) GetType() string { if x != nil { return x.Type } return "" } func (x *NotificationChannelDescriptor) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (x *NotificationChannelDescriptor) GetDescription() string { if x != nil { return x.Description } return "" } func (x *NotificationChannelDescriptor) GetLabels() []*label.LabelDescriptor { if x != nil { return x.Labels } return nil } // Deprecated: Marked as deprecated in google/monitoring/v3/notification.proto. func (x *NotificationChannelDescriptor) GetSupportedTiers() []ServiceTier { if x != nil { return x.SupportedTiers } return nil } func (x *NotificationChannelDescriptor) GetLaunchStage() api.LaunchStage { if x != nil { return x.LaunchStage } return api.LaunchStage(0) } // A `NotificationChannel` is a medium through which an alert is // delivered when a policy violation is detected. Examples of channels // include email, SMS, and third-party messaging applications. Fields // containing sensitive information like authentication tokens or // contact info are only partially populated on retrieval. type NotificationChannel struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The type of the notification channel. This field matches the // value of the // [NotificationChannelDescriptor.type][google.monitoring.v3.NotificationChannelDescriptor.type] // field. Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Identifier. The full REST resource name for this channel. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID] // // The `[CHANNEL_ID]` is automatically assigned by the server on creation. Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` // An optional human-readable name for this notification channel. It is // recommended that you specify a non-empty and unique name in order to // make it easier to identify the channels in your project, though this is // not enforced. The display name is limited to 512 Unicode characters. DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // An optional human-readable description of this notification channel. This // description may provide additional details, beyond the display // name, for the channel. This may not exceed 1024 Unicode characters. Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` // Configuration fields that define the channel and its behavior. The // permissible and required labels are specified in the // [NotificationChannelDescriptor.labels][google.monitoring.v3.NotificationChannelDescriptor.labels] // of the `NotificationChannelDescriptor` corresponding to the `type` field. Labels map[string]string `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // User-supplied key/value data that does not need to conform to // the corresponding `NotificationChannelDescriptor`'s schema, unlike // the `labels` field. This field is intended to be used for organizing // and identifying the `NotificationChannel` objects. // // The field can contain up to 64 entries. Each key and value is limited to // 63 Unicode characters or 128 bytes, whichever is smaller. Labels and // values can contain only lowercase letters, numerals, underscores, and // dashes. Keys must begin with a letter. UserLabels map[string]string `protobuf:"bytes,8,rep,name=user_labels,json=userLabels,proto3" json:"user_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Indicates whether this channel has been verified or not. On a // [`ListNotificationChannels`][google.monitoring.v3.NotificationChannelService.ListNotificationChannels] // or // [`GetNotificationChannel`][google.monitoring.v3.NotificationChannelService.GetNotificationChannel] // operation, this field is expected to be populated. // // If the value is `UNVERIFIED`, then it indicates that the channel is // non-functioning (it both requires verification and lacks verification); // otherwise, it is assumed that the channel works. // // If the channel is neither `VERIFIED` nor `UNVERIFIED`, it implies that // the channel is of a type that does not require verification or that // this specific channel has been exempted from verification because it was // created prior to verification being required for channels of this type. // // This field cannot be modified using a standard // [`UpdateNotificationChannel`][google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel] // operation. To change the value of this field, you must call // [`VerifyNotificationChannel`][google.monitoring.v3.NotificationChannelService.VerifyNotificationChannel]. VerificationStatus NotificationChannel_VerificationStatus `protobuf:"varint,9,opt,name=verification_status,json=verificationStatus,proto3,enum=google.monitoring.v3.NotificationChannel_VerificationStatus" json:"verification_status,omitempty"` // Whether notifications are forwarded to the described channel. This makes // it possible to disable delivery of notifications to a particular channel // without removing the channel from all alerting policies that reference // the channel. This is a more convenient approach when the change is // temporary and you want to receive notifications from the same set // of alerting policies on the channel at some point in the future. Enabled *wrapperspb.BoolValue `protobuf:"bytes,11,opt,name=enabled,proto3" json:"enabled,omitempty"` // Record of the creation of this channel. CreationRecord *MutationRecord `protobuf:"bytes,12,opt,name=creation_record,json=creationRecord,proto3" json:"creation_record,omitempty"` // Records of the modification of this channel. MutationRecords []*MutationRecord `protobuf:"bytes,13,rep,name=mutation_records,json=mutationRecords,proto3" json:"mutation_records,omitempty"` } func (x *NotificationChannel) Reset() { *x = NotificationChannel{} mi := &file_google_monitoring_v3_notification_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *NotificationChannel) String() string { return protoimpl.X.MessageStringOf(x) } func (*NotificationChannel) ProtoMessage() {} func (x *NotificationChannel) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use NotificationChannel.ProtoReflect.Descriptor instead. func (*NotificationChannel) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_proto_rawDescGZIP(), []int{1} } func (x *NotificationChannel) GetType() string { if x != nil { return x.Type } return "" } func (x *NotificationChannel) GetName() string { if x != nil { return x.Name } return "" } func (x *NotificationChannel) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (x *NotificationChannel) GetDescription() string { if x != nil { return x.Description } return "" } func (x *NotificationChannel) GetLabels() map[string]string { if x != nil { return x.Labels } return nil } func (x *NotificationChannel) GetUserLabels() map[string]string { if x != nil { return x.UserLabels } return nil } func (x *NotificationChannel) GetVerificationStatus() NotificationChannel_VerificationStatus { if x != nil { return x.VerificationStatus } return NotificationChannel_VERIFICATION_STATUS_UNSPECIFIED } func (x *NotificationChannel) GetEnabled() *wrapperspb.BoolValue { if x != nil { return x.Enabled } return nil } func (x *NotificationChannel) GetCreationRecord() *MutationRecord { if x != nil { return x.CreationRecord } return nil } func (x *NotificationChannel) GetMutationRecords() []*MutationRecord { if x != nil { return x.MutationRecords } return nil } var File_google_monitoring_v3_notification_proto protoreflect.FileDescriptor var file_google_monitoring_v3_notification_proto_rawDesc = []byte{ 0x0a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf0, 0x04, 0x0a, 0x1d, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x4e, 0x0a, 0x0f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x3a, 0xa0, 0x02, 0xea, 0x41, 0x9c, 0x02, 0x0a, 0x37, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x46, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x50, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x44, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x7d, 0x12, 0x01, 0x2a, 0x22, 0xcb, 0x08, 0x0a, 0x13, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x5a, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x6d, 0x0a, 0x13, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x12, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4d, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x4f, 0x0a, 0x10, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x12, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x1f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x02, 0x3a, 0xfe, 0x01, 0xea, 0x41, 0xfa, 0x01, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x3e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x7d, 0x12, 0x48, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x7d, 0x12, 0x3c, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x7d, 0x12, 0x01, 0x2a, 0x42, 0xcc, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x11, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_notification_proto_rawDescOnce sync.Once file_google_monitoring_v3_notification_proto_rawDescData = file_google_monitoring_v3_notification_proto_rawDesc ) func file_google_monitoring_v3_notification_proto_rawDescGZIP() []byte { file_google_monitoring_v3_notification_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_notification_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_notification_proto_rawDescData) }) return file_google_monitoring_v3_notification_proto_rawDescData } var file_google_monitoring_v3_notification_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_google_monitoring_v3_notification_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_google_monitoring_v3_notification_proto_goTypes = []any{ (NotificationChannel_VerificationStatus)(0), // 0: google.monitoring.v3.NotificationChannel.VerificationStatus (*NotificationChannelDescriptor)(nil), // 1: google.monitoring.v3.NotificationChannelDescriptor (*NotificationChannel)(nil), // 2: google.monitoring.v3.NotificationChannel nil, // 3: google.monitoring.v3.NotificationChannel.LabelsEntry nil, // 4: google.monitoring.v3.NotificationChannel.UserLabelsEntry (*label.LabelDescriptor)(nil), // 5: google.api.LabelDescriptor (ServiceTier)(0), // 6: google.monitoring.v3.ServiceTier (api.LaunchStage)(0), // 7: google.api.LaunchStage (*wrapperspb.BoolValue)(nil), // 8: google.protobuf.BoolValue (*MutationRecord)(nil), // 9: google.monitoring.v3.MutationRecord } var file_google_monitoring_v3_notification_proto_depIdxs = []int32{ 5, // 0: google.monitoring.v3.NotificationChannelDescriptor.labels:type_name -> google.api.LabelDescriptor 6, // 1: google.monitoring.v3.NotificationChannelDescriptor.supported_tiers:type_name -> google.monitoring.v3.ServiceTier 7, // 2: google.monitoring.v3.NotificationChannelDescriptor.launch_stage:type_name -> google.api.LaunchStage 3, // 3: google.monitoring.v3.NotificationChannel.labels:type_name -> google.monitoring.v3.NotificationChannel.LabelsEntry 4, // 4: google.monitoring.v3.NotificationChannel.user_labels:type_name -> google.monitoring.v3.NotificationChannel.UserLabelsEntry 0, // 5: google.monitoring.v3.NotificationChannel.verification_status:type_name -> google.monitoring.v3.NotificationChannel.VerificationStatus 8, // 6: google.monitoring.v3.NotificationChannel.enabled:type_name -> google.protobuf.BoolValue 9, // 7: google.monitoring.v3.NotificationChannel.creation_record:type_name -> google.monitoring.v3.MutationRecord 9, // 8: google.monitoring.v3.NotificationChannel.mutation_records:type_name -> google.monitoring.v3.MutationRecord 9, // [9:9] is the sub-list for method output_type 9, // [9:9] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name } func init() { file_google_monitoring_v3_notification_proto_init() } func file_google_monitoring_v3_notification_proto_init() { if File_google_monitoring_v3_notification_proto != nil { return } file_google_monitoring_v3_common_proto_init() file_google_monitoring_v3_mutation_record_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_notification_proto_rawDesc, NumEnums: 1, NumMessages: 4, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_notification_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_notification_proto_depIdxs, EnumInfos: file_google_monitoring_v3_notification_proto_enumTypes, MessageInfos: file_google_monitoring_v3_notification_proto_msgTypes, }.Build() File_google_monitoring_v3_notification_proto = out.File file_google_monitoring_v3_notification_proto_rawDesc = nil file_google_monitoring_v3_notification_proto_goTypes = nil file_google_monitoring_v3_notification_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/notification_service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/notification_service.proto package monitoringpb import ( context "context" reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The `ListNotificationChannelDescriptors` request. type ListNotificationChannelDescriptorsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The REST resource name of the parent from which to retrieve // the notification channel descriptors. The expected syntax is: // // projects/[PROJECT_ID_OR_NUMBER] // // Note that this // [names](https://cloud.google.com/monitoring/api/v3#project_name) the parent // container in which to look for the descriptors; to retrieve a single // descriptor by name, use the // [GetNotificationChannelDescriptor][google.monitoring.v3.NotificationChannelService.GetNotificationChannelDescriptor] // operation, instead. Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` // The maximum number of results to return in a single response. If // not set to a positive number, a reasonable value will be chosen by the // service. PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If non-empty, `page_token` must contain a value returned as the // `next_page_token` in a previous response to request the next set // of results. PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListNotificationChannelDescriptorsRequest) Reset() { *x = ListNotificationChannelDescriptorsRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListNotificationChannelDescriptorsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListNotificationChannelDescriptorsRequest) ProtoMessage() {} func (x *ListNotificationChannelDescriptorsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListNotificationChannelDescriptorsRequest.ProtoReflect.Descriptor instead. func (*ListNotificationChannelDescriptorsRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{0} } func (x *ListNotificationChannelDescriptorsRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *ListNotificationChannelDescriptorsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListNotificationChannelDescriptorsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The `ListNotificationChannelDescriptors` response. type ListNotificationChannelDescriptorsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The monitored resource descriptors supported for the specified // project, optionally filtered. ChannelDescriptors []*NotificationChannelDescriptor `protobuf:"bytes,1,rep,name=channel_descriptors,json=channelDescriptors,proto3" json:"channel_descriptors,omitempty"` // If not empty, indicates that there may be more results that match // the request. Use the value in the `page_token` field in a // subsequent request to fetch the next set of results. If empty, // all results have been returned. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListNotificationChannelDescriptorsResponse) Reset() { *x = ListNotificationChannelDescriptorsResponse{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListNotificationChannelDescriptorsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListNotificationChannelDescriptorsResponse) ProtoMessage() {} func (x *ListNotificationChannelDescriptorsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListNotificationChannelDescriptorsResponse.ProtoReflect.Descriptor instead. func (*ListNotificationChannelDescriptorsResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{1} } func (x *ListNotificationChannelDescriptorsResponse) GetChannelDescriptors() []*NotificationChannelDescriptor { if x != nil { return x.ChannelDescriptors } return nil } func (x *ListNotificationChannelDescriptorsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // The `GetNotificationChannelDescriptor` response. type GetNotificationChannelDescriptorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The channel type for which to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/notificationChannelDescriptors/[CHANNEL_TYPE] Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetNotificationChannelDescriptorRequest) Reset() { *x = GetNotificationChannelDescriptorRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetNotificationChannelDescriptorRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetNotificationChannelDescriptorRequest) ProtoMessage() {} func (x *GetNotificationChannelDescriptorRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetNotificationChannelDescriptorRequest.ProtoReflect.Descriptor instead. func (*GetNotificationChannelDescriptorRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{2} } func (x *GetNotificationChannelDescriptorRequest) GetName() string { if x != nil { return x.Name } return "" } // The `CreateNotificationChannel` request. type CreateNotificationChannelRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) on which // to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER] // // This names the container into which the channel will be // written, this does not name the newly created channel. The resulting // channel's name will have a normalized version of this field as a prefix, // but will add `/notificationChannels/[CHANNEL_ID]` to identify the channel. Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // Required. The definition of the `NotificationChannel` to create. NotificationChannel *NotificationChannel `protobuf:"bytes,2,opt,name=notification_channel,json=notificationChannel,proto3" json:"notification_channel,omitempty"` } func (x *CreateNotificationChannelRequest) Reset() { *x = CreateNotificationChannelRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateNotificationChannelRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateNotificationChannelRequest) ProtoMessage() {} func (x *CreateNotificationChannelRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateNotificationChannelRequest.ProtoReflect.Descriptor instead. func (*CreateNotificationChannelRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{3} } func (x *CreateNotificationChannelRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *CreateNotificationChannelRequest) GetNotificationChannel() *NotificationChannel { if x != nil { return x.NotificationChannel } return nil } // The `ListNotificationChannels` request. type ListNotificationChannelsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) on which // to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER] // // This names the container // in which to look for the notification channels; it does not name a // specific channel. To query a specific channel by REST resource name, use // the // [`GetNotificationChannel`][google.monitoring.v3.NotificationChannelService.GetNotificationChannel] // operation. Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` // Optional. If provided, this field specifies the criteria that must be met // by notification channels to be included in the response. // // For more details, see [sorting and // filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering). Filter string `protobuf:"bytes,6,opt,name=filter,proto3" json:"filter,omitempty"` // Optional. A comma-separated list of fields by which to sort the result. // Supports the same set of fields as in `filter`. Entries can be prefixed // with a minus sign to sort in descending rather than ascending order. // // For more details, see [sorting and // filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering). OrderBy string `protobuf:"bytes,7,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` // Optional. The maximum number of results to return in a single response. If // not set to a positive number, a reasonable value will be chosen by the // service. PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Optional. If non-empty, `page_token` must contain a value returned as the // `next_page_token` in a previous response to request the next set // of results. PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListNotificationChannelsRequest) Reset() { *x = ListNotificationChannelsRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListNotificationChannelsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListNotificationChannelsRequest) ProtoMessage() {} func (x *ListNotificationChannelsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListNotificationChannelsRequest.ProtoReflect.Descriptor instead. func (*ListNotificationChannelsRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{4} } func (x *ListNotificationChannelsRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *ListNotificationChannelsRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListNotificationChannelsRequest) GetOrderBy() string { if x != nil { return x.OrderBy } return "" } func (x *ListNotificationChannelsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListNotificationChannelsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The `ListNotificationChannels` response. type ListNotificationChannelsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The notification channels defined for the specified project. NotificationChannels []*NotificationChannel `protobuf:"bytes,3,rep,name=notification_channels,json=notificationChannels,proto3" json:"notification_channels,omitempty"` // If not empty, indicates that there may be more results that match // the request. Use the value in the `page_token` field in a // subsequent request to fetch the next set of results. If empty, // all results have been returned. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` // The total number of notification channels in all pages. This number is only // an estimate, and may change in subsequent pages. https://aip.dev/158 TotalSize int32 `protobuf:"varint,4,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` } func (x *ListNotificationChannelsResponse) Reset() { *x = ListNotificationChannelsResponse{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListNotificationChannelsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListNotificationChannelsResponse) ProtoMessage() {} func (x *ListNotificationChannelsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListNotificationChannelsResponse.ProtoReflect.Descriptor instead. func (*ListNotificationChannelsResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{5} } func (x *ListNotificationChannelsResponse) GetNotificationChannels() []*NotificationChannel { if x != nil { return x.NotificationChannels } return nil } func (x *ListNotificationChannelsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } func (x *ListNotificationChannelsResponse) GetTotalSize() int32 { if x != nil { return x.TotalSize } return 0 } // The `GetNotificationChannel` request. type GetNotificationChannelRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The channel for which to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID] Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetNotificationChannelRequest) Reset() { *x = GetNotificationChannelRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetNotificationChannelRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetNotificationChannelRequest) ProtoMessage() {} func (x *GetNotificationChannelRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetNotificationChannelRequest.ProtoReflect.Descriptor instead. func (*GetNotificationChannelRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{6} } func (x *GetNotificationChannelRequest) GetName() string { if x != nil { return x.Name } return "" } // The `UpdateNotificationChannel` request. type UpdateNotificationChannelRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Optional. The fields to update. UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` // Required. A description of the changes to be applied to the specified // notification channel. The description must provide a definition for // fields to be updated; the names of these fields should also be // included in the `update_mask`. NotificationChannel *NotificationChannel `protobuf:"bytes,3,opt,name=notification_channel,json=notificationChannel,proto3" json:"notification_channel,omitempty"` } func (x *UpdateNotificationChannelRequest) Reset() { *x = UpdateNotificationChannelRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateNotificationChannelRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateNotificationChannelRequest) ProtoMessage() {} func (x *UpdateNotificationChannelRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateNotificationChannelRequest.ProtoReflect.Descriptor instead. func (*UpdateNotificationChannelRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{7} } func (x *UpdateNotificationChannelRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } func (x *UpdateNotificationChannelRequest) GetNotificationChannel() *NotificationChannel { if x != nil { return x.NotificationChannel } return nil } // The `DeleteNotificationChannel` request. type DeleteNotificationChannelRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The channel for which to execute the request. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID] Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // If true, the notification channel will be deleted regardless of its // use in alert policies (the policies will be updated to remove the // channel). If false, this operation will fail if the notification channel // is referenced by existing alerting policies. Force bool `protobuf:"varint,5,opt,name=force,proto3" json:"force,omitempty"` } func (x *DeleteNotificationChannelRequest) Reset() { *x = DeleteNotificationChannelRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteNotificationChannelRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteNotificationChannelRequest) ProtoMessage() {} func (x *DeleteNotificationChannelRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteNotificationChannelRequest.ProtoReflect.Descriptor instead. func (*DeleteNotificationChannelRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{8} } func (x *DeleteNotificationChannelRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *DeleteNotificationChannelRequest) GetForce() bool { if x != nil { return x.Force } return false } // The `SendNotificationChannelVerificationCode` request. type SendNotificationChannelVerificationCodeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The notification channel to which to send a verification code. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *SendNotificationChannelVerificationCodeRequest) Reset() { *x = SendNotificationChannelVerificationCodeRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *SendNotificationChannelVerificationCodeRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*SendNotificationChannelVerificationCodeRequest) ProtoMessage() {} func (x *SendNotificationChannelVerificationCodeRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SendNotificationChannelVerificationCodeRequest.ProtoReflect.Descriptor instead. func (*SendNotificationChannelVerificationCodeRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{9} } func (x *SendNotificationChannelVerificationCodeRequest) GetName() string { if x != nil { return x.Name } return "" } // The `GetNotificationChannelVerificationCode` request. type GetNotificationChannelVerificationCodeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The notification channel for which a verification code is to be // generated and retrieved. This must name a channel that is already verified; // if the specified channel is not verified, the request will fail. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The desired expiration time. If specified, the API will guarantee that // the returned code will not be valid after the specified timestamp; // however, the API cannot guarantee that the returned code will be // valid for at least as long as the requested time (the API puts an upper // bound on the amount of time for which a code may be valid). If omitted, // a default expiration will be used, which may be less than the max // permissible expiration (so specifying an expiration may extend the // code's lifetime over omitting an expiration, even though the API does // impose an upper limit on the maximum expiration that is permitted). ExpireTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` } func (x *GetNotificationChannelVerificationCodeRequest) Reset() { *x = GetNotificationChannelVerificationCodeRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetNotificationChannelVerificationCodeRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetNotificationChannelVerificationCodeRequest) ProtoMessage() {} func (x *GetNotificationChannelVerificationCodeRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetNotificationChannelVerificationCodeRequest.ProtoReflect.Descriptor instead. func (*GetNotificationChannelVerificationCodeRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{10} } func (x *GetNotificationChannelVerificationCodeRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *GetNotificationChannelVerificationCodeRequest) GetExpireTime() *timestamppb.Timestamp { if x != nil { return x.ExpireTime } return nil } // The `GetNotificationChannelVerificationCode` request. type GetNotificationChannelVerificationCodeResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The verification code, which may be used to verify other channels // that have an equivalent identity (i.e. other channels of the same // type with the same fingerprint such as other email channels with // the same email address or other sms channels with the same number). Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` // The expiration time associated with the code that was returned. If // an expiration was provided in the request, this is the minimum of the // requested expiration in the request and the max permitted expiration. ExpireTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` } func (x *GetNotificationChannelVerificationCodeResponse) Reset() { *x = GetNotificationChannelVerificationCodeResponse{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetNotificationChannelVerificationCodeResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetNotificationChannelVerificationCodeResponse) ProtoMessage() {} func (x *GetNotificationChannelVerificationCodeResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetNotificationChannelVerificationCodeResponse.ProtoReflect.Descriptor instead. func (*GetNotificationChannelVerificationCodeResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{11} } func (x *GetNotificationChannelVerificationCodeResponse) GetCode() string { if x != nil { return x.Code } return "" } func (x *GetNotificationChannelVerificationCodeResponse) GetExpireTime() *timestamppb.Timestamp { if x != nil { return x.ExpireTime } return nil } // The `VerifyNotificationChannel` request. type VerifyNotificationChannelRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The notification channel to verify. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Required. The verification code that was delivered to the channel as // a result of invoking the `SendNotificationChannelVerificationCode` API // method or that was retrieved from a verified channel via // `GetNotificationChannelVerificationCode`. For example, one might have // "G-123456" or "TKNZGhhd2EyN3I1MnRnMjRv" (in general, one is only // guaranteed that the code is valid UTF-8; one should not // make any assumptions regarding the structure or format of the code). Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` } func (x *VerifyNotificationChannelRequest) Reset() { *x = VerifyNotificationChannelRequest{} mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *VerifyNotificationChannelRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*VerifyNotificationChannelRequest) ProtoMessage() {} func (x *VerifyNotificationChannelRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_notification_service_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use VerifyNotificationChannelRequest.ProtoReflect.Descriptor instead. func (*VerifyNotificationChannelRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_notification_service_proto_rawDescGZIP(), []int{12} } func (x *VerifyNotificationChannelRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *VerifyNotificationChannelRequest) GetCode() string { if x != nil { return x.Code } return "" } var File_google_monitoring_v3_notification_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_notification_service_proto_rawDesc = []byte{ 0x0a, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbc, 0x01, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x39, 0x12, 0x37, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xba, 0x01, 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7e, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3f, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x39, 0x0a, 0x37, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x12, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x13, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0xef, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x12, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc9, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x15, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x61, 0x0a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x13, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x83, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x7b, 0x0a, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x2d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2f, 0x0a, 0x2d, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x32, 0xea, 0x12, 0x0a, 0x1a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xec, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x12, 0xdd, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x45, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xc4, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x3b, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xe4, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x64, 0xda, 0x41, 0x19, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x3a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x83, 0x02, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x82, 0x01, 0xda, 0x41, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x59, 0x3a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x32, 0x41, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0xda, 0x41, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x2a, 0x2c, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xdc, 0x01, 0x0a, 0x27, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x53, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x3a, 0x01, 0x2a, 0x22, 0x41, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x73, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x87, 0x02, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x43, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x44, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x01, 0x2a, 0x22, 0x40, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0xca, 0x01, 0x0a, 0x19, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x4a, 0xda, 0x41, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x63, 0x6f, 0x64, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x3a, 0x01, 0x2a, 0x22, 0x33, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xd3, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x18, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_notification_service_proto_rawDescOnce sync.Once file_google_monitoring_v3_notification_service_proto_rawDescData = file_google_monitoring_v3_notification_service_proto_rawDesc ) func file_google_monitoring_v3_notification_service_proto_rawDescGZIP() []byte { file_google_monitoring_v3_notification_service_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_notification_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_notification_service_proto_rawDescData) }) return file_google_monitoring_v3_notification_service_proto_rawDescData } var file_google_monitoring_v3_notification_service_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_google_monitoring_v3_notification_service_proto_goTypes = []any{ (*ListNotificationChannelDescriptorsRequest)(nil), // 0: google.monitoring.v3.ListNotificationChannelDescriptorsRequest (*ListNotificationChannelDescriptorsResponse)(nil), // 1: google.monitoring.v3.ListNotificationChannelDescriptorsResponse (*GetNotificationChannelDescriptorRequest)(nil), // 2: google.monitoring.v3.GetNotificationChannelDescriptorRequest (*CreateNotificationChannelRequest)(nil), // 3: google.monitoring.v3.CreateNotificationChannelRequest (*ListNotificationChannelsRequest)(nil), // 4: google.monitoring.v3.ListNotificationChannelsRequest (*ListNotificationChannelsResponse)(nil), // 5: google.monitoring.v3.ListNotificationChannelsResponse (*GetNotificationChannelRequest)(nil), // 6: google.monitoring.v3.GetNotificationChannelRequest (*UpdateNotificationChannelRequest)(nil), // 7: google.monitoring.v3.UpdateNotificationChannelRequest (*DeleteNotificationChannelRequest)(nil), // 8: google.monitoring.v3.DeleteNotificationChannelRequest (*SendNotificationChannelVerificationCodeRequest)(nil), // 9: google.monitoring.v3.SendNotificationChannelVerificationCodeRequest (*GetNotificationChannelVerificationCodeRequest)(nil), // 10: google.monitoring.v3.GetNotificationChannelVerificationCodeRequest (*GetNotificationChannelVerificationCodeResponse)(nil), // 11: google.monitoring.v3.GetNotificationChannelVerificationCodeResponse (*VerifyNotificationChannelRequest)(nil), // 12: google.monitoring.v3.VerifyNotificationChannelRequest (*NotificationChannelDescriptor)(nil), // 13: google.monitoring.v3.NotificationChannelDescriptor (*NotificationChannel)(nil), // 14: google.monitoring.v3.NotificationChannel (*fieldmaskpb.FieldMask)(nil), // 15: google.protobuf.FieldMask (*timestamppb.Timestamp)(nil), // 16: google.protobuf.Timestamp (*emptypb.Empty)(nil), // 17: google.protobuf.Empty } var file_google_monitoring_v3_notification_service_proto_depIdxs = []int32{ 13, // 0: google.monitoring.v3.ListNotificationChannelDescriptorsResponse.channel_descriptors:type_name -> google.monitoring.v3.NotificationChannelDescriptor 14, // 1: google.monitoring.v3.CreateNotificationChannelRequest.notification_channel:type_name -> google.monitoring.v3.NotificationChannel 14, // 2: google.monitoring.v3.ListNotificationChannelsResponse.notification_channels:type_name -> google.monitoring.v3.NotificationChannel 15, // 3: google.monitoring.v3.UpdateNotificationChannelRequest.update_mask:type_name -> google.protobuf.FieldMask 14, // 4: google.monitoring.v3.UpdateNotificationChannelRequest.notification_channel:type_name -> google.monitoring.v3.NotificationChannel 16, // 5: google.monitoring.v3.GetNotificationChannelVerificationCodeRequest.expire_time:type_name -> google.protobuf.Timestamp 16, // 6: google.monitoring.v3.GetNotificationChannelVerificationCodeResponse.expire_time:type_name -> google.protobuf.Timestamp 0, // 7: google.monitoring.v3.NotificationChannelService.ListNotificationChannelDescriptors:input_type -> google.monitoring.v3.ListNotificationChannelDescriptorsRequest 2, // 8: google.monitoring.v3.NotificationChannelService.GetNotificationChannelDescriptor:input_type -> google.monitoring.v3.GetNotificationChannelDescriptorRequest 4, // 9: google.monitoring.v3.NotificationChannelService.ListNotificationChannels:input_type -> google.monitoring.v3.ListNotificationChannelsRequest 6, // 10: google.monitoring.v3.NotificationChannelService.GetNotificationChannel:input_type -> google.monitoring.v3.GetNotificationChannelRequest 3, // 11: google.monitoring.v3.NotificationChannelService.CreateNotificationChannel:input_type -> google.monitoring.v3.CreateNotificationChannelRequest 7, // 12: google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel:input_type -> google.monitoring.v3.UpdateNotificationChannelRequest 8, // 13: google.monitoring.v3.NotificationChannelService.DeleteNotificationChannel:input_type -> google.monitoring.v3.DeleteNotificationChannelRequest 9, // 14: google.monitoring.v3.NotificationChannelService.SendNotificationChannelVerificationCode:input_type -> google.monitoring.v3.SendNotificationChannelVerificationCodeRequest 10, // 15: google.monitoring.v3.NotificationChannelService.GetNotificationChannelVerificationCode:input_type -> google.monitoring.v3.GetNotificationChannelVerificationCodeRequest 12, // 16: google.monitoring.v3.NotificationChannelService.VerifyNotificationChannel:input_type -> google.monitoring.v3.VerifyNotificationChannelRequest 1, // 17: google.monitoring.v3.NotificationChannelService.ListNotificationChannelDescriptors:output_type -> google.monitoring.v3.ListNotificationChannelDescriptorsResponse 13, // 18: google.monitoring.v3.NotificationChannelService.GetNotificationChannelDescriptor:output_type -> google.monitoring.v3.NotificationChannelDescriptor 5, // 19: google.monitoring.v3.NotificationChannelService.ListNotificationChannels:output_type -> google.monitoring.v3.ListNotificationChannelsResponse 14, // 20: google.monitoring.v3.NotificationChannelService.GetNotificationChannel:output_type -> google.monitoring.v3.NotificationChannel 14, // 21: google.monitoring.v3.NotificationChannelService.CreateNotificationChannel:output_type -> google.monitoring.v3.NotificationChannel 14, // 22: google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel:output_type -> google.monitoring.v3.NotificationChannel 17, // 23: google.monitoring.v3.NotificationChannelService.DeleteNotificationChannel:output_type -> google.protobuf.Empty 17, // 24: google.monitoring.v3.NotificationChannelService.SendNotificationChannelVerificationCode:output_type -> google.protobuf.Empty 11, // 25: google.monitoring.v3.NotificationChannelService.GetNotificationChannelVerificationCode:output_type -> google.monitoring.v3.GetNotificationChannelVerificationCodeResponse 14, // 26: google.monitoring.v3.NotificationChannelService.VerifyNotificationChannel:output_type -> google.monitoring.v3.NotificationChannel 17, // [17:27] is the sub-list for method output_type 7, // [7:17] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name } func init() { file_google_monitoring_v3_notification_service_proto_init() } func file_google_monitoring_v3_notification_service_proto_init() { if File_google_monitoring_v3_notification_service_proto != nil { return } file_google_monitoring_v3_notification_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_notification_service_proto_rawDesc, NumEnums: 0, NumMessages: 13, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_monitoring_v3_notification_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_notification_service_proto_depIdxs, MessageInfos: file_google_monitoring_v3_notification_service_proto_msgTypes, }.Build() File_google_monitoring_v3_notification_service_proto = out.File file_google_monitoring_v3_notification_service_proto_rawDesc = nil file_google_monitoring_v3_notification_service_proto_goTypes = nil file_google_monitoring_v3_notification_service_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // NotificationChannelServiceClient is the client API for NotificationChannelService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type NotificationChannelServiceClient interface { // Lists the descriptors for supported channel types. The use of descriptors // makes it possible for new channel types to be dynamically added. ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) // Gets a single channel descriptor. The descriptor indicates which fields // are expected / permitted for a notification channel of the given type. GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) // Lists the notification channels that have been created for the project. // To list the types of notification channels that are supported, use // the `ListNotificationChannelDescriptors` method. ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) // Gets a single notification channel. The channel includes the relevant // configuration details with which the channel was created. However, the // response may truncate or omit passwords, API keys, or other private key // matter and thus the response may not be 100% identical to the information // that was supplied in the call to the create method. GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) // Creates a new notification channel, representing a single notification // endpoint such as an email address, SMS number, or PagerDuty service. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) // Updates a notification channel. Fields not specified in the field mask // remain unchanged. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) // Deletes a notification channel. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Causes a verification code to be delivered to the channel. The code // can then be supplied in `VerifyNotificationChannel` to verify the channel. SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Requests a verification code for an already verified channel that can then // be used in a call to VerifyNotificationChannel() on a different channel // with an equivalent identity in the same or in a different project. This // makes it possible to copy a channel between projects without requiring // manual reverification of the channel. If the channel is not in the // verified state, this method will fail (in other words, this may only be // used if the SendNotificationChannelVerificationCode and // VerifyNotificationChannel paths have already been used to put the given // channel into the verified state). // // There is no guarantee that the verification codes returned by this method // will be of a similar structure or form as the ones that are delivered // to the channel via SendNotificationChannelVerificationCode; while // VerifyNotificationChannel() will recognize both the codes delivered via // SendNotificationChannelVerificationCode() and returned from // GetNotificationChannelVerificationCode(), it is typically the case that // the verification codes delivered via // SendNotificationChannelVerificationCode() will be shorter and also // have a shorter expiration (e.g. codes such as "G-123456") whereas // GetVerificationCode() will typically return a much longer, websafe base // 64 encoded string that has a longer expiration time. GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) // Verifies a `NotificationChannel` by proving receipt of the code // delivered to the channel as a result of calling // `SendNotificationChannelVerificationCode`. VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) } type notificationChannelServiceClient struct { cc grpc.ClientConnInterface } func NewNotificationChannelServiceClient(cc grpc.ClientConnInterface) NotificationChannelServiceClient { return ¬ificationChannelServiceClient{cc} } func (c *notificationChannelServiceClient) ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) { out := new(ListNotificationChannelDescriptorsResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) { out := new(NotificationChannelDescriptor) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) { out := new(ListNotificationChannelsResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/ListNotificationChannels", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { out := new(NotificationChannel) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannel", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { out := new(NotificationChannel) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { out := new(NotificationChannel) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) { out := new(GetNotificationChannelVerificationCodeResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *notificationChannelServiceClient) VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { out := new(NotificationChannel) err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel", in, out, opts...) if err != nil { return nil, err } return out, nil } // NotificationChannelServiceServer is the server API for NotificationChannelService service. type NotificationChannelServiceServer interface { // Lists the descriptors for supported channel types. The use of descriptors // makes it possible for new channel types to be dynamically added. ListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) // Gets a single channel descriptor. The descriptor indicates which fields // are expected / permitted for a notification channel of the given type. GetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) // Lists the notification channels that have been created for the project. // To list the types of notification channels that are supported, use // the `ListNotificationChannelDescriptors` method. ListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) // Gets a single notification channel. The channel includes the relevant // configuration details with which the channel was created. However, the // response may truncate or omit passwords, API keys, or other private key // matter and thus the response may not be 100% identical to the information // that was supplied in the call to the create method. GetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error) // Creates a new notification channel, representing a single notification // endpoint such as an email address, SMS number, or PagerDuty service. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. CreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error) // Updates a notification channel. Fields not specified in the field mask // remain unchanged. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. UpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error) // Deletes a notification channel. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. DeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*emptypb.Empty, error) // Causes a verification code to be delivered to the channel. The code // can then be supplied in `VerifyNotificationChannel` to verify the channel. SendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*emptypb.Empty, error) // Requests a verification code for an already verified channel that can then // be used in a call to VerifyNotificationChannel() on a different channel // with an equivalent identity in the same or in a different project. This // makes it possible to copy a channel between projects without requiring // manual reverification of the channel. If the channel is not in the // verified state, this method will fail (in other words, this may only be // used if the SendNotificationChannelVerificationCode and // VerifyNotificationChannel paths have already been used to put the given // channel into the verified state). // // There is no guarantee that the verification codes returned by this method // will be of a similar structure or form as the ones that are delivered // to the channel via SendNotificationChannelVerificationCode; while // VerifyNotificationChannel() will recognize both the codes delivered via // SendNotificationChannelVerificationCode() and returned from // GetNotificationChannelVerificationCode(), it is typically the case that // the verification codes delivered via // SendNotificationChannelVerificationCode() will be shorter and also // have a shorter expiration (e.g. codes such as "G-123456") whereas // GetVerificationCode() will typically return a much longer, websafe base // 64 encoded string that has a longer expiration time. GetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) // Verifies a `NotificationChannel` by proving receipt of the code // delivered to the channel as a result of calling // `SendNotificationChannelVerificationCode`. VerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error) } // UnimplementedNotificationChannelServiceServer can be embedded to have forward compatible implementations. type UnimplementedNotificationChannelServiceServer struct { } func (*UnimplementedNotificationChannelServiceServer) ListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListNotificationChannelDescriptors not implemented") } func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannelDescriptor not implemented") } func (*UnimplementedNotificationChannelServiceServer) ListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListNotificationChannels not implemented") } func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannel not implemented") } func (*UnimplementedNotificationChannelServiceServer) CreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateNotificationChannel not implemented") } func (*UnimplementedNotificationChannelServiceServer) UpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateNotificationChannel not implemented") } func (*UnimplementedNotificationChannelServiceServer) DeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteNotificationChannel not implemented") } func (*UnimplementedNotificationChannelServiceServer) SendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SendNotificationChannelVerificationCode not implemented") } func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannelVerificationCode not implemented") } func (*UnimplementedNotificationChannelServiceServer) VerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error) { return nil, status.Errorf(codes.Unimplemented, "method VerifyNotificationChannel not implemented") } func RegisterNotificationChannelServiceServer(s *grpc.Server, srv NotificationChannelServiceServer) { s.RegisterService(&_NotificationChannelService_serviceDesc, srv) } func _NotificationChannelService_ListNotificationChannelDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListNotificationChannelDescriptorsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, req.(*ListNotificationChannelDescriptorsRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_GetNotificationChannelDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetNotificationChannelDescriptorRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, req.(*GetNotificationChannelDescriptorRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_ListNotificationChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListNotificationChannelsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/ListNotificationChannels", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, req.(*ListNotificationChannelsRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_GetNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetNotificationChannelRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannel", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, req.(*GetNotificationChannelRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_CreateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateNotificationChannelRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, req.(*CreateNotificationChannelRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_UpdateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateNotificationChannelRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, req.(*UpdateNotificationChannelRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_DeleteNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteNotificationChannelRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, req.(*DeleteNotificationChannelRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_SendNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SendNotificationChannelVerificationCodeRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, req.(*SendNotificationChannelVerificationCodeRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_GetNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetNotificationChannelVerificationCodeRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, req.(*GetNotificationChannelVerificationCodeRequest)) } return interceptor(ctx, in, info, handler) } func _NotificationChannelService_VerifyNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(VerifyNotificationChannelRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, req.(*VerifyNotificationChannelRequest)) } return interceptor(ctx, in, info, handler) } var _NotificationChannelService_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.monitoring.v3.NotificationChannelService", HandlerType: (*NotificationChannelServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "ListNotificationChannelDescriptors", Handler: _NotificationChannelService_ListNotificationChannelDescriptors_Handler, }, { MethodName: "GetNotificationChannelDescriptor", Handler: _NotificationChannelService_GetNotificationChannelDescriptor_Handler, }, { MethodName: "ListNotificationChannels", Handler: _NotificationChannelService_ListNotificationChannels_Handler, }, { MethodName: "GetNotificationChannel", Handler: _NotificationChannelService_GetNotificationChannel_Handler, }, { MethodName: "CreateNotificationChannel", Handler: _NotificationChannelService_CreateNotificationChannel_Handler, }, { MethodName: "UpdateNotificationChannel", Handler: _NotificationChannelService_UpdateNotificationChannel_Handler, }, { MethodName: "DeleteNotificationChannel", Handler: _NotificationChannelService_DeleteNotificationChannel_Handler, }, { MethodName: "SendNotificationChannelVerificationCode", Handler: _NotificationChannelService_SendNotificationChannelVerificationCode_Handler, }, { MethodName: "GetNotificationChannelVerificationCode", Handler: _NotificationChannelService_GetNotificationChannelVerificationCode_Handler, }, { MethodName: "VerifyNotificationChannel", Handler: _NotificationChannelService_VerifyNotificationChannel_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/monitoring/v3/notification_service.proto", } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/query_service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/query_service.proto package monitoringpb import ( context "context" reflect "reflect" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) var File_google_monitoring_v3_query_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_query_service_proto_rawDesc = []byte{ 0x0a, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xe1, 0x02, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa4, 0x01, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x02, 0x01, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xcc, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_google_monitoring_v3_query_service_proto_goTypes = []any{ (*QueryTimeSeriesRequest)(nil), // 0: google.monitoring.v3.QueryTimeSeriesRequest (*QueryTimeSeriesResponse)(nil), // 1: google.monitoring.v3.QueryTimeSeriesResponse } var file_google_monitoring_v3_query_service_proto_depIdxs = []int32{ 0, // 0: google.monitoring.v3.QueryService.QueryTimeSeries:input_type -> google.monitoring.v3.QueryTimeSeriesRequest 1, // 1: google.monitoring.v3.QueryService.QueryTimeSeries:output_type -> google.monitoring.v3.QueryTimeSeriesResponse 1, // [1:2] is the sub-list for method output_type 0, // [0:1] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_google_monitoring_v3_query_service_proto_init() } func file_google_monitoring_v3_query_service_proto_init() { if File_google_monitoring_v3_query_service_proto != nil { return } file_google_monitoring_v3_metric_service_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_query_service_proto_rawDesc, NumEnums: 0, NumMessages: 0, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_monitoring_v3_query_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_query_service_proto_depIdxs, }.Build() File_google_monitoring_v3_query_service_proto = out.File file_google_monitoring_v3_query_service_proto_rawDesc = nil file_google_monitoring_v3_query_service_proto_goTypes = nil file_google_monitoring_v3_query_service_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // QueryServiceClient is the client API for QueryService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type QueryServiceClient interface { // Deprecated: Do not use. // Queries time series by using Monitoring Query Language (MQL). We recommend // using PromQL instead of MQL. For more information about the status of MQL, // see the [MQL deprecation // notice](https://cloud.google.com/stackdriver/docs/deprecations/mql). QueryTimeSeries(ctx context.Context, in *QueryTimeSeriesRequest, opts ...grpc.CallOption) (*QueryTimeSeriesResponse, error) } type queryServiceClient struct { cc grpc.ClientConnInterface } func NewQueryServiceClient(cc grpc.ClientConnInterface) QueryServiceClient { return &queryServiceClient{cc} } // Deprecated: Do not use. func (c *queryServiceClient) QueryTimeSeries(ctx context.Context, in *QueryTimeSeriesRequest, opts ...grpc.CallOption) (*QueryTimeSeriesResponse, error) { out := new(QueryTimeSeriesResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.QueryService/QueryTimeSeries", in, out, opts...) if err != nil { return nil, err } return out, nil } // QueryServiceServer is the server API for QueryService service. type QueryServiceServer interface { // Deprecated: Do not use. // Queries time series by using Monitoring Query Language (MQL). We recommend // using PromQL instead of MQL. For more information about the status of MQL, // see the [MQL deprecation // notice](https://cloud.google.com/stackdriver/docs/deprecations/mql). QueryTimeSeries(context.Context, *QueryTimeSeriesRequest) (*QueryTimeSeriesResponse, error) } // UnimplementedQueryServiceServer can be embedded to have forward compatible implementations. type UnimplementedQueryServiceServer struct { } func (*UnimplementedQueryServiceServer) QueryTimeSeries(context.Context, *QueryTimeSeriesRequest) (*QueryTimeSeriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryTimeSeries not implemented") } func RegisterQueryServiceServer(s *grpc.Server, srv QueryServiceServer) { s.RegisterService(&_QueryService_serviceDesc, srv) } func _QueryService_QueryTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryTimeSeriesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(QueryServiceServer).QueryTimeSeries(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.QueryService/QueryTimeSeries", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(QueryServiceServer).QueryTimeSeries(ctx, req.(*QueryTimeSeriesRequest)) } return interceptor(ctx, in, info, handler) } var _QueryService_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.monitoring.v3.QueryService", HandlerType: (*QueryServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "QueryTimeSeries", Handler: _QueryService_QueryTimeSeries_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/monitoring/v3/query_service.proto", } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/service.proto package monitoringpb import ( reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" calendarperiod "google.golang.org/genproto/googleapis/type/calendarperiod" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // `ServiceLevelObjective.View` determines what form of // `ServiceLevelObjective` is returned from `GetServiceLevelObjective`, // `ListServiceLevelObjectives`, and `ListServiceLevelObjectiveVersions` RPCs. type ServiceLevelObjective_View int32 const ( // Same as FULL. ServiceLevelObjective_VIEW_UNSPECIFIED ServiceLevelObjective_View = 0 // Return the embedded `ServiceLevelIndicator` in the form in which it was // defined. If it was defined using a `BasicSli`, return that `BasicSli`. ServiceLevelObjective_FULL ServiceLevelObjective_View = 2 // For `ServiceLevelIndicator`s using `BasicSli` articulation, instead // return the `ServiceLevelIndicator` with its mode of computation fully // spelled out as a `RequestBasedSli`. For `ServiceLevelIndicator`s using // `RequestBasedSli` or `WindowsBasedSli`, return the // `ServiceLevelIndicator` as it was provided. ServiceLevelObjective_EXPLICIT ServiceLevelObjective_View = 1 ) // Enum value maps for ServiceLevelObjective_View. var ( ServiceLevelObjective_View_name = map[int32]string{ 0: "VIEW_UNSPECIFIED", 2: "FULL", 1: "EXPLICIT", } ServiceLevelObjective_View_value = map[string]int32{ "VIEW_UNSPECIFIED": 0, "FULL": 2, "EXPLICIT": 1, } ) func (x ServiceLevelObjective_View) Enum() *ServiceLevelObjective_View { p := new(ServiceLevelObjective_View) *p = x return p } func (x ServiceLevelObjective_View) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ServiceLevelObjective_View) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_service_proto_enumTypes[0].Descriptor() } func (ServiceLevelObjective_View) Type() protoreflect.EnumType { return &file_google_monitoring_v3_service_proto_enumTypes[0] } func (x ServiceLevelObjective_View) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use ServiceLevelObjective_View.Descriptor instead. func (ServiceLevelObjective_View) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{1, 0} } // A `Service` is a discrete, autonomous, and network-accessible unit, designed // to solve an individual concern // ([Wikipedia](https://en.wikipedia.org/wiki/Service-orientation)). In // Cloud Monitoring, a `Service` acts as the root resource under which // operational aspects of the service are accessible. type Service struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Identifier. Resource name for this Service. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name used for UI elements listing this Service. DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // REQUIRED. Service-identifying atoms specifying the underlying service. // // Types that are assignable to Identifier: // // *Service_Custom_ // *Service_AppEngine_ // *Service_CloudEndpoints_ // *Service_ClusterIstio_ // *Service_MeshIstio_ // *Service_IstioCanonicalService_ // *Service_CloudRun_ // *Service_GkeNamespace_ // *Service_GkeWorkload_ // *Service_GkeService_ Identifier isService_Identifier `protobuf_oneof:"identifier"` // Message that contains the service type and service labels of this service // if it is a basic service. // Documentation and examples // [here](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/api-structures#basic-svc-w-basic-sli). BasicService *Service_BasicService `protobuf:"bytes,19,opt,name=basic_service,json=basicService,proto3" json:"basic_service,omitempty"` // Configuration for how to query telemetry on a Service. Telemetry *Service_Telemetry `protobuf:"bytes,13,opt,name=telemetry,proto3" json:"telemetry,omitempty"` // Labels which have been used to annotate the service. Label keys must start // with a letter. Label keys and values may contain lowercase letters, // numbers, underscores, and dashes. Label keys and values have a maximum // length of 63 characters, and must be less than 128 bytes in size. Up to 64 // label entries may be stored. For labels which do not have a semantic value, // the empty string may be supplied for the label value. UserLabels map[string]string `protobuf:"bytes,14,rep,name=user_labels,json=userLabels,proto3" json:"user_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Service) Reset() { *x = Service{} mi := &file_google_monitoring_v3_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service) ProtoMessage() {} func (x *Service) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service.ProtoReflect.Descriptor instead. func (*Service) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0} } func (x *Service) GetName() string { if x != nil { return x.Name } return "" } func (x *Service) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (m *Service) GetIdentifier() isService_Identifier { if m != nil { return m.Identifier } return nil } func (x *Service) GetCustom() *Service_Custom { if x, ok := x.GetIdentifier().(*Service_Custom_); ok { return x.Custom } return nil } func (x *Service) GetAppEngine() *Service_AppEngine { if x, ok := x.GetIdentifier().(*Service_AppEngine_); ok { return x.AppEngine } return nil } func (x *Service) GetCloudEndpoints() *Service_CloudEndpoints { if x, ok := x.GetIdentifier().(*Service_CloudEndpoints_); ok { return x.CloudEndpoints } return nil } func (x *Service) GetClusterIstio() *Service_ClusterIstio { if x, ok := x.GetIdentifier().(*Service_ClusterIstio_); ok { return x.ClusterIstio } return nil } func (x *Service) GetMeshIstio() *Service_MeshIstio { if x, ok := x.GetIdentifier().(*Service_MeshIstio_); ok { return x.MeshIstio } return nil } func (x *Service) GetIstioCanonicalService() *Service_IstioCanonicalService { if x, ok := x.GetIdentifier().(*Service_IstioCanonicalService_); ok { return x.IstioCanonicalService } return nil } func (x *Service) GetCloudRun() *Service_CloudRun { if x, ok := x.GetIdentifier().(*Service_CloudRun_); ok { return x.CloudRun } return nil } func (x *Service) GetGkeNamespace() *Service_GkeNamespace { if x, ok := x.GetIdentifier().(*Service_GkeNamespace_); ok { return x.GkeNamespace } return nil } func (x *Service) GetGkeWorkload() *Service_GkeWorkload { if x, ok := x.GetIdentifier().(*Service_GkeWorkload_); ok { return x.GkeWorkload } return nil } func (x *Service) GetGkeService() *Service_GkeService { if x, ok := x.GetIdentifier().(*Service_GkeService_); ok { return x.GkeService } return nil } func (x *Service) GetBasicService() *Service_BasicService { if x != nil { return x.BasicService } return nil } func (x *Service) GetTelemetry() *Service_Telemetry { if x != nil { return x.Telemetry } return nil } func (x *Service) GetUserLabels() map[string]string { if x != nil { return x.UserLabels } return nil } type isService_Identifier interface { isService_Identifier() } type Service_Custom_ struct { // Custom service type. Custom *Service_Custom `protobuf:"bytes,6,opt,name=custom,proto3,oneof"` } type Service_AppEngine_ struct { // Type used for App Engine services. AppEngine *Service_AppEngine `protobuf:"bytes,7,opt,name=app_engine,json=appEngine,proto3,oneof"` } type Service_CloudEndpoints_ struct { // Type used for Cloud Endpoints services. CloudEndpoints *Service_CloudEndpoints `protobuf:"bytes,8,opt,name=cloud_endpoints,json=cloudEndpoints,proto3,oneof"` } type Service_ClusterIstio_ struct { // Type used for Istio services that live in a Kubernetes cluster. ClusterIstio *Service_ClusterIstio `protobuf:"bytes,9,opt,name=cluster_istio,json=clusterIstio,proto3,oneof"` } type Service_MeshIstio_ struct { // Type used for Istio services scoped to an Istio mesh. MeshIstio *Service_MeshIstio `protobuf:"bytes,10,opt,name=mesh_istio,json=meshIstio,proto3,oneof"` } type Service_IstioCanonicalService_ struct { // Type used for canonical services scoped to an Istio mesh. // Metrics for Istio are // [documented here](https://istio.io/latest/docs/reference/config/metrics/) IstioCanonicalService *Service_IstioCanonicalService `protobuf:"bytes,11,opt,name=istio_canonical_service,json=istioCanonicalService,proto3,oneof"` } type Service_CloudRun_ struct { // Type used for Cloud Run services. CloudRun *Service_CloudRun `protobuf:"bytes,12,opt,name=cloud_run,json=cloudRun,proto3,oneof"` } type Service_GkeNamespace_ struct { // Type used for GKE Namespaces. GkeNamespace *Service_GkeNamespace `protobuf:"bytes,15,opt,name=gke_namespace,json=gkeNamespace,proto3,oneof"` } type Service_GkeWorkload_ struct { // Type used for GKE Workloads. GkeWorkload *Service_GkeWorkload `protobuf:"bytes,16,opt,name=gke_workload,json=gkeWorkload,proto3,oneof"` } type Service_GkeService_ struct { // Type used for GKE Services (the Kubernetes concept of a service). GkeService *Service_GkeService `protobuf:"bytes,17,opt,name=gke_service,json=gkeService,proto3,oneof"` } func (*Service_Custom_) isService_Identifier() {} func (*Service_AppEngine_) isService_Identifier() {} func (*Service_CloudEndpoints_) isService_Identifier() {} func (*Service_ClusterIstio_) isService_Identifier() {} func (*Service_MeshIstio_) isService_Identifier() {} func (*Service_IstioCanonicalService_) isService_Identifier() {} func (*Service_CloudRun_) isService_Identifier() {} func (*Service_GkeNamespace_) isService_Identifier() {} func (*Service_GkeWorkload_) isService_Identifier() {} func (*Service_GkeService_) isService_Identifier() {} // A Service-Level Objective (SLO) describes a level of desired good service. It // consists of a service-level indicator (SLI), a performance goal, and a period // over which the objective is to be evaluated against that goal. The SLO can // use SLIs defined in a number of different manners. Typical SLOs might include // "99% of requests in each rolling week have latency below 200 milliseconds" or // "99.5% of requests in each calendar month return successfully." type ServiceLevelObjective struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Identifier. Resource name for this `ServiceLevelObjective`. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_NAME] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name used for UI elements listing this SLO. DisplayName string `protobuf:"bytes,11,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // The definition of good service, used to measure and calculate the quality // of the `Service`'s performance with respect to a single aspect of service // quality. ServiceLevelIndicator *ServiceLevelIndicator `protobuf:"bytes,3,opt,name=service_level_indicator,json=serviceLevelIndicator,proto3" json:"service_level_indicator,omitempty"` // The fraction of service that must be good in order for this objective to be // met. `0 < goal <= 0.9999`. Goal float64 `protobuf:"fixed64,4,opt,name=goal,proto3" json:"goal,omitempty"` // The time period over which the objective will be evaluated. // // Types that are assignable to Period: // // *ServiceLevelObjective_RollingPeriod // *ServiceLevelObjective_CalendarPeriod Period isServiceLevelObjective_Period `protobuf_oneof:"period"` // Labels which have been used to annotate the service-level objective. Label // keys must start with a letter. Label keys and values may contain lowercase // letters, numbers, underscores, and dashes. Label keys and values have a // maximum length of 63 characters, and must be less than 128 bytes in size. // Up to 64 label entries may be stored. For labels which do not have a // semantic value, the empty string may be supplied for the label value. UserLabels map[string]string `protobuf:"bytes,12,rep,name=user_labels,json=userLabels,proto3" json:"user_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ServiceLevelObjective) Reset() { *x = ServiceLevelObjective{} mi := &file_google_monitoring_v3_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ServiceLevelObjective) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServiceLevelObjective) ProtoMessage() {} func (x *ServiceLevelObjective) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServiceLevelObjective.ProtoReflect.Descriptor instead. func (*ServiceLevelObjective) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{1} } func (x *ServiceLevelObjective) GetName() string { if x != nil { return x.Name } return "" } func (x *ServiceLevelObjective) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (x *ServiceLevelObjective) GetServiceLevelIndicator() *ServiceLevelIndicator { if x != nil { return x.ServiceLevelIndicator } return nil } func (x *ServiceLevelObjective) GetGoal() float64 { if x != nil { return x.Goal } return 0 } func (m *ServiceLevelObjective) GetPeriod() isServiceLevelObjective_Period { if m != nil { return m.Period } return nil } func (x *ServiceLevelObjective) GetRollingPeriod() *durationpb.Duration { if x, ok := x.GetPeriod().(*ServiceLevelObjective_RollingPeriod); ok { return x.RollingPeriod } return nil } func (x *ServiceLevelObjective) GetCalendarPeriod() calendarperiod.CalendarPeriod { if x, ok := x.GetPeriod().(*ServiceLevelObjective_CalendarPeriod); ok { return x.CalendarPeriod } return calendarperiod.CalendarPeriod(0) } func (x *ServiceLevelObjective) GetUserLabels() map[string]string { if x != nil { return x.UserLabels } return nil } type isServiceLevelObjective_Period interface { isServiceLevelObjective_Period() } type ServiceLevelObjective_RollingPeriod struct { // A rolling time period, semantically "in the past ``". // Must be an integer multiple of 1 day no larger than 30 days. RollingPeriod *durationpb.Duration `protobuf:"bytes,5,opt,name=rolling_period,json=rollingPeriod,proto3,oneof"` } type ServiceLevelObjective_CalendarPeriod struct { // A calendar period, semantically "since the start of the current // ``". At this time, only `DAY`, `WEEK`, `FORTNIGHT`, and // `MONTH` are supported. CalendarPeriod calendarperiod.CalendarPeriod `protobuf:"varint,6,opt,name=calendar_period,json=calendarPeriod,proto3,enum=google.type.CalendarPeriod,oneof"` } func (*ServiceLevelObjective_RollingPeriod) isServiceLevelObjective_Period() {} func (*ServiceLevelObjective_CalendarPeriod) isServiceLevelObjective_Period() {} // A Service-Level Indicator (SLI) describes the "performance" of a service. For // some services, the SLI is well-defined. In such cases, the SLI can be // described easily by referencing the well-known SLI and providing the needed // parameters. Alternatively, a "custom" SLI can be defined with a query to the // underlying metric store. An SLI is defined to be `good_service / // total_service` over any queried time interval. The value of performance // always falls into the range `0 <= performance <= 1`. A custom SLI describes // how to compute this ratio, whether this is by dividing values from a pair of // time series, cutting a `Distribution` into good and bad counts, or counting // time windows in which the service complies with a criterion. For separation // of concerns, a single Service-Level Indicator measures performance for only // one aspect of service quality, such as fraction of successful queries or // fast-enough queries. type ServiceLevelIndicator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Service level indicators can be grouped by whether the "unit" of service // being measured is based on counts of good requests or on counts of good // time windows // // Types that are assignable to Type: // // *ServiceLevelIndicator_BasicSli // *ServiceLevelIndicator_RequestBased // *ServiceLevelIndicator_WindowsBased Type isServiceLevelIndicator_Type `protobuf_oneof:"type"` } func (x *ServiceLevelIndicator) Reset() { *x = ServiceLevelIndicator{} mi := &file_google_monitoring_v3_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ServiceLevelIndicator) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServiceLevelIndicator) ProtoMessage() {} func (x *ServiceLevelIndicator) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServiceLevelIndicator.ProtoReflect.Descriptor instead. func (*ServiceLevelIndicator) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{2} } func (m *ServiceLevelIndicator) GetType() isServiceLevelIndicator_Type { if m != nil { return m.Type } return nil } func (x *ServiceLevelIndicator) GetBasicSli() *BasicSli { if x, ok := x.GetType().(*ServiceLevelIndicator_BasicSli); ok { return x.BasicSli } return nil } func (x *ServiceLevelIndicator) GetRequestBased() *RequestBasedSli { if x, ok := x.GetType().(*ServiceLevelIndicator_RequestBased); ok { return x.RequestBased } return nil } func (x *ServiceLevelIndicator) GetWindowsBased() *WindowsBasedSli { if x, ok := x.GetType().(*ServiceLevelIndicator_WindowsBased); ok { return x.WindowsBased } return nil } type isServiceLevelIndicator_Type interface { isServiceLevelIndicator_Type() } type ServiceLevelIndicator_BasicSli struct { // Basic SLI on a well-known service type. BasicSli *BasicSli `protobuf:"bytes,4,opt,name=basic_sli,json=basicSli,proto3,oneof"` } type ServiceLevelIndicator_RequestBased struct { // Request-based SLIs RequestBased *RequestBasedSli `protobuf:"bytes,1,opt,name=request_based,json=requestBased,proto3,oneof"` } type ServiceLevelIndicator_WindowsBased struct { // Windows-based SLIs WindowsBased *WindowsBasedSli `protobuf:"bytes,2,opt,name=windows_based,json=windowsBased,proto3,oneof"` } func (*ServiceLevelIndicator_BasicSli) isServiceLevelIndicator_Type() {} func (*ServiceLevelIndicator_RequestBased) isServiceLevelIndicator_Type() {} func (*ServiceLevelIndicator_WindowsBased) isServiceLevelIndicator_Type() {} // An SLI measuring performance on a well-known service type. Performance will // be computed on the basis of pre-defined metrics. The type of the // `service_resource` determines the metrics to use and the // `service_resource.labels` and `metric_labels` are used to construct a // monitoring filter to filter that metric down to just the data relevant to // this service. type BasicSli struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // OPTIONAL: The set of RPCs to which this SLI is relevant. Telemetry from // other methods will not be used to calculate performance for this SLI. If // omitted, this SLI applies to all the Service's methods. For service types // that don't support breaking down by method, setting this field will result // in an error. Method []string `protobuf:"bytes,7,rep,name=method,proto3" json:"method,omitempty"` // OPTIONAL: The set of locations to which this SLI is relevant. Telemetry // from other locations will not be used to calculate performance for this // SLI. If omitted, this SLI applies to all locations in which the Service has // activity. For service types that don't support breaking down by location, // setting this field will result in an error. Location []string `protobuf:"bytes,8,rep,name=location,proto3" json:"location,omitempty"` // OPTIONAL: The set of API versions to which this SLI is relevant. Telemetry // from other API versions will not be used to calculate performance for this // SLI. If omitted, this SLI applies to all API versions. For service types // that don't support breaking down by version, setting this field will result // in an error. Version []string `protobuf:"bytes,9,rep,name=version,proto3" json:"version,omitempty"` // This SLI can be evaluated on the basis of availability or latency. // // Types that are assignable to SliCriteria: // // *BasicSli_Availability // *BasicSli_Latency SliCriteria isBasicSli_SliCriteria `protobuf_oneof:"sli_criteria"` } func (x *BasicSli) Reset() { *x = BasicSli{} mi := &file_google_monitoring_v3_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BasicSli) String() string { return protoimpl.X.MessageStringOf(x) } func (*BasicSli) ProtoMessage() {} func (x *BasicSli) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BasicSli.ProtoReflect.Descriptor instead. func (*BasicSli) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{3} } func (x *BasicSli) GetMethod() []string { if x != nil { return x.Method } return nil } func (x *BasicSli) GetLocation() []string { if x != nil { return x.Location } return nil } func (x *BasicSli) GetVersion() []string { if x != nil { return x.Version } return nil } func (m *BasicSli) GetSliCriteria() isBasicSli_SliCriteria { if m != nil { return m.SliCriteria } return nil } func (x *BasicSli) GetAvailability() *BasicSli_AvailabilityCriteria { if x, ok := x.GetSliCriteria().(*BasicSli_Availability); ok { return x.Availability } return nil } func (x *BasicSli) GetLatency() *BasicSli_LatencyCriteria { if x, ok := x.GetSliCriteria().(*BasicSli_Latency); ok { return x.Latency } return nil } type isBasicSli_SliCriteria interface { isBasicSli_SliCriteria() } type BasicSli_Availability struct { // Good service is defined to be the count of requests made to this service // that return successfully. Availability *BasicSli_AvailabilityCriteria `protobuf:"bytes,2,opt,name=availability,proto3,oneof"` } type BasicSli_Latency struct { // Good service is defined to be the count of requests made to this service // that are fast enough with respect to `latency.threshold`. Latency *BasicSli_LatencyCriteria `protobuf:"bytes,3,opt,name=latency,proto3,oneof"` } func (*BasicSli_Availability) isBasicSli_SliCriteria() {} func (*BasicSli_Latency) isBasicSli_SliCriteria() {} // Range of numerical values within `min` and `max`. type Range struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Range minimum. Min float64 `protobuf:"fixed64,1,opt,name=min,proto3" json:"min,omitempty"` // Range maximum. Max float64 `protobuf:"fixed64,2,opt,name=max,proto3" json:"max,omitempty"` } func (x *Range) Reset() { *x = Range{} mi := &file_google_monitoring_v3_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Range) String() string { return protoimpl.X.MessageStringOf(x) } func (*Range) ProtoMessage() {} func (x *Range) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Range.ProtoReflect.Descriptor instead. func (*Range) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{4} } func (x *Range) GetMin() float64 { if x != nil { return x.Min } return 0 } func (x *Range) GetMax() float64 { if x != nil { return x.Max } return 0 } // Service Level Indicators for which atomic units of service are counted // directly. type RequestBasedSli struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The means to compute a ratio of `good_service` to `total_service`. // // Types that are assignable to Method: // // *RequestBasedSli_GoodTotalRatio // *RequestBasedSli_DistributionCut Method isRequestBasedSli_Method `protobuf_oneof:"method"` } func (x *RequestBasedSli) Reset() { *x = RequestBasedSli{} mi := &file_google_monitoring_v3_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *RequestBasedSli) String() string { return protoimpl.X.MessageStringOf(x) } func (*RequestBasedSli) ProtoMessage() {} func (x *RequestBasedSli) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RequestBasedSli.ProtoReflect.Descriptor instead. func (*RequestBasedSli) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{5} } func (m *RequestBasedSli) GetMethod() isRequestBasedSli_Method { if m != nil { return m.Method } return nil } func (x *RequestBasedSli) GetGoodTotalRatio() *TimeSeriesRatio { if x, ok := x.GetMethod().(*RequestBasedSli_GoodTotalRatio); ok { return x.GoodTotalRatio } return nil } func (x *RequestBasedSli) GetDistributionCut() *DistributionCut { if x, ok := x.GetMethod().(*RequestBasedSli_DistributionCut); ok { return x.DistributionCut } return nil } type isRequestBasedSli_Method interface { isRequestBasedSli_Method() } type RequestBasedSli_GoodTotalRatio struct { // `good_total_ratio` is used when the ratio of `good_service` to // `total_service` is computed from two `TimeSeries`. GoodTotalRatio *TimeSeriesRatio `protobuf:"bytes,1,opt,name=good_total_ratio,json=goodTotalRatio,proto3,oneof"` } type RequestBasedSli_DistributionCut struct { // `distribution_cut` is used when `good_service` is a count of values // aggregated in a `Distribution` that fall into a good range. The // `total_service` is the total count of all values aggregated in the // `Distribution`. DistributionCut *DistributionCut `protobuf:"bytes,3,opt,name=distribution_cut,json=distributionCut,proto3,oneof"` } func (*RequestBasedSli_GoodTotalRatio) isRequestBasedSli_Method() {} func (*RequestBasedSli_DistributionCut) isRequestBasedSli_Method() {} // A `TimeSeriesRatio` specifies two `TimeSeries` to use for computing the // `good_service / total_service` ratio. The specified `TimeSeries` must have // `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind = // DELTA` or `MetricKind = CUMULATIVE`. The `TimeSeriesRatio` must specify // exactly two of good, bad, and total, and the relationship `good_service + // bad_service = total_service` will be assumed. type TimeSeriesRatio struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) // specifying a `TimeSeries` quantifying good service provided. Must have // `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind = // DELTA` or `MetricKind = CUMULATIVE`. GoodServiceFilter string `protobuf:"bytes,4,opt,name=good_service_filter,json=goodServiceFilter,proto3" json:"good_service_filter,omitempty"` // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) // specifying a `TimeSeries` quantifying bad service, either demanded service // that was not provided or demanded service that was of inadequate quality. // Must have `ValueType = DOUBLE` or `ValueType = INT64` and must have // `MetricKind = DELTA` or `MetricKind = CUMULATIVE`. BadServiceFilter string `protobuf:"bytes,5,opt,name=bad_service_filter,json=badServiceFilter,proto3" json:"bad_service_filter,omitempty"` // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) // specifying a `TimeSeries` quantifying total demanded service. Must have // `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind = // DELTA` or `MetricKind = CUMULATIVE`. TotalServiceFilter string `protobuf:"bytes,6,opt,name=total_service_filter,json=totalServiceFilter,proto3" json:"total_service_filter,omitempty"` } func (x *TimeSeriesRatio) Reset() { *x = TimeSeriesRatio{} mi := &file_google_monitoring_v3_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *TimeSeriesRatio) String() string { return protoimpl.X.MessageStringOf(x) } func (*TimeSeriesRatio) ProtoMessage() {} func (x *TimeSeriesRatio) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TimeSeriesRatio.ProtoReflect.Descriptor instead. func (*TimeSeriesRatio) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{6} } func (x *TimeSeriesRatio) GetGoodServiceFilter() string { if x != nil { return x.GoodServiceFilter } return "" } func (x *TimeSeriesRatio) GetBadServiceFilter() string { if x != nil { return x.BadServiceFilter } return "" } func (x *TimeSeriesRatio) GetTotalServiceFilter() string { if x != nil { return x.TotalServiceFilter } return "" } // A `DistributionCut` defines a `TimeSeries` and thresholds used for measuring // good service and total service. The `TimeSeries` must have `ValueType = // DISTRIBUTION` and `MetricKind = DELTA` or `MetricKind = CUMULATIVE`. The // computed `good_service` will be the estimated count of values in the // `Distribution` that fall within the specified `min` and `max`. type DistributionCut struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) // specifying a `TimeSeries` aggregating values. Must have `ValueType = // DISTRIBUTION` and `MetricKind = DELTA` or `MetricKind = CUMULATIVE`. DistributionFilter string `protobuf:"bytes,4,opt,name=distribution_filter,json=distributionFilter,proto3" json:"distribution_filter,omitempty"` // Range of values considered "good." For a one-sided range, set one bound to // an infinite value. Range *Range `protobuf:"bytes,5,opt,name=range,proto3" json:"range,omitempty"` } func (x *DistributionCut) Reset() { *x = DistributionCut{} mi := &file_google_monitoring_v3_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DistributionCut) String() string { return protoimpl.X.MessageStringOf(x) } func (*DistributionCut) ProtoMessage() {} func (x *DistributionCut) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DistributionCut.ProtoReflect.Descriptor instead. func (*DistributionCut) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{7} } func (x *DistributionCut) GetDistributionFilter() string { if x != nil { return x.DistributionFilter } return "" } func (x *DistributionCut) GetRange() *Range { if x != nil { return x.Range } return nil } // A `WindowsBasedSli` defines `good_service` as the count of time windows for // which the provided service was of good quality. Criteria for determining // if service was good are embedded in the `window_criterion`. type WindowsBasedSli struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The criterion to use for evaluating window goodness. // // Types that are assignable to WindowCriterion: // // *WindowsBasedSli_GoodBadMetricFilter // *WindowsBasedSli_GoodTotalRatioThreshold // *WindowsBasedSli_MetricMeanInRange // *WindowsBasedSli_MetricSumInRange WindowCriterion isWindowsBasedSli_WindowCriterion `protobuf_oneof:"window_criterion"` // Duration over which window quality is evaluated. Must be an integer // fraction of a day and at least `60s`. WindowPeriod *durationpb.Duration `protobuf:"bytes,4,opt,name=window_period,json=windowPeriod,proto3" json:"window_period,omitempty"` } func (x *WindowsBasedSli) Reset() { *x = WindowsBasedSli{} mi := &file_google_monitoring_v3_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *WindowsBasedSli) String() string { return protoimpl.X.MessageStringOf(x) } func (*WindowsBasedSli) ProtoMessage() {} func (x *WindowsBasedSli) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use WindowsBasedSli.ProtoReflect.Descriptor instead. func (*WindowsBasedSli) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{8} } func (m *WindowsBasedSli) GetWindowCriterion() isWindowsBasedSli_WindowCriterion { if m != nil { return m.WindowCriterion } return nil } func (x *WindowsBasedSli) GetGoodBadMetricFilter() string { if x, ok := x.GetWindowCriterion().(*WindowsBasedSli_GoodBadMetricFilter); ok { return x.GoodBadMetricFilter } return "" } func (x *WindowsBasedSli) GetGoodTotalRatioThreshold() *WindowsBasedSli_PerformanceThreshold { if x, ok := x.GetWindowCriterion().(*WindowsBasedSli_GoodTotalRatioThreshold); ok { return x.GoodTotalRatioThreshold } return nil } func (x *WindowsBasedSli) GetMetricMeanInRange() *WindowsBasedSli_MetricRange { if x, ok := x.GetWindowCriterion().(*WindowsBasedSli_MetricMeanInRange); ok { return x.MetricMeanInRange } return nil } func (x *WindowsBasedSli) GetMetricSumInRange() *WindowsBasedSli_MetricRange { if x, ok := x.GetWindowCriterion().(*WindowsBasedSli_MetricSumInRange); ok { return x.MetricSumInRange } return nil } func (x *WindowsBasedSli) GetWindowPeriod() *durationpb.Duration { if x != nil { return x.WindowPeriod } return nil } type isWindowsBasedSli_WindowCriterion interface { isWindowsBasedSli_WindowCriterion() } type WindowsBasedSli_GoodBadMetricFilter struct { // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) // specifying a `TimeSeries` with `ValueType = BOOL`. The window is good if // any `true` values appear in the window. GoodBadMetricFilter string `protobuf:"bytes,5,opt,name=good_bad_metric_filter,json=goodBadMetricFilter,proto3,oneof"` } type WindowsBasedSli_GoodTotalRatioThreshold struct { // A window is good if its `performance` is high enough. GoodTotalRatioThreshold *WindowsBasedSli_PerformanceThreshold `protobuf:"bytes,2,opt,name=good_total_ratio_threshold,json=goodTotalRatioThreshold,proto3,oneof"` } type WindowsBasedSli_MetricMeanInRange struct { // A window is good if the metric's value is in a good range, averaged // across returned streams. MetricMeanInRange *WindowsBasedSli_MetricRange `protobuf:"bytes,6,opt,name=metric_mean_in_range,json=metricMeanInRange,proto3,oneof"` } type WindowsBasedSli_MetricSumInRange struct { // A window is good if the metric's value is in a good range, summed across // returned streams. MetricSumInRange *WindowsBasedSli_MetricRange `protobuf:"bytes,7,opt,name=metric_sum_in_range,json=metricSumInRange,proto3,oneof"` } func (*WindowsBasedSli_GoodBadMetricFilter) isWindowsBasedSli_WindowCriterion() {} func (*WindowsBasedSli_GoodTotalRatioThreshold) isWindowsBasedSli_WindowCriterion() {} func (*WindowsBasedSli_MetricMeanInRange) isWindowsBasedSli_WindowCriterion() {} func (*WindowsBasedSli_MetricSumInRange) isWindowsBasedSli_WindowCriterion() {} // Use a custom service to designate a service that you want to monitor // when none of the other service types (like App Engine, Cloud Run, or // a GKE type) matches your intended service. type Service_Custom struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Service_Custom) Reset() { *x = Service_Custom{} mi := &file_google_monitoring_v3_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_Custom) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_Custom) ProtoMessage() {} func (x *Service_Custom) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_Custom.ProtoReflect.Descriptor instead. func (*Service_Custom) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 0} } // App Engine service. Learn more at https://cloud.google.com/appengine. type Service_AppEngine struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The ID of the App Engine module underlying this service. Corresponds to // the `module_id` resource label in the [`gae_app` monitored // resource](https://cloud.google.com/monitoring/api/resources#tag_gae_app). ModuleId string `protobuf:"bytes,1,opt,name=module_id,json=moduleId,proto3" json:"module_id,omitempty"` } func (x *Service_AppEngine) Reset() { *x = Service_AppEngine{} mi := &file_google_monitoring_v3_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_AppEngine) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_AppEngine) ProtoMessage() {} func (x *Service_AppEngine) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_AppEngine.ProtoReflect.Descriptor instead. func (*Service_AppEngine) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 1} } func (x *Service_AppEngine) GetModuleId() string { if x != nil { return x.ModuleId } return "" } // Cloud Endpoints service. Learn more at https://cloud.google.com/endpoints. type Service_CloudEndpoints struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The name of the Cloud Endpoints service underlying this service. // Corresponds to the `service` resource label in the [`api` monitored // resource](https://cloud.google.com/monitoring/api/resources#tag_api). Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` } func (x *Service_CloudEndpoints) Reset() { *x = Service_CloudEndpoints{} mi := &file_google_monitoring_v3_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_CloudEndpoints) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_CloudEndpoints) ProtoMessage() {} func (x *Service_CloudEndpoints) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_CloudEndpoints.ProtoReflect.Descriptor instead. func (*Service_CloudEndpoints) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 2} } func (x *Service_CloudEndpoints) GetService() string { if x != nil { return x.Service } return "" } // Istio service scoped to a single Kubernetes cluster. Learn more at // https://istio.io. Clusters running OSS Istio will have their services // ingested as this type. type Service_ClusterIstio struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The location of the Kubernetes cluster in which this Istio service is // defined. Corresponds to the `location` resource label in `k8s_cluster` // resources. Location string `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` // The name of the Kubernetes cluster in which this Istio service is // defined. Corresponds to the `cluster_name` resource label in // `k8s_cluster` resources. ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // The namespace of the Istio service underlying this service. Corresponds // to the `destination_service_namespace` metric label in Istio metrics. ServiceNamespace string `protobuf:"bytes,3,opt,name=service_namespace,json=serviceNamespace,proto3" json:"service_namespace,omitempty"` // The name of the Istio service underlying this service. Corresponds to the // `destination_service_name` metric label in Istio metrics. ServiceName string `protobuf:"bytes,4,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` } func (x *Service_ClusterIstio) Reset() { *x = Service_ClusterIstio{} mi := &file_google_monitoring_v3_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_ClusterIstio) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_ClusterIstio) ProtoMessage() {} func (x *Service_ClusterIstio) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_ClusterIstio.ProtoReflect.Descriptor instead. func (*Service_ClusterIstio) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 3} } func (x *Service_ClusterIstio) GetLocation() string { if x != nil { return x.Location } return "" } func (x *Service_ClusterIstio) GetClusterName() string { if x != nil { return x.ClusterName } return "" } func (x *Service_ClusterIstio) GetServiceNamespace() string { if x != nil { return x.ServiceNamespace } return "" } func (x *Service_ClusterIstio) GetServiceName() string { if x != nil { return x.ServiceName } return "" } // Istio service scoped to an Istio mesh. Anthos clusters running ASM < 1.6.8 // will have their services ingested as this type. type Service_MeshIstio struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Identifier for the mesh in which this Istio service is defined. // Corresponds to the `mesh_uid` metric label in Istio metrics. MeshUid string `protobuf:"bytes,1,opt,name=mesh_uid,json=meshUid,proto3" json:"mesh_uid,omitempty"` // The namespace of the Istio service underlying this service. Corresponds // to the `destination_service_namespace` metric label in Istio metrics. ServiceNamespace string `protobuf:"bytes,3,opt,name=service_namespace,json=serviceNamespace,proto3" json:"service_namespace,omitempty"` // The name of the Istio service underlying this service. Corresponds to the // `destination_service_name` metric label in Istio metrics. ServiceName string `protobuf:"bytes,4,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` } func (x *Service_MeshIstio) Reset() { *x = Service_MeshIstio{} mi := &file_google_monitoring_v3_service_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_MeshIstio) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_MeshIstio) ProtoMessage() {} func (x *Service_MeshIstio) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_MeshIstio.ProtoReflect.Descriptor instead. func (*Service_MeshIstio) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 4} } func (x *Service_MeshIstio) GetMeshUid() string { if x != nil { return x.MeshUid } return "" } func (x *Service_MeshIstio) GetServiceNamespace() string { if x != nil { return x.ServiceNamespace } return "" } func (x *Service_MeshIstio) GetServiceName() string { if x != nil { return x.ServiceName } return "" } // Canonical service scoped to an Istio mesh. Anthos clusters running ASM >= // 1.6.8 will have their services ingested as this type. type Service_IstioCanonicalService struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Identifier for the Istio mesh in which this canonical service is defined. // Corresponds to the `mesh_uid` metric label in // [Istio metrics](https://cloud.google.com/monitoring/api/metrics_istio). MeshUid string `protobuf:"bytes,1,opt,name=mesh_uid,json=meshUid,proto3" json:"mesh_uid,omitempty"` // The namespace of the canonical service underlying this service. // Corresponds to the `destination_canonical_service_namespace` metric // label in [Istio // metrics](https://cloud.google.com/monitoring/api/metrics_istio). CanonicalServiceNamespace string `protobuf:"bytes,3,opt,name=canonical_service_namespace,json=canonicalServiceNamespace,proto3" json:"canonical_service_namespace,omitempty"` // The name of the canonical service underlying this service. // Corresponds to the `destination_canonical_service_name` metric label in // label in [Istio // metrics](https://cloud.google.com/monitoring/api/metrics_istio). CanonicalService string `protobuf:"bytes,4,opt,name=canonical_service,json=canonicalService,proto3" json:"canonical_service,omitempty"` } func (x *Service_IstioCanonicalService) Reset() { *x = Service_IstioCanonicalService{} mi := &file_google_monitoring_v3_service_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_IstioCanonicalService) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_IstioCanonicalService) ProtoMessage() {} func (x *Service_IstioCanonicalService) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_IstioCanonicalService.ProtoReflect.Descriptor instead. func (*Service_IstioCanonicalService) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 5} } func (x *Service_IstioCanonicalService) GetMeshUid() string { if x != nil { return x.MeshUid } return "" } func (x *Service_IstioCanonicalService) GetCanonicalServiceNamespace() string { if x != nil { return x.CanonicalServiceNamespace } return "" } func (x *Service_IstioCanonicalService) GetCanonicalService() string { if x != nil { return x.CanonicalService } return "" } // Cloud Run service. Learn more at https://cloud.google.com/run. type Service_CloudRun struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The name of the Cloud Run service. Corresponds to the `service_name` // resource label in the [`cloud_run_revision` monitored // resource](https://cloud.google.com/monitoring/api/resources#tag_cloud_run_revision). ServiceName string `protobuf:"bytes,1,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // The location the service is run. Corresponds to the `location` // resource label in the [`cloud_run_revision` monitored // resource](https://cloud.google.com/monitoring/api/resources#tag_cloud_run_revision). Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` } func (x *Service_CloudRun) Reset() { *x = Service_CloudRun{} mi := &file_google_monitoring_v3_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_CloudRun) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_CloudRun) ProtoMessage() {} func (x *Service_CloudRun) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_CloudRun.ProtoReflect.Descriptor instead. func (*Service_CloudRun) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 6} } func (x *Service_CloudRun) GetServiceName() string { if x != nil { return x.ServiceName } return "" } func (x *Service_CloudRun) GetLocation() string { if x != nil { return x.Location } return "" } // GKE Namespace. The field names correspond to the resource metadata labels // on monitored resources that fall under a namespace (for example, // `k8s_container` or `k8s_pod`). type Service_GkeNamespace struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Output only. The project this resource lives in. For legacy services // migrated from the `Custom` type, this may be a distinct project from the // one parenting the service itself. ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // The location of the parent cluster. This may be a zone or region. Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` // The name of the parent cluster. ClusterName string `protobuf:"bytes,3,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // The name of this namespace. NamespaceName string `protobuf:"bytes,4,opt,name=namespace_name,json=namespaceName,proto3" json:"namespace_name,omitempty"` } func (x *Service_GkeNamespace) Reset() { *x = Service_GkeNamespace{} mi := &file_google_monitoring_v3_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_GkeNamespace) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_GkeNamespace) ProtoMessage() {} func (x *Service_GkeNamespace) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_GkeNamespace.ProtoReflect.Descriptor instead. func (*Service_GkeNamespace) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 7} } func (x *Service_GkeNamespace) GetProjectId() string { if x != nil { return x.ProjectId } return "" } func (x *Service_GkeNamespace) GetLocation() string { if x != nil { return x.Location } return "" } func (x *Service_GkeNamespace) GetClusterName() string { if x != nil { return x.ClusterName } return "" } func (x *Service_GkeNamespace) GetNamespaceName() string { if x != nil { return x.NamespaceName } return "" } // A GKE Workload (Deployment, StatefulSet, etc). The field names correspond // to the metadata labels on monitored resources that fall under a workload // (for example, `k8s_container` or `k8s_pod`). type Service_GkeWorkload struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Output only. The project this resource lives in. For legacy services // migrated from the `Custom` type, this may be a distinct project from the // one parenting the service itself. ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // The location of the parent cluster. This may be a zone or region. Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` // The name of the parent cluster. ClusterName string `protobuf:"bytes,3,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // The name of the parent namespace. NamespaceName string `protobuf:"bytes,4,opt,name=namespace_name,json=namespaceName,proto3" json:"namespace_name,omitempty"` // The type of this workload (for example, "Deployment" or "DaemonSet") TopLevelControllerType string `protobuf:"bytes,5,opt,name=top_level_controller_type,json=topLevelControllerType,proto3" json:"top_level_controller_type,omitempty"` // The name of this workload. TopLevelControllerName string `protobuf:"bytes,6,opt,name=top_level_controller_name,json=topLevelControllerName,proto3" json:"top_level_controller_name,omitempty"` } func (x *Service_GkeWorkload) Reset() { *x = Service_GkeWorkload{} mi := &file_google_monitoring_v3_service_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_GkeWorkload) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_GkeWorkload) ProtoMessage() {} func (x *Service_GkeWorkload) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_GkeWorkload.ProtoReflect.Descriptor instead. func (*Service_GkeWorkload) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 8} } func (x *Service_GkeWorkload) GetProjectId() string { if x != nil { return x.ProjectId } return "" } func (x *Service_GkeWorkload) GetLocation() string { if x != nil { return x.Location } return "" } func (x *Service_GkeWorkload) GetClusterName() string { if x != nil { return x.ClusterName } return "" } func (x *Service_GkeWorkload) GetNamespaceName() string { if x != nil { return x.NamespaceName } return "" } func (x *Service_GkeWorkload) GetTopLevelControllerType() string { if x != nil { return x.TopLevelControllerType } return "" } func (x *Service_GkeWorkload) GetTopLevelControllerName() string { if x != nil { return x.TopLevelControllerName } return "" } // GKE Service. The "service" here represents a // [Kubernetes service // object](https://kubernetes.io/docs/concepts/services-networking/service). // The field names correspond to the resource labels on [`k8s_service` // monitored // resources](https://cloud.google.com/monitoring/api/resources#tag_k8s_service). type Service_GkeService struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Output only. The project this resource lives in. For legacy services // migrated from the `Custom` type, this may be a distinct project from the // one parenting the service itself. ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // The location of the parent cluster. This may be a zone or region. Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` // The name of the parent cluster. ClusterName string `protobuf:"bytes,3,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // The name of the parent namespace. NamespaceName string `protobuf:"bytes,4,opt,name=namespace_name,json=namespaceName,proto3" json:"namespace_name,omitempty"` // The name of this service. ServiceName string `protobuf:"bytes,5,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` } func (x *Service_GkeService) Reset() { *x = Service_GkeService{} mi := &file_google_monitoring_v3_service_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_GkeService) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_GkeService) ProtoMessage() {} func (x *Service_GkeService) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_GkeService.ProtoReflect.Descriptor instead. func (*Service_GkeService) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 9} } func (x *Service_GkeService) GetProjectId() string { if x != nil { return x.ProjectId } return "" } func (x *Service_GkeService) GetLocation() string { if x != nil { return x.Location } return "" } func (x *Service_GkeService) GetClusterName() string { if x != nil { return x.ClusterName } return "" } func (x *Service_GkeService) GetNamespaceName() string { if x != nil { return x.NamespaceName } return "" } func (x *Service_GkeService) GetServiceName() string { if x != nil { return x.ServiceName } return "" } // A well-known service type, defined by its service type and service labels. // Documentation and examples // [here](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/api-structures#basic-svc-w-basic-sli). type Service_BasicService struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The type of service that this basic service defines, e.g. // APP_ENGINE service type. // Documentation and valid values // [here](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/api-structures#basic-svc-w-basic-sli). ServiceType string `protobuf:"bytes,1,opt,name=service_type,json=serviceType,proto3" json:"service_type,omitempty"` // Labels that specify the resource that emits the monitoring data which // is used for SLO reporting of this `Service`. // Documentation and valid values for given service types // [here](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/api-structures#basic-svc-w-basic-sli). ServiceLabels map[string]string `protobuf:"bytes,2,rep,name=service_labels,json=serviceLabels,proto3" json:"service_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Service_BasicService) Reset() { *x = Service_BasicService{} mi := &file_google_monitoring_v3_service_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_BasicService) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_BasicService) ProtoMessage() {} func (x *Service_BasicService) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_BasicService.ProtoReflect.Descriptor instead. func (*Service_BasicService) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 10} } func (x *Service_BasicService) GetServiceType() string { if x != nil { return x.ServiceType } return "" } func (x *Service_BasicService) GetServiceLabels() map[string]string { if x != nil { return x.ServiceLabels } return nil } // Configuration for how to query telemetry on a Service. type Service_Telemetry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The full name of the resource that defines this service. Formatted as // described in https://cloud.google.com/apis/design/resource_names. ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` } func (x *Service_Telemetry) Reset() { *x = Service_Telemetry{} mi := &file_google_monitoring_v3_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Service_Telemetry) String() string { return protoimpl.X.MessageStringOf(x) } func (*Service_Telemetry) ProtoMessage() {} func (x *Service_Telemetry) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Service_Telemetry.ProtoReflect.Descriptor instead. func (*Service_Telemetry) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{0, 11} } func (x *Service_Telemetry) GetResourceName() string { if x != nil { return x.ResourceName } return "" } // Future parameters for the availability SLI. type BasicSli_AvailabilityCriteria struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *BasicSli_AvailabilityCriteria) Reset() { *x = BasicSli_AvailabilityCriteria{} mi := &file_google_monitoring_v3_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BasicSli_AvailabilityCriteria) String() string { return protoimpl.X.MessageStringOf(x) } func (*BasicSli_AvailabilityCriteria) ProtoMessage() {} func (x *BasicSli_AvailabilityCriteria) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BasicSli_AvailabilityCriteria.ProtoReflect.Descriptor instead. func (*BasicSli_AvailabilityCriteria) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{3, 0} } // Parameters for a latency threshold SLI. type BasicSli_LatencyCriteria struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Good service is defined to be the count of requests made to this service // that return in no more than `threshold`. Threshold *durationpb.Duration `protobuf:"bytes,3,opt,name=threshold,proto3" json:"threshold,omitempty"` } func (x *BasicSli_LatencyCriteria) Reset() { *x = BasicSli_LatencyCriteria{} mi := &file_google_monitoring_v3_service_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BasicSli_LatencyCriteria) String() string { return protoimpl.X.MessageStringOf(x) } func (*BasicSli_LatencyCriteria) ProtoMessage() {} func (x *BasicSli_LatencyCriteria) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BasicSli_LatencyCriteria.ProtoReflect.Descriptor instead. func (*BasicSli_LatencyCriteria) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{3, 1} } func (x *BasicSli_LatencyCriteria) GetThreshold() *durationpb.Duration { if x != nil { return x.Threshold } return nil } // A `PerformanceThreshold` is used when each window is good when that window // has a sufficiently high `performance`. type WindowsBasedSli_PerformanceThreshold struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The means, either a request-based SLI or a basic SLI, by which to compute // performance over a window. // // Types that are assignable to Type: // // *WindowsBasedSli_PerformanceThreshold_Performance // *WindowsBasedSli_PerformanceThreshold_BasicSliPerformance Type isWindowsBasedSli_PerformanceThreshold_Type `protobuf_oneof:"type"` // If window `performance >= threshold`, the window is counted as good. Threshold float64 `protobuf:"fixed64,2,opt,name=threshold,proto3" json:"threshold,omitempty"` } func (x *WindowsBasedSli_PerformanceThreshold) Reset() { *x = WindowsBasedSli_PerformanceThreshold{} mi := &file_google_monitoring_v3_service_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *WindowsBasedSli_PerformanceThreshold) String() string { return protoimpl.X.MessageStringOf(x) } func (*WindowsBasedSli_PerformanceThreshold) ProtoMessage() {} func (x *WindowsBasedSli_PerformanceThreshold) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use WindowsBasedSli_PerformanceThreshold.ProtoReflect.Descriptor instead. func (*WindowsBasedSli_PerformanceThreshold) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{8, 0} } func (m *WindowsBasedSli_PerformanceThreshold) GetType() isWindowsBasedSli_PerformanceThreshold_Type { if m != nil { return m.Type } return nil } func (x *WindowsBasedSli_PerformanceThreshold) GetPerformance() *RequestBasedSli { if x, ok := x.GetType().(*WindowsBasedSli_PerformanceThreshold_Performance); ok { return x.Performance } return nil } func (x *WindowsBasedSli_PerformanceThreshold) GetBasicSliPerformance() *BasicSli { if x, ok := x.GetType().(*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance); ok { return x.BasicSliPerformance } return nil } func (x *WindowsBasedSli_PerformanceThreshold) GetThreshold() float64 { if x != nil { return x.Threshold } return 0 } type isWindowsBasedSli_PerformanceThreshold_Type interface { isWindowsBasedSli_PerformanceThreshold_Type() } type WindowsBasedSli_PerformanceThreshold_Performance struct { // `RequestBasedSli` to evaluate to judge window quality. Performance *RequestBasedSli `protobuf:"bytes,1,opt,name=performance,proto3,oneof"` } type WindowsBasedSli_PerformanceThreshold_BasicSliPerformance struct { // `BasicSli` to evaluate to judge window quality. BasicSliPerformance *BasicSli `protobuf:"bytes,3,opt,name=basic_sli_performance,json=basicSliPerformance,proto3,oneof"` } func (*WindowsBasedSli_PerformanceThreshold_Performance) isWindowsBasedSli_PerformanceThreshold_Type() { } func (*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance) isWindowsBasedSli_PerformanceThreshold_Type() { } // A `MetricRange` is used when each window is good when the value x of a // single `TimeSeries` satisfies `range.min <= x <= range.max`. The provided // `TimeSeries` must have `ValueType = INT64` or `ValueType = DOUBLE` and // `MetricKind = GAUGE`. type WindowsBasedSli_MetricRange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) // specifying the `TimeSeries` to use for evaluating window quality. TimeSeries string `protobuf:"bytes,1,opt,name=time_series,json=timeSeries,proto3" json:"time_series,omitempty"` // Range of values considered "good." For a one-sided range, set one bound // to an infinite value. Range *Range `protobuf:"bytes,4,opt,name=range,proto3" json:"range,omitempty"` } func (x *WindowsBasedSli_MetricRange) Reset() { *x = WindowsBasedSli_MetricRange{} mi := &file_google_monitoring_v3_service_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *WindowsBasedSli_MetricRange) String() string { return protoimpl.X.MessageStringOf(x) } func (*WindowsBasedSli_MetricRange) ProtoMessage() {} func (x *WindowsBasedSli_MetricRange) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use WindowsBasedSli_MetricRange.ProtoReflect.Descriptor instead. func (*WindowsBasedSli_MetricRange) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_proto_rawDescGZIP(), []int{8, 1} } func (x *WindowsBasedSli_MetricRange) GetTimeSeries() string { if x != nil { return x.TimeSeries } return "" } func (x *WindowsBasedSli_MetricRange) GetRange() *Range { if x != nil { return x.Range } return nil } var File_google_monitoring_v3_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_service_proto_rawDesc = []byte{ 0x0a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa4, 0x16, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x00, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x48, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x70, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x57, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x73, 0x74, 0x69, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x12, 0x48, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x69, 0x73, 0x74, 0x69, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x68, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x12, 0x6d, 0x0a, 0x17, 0x69, 0x73, 0x74, 0x69, 0x6f, 0x5f, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x15, 0x69, 0x73, 0x74, 0x69, 0x6f, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e, 0x12, 0x51, 0x0a, 0x0d, 0x67, 0x6b, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x6b, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x67, 0x6b, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0c, 0x67, 0x6b, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x6b, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x6b, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x4b, 0x0a, 0x0b, 0x67, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x67, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x4e, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x1a, 0x28, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x1a, 0x2a, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x9d, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x76, 0x0a, 0x09, 0x4d, 0x65, 0x73, 0x68, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x68, 0x55, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x73, 0x74, 0x69, 0x6f, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x68, 0x55, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x49, 0x0a, 0x08, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x98, 0x01, 0x0a, 0x0c, 0x47, 0x6b, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x8d, 0x02, 0x0a, 0x0b, 0x47, 0x6b, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x74, 0x6f, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x74, 0x6f, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0xb9, 0x01, 0x0a, 0x0a, 0x47, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0xd9, 0x01, 0x0a, 0x0c, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x64, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x30, 0x0a, 0x09, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0xa7, 0x01, 0xea, 0x41, 0xa3, 0x01, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x25, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x12, 0x23, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x12, 0x01, 0x2a, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x82, 0x07, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x63, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x67, 0x6f, 0x61, 0x6c, 0x12, 0x42, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x46, 0x0a, 0x0f, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x5c, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x34, 0x0a, 0x04, 0x56, 0x69, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x10, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, 0x01, 0x3a, 0xca, 0x02, 0xea, 0x41, 0xc6, 0x02, 0x0a, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x56, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7d, 0x12, 0x60, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7d, 0x12, 0x54, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x7d, 0x12, 0x01, 0x2a, 0x20, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xfa, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x3d, 0x0a, 0x09, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x08, 0x62, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x12, 0x4c, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x07, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x48, 0x00, 0x52, 0x07, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x1a, 0x16, 0x0a, 0x14, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x1a, 0x4a, 0x0a, 0x0f, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x37, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x73, 0x6c, 0x69, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x22, 0x2b, 0x0a, 0x05, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x22, 0xc2, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x12, 0x51, 0x0a, 0x10, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x48, 0x00, 0x52, 0x0e, 0x67, 0x6f, 0x6f, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x52, 0x0a, 0x10, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2e, 0x0a, 0x13, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x67, 0x6f, 0x6f, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x62, 0x61, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x75, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xa4, 0x06, 0x0a, 0x0f, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x12, 0x35, 0x0a, 0x16, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x62, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, 0x67, 0x6f, 0x6f, 0x64, 0x42, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x79, 0x0a, 0x1a, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x2e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x17, 0x67, 0x6f, 0x6f, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x64, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x61, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4d, 0x65, 0x61, 0x6e, 0x49, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x62, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x75, 0x6d, 0x49, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x1a, 0xdd, 0x01, 0x0a, 0x14, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x49, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x15, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x48, 0x00, 0x52, 0x13, 0x62, 0x61, 0x73, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x61, 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x42, 0xd1, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_service_proto_rawDescOnce sync.Once file_google_monitoring_v3_service_proto_rawDescData = file_google_monitoring_v3_service_proto_rawDesc ) func file_google_monitoring_v3_service_proto_rawDescGZIP() []byte { file_google_monitoring_v3_service_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_service_proto_rawDescData) }) return file_google_monitoring_v3_service_proto_rawDescData } var file_google_monitoring_v3_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_google_monitoring_v3_service_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_google_monitoring_v3_service_proto_goTypes = []any{ (ServiceLevelObjective_View)(0), // 0: google.monitoring.v3.ServiceLevelObjective.View (*Service)(nil), // 1: google.monitoring.v3.Service (*ServiceLevelObjective)(nil), // 2: google.monitoring.v3.ServiceLevelObjective (*ServiceLevelIndicator)(nil), // 3: google.monitoring.v3.ServiceLevelIndicator (*BasicSli)(nil), // 4: google.monitoring.v3.BasicSli (*Range)(nil), // 5: google.monitoring.v3.Range (*RequestBasedSli)(nil), // 6: google.monitoring.v3.RequestBasedSli (*TimeSeriesRatio)(nil), // 7: google.monitoring.v3.TimeSeriesRatio (*DistributionCut)(nil), // 8: google.monitoring.v3.DistributionCut (*WindowsBasedSli)(nil), // 9: google.monitoring.v3.WindowsBasedSli (*Service_Custom)(nil), // 10: google.monitoring.v3.Service.Custom (*Service_AppEngine)(nil), // 11: google.monitoring.v3.Service.AppEngine (*Service_CloudEndpoints)(nil), // 12: google.monitoring.v3.Service.CloudEndpoints (*Service_ClusterIstio)(nil), // 13: google.monitoring.v3.Service.ClusterIstio (*Service_MeshIstio)(nil), // 14: google.monitoring.v3.Service.MeshIstio (*Service_IstioCanonicalService)(nil), // 15: google.monitoring.v3.Service.IstioCanonicalService (*Service_CloudRun)(nil), // 16: google.monitoring.v3.Service.CloudRun (*Service_GkeNamespace)(nil), // 17: google.monitoring.v3.Service.GkeNamespace (*Service_GkeWorkload)(nil), // 18: google.monitoring.v3.Service.GkeWorkload (*Service_GkeService)(nil), // 19: google.monitoring.v3.Service.GkeService (*Service_BasicService)(nil), // 20: google.monitoring.v3.Service.BasicService (*Service_Telemetry)(nil), // 21: google.monitoring.v3.Service.Telemetry nil, // 22: google.monitoring.v3.Service.UserLabelsEntry nil, // 23: google.monitoring.v3.Service.BasicService.ServiceLabelsEntry nil, // 24: google.monitoring.v3.ServiceLevelObjective.UserLabelsEntry (*BasicSli_AvailabilityCriteria)(nil), // 25: google.monitoring.v3.BasicSli.AvailabilityCriteria (*BasicSli_LatencyCriteria)(nil), // 26: google.monitoring.v3.BasicSli.LatencyCriteria (*WindowsBasedSli_PerformanceThreshold)(nil), // 27: google.monitoring.v3.WindowsBasedSli.PerformanceThreshold (*WindowsBasedSli_MetricRange)(nil), // 28: google.monitoring.v3.WindowsBasedSli.MetricRange (*durationpb.Duration)(nil), // 29: google.protobuf.Duration (calendarperiod.CalendarPeriod)(0), // 30: google.type.CalendarPeriod } var file_google_monitoring_v3_service_proto_depIdxs = []int32{ 10, // 0: google.monitoring.v3.Service.custom:type_name -> google.monitoring.v3.Service.Custom 11, // 1: google.monitoring.v3.Service.app_engine:type_name -> google.monitoring.v3.Service.AppEngine 12, // 2: google.monitoring.v3.Service.cloud_endpoints:type_name -> google.monitoring.v3.Service.CloudEndpoints 13, // 3: google.monitoring.v3.Service.cluster_istio:type_name -> google.monitoring.v3.Service.ClusterIstio 14, // 4: google.monitoring.v3.Service.mesh_istio:type_name -> google.monitoring.v3.Service.MeshIstio 15, // 5: google.monitoring.v3.Service.istio_canonical_service:type_name -> google.monitoring.v3.Service.IstioCanonicalService 16, // 6: google.monitoring.v3.Service.cloud_run:type_name -> google.monitoring.v3.Service.CloudRun 17, // 7: google.monitoring.v3.Service.gke_namespace:type_name -> google.monitoring.v3.Service.GkeNamespace 18, // 8: google.monitoring.v3.Service.gke_workload:type_name -> google.monitoring.v3.Service.GkeWorkload 19, // 9: google.monitoring.v3.Service.gke_service:type_name -> google.monitoring.v3.Service.GkeService 20, // 10: google.monitoring.v3.Service.basic_service:type_name -> google.monitoring.v3.Service.BasicService 21, // 11: google.monitoring.v3.Service.telemetry:type_name -> google.monitoring.v3.Service.Telemetry 22, // 12: google.monitoring.v3.Service.user_labels:type_name -> google.monitoring.v3.Service.UserLabelsEntry 3, // 13: google.monitoring.v3.ServiceLevelObjective.service_level_indicator:type_name -> google.monitoring.v3.ServiceLevelIndicator 29, // 14: google.monitoring.v3.ServiceLevelObjective.rolling_period:type_name -> google.protobuf.Duration 30, // 15: google.monitoring.v3.ServiceLevelObjective.calendar_period:type_name -> google.type.CalendarPeriod 24, // 16: google.monitoring.v3.ServiceLevelObjective.user_labels:type_name -> google.monitoring.v3.ServiceLevelObjective.UserLabelsEntry 4, // 17: google.monitoring.v3.ServiceLevelIndicator.basic_sli:type_name -> google.monitoring.v3.BasicSli 6, // 18: google.monitoring.v3.ServiceLevelIndicator.request_based:type_name -> google.monitoring.v3.RequestBasedSli 9, // 19: google.monitoring.v3.ServiceLevelIndicator.windows_based:type_name -> google.monitoring.v3.WindowsBasedSli 25, // 20: google.monitoring.v3.BasicSli.availability:type_name -> google.monitoring.v3.BasicSli.AvailabilityCriteria 26, // 21: google.monitoring.v3.BasicSli.latency:type_name -> google.monitoring.v3.BasicSli.LatencyCriteria 7, // 22: google.monitoring.v3.RequestBasedSli.good_total_ratio:type_name -> google.monitoring.v3.TimeSeriesRatio 8, // 23: google.monitoring.v3.RequestBasedSli.distribution_cut:type_name -> google.monitoring.v3.DistributionCut 5, // 24: google.monitoring.v3.DistributionCut.range:type_name -> google.monitoring.v3.Range 27, // 25: google.monitoring.v3.WindowsBasedSli.good_total_ratio_threshold:type_name -> google.monitoring.v3.WindowsBasedSli.PerformanceThreshold 28, // 26: google.monitoring.v3.WindowsBasedSli.metric_mean_in_range:type_name -> google.monitoring.v3.WindowsBasedSli.MetricRange 28, // 27: google.monitoring.v3.WindowsBasedSli.metric_sum_in_range:type_name -> google.monitoring.v3.WindowsBasedSli.MetricRange 29, // 28: google.monitoring.v3.WindowsBasedSli.window_period:type_name -> google.protobuf.Duration 23, // 29: google.monitoring.v3.Service.BasicService.service_labels:type_name -> google.monitoring.v3.Service.BasicService.ServiceLabelsEntry 29, // 30: google.monitoring.v3.BasicSli.LatencyCriteria.threshold:type_name -> google.protobuf.Duration 6, // 31: google.monitoring.v3.WindowsBasedSli.PerformanceThreshold.performance:type_name -> google.monitoring.v3.RequestBasedSli 4, // 32: google.monitoring.v3.WindowsBasedSli.PerformanceThreshold.basic_sli_performance:type_name -> google.monitoring.v3.BasicSli 5, // 33: google.monitoring.v3.WindowsBasedSli.MetricRange.range:type_name -> google.monitoring.v3.Range 34, // [34:34] is the sub-list for method output_type 34, // [34:34] is the sub-list for method input_type 34, // [34:34] is the sub-list for extension type_name 34, // [34:34] is the sub-list for extension extendee 0, // [0:34] is the sub-list for field type_name } func init() { file_google_monitoring_v3_service_proto_init() } func file_google_monitoring_v3_service_proto_init() { if File_google_monitoring_v3_service_proto != nil { return } file_google_monitoring_v3_service_proto_msgTypes[0].OneofWrappers = []any{ (*Service_Custom_)(nil), (*Service_AppEngine_)(nil), (*Service_CloudEndpoints_)(nil), (*Service_ClusterIstio_)(nil), (*Service_MeshIstio_)(nil), (*Service_IstioCanonicalService_)(nil), (*Service_CloudRun_)(nil), (*Service_GkeNamespace_)(nil), (*Service_GkeWorkload_)(nil), (*Service_GkeService_)(nil), } file_google_monitoring_v3_service_proto_msgTypes[1].OneofWrappers = []any{ (*ServiceLevelObjective_RollingPeriod)(nil), (*ServiceLevelObjective_CalendarPeriod)(nil), } file_google_monitoring_v3_service_proto_msgTypes[2].OneofWrappers = []any{ (*ServiceLevelIndicator_BasicSli)(nil), (*ServiceLevelIndicator_RequestBased)(nil), (*ServiceLevelIndicator_WindowsBased)(nil), } file_google_monitoring_v3_service_proto_msgTypes[3].OneofWrappers = []any{ (*BasicSli_Availability)(nil), (*BasicSli_Latency)(nil), } file_google_monitoring_v3_service_proto_msgTypes[5].OneofWrappers = []any{ (*RequestBasedSli_GoodTotalRatio)(nil), (*RequestBasedSli_DistributionCut)(nil), } file_google_monitoring_v3_service_proto_msgTypes[8].OneofWrappers = []any{ (*WindowsBasedSli_GoodBadMetricFilter)(nil), (*WindowsBasedSli_GoodTotalRatioThreshold)(nil), (*WindowsBasedSli_MetricMeanInRange)(nil), (*WindowsBasedSli_MetricSumInRange)(nil), } file_google_monitoring_v3_service_proto_msgTypes[26].OneofWrappers = []any{ (*WindowsBasedSli_PerformanceThreshold_Performance)(nil), (*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_service_proto_rawDesc, NumEnums: 1, NumMessages: 28, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_service_proto_depIdxs, EnumInfos: file_google_monitoring_v3_service_proto_enumTypes, MessageInfos: file_google_monitoring_v3_service_proto_msgTypes, }.Build() File_google_monitoring_v3_service_proto = out.File file_google_monitoring_v3_service_proto_rawDesc = nil file_google_monitoring_v3_service_proto_goTypes = nil file_google_monitoring_v3_service_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/service_service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/service_service.proto package monitoringpb import ( context "context" reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The `CreateService` request. type CreateServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Resource // [name](https://cloud.google.com/monitoring/api/v3#project_name) of the // parent Metrics Scope. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // Optional. The Service id to use for this Service. If omitted, an id will be // generated instead. Must match the pattern `[a-z0-9\-]+` ServiceId string `protobuf:"bytes,3,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` // Required. The `Service` to create. Service *Service `protobuf:"bytes,2,opt,name=service,proto3" json:"service,omitempty"` } func (x *CreateServiceRequest) Reset() { *x = CreateServiceRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateServiceRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateServiceRequest) ProtoMessage() {} func (x *CreateServiceRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateServiceRequest.ProtoReflect.Descriptor instead. func (*CreateServiceRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{0} } func (x *CreateServiceRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *CreateServiceRequest) GetServiceId() string { if x != nil { return x.ServiceId } return "" } func (x *CreateServiceRequest) GetService() *Service { if x != nil { return x.Service } return nil } // The `GetService` request. type GetServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Resource name of the `Service`. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetServiceRequest) Reset() { *x = GetServiceRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetServiceRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetServiceRequest) ProtoMessage() {} func (x *GetServiceRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetServiceRequest.ProtoReflect.Descriptor instead. func (*GetServiceRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{1} } func (x *GetServiceRequest) GetName() string { if x != nil { return x.Name } return "" } // The `ListServices` request. type ListServicesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Resource name of the parent containing the listed services, // either a [project](https://cloud.google.com/monitoring/api/v3#project_name) // or a Monitoring Metrics Scope. The formats are: // // projects/[PROJECT_ID_OR_NUMBER] // workspaces/[HOST_PROJECT_ID_OR_NUMBER] Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // A filter specifying what `Service`s to return. The filter supports // filtering on a particular service-identifier type or one of its attributes. // // To filter on a particular service-identifier type, the `identifier_case` // refers to which option in the `identifier` field is populated. For example, // the filter `identifier_case = "CUSTOM"` would match all services with a // value for the `custom` field. Valid options include "CUSTOM", "APP_ENGINE", // "MESH_ISTIO", and the other options listed at // https://cloud.google.com/monitoring/api/ref_v3/rest/v3/services#Service // // To filter on an attribute of a service-identifier type, apply the filter // name by using the snake case of the service-identifier type and the // attribute of that service-identifier type, and join the two with a period. // For example, to filter by the `meshUid` field of the `MeshIstio` // service-identifier type, you must filter on `mesh_istio.mesh_uid = // "123"` to match all services with mesh UID "123". Service-identifier types // and their attributes are described at // https://cloud.google.com/monitoring/api/ref_v3/rest/v3/services#Service Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` // A non-negative number that is the maximum number of results to return. // When 0, use default page size. PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `nextPageToken` value // returned by a previous call to this method. Using this field causes the // method to return additional results from the previous method call. PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListServicesRequest) Reset() { *x = ListServicesRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListServicesRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListServicesRequest) ProtoMessage() {} func (x *ListServicesRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListServicesRequest.ProtoReflect.Descriptor instead. func (*ListServicesRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{2} } func (x *ListServicesRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *ListServicesRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListServicesRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListServicesRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The `ListServices` response. type ListServicesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The `Service`s matching the specified filter. Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` // If there are more results than have been returned, then this field is set // to a non-empty value. To see the additional results, // use that value as `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListServicesResponse) Reset() { *x = ListServicesResponse{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListServicesResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListServicesResponse) ProtoMessage() {} func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListServicesResponse.ProtoReflect.Descriptor instead. func (*ListServicesResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{3} } func (x *ListServicesResponse) GetServices() []*Service { if x != nil { return x.Services } return nil } func (x *ListServicesResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // The `UpdateService` request. type UpdateServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The `Service` to draw updates from. // The given `name` specifies the resource to update. Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` // A set of field paths defining which fields to use for the update. UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` } func (x *UpdateServiceRequest) Reset() { *x = UpdateServiceRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateServiceRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateServiceRequest) ProtoMessage() {} func (x *UpdateServiceRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateServiceRequest.ProtoReflect.Descriptor instead. func (*UpdateServiceRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{4} } func (x *UpdateServiceRequest) GetService() *Service { if x != nil { return x.Service } return nil } func (x *UpdateServiceRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } // The `DeleteService` request. type DeleteServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Resource name of the `Service` to delete. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *DeleteServiceRequest) Reset() { *x = DeleteServiceRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteServiceRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteServiceRequest) ProtoMessage() {} func (x *DeleteServiceRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteServiceRequest.ProtoReflect.Descriptor instead. func (*DeleteServiceRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{5} } func (x *DeleteServiceRequest) GetName() string { if x != nil { return x.Name } return "" } // The `CreateServiceLevelObjective` request. type CreateServiceLevelObjectiveRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Resource name of the parent `Service`. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID] Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // Optional. The ServiceLevelObjective id to use for this // ServiceLevelObjective. If omitted, an id will be generated instead. Must // match the pattern `^[a-zA-Z0-9-_:.]+$` ServiceLevelObjectiveId string `protobuf:"bytes,3,opt,name=service_level_objective_id,json=serviceLevelObjectiveId,proto3" json:"service_level_objective_id,omitempty"` // Required. The `ServiceLevelObjective` to create. // The provided `name` will be respected if no `ServiceLevelObjective` exists // with this name. ServiceLevelObjective *ServiceLevelObjective `protobuf:"bytes,2,opt,name=service_level_objective,json=serviceLevelObjective,proto3" json:"service_level_objective,omitempty"` } func (x *CreateServiceLevelObjectiveRequest) Reset() { *x = CreateServiceLevelObjectiveRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateServiceLevelObjectiveRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateServiceLevelObjectiveRequest) ProtoMessage() {} func (x *CreateServiceLevelObjectiveRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateServiceLevelObjectiveRequest.ProtoReflect.Descriptor instead. func (*CreateServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{6} } func (x *CreateServiceLevelObjectiveRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *CreateServiceLevelObjectiveRequest) GetServiceLevelObjectiveId() string { if x != nil { return x.ServiceLevelObjectiveId } return "" } func (x *CreateServiceLevelObjectiveRequest) GetServiceLevelObjective() *ServiceLevelObjective { if x != nil { return x.ServiceLevelObjective } return nil } // The `GetServiceLevelObjective` request. type GetServiceLevelObjectiveRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Resource name of the `ServiceLevelObjective` to get. The format // is: // // projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_NAME] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // View of the `ServiceLevelObjective` to return. If `DEFAULT`, return the // `ServiceLevelObjective` as originally defined. If `EXPLICIT` and the // `ServiceLevelObjective` is defined in terms of a `BasicSli`, replace the // `BasicSli` with a `RequestBasedSli` spelling out how the SLI is computed. View ServiceLevelObjective_View `protobuf:"varint,2,opt,name=view,proto3,enum=google.monitoring.v3.ServiceLevelObjective_View" json:"view,omitempty"` } func (x *GetServiceLevelObjectiveRequest) Reset() { *x = GetServiceLevelObjectiveRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetServiceLevelObjectiveRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetServiceLevelObjectiveRequest) ProtoMessage() {} func (x *GetServiceLevelObjectiveRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetServiceLevelObjectiveRequest.ProtoReflect.Descriptor instead. func (*GetServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{7} } func (x *GetServiceLevelObjectiveRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *GetServiceLevelObjectiveRequest) GetView() ServiceLevelObjective_View { if x != nil { return x.View } return ServiceLevelObjective_VIEW_UNSPECIFIED } // The `ListServiceLevelObjectives` request. type ListServiceLevelObjectivesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Resource name of the parent containing the listed SLOs, either a // project or a Monitoring Metrics Scope. The formats are: // // projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID] // workspaces/[HOST_PROJECT_ID_OR_NUMBER]/services/- Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // A filter specifying what `ServiceLevelObjective`s to return. Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` // A non-negative number that is the maximum number of results to return. // When 0, use default page size. PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `nextPageToken` value // returned by a previous call to this method. Using this field causes the // method to return additional results from the previous method call. PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // View of the `ServiceLevelObjective`s to return. If `DEFAULT`, return each // `ServiceLevelObjective` as originally defined. If `EXPLICIT` and the // `ServiceLevelObjective` is defined in terms of a `BasicSli`, replace the // `BasicSli` with a `RequestBasedSli` spelling out how the SLI is computed. View ServiceLevelObjective_View `protobuf:"varint,5,opt,name=view,proto3,enum=google.monitoring.v3.ServiceLevelObjective_View" json:"view,omitempty"` } func (x *ListServiceLevelObjectivesRequest) Reset() { *x = ListServiceLevelObjectivesRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListServiceLevelObjectivesRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListServiceLevelObjectivesRequest) ProtoMessage() {} func (x *ListServiceLevelObjectivesRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListServiceLevelObjectivesRequest.ProtoReflect.Descriptor instead. func (*ListServiceLevelObjectivesRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{8} } func (x *ListServiceLevelObjectivesRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *ListServiceLevelObjectivesRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListServiceLevelObjectivesRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListServiceLevelObjectivesRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } func (x *ListServiceLevelObjectivesRequest) GetView() ServiceLevelObjective_View { if x != nil { return x.View } return ServiceLevelObjective_VIEW_UNSPECIFIED } // The `ListServiceLevelObjectives` response. type ListServiceLevelObjectivesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The `ServiceLevelObjective`s matching the specified filter. ServiceLevelObjectives []*ServiceLevelObjective `protobuf:"bytes,1,rep,name=service_level_objectives,json=serviceLevelObjectives,proto3" json:"service_level_objectives,omitempty"` // If there are more results than have been returned, then this field is set // to a non-empty value. To see the additional results, // use that value as `page_token` in the next call to this method. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListServiceLevelObjectivesResponse) Reset() { *x = ListServiceLevelObjectivesResponse{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListServiceLevelObjectivesResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListServiceLevelObjectivesResponse) ProtoMessage() {} func (x *ListServiceLevelObjectivesResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListServiceLevelObjectivesResponse.ProtoReflect.Descriptor instead. func (*ListServiceLevelObjectivesResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{9} } func (x *ListServiceLevelObjectivesResponse) GetServiceLevelObjectives() []*ServiceLevelObjective { if x != nil { return x.ServiceLevelObjectives } return nil } func (x *ListServiceLevelObjectivesResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // The `UpdateServiceLevelObjective` request. type UpdateServiceLevelObjectiveRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The `ServiceLevelObjective` to draw updates from. // The given `name` specifies the resource to update. ServiceLevelObjective *ServiceLevelObjective `protobuf:"bytes,1,opt,name=service_level_objective,json=serviceLevelObjective,proto3" json:"service_level_objective,omitempty"` // A set of field paths defining which fields to use for the update. UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` } func (x *UpdateServiceLevelObjectiveRequest) Reset() { *x = UpdateServiceLevelObjectiveRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateServiceLevelObjectiveRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateServiceLevelObjectiveRequest) ProtoMessage() {} func (x *UpdateServiceLevelObjectiveRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateServiceLevelObjectiveRequest.ProtoReflect.Descriptor instead. func (*UpdateServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{10} } func (x *UpdateServiceLevelObjectiveRequest) GetServiceLevelObjective() *ServiceLevelObjective { if x != nil { return x.ServiceLevelObjective } return nil } func (x *UpdateServiceLevelObjectiveRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } // The `DeleteServiceLevelObjective` request. type DeleteServiceLevelObjectiveRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Resource name of the `ServiceLevelObjective` to delete. The // format is: // // projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_NAME] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *DeleteServiceLevelObjectiveRequest) Reset() { *x = DeleteServiceLevelObjectiveRequest{} mi := &file_google_monitoring_v3_service_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteServiceLevelObjectiveRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteServiceLevelObjectiveRequest) ProtoMessage() {} func (x *DeleteServiceLevelObjectiveRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_service_service_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteServiceLevelObjectiveRequest.ProtoReflect.Descriptor instead. func (*DeleteServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_service_service_proto_rawDescGZIP(), []int{11} } func (x *DeleteServiceLevelObjectiveRequest) GetName() string { if x != nil { return x.Name } return "" } var File_google_monitoring_v3_service_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_service_service_proto_rawDesc = []byte{ 0x0a, 0x2a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x12, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x52, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xac, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x12, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x79, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x91, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x55, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8e, 0x02, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x49, 0x64, 0x12, 0x68, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x37, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x31, 0x0a, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x22, 0x80, 0x02, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x44, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x22, 0xb3, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x16, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xcb, 0x01, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x71, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x37, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x31, 0x0a, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0xea, 0x0f, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x3b, 0xda, 0x41, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x19, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x2a, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x28, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x91, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x2a, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x3c, 0xda, 0x41, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x32, 0x21, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x7d, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x28, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x2a, 0x19, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xfa, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x74, 0xda, 0x41, 0x1e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x3a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x12, 0xc1, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x41, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xd4, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x12, 0x8c, 0x02, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x85, 0x01, 0xda, 0x41, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x65, 0x3a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x32, 0x4a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xb2, 0x01, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x2a, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xd8, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x1d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_service_service_proto_rawDescOnce sync.Once file_google_monitoring_v3_service_service_proto_rawDescData = file_google_monitoring_v3_service_service_proto_rawDesc ) func file_google_monitoring_v3_service_service_proto_rawDescGZIP() []byte { file_google_monitoring_v3_service_service_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_service_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_service_service_proto_rawDescData) }) return file_google_monitoring_v3_service_service_proto_rawDescData } var file_google_monitoring_v3_service_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_google_monitoring_v3_service_service_proto_goTypes = []any{ (*CreateServiceRequest)(nil), // 0: google.monitoring.v3.CreateServiceRequest (*GetServiceRequest)(nil), // 1: google.monitoring.v3.GetServiceRequest (*ListServicesRequest)(nil), // 2: google.monitoring.v3.ListServicesRequest (*ListServicesResponse)(nil), // 3: google.monitoring.v3.ListServicesResponse (*UpdateServiceRequest)(nil), // 4: google.monitoring.v3.UpdateServiceRequest (*DeleteServiceRequest)(nil), // 5: google.monitoring.v3.DeleteServiceRequest (*CreateServiceLevelObjectiveRequest)(nil), // 6: google.monitoring.v3.CreateServiceLevelObjectiveRequest (*GetServiceLevelObjectiveRequest)(nil), // 7: google.monitoring.v3.GetServiceLevelObjectiveRequest (*ListServiceLevelObjectivesRequest)(nil), // 8: google.monitoring.v3.ListServiceLevelObjectivesRequest (*ListServiceLevelObjectivesResponse)(nil), // 9: google.monitoring.v3.ListServiceLevelObjectivesResponse (*UpdateServiceLevelObjectiveRequest)(nil), // 10: google.monitoring.v3.UpdateServiceLevelObjectiveRequest (*DeleteServiceLevelObjectiveRequest)(nil), // 11: google.monitoring.v3.DeleteServiceLevelObjectiveRequest (*Service)(nil), // 12: google.monitoring.v3.Service (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask (*ServiceLevelObjective)(nil), // 14: google.monitoring.v3.ServiceLevelObjective (ServiceLevelObjective_View)(0), // 15: google.monitoring.v3.ServiceLevelObjective.View (*emptypb.Empty)(nil), // 16: google.protobuf.Empty } var file_google_monitoring_v3_service_service_proto_depIdxs = []int32{ 12, // 0: google.monitoring.v3.CreateServiceRequest.service:type_name -> google.monitoring.v3.Service 12, // 1: google.monitoring.v3.ListServicesResponse.services:type_name -> google.monitoring.v3.Service 12, // 2: google.monitoring.v3.UpdateServiceRequest.service:type_name -> google.monitoring.v3.Service 13, // 3: google.monitoring.v3.UpdateServiceRequest.update_mask:type_name -> google.protobuf.FieldMask 14, // 4: google.monitoring.v3.CreateServiceLevelObjectiveRequest.service_level_objective:type_name -> google.monitoring.v3.ServiceLevelObjective 15, // 5: google.monitoring.v3.GetServiceLevelObjectiveRequest.view:type_name -> google.monitoring.v3.ServiceLevelObjective.View 15, // 6: google.monitoring.v3.ListServiceLevelObjectivesRequest.view:type_name -> google.monitoring.v3.ServiceLevelObjective.View 14, // 7: google.monitoring.v3.ListServiceLevelObjectivesResponse.service_level_objectives:type_name -> google.monitoring.v3.ServiceLevelObjective 14, // 8: google.monitoring.v3.UpdateServiceLevelObjectiveRequest.service_level_objective:type_name -> google.monitoring.v3.ServiceLevelObjective 13, // 9: google.monitoring.v3.UpdateServiceLevelObjectiveRequest.update_mask:type_name -> google.protobuf.FieldMask 0, // 10: google.monitoring.v3.ServiceMonitoringService.CreateService:input_type -> google.monitoring.v3.CreateServiceRequest 1, // 11: google.monitoring.v3.ServiceMonitoringService.GetService:input_type -> google.monitoring.v3.GetServiceRequest 2, // 12: google.monitoring.v3.ServiceMonitoringService.ListServices:input_type -> google.monitoring.v3.ListServicesRequest 4, // 13: google.monitoring.v3.ServiceMonitoringService.UpdateService:input_type -> google.monitoring.v3.UpdateServiceRequest 5, // 14: google.monitoring.v3.ServiceMonitoringService.DeleteService:input_type -> google.monitoring.v3.DeleteServiceRequest 6, // 15: google.monitoring.v3.ServiceMonitoringService.CreateServiceLevelObjective:input_type -> google.monitoring.v3.CreateServiceLevelObjectiveRequest 7, // 16: google.monitoring.v3.ServiceMonitoringService.GetServiceLevelObjective:input_type -> google.monitoring.v3.GetServiceLevelObjectiveRequest 8, // 17: google.monitoring.v3.ServiceMonitoringService.ListServiceLevelObjectives:input_type -> google.monitoring.v3.ListServiceLevelObjectivesRequest 10, // 18: google.monitoring.v3.ServiceMonitoringService.UpdateServiceLevelObjective:input_type -> google.monitoring.v3.UpdateServiceLevelObjectiveRequest 11, // 19: google.monitoring.v3.ServiceMonitoringService.DeleteServiceLevelObjective:input_type -> google.monitoring.v3.DeleteServiceLevelObjectiveRequest 12, // 20: google.monitoring.v3.ServiceMonitoringService.CreateService:output_type -> google.monitoring.v3.Service 12, // 21: google.monitoring.v3.ServiceMonitoringService.GetService:output_type -> google.monitoring.v3.Service 3, // 22: google.monitoring.v3.ServiceMonitoringService.ListServices:output_type -> google.monitoring.v3.ListServicesResponse 12, // 23: google.monitoring.v3.ServiceMonitoringService.UpdateService:output_type -> google.monitoring.v3.Service 16, // 24: google.monitoring.v3.ServiceMonitoringService.DeleteService:output_type -> google.protobuf.Empty 14, // 25: google.monitoring.v3.ServiceMonitoringService.CreateServiceLevelObjective:output_type -> google.monitoring.v3.ServiceLevelObjective 14, // 26: google.monitoring.v3.ServiceMonitoringService.GetServiceLevelObjective:output_type -> google.monitoring.v3.ServiceLevelObjective 9, // 27: google.monitoring.v3.ServiceMonitoringService.ListServiceLevelObjectives:output_type -> google.monitoring.v3.ListServiceLevelObjectivesResponse 14, // 28: google.monitoring.v3.ServiceMonitoringService.UpdateServiceLevelObjective:output_type -> google.monitoring.v3.ServiceLevelObjective 16, // 29: google.monitoring.v3.ServiceMonitoringService.DeleteServiceLevelObjective:output_type -> google.protobuf.Empty 20, // [20:30] is the sub-list for method output_type 10, // [10:20] is the sub-list for method input_type 10, // [10:10] is the sub-list for extension type_name 10, // [10:10] is the sub-list for extension extendee 0, // [0:10] is the sub-list for field type_name } func init() { file_google_monitoring_v3_service_service_proto_init() } func file_google_monitoring_v3_service_service_proto_init() { if File_google_monitoring_v3_service_service_proto != nil { return } file_google_monitoring_v3_service_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_service_service_proto_rawDesc, NumEnums: 0, NumMessages: 12, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_monitoring_v3_service_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_service_service_proto_depIdxs, MessageInfos: file_google_monitoring_v3_service_service_proto_msgTypes, }.Build() File_google_monitoring_v3_service_service_proto = out.File file_google_monitoring_v3_service_service_proto_rawDesc = nil file_google_monitoring_v3_service_service_proto_goTypes = nil file_google_monitoring_v3_service_service_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // ServiceMonitoringServiceClient is the client API for ServiceMonitoringService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type ServiceMonitoringServiceClient interface { // Create a `Service`. CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) // Get the named `Service`. GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) // List `Service`s for this Metrics Scope. ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) // Update this `Service`. UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) // Soft delete this `Service`. DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Create a `ServiceLevelObjective` for the given `Service`. CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) // Get a `ServiceLevelObjective` by name. GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) // List the `ServiceLevelObjective`s for the given `Service`. ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) // Update the given `ServiceLevelObjective`. UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) // Delete the given `ServiceLevelObjective`. DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) } type serviceMonitoringServiceClient struct { cc grpc.ClientConnInterface } func NewServiceMonitoringServiceClient(cc grpc.ClientConnInterface) ServiceMonitoringServiceClient { return &serviceMonitoringServiceClient{cc} } func (c *serviceMonitoringServiceClient) CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) { out := new(Service) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/CreateService", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) { out := new(Service) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/GetService", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) { out := new(ListServicesResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/ListServices", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) { out := new(Service) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/UpdateService", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/DeleteService", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { out := new(ServiceLevelObjective) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { out := new(ServiceLevelObjective) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) { out := new(ListServiceLevelObjectivesResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { out := new(ServiceLevelObjective) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *serviceMonitoringServiceClient) DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective", in, out, opts...) if err != nil { return nil, err } return out, nil } // ServiceMonitoringServiceServer is the server API for ServiceMonitoringService service. type ServiceMonitoringServiceServer interface { // Create a `Service`. CreateService(context.Context, *CreateServiceRequest) (*Service, error) // Get the named `Service`. GetService(context.Context, *GetServiceRequest) (*Service, error) // List `Service`s for this Metrics Scope. ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) // Update this `Service`. UpdateService(context.Context, *UpdateServiceRequest) (*Service, error) // Soft delete this `Service`. DeleteService(context.Context, *DeleteServiceRequest) (*emptypb.Empty, error) // Create a `ServiceLevelObjective` for the given `Service`. CreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) // Get a `ServiceLevelObjective` by name. GetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) // List the `ServiceLevelObjective`s for the given `Service`. ListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) // Update the given `ServiceLevelObjective`. UpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) // Delete the given `ServiceLevelObjective`. DeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*emptypb.Empty, error) } // UnimplementedServiceMonitoringServiceServer can be embedded to have forward compatible implementations. type UnimplementedServiceMonitoringServiceServer struct { } func (*UnimplementedServiceMonitoringServiceServer) CreateService(context.Context, *CreateServiceRequest) (*Service, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateService not implemented") } func (*UnimplementedServiceMonitoringServiceServer) GetService(context.Context, *GetServiceRequest) (*Service, error) { return nil, status.Errorf(codes.Unimplemented, "method GetService not implemented") } func (*UnimplementedServiceMonitoringServiceServer) ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListServices not implemented") } func (*UnimplementedServiceMonitoringServiceServer) UpdateService(context.Context, *UpdateServiceRequest) (*Service, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateService not implemented") } func (*UnimplementedServiceMonitoringServiceServer) DeleteService(context.Context, *DeleteServiceRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteService not implemented") } func (*UnimplementedServiceMonitoringServiceServer) CreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateServiceLevelObjective not implemented") } func (*UnimplementedServiceMonitoringServiceServer) GetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { return nil, status.Errorf(codes.Unimplemented, "method GetServiceLevelObjective not implemented") } func (*UnimplementedServiceMonitoringServiceServer) ListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListServiceLevelObjectives not implemented") } func (*UnimplementedServiceMonitoringServiceServer) UpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateServiceLevelObjective not implemented") } func (*UnimplementedServiceMonitoringServiceServer) DeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteServiceLevelObjective not implemented") } func RegisterServiceMonitoringServiceServer(s *grpc.Server, srv ServiceMonitoringServiceServer) { s.RegisterService(&_ServiceMonitoringService_serviceDesc, srv) } func _ServiceMonitoringService_CreateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateServiceRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).CreateService(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/CreateService", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).CreateService(ctx, req.(*CreateServiceRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_GetService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetServiceRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).GetService(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/GetService", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).GetService(ctx, req.(*GetServiceRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_ListServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListServicesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).ListServices(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/ListServices", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).ListServices(ctx, req.(*ListServicesRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_UpdateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateServiceRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).UpdateService(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/UpdateService", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).UpdateService(ctx, req.(*UpdateServiceRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_DeleteService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteServiceRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).DeleteService(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/DeleteService", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).DeleteService(ctx, req.(*DeleteServiceRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_CreateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateServiceLevelObjectiveRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, req.(*CreateServiceLevelObjectiveRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_GetServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetServiceLevelObjectiveRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, req.(*GetServiceLevelObjectiveRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_ListServiceLevelObjectives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListServiceLevelObjectivesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, req.(*ListServiceLevelObjectivesRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_UpdateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateServiceLevelObjectiveRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, req.(*UpdateServiceLevelObjectiveRequest)) } return interceptor(ctx, in, info, handler) } func _ServiceMonitoringService_DeleteServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteServiceLevelObjectiveRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, req.(*DeleteServiceLevelObjectiveRequest)) } return interceptor(ctx, in, info, handler) } var _ServiceMonitoringService_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.monitoring.v3.ServiceMonitoringService", HandlerType: (*ServiceMonitoringServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "CreateService", Handler: _ServiceMonitoringService_CreateService_Handler, }, { MethodName: "GetService", Handler: _ServiceMonitoringService_GetService_Handler, }, { MethodName: "ListServices", Handler: _ServiceMonitoringService_ListServices_Handler, }, { MethodName: "UpdateService", Handler: _ServiceMonitoringService_UpdateService_Handler, }, { MethodName: "DeleteService", Handler: _ServiceMonitoringService_DeleteService_Handler, }, { MethodName: "CreateServiceLevelObjective", Handler: _ServiceMonitoringService_CreateServiceLevelObjective_Handler, }, { MethodName: "GetServiceLevelObjective", Handler: _ServiceMonitoringService_GetServiceLevelObjective_Handler, }, { MethodName: "ListServiceLevelObjectives", Handler: _ServiceMonitoringService_ListServiceLevelObjectives_Handler, }, { MethodName: "UpdateServiceLevelObjective", Handler: _ServiceMonitoringService_UpdateServiceLevelObjective_Handler, }, { MethodName: "DeleteServiceLevelObjective", Handler: _ServiceMonitoringService_DeleteServiceLevelObjective_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/monitoring/v3/service_service.proto", } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/snooze.proto package monitoringpb import ( reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // A `Snooze` will prevent any alerts from being opened, and close any that // are already open. The `Snooze` will work on alerts that match the // criteria defined in the `Snooze`. The `Snooze` will be active from // `interval.start_time` through `interval.end_time`. type Snooze struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Identifier. The name of the `Snooze`. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/snoozes/[SNOOZE_ID] // // The ID of the `Snooze` will be generated by the system. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Required. This defines the criteria for applying the `Snooze`. See // `Criteria` for more information. Criteria *Snooze_Criteria `protobuf:"bytes,3,opt,name=criteria,proto3" json:"criteria,omitempty"` // Required. The `Snooze` will be active from `interval.start_time` through // `interval.end_time`. // `interval.start_time` cannot be in the past. There is a 15 second clock // skew to account for the time it takes for a request to reach the API from // the UI. Interval *TimeInterval `protobuf:"bytes,4,opt,name=interval,proto3" json:"interval,omitempty"` // Required. A display name for the `Snooze`. This can be, at most, 512 // unicode characters. DisplayName string `protobuf:"bytes,5,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` } func (x *Snooze) Reset() { *x = Snooze{} mi := &file_google_monitoring_v3_snooze_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Snooze) String() string { return protoimpl.X.MessageStringOf(x) } func (*Snooze) ProtoMessage() {} func (x *Snooze) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_snooze_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Snooze.ProtoReflect.Descriptor instead. func (*Snooze) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_snooze_proto_rawDescGZIP(), []int{0} } func (x *Snooze) GetName() string { if x != nil { return x.Name } return "" } func (x *Snooze) GetCriteria() *Snooze_Criteria { if x != nil { return x.Criteria } return nil } func (x *Snooze) GetInterval() *TimeInterval { if x != nil { return x.Interval } return nil } func (x *Snooze) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } // Criteria specific to the `AlertPolicy`s that this `Snooze` applies to. The // `Snooze` will suppress alerts that come from one of the `AlertPolicy`s // whose names are supplied. type Snooze_Criteria struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The specific `AlertPolicy` names for the alert that should be snoozed. // The format is: // // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[POLICY_ID] // // There is a limit of 16 policies per snooze. This limit is checked during // snooze creation. // Exactly 1 alert policy is required if `filter` is specified at the same // time. Policies []string `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` // Optional. The filter string to match on Alert fields when silencing the // alerts. It follows the standard https://google.aip.dev/160 syntax. // A filter string used to apply the snooze to specific incidents // that have matching filter values. // Filters can be defined for snoozes that apply to one alerting // policy. // Filters must be a string formatted as one or more resource labels with // specific label values. If multiple resource labels are used, then they // must be connected with an AND operator. For example, the following filter // applies the snooze to incidents that have an instance ID of // `1234567890` and a zone of `us-central1-a`: // // resource.labels.instance_id="1234567890" AND // resource.labels.zone="us-central1-a" Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` } func (x *Snooze_Criteria) Reset() { *x = Snooze_Criteria{} mi := &file_google_monitoring_v3_snooze_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Snooze_Criteria) String() string { return protoimpl.X.MessageStringOf(x) } func (*Snooze_Criteria) ProtoMessage() {} func (x *Snooze_Criteria) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_snooze_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Snooze_Criteria.ProtoReflect.Descriptor instead. func (*Snooze_Criteria) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_snooze_proto_rawDescGZIP(), []int{0, 0} } func (x *Snooze_Criteria) GetPolicies() []string { if x != nil { return x.Policies } return nil } func (x *Snooze_Criteria) GetFilter() string { if x != nil { return x.Filter } return "" } var File_google_monitoring_v3_snooze_proto protoreflect.FileDescriptor var file_google_monitoring_v3_snooze_proto_rawDesc = []byte{ 0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8e, 0x03, 0x0a, 0x06, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2e, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x43, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x6a, 0x0a, 0x08, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x46, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x2a, 0xfa, 0x41, 0x27, 0x0a, 0x25, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x4a, 0xea, 0x41, 0x47, 0x0a, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x23, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x7d, 0x42, 0xc6, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_snooze_proto_rawDescOnce sync.Once file_google_monitoring_v3_snooze_proto_rawDescData = file_google_monitoring_v3_snooze_proto_rawDesc ) func file_google_monitoring_v3_snooze_proto_rawDescGZIP() []byte { file_google_monitoring_v3_snooze_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_snooze_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_snooze_proto_rawDescData) }) return file_google_monitoring_v3_snooze_proto_rawDescData } var file_google_monitoring_v3_snooze_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_google_monitoring_v3_snooze_proto_goTypes = []any{ (*Snooze)(nil), // 0: google.monitoring.v3.Snooze (*Snooze_Criteria)(nil), // 1: google.monitoring.v3.Snooze.Criteria (*TimeInterval)(nil), // 2: google.monitoring.v3.TimeInterval } var file_google_monitoring_v3_snooze_proto_depIdxs = []int32{ 1, // 0: google.monitoring.v3.Snooze.criteria:type_name -> google.monitoring.v3.Snooze.Criteria 2, // 1: google.monitoring.v3.Snooze.interval:type_name -> google.monitoring.v3.TimeInterval 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_google_monitoring_v3_snooze_proto_init() } func file_google_monitoring_v3_snooze_proto_init() { if File_google_monitoring_v3_snooze_proto != nil { return } file_google_monitoring_v3_common_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_snooze_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_snooze_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_snooze_proto_depIdxs, MessageInfos: file_google_monitoring_v3_snooze_proto_msgTypes, }.Build() File_google_monitoring_v3_snooze_proto = out.File file_google_monitoring_v3_snooze_proto_rawDesc = nil file_google_monitoring_v3_snooze_proto_goTypes = nil file_google_monitoring_v3_snooze_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/snooze_service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/snooze_service.proto package monitoringpb import ( context "context" reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The message definition for creating a `Snooze`. Users must provide the body // of the `Snooze` to be created but must omit the `Snooze` field, `name`. type CreateSnoozeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) in which // a `Snooze` should be created. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // Required. The `Snooze` to create. Omit the `name` field, as it will be // filled in by the API. Snooze *Snooze `protobuf:"bytes,2,opt,name=snooze,proto3" json:"snooze,omitempty"` } func (x *CreateSnoozeRequest) Reset() { *x = CreateSnoozeRequest{} mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateSnoozeRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateSnoozeRequest) ProtoMessage() {} func (x *CreateSnoozeRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateSnoozeRequest.ProtoReflect.Descriptor instead. func (*CreateSnoozeRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{0} } func (x *CreateSnoozeRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *CreateSnoozeRequest) GetSnooze() *Snooze { if x != nil { return x.Snooze } return nil } // The message definition for listing `Snooze`s associated with the given // `parent`, satisfying the optional `filter`. type ListSnoozesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) whose // `Snooze`s should be listed. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // Optional. Optional filter to restrict results to the given criteria. The // following fields are supported. // // - `interval.start_time` // - `interval.end_time` // // For example: // // interval.start_time > "2022-03-11T00:00:00-08:00" AND // interval.end_time < "2022-03-12T00:00:00-08:00" Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` // Optional. The maximum number of results to return for a single query. The // server may further constrain the maximum number of results returned in a // single page. The value should be in the range [1, 1000]. If the value given // is outside this range, the server will decide the number of results to be // returned. PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Optional. The `next_page_token` from a previous call to // `ListSnoozesRequest` to get the next page of results. PageToken string `protobuf:"bytes,5,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListSnoozesRequest) Reset() { *x = ListSnoozesRequest{} mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListSnoozesRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListSnoozesRequest) ProtoMessage() {} func (x *ListSnoozesRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListSnoozesRequest.ProtoReflect.Descriptor instead. func (*ListSnoozesRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{1} } func (x *ListSnoozesRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *ListSnoozesRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListSnoozesRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListSnoozesRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The results of a successful `ListSnoozes` call, containing the matching // `Snooze`s. type ListSnoozesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // `Snooze`s matching this list call. Snoozes []*Snooze `protobuf:"bytes,1,rep,name=snoozes,proto3" json:"snoozes,omitempty"` // Page token for repeated calls to `ListSnoozes`, to fetch additional pages // of results. If this is empty or missing, there are no more pages. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListSnoozesResponse) Reset() { *x = ListSnoozesResponse{} mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListSnoozesResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListSnoozesResponse) ProtoMessage() {} func (x *ListSnoozesResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListSnoozesResponse.ProtoReflect.Descriptor instead. func (*ListSnoozesResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{2} } func (x *ListSnoozesResponse) GetSnoozes() []*Snooze { if x != nil { return x.Snoozes } return nil } func (x *ListSnoozesResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // The message definition for retrieving a `Snooze`. Users must specify the // field, `name`, which identifies the `Snooze`. type GetSnoozeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The ID of the `Snooze` to retrieve. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/snoozes/[SNOOZE_ID] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetSnoozeRequest) Reset() { *x = GetSnoozeRequest{} mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetSnoozeRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetSnoozeRequest) ProtoMessage() {} func (x *GetSnoozeRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetSnoozeRequest.ProtoReflect.Descriptor instead. func (*GetSnoozeRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{3} } func (x *GetSnoozeRequest) GetName() string { if x != nil { return x.Name } return "" } // The message definition for updating a `Snooze`. The field, `snooze.name` // identifies the `Snooze` to be updated. The remainder of `snooze` gives the // content the `Snooze` in question will be assigned. // // What fields can be updated depends on the start time and end time of the // `Snooze`. // // - end time is in the past: These `Snooze`s are considered // read-only and cannot be updated. // - start time is in the past and end time is in the future: `display_name` // and `interval.end_time` can be updated. // - start time is in the future: `display_name`, `interval.start_time` and // `interval.end_time` can be updated. type UpdateSnoozeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The `Snooze` to update. Must have the name field present. Snooze *Snooze `protobuf:"bytes,1,opt,name=snooze,proto3" json:"snooze,omitempty"` // Required. The fields to update. // // For each field listed in `update_mask`: // // - If the `Snooze` object supplied in the `UpdateSnoozeRequest` has a // value for that field, the value of the field in the existing `Snooze` // will be set to the value of the field in the supplied `Snooze`. // - If the field does not have a value in the supplied `Snooze`, the field // in the existing `Snooze` is set to its default value. // // Fields not listed retain their existing value. // // The following are the field names that are accepted in `update_mask`: // // - `display_name` // - `interval.start_time` // - `interval.end_time` // // That said, the start time and end time of the `Snooze` determines which // fields can legally be updated. Before attempting an update, users should // consult the documentation for `UpdateSnoozeRequest`, which talks about // which fields can be updated. UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` } func (x *UpdateSnoozeRequest) Reset() { *x = UpdateSnoozeRequest{} mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateSnoozeRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateSnoozeRequest) ProtoMessage() {} func (x *UpdateSnoozeRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_snooze_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateSnoozeRequest.ProtoReflect.Descriptor instead. func (*UpdateSnoozeRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_snooze_service_proto_rawDescGZIP(), []int{4} } func (x *UpdateSnoozeRequest) GetSnooze() *Snooze { if x != nil { return x.Snooze } return nil } func (x *UpdateSnoozeRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } var File_google_monitoring_v3_snooze_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_snooze_service_proto_rawDesc = []byte{ 0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x12, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x12, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x75, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x07, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x22, 0x0a, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x32, 0x98, 0x06, 0x0a, 0x0d, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x22, 0x3f, 0xda, 0x41, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x22, 0x1f, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x22, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa4, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x22, 0x4b, 0xda, 0x41, 0x12, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x06, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x32, 0x26, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x73, 0x2f, 0x2a, 0x7d, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xcd, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x12, 0x53, 0x6e, 0x6f, 0x6f, 0x7a, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_snooze_service_proto_rawDescOnce sync.Once file_google_monitoring_v3_snooze_service_proto_rawDescData = file_google_monitoring_v3_snooze_service_proto_rawDesc ) func file_google_monitoring_v3_snooze_service_proto_rawDescGZIP() []byte { file_google_monitoring_v3_snooze_service_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_snooze_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_snooze_service_proto_rawDescData) }) return file_google_monitoring_v3_snooze_service_proto_rawDescData } var file_google_monitoring_v3_snooze_service_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_google_monitoring_v3_snooze_service_proto_goTypes = []any{ (*CreateSnoozeRequest)(nil), // 0: google.monitoring.v3.CreateSnoozeRequest (*ListSnoozesRequest)(nil), // 1: google.monitoring.v3.ListSnoozesRequest (*ListSnoozesResponse)(nil), // 2: google.monitoring.v3.ListSnoozesResponse (*GetSnoozeRequest)(nil), // 3: google.monitoring.v3.GetSnoozeRequest (*UpdateSnoozeRequest)(nil), // 4: google.monitoring.v3.UpdateSnoozeRequest (*Snooze)(nil), // 5: google.monitoring.v3.Snooze (*fieldmaskpb.FieldMask)(nil), // 6: google.protobuf.FieldMask } var file_google_monitoring_v3_snooze_service_proto_depIdxs = []int32{ 5, // 0: google.monitoring.v3.CreateSnoozeRequest.snooze:type_name -> google.monitoring.v3.Snooze 5, // 1: google.monitoring.v3.ListSnoozesResponse.snoozes:type_name -> google.monitoring.v3.Snooze 5, // 2: google.monitoring.v3.UpdateSnoozeRequest.snooze:type_name -> google.monitoring.v3.Snooze 6, // 3: google.monitoring.v3.UpdateSnoozeRequest.update_mask:type_name -> google.protobuf.FieldMask 0, // 4: google.monitoring.v3.SnoozeService.CreateSnooze:input_type -> google.monitoring.v3.CreateSnoozeRequest 1, // 5: google.monitoring.v3.SnoozeService.ListSnoozes:input_type -> google.monitoring.v3.ListSnoozesRequest 3, // 6: google.monitoring.v3.SnoozeService.GetSnooze:input_type -> google.monitoring.v3.GetSnoozeRequest 4, // 7: google.monitoring.v3.SnoozeService.UpdateSnooze:input_type -> google.monitoring.v3.UpdateSnoozeRequest 5, // 8: google.monitoring.v3.SnoozeService.CreateSnooze:output_type -> google.monitoring.v3.Snooze 2, // 9: google.monitoring.v3.SnoozeService.ListSnoozes:output_type -> google.monitoring.v3.ListSnoozesResponse 5, // 10: google.monitoring.v3.SnoozeService.GetSnooze:output_type -> google.monitoring.v3.Snooze 5, // 11: google.monitoring.v3.SnoozeService.UpdateSnooze:output_type -> google.monitoring.v3.Snooze 8, // [8:12] is the sub-list for method output_type 4, // [4:8] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name 4, // [4:4] is the sub-list for extension extendee 0, // [0:4] is the sub-list for field type_name } func init() { file_google_monitoring_v3_snooze_service_proto_init() } func file_google_monitoring_v3_snooze_service_proto_init() { if File_google_monitoring_v3_snooze_service_proto != nil { return } file_google_monitoring_v3_snooze_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_snooze_service_proto_rawDesc, NumEnums: 0, NumMessages: 5, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_monitoring_v3_snooze_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_snooze_service_proto_depIdxs, MessageInfos: file_google_monitoring_v3_snooze_service_proto_msgTypes, }.Build() File_google_monitoring_v3_snooze_service_proto = out.File file_google_monitoring_v3_snooze_service_proto_rawDesc = nil file_google_monitoring_v3_snooze_service_proto_goTypes = nil file_google_monitoring_v3_snooze_service_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // SnoozeServiceClient is the client API for SnoozeService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type SnoozeServiceClient interface { // Creates a `Snooze` that will prevent alerts, which match the provided // criteria, from being opened. The `Snooze` applies for a specific time // interval. CreateSnooze(ctx context.Context, in *CreateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) // Lists the `Snooze`s associated with a project. Can optionally pass in // `filter`, which specifies predicates to match `Snooze`s. ListSnoozes(ctx context.Context, in *ListSnoozesRequest, opts ...grpc.CallOption) (*ListSnoozesResponse, error) // Retrieves a `Snooze` by `name`. GetSnooze(ctx context.Context, in *GetSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) // Updates a `Snooze`, identified by its `name`, with the parameters in the // given `Snooze` object. UpdateSnooze(ctx context.Context, in *UpdateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) } type snoozeServiceClient struct { cc grpc.ClientConnInterface } func NewSnoozeServiceClient(cc grpc.ClientConnInterface) SnoozeServiceClient { return &snoozeServiceClient{cc} } func (c *snoozeServiceClient) CreateSnooze(ctx context.Context, in *CreateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { out := new(Snooze) err := c.cc.Invoke(ctx, "/google.monitoring.v3.SnoozeService/CreateSnooze", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *snoozeServiceClient) ListSnoozes(ctx context.Context, in *ListSnoozesRequest, opts ...grpc.CallOption) (*ListSnoozesResponse, error) { out := new(ListSnoozesResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.SnoozeService/ListSnoozes", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *snoozeServiceClient) GetSnooze(ctx context.Context, in *GetSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { out := new(Snooze) err := c.cc.Invoke(ctx, "/google.monitoring.v3.SnoozeService/GetSnooze", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *snoozeServiceClient) UpdateSnooze(ctx context.Context, in *UpdateSnoozeRequest, opts ...grpc.CallOption) (*Snooze, error) { out := new(Snooze) err := c.cc.Invoke(ctx, "/google.monitoring.v3.SnoozeService/UpdateSnooze", in, out, opts...) if err != nil { return nil, err } return out, nil } // SnoozeServiceServer is the server API for SnoozeService service. type SnoozeServiceServer interface { // Creates a `Snooze` that will prevent alerts, which match the provided // criteria, from being opened. The `Snooze` applies for a specific time // interval. CreateSnooze(context.Context, *CreateSnoozeRequest) (*Snooze, error) // Lists the `Snooze`s associated with a project. Can optionally pass in // `filter`, which specifies predicates to match `Snooze`s. ListSnoozes(context.Context, *ListSnoozesRequest) (*ListSnoozesResponse, error) // Retrieves a `Snooze` by `name`. GetSnooze(context.Context, *GetSnoozeRequest) (*Snooze, error) // Updates a `Snooze`, identified by its `name`, with the parameters in the // given `Snooze` object. UpdateSnooze(context.Context, *UpdateSnoozeRequest) (*Snooze, error) } // UnimplementedSnoozeServiceServer can be embedded to have forward compatible implementations. type UnimplementedSnoozeServiceServer struct { } func (*UnimplementedSnoozeServiceServer) CreateSnooze(context.Context, *CreateSnoozeRequest) (*Snooze, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateSnooze not implemented") } func (*UnimplementedSnoozeServiceServer) ListSnoozes(context.Context, *ListSnoozesRequest) (*ListSnoozesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListSnoozes not implemented") } func (*UnimplementedSnoozeServiceServer) GetSnooze(context.Context, *GetSnoozeRequest) (*Snooze, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSnooze not implemented") } func (*UnimplementedSnoozeServiceServer) UpdateSnooze(context.Context, *UpdateSnoozeRequest) (*Snooze, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateSnooze not implemented") } func RegisterSnoozeServiceServer(s *grpc.Server, srv SnoozeServiceServer) { s.RegisterService(&_SnoozeService_serviceDesc, srv) } func _SnoozeService_CreateSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateSnoozeRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(SnoozeServiceServer).CreateSnooze(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.SnoozeService/CreateSnooze", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SnoozeServiceServer).CreateSnooze(ctx, req.(*CreateSnoozeRequest)) } return interceptor(ctx, in, info, handler) } func _SnoozeService_ListSnoozes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListSnoozesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(SnoozeServiceServer).ListSnoozes(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.SnoozeService/ListSnoozes", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SnoozeServiceServer).ListSnoozes(ctx, req.(*ListSnoozesRequest)) } return interceptor(ctx, in, info, handler) } func _SnoozeService_GetSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetSnoozeRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(SnoozeServiceServer).GetSnooze(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.SnoozeService/GetSnooze", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SnoozeServiceServer).GetSnooze(ctx, req.(*GetSnoozeRequest)) } return interceptor(ctx, in, info, handler) } func _SnoozeService_UpdateSnooze_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateSnoozeRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(SnoozeServiceServer).UpdateSnooze(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.SnoozeService/UpdateSnooze", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SnoozeServiceServer).UpdateSnooze(ctx, req.(*UpdateSnoozeRequest)) } return interceptor(ctx, in, info, handler) } var _SnoozeService_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.monitoring.v3.SnoozeService", HandlerType: (*SnoozeServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "CreateSnooze", Handler: _SnoozeService_CreateSnooze_Handler, }, { MethodName: "ListSnoozes", Handler: _SnoozeService_ListSnoozes_Handler, }, { MethodName: "GetSnooze", Handler: _SnoozeService_GetSnooze_Handler, }, { MethodName: "UpdateSnooze", Handler: _SnoozeService_UpdateSnooze_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/monitoring/v3/snooze_service.proto", } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/span_context.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/span_context.proto package monitoringpb import ( reflect "reflect" sync "sync" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The context of a span. This is attached to an // [Exemplar][google.api.Distribution.Exemplar] // in [Distribution][google.api.Distribution] values during aggregation. // // It contains the name of a span with format: // // projects/[PROJECT_ID_OR_NUMBER]/traces/[TRACE_ID]/spans/[SPAN_ID] type SpanContext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The resource name of the span. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/traces/[TRACE_ID]/spans/[SPAN_ID] // // `[TRACE_ID]` is a unique identifier for a trace within a project; // it is a 32-character hexadecimal encoding of a 16-byte array. // // `[SPAN_ID]` is a unique identifier for a span within a trace; it // is a 16-character hexadecimal encoding of an 8-byte array. SpanName string `protobuf:"bytes,1,opt,name=span_name,json=spanName,proto3" json:"span_name,omitempty"` } func (x *SpanContext) Reset() { *x = SpanContext{} mi := &file_google_monitoring_v3_span_context_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *SpanContext) String() string { return protoimpl.X.MessageStringOf(x) } func (*SpanContext) ProtoMessage() {} func (x *SpanContext) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_span_context_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SpanContext.ProtoReflect.Descriptor instead. func (*SpanContext) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_span_context_proto_rawDescGZIP(), []int{0} } func (x *SpanContext) GetSpanName() string { if x != nil { return x.SpanName } return "" } var File_google_monitoring_v3_span_context_proto protoreflect.FileDescriptor var file_google_monitoring_v3_span_context_proto_rawDesc = []byte{ 0x0a, 0x27, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x22, 0x2a, 0x0a, 0x0b, 0x53, 0x70, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x70, 0x61, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0xcb, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x10, 0x53, 0x70, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_span_context_proto_rawDescOnce sync.Once file_google_monitoring_v3_span_context_proto_rawDescData = file_google_monitoring_v3_span_context_proto_rawDesc ) func file_google_monitoring_v3_span_context_proto_rawDescGZIP() []byte { file_google_monitoring_v3_span_context_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_span_context_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_span_context_proto_rawDescData) }) return file_google_monitoring_v3_span_context_proto_rawDescData } var file_google_monitoring_v3_span_context_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_google_monitoring_v3_span_context_proto_goTypes = []any{ (*SpanContext)(nil), // 0: google.monitoring.v3.SpanContext } var file_google_monitoring_v3_span_context_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_google_monitoring_v3_span_context_proto_init() } func file_google_monitoring_v3_span_context_proto_init() { if File_google_monitoring_v3_span_context_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_span_context_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_span_context_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_span_context_proto_depIdxs, MessageInfos: file_google_monitoring_v3_span_context_proto_msgTypes, }.Build() File_google_monitoring_v3_span_context_proto = out.File file_google_monitoring_v3_span_context_proto_rawDesc = nil file_google_monitoring_v3_span_context_proto_goTypes = nil file_google_monitoring_v3_span_context_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/uptime.proto package monitoringpb import ( reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The regions from which an Uptime check can be run. type UptimeCheckRegion int32 const ( // Default value if no region is specified. Will result in Uptime checks // running from all regions. UptimeCheckRegion_REGION_UNSPECIFIED UptimeCheckRegion = 0 // Allows checks to run from locations within the United States of America. UptimeCheckRegion_USA UptimeCheckRegion = 1 // Allows checks to run from locations within the continent of Europe. UptimeCheckRegion_EUROPE UptimeCheckRegion = 2 // Allows checks to run from locations within the continent of South // America. UptimeCheckRegion_SOUTH_AMERICA UptimeCheckRegion = 3 // Allows checks to run from locations within the Asia Pacific area (ex: // Singapore). UptimeCheckRegion_ASIA_PACIFIC UptimeCheckRegion = 4 // Allows checks to run from locations within the western United States of // America UptimeCheckRegion_USA_OREGON UptimeCheckRegion = 5 // Allows checks to run from locations within the central United States of // America UptimeCheckRegion_USA_IOWA UptimeCheckRegion = 6 // Allows checks to run from locations within the eastern United States of // America UptimeCheckRegion_USA_VIRGINIA UptimeCheckRegion = 7 ) // Enum value maps for UptimeCheckRegion. var ( UptimeCheckRegion_name = map[int32]string{ 0: "REGION_UNSPECIFIED", 1: "USA", 2: "EUROPE", 3: "SOUTH_AMERICA", 4: "ASIA_PACIFIC", 5: "USA_OREGON", 6: "USA_IOWA", 7: "USA_VIRGINIA", } UptimeCheckRegion_value = map[string]int32{ "REGION_UNSPECIFIED": 0, "USA": 1, "EUROPE": 2, "SOUTH_AMERICA": 3, "ASIA_PACIFIC": 4, "USA_OREGON": 5, "USA_IOWA": 6, "USA_VIRGINIA": 7, } ) func (x UptimeCheckRegion) Enum() *UptimeCheckRegion { p := new(UptimeCheckRegion) *p = x return p } func (x UptimeCheckRegion) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (UptimeCheckRegion) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[0].Descriptor() } func (UptimeCheckRegion) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[0] } func (x UptimeCheckRegion) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use UptimeCheckRegion.Descriptor instead. func (UptimeCheckRegion) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{0} } // The supported resource types that can be used as values of // `group_resource.resource_type`. // `INSTANCE` includes `gce_instance` and `aws_ec2_instance` resource types. // The resource types `gae_app` and `uptime_url` are not valid here because // group checks on App Engine modules and URLs are not allowed. type GroupResourceType int32 const ( // Default value (not valid). GroupResourceType_RESOURCE_TYPE_UNSPECIFIED GroupResourceType = 0 // A group of instances from Google Cloud Platform (GCP) or // Amazon Web Services (AWS). GroupResourceType_INSTANCE GroupResourceType = 1 // A group of Amazon ELB load balancers. GroupResourceType_AWS_ELB_LOAD_BALANCER GroupResourceType = 2 ) // Enum value maps for GroupResourceType. var ( GroupResourceType_name = map[int32]string{ 0: "RESOURCE_TYPE_UNSPECIFIED", 1: "INSTANCE", 2: "AWS_ELB_LOAD_BALANCER", } GroupResourceType_value = map[string]int32{ "RESOURCE_TYPE_UNSPECIFIED": 0, "INSTANCE": 1, "AWS_ELB_LOAD_BALANCER": 2, } ) func (x GroupResourceType) Enum() *GroupResourceType { p := new(GroupResourceType) *p = x return p } func (x GroupResourceType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (GroupResourceType) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[1].Descriptor() } func (GroupResourceType) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[1] } func (x GroupResourceType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use GroupResourceType.Descriptor instead. func (GroupResourceType) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{1} } // Operational states for an internal checker. type InternalChecker_State int32 const ( // An internal checker should never be in the unspecified state. InternalChecker_UNSPECIFIED InternalChecker_State = 0 // The checker is being created, provisioned, and configured. A checker in // this state can be returned by `ListInternalCheckers` or // `GetInternalChecker`, as well as by examining the [long running // Operation](https://cloud.google.com/apis/design/design_patterns#long_running_operations) // that created it. InternalChecker_CREATING InternalChecker_State = 1 // The checker is running and available for use. A checker in this state // can be returned by `ListInternalCheckers` or `GetInternalChecker` as // well as by examining the [long running // Operation](https://cloud.google.com/apis/design/design_patterns#long_running_operations) // that created it. // If a checker is being torn down, it is neither visible nor usable, so // there is no "deleting" or "down" state. InternalChecker_RUNNING InternalChecker_State = 2 ) // Enum value maps for InternalChecker_State. var ( InternalChecker_State_name = map[int32]string{ 0: "UNSPECIFIED", 1: "CREATING", 2: "RUNNING", } InternalChecker_State_value = map[string]int32{ "UNSPECIFIED": 0, "CREATING": 1, "RUNNING": 2, } ) func (x InternalChecker_State) Enum() *InternalChecker_State { p := new(InternalChecker_State) *p = x return p } func (x InternalChecker_State) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (InternalChecker_State) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[2].Descriptor() } func (InternalChecker_State) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[2] } func (x InternalChecker_State) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use InternalChecker_State.Descriptor instead. func (InternalChecker_State) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{0, 0} } // What kind of checkers are available to be used by the check. type UptimeCheckConfig_CheckerType int32 const ( // The default checker type. Currently converted to `STATIC_IP_CHECKERS` // on creation, the default conversion behavior may change in the future. UptimeCheckConfig_CHECKER_TYPE_UNSPECIFIED UptimeCheckConfig_CheckerType = 0 // `STATIC_IP_CHECKERS` are used for uptime checks that perform egress // across the public internet. `STATIC_IP_CHECKERS` use the static IP // addresses returned by `ListUptimeCheckIps`. UptimeCheckConfig_STATIC_IP_CHECKERS UptimeCheckConfig_CheckerType = 1 // `VPC_CHECKERS` are used for uptime checks that perform egress using // Service Directory and private network access. When using `VPC_CHECKERS`, // the monitored resource type must be `servicedirectory_service`. UptimeCheckConfig_VPC_CHECKERS UptimeCheckConfig_CheckerType = 3 ) // Enum value maps for UptimeCheckConfig_CheckerType. var ( UptimeCheckConfig_CheckerType_name = map[int32]string{ 0: "CHECKER_TYPE_UNSPECIFIED", 1: "STATIC_IP_CHECKERS", 3: "VPC_CHECKERS", } UptimeCheckConfig_CheckerType_value = map[string]int32{ "CHECKER_TYPE_UNSPECIFIED": 0, "STATIC_IP_CHECKERS": 1, "VPC_CHECKERS": 3, } ) func (x UptimeCheckConfig_CheckerType) Enum() *UptimeCheckConfig_CheckerType { p := new(UptimeCheckConfig_CheckerType) *p = x return p } func (x UptimeCheckConfig_CheckerType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (UptimeCheckConfig_CheckerType) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[3].Descriptor() } func (UptimeCheckConfig_CheckerType) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[3] } func (x UptimeCheckConfig_CheckerType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use UptimeCheckConfig_CheckerType.Descriptor instead. func (UptimeCheckConfig_CheckerType) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 0} } // The HTTP request method options. type UptimeCheckConfig_HttpCheck_RequestMethod int32 const ( // No request method specified. UptimeCheckConfig_HttpCheck_METHOD_UNSPECIFIED UptimeCheckConfig_HttpCheck_RequestMethod = 0 // GET request. UptimeCheckConfig_HttpCheck_GET UptimeCheckConfig_HttpCheck_RequestMethod = 1 // POST request. UptimeCheckConfig_HttpCheck_POST UptimeCheckConfig_HttpCheck_RequestMethod = 2 ) // Enum value maps for UptimeCheckConfig_HttpCheck_RequestMethod. var ( UptimeCheckConfig_HttpCheck_RequestMethod_name = map[int32]string{ 0: "METHOD_UNSPECIFIED", 1: "GET", 2: "POST", } UptimeCheckConfig_HttpCheck_RequestMethod_value = map[string]int32{ "METHOD_UNSPECIFIED": 0, "GET": 1, "POST": 2, } ) func (x UptimeCheckConfig_HttpCheck_RequestMethod) Enum() *UptimeCheckConfig_HttpCheck_RequestMethod { p := new(UptimeCheckConfig_HttpCheck_RequestMethod) *p = x return p } func (x UptimeCheckConfig_HttpCheck_RequestMethod) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (UptimeCheckConfig_HttpCheck_RequestMethod) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[4].Descriptor() } func (UptimeCheckConfig_HttpCheck_RequestMethod) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[4] } func (x UptimeCheckConfig_HttpCheck_RequestMethod) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use UptimeCheckConfig_HttpCheck_RequestMethod.Descriptor instead. func (UptimeCheckConfig_HttpCheck_RequestMethod) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 0} } // Header options corresponding to the content type of a HTTP request body. type UptimeCheckConfig_HttpCheck_ContentType int32 const ( // No content type specified. UptimeCheckConfig_HttpCheck_TYPE_UNSPECIFIED UptimeCheckConfig_HttpCheck_ContentType = 0 // `body` is in URL-encoded form. Equivalent to setting the `Content-Type` // to `application/x-www-form-urlencoded` in the HTTP request. UptimeCheckConfig_HttpCheck_URL_ENCODED UptimeCheckConfig_HttpCheck_ContentType = 1 // `body` is in `custom_content_type` form. Equivalent to setting the // `Content-Type` to the contents of `custom_content_type` in the HTTP // request. UptimeCheckConfig_HttpCheck_USER_PROVIDED UptimeCheckConfig_HttpCheck_ContentType = 2 ) // Enum value maps for UptimeCheckConfig_HttpCheck_ContentType. var ( UptimeCheckConfig_HttpCheck_ContentType_name = map[int32]string{ 0: "TYPE_UNSPECIFIED", 1: "URL_ENCODED", 2: "USER_PROVIDED", } UptimeCheckConfig_HttpCheck_ContentType_value = map[string]int32{ "TYPE_UNSPECIFIED": 0, "URL_ENCODED": 1, "USER_PROVIDED": 2, } ) func (x UptimeCheckConfig_HttpCheck_ContentType) Enum() *UptimeCheckConfig_HttpCheck_ContentType { p := new(UptimeCheckConfig_HttpCheck_ContentType) *p = x return p } func (x UptimeCheckConfig_HttpCheck_ContentType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (UptimeCheckConfig_HttpCheck_ContentType) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[5].Descriptor() } func (UptimeCheckConfig_HttpCheck_ContentType) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[5] } func (x UptimeCheckConfig_HttpCheck_ContentType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use UptimeCheckConfig_HttpCheck_ContentType.Descriptor instead. func (UptimeCheckConfig_HttpCheck_ContentType) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 1} } // An HTTP status code class. type UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass int32 const ( // Default value that matches no status codes. UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_UNSPECIFIED UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 0 // The class of status codes between 100 and 199. UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_1XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 100 // The class of status codes between 200 and 299. UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_2XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 200 // The class of status codes between 300 and 399. UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_3XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 300 // The class of status codes between 400 and 499. UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_4XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 400 // The class of status codes between 500 and 599. UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_5XX UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 500 // The class of all status codes. UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_ANY UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass = 1000 ) // Enum value maps for UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass. var ( UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_name = map[int32]string{ 0: "STATUS_CLASS_UNSPECIFIED", 100: "STATUS_CLASS_1XX", 200: "STATUS_CLASS_2XX", 300: "STATUS_CLASS_3XX", 400: "STATUS_CLASS_4XX", 500: "STATUS_CLASS_5XX", 1000: "STATUS_CLASS_ANY", } UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_value = map[string]int32{ "STATUS_CLASS_UNSPECIFIED": 0, "STATUS_CLASS_1XX": 100, "STATUS_CLASS_2XX": 200, "STATUS_CLASS_3XX": 300, "STATUS_CLASS_4XX": 400, "STATUS_CLASS_5XX": 500, "STATUS_CLASS_ANY": 1000, } ) func (x UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) Enum() *UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass { p := new(UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) *p = x return p } func (x UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[6].Descriptor() } func (UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[6] } func (x UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass.Descriptor instead. func (UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 1, 0} } // Type of authentication. type UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType int32 const ( // Default value, will result in OIDC Authentication. UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_SERVICE_AGENT_AUTHENTICATION_TYPE_UNSPECIFIED UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType = 0 // OIDC Authentication UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_OIDC_TOKEN UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType = 1 ) // Enum value maps for UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType. var ( UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType_name = map[int32]string{ 0: "SERVICE_AGENT_AUTHENTICATION_TYPE_UNSPECIFIED", 1: "OIDC_TOKEN", } UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType_value = map[string]int32{ "SERVICE_AGENT_AUTHENTICATION_TYPE_UNSPECIFIED": 0, "OIDC_TOKEN": 1, } ) func (x UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) Enum() *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType { p := new(UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) *p = x return p } func (x UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[7].Descriptor() } func (UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[7] } func (x UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType.Descriptor instead. func (UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 2, 0} } // Options to perform content matching. type UptimeCheckConfig_ContentMatcher_ContentMatcherOption int32 const ( // No content matcher type specified (maintained for backward // compatibility, but deprecated for future use). // Treated as `CONTAINS_STRING`. UptimeCheckConfig_ContentMatcher_CONTENT_MATCHER_OPTION_UNSPECIFIED UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 0 // Selects substring matching. The match succeeds if the output contains // the `content` string. This is the default value for checks without // a `matcher` option, or where the value of `matcher` is // `CONTENT_MATCHER_OPTION_UNSPECIFIED`. UptimeCheckConfig_ContentMatcher_CONTAINS_STRING UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 1 // Selects negation of substring matching. The match succeeds if the // output does _NOT_ contain the `content` string. UptimeCheckConfig_ContentMatcher_NOT_CONTAINS_STRING UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 2 // Selects regular-expression matching. The match succeeds if the output // matches the regular expression specified in the `content` string. // Regex matching is only supported for HTTP/HTTPS checks. UptimeCheckConfig_ContentMatcher_MATCHES_REGEX UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 3 // Selects negation of regular-expression matching. The match succeeds if // the output does _NOT_ match the regular expression specified in the // `content` string. Regex matching is only supported for HTTP/HTTPS // checks. UptimeCheckConfig_ContentMatcher_NOT_MATCHES_REGEX UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 4 // Selects JSONPath matching. See `JsonPathMatcher` for details on when // the match succeeds. JSONPath matching is only supported for HTTP/HTTPS // checks. UptimeCheckConfig_ContentMatcher_MATCHES_JSON_PATH UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 5 // Selects JSONPath matching. See `JsonPathMatcher` for details on when // the match succeeds. Succeeds when output does _NOT_ match as specified. // JSONPath is only supported for HTTP/HTTPS checks. UptimeCheckConfig_ContentMatcher_NOT_MATCHES_JSON_PATH UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 6 ) // Enum value maps for UptimeCheckConfig_ContentMatcher_ContentMatcherOption. var ( UptimeCheckConfig_ContentMatcher_ContentMatcherOption_name = map[int32]string{ 0: "CONTENT_MATCHER_OPTION_UNSPECIFIED", 1: "CONTAINS_STRING", 2: "NOT_CONTAINS_STRING", 3: "MATCHES_REGEX", 4: "NOT_MATCHES_REGEX", 5: "MATCHES_JSON_PATH", 6: "NOT_MATCHES_JSON_PATH", } UptimeCheckConfig_ContentMatcher_ContentMatcherOption_value = map[string]int32{ "CONTENT_MATCHER_OPTION_UNSPECIFIED": 0, "CONTAINS_STRING": 1, "NOT_CONTAINS_STRING": 2, "MATCHES_REGEX": 3, "NOT_MATCHES_REGEX": 4, "MATCHES_JSON_PATH": 5, "NOT_MATCHES_JSON_PATH": 6, } ) func (x UptimeCheckConfig_ContentMatcher_ContentMatcherOption) Enum() *UptimeCheckConfig_ContentMatcher_ContentMatcherOption { p := new(UptimeCheckConfig_ContentMatcher_ContentMatcherOption) *p = x return p } func (x UptimeCheckConfig_ContentMatcher_ContentMatcherOption) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (UptimeCheckConfig_ContentMatcher_ContentMatcherOption) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[8].Descriptor() } func (UptimeCheckConfig_ContentMatcher_ContentMatcherOption) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[8] } func (x UptimeCheckConfig_ContentMatcher_ContentMatcherOption) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use UptimeCheckConfig_ContentMatcher_ContentMatcherOption.Descriptor instead. func (UptimeCheckConfig_ContentMatcher_ContentMatcherOption) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 4, 0} } // Options to perform JSONPath content matching. type UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption int32 const ( // No JSONPath matcher type specified (not valid). UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JSON_PATH_MATCHER_OPTION_UNSPECIFIED UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption = 0 // Selects 'exact string' matching. The match succeeds if the content at // the `json_path` within the output is exactly the same as the // `content` string. UptimeCheckConfig_ContentMatcher_JsonPathMatcher_EXACT_MATCH UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption = 1 // Selects regular-expression matching. The match succeeds if the // content at the `json_path` within the output matches the regular // expression specified in the `content` string. UptimeCheckConfig_ContentMatcher_JsonPathMatcher_REGEX_MATCH UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption = 2 ) // Enum value maps for UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption. var ( UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption_name = map[int32]string{ 0: "JSON_PATH_MATCHER_OPTION_UNSPECIFIED", 1: "EXACT_MATCH", 2: "REGEX_MATCH", } UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption_value = map[string]int32{ "JSON_PATH_MATCHER_OPTION_UNSPECIFIED": 0, "EXACT_MATCH": 1, "REGEX_MATCH": 2, } ) func (x UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) Enum() *UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption { p := new(UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) *p = x return p } func (x UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) Descriptor() protoreflect.EnumDescriptor { return file_google_monitoring_v3_uptime_proto_enumTypes[9].Descriptor() } func (UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) Type() protoreflect.EnumType { return &file_google_monitoring_v3_uptime_proto_enumTypes[9] } func (x UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption.Descriptor instead. func (UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption) EnumDescriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 4, 0, 0} } // An internal checker allows Uptime checks to run on private/internal GCP // resources. // // Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto. type InternalChecker struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A unique resource name for this InternalChecker. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/internalCheckers/[INTERNAL_CHECKER_ID] // // `[PROJECT_ID_OR_NUMBER]` is the Cloud Monitoring Metrics Scope project for // the Uptime check config associated with the internal checker. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The checker's human-readable name. The display name // should be unique within a Cloud Monitoring Metrics Scope in order to make // it easier to identify; however, uniqueness is not enforced. DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // The [GCP VPC network](https://cloud.google.com/vpc/docs/vpc) where the // internal resource lives (ex: "default"). Network string `protobuf:"bytes,3,opt,name=network,proto3" json:"network,omitempty"` // The GCP zone the Uptime check should egress from. Only respected for // internal Uptime checks, where internal_network is specified. GcpZone string `protobuf:"bytes,4,opt,name=gcp_zone,json=gcpZone,proto3" json:"gcp_zone,omitempty"` // The GCP project ID where the internal checker lives. Not necessary // the same as the Metrics Scope project. PeerProjectId string `protobuf:"bytes,6,opt,name=peer_project_id,json=peerProjectId,proto3" json:"peer_project_id,omitempty"` // The current operational state of the internal checker. State InternalChecker_State `protobuf:"varint,7,opt,name=state,proto3,enum=google.monitoring.v3.InternalChecker_State" json:"state,omitempty"` } func (x *InternalChecker) Reset() { *x = InternalChecker{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *InternalChecker) String() string { return protoimpl.X.MessageStringOf(x) } func (*InternalChecker) ProtoMessage() {} func (x *InternalChecker) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use InternalChecker.ProtoReflect.Descriptor instead. func (*InternalChecker) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{0} } func (x *InternalChecker) GetName() string { if x != nil { return x.Name } return "" } func (x *InternalChecker) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (x *InternalChecker) GetNetwork() string { if x != nil { return x.Network } return "" } func (x *InternalChecker) GetGcpZone() string { if x != nil { return x.GcpZone } return "" } func (x *InternalChecker) GetPeerProjectId() string { if x != nil { return x.PeerProjectId } return "" } func (x *InternalChecker) GetState() InternalChecker_State { if x != nil { return x.State } return InternalChecker_UNSPECIFIED } // Describes a Synthetic Monitor to be invoked by Uptime. type SyntheticMonitorTarget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Specifies a Synthetic Monitor's execution stack. // // Types that are assignable to Target: // // *SyntheticMonitorTarget_CloudFunctionV2 Target isSyntheticMonitorTarget_Target `protobuf_oneof:"target"` } func (x *SyntheticMonitorTarget) Reset() { *x = SyntheticMonitorTarget{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *SyntheticMonitorTarget) String() string { return protoimpl.X.MessageStringOf(x) } func (*SyntheticMonitorTarget) ProtoMessage() {} func (x *SyntheticMonitorTarget) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SyntheticMonitorTarget.ProtoReflect.Descriptor instead. func (*SyntheticMonitorTarget) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{1} } func (m *SyntheticMonitorTarget) GetTarget() isSyntheticMonitorTarget_Target { if m != nil { return m.Target } return nil } func (x *SyntheticMonitorTarget) GetCloudFunctionV2() *SyntheticMonitorTarget_CloudFunctionV2Target { if x, ok := x.GetTarget().(*SyntheticMonitorTarget_CloudFunctionV2); ok { return x.CloudFunctionV2 } return nil } type isSyntheticMonitorTarget_Target interface { isSyntheticMonitorTarget_Target() } type SyntheticMonitorTarget_CloudFunctionV2 struct { // Target a Synthetic Monitor GCFv2 instance. CloudFunctionV2 *SyntheticMonitorTarget_CloudFunctionV2Target `protobuf:"bytes,1,opt,name=cloud_function_v2,json=cloudFunctionV2,proto3,oneof"` } func (*SyntheticMonitorTarget_CloudFunctionV2) isSyntheticMonitorTarget_Target() {} // This message configures which resources and services to monitor for // availability. type UptimeCheckConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Identifier. A unique resource name for this Uptime check configuration. The // format is: // // projects/[PROJECT_ID_OR_NUMBER]/uptimeCheckConfigs/[UPTIME_CHECK_ID] // // `[PROJECT_ID_OR_NUMBER]` is the Workspace host project associated with the // Uptime check. // // This field should be omitted when creating the Uptime check configuration; // on create, the resource name is assigned by the server and included in the // response. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // A human-friendly name for the Uptime check configuration. The display name // should be unique within a Cloud Monitoring Workspace in order to make it // easier to identify; however, uniqueness is not enforced. Required. DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // The resource the check is checking. Required. // // Types that are assignable to Resource: // // *UptimeCheckConfig_MonitoredResource // *UptimeCheckConfig_ResourceGroup_ // *UptimeCheckConfig_SyntheticMonitor Resource isUptimeCheckConfig_Resource `protobuf_oneof:"resource"` // The type of Uptime check request. // // Types that are assignable to CheckRequestType: // // *UptimeCheckConfig_HttpCheck_ // *UptimeCheckConfig_TcpCheck_ CheckRequestType isUptimeCheckConfig_CheckRequestType `protobuf_oneof:"check_request_type"` // How often, in seconds, the Uptime check is performed. // Currently, the only supported values are `60s` (1 minute), `300s` // (5 minutes), `600s` (10 minutes), and `900s` (15 minutes). Optional, // defaults to `60s`. Period *durationpb.Duration `protobuf:"bytes,7,opt,name=period,proto3" json:"period,omitempty"` // The maximum amount of time to wait for the request to complete (must be // between 1 and 60 seconds). Required. Timeout *durationpb.Duration `protobuf:"bytes,8,opt,name=timeout,proto3" json:"timeout,omitempty"` // The content that is expected to appear in the data returned by the target // server against which the check is run. Currently, only the first entry // in the `content_matchers` list is supported, and additional entries will // be ignored. This field is optional and should only be specified if a // content match is required as part of the/ Uptime check. ContentMatchers []*UptimeCheckConfig_ContentMatcher `protobuf:"bytes,9,rep,name=content_matchers,json=contentMatchers,proto3" json:"content_matchers,omitempty"` // The type of checkers to use to execute the Uptime check. CheckerType UptimeCheckConfig_CheckerType `protobuf:"varint,17,opt,name=checker_type,json=checkerType,proto3,enum=google.monitoring.v3.UptimeCheckConfig_CheckerType" json:"checker_type,omitempty"` // The list of regions from which the check will be run. // Some regions contain one location, and others contain more than one. // If this field is specified, enough regions must be provided to include a // minimum of 3 locations. Not specifying this field will result in Uptime // checks running from all available regions. SelectedRegions []UptimeCheckRegion `protobuf:"varint,10,rep,packed,name=selected_regions,json=selectedRegions,proto3,enum=google.monitoring.v3.UptimeCheckRegion" json:"selected_regions,omitempty"` // If this is `true`, then checks are made only from the 'internal_checkers'. // If it is `false`, then checks are made only from the 'selected_regions'. // It is an error to provide 'selected_regions' when is_internal is `true`, // or to provide 'internal_checkers' when is_internal is `false`. // // Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto. IsInternal bool `protobuf:"varint,15,opt,name=is_internal,json=isInternal,proto3" json:"is_internal,omitempty"` // The internal checkers that this check will egress from. If `is_internal` is // `true` and this list is empty, the check will egress from all the // InternalCheckers configured for the project that owns this // `UptimeCheckConfig`. // // Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto. InternalCheckers []*InternalChecker `protobuf:"bytes,14,rep,name=internal_checkers,json=internalCheckers,proto3" json:"internal_checkers,omitempty"` // User-supplied key/value data to be used for organizing and // identifying the `UptimeCheckConfig` objects. // // The field can contain up to 64 entries. Each key and value is limited to // 63 Unicode characters or 128 bytes, whichever is smaller. Labels and // values can contain only lowercase letters, numerals, underscores, and // dashes. Keys must begin with a letter. UserLabels map[string]string `protobuf:"bytes,20,rep,name=user_labels,json=userLabels,proto3" json:"user_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *UptimeCheckConfig) Reset() { *x = UptimeCheckConfig{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig) ProtoMessage() {} func (x *UptimeCheckConfig) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2} } func (x *UptimeCheckConfig) GetName() string { if x != nil { return x.Name } return "" } func (x *UptimeCheckConfig) GetDisplayName() string { if x != nil { return x.DisplayName } return "" } func (m *UptimeCheckConfig) GetResource() isUptimeCheckConfig_Resource { if m != nil { return m.Resource } return nil } func (x *UptimeCheckConfig) GetMonitoredResource() *monitoredres.MonitoredResource { if x, ok := x.GetResource().(*UptimeCheckConfig_MonitoredResource); ok { return x.MonitoredResource } return nil } func (x *UptimeCheckConfig) GetResourceGroup() *UptimeCheckConfig_ResourceGroup { if x, ok := x.GetResource().(*UptimeCheckConfig_ResourceGroup_); ok { return x.ResourceGroup } return nil } func (x *UptimeCheckConfig) GetSyntheticMonitor() *SyntheticMonitorTarget { if x, ok := x.GetResource().(*UptimeCheckConfig_SyntheticMonitor); ok { return x.SyntheticMonitor } return nil } func (m *UptimeCheckConfig) GetCheckRequestType() isUptimeCheckConfig_CheckRequestType { if m != nil { return m.CheckRequestType } return nil } func (x *UptimeCheckConfig) GetHttpCheck() *UptimeCheckConfig_HttpCheck { if x, ok := x.GetCheckRequestType().(*UptimeCheckConfig_HttpCheck_); ok { return x.HttpCheck } return nil } func (x *UptimeCheckConfig) GetTcpCheck() *UptimeCheckConfig_TcpCheck { if x, ok := x.GetCheckRequestType().(*UptimeCheckConfig_TcpCheck_); ok { return x.TcpCheck } return nil } func (x *UptimeCheckConfig) GetPeriod() *durationpb.Duration { if x != nil { return x.Period } return nil } func (x *UptimeCheckConfig) GetTimeout() *durationpb.Duration { if x != nil { return x.Timeout } return nil } func (x *UptimeCheckConfig) GetContentMatchers() []*UptimeCheckConfig_ContentMatcher { if x != nil { return x.ContentMatchers } return nil } func (x *UptimeCheckConfig) GetCheckerType() UptimeCheckConfig_CheckerType { if x != nil { return x.CheckerType } return UptimeCheckConfig_CHECKER_TYPE_UNSPECIFIED } func (x *UptimeCheckConfig) GetSelectedRegions() []UptimeCheckRegion { if x != nil { return x.SelectedRegions } return nil } // Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto. func (x *UptimeCheckConfig) GetIsInternal() bool { if x != nil { return x.IsInternal } return false } // Deprecated: Marked as deprecated in google/monitoring/v3/uptime.proto. func (x *UptimeCheckConfig) GetInternalCheckers() []*InternalChecker { if x != nil { return x.InternalCheckers } return nil } func (x *UptimeCheckConfig) GetUserLabels() map[string]string { if x != nil { return x.UserLabels } return nil } type isUptimeCheckConfig_Resource interface { isUptimeCheckConfig_Resource() } type UptimeCheckConfig_MonitoredResource struct { // The [monitored // resource](https://cloud.google.com/monitoring/api/resources) associated // with the configuration. // The following monitored resource types are valid for this field: // // `uptime_url`, // `gce_instance`, // `gae_app`, // `aws_ec2_instance`, // `aws_elb_load_balancer` // `k8s_service` // `servicedirectory_service` // `cloud_run_revision` MonitoredResource *monitoredres.MonitoredResource `protobuf:"bytes,3,opt,name=monitored_resource,json=monitoredResource,proto3,oneof"` } type UptimeCheckConfig_ResourceGroup_ struct { // The group resource associated with the configuration. ResourceGroup *UptimeCheckConfig_ResourceGroup `protobuf:"bytes,4,opt,name=resource_group,json=resourceGroup,proto3,oneof"` } type UptimeCheckConfig_SyntheticMonitor struct { // Specifies a Synthetic Monitor to invoke. SyntheticMonitor *SyntheticMonitorTarget `protobuf:"bytes,21,opt,name=synthetic_monitor,json=syntheticMonitor,proto3,oneof"` } func (*UptimeCheckConfig_MonitoredResource) isUptimeCheckConfig_Resource() {} func (*UptimeCheckConfig_ResourceGroup_) isUptimeCheckConfig_Resource() {} func (*UptimeCheckConfig_SyntheticMonitor) isUptimeCheckConfig_Resource() {} type isUptimeCheckConfig_CheckRequestType interface { isUptimeCheckConfig_CheckRequestType() } type UptimeCheckConfig_HttpCheck_ struct { // Contains information needed to make an HTTP or HTTPS check. HttpCheck *UptimeCheckConfig_HttpCheck `protobuf:"bytes,5,opt,name=http_check,json=httpCheck,proto3,oneof"` } type UptimeCheckConfig_TcpCheck_ struct { // Contains information needed to make a TCP check. TcpCheck *UptimeCheckConfig_TcpCheck `protobuf:"bytes,6,opt,name=tcp_check,json=tcpCheck,proto3,oneof"` } func (*UptimeCheckConfig_HttpCheck_) isUptimeCheckConfig_CheckRequestType() {} func (*UptimeCheckConfig_TcpCheck_) isUptimeCheckConfig_CheckRequestType() {} // Contains the region, location, and list of IP // addresses where checkers in the location run from. type UptimeCheckIp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A broad region category in which the IP address is located. Region UptimeCheckRegion `protobuf:"varint,1,opt,name=region,proto3,enum=google.monitoring.v3.UptimeCheckRegion" json:"region,omitempty"` // A more specific location within the region that typically encodes // a particular city/town/metro (and its containing state/province or country) // within the broader umbrella region category. Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` // The IP address from which the Uptime check originates. This is a fully // specified IP address (not an IP address range). Most IP addresses, as of // this publication, are in IPv4 format; however, one should not rely on the // IP addresses being in IPv4 format indefinitely, and should support // interpreting this field in either IPv4 or IPv6 format. IpAddress string `protobuf:"bytes,3,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` } func (x *UptimeCheckIp) Reset() { *x = UptimeCheckIp{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckIp) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckIp) ProtoMessage() {} func (x *UptimeCheckIp) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckIp.ProtoReflect.Descriptor instead. func (*UptimeCheckIp) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{3} } func (x *UptimeCheckIp) GetRegion() UptimeCheckRegion { if x != nil { return x.Region } return UptimeCheckRegion_REGION_UNSPECIFIED } func (x *UptimeCheckIp) GetLocation() string { if x != nil { return x.Location } return "" } func (x *UptimeCheckIp) GetIpAddress() string { if x != nil { return x.IpAddress } return "" } // A Synthetic Monitor deployed to a Cloud Functions V2 instance. type SyntheticMonitorTarget_CloudFunctionV2Target struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Fully qualified GCFv2 resource name // i.e. `projects/{project}/locations/{location}/functions/{function}` // Required. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Output only. The `cloud_run_revision` Monitored Resource associated with // the GCFv2. The Synthetic Monitor execution results (metrics, logs, and // spans) are reported against this Monitored Resource. This field is output // only. CloudRunRevision *monitoredres.MonitoredResource `protobuf:"bytes,2,opt,name=cloud_run_revision,json=cloudRunRevision,proto3" json:"cloud_run_revision,omitempty"` } func (x *SyntheticMonitorTarget_CloudFunctionV2Target) Reset() { *x = SyntheticMonitorTarget_CloudFunctionV2Target{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *SyntheticMonitorTarget_CloudFunctionV2Target) String() string { return protoimpl.X.MessageStringOf(x) } func (*SyntheticMonitorTarget_CloudFunctionV2Target) ProtoMessage() {} func (x *SyntheticMonitorTarget_CloudFunctionV2Target) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SyntheticMonitorTarget_CloudFunctionV2Target.ProtoReflect.Descriptor instead. func (*SyntheticMonitorTarget_CloudFunctionV2Target) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{1, 0} } func (x *SyntheticMonitorTarget_CloudFunctionV2Target) GetName() string { if x != nil { return x.Name } return "" } func (x *SyntheticMonitorTarget_CloudFunctionV2Target) GetCloudRunRevision() *monitoredres.MonitoredResource { if x != nil { return x.CloudRunRevision } return nil } // The resource submessage for group checks. It can be used instead of a // monitored resource, when multiple resources are being monitored. type UptimeCheckConfig_ResourceGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The group of resources being monitored. Should be only the `[GROUP_ID]`, // and not the full-path // `projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID]`. GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The resource type of the group members. ResourceType GroupResourceType `protobuf:"varint,2,opt,name=resource_type,json=resourceType,proto3,enum=google.monitoring.v3.GroupResourceType" json:"resource_type,omitempty"` } func (x *UptimeCheckConfig_ResourceGroup) Reset() { *x = UptimeCheckConfig_ResourceGroup{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_ResourceGroup) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_ResourceGroup) ProtoMessage() {} func (x *UptimeCheckConfig_ResourceGroup) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_ResourceGroup.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_ResourceGroup) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 0} } func (x *UptimeCheckConfig_ResourceGroup) GetGroupId() string { if x != nil { return x.GroupId } return "" } func (x *UptimeCheckConfig_ResourceGroup) GetResourceType() GroupResourceType { if x != nil { return x.ResourceType } return GroupResourceType_RESOURCE_TYPE_UNSPECIFIED } // Information involved in sending ICMP pings alongside public HTTP/TCP // checks. For HTTP, the pings are performed for each part of the redirect // chain. type UptimeCheckConfig_PingConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Number of ICMP pings. A maximum of 3 ICMP pings is currently supported. PingsCount int32 `protobuf:"varint,1,opt,name=pings_count,json=pingsCount,proto3" json:"pings_count,omitempty"` } func (x *UptimeCheckConfig_PingConfig) Reset() { *x = UptimeCheckConfig_PingConfig{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_PingConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_PingConfig) ProtoMessage() {} func (x *UptimeCheckConfig_PingConfig) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_PingConfig.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_PingConfig) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 1} } func (x *UptimeCheckConfig_PingConfig) GetPingsCount() int32 { if x != nil { return x.PingsCount } return 0 } // Information involved in an HTTP/HTTPS Uptime check request. type UptimeCheckConfig_HttpCheck struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The HTTP request method to use for the check. If set to // `METHOD_UNSPECIFIED` then `request_method` defaults to `GET`. RequestMethod UptimeCheckConfig_HttpCheck_RequestMethod `protobuf:"varint,8,opt,name=request_method,json=requestMethod,proto3,enum=google.monitoring.v3.UptimeCheckConfig_HttpCheck_RequestMethod" json:"request_method,omitempty"` // If `true`, use HTTPS instead of HTTP to run the check. UseSsl bool `protobuf:"varint,1,opt,name=use_ssl,json=useSsl,proto3" json:"use_ssl,omitempty"` // Optional (defaults to "/"). The path to the page against which to run // the check. Will be combined with the `host` (specified within the // `monitored_resource`) and `port` to construct the full URL. If the // provided path does not begin with "/", a "/" will be prepended // automatically. Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Optional (defaults to 80 when `use_ssl` is `false`, and 443 when // `use_ssl` is `true`). The TCP port on the HTTP server against which to // run the check. Will be combined with host (specified within the // `monitored_resource`) and `path` to construct the full URL. Port int32 `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"` // The authentication information. Optional when creating an HTTP check; // defaults to empty. // Do not set both `auth_method` and `auth_info`. AuthInfo *UptimeCheckConfig_HttpCheck_BasicAuthentication `protobuf:"bytes,4,opt,name=auth_info,json=authInfo,proto3" json:"auth_info,omitempty"` // Boolean specifying whether to encrypt the header information. // Encryption should be specified for any headers related to authentication // that you do not wish to be seen when retrieving the configuration. The // server will be responsible for encrypting the headers. // On Get/List calls, if `mask_headers` is set to `true` then the headers // will be obscured with `******.` MaskHeaders bool `protobuf:"varint,5,opt,name=mask_headers,json=maskHeaders,proto3" json:"mask_headers,omitempty"` // The list of headers to send as part of the Uptime check request. // If two headers have the same key and different values, they should // be entered as a single header, with the value being a comma-separated // list of all the desired values as described at // https://www.w3.org/Protocols/rfc2616/rfc2616.txt (page 31). // Entering two separate headers with the same key in a Create call will // cause the first to be overwritten by the second. // The maximum number of headers allowed is 100. Headers map[string]string `protobuf:"bytes,6,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The content type header to use for the check. The following // configurations result in errors: // 1. Content type is specified in both the `headers` field and the // `content_type` field. // 2. Request method is `GET` and `content_type` is not `TYPE_UNSPECIFIED` // 3. Request method is `POST` and `content_type` is `TYPE_UNSPECIFIED`. // 4. Request method is `POST` and a "Content-Type" header is provided via // `headers` field. The `content_type` field should be used instead. ContentType UptimeCheckConfig_HttpCheck_ContentType `protobuf:"varint,9,opt,name=content_type,json=contentType,proto3,enum=google.monitoring.v3.UptimeCheckConfig_HttpCheck_ContentType" json:"content_type,omitempty"` // A user provided content type header to use for the check. The invalid // configurations outlined in the `content_type` field apply to // `custom_content_type`, as well as the following: // 1. `content_type` is `URL_ENCODED` and `custom_content_type` is set. // 2. `content_type` is `USER_PROVIDED` and `custom_content_type` is not // set. CustomContentType string `protobuf:"bytes,13,opt,name=custom_content_type,json=customContentType,proto3" json:"custom_content_type,omitempty"` // Boolean specifying whether to include SSL certificate validation as a // part of the Uptime check. Only applies to checks where // `monitored_resource` is set to `uptime_url`. If `use_ssl` is `false`, // setting `validate_ssl` to `true` has no effect. ValidateSsl bool `protobuf:"varint,7,opt,name=validate_ssl,json=validateSsl,proto3" json:"validate_ssl,omitempty"` // The request body associated with the HTTP POST request. If `content_type` // is `URL_ENCODED`, the body passed in must be URL-encoded. Users can // provide a `Content-Length` header via the `headers` field or the API will // do so. If the `request_method` is `GET` and `body` is not empty, the API // will return an error. The maximum byte size is 1 megabyte. // // Note: If client libraries aren't used (which performs the conversion // automatically) base64 encode your `body` data since the field is of // `bytes` type. Body []byte `protobuf:"bytes,10,opt,name=body,proto3" json:"body,omitempty"` // If present, the check will only pass if the HTTP response status code is // in this set of status codes. If empty, the HTTP status code will only // pass if the HTTP status code is 200-299. AcceptedResponseStatusCodes []*UptimeCheckConfig_HttpCheck_ResponseStatusCode `protobuf:"bytes,11,rep,name=accepted_response_status_codes,json=acceptedResponseStatusCodes,proto3" json:"accepted_response_status_codes,omitempty"` // Contains information needed to add pings to an HTTP check. PingConfig *UptimeCheckConfig_PingConfig `protobuf:"bytes,12,opt,name=ping_config,json=pingConfig,proto3" json:"ping_config,omitempty"` // This field is optional and should be set only by users interested in // an authenticated uptime check. // Do not set both `auth_method` and `auth_info`. // // Types that are assignable to AuthMethod: // // *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ AuthMethod isUptimeCheckConfig_HttpCheck_AuthMethod `protobuf_oneof:"auth_method"` } func (x *UptimeCheckConfig_HttpCheck) Reset() { *x = UptimeCheckConfig_HttpCheck{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_HttpCheck) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_HttpCheck) ProtoMessage() {} func (x *UptimeCheckConfig_HttpCheck) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_HttpCheck.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_HttpCheck) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2} } func (x *UptimeCheckConfig_HttpCheck) GetRequestMethod() UptimeCheckConfig_HttpCheck_RequestMethod { if x != nil { return x.RequestMethod } return UptimeCheckConfig_HttpCheck_METHOD_UNSPECIFIED } func (x *UptimeCheckConfig_HttpCheck) GetUseSsl() bool { if x != nil { return x.UseSsl } return false } func (x *UptimeCheckConfig_HttpCheck) GetPath() string { if x != nil { return x.Path } return "" } func (x *UptimeCheckConfig_HttpCheck) GetPort() int32 { if x != nil { return x.Port } return 0 } func (x *UptimeCheckConfig_HttpCheck) GetAuthInfo() *UptimeCheckConfig_HttpCheck_BasicAuthentication { if x != nil { return x.AuthInfo } return nil } func (x *UptimeCheckConfig_HttpCheck) GetMaskHeaders() bool { if x != nil { return x.MaskHeaders } return false } func (x *UptimeCheckConfig_HttpCheck) GetHeaders() map[string]string { if x != nil { return x.Headers } return nil } func (x *UptimeCheckConfig_HttpCheck) GetContentType() UptimeCheckConfig_HttpCheck_ContentType { if x != nil { return x.ContentType } return UptimeCheckConfig_HttpCheck_TYPE_UNSPECIFIED } func (x *UptimeCheckConfig_HttpCheck) GetCustomContentType() string { if x != nil { return x.CustomContentType } return "" } func (x *UptimeCheckConfig_HttpCheck) GetValidateSsl() bool { if x != nil { return x.ValidateSsl } return false } func (x *UptimeCheckConfig_HttpCheck) GetBody() []byte { if x != nil { return x.Body } return nil } func (x *UptimeCheckConfig_HttpCheck) GetAcceptedResponseStatusCodes() []*UptimeCheckConfig_HttpCheck_ResponseStatusCode { if x != nil { return x.AcceptedResponseStatusCodes } return nil } func (x *UptimeCheckConfig_HttpCheck) GetPingConfig() *UptimeCheckConfig_PingConfig { if x != nil { return x.PingConfig } return nil } func (m *UptimeCheckConfig_HttpCheck) GetAuthMethod() isUptimeCheckConfig_HttpCheck_AuthMethod { if m != nil { return m.AuthMethod } return nil } func (x *UptimeCheckConfig_HttpCheck) GetServiceAgentAuthentication() *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication { if x, ok := x.GetAuthMethod().(*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_); ok { return x.ServiceAgentAuthentication } return nil } type isUptimeCheckConfig_HttpCheck_AuthMethod interface { isUptimeCheckConfig_HttpCheck_AuthMethod() } type UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ struct { // If specified, Uptime will generate and attach an OIDC JWT token for the // Monitoring service agent service account as an `Authorization` header // in the HTTP request when probing. ServiceAgentAuthentication *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication `protobuf:"bytes,14,opt,name=service_agent_authentication,json=serviceAgentAuthentication,proto3,oneof"` } func (*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_) isUptimeCheckConfig_HttpCheck_AuthMethod() { } // Information required for a TCP Uptime check request. type UptimeCheckConfig_TcpCheck struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The TCP port on the server against which to run the check. Will be // combined with host (specified within the `monitored_resource`) to // construct the full URL. Required. Port int32 `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"` // Contains information needed to add pings to a TCP check. PingConfig *UptimeCheckConfig_PingConfig `protobuf:"bytes,2,opt,name=ping_config,json=pingConfig,proto3" json:"ping_config,omitempty"` } func (x *UptimeCheckConfig_TcpCheck) Reset() { *x = UptimeCheckConfig_TcpCheck{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_TcpCheck) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_TcpCheck) ProtoMessage() {} func (x *UptimeCheckConfig_TcpCheck) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_TcpCheck.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_TcpCheck) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 3} } func (x *UptimeCheckConfig_TcpCheck) GetPort() int32 { if x != nil { return x.Port } return 0 } func (x *UptimeCheckConfig_TcpCheck) GetPingConfig() *UptimeCheckConfig_PingConfig { if x != nil { return x.PingConfig } return nil } // Optional. Used to perform content matching. This allows matching based on // substrings and regular expressions, together with their negations. Only the // first 4 MB of an HTTP or HTTPS check's response (and the first // 1 MB of a TCP check's response) are examined for purposes of content // matching. type UptimeCheckConfig_ContentMatcher struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // String, regex or JSON content to match. Maximum 1024 bytes. An empty // `content` string indicates no content matching is to be performed. Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` // The type of content matcher that will be applied to the server output, // compared to the `content` string when the check is run. Matcher UptimeCheckConfig_ContentMatcher_ContentMatcherOption `protobuf:"varint,2,opt,name=matcher,proto3,enum=google.monitoring.v3.UptimeCheckConfig_ContentMatcher_ContentMatcherOption" json:"matcher,omitempty"` // Certain `ContentMatcherOption` types require additional information. // `MATCHES_JSON_PATH` or `NOT_MATCHES_JSON_PATH` require a // `JsonPathMatcher`; not used for other options. // // Types that are assignable to AdditionalMatcherInfo: // // *UptimeCheckConfig_ContentMatcher_JsonPathMatcher_ AdditionalMatcherInfo isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo `protobuf_oneof:"additional_matcher_info"` } func (x *UptimeCheckConfig_ContentMatcher) Reset() { *x = UptimeCheckConfig_ContentMatcher{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_ContentMatcher) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_ContentMatcher) ProtoMessage() {} func (x *UptimeCheckConfig_ContentMatcher) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_ContentMatcher.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_ContentMatcher) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 4} } func (x *UptimeCheckConfig_ContentMatcher) GetContent() string { if x != nil { return x.Content } return "" } func (x *UptimeCheckConfig_ContentMatcher) GetMatcher() UptimeCheckConfig_ContentMatcher_ContentMatcherOption { if x != nil { return x.Matcher } return UptimeCheckConfig_ContentMatcher_CONTENT_MATCHER_OPTION_UNSPECIFIED } func (m *UptimeCheckConfig_ContentMatcher) GetAdditionalMatcherInfo() isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo { if m != nil { return m.AdditionalMatcherInfo } return nil } func (x *UptimeCheckConfig_ContentMatcher) GetJsonPathMatcher() *UptimeCheckConfig_ContentMatcher_JsonPathMatcher { if x, ok := x.GetAdditionalMatcherInfo().(*UptimeCheckConfig_ContentMatcher_JsonPathMatcher_); ok { return x.JsonPathMatcher } return nil } type isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo interface { isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo() } type UptimeCheckConfig_ContentMatcher_JsonPathMatcher_ struct { // Matcher information for `MATCHES_JSON_PATH` and `NOT_MATCHES_JSON_PATH` JsonPathMatcher *UptimeCheckConfig_ContentMatcher_JsonPathMatcher `protobuf:"bytes,3,opt,name=json_path_matcher,json=jsonPathMatcher,proto3,oneof"` } func (*UptimeCheckConfig_ContentMatcher_JsonPathMatcher_) isUptimeCheckConfig_ContentMatcher_AdditionalMatcherInfo() { } // The authentication parameters to provide to the specified resource or // URL that requires a username and password. Currently, only // [Basic HTTP authentication](https://tools.ietf.org/html/rfc7617) is // supported in Uptime checks. type UptimeCheckConfig_HttpCheck_BasicAuthentication struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The username to use when authenticating with the HTTP server. Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // The password to use when authenticating with the HTTP server. Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` } func (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) Reset() { *x = UptimeCheckConfig_HttpCheck_BasicAuthentication{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_HttpCheck_BasicAuthentication) ProtoMessage() {} func (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_HttpCheck_BasicAuthentication.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_HttpCheck_BasicAuthentication) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 0} } func (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) GetUsername() string { if x != nil { return x.Username } return "" } func (x *UptimeCheckConfig_HttpCheck_BasicAuthentication) GetPassword() string { if x != nil { return x.Password } return "" } // A status to accept. Either a status code class like "2xx", or an integer // status code like "200". type UptimeCheckConfig_HttpCheck_ResponseStatusCode struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Either a specific value or a class of status codes. // // Types that are assignable to StatusCode: // // *UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue // *UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_ StatusCode isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode `protobuf_oneof:"status_code"` } func (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) Reset() { *x = UptimeCheckConfig_HttpCheck_ResponseStatusCode{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_HttpCheck_ResponseStatusCode) ProtoMessage() {} func (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_HttpCheck_ResponseStatusCode.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_HttpCheck_ResponseStatusCode) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 1} } func (m *UptimeCheckConfig_HttpCheck_ResponseStatusCode) GetStatusCode() isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode { if m != nil { return m.StatusCode } return nil } func (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) GetStatusValue() int32 { if x, ok := x.GetStatusCode().(*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue); ok { return x.StatusValue } return 0 } func (x *UptimeCheckConfig_HttpCheck_ResponseStatusCode) GetStatusClass() UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass { if x, ok := x.GetStatusCode().(*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_); ok { return x.StatusClass } return UptimeCheckConfig_HttpCheck_ResponseStatusCode_STATUS_CLASS_UNSPECIFIED } type isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode interface { isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode() } type UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue struct { // A status code to accept. StatusValue int32 `protobuf:"varint,1,opt,name=status_value,json=statusValue,proto3,oneof"` } type UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_ struct { // A class of status codes to accept. StatusClass UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass `protobuf:"varint,2,opt,name=status_class,json=statusClass,proto3,enum=google.monitoring.v3.UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass,oneof"` } func (*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue) isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode() { } func (*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_) isUptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusCode() { } // Contains information needed for generating either an // [OpenID Connect // token](https://developers.google.com/identity/protocols/OpenIDConnect) or // [OAuth token](https://developers.google.com/identity/protocols/oauth2). // The token will be generated for the Monitoring service agent service // account. type UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Type of authentication. Type UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType `protobuf:"varint,1,opt,name=type,proto3,enum=google.monitoring.v3.UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType" json:"type,omitempty"` } func (x *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) Reset() { *x = UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) ProtoMessage() {} func (x *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 2, 2} } func (x *UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication) GetType() UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType { if x != nil { return x.Type } return UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_SERVICE_AGENT_AUTHENTICATION_TYPE_UNSPECIFIED } // Information needed to perform a JSONPath content match. // Used for `ContentMatcherOption::MATCHES_JSON_PATH` and // `ContentMatcherOption::NOT_MATCHES_JSON_PATH`. type UptimeCheckConfig_ContentMatcher_JsonPathMatcher struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // JSONPath within the response output pointing to the expected // `ContentMatcher::content` to match against. JsonPath string `protobuf:"bytes,1,opt,name=json_path,json=jsonPath,proto3" json:"json_path,omitempty"` // The type of JSONPath match that will be applied to the JSON output // (`ContentMatcher.content`) JsonMatcher UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption `protobuf:"varint,2,opt,name=json_matcher,json=jsonMatcher,proto3,enum=google.monitoring.v3.UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption" json:"json_matcher,omitempty"` } func (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) Reset() { *x = UptimeCheckConfig_ContentMatcher_JsonPathMatcher{} mi := &file_google_monitoring_v3_uptime_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) String() string { return protoimpl.X.MessageStringOf(x) } func (*UptimeCheckConfig_ContentMatcher_JsonPathMatcher) ProtoMessage() {} func (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UptimeCheckConfig_ContentMatcher_JsonPathMatcher.ProtoReflect.Descriptor instead. func (*UptimeCheckConfig_ContentMatcher_JsonPathMatcher) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_proto_rawDescGZIP(), []int{2, 4, 0} } func (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) GetJsonPath() string { if x != nil { return x.JsonPath } return "" } func (x *UptimeCheckConfig_ContentMatcher_JsonPathMatcher) GetJsonMatcher() UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption { if x != nil { return x.JsonMatcher } return UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JSON_PATH_MATCHER_OPTION_UNSPECIFIED } var File_google_monitoring_v3_uptime_proto protoreflect.FileDescriptor var file_google_monitoring_v3_uptime_proto_rawDesc = []byte{ 0x0a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x63, 0x70, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x63, 0x70, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x65, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x33, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xc4, 0x02, 0x0a, 0x16, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x70, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x32, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x1a, 0xad, 0x01, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x42, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2e, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x28, 0x0a, 0x26, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x10, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x94, 0x23, 0x0a, 0x11, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x12, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5b, 0x0a, 0x11, 0x73, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x10, 0x73, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x52, 0x0a, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x01, 0x52, 0x09, 0x68, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x4f, 0x0a, 0x09, 0x74, 0x63, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x63, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x48, 0x01, 0x52, 0x08, 0x74, 0x63, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x31, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x0c, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x69, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x56, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x78, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x2d, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xef, 0x0e, 0x0a, 0x09, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x66, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x73, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, 0x73, 0x65, 0x53, 0x73, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x62, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x73, 0x6b, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x61, 0x73, 0x6b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x60, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x73, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x73, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x89, 0x01, 0x0a, 0x1e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x1b, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x90, 0x01, 0x0a, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x4d, 0x0a, 0x13, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0xf6, 0x02, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x75, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x50, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x31, 0x58, 0x58, 0x10, 0x64, 0x12, 0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x32, 0x58, 0x58, 0x10, 0xc8, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x33, 0x58, 0x58, 0x10, 0xac, 0x02, 0x12, 0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x34, 0x58, 0x58, 0x10, 0x90, 0x03, 0x12, 0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x35, 0x58, 0x58, 0x10, 0xf4, 0x03, 0x12, 0x15, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x41, 0x4e, 0x59, 0x10, 0xe8, 0x07, 0x42, 0x0d, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x1a, 0x82, 0x02, 0x0a, 0x1a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x6b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x63, 0x0a, 0x1e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x31, 0x0a, 0x2d, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x49, 0x44, 0x43, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x22, 0x47, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x52, 0x4c, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x10, 0x02, 0x42, 0x0d, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x1a, 0x73, 0x0a, 0x08, 0x54, 0x63, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x53, 0x0a, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x84, 0x06, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x65, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x74, 0x0a, 0x11, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x1a, 0x94, 0x02, 0x0a, 0x0f, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x12, 0x7f, 0x0a, 0x0c, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x22, 0x63, 0x0a, 0x15, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x24, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x58, 0x41, 0x43, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x47, 0x45, 0x58, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x02, 0x22, 0xc8, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x4f, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x47, 0x45, 0x58, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x47, 0x45, 0x58, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x45, 0x53, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x10, 0x06, 0x42, 0x19, 0x0a, 0x17, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x55, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x45, 0x52, 0x53, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x50, 0x43, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x45, 0x52, 0x53, 0x10, 0x03, 0x3a, 0xf3, 0x01, 0xea, 0x41, 0xef, 0x01, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x7d, 0x12, 0x45, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x7d, 0x12, 0x39, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x7d, 0x12, 0x01, 0x2a, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x12, 0x3f, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2a, 0x95, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x47, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x53, 0x41, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x55, 0x52, 0x4f, 0x50, 0x45, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x55, 0x54, 0x48, 0x5f, 0x41, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x41, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x53, 0x49, 0x41, 0x5f, 0x50, 0x41, 0x43, 0x49, 0x46, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x53, 0x41, 0x5f, 0x4f, 0x52, 0x45, 0x47, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x41, 0x5f, 0x49, 0x4f, 0x57, 0x41, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x53, 0x41, 0x5f, 0x56, 0x49, 0x52, 0x47, 0x49, 0x4e, 0x49, 0x41, 0x10, 0x07, 0x2a, 0x5b, 0x0a, 0x11, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x57, 0x53, 0x5f, 0x45, 0x4c, 0x42, 0x5f, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x52, 0x10, 0x02, 0x42, 0xaf, 0x02, 0xea, 0x41, 0x66, 0x0a, 0x26, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_uptime_proto_rawDescOnce sync.Once file_google_monitoring_v3_uptime_proto_rawDescData = file_google_monitoring_v3_uptime_proto_rawDesc ) func file_google_monitoring_v3_uptime_proto_rawDescGZIP() []byte { file_google_monitoring_v3_uptime_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_uptime_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_uptime_proto_rawDescData) }) return file_google_monitoring_v3_uptime_proto_rawDescData } var file_google_monitoring_v3_uptime_proto_enumTypes = make([]protoimpl.EnumInfo, 10) var file_google_monitoring_v3_uptime_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_google_monitoring_v3_uptime_proto_goTypes = []any{ (UptimeCheckRegion)(0), // 0: google.monitoring.v3.UptimeCheckRegion (GroupResourceType)(0), // 1: google.monitoring.v3.GroupResourceType (InternalChecker_State)(0), // 2: google.monitoring.v3.InternalChecker.State (UptimeCheckConfig_CheckerType)(0), // 3: google.monitoring.v3.UptimeCheckConfig.CheckerType (UptimeCheckConfig_HttpCheck_RequestMethod)(0), // 4: google.monitoring.v3.UptimeCheckConfig.HttpCheck.RequestMethod (UptimeCheckConfig_HttpCheck_ContentType)(0), // 5: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ContentType (UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass)(0), // 6: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode.StatusClass (UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_ServiceAgentAuthenticationType)(0), // 7: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication.ServiceAgentAuthenticationType (UptimeCheckConfig_ContentMatcher_ContentMatcherOption)(0), // 8: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.ContentMatcherOption (UptimeCheckConfig_ContentMatcher_JsonPathMatcher_JsonPathMatcherOption)(0), // 9: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher.JsonPathMatcherOption (*InternalChecker)(nil), // 10: google.monitoring.v3.InternalChecker (*SyntheticMonitorTarget)(nil), // 11: google.monitoring.v3.SyntheticMonitorTarget (*UptimeCheckConfig)(nil), // 12: google.monitoring.v3.UptimeCheckConfig (*UptimeCheckIp)(nil), // 13: google.monitoring.v3.UptimeCheckIp (*SyntheticMonitorTarget_CloudFunctionV2Target)(nil), // 14: google.monitoring.v3.SyntheticMonitorTarget.CloudFunctionV2Target (*UptimeCheckConfig_ResourceGroup)(nil), // 15: google.monitoring.v3.UptimeCheckConfig.ResourceGroup (*UptimeCheckConfig_PingConfig)(nil), // 16: google.monitoring.v3.UptimeCheckConfig.PingConfig (*UptimeCheckConfig_HttpCheck)(nil), // 17: google.monitoring.v3.UptimeCheckConfig.HttpCheck (*UptimeCheckConfig_TcpCheck)(nil), // 18: google.monitoring.v3.UptimeCheckConfig.TcpCheck (*UptimeCheckConfig_ContentMatcher)(nil), // 19: google.monitoring.v3.UptimeCheckConfig.ContentMatcher nil, // 20: google.monitoring.v3.UptimeCheckConfig.UserLabelsEntry (*UptimeCheckConfig_HttpCheck_BasicAuthentication)(nil), // 21: google.monitoring.v3.UptimeCheckConfig.HttpCheck.BasicAuthentication (*UptimeCheckConfig_HttpCheck_ResponseStatusCode)(nil), // 22: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode (*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication)(nil), // 23: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication nil, // 24: google.monitoring.v3.UptimeCheckConfig.HttpCheck.HeadersEntry (*UptimeCheckConfig_ContentMatcher_JsonPathMatcher)(nil), // 25: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher (*monitoredres.MonitoredResource)(nil), // 26: google.api.MonitoredResource (*durationpb.Duration)(nil), // 27: google.protobuf.Duration } var file_google_monitoring_v3_uptime_proto_depIdxs = []int32{ 2, // 0: google.monitoring.v3.InternalChecker.state:type_name -> google.monitoring.v3.InternalChecker.State 14, // 1: google.monitoring.v3.SyntheticMonitorTarget.cloud_function_v2:type_name -> google.monitoring.v3.SyntheticMonitorTarget.CloudFunctionV2Target 26, // 2: google.monitoring.v3.UptimeCheckConfig.monitored_resource:type_name -> google.api.MonitoredResource 15, // 3: google.monitoring.v3.UptimeCheckConfig.resource_group:type_name -> google.monitoring.v3.UptimeCheckConfig.ResourceGroup 11, // 4: google.monitoring.v3.UptimeCheckConfig.synthetic_monitor:type_name -> google.monitoring.v3.SyntheticMonitorTarget 17, // 5: google.monitoring.v3.UptimeCheckConfig.http_check:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck 18, // 6: google.monitoring.v3.UptimeCheckConfig.tcp_check:type_name -> google.monitoring.v3.UptimeCheckConfig.TcpCheck 27, // 7: google.monitoring.v3.UptimeCheckConfig.period:type_name -> google.protobuf.Duration 27, // 8: google.monitoring.v3.UptimeCheckConfig.timeout:type_name -> google.protobuf.Duration 19, // 9: google.monitoring.v3.UptimeCheckConfig.content_matchers:type_name -> google.monitoring.v3.UptimeCheckConfig.ContentMatcher 3, // 10: google.monitoring.v3.UptimeCheckConfig.checker_type:type_name -> google.monitoring.v3.UptimeCheckConfig.CheckerType 0, // 11: google.monitoring.v3.UptimeCheckConfig.selected_regions:type_name -> google.monitoring.v3.UptimeCheckRegion 10, // 12: google.monitoring.v3.UptimeCheckConfig.internal_checkers:type_name -> google.monitoring.v3.InternalChecker 20, // 13: google.monitoring.v3.UptimeCheckConfig.user_labels:type_name -> google.monitoring.v3.UptimeCheckConfig.UserLabelsEntry 0, // 14: google.monitoring.v3.UptimeCheckIp.region:type_name -> google.monitoring.v3.UptimeCheckRegion 26, // 15: google.monitoring.v3.SyntheticMonitorTarget.CloudFunctionV2Target.cloud_run_revision:type_name -> google.api.MonitoredResource 1, // 16: google.monitoring.v3.UptimeCheckConfig.ResourceGroup.resource_type:type_name -> google.monitoring.v3.GroupResourceType 4, // 17: google.monitoring.v3.UptimeCheckConfig.HttpCheck.request_method:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.RequestMethod 21, // 18: google.monitoring.v3.UptimeCheckConfig.HttpCheck.auth_info:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.BasicAuthentication 24, // 19: google.monitoring.v3.UptimeCheckConfig.HttpCheck.headers:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.HeadersEntry 5, // 20: google.monitoring.v3.UptimeCheckConfig.HttpCheck.content_type:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ContentType 22, // 21: google.monitoring.v3.UptimeCheckConfig.HttpCheck.accepted_response_status_codes:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode 16, // 22: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ping_config:type_name -> google.monitoring.v3.UptimeCheckConfig.PingConfig 23, // 23: google.monitoring.v3.UptimeCheckConfig.HttpCheck.service_agent_authentication:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication 16, // 24: google.monitoring.v3.UptimeCheckConfig.TcpCheck.ping_config:type_name -> google.monitoring.v3.UptimeCheckConfig.PingConfig 8, // 25: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.matcher:type_name -> google.monitoring.v3.UptimeCheckConfig.ContentMatcher.ContentMatcherOption 25, // 26: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.json_path_matcher:type_name -> google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher 6, // 27: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode.status_class:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ResponseStatusCode.StatusClass 7, // 28: google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication.type:type_name -> google.monitoring.v3.UptimeCheckConfig.HttpCheck.ServiceAgentAuthentication.ServiceAgentAuthenticationType 9, // 29: google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher.json_matcher:type_name -> google.monitoring.v3.UptimeCheckConfig.ContentMatcher.JsonPathMatcher.JsonPathMatcherOption 30, // [30:30] is the sub-list for method output_type 30, // [30:30] is the sub-list for method input_type 30, // [30:30] is the sub-list for extension type_name 30, // [30:30] is the sub-list for extension extendee 0, // [0:30] is the sub-list for field type_name } func init() { file_google_monitoring_v3_uptime_proto_init() } func file_google_monitoring_v3_uptime_proto_init() { if File_google_monitoring_v3_uptime_proto != nil { return } file_google_monitoring_v3_uptime_proto_msgTypes[1].OneofWrappers = []any{ (*SyntheticMonitorTarget_CloudFunctionV2)(nil), } file_google_monitoring_v3_uptime_proto_msgTypes[2].OneofWrappers = []any{ (*UptimeCheckConfig_MonitoredResource)(nil), (*UptimeCheckConfig_ResourceGroup_)(nil), (*UptimeCheckConfig_SyntheticMonitor)(nil), (*UptimeCheckConfig_HttpCheck_)(nil), (*UptimeCheckConfig_TcpCheck_)(nil), } file_google_monitoring_v3_uptime_proto_msgTypes[7].OneofWrappers = []any{ (*UptimeCheckConfig_HttpCheck_ServiceAgentAuthentication_)(nil), } file_google_monitoring_v3_uptime_proto_msgTypes[9].OneofWrappers = []any{ (*UptimeCheckConfig_ContentMatcher_JsonPathMatcher_)(nil), } file_google_monitoring_v3_uptime_proto_msgTypes[12].OneofWrappers = []any{ (*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusValue)(nil), (*UptimeCheckConfig_HttpCheck_ResponseStatusCode_StatusClass_)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_uptime_proto_rawDesc, NumEnums: 10, NumMessages: 16, NumExtensions: 0, NumServices: 0, }, GoTypes: file_google_monitoring_v3_uptime_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_uptime_proto_depIdxs, EnumInfos: file_google_monitoring_v3_uptime_proto_enumTypes, MessageInfos: file_google_monitoring_v3_uptime_proto_msgTypes, }.Build() File_google_monitoring_v3_uptime_proto = out.File file_google_monitoring_v3_uptime_proto_rawDesc = nil file_google_monitoring_v3_uptime_proto_goTypes = nil file_google_monitoring_v3_uptime_proto_depIdxs = nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/monitoringpb/uptime_service.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/monitoring/v3/uptime_service.proto package monitoringpb import ( context "context" reflect "reflect" sync "sync" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // The protocol for the `ListUptimeCheckConfigs` request. type ListUptimeCheckConfigsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) whose // Uptime check configurations are listed. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // If provided, this field specifies the criteria that must be met by // uptime checks to be included in the response. // // For more details, see [Filtering // syntax](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering#filter_syntax). Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` // The maximum number of results to return in a single response. The server // may further constrain the maximum number of results returned in a single // page. If the page_size is <=0, the server will decide the number of results // to be returned. PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `nextPageToken` value // returned by a previous call to this method. Using this field causes the // method to return more results from the previous method call. PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListUptimeCheckConfigsRequest) Reset() { *x = ListUptimeCheckConfigsRequest{} mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListUptimeCheckConfigsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListUptimeCheckConfigsRequest) ProtoMessage() {} func (x *ListUptimeCheckConfigsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListUptimeCheckConfigsRequest.ProtoReflect.Descriptor instead. func (*ListUptimeCheckConfigsRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{0} } func (x *ListUptimeCheckConfigsRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *ListUptimeCheckConfigsRequest) GetFilter() string { if x != nil { return x.Filter } return "" } func (x *ListUptimeCheckConfigsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListUptimeCheckConfigsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The protocol for the `ListUptimeCheckConfigs` response. type ListUptimeCheckConfigsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The returned Uptime check configurations. UptimeCheckConfigs []*UptimeCheckConfig `protobuf:"bytes,1,rep,name=uptime_check_configs,json=uptimeCheckConfigs,proto3" json:"uptime_check_configs,omitempty"` // This field represents the pagination token to retrieve the next page of // results. If the value is empty, it means no further results for the // request. To retrieve the next page of results, the value of the // next_page_token is passed to the subsequent List method call (in the // request message's page_token field). NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` // The total number of Uptime check configurations for the project, // irrespective of any pagination. TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` } func (x *ListUptimeCheckConfigsResponse) Reset() { *x = ListUptimeCheckConfigsResponse{} mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListUptimeCheckConfigsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListUptimeCheckConfigsResponse) ProtoMessage() {} func (x *ListUptimeCheckConfigsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListUptimeCheckConfigsResponse.ProtoReflect.Descriptor instead. func (*ListUptimeCheckConfigsResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{1} } func (x *ListUptimeCheckConfigsResponse) GetUptimeCheckConfigs() []*UptimeCheckConfig { if x != nil { return x.UptimeCheckConfigs } return nil } func (x *ListUptimeCheckConfigsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } func (x *ListUptimeCheckConfigsResponse) GetTotalSize() int32 { if x != nil { return x.TotalSize } return 0 } // The protocol for the `GetUptimeCheckConfig` request. type GetUptimeCheckConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The Uptime check configuration to retrieve. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/uptimeCheckConfigs/[UPTIME_CHECK_ID] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetUptimeCheckConfigRequest) Reset() { *x = GetUptimeCheckConfigRequest{} mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetUptimeCheckConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetUptimeCheckConfigRequest) ProtoMessage() {} func (x *GetUptimeCheckConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetUptimeCheckConfigRequest.ProtoReflect.Descriptor instead. func (*GetUptimeCheckConfigRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{2} } func (x *GetUptimeCheckConfigRequest) GetName() string { if x != nil { return x.Name } return "" } // The protocol for the `CreateUptimeCheckConfig` request. type CreateUptimeCheckConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The // [project](https://cloud.google.com/monitoring/api/v3#project_name) in which // to create the Uptime check. The format is: // // projects/[PROJECT_ID_OR_NUMBER] Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // Required. The new Uptime check configuration. UptimeCheckConfig *UptimeCheckConfig `protobuf:"bytes,2,opt,name=uptime_check_config,json=uptimeCheckConfig,proto3" json:"uptime_check_config,omitempty"` } func (x *CreateUptimeCheckConfigRequest) Reset() { *x = CreateUptimeCheckConfigRequest{} mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateUptimeCheckConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateUptimeCheckConfigRequest) ProtoMessage() {} func (x *CreateUptimeCheckConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateUptimeCheckConfigRequest.ProtoReflect.Descriptor instead. func (*CreateUptimeCheckConfigRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{3} } func (x *CreateUptimeCheckConfigRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *CreateUptimeCheckConfigRequest) GetUptimeCheckConfig() *UptimeCheckConfig { if x != nil { return x.UptimeCheckConfig } return nil } // The protocol for the `UpdateUptimeCheckConfig` request. type UpdateUptimeCheckConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Optional. If present, only the listed fields in the current Uptime check // configuration are updated with values from the new configuration. If this // field is empty, then the current configuration is completely replaced with // the new configuration. UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` // Required. If an `updateMask` has been specified, this field gives // the values for the set of fields mentioned in the `updateMask`. If an // `updateMask` has not been given, this Uptime check configuration replaces // the current configuration. If a field is mentioned in `updateMask` but // the corresponding field is omitted in this partial Uptime check // configuration, it has the effect of deleting/clearing the field from the // configuration on the server. // // The following fields can be updated: `display_name`, // `http_check`, `tcp_check`, `timeout`, `content_matchers`, and // `selected_regions`. UptimeCheckConfig *UptimeCheckConfig `protobuf:"bytes,3,opt,name=uptime_check_config,json=uptimeCheckConfig,proto3" json:"uptime_check_config,omitempty"` } func (x *UpdateUptimeCheckConfigRequest) Reset() { *x = UpdateUptimeCheckConfigRequest{} mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateUptimeCheckConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateUptimeCheckConfigRequest) ProtoMessage() {} func (x *UpdateUptimeCheckConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateUptimeCheckConfigRequest.ProtoReflect.Descriptor instead. func (*UpdateUptimeCheckConfigRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{4} } func (x *UpdateUptimeCheckConfigRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } func (x *UpdateUptimeCheckConfigRequest) GetUptimeCheckConfig() *UptimeCheckConfig { if x != nil { return x.UptimeCheckConfig } return nil } // The protocol for the `DeleteUptimeCheckConfig` request. type DeleteUptimeCheckConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The Uptime check configuration to delete. The format is: // // projects/[PROJECT_ID_OR_NUMBER]/uptimeCheckConfigs/[UPTIME_CHECK_ID] Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *DeleteUptimeCheckConfigRequest) Reset() { *x = DeleteUptimeCheckConfigRequest{} mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteUptimeCheckConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteUptimeCheckConfigRequest) ProtoMessage() {} func (x *DeleteUptimeCheckConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteUptimeCheckConfigRequest.ProtoReflect.Descriptor instead. func (*DeleteUptimeCheckConfigRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{5} } func (x *DeleteUptimeCheckConfigRequest) GetName() string { if x != nil { return x.Name } return "" } // The protocol for the `ListUptimeCheckIps` request. type ListUptimeCheckIpsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The maximum number of results to return in a single response. The server // may further constrain the maximum number of results returned in a single // page. If the page_size is <=0, the server will decide the number of results // to be returned. // NOTE: this field is not yet implemented PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // If this field is not empty then it must contain the `nextPageToken` value // returned by a previous call to this method. Using this field causes the // method to return more results from the previous method call. // NOTE: this field is not yet implemented PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } func (x *ListUptimeCheckIpsRequest) Reset() { *x = ListUptimeCheckIpsRequest{} mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListUptimeCheckIpsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListUptimeCheckIpsRequest) ProtoMessage() {} func (x *ListUptimeCheckIpsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListUptimeCheckIpsRequest.ProtoReflect.Descriptor instead. func (*ListUptimeCheckIpsRequest) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{6} } func (x *ListUptimeCheckIpsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListUptimeCheckIpsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } // The protocol for the `ListUptimeCheckIps` response. type ListUptimeCheckIpsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The returned list of IP addresses (including region and location) that the // checkers run from. UptimeCheckIps []*UptimeCheckIp `protobuf:"bytes,1,rep,name=uptime_check_ips,json=uptimeCheckIps,proto3" json:"uptime_check_ips,omitempty"` // This field represents the pagination token to retrieve the next page of // results. If the value is empty, it means no further results for the // request. To retrieve the next page of results, the value of the // next_page_token is passed to the subsequent List method call (in the // request message's page_token field). // NOTE: this field is not yet implemented NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListUptimeCheckIpsResponse) Reset() { *x = ListUptimeCheckIpsResponse{} mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListUptimeCheckIpsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListUptimeCheckIpsResponse) ProtoMessage() {} func (x *ListUptimeCheckIpsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_monitoring_v3_uptime_service_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListUptimeCheckIpsResponse.ProtoReflect.Descriptor instead. func (*ListUptimeCheckIpsResponse) Descriptor() ([]byte, []int) { return file_google_monitoring_v3_uptime_service_proto_rawDescGZIP(), []int{7} } func (x *ListUptimeCheckIpsResponse) GetUptimeCheckIps() []*UptimeCheckIp { if x != nil { return x.UptimeCheckIps } return nil } func (x *ListUptimeCheckIpsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } var File_google_monitoring_v3_uptime_service_proto protoreflect.FileDescriptor var file_google_monitoring_v3_uptime_service_proto_rawDesc = []byte{ 0x0a, 0x29, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc0, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2d, 0x12, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xc2, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x14, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x66, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2d, 0x12, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x11, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xbb, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x5c, 0x0a, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x11, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x69, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x57, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x10, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x52, 0x0e, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0xbd, 0x0a, 0x0a, 0x12, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xc0, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0xad, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x39, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xde, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x64, 0xda, 0x41, 0x1a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x3a, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0xeb, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x71, 0xda, 0x41, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x55, 0x3a, 0x13, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x32, 0x3e, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x2a, 0x2a, 0x2f, 0x76, 0x33, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x93, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x12, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x33, 0x2f, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x70, 0x73, 0x1a, 0xa9, 0x01, 0xca, 0x41, 0x19, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x89, 0x01, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x42, 0xcd, 0x01, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, 0x42, 0x12, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0x3b, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x62, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x33, 0xea, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_monitoring_v3_uptime_service_proto_rawDescOnce sync.Once file_google_monitoring_v3_uptime_service_proto_rawDescData = file_google_monitoring_v3_uptime_service_proto_rawDesc ) func file_google_monitoring_v3_uptime_service_proto_rawDescGZIP() []byte { file_google_monitoring_v3_uptime_service_proto_rawDescOnce.Do(func() { file_google_monitoring_v3_uptime_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_v3_uptime_service_proto_rawDescData) }) return file_google_monitoring_v3_uptime_service_proto_rawDescData } var file_google_monitoring_v3_uptime_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_google_monitoring_v3_uptime_service_proto_goTypes = []any{ (*ListUptimeCheckConfigsRequest)(nil), // 0: google.monitoring.v3.ListUptimeCheckConfigsRequest (*ListUptimeCheckConfigsResponse)(nil), // 1: google.monitoring.v3.ListUptimeCheckConfigsResponse (*GetUptimeCheckConfigRequest)(nil), // 2: google.monitoring.v3.GetUptimeCheckConfigRequest (*CreateUptimeCheckConfigRequest)(nil), // 3: google.monitoring.v3.CreateUptimeCheckConfigRequest (*UpdateUptimeCheckConfigRequest)(nil), // 4: google.monitoring.v3.UpdateUptimeCheckConfigRequest (*DeleteUptimeCheckConfigRequest)(nil), // 5: google.monitoring.v3.DeleteUptimeCheckConfigRequest (*ListUptimeCheckIpsRequest)(nil), // 6: google.monitoring.v3.ListUptimeCheckIpsRequest (*ListUptimeCheckIpsResponse)(nil), // 7: google.monitoring.v3.ListUptimeCheckIpsResponse (*UptimeCheckConfig)(nil), // 8: google.monitoring.v3.UptimeCheckConfig (*fieldmaskpb.FieldMask)(nil), // 9: google.protobuf.FieldMask (*UptimeCheckIp)(nil), // 10: google.monitoring.v3.UptimeCheckIp (*emptypb.Empty)(nil), // 11: google.protobuf.Empty } var file_google_monitoring_v3_uptime_service_proto_depIdxs = []int32{ 8, // 0: google.monitoring.v3.ListUptimeCheckConfigsResponse.uptime_check_configs:type_name -> google.monitoring.v3.UptimeCheckConfig 8, // 1: google.monitoring.v3.CreateUptimeCheckConfigRequest.uptime_check_config:type_name -> google.monitoring.v3.UptimeCheckConfig 9, // 2: google.monitoring.v3.UpdateUptimeCheckConfigRequest.update_mask:type_name -> google.protobuf.FieldMask 8, // 3: google.monitoring.v3.UpdateUptimeCheckConfigRequest.uptime_check_config:type_name -> google.monitoring.v3.UptimeCheckConfig 10, // 4: google.monitoring.v3.ListUptimeCheckIpsResponse.uptime_check_ips:type_name -> google.monitoring.v3.UptimeCheckIp 0, // 5: google.monitoring.v3.UptimeCheckService.ListUptimeCheckConfigs:input_type -> google.monitoring.v3.ListUptimeCheckConfigsRequest 2, // 6: google.monitoring.v3.UptimeCheckService.GetUptimeCheckConfig:input_type -> google.monitoring.v3.GetUptimeCheckConfigRequest 3, // 7: google.monitoring.v3.UptimeCheckService.CreateUptimeCheckConfig:input_type -> google.monitoring.v3.CreateUptimeCheckConfigRequest 4, // 8: google.monitoring.v3.UptimeCheckService.UpdateUptimeCheckConfig:input_type -> google.monitoring.v3.UpdateUptimeCheckConfigRequest 5, // 9: google.monitoring.v3.UptimeCheckService.DeleteUptimeCheckConfig:input_type -> google.monitoring.v3.DeleteUptimeCheckConfigRequest 6, // 10: google.monitoring.v3.UptimeCheckService.ListUptimeCheckIps:input_type -> google.monitoring.v3.ListUptimeCheckIpsRequest 1, // 11: google.monitoring.v3.UptimeCheckService.ListUptimeCheckConfigs:output_type -> google.monitoring.v3.ListUptimeCheckConfigsResponse 8, // 12: google.monitoring.v3.UptimeCheckService.GetUptimeCheckConfig:output_type -> google.monitoring.v3.UptimeCheckConfig 8, // 13: google.monitoring.v3.UptimeCheckService.CreateUptimeCheckConfig:output_type -> google.monitoring.v3.UptimeCheckConfig 8, // 14: google.monitoring.v3.UptimeCheckService.UpdateUptimeCheckConfig:output_type -> google.monitoring.v3.UptimeCheckConfig 11, // 15: google.monitoring.v3.UptimeCheckService.DeleteUptimeCheckConfig:output_type -> google.protobuf.Empty 7, // 16: google.monitoring.v3.UptimeCheckService.ListUptimeCheckIps:output_type -> google.monitoring.v3.ListUptimeCheckIpsResponse 11, // [11:17] is the sub-list for method output_type 5, // [5:11] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name 5, // [5:5] is the sub-list for extension extendee 0, // [0:5] is the sub-list for field type_name } func init() { file_google_monitoring_v3_uptime_service_proto_init() } func file_google_monitoring_v3_uptime_service_proto_init() { if File_google_monitoring_v3_uptime_service_proto != nil { return } file_google_monitoring_v3_uptime_proto_init() type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_monitoring_v3_uptime_service_proto_rawDesc, NumEnums: 0, NumMessages: 8, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_monitoring_v3_uptime_service_proto_goTypes, DependencyIndexes: file_google_monitoring_v3_uptime_service_proto_depIdxs, MessageInfos: file_google_monitoring_v3_uptime_service_proto_msgTypes, }.Build() File_google_monitoring_v3_uptime_service_proto = out.File file_google_monitoring_v3_uptime_service_proto_rawDesc = nil file_google_monitoring_v3_uptime_service_proto_goTypes = nil file_google_monitoring_v3_uptime_service_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // UptimeCheckServiceClient is the client API for UptimeCheckService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type UptimeCheckServiceClient interface { // Lists the existing valid Uptime check configurations for the project // (leaving out any invalid configurations). ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) // Gets a single Uptime check configuration. GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) // Creates a new Uptime check configuration. CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) // Updates an Uptime check configuration. You can either replace the entire // configuration with a new one or replace only certain fields in the current // configuration by specifying the fields to be updated via `updateMask`. // Returns the updated configuration. UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) // Deletes an Uptime check configuration. Note that this method will fail // if the Uptime check configuration is referenced by an alert policy or // other dependent configs that would be rendered invalid by the deletion. DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Returns the list of IP addresses that checkers run from. ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) } type uptimeCheckServiceClient struct { cc grpc.ClientConnInterface } func NewUptimeCheckServiceClient(cc grpc.ClientConnInterface) UptimeCheckServiceClient { return &uptimeCheckServiceClient{cc} } func (c *uptimeCheckServiceClient) ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) { out := new(ListUptimeCheckConfigsResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *uptimeCheckServiceClient) GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { out := new(UptimeCheckConfig) err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *uptimeCheckServiceClient) CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { out := new(UptimeCheckConfig) err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *uptimeCheckServiceClient) UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { out := new(UptimeCheckConfig) err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *uptimeCheckServiceClient) DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *uptimeCheckServiceClient) ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) { out := new(ListUptimeCheckIpsResponse) err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps", in, out, opts...) if err != nil { return nil, err } return out, nil } // UptimeCheckServiceServer is the server API for UptimeCheckService service. type UptimeCheckServiceServer interface { // Lists the existing valid Uptime check configurations for the project // (leaving out any invalid configurations). ListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) // Gets a single Uptime check configuration. GetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) // Creates a new Uptime check configuration. CreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) // Updates an Uptime check configuration. You can either replace the entire // configuration with a new one or replace only certain fields in the current // configuration by specifying the fields to be updated via `updateMask`. // Returns the updated configuration. UpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) // Deletes an Uptime check configuration. Note that this method will fail // if the Uptime check configuration is referenced by an alert policy or // other dependent configs that would be rendered invalid by the deletion. DeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*emptypb.Empty, error) // Returns the list of IP addresses that checkers run from. ListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) } // UnimplementedUptimeCheckServiceServer can be embedded to have forward compatible implementations. type UnimplementedUptimeCheckServiceServer struct { } func (*UnimplementedUptimeCheckServiceServer) ListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListUptimeCheckConfigs not implemented") } func (*UnimplementedUptimeCheckServiceServer) GetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { return nil, status.Errorf(codes.Unimplemented, "method GetUptimeCheckConfig not implemented") } func (*UnimplementedUptimeCheckServiceServer) CreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateUptimeCheckConfig not implemented") } func (*UnimplementedUptimeCheckServiceServer) UpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateUptimeCheckConfig not implemented") } func (*UnimplementedUptimeCheckServiceServer) DeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteUptimeCheckConfig not implemented") } func (*UnimplementedUptimeCheckServiceServer) ListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListUptimeCheckIps not implemented") } func RegisterUptimeCheckServiceServer(s *grpc.Server, srv UptimeCheckServiceServer) { s.RegisterService(&_UptimeCheckService_serviceDesc, srv) } func _UptimeCheckService_ListUptimeCheckConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListUptimeCheckConfigsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, req.(*ListUptimeCheckConfigsRequest)) } return interceptor(ctx, in, info, handler) } func _UptimeCheckService_GetUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetUptimeCheckConfigRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, req.(*GetUptimeCheckConfigRequest)) } return interceptor(ctx, in, info, handler) } func _UptimeCheckService_CreateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateUptimeCheckConfigRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, req.(*CreateUptimeCheckConfigRequest)) } return interceptor(ctx, in, info, handler) } func _UptimeCheckService_UpdateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateUptimeCheckConfigRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, req.(*UpdateUptimeCheckConfigRequest)) } return interceptor(ctx, in, info, handler) } func _UptimeCheckService_DeleteUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteUptimeCheckConfigRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, req.(*DeleteUptimeCheckConfigRequest)) } return interceptor(ctx, in, info, handler) } func _UptimeCheckService_ListUptimeCheckIps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListUptimeCheckIpsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, req.(*ListUptimeCheckIpsRequest)) } return interceptor(ctx, in, info, handler) } var _UptimeCheckService_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.monitoring.v3.UptimeCheckService", HandlerType: (*UptimeCheckServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "ListUptimeCheckConfigs", Handler: _UptimeCheckService_ListUptimeCheckConfigs_Handler, }, { MethodName: "GetUptimeCheckConfig", Handler: _UptimeCheckService_GetUptimeCheckConfig_Handler, }, { MethodName: "CreateUptimeCheckConfig", Handler: _UptimeCheckService_CreateUptimeCheckConfig_Handler, }, { MethodName: "UpdateUptimeCheckConfig", Handler: _UptimeCheckService_UpdateUptimeCheckConfig_Handler, }, { MethodName: "DeleteUptimeCheckConfig", Handler: _UptimeCheckService_DeleteUptimeCheckConfig_Handler, }, { MethodName: "ListUptimeCheckIps", Handler: _UptimeCheckService_ListUptimeCheckIps_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "google/monitoring/v3/uptime_service.proto", } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/notification_channel_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "fmt" "log/slog" "math" "net/url" "time" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/protobuf/proto" ) var newNotificationChannelClientHook clientHook // NotificationChannelCallOptions contains the retry settings for each method of NotificationChannelClient. type NotificationChannelCallOptions struct { ListNotificationChannelDescriptors []gax.CallOption GetNotificationChannelDescriptor []gax.CallOption ListNotificationChannels []gax.CallOption GetNotificationChannel []gax.CallOption CreateNotificationChannel []gax.CallOption UpdateNotificationChannel []gax.CallOption DeleteNotificationChannel []gax.CallOption SendNotificationChannelVerificationCode []gax.CallOption GetNotificationChannelVerificationCode []gax.CallOption VerifyNotificationChannel []gax.CallOption } func defaultNotificationChannelGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultNotificationChannelCallOptions() *NotificationChannelCallOptions { return &NotificationChannelCallOptions{ ListNotificationChannelDescriptors: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, GetNotificationChannelDescriptor: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, ListNotificationChannels: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, GetNotificationChannel: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, CreateNotificationChannel: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, UpdateNotificationChannel: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, DeleteNotificationChannel: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, SendNotificationChannelVerificationCode: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, GetNotificationChannelVerificationCode: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, VerifyNotificationChannel: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, } } // internalNotificationChannelClient is an interface that defines the methods available from Cloud Monitoring API. type internalNotificationChannelClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn ListNotificationChannelDescriptors(context.Context, *monitoringpb.ListNotificationChannelDescriptorsRequest, ...gax.CallOption) *NotificationChannelDescriptorIterator GetNotificationChannelDescriptor(context.Context, *monitoringpb.GetNotificationChannelDescriptorRequest, ...gax.CallOption) (*monitoringpb.NotificationChannelDescriptor, error) ListNotificationChannels(context.Context, *monitoringpb.ListNotificationChannelsRequest, ...gax.CallOption) *NotificationChannelIterator GetNotificationChannel(context.Context, *monitoringpb.GetNotificationChannelRequest, ...gax.CallOption) (*monitoringpb.NotificationChannel, error) CreateNotificationChannel(context.Context, *monitoringpb.CreateNotificationChannelRequest, ...gax.CallOption) (*monitoringpb.NotificationChannel, error) UpdateNotificationChannel(context.Context, *monitoringpb.UpdateNotificationChannelRequest, ...gax.CallOption) (*monitoringpb.NotificationChannel, error) DeleteNotificationChannel(context.Context, *monitoringpb.DeleteNotificationChannelRequest, ...gax.CallOption) error SendNotificationChannelVerificationCode(context.Context, *monitoringpb.SendNotificationChannelVerificationCodeRequest, ...gax.CallOption) error GetNotificationChannelVerificationCode(context.Context, *monitoringpb.GetNotificationChannelVerificationCodeRequest, ...gax.CallOption) (*monitoringpb.GetNotificationChannelVerificationCodeResponse, error) VerifyNotificationChannel(context.Context, *monitoringpb.VerifyNotificationChannelRequest, ...gax.CallOption) (*monitoringpb.NotificationChannel, error) } // NotificationChannelClient is a client for interacting with Cloud Monitoring API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // The Notification Channel API provides access to configuration that // controls how messages related to incidents are sent. type NotificationChannelClient struct { // The internal transport-dependent client. internalClient internalNotificationChannelClient // The call options for this service. CallOptions *NotificationChannelCallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *NotificationChannelClient) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *NotificationChannelClient) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *NotificationChannelClient) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // ListNotificationChannelDescriptors lists the descriptors for supported channel types. The use of descriptors // makes it possible for new channel types to be dynamically added. func (c *NotificationChannelClient) ListNotificationChannelDescriptors(ctx context.Context, req *monitoringpb.ListNotificationChannelDescriptorsRequest, opts ...gax.CallOption) *NotificationChannelDescriptorIterator { return c.internalClient.ListNotificationChannelDescriptors(ctx, req, opts...) } // GetNotificationChannelDescriptor gets a single channel descriptor. The descriptor indicates which fields // are expected / permitted for a notification channel of the given type. func (c *NotificationChannelClient) GetNotificationChannelDescriptor(ctx context.Context, req *monitoringpb.GetNotificationChannelDescriptorRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannelDescriptor, error) { return c.internalClient.GetNotificationChannelDescriptor(ctx, req, opts...) } // ListNotificationChannels lists the notification channels that have been created for the project. // To list the types of notification channels that are supported, use // the ListNotificationChannelDescriptors method. func (c *NotificationChannelClient) ListNotificationChannels(ctx context.Context, req *monitoringpb.ListNotificationChannelsRequest, opts ...gax.CallOption) *NotificationChannelIterator { return c.internalClient.ListNotificationChannels(ctx, req, opts...) } // GetNotificationChannel gets a single notification channel. The channel includes the relevant // configuration details with which the channel was created. However, the // response may truncate or omit passwords, API keys, or other private key // matter and thus the response may not be 100% identical to the information // that was supplied in the call to the create method. func (c *NotificationChannelClient) GetNotificationChannel(ctx context.Context, req *monitoringpb.GetNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { return c.internalClient.GetNotificationChannel(ctx, req, opts...) } // CreateNotificationChannel creates a new notification channel, representing a single notification // endpoint such as an email address, SMS number, or PagerDuty service. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. func (c *NotificationChannelClient) CreateNotificationChannel(ctx context.Context, req *monitoringpb.CreateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { return c.internalClient.CreateNotificationChannel(ctx, req, opts...) } // UpdateNotificationChannel updates a notification channel. Fields not specified in the field mask // remain unchanged. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. func (c *NotificationChannelClient) UpdateNotificationChannel(ctx context.Context, req *monitoringpb.UpdateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { return c.internalClient.UpdateNotificationChannel(ctx, req, opts...) } // DeleteNotificationChannel deletes a notification channel. // // Design your application to single-thread API calls that modify the state of // notification channels in a single project. This includes calls to // CreateNotificationChannel, DeleteNotificationChannel and // UpdateNotificationChannel. func (c *NotificationChannelClient) DeleteNotificationChannel(ctx context.Context, req *monitoringpb.DeleteNotificationChannelRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteNotificationChannel(ctx, req, opts...) } // SendNotificationChannelVerificationCode causes a verification code to be delivered to the channel. The code // can then be supplied in VerifyNotificationChannel to verify the channel. func (c *NotificationChannelClient) SendNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.SendNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) error { return c.internalClient.SendNotificationChannelVerificationCode(ctx, req, opts...) } // GetNotificationChannelVerificationCode requests a verification code for an already verified channel that can then // be used in a call to VerifyNotificationChannel() on a different channel // with an equivalent identity in the same or in a different project. This // makes it possible to copy a channel between projects without requiring // manual reverification of the channel. If the channel is not in the // verified state, this method will fail (in other words, this may only be // used if the SendNotificationChannelVerificationCode and // VerifyNotificationChannel paths have already been used to put the given // channel into the verified state). // // There is no guarantee that the verification codes returned by this method // will be of a similar structure or form as the ones that are delivered // to the channel via SendNotificationChannelVerificationCode; while // VerifyNotificationChannel() will recognize both the codes delivered via // SendNotificationChannelVerificationCode() and returned from // GetNotificationChannelVerificationCode(), it is typically the case that // the verification codes delivered via // SendNotificationChannelVerificationCode() will be shorter and also // have a shorter expiration (e.g. codes such as “G-123456”) whereas // GetVerificationCode() will typically return a much longer, websafe base // 64 encoded string that has a longer expiration time. func (c *NotificationChannelClient) GetNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.GetNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) (*monitoringpb.GetNotificationChannelVerificationCodeResponse, error) { return c.internalClient.GetNotificationChannelVerificationCode(ctx, req, opts...) } // VerifyNotificationChannel verifies a NotificationChannel by proving receipt of the code // delivered to the channel as a result of calling // SendNotificationChannelVerificationCode. func (c *NotificationChannelClient) VerifyNotificationChannel(ctx context.Context, req *monitoringpb.VerifyNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { return c.internalClient.VerifyNotificationChannel(ctx, req, opts...) } // notificationChannelGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type notificationChannelGRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing NotificationChannelClient CallOptions **NotificationChannelCallOptions // The gRPC API client. notificationChannelClient monitoringpb.NotificationChannelServiceClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewNotificationChannelClient creates a new notification channel service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // The Notification Channel API provides access to configuration that // controls how messages related to incidents are sent. func NewNotificationChannelClient(ctx context.Context, opts ...option.ClientOption) (*NotificationChannelClient, error) { clientOpts := defaultNotificationChannelGRPCClientOptions() if newNotificationChannelClientHook != nil { hookOpts, err := newNotificationChannelClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := NotificationChannelClient{CallOptions: defaultNotificationChannelCallOptions()} c := ¬ificationChannelGRPCClient{ connPool: connPool, notificationChannelClient: monitoringpb.NewNotificationChannelServiceClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *notificationChannelGRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *notificationChannelGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *notificationChannelGRPCClient) Close() error { return c.connPool.Close() } func (c *notificationChannelGRPCClient) ListNotificationChannelDescriptors(ctx context.Context, req *monitoringpb.ListNotificationChannelDescriptorsRequest, opts ...gax.CallOption) *NotificationChannelDescriptorIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListNotificationChannelDescriptors[0:len((*c.CallOptions).ListNotificationChannelDescriptors):len((*c.CallOptions).ListNotificationChannelDescriptors)], opts...) it := &NotificationChannelDescriptorIterator{} req = proto.Clone(req).(*monitoringpb.ListNotificationChannelDescriptorsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.NotificationChannelDescriptor, string, error) { resp := &monitoringpb.ListNotificationChannelDescriptorsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.notificationChannelClient.ListNotificationChannelDescriptors, req, settings.GRPC, c.logger, "ListNotificationChannelDescriptors") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetChannelDescriptors(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *notificationChannelGRPCClient) GetNotificationChannelDescriptor(ctx context.Context, req *monitoringpb.GetNotificationChannelDescriptorRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannelDescriptor, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetNotificationChannelDescriptor[0:len((*c.CallOptions).GetNotificationChannelDescriptor):len((*c.CallOptions).GetNotificationChannelDescriptor)], opts...) var resp *monitoringpb.NotificationChannelDescriptor err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.notificationChannelClient.GetNotificationChannelDescriptor, req, settings.GRPC, c.logger, "GetNotificationChannelDescriptor") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *notificationChannelGRPCClient) ListNotificationChannels(ctx context.Context, req *monitoringpb.ListNotificationChannelsRequest, opts ...gax.CallOption) *NotificationChannelIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListNotificationChannels[0:len((*c.CallOptions).ListNotificationChannels):len((*c.CallOptions).ListNotificationChannels)], opts...) it := &NotificationChannelIterator{} req = proto.Clone(req).(*monitoringpb.ListNotificationChannelsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.NotificationChannel, string, error) { resp := &monitoringpb.ListNotificationChannelsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.notificationChannelClient.ListNotificationChannels, req, settings.GRPC, c.logger, "ListNotificationChannels") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetNotificationChannels(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *notificationChannelGRPCClient) GetNotificationChannel(ctx context.Context, req *monitoringpb.GetNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetNotificationChannel[0:len((*c.CallOptions).GetNotificationChannel):len((*c.CallOptions).GetNotificationChannel)], opts...) var resp *monitoringpb.NotificationChannel err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.notificationChannelClient.GetNotificationChannel, req, settings.GRPC, c.logger, "GetNotificationChannel") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *notificationChannelGRPCClient) CreateNotificationChannel(ctx context.Context, req *monitoringpb.CreateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateNotificationChannel[0:len((*c.CallOptions).CreateNotificationChannel):len((*c.CallOptions).CreateNotificationChannel)], opts...) var resp *monitoringpb.NotificationChannel err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.notificationChannelClient.CreateNotificationChannel, req, settings.GRPC, c.logger, "CreateNotificationChannel") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *notificationChannelGRPCClient) UpdateNotificationChannel(ctx context.Context, req *monitoringpb.UpdateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "notification_channel.name", url.QueryEscape(req.GetNotificationChannel().GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateNotificationChannel[0:len((*c.CallOptions).UpdateNotificationChannel):len((*c.CallOptions).UpdateNotificationChannel)], opts...) var resp *monitoringpb.NotificationChannel err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.notificationChannelClient.UpdateNotificationChannel, req, settings.GRPC, c.logger, "UpdateNotificationChannel") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *notificationChannelGRPCClient) DeleteNotificationChannel(ctx context.Context, req *monitoringpb.DeleteNotificationChannelRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteNotificationChannel[0:len((*c.CallOptions).DeleteNotificationChannel):len((*c.CallOptions).DeleteNotificationChannel)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.notificationChannelClient.DeleteNotificationChannel, req, settings.GRPC, c.logger, "DeleteNotificationChannel") return err }, opts...) return err } func (c *notificationChannelGRPCClient) SendNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.SendNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).SendNotificationChannelVerificationCode[0:len((*c.CallOptions).SendNotificationChannelVerificationCode):len((*c.CallOptions).SendNotificationChannelVerificationCode)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.notificationChannelClient.SendNotificationChannelVerificationCode, req, settings.GRPC, c.logger, "SendNotificationChannelVerificationCode") return err }, opts...) return err } func (c *notificationChannelGRPCClient) GetNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.GetNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) (*monitoringpb.GetNotificationChannelVerificationCodeResponse, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetNotificationChannelVerificationCode[0:len((*c.CallOptions).GetNotificationChannelVerificationCode):len((*c.CallOptions).GetNotificationChannelVerificationCode)], opts...) var resp *monitoringpb.GetNotificationChannelVerificationCodeResponse err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.notificationChannelClient.GetNotificationChannelVerificationCode, req, settings.GRPC, c.logger, "GetNotificationChannelVerificationCode") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *notificationChannelGRPCClient) VerifyNotificationChannel(ctx context.Context, req *monitoringpb.VerifyNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).VerifyNotificationChannel[0:len((*c.CallOptions).VerifyNotificationChannel):len((*c.CallOptions).VerifyNotificationChannel)], opts...) var resp *monitoringpb.NotificationChannel err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.notificationChannelClient.VerifyNotificationChannel, req, settings.GRPC, c.logger, "VerifyNotificationChannel") return err }, opts...) if err != nil { return nil, err } return resp, nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/query_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "fmt" "log/slog" "math" "net/url" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/protobuf/proto" ) var newQueryClientHook clientHook // QueryCallOptions contains the retry settings for each method of QueryClient. type QueryCallOptions struct { QueryTimeSeries []gax.CallOption } func defaultQueryGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultQueryCallOptions() *QueryCallOptions { return &QueryCallOptions{ QueryTimeSeries: []gax.CallOption{}, } } // internalQueryClient is an interface that defines the methods available from Cloud Monitoring API. type internalQueryClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn QueryTimeSeries(context.Context, *monitoringpb.QueryTimeSeriesRequest, ...gax.CallOption) *TimeSeriesDataIterator } // QueryClient is a client for interacting with Cloud Monitoring API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // The QueryService API is used to manage time series data in Cloud // Monitoring. Time series data is a collection of data points that describes // the time-varying values of a metric. type QueryClient struct { // The internal transport-dependent client. internalClient internalQueryClient // The call options for this service. CallOptions *QueryCallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *QueryClient) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *QueryClient) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *QueryClient) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // QueryTimeSeries queries time series by using Monitoring Query Language (MQL). We recommend // using PromQL instead of MQL. For more information about the status of MQL, // see the MQL deprecation // notice (at https://cloud.google.com/stackdriver/docs/deprecations/mql). // // Deprecated: QueryTimeSeries may be removed in a future version. func (c *QueryClient) QueryTimeSeries(ctx context.Context, req *monitoringpb.QueryTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesDataIterator { return c.internalClient.QueryTimeSeries(ctx, req, opts...) } // queryGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type queryGRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing QueryClient CallOptions **QueryCallOptions // The gRPC API client. queryClient monitoringpb.QueryServiceClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewQueryClient creates a new query service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // The QueryService API is used to manage time series data in Cloud // Monitoring. Time series data is a collection of data points that describes // the time-varying values of a metric. func NewQueryClient(ctx context.Context, opts ...option.ClientOption) (*QueryClient, error) { clientOpts := defaultQueryGRPCClientOptions() if newQueryClientHook != nil { hookOpts, err := newQueryClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := QueryClient{CallOptions: defaultQueryCallOptions()} c := &queryGRPCClient{ connPool: connPool, queryClient: monitoringpb.NewQueryServiceClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *queryGRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *queryGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *queryGRPCClient) Close() error { return c.connPool.Close() } func (c *queryGRPCClient) QueryTimeSeries(ctx context.Context, req *monitoringpb.QueryTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesDataIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).QueryTimeSeries[0:len((*c.CallOptions).QueryTimeSeries):len((*c.CallOptions).QueryTimeSeries)], opts...) it := &TimeSeriesDataIterator{} req = proto.Clone(req).(*monitoringpb.QueryTimeSeriesRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.TimeSeriesData, string, error) { resp := &monitoringpb.QueryTimeSeriesResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.queryClient.QueryTimeSeries, req, settings.GRPC, c.logger, "QueryTimeSeries") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetTimeSeriesData(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/service_monitoring_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "fmt" "log/slog" "math" "net/url" "time" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/protobuf/proto" ) var newServiceMonitoringClientHook clientHook // ServiceMonitoringCallOptions contains the retry settings for each method of ServiceMonitoringClient. type ServiceMonitoringCallOptions struct { CreateService []gax.CallOption GetService []gax.CallOption ListServices []gax.CallOption UpdateService []gax.CallOption DeleteService []gax.CallOption CreateServiceLevelObjective []gax.CallOption GetServiceLevelObjective []gax.CallOption ListServiceLevelObjectives []gax.CallOption UpdateServiceLevelObjective []gax.CallOption DeleteServiceLevelObjective []gax.CallOption } func defaultServiceMonitoringGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultServiceMonitoringCallOptions() *ServiceMonitoringCallOptions { return &ServiceMonitoringCallOptions{ CreateService: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, GetService: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, ListServices: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, UpdateService: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, DeleteService: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, CreateServiceLevelObjective: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, GetServiceLevelObjective: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, ListServiceLevelObjectives: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, UpdateServiceLevelObjective: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, DeleteServiceLevelObjective: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, } } // internalServiceMonitoringClient is an interface that defines the methods available from Cloud Monitoring API. type internalServiceMonitoringClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn CreateService(context.Context, *monitoringpb.CreateServiceRequest, ...gax.CallOption) (*monitoringpb.Service, error) GetService(context.Context, *monitoringpb.GetServiceRequest, ...gax.CallOption) (*monitoringpb.Service, error) ListServices(context.Context, *monitoringpb.ListServicesRequest, ...gax.CallOption) *ServiceIterator UpdateService(context.Context, *monitoringpb.UpdateServiceRequest, ...gax.CallOption) (*monitoringpb.Service, error) DeleteService(context.Context, *monitoringpb.DeleteServiceRequest, ...gax.CallOption) error CreateServiceLevelObjective(context.Context, *monitoringpb.CreateServiceLevelObjectiveRequest, ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) GetServiceLevelObjective(context.Context, *monitoringpb.GetServiceLevelObjectiveRequest, ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) ListServiceLevelObjectives(context.Context, *monitoringpb.ListServiceLevelObjectivesRequest, ...gax.CallOption) *ServiceLevelObjectiveIterator UpdateServiceLevelObjective(context.Context, *monitoringpb.UpdateServiceLevelObjectiveRequest, ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) DeleteServiceLevelObjective(context.Context, *monitoringpb.DeleteServiceLevelObjectiveRequest, ...gax.CallOption) error } // ServiceMonitoringClient is a client for interacting with Cloud Monitoring API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // The Cloud Monitoring Service-Oriented Monitoring API has endpoints for // managing and querying aspects of a Metrics Scope’s services. These include // the Service's monitored resources, its Service-Level Objectives, and a // taxonomy of categorized Health Metrics. type ServiceMonitoringClient struct { // The internal transport-dependent client. internalClient internalServiceMonitoringClient // The call options for this service. CallOptions *ServiceMonitoringCallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *ServiceMonitoringClient) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *ServiceMonitoringClient) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *ServiceMonitoringClient) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // CreateService create a Service. func (c *ServiceMonitoringClient) CreateService(ctx context.Context, req *monitoringpb.CreateServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) { return c.internalClient.CreateService(ctx, req, opts...) } // GetService get the named Service. func (c *ServiceMonitoringClient) GetService(ctx context.Context, req *monitoringpb.GetServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) { return c.internalClient.GetService(ctx, req, opts...) } // ListServices list Services for this Metrics Scope. func (c *ServiceMonitoringClient) ListServices(ctx context.Context, req *monitoringpb.ListServicesRequest, opts ...gax.CallOption) *ServiceIterator { return c.internalClient.ListServices(ctx, req, opts...) } // UpdateService update this Service. func (c *ServiceMonitoringClient) UpdateService(ctx context.Context, req *monitoringpb.UpdateServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) { return c.internalClient.UpdateService(ctx, req, opts...) } // DeleteService soft delete this Service. func (c *ServiceMonitoringClient) DeleteService(ctx context.Context, req *monitoringpb.DeleteServiceRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteService(ctx, req, opts...) } // CreateServiceLevelObjective create a ServiceLevelObjective for the given Service. func (c *ServiceMonitoringClient) CreateServiceLevelObjective(ctx context.Context, req *monitoringpb.CreateServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) { return c.internalClient.CreateServiceLevelObjective(ctx, req, opts...) } // GetServiceLevelObjective get a ServiceLevelObjective by name. func (c *ServiceMonitoringClient) GetServiceLevelObjective(ctx context.Context, req *monitoringpb.GetServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) { return c.internalClient.GetServiceLevelObjective(ctx, req, opts...) } // ListServiceLevelObjectives list the ServiceLevelObjectives for the given Service. func (c *ServiceMonitoringClient) ListServiceLevelObjectives(ctx context.Context, req *monitoringpb.ListServiceLevelObjectivesRequest, opts ...gax.CallOption) *ServiceLevelObjectiveIterator { return c.internalClient.ListServiceLevelObjectives(ctx, req, opts...) } // UpdateServiceLevelObjective update the given ServiceLevelObjective. func (c *ServiceMonitoringClient) UpdateServiceLevelObjective(ctx context.Context, req *monitoringpb.UpdateServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) { return c.internalClient.UpdateServiceLevelObjective(ctx, req, opts...) } // DeleteServiceLevelObjective delete the given ServiceLevelObjective. func (c *ServiceMonitoringClient) DeleteServiceLevelObjective(ctx context.Context, req *monitoringpb.DeleteServiceLevelObjectiveRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteServiceLevelObjective(ctx, req, opts...) } // serviceMonitoringGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type serviceMonitoringGRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing ServiceMonitoringClient CallOptions **ServiceMonitoringCallOptions // The gRPC API client. serviceMonitoringClient monitoringpb.ServiceMonitoringServiceClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewServiceMonitoringClient creates a new service monitoring service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // The Cloud Monitoring Service-Oriented Monitoring API has endpoints for // managing and querying aspects of a Metrics Scope’s services. These include // the Service's monitored resources, its Service-Level Objectives, and a // taxonomy of categorized Health Metrics. func NewServiceMonitoringClient(ctx context.Context, opts ...option.ClientOption) (*ServiceMonitoringClient, error) { clientOpts := defaultServiceMonitoringGRPCClientOptions() if newServiceMonitoringClientHook != nil { hookOpts, err := newServiceMonitoringClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := ServiceMonitoringClient{CallOptions: defaultServiceMonitoringCallOptions()} c := &serviceMonitoringGRPCClient{ connPool: connPool, serviceMonitoringClient: monitoringpb.NewServiceMonitoringServiceClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *serviceMonitoringGRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *serviceMonitoringGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *serviceMonitoringGRPCClient) Close() error { return c.connPool.Close() } func (c *serviceMonitoringGRPCClient) CreateService(ctx context.Context, req *monitoringpb.CreateServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateService[0:len((*c.CallOptions).CreateService):len((*c.CallOptions).CreateService)], opts...) var resp *monitoringpb.Service err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.serviceMonitoringClient.CreateService, req, settings.GRPC, c.logger, "CreateService") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *serviceMonitoringGRPCClient) GetService(ctx context.Context, req *monitoringpb.GetServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetService[0:len((*c.CallOptions).GetService):len((*c.CallOptions).GetService)], opts...) var resp *monitoringpb.Service err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.serviceMonitoringClient.GetService, req, settings.GRPC, c.logger, "GetService") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *serviceMonitoringGRPCClient) ListServices(ctx context.Context, req *monitoringpb.ListServicesRequest, opts ...gax.CallOption) *ServiceIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListServices[0:len((*c.CallOptions).ListServices):len((*c.CallOptions).ListServices)], opts...) it := &ServiceIterator{} req = proto.Clone(req).(*monitoringpb.ListServicesRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.Service, string, error) { resp := &monitoringpb.ListServicesResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.serviceMonitoringClient.ListServices, req, settings.GRPC, c.logger, "ListServices") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetServices(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *serviceMonitoringGRPCClient) UpdateService(ctx context.Context, req *monitoringpb.UpdateServiceRequest, opts ...gax.CallOption) (*monitoringpb.Service, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "service.name", url.QueryEscape(req.GetService().GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateService[0:len((*c.CallOptions).UpdateService):len((*c.CallOptions).UpdateService)], opts...) var resp *monitoringpb.Service err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.serviceMonitoringClient.UpdateService, req, settings.GRPC, c.logger, "UpdateService") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *serviceMonitoringGRPCClient) DeleteService(ctx context.Context, req *monitoringpb.DeleteServiceRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteService[0:len((*c.CallOptions).DeleteService):len((*c.CallOptions).DeleteService)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.serviceMonitoringClient.DeleteService, req, settings.GRPC, c.logger, "DeleteService") return err }, opts...) return err } func (c *serviceMonitoringGRPCClient) CreateServiceLevelObjective(ctx context.Context, req *monitoringpb.CreateServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateServiceLevelObjective[0:len((*c.CallOptions).CreateServiceLevelObjective):len((*c.CallOptions).CreateServiceLevelObjective)], opts...) var resp *monitoringpb.ServiceLevelObjective err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.serviceMonitoringClient.CreateServiceLevelObjective, req, settings.GRPC, c.logger, "CreateServiceLevelObjective") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *serviceMonitoringGRPCClient) GetServiceLevelObjective(ctx context.Context, req *monitoringpb.GetServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetServiceLevelObjective[0:len((*c.CallOptions).GetServiceLevelObjective):len((*c.CallOptions).GetServiceLevelObjective)], opts...) var resp *monitoringpb.ServiceLevelObjective err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.serviceMonitoringClient.GetServiceLevelObjective, req, settings.GRPC, c.logger, "GetServiceLevelObjective") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *serviceMonitoringGRPCClient) ListServiceLevelObjectives(ctx context.Context, req *monitoringpb.ListServiceLevelObjectivesRequest, opts ...gax.CallOption) *ServiceLevelObjectiveIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListServiceLevelObjectives[0:len((*c.CallOptions).ListServiceLevelObjectives):len((*c.CallOptions).ListServiceLevelObjectives)], opts...) it := &ServiceLevelObjectiveIterator{} req = proto.Clone(req).(*monitoringpb.ListServiceLevelObjectivesRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.ServiceLevelObjective, string, error) { resp := &monitoringpb.ListServiceLevelObjectivesResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.serviceMonitoringClient.ListServiceLevelObjectives, req, settings.GRPC, c.logger, "ListServiceLevelObjectives") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetServiceLevelObjectives(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *serviceMonitoringGRPCClient) UpdateServiceLevelObjective(ctx context.Context, req *monitoringpb.UpdateServiceLevelObjectiveRequest, opts ...gax.CallOption) (*monitoringpb.ServiceLevelObjective, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "service_level_objective.name", url.QueryEscape(req.GetServiceLevelObjective().GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateServiceLevelObjective[0:len((*c.CallOptions).UpdateServiceLevelObjective):len((*c.CallOptions).UpdateServiceLevelObjective)], opts...) var resp *monitoringpb.ServiceLevelObjective err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.serviceMonitoringClient.UpdateServiceLevelObjective, req, settings.GRPC, c.logger, "UpdateServiceLevelObjective") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *serviceMonitoringGRPCClient) DeleteServiceLevelObjective(ctx context.Context, req *monitoringpb.DeleteServiceLevelObjectiveRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteServiceLevelObjective[0:len((*c.CallOptions).DeleteServiceLevelObjective):len((*c.CallOptions).DeleteServiceLevelObjective)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.serviceMonitoringClient.DeleteServiceLevelObjective, req, settings.GRPC, c.logger, "DeleteServiceLevelObjective") return err }, opts...) return err } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/snooze_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "fmt" "log/slog" "math" "net/url" "time" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/protobuf/proto" ) var newSnoozeClientHook clientHook // SnoozeCallOptions contains the retry settings for each method of SnoozeClient. type SnoozeCallOptions struct { CreateSnooze []gax.CallOption ListSnoozes []gax.CallOption GetSnooze []gax.CallOption UpdateSnooze []gax.CallOption } func defaultSnoozeGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultSnoozeCallOptions() *SnoozeCallOptions { return &SnoozeCallOptions{ CreateSnooze: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, ListSnoozes: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, GetSnooze: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, UpdateSnooze: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, } } // internalSnoozeClient is an interface that defines the methods available from Cloud Monitoring API. type internalSnoozeClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn CreateSnooze(context.Context, *monitoringpb.CreateSnoozeRequest, ...gax.CallOption) (*monitoringpb.Snooze, error) ListSnoozes(context.Context, *monitoringpb.ListSnoozesRequest, ...gax.CallOption) *SnoozeIterator GetSnooze(context.Context, *monitoringpb.GetSnoozeRequest, ...gax.CallOption) (*monitoringpb.Snooze, error) UpdateSnooze(context.Context, *monitoringpb.UpdateSnoozeRequest, ...gax.CallOption) (*monitoringpb.Snooze, error) } // SnoozeClient is a client for interacting with Cloud Monitoring API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // The SnoozeService API is used to temporarily prevent an alert policy from // generating alerts. A Snooze is a description of the criteria under which one // or more alert policies should not fire alerts for the specified duration. type SnoozeClient struct { // The internal transport-dependent client. internalClient internalSnoozeClient // The call options for this service. CallOptions *SnoozeCallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *SnoozeClient) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *SnoozeClient) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *SnoozeClient) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // CreateSnooze creates a Snooze that will prevent alerts, which match the provided // criteria, from being opened. The Snooze applies for a specific time // interval. func (c *SnoozeClient) CreateSnooze(ctx context.Context, req *monitoringpb.CreateSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) { return c.internalClient.CreateSnooze(ctx, req, opts...) } // ListSnoozes lists the Snoozes associated with a project. Can optionally pass in // filter, which specifies predicates to match Snoozes. func (c *SnoozeClient) ListSnoozes(ctx context.Context, req *monitoringpb.ListSnoozesRequest, opts ...gax.CallOption) *SnoozeIterator { return c.internalClient.ListSnoozes(ctx, req, opts...) } // GetSnooze retrieves a Snooze by name. func (c *SnoozeClient) GetSnooze(ctx context.Context, req *monitoringpb.GetSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) { return c.internalClient.GetSnooze(ctx, req, opts...) } // UpdateSnooze updates a Snooze, identified by its name, with the parameters in the // given Snooze object. func (c *SnoozeClient) UpdateSnooze(ctx context.Context, req *monitoringpb.UpdateSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) { return c.internalClient.UpdateSnooze(ctx, req, opts...) } // snoozeGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type snoozeGRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing SnoozeClient CallOptions **SnoozeCallOptions // The gRPC API client. snoozeClient monitoringpb.SnoozeServiceClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewSnoozeClient creates a new snooze service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // The SnoozeService API is used to temporarily prevent an alert policy from // generating alerts. A Snooze is a description of the criteria under which one // or more alert policies should not fire alerts for the specified duration. func NewSnoozeClient(ctx context.Context, opts ...option.ClientOption) (*SnoozeClient, error) { clientOpts := defaultSnoozeGRPCClientOptions() if newSnoozeClientHook != nil { hookOpts, err := newSnoozeClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := SnoozeClient{CallOptions: defaultSnoozeCallOptions()} c := &snoozeGRPCClient{ connPool: connPool, snoozeClient: monitoringpb.NewSnoozeServiceClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *snoozeGRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *snoozeGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *snoozeGRPCClient) Close() error { return c.connPool.Close() } func (c *snoozeGRPCClient) CreateSnooze(ctx context.Context, req *monitoringpb.CreateSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateSnooze[0:len((*c.CallOptions).CreateSnooze):len((*c.CallOptions).CreateSnooze)], opts...) var resp *monitoringpb.Snooze err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.snoozeClient.CreateSnooze, req, settings.GRPC, c.logger, "CreateSnooze") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *snoozeGRPCClient) ListSnoozes(ctx context.Context, req *monitoringpb.ListSnoozesRequest, opts ...gax.CallOption) *SnoozeIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListSnoozes[0:len((*c.CallOptions).ListSnoozes):len((*c.CallOptions).ListSnoozes)], opts...) it := &SnoozeIterator{} req = proto.Clone(req).(*monitoringpb.ListSnoozesRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.Snooze, string, error) { resp := &monitoringpb.ListSnoozesResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.snoozeClient.ListSnoozes, req, settings.GRPC, c.logger, "ListSnoozes") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetSnoozes(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *snoozeGRPCClient) GetSnooze(ctx context.Context, req *monitoringpb.GetSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetSnooze[0:len((*c.CallOptions).GetSnooze):len((*c.CallOptions).GetSnooze)], opts...) var resp *monitoringpb.Snooze err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.snoozeClient.GetSnooze, req, settings.GRPC, c.logger, "GetSnooze") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *snoozeGRPCClient) UpdateSnooze(ctx context.Context, req *monitoringpb.UpdateSnoozeRequest, opts ...gax.CallOption) (*monitoringpb.Snooze, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "snooze.name", url.QueryEscape(req.GetSnooze().GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateSnooze[0:len((*c.CallOptions).UpdateSnooze):len((*c.CallOptions).UpdateSnooze)], opts...) var resp *monitoringpb.Snooze err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.snoozeClient.UpdateSnooze, req, settings.GRPC, c.logger, "UpdateSnooze") return err }, opts...) if err != nil { return nil, err } return resp, nil } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/uptime_check_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package monitoring import ( "context" "fmt" "log/slog" "math" "net/url" "time" monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/protobuf/proto" ) var newUptimeCheckClientHook clientHook // UptimeCheckCallOptions contains the retry settings for each method of UptimeCheckClient. type UptimeCheckCallOptions struct { ListUptimeCheckConfigs []gax.CallOption GetUptimeCheckConfig []gax.CallOption CreateUptimeCheckConfig []gax.CallOption UpdateUptimeCheckConfig []gax.CallOption DeleteUptimeCheckConfig []gax.CallOption ListUptimeCheckIps []gax.CallOption } func defaultUptimeCheckGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultUptimeCheckCallOptions() *UptimeCheckCallOptions { return &UptimeCheckCallOptions{ ListUptimeCheckConfigs: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, GetUptimeCheckConfig: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, CreateUptimeCheckConfig: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, UpdateUptimeCheckConfig: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), }, DeleteUptimeCheckConfig: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, ListUptimeCheckIps: []gax.CallOption{ gax.WithTimeout(30000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.Unavailable, }, gax.Backoff{ Initial: 100 * time.Millisecond, Max: 30000 * time.Millisecond, Multiplier: 1.30, }) }), }, } } // internalUptimeCheckClient is an interface that defines the methods available from Cloud Monitoring API. type internalUptimeCheckClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn ListUptimeCheckConfigs(context.Context, *monitoringpb.ListUptimeCheckConfigsRequest, ...gax.CallOption) *UptimeCheckConfigIterator GetUptimeCheckConfig(context.Context, *monitoringpb.GetUptimeCheckConfigRequest, ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) CreateUptimeCheckConfig(context.Context, *monitoringpb.CreateUptimeCheckConfigRequest, ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) UpdateUptimeCheckConfig(context.Context, *monitoringpb.UpdateUptimeCheckConfigRequest, ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) DeleteUptimeCheckConfig(context.Context, *monitoringpb.DeleteUptimeCheckConfigRequest, ...gax.CallOption) error ListUptimeCheckIps(context.Context, *monitoringpb.ListUptimeCheckIpsRequest, ...gax.CallOption) *UptimeCheckIpIterator } // UptimeCheckClient is a client for interacting with Cloud Monitoring API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // The UptimeCheckService API is used to manage (list, create, delete, edit) // Uptime check configurations in the Cloud Monitoring product. An Uptime // check is a piece of configuration that determines which resources and // services to monitor for availability. These configurations can also be // configured interactively by navigating to the [Cloud console] // (https://console.cloud.google.com (at https://console.cloud.google.com)), selecting the appropriate project, // clicking on “Monitoring” on the left-hand side to navigate to Cloud // Monitoring, and then clicking on “Uptime”. type UptimeCheckClient struct { // The internal transport-dependent client. internalClient internalUptimeCheckClient // The call options for this service. CallOptions *UptimeCheckCallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *UptimeCheckClient) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *UptimeCheckClient) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *UptimeCheckClient) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // ListUptimeCheckConfigs lists the existing valid Uptime check configurations for the project // (leaving out any invalid configurations). func (c *UptimeCheckClient) ListUptimeCheckConfigs(ctx context.Context, req *monitoringpb.ListUptimeCheckConfigsRequest, opts ...gax.CallOption) *UptimeCheckConfigIterator { return c.internalClient.ListUptimeCheckConfigs(ctx, req, opts...) } // GetUptimeCheckConfig gets a single Uptime check configuration. func (c *UptimeCheckClient) GetUptimeCheckConfig(ctx context.Context, req *monitoringpb.GetUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { return c.internalClient.GetUptimeCheckConfig(ctx, req, opts...) } // CreateUptimeCheckConfig creates a new Uptime check configuration. func (c *UptimeCheckClient) CreateUptimeCheckConfig(ctx context.Context, req *monitoringpb.CreateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { return c.internalClient.CreateUptimeCheckConfig(ctx, req, opts...) } // UpdateUptimeCheckConfig updates an Uptime check configuration. You can either replace the entire // configuration with a new one or replace only certain fields in the current // configuration by specifying the fields to be updated via updateMask. // Returns the updated configuration. func (c *UptimeCheckClient) UpdateUptimeCheckConfig(ctx context.Context, req *monitoringpb.UpdateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { return c.internalClient.UpdateUptimeCheckConfig(ctx, req, opts...) } // DeleteUptimeCheckConfig deletes an Uptime check configuration. Note that this method will fail // if the Uptime check configuration is referenced by an alert policy or // other dependent configs that would be rendered invalid by the deletion. func (c *UptimeCheckClient) DeleteUptimeCheckConfig(ctx context.Context, req *monitoringpb.DeleteUptimeCheckConfigRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteUptimeCheckConfig(ctx, req, opts...) } // ListUptimeCheckIps returns the list of IP addresses that checkers run from. func (c *UptimeCheckClient) ListUptimeCheckIps(ctx context.Context, req *monitoringpb.ListUptimeCheckIpsRequest, opts ...gax.CallOption) *UptimeCheckIpIterator { return c.internalClient.ListUptimeCheckIps(ctx, req, opts...) } // uptimeCheckGRPCClient is a client for interacting with Cloud Monitoring API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type uptimeCheckGRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing UptimeCheckClient CallOptions **UptimeCheckCallOptions // The gRPC API client. uptimeCheckClient monitoringpb.UptimeCheckServiceClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewUptimeCheckClient creates a new uptime check service client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // The UptimeCheckService API is used to manage (list, create, delete, edit) // Uptime check configurations in the Cloud Monitoring product. An Uptime // check is a piece of configuration that determines which resources and // services to monitor for availability. These configurations can also be // configured interactively by navigating to the [Cloud console] // (https://console.cloud.google.com (at https://console.cloud.google.com)), selecting the appropriate project, // clicking on “Monitoring” on the left-hand side to navigate to Cloud // Monitoring, and then clicking on “Uptime”. func NewUptimeCheckClient(ctx context.Context, opts ...option.ClientOption) (*UptimeCheckClient, error) { clientOpts := defaultUptimeCheckGRPCClientOptions() if newUptimeCheckClientHook != nil { hookOpts, err := newUptimeCheckClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := UptimeCheckClient{CallOptions: defaultUptimeCheckCallOptions()} c := &uptimeCheckGRPCClient{ connPool: connPool, uptimeCheckClient: monitoringpb.NewUptimeCheckServiceClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *uptimeCheckGRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *uptimeCheckGRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *uptimeCheckGRPCClient) Close() error { return c.connPool.Close() } func (c *uptimeCheckGRPCClient) ListUptimeCheckConfigs(ctx context.Context, req *monitoringpb.ListUptimeCheckConfigsRequest, opts ...gax.CallOption) *UptimeCheckConfigIterator { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListUptimeCheckConfigs[0:len((*c.CallOptions).ListUptimeCheckConfigs):len((*c.CallOptions).ListUptimeCheckConfigs)], opts...) it := &UptimeCheckConfigIterator{} req = proto.Clone(req).(*monitoringpb.ListUptimeCheckConfigsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.UptimeCheckConfig, string, error) { resp := &monitoringpb.ListUptimeCheckConfigsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.uptimeCheckClient.ListUptimeCheckConfigs, req, settings.GRPC, c.logger, "ListUptimeCheckConfigs") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetUptimeCheckConfigs(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *uptimeCheckGRPCClient) GetUptimeCheckConfig(ctx context.Context, req *monitoringpb.GetUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetUptimeCheckConfig[0:len((*c.CallOptions).GetUptimeCheckConfig):len((*c.CallOptions).GetUptimeCheckConfig)], opts...) var resp *monitoringpb.UptimeCheckConfig err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.uptimeCheckClient.GetUptimeCheckConfig, req, settings.GRPC, c.logger, "GetUptimeCheckConfig") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *uptimeCheckGRPCClient) CreateUptimeCheckConfig(ctx context.Context, req *monitoringpb.CreateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateUptimeCheckConfig[0:len((*c.CallOptions).CreateUptimeCheckConfig):len((*c.CallOptions).CreateUptimeCheckConfig)], opts...) var resp *monitoringpb.UptimeCheckConfig err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.uptimeCheckClient.CreateUptimeCheckConfig, req, settings.GRPC, c.logger, "CreateUptimeCheckConfig") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *uptimeCheckGRPCClient) UpdateUptimeCheckConfig(ctx context.Context, req *monitoringpb.UpdateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "uptime_check_config.name", url.QueryEscape(req.GetUptimeCheckConfig().GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateUptimeCheckConfig[0:len((*c.CallOptions).UpdateUptimeCheckConfig):len((*c.CallOptions).UpdateUptimeCheckConfig)], opts...) var resp *monitoringpb.UptimeCheckConfig err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.uptimeCheckClient.UpdateUptimeCheckConfig, req, settings.GRPC, c.logger, "UpdateUptimeCheckConfig") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *uptimeCheckGRPCClient) DeleteUptimeCheckConfig(ctx context.Context, req *monitoringpb.DeleteUptimeCheckConfigRequest, opts ...gax.CallOption) error { hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteUptimeCheckConfig[0:len((*c.CallOptions).DeleteUptimeCheckConfig):len((*c.CallOptions).DeleteUptimeCheckConfig)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.uptimeCheckClient.DeleteUptimeCheckConfig, req, settings.GRPC, c.logger, "DeleteUptimeCheckConfig") return err }, opts...) return err } func (c *uptimeCheckGRPCClient) ListUptimeCheckIps(ctx context.Context, req *monitoringpb.ListUptimeCheckIpsRequest, opts ...gax.CallOption) *UptimeCheckIpIterator { ctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...) opts = append((*c.CallOptions).ListUptimeCheckIps[0:len((*c.CallOptions).ListUptimeCheckIps):len((*c.CallOptions).ListUptimeCheckIps)], opts...) it := &UptimeCheckIpIterator{} req = proto.Clone(req).(*monitoringpb.ListUptimeCheckIpsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.UptimeCheckIp, string, error) { resp := &monitoringpb.ListUptimeCheckIpsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.uptimeCheckClient.ListUptimeCheckIps, req, settings.GRPC, c.logger, "ListUptimeCheckIps") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetUptimeCheckIps(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } ================================================ FILE: vendor/cloud.google.com/go/monitoring/apiv3/v2/version.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by gapicgen. DO NOT EDIT. package monitoring import "cloud.google.com/go/monitoring/internal" func init() { versionClient = internal.Version } ================================================ FILE: vendor/cloud.google.com/go/monitoring/internal/version.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal // Version is the current tagged release of the library. const Version = "1.24.2" ================================================ FILE: vendor/cloud.google.com/go/storage/CHANGES.md ================================================ # Changes ## [1.54.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.53.0...storage/v1.54.0) (2025-05-12) ### Features * **storage:** Add experimental ZB API option ([#12214](https://github.com/googleapis/google-cloud-go/issues/12214)) ([f669982](https://github.com/googleapis/google-cloud-go/commit/f669982de2abf64759eccf5c38bd669488b9cf6a)) ### Bug Fixes * **storage:** Fix append writer hang ([#12201](https://github.com/googleapis/google-cloud-go/issues/12201)) ([7ce2a2a](https://github.com/googleapis/google-cloud-go/commit/7ce2a2ad3ae9deff28c73c1bcc2e7001770464eb)) * **storage:** Retry unwrapped EOFs ([#12202](https://github.com/googleapis/google-cloud-go/issues/12202)) ([b2d42bd](https://github.com/googleapis/google-cloud-go/commit/b2d42bda6a398f3aa00030b6e99bbcb40f132ff7)) ## [1.53.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.52.0...storage/v1.53.0) (2025-05-02) ### Features * **storage/control:** Add Anywhere cache control APIs ([83ae06c](https://github.com/googleapis/google-cloud-go/commit/83ae06c3ec7d190e38856ba4cfd8a13f08356b4d)) ### Bug Fixes * **storage:** Fix append edge cases ([#12074](https://github.com/googleapis/google-cloud-go/issues/12074)) ([0eee1f9](https://github.com/googleapis/google-cloud-go/commit/0eee1f99a7dc0d1bfc36fa43d78933cae47962ee)) * **storage:** Fix retries for redirection errors. ([#12093](https://github.com/googleapis/google-cloud-go/issues/12093)) ([3e177e7](https://github.com/googleapis/google-cloud-go/commit/3e177e755f5bf6aa96e8712cc4adcba7eb6f04f6)) * **storage:** Handle gRPC deadlines in tests. ([#12092](https://github.com/googleapis/google-cloud-go/issues/12092)) ([30b7cd2](https://github.com/googleapis/google-cloud-go/commit/30b7cd27771ccbd49b70ee106da36362ba8f1e87)) * **storage:** Update offset on resumable upload retry ([#12086](https://github.com/googleapis/google-cloud-go/issues/12086)) ([6ce8fe5](https://github.com/googleapis/google-cloud-go/commit/6ce8fe5aec0ec7916eda4d1405cab5f5f65a5de8)) * **storage:** Validate Bidi option for MRD ([#12033](https://github.com/googleapis/google-cloud-go/issues/12033)) ([d9018cf](https://github.com/googleapis/google-cloud-go/commit/d9018cf640a9ac25e2b23b75b3bcfa734379ab09)) ### Documentation * **storage/control:** Added comments for Anywhere cache messages ([83ae06c](https://github.com/googleapis/google-cloud-go/commit/83ae06c3ec7d190e38856ba4cfd8a13f08356b4d)) ## [1.52.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.51.0...storage/v1.52.0) (2025-04-22) ### Features * **storage/control:** Add Anywhere cache control APIs ([#11807](https://github.com/googleapis/google-cloud-go/issues/11807)) ([12bfa98](https://github.com/googleapis/google-cloud-go/commit/12bfa984f87099dbfbd5abf3436e440e62b04bad)) * **storage:** Add CurrentState function to determine state of stream in MRD ([#11688](https://github.com/googleapis/google-cloud-go/issues/11688)) ([14e8e13](https://github.com/googleapis/google-cloud-go/commit/14e8e132d9d5808d1ca789792e7e39f0857991da)) * **storage:** Add OwnerEntity to bucketAttrs ([#11857](https://github.com/googleapis/google-cloud-go/issues/11857)) ([4cd4a0c](https://github.com/googleapis/google-cloud-go/commit/4cd4a0ca1f6132ea6ed9df7b27310a3238a9c3fd)) * **storage:** Takeover appendable object ([#11977](https://github.com/googleapis/google-cloud-go/issues/11977)) ([513b937](https://github.com/googleapis/google-cloud-go/commit/513b937420b945c4a76e20711f305c6ad8a77812)) * **storage:** Unfinalized appendable objects. ([#11647](https://github.com/googleapis/google-cloud-go/issues/11647)) ([52c0218](https://github.com/googleapis/google-cloud-go/commit/52c02183fabf43fcba3893f493140ac28a7836d1)) ### Bug Fixes * **storage:** Fix Attrs for append takeover ([#11989](https://github.com/googleapis/google-cloud-go/issues/11989)) ([6db35b1](https://github.com/googleapis/google-cloud-go/commit/6db35b10567b7f1463bfef722b0fd72257190ee7)) * **storage:** Fix panic when Flush called early ([#11934](https://github.com/googleapis/google-cloud-go/issues/11934)) ([7d0b8a7](https://github.com/googleapis/google-cloud-go/commit/7d0b8a75ae55731ae765c01f24920f9f11038f44)) * **storage:** Fix unfinalized write size ([#12016](https://github.com/googleapis/google-cloud-go/issues/12016)) ([6217f8f](https://github.com/googleapis/google-cloud-go/commit/6217f8fd3cd8680a7e6b7b46fc9b7bda6ee6292e)) * **storage:** Force first message on next sendBuffer when nothing sent on current ([#11871](https://github.com/googleapis/google-cloud-go/issues/11871)) ([a1a2292](https://github.com/googleapis/google-cloud-go/commit/a1a22927d6a4399e7392787bccb9707bc9e8f149)) * **storage:** Populate Writer.Attrs after Flush() ([#12021](https://github.com/googleapis/google-cloud-go/issues/12021)) ([8e56f74](https://github.com/googleapis/google-cloud-go/commit/8e56f745e7f2175660838f96c1a12a46841cac40)) * **storage:** Remove check for FinalizeOnClose ([#11992](https://github.com/googleapis/google-cloud-go/issues/11992)) ([2664b8c](https://github.com/googleapis/google-cloud-go/commit/2664b8cec00a606001184cb17c074fd0e79e66b8)) * **storage:** Wrap read response parsing errors ([#11951](https://github.com/googleapis/google-cloud-go/issues/11951)) ([d2e6583](https://github.com/googleapis/google-cloud-go/commit/d2e658387b80ec8a3e41e048a9d520b8dd13dd00)) ## [1.51.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.50.0...storage/v1.51.0) (2025-03-07) ### Features * **storage/append:** Support appends in w1r3. ([#11483](https://github.com/googleapis/google-cloud-go/issues/11483)) ([48bb391](https://github.com/googleapis/google-cloud-go/commit/48bb39154479a2cf2d379316e0915f39d7b7a518)) * **storage:** Benchmark with experimental MRD. ([#11501](https://github.com/googleapis/google-cloud-go/issues/11501)) ([7b49152](https://github.com/googleapis/google-cloud-go/commit/7b491520a693d258d3370a19c43c9dff6c8558c7)) * **storage:** Implement RetryChunkDeadline for grpc writes ([#11476](https://github.com/googleapis/google-cloud-go/issues/11476)) ([03575d7](https://github.com/googleapis/google-cloud-go/commit/03575d74f5241cc714e4d3ac63635569a34f5633)) * **storage:** Specify benchmark integrity check. ([#11465](https://github.com/googleapis/google-cloud-go/issues/11465)) ([da18845](https://github.com/googleapis/google-cloud-go/commit/da188453e0254c49a01d28788d0849a2d0e98e0c)) * **storage:** Use ReadHandle for faster re-connect ([#11510](https://github.com/googleapis/google-cloud-go/issues/11510)) ([cac52f7](https://github.com/googleapis/google-cloud-go/commit/cac52f79a73d46774d33d76e3075c0a5b3e0b9f3)) * **storage:** Wrap NotFound errors for buckets and objects ([#11519](https://github.com/googleapis/google-cloud-go/issues/11519)) ([0dd7d3d](https://github.com/googleapis/google-cloud-go/commit/0dd7d3d62e54c6c3bca395fcca8450ad3347a5a0)) ### Bug Fixes * **storage/append:** Report progress for appends. ([#11503](https://github.com/googleapis/google-cloud-go/issues/11503)) ([96dbb6c](https://github.com/googleapis/google-cloud-go/commit/96dbb6c12398fb3cbffab2bf61836bef2f704f66)) * **storage:** Add a safety check for readhandle ([#11549](https://github.com/googleapis/google-cloud-go/issues/11549)) ([c9edb37](https://github.com/googleapis/google-cloud-go/commit/c9edb379ece70f065650702c9240ee540ca2f610)) * **storage:** Add universe domain to defaultSignBytesFunc ([#11521](https://github.com/googleapis/google-cloud-go/issues/11521)) ([511608b](https://github.com/googleapis/google-cloud-go/commit/511608b8e8554aa06f9fe2e2e4f51ead0f484031)) * **storage:** Clone the defaultRetry to avoid modifying it directly ([#11533](https://github.com/googleapis/google-cloud-go/issues/11533)) ([7f8d69d](https://github.com/googleapis/google-cloud-go/commit/7f8d69dcd6a7b1ad6c1df8d9fe8dfb5fe0947479)) * **storage:** Fix adding multiple range on stream with same read id ([#11584](https://github.com/googleapis/google-cloud-go/issues/11584)) ([0bb3434](https://github.com/googleapis/google-cloud-go/commit/0bb3434e0e12563ff21ef72ad2e52ad7eb61d66e)) * **storage:** Modify the callback of mrd to return length of data read instead of limit. ([#11687](https://github.com/googleapis/google-cloud-go/issues/11687)) ([9e359f0](https://github.com/googleapis/google-cloud-go/commit/9e359f0089f744c32d12bf77889d69a4db155357)) * **storage:** Propagate ctx from invoke to grpc upload reqs ([#11475](https://github.com/googleapis/google-cloud-go/issues/11475)) ([9ad9d76](https://github.com/googleapis/google-cloud-go/commit/9ad9d7665ca2f4cfdcee75f5e683084ac49536a6)) * **storage:** Remove duplicate routing header ([#11534](https://github.com/googleapis/google-cloud-go/issues/11534)) ([8eeb59c](https://github.com/googleapis/google-cloud-go/commit/8eeb59cbfb16d8f379f7aa4c6f11e53cebbd38a6)) * **storage:** Return sentinel ErrObjectNotExist for copy and compose ([#11369](https://github.com/googleapis/google-cloud-go/issues/11369)) ([74d0c10](https://github.com/googleapis/google-cloud-go/commit/74d0c1096f897ca3c15646f3049ea540bed0a6a0)), refs [#10760](https://github.com/googleapis/google-cloud-go/issues/10760) * **storage:** Wait for XML read req to finish to avoid data races ([#11527](https://github.com/googleapis/google-cloud-go/issues/11527)) ([782e12a](https://github.com/googleapis/google-cloud-go/commit/782e12a11c1dfe6d831f5d0b9b5f4409993e4d9e)) ## [1.50.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.49.0...storage/v1.50.0) (2025-01-09) ### Features * **storage/internal:** Add new appendable Object to BidiWrite API ([2e4feb9](https://github.com/googleapis/google-cloud-go/commit/2e4feb938ce9ab023c8aa6bd1dbdf36fe589213a)) * **storage/internal:** Add new preview BidiReadObject API ([2e4feb9](https://github.com/googleapis/google-cloud-go/commit/2e4feb938ce9ab023c8aa6bd1dbdf36fe589213a)) * **storage:** Add support for gRPC bi-directional multi-range reads. This API is in private preview and not generally and is not yet available for general use. ([#11377](https://github.com/googleapis/google-cloud-go/issues/11377)) ([b4d86a5](https://github.com/googleapis/google-cloud-go/commit/b4d86a52bd319a602115cdb710a743c71494a88b)) * **storage:** Add support for ReadHandle, a gRPC feature that allows for accelerated resumption of streams when one is interrupted. ReadHandle requires the bi-directional read API, which is in private preview and is not yet available for general use. ([#11377](https://github.com/googleapis/google-cloud-go/issues/11377)) ([b4d86a5](https://github.com/googleapis/google-cloud-go/commit/b4d86a52bd319a602115cdb710a743c71494a88b)) * **storage:** Support appendable semantics for writes in gRPC. This API is in preview. ([#11377](https://github.com/googleapis/google-cloud-go/issues/11377)) ([b4d86a5](https://github.com/googleapis/google-cloud-go/commit/b4d86a52bd319a602115cdb710a743c71494a88b)) * **storage:** Refactor gRPC writer flow ([#11377](https://github.com/googleapis/google-cloud-go/issues/11377)) ([b4d86a5](https://github.com/googleapis/google-cloud-go/commit/b4d86a52bd319a602115cdb710a743c71494a88b)) ### Bug Fixes * **storage:** Add mutex around uses of mrd variables ([#11405](https://github.com/googleapis/google-cloud-go/issues/11405)) ([54bfc32](https://github.com/googleapis/google-cloud-go/commit/54bfc32db7a0ff40a493de4d466f21ad624de04e)) * **storage:** Return the appropriate error for method not supported ([#11416](https://github.com/googleapis/google-cloud-go/issues/11416)) ([56d704e](https://github.com/googleapis/google-cloud-go/commit/56d704e3037840aeb87b22cc83f2b6088c79bcee)) ### Documentation * **storage/internal:** Add IAM information to RPC comments for reference documentation ([2e4feb9](https://github.com/googleapis/google-cloud-go/commit/2e4feb938ce9ab023c8aa6bd1dbdf36fe589213a)) * **storage:** Add preview comment to NewMultiRangeDownloader ([#11420](https://github.com/googleapis/google-cloud-go/issues/11420)) ([4ec1d66](https://github.com/googleapis/google-cloud-go/commit/4ec1d66ee180e800606568e8693a282645ec7369)) ## [1.49.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.48.0...storage/v1.49.0) (2024-12-21) ### Features * **storage/internal:** Add finalize_time field in Object metadata ([46fc993](https://github.com/googleapis/google-cloud-go/commit/46fc993a3195203a230e2831bee456baaa9f7b1c)) * **storage/internal:** Add MoveObject RPC ([46fc993](https://github.com/googleapis/google-cloud-go/commit/46fc993a3195203a230e2831bee456baaa9f7b1c)) * **storage:** Add ObjectHandle.Move method ([#11302](https://github.com/googleapis/google-cloud-go/issues/11302)) ([a3cb8c4](https://github.com/googleapis/google-cloud-go/commit/a3cb8c4fc48883b54d4e830ae5f5ef4f1a3b8ca3)) * **storage:** Return file metadata on read ([#11212](https://github.com/googleapis/google-cloud-go/issues/11212)) ([d49263b](https://github.com/googleapis/google-cloud-go/commit/d49263b2ab614cad801e26b4a169eafe08d4a2a0)) ### Bug Fixes * **storage/dataflux:** Address deadlock when reading from ranges ([#11303](https://github.com/googleapis/google-cloud-go/issues/11303)) ([32cbf56](https://github.com/googleapis/google-cloud-go/commit/32cbf561590541eb0387787bf729be6ddf68e4ee)) * **storage:** Disable allow non-default credentials flag ([#11337](https://github.com/googleapis/google-cloud-go/issues/11337)) ([145ddf4](https://github.com/googleapis/google-cloud-go/commit/145ddf4f6123d9561856d2b6adeefdfae462b3f7)) * **storage:** Monitored resource detection ([#11197](https://github.com/googleapis/google-cloud-go/issues/11197)) ([911bcd8](https://github.com/googleapis/google-cloud-go/commit/911bcd8b1816256482bd52e85da7eaf00c315293)) * **storage:** Update golang.org/x/net to v0.33.0 ([e9b0b69](https://github.com/googleapis/google-cloud-go/commit/e9b0b69644ea5b276cacff0a707e8a5e87efafc9)) ## [1.48.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.47.0...storage/v1.48.0) (2024-12-05) ### Features * **storage/dataflux:** Run worksteal listing parallel to sequential listing ([#10966](https://github.com/googleapis/google-cloud-go/issues/10966)) ([3005f5a](https://github.com/googleapis/google-cloud-go/commit/3005f5a86c18254e569b8b1782bf014aa62f33cc)) * **storage:** Add Writer.ChunkTransferTimeout ([#11111](https://github.com/googleapis/google-cloud-go/issues/11111)) ([fd1db20](https://github.com/googleapis/google-cloud-go/commit/fd1db203d0de898891b9920aacb141ea39228609)) * **storage:** Allow non default service account ([#11137](https://github.com/googleapis/google-cloud-go/issues/11137)) ([19f01c3](https://github.com/googleapis/google-cloud-go/commit/19f01c3c48ed1272c8fc0af9e5f69646cb662808)) ### Bug Fixes * **storage:** Add backoff to gRPC write retries ([#11200](https://github.com/googleapis/google-cloud-go/issues/11200)) ([a7db927](https://github.com/googleapis/google-cloud-go/commit/a7db927da9cf4c6cf242a5db83e44a16d75a8291)) * **storage:** Correct direct connectivity check ([#11152](https://github.com/googleapis/google-cloud-go/issues/11152)) ([a75c8b0](https://github.com/googleapis/google-cloud-go/commit/a75c8b0f72c38d9a85c908715c3e37eb5cffb131)) * **storage:** Disable soft delete policy using 0 retentionDurationSeconds ([#11226](https://github.com/googleapis/google-cloud-go/issues/11226)) ([f087721](https://github.com/googleapis/google-cloud-go/commit/f087721b7b20ad28ded1d0a84756a8bbaa2bb95a)) * **storage:** Retry SignBlob call for URL signing ([#11154](https://github.com/googleapis/google-cloud-go/issues/11154)) ([f198452](https://github.com/googleapis/google-cloud-go/commit/f198452fd2b29e779e9080ba79d7e873eb0c32ef)) ## [1.47.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.46.0...storage/v1.47.0) (2024-11-14) ### Features * **storage:** Introduce dp detector based on grpc metrics ([#11100](https://github.com/googleapis/google-cloud-go/issues/11100)) ([60c2323](https://github.com/googleapis/google-cloud-go/commit/60c2323102b623e042fc508e2b1bb830a03f9577)) ### Bug Fixes * **storage:** Bump auth dep ([#11135](https://github.com/googleapis/google-cloud-go/issues/11135)) ([9620a51](https://github.com/googleapis/google-cloud-go/commit/9620a51b2c6904d8d93e124494bc297fb98553d2)) ## [1.46.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.45.0...storage/v1.46.0) (2024-10-31) ### Features * **storage:** Add grpc metrics experimental options ([#10984](https://github.com/googleapis/google-cloud-go/issues/10984)) ([5b7397b](https://github.com/googleapis/google-cloud-go/commit/5b7397b169176f030049e1511859a883422c774e)) ### Bug Fixes * **storage:** Skip only specific transport tests. ([#11016](https://github.com/googleapis/google-cloud-go/issues/11016)) ([d40fbff](https://github.com/googleapis/google-cloud-go/commit/d40fbff9c1984aeed0224a4ac93eb95c5af17126)) * **storage:** Update google.golang.org/api to v0.203.0 ([8bb87d5](https://github.com/googleapis/google-cloud-go/commit/8bb87d56af1cba736e0fe243979723e747e5e11e)) * **storage:** WARNING: On approximately Dec 1, 2024, an update to Protobuf will change service registration function signatures to use an interface instead of a concrete type in generated .pb.go files. This change is expected to affect very few if any users of this client library. For more information, see https://togithub.com/googleapis/google-cloud-go/issues/11020. ([2b8ca4b](https://github.com/googleapis/google-cloud-go/commit/2b8ca4b4127ce3025c7a21cc7247510e07cc5625)) ### Miscellaneous Chores * **storage/internal:** Remove notification, service account, and hmac RPCS. These API have been migrated to Storage Control and are available via the JSON API. ([#11008](https://github.com/googleapis/google-cloud-go/issues/11008)) ([e0759f4](https://github.com/googleapis/google-cloud-go/commit/e0759f46639b4c542e5b49e4dc81340d8e123370)) ## [1.45.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.44.0...storage/v1.45.0) (2024-10-17) ### Features * **storage/internal:** Adds support for restore token ([70d82fe](https://github.com/googleapis/google-cloud-go/commit/70d82fe93f60f1075298a077ce1616f9ae7e13fe)) * **storage:** Adding bucket-specific dynamicDelay ([#10987](https://github.com/googleapis/google-cloud-go/issues/10987)) ([a807a7e](https://github.com/googleapis/google-cloud-go/commit/a807a7e7f9fb002374407622c126102c5e61af82)) * **storage:** Dynamic read request stall timeout ([#10958](https://github.com/googleapis/google-cloud-go/issues/10958)) ([a09f00e](https://github.com/googleapis/google-cloud-go/commit/a09f00eeecac82af98ae769bab284ee58a3a66cb)) ### Documentation * **storage:** Remove preview wording from NewGRPCClient ([#11002](https://github.com/googleapis/google-cloud-go/issues/11002)) ([40c3a5b](https://github.com/googleapis/google-cloud-go/commit/40c3a5b9c4cd4db2f1695e180419197b6a03ed7f)) ## [1.44.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.43.0...storage/v1.44.0) (2024-10-03) ### Features * **storage/dataflux:** Add dataflux interface ([#10748](https://github.com/googleapis/google-cloud-go/issues/10748)) ([cb7b0a1](https://github.com/googleapis/google-cloud-go/commit/cb7b0a1b285de9d4182155a123747419232dd35f)) * **storage/dataflux:** Add range_splitter [#10748](https://github.com/googleapis/google-cloud-go/issues/10748) ([#10899](https://github.com/googleapis/google-cloud-go/issues/10899)) ([d49da26](https://github.com/googleapis/google-cloud-go/commit/d49da26be7dc52fad37c392c2876f62b1a5625a2)) * **storage/dataflux:** Add worksteal algorithm to fast-listing ([#10913](https://github.com/googleapis/google-cloud-go/issues/10913)) ([015b52c](https://github.com/googleapis/google-cloud-go/commit/015b52c345df75408be3edcfda96d37145794f9f)) * **storage/internal:** Add managed folder to testIamPermissions method ([2f0aec8](https://github.com/googleapis/google-cloud-go/commit/2f0aec894179304d234be6c792d82cf4336b6d0a)) * **storage/transfermanager:** Add option to StripPrefix on directory download ([#10894](https://github.com/googleapis/google-cloud-go/issues/10894)) ([607534c](https://github.com/googleapis/google-cloud-go/commit/607534cdd5edf2d15d3de891cf6a0b6cbaa7d545)) * **storage/transfermanager:** Add SkipIfExists option ([#10893](https://github.com/googleapis/google-cloud-go/issues/10893)) ([7daa1bd](https://github.com/googleapis/google-cloud-go/commit/7daa1bdc78844adac80f6378b1f6f2dd415b80a8)) * **storage/transfermanager:** Checksum full object downloads ([#10569](https://github.com/googleapis/google-cloud-go/issues/10569)) ([c366c90](https://github.com/googleapis/google-cloud-go/commit/c366c908534ef09442f1f3e8a4f74bd545a474fb)) * **storage:** Add direct google access side-effect imports by default ([#10757](https://github.com/googleapis/google-cloud-go/issues/10757)) ([9ad8324](https://github.com/googleapis/google-cloud-go/commit/9ad83248a7049c82580bc45d9685c329811bce88)) * **storage:** Add full object checksum to reader.Attrs ([#10538](https://github.com/googleapis/google-cloud-go/issues/10538)) ([245d2ea](https://github.com/googleapis/google-cloud-go/commit/245d2eaddb4862da7c8d1892d5d462bf390adb2b)) * **storage:** Add support for Go 1.23 iterators ([84461c0](https://github.com/googleapis/google-cloud-go/commit/84461c0ba464ec2f951987ba60030e37c8a8fc18)) * **storage:** Add update time in bucketAttrs ([#10710](https://github.com/googleapis/google-cloud-go/issues/10710)) ([5f06ae1](https://github.com/googleapis/google-cloud-go/commit/5f06ae1a331c46ded47c96c205b3f1be92d64d29)), refs [#9361](https://github.com/googleapis/google-cloud-go/issues/9361) * **storage:** GA gRPC client ([#10859](https://github.com/googleapis/google-cloud-go/issues/10859)) ([c7a55a2](https://github.com/googleapis/google-cloud-go/commit/c7a55a26c645905317fe27505d503c338f50ee34)) * **storage:** Introduce gRPC client-side metrics ([#10639](https://github.com/googleapis/google-cloud-go/issues/10639)) ([437bcb1](https://github.com/googleapis/google-cloud-go/commit/437bcb1e0b514959648eed36ba3963aa4fbeffc8)) * **storage:** Support IncludeFoldersAsPrefixes for gRPC ([#10767](https://github.com/googleapis/google-cloud-go/issues/10767)) ([65bcc59](https://github.com/googleapis/google-cloud-go/commit/65bcc59a6c0753f8fbd66c8792bc69300e95ec62)) ### Bug Fixes * **storage/transfermanager:** Correct Attrs.StartOffset for sharded downloads ([#10512](https://github.com/googleapis/google-cloud-go/issues/10512)) ([01a5cbb](https://github.com/googleapis/google-cloud-go/commit/01a5cbba6d9d9f425f045b58fa16d8c85804c29c)) * **storage:** Add retryalways policy to encryption test ([#10644](https://github.com/googleapis/google-cloud-go/issues/10644)) ([59cfd12](https://github.com/googleapis/google-cloud-go/commit/59cfd12ce5650279c99787da4a273db1e3253c76)), refs [#10567](https://github.com/googleapis/google-cloud-go/issues/10567) * **storage:** Add unknown host to retriable errors ([#10619](https://github.com/googleapis/google-cloud-go/issues/10619)) ([4ec0452](https://github.com/googleapis/google-cloud-go/commit/4ec0452a393341b1036ac6e1e7287843f097d978)) * **storage:** Bump dependencies ([2ddeb15](https://github.com/googleapis/google-cloud-go/commit/2ddeb1544a53188a7592046b98913982f1b0cf04)) * **storage:** Bump google.golang.org/grpc@v1.64.1 ([8ecc4e9](https://github.com/googleapis/google-cloud-go/commit/8ecc4e9622e5bbe9b90384d5848ab816027226c5)) * **storage:** Check for grpc NotFound error in HMAC test ([#10645](https://github.com/googleapis/google-cloud-go/issues/10645)) ([3c8e88a](https://github.com/googleapis/google-cloud-go/commit/3c8e88a085bab3142dfff6ef9a8e49c29a5c877d)) * **storage:** Disable grpc metrics using emulator ([#10870](https://github.com/googleapis/google-cloud-go/issues/10870)) ([35ad73d](https://github.com/googleapis/google-cloud-go/commit/35ad73d3be5485ac592e2ef1ea6c0854f1eff4a0)) * **storage:** Retry gRPC DEADLINE_EXCEEDED errors ([#10635](https://github.com/googleapis/google-cloud-go/issues/10635)) ([0018415](https://github.com/googleapis/google-cloud-go/commit/0018415295a5fd964b923db6a4785e9eed46a2e2)) * **storage:** Update dependencies ([257c40b](https://github.com/googleapis/google-cloud-go/commit/257c40bd6d7e59730017cf32bda8823d7a232758)) * **storage:** Update google.golang.org/api to v0.191.0 ([5b32644](https://github.com/googleapis/google-cloud-go/commit/5b32644eb82eb6bd6021f80b4fad471c60fb9d73)) ### Performance Improvements * **storage:** GRPC zerocopy codec ([#10888](https://github.com/googleapis/google-cloud-go/issues/10888)) ([aeba28f](https://github.com/googleapis/google-cloud-go/commit/aeba28ffffcd82ac5540e45247112bdacc5c530d)) ### Documentation * **storage/internal:** Clarify possible objectAccessControl roles ([2f0aec8](https://github.com/googleapis/google-cloud-go/commit/2f0aec894179304d234be6c792d82cf4336b6d0a)) * **storage/internal:** Update dual-region bucket link ([2f0aec8](https://github.com/googleapis/google-cloud-go/commit/2f0aec894179304d234be6c792d82cf4336b6d0a)) ## [1.43.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.42.0...storage/v1.43.0) (2024-07-03) ### Features * **storage/transfermanager:** Add DownloadDirectory ([#10430](https://github.com/googleapis/google-cloud-go/issues/10430)) ([0d0e5dd](https://github.com/googleapis/google-cloud-go/commit/0d0e5dd5214769cc2c197991c2ece1303bd600de)) * **storage/transfermanager:** Automatically shard downloads ([#10379](https://github.com/googleapis/google-cloud-go/issues/10379)) ([05816f9](https://github.com/googleapis/google-cloud-go/commit/05816f9fafd3132c371da37f3a879bb9e8e7e604)) ### Bug Fixes * **storage/transfermanager:** WaitAndClose waits for Callbacks to finish ([#10504](https://github.com/googleapis/google-cloud-go/issues/10504)) ([0e81002](https://github.com/googleapis/google-cloud-go/commit/0e81002b3a5e560c874d814d28a35a102311d9ef)), refs [#10502](https://github.com/googleapis/google-cloud-go/issues/10502) * **storage:** Allow empty soft delete on Create ([#10394](https://github.com/googleapis/google-cloud-go/issues/10394)) ([d8bd2c1](https://github.com/googleapis/google-cloud-go/commit/d8bd2c1ffc4f27503a74ded438d8bfbdd7707c63)), refs [#10380](https://github.com/googleapis/google-cloud-go/issues/10380) * **storage:** Bump google.golang.org/api@v0.187.0 ([8fa9e39](https://github.com/googleapis/google-cloud-go/commit/8fa9e398e512fd8533fd49060371e61b5725a85b)) * **storage:** Retry broken pipe error ([#10374](https://github.com/googleapis/google-cloud-go/issues/10374)) ([2f4daa1](https://github.com/googleapis/google-cloud-go/commit/2f4daa11acf9d3f260fa888333090359c4d9198e)), refs [#9178](https://github.com/googleapis/google-cloud-go/issues/9178) ### Documentation * **storage/control:** Remove allowlist note from Folders RPCs ([d6c543c](https://github.com/googleapis/google-cloud-go/commit/d6c543c3969016c63e158a862fc173dff60fb8d9)) ## [1.42.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.41.0...storage/v1.42.0) (2024-06-10) ### Features * **storage:** Add new package transfermanager. This package is intended for parallel uploads and downloads, and is in preview. It is not stable, and is likely to change. ([#10045](https://github.com/googleapis/google-cloud-go/issues/10045)) ([cde5cbb](https://github.com/googleapis/google-cloud-go/commit/cde5cbba3145d5a702683656a42158621234fe71)) * **storage:** Add bucket HierarchicalNamespace ([#10315](https://github.com/googleapis/google-cloud-go/issues/10315)) ([b92406c](https://github.com/googleapis/google-cloud-go/commit/b92406ccfadfdcee379e86d6f78c901d772401a9)), refs [#10146](https://github.com/googleapis/google-cloud-go/issues/10146) * **storage:** Add BucketName to BucketHandle ([#10127](https://github.com/googleapis/google-cloud-go/issues/10127)) ([203cc59](https://github.com/googleapis/google-cloud-go/commit/203cc599e5e2f2f821dc75b47c5a4c9073333f05)) ### Bug Fixes * **storage:** Set invocation headers on xml reads ([#10250](https://github.com/googleapis/google-cloud-go/issues/10250)) ([c87e1ab](https://github.com/googleapis/google-cloud-go/commit/c87e1ab6f9618b8b3f4d0005ac159abd87b0daaf)) ### Documentation * **storage:** Update autoclass doc ([#10135](https://github.com/googleapis/google-cloud-go/issues/10135)) ([e4b2737](https://github.com/googleapis/google-cloud-go/commit/e4b2737ddc16d3bf8139a6def7326ac905f62acd)) ## [1.41.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.40.0...storage/v1.41.0) (2024-05-13) ### Features * **storage/control:** Make Managed Folders operations public ([264a6dc](https://github.com/googleapis/google-cloud-go/commit/264a6dcddbffaec987dce1dc00f6550c263d2df7)) * **storage:** Support for soft delete policies and restore ([#9520](https://github.com/googleapis/google-cloud-go/issues/9520)) ([985deb2](https://github.com/googleapis/google-cloud-go/commit/985deb2bdd1c79944cdd960bd3fbfa38cbfa1c91)) ### Bug Fixes * **storage/control:** An existing resource pattern value `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder=**}` to resource definition `storage.googleapis.com/ManagedFolder` is removed ([3e25053](https://github.com/googleapis/google-cloud-go/commit/3e250530567ee81ed4f51a3856c5940dbec35289)) * **storage:** Add internaloption.WithDefaultEndpointTemplate ([3b41408](https://github.com/googleapis/google-cloud-go/commit/3b414084450a5764a0248756e95e13383a645f90)) * **storage:** Bump x/net to v0.24.0 ([ba31ed5](https://github.com/googleapis/google-cloud-go/commit/ba31ed5fda2c9664f2e1cf972469295e63deb5b4)) * **storage:** Disable gax retries for gRPC ([#9747](https://github.com/googleapis/google-cloud-go/issues/9747)) ([bbfc0ac](https://github.com/googleapis/google-cloud-go/commit/bbfc0acc272f21bf1f558ea23648183d5a11cda5)) * **storage:** More strongly match regex ([#9706](https://github.com/googleapis/google-cloud-go/issues/9706)) ([3cfc8eb](https://github.com/googleapis/google-cloud-go/commit/3cfc8eb418e064d734bf3d8708162062dbbe988f)), refs [#9705](https://github.com/googleapis/google-cloud-go/issues/9705) * **storage:** Retry net.OpError on connection reset ([#10154](https://github.com/googleapis/google-cloud-go/issues/10154)) ([54fab10](https://github.com/googleapis/google-cloud-go/commit/54fab107f98b4f79c9df2959a05b981be0a613c1)), refs [#9478](https://github.com/googleapis/google-cloud-go/issues/9478) * **storage:** Wrap error when MaxAttempts is hit ([#9767](https://github.com/googleapis/google-cloud-go/issues/9767)) ([9cb262b](https://github.com/googleapis/google-cloud-go/commit/9cb262bb65a162665bfb8bed0022615131bae1f2)), refs [#9720](https://github.com/googleapis/google-cloud-go/issues/9720) ### Documentation * **storage/control:** Update storage control documentation and add PHP for publishing ([1d757c6](https://github.com/googleapis/google-cloud-go/commit/1d757c66478963d6cbbef13fee939632c742759c)) ## [1.40.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.39.1...storage/v1.40.0) (2024-03-29) ### Features * **storage:** Implement io.WriterTo in Reader ([#9659](https://github.com/googleapis/google-cloud-go/issues/9659)) ([8264a96](https://github.com/googleapis/google-cloud-go/commit/8264a962d1c21d52e8fca50af064c5535c3708d3)) * **storage:** New storage control client ([#9631](https://github.com/googleapis/google-cloud-go/issues/9631)) ([1f4d279](https://github.com/googleapis/google-cloud-go/commit/1f4d27957743878976d6b4549cc02a5bb894d330)) ### Bug Fixes * **storage:** Retry errors from last recv on uploads ([#9616](https://github.com/googleapis/google-cloud-go/issues/9616)) ([b6574aa](https://github.com/googleapis/google-cloud-go/commit/b6574aa42ebad0532c2749b6ece879b932f95cb9)) * **storage:** Update protobuf dep to v1.33.0 ([30b038d](https://github.com/googleapis/google-cloud-go/commit/30b038d8cac0b8cd5dd4761c87f3f298760dd33a)) ### Performance Improvements * **storage:** Remove protobuf's copy of data on unmarshalling ([#9526](https://github.com/googleapis/google-cloud-go/issues/9526)) ([81281c0](https://github.com/googleapis/google-cloud-go/commit/81281c04e503fd83301baf88cc352c77f5d476ca)) ## [1.39.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.39.0...storage/v1.39.1) (2024-03-11) ### Bug Fixes * **storage:** Add object validation case and test ([#9521](https://github.com/googleapis/google-cloud-go/issues/9521)) ([386bef3](https://github.com/googleapis/google-cloud-go/commit/386bef319b4678beaa926ddfe4edef190f11b68d)) ## [1.39.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.38.0...storage/v1.39.0) (2024-02-29) ### Features * **storage:** Make it possible to disable Content-Type sniffing ([#9431](https://github.com/googleapis/google-cloud-go/issues/9431)) ([0676670](https://github.com/googleapis/google-cloud-go/commit/067667058c06689b64401be11858d84441584039)) ## [1.38.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.37.0...storage/v1.38.0) (2024-02-12) ### Features * **storage:** Support auto-detection of access ID for external_account creds ([#9208](https://github.com/googleapis/google-cloud-go/issues/9208)) ([b958d44](https://github.com/googleapis/google-cloud-go/commit/b958d44589f2b6b226ea3bef23829ac75a0aa6a6)) * **storage:** Support custom hostname for VirtualHostedStyle SignedURLs ([#9348](https://github.com/googleapis/google-cloud-go/issues/9348)) ([7eec40e](https://github.com/googleapis/google-cloud-go/commit/7eec40e4cf82c53e5bf02bd2c14e0b25043da6d0)) * **storage:** Support universe domains ([#9344](https://github.com/googleapis/google-cloud-go/issues/9344)) ([29a7498](https://github.com/googleapis/google-cloud-go/commit/29a7498b8eb0d00fdb5acd7ee8ce0e5a2a8c11ce)) ### Bug Fixes * **storage:** Fix v4 url signing for hosts that specify ports ([#9347](https://github.com/googleapis/google-cloud-go/issues/9347)) ([f127b46](https://github.com/googleapis/google-cloud-go/commit/f127b4648f861c1ba44f41a280a62652620c04c2)) ### Documentation * **storage:** Indicate that gRPC is incompatible with universe domains ([#9386](https://github.com/googleapis/google-cloud-go/issues/9386)) ([e8bd85b](https://github.com/googleapis/google-cloud-go/commit/e8bd85bbce12d5f7ab87fa49d166a6a0d84bd12d)) ## [1.37.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.36.0...storage/v1.37.0) (2024-01-24) ### Features * **storage:** Add maxAttempts RetryOption ([#9215](https://github.com/googleapis/google-cloud-go/issues/9215)) ([e348cc5](https://github.com/googleapis/google-cloud-go/commit/e348cc5340e127b530e8ee4664fd995e6f038b2c)) * **storage:** Support IncludeFoldersAsPrefixes ([#9211](https://github.com/googleapis/google-cloud-go/issues/9211)) ([98c9d71](https://github.com/googleapis/google-cloud-go/commit/98c9d7157306de5134547a67c084c248484c9a51)) ### Bug Fixes * **storage:** Migrate deprecated proto dep ([#9232](https://github.com/googleapis/google-cloud-go/issues/9232)) ([ebbb610](https://github.com/googleapis/google-cloud-go/commit/ebbb610e0f58035fd01ad7893971382d8bbd092f)), refs [#9189](https://github.com/googleapis/google-cloud-go/issues/9189) ## [1.36.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.35.1...storage/v1.36.0) (2023-12-14) ### Features * **storage:** Add object retention feature ([#9072](https://github.com/googleapis/google-cloud-go/issues/9072)) ([16ecfd1](https://github.com/googleapis/google-cloud-go/commit/16ecfd150ff1982f03d207a80a82e934d1013874)) ### Bug Fixes * **storage:** Do not inhibit the dead code elimination. ([#8543](https://github.com/googleapis/google-cloud-go/issues/8543)) ([ca2493f](https://github.com/googleapis/google-cloud-go/commit/ca2493f43c299bbaed5f7e5b70f66cc763ff9802)) * **storage:** Set flush and get_state to false on the last write in gRPC ([#9013](https://github.com/googleapis/google-cloud-go/issues/9013)) ([c1e9fe5](https://github.com/googleapis/google-cloud-go/commit/c1e9fe5f4166a71e55814ccf126926ec0e0e7945)) ## [1.35.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.35.0...storage/v1.35.1) (2023-11-09) ### Bug Fixes * **storage:** Rename aux.go to auxiliary.go fixing windows build ([ba23673](https://github.com/googleapis/google-cloud-go/commit/ba23673da7707c31292e4aa29d65b7ac1446d4a6)) ## [1.35.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.34.1...storage/v1.35.0) (2023-11-09) ### Features * **storage:** Change gRPC writes to use bi-directional streams ([#8930](https://github.com/googleapis/google-cloud-go/issues/8930)) ([3e23a36](https://github.com/googleapis/google-cloud-go/commit/3e23a364b1a20c4fda7aef257e4136586ec769a4)) ## [1.34.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.34.0...storage/v1.34.1) (2023-11-01) ### Bug Fixes * **storage:** Bump google.golang.org/api to v0.149.0 ([8d2ab9f](https://github.com/googleapis/google-cloud-go/commit/8d2ab9f320a86c1c0fab90513fc05861561d0880)) ## [1.34.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.33.0...storage/v1.34.0) (2023-10-31) ### Features * **storage/internal:** Add match_glob field to ListObjectsRequest ([#8618](https://github.com/googleapis/google-cloud-go/issues/8618)) ([e9ae601](https://github.com/googleapis/google-cloud-go/commit/e9ae6018983ae09781740e4ff939e6e365863dbb)) * **storage/internal:** Add terminal_storage_class fields to Autoclass message ([57fc1a6](https://github.com/googleapis/google-cloud-go/commit/57fc1a6de326456eb68ef25f7a305df6636ed386)) * **storage/internal:** Adds the RestoreObject operation ([56ce871](https://github.com/googleapis/google-cloud-go/commit/56ce87195320634b07ae0b012efcc5f2b3813fb0)) * **storage:** Support autoclass v2.1 ([#8721](https://github.com/googleapis/google-cloud-go/issues/8721)) ([fe1e195](https://github.com/googleapis/google-cloud-go/commit/fe1e19590a252c6adc6ca6c51a69b6e561e143b8)) * **storage:** Support MatchGlob for gRPC ([#8670](https://github.com/googleapis/google-cloud-go/issues/8670)) ([3df0287](https://github.com/googleapis/google-cloud-go/commit/3df0287f88d5e2c4526e9e6b8dc2a4ca54f88918)), refs [#7727](https://github.com/googleapis/google-cloud-go/issues/7727) ### Bug Fixes * **storage:** Drop stream reference after closing it for gRPC writes ([#8872](https://github.com/googleapis/google-cloud-go/issues/8872)) ([525abde](https://github.com/googleapis/google-cloud-go/commit/525abdee433864d4d456f1f1fff5599017b557ff)) * **storage:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d)) * **storage:** Update grpc-go to v1.56.3 ([343cea8](https://github.com/googleapis/google-cloud-go/commit/343cea8c43b1e31ae21ad50ad31d3b0b60143f8c)) * **storage:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7)) ## [1.33.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.32.0...storage/v1.33.0) (2023-09-07) ### Features * **storage:** Export gRPC client constructor ([#8509](https://github.com/googleapis/google-cloud-go/issues/8509)) ([1a928ae](https://github.com/googleapis/google-cloud-go/commit/1a928ae205f2325cb5206304af4d609dc3c1447a)) ## [1.32.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.31.0...storage/v1.32.0) (2023-08-15) ### Features * **storage:** Add support for custom headers ([#8294](https://github.com/googleapis/google-cloud-go/issues/8294)) ([313fd4a](https://github.com/googleapis/google-cloud-go/commit/313fd4a60380d36c5ecaead3e968dbc84d044a0b)) * **storage:** Add trace span to Writer ([#8375](https://github.com/googleapis/google-cloud-go/issues/8375)) ([f7ac85b](https://github.com/googleapis/google-cloud-go/commit/f7ac85bec2806d351529714bd7744a91a9fdefdd)), refs [#6144](https://github.com/googleapis/google-cloud-go/issues/6144) * **storage:** Support single-shot uploads in gRPC ([#8348](https://github.com/googleapis/google-cloud-go/issues/8348)) ([7de4a7d](https://github.com/googleapis/google-cloud-go/commit/7de4a7da31ab279a343b1592b15a126cda03e5e7)), refs [#7798](https://github.com/googleapis/google-cloud-go/issues/7798) * **storage:** Trace span covers life of a Reader ([#8390](https://github.com/googleapis/google-cloud-go/issues/8390)) ([8de30d7](https://github.com/googleapis/google-cloud-go/commit/8de30d752eec2fed2ea4c127482d3e213f9050e2)) ### Bug Fixes * **storage:** Fix AllObjects condition in gRPC ([#8184](https://github.com/googleapis/google-cloud-go/issues/8184)) ([2b99e4f](https://github.com/googleapis/google-cloud-go/commit/2b99e4f39be20fe21e8bc5c1ec1c0e758222c46e)), refs [#6205](https://github.com/googleapis/google-cloud-go/issues/6205) * **storage:** Fix gRPC generation/condition issues ([#8396](https://github.com/googleapis/google-cloud-go/issues/8396)) ([ca68ff5](https://github.com/googleapis/google-cloud-go/commit/ca68ff54b680732b59b223655070d0f6abccefee)) * **storage:** Same method name and Trace Span name ([#8150](https://github.com/googleapis/google-cloud-go/issues/8150)) ([e277213](https://github.com/googleapis/google-cloud-go/commit/e2772133896bb94097b5d1f090f1bcafd136f2ed)) * **storage:** Update gRPC retry codes ([#8202](https://github.com/googleapis/google-cloud-go/issues/8202)) ([afdf772](https://github.com/googleapis/google-cloud-go/commit/afdf772fc6a90b3010eee9d70ab65e22e276f53f)) ## [1.31.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.30.1...storage/v1.31.0) (2023-06-27) ### Features * **storage/internal:** Add ctype=CORD for ChecksummedData.content ([ca94e27](https://github.com/googleapis/google-cloud-go/commit/ca94e2724f9e2610b46aefd0a3b5ddc06102e91b)) * **storage:** Add support for MatchGlob ([#8097](https://github.com/googleapis/google-cloud-go/issues/8097)) ([9426a5a](https://github.com/googleapis/google-cloud-go/commit/9426a5a45d4c2fd07f84261f6d602680e79cdc48)), refs [#7727](https://github.com/googleapis/google-cloud-go/issues/7727) [#7728](https://github.com/googleapis/google-cloud-go/issues/7728) * **storage:** Respect WithEndpoint for SignedURLs and PostPolicy ([#8113](https://github.com/googleapis/google-cloud-go/issues/8113)) ([f918f23](https://github.com/googleapis/google-cloud-go/commit/f918f23a3cda4fbc8d709e32b914ead8b735d664)) * **storage:** Update all direct dependencies ([b340d03](https://github.com/googleapis/google-cloud-go/commit/b340d030f2b52a4ce48846ce63984b28583abde6)) ### Bug Fixes * **storage:** Fix CreateBucket logic for gRPC ([#8165](https://github.com/googleapis/google-cloud-go/issues/8165)) ([8424e7e](https://github.com/googleapis/google-cloud-go/commit/8424e7e145a117c91006318fa924a8b2643c1c7e)), refs [#8162](https://github.com/googleapis/google-cloud-go/issues/8162) * **storage:** Fix reads with "./" in object names [XML] ([#8017](https://github.com/googleapis/google-cloud-go/issues/8017)) ([6b7b21f](https://github.com/googleapis/google-cloud-go/commit/6b7b21f8a334b6ad3a25e1f66ae1265b4d1f0995)) * **storage:** Fix routing header for writes ([#8159](https://github.com/googleapis/google-cloud-go/issues/8159)) ([42a59f5](https://github.com/googleapis/google-cloud-go/commit/42a59f5a23ab9b4743ab032ad92304922c801d93)), refs [#8142](https://github.com/googleapis/google-cloud-go/issues/8142) [#8143](https://github.com/googleapis/google-cloud-go/issues/8143) [#8144](https://github.com/googleapis/google-cloud-go/issues/8144) [#8145](https://github.com/googleapis/google-cloud-go/issues/8145) [#8149](https://github.com/googleapis/google-cloud-go/issues/8149) * **storage:** REST query UpdateMask bug ([df52820](https://github.com/googleapis/google-cloud-go/commit/df52820b0e7721954809a8aa8700b93c5662dc9b)) * **storage:** Update grpc to v1.55.0 ([1147ce0](https://github.com/googleapis/google-cloud-go/commit/1147ce02a990276ca4f8ab7a1ab65c14da4450ef)) ### Documentation * **storage/internal:** Clarifications about behavior of DeleteObject RPC ([3f1ed9c](https://github.com/googleapis/google-cloud-go/commit/3f1ed9c63fb115f47607a3ab478842fe5ba0df11)) * **storage/internal:** Clarified the behavior of supplying bucket.name field in CreateBucket to reflect actual implementation ([ebae64d](https://github.com/googleapis/google-cloud-go/commit/ebae64d53397ec5dfe851f098754eaa1f5df7cb1)) * **storage/internal:** Revert ChecksummedData message definition not to specify ctype=CORD, because it would be a breaking change. ([ef61e47](https://github.com/googleapis/google-cloud-go/commit/ef61e4799280a355b960da8ae240ceb2efbe71ac)) * **storage/internal:** Update routing annotations for CancelResumableWriteRequest and QueryWriteStatusRequest ([4900851](https://github.com/googleapis/google-cloud-go/commit/49008518e168fe6f7891b907d6fc14eecdef758c)) * **storage/internal:** Updated ChecksummedData message definition to specify ctype=CORD, and removed incorrect earlier attempt that set that annotation in the ReadObjectResponse message definition ([ef61e47](https://github.com/googleapis/google-cloud-go/commit/ef61e4799280a355b960da8ae240ceb2efbe71ac)) * **storage:** WithXMLReads should mention XML instead of JSON API ([#7881](https://github.com/googleapis/google-cloud-go/issues/7881)) ([36f56c8](https://github.com/googleapis/google-cloud-go/commit/36f56c80c456ca74ffc03df76844ce15980ced82)) ## [1.30.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.30.0...storage/v1.30.1) (2023-03-21) ### Bug Fixes * **storage:** Retract versions with Copier bug ([#7583](https://github.com/googleapis/google-cloud-go/issues/7583)) ([9c10b6f](https://github.com/googleapis/google-cloud-go/commit/9c10b6f8a54cb8447260148b5e4a9b5160281020)) * Versions v1.25.0-v1.27.0 are retracted due to [#6857](https://github.com/googleapis/google-cloud-go/issues/6857). * **storage:** SignedURL v4 allows headers with colons in value ([#7603](https://github.com/googleapis/google-cloud-go/issues/7603)) ([6b50f9b](https://github.com/googleapis/google-cloud-go/commit/6b50f9b368f5b271ade1706c342865cef46712e6)) ## [1.30.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.29.0...storage/v1.30.0) (2023-03-15) ### Features * **storage/internal:** Update routing annotation for CreateBucketRequest docs: Add support for end-to-end checksumming in the gRPC WriteObject flow feat!: BREAKING CHANGE - renaming Notification to NotificationConfig ([2fef56f](https://github.com/googleapis/google-cloud-go/commit/2fef56f75a63dc4ff6e0eea56c7b26d4831c8e27)) * **storage:** Json downloads ([#7158](https://github.com/googleapis/google-cloud-go/issues/7158)) ([574a86c](https://github.com/googleapis/google-cloud-go/commit/574a86c614445f8c3f5a54446820df774c31cd47)) * **storage:** Update iam and longrunning deps ([91a1f78](https://github.com/googleapis/google-cloud-go/commit/91a1f784a109da70f63b96414bba8a9b4254cddd)) ### Bug Fixes * **storage:** Specify credentials with STORAGE_EMULATOR_HOST ([#7271](https://github.com/googleapis/google-cloud-go/issues/7271)) ([940ae15](https://github.com/googleapis/google-cloud-go/commit/940ae15f725ff384e345e627feb03d22e1fd8db5)) ## [1.29.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.28.1...storage/v1.29.0) (2023-01-19) ### Features * **storage:** Add ComponentCount as part of ObjectAttrs ([#7230](https://github.com/googleapis/google-cloud-go/issues/7230)) ([a19bca6](https://github.com/googleapis/google-cloud-go/commit/a19bca60704b4fbb674cf51d828580aa653c8210)) * **storage:** Add REST client ([06a54a1](https://github.com/googleapis/google-cloud-go/commit/06a54a16a5866cce966547c51e203b9e09a25bc0)) ### Documentation * **storage/internal:** Corrected typos and spellings ([7357077](https://github.com/googleapis/google-cloud-go/commit/735707796d81d7f6f32fc3415800c512fe62297e)) ## [1.28.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.28.0...storage/v1.28.1) (2022-12-02) ### Bug Fixes * **storage:** downgrade some dependencies ([7540152](https://github.com/googleapis/google-cloud-go/commit/754015236d5af7c82a75da218b71a87b9ead6eb5)) ## [1.28.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.27.0...storage/v1.28.0) (2022-11-03) ### Features * **storage/internal:** Add routing annotations ([ce3f945](https://github.com/googleapis/google-cloud-go/commit/ce3f9458e511eca0910992763232abbcd64698f1)) * **storage:** Add Autoclass support ([#6828](https://github.com/googleapis/google-cloud-go/issues/6828)) ([f7c7f41](https://github.com/googleapis/google-cloud-go/commit/f7c7f41e4d7fcffe05860e1114cb20f40c869da8)) ### Bug Fixes * **storage:** Fix read-write race in Writer.Write ([#6817](https://github.com/googleapis/google-cloud-go/issues/6817)) ([4766d3e](https://github.com/googleapis/google-cloud-go/commit/4766d3e1004119b93c6bd352024b5bf3404252eb)) * **storage:** Fix request token passing for Copier.Run ([#6863](https://github.com/googleapis/google-cloud-go/issues/6863)) ([faaab06](https://github.com/googleapis/google-cloud-go/commit/faaab066d8e509dc440bcbc87391557ecee7dbf2)), refs [#6857](https://github.com/googleapis/google-cloud-go/issues/6857) ### Documentation * **storage:** Update broken links for SignURL and PostPolicy ([#6779](https://github.com/googleapis/google-cloud-go/issues/6779)) ([776138b](https://github.com/googleapis/google-cloud-go/commit/776138bc06a1e5fd45acbf8f9d36e9dc6ce31dd3)) ## [1.27.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.26.0...storage/v1.27.0) (2022-09-22) ### Features * **storage:** Find GoogleAccessID when using impersonated creds ([#6591](https://github.com/googleapis/google-cloud-go/issues/6591)) ([a2d16a7](https://github.com/googleapis/google-cloud-go/commit/a2d16a7a778c85d13217fc67955ec5dac1da34e8)) ## [1.26.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.25.0...storage/v1.26.0) (2022-08-29) ### Features * **storage:** export ShouldRetry ([#6370](https://github.com/googleapis/google-cloud-go/issues/6370)) ([0da9ab0](https://github.com/googleapis/google-cloud-go/commit/0da9ab0831540569dc04c0a23437b084b1564e15)), refs [#6362](https://github.com/googleapis/google-cloud-go/issues/6362) ### Bug Fixes * **storage:** allow to use age=0 in OLM conditions ([#6204](https://github.com/googleapis/google-cloud-go/issues/6204)) ([c85704f](https://github.com/googleapis/google-cloud-go/commit/c85704f4284626ce728cb48f3b130f2ce2a0165e)) ## [1.25.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.24.0...storage/v1.25.0) (2022-08-11) ### Features * **storage/internal:** Add routing annotations ([8a8ba85](https://github.com/googleapis/google-cloud-go/commit/8a8ba85311f85701c97fd7c10f1d88b738ce423f)) * **storage:** refactor to use transport-agnostic interface ([#6465](https://github.com/googleapis/google-cloud-go/issues/6465)) ([d03c3e1](https://github.com/googleapis/google-cloud-go/commit/d03c3e15a79fe9afa1232d9c8bd4c484a9bb927e)) ## [1.24.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.23.0...storage/v1.24.0) (2022-07-20) ### Features * **storage:** add Custom Placement Config Dual Region Support ([#6294](https://github.com/googleapis/google-cloud-go/issues/6294)) ([5a8c607](https://github.com/googleapis/google-cloud-go/commit/5a8c607e3a9a3265887e27cb13f8943f3e3fa23d)) ## [1.23.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.22.1...storage/v1.23.0) (2022-06-23) ### Features * **storage:** add support for OLM Prefix/Suffix ([#5929](https://github.com/googleapis/google-cloud-go/issues/5929)) ([ec21d10](https://github.com/googleapis/google-cloud-go/commit/ec21d10d6d1b01aa97a52560319775041707690d)) * **storage:** support AbortIncompleteMultipartUpload LifecycleAction ([#5812](https://github.com/googleapis/google-cloud-go/issues/5812)) ([fdec929](https://github.com/googleapis/google-cloud-go/commit/fdec929b9da6e01dda0ab3c72544d44d6bd82bd4)), refs [#5795](https://github.com/googleapis/google-cloud-go/issues/5795) ### Bug Fixes * **storage:** allow for Age *int64 type and int64 type ([#6230](https://github.com/googleapis/google-cloud-go/issues/6230)) ([cc7acb8](https://github.com/googleapis/google-cloud-go/commit/cc7acb8bffb31828e9e96d4834a65f9728494473)) ### [1.22.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.22.0...storage/v1.22.1) (2022-05-19) ### Bug Fixes * **storage:** bump genproto, remove deadcode ([#6059](https://github.com/googleapis/google-cloud-go/issues/6059)) ([bb10f9f](https://github.com/googleapis/google-cloud-go/commit/bb10f9faca57dc3b987e0fb601090887b3507f07)) * **storage:** remove field that no longer exists ([#6061](https://github.com/googleapis/google-cloud-go/issues/6061)) ([ee150cf](https://github.com/googleapis/google-cloud-go/commit/ee150cfd194463ddfcb59898cfb0237e47777973)) ## [1.22.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.21.0...storage/v1.22.0) (2022-03-31) ### Features * **storage:** allow specifying includeTrailingDelimiter ([#5617](https://github.com/googleapis/google-cloud-go/issues/5617)) ([a34503b](https://github.com/googleapis/google-cloud-go/commit/a34503bc0f0b95399285e8db66976b227e3b0072)) * **storage:** set versionClient to module version ([55f0d92](https://github.com/googleapis/google-cloud-go/commit/55f0d92bf112f14b024b4ab0076c9875a17423c9)) ### Bug Fixes * **storage:** respect STORAGE_EMULATOR_HOST in signedURL ([#5673](https://github.com/googleapis/google-cloud-go/issues/5673)) ([1c249ae](https://github.com/googleapis/google-cloud-go/commit/1c249ae5b4980cf53fa74635943ca8bf6a96a341)) ## [1.21.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.20.0...storage/v1.21.0) (2022-02-17) ### Features * **storage:** add better version metadata to calls ([#5507](https://github.com/googleapis/google-cloud-go/issues/5507)) ([13fe0bc](https://github.com/googleapis/google-cloud-go/commit/13fe0bc0d8acbffd46b59ab69b25449f1cbd6a88)), refs [#2749](https://github.com/googleapis/google-cloud-go/issues/2749) * **storage:** add Writer.ChunkRetryDeadline ([#5482](https://github.com/googleapis/google-cloud-go/issues/5482)) ([498a746](https://github.com/googleapis/google-cloud-go/commit/498a746769fa43958b92af8875b927879947128e)) ## [1.20.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.19.0...storage/v1.20.0) (2022-02-04) ### Features * **storage/internal:** Update definition of RewriteObjectRequest to bring to parity with JSON API support ([#5447](https://www.github.com/googleapis/google-cloud-go/issues/5447)) ([7d175ef](https://www.github.com/googleapis/google-cloud-go/commit/7d175ef12b7b3e75585427f5dd2aab4a175e92d6)) ## [1.19.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.18.2...storage/v1.19.0) (2022-01-25) ### Features * **storage:** add fully configurable and idempotency-aware retry strategy ([#5384](https://www.github.com/googleapis/google-cloud-go/issues/5384), [#5185](https://www.github.com/googleapis/google-cloud-go/issues/5185), [#5170](https://www.github.com/googleapis/google-cloud-go/issues/5170), [#5223](https://www.github.com/googleapis/google-cloud-go/issues/5223), [#5221](https://www.github.com/googleapis/google-cloud-go/issues/5221), [#5193](https://www.github.com/googleapis/google-cloud-go/issues/5193), [#5159](https://www.github.com/googleapis/google-cloud-go/issues/5159), [#5165](https://www.github.com/googleapis/google-cloud-go/issues/5165), [#5166](https://www.github.com/googleapis/google-cloud-go/issues/5166), [#5210](https://www.github.com/googleapis/google-cloud-go/issues/5210), [#5172](https://www.github.com/googleapis/google-cloud-go/issues/5172), [#5314](https://www.github.com/googleapis/google-cloud-go/issues/5314)) * This release contains changes to fully align this library's retry strategy with best practices as described in the Cloud Storage [docs](https://cloud.google.com/storage/docs/retry-strategy). * The library will now retry only idempotent operations by default. This means that for certain operations, including object upload, compose, rewrite, update, and delete, requests will not be retried by default unless [idempotency conditions](https://cloud.google.com/storage/docs/retry-strategy#idempotency) for the request have been met. * The library now has methods to configure aspects of retry policy for API calls, including which errors are retried, the timing of the exponential backoff, and how idempotency is taken into account. * If you wish to re-enable retries for a non-idempotent request, use the [RetryAlways](https://pkg.go.dev/cloud.google.com/go/storage@main#RetryAlways) policy. * For full details on how to configure retries, see the [package docs](https://pkg.go.dev/cloud.google.com/go/storage@main#hdr-Retrying_failed_requests) and the [Cloud Storage docs](https://cloud.google.com/storage/docs/retry-strategy) * **storage:** GenerateSignedPostPolicyV4 can use existing creds to authenticate ([#5105](https://www.github.com/googleapis/google-cloud-go/issues/5105)) ([46489f4](https://www.github.com/googleapis/google-cloud-go/commit/46489f4c8a634068a3e7cf2fd5e5ca11b555c0a8)) * **storage:** post policy can be signed with a fn that takes raw bytes ([#5079](https://www.github.com/googleapis/google-cloud-go/issues/5079)) ([25d1278](https://www.github.com/googleapis/google-cloud-go/commit/25d1278cab539fbfdd8563ed6b297e30d3fe555c)) * **storage:** add rpo (turbo replication) support ([#5003](https://www.github.com/googleapis/google-cloud-go/issues/5003)) ([3bd5995](https://www.github.com/googleapis/google-cloud-go/commit/3bd59958e0c06d2655b67fcb5410668db3c52af0)) ### Bug Fixes * **storage:** fix nil check in gRPC Reader ([#5376](https://www.github.com/googleapis/google-cloud-go/issues/5376)) ([5e7d722](https://www.github.com/googleapis/google-cloud-go/commit/5e7d722d18a62b28ba98169b3bdbb49401377264)) ### [1.18.2](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.18.1...storage/v1.18.2) (2021-10-18) ### Bug Fixes * **storage:** upgrade genproto ([#4993](https://www.github.com/googleapis/google-cloud-go/issues/4993)) ([5ca462d](https://www.github.com/googleapis/google-cloud-go/commit/5ca462d99fe851b7cddfd70108798e2fa959bdfd)), refs [#4991](https://www.github.com/googleapis/google-cloud-go/issues/4991) ### [1.18.1](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.18.0...storage/v1.18.1) (2021-10-14) ### Bug Fixes * **storage:** don't assume auth from a client option ([#4982](https://www.github.com/googleapis/google-cloud-go/issues/4982)) ([e17334d](https://www.github.com/googleapis/google-cloud-go/commit/e17334d1fe7645d89d14ae7148313498b984dfbb)) ## [1.18.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.17.0...storage/v1.18.0) (2021-10-11) ### Features * **storage:** returned wrapped error for timeouts ([#4802](https://www.github.com/googleapis/google-cloud-go/issues/4802)) ([0e102a3](https://www.github.com/googleapis/google-cloud-go/commit/0e102a385dc67a06f6b444b3a93e6998428529be)), refs [#4197](https://www.github.com/googleapis/google-cloud-go/issues/4197) * **storage:** SignedUrl can use existing creds to authenticate ([#4604](https://www.github.com/googleapis/google-cloud-go/issues/4604)) ([b824c89](https://www.github.com/googleapis/google-cloud-go/commit/b824c897e6941270747b612f6d36a8d6ae081315)) ### Bug Fixes * **storage:** update PAP to use inherited instead of unspecified ([#4909](https://www.github.com/googleapis/google-cloud-go/issues/4909)) ([dac26b1](https://www.github.com/googleapis/google-cloud-go/commit/dac26b1af2f2972f12775341173bcc5f982438b8)) ## [1.17.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.16.1...storage/v1.17.0) (2021-09-28) ### Features * **storage:** add projectNumber field to bucketAttrs. ([#4805](https://www.github.com/googleapis/google-cloud-go/issues/4805)) ([07343af](https://www.github.com/googleapis/google-cloud-go/commit/07343afc15085b164cc41d202d13f9d46f5c0d02)) ### Bug Fixes * **storage:** align retry idempotency (part 1) ([#4715](https://www.github.com/googleapis/google-cloud-go/issues/4715)) ([ffa903e](https://www.github.com/googleapis/google-cloud-go/commit/ffa903eeec61aa3869e5220e2f09371127b5c393)) ### [1.16.1](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.16.0...storage/v1.16.1) (2021-08-30) ### Bug Fixes * **storage/internal:** Update encryption_key fields to "bytes" type. fix: Improve date/times and field name clarity in lifecycle conditions. ([a52baa4](https://www.github.com/googleapis/google-cloud-go/commit/a52baa456ed8513ec492c4b573c191eb61468758)) * **storage:** accept emulator env var without scheme ([#4616](https://www.github.com/googleapis/google-cloud-go/issues/4616)) ([5f8cbb9](https://www.github.com/googleapis/google-cloud-go/commit/5f8cbb98070109e2a34409ac775ed63b94d37efd)) * **storage:** preserve supplied endpoint's scheme ([#4609](https://www.github.com/googleapis/google-cloud-go/issues/4609)) ([ee2756f](https://www.github.com/googleapis/google-cloud-go/commit/ee2756fb0a335d591464a770c9fa4f8fe0ba2e01)) * **storage:** remove unnecessary variable ([#4608](https://www.github.com/googleapis/google-cloud-go/issues/4608)) ([27fc784](https://www.github.com/googleapis/google-cloud-go/commit/27fc78456fb251652bdf5cdb493734a7e1e643e1)) * **storage:** retry LockRetentionPolicy ([#4439](https://www.github.com/googleapis/google-cloud-go/issues/4439)) ([09879ea](https://www.github.com/googleapis/google-cloud-go/commit/09879ea80cb67f9bfd8fc9384b0fda335567cba9)), refs [#4437](https://www.github.com/googleapis/google-cloud-go/issues/4437) * **storage:** revise Reader to send XML preconditions ([#4479](https://www.github.com/googleapis/google-cloud-go/issues/4479)) ([e36b29a](https://www.github.com/googleapis/google-cloud-go/commit/e36b29a3d43bce5c1c044f7daf6e1db00b0a49e0)), refs [#4470](https://www.github.com/googleapis/google-cloud-go/issues/4470) ## [1.16.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.15.0...storage/v1.16.0) (2021-06-28) ### Features * **storage:** support PublicAccessPrevention ([#3608](https://www.github.com/googleapis/google-cloud-go/issues/3608)) ([99bc782](https://www.github.com/googleapis/google-cloud-go/commit/99bc782fb50a47602b45278384ef5d5b5da9263b)), refs [#3203](https://www.github.com/googleapis/google-cloud-go/issues/3203) ### Bug Fixes * **storage:** fix Writer.ChunkSize validation ([#4255](https://www.github.com/googleapis/google-cloud-go/issues/4255)) ([69c2e9d](https://www.github.com/googleapis/google-cloud-go/commit/69c2e9dc6303e1a004d3104a8178532fa738e742)), refs [#4167](https://www.github.com/googleapis/google-cloud-go/issues/4167) * **storage:** try to reopen for failed Reads ([#4226](https://www.github.com/googleapis/google-cloud-go/issues/4226)) ([564102b](https://www.github.com/googleapis/google-cloud-go/commit/564102b335dbfb558bec8af883e5f898efb5dd10)), refs [#3040](https://www.github.com/googleapis/google-cloud-go/issues/3040) ## [1.15.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.13.0...storage/v1.15.0) (2021-04-21) ### Features * **transport** Bump dependency on google.golang.org/api to pick up HTTP/2 config updates (see [googleapis/google-api-go-client#882](https://github.com/googleapis/google-api-go-client/pull/882)). ### Bug Fixes * **storage:** retry io.ErrUnexpectedEOF ([#3957](https://www.github.com/googleapis/google-cloud-go/issues/3957)) ([f6590cd](https://www.github.com/googleapis/google-cloud-go/commit/f6590cdc26c8479be5df48949fa59f879e0c24fc)) ## v1.14.0 - Updates to various dependencies. ## [1.13.0](https://www.github.com/googleapis/google-cloud-go/compare/storage/v1.12.0...v1.13.0) (2021-02-03) ### Features * **storage:** add missing StorageClass in BucketAttrsToUpdate ([#3038](https://www.github.com/googleapis/google-cloud-go/issues/3038)) ([2fa1b72](https://www.github.com/googleapis/google-cloud-go/commit/2fa1b727f8a7b20aa62fe0990530744f6c109be0)) * **storage:** add projection parameter for BucketHandle.Objects() ([#3549](https://www.github.com/googleapis/google-cloud-go/issues/3549)) ([9b9c3dc](https://www.github.com/googleapis/google-cloud-go/commit/9b9c3dce3ee10af5b6c4d070821bf47a861efd5b)) ### Bug Fixes * **storage:** fix endpoint selection logic ([#3172](https://www.github.com/googleapis/google-cloud-go/issues/3172)) ([99edf0d](https://www.github.com/googleapis/google-cloud-go/commit/99edf0d211a9e617f2586fbc83b6f9630da3c537)) ## v1.12.0 - V4 signed URL fixes: - Fix encoding of spaces in query parameters. - Add fields that were missing from PostPolicyV4 policy conditions. - Fix Query to correctly list prefixes as well as objects when SetAttrSelection is used. ## v1.11.0 - Add support for CustomTime and NoncurrentTime object lifecycle management features. ## v1.10.0 - Bump dependency on google.golang.org/api to capture changes to retry logic which will make retries on writes more resilient. - Improve documentation for Writer.ChunkSize. - Fix a bug in lifecycle to allow callers to clear lifecycle rules on a bucket. ## v1.9.0 - Add retry for transient network errors on most operations (with the exception of writes). - Bump dependency for google.golang.org/api to capture a change in the default HTTP transport which will improve performance for reads under heavy load. - Add CRC32C checksum validation option to Composer. ## v1.8.0 - Add support for V4 signed post policies. ## v1.7.0 - V4 signed URL support: - Add support for bucket-bound domains and virtual hosted style URLs. - Add support for query parameters in the signature. - Fix text encoding to align with standards. - Add the object name to query parameters for write calls. - Fix retry behavior when reading files with Content-Encoding gzip. - Fix response header in reader. - New code examples: - Error handling for `ObjectHandle` preconditions. - Existence checks for buckets and objects. ## v1.6.0 - Updated option handling: - Don't drop custom scopes (#1756) - Don't drop port in provided endpoint (#1737) ## v1.5.0 - Honor WithEndpoint client option for reads as well as writes. - Add archive storage class to docs. - Make fixes to storage benchwrapper. ## v1.4.0 - When listing objects in a bucket, allow callers to specify which attributes are queried. This allows for performance optimization. ## v1.3.0 - Use `storage.googleapis.com/storage/v1` by default for GCS requests instead of `www.googleapis.com/storage/v1`. ## v1.2.1 - Fixed a bug where UniformBucketLevelAccess and BucketPolicyOnly were not being sent in all cases. ## v1.2.0 - Add support for UniformBucketLevelAccess. This configures access checks to use only bucket-level IAM policies. See: https://godoc.org/cloud.google.com/go/storage#UniformBucketLevelAccess. - Fix userAgent to use correct version. ## v1.1.2 - Fix memory leak in BucketIterator and ObjectIterator. ## v1.1.1 - Send BucketPolicyOnly even when it's disabled. ## v1.1.0 - Performance improvements for ObjectIterator and BucketIterator. - Fix Bucket.ObjectIterator size calculation checks. - Added HMACKeyOptions to all the methods which allows for options such as UserProject to be set per invocation and optionally be used. ## v1.0.0 This is the first tag to carve out storage as its own module. See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository. ================================================ FILE: vendor/cloud.google.com/go/storage/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/cloud.google.com/go/storage/README.md ================================================ ## Cloud Storage [![Go Reference](https://pkg.go.dev/badge/cloud.google.com/go/storage.svg)](https://pkg.go.dev/cloud.google.com/go/storage) - [About Cloud Storage](https://cloud.google.com/storage/) - [API documentation](https://cloud.google.com/storage/docs) - [Go client documentation](https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest) - [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/main/storage) ### Example Usage First create a `storage.Client` to use throughout your application: [snip]:# (storage-1) ```go client, err := storage.NewClient(ctx) if err != nil { log.Fatal(err) } ``` [snip]:# (storage-2) ```go // Read the object1 from bucket. rc, err := client.Bucket("bucket").Object("object1").NewReader(ctx) if err != nil { log.Fatal(err) } defer rc.Close() body, err := io.ReadAll(rc) if err != nil { log.Fatal(err) } ``` ================================================ FILE: vendor/cloud.google.com/go/storage/acl.go ================================================ // Copyright 2014 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "cloud.google.com/go/storage/internal/apiv2/storagepb" raw "google.golang.org/api/storage/v1" ) // ACLRole is the level of access to grant. type ACLRole string const ( RoleOwner ACLRole = "OWNER" RoleReader ACLRole = "READER" RoleWriter ACLRole = "WRITER" ) // ACLEntity refers to a user or group. // They are sometimes referred to as grantees. // // It could be in the form of: // "user-", "user-", "group-", "group-", // "domain-" and "project-team-". // // Or one of the predefined constants: AllUsers, AllAuthenticatedUsers. type ACLEntity string const ( AllUsers ACLEntity = "allUsers" AllAuthenticatedUsers ACLEntity = "allAuthenticatedUsers" ) // ACLRule represents a grant for a role to an entity (user, group or team) for a // Google Cloud Storage object or bucket. type ACLRule struct { Entity ACLEntity EntityID string Role ACLRole Domain string Email string ProjectTeam *ProjectTeam } // ProjectTeam is the project team associated with the entity, if any. type ProjectTeam struct { ProjectNumber string Team string } // ACLHandle provides operations on an access control list for a Google Cloud Storage bucket or object. // ACLHandle on an object operates on the latest generation of that object by default. // Selecting a specific generation of an object is not currently supported by the client. type ACLHandle struct { c *Client bucket string object string isDefault bool userProject string // for requester-pays buckets retry *retryConfig } // Delete permanently deletes the ACL entry for the given entity. func (a *ACLHandle) Delete(ctx context.Context, entity ACLEntity) (err error) { ctx, _ = startSpan(ctx, "ACL.Delete") defer func() { endSpan(ctx, err) }() if a.object != "" { return a.objectDelete(ctx, entity) } if a.isDefault { return a.bucketDefaultDelete(ctx, entity) } return a.bucketDelete(ctx, entity) } // Set sets the role for the given entity. func (a *ACLHandle) Set(ctx context.Context, entity ACLEntity, role ACLRole) (err error) { ctx, _ = startSpan(ctx, "ACL.Set") defer func() { endSpan(ctx, err) }() if a.object != "" { return a.objectSet(ctx, entity, role, false) } if a.isDefault { return a.objectSet(ctx, entity, role, true) } return a.bucketSet(ctx, entity, role) } // List retrieves ACL entries. func (a *ACLHandle) List(ctx context.Context) (rules []ACLRule, err error) { ctx, _ = startSpan(ctx, "ACL.List") defer func() { endSpan(ctx, err) }() if a.object != "" { return a.objectList(ctx) } if a.isDefault { return a.bucketDefaultList(ctx) } return a.bucketList(ctx) } func (a *ACLHandle) bucketDefaultList(ctx context.Context) ([]ACLRule, error) { opts := makeStorageOpts(true, a.retry, a.userProject) return a.c.tc.ListDefaultObjectACLs(ctx, a.bucket, opts...) } func (a *ACLHandle) bucketDefaultDelete(ctx context.Context, entity ACLEntity) error { opts := makeStorageOpts(false, a.retry, a.userProject) return a.c.tc.DeleteDefaultObjectACL(ctx, a.bucket, entity, opts...) } func (a *ACLHandle) bucketList(ctx context.Context) ([]ACLRule, error) { opts := makeStorageOpts(true, a.retry, a.userProject) return a.c.tc.ListBucketACLs(ctx, a.bucket, opts...) } func (a *ACLHandle) bucketSet(ctx context.Context, entity ACLEntity, role ACLRole) error { opts := makeStorageOpts(false, a.retry, a.userProject) return a.c.tc.UpdateBucketACL(ctx, a.bucket, entity, role, opts...) } func (a *ACLHandle) bucketDelete(ctx context.Context, entity ACLEntity) error { opts := makeStorageOpts(false, a.retry, a.userProject) return a.c.tc.DeleteBucketACL(ctx, a.bucket, entity, opts...) } func (a *ACLHandle) objectList(ctx context.Context) ([]ACLRule, error) { opts := makeStorageOpts(true, a.retry, a.userProject) return a.c.tc.ListObjectACLs(ctx, a.bucket, a.object, opts...) } func (a *ACLHandle) objectSet(ctx context.Context, entity ACLEntity, role ACLRole, isBucketDefault bool) error { opts := makeStorageOpts(false, a.retry, a.userProject) if isBucketDefault { return a.c.tc.UpdateDefaultObjectACL(ctx, a.bucket, entity, role, opts...) } return a.c.tc.UpdateObjectACL(ctx, a.bucket, a.object, entity, role, opts...) } func (a *ACLHandle) objectDelete(ctx context.Context, entity ACLEntity) error { opts := makeStorageOpts(false, a.retry, a.userProject) return a.c.tc.DeleteObjectACL(ctx, a.bucket, a.object, entity, opts...) } func toObjectACLRules(items []*raw.ObjectAccessControl) []ACLRule { var rs []ACLRule for _, item := range items { rs = append(rs, toObjectACLRule(item)) } return rs } func toObjectACLRulesFromProto(items []*storagepb.ObjectAccessControl) []ACLRule { var rs []ACLRule for _, item := range items { rs = append(rs, toObjectACLRuleFromProto(item)) } return rs } func toBucketACLRules(items []*raw.BucketAccessControl) []ACLRule { var rs []ACLRule for _, item := range items { rs = append(rs, toBucketACLRule(item)) } return rs } func toBucketACLRulesFromProto(items []*storagepb.BucketAccessControl) []ACLRule { var rs []ACLRule for _, item := range items { rs = append(rs, toBucketACLRuleFromProto(item)) } return rs } func toObjectACLRule(a *raw.ObjectAccessControl) ACLRule { return ACLRule{ Entity: ACLEntity(a.Entity), EntityID: a.EntityId, Role: ACLRole(a.Role), Domain: a.Domain, Email: a.Email, ProjectTeam: toObjectProjectTeam(a.ProjectTeam), } } func toObjectACLRuleFromProto(a *storagepb.ObjectAccessControl) ACLRule { return ACLRule{ Entity: ACLEntity(a.GetEntity()), EntityID: a.GetEntityId(), Role: ACLRole(a.GetRole()), Domain: a.GetDomain(), Email: a.GetEmail(), ProjectTeam: toProjectTeamFromProto(a.GetProjectTeam()), } } func toBucketACLRule(a *raw.BucketAccessControl) ACLRule { return ACLRule{ Entity: ACLEntity(a.Entity), EntityID: a.EntityId, Role: ACLRole(a.Role), Domain: a.Domain, Email: a.Email, ProjectTeam: toBucketProjectTeam(a.ProjectTeam), } } func toBucketACLRuleFromProto(a *storagepb.BucketAccessControl) ACLRule { return ACLRule{ Entity: ACLEntity(a.GetEntity()), EntityID: a.GetEntityId(), Role: ACLRole(a.GetRole()), Domain: a.GetDomain(), Email: a.GetEmail(), ProjectTeam: toProjectTeamFromProto(a.GetProjectTeam()), } } func toRawObjectACL(rules []ACLRule) []*raw.ObjectAccessControl { if len(rules) == 0 { return nil } r := make([]*raw.ObjectAccessControl, 0, len(rules)) for _, rule := range rules { r = append(r, rule.toRawObjectAccessControl("")) // bucket name unnecessary } return r } func toProtoObjectACL(rules []ACLRule) []*storagepb.ObjectAccessControl { if len(rules) == 0 { return nil } r := make([]*storagepb.ObjectAccessControl, 0, len(rules)) for _, rule := range rules { r = append(r, rule.toProtoObjectAccessControl("")) // bucket name unnecessary } return r } func toRawBucketACL(rules []ACLRule) []*raw.BucketAccessControl { if len(rules) == 0 { return nil } r := make([]*raw.BucketAccessControl, 0, len(rules)) for _, rule := range rules { r = append(r, rule.toRawBucketAccessControl("")) // bucket name unnecessary } return r } func toProtoBucketACL(rules []ACLRule) []*storagepb.BucketAccessControl { if len(rules) == 0 { return nil } r := make([]*storagepb.BucketAccessControl, 0, len(rules)) for _, rule := range rules { r = append(r, rule.toProtoBucketAccessControl()) } return r } func (r ACLRule) toRawBucketAccessControl(bucket string) *raw.BucketAccessControl { return &raw.BucketAccessControl{ Bucket: bucket, Entity: string(r.Entity), Role: string(r.Role), // The other fields are not settable. } } func (r ACLRule) toRawObjectAccessControl(bucket string) *raw.ObjectAccessControl { return &raw.ObjectAccessControl{ Bucket: bucket, Entity: string(r.Entity), Role: string(r.Role), // The other fields are not settable. } } func (r ACLRule) toProtoObjectAccessControl(bucket string) *storagepb.ObjectAccessControl { return &storagepb.ObjectAccessControl{ Entity: string(r.Entity), Role: string(r.Role), // The other fields are not settable. } } func (r ACLRule) toProtoBucketAccessControl() *storagepb.BucketAccessControl { return &storagepb.BucketAccessControl{ Entity: string(r.Entity), Role: string(r.Role), // The other fields are not settable. } } func toBucketProjectTeam(p *raw.BucketAccessControlProjectTeam) *ProjectTeam { if p == nil { return nil } return &ProjectTeam{ ProjectNumber: p.ProjectNumber, Team: p.Team, } } func toProjectTeamFromProto(p *storagepb.ProjectTeam) *ProjectTeam { if p == nil { return nil } return &ProjectTeam{ ProjectNumber: p.GetProjectNumber(), Team: p.GetTeam(), } } func toObjectProjectTeam(p *raw.ObjectAccessControlProjectTeam) *ProjectTeam { if p == nil { return nil } return &ProjectTeam{ ProjectNumber: p.ProjectNumber, Team: p.Team, } } ================================================ FILE: vendor/cloud.google.com/go/storage/bucket.go ================================================ // Copyright 2014 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "encoding/base64" "encoding/json" "errors" "fmt" "reflect" "strings" "time" "cloud.google.com/go/compute/metadata" "cloud.google.com/go/internal/optional" "cloud.google.com/go/storage/internal/apiv2/storagepb" "google.golang.org/api/googleapi" "google.golang.org/api/iamcredentials/v1" "google.golang.org/api/iterator" "google.golang.org/api/option" raw "google.golang.org/api/storage/v1" dpb "google.golang.org/genproto/googleapis/type/date" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/durationpb" ) // BucketHandle provides operations on a Google Cloud Storage bucket. // Use Client.Bucket to get a handle. type BucketHandle struct { c *Client name string acl ACLHandle defaultObjectACL ACLHandle conds *BucketConditions userProject string // project for Requester Pays buckets retry *retryConfig enableObjectRetention *bool } // Bucket returns a BucketHandle, which provides operations on the named bucket. // This call does not perform any network operations. // // The supplied name must contain only lowercase letters, numbers, dashes, // underscores, and dots. The full specification for valid bucket names can be // found at: // // https://cloud.google.com/storage/docs/bucket-naming func (c *Client) Bucket(name string) *BucketHandle { retry := c.retry.clone() return &BucketHandle{ c: c, name: name, acl: ACLHandle{ c: c, bucket: name, retry: retry, }, defaultObjectACL: ACLHandle{ c: c, bucket: name, isDefault: true, retry: retry, }, retry: retry, } } // Create creates the Bucket in the project. // If attrs is nil the API defaults will be used. func (b *BucketHandle) Create(ctx context.Context, projectID string, attrs *BucketAttrs) (err error) { ctx, _ = startSpan(ctx, "Bucket.Create") defer func() { endSpan(ctx, err) }() o := makeStorageOpts(true, b.retry, b.userProject) if _, err := b.c.tc.CreateBucket(ctx, projectID, b.name, attrs, b.enableObjectRetention, o...); err != nil { return err } return nil } // Delete deletes the Bucket. func (b *BucketHandle) Delete(ctx context.Context) (err error) { ctx, _ = startSpan(ctx, "Bucket.Delete") defer func() { endSpan(ctx, err) }() o := makeStorageOpts(true, b.retry, b.userProject) return b.c.tc.DeleteBucket(ctx, b.name, b.conds, o...) } // ACL returns an ACLHandle, which provides access to the bucket's access control list. // This controls who can list, create or overwrite the objects in a bucket. // This call does not perform any network operations. func (b *BucketHandle) ACL() *ACLHandle { return &b.acl } // DefaultObjectACL returns an ACLHandle, which provides access to the bucket's default object ACLs. // These ACLs are applied to newly created objects in this bucket that do not have a defined ACL. // This call does not perform any network operations. func (b *BucketHandle) DefaultObjectACL() *ACLHandle { return &b.defaultObjectACL } // BucketName returns the name of the bucket. func (b *BucketHandle) BucketName() string { return b.name } // Object returns an ObjectHandle, which provides operations on the named object. // This call does not perform any network operations such as fetching the object or verifying its existence. // Use methods on ObjectHandle to perform network operations. // // name must consist entirely of valid UTF-8-encoded runes. The full specification // for valid object names can be found at: // // https://cloud.google.com/storage/docs/naming-objects func (b *BucketHandle) Object(name string) *ObjectHandle { retry := b.retry.clone() return &ObjectHandle{ c: b.c, bucket: b.name, object: name, acl: ACLHandle{ c: b.c, bucket: b.name, object: name, userProject: b.userProject, retry: retry, }, gen: -1, userProject: b.userProject, retry: retry, } } // Attrs returns the metadata for the bucket. func (b *BucketHandle) Attrs(ctx context.Context) (attrs *BucketAttrs, err error) { ctx, _ = startSpan(ctx, "Bucket.Attrs") defer func() { endSpan(ctx, err) }() o := makeStorageOpts(true, b.retry, b.userProject) return b.c.tc.GetBucket(ctx, b.name, b.conds, o...) } // Update updates a bucket's attributes. func (b *BucketHandle) Update(ctx context.Context, uattrs BucketAttrsToUpdate) (attrs *BucketAttrs, err error) { ctx, _ = startSpan(ctx, "Bucket.Update") defer func() { endSpan(ctx, err) }() isIdempotent := b.conds != nil && b.conds.MetagenerationMatch != 0 o := makeStorageOpts(isIdempotent, b.retry, b.userProject) return b.c.tc.UpdateBucket(ctx, b.name, &uattrs, b.conds, o...) } // SignedURL returns a URL for the specified object. Signed URLs allow anyone // access to a restricted resource for a limited time without needing a Google // account or signing in. // For more information about signed URLs, see "[Overview of access control]." // // This method requires the Method and Expires fields in the specified // SignedURLOptions to be non-nil. You may need to set the GoogleAccessID and // PrivateKey fields in some cases. Read more on the [automatic detection of credentials] // for this method. // // [Overview of access control]: https://cloud.google.com/storage/docs/accesscontrol#signed_urls_query_string_authentication // [automatic detection of credentials]: https://pkg.go.dev/cloud.google.com/go/storage#hdr-Credential_requirements_for_signing func (b *BucketHandle) SignedURL(object string, opts *SignedURLOptions) (string, error) { // Make a copy of opts so we don't modify the pointer parameter. newopts := opts.clone() if newopts.Hostname == "" { // Extract the correct host from the readhost set on the client newopts.Hostname = b.c.xmlHost } if opts.GoogleAccessID != "" && (opts.SignBytes != nil || len(opts.PrivateKey) > 0) { return SignedURL(b.name, object, newopts) } if newopts.GoogleAccessID == "" { id, err := b.detectDefaultGoogleAccessID() if err != nil { return "", err } newopts.GoogleAccessID = id } if newopts.SignBytes == nil && len(newopts.PrivateKey) == 0 { if b.c.creds != nil && len(b.c.creds.JSON) > 0 { var sa struct { PrivateKey string `json:"private_key"` } err := json.Unmarshal(b.c.creds.JSON, &sa) if err == nil && sa.PrivateKey != "" { newopts.PrivateKey = []byte(sa.PrivateKey) } } // Don't error out if we can't unmarshal the private key from the client, // fallback to the default sign function for the service account. if len(newopts.PrivateKey) == 0 { newopts.SignBytes = b.defaultSignBytesFunc(newopts.GoogleAccessID) } } return SignedURL(b.name, object, newopts) } // GenerateSignedPostPolicyV4 generates a PostPolicyV4 value from bucket, object and opts. // The generated URL and fields will then allow an unauthenticated client to perform multipart uploads. // // This method requires the Expires field in the specified PostPolicyV4Options // to be non-nil. You may need to set the GoogleAccessID and PrivateKey fields // in some cases. Read more on the [automatic detection of credentials] for this method. // // [automatic detection of credentials]: https://pkg.go.dev/cloud.google.com/go/storage#hdr-Credential_requirements_for_signing func (b *BucketHandle) GenerateSignedPostPolicyV4(object string, opts *PostPolicyV4Options) (*PostPolicyV4, error) { // Make a copy of opts so we don't modify the pointer parameter. newopts := opts.clone() if newopts.Hostname == "" { // Extract the correct host from the readhost set on the client newopts.Hostname = b.c.xmlHost } if opts.GoogleAccessID != "" && (opts.SignRawBytes != nil || opts.SignBytes != nil || len(opts.PrivateKey) > 0) { return GenerateSignedPostPolicyV4(b.name, object, newopts) } if newopts.GoogleAccessID == "" { id, err := b.detectDefaultGoogleAccessID() if err != nil { return nil, err } newopts.GoogleAccessID = id } if newopts.SignBytes == nil && newopts.SignRawBytes == nil && len(newopts.PrivateKey) == 0 { if b.c.creds != nil && len(b.c.creds.JSON) > 0 { var sa struct { PrivateKey string `json:"private_key"` } err := json.Unmarshal(b.c.creds.JSON, &sa) if err == nil && sa.PrivateKey != "" { newopts.PrivateKey = []byte(sa.PrivateKey) } } // Don't error out if we can't unmarshal the private key from the client, // fallback to the default sign function for the service account. if len(newopts.PrivateKey) == 0 { newopts.SignRawBytes = b.defaultSignBytesFunc(newopts.GoogleAccessID) } } return GenerateSignedPostPolicyV4(b.name, object, newopts) } func (b *BucketHandle) detectDefaultGoogleAccessID() (string, error) { returnErr := errors.New("no credentials found on client and not on GCE (Google Compute Engine)") if b.c.creds != nil && len(b.c.creds.JSON) > 0 { var sa struct { ClientEmail string `json:"client_email"` SAImpersonationURL string `json:"service_account_impersonation_url"` CredType string `json:"type"` } err := json.Unmarshal(b.c.creds.JSON, &sa) if err != nil { returnErr = err } else { switch sa.CredType { case "impersonated_service_account", "external_account": start, end := strings.LastIndex(sa.SAImpersonationURL, "/"), strings.LastIndex(sa.SAImpersonationURL, ":") if end <= start { returnErr = errors.New("error parsing external or impersonated service account credentials") } else { return sa.SAImpersonationURL[start+1 : end], nil } case "service_account": if sa.ClientEmail != "" { return sa.ClientEmail, nil } returnErr = errors.New("empty service account client email") default: returnErr = errors.New("unable to parse credentials; only service_account, external_account and impersonated_service_account credentials are supported") } } } // Don't error out if we can't unmarshal, fallback to GCE check. if metadata.OnGCE() { email, err := metadata.Email("default") if err == nil && email != "" { return email, nil } else if err != nil { returnErr = err } else { returnErr = errors.New("empty email from GCE metadata service") } } return "", fmt.Errorf("storage: unable to detect default GoogleAccessID: %w. Please provide the GoogleAccessID or use a supported means for autodetecting it (see https://pkg.go.dev/cloud.google.com/go/storage#hdr-Credential_requirements_for_signing)", returnErr) } func (b *BucketHandle) defaultSignBytesFunc(email string) func([]byte) ([]byte, error) { return func(in []byte) ([]byte, error) { ctx := context.Background() opts := []option.ClientOption{option.WithHTTPClient(b.c.hc)} if b.c.creds != nil { universeDomain, err := b.c.creds.GetUniverseDomain() if err != nil { return nil, err } opts = append(opts, option.WithUniverseDomain(universeDomain)) } // It's ok to recreate this service per call since we pass in the http client, // circumventing the cost of recreating the auth/transport layer svc, err := iamcredentials.NewService(ctx, opts...) if err != nil { return nil, fmt.Errorf("unable to create iamcredentials client: %w", err) } // Do the SignBlob call with a retry for transient errors. var resp *iamcredentials.SignBlobResponse if err := run(ctx, func(ctx context.Context) error { resp, err = svc.Projects.ServiceAccounts.SignBlob(fmt.Sprintf("projects/-/serviceAccounts/%s", email), &iamcredentials.SignBlobRequest{ Payload: base64.StdEncoding.EncodeToString(in), }).Do() return err }, b.retry, true); err != nil { return nil, fmt.Errorf("unable to sign bytes: %w", err) } out, err := base64.StdEncoding.DecodeString(resp.SignedBlob) if err != nil { return nil, fmt.Errorf("unable to base64 decode response: %w", err) } return out, nil } } // BucketAttrs represents the metadata for a Google Cloud Storage bucket. // Read-only fields are ignored by BucketHandle.Create. type BucketAttrs struct { // Name is the name of the bucket. // This field is read-only. Name string // ACL is the list of access control rules on the bucket. ACL []ACLRule // BucketPolicyOnly is an alias for UniformBucketLevelAccess. Use of // UniformBucketLevelAccess is recommended above the use of this field. // Setting BucketPolicyOnly.Enabled OR UniformBucketLevelAccess.Enabled to // true, will enable UniformBucketLevelAccess. BucketPolicyOnly BucketPolicyOnly // UniformBucketLevelAccess configures access checks to use only bucket-level IAM // policies and ignore any ACL rules for the bucket. // See https://cloud.google.com/storage/docs/uniform-bucket-level-access // for more information. UniformBucketLevelAccess UniformBucketLevelAccess // PublicAccessPrevention is the setting for the bucket's // PublicAccessPrevention policy, which can be used to prevent public access // of data in the bucket. See // https://cloud.google.com/storage/docs/public-access-prevention for more // information. PublicAccessPrevention PublicAccessPrevention // DefaultObjectACL is the list of access controls to // apply to new objects when no object ACL is provided. DefaultObjectACL []ACLRule // DefaultEventBasedHold is the default value for event-based hold on // newly created objects in this bucket. It defaults to false. DefaultEventBasedHold bool // If not empty, applies a predefined set of access controls. It should be set // only when creating a bucket. // It is always empty for BucketAttrs returned from the service. // See https://cloud.google.com/storage/docs/json_api/v1/buckets/insert // for valid values. PredefinedACL string // If not empty, applies a predefined set of default object access controls. // It should be set only when creating a bucket. // It is always empty for BucketAttrs returned from the service. // See https://cloud.google.com/storage/docs/json_api/v1/buckets/insert // for valid values. PredefinedDefaultObjectACL string // Location is the location of the bucket. It defaults to "US". // If specifying a dual-region, CustomPlacementConfig should be set in conjunction. Location string // The bucket's custom placement configuration that holds a list of // regional locations for custom dual regions. CustomPlacementConfig *CustomPlacementConfig // MetaGeneration is the metadata generation of the bucket. // This field is read-only. MetaGeneration int64 // StorageClass is the default storage class of the bucket. This defines // how objects in the bucket are stored and determines the SLA // and the cost of storage. Typical values are "STANDARD", "NEARLINE", // "COLDLINE" and "ARCHIVE". Defaults to "STANDARD". // See https://cloud.google.com/storage/docs/storage-classes for all // valid values. StorageClass string // Created is the creation time of the bucket. // This field is read-only. Created time.Time // Updated is the time at which the bucket was last modified. // This field is read-only. Updated time.Time // VersioningEnabled reports whether this bucket has versioning enabled. VersioningEnabled bool // Labels are the bucket's labels. Labels map[string]string // RequesterPays reports whether the bucket is a Requester Pays bucket. // Clients performing operations on Requester Pays buckets must provide // a user project (see BucketHandle.UserProject), which will be billed // for the operations. RequesterPays bool // Lifecycle is the lifecycle configuration for objects in the bucket. Lifecycle Lifecycle // Retention policy enforces a minimum retention time for all objects // contained in the bucket. A RetentionPolicy of nil implies the bucket // has no minimum data retention. // // This feature is in private alpha release. It is not currently available to // most customers. It might be changed in backwards-incompatible ways and is not // subject to any SLA or deprecation policy. RetentionPolicy *RetentionPolicy // The bucket's Cross-Origin Resource Sharing (CORS) configuration. CORS []CORS // The encryption configuration used by default for newly inserted objects. Encryption *BucketEncryption // The logging configuration. Logging *BucketLogging // The website configuration. Website *BucketWebsite // Etag is the HTTP/1.1 Entity tag for the bucket. // This field is read-only. Etag string // LocationType describes how data is stored and replicated. // Typical values are "multi-region", "region" and "dual-region". // This field is read-only. LocationType string // The project number of the project the bucket belongs to. // This field is read-only. ProjectNumber uint64 // RPO configures the Recovery Point Objective (RPO) policy of the bucket. // Set to RPOAsyncTurbo to turn on Turbo Replication for a bucket. // See https://cloud.google.com/storage/docs/managing-turbo-replication for // more information. RPO RPO // Autoclass holds the bucket's autoclass configuration. If enabled, // allows for the automatic selection of the best storage class // based on object access patterns. Autoclass *Autoclass // ObjectRetentionMode reports whether individual objects in the bucket can // be configured with a retention policy. An empty value means that object // retention is disabled. // This field is read-only. Object retention can be enabled only by creating // a bucket with SetObjectRetention set to true on the BucketHandle. It // cannot be modified once the bucket is created. // ObjectRetention cannot be configured or reported through the gRPC API. ObjectRetentionMode string // SoftDeletePolicy contains the bucket's soft delete policy, which defines // the period of time that soft-deleted objects will be retained, and cannot // be permanently deleted. By default, new buckets will be created with a // 7 day retention duration. In order to fully disable soft delete, you need // to set a policy with a RetentionDuration of 0. SoftDeletePolicy *SoftDeletePolicy // HierarchicalNamespace contains the bucket's hierarchical namespace // configuration. Hierarchical namespace enabled buckets can contain // [cloud.google.com/go/storage/control/apiv2/controlpb.Folder] resources. // It cannot be modified after bucket creation time. // UniformBucketLevelAccess must also also be enabled on the bucket. HierarchicalNamespace *HierarchicalNamespace // OwnerEntity contains entity information in the form "project-owner-projectId". OwnerEntity string } // BucketPolicyOnly is an alias for UniformBucketLevelAccess. // Use of UniformBucketLevelAccess is preferred above BucketPolicyOnly. type BucketPolicyOnly struct { // Enabled specifies whether access checks use only bucket-level IAM // policies. Enabled may be disabled until the locked time. Enabled bool // LockedTime specifies the deadline for changing Enabled from true to // false. LockedTime time.Time } // UniformBucketLevelAccess configures access checks to use only bucket-level IAM // policies. type UniformBucketLevelAccess struct { // Enabled specifies whether access checks use only bucket-level IAM // policies. Enabled may be disabled until the locked time. Enabled bool // LockedTime specifies the deadline for changing Enabled from true to // false. LockedTime time.Time } // PublicAccessPrevention configures the Public Access Prevention feature, which // can be used to disallow public access to any data in a bucket. See // https://cloud.google.com/storage/docs/public-access-prevention for more // information. type PublicAccessPrevention int const ( // PublicAccessPreventionUnknown is a zero value, used only if this field is // not set in a call to GCS. PublicAccessPreventionUnknown PublicAccessPrevention = iota // PublicAccessPreventionUnspecified corresponds to a value of "unspecified". // Deprecated: use PublicAccessPreventionInherited PublicAccessPreventionUnspecified // PublicAccessPreventionEnforced corresponds to a value of "enforced". This // enforces Public Access Prevention on the bucket. PublicAccessPreventionEnforced // PublicAccessPreventionInherited corresponds to a value of "inherited" // and is the default for buckets. PublicAccessPreventionInherited publicAccessPreventionUnknown string = "" // TODO: remove unspecified when change is fully completed publicAccessPreventionUnspecified = "unspecified" publicAccessPreventionEnforced = "enforced" publicAccessPreventionInherited = "inherited" ) func (p PublicAccessPrevention) String() string { switch p { case PublicAccessPreventionInherited, PublicAccessPreventionUnspecified: return publicAccessPreventionInherited case PublicAccessPreventionEnforced: return publicAccessPreventionEnforced default: return publicAccessPreventionUnknown } } // Lifecycle is the lifecycle configuration for objects in the bucket. type Lifecycle struct { Rules []LifecycleRule } // RetentionPolicy enforces a minimum retention time for all objects // contained in the bucket. // // Any attempt to overwrite or delete objects younger than the retention // period will result in an error. An unlocked retention policy can be // modified or removed from the bucket via the Update method. A // locked retention policy cannot be removed or shortened in duration // for the lifetime of the bucket. // // This feature is in private alpha release. It is not currently available to // most customers. It might be changed in backwards-incompatible ways and is not // subject to any SLA or deprecation policy. type RetentionPolicy struct { // RetentionPeriod specifies the duration that objects need to be // retained. Retention duration must be greater than zero and less than // 100 years. Note that enforcement of retention periods less than a day // is not guaranteed. Such periods should only be used for testing // purposes. RetentionPeriod time.Duration // EffectiveTime is the time from which the policy was enforced and // effective. This field is read-only. EffectiveTime time.Time // IsLocked describes whether the bucket is locked. Once locked, an // object retention policy cannot be modified. // This field is read-only. IsLocked bool } const ( // RFC3339 timestamp with only the date segment, used for CreatedBefore, // CustomTimeBefore, and NoncurrentTimeBefore in LifecycleRule. rfc3339Date = "2006-01-02" // DeleteAction is a lifecycle action that deletes a live and/or archived // objects. Takes precedence over SetStorageClass actions. DeleteAction = "Delete" // SetStorageClassAction changes the storage class of live and/or archived // objects. SetStorageClassAction = "SetStorageClass" // AbortIncompleteMPUAction is a lifecycle action that aborts an incomplete // multipart upload when the multipart upload meets the conditions specified // in the lifecycle rule. The AgeInDays condition is the only allowed // condition for this action. AgeInDays is measured from the time the // multipart upload was created. AbortIncompleteMPUAction = "AbortIncompleteMultipartUpload" ) // LifecycleRule is a lifecycle configuration rule. // // When all the configured conditions are met by an object in the bucket, the // configured action will automatically be taken on that object. type LifecycleRule struct { // Action is the action to take when all of the associated conditions are // met. Action LifecycleAction // Condition is the set of conditions that must be met for the associated // action to be taken. Condition LifecycleCondition } // LifecycleAction is a lifecycle configuration action. type LifecycleAction struct { // Type is the type of action to take on matching objects. // // Acceptable values are storage.DeleteAction, storage.SetStorageClassAction, // and storage.AbortIncompleteMPUAction. Type string // StorageClass is the storage class to set on matching objects if the Action // is "SetStorageClass". StorageClass string } // Liveness specifies whether the object is live or not. type Liveness int const ( // LiveAndArchived includes both live and archived objects. LiveAndArchived Liveness = iota // Live specifies that the object is still live. Live // Archived specifies that the object is archived. Archived ) // LifecycleCondition is a set of conditions used to match objects and take an // action automatically. // // All configured conditions must be met for the associated action to be taken. type LifecycleCondition struct { // AllObjects is used to select all objects in a bucket by // setting AgeInDays to 0. AllObjects bool // AgeInDays is the age of the object in days. // If you want to set AgeInDays to `0` use AllObjects set to `true`. AgeInDays int64 // CreatedBefore is the time the object was created. // // This condition is satisfied when an object is created before midnight of // the specified date in UTC. CreatedBefore time.Time // CustomTimeBefore is the CustomTime metadata field of the object. This // condition is satisfied when an object's CustomTime timestamp is before // midnight of the specified date in UTC. // // This condition can only be satisfied if CustomTime has been set. CustomTimeBefore time.Time // DaysSinceCustomTime is the days elapsed since the CustomTime date of the // object. This condition can only be satisfied if CustomTime has been set. // Note: Using `0` as the value will be ignored by the library and not sent to the API. DaysSinceCustomTime int64 // DaysSinceNoncurrentTime is the days elapsed since the noncurrent timestamp // of the object. This condition is relevant only for versioned objects. // Note: Using `0` as the value will be ignored by the library and not sent to the API. DaysSinceNoncurrentTime int64 // Liveness specifies the object's liveness. Relevant only for versioned objects Liveness Liveness // MatchesPrefix is the condition matching an object if any of the // matches_prefix strings are an exact prefix of the object's name. MatchesPrefix []string // MatchesStorageClasses is the condition matching the object's storage // class. // // Values include "STANDARD", "NEARLINE", "COLDLINE" and "ARCHIVE". MatchesStorageClasses []string // MatchesSuffix is the condition matching an object if any of the // matches_suffix strings are an exact suffix of the object's name. MatchesSuffix []string // NoncurrentTimeBefore is the noncurrent timestamp of the object. This // condition is satisfied when an object's noncurrent timestamp is before // midnight of the specified date in UTC. // // This condition is relevant only for versioned objects. NoncurrentTimeBefore time.Time // NumNewerVersions is the condition matching objects with a number of newer versions. // // If the value is N, this condition is satisfied when there are at least N // versions (including the live version) newer than this version of the // object. // Note: Using `0` as the value will be ignored by the library and not sent to the API. NumNewerVersions int64 } // BucketLogging holds the bucket's logging configuration, which defines the // destination bucket and optional name prefix for the current bucket's // logs. type BucketLogging struct { // The destination bucket where the current bucket's logs // should be placed. LogBucket string // A prefix for log object names. LogObjectPrefix string } // BucketWebsite holds the bucket's website configuration, controlling how the // service behaves when accessing bucket contents as a web site. See // https://cloud.google.com/storage/docs/static-website for more information. type BucketWebsite struct { // If the requested object path is missing, the service will ensure the path has // a trailing '/', append this suffix, and attempt to retrieve the resulting // object. This allows the creation of index.html objects to represent directory // pages. MainPageSuffix string // If the requested object path is missing, and any mainPageSuffix object is // missing, if applicable, the service will return the named object from this // bucket as the content for a 404 Not Found result. NotFoundPage string } // CustomPlacementConfig holds the bucket's custom placement // configuration for Custom Dual Regions. See // https://cloud.google.com/storage/docs/locations#location-dr for more information. type CustomPlacementConfig struct { // The list of regional locations in which data is placed. // Custom Dual Regions require exactly 2 regional locations. DataLocations []string } // Autoclass holds the bucket's autoclass configuration. If enabled, // allows for the automatic selection of the best storage class // based on object access patterns. See // https://cloud.google.com/storage/docs/using-autoclass for more information. type Autoclass struct { // Enabled specifies whether the autoclass feature is enabled // on the bucket. Enabled bool // ToggleTime is the time from which Autoclass was last toggled. // If Autoclass is enabled when the bucket is created, the ToggleTime // is set to the bucket creation time. This field is read-only. ToggleTime time.Time // TerminalStorageClass: The storage class that objects in the bucket // eventually transition to if they are not read for a certain length of // time. Valid values are NEARLINE and ARCHIVE. // To modify TerminalStorageClass, Enabled must be set to true. TerminalStorageClass string // TerminalStorageClassUpdateTime represents the time of the most recent // update to "TerminalStorageClass". TerminalStorageClassUpdateTime time.Time } // SoftDeletePolicy contains the bucket's soft delete policy, which defines the // period of time that soft-deleted objects will be retained, and cannot be // permanently deleted. type SoftDeletePolicy struct { // EffectiveTime indicates the time from which the policy, or one with a // greater retention, was effective. This field is read-only. EffectiveTime time.Time // RetentionDuration is the amount of time that soft-deleted objects in the // bucket will be retained and cannot be permanently deleted. RetentionDuration time.Duration } // HierarchicalNamespace contains the bucket's hierarchical namespace // configuration. Hierarchical namespace enabled buckets can contain // [cloud.google.com/go/storage/control/apiv2/controlpb.Folder] resources. type HierarchicalNamespace struct { // Enabled indicates whether hierarchical namespace features are enabled on // the bucket. This can only be set at bucket creation time currently. Enabled bool } func newBucket(b *raw.Bucket) (*BucketAttrs, error) { if b == nil { return nil, nil } rp, err := toRetentionPolicy(b.RetentionPolicy) if err != nil { return nil, err } return &BucketAttrs{ Name: b.Name, Location: b.Location, MetaGeneration: b.Metageneration, DefaultEventBasedHold: b.DefaultEventBasedHold, StorageClass: b.StorageClass, Created: convertTime(b.TimeCreated), Updated: convertTime(b.Updated), VersioningEnabled: b.Versioning != nil && b.Versioning.Enabled, ACL: toBucketACLRules(b.Acl), DefaultObjectACL: toObjectACLRules(b.DefaultObjectAcl), Labels: b.Labels, RequesterPays: b.Billing != nil && b.Billing.RequesterPays, Lifecycle: toLifecycle(b.Lifecycle), RetentionPolicy: rp, ObjectRetentionMode: toBucketObjectRetention(b.ObjectRetention), CORS: toCORS(b.Cors), Encryption: toBucketEncryption(b.Encryption), Logging: toBucketLogging(b.Logging), Website: toBucketWebsite(b.Website), BucketPolicyOnly: toBucketPolicyOnly(b.IamConfiguration), UniformBucketLevelAccess: toUniformBucketLevelAccess(b.IamConfiguration), PublicAccessPrevention: toPublicAccessPrevention(b.IamConfiguration), Etag: b.Etag, LocationType: b.LocationType, ProjectNumber: b.ProjectNumber, RPO: toRPO(b), CustomPlacementConfig: customPlacementFromRaw(b.CustomPlacementConfig), Autoclass: toAutoclassFromRaw(b.Autoclass), SoftDeletePolicy: toSoftDeletePolicyFromRaw(b.SoftDeletePolicy), HierarchicalNamespace: toHierarchicalNamespaceFromRaw(b.HierarchicalNamespace), OwnerEntity: ownerEntityFromRaw(b.Owner), }, nil } func newBucketFromProto(b *storagepb.Bucket) *BucketAttrs { if b == nil { return nil } return &BucketAttrs{ Name: parseBucketName(b.GetName()), Location: b.GetLocation(), MetaGeneration: b.GetMetageneration(), DefaultEventBasedHold: b.GetDefaultEventBasedHold(), StorageClass: b.GetStorageClass(), Created: b.GetCreateTime().AsTime(), Updated: b.GetUpdateTime().AsTime(), VersioningEnabled: b.GetVersioning().GetEnabled(), ACL: toBucketACLRulesFromProto(b.GetAcl()), DefaultObjectACL: toObjectACLRulesFromProto(b.GetDefaultObjectAcl()), Labels: b.GetLabels(), RequesterPays: b.GetBilling().GetRequesterPays(), Lifecycle: toLifecycleFromProto(b.GetLifecycle()), RetentionPolicy: toRetentionPolicyFromProto(b.GetRetentionPolicy()), CORS: toCORSFromProto(b.GetCors()), Encryption: toBucketEncryptionFromProto(b.GetEncryption()), Logging: toBucketLoggingFromProto(b.GetLogging()), Website: toBucketWebsiteFromProto(b.GetWebsite()), BucketPolicyOnly: toBucketPolicyOnlyFromProto(b.GetIamConfig()), UniformBucketLevelAccess: toUniformBucketLevelAccessFromProto(b.GetIamConfig()), PublicAccessPrevention: toPublicAccessPreventionFromProto(b.GetIamConfig()), LocationType: b.GetLocationType(), RPO: toRPOFromProto(b), CustomPlacementConfig: customPlacementFromProto(b.GetCustomPlacementConfig()), ProjectNumber: parseProjectNumber(b.GetProject()), // this can return 0 the project resource name is ID based Autoclass: toAutoclassFromProto(b.GetAutoclass()), SoftDeletePolicy: toSoftDeletePolicyFromProto(b.SoftDeletePolicy), HierarchicalNamespace: toHierarchicalNamespaceFromProto(b.HierarchicalNamespace), OwnerEntity: ownerEntityFromProto(b.GetOwner()), } } // toRawBucket copies the editable attribute from b to the raw library's Bucket type. func (b *BucketAttrs) toRawBucket() *raw.Bucket { // Copy label map. var labels map[string]string if len(b.Labels) > 0 { labels = make(map[string]string, len(b.Labels)) for k, v := range b.Labels { labels[k] = v } } // Ignore VersioningEnabled if it is false. This is OK because // we only call this method when creating a bucket, and by default // new buckets have versioning off. var v *raw.BucketVersioning if b.VersioningEnabled { v = &raw.BucketVersioning{Enabled: true} } var bb *raw.BucketBilling if b.RequesterPays { bb = &raw.BucketBilling{RequesterPays: true} } var bktIAM *raw.BucketIamConfiguration if b.UniformBucketLevelAccess.Enabled || b.BucketPolicyOnly.Enabled || b.PublicAccessPrevention != PublicAccessPreventionUnknown { bktIAM = &raw.BucketIamConfiguration{} if b.UniformBucketLevelAccess.Enabled || b.BucketPolicyOnly.Enabled { bktIAM.UniformBucketLevelAccess = &raw.BucketIamConfigurationUniformBucketLevelAccess{ Enabled: true, } } if b.PublicAccessPrevention != PublicAccessPreventionUnknown { bktIAM.PublicAccessPrevention = b.PublicAccessPrevention.String() } } return &raw.Bucket{ Name: b.Name, Location: b.Location, StorageClass: b.StorageClass, Acl: toRawBucketACL(b.ACL), DefaultObjectAcl: toRawObjectACL(b.DefaultObjectACL), Versioning: v, Labels: labels, Billing: bb, Lifecycle: toRawLifecycle(b.Lifecycle), RetentionPolicy: b.RetentionPolicy.toRawRetentionPolicy(), Cors: toRawCORS(b.CORS), Encryption: b.Encryption.toRawBucketEncryption(), Logging: b.Logging.toRawBucketLogging(), Website: b.Website.toRawBucketWebsite(), IamConfiguration: bktIAM, Rpo: b.RPO.String(), CustomPlacementConfig: b.CustomPlacementConfig.toRawCustomPlacement(), Autoclass: b.Autoclass.toRawAutoclass(), SoftDeletePolicy: b.SoftDeletePolicy.toRawSoftDeletePolicy(), HierarchicalNamespace: b.HierarchicalNamespace.toRawHierarchicalNamespace(), } } func (b *BucketAttrs) toProtoBucket() *storagepb.Bucket { if b == nil { return &storagepb.Bucket{} } // Copy label map. var labels map[string]string if len(b.Labels) > 0 { labels = make(map[string]string, len(b.Labels)) for k, v := range b.Labels { labels[k] = v } } // Ignore VersioningEnabled if it is false. This is OK because // we only call this method when creating a bucket, and by default // new buckets have versioning off. var v *storagepb.Bucket_Versioning if b.VersioningEnabled { v = &storagepb.Bucket_Versioning{Enabled: true} } var bb *storagepb.Bucket_Billing if b.RequesterPays { bb = &storagepb.Bucket_Billing{RequesterPays: true} } var bktIAM *storagepb.Bucket_IamConfig if b.UniformBucketLevelAccess.Enabled || b.BucketPolicyOnly.Enabled || b.PublicAccessPrevention != PublicAccessPreventionUnknown { bktIAM = &storagepb.Bucket_IamConfig{} if b.UniformBucketLevelAccess.Enabled || b.BucketPolicyOnly.Enabled { bktIAM.UniformBucketLevelAccess = &storagepb.Bucket_IamConfig_UniformBucketLevelAccess{ Enabled: true, } } if b.PublicAccessPrevention != PublicAccessPreventionUnknown { bktIAM.PublicAccessPrevention = b.PublicAccessPrevention.String() } } return &storagepb.Bucket{ Name: b.Name, Location: b.Location, StorageClass: b.StorageClass, Acl: toProtoBucketACL(b.ACL), DefaultObjectAcl: toProtoObjectACL(b.DefaultObjectACL), Versioning: v, Labels: labels, Billing: bb, Lifecycle: toProtoLifecycle(b.Lifecycle), RetentionPolicy: b.RetentionPolicy.toProtoRetentionPolicy(), Cors: toProtoCORS(b.CORS), Encryption: b.Encryption.toProtoBucketEncryption(), Logging: b.Logging.toProtoBucketLogging(), Website: b.Website.toProtoBucketWebsite(), IamConfig: bktIAM, Rpo: b.RPO.String(), CustomPlacementConfig: b.CustomPlacementConfig.toProtoCustomPlacement(), Autoclass: b.Autoclass.toProtoAutoclass(), SoftDeletePolicy: b.SoftDeletePolicy.toProtoSoftDeletePolicy(), HierarchicalNamespace: b.HierarchicalNamespace.toProtoHierarchicalNamespace(), } } func (ua *BucketAttrsToUpdate) toProtoBucket() *storagepb.Bucket { if ua == nil { return &storagepb.Bucket{} } var v *storagepb.Bucket_Versioning if ua.VersioningEnabled != nil { v = &storagepb.Bucket_Versioning{Enabled: optional.ToBool(ua.VersioningEnabled)} } var bb *storagepb.Bucket_Billing if ua.RequesterPays != nil { bb = &storagepb.Bucket_Billing{RequesterPays: optional.ToBool(ua.RequesterPays)} } var bktIAM *storagepb.Bucket_IamConfig if ua.UniformBucketLevelAccess != nil || ua.BucketPolicyOnly != nil || ua.PublicAccessPrevention != PublicAccessPreventionUnknown { bktIAM = &storagepb.Bucket_IamConfig{} if ua.BucketPolicyOnly != nil { bktIAM.UniformBucketLevelAccess = &storagepb.Bucket_IamConfig_UniformBucketLevelAccess{ Enabled: optional.ToBool(ua.BucketPolicyOnly.Enabled), } } if ua.UniformBucketLevelAccess != nil { // UniformBucketLevelAccess takes precedence over BucketPolicyOnly, // so Enabled will be overriden here if both are set bktIAM.UniformBucketLevelAccess = &storagepb.Bucket_IamConfig_UniformBucketLevelAccess{ Enabled: optional.ToBool(ua.UniformBucketLevelAccess.Enabled), } } if ua.PublicAccessPrevention != PublicAccessPreventionUnknown { bktIAM.PublicAccessPrevention = ua.PublicAccessPrevention.String() } } var defaultHold bool if ua.DefaultEventBasedHold != nil { defaultHold = optional.ToBool(ua.DefaultEventBasedHold) } var lifecycle Lifecycle if ua.Lifecycle != nil { lifecycle = *ua.Lifecycle } var bktACL []*storagepb.BucketAccessControl if ua.acl != nil { bktACL = toProtoBucketACL(ua.acl) } if ua.PredefinedACL != "" { // Clear ACL or the call will fail. bktACL = nil } var bktDefaultObjectACL []*storagepb.ObjectAccessControl if ua.defaultObjectACL != nil { bktDefaultObjectACL = toProtoObjectACL(ua.defaultObjectACL) } if ua.PredefinedDefaultObjectACL != "" { // Clear ACLs or the call will fail. bktDefaultObjectACL = nil } return &storagepb.Bucket{ StorageClass: ua.StorageClass, Acl: bktACL, DefaultObjectAcl: bktDefaultObjectACL, DefaultEventBasedHold: defaultHold, Versioning: v, Billing: bb, Lifecycle: toProtoLifecycle(lifecycle), RetentionPolicy: ua.RetentionPolicy.toProtoRetentionPolicy(), Cors: toProtoCORS(ua.CORS), Encryption: ua.Encryption.toProtoBucketEncryption(), Logging: ua.Logging.toProtoBucketLogging(), Website: ua.Website.toProtoBucketWebsite(), IamConfig: bktIAM, Rpo: ua.RPO.String(), Autoclass: ua.Autoclass.toProtoAutoclass(), SoftDeletePolicy: ua.SoftDeletePolicy.toProtoSoftDeletePolicy(), Labels: ua.setLabels, } } // CORS is the bucket's Cross-Origin Resource Sharing (CORS) configuration. type CORS struct { // MaxAge is the value to return in the Access-Control-Max-Age // header used in preflight responses. MaxAge time.Duration // Methods is the list of HTTP methods on which to include CORS response // headers, (GET, OPTIONS, POST, etc) Note: "*" is permitted in the list // of methods, and means "any method". Methods []string // Origins is the list of Origins eligible to receive CORS response // headers. Note: "*" is permitted in the list of origins, and means // "any Origin". Origins []string // ResponseHeaders is the list of HTTP headers other than the simple // response headers to give permission for the user-agent to share // across domains. ResponseHeaders []string } // BucketEncryption is a bucket's encryption configuration. type BucketEncryption struct { // A Cloud KMS key name, in the form // projects/P/locations/L/keyRings/R/cryptoKeys/K, that will be used to encrypt // objects inserted into this bucket, if no encryption method is specified. // The key's location must be the same as the bucket's. DefaultKMSKeyName string } // BucketAttrsToUpdate define the attributes to update during an Update call. type BucketAttrsToUpdate struct { // If set, updates whether the bucket uses versioning. VersioningEnabled optional.Bool // If set, updates whether the bucket is a Requester Pays bucket. RequesterPays optional.Bool // DefaultEventBasedHold is the default value for event-based hold on // newly created objects in this bucket. DefaultEventBasedHold optional.Bool // BucketPolicyOnly is an alias for UniformBucketLevelAccess. Use of // UniformBucketLevelAccess is recommended above the use of this field. // Setting BucketPolicyOnly.Enabled OR UniformBucketLevelAccess.Enabled to // true, will enable UniformBucketLevelAccess. If both BucketPolicyOnly and // UniformBucketLevelAccess are set, the value of UniformBucketLevelAccess // will take precedence. BucketPolicyOnly *BucketPolicyOnly // UniformBucketLevelAccess configures access checks to use only bucket-level IAM // policies and ignore any ACL rules for the bucket. // See https://cloud.google.com/storage/docs/uniform-bucket-level-access // for more information. UniformBucketLevelAccess *UniformBucketLevelAccess // PublicAccessPrevention is the setting for the bucket's // PublicAccessPrevention policy, which can be used to prevent public access // of data in the bucket. See // https://cloud.google.com/storage/docs/public-access-prevention for more // information. PublicAccessPrevention PublicAccessPrevention // StorageClass is the default storage class of the bucket. This defines // how objects in the bucket are stored and determines the SLA // and the cost of storage. Typical values are "STANDARD", "NEARLINE", // "COLDLINE" and "ARCHIVE". Defaults to "STANDARD". // See https://cloud.google.com/storage/docs/storage-classes for all // valid values. StorageClass string // If set, updates the retention policy of the bucket. Using // RetentionPolicy.RetentionPeriod = 0 will delete the existing policy. // // This feature is in private alpha release. It is not currently available to // most customers. It might be changed in backwards-incompatible ways and is not // subject to any SLA or deprecation policy. RetentionPolicy *RetentionPolicy // If set, replaces the CORS configuration with a new configuration. // An empty (rather than nil) slice causes all CORS policies to be removed. CORS []CORS // If set, replaces the encryption configuration of the bucket. Using // BucketEncryption.DefaultKMSKeyName = "" will delete the existing // configuration. Encryption *BucketEncryption // If set, replaces the lifecycle configuration of the bucket. Lifecycle *Lifecycle // If set, replaces the logging configuration of the bucket. Logging *BucketLogging // If set, replaces the website configuration of the bucket. Website *BucketWebsite // If not empty, applies a predefined set of access controls. // See https://cloud.google.com/storage/docs/json_api/v1/buckets/patch. PredefinedACL string // If not empty, applies a predefined set of default object access controls. // See https://cloud.google.com/storage/docs/json_api/v1/buckets/patch. PredefinedDefaultObjectACL string // RPO configures the Recovery Point Objective (RPO) policy of the bucket. // Set to RPOAsyncTurbo to turn on Turbo Replication for a bucket. // See https://cloud.google.com/storage/docs/managing-turbo-replication for // more information. RPO RPO // If set, updates the autoclass configuration of the bucket. // To disable autoclass on the bucket, set to an empty &Autoclass{}. // To update the configuration for Autoclass.TerminalStorageClass, // Autoclass.Enabled must also be set to true. // See https://cloud.google.com/storage/docs/using-autoclass for more information. Autoclass *Autoclass // If set, updates the soft delete policy of the bucket. SoftDeletePolicy *SoftDeletePolicy // acl is the list of access control rules on the bucket. // It is unexported and only used internally by the gRPC client. // Library users should use ACLHandle methods directly. acl []ACLRule // defaultObjectACL is the list of access controls to // apply to new objects when no object ACL is provided. // It is unexported and only used internally by the gRPC client. // Library users should use ACLHandle methods directly. defaultObjectACL []ACLRule setLabels map[string]string deleteLabels map[string]bool } // SetLabel causes a label to be added or modified when ua is used // in a call to Bucket.Update. func (ua *BucketAttrsToUpdate) SetLabel(name, value string) { if ua.setLabels == nil { ua.setLabels = map[string]string{} } ua.setLabels[name] = value } // DeleteLabel causes a label to be deleted when ua is used in a // call to Bucket.Update. func (ua *BucketAttrsToUpdate) DeleteLabel(name string) { if ua.deleteLabels == nil { ua.deleteLabels = map[string]bool{} } ua.deleteLabels[name] = true } func (ua *BucketAttrsToUpdate) toRawBucket() *raw.Bucket { rb := &raw.Bucket{} if ua.CORS != nil { rb.Cors = toRawCORS(ua.CORS) rb.ForceSendFields = append(rb.ForceSendFields, "Cors") } if ua.DefaultEventBasedHold != nil { rb.DefaultEventBasedHold = optional.ToBool(ua.DefaultEventBasedHold) rb.ForceSendFields = append(rb.ForceSendFields, "DefaultEventBasedHold") } if ua.RetentionPolicy != nil { if ua.RetentionPolicy.RetentionPeriod == 0 { rb.NullFields = append(rb.NullFields, "RetentionPolicy") rb.RetentionPolicy = nil } else { rb.RetentionPolicy = ua.RetentionPolicy.toRawRetentionPolicy() } } if ua.VersioningEnabled != nil { rb.Versioning = &raw.BucketVersioning{ Enabled: optional.ToBool(ua.VersioningEnabled), ForceSendFields: []string{"Enabled"}, } } if ua.RequesterPays != nil { rb.Billing = &raw.BucketBilling{ RequesterPays: optional.ToBool(ua.RequesterPays), ForceSendFields: []string{"RequesterPays"}, } } if ua.BucketPolicyOnly != nil { rb.IamConfiguration = &raw.BucketIamConfiguration{ UniformBucketLevelAccess: &raw.BucketIamConfigurationUniformBucketLevelAccess{ Enabled: ua.BucketPolicyOnly.Enabled, ForceSendFields: []string{"Enabled"}, }, } } if ua.UniformBucketLevelAccess != nil { rb.IamConfiguration = &raw.BucketIamConfiguration{ UniformBucketLevelAccess: &raw.BucketIamConfigurationUniformBucketLevelAccess{ Enabled: ua.UniformBucketLevelAccess.Enabled, ForceSendFields: []string{"Enabled"}, }, } } if ua.PublicAccessPrevention != PublicAccessPreventionUnknown { if rb.IamConfiguration == nil { rb.IamConfiguration = &raw.BucketIamConfiguration{} } rb.IamConfiguration.PublicAccessPrevention = ua.PublicAccessPrevention.String() } if ua.Encryption != nil { if ua.Encryption.DefaultKMSKeyName == "" { rb.NullFields = append(rb.NullFields, "Encryption") rb.Encryption = nil } else { rb.Encryption = ua.Encryption.toRawBucketEncryption() } } if ua.Lifecycle != nil { rb.Lifecycle = toRawLifecycle(*ua.Lifecycle) rb.ForceSendFields = append(rb.ForceSendFields, "Lifecycle") } if ua.Logging != nil { if *ua.Logging == (BucketLogging{}) { rb.NullFields = append(rb.NullFields, "Logging") rb.Logging = nil } else { rb.Logging = ua.Logging.toRawBucketLogging() } } if ua.Website != nil { if *ua.Website == (BucketWebsite{}) { rb.NullFields = append(rb.NullFields, "Website") rb.Website = nil } else { rb.Website = ua.Website.toRawBucketWebsite() } } if ua.Autoclass != nil { rb.Autoclass = &raw.BucketAutoclass{ Enabled: ua.Autoclass.Enabled, TerminalStorageClass: ua.Autoclass.TerminalStorageClass, ForceSendFields: []string{"Enabled"}, } rb.ForceSendFields = append(rb.ForceSendFields, "Autoclass") } if ua.SoftDeletePolicy != nil { if ua.SoftDeletePolicy.RetentionDuration == 0 { rb.SoftDeletePolicy = &raw.BucketSoftDeletePolicy{ RetentionDurationSeconds: 0, ForceSendFields: []string{"RetentionDurationSeconds"}, } } else { rb.SoftDeletePolicy = ua.SoftDeletePolicy.toRawSoftDeletePolicy() } } if ua.PredefinedACL != "" { // Clear ACL or the call will fail. rb.Acl = nil rb.ForceSendFields = append(rb.ForceSendFields, "Acl") } if ua.PredefinedDefaultObjectACL != "" { // Clear ACLs or the call will fail. rb.DefaultObjectAcl = nil rb.ForceSendFields = append(rb.ForceSendFields, "DefaultObjectAcl") } rb.StorageClass = ua.StorageClass rb.Rpo = ua.RPO.String() if ua.setLabels != nil || ua.deleteLabels != nil { rb.Labels = map[string]string{} for k, v := range ua.setLabels { rb.Labels[k] = v } if len(rb.Labels) == 0 && len(ua.deleteLabels) > 0 { rb.ForceSendFields = append(rb.ForceSendFields, "Labels") } for l := range ua.deleteLabels { rb.NullFields = append(rb.NullFields, "Labels."+l) } } return rb } // If returns a new BucketHandle that applies a set of preconditions. // Preconditions already set on the BucketHandle are ignored. The supplied // BucketConditions must have exactly one field set to a non-zero value; // otherwise an error will be returned from any operation on the BucketHandle. // Operations on the new handle will return an error if the preconditions are not // satisfied. The only valid preconditions for buckets are MetagenerationMatch // and MetagenerationNotMatch. func (b *BucketHandle) If(conds BucketConditions) *BucketHandle { b2 := *b b2.conds = &conds return &b2 } // BucketConditions constrain bucket methods to act on specific metagenerations. // // The zero value is an empty set of constraints. type BucketConditions struct { // MetagenerationMatch specifies that the bucket must have the given // metageneration for the operation to occur. // If MetagenerationMatch is zero, it has no effect. MetagenerationMatch int64 // MetagenerationNotMatch specifies that the bucket must not have the given // metageneration for the operation to occur. // If MetagenerationNotMatch is zero, it has no effect. MetagenerationNotMatch int64 } func (c *BucketConditions) validate(method string) error { if *c == (BucketConditions{}) { return fmt.Errorf("storage: %s: empty conditions", method) } if c.MetagenerationMatch != 0 && c.MetagenerationNotMatch != 0 { return fmt.Errorf("storage: %s: multiple conditions specified for metageneration", method) } return nil } // UserProject returns a new BucketHandle that passes the project ID as the user // project for all subsequent calls. Calls with a user project will be billed to that // project rather than to the bucket's owning project. // // A user project is required for all operations on Requester Pays buckets. func (b *BucketHandle) UserProject(projectID string) *BucketHandle { b2 := *b b2.userProject = projectID b2.acl.userProject = projectID b2.defaultObjectACL.userProject = projectID return &b2 } // LockRetentionPolicy locks a bucket's retention policy until a previously-configured // RetentionPeriod past the EffectiveTime. Note that if RetentionPeriod is set to less // than a day, the retention policy is treated as a development configuration and locking // will have no effect. The BucketHandle must have a metageneration condition that // matches the bucket's metageneration. See BucketHandle.If. // // This feature is in private alpha release. It is not currently available to // most customers. It might be changed in backwards-incompatible ways and is not // subject to any SLA or deprecation policy. func (b *BucketHandle) LockRetentionPolicy(ctx context.Context) error { o := makeStorageOpts(true, b.retry, b.userProject) return b.c.tc.LockBucketRetentionPolicy(ctx, b.name, b.conds, o...) } // SetObjectRetention returns a new BucketHandle that will enable object retention // on bucket creation. To enable object retention, you must use the returned // handle to create the bucket. This has no effect on an already existing bucket. // ObjectRetention is not enabled by default. // ObjectRetention cannot be configured through the gRPC API. func (b *BucketHandle) SetObjectRetention(enable bool) *BucketHandle { b2 := *b b2.enableObjectRetention = &enable return &b2 } // applyBucketConds modifies the provided call using the conditions in conds. // call is something that quacks like a *raw.WhateverCall. func applyBucketConds(method string, conds *BucketConditions, call interface{}) error { if conds == nil { return nil } if err := conds.validate(method); err != nil { return err } cval := reflect.ValueOf(call) switch { case conds.MetagenerationMatch != 0: if !setIfMetagenerationMatch(cval, conds.MetagenerationMatch) { return fmt.Errorf("storage: %s: ifMetagenerationMatch not supported", method) } case conds.MetagenerationNotMatch != 0: if !setIfMetagenerationNotMatch(cval, conds.MetagenerationNotMatch) { return fmt.Errorf("storage: %s: ifMetagenerationNotMatch not supported", method) } } return nil } // applyBucketConds modifies the provided request message using the conditions // in conds. msg is a protobuf Message that has fields if_metageneration_match // and if_metageneration_not_match. func applyBucketCondsProto(method string, conds *BucketConditions, msg proto.Message) error { rmsg := msg.ProtoReflect() if conds == nil { return nil } if err := conds.validate(method); err != nil { return err } switch { case conds.MetagenerationMatch != 0: if !setConditionProtoField(rmsg, "if_metageneration_match", conds.MetagenerationMatch) { return fmt.Errorf("storage: %s: ifMetagenerationMatch not supported", method) } case conds.MetagenerationNotMatch != 0: if !setConditionProtoField(rmsg, "if_metageneration_not_match", conds.MetagenerationNotMatch) { return fmt.Errorf("storage: %s: ifMetagenerationNotMatch not supported", method) } } return nil } func (rp *RetentionPolicy) toRawRetentionPolicy() *raw.BucketRetentionPolicy { if rp == nil { return nil } return &raw.BucketRetentionPolicy{ RetentionPeriod: int64(rp.RetentionPeriod / time.Second), } } func (rp *RetentionPolicy) toProtoRetentionPolicy() *storagepb.Bucket_RetentionPolicy { if rp == nil { return nil } // RetentionPeriod must be greater than 0, so if it is 0, the user left it // unset, and so we should not send it in the request i.e. nil is sent. var dur *durationpb.Duration if rp.RetentionPeriod != 0 { dur = durationpb.New(rp.RetentionPeriod) } return &storagepb.Bucket_RetentionPolicy{ RetentionDuration: dur, } } func toRetentionPolicy(rp *raw.BucketRetentionPolicy) (*RetentionPolicy, error) { if rp == nil || rp.EffectiveTime == "" { return nil, nil } t, err := time.Parse(time.RFC3339, rp.EffectiveTime) if err != nil { return nil, err } return &RetentionPolicy{ RetentionPeriod: time.Duration(rp.RetentionPeriod) * time.Second, EffectiveTime: t, IsLocked: rp.IsLocked, }, nil } func toRetentionPolicyFromProto(rp *storagepb.Bucket_RetentionPolicy) *RetentionPolicy { if rp == nil || rp.GetEffectiveTime().AsTime().Unix() == 0 { return nil } return &RetentionPolicy{ RetentionPeriod: rp.GetRetentionDuration().AsDuration(), EffectiveTime: rp.GetEffectiveTime().AsTime(), IsLocked: rp.GetIsLocked(), } } func toBucketObjectRetention(or *raw.BucketObjectRetention) string { if or == nil { return "" } return or.Mode } func toRawCORS(c []CORS) []*raw.BucketCors { var out []*raw.BucketCors for _, v := range c { out = append(out, &raw.BucketCors{ MaxAgeSeconds: int64(v.MaxAge / time.Second), Method: v.Methods, Origin: v.Origins, ResponseHeader: v.ResponseHeaders, }) } return out } func toProtoCORS(c []CORS) []*storagepb.Bucket_Cors { var out []*storagepb.Bucket_Cors for _, v := range c { out = append(out, &storagepb.Bucket_Cors{ MaxAgeSeconds: int32(v.MaxAge / time.Second), Method: v.Methods, Origin: v.Origins, ResponseHeader: v.ResponseHeaders, }) } return out } func toCORS(rc []*raw.BucketCors) []CORS { var out []CORS for _, v := range rc { out = append(out, CORS{ MaxAge: time.Duration(v.MaxAgeSeconds) * time.Second, Methods: v.Method, Origins: v.Origin, ResponseHeaders: v.ResponseHeader, }) } return out } func toCORSFromProto(rc []*storagepb.Bucket_Cors) []CORS { var out []CORS for _, v := range rc { out = append(out, CORS{ MaxAge: time.Duration(v.GetMaxAgeSeconds()) * time.Second, Methods: v.GetMethod(), Origins: v.GetOrigin(), ResponseHeaders: v.GetResponseHeader(), }) } return out } func toRawLifecycle(l Lifecycle) *raw.BucketLifecycle { var rl raw.BucketLifecycle if len(l.Rules) == 0 { rl.ForceSendFields = []string{"Rule"} } for _, r := range l.Rules { rr := &raw.BucketLifecycleRule{ Action: &raw.BucketLifecycleRuleAction{ Type: r.Action.Type, StorageClass: r.Action.StorageClass, }, Condition: &raw.BucketLifecycleRuleCondition{ DaysSinceCustomTime: r.Condition.DaysSinceCustomTime, DaysSinceNoncurrentTime: r.Condition.DaysSinceNoncurrentTime, MatchesPrefix: r.Condition.MatchesPrefix, MatchesStorageClass: r.Condition.MatchesStorageClasses, MatchesSuffix: r.Condition.MatchesSuffix, NumNewerVersions: r.Condition.NumNewerVersions, }, } // AllObjects takes precedent when both AllObjects and AgeInDays are set // Rationale: If you've opted into using AllObjects, it makes sense that you // understand the implications of how this option works with AgeInDays. if r.Condition.AllObjects { rr.Condition.Age = googleapi.Int64(0) rr.Condition.ForceSendFields = []string{"Age"} } else if r.Condition.AgeInDays > 0 { rr.Condition.Age = googleapi.Int64(r.Condition.AgeInDays) } switch r.Condition.Liveness { case LiveAndArchived: rr.Condition.IsLive = nil case Live: rr.Condition.IsLive = googleapi.Bool(true) case Archived: rr.Condition.IsLive = googleapi.Bool(false) } if !r.Condition.CreatedBefore.IsZero() { rr.Condition.CreatedBefore = r.Condition.CreatedBefore.Format(rfc3339Date) } if !r.Condition.CustomTimeBefore.IsZero() { rr.Condition.CustomTimeBefore = r.Condition.CustomTimeBefore.Format(rfc3339Date) } if !r.Condition.NoncurrentTimeBefore.IsZero() { rr.Condition.NoncurrentTimeBefore = r.Condition.NoncurrentTimeBefore.Format(rfc3339Date) } rl.Rule = append(rl.Rule, rr) } return &rl } func toProtoLifecycle(l Lifecycle) *storagepb.Bucket_Lifecycle { var rl storagepb.Bucket_Lifecycle for _, r := range l.Rules { rr := &storagepb.Bucket_Lifecycle_Rule{ Action: &storagepb.Bucket_Lifecycle_Rule_Action{ Type: r.Action.Type, StorageClass: r.Action.StorageClass, }, Condition: &storagepb.Bucket_Lifecycle_Rule_Condition{ // Note: The Apiary types use int64 (even though the Discovery // doc states "format: int32"), so the client types used int64, // but the proto uses int32 so we have a potentially lossy // conversion. DaysSinceCustomTime: proto.Int32(int32(r.Condition.DaysSinceCustomTime)), DaysSinceNoncurrentTime: proto.Int32(int32(r.Condition.DaysSinceNoncurrentTime)), MatchesPrefix: r.Condition.MatchesPrefix, MatchesStorageClass: r.Condition.MatchesStorageClasses, MatchesSuffix: r.Condition.MatchesSuffix, NumNewerVersions: proto.Int32(int32(r.Condition.NumNewerVersions)), }, } // Only set AgeDays in the proto if it is non-zero, or if the user has set // Condition.AllObjects. if r.Condition.AgeInDays != 0 { rr.Condition.AgeDays = proto.Int32(int32(r.Condition.AgeInDays)) } if r.Condition.AllObjects { rr.Condition.AgeDays = proto.Int32(0) } switch r.Condition.Liveness { case LiveAndArchived: rr.Condition.IsLive = nil case Live: rr.Condition.IsLive = proto.Bool(true) case Archived: rr.Condition.IsLive = proto.Bool(false) } if !r.Condition.CreatedBefore.IsZero() { rr.Condition.CreatedBefore = timeToProtoDate(r.Condition.CreatedBefore) } if !r.Condition.CustomTimeBefore.IsZero() { rr.Condition.CustomTimeBefore = timeToProtoDate(r.Condition.CustomTimeBefore) } if !r.Condition.NoncurrentTimeBefore.IsZero() { rr.Condition.NoncurrentTimeBefore = timeToProtoDate(r.Condition.NoncurrentTimeBefore) } rl.Rule = append(rl.Rule, rr) } return &rl } func toLifecycle(rl *raw.BucketLifecycle) Lifecycle { var l Lifecycle if rl == nil { return l } for _, rr := range rl.Rule { r := LifecycleRule{ Action: LifecycleAction{ Type: rr.Action.Type, StorageClass: rr.Action.StorageClass, }, Condition: LifecycleCondition{ DaysSinceCustomTime: rr.Condition.DaysSinceCustomTime, DaysSinceNoncurrentTime: rr.Condition.DaysSinceNoncurrentTime, MatchesPrefix: rr.Condition.MatchesPrefix, MatchesStorageClasses: rr.Condition.MatchesStorageClass, MatchesSuffix: rr.Condition.MatchesSuffix, NumNewerVersions: rr.Condition.NumNewerVersions, }, } if rr.Condition.Age != nil { r.Condition.AgeInDays = *rr.Condition.Age if *rr.Condition.Age == 0 { r.Condition.AllObjects = true } } if rr.Condition.IsLive == nil { r.Condition.Liveness = LiveAndArchived } else if *rr.Condition.IsLive { r.Condition.Liveness = Live } else { r.Condition.Liveness = Archived } if rr.Condition.CreatedBefore != "" { r.Condition.CreatedBefore, _ = time.Parse(rfc3339Date, rr.Condition.CreatedBefore) } if rr.Condition.CustomTimeBefore != "" { r.Condition.CustomTimeBefore, _ = time.Parse(rfc3339Date, rr.Condition.CustomTimeBefore) } if rr.Condition.NoncurrentTimeBefore != "" { r.Condition.NoncurrentTimeBefore, _ = time.Parse(rfc3339Date, rr.Condition.NoncurrentTimeBefore) } l.Rules = append(l.Rules, r) } return l } func toLifecycleFromProto(rl *storagepb.Bucket_Lifecycle) Lifecycle { var l Lifecycle if rl == nil { return l } for _, rr := range rl.GetRule() { r := LifecycleRule{ Action: LifecycleAction{ Type: rr.GetAction().GetType(), StorageClass: rr.GetAction().GetStorageClass(), }, Condition: LifecycleCondition{ AgeInDays: int64(rr.GetCondition().GetAgeDays()), DaysSinceCustomTime: int64(rr.GetCondition().GetDaysSinceCustomTime()), DaysSinceNoncurrentTime: int64(rr.GetCondition().GetDaysSinceNoncurrentTime()), MatchesPrefix: rr.GetCondition().GetMatchesPrefix(), MatchesStorageClasses: rr.GetCondition().GetMatchesStorageClass(), MatchesSuffix: rr.GetCondition().GetMatchesSuffix(), NumNewerVersions: int64(rr.GetCondition().GetNumNewerVersions()), }, } // Only set Condition.AllObjects if AgeDays is zero, not if it is nil. if rr.GetCondition().AgeDays != nil && rr.GetCondition().GetAgeDays() == 0 { r.Condition.AllObjects = true } if rr.GetCondition().IsLive == nil { r.Condition.Liveness = LiveAndArchived } else if rr.GetCondition().GetIsLive() { r.Condition.Liveness = Live } else { r.Condition.Liveness = Archived } if rr.GetCondition().GetCreatedBefore() != nil { r.Condition.CreatedBefore = protoDateToUTCTime(rr.GetCondition().GetCreatedBefore()) } if rr.GetCondition().GetCustomTimeBefore() != nil { r.Condition.CustomTimeBefore = protoDateToUTCTime(rr.GetCondition().GetCustomTimeBefore()) } if rr.GetCondition().GetNoncurrentTimeBefore() != nil { r.Condition.NoncurrentTimeBefore = protoDateToUTCTime(rr.GetCondition().GetNoncurrentTimeBefore()) } l.Rules = append(l.Rules, r) } return l } func (e *BucketEncryption) toRawBucketEncryption() *raw.BucketEncryption { if e == nil { return nil } return &raw.BucketEncryption{ DefaultKmsKeyName: e.DefaultKMSKeyName, } } func (e *BucketEncryption) toProtoBucketEncryption() *storagepb.Bucket_Encryption { if e == nil { return nil } return &storagepb.Bucket_Encryption{ DefaultKmsKey: e.DefaultKMSKeyName, } } func toBucketEncryption(e *raw.BucketEncryption) *BucketEncryption { if e == nil { return nil } return &BucketEncryption{DefaultKMSKeyName: e.DefaultKmsKeyName} } func toBucketEncryptionFromProto(e *storagepb.Bucket_Encryption) *BucketEncryption { if e == nil { return nil } return &BucketEncryption{DefaultKMSKeyName: e.GetDefaultKmsKey()} } func (b *BucketLogging) toRawBucketLogging() *raw.BucketLogging { if b == nil { return nil } return &raw.BucketLogging{ LogBucket: b.LogBucket, LogObjectPrefix: b.LogObjectPrefix, } } func (b *BucketLogging) toProtoBucketLogging() *storagepb.Bucket_Logging { if b == nil { return nil } return &storagepb.Bucket_Logging{ LogBucket: bucketResourceName(globalProjectAlias, b.LogBucket), LogObjectPrefix: b.LogObjectPrefix, } } func toBucketLogging(b *raw.BucketLogging) *BucketLogging { if b == nil { return nil } return &BucketLogging{ LogBucket: b.LogBucket, LogObjectPrefix: b.LogObjectPrefix, } } func toBucketLoggingFromProto(b *storagepb.Bucket_Logging) *BucketLogging { if b == nil { return nil } lb := parseBucketName(b.GetLogBucket()) return &BucketLogging{ LogBucket: lb, LogObjectPrefix: b.GetLogObjectPrefix(), } } func (w *BucketWebsite) toRawBucketWebsite() *raw.BucketWebsite { if w == nil { return nil } return &raw.BucketWebsite{ MainPageSuffix: w.MainPageSuffix, NotFoundPage: w.NotFoundPage, } } func (w *BucketWebsite) toProtoBucketWebsite() *storagepb.Bucket_Website { if w == nil { return nil } return &storagepb.Bucket_Website{ MainPageSuffix: w.MainPageSuffix, NotFoundPage: w.NotFoundPage, } } func toBucketWebsite(w *raw.BucketWebsite) *BucketWebsite { if w == nil { return nil } return &BucketWebsite{ MainPageSuffix: w.MainPageSuffix, NotFoundPage: w.NotFoundPage, } } func toBucketWebsiteFromProto(w *storagepb.Bucket_Website) *BucketWebsite { if w == nil { return nil } return &BucketWebsite{ MainPageSuffix: w.GetMainPageSuffix(), NotFoundPage: w.GetNotFoundPage(), } } func toBucketPolicyOnly(b *raw.BucketIamConfiguration) BucketPolicyOnly { if b == nil || b.BucketPolicyOnly == nil || !b.BucketPolicyOnly.Enabled { return BucketPolicyOnly{} } lt, err := time.Parse(time.RFC3339, b.BucketPolicyOnly.LockedTime) if err != nil { return BucketPolicyOnly{ Enabled: true, } } return BucketPolicyOnly{ Enabled: true, LockedTime: lt, } } func toBucketPolicyOnlyFromProto(b *storagepb.Bucket_IamConfig) BucketPolicyOnly { if b == nil || !b.GetUniformBucketLevelAccess().GetEnabled() { return BucketPolicyOnly{} } return BucketPolicyOnly{ Enabled: true, LockedTime: b.GetUniformBucketLevelAccess().GetLockTime().AsTime(), } } func toUniformBucketLevelAccess(b *raw.BucketIamConfiguration) UniformBucketLevelAccess { if b == nil || b.UniformBucketLevelAccess == nil || !b.UniformBucketLevelAccess.Enabled { return UniformBucketLevelAccess{} } lt, err := time.Parse(time.RFC3339, b.UniformBucketLevelAccess.LockedTime) if err != nil { return UniformBucketLevelAccess{ Enabled: true, } } return UniformBucketLevelAccess{ Enabled: true, LockedTime: lt, } } func toUniformBucketLevelAccessFromProto(b *storagepb.Bucket_IamConfig) UniformBucketLevelAccess { if b == nil || !b.GetUniformBucketLevelAccess().GetEnabled() { return UniformBucketLevelAccess{} } return UniformBucketLevelAccess{ Enabled: true, LockedTime: b.GetUniformBucketLevelAccess().GetLockTime().AsTime(), } } func toPublicAccessPrevention(b *raw.BucketIamConfiguration) PublicAccessPrevention { if b == nil { return PublicAccessPreventionUnknown } switch b.PublicAccessPrevention { case publicAccessPreventionInherited, publicAccessPreventionUnspecified: return PublicAccessPreventionInherited case publicAccessPreventionEnforced: return PublicAccessPreventionEnforced default: return PublicAccessPreventionUnknown } } func toPublicAccessPreventionFromProto(b *storagepb.Bucket_IamConfig) PublicAccessPrevention { if b == nil { return PublicAccessPreventionUnknown } switch b.GetPublicAccessPrevention() { case publicAccessPreventionInherited, publicAccessPreventionUnspecified: return PublicAccessPreventionInherited case publicAccessPreventionEnforced: return PublicAccessPreventionEnforced default: return PublicAccessPreventionUnknown } } func toRPO(b *raw.Bucket) RPO { if b == nil { return RPOUnknown } switch b.Rpo { case rpoDefault: return RPODefault case rpoAsyncTurbo: return RPOAsyncTurbo default: return RPOUnknown } } func toRPOFromProto(b *storagepb.Bucket) RPO { if b == nil { return RPOUnknown } switch b.GetRpo() { case rpoDefault: return RPODefault case rpoAsyncTurbo: return RPOAsyncTurbo default: return RPOUnknown } } func customPlacementFromRaw(c *raw.BucketCustomPlacementConfig) *CustomPlacementConfig { if c == nil { return nil } return &CustomPlacementConfig{DataLocations: c.DataLocations} } func (c *CustomPlacementConfig) toRawCustomPlacement() *raw.BucketCustomPlacementConfig { if c == nil { return nil } return &raw.BucketCustomPlacementConfig{ DataLocations: c.DataLocations, } } func (c *CustomPlacementConfig) toProtoCustomPlacement() *storagepb.Bucket_CustomPlacementConfig { if c == nil { return nil } return &storagepb.Bucket_CustomPlacementConfig{ DataLocations: c.DataLocations, } } func customPlacementFromProto(c *storagepb.Bucket_CustomPlacementConfig) *CustomPlacementConfig { if c == nil { return nil } return &CustomPlacementConfig{DataLocations: c.GetDataLocations()} } func (a *Autoclass) toRawAutoclass() *raw.BucketAutoclass { if a == nil { return nil } // Excluding read only fields ToggleTime and TerminalStorageClassUpdateTime. return &raw.BucketAutoclass{ Enabled: a.Enabled, TerminalStorageClass: a.TerminalStorageClass, } } func (a *Autoclass) toProtoAutoclass() *storagepb.Bucket_Autoclass { if a == nil { return nil } // Excluding read only fields ToggleTime and TerminalStorageClassUpdateTime. ba := &storagepb.Bucket_Autoclass{ Enabled: a.Enabled, } if a.TerminalStorageClass != "" { ba.TerminalStorageClass = &a.TerminalStorageClass } return ba } func toAutoclassFromRaw(a *raw.BucketAutoclass) *Autoclass { if a == nil || a.ToggleTime == "" { return nil } ac := &Autoclass{ Enabled: a.Enabled, TerminalStorageClass: a.TerminalStorageClass, } // Return ToggleTime and TSCUpdateTime only if parsed with valid values. t, err := time.Parse(time.RFC3339, a.ToggleTime) if err == nil { ac.ToggleTime = t } ut, err := time.Parse(time.RFC3339, a.TerminalStorageClassUpdateTime) if err == nil { ac.TerminalStorageClassUpdateTime = ut } return ac } func toAutoclassFromProto(a *storagepb.Bucket_Autoclass) *Autoclass { if a == nil || a.GetToggleTime().AsTime().Unix() == 0 { return nil } return &Autoclass{ Enabled: a.GetEnabled(), ToggleTime: a.GetToggleTime().AsTime(), TerminalStorageClass: a.GetTerminalStorageClass(), TerminalStorageClassUpdateTime: a.GetTerminalStorageClassUpdateTime().AsTime(), } } func (p *SoftDeletePolicy) toRawSoftDeletePolicy() *raw.BucketSoftDeletePolicy { if p == nil { return nil } // Excluding read only field EffectiveTime. // ForceSendFields must be set to send a zero value for RetentionDuration and disable // soft delete. return &raw.BucketSoftDeletePolicy{ RetentionDurationSeconds: int64(p.RetentionDuration.Seconds()), ForceSendFields: []string{"RetentionDurationSeconds"}, } } func (p *SoftDeletePolicy) toProtoSoftDeletePolicy() *storagepb.Bucket_SoftDeletePolicy { if p == nil { return nil } // Excluding read only field EffectiveTime. return &storagepb.Bucket_SoftDeletePolicy{ RetentionDuration: durationpb.New(p.RetentionDuration), } } func toSoftDeletePolicyFromRaw(p *raw.BucketSoftDeletePolicy) *SoftDeletePolicy { if p == nil { return nil } policy := &SoftDeletePolicy{ RetentionDuration: time.Duration(p.RetentionDurationSeconds) * time.Second, } // Return EffectiveTime only if parsed to a valid value. if t, err := time.Parse(time.RFC3339, p.EffectiveTime); err == nil { policy.EffectiveTime = t } return policy } func toSoftDeletePolicyFromProto(p *storagepb.Bucket_SoftDeletePolicy) *SoftDeletePolicy { if p == nil { return nil } return &SoftDeletePolicy{ EffectiveTime: p.GetEffectiveTime().AsTime(), RetentionDuration: p.GetRetentionDuration().AsDuration(), } } func (hns *HierarchicalNamespace) toProtoHierarchicalNamespace() *storagepb.Bucket_HierarchicalNamespace { if hns == nil { return nil } return &storagepb.Bucket_HierarchicalNamespace{ Enabled: hns.Enabled, } } func (hns *HierarchicalNamespace) toRawHierarchicalNamespace() *raw.BucketHierarchicalNamespace { if hns == nil { return nil } return &raw.BucketHierarchicalNamespace{ Enabled: hns.Enabled, } } func toHierarchicalNamespaceFromProto(p *storagepb.Bucket_HierarchicalNamespace) *HierarchicalNamespace { if p == nil { return nil } return &HierarchicalNamespace{ Enabled: p.Enabled, } } func toHierarchicalNamespaceFromRaw(r *raw.BucketHierarchicalNamespace) *HierarchicalNamespace { if r == nil { return nil } return &HierarchicalNamespace{ Enabled: r.Enabled, } } func ownerEntityFromRaw(r *raw.BucketOwner) string { if r == nil { return "" } return r.Entity } func ownerEntityFromProto(p *storagepb.Owner) string { if p == nil { return "" } return p.GetEntity() } // Objects returns an iterator over the objects in the bucket that match the // Query q. If q is nil, no filtering is done. Objects will be iterated over // lexicographically by name. // // Note: The returned iterator is not safe for concurrent operations without explicit synchronization. func (b *BucketHandle) Objects(ctx context.Context, q *Query) *ObjectIterator { o := makeStorageOpts(true, b.retry, b.userProject) return b.c.tc.ListObjects(ctx, b.name, q, o...) } // Retryer returns a bucket handle that is configured with custom retry // behavior as specified by the options that are passed to it. All operations // on the new handle will use the customized retry configuration. // Retry options set on a object handle will take precedence over options set on // the bucket handle. // These retry options will merge with the client's retry configuration (if set) // for the returned handle. Options passed into this method will take precedence // over retry options on the client. Note that you must explicitly pass in each // option you want to override. func (b *BucketHandle) Retryer(opts ...RetryOption) *BucketHandle { b2 := *b var retry *retryConfig if b.retry != nil { // merge the options with the existing retry retry = b.retry } else { retry = &retryConfig{} } for _, opt := range opts { opt.apply(retry) } b2.retry = retry b2.acl.retry = retry b2.defaultObjectACL.retry = retry return &b2 } // An ObjectIterator is an iterator over ObjectAttrs. // // Note: This iterator is not safe for concurrent operations without explicit synchronization. type ObjectIterator struct { ctx context.Context query Query pageInfo *iterator.PageInfo nextFunc func() error items []*ObjectAttrs } // PageInfo supports pagination. See the google.golang.org/api/iterator package for details. // // Note: This method is not safe for concurrent operations without explicit synchronization. func (it *ObjectIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if // there are no more results. Once Next returns iterator.Done, all subsequent // calls will return iterator.Done. // // In addition, if Next returns an error other than iterator.Done, all // subsequent calls will return the same error. To continue iteration, a new // `ObjectIterator` must be created. Since objects are ordered lexicographically // by name, `Query.StartOffset` can be used to create a new iterator which will // start at the desired place. See // https://pkg.go.dev/cloud.google.com/go/storage?tab=doc#hdr-Listing_objects. // // If Query.Delimiter is non-empty, some of the ObjectAttrs returned by Next will // have a non-empty Prefix field, and a zero value for all other fields. These // represent prefixes. // // Note: This method is not safe for concurrent operations without explicit synchronization. func (it *ObjectIterator) Next() (*ObjectAttrs, error) { if err := it.nextFunc(); err != nil { return nil, err } item := it.items[0] it.items = it.items[1:] return item, nil } // Buckets returns an iterator over the buckets in the project. You may // optionally set the iterator's Prefix field to restrict the list to buckets // whose names begin with the prefix. By default, all buckets in the project // are returned. // // Note: The returned iterator is not safe for concurrent operations without explicit synchronization. func (c *Client) Buckets(ctx context.Context, projectID string) *BucketIterator { o := makeStorageOpts(true, c.retry, "") return c.tc.ListBuckets(ctx, projectID, o...) } // A BucketIterator is an iterator over BucketAttrs. // // Note: This iterator is not safe for concurrent operations without explicit synchronization. type BucketIterator struct { // Prefix restricts the iterator to buckets whose names begin with it. Prefix string ctx context.Context projectID string buckets []*BucketAttrs pageInfo *iterator.PageInfo nextFunc func() error } // Next returns the next result. Its second return value is iterator.Done if // there are no more results. Once Next returns iterator.Done, all subsequent // calls will return iterator.Done. // // Note: This method is not safe for concurrent operations without explicit synchronization. func (it *BucketIterator) Next() (*BucketAttrs, error) { if err := it.nextFunc(); err != nil { return nil, err } b := it.buckets[0] it.buckets = it.buckets[1:] return b, nil } // PageInfo supports pagination. See the google.golang.org/api/iterator package for details. // // Note: This method is not safe for concurrent operations without explicit synchronization. func (it *BucketIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // RPO (Recovery Point Objective) configures the turbo replication feature. See // https://cloud.google.com/storage/docs/managing-turbo-replication for more information. type RPO int const ( // RPOUnknown is a zero value. It may be returned from bucket.Attrs() if RPO // is not present in the bucket metadata, that is, the bucket is not dual-region. // This value is also used if the RPO field is not set in a call to GCS. RPOUnknown RPO = iota // RPODefault represents default replication. It is used to reset RPO on an // existing bucket that has this field set to RPOAsyncTurbo. Otherwise it // is equivalent to RPOUnknown, and is always ignored. This value is valid // for dual- or multi-region buckets. RPODefault // RPOAsyncTurbo represents turbo replication and is used to enable Turbo // Replication on a bucket. This value is only valid for dual-region buckets. RPOAsyncTurbo rpoUnknown string = "" rpoDefault = "DEFAULT" rpoAsyncTurbo = "ASYNC_TURBO" ) func (rpo RPO) String() string { switch rpo { case RPODefault: return rpoDefault case RPOAsyncTurbo: return rpoAsyncTurbo default: return rpoUnknown } } // protoDateToUTCTime returns a new Time based on the google.type.Date, in UTC. // // Hours, minutes, seconds, and nanoseconds are set to 0. func protoDateToUTCTime(d *dpb.Date) time.Time { return protoDateToTime(d, time.UTC) } // protoDateToTime returns a new Time based on the google.type.Date and provided // *time.Location. // // Hours, minutes, seconds, and nanoseconds are set to 0. func protoDateToTime(d *dpb.Date, l *time.Location) time.Time { return time.Date(int(d.GetYear()), time.Month(d.GetMonth()), int(d.GetDay()), 0, 0, 0, 0, l) } // timeToProtoDate returns a new google.type.Date based on the provided time.Time. // The location is ignored, as is anything more precise than the day. func timeToProtoDate(t time.Time) *dpb.Date { return &dpb.Date{ Year: int32(t.Year()), Month: int32(t.Month()), Day: int32(t.Day()), } } ================================================ FILE: vendor/cloud.google.com/go/storage/client.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "io" "time" "cloud.google.com/go/iam/apiv1/iampb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/option" ) // TODO(noahdietz): Move existing factory methods to this file. // storageClient is an internal-only interface designed to separate the // transport-specific logic of making Storage API calls from the logic of the // client library. // // Implementation requirements beyond implementing the interface include: // * factory method(s) must accept a `userProject string` param // * `settings` must be retained per instance // * `storageOption`s must be resolved in the order they are received // * all API errors must be wrapped in the gax-go APIError type // * any unimplemented interface methods must return a StorageUnimplementedErr // // TODO(noahdietz): This interface is currently not used in the production code // paths type storageClient interface { // Top-level methods. GetServiceAccount(ctx context.Context, project string, opts ...storageOption) (string, error) CreateBucket(ctx context.Context, project, bucket string, attrs *BucketAttrs, enableObjectRetention *bool, opts ...storageOption) (*BucketAttrs, error) ListBuckets(ctx context.Context, project string, opts ...storageOption) *BucketIterator Close() error // Bucket methods. DeleteBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) UpdateBucket(ctx context.Context, bucket string, uattrs *BucketAttrsToUpdate, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) LockBucketRetentionPolicy(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator // Object metadata methods. DeleteObject(ctx context.Context, bucket, object string, gen int64, conds *Conditions, opts ...storageOption) error GetObject(ctx context.Context, params *getObjectParams, opts ...storageOption) (*ObjectAttrs, error) UpdateObject(ctx context.Context, params *updateObjectParams, opts ...storageOption) (*ObjectAttrs, error) RestoreObject(ctx context.Context, params *restoreObjectParams, opts ...storageOption) (*ObjectAttrs, error) MoveObject(ctx context.Context, params *moveObjectParams, opts ...storageOption) (*ObjectAttrs, error) // Default Object ACL methods. DeleteDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error ListDefaultObjectACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) UpdateDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error // Bucket ACL methods. DeleteBucketACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error ListBucketACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) UpdateBucketACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error // Object ACL methods. DeleteObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, opts ...storageOption) error ListObjectACLs(ctx context.Context, bucket, object string, opts ...storageOption) ([]ACLRule, error) UpdateObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, role ACLRole, opts ...storageOption) error // Media operations. ComposeObject(ctx context.Context, req *composeObjectRequest, opts ...storageOption) (*ObjectAttrs, error) RewriteObject(ctx context.Context, req *rewriteObjectRequest, opts ...storageOption) (*rewriteObjectResponse, error) NewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (*Reader, error) OpenWriter(params *openWriterParams, opts ...storageOption) (*io.PipeWriter, error) // IAM methods. GetIamPolicy(ctx context.Context, resource string, version int32, opts ...storageOption) (*iampb.Policy, error) SetIamPolicy(ctx context.Context, resource string, policy *iampb.Policy, opts ...storageOption) error TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) // HMAC Key methods. GetHMACKey(ctx context.Context, project, accessID string, opts ...storageOption) (*HMACKey, error) ListHMACKeys(ctx context.Context, project, serviceAccountEmail string, showDeletedKeys bool, opts ...storageOption) *HMACKeysIterator UpdateHMACKey(ctx context.Context, project, serviceAccountEmail, accessID string, attrs *HMACKeyAttrsToUpdate, opts ...storageOption) (*HMACKey, error) CreateHMACKey(ctx context.Context, project, serviceAccountEmail string, opts ...storageOption) (*HMACKey, error) DeleteHMACKey(ctx context.Context, project, accessID string, opts ...storageOption) error // Notification methods. ListNotifications(ctx context.Context, bucket string, opts ...storageOption) (map[string]*Notification, error) CreateNotification(ctx context.Context, bucket string, n *Notification, opts ...storageOption) (*Notification, error) DeleteNotification(ctx context.Context, bucket string, id string, opts ...storageOption) error NewMultiRangeDownloader(ctx context.Context, params *newMultiRangeDownloaderParams, opts ...storageOption) (*MultiRangeDownloader, error) } // settings contains transport-agnostic configuration for API calls made via // the storageClient inteface. All implementations must utilize settings // and respect those that are applicable. type settings struct { // retry is the complete retry configuration to use when evaluating if an // API call should be retried. retry *retryConfig // gax is a set of gax.CallOption to be conveyed to gax.Invoke. // Note: Not all storageClient interfaces will must use gax.Invoke. gax []gax.CallOption // idempotent indicates if the call is idempotent or not when considering // if the call should be retried or not. idempotent bool // clientOption is a set of option.ClientOption to be used during client // transport initialization. See https://pkg.go.dev/google.golang.org/api/option // for a list of supported options. clientOption []option.ClientOption // userProject is the user project that should be billed for the request. userProject string metricsContext *metricsContext } func initSettings(opts ...storageOption) *settings { s := &settings{} resolveOptions(s, opts...) return s } func resolveOptions(s *settings, opts ...storageOption) { for _, o := range opts { o.Apply(s) } } // callSettings is a helper for resolving storage options against the settings // in the context of an individual call. This is to ensure that client-level // default settings are not mutated by two different calls getting options. // // Example: s := callSettings(c.settings, opts...) func callSettings(defaults *settings, opts ...storageOption) *settings { if defaults == nil { return nil } // This does not make a deep copy of the pointer/slice fields, but all // options replace the settings fields rather than modify their values in // place. cs := *defaults resolveOptions(&cs, opts...) return &cs } // makeStorageOpts is a helper for generating a set of storageOption based on // idempotency, retryConfig, and userProject. All top-level client operations // will generally have to pass these options through the interface. func makeStorageOpts(isIdempotent bool, retry *retryConfig, userProject string) []storageOption { opts := []storageOption{idempotent(isIdempotent)} if retry != nil { opts = append(opts, withRetryConfig(retry)) } if userProject != "" { opts = append(opts, withUserProject(userProject)) } return opts } // storageOption is the transport-agnostic call option for the storageClient // interface. type storageOption interface { Apply(s *settings) } func withRetryConfig(rc *retryConfig) storageOption { return &retryOption{rc} } type retryOption struct { rc *retryConfig } func (o *retryOption) Apply(s *settings) { s.retry = o.rc } func idempotent(i bool) storageOption { return &idempotentOption{i} } type idempotentOption struct { idempotency bool } func (o *idempotentOption) Apply(s *settings) { s.idempotent = o.idempotency } func withClientOptions(opts ...option.ClientOption) storageOption { return &clientOption{opts: opts} } type clientOption struct { opts []option.ClientOption } func (o *clientOption) Apply(s *settings) { s.clientOption = o.opts } func withUserProject(project string) storageOption { return &userProjectOption{project} } type userProjectOption struct { project string } func (o *userProjectOption) Apply(s *settings) { s.userProject = o.project } type openWriterParams struct { // Writer configuration // ctx is the context used by the writer routine to make all network calls // and to manage the writer routine - see `Writer.ctx`. // Required. ctx context.Context // chunkSize - see `Writer.ChunkSize`. // Optional. chunkSize int // chunkRetryDeadline - see `Writer.ChunkRetryDeadline`. // Optional. chunkRetryDeadline time.Duration chunkTransferTimeout time.Duration // Object/request properties // bucket - see `Writer.o.bucket`. // Required. bucket string // attrs - see `Writer.ObjectAttrs`. // Required. attrs *ObjectAttrs // forceEmptyContentType - Disables auto-detect of Content-Type // Optional. forceEmptyContentType bool // conds - see `Writer.o.conds`. // Optional. conds *Conditions // appendGen -- object generation to write to. // Optional; required for taking over appendable objects only appendGen int64 // encryptionKey - see `Writer.o.encryptionKey` // Optional. encryptionKey []byte // sendCRC32C - see `Writer.SendCRC32C`. // Optional. sendCRC32C bool // append - Write with appendable object semantics. // Optional. append bool // finalizeOnClose - Finalize the object when the storage.Writer is closed // successfully. // Optional. finalizeOnClose bool // Writer callbacks // donec - see `Writer.donec`. // Required. donec chan struct{} // setError callback for reporting errors - see `Writer.error`. // Required. setError func(error) // progress callback for reporting upload progress - see `Writer.progress`. // Required. progress func(int64) // setObj callback for reporting the resulting object - see `Writer.obj`. // Required. setObj func(*ObjectAttrs) // setSize callback for updated the persisted size in Writer.obj. setSize func(int64) // setFlush callback for providing a Flush function implementation - see `Writer.Flush`. // Required. setFlush func(func() (int64, error)) // setPipeWriter callback for reseting `Writer.pw` if needed. setPipeWriter func(*io.PipeWriter) // setTakeoverOffset callback for returning offset to start writing from to Writer. setTakeoverOffset func(int64) } type newMultiRangeDownloaderParams struct { bucket string conds *Conditions encryptionKey []byte gen int64 object string handle *ReadHandle } type newRangeReaderParams struct { bucket string conds *Conditions encryptionKey []byte gen int64 length int64 object string offset int64 readCompressed bool // Use accept-encoding: gzip. Only works for HTTP currently. handle *ReadHandle } type getObjectParams struct { bucket, object string gen int64 encryptionKey []byte conds *Conditions softDeleted bool } type updateObjectParams struct { bucket, object string uattrs *ObjectAttrsToUpdate gen int64 encryptionKey []byte conds *Conditions overrideRetention *bool } type restoreObjectParams struct { bucket, object string gen int64 encryptionKey []byte conds *Conditions copySourceACL bool } type moveObjectParams struct { bucket, srcObject, dstObject string srcConds *Conditions dstConds *Conditions encryptionKey []byte } type composeObjectRequest struct { dstBucket string dstObject destinationObject srcs []sourceObject predefinedACL string sendCRC32C bool } type sourceObject struct { name string bucket string gen int64 conds *Conditions encryptionKey []byte } type destinationObject struct { name string bucket string conds *Conditions attrs *ObjectAttrs // attrs to set on the destination object. encryptionKey []byte keyName string } type rewriteObjectRequest struct { srcObject sourceObject dstObject destinationObject predefinedACL string token string maxBytesRewrittenPerCall int64 } type rewriteObjectResponse struct { resource *ObjectAttrs done bool written int64 size int64 token string } ================================================ FILE: vendor/cloud.google.com/go/storage/copy.go ================================================ // Copyright 2016 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "errors" "fmt" "cloud.google.com/go/internal/trace" ) // CopierFrom creates a Copier that can copy src to dst. // You can immediately call Run on the returned Copier, or // you can configure it first. // // For Requester Pays buckets, the user project of dst is billed, unless it is empty, // in which case the user project of src is billed. func (dst *ObjectHandle) CopierFrom(src *ObjectHandle) *Copier { return &Copier{dst: dst, src: src} } // A Copier copies a source object to a destination. type Copier struct { // ObjectAttrs are optional attributes to set on the destination object. // Any attributes must be initialized before any calls on the Copier. Nil // or zero-valued attributes are ignored. ObjectAttrs // RewriteToken can be set before calling Run to resume a copy // operation. After Run returns a non-nil error, RewriteToken will // have been updated to contain the value needed to resume the copy. RewriteToken string // ProgressFunc can be used to monitor the progress of a multi-RPC copy // operation. If ProgressFunc is not nil and copying requires multiple // calls to the underlying service (see // https://cloud.google.com/storage/docs/json_api/v1/objects/rewrite), then // ProgressFunc will be invoked after each call with the number of bytes of // content copied so far and the total size in bytes of the source object. // // ProgressFunc is intended to make upload progress available to the // application. For example, the implementation of ProgressFunc may update // a progress bar in the application's UI, or log the result of // float64(copiedBytes)/float64(totalBytes). // // ProgressFunc should return quickly without blocking. ProgressFunc func(copiedBytes, totalBytes uint64) // The Cloud KMS key, in the form projects/P/locations/L/keyRings/R/cryptoKeys/K, // that will be used to encrypt the object. Overrides the object's KMSKeyName, if // any. // // Providing both a DestinationKMSKeyName and a customer-supplied encryption key // (via ObjectHandle.Key) on the destination object will result in an error when // Run is called. DestinationKMSKeyName string dst, src *ObjectHandle // The maximum number of bytes that will be rewritten per rewrite request. // Most callers shouldn't need to specify this parameter - it is primarily // in place to support testing. If specified the value must be an integral // multiple of 1 MiB (1048576). Also, this only applies to requests where // the source and destination span locations and/or storage classes. Finally, // this value must not change across rewrite calls else you'll get an error // that the `rewriteToken` is invalid. maxBytesRewrittenPerCall int64 } // Run performs the copy. func (c *Copier) Run(ctx context.Context) (attrs *ObjectAttrs, err error) { ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Copier.Run") defer func() { trace.EndSpan(ctx, err) }() if err := c.src.validate(); err != nil { return nil, err } if err := c.dst.validate(); err != nil { return nil, err } if c.DestinationKMSKeyName != "" && c.dst.encryptionKey != nil { return nil, errors.New("storage: cannot use DestinationKMSKeyName with a customer-supplied encryption key") } if c.dst.gen != defaultGen { return nil, fmt.Errorf("storage: generation cannot be specified on copy destination, got %v", c.dst.gen) } // Convert destination attributes to raw form, omitting the bucket. // If the bucket is included but name or content-type aren't, the service // returns a 400 with "Required" as the only message. Omitting the bucket // does not cause any problems. req := &rewriteObjectRequest{ srcObject: sourceObject{ name: c.src.object, bucket: c.src.bucket, gen: c.src.gen, conds: c.src.conds, encryptionKey: c.src.encryptionKey, }, dstObject: destinationObject{ name: c.dst.object, bucket: c.dst.bucket, conds: c.dst.conds, attrs: &c.ObjectAttrs, encryptionKey: c.dst.encryptionKey, keyName: c.DestinationKMSKeyName, }, predefinedACL: c.PredefinedACL, token: c.RewriteToken, maxBytesRewrittenPerCall: c.maxBytesRewrittenPerCall, } isIdempotent := c.dst.conds != nil && (c.dst.conds.GenerationMatch != 0 || c.dst.conds.DoesNotExist) var userProject string if c.dst.userProject != "" { userProject = c.dst.userProject } else if c.src.userProject != "" { userProject = c.src.userProject } opts := makeStorageOpts(isIdempotent, c.dst.retry, userProject) for { res, err := c.dst.c.tc.RewriteObject(ctx, req, opts...) if err != nil { return nil, err } c.RewriteToken = res.token req.token = res.token if c.ProgressFunc != nil { c.ProgressFunc(uint64(res.written), uint64(res.size)) } if res.done { // Finished successfully. return res.resource, nil } } } // ComposerFrom creates a Composer that can compose srcs into dst. // You can immediately call Run on the returned Composer, or you can // configure it first. // // The encryption key for the destination object will be used to decrypt all // source objects and encrypt the destination object. It is an error // to specify an encryption key for any of the source objects. func (dst *ObjectHandle) ComposerFrom(srcs ...*ObjectHandle) *Composer { return &Composer{dst: dst, srcs: srcs} } // A Composer composes source objects into a destination object. // // For Requester Pays buckets, the user project of dst is billed. type Composer struct { // ObjectAttrs are optional attributes to set on the destination object. // Any attributes must be initialized before any calls on the Composer. Nil // or zero-valued attributes are ignored. ObjectAttrs // SendCRC specifies whether to transmit a CRC32C field. It should be set // to true in addition to setting the Composer's CRC32C field, because zero // is a valid CRC and normally a zero would not be transmitted. // If a CRC32C is sent, and the data in the destination object does not match // the checksum, the compose will be rejected. SendCRC32C bool dst *ObjectHandle srcs []*ObjectHandle } // Run performs the compose operation. func (c *Composer) Run(ctx context.Context) (attrs *ObjectAttrs, err error) { ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Composer.Run") defer func() { trace.EndSpan(ctx, err) }() if err := c.dst.validate(); err != nil { return nil, err } if c.dst.gen != defaultGen { return nil, fmt.Errorf("storage: generation cannot be specified on compose destination, got %v", c.dst.gen) } if len(c.srcs) == 0 { return nil, errors.New("storage: at least one source object must be specified") } for _, src := range c.srcs { if err := src.validate(); err != nil { return nil, err } if src.bucket != c.dst.bucket { return nil, fmt.Errorf("storage: all source objects must be in bucket %q, found %q", c.dst.bucket, src.bucket) } if src.encryptionKey != nil { return nil, fmt.Errorf("storage: compose source %s.%s must not have encryption key", src.bucket, src.object) } } req := &composeObjectRequest{ dstBucket: c.dst.bucket, predefinedACL: c.PredefinedACL, sendCRC32C: c.SendCRC32C, } req.dstObject = destinationObject{ name: c.dst.object, bucket: c.dst.bucket, conds: c.dst.conds, attrs: &c.ObjectAttrs, encryptionKey: c.dst.encryptionKey, } for _, src := range c.srcs { s := sourceObject{ name: src.object, bucket: src.bucket, gen: src.gen, conds: src.conds, } req.srcs = append(req.srcs, s) } isIdempotent := c.dst.conds != nil && (c.dst.conds.GenerationMatch != 0 || c.dst.conds.DoesNotExist) opts := makeStorageOpts(isIdempotent, c.dst.retry, c.dst.userProject) return c.dst.c.tc.ComposeObject(ctx, req, opts...) } ================================================ FILE: vendor/cloud.google.com/go/storage/doc.go ================================================ // Copyright 2016 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /* Package storage provides an easy way to work with Google Cloud Storage. Google Cloud Storage stores data in named objects, which are grouped into buckets. More information about Google Cloud Storage is available at https://cloud.google.com/storage/docs. See https://pkg.go.dev/cloud.google.com/go for authentication, timeouts, connection pooling and similar aspects of this package. # Creating a Client To start working with this package, create a [Client]: ctx := context.Background() client, err := storage.NewClient(ctx) if err != nil { // TODO: Handle error. } The client will use your default application credentials. Clients should be reused instead of created as needed. The methods of [Client] are safe for concurrent use by multiple goroutines. You may configure the client by passing in options from the [google.golang.org/api/option] package. You may also use options defined in this package, such as [WithJSONReads]. If you only wish to access public data, you can create an unauthenticated client with client, err := storage.NewClient(ctx, option.WithoutAuthentication()) To use an emulator with this library, you can set the STORAGE_EMULATOR_HOST environment variable to the address at which your emulator is running. This will send requests to that address instead of to Cloud Storage. You can then create and use a client as usual: // Set STORAGE_EMULATOR_HOST environment variable. err := os.Setenv("STORAGE_EMULATOR_HOST", "localhost:9000") if err != nil { // TODO: Handle error. } // Create client as usual. client, err := storage.NewClient(ctx) if err != nil { // TODO: Handle error. } // This request is now directed to http://localhost:9000/storage/v1/b // instead of https://storage.googleapis.com/storage/v1/b if err := client.Bucket("my-bucket").Create(ctx, projectID, nil); err != nil { // TODO: Handle error. } Please note that there is no official emulator for Cloud Storage. # Buckets A Google Cloud Storage bucket is a collection of objects. To work with a bucket, make a bucket handle: bkt := client.Bucket(bucketName) A handle is a reference to a bucket. You can have a handle even if the bucket doesn't exist yet. To create a bucket in Google Cloud Storage, call [BucketHandle.Create]: if err := bkt.Create(ctx, projectID, nil); err != nil { // TODO: Handle error. } Note that although buckets are associated with projects, bucket names are global across all projects. Each bucket has associated metadata, represented in this package by [BucketAttrs]. The third argument to [BucketHandle.Create] allows you to set the initial [BucketAttrs] of a bucket. To retrieve a bucket's attributes, use [BucketHandle.Attrs]: attrs, err := bkt.Attrs(ctx) if err != nil { // TODO: Handle error. } fmt.Printf("bucket %s, created at %s, is located in %s with storage class %s\n", attrs.Name, attrs.Created, attrs.Location, attrs.StorageClass) # Objects An object holds arbitrary data as a sequence of bytes, like a file. You refer to objects using a handle, just as with buckets, but unlike buckets you don't explicitly create an object. Instead, the first time you write to an object it will be created. You can use the standard Go [io.Reader] and [io.Writer] interfaces to read and write object data: obj := bkt.Object("data") // Write something to obj. // w implements io.Writer. w := obj.NewWriter(ctx) // Write some text to obj. This will either create the object or overwrite whatever is there already. if _, err := fmt.Fprintf(w, "This object contains text.\n"); err != nil { // TODO: Handle error. } // Close, just like writing a file. if err := w.Close(); err != nil { // TODO: Handle error. } // Read it back. r, err := obj.NewReader(ctx) if err != nil { // TODO: Handle error. } defer r.Close() if _, err := io.Copy(os.Stdout, r); err != nil { // TODO: Handle error. } // Prints "This object contains text." Objects also have attributes, which you can fetch with [ObjectHandle.Attrs]: objAttrs, err := obj.Attrs(ctx) if err != nil { // TODO: Handle error. } fmt.Printf("object %s has size %d and can be read using %s\n", objAttrs.Name, objAttrs.Size, objAttrs.MediaLink) # Listing objects Listing objects in a bucket is done with the [BucketHandle.Objects] method: query := &storage.Query{Prefix: ""} var names []string it := bkt.Objects(ctx, query) for { attrs, err := it.Next() if err == iterator.Done { break } if err != nil { log.Fatal(err) } names = append(names, attrs.Name) } Objects are listed lexicographically by name. To filter objects lexicographically, [Query.StartOffset] and/or [Query.EndOffset] can be used: query := &storage.Query{ Prefix: "", StartOffset: "bar/", // Only list objects lexicographically >= "bar/" EndOffset: "foo/", // Only list objects lexicographically < "foo/" } // ... as before If only a subset of object attributes is needed when listing, specifying this subset using [Query.SetAttrSelection] may speed up the listing process: query := &storage.Query{Prefix: ""} query.SetAttrSelection([]string{"Name"}) // ... as before # ACLs Both objects and buckets have ACLs (Access Control Lists). An ACL is a list of ACLRules, each of which specifies the role of a user, group or project. ACLs are suitable for fine-grained control, but you may prefer using IAM to control access at the project level (see [Cloud Storage IAM docs]. To list the ACLs of a bucket or object, obtain an [ACLHandle] and call [ACLHandle.List]: acls, err := obj.ACL().List(ctx) if err != nil { // TODO: Handle error. } for _, rule := range acls { fmt.Printf("%s has role %s\n", rule.Entity, rule.Role) } You can also set and delete ACLs. # Conditions Every object has a generation and a metageneration. The generation changes whenever the content changes, and the metageneration changes whenever the metadata changes. [Conditions] let you check these values before an operation; the operation only executes if the conditions match. You can use conditions to prevent race conditions in read-modify-write operations. For example, say you've read an object's metadata into objAttrs. Now you want to write to that object, but only if its contents haven't changed since you read it. Here is how to express that: w = obj.If(storage.Conditions{GenerationMatch: objAttrs.Generation}).NewWriter(ctx) // Proceed with writing as above. # Signed URLs You can obtain a URL that lets anyone read or write an object for a limited time. Signing a URL requires credentials authorized to sign a URL. To use the same authentication that was used when instantiating the Storage client, use [BucketHandle.SignedURL]. url, err := client.Bucket(bucketName).SignedURL(objectName, opts) if err != nil { // TODO: Handle error. } fmt.Println(url) You can also sign a URL without creating a client. See the documentation of [SignedURL] for details. url, err := storage.SignedURL(bucketName, "shared-object", opts) if err != nil { // TODO: Handle error. } fmt.Println(url) # Post Policy V4 Signed Request A type of signed request that allows uploads through HTML forms directly to Cloud Storage with temporary permission. Conditions can be applied to restrict how the HTML form is used and exercised by a user. For more information, please see the [XML POST Object docs] as well as the documentation of [BucketHandle.GenerateSignedPostPolicyV4]. pv4, err := client.Bucket(bucketName).GenerateSignedPostPolicyV4(objectName, opts) if err != nil { // TODO: Handle error. } fmt.Printf("URL: %s\nFields; %v\n", pv4.URL, pv4.Fields) # Credential requirements for signing If the GoogleAccessID and PrivateKey option fields are not provided, they will be automatically detected by [BucketHandle.SignedURL] and [BucketHandle.GenerateSignedPostPolicyV4] if any of the following are true: - you are authenticated to the Storage Client with a service account's downloaded private key, either directly in code or by setting the GOOGLE_APPLICATION_CREDENTIALS environment variable (see [Other Environments]), - your application is running on Google Compute Engine (GCE), or - you are logged into [gcloud using application default credentials] with [impersonation enabled]. Detecting GoogleAccessID may not be possible if you are authenticated using a token source or using [option.WithHTTPClient]. In this case, you can provide a service account email for GoogleAccessID and the client will attempt to sign the URL or Post Policy using that service account. To generate the signature, you must have: - iam.serviceAccounts.signBlob permissions on the GoogleAccessID service account, and - the [IAM Service Account Credentials API] enabled (unless authenticating with a downloaded private key). # Errors Errors returned by this client are often of the type [googleapi.Error]. These errors can be introspected for more information by using [errors.As] with the richer [googleapi.Error] type. For example: var e *googleapi.Error if ok := errors.As(err, &e); ok { if e.Code == 409 { ... } } # Retrying failed requests Methods in this package may retry calls that fail with transient errors. Retrying continues indefinitely unless the controlling context is canceled, the client is closed, or a non-transient error is received. To stop retries from continuing, use context timeouts or cancellation. The retry strategy in this library follows best practices for Cloud Storage. By default, operations are retried only if they are idempotent, and exponential backoff with jitter is employed. In addition, errors are only retried if they are defined as transient by the service. See the [Cloud Storage retry docs] for more information. Users can configure non-default retry behavior for a single library call (using [BucketHandle.Retryer] and [ObjectHandle.Retryer]) or for all calls made by a client (using [Client.SetRetry]). For example: o := client.Bucket(bucket).Object(object).Retryer( // Use WithBackoff to change the timing of the exponential backoff. storage.WithBackoff(gax.Backoff{ Initial: 2 * time.Second, }), // Use WithPolicy to configure the idempotency policy. RetryAlways will // retry the operation even if it is non-idempotent. storage.WithPolicy(storage.RetryAlways), ) // Use a context timeout to set an overall deadline on the call, including all // potential retries. ctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() // Delete an object using the specified strategy and timeout. if err := o.Delete(ctx); err != nil { // Handle err. } # Sending Custom Headers You can add custom headers to any API call made by this package by using [callctx.SetHeaders] on the context which is passed to the method. For example, to add a [custom audit logging] header: ctx := context.Background() ctx = callctx.SetHeaders(ctx, "x-goog-custom-audit-", "") // Use client as usual with the context and the additional headers will be sent. client.Bucket("my-bucket").Attrs(ctx) # gRPC API This package includes support for the [Cloud Storage gRPC API]. This implementation uses gRPC rather than the default JSON & XML APIs to make requests to Cloud Storage. All methods on the [Client] support the gRPC API, with the exception of [GetServiceAccount], [Notification], and [HMACKey] methods. The Cloud Storage gRPC API is generally available. To create a client which will use gRPC, use the alternate constructor: ctx := context.Background() client, err := storage.NewGRPCClient(ctx) if err != nil { // TODO: Handle error. } // Use client as usual. One major advantage of the gRPC API is that it can use [Direct Connectivity], enabling requests to skip some proxy steps and reducing responce latency. Requirements to use Direct Connectivity include: - Your application must be running inside Google Cloud. - Your Cloud Storage [bucket location] must overlap with your VM or compute environment zone. For example, if your VM is in us-east1a, your bucket must be located in either us-east1 (single region), nam4 (dual region), or us (multi-region). - Your client must use service account authentication. Additional requirements for Direct Connectivity are documented in the [Cloud Storage gRPC docs]. Dependencies for the gRPC API may slightly increase the size of binaries for applications depending on this package. If you are not using gRPC, you can use the build tag `disable_grpc_modules` to opt out of these dependencies and reduce the binary size. The gRPC client is instrumented with Open Telemetry metrics which export to Cloud Monitoring by default. More information is available in the [gRPC client-side metrics] documentation, including information about roles which must be enabled in order to do the export successfully. To disable this export, you can use the [WithDisabledClientMetrics] client option. # Storage Control API Certain control plane and long-running operations for Cloud Storage (including Folder and Managed Folder operations) are supported via the autogenerated Storage Control client, which is available as a subpackage in this module. See package docs at [cloud.google.com/go/storage/control/apiv2] or reference the [Storage Control API] docs. [Cloud Storage IAM docs]: https://cloud.google.com/storage/docs/access-control/iam [XML POST Object docs]: https://cloud.google.com/storage/docs/xml-api/post-object [Cloud Storage retry docs]: https://cloud.google.com/storage/docs/retry-strategy [Other Environments]: https://cloud.google.com/storage/docs/authentication#libauth [gcloud using application default credentials]: https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login [impersonation enabled]: https://cloud.google.com/sdk/gcloud/reference#--impersonate-service-account [IAM Service Account Credentials API]: https://console.developers.google.com/apis/api/iamcredentials.googleapis.com/overview [custom audit logging]: https://cloud.google.com/storage/docs/audit-logging#add-custom-metadata [Storage Control API]: https://cloud.google.com/storage/docs/reference/rpc/google.storage.control.v2 [Cloud Storage gRPC API]: https://cloud.google.com/storage/docs/enable-grpc-api [Direct Connectivity]: https://cloud.google.com/vpc-service-controls/docs/set-up-private-connectivity#direct-connectivity [bucket location]: https://cloud.google.com/storage/docs/locations [Cloud Storage gRPC docs]: https://cloud.google.com/storage/docs/enable-grpc-api#limitations [gRPC client-side metrics]: https://cloud.google.com/storage/docs/client-side-metrics */ package storage // import "cloud.google.com/go/storage" ================================================ FILE: vendor/cloud.google.com/go/storage/dynamic_delay.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "fmt" "math" "sync" "time" ) // dynamicDelay dynamically calculates the delay at a fixed percentile, based on // delay samples. // // dynamicDelay is goroutine-safe. type dynamicDelay struct { increaseFactor float64 decreaseFactor float64 minDelay time.Duration maxDelay time.Duration value time.Duration // Guards the value mu *sync.RWMutex } // validateDynamicDelayParams ensures, // targetPercentile is a valid fraction (between 0 and 1). // increaseRate is a positive number. // minDelay is less than maxDelay. func validateDynamicDelayParams(targetPercentile, increaseRate float64, minDelay, maxDelay time.Duration) error { if targetPercentile < 0 || targetPercentile > 1 { return fmt.Errorf("invalid targetPercentile (%v): must be within [0, 1]", targetPercentile) } if increaseRate <= 0 { return fmt.Errorf("invalid increaseRate (%v): must be > 0", increaseRate) } if minDelay >= maxDelay { return fmt.Errorf("invalid minDelay (%v) and maxDelay (%v) combination: minDelay must be smaller than maxDelay", minDelay, maxDelay) } return nil } // NewDynamicDelay returns a dynamicDelay. // // targetPercentile is the desired percentile to be computed. For example, a // targetPercentile of 0.99 computes the delay at the 99th percentile. Must be // in the range [0, 1]. // // increaseRate (must be > 0) determines how many increase calls it takes for // Value to double. // // initialDelay is the start value of the delay. // // decrease can never lower the delay past minDelay, increase can never raise // the delay past maxDelay. func newDynamicDelay(targetPercentile float64, increaseRate float64, initialDelay, minDelay, maxDelay time.Duration) *dynamicDelay { if initialDelay < minDelay { initialDelay = minDelay } if initialDelay > maxDelay { initialDelay = maxDelay } // Compute increaseFactor and decreaseFactor such that: // (increaseFactor ^ (1 - targetPercentile)) * (decreaseFactor ^ targetPercentile) = 1 increaseFactor := math.Exp(math.Log(2) / increaseRate) if increaseFactor < 1.001 { increaseFactor = 1.001 } decreaseFactor := math.Exp(-math.Log(increaseFactor) * (1 - targetPercentile) / targetPercentile) if decreaseFactor > 0.9999 { decreaseFactor = 0.9999 } return &dynamicDelay{ increaseFactor: increaseFactor, decreaseFactor: decreaseFactor, minDelay: minDelay, maxDelay: maxDelay, value: initialDelay, mu: &sync.RWMutex{}, } } func (d *dynamicDelay) unsafeIncrease() { v := time.Duration(float64(d.value) * d.increaseFactor) if v > d.maxDelay { d.value = d.maxDelay } else { d.value = v } } // increase notes that the operation took longer than the delay returned by Value. func (d *dynamicDelay) increase() { d.mu.Lock() defer d.mu.Unlock() d.unsafeIncrease() } func (d *dynamicDelay) unsafeDecrease() { v := time.Duration(float64(d.value) * d.decreaseFactor) if v < d.minDelay { d.value = d.minDelay } else { d.value = v } } // decrease notes that the operation completed before the delay returned by getValue. func (d *dynamicDelay) decrease() { d.mu.Lock() defer d.mu.Unlock() d.unsafeDecrease() } // update updates the delay value depending on the specified latency. func (d *dynamicDelay) update(latency time.Duration) { d.mu.Lock() defer d.mu.Unlock() if latency > d.value { d.unsafeIncrease() } else { d.unsafeDecrease() } } // getValue returns the desired delay to wait before retry the operation. func (d *dynamicDelay) getValue() time.Duration { d.mu.RLock() defer d.mu.RUnlock() return d.value } // printDelay prints the state of delay, helpful in debugging. func (d *dynamicDelay) printDelay() { d.mu.RLock() defer d.mu.RUnlock() fmt.Println("IncreaseFactor: ", d.increaseFactor) fmt.Println("DecreaseFactor: ", d.decreaseFactor) fmt.Println("MinDelay: ", d.minDelay) fmt.Println("MaxDelay: ", d.maxDelay) fmt.Println("Value: ", d.value) } // bucketDelayManager wraps dynamicDelay to provide bucket-specific delays. type bucketDelayManager struct { targetPercentile float64 increaseRate float64 initialDelay time.Duration minDelay time.Duration maxDelay time.Duration // delays maps bucket names to their dynamic delay instance. delays map[string]*dynamicDelay // mu guards delays. mu *sync.RWMutex } // newBucketDelayManager returns a new bucketDelayManager instance. func newBucketDelayManager(targetPercentile float64, increaseRate float64, initialDelay, minDelay, maxDelay time.Duration) (*bucketDelayManager, error) { err := validateDynamicDelayParams(targetPercentile, increaseRate, minDelay, maxDelay) if err != nil { return nil, err } return &bucketDelayManager{ targetPercentile: targetPercentile, increaseRate: increaseRate, initialDelay: initialDelay, minDelay: minDelay, maxDelay: maxDelay, delays: make(map[string]*dynamicDelay), mu: &sync.RWMutex{}, }, nil } // getDelay retrieves the dynamicDelay instance for the given bucket name. If no delay // exists for the bucket, a new one is created with the configured parameters. func (b *bucketDelayManager) getDelay(bucketName string) *dynamicDelay { b.mu.RLock() delay, ok := b.delays[bucketName] b.mu.RUnlock() if !ok { b.mu.Lock() defer b.mu.Unlock() // Check again, as someone might create b/w the execution of mu.RUnlock() and mu.Lock(). delay, ok = b.delays[bucketName] if !ok { // Create a new dynamicDelay for the bucket if it doesn't exist delay = newDynamicDelay(b.targetPercentile, b.increaseRate, b.initialDelay, b.minDelay, b.maxDelay) b.delays[bucketName] = delay } } return delay } // increase notes that the operation took longer than the delay for the given bucket. func (b *bucketDelayManager) increase(bucketName string) { b.getDelay(bucketName).increase() } // decrease notes that the operation completed before the delay for the given bucket. func (b *bucketDelayManager) decrease(bucketName string) { b.getDelay(bucketName).decrease() } // update updates the delay value for the bucket depending on the specified latency. func (b *bucketDelayManager) update(bucketName string, latency time.Duration) { b.getDelay(bucketName).update(latency) } // getValue returns the desired delay to wait before retrying the operation for the given bucket. func (b *bucketDelayManager) getValue(bucketName string) time.Duration { return b.getDelay(bucketName).getValue() } ================================================ FILE: vendor/cloud.google.com/go/storage/emulator_test.sh ================================================ #!/bin/bash # Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.. # Fail on any error set -eo pipefail # Display commands being run set -x # Only run on Go 1.17+ min_minor_ver=17 v=`go version | { read _ _ v _; echo ${v#go}; }` comps=(${v//./ }) minor_ver=${comps[1]} if [ "$minor_ver" -lt "$min_minor_ver" ]; then echo minor version $minor_ver, skipping exit 0 fi export STORAGE_EMULATOR_HOST="http://localhost:9000" export STORAGE_EMULATOR_HOST_GRPC="localhost:8888" DEFAULT_IMAGE_NAME='gcr.io/cloud-devrel-public-resources/storage-testbench' DEFAULT_IMAGE_TAG='latest' DOCKER_IMAGE=${DEFAULT_IMAGE_NAME}:${DEFAULT_IMAGE_TAG} CONTAINER_NAME=storage_testbench # Note: --net=host makes the container bind directly to the Docker host’s network, # with no network isolation. If we were to use port-mapping instead, reset connection errors # would be captured differently and cause unexpected test behaviour. # The host networking driver works only on Linux hosts. # See more about using host networking: https://docs.docker.com/network/host/ DOCKER_NETWORK="--net=host" # Note: We do not expect the RetryConformanceTest suite to pass on darwin due to # differences in the network errors emitted by the system. if [ `go env GOOS` == 'darwin' ]; then DOCKER_NETWORK="-p 9000:9000 -p 8888:8888" fi # Get the docker image for the testbench docker pull $DOCKER_IMAGE # Start the testbench docker run --name $CONTAINER_NAME --rm -d $DOCKER_NETWORK $DOCKER_IMAGE echo "Running the Cloud Storage testbench: $STORAGE_EMULATOR_HOST" sleep 1 # Stop the testbench & cleanup environment variables function cleanup() { echo "Cleanup testbench" docker stop $CONTAINER_NAME unset STORAGE_EMULATOR_HOST; unset STORAGE_EMULATOR_HOST_GRPC; } trap cleanup EXIT # Check that the server is running - retry several times to allow for start-up time response=$(curl -w "%{http_code}\n" $STORAGE_EMULATOR_HOST --retry-connrefused --retry 5 -o /dev/null) if [[ $response != 200 ]] then echo "Testbench server did not start correctly" exit 1 fi # Start the gRPC server on port 8888. echo "Starting the gRPC server on port 8888" response=$(curl -w "%{http_code}\n" --retry 5 --retry-max-time 40 -o /dev/null "$STORAGE_EMULATOR_HOST/start_grpc?port=8888") if [[ $response != 200 ]] then echo "Testbench gRPC server did not start correctly" exit 1 fi # Run tests go test -v -timeout 17m ./ ./dataflux -run="^Test(RetryConformance|.*Emulated)$" -short -race 2>&1 | tee -a sponge_log.log ================================================ FILE: vendor/cloud.google.com/go/storage/experimental/experimental.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package experimental is a collection of experimental features that might // have some rough edges to them. Housing experimental features in this package // results in a user accessing these APIs as `experimental.Foo`, thereby making // it explicit that the feature is experimental and using them in production // code is at their own risk. // // All APIs in this package are experimental. package experimental import ( "time" "cloud.google.com/go/storage/internal" "go.opentelemetry.io/otel/sdk/metric" "google.golang.org/api/option" ) // WithMetricInterval provides a [option.ClientOption] that may be passed to [storage.NewGRPCClient]. // It sets how often to emit metrics [metric.WithInterval] when using // [metric.NewPeriodicReader] // When using Cloud Monitoring interval must be at minimum 1 [time.Minute]. func WithMetricInterval(metricInterval time.Duration) option.ClientOption { return internal.WithMetricInterval.(func(time.Duration) option.ClientOption)(metricInterval) } // WithMetricExporter provides a [option.ClientOption] that may be passed to [storage.NewGRPCClient]. // Set an alternate client-side metric Exporter to emit metrics through. // Must implement [metric.Exporter] func WithMetricExporter(ex *metric.Exporter) option.ClientOption { return internal.WithMetricExporter.(func(*metric.Exporter) option.ClientOption)(ex) } // WithReadStallTimeout provides a [option.ClientOption] that may be passed to [storage.NewClient]. // It enables the client to retry stalled requests when starting a download from // Cloud Storage. If the timeout elapses with no response from the server, the request // is automatically retried. // The timeout is initially set to ReadStallTimeoutConfig.Min. The client tracks // latency across all read requests from the client for each bucket accessed, and can // adjust the timeout higher to the target percentile when latency for request to that // bucket is high. // Currently, this is supported only for downloads ([storage.NewReader] and // [storage.NewRangeReader] calls) and only for the XML API. Other read APIs (gRPC & JSON) // will be supported soon. func WithReadStallTimeout(rstc *ReadStallTimeoutConfig) option.ClientOption { return internal.WithReadStallTimeout.(func(config *ReadStallTimeoutConfig) option.ClientOption)(rstc) } // ReadStallTimeoutConfig defines the timeout which is adjusted dynamically based on // past observed latencies. type ReadStallTimeoutConfig struct { // Min is the minimum duration of the timeout. The default value is 500ms. Requests // taking shorter than this value to return response headers will never time out. // In general, you should choose a Min value that is greater than the typical value // for the target percentile. Min time.Duration // TargetPercentile is the percentile to target for the dynamic timeout. The default // value is 0.99. At the default percentile, at most 1% of requests will be timed out // and retried. TargetPercentile float64 } // WithGRPCBidiReads provides an [option.ClientOption] that may be passed to // [cloud.google.com/go/storage.NewGRPCClient]. // It enables the client to use bi-directional gRPC APIs for downloads rather than the // server streaming API. In particular, it allows users to use the // [cloud.google.com/go/storage.MultiRangeDownloader] // surface, which requires bi-directional streaming. // // The bi-directional API is in private preview; please contact your account manager if // interested. func WithGRPCBidiReads() option.ClientOption { return internal.WithGRPCBidiReads.(func() option.ClientOption)() } // WithZonalBucketAPIs provides an [option.ClientOption] that may be passed to // [cloud.google.com/go/storage.NewGRPCClient]. // It enables the client to use bi-directional gRPC APIs for downloads rather than the // server streaming API (same as [WithGRPCBidiReads]) as well as appendable // object semantics for uploads. By setting this option, both upload and download // paths will use zonal bucket compatible APIs by default. // // Zonal buckets and rapid storage is in private preview; please contact your // account manager if interested. func WithZonalBucketAPIs() option.ClientOption { return internal.WithZonalBucketAPIs.(func() option.ClientOption)() } ================================================ FILE: vendor/cloud.google.com/go/storage/grpc_client.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "encoding/binary" "errors" "fmt" "hash/crc32" "io" "log" "os" "sync" "cloud.google.com/go/iam/apiv1/iampb" "cloud.google.com/go/internal/trace" gapic "cloud.google.com/go/storage/internal/apiv2" "cloud.google.com/go/storage/internal/apiv2/storagepb" "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" "google.golang.org/api/transport" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/encoding" "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/proto" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" ) const ( // defaultConnPoolSize is the default number of channels // to initialize in the GAPIC gRPC connection pool. A larger // connection pool may be necessary for jobs that require // high throughput and/or leverage many concurrent streams // if not running via DirectPath. // // This is only used for the gRPC client. defaultConnPoolSize = 1 // globalProjectAlias is the project ID alias used for global buckets. // // This is only used for the gRPC API. globalProjectAlias = "_" // msgEntityNotSupported indicates ACL entites using project ID are not currently supported. // // This is only used for the gRPC API. msgEntityNotSupported = "The gRPC API currently does not support ACL entities using project ID, use project numbers instead" ) // defaultGRPCOptions returns a set of the default client options // for gRPC client initialization. func defaultGRPCOptions() []option.ClientOption { defaults := []option.ClientOption{ option.WithGRPCConnectionPool(defaultConnPoolSize), } // Set emulator options for gRPC if an emulator was specified. Note that in a // hybrid client, STORAGE_EMULATOR_HOST will set the host to use for HTTP and // STORAGE_EMULATOR_HOST_GRPC will set the host to use for gRPC (when using a // local emulator, HTTP and gRPC must use different ports, so this is // necessary). // // TODO: When the newHybridClient is not longer used, remove // STORAGE_EMULATOR_HOST_GRPC and use STORAGE_EMULATOR_HOST for both the // HTTP and gRPC based clients. if host := os.Getenv("STORAGE_EMULATOR_HOST_GRPC"); host != "" { // Strip the scheme from the emulator host. WithEndpoint does not take a // scheme for gRPC. host = stripScheme(host) defaults = append(defaults, option.WithEndpoint(host), option.WithGRPCDialOption(grpc.WithInsecure()), option.WithoutAuthentication(), WithDisabledClientMetrics(), ) } else { // Only enable DirectPath when the emulator is not being targeted. defaults = append(defaults, internaloption.EnableDirectPath(true), internaloption.AllowNonDefaultServiceAccount(true), internaloption.EnableDirectPathXds()) } return defaults } // grpcStorageClient is the gRPC API implementation of the transport-agnostic // storageClient interface. type grpcStorageClient struct { raw *gapic.Client settings *settings config *storageConfig } func enableClientMetrics(ctx context.Context, s *settings, config storageConfig) (*metricsContext, error) { var project string // TODO: use new auth client c, err := transport.Creds(ctx, s.clientOption...) if err == nil { project = c.ProjectID } metricsContext, err := newGRPCMetricContext(ctx, metricsConfig{ project: project, interval: config.metricInterval, manualReader: config.manualReader}, ) if err != nil { return nil, fmt.Errorf("gRPC Metrics: %w", err) } return metricsContext, nil } // newGRPCStorageClient initializes a new storageClient that uses the gRPC // Storage API. func newGRPCStorageClient(ctx context.Context, opts ...storageOption) (*grpcStorageClient, error) { s := initSettings(opts...) s.clientOption = append(defaultGRPCOptions(), s.clientOption...) // Disable all gax-level retries in favor of retry logic in the veneer client. s.gax = append(s.gax, gax.WithRetry(nil)) config := newStorageConfig(s.clientOption...) if config.readAPIWasSet { return nil, errors.New("storage: GRPC is incompatible with any option that specifies an API for reads") } if !config.disableClientMetrics { // Do not fail client creation if enabling metrics fails. if metricsContext, err := enableClientMetrics(ctx, s, config); err == nil { s.metricsContext = metricsContext s.clientOption = append(s.clientOption, metricsContext.clientOpts...) } else { log.Printf("Failed to enable client metrics: %v", err) } } g, err := gapic.NewClient(ctx, s.clientOption...) if err != nil { return nil, err } return &grpcStorageClient{ raw: g, settings: s, config: &config, }, nil } func (c *grpcStorageClient) Close() error { if c.settings.metricsContext != nil { c.settings.metricsContext.close() } return c.raw.Close() } // Top-level methods. // GetServiceAccount is not supported in the gRPC client. func (c *grpcStorageClient) GetServiceAccount(ctx context.Context, project string, opts ...storageOption) (string, error) { return "", errMethodNotSupported } func (c *grpcStorageClient) CreateBucket(ctx context.Context, project, bucket string, attrs *BucketAttrs, enableObjectRetention *bool, opts ...storageOption) (*BucketAttrs, error) { if enableObjectRetention != nil { // TO-DO: implement ObjectRetention once available - see b/308194853 return nil, status.Errorf(codes.Unimplemented, "storage: object retention is not supported in gRPC") } s := callSettings(c.settings, opts...) b := attrs.toProtoBucket() b.Project = toProjectResource(project) // If there is lifecycle information but no location, explicitly set // the location. This is a GCS quirk/bug. if b.GetLocation() == "" && b.GetLifecycle() != nil { b.Location = "US" } req := &storagepb.CreateBucketRequest{ Parent: fmt.Sprintf("projects/%s", globalProjectAlias), Bucket: b, BucketId: bucket, } if attrs != nil { req.PredefinedAcl = attrs.PredefinedACL req.PredefinedDefaultObjectAcl = attrs.PredefinedDefaultObjectACL } var battrs *BucketAttrs err := run(ctx, func(ctx context.Context) error { res, err := c.raw.CreateBucket(ctx, req, s.gax...) battrs = newBucketFromProto(res) return err }, s.retry, s.idempotent) return battrs, err } func (c *grpcStorageClient) ListBuckets(ctx context.Context, project string, opts ...storageOption) *BucketIterator { s := callSettings(c.settings, opts...) it := &BucketIterator{ ctx: ctx, projectID: project, } var gitr *gapic.BucketIterator fetch := func(pageSize int, pageToken string) (token string, err error) { var buckets []*storagepb.Bucket var next string err = run(it.ctx, func(ctx context.Context) error { // Initialize GAPIC-based iterator when pageToken is empty, which // indicates that this fetch call is attempting to get the first page. // // Note: Initializing the GAPIC-based iterator lazily is necessary to // capture the BucketIterator.Prefix set by the user *after* the // BucketIterator is returned to them from the veneer. if pageToken == "" { req := &storagepb.ListBucketsRequest{ Parent: toProjectResource(it.projectID), Prefix: it.Prefix, } gitr = c.raw.ListBuckets(ctx, req, s.gax...) } buckets, next, err = gitr.InternalFetch(pageSize, pageToken) return err }, s.retry, s.idempotent) if err != nil { return "", err } for _, bkt := range buckets { b := newBucketFromProto(bkt) it.buckets = append(it.buckets, b) } return next, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo( fetch, func() int { return len(it.buckets) }, func() interface{} { b := it.buckets; it.buckets = nil; return b }) return it } // Bucket methods. func (c *grpcStorageClient) DeleteBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error { s := callSettings(c.settings, opts...) req := &storagepb.DeleteBucketRequest{ Name: bucketResourceName(globalProjectAlias, bucket), } if err := applyBucketCondsProto("grpcStorageClient.DeleteBucket", conds, req); err != nil { return err } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } return run(ctx, func(ctx context.Context) error { return c.raw.DeleteBucket(ctx, req, s.gax...) }, s.retry, s.idempotent) } func (c *grpcStorageClient) GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) { s := callSettings(c.settings, opts...) req := &storagepb.GetBucketRequest{ Name: bucketResourceName(globalProjectAlias, bucket), ReadMask: &fieldmaskpb.FieldMask{Paths: []string{"*"}}, } if err := applyBucketCondsProto("grpcStorageClient.GetBucket", conds, req); err != nil { return nil, err } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } var battrs *BucketAttrs err := run(ctx, func(ctx context.Context) error { res, err := c.raw.GetBucket(ctx, req, s.gax...) battrs = newBucketFromProto(res) return err }, s.retry, s.idempotent) return battrs, formatBucketError(err) } func (c *grpcStorageClient) UpdateBucket(ctx context.Context, bucket string, uattrs *BucketAttrsToUpdate, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) { s := callSettings(c.settings, opts...) b := uattrs.toProtoBucket() b.Name = bucketResourceName(globalProjectAlias, bucket) req := &storagepb.UpdateBucketRequest{ Bucket: b, PredefinedAcl: uattrs.PredefinedACL, PredefinedDefaultObjectAcl: uattrs.PredefinedDefaultObjectACL, } if err := applyBucketCondsProto("grpcStorageClient.UpdateBucket", conds, req); err != nil { return nil, err } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } var paths []string fieldMask := &fieldmaskpb.FieldMask{ Paths: paths, } if uattrs.CORS != nil { fieldMask.Paths = append(fieldMask.Paths, "cors") } if uattrs.DefaultEventBasedHold != nil { fieldMask.Paths = append(fieldMask.Paths, "default_event_based_hold") } if uattrs.RetentionPolicy != nil { fieldMask.Paths = append(fieldMask.Paths, "retention_policy") } if uattrs.VersioningEnabled != nil { fieldMask.Paths = append(fieldMask.Paths, "versioning") } if uattrs.RequesterPays != nil { fieldMask.Paths = append(fieldMask.Paths, "billing") } if uattrs.BucketPolicyOnly != nil || uattrs.UniformBucketLevelAccess != nil || uattrs.PublicAccessPrevention != PublicAccessPreventionUnknown { fieldMask.Paths = append(fieldMask.Paths, "iam_config") } if uattrs.Encryption != nil { fieldMask.Paths = append(fieldMask.Paths, "encryption") } if uattrs.Lifecycle != nil { fieldMask.Paths = append(fieldMask.Paths, "lifecycle") } if uattrs.Logging != nil { fieldMask.Paths = append(fieldMask.Paths, "logging") } if uattrs.Website != nil { fieldMask.Paths = append(fieldMask.Paths, "website") } if uattrs.PredefinedACL != "" { // In cases where PredefinedACL is set, Acl is cleared. fieldMask.Paths = append(fieldMask.Paths, "acl") } if uattrs.PredefinedDefaultObjectACL != "" { // In cases where PredefinedDefaultObjectACL is set, DefaultObjectAcl is cleared. fieldMask.Paths = append(fieldMask.Paths, "default_object_acl") } // Note: This API currently does not support entites using project ID. // Use project numbers in ACL entities. Pending b/233617896. if uattrs.acl != nil { // In cases where acl is set by UpdateBucketACL method. fieldMask.Paths = append(fieldMask.Paths, "acl") } if uattrs.defaultObjectACL != nil { // In cases where defaultObjectACL is set by UpdateBucketACL method. fieldMask.Paths = append(fieldMask.Paths, "default_object_acl") } if uattrs.StorageClass != "" { fieldMask.Paths = append(fieldMask.Paths, "storage_class") } if uattrs.RPO != RPOUnknown { fieldMask.Paths = append(fieldMask.Paths, "rpo") } if uattrs.Autoclass != nil { fieldMask.Paths = append(fieldMask.Paths, "autoclass") } if uattrs.SoftDeletePolicy != nil { fieldMask.Paths = append(fieldMask.Paths, "soft_delete_policy") } for label := range uattrs.setLabels { fieldMask.Paths = append(fieldMask.Paths, fmt.Sprintf("labels.%s", label)) } // Delete a label by not including it in Bucket.Labels but adding the key to the update mask. for label := range uattrs.deleteLabels { fieldMask.Paths = append(fieldMask.Paths, fmt.Sprintf("labels.%s", label)) } req.UpdateMask = fieldMask if len(fieldMask.Paths) < 1 { // Nothing to update. Send a get request for current attrs instead. This // maintains consistency with JSON bucket updates. opts = append(opts, idempotent(true)) return c.GetBucket(ctx, bucket, conds, opts...) } var battrs *BucketAttrs err := run(ctx, func(ctx context.Context) error { res, err := c.raw.UpdateBucket(ctx, req, s.gax...) battrs = newBucketFromProto(res) return err }, s.retry, s.idempotent) return battrs, err } func (c *grpcStorageClient) LockBucketRetentionPolicy(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error { s := callSettings(c.settings, opts...) req := &storagepb.LockBucketRetentionPolicyRequest{ Bucket: bucketResourceName(globalProjectAlias, bucket), } if err := applyBucketCondsProto("grpcStorageClient.LockBucketRetentionPolicy", conds, req); err != nil { return err } return run(ctx, func(ctx context.Context) error { _, err := c.raw.LockBucketRetentionPolicy(ctx, req, s.gax...) return err }, s.retry, s.idempotent) } func (c *grpcStorageClient) ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator { s := callSettings(c.settings, opts...) it := &ObjectIterator{ ctx: ctx, } if q != nil { it.query = *q } req := &storagepb.ListObjectsRequest{ Parent: bucketResourceName(globalProjectAlias, bucket), Prefix: it.query.Prefix, Delimiter: it.query.Delimiter, Versions: it.query.Versions, LexicographicStart: it.query.StartOffset, LexicographicEnd: it.query.EndOffset, IncludeTrailingDelimiter: it.query.IncludeTrailingDelimiter, MatchGlob: it.query.MatchGlob, ReadMask: q.toFieldMask(), // a nil Query still results in a "*" FieldMask SoftDeleted: it.query.SoftDeleted, IncludeFoldersAsPrefixes: it.query.IncludeFoldersAsPrefixes, } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } fetch := func(pageSize int, pageToken string) (token string, err error) { // Add trace span around List API call within the fetch. ctx, _ = startSpan(ctx, "grpcStorageClient.ObjectsListCall") defer func() { endSpan(ctx, err) }() var objects []*storagepb.Object var gitr *gapic.ObjectIterator err = run(it.ctx, func(ctx context.Context) error { gitr = c.raw.ListObjects(ctx, req, s.gax...) it.ctx = ctx objects, token, err = gitr.InternalFetch(pageSize, pageToken) return err }, s.retry, s.idempotent) if err != nil { return "", formatBucketError(err) } for _, obj := range objects { b := newObjectFromProto(obj) it.items = append(it.items, b) } // Response is always non-nil after a successful request. res := gitr.Response.(*storagepb.ListObjectsResponse) for _, prefix := range res.GetPrefixes() { it.items = append(it.items, &ObjectAttrs{Prefix: prefix}) } return token, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo( fetch, func() int { return len(it.items) }, func() interface{} { b := it.items; it.items = nil; return b }) return it } // Object metadata methods. func (c *grpcStorageClient) DeleteObject(ctx context.Context, bucket, object string, gen int64, conds *Conditions, opts ...storageOption) error { s := callSettings(c.settings, opts...) req := &storagepb.DeleteObjectRequest{ Bucket: bucketResourceName(globalProjectAlias, bucket), Object: object, } if err := applyCondsProto("grpcStorageClient.DeleteObject", gen, conds, req); err != nil { return err } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } err := run(ctx, func(ctx context.Context) error { return c.raw.DeleteObject(ctx, req, s.gax...) }, s.retry, s.idempotent) if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound { return formatObjectErr(err) } return err } func (c *grpcStorageClient) GetObject(ctx context.Context, params *getObjectParams, opts ...storageOption) (*ObjectAttrs, error) { s := callSettings(c.settings, opts...) req := &storagepb.GetObjectRequest{ Bucket: bucketResourceName(globalProjectAlias, params.bucket), Object: params.object, // ProjectionFull by default. ReadMask: &fieldmaskpb.FieldMask{Paths: []string{"*"}}, } if err := applyCondsProto("grpcStorageClient.GetObject", params.gen, params.conds, req); err != nil { return nil, err } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } if params.encryptionKey != nil { req.CommonObjectRequestParams = toProtoCommonObjectRequestParams(params.encryptionKey) } if params.softDeleted { req.SoftDeleted = ¶ms.softDeleted } var attrs *ObjectAttrs err := run(ctx, func(ctx context.Context) error { res, err := c.raw.GetObject(ctx, req, s.gax...) attrs = newObjectFromProto(res) return err }, s.retry, s.idempotent) if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound { return nil, formatObjectErr(err) } return attrs, err } func (c *grpcStorageClient) UpdateObject(ctx context.Context, params *updateObjectParams, opts ...storageOption) (*ObjectAttrs, error) { uattrs := params.uattrs if params.overrideRetention != nil || uattrs.Retention != nil { // TO-DO: implement ObjectRetention once available - see b/308194853 return nil, status.Errorf(codes.Unimplemented, "storage: object retention is not supported in gRPC") } s := callSettings(c.settings, opts...) o := uattrs.toProtoObject(bucketResourceName(globalProjectAlias, params.bucket), params.object) // For Update, generation is passed via the object message rather than a field on the request. if params.gen >= 0 { o.Generation = params.gen } req := &storagepb.UpdateObjectRequest{ Object: o, PredefinedAcl: uattrs.PredefinedACL, } if err := applyCondsProto("grpcStorageClient.UpdateObject", defaultGen, params.conds, req); err != nil { return nil, err } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } if params.encryptionKey != nil { req.CommonObjectRequestParams = toProtoCommonObjectRequestParams(params.encryptionKey) } fieldMask := &fieldmaskpb.FieldMask{Paths: nil} if uattrs.EventBasedHold != nil { fieldMask.Paths = append(fieldMask.Paths, "event_based_hold") } if uattrs.TemporaryHold != nil { fieldMask.Paths = append(fieldMask.Paths, "temporary_hold") } if uattrs.ContentType != nil { fieldMask.Paths = append(fieldMask.Paths, "content_type") } if uattrs.ContentLanguage != nil { fieldMask.Paths = append(fieldMask.Paths, "content_language") } if uattrs.ContentEncoding != nil { fieldMask.Paths = append(fieldMask.Paths, "content_encoding") } if uattrs.ContentDisposition != nil { fieldMask.Paths = append(fieldMask.Paths, "content_disposition") } if uattrs.CacheControl != nil { fieldMask.Paths = append(fieldMask.Paths, "cache_control") } if !uattrs.CustomTime.IsZero() { fieldMask.Paths = append(fieldMask.Paths, "custom_time") } // Note: This API currently does not support entites using project ID. // Use project numbers in ACL entities. Pending b/233617896. if uattrs.ACL != nil || len(uattrs.PredefinedACL) > 0 { fieldMask.Paths = append(fieldMask.Paths, "acl") } if uattrs.Metadata != nil { // We don't support deleting a specific metadata key; metadata is deleted // as a whole if provided an empty map, so we do not use dot notation here if len(uattrs.Metadata) == 0 { fieldMask.Paths = append(fieldMask.Paths, "metadata") } else { // We can, however, use dot notation for adding keys for key := range uattrs.Metadata { fieldMask.Paths = append(fieldMask.Paths, fmt.Sprintf("metadata.%s", key)) } } } req.UpdateMask = fieldMask if len(fieldMask.Paths) < 1 { // Nothing to update. To maintain consistency with JSON, we must still // update the object because metageneration and other fields are // updated even on an empty update. // gRPC will fail if the fieldmask is empty, so instead we add an // output-only field to the update mask. Output-only fields are (and must // be - see AIP 161) ignored, but allow us to send an empty update because // any mask that is valid for read (as this one is) must be valid for write. fieldMask.Paths = append(fieldMask.Paths, "create_time") } var attrs *ObjectAttrs err := run(ctx, func(ctx context.Context) error { res, err := c.raw.UpdateObject(ctx, req, s.gax...) attrs = newObjectFromProto(res) return err }, s.retry, s.idempotent) if e, ok := status.FromError(err); ok && e.Code() == codes.NotFound { return nil, formatObjectErr(err) } return attrs, err } func (c *grpcStorageClient) RestoreObject(ctx context.Context, params *restoreObjectParams, opts ...storageOption) (*ObjectAttrs, error) { s := callSettings(c.settings, opts...) req := &storagepb.RestoreObjectRequest{ Bucket: bucketResourceName(globalProjectAlias, params.bucket), Object: params.object, CopySourceAcl: ¶ms.copySourceACL, } if err := applyCondsProto("grpcStorageClient.RestoreObject", params.gen, params.conds, req); err != nil { return nil, err } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } var attrs *ObjectAttrs err := run(ctx, func(ctx context.Context) error { res, err := c.raw.RestoreObject(ctx, req, s.gax...) attrs = newObjectFromProto(res) return err }, s.retry, s.idempotent) if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound { return nil, formatObjectErr(err) } return attrs, err } func (c *grpcStorageClient) MoveObject(ctx context.Context, params *moveObjectParams, opts ...storageOption) (*ObjectAttrs, error) { s := callSettings(c.settings, opts...) req := &storagepb.MoveObjectRequest{ Bucket: bucketResourceName(globalProjectAlias, params.bucket), SourceObject: params.srcObject, DestinationObject: params.dstObject, } if err := applyCondsProto("MoveObjectDestination", defaultGen, params.dstConds, req); err != nil { return nil, err } if err := applySourceCondsProto("MoveObjectSource", defaultGen, params.srcConds, req); err != nil { return nil, err } if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } var attrs *ObjectAttrs err := run(ctx, func(ctx context.Context) error { res, err := c.raw.MoveObject(ctx, req, s.gax...) attrs = newObjectFromProto(res) return err }, s.retry, s.idempotent) if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound { return nil, formatObjectErr(err) } return attrs, err } // Default Object ACL methods. func (c *grpcStorageClient) DeleteDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error { // There is no separate API for PATCH in gRPC. // Make a GET call first to retrieve BucketAttrs. attrs, err := c.GetBucket(ctx, bucket, nil, opts...) if err != nil { return err } // Delete the entity and copy other remaining ACL entities. // Note: This API currently does not support entites using project ID. // Use project numbers in ACL entities. Pending b/233617896. // Return error if entity is not found or a project ID is used. invalidEntity := true var acl []ACLRule for _, a := range attrs.DefaultObjectACL { if a.Entity != entity { acl = append(acl, a) } if a.Entity == entity { invalidEntity = false } } if invalidEntity { return fmt.Errorf("storage: entity %v was not found on bucket %v, got %v. %v", entity, bucket, attrs.DefaultObjectACL, msgEntityNotSupported) } uattrs := &BucketAttrsToUpdate{defaultObjectACL: acl} // Call UpdateBucket with a MetagenerationMatch precondition set. if _, err = c.UpdateBucket(ctx, bucket, uattrs, &BucketConditions{MetagenerationMatch: attrs.MetaGeneration}, opts...); err != nil { return err } return nil } func (c *grpcStorageClient) ListDefaultObjectACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) { attrs, err := c.GetBucket(ctx, bucket, nil, opts...) if err != nil { return nil, err } return attrs.DefaultObjectACL, nil } func (c *grpcStorageClient) UpdateDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error { // There is no separate API for PATCH in gRPC. // Make a GET call first to retrieve BucketAttrs. attrs, err := c.GetBucket(ctx, bucket, nil, opts...) if err != nil { return err } // Note: This API currently does not support entites using project ID. // Use project numbers in ACL entities. Pending b/233617896. var acl []ACLRule aclRule := ACLRule{Entity: entity, Role: role} acl = append(attrs.DefaultObjectACL, aclRule) uattrs := &BucketAttrsToUpdate{defaultObjectACL: acl} // Call UpdateBucket with a MetagenerationMatch precondition set. if _, err = c.UpdateBucket(ctx, bucket, uattrs, &BucketConditions{MetagenerationMatch: attrs.MetaGeneration}, opts...); err != nil { return err } return nil } // Bucket ACL methods. func (c *grpcStorageClient) DeleteBucketACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error { // There is no separate API for PATCH in gRPC. // Make a GET call first to retrieve BucketAttrs. attrs, err := c.GetBucket(ctx, bucket, nil, opts...) if err != nil { return err } // Delete the entity and copy other remaining ACL entities. // Note: This API currently does not support entites using project ID. // Use project numbers in ACL entities. Pending b/233617896. // Return error if entity is not found or a project ID is used. invalidEntity := true var acl []ACLRule for _, a := range attrs.ACL { if a.Entity != entity { acl = append(acl, a) } if a.Entity == entity { invalidEntity = false } } if invalidEntity { return fmt.Errorf("storage: entity %v was not found on bucket %v, got %v. %v", entity, bucket, attrs.ACL, msgEntityNotSupported) } uattrs := &BucketAttrsToUpdate{acl: acl} // Call UpdateBucket with a MetagenerationMatch precondition set. if _, err = c.UpdateBucket(ctx, bucket, uattrs, &BucketConditions{MetagenerationMatch: attrs.MetaGeneration}, opts...); err != nil { return err } return nil } func (c *grpcStorageClient) ListBucketACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) { attrs, err := c.GetBucket(ctx, bucket, nil, opts...) if err != nil { return nil, err } return attrs.ACL, nil } func (c *grpcStorageClient) UpdateBucketACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error { // There is no separate API for PATCH in gRPC. // Make a GET call first to retrieve BucketAttrs. attrs, err := c.GetBucket(ctx, bucket, nil, opts...) if err != nil { return err } // Note: This API currently does not support entites using project ID. // Use project numbers in ACL entities. Pending b/233617896. var acl []ACLRule aclRule := ACLRule{Entity: entity, Role: role} acl = append(attrs.ACL, aclRule) uattrs := &BucketAttrsToUpdate{acl: acl} // Call UpdateBucket with a MetagenerationMatch precondition set. if _, err = c.UpdateBucket(ctx, bucket, uattrs, &BucketConditions{MetagenerationMatch: attrs.MetaGeneration}, opts...); err != nil { return err } return nil } // Object ACL methods. func (c *grpcStorageClient) DeleteObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, opts ...storageOption) error { // There is no separate API for PATCH in gRPC. // Make a GET call first to retrieve ObjectAttrs. attrs, err := c.GetObject(ctx, &getObjectParams{bucket, object, defaultGen, nil, nil, false}, opts...) if err != nil { return err } // Delete the entity and copy other remaining ACL entities. // Note: This API currently does not support entites using project ID. // Use project numbers in ACL entities. Pending b/233617896. // Return error if entity is not found or a project ID is used. invalidEntity := true var acl []ACLRule for _, a := range attrs.ACL { if a.Entity != entity { acl = append(acl, a) } if a.Entity == entity { invalidEntity = false } } if invalidEntity { return fmt.Errorf("storage: entity %v was not found on bucket %v, got %v. %v", entity, bucket, attrs.ACL, msgEntityNotSupported) } uattrs := &ObjectAttrsToUpdate{ACL: acl} // Call UpdateObject with the specified metageneration. params := &updateObjectParams{bucket: bucket, object: object, uattrs: uattrs, gen: defaultGen, conds: &Conditions{MetagenerationMatch: attrs.Metageneration}} if _, err = c.UpdateObject(ctx, params, opts...); err != nil { return err } return nil } // ListObjectACLs retrieves object ACL entries. By default, it operates on the latest generation of this object. // Selecting a specific generation of this object is not currently supported by the client. func (c *grpcStorageClient) ListObjectACLs(ctx context.Context, bucket, object string, opts ...storageOption) ([]ACLRule, error) { o, err := c.GetObject(ctx, &getObjectParams{bucket, object, defaultGen, nil, nil, false}, opts...) if err != nil { return nil, err } return o.ACL, nil } func (c *grpcStorageClient) UpdateObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, role ACLRole, opts ...storageOption) error { // There is no separate API for PATCH in gRPC. // Make a GET call first to retrieve ObjectAttrs. attrs, err := c.GetObject(ctx, &getObjectParams{bucket, object, defaultGen, nil, nil, false}, opts...) if err != nil { return err } // Note: This API currently does not support entites using project ID. // Use project numbers in ACL entities. Pending b/233617896. var acl []ACLRule aclRule := ACLRule{Entity: entity, Role: role} acl = append(attrs.ACL, aclRule) uattrs := &ObjectAttrsToUpdate{ACL: acl} // Call UpdateObject with the specified metageneration. params := &updateObjectParams{bucket: bucket, object: object, uattrs: uattrs, gen: defaultGen, conds: &Conditions{MetagenerationMatch: attrs.Metageneration}} if _, err = c.UpdateObject(ctx, params, opts...); err != nil { return err } return nil } // Media operations. func (c *grpcStorageClient) ComposeObject(ctx context.Context, req *composeObjectRequest, opts ...storageOption) (*ObjectAttrs, error) { s := callSettings(c.settings, opts...) if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } dstObjPb := req.dstObject.attrs.toProtoObject(req.dstBucket) dstObjPb.Name = req.dstObject.name if req.sendCRC32C { dstObjPb.Checksums.Crc32C = &req.dstObject.attrs.CRC32C } srcs := []*storagepb.ComposeObjectRequest_SourceObject{} for _, src := range req.srcs { srcObjPb := &storagepb.ComposeObjectRequest_SourceObject{Name: src.name, ObjectPreconditions: &storagepb.ComposeObjectRequest_SourceObject_ObjectPreconditions{}} if src.gen >= 0 { srcObjPb.Generation = src.gen } if err := applyCondsProto("ComposeObject source", defaultGen, src.conds, srcObjPb.ObjectPreconditions); err != nil { return nil, err } srcs = append(srcs, srcObjPb) } rawReq := &storagepb.ComposeObjectRequest{ Destination: dstObjPb, SourceObjects: srcs, } if err := applyCondsProto("ComposeObject destination", defaultGen, req.dstObject.conds, rawReq); err != nil { return nil, err } if req.predefinedACL != "" { rawReq.DestinationPredefinedAcl = req.predefinedACL } if req.dstObject.encryptionKey != nil { rawReq.CommonObjectRequestParams = toProtoCommonObjectRequestParams(req.dstObject.encryptionKey) } var obj *storagepb.Object var err error if err := run(ctx, func(ctx context.Context) error { obj, err = c.raw.ComposeObject(ctx, rawReq, s.gax...) return err }, s.retry, s.idempotent); err != nil { if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound { return nil, formatObjectErr(err) } return nil, err } return newObjectFromProto(obj), nil } func (c *grpcStorageClient) RewriteObject(ctx context.Context, req *rewriteObjectRequest, opts ...storageOption) (*rewriteObjectResponse, error) { s := callSettings(c.settings, opts...) obj := req.dstObject.attrs.toProtoObject("") call := &storagepb.RewriteObjectRequest{ SourceBucket: bucketResourceName(globalProjectAlias, req.srcObject.bucket), SourceObject: req.srcObject.name, RewriteToken: req.token, DestinationBucket: bucketResourceName(globalProjectAlias, req.dstObject.bucket), DestinationName: req.dstObject.name, Destination: obj, DestinationKmsKey: req.dstObject.keyName, DestinationPredefinedAcl: req.predefinedACL, CommonObjectRequestParams: toProtoCommonObjectRequestParams(req.dstObject.encryptionKey), } // The userProject, whether source or destination project, is decided by the code calling the interface. if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } if err := applyCondsProto("Copy destination", defaultGen, req.dstObject.conds, call); err != nil { return nil, err } if err := applySourceCondsProto("Copy source", req.srcObject.gen, req.srcObject.conds, call); err != nil { return nil, err } if len(req.dstObject.encryptionKey) > 0 { call.CommonObjectRequestParams = toProtoCommonObjectRequestParams(req.dstObject.encryptionKey) } if len(req.srcObject.encryptionKey) > 0 { srcParams := toProtoCommonObjectRequestParams(req.srcObject.encryptionKey) call.CopySourceEncryptionAlgorithm = srcParams.GetEncryptionAlgorithm() call.CopySourceEncryptionKeyBytes = srcParams.GetEncryptionKeyBytes() call.CopySourceEncryptionKeySha256Bytes = srcParams.GetEncryptionKeySha256Bytes() } call.MaxBytesRewrittenPerCall = req.maxBytesRewrittenPerCall var res *storagepb.RewriteResponse var err error retryCall := func(ctx context.Context) error { res, err = c.raw.RewriteObject(ctx, call, s.gax...); return err } if err := run(ctx, retryCall, s.retry, s.idempotent); err != nil { if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound { return nil, formatObjectErr(err) } return nil, err } r := &rewriteObjectResponse{ done: res.GetDone(), written: res.GetTotalBytesRewritten(), size: res.GetObjectSize(), token: res.GetRewriteToken(), resource: newObjectFromProto(res.GetResource()), } return r, nil } // Custom codec to be used for unmarshaling BidiReadObjectResponse messages. // This is used to avoid a copy of object data in proto.Unmarshal. type bytesCodecV2 struct { } var _ encoding.CodecV2 = bytesCodecV2{} // Marshal is used to encode messages to send for bytesCodecV2. Since we are only // using this to send ReadObjectRequest messages we don't need to recycle buffers // here. func (bytesCodecV2) Marshal(v any) (mem.BufferSlice, error) { vv, ok := v.(proto.Message) if !ok { return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v) } var data mem.BufferSlice buf, err := proto.Marshal(vv) if err != nil { return nil, err } data = append(data, mem.SliceBuffer(buf)) return data, nil } // Unmarshal is used for data received for BidiReadObjectResponse. We want to preserve // the mem.BufferSlice in most cases rather than copying and calling proto.Unmarshal. func (bytesCodecV2) Unmarshal(data mem.BufferSlice, v any) error { switch v := v.(type) { case *mem.BufferSlice: *v = data // Pick up a reference to the data so that it is not freed while decoding. data.Ref() return nil case proto.Message: buf := data.MaterializeToBuffer(mem.DefaultBufferPool()) return proto.Unmarshal(buf.ReadOnlyData(), v) default: return fmt.Errorf("cannot unmarshal type %T, want proto.Message or mem.BufferSlice", v) } } func (bytesCodecV2) Name() string { return "" } func contextMetadataFromBidiReadObject(req *storagepb.BidiReadObjectRequest) []string { if len(req.GetReadObjectSpec().GetRoutingToken()) > 0 { return []string{"x-goog-request-params", fmt.Sprintf("bucket=%s&routing_token=%s", req.GetReadObjectSpec().GetBucket(), req.GetReadObjectSpec().GetRoutingToken())} } return []string{"x-goog-request-params", fmt.Sprintf("bucket=%s", req.GetReadObjectSpec().GetBucket())} } func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params *newMultiRangeDownloaderParams, opts ...storageOption) (mr *MultiRangeDownloader, err error) { if !c.config.grpcBidiReads { return nil, errors.New("storage: MultiRangeDownloader requires the experimental.WithGRPCBidiReads option") } ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewMultiRangeDownloader") defer func() { trace.EndSpan(ctx, err) }() s := callSettings(c.settings, opts...) if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } b := bucketResourceName(globalProjectAlias, params.bucket) object := params.object bidiObject := &storagepb.BidiReadObjectSpec{ Bucket: b, Object: object, CommonObjectRequestParams: toProtoCommonObjectRequestParams(params.encryptionKey), } // The default is a negative value, which means latest. if params.gen >= 0 { bidiObject.Generation = params.gen } if params.handle != nil && len(*params.handle) != 0 { bidiObject.ReadHandle = &storagepb.BidiReadHandle{ Handle: *params.handle, } } req := &storagepb.BidiReadObjectRequest{ ReadObjectSpec: bidiObject, } ctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...) openStream := func(readHandle ReadHandle) (*bidiReadStreamResponse, context.CancelFunc, error) { if err := applyCondsProto("grpcStorageClient.BidiReadObject", params.gen, params.conds, bidiObject); err != nil { return nil, nil, err } if len(readHandle) != 0 { req.GetReadObjectSpec().ReadHandle = &storagepb.BidiReadHandle{ Handle: readHandle, } } var stream storagepb.Storage_BidiReadObjectClient var resp *storagepb.BidiReadObjectResponse cc, cancel := context.WithCancel(ctx) err = run(cc, func(ctx context.Context) error { stream, err = c.raw.BidiReadObject(ctx, s.gax...) if err != nil { // BidiReadObjectRedirectedError error is only returned on initial open in case of a redirect. // The routing token that should be used when reopening the read stream. Needs to be exported. rpcStatus := status.Convert(err) details := rpcStatus.Details() for _, detail := range details { if bidiError, ok := detail.(*storagepb.BidiReadObjectRedirectedError); ok { bidiObject.ReadHandle = bidiError.ReadHandle bidiObject.RoutingToken = bidiError.RoutingToken req.ReadObjectSpec = bidiObject ctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...) } } return err } // Incase stream opened succesfully, send first message on the stream. // First message to stream should contain read_object_spec err = stream.Send(req) if err != nil { return err } resp, err = stream.Recv() if err != nil { return err } return nil }, s.retry, s.idempotent) if err != nil { // Close the stream context we just created to ensure we don't leak // resources. cancel() return nil, nil, err } return &bidiReadStreamResponse{stream: stream, response: resp}, cancel, nil } // For the first time open stream without adding any range. resp, cancel, err := openStream(nil) if err != nil { return nil, err } // The first message was Recv'd on stream open, use it to populate the // object metadata. msg := resp.response obj := msg.GetMetadata() // This is the size of the entire object, even if only a range was requested. size := obj.GetSize() mrd := &gRPCBidiReader{ stream: resp.stream, cancel: cancel, settings: s, readHandle: msg.GetReadHandle().GetHandle(), readIDGenerator: &readIDGenerator{}, reopen: openStream, readSpec: bidiObject, rangesToRead: make(chan []mrdRange, 100), ctx: ctx, closeReceiver: make(chan bool, 10), closeSender: make(chan bool, 10), senderRetry: make(chan bool), // create unbuffered channel for closing the streamManager goroutine. receiverRetry: make(chan bool), // create unbuffered channel for closing the streamReceiver goroutine. activeRanges: make(map[int64]mrdRange), done: false, numActiveRanges: 0, streamRecreation: false, } // sender receives ranges from user adds and requests these ranges from GCS. sender := func() { var currentSpec []mrdRange for { select { case <-mrd.ctx.Done(): mrd.mu.Lock() mrd.done = true mrd.mu.Unlock() return case <-mrd.senderRetry: return case <-mrd.closeSender: mrd.mu.Lock() if len(mrd.activeRanges) != 0 { for key := range mrd.activeRanges { mrd.activeRanges[key].callback(mrd.activeRanges[key].offset, mrd.activeRanges[key].totalBytesWritten, fmt.Errorf("stream closed early")) delete(mrd.activeRanges, key) } } mrd.numActiveRanges = 0 mrd.mu.Unlock() return case currentSpec = <-mrd.rangesToRead: var readRanges []*storagepb.ReadRange var err error mrd.mu.Lock() for _, v := range currentSpec { mrd.activeRanges[v.readID] = v readRanges = append(readRanges, &storagepb.ReadRange{ReadOffset: v.offset, ReadLength: v.limit, ReadId: v.readID}) } mrd.mu.Unlock() // We can just send 100 request to gcs in one request. // In case of Add we will send only one range request to gcs but in case of retry we can have more than 100 ranges. // Hence be will divide the request in chunk of 100. // For example with 457 ranges on stream we will have 5 request to gcs [0:99], [100:199], [200:299], [300:399], [400:456] requestCount := len(readRanges) / 100 if len(readRanges)%100 != 0 { requestCount++ } for i := 0; i < requestCount; i++ { start := i * 100 end := (i + 1) * 100 if end > len(readRanges) { end = len(readRanges) } curReq := readRanges[start:end] err = mrd.stream.Send(&storagepb.BidiReadObjectRequest{ ReadRanges: curReq, }) if err != nil { // cancel stream and reopen the stream again. // Incase again an error is thrown close the streamManager goroutine. mrd.retrier(err, "manager") break } } } } } // receives ranges responses on the stream and executes the callback. receiver := func() { var resp *storagepb.BidiReadObjectResponse var err error for { select { case <-mrd.ctx.Done(): mrd.done = true return case <-mrd.receiverRetry: return case <-mrd.closeReceiver: return default: // This function reads the data sent for a particular range request and has a callback // to indicate that output buffer is filled. resp, err = mrd.stream.Recv() if resp.GetReadHandle().GetHandle() != nil { mrd.readHandle = resp.GetReadHandle().GetHandle() } if err == io.EOF { err = nil } if err != nil { // cancel stream and reopen the stream again. // Incase again an error is thrown close the streamManager goroutine. mrd.retrier(err, "receiver") } if err == nil { mrd.mu.Lock() if len(mrd.activeRanges) == 0 && mrd.numActiveRanges == 0 { mrd.closeReceiver <- true mrd.closeSender <- true return } mrd.mu.Unlock() arr := resp.GetObjectDataRanges() for _, val := range arr { id := val.GetReadRange().GetReadId() mrd.mu.Lock() _, ok := mrd.activeRanges[id] if !ok { // it's ok to ignore responses for read_id not in map as user would have been notified by callback. continue } _, err = mrd.activeRanges[id].writer.Write(val.GetChecksummedData().GetContent()) if err != nil { mrd.activeRanges[id].callback(mrd.activeRanges[id].offset, mrd.activeRanges[id].totalBytesWritten, err) mrd.numActiveRanges-- delete(mrd.activeRanges, id) } else { mrd.activeRanges[id] = mrdRange{ readID: mrd.activeRanges[id].readID, writer: mrd.activeRanges[id].writer, offset: mrd.activeRanges[id].offset, limit: mrd.activeRanges[id].limit, currentBytesWritten: mrd.activeRanges[id].currentBytesWritten + int64(len(val.GetChecksummedData().GetContent())), totalBytesWritten: mrd.activeRanges[id].totalBytesWritten + int64(len(val.GetChecksummedData().GetContent())), callback: mrd.activeRanges[id].callback, } } if val.GetRangeEnd() { mrd.activeRanges[id].callback(mrd.activeRanges[id].offset, mrd.activeRanges[id].totalBytesWritten, nil) mrd.numActiveRanges-- delete(mrd.activeRanges, id) } mrd.mu.Unlock() } } } } } mrd.retrier = func(err error, thread string) { mrd.mu.Lock() if !mrd.streamRecreation { mrd.streamRecreation = true } else { mrd.mu.Unlock() return } mrd.mu.Unlock() // close both the go routines to make the stream recreation syncronous. if thread == "receiver" { mrd.senderRetry <- true } else { mrd.receiverRetry <- true } err = mrd.retryStream(err) if err != nil { mrd.mu.Lock() for key := range mrd.activeRanges { mrd.activeRanges[key].callback(mrd.activeRanges[key].offset, mrd.activeRanges[key].totalBytesWritten, err) delete(mrd.activeRanges, key) } // In case we hit an permanent error, delete entries from map and remove active tasks. mrd.numActiveRanges = 0 mrd.mu.Unlock() mrd.close() } else { // If stream recreation happened successfully lets again start // both the goroutine making the whole flow asynchronous again. if thread == "receiver" { go sender() } else { go receiver() } } mrd.mu.Lock() mrd.streamRecreation = false mrd.mu.Unlock() } mrd.mu.Lock() mrd.objectSize = size mrd.mu.Unlock() go sender() go receiver() return &MultiRangeDownloader{ Attrs: ReaderObjectAttrs{ Size: size, ContentType: obj.GetContentType(), ContentEncoding: obj.GetContentEncoding(), CacheControl: obj.GetCacheControl(), LastModified: obj.GetUpdateTime().AsTime(), Metageneration: obj.GetMetageneration(), Generation: obj.GetGeneration(), }, reader: mrd, }, nil } type gRPCBidiReader struct { ctx context.Context stream storagepb.Storage_BidiReadObjectClient cancel context.CancelFunc settings *settings readHandle ReadHandle readIDGenerator *readIDGenerator reopen func(ReadHandle) (*bidiReadStreamResponse, context.CancelFunc, error) readSpec *storagepb.BidiReadObjectSpec objectSize int64 // always use the mutex when accessing this variable closeReceiver chan bool closeSender chan bool senderRetry chan bool receiverRetry chan bool // rangesToRead are ranges that have not yet been sent or have been sent but // must be retried. rangesToRead chan []mrdRange // activeRanges are ranges that are currently being sent or are waiting for // a response from GCS. activeRanges map[int64]mrdRange // always use the mutex when accessing the map numActiveRanges int64 // always use the mutex when accessing this variable done bool // always use the mutex when accessing this variable, indicates whether stream is closed or not. mu sync.Mutex // protects all vars in gRPCBidiReader from concurrent access retrier func(error, string) streamRecreation bool // This helps us identify if stream recreation is in progress or not. If stream recreation gets called from two goroutine then this will stop second one. } func (mrd *gRPCBidiReader) activeRange() []mrdRange { mrd.mu.Lock() defer mrd.mu.Unlock() var activeRange []mrdRange for k, v := range mrd.activeRanges { activeRange = append(activeRange, mrdRange{ readID: k, writer: v.writer, offset: (v.offset + v.currentBytesWritten), limit: v.limit - v.currentBytesWritten, callback: v.callback, currentBytesWritten: 0, totalBytesWritten: v.totalBytesWritten, }) mrd.activeRanges[k] = activeRange[len(activeRange)-1] } return activeRange } // retryStream cancel's stream and reopen the stream again. func (mrd *gRPCBidiReader) retryStream(err error) error { if mrd.settings.retry.runShouldRetry(err) { // This will "close" the existing stream and immediately attempt to // reopen the stream, but will backoff if further attempts are necessary. // When Reopening the stream only failed readID will be added to stream. return mrd.reopenStream(mrd.activeRange()) } return err } // reopenStream "closes" the existing stream and attempts to reopen a stream and // sets the Reader's stream and cancelStream properties in the process. func (mrd *gRPCBidiReader) reopenStream(failSpec []mrdRange) error { // Close existing stream and initialize new stream with updated offset. if mrd.cancel != nil { mrd.cancel() } res, cancel, err := mrd.reopen(mrd.readHandle) if err != nil { return err } mrd.stream = res.stream mrd.cancel = cancel mrd.readHandle = res.response.GetReadHandle().GetHandle() if failSpec != nil { mrd.rangesToRead <- failSpec } return nil } // Add will add current range to stream. func (mrd *gRPCBidiReader) add(output io.Writer, offset, limit int64, callback func(int64, int64, error)) { mrd.mu.Lock() objectSize := mrd.objectSize mrd.mu.Unlock() if offset > objectSize { callback(offset, 0, fmt.Errorf("storage: offset should not be larger than the size of object (%v)", objectSize)) return } if limit < 0 { callback(offset, 0, errors.New("storage: cannot add range because the limit cannot be negative")) return } id := mrd.readIDGenerator.Next() if !mrd.done { spec := mrdRange{readID: id, writer: output, offset: offset, limit: limit, currentBytesWritten: 0, totalBytesWritten: 0, callback: callback} mrd.mu.Lock() mrd.numActiveRanges++ mrd.rangesToRead <- []mrdRange{spec} mrd.mu.Unlock() } else { callback(offset, 0, errors.New("storage: cannot add range because the stream is closed")) } } func (mrd *gRPCBidiReader) wait() { mrd.mu.Lock() // we should wait until there is active task or an entry in the map. // there can be a scenario we have nothing in map for a moment or too but still have active task. // hence in case we have permanent errors we reduce active task to 0 so that this does not block wait. keepWaiting := len(mrd.activeRanges) != 0 || mrd.numActiveRanges != 0 mrd.mu.Unlock() for keepWaiting { mrd.mu.Lock() keepWaiting = len(mrd.activeRanges) != 0 || mrd.numActiveRanges != 0 mrd.mu.Unlock() } } // Close will notify stream manager goroutine that the reader has been closed, if it's still running. func (mrd *gRPCBidiReader) close() error { if mrd.cancel != nil { mrd.cancel() } mrd.mu.Lock() mrd.done = true mrd.numActiveRanges = 0 mrd.mu.Unlock() mrd.closeReceiver <- true mrd.closeSender <- true return nil } func (mrd *gRPCBidiReader) getHandle() []byte { return mrd.readHandle } func (mrd *gRPCBidiReader) error() error { mrd.mu.Lock() defer mrd.mu.Unlock() if mrd.done { return errors.New("storage: stream is permanently closed") } return nil } type mrdRange struct { readID int64 writer io.Writer offset int64 limit int64 currentBytesWritten int64 totalBytesWritten int64 callback func(int64, int64, error) } func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) { // If bidi reads was not selected, use the legacy read object API. if !c.config.grpcBidiReads { return c.NewRangeReaderReadObject(ctx, params, opts...) } ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewRangeReader") defer func() { trace.EndSpan(ctx, err) }() s := callSettings(c.settings, opts...) s.gax = append(s.gax, gax.WithGRPCOptions( grpc.ForceCodecV2(bytesCodecV2{}), )) if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } b := bucketResourceName(globalProjectAlias, params.bucket) // Create a BidiReadObjectRequest. spec := &storagepb.BidiReadObjectSpec{ Bucket: b, Object: params.object, CommonObjectRequestParams: toProtoCommonObjectRequestParams(params.encryptionKey), } if err := applyCondsProto("gRPCReader.NewRangeReader", params.gen, params.conds, spec); err != nil { return nil, err } if params.handle != nil && len(*params.handle) != 0 { spec.ReadHandle = &storagepb.BidiReadHandle{ Handle: *params.handle, } } req := &storagepb.BidiReadObjectRequest{ ReadObjectSpec: spec, } ctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...) // Define a function that initiates a Read with offset and length, assuming // we have already read seen bytes. reopen := func(seen int64) (*readStreamResponse, context.CancelFunc, error) { // If the context has already expired, return immediately without making // we call. if err := ctx.Err(); err != nil { return nil, nil, err } cc, cancel := context.WithCancel(ctx) // BidiReadObject can take multiple ranges, but we just request one in this case. readRange := &storagepb.ReadRange{ ReadOffset: params.offset + seen, ReadId: 1, } // Only set a ReadLength if length is greater than zero, because <= 0 means // to read it all. if params.length > 0 { readRange.ReadLength = params.length - seen } req.ReadRanges = []*storagepb.ReadRange{readRange} var stream storagepb.Storage_BidiReadObjectClient var err error var decoder *readResponseDecoder err = run(cc, func(ctx context.Context) error { stream, err = c.raw.BidiReadObject(ctx, s.gax...) if err != nil { return err } if err := stream.Send(req); err != nil { return err } // Oneshot reads can close the client->server side immediately. if err := stream.CloseSend(); err != nil { return err } // Receive the message into databuf as a wire-encoded message so we can // use a custom decoder to avoid an extra copy at the protobuf layer. databufs := mem.BufferSlice{} err := stream.RecvMsg(&databufs) // These types of errors show up on the RecvMsg call, rather than the // initialization of the stream via BidiReadObject above. if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound { return formatObjectErr(err) } if err != nil { return err } // Use a custom decoder that uses protobuf unmarshalling for all // fields except the object data. Object data is handled separately // to avoid a copy. decoder = &readResponseDecoder{ databufs: databufs, } err = decoder.readFullObjectResponse() return err }, s.retry, s.idempotent) if err != nil { // Close the stream context we just created to ensure we don't leak // resources. cancel() // Free any buffers. if decoder != nil && decoder.databufs != nil { decoder.databufs.Free() } return nil, nil, err } return &readStreamResponse{ stream: stream, decoder: decoder, }, cancel, nil } res, cancel, err := reopen(0) if err != nil { return nil, err } // The first message was Recv'd on stream open, use it to populate the // object metadata and read handle. msg := res.decoder.msg obj := msg.GetMetadata() handle := ReadHandle(msg.GetReadHandle().GetHandle()) // This is the size of the entire object, even if only a range was requested. size := obj.GetSize() // Only support checksums when reading an entire object, not a range. var ( wantCRC uint32 checkCRC bool ) if checksums := obj.GetChecksums(); checksums != nil && checksums.Crc32C != nil { if params.offset == 0 && params.length < 0 { checkCRC = true } wantCRC = checksums.GetCrc32C() } startOffset := params.offset if params.offset < 0 { startOffset = size + params.offset } // The remaining bytes are the lesser of the requested range and all bytes // after params.offset. length := params.length if params.length > size || params.length < 0 { // if params.length < 0 (or larger than object size), // all remaining bytes were requested. length = size } remain := length - startOffset metadata := obj.GetMetadata() r = &Reader{ Attrs: ReaderObjectAttrs{ Size: size, StartOffset: startOffset, ContentType: obj.GetContentType(), ContentEncoding: obj.GetContentEncoding(), CacheControl: obj.GetCacheControl(), LastModified: obj.GetUpdateTime().AsTime(), Metageneration: obj.GetMetageneration(), Generation: obj.GetGeneration(), CRC32C: wantCRC, }, objectMetadata: &metadata, reader: &gRPCReader{ stream: res.stream, reopen: reopen, cancel: cancel, size: size, // Preserve the decoder to read out object data when Read/WriteTo is called. currMsg: res.decoder, settings: s, zeroRange: params.length == 0, wantCRC: wantCRC, checkCRC: checkCRC, }, checkCRC: checkCRC, handle: &handle, remain: remain, } // For a zero-length request, explicitly close the stream and set remaining // bytes to zero. if params.length == 0 { r.remain = 0 r.reader.Close() } return r, nil } // IAM methods. func (c *grpcStorageClient) GetIamPolicy(ctx context.Context, resource string, version int32, opts ...storageOption) (*iampb.Policy, error) { // TODO: Need a way to set UserProject, potentially in X-Goog-User-Project system parameter. s := callSettings(c.settings, opts...) req := &iampb.GetIamPolicyRequest{ Resource: bucketResourceName(globalProjectAlias, resource), Options: &iampb.GetPolicyOptions{ RequestedPolicyVersion: version, }, } var rp *iampb.Policy err := run(ctx, func(ctx context.Context) error { var err error rp, err = c.raw.GetIamPolicy(ctx, req, s.gax...) return err }, s.retry, s.idempotent) return rp, err } func (c *grpcStorageClient) SetIamPolicy(ctx context.Context, resource string, policy *iampb.Policy, opts ...storageOption) error { // TODO: Need a way to set UserProject, potentially in X-Goog-User-Project system parameter. s := callSettings(c.settings, opts...) req := &iampb.SetIamPolicyRequest{ Resource: bucketResourceName(globalProjectAlias, resource), Policy: policy, } return run(ctx, func(ctx context.Context) error { _, err := c.raw.SetIamPolicy(ctx, req, s.gax...) return err }, s.retry, s.idempotent) } func (c *grpcStorageClient) TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) { // TODO: Need a way to set UserProject, potentially in X-Goog-User-Project system parameter. s := callSettings(c.settings, opts...) req := &iampb.TestIamPermissionsRequest{ Resource: bucketResourceName(globalProjectAlias, resource), Permissions: permissions, } var res *iampb.TestIamPermissionsResponse err := run(ctx, func(ctx context.Context) error { var err error res, err = c.raw.TestIamPermissions(ctx, req, s.gax...) return err }, s.retry, s.idempotent) if err != nil { return nil, err } return res.Permissions, nil } // HMAC Key methods are not implemented in gRPC client. func (c *grpcStorageClient) GetHMACKey(ctx context.Context, project, accessID string, opts ...storageOption) (*HMACKey, error) { return nil, errMethodNotSupported } func (c *grpcStorageClient) ListHMACKeys(ctx context.Context, project, serviceAccountEmail string, showDeletedKeys bool, opts ...storageOption) *HMACKeysIterator { it := &HMACKeysIterator{ ctx: ctx, projectID: "", retry: nil, } fetch := func(_ int, _ string) (token string, err error) { return "", errMethodNotSupported } it.pageInfo, it.nextFunc = iterator.NewPageInfo( fetch, func() int { return 0 }, func() interface{} { return nil }, ) return it } func (c *grpcStorageClient) UpdateHMACKey(ctx context.Context, project, serviceAccountEmail, accessID string, attrs *HMACKeyAttrsToUpdate, opts ...storageOption) (*HMACKey, error) { return nil, errMethodNotSupported } func (c *grpcStorageClient) CreateHMACKey(ctx context.Context, project, serviceAccountEmail string, opts ...storageOption) (*HMACKey, error) { return nil, errMethodNotSupported } func (c *grpcStorageClient) DeleteHMACKey(ctx context.Context, project string, accessID string, opts ...storageOption) error { return errMethodNotSupported } // Notification methods are not implemented in gRPC client. func (c *grpcStorageClient) ListNotifications(ctx context.Context, bucket string, opts ...storageOption) (n map[string]*Notification, err error) { return nil, errMethodNotSupported } func (c *grpcStorageClient) CreateNotification(ctx context.Context, bucket string, n *Notification, opts ...storageOption) (ret *Notification, err error) { return nil, errMethodNotSupported } func (c *grpcStorageClient) DeleteNotification(ctx context.Context, bucket string, id string, opts ...storageOption) (err error) { return errMethodNotSupported } // setUserProjectMetadata appends a project ID to the outgoing Context metadata // via the x-goog-user-project system parameter defined at // https://cloud.google.com/apis/docs/system-parameters. This is only for // billing purposes, and is generally optional, except for requester-pays // buckets. func setUserProjectMetadata(ctx context.Context, project string) context.Context { return metadata.AppendToOutgoingContext(ctx, "x-goog-user-project", project) } type readStreamResponse struct { stream storagepb.Storage_BidiReadObjectClient decoder *readResponseDecoder } type bidiReadStreamResponse struct { stream storagepb.Storage_BidiReadObjectClient response *storagepb.BidiReadObjectResponse } // gRPCReader is used by storage.Reader if the experimental option WithGRPCBidiReads is passed. type gRPCReader struct { seen, size int64 zeroRange bool stream storagepb.Storage_BidiReadObjectClient reopen func(seen int64) (*readStreamResponse, context.CancelFunc, error) leftovers []byte currMsg *readResponseDecoder // decoder for the current message cancel context.CancelFunc settings *settings checkCRC bool // should we check the CRC? wantCRC uint32 // the CRC32c value the server sent in the header gotCRC uint32 // running crc } // Update the running CRC with the data in the slice, if CRC checking was enabled. func (r *gRPCReader) updateCRC(b []byte) { if r.checkCRC { r.gotCRC = crc32.Update(r.gotCRC, crc32cTable, b) } } // Checks whether the CRC matches at the conclusion of a read, if CRC checking was enabled. func (r *gRPCReader) runCRCCheck() error { if r.checkCRC && r.gotCRC != r.wantCRC { return fmt.Errorf("storage: bad CRC on read: got %d, want %d", r.gotCRC, r.wantCRC) } return nil } // Read reads bytes into the user's buffer from an open gRPC stream. func (r *gRPCReader) Read(p []byte) (int, error) { // The entire object has been read by this reader, check the checksum if // necessary and return EOF. if r.size == r.seen || r.zeroRange { if err := r.runCRCCheck(); err != nil { return 0, err } return 0, io.EOF } // No stream to read from, either never initialized or Close was called. // Note: There is a potential concurrency issue if multiple routines are // using the same reader. One encounters an error and the stream is closed // and then reopened while the other routine attempts to read from it. if r.stream == nil { return 0, fmt.Errorf("storage: reader has been closed") } var n int // If there is data remaining in the current message, return what was // available to conform to the Reader // interface: https://pkg.go.dev/io#Reader. if !r.currMsg.done { n = r.currMsg.readAndUpdateCRC(p, func(b []byte) { r.updateCRC(b) }) r.seen += int64(n) return n, nil } // Attempt to Recv the next message on the stream. // This will update r.currMsg with the decoder for the new message. err := r.recv() if err != nil { return 0, err } // TODO: Determine if we need to capture incremental CRC32C for this // chunk. The Object CRC32C checksum is captured when directed to read // the entire Object. If directed to read a range, we may need to // calculate the range's checksum for verification if the checksum is // present in the response here. // TODO: Figure out if we need to support decompressive transcoding // https://cloud.google.com/storage/docs/transcoding. n = r.currMsg.readAndUpdateCRC(p, func(b []byte) { r.updateCRC(b) }) r.seen += int64(n) return n, nil } // WriteTo writes all the data requested by the Reader into w, implementing // io.WriterTo. func (r *gRPCReader) WriteTo(w io.Writer) (int64, error) { // The entire object has been read by this reader, check the checksum if // necessary and return nil. if r.size == r.seen || r.zeroRange { if err := r.runCRCCheck(); err != nil { return 0, err } return 0, nil } // No stream to read from, either never initialized or Close was called. // Note: There is a potential concurrency issue if multiple routines are // using the same reader. One encounters an error and the stream is closed // and then reopened while the other routine attempts to read from it. if r.stream == nil { return 0, fmt.Errorf("storage: reader has been closed") } // Track bytes written during before call. var alreadySeen = r.seen // Write any already received message to the stream. There will be some leftovers from the // original NewRangeReader call. if r.currMsg != nil && !r.currMsg.done { written, err := r.currMsg.writeToAndUpdateCRC(w, func(b []byte) { r.updateCRC(b) }) r.seen += int64(written) r.currMsg = nil if err != nil { return r.seen - alreadySeen, err } } // Loop and receive additional messages until the entire data is written. for { // Attempt to receive the next message on the stream. // Will terminate with io.EOF once data has all come through. // recv() handles stream reopening and retry logic so no need for retries here. err := r.recv() if err != nil { if err == io.EOF { // We are done; check the checksum if necessary and return. err = r.runCRCCheck() } return r.seen - alreadySeen, err } // TODO: Determine if we need to capture incremental CRC32C for this // chunk. The Object CRC32C checksum is captured when directed to read // the entire Object. If directed to read a range, we may need to // calculate the range's checksum for verification if the checksum is // present in the response here. // TODO: Figure out if we need to support decompressive transcoding // https://cloud.google.com/storage/docs/transcoding. written, err := r.currMsg.writeToAndUpdateCRC(w, func(b []byte) { r.updateCRC(b) }) r.seen += int64(written) if err != nil { return r.seen - alreadySeen, err } } } // Close cancels the read stream's context in order for it to be closed and // collected, and frees any currently in use buffers. func (r *gRPCReader) Close() error { if r.cancel != nil { r.cancel() } r.currMsg = nil return nil } // recv attempts to Recv the next message on the stream and extract the object // data that it contains. In the event that a retryable error is encountered, // the stream will be closed, reopened, and RecvMsg again. // This will attempt to Recv until one of the following is true: // // * Recv is successful // * A non-retryable error is encountered // * The Reader's context is canceled // // The last error received is the one that is returned, which could be from // an attempt to reopen the stream. func (r *gRPCReader) recv() error { databufs := mem.BufferSlice{} err := r.stream.RecvMsg(&databufs) if err != nil && r.settings.retry.runShouldRetry(err) { // This will "close" the existing stream and immediately attempt to // reopen the stream, but will backoff if further attempts are necessary. // Reopening the stream Recvs the first message, so if retrying is // successful, r.currMsg will be updated to include the new data. return r.reopenStream() } if err != nil { return err } r.currMsg = &readResponseDecoder{databufs: databufs} return r.currMsg.readFullObjectResponse() } // ReadObjectResponse field and subfield numbers. const ( // Top level fields. metadataField = protowire.Number(4) objectRangeDataField = protowire.Number(6) readHandleField = protowire.Number(7) // Nested in ObjectRangeData checksummedDataField = protowire.Number(1) readRangeField = protowire.Number(2) rangeEndField = protowire.Number(3) // Nested in ObjectRangeData.ChecksummedData checksummedDataContentField = protowire.Number(1) checksummedDataCRC32CField = protowire.Number(2) ) // readResponseDecoder is a wrapper on the raw message, used to decode one message // without copying object data. It also has methods to write out the resulting object // data to the user application. type readResponseDecoder struct { databufs mem.BufferSlice // raw bytes of the message being processed // Decoding offsets off uint64 // offset in the messsage relative to the data as a whole currBuf int // index of the current buffer being processed currOff uint64 // offset in the current buffer // Processed data msg *storagepb.BidiReadObjectResponse // processed response message with all fields other than object data populated dataOffsets bufferSliceOffsets // offsets of the object data in the message. done bool // true if the data has been completely read. } type bufferSliceOffsets struct { startBuf, endBuf int // indices of start and end buffers of object data in the msg startOff, endOff uint64 // offsets within these buffers where the data starts and ends. currBuf int // index of current buffer being read out to the user application. currOff uint64 // offset of read in current buffer. } // peek ahead 10 bytes from the current offset in the databufs. This will return a // slice of the current buffer if the bytes are all in one buffer, but will copy // the bytes into a new buffer if the distance is split across buffers. Use this // to allow protowire methods to be used to parse tags & fixed values. // The max length of a varint tag is 10 bytes, see // https://protobuf.dev/programming-guides/encoding/#varints . Other int types // are shorter. func (d *readResponseDecoder) peek() []byte { b := d.databufs[d.currBuf].ReadOnlyData() // Check if the tag will fit in the current buffer. If not, copy the next 10 // bytes into a new buffer to ensure that we can read the tag correctly // without it being divided between buffers. tagBuf := b[d.currOff:] remainingInBuf := len(tagBuf) // If we have less than 10 bytes remaining and are not in the final buffer, // copy up to 10 bytes ahead from the next buffer. if remainingInBuf < binary.MaxVarintLen64 && d.currBuf != len(d.databufs)-1 { tagBuf = d.copyNextBytes(10) } return tagBuf } // Copies up to next n bytes into a new buffer, or fewer if fewer bytes remain in the // buffers overall. Does not advance offsets. func (d *readResponseDecoder) copyNextBytes(n int) []byte { remaining := n if r := d.databufs.Len() - int(d.off); r < remaining { remaining = r } currBuf := d.currBuf currOff := d.currOff var buf []byte for remaining > 0 { b := d.databufs[currBuf].ReadOnlyData() remainingInCurr := len(b[currOff:]) if remainingInCurr < remaining { buf = append(buf, b[currOff:]...) remaining -= remainingInCurr currBuf++ currOff = 0 } else { buf = append(buf, b[currOff:currOff+uint64(remaining)]...) remaining = 0 } } return buf } // Advance current buffer & byte offset in the decoding by n bytes. Returns an error if we // go past the end of the data. func (d *readResponseDecoder) advanceOffset(n uint64) error { remaining := n for remaining > 0 { remainingInCurr := uint64(d.databufs[d.currBuf].Len()) - d.currOff if remainingInCurr <= remaining { remaining -= remainingInCurr d.currBuf++ d.currOff = 0 } else { d.currOff += remaining remaining = 0 } } // If we have advanced past the end of the buffers, something went wrong. if (d.currBuf == len(d.databufs) && d.currOff > 0) || d.currBuf > len(d.databufs) { return errors.New("decoding: truncated message, cannot advance offset") } d.off += n return nil } // This copies object data from the message into the buffer and returns the number of // bytes copied. The data offsets are incremented in the message. The updateCRC // function is called on the copied bytes. func (d *readResponseDecoder) readAndUpdateCRC(p []byte, updateCRC func([]byte)) int { // For a completely empty message, just return 0 if len(d.databufs) == 0 { return 0 } databuf := d.databufs[d.dataOffsets.currBuf] startOff := d.dataOffsets.currOff var b []byte if d.dataOffsets.currBuf == d.dataOffsets.endBuf { b = databuf.ReadOnlyData()[startOff:d.dataOffsets.endOff] } else { b = databuf.ReadOnlyData()[startOff:] } n := copy(p, b) updateCRC(b[:n]) d.dataOffsets.currOff += uint64(n) // We've read all the data from this message. Free the underlying buffers. if d.dataOffsets.currBuf == d.dataOffsets.endBuf && d.dataOffsets.currOff == d.dataOffsets.endOff { d.done = true d.databufs.Free() } // We are at the end of the current buffer if d.dataOffsets.currBuf != d.dataOffsets.endBuf && d.dataOffsets.currOff == uint64(databuf.Len()) { d.dataOffsets.currOff = 0 d.dataOffsets.currBuf++ } return n } func (d *readResponseDecoder) writeToAndUpdateCRC(w io.Writer, updateCRC func([]byte)) (int64, error) { // For a completely empty message, just return 0 if len(d.databufs) == 0 { return 0, nil } var written int64 for !d.done { databuf := d.databufs[d.dataOffsets.currBuf] startOff := d.dataOffsets.currOff var b []byte if d.dataOffsets.currBuf == d.dataOffsets.endBuf { b = databuf.ReadOnlyData()[startOff:d.dataOffsets.endOff] } else { b = databuf.ReadOnlyData()[startOff:] } var n int // Write all remaining data from the current buffer n, err := w.Write(b) written += int64(n) updateCRC(b) if err != nil { return written, err } d.dataOffsets.currOff = 0 // We've read all the data from this message. if d.dataOffsets.currBuf == d.dataOffsets.endBuf { d.done = true d.databufs.Free() } else { d.dataOffsets.currBuf++ } } return written, nil } // Consume the next available tag in the input data and return the field number and type. // Advances the relevant offsets in the data. func (d *readResponseDecoder) consumeTag() (protowire.Number, protowire.Type, error) { tagBuf := d.peek() // Consume the next tag. This will tell us which field is next in the // buffer, its type, and how much space it takes up. fieldNum, fieldType, tagLength := protowire.ConsumeTag(tagBuf) if tagLength < 0 { return 0, 0, protowire.ParseError(tagLength) } // Update the offsets and current buffer depending on the tag length. if err := d.advanceOffset(uint64(tagLength)); err != nil { return 0, 0, fmt.Errorf("consuming tag: %w", err) } return fieldNum, fieldType, nil } // Consume a varint that represents the length of a bytes field. Return the length of // the data, and advance the offsets by the length of the varint. func (d *readResponseDecoder) consumeVarint() (uint64, error) { tagBuf := d.peek() // Consume the next tag. This will tell us which field is next in the // buffer, its type, and how much space it takes up. dataLength, tagLength := protowire.ConsumeVarint(tagBuf) if tagLength < 0 { return 0, protowire.ParseError(tagLength) } // Update the offsets and current buffer depending on the tag length. d.advanceOffset(uint64(tagLength)) return dataLength, nil } func (d *readResponseDecoder) consumeFixed32() (uint32, error) { valueBuf := d.peek() // Consume the next tag. This will tell us which field is next in the // buffer, its type, and how much space it takes up. value, tagLength := protowire.ConsumeFixed32(valueBuf) if tagLength < 0 { return 0, protowire.ParseError(tagLength) } // Update the offsets and current buffer depending on the tag length. d.advanceOffset(uint64(tagLength)) return value, nil } func (d *readResponseDecoder) consumeFixed64() (uint64, error) { valueBuf := d.peek() // Consume the next tag. This will tell us which field is next in the // buffer, its type, and how much space it takes up. value, tagLength := protowire.ConsumeFixed64(valueBuf) if tagLength < 0 { return 0, protowire.ParseError(tagLength) } // Update the offsets and current buffer depending on the tag length. d.advanceOffset(uint64(tagLength)) return value, nil } // Consume any field values up to the end offset provided and don't return anything. // This is used to skip any values which are not going to be used. // msgEndOff is indexed in terms of the overall data across all buffers. func (d *readResponseDecoder) consumeFieldValue(fieldNum protowire.Number, fieldType protowire.Type) error { // reimplement protowire.ConsumeFieldValue without the extra case for groups (which // are are complicted and not a thing in proto3). var err error switch fieldType { case protowire.VarintType: _, err = d.consumeVarint() case protowire.Fixed32Type: _, err = d.consumeFixed32() case protowire.Fixed64Type: _, err = d.consumeFixed64() case protowire.BytesType: _, err = d.consumeBytes() default: return fmt.Errorf("unknown field type %v in field %v", fieldType, fieldNum) } if err != nil { return fmt.Errorf("consuming field %v of type %v: %w", fieldNum, fieldType, err) } return nil } // Consume a bytes field from the input. Returns offsets for the data in the buffer slices // and an error. func (d *readResponseDecoder) consumeBytes() (bufferSliceOffsets, error) { // m is the length of the data past the tag. m, err := d.consumeVarint() if err != nil { return bufferSliceOffsets{}, fmt.Errorf("consuming bytes field: %w", err) } offsets := bufferSliceOffsets{ startBuf: d.currBuf, startOff: d.currOff, currBuf: d.currBuf, currOff: d.currOff, } // Advance offsets to lengths of bytes field and capture where we end. d.advanceOffset(m) offsets.endBuf = d.currBuf offsets.endOff = d.currOff return offsets, nil } // Consume a bytes field from the input and copy into a new buffer if // necessary (if the data is split across buffers in databuf). This can be // used to leverage proto.Unmarshal for small bytes fields (i.e. anything // except object data). func (d *readResponseDecoder) consumeBytesCopy() ([]byte, error) { // m is the length of the bytes data. m, err := d.consumeVarint() if err != nil { return nil, fmt.Errorf("consuming varint: %w", err) } // Copy the data into a buffer and advance the offset b := d.copyNextBytes(int(m)) if err := d.advanceOffset(m); err != nil { return nil, fmt.Errorf("advancing offset: %w", err) } return b, nil } // readFullObjectResponse returns the BidiReadObjectResponse that is encoded in the // wire-encoded message buffer b, or an error if the message is invalid. // This must be used on the first recv of an object as it may contain all fields // of BidiReadObjectResponse, and we use or pass on those fields to the user. // This function is essentially identical to proto.Unmarshal, except it aliases // the data in the input []byte. If the proto library adds a feature to // Unmarshal that does that, this function can be dropped. func (d *readResponseDecoder) readFullObjectResponse() error { msg := &storagepb.BidiReadObjectResponse{} // Loop over the entire message, extracting fields as we go. This does not // handle field concatenation, in which the contents of a single field // are split across multiple protobuf tags. for d.off < uint64(d.databufs.Len()) { fieldNum, fieldType, err := d.consumeTag() if err != nil { return fmt.Errorf("consuming next tag: %w", err) } // Unmarshal the field according to its type. Only fields that are not // nil will be present. switch { // This is a repeated field, so it can occur more than once. But, for now // we can just take the first range per message since Reader only requests // a single range. // See https://protobuf.dev/programming-guides/encoding/#optional // TODO: support multiple ranges once integrated with MultiRangeDownloader. case fieldNum == objectRangeDataField && fieldType == protowire.BytesType: // The object data field was found. Initialize the data ranges assuming // exactly one range in the message. msg.ObjectDataRanges = []*storagepb.ObjectRangeData{{ChecksummedData: &storagepb.ChecksummedData{}, ReadRange: &storagepb.ReadRange{}}} bytesFieldLen, err := d.consumeVarint() if err != nil { return fmt.Errorf("consuming bytes: %w", err) } var contentEndOff = d.off + bytesFieldLen for d.off < contentEndOff { gotNum, gotTyp, err := d.consumeTag() if err != nil { return fmt.Errorf("consuming objectRangeData tag: %w", err) } switch { case gotNum == checksummedDataField && gotTyp == protowire.BytesType: checksummedDataFieldLen, err := d.consumeVarint() if err != nil { return fmt.Errorf("consuming bytes: %w", err) } var checksummedDataEndOff = d.off + checksummedDataFieldLen for d.off < checksummedDataEndOff { gotNum, gotTyp, err := d.consumeTag() if err != nil { return fmt.Errorf("consuming checksummedData tag: %w", err) } switch { case gotNum == checksummedDataContentField && gotTyp == protowire.BytesType: // Get the offsets of the content bytes. d.dataOffsets, err = d.consumeBytes() if err != nil { return fmt.Errorf("invalid BidiReadObjectResponse.ChecksummedData.Content: %w", err) } case gotNum == checksummedDataCRC32CField && gotTyp == protowire.Fixed32Type: v, err := d.consumeFixed32() if err != nil { return fmt.Errorf("invalid BidiReadObjectResponse.ChecksummedData.Crc32C: %w", err) } msg.ObjectDataRanges[0].ChecksummedData.Crc32C = &v default: err := d.consumeFieldValue(gotNum, gotTyp) if err != nil { return fmt.Errorf("invalid field in BidiReadObjectResponse.ChecksummedData: %w", err) } } } case gotNum == readRangeField && gotTyp == protowire.BytesType: buf, err := d.consumeBytesCopy() if err != nil { return fmt.Errorf("invalid ObjectDataRange.ReadRange: %w", err) } if err := proto.Unmarshal(buf, msg.ObjectDataRanges[0].ReadRange); err != nil { return err } case gotNum == rangeEndField && gotTyp == protowire.VarintType: // proto encodes bool as int32 b, err := d.consumeVarint() if err != nil { return fmt.Errorf("invalid ObjectDataRange.RangeEnd: %w", err) } msg.ObjectDataRanges[0].RangeEnd = protowire.DecodeBool(b) } } case fieldNum == metadataField && fieldType == protowire.BytesType: msg.Metadata = &storagepb.Object{} buf, err := d.consumeBytesCopy() if err != nil { return fmt.Errorf("invalid BidiReadObjectResponse.Metadata: %w", err) } if err := proto.Unmarshal(buf, msg.Metadata); err != nil { return err } case fieldNum == readHandleField && fieldType == protowire.BytesType: msg.ReadHandle = &storagepb.BidiReadHandle{} buf, err := d.consumeBytesCopy() if err != nil { return fmt.Errorf("invalid BidiReadObjectResponse.ReadHandle: %w", err) } if err := proto.Unmarshal(buf, msg.ReadHandle); err != nil { return err } default: err := d.consumeFieldValue(fieldNum, fieldType) if err != nil { return fmt.Errorf("invalid field in BidiReadObjectResponse: %w", err) } } } d.msg = msg return nil } // reopenStream "closes" the existing stream and attempts to reopen a stream and // sets the Reader's stream and cancelStream properties in the process. func (r *gRPCReader) reopenStream() error { // Close existing stream and initialize new stream with updated offset. r.Close() res, cancel, err := r.reopen(r.seen) if err != nil { return err } r.stream = res.stream r.currMsg = res.decoder r.cancel = cancel return nil } ================================================ FILE: vendor/cloud.google.com/go/storage/grpc_dp.go ================================================ //go:build !disable_grpc_modules // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( _ "google.golang.org/grpc/balancer/rls" _ "google.golang.org/grpc/xds/googledirectpath" ) ================================================ FILE: vendor/cloud.google.com/go/storage/grpc_metrics.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "errors" "fmt" "strings" "time" mexporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric" "github.com/google/uuid" "go.opentelemetry.io/contrib/detectors/gcp" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/metricdata" "go.opentelemetry.io/otel/sdk/resource" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/stats/opentelemetry" ) const ( monitoredResourceName = "storage.googleapis.com/Client" metricPrefix = "storage.googleapis.com/client/" ) // Added to help with tests type storageMonitoredResource struct { project string api string location string instance string cloudPlatform string host string resource *resource.Resource } func (smr *storageMonitoredResource) exporter() (metric.Exporter, error) { exporter, err := mexporter.New( mexporter.WithProjectID(smr.project), mexporter.WithMetricDescriptorTypeFormatter(metricFormatter), mexporter.WithCreateServiceTimeSeries(), mexporter.WithMonitoredResourceDescription(monitoredResourceName, []string{"project_id", "location", "cloud_platform", "host_id", "instance_id", "api"}), ) if err != nil { return nil, fmt.Errorf("storage: creating metrics exporter: %w", err) } return exporter, nil } func newStorageMonitoredResource(ctx context.Context, project, api string, opts ...resource.Option) (*storageMonitoredResource, error) { detectedAttrs, err := resource.New(ctx, opts...) if err != nil { return nil, err } smr := &storageMonitoredResource{ instance: uuid.New().String(), api: api, project: project, } s := detectedAttrs.Set() // Attempt to use resource detector project id if project id wasn't // identified using ADC as a last resort. Otherwise metrics cannot be started. if p, present := s.Value("cloud.account.id"); present && smr.project == "" { smr.project = p.AsString() } else if !present && smr.project == "" { return nil, errors.New("google cloud project is required to start client-side metrics") } if v, ok := s.Value("cloud.region"); ok { smr.location = v.AsString() } else { smr.location = "global" } if v, ok := s.Value("cloud.platform"); ok { smr.cloudPlatform = v.AsString() } else { smr.cloudPlatform = "unknown" } if v, ok := s.Value("host.id"); ok { smr.host = v.AsString() } else if v, ok := s.Value("faas.id"); ok { smr.host = v.AsString() } else { smr.host = "unknown" } smr.resource, err = resource.New(ctx, resource.WithAttributes([]attribute.KeyValue{ {Key: "gcp.resource_type", Value: attribute.StringValue(monitoredResourceName)}, {Key: "project_id", Value: attribute.StringValue(smr.project)}, {Key: "api", Value: attribute.StringValue(smr.api)}, {Key: "instance_id", Value: attribute.StringValue(smr.instance)}, {Key: "location", Value: attribute.StringValue(smr.location)}, {Key: "cloud_platform", Value: attribute.StringValue(smr.cloudPlatform)}, {Key: "host_id", Value: attribute.StringValue(smr.host)}, }...)) if err != nil { return nil, err } return smr, nil } type metricsContext struct { // client options passed to gRPC channels clientOpts []option.ClientOption // instance of metric reader used by gRPC client-side metrics provider *metric.MeterProvider // clean func to call when closing gRPC client close func() } type metricsConfig struct { project string interval time.Duration customExporter *metric.Exporter manualReader *metric.ManualReader // used by tests disableExporter bool // used by tests disables exports resourceOpts []resource.Option // used by tests } func newGRPCMetricContext(ctx context.Context, cfg metricsConfig) (*metricsContext, error) { var exporter metric.Exporter meterOpts := []metric.Option{} if cfg.customExporter == nil { var ropts []resource.Option if cfg.resourceOpts != nil { ropts = cfg.resourceOpts } else { ropts = []resource.Option{resource.WithDetectors(gcp.NewDetector())} } smr, err := newStorageMonitoredResource(ctx, cfg.project, "grpc", ropts...) if err != nil { return nil, err } exporter, err = smr.exporter() if err != nil { return nil, err } meterOpts = append(meterOpts, metric.WithResource(smr.resource)) } else { exporter = *cfg.customExporter } interval := time.Minute if cfg.interval > 0 { interval = cfg.interval } meterOpts = append(meterOpts, // Metric views update histogram boundaries to be relevant to GCS // otherwise default OTel histogram boundaries are used. metric.WithView( createHistogramView("grpc.client.attempt.duration", latencyHistogramBoundaries()), createHistogramView("grpc.client.attempt.rcvd_total_compressed_message_size", sizeHistogramBoundaries()), createHistogramView("grpc.client.attempt.sent_total_compressed_message_size", sizeHistogramBoundaries())), ) if cfg.manualReader != nil { meterOpts = append(meterOpts, metric.WithReader(cfg.manualReader)) } if !cfg.disableExporter { meterOpts = append(meterOpts, metric.WithReader( metric.NewPeriodicReader(&exporterLogSuppressor{Exporter: exporter}, metric.WithInterval(interval)))) } provider := metric.NewMeterProvider(meterOpts...) mo := opentelemetry.MetricsOptions{ MeterProvider: provider, Metrics: stats.NewMetrics( "grpc.client.attempt.started", "grpc.client.attempt.duration", "grpc.client.attempt.sent_total_compressed_message_size", "grpc.client.attempt.rcvd_total_compressed_message_size", "grpc.client.call.duration", "grpc.lb.wrr.rr_fallback", "grpc.lb.wrr.endpoint_weight_not_yet_usable", "grpc.lb.wrr.endpoint_weight_stale", "grpc.lb.wrr.endpoint_weights", "grpc.lb.rls.cache_entries", "grpc.lb.rls.cache_size", "grpc.lb.rls.default_target_picks", "grpc.lb.rls.target_picks", "grpc.lb.rls.failed_picks", ), OptionalLabels: []string{"grpc.lb.locality"}, } opts := []option.ClientOption{ option.WithGRPCDialOption( opentelemetry.DialOption(opentelemetry.Options{MetricsOptions: mo})), option.WithGRPCDialOption( grpc.WithDefaultCallOptions(grpc.StaticMethodCallOption{})), } return &metricsContext{ clientOpts: opts, provider: provider, close: func() { provider.Shutdown(ctx) }, }, nil } // Silences permission errors after initial error is emitted to prevent // chatty logs. type exporterLogSuppressor struct { metric.Exporter emittedFailure bool } // Implements OTel SDK metric.Exporter interface to prevent noisy logs from // lack of credentials after initial failure. // https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric@v1.28.0#Exporter func (e *exporterLogSuppressor) Export(ctx context.Context, rm *metricdata.ResourceMetrics) error { if err := e.Exporter.Export(ctx, rm); err != nil && !e.emittedFailure { if strings.Contains(err.Error(), "PermissionDenied") { e.emittedFailure = true return fmt.Errorf("gRPC metrics failed due permission issue: %w", err) } return err } return nil } func latencyHistogramBoundaries() []float64 { boundaries := []float64{} boundary := 0.0 increment := 0.002 // 2ms buckets for first 100ms, so we can have higher resolution for uploads and downloads in the 100 KiB range for i := 0; i < 50; i++ { boundaries = append(boundaries, boundary) // increment by 2ms boundary += increment } // For the remaining buckets do 10 10ms, 10 20ms, and so on, up until 5 minutes for i := 0; i < 150 && boundary < 300; i++ { boundaries = append(boundaries, boundary) if i != 0 && i%10 == 0 { increment *= 2 } boundary += increment } return boundaries } func sizeHistogramBoundaries() []float64 { kb := 1024.0 mb := 1024.0 * kb gb := 1024.0 * mb boundaries := []float64{} boundary := 0.0 increment := 128 * kb // 128 KiB increments up to 4MiB, then exponential growth for len(boundaries) < 200 && boundary <= 16*gb { boundaries = append(boundaries, boundary) boundary += increment if boundary >= 4*mb { increment *= 2 } } return boundaries } func createHistogramView(name string, boundaries []float64) metric.View { return metric.NewView(metric.Instrument{ Name: name, Kind: metric.InstrumentKindHistogram, }, metric.Stream{ Name: name, Aggregation: metric.AggregationExplicitBucketHistogram{Boundaries: boundaries}, }) } func metricFormatter(m metricdata.Metrics) string { return metricPrefix + strings.ReplaceAll(string(m.Name), ".", "/") } ================================================ FILE: vendor/cloud.google.com/go/storage/grpc_reader.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "encoding/binary" "errors" "fmt" "hash/crc32" "io" "cloud.google.com/go/internal/trace" "cloud.google.com/go/storage/internal/apiv2/storagepb" "github.com/googleapis/gax-go/v2" "google.golang.org/grpc" "google.golang.org/grpc/encoding" "google.golang.org/grpc/mem" "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/proto" ) // Below is the legacy implementation of gRPC downloads using the ReadObject API. // It's used by gRPC if the experimental option WithGRPCBidiReads was not passed. // TODO: once BidiReadObject is in GA, remove this implementation. // Custom codec to be used for unmarshaling ReadObjectResponse messages. // This is used to avoid a copy of object data in proto.Unmarshal. type bytesCodecReadObject struct { } var _ encoding.CodecV2 = bytesCodecReadObject{} // Marshal is used to encode messages to send for bytesCodecReadObject. Since we are only // using this to send ReadObjectRequest messages we don't need to recycle buffers // here. func (bytesCodecReadObject) Marshal(v any) (mem.BufferSlice, error) { vv, ok := v.(proto.Message) if !ok { return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v) } var data mem.BufferSlice buf, err := proto.Marshal(vv) if err != nil { return nil, err } data = append(data, mem.SliceBuffer(buf)) return data, nil } // Unmarshal is used for data received for ReadObjectResponse. We want to preserve // the mem.BufferSlice in most cases rather than copying and calling proto.Unmarshal. func (bytesCodecReadObject) Unmarshal(data mem.BufferSlice, v any) error { switch v := v.(type) { case *mem.BufferSlice: *v = data // Pick up a reference to the data so that it is not freed while decoding. data.Ref() return nil case proto.Message: buf := data.MaterializeToBuffer(mem.DefaultBufferPool()) return proto.Unmarshal(buf.ReadOnlyData(), v) default: return fmt.Errorf("cannot unmarshal type %T, want proto.Message or mem.BufferSlice", v) } } func (bytesCodecReadObject) Name() string { return "" } func (c *grpcStorageClient) NewRangeReaderReadObject(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) { ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewRangeReaderReadObject") defer func() { trace.EndSpan(ctx, err) }() s := callSettings(c.settings, opts...) s.gax = append(s.gax, gax.WithGRPCOptions( grpc.ForceCodecV2(bytesCodecReadObject{}), )) if s.userProject != "" { ctx = setUserProjectMetadata(ctx, s.userProject) } b := bucketResourceName(globalProjectAlias, params.bucket) req := &storagepb.ReadObjectRequest{ Bucket: b, Object: params.object, CommonObjectRequestParams: toProtoCommonObjectRequestParams(params.encryptionKey), } // The default is a negative value, which means latest. if params.gen >= 0 { req.Generation = params.gen } // Define a function that initiates a Read with offset and length, assuming // we have already read seen bytes. reopen := func(seen int64) (*readStreamResponseReadObject, context.CancelFunc, error) { // If the context has already expired, return immediately without making // we call. if err := ctx.Err(); err != nil { return nil, nil, err } cc, cancel := context.WithCancel(ctx) req.ReadOffset = params.offset + seen // Only set a ReadLimit if length is greater than zero, because <= 0 means // to read it all. if params.length > 0 { req.ReadLimit = params.length - seen } if err := applyCondsProto("gRPCReadObjectReader.reopen", params.gen, params.conds, req); err != nil { cancel() return nil, nil, err } var stream storagepb.Storage_ReadObjectClient var err error var decoder *readObjectResponseDecoder err = run(cc, func(ctx context.Context) error { stream, err = c.raw.ReadObject(ctx, req, s.gax...) if err != nil { return err } // Receive the message into databuf as a wire-encoded message so we can // use a custom decoder to avoid an extra copy at the protobuf layer. databufs := mem.BufferSlice{} err := stream.RecvMsg(&databufs) if err != nil { // NotFound types of errors show up on the Recv call, rather than the // initialization of the stream via ReadObject above. return formatObjectErr(err) } // Use a custom decoder that uses protobuf unmarshalling for all // fields except the object data. Object data is handled separately // to avoid a copy. decoder = &readObjectResponseDecoder{ databufs: databufs, } err = decoder.readFullObjectResponse() return err }, s.retry, s.idempotent) if err != nil { // Close the stream context we just created to ensure we don't leak // resources. cancel() // Free any buffers. if decoder != nil && decoder.databufs != nil { decoder.databufs.Free() } return nil, nil, err } return &readStreamResponseReadObject{stream, decoder}, cancel, nil } res, cancel, err := reopen(0) if err != nil { return nil, err } // The first message was Recv'd on stream open, use it to populate the // object metadata. msg := res.decoder.msg obj := msg.GetMetadata() // This is the size of the entire object, even if only a range was requested. size := obj.GetSize() // Only support checksums when reading an entire object, not a range. var ( wantCRC uint32 checkCRC bool ) if checksums := msg.GetObjectChecksums(); checksums != nil && checksums.Crc32C != nil { if params.offset == 0 && params.length < 0 { checkCRC = true } wantCRC = checksums.GetCrc32C() } metadata := obj.GetMetadata() r = &Reader{ Attrs: ReaderObjectAttrs{ Size: size, ContentType: obj.GetContentType(), ContentEncoding: obj.GetContentEncoding(), CacheControl: obj.GetCacheControl(), LastModified: obj.GetUpdateTime().AsTime(), Metageneration: obj.GetMetageneration(), Generation: obj.GetGeneration(), CRC32C: wantCRC, }, objectMetadata: &metadata, reader: &gRPCReadObjectReader{ stream: res.stream, reopen: reopen, cancel: cancel, size: size, // Preserve the decoder to read out object data when Read/WriteTo is called. currMsg: res.decoder, settings: s, zeroRange: params.length == 0, wantCRC: wantCRC, checkCRC: checkCRC, }, checkCRC: checkCRC, } cr := msg.GetContentRange() if cr != nil { r.Attrs.StartOffset = cr.GetStart() r.remain = cr.GetEnd() - cr.GetStart() } else { r.remain = size } // For a zero-length request, explicitly close the stream and set remaining // bytes to zero. if params.length == 0 { r.remain = 0 r.reader.Close() } return r, nil } type readStreamResponseReadObject struct { stream storagepb.Storage_ReadObjectClient decoder *readObjectResponseDecoder } type gRPCReadObjectReader struct { seen, size int64 zeroRange bool stream storagepb.Storage_ReadObjectClient reopen func(seen int64) (*readStreamResponseReadObject, context.CancelFunc, error) leftovers []byte currMsg *readObjectResponseDecoder // decoder for the current message cancel context.CancelFunc settings *settings checkCRC bool // should we check the CRC? wantCRC uint32 // the CRC32c value the server sent in the header gotCRC uint32 // running crc } // Update the running CRC with the data in the slice, if CRC checking was enabled. func (r *gRPCReadObjectReader) updateCRC(b []byte) { if r.checkCRC { r.gotCRC = crc32.Update(r.gotCRC, crc32cTable, b) } } // Checks whether the CRC matches at the conclusion of a read, if CRC checking was enabled. func (r *gRPCReadObjectReader) runCRCCheck() error { if r.checkCRC && r.gotCRC != r.wantCRC { return fmt.Errorf("storage: bad CRC on read: got %d, want %d", r.gotCRC, r.wantCRC) } return nil } // Read reads bytes into the user's buffer from an open gRPC stream. func (r *gRPCReadObjectReader) Read(p []byte) (int, error) { // The entire object has been read by this reader, check the checksum if // necessary and return EOF. if r.size == r.seen || r.zeroRange { if err := r.runCRCCheck(); err != nil { return 0, err } return 0, io.EOF } // No stream to read from, either never initialized or Close was called. // Note: There is a potential concurrency issue if multiple routines are // using the same reader. One encounters an error and the stream is closed // and then reopened while the other routine attempts to read from it. if r.stream == nil { return 0, fmt.Errorf("storage: reader has been closed") } var n int // If there is data remaining in the current message, return what was // available to conform to the Reader // interface: https://pkg.go.dev/io#Reader. if !r.currMsg.done { n = r.currMsg.readAndUpdateCRC(p, func(b []byte) { r.updateCRC(b) }) r.seen += int64(n) return n, nil } // Attempt to Recv the next message on the stream. // This will update r.currMsg with the decoder for the new message. err := r.recv() if err != nil { return 0, err } // TODO: Determine if we need to capture incremental CRC32C for this // chunk. The Object CRC32C checksum is captured when directed to read // the entire Object. If directed to read a range, we may need to // calculate the range's checksum for verification if the checksum is // present in the response here. // TODO: Figure out if we need to support decompressive transcoding // https://cloud.google.com/storage/docs/transcoding. n = r.currMsg.readAndUpdateCRC(p, func(b []byte) { r.updateCRC(b) }) r.seen += int64(n) return n, nil } // WriteTo writes all the data requested by the Reader into w, implementing // io.WriterTo. func (r *gRPCReadObjectReader) WriteTo(w io.Writer) (int64, error) { // The entire object has been read by this reader, check the checksum if // necessary and return nil. if r.size == r.seen || r.zeroRange { if err := r.runCRCCheck(); err != nil { return 0, err } return 0, nil } // No stream to read from, either never initialized or Close was called. // Note: There is a potential concurrency issue if multiple routines are // using the same reader. One encounters an error and the stream is closed // and then reopened while the other routine attempts to read from it. if r.stream == nil { return 0, fmt.Errorf("storage: reader has been closed") } // Track bytes written during before call. var alreadySeen = r.seen // Write any already received message to the stream. There will be some leftovers from the // original NewRangeReaderReadObject call. if r.currMsg != nil && !r.currMsg.done { written, err := r.currMsg.writeToAndUpdateCRC(w, func(b []byte) { r.updateCRC(b) }) r.seen += int64(written) r.currMsg = nil if err != nil { return r.seen - alreadySeen, err } } // Loop and receive additional messages until the entire data is written. for { // Attempt to receive the next message on the stream. // Will terminate with io.EOF once data has all come through. // recv() handles stream reopening and retry logic so no need for retries here. err := r.recv() if err != nil { if err == io.EOF { // We are done; check the checksum if necessary and return. err = r.runCRCCheck() } return r.seen - alreadySeen, err } // TODO: Determine if we need to capture incremental CRC32C for this // chunk. The Object CRC32C checksum is captured when directed to read // the entire Object. If directed to read a range, we may need to // calculate the range's checksum for verification if the checksum is // present in the response here. // TODO: Figure out if we need to support decompressive transcoding // https://cloud.google.com/storage/docs/transcoding. written, err := r.currMsg.writeToAndUpdateCRC(w, func(b []byte) { r.updateCRC(b) }) r.seen += int64(written) if err != nil { return r.seen - alreadySeen, err } } } // Close cancels the read stream's context in order for it to be closed and // collected, and frees any currently in use buffers. func (r *gRPCReadObjectReader) Close() error { if r.cancel != nil { r.cancel() } r.stream = nil r.currMsg = nil return nil } // recv attempts to Recv the next message on the stream and extract the object // data that it contains. In the event that a retryable error is encountered, // the stream will be closed, reopened, and RecvMsg again. // This will attempt to Recv until one of the following is true: // // * Recv is successful // * A non-retryable error is encountered // * The Reader's context is canceled // // The last error received is the one that is returned, which could be from // an attempt to reopen the stream. func (r *gRPCReadObjectReader) recv() error { databufs := mem.BufferSlice{} err := r.stream.RecvMsg(&databufs) if err != nil && r.settings.retry.runShouldRetry(err) { // This will "close" the existing stream and immediately attempt to // reopen the stream, but will backoff if further attempts are necessary. // Reopening the stream Recvs the first message, so if retrying is // successful, r.currMsg will be updated to include the new data. return r.reopenStream() } if err != nil { return err } r.currMsg = &readObjectResponseDecoder{databufs: databufs} return r.currMsg.readFullObjectResponse() } // ReadObjectResponse field and subfield numbers. const ( checksummedDataFieldReadObject = protowire.Number(1) checksummedDataContentFieldReadObject = protowire.Number(1) checksummedDataCRC32CFieldReadObject = protowire.Number(2) objectChecksumsFieldReadObject = protowire.Number(2) contentRangeFieldReadObject = protowire.Number(3) metadataFieldReadObject = protowire.Number(4) ) // readObjectResponseDecoder is a wrapper on the raw message, used to decode one message // without copying object data. It also has methods to write out the resulting object // data to the user application. type readObjectResponseDecoder struct { databufs mem.BufferSlice // raw bytes of the message being processed // Decoding offsets off uint64 // offset in the messsage relative to the data as a whole currBuf int // index of the current buffer being processed currOff uint64 // offset in the current buffer // Processed data msg *storagepb.ReadObjectResponse // processed response message with all fields other than object data populated dataOffsets bufferSliceOffsetsReadObject // offsets of the object data in the message. done bool // true if the data has been completely read. } type bufferSliceOffsetsReadObject struct { startBuf, endBuf int // indices of start and end buffers of object data in the msg startOff, endOff uint64 // offsets within these buffers where the data starts and ends. currBuf int // index of current buffer being read out to the user application. currOff uint64 // offset of read in current buffer. } // peek ahead 10 bytes from the current offset in the databufs. This will return a // slice of the current buffer if the bytes are all in one buffer, but will copy // the bytes into a new buffer if the distance is split across buffers. Use this // to allow protowire methods to be used to parse tags & fixed values. // The max length of a varint tag is 10 bytes, see // https://protobuf.dev/programming-guides/encoding/#varints . Other int types // are shorter. func (d *readObjectResponseDecoder) peek() []byte { b := d.databufs[d.currBuf].ReadOnlyData() // Check if the tag will fit in the current buffer. If not, copy the next 10 // bytes into a new buffer to ensure that we can read the tag correctly // without it being divided between buffers. tagBuf := b[d.currOff:] remainingInBuf := len(tagBuf) // If we have less than 10 bytes remaining and are not in the final buffer, // copy up to 10 bytes ahead from the next buffer. if remainingInBuf < binary.MaxVarintLen64 && d.currBuf != len(d.databufs)-1 { tagBuf = d.copyNextBytes(10) } return tagBuf } // Copies up to next n bytes into a new buffer, or fewer if fewer bytes remain in the // buffers overall. Does not advance offsets. func (d *readObjectResponseDecoder) copyNextBytes(n int) []byte { remaining := n if r := d.databufs.Len() - int(d.off); r < remaining { remaining = r } currBuf := d.currBuf currOff := d.currOff var buf []byte for remaining > 0 { b := d.databufs[currBuf].ReadOnlyData() remainingInCurr := len(b[currOff:]) if remainingInCurr < remaining { buf = append(buf, b[currOff:]...) remaining -= remainingInCurr currBuf++ currOff = 0 } else { buf = append(buf, b[currOff:currOff+uint64(remaining)]...) remaining = 0 } } return buf } // Advance current buffer & byte offset in the decoding by n bytes. Returns an error if we // go past the end of the data. func (d *readObjectResponseDecoder) advanceOffset(n uint64) error { remaining := n for remaining > 0 { remainingInCurr := uint64(d.databufs[d.currBuf].Len()) - d.currOff if remainingInCurr <= remaining { remaining -= remainingInCurr d.currBuf++ d.currOff = 0 } else { d.currOff += remaining remaining = 0 } } // If we have advanced past the end of the buffers, something went wrong. if (d.currBuf == len(d.databufs) && d.currOff > 0) || d.currBuf > len(d.databufs) { return errors.New("decoding: truncated message, cannot advance offset") } d.off += n return nil } // This copies object data from the message into the buffer and returns the number of // bytes copied. The data offsets are incremented in the message. The updateCRC // function is called on the copied bytes. func (d *readObjectResponseDecoder) readAndUpdateCRC(p []byte, updateCRC func([]byte)) int { // For a completely empty message, just return 0 if len(d.databufs) == 0 { return 0 } databuf := d.databufs[d.dataOffsets.currBuf] startOff := d.dataOffsets.currOff var b []byte if d.dataOffsets.currBuf == d.dataOffsets.endBuf { b = databuf.ReadOnlyData()[startOff:d.dataOffsets.endOff] } else { b = databuf.ReadOnlyData()[startOff:] } n := copy(p, b) updateCRC(b[:n]) d.dataOffsets.currOff += uint64(n) // We've read all the data from this message. Free the underlying buffers. if d.dataOffsets.currBuf == d.dataOffsets.endBuf && d.dataOffsets.currOff == d.dataOffsets.endOff { d.done = true d.databufs.Free() } // We are at the end of the current buffer if d.dataOffsets.currBuf != d.dataOffsets.endBuf && d.dataOffsets.currOff == uint64(databuf.Len()) { d.dataOffsets.currOff = 0 d.dataOffsets.currBuf++ } return n } func (d *readObjectResponseDecoder) writeToAndUpdateCRC(w io.Writer, updateCRC func([]byte)) (int64, error) { // For a completely empty message, just return 0 if len(d.databufs) == 0 { return 0, nil } var written int64 for !d.done { databuf := d.databufs[d.dataOffsets.currBuf] startOff := d.dataOffsets.currOff var b []byte if d.dataOffsets.currBuf == d.dataOffsets.endBuf { b = databuf.ReadOnlyData()[startOff:d.dataOffsets.endOff] } else { b = databuf.ReadOnlyData()[startOff:] } var n int // Write all remaining data from the current buffer n, err := w.Write(b) written += int64(n) updateCRC(b) if err != nil { return written, err } d.dataOffsets.currOff = 0 // We've read all the data from this message. if d.dataOffsets.currBuf == d.dataOffsets.endBuf { d.done = true d.databufs.Free() } else { d.dataOffsets.currBuf++ } } return written, nil } // Consume the next available tag in the input data and return the field number and type. // Advances the relevant offsets in the data. func (d *readObjectResponseDecoder) consumeTag() (protowire.Number, protowire.Type, error) { tagBuf := d.peek() // Consume the next tag. This will tell us which field is next in the // buffer, its type, and how much space it takes up. fieldNum, fieldType, tagLength := protowire.ConsumeTag(tagBuf) if tagLength < 0 { return 0, 0, protowire.ParseError(tagLength) } // Update the offsets and current buffer depending on the tag length. if err := d.advanceOffset(uint64(tagLength)); err != nil { return 0, 0, fmt.Errorf("consuming tag: %w", err) } return fieldNum, fieldType, nil } // Consume a varint that represents the length of a bytes field. Return the length of // the data, and advance the offsets by the length of the varint. func (d *readObjectResponseDecoder) consumeVarint() (uint64, error) { tagBuf := d.peek() // Consume the next tag. This will tell us which field is next in the // buffer, its type, and how much space it takes up. dataLength, tagLength := protowire.ConsumeVarint(tagBuf) if tagLength < 0 { return 0, protowire.ParseError(tagLength) } // Update the offsets and current buffer depending on the tag length. d.advanceOffset(uint64(tagLength)) return dataLength, nil } func (d *readObjectResponseDecoder) consumeFixed32() (uint32, error) { valueBuf := d.peek() // Consume the next tag. This will tell us which field is next in the // buffer, its type, and how much space it takes up. value, tagLength := protowire.ConsumeFixed32(valueBuf) if tagLength < 0 { return 0, protowire.ParseError(tagLength) } // Update the offsets and current buffer depending on the tag length. d.advanceOffset(uint64(tagLength)) return value, nil } func (d *readObjectResponseDecoder) consumeFixed64() (uint64, error) { valueBuf := d.peek() // Consume the next tag. This will tell us which field is next in the // buffer, its type, and how much space it takes up. value, tagLength := protowire.ConsumeFixed64(valueBuf) if tagLength < 0 { return 0, protowire.ParseError(tagLength) } // Update the offsets and current buffer depending on the tag length. d.advanceOffset(uint64(tagLength)) return value, nil } // Consume any field values up to the end offset provided and don't return anything. // This is used to skip any values which are not going to be used. // msgEndOff is indexed in terms of the overall data across all buffers. func (d *readObjectResponseDecoder) consumeFieldValue(fieldNum protowire.Number, fieldType protowire.Type) error { // reimplement protowire.ConsumeFieldValue without the extra case for groups (which // are are complicted and not a thing in proto3). var err error switch fieldType { case protowire.VarintType: _, err = d.consumeVarint() case protowire.Fixed32Type: _, err = d.consumeFixed32() case protowire.Fixed64Type: _, err = d.consumeFixed64() case protowire.BytesType: _, err = d.consumeBytes() default: return fmt.Errorf("unknown field type %v in field %v", fieldType, fieldNum) } if err != nil { return fmt.Errorf("consuming field %v of type %v: %w", fieldNum, fieldType, err) } return nil } // Consume a bytes field from the input. Returns offsets for the data in the buffer slices // and an error. func (d *readObjectResponseDecoder) consumeBytes() (bufferSliceOffsetsReadObject, error) { // m is the length of the data past the tag. m, err := d.consumeVarint() if err != nil { return bufferSliceOffsetsReadObject{}, fmt.Errorf("consuming bytes field: %w", err) } offsets := bufferSliceOffsetsReadObject{ startBuf: d.currBuf, startOff: d.currOff, currBuf: d.currBuf, currOff: d.currOff, } // Advance offsets to lengths of bytes field and capture where we end. d.advanceOffset(m) offsets.endBuf = d.currBuf offsets.endOff = d.currOff return offsets, nil } // Consume a bytes field from the input and copy into a new buffer if // necessary (if the data is split across buffers in databuf). This can be // used to leverage proto.Unmarshal for small bytes fields (i.e. anything // except object data). func (d *readObjectResponseDecoder) consumeBytesCopy() ([]byte, error) { // m is the length of the bytes data. m, err := d.consumeVarint() if err != nil { return nil, fmt.Errorf("consuming varint: %w", err) } // Copy the data into a buffer and advance the offset b := d.copyNextBytes(int(m)) if err := d.advanceOffset(m); err != nil { return nil, fmt.Errorf("advancing offset: %w", err) } return b, nil } // readFullObjectResponse returns the ReadObjectResponse that is encoded in the // wire-encoded message buffer b, or an error if the message is invalid. // This must be used on the first recv of an object as it may contain all fields // of ReadObjectResponse, and we use or pass on those fields to the user. // This function is essentially identical to proto.Unmarshal, except it aliases // the data in the input []byte. If the proto library adds a feature to // Unmarshal that does that, this function can be dropped. func (d *readObjectResponseDecoder) readFullObjectResponse() error { msg := &storagepb.ReadObjectResponse{} // Loop over the entire message, extracting fields as we go. This does not // handle field concatenation, in which the contents of a single field // are split across multiple protobuf tags. for d.off < uint64(d.databufs.Len()) { fieldNum, fieldType, err := d.consumeTag() if err != nil { return fmt.Errorf("consuming next tag: %w", err) } // Unmarshal the field according to its type. Only fields that are not // nil will be present. switch { case fieldNum == checksummedDataFieldReadObject && fieldType == protowire.BytesType: // The ChecksummedData field was found. Initialize the struct. msg.ChecksummedData = &storagepb.ChecksummedData{} bytesFieldLen, err := d.consumeVarint() if err != nil { return fmt.Errorf("consuming bytes: %w", err) } var contentEndOff = d.off + bytesFieldLen for d.off < contentEndOff { gotNum, gotTyp, err := d.consumeTag() if err != nil { return fmt.Errorf("consuming checksummedData tag: %w", err) } switch { case gotNum == checksummedDataContentFieldReadObject && gotTyp == protowire.BytesType: // Get the offsets of the content bytes. d.dataOffsets, err = d.consumeBytes() if err != nil { return fmt.Errorf("invalid ReadObjectResponse.ChecksummedData.Content: %w", err) } case gotNum == checksummedDataCRC32CFieldReadObject && gotTyp == protowire.Fixed32Type: v, err := d.consumeFixed32() if err != nil { return fmt.Errorf("invalid ReadObjectResponse.ChecksummedData.Crc32C: %w", err) } msg.ChecksummedData.Crc32C = &v default: err := d.consumeFieldValue(gotNum, gotTyp) if err != nil { return fmt.Errorf("invalid field in ReadObjectResponse.ChecksummedData: %w", err) } } } case fieldNum == objectChecksumsFieldReadObject && fieldType == protowire.BytesType: // The field was found. Initialize the struct. msg.ObjectChecksums = &storagepb.ObjectChecksums{} // Consume the bytes and copy them into a single buffer if they are split across buffers. buf, err := d.consumeBytesCopy() if err != nil { return fmt.Errorf("invalid ReadObjectResponse.ObjectChecksums: %w", err) } // Unmarshal. if err := proto.Unmarshal(buf, msg.ObjectChecksums); err != nil { return err } case fieldNum == contentRangeFieldReadObject && fieldType == protowire.BytesType: msg.ContentRange = &storagepb.ContentRange{} buf, err := d.consumeBytesCopy() if err != nil { return fmt.Errorf("invalid ReadObjectResponse.ContentRange: %w", err) } if err := proto.Unmarshal(buf, msg.ContentRange); err != nil { return err } case fieldNum == metadataFieldReadObject && fieldType == protowire.BytesType: msg.Metadata = &storagepb.Object{} buf, err := d.consumeBytesCopy() if err != nil { return fmt.Errorf("invalid ReadObjectResponse.Metadata: %w", err) } if err := proto.Unmarshal(buf, msg.Metadata); err != nil { return err } default: err := d.consumeFieldValue(fieldNum, fieldType) if err != nil { return fmt.Errorf("invalid field in ReadObjectResponse: %w", err) } } } d.msg = msg return nil } // reopenStream "closes" the existing stream and attempts to reopen a stream and // sets the Reader's stream and cancelStream properties in the process. func (r *gRPCReadObjectReader) reopenStream() error { // Close existing stream and initialize new stream with updated offset. r.Close() res, cancel, err := r.reopen(r.seen) if err != nil { return err } r.stream = res.stream r.currMsg = res.decoder r.cancel = cancel return nil } ================================================ FILE: vendor/cloud.google.com/go/storage/grpc_reader_multi_range.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import "sync" // readIDGenerator generates unique read IDs for multi-range reads. // Call readIDGenerator.Next to get the next ID. Safe to be called concurrently. type readIDGenerator struct { initOnce sync.Once nextID chan int64 // do not use this field directly } func (g *readIDGenerator) init() { g.nextID = make(chan int64, 1) g.nextID <- 1 } // Next returns the Next read ID. It initializes the readIDGenerator if needed. func (g *readIDGenerator) Next() int64 { g.initOnce.Do(g.init) id := <-g.nextID n := id + 1 g.nextID <- n return id } ================================================ FILE: vendor/cloud.google.com/go/storage/grpc_writer.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "errors" "fmt" "io" "net/url" "time" gapic "cloud.google.com/go/storage/internal/apiv2" "cloud.google.com/go/storage/internal/apiv2/storagepb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/googleapi" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" ) const ( // defaultWriteChunkRetryDeadline is the default deadline for the upload // of a single chunk. It can be overwritten by Writer.ChunkRetryDeadline. defaultWriteChunkRetryDeadline = 32 * time.Second // maxPerMessageWriteSize is the maximum amount of content that can be sent // per WriteObjectRequest message. A buffer reaching this amount will // precipitate a flush of the buffer. It is only used by the gRPC Writer // implementation. maxPerMessageWriteSize int = int(storagepb.ServiceConstants_MAX_WRITE_CHUNK_BYTES) ) func withBidiWriteObjectRedirectionErrorRetries(s *settings) (newr *retryConfig) { oldr := s.retry newr = oldr.clone() if newr == nil { newr = &retryConfig{} } if (oldr.policy == RetryIdempotent && !s.idempotent) || oldr.policy == RetryNever { // We still retry redirection errors even when settings indicate not to // retry. // // The protocol requires us to respect redirection errors, so RetryNever has // to ignore them. // // Idempotency is always protected by redirection errors: they either // contain a handle which can be used as idempotency information, or they do // not contain a handle and are "affirmative failures" which indicate that // no server-side action occurred. newr.policy = RetryAlways newr.shouldRetry = func(err error) bool { return errors.Is(err, bidiWriteObjectRedirectionError{}) } return newr } // If retry settings allow retries normally, fall back to that behavior. newr.shouldRetry = func(err error) bool { if errors.Is(err, bidiWriteObjectRedirectionError{}) { return true } v := oldr.runShouldRetry(err) return v } return newr } func (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storageOption) (*io.PipeWriter, error) { var offset int64 errorf := params.setError setObj := params.setObj setFlush := params.setFlush pr, pw := io.Pipe() s := callSettings(c.settings, opts...) retryDeadline := defaultWriteChunkRetryDeadline if params.chunkRetryDeadline != 0 { retryDeadline = params.chunkRetryDeadline } if s.retry == nil { s.retry = defaultRetry.clone() } if params.append { s.retry = withBidiWriteObjectRedirectionErrorRetries(s) } s.retry.maxRetryDuration = retryDeadline // Set Flush func for use by exported Writer.Flush. var gw *gRPCWriter setFlush(func() (int64, error) { return gw.flush() }) gw, err := newGRPCWriter(c, s, params, pr, pr, pw, params.setPipeWriter) if err != nil { errorf(err) pr.CloseWithError(err) close(params.donec) return nil, err } var o *storagepb.Object // If we are taking over an appendable object, send the first message here // to get the append offset. if params.appendGen > 0 { // Create the buffer sender. This opens a stream and blocks until we // get a response that tells us what offset to write from. wbs, err := gw.newGRPCAppendTakeoverWriteBufferSender(params.ctx) if err != nil { return nil, fmt.Errorf("storage: creating buffer sender: %w", err) } // Propagate append offset to caller and buffer sending logic below. params.setTakeoverOffset(wbs.takeoverOffset) offset = wbs.takeoverOffset gw.streamSender = wbs o = wbs.objResource setObj(newObjectFromProto(o)) } // This function reads the data sent to the pipe and sends sets of messages // on the gRPC client-stream as the buffer is filled. go func() { err := func() error { // Unless the user told us the content type, we have to determine it from // the first read. if params.attrs.ContentType == "" && !params.forceEmptyContentType { gw.reader, gw.spec.Resource.ContentType = gax.DetermineContentType(gw.reader) } // Loop until there is an error or the Object has been finalized. for { // Note: This blocks until either the buffer is full or EOF is read. recvd, doneReading, err := gw.read() if err != nil { return err } uploadBuff := func(ctx context.Context) error { obj, err := gw.uploadBuffer(ctx, recvd, offset, doneReading) if obj != nil { o = obj setObj(newObjectFromProto(o)) } return err } // Add routing headers to the context metadata for single-shot and resumable // writes. Append writes need to set this at a lower level to pass the routing // token. bctx := gw.ctx if !gw.append { bctx = bucketContext(bctx, gw.bucket) } err = run(bctx, uploadBuff, gw.settings.retry, s.idempotent) offset += int64(recvd) // If this buffer upload was triggered by a flush, reset and // communicate back the result. if gw.flushInProgress { gw.setSize(offset) gw.flushInProgress = false gw.flushComplete <- flushResult{offset: offset, err: err} } if err != nil { return err } // When we are done reading data without errors, set the object and // finish. if doneReading { // Build Object from server's response. setObj(newObjectFromProto(o)) return nil } } }() // These calls are still valid if err is nil err = checkCanceled(err) errorf(err) gw.pr.CloseWithError(err) close(params.donec) }() return pw, nil } func newGRPCWriter(c *grpcStorageClient, s *settings, params *openWriterParams, r io.Reader, pr *io.PipeReader, pw *io.PipeWriter, setPipeWriter func(*io.PipeWriter)) (*gRPCWriter, error) { if params.attrs.Retention != nil { // TO-DO: remove once ObjectRetention is available - see b/308194853 return nil, status.Errorf(codes.Unimplemented, "storage: object retention is not supported in gRPC") } size := googleapi.MinUploadChunkSize // A completely bufferless upload (params.chunkSize <= 0) is not possible in // gRPC because the buffer must be provided to the message. Use the minimum // size possible. if params.chunkSize > 0 { size = params.chunkSize } // Round up chunksize to nearest 256KiB if size%googleapi.MinUploadChunkSize != 0 { size += googleapi.MinUploadChunkSize - (size % googleapi.MinUploadChunkSize) } if s.userProject != "" { params.ctx = setUserProjectMetadata(params.ctx, s.userProject) } spec := &storagepb.WriteObjectSpec{ Resource: params.attrs.toProtoObject(params.bucket), Appendable: proto.Bool(params.append), } var appendSpec *storagepb.AppendObjectSpec if params.appendGen > 0 { appendSpec = &storagepb.AppendObjectSpec{ Bucket: bucketResourceName(globalProjectAlias, params.bucket), Object: params.attrs.Name, Generation: params.appendGen, } } // WriteObject doesn't support the generation condition, so use default. if err := applyCondsProto("WriteObject", defaultGen, params.conds, spec); err != nil { return nil, err } return &gRPCWriter{ buf: make([]byte, size), c: c, ctx: params.ctx, reader: r, pw: pw, pr: pr, bucket: params.bucket, attrs: params.attrs, conds: params.conds, spec: spec, appendSpec: appendSpec, encryptionKey: params.encryptionKey, settings: s, progress: params.progress, setSize: params.setSize, sendCRC32C: params.sendCRC32C, forceOneShot: params.chunkSize <= 0, forceEmptyContentType: params.forceEmptyContentType, append: params.append, finalizeOnClose: params.finalizeOnClose, setPipeWriter: setPipeWriter, flushComplete: make(chan flushResult), }, nil } // gRPCWriter is a wrapper around the the gRPC client-stream API that manages // sending chunks of data provided by the user over the stream. type gRPCWriter struct { c *grpcStorageClient buf []byte reader io.Reader pr *io.PipeReader // Keep track of pr and pw to update post-flush pw *io.PipeWriter setPipeWriter func(*io.PipeWriter) // used to set in parent storage.Writer ctx context.Context bucket string attrs *ObjectAttrs conds *Conditions spec *storagepb.WriteObjectSpec appendSpec *storagepb.AppendObjectSpec encryptionKey []byte settings *settings progress func(int64) setSize func(int64) sendCRC32C bool forceOneShot bool forceEmptyContentType bool append bool finalizeOnClose bool streamSender gRPCBidiWriteBufferSender flushInProgress bool // true when the pipe is being recreated for a flush. flushComplete chan flushResult // use to signal back to flush call that flush to server was completed. } type flushResult struct { err error offset int64 } func bucketContext(ctx context.Context, bucket string) context.Context { hds := []string{"x-goog-request-params", fmt.Sprintf("bucket=projects/_/buckets/%s", url.QueryEscape(bucket))} return gax.InsertMetadataIntoOutgoingContext(ctx, hds...) } // drainInboundStream calls stream.Recv() repeatedly until an error is returned. // It returns the last Resource received on the stream, or nil if no Resource // was returned. drainInboundStream always returns a non-nil error. io.EOF // indicates all messages were successfully read. func drainInboundStream(stream storagepb.Storage_BidiWriteObjectClient) (object *storagepb.Object, err error) { for err == nil { var resp *storagepb.BidiWriteObjectResponse resp, err = stream.Recv() // GetResource() returns nil on a nil response if resp.GetResource() != nil { object = resp.GetResource() } } return object, err } func bidiWriteObjectRequest(buf []byte, offset int64, flush, finishWrite bool) *storagepb.BidiWriteObjectRequest { var data *storagepb.BidiWriteObjectRequest_ChecksummedData if buf != nil { data = &storagepb.BidiWriteObjectRequest_ChecksummedData{ ChecksummedData: &storagepb.ChecksummedData{ Content: buf, }, } } req := &storagepb.BidiWriteObjectRequest{ Data: data, WriteOffset: offset, FinishWrite: finishWrite, Flush: flush, StateLookup: flush, } return req } type gRPCBidiWriteBufferSender interface { // sendBuffer implementations should upload buf, respecting flush and // finishWrite. Callers must guarantee that buf is not too long to fit in a // gRPC message. // // If flush is true, implementations must not return until the data in buf is // stable. If finishWrite is true, implementations must return the object on // success. sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (*storagepb.Object, error) } type gRPCOneshotBidiWriteBufferSender struct { firstMessage *storagepb.BidiWriteObjectRequest raw *gapic.Client stream storagepb.Storage_BidiWriteObjectClient settings *settings } func (w *gRPCWriter) newGRPCOneshotBidiWriteBufferSender() (*gRPCOneshotBidiWriteBufferSender, error) { firstMessage := &storagepb.BidiWriteObjectRequest{ FirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{ WriteObjectSpec: w.spec, }, CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey), // For a non-resumable upload, checksums must be sent in this message. // TODO: Currently the checksums are only sent on the first message // of the stream, but in the future, we must also support sending it // on the *last* message of the stream (instead of the first). ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), } return &gRPCOneshotBidiWriteBufferSender{ firstMessage: firstMessage, raw: w.c.raw, settings: w.settings, }, nil } func (s *gRPCOneshotBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) { var firstMessage *storagepb.BidiWriteObjectRequest if s.stream == nil { s.stream, err = s.raw.BidiWriteObject(ctx, s.settings.gax...) if err != nil { return } firstMessage = s.firstMessage } req := bidiWriteObjectRequest(buf, offset, flush, finishWrite) if firstMessage != nil { proto.Merge(req, firstMessage) } sendErr := s.stream.Send(req) if sendErr != nil { obj, err = drainInboundStream(s.stream) s.stream = nil if sendErr != io.EOF { err = sendErr } return } // Oneshot uploads assume all flushes succeed if finishWrite { s.stream.CloseSend() // Oneshot uploads only read from the response stream on completion or // failure obj, err = drainInboundStream(s.stream) s.stream = nil if err == io.EOF { err = nil } } return } type gRPCResumableBidiWriteBufferSender struct { queryRetry *retryConfig upid string progress func(int64) raw *gapic.Client forceFirstMessage bool stream storagepb.Storage_BidiWriteObjectClient flushOffset int64 settings *settings } func (w *gRPCWriter) newGRPCResumableBidiWriteBufferSender(ctx context.Context) (*gRPCResumableBidiWriteBufferSender, error) { req := &storagepb.StartResumableWriteRequest{ WriteObjectSpec: w.spec, CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey), // TODO: Currently the checksums are only sent on the request to initialize // the upload, but in the future, we must also support sending it // on the *last* message of the stream. ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), } var upid string err := run(ctx, func(ctx context.Context) error { upres, err := w.c.raw.StartResumableWrite(ctx, req, w.settings.gax...) upid = upres.GetUploadId() return err }, w.settings.retry, w.settings.idempotent) if err != nil { return nil, err } // Set up an initial connection for the 0 offset, so we don't query state // unnecessarily for the first buffer. If we fail, we'll just retry in the // normal connect path. stream, err := w.c.raw.BidiWriteObject(ctx, w.settings.gax...) if err != nil { stream = nil } return &gRPCResumableBidiWriteBufferSender{ queryRetry: w.settings.retry, upid: upid, progress: w.progress, raw: w.c.raw, forceFirstMessage: true, stream: stream, settings: w.settings, }, nil } // queryProgress is a helper that queries the status of the resumable upload // associated with the given upload ID. func (s *gRPCResumableBidiWriteBufferSender) queryProgress(ctx context.Context) (int64, error) { var persistedSize int64 err := run(ctx, func(ctx context.Context) error { q, err := s.raw.QueryWriteStatus(ctx, &storagepb.QueryWriteStatusRequest{ UploadId: s.upid, }, s.settings.gax...) // q.GetPersistedSize() will return 0 if q is nil. persistedSize = q.GetPersistedSize() return err }, s.queryRetry, true) return persistedSize, err } func (s *gRPCResumableBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) { if s.stream == nil { // Determine offset and reconnect s.flushOffset, err = s.queryProgress(ctx) if err != nil { return } s.stream, err = s.raw.BidiWriteObject(ctx, s.settings.gax...) if err != nil { return } s.forceFirstMessage = true } // clean up buf. We'll still write the message if a flush/finishWrite was // requested. if offset < s.flushOffset { trim := s.flushOffset - offset if int64(len(buf)) <= trim { trim = int64(len(buf)) } buf = buf[trim:] offset += trim } if len(buf) == 0 && !flush && !finishWrite { // no need to send anything return nil, nil } req := bidiWriteObjectRequest(buf, offset, flush, finishWrite) if s.forceFirstMessage { req.FirstMessage = &storagepb.BidiWriteObjectRequest_UploadId{UploadId: s.upid} s.forceFirstMessage = false } sendErr := s.stream.Send(req) if sendErr != nil { obj, err = drainInboundStream(s.stream) s.stream = nil if err == io.EOF { // This is unexpected - we got an error on Send(), but not on Recv(). // Bubble up the sendErr. err = sendErr } return } if finishWrite { s.stream.CloseSend() obj, err = drainInboundStream(s.stream) s.stream = nil if err == io.EOF { err = nil if obj.GetSize() > s.flushOffset { s.progress(obj.GetSize()) } } return } if flush { resp, err := s.stream.Recv() if err != nil { return nil, err } persistedOffset := resp.GetPersistedSize() if persistedOffset > s.flushOffset { s.flushOffset = persistedOffset s.progress(s.flushOffset) } } return } // uploadBuffer uploads the buffer at the given offset using a bi-directional // Write stream. It will open a new stream if necessary (on the first call or // after resuming from failure) and chunk the buffer per maxPerMessageWriteSize. // The final Object is returned on success if doneReading is true. // // Returns object and any error that is not retriable. func (w *gRPCWriter) uploadBuffer(ctx context.Context, recvd int, start int64, doneReading bool) (obj *storagepb.Object, err error) { if w.streamSender == nil { if w.append { // Appendable object semantics w.streamSender, err = w.newGRPCAppendableObjectBufferSender() } else if doneReading || w.forceOneShot { // One shot semantics w.streamSender, err = w.newGRPCOneshotBidiWriteBufferSender() } else { // Resumable write semantics w.streamSender, err = w.newGRPCResumableBidiWriteBufferSender(ctx) } if err != nil { return } } data := w.buf[:recvd] offset := start // We want to go through this loop at least once, in case we have to // finishWrite with an empty buffer. for { // Send as much as we can fit into a single gRPC message. Only flush once, // when sending the very last message. l := maxPerMessageWriteSize flush := false if len(data) <= l { l = len(data) flush = true } obj, err = w.streamSender.sendBuffer(ctx, data[:l], offset, flush, flush && doneReading) if err != nil { return nil, err } data = data[l:] offset += int64(l) if len(data) == 0 { // Update object size to match persisted offset. if obj != nil { obj.Size = offset } break } } return } // read copies the data in the reader to the given buffer and reports how much // data was read into the buffer and if there is no more data to read (EOF). // read returns when either 1. the buffer is full, 2. Writer.Flush was called, // or 3. Writer.Close was called. func (w *gRPCWriter) read() (int, bool, error) { // Set n to -1 to start the Read loop. var n, recvd int = -1, 0 var err error for err == nil && n != 0 { // The routine blocks here until data is received. n, err = w.reader.Read(w.buf[recvd:]) recvd += n } var done bool if err == io.EOF { err = nil // EOF can come from Writer.Flush or Writer.Close. if w.flushInProgress { // Reset pipe for additional writes after the flush. pr, pw := io.Pipe() w.reader = pr w.pw = pw w.pr = pr w.setPipeWriter(pw) } else { done = true } } return recvd, done, err } // flush flushes the current buffer regardless of whether it is full or not. // It's the implementation for Writer.Flush. func (w *gRPCWriter) flush() (int64, error) { if !w.append { return 0, errors.New("Flush is supported only if Writer.Append is set to true") } // Close PipeWriter to trigger EOF on read side of the stream. w.flushInProgress = true w.pw.Close() // Wait for flush to complete result := <-w.flushComplete return result.offset, result.err } func checkCanceled(err error) error { if status.Code(err) == codes.Canceled { return context.Canceled } return err } type gRPCAppendBidiWriteBufferSender struct { bucket string routingToken *string raw *gapic.Client settings *settings stream storagepb.Storage_BidiWriteObjectClient firstMessage *storagepb.BidiWriteObjectRequest objectChecksums *storagepb.ObjectChecksums finalizeOnClose bool forceFirstMessage bool progress func(int64) flushOffset int64 takeoverOffset int64 objResource *storagepb.Object // Captures received obj to set w.Attrs. // Fields used to report responses from the receive side of the stream // recvs is closed when the current recv goroutine is complete. recvErr is set // to the result of that stream (including io.EOF to indicate success) recvs <-chan *storagepb.BidiWriteObjectResponse recvErr error } // Use for a newly created appendable object. func (w *gRPCWriter) newGRPCAppendableObjectBufferSender() (*gRPCAppendBidiWriteBufferSender, error) { s := &gRPCAppendBidiWriteBufferSender{ bucket: w.spec.GetResource().GetBucket(), raw: w.c.raw, settings: w.settings, firstMessage: &storagepb.BidiWriteObjectRequest{ FirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{ WriteObjectSpec: w.spec, }, CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey), }, objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), finalizeOnClose: w.finalizeOnClose, forceFirstMessage: true, progress: w.progress, } return s, nil } // Use for a takeover of an appendable object. // Unlike newGRPCAppendableObjectBufferSender, this blocks until the stream is // open because it needs to get the append offset from the server. func (w *gRPCWriter) newGRPCAppendTakeoverWriteBufferSender(ctx context.Context) (*gRPCAppendBidiWriteBufferSender, error) { s := &gRPCAppendBidiWriteBufferSender{ bucket: w.spec.GetResource().GetBucket(), raw: w.c.raw, settings: w.settings, firstMessage: &storagepb.BidiWriteObjectRequest{ FirstMessage: &storagepb.BidiWriteObjectRequest_AppendObjectSpec{ AppendObjectSpec: w.appendSpec, }, }, objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs), finalizeOnClose: w.finalizeOnClose, forceFirstMessage: true, progress: w.progress, } if err := s.connect(ctx); err != nil { return nil, fmt.Errorf("storage: opening appendable write stream: %w", err) } _, err := s.sendOnConnectedStream(nil, 0, false, false, true) if err != nil { return nil, err } firstResp := <-s.recvs // Check recvErr after getting the response. if s.recvErr != nil { return nil, s.recvErr } // Object resource is returned in the first response on takeover, so capture // this now. s.objResource = firstResp.GetResource() s.takeoverOffset = firstResp.GetResource().GetSize() return s, nil } func (s *gRPCAppendBidiWriteBufferSender) connect(ctx context.Context) (err error) { err = func() error { // If this is a forced first message, we've already determined it's safe to // send. if s.forceFirstMessage { s.forceFirstMessage = false return nil } // It's always ok to reconnect if there is a handle. This is the common // case. if s.firstMessage.GetAppendObjectSpec().GetWriteHandle() != nil { return nil } // Also always okay to reconnect if there is a generation. if s.firstMessage.GetAppendObjectSpec().GetGeneration() != 0 { return nil } // Also always ok to reconnect if we've seen a redirect token if s.routingToken != nil { return nil } // We can also reconnect if the first message has an if_generation_match or // if_metageneration_match condition. Note that negative conditions like // if_generation_not_match are not necessarily safe to retry. aos := s.firstMessage.GetAppendObjectSpec() wos := s.firstMessage.GetWriteObjectSpec() if aos != nil && aos.IfMetagenerationMatch != nil { return nil } if wos != nil && wos.IfGenerationMatch != nil { return nil } if wos != nil && wos.IfMetagenerationMatch != nil { return nil } // Otherwise, it is not safe to reconnect. return errors.New("cannot safely reconnect; no write handle or preconditions") }() if err != nil { return err } return s.startReceiver(ctx) } func (s *gRPCAppendBidiWriteBufferSender) withRequestParams(ctx context.Context) context.Context { param := fmt.Sprintf("appendable=true&bucket=%s", s.bucket) if s.routingToken != nil { param = param + fmt.Sprintf("&routing_token=%s", *s.routingToken) } return gax.InsertMetadataIntoOutgoingContext(ctx, "x-goog-request-params", param) } func (s *gRPCAppendBidiWriteBufferSender) startReceiver(ctx context.Context) (err error) { s.stream, err = s.raw.BidiWriteObject(s.withRequestParams(ctx), s.settings.gax...) if err != nil { return } recvs := make(chan *storagepb.BidiWriteObjectResponse) s.recvs = recvs s.recvErr = nil go s.receiveMessages(recvs) return } func (s *gRPCAppendBidiWriteBufferSender) ensureFirstMessageAppendObjectSpec() { if s.firstMessage.GetWriteObjectSpec() != nil { w := s.firstMessage.GetWriteObjectSpec() s.firstMessage.FirstMessage = &storagepb.BidiWriteObjectRequest_AppendObjectSpec{ AppendObjectSpec: &storagepb.AppendObjectSpec{ Bucket: w.GetResource().GetBucket(), Object: w.GetResource().GetName(), IfMetagenerationMatch: w.IfMetagenerationMatch, IfMetagenerationNotMatch: w.IfMetagenerationNotMatch, }, } } } func (s *gRPCAppendBidiWriteBufferSender) maybeUpdateFirstMessage(resp *storagepb.BidiWriteObjectResponse) { // Any affirmative response should switch us to an AppendObjectSpec. s.ensureFirstMessageAppendObjectSpec() if r := resp.GetResource(); r != nil { aos := s.firstMessage.GetAppendObjectSpec() aos.Bucket = r.GetBucket() aos.Object = r.GetName() aos.Generation = r.GetGeneration() } if h := resp.GetWriteHandle(); h != nil { s.firstMessage.GetAppendObjectSpec().WriteHandle = h } } type bidiWriteObjectRedirectionError struct{} func (e bidiWriteObjectRedirectionError) Error() string { return "" } func (s *gRPCAppendBidiWriteBufferSender) handleRedirectionError(e *storagepb.BidiWriteObjectRedirectedError) bool { if e.RoutingToken == nil { // This shouldn't happen, but we don't want to blindly retry here. Instead, // surface the error to the caller. return false } if e.WriteHandle != nil { // If we get back a write handle, we should use it. We can only use it // on an append object spec. s.ensureFirstMessageAppendObjectSpec() s.firstMessage.GetAppendObjectSpec().WriteHandle = e.WriteHandle // Generation is meant to only come with the WriteHandle, so ignore it // otherwise. if e.Generation != nil { s.firstMessage.GetAppendObjectSpec().Generation = e.GetGeneration() } } s.routingToken = e.RoutingToken return true } func (s *gRPCAppendBidiWriteBufferSender) receiveMessages(resps chan<- *storagepb.BidiWriteObjectResponse) { resp, err := s.stream.Recv() for err == nil { s.maybeUpdateFirstMessage(resp) if resp.WriteStatus != nil { // We only get a WriteStatus if this was a solicited message (either // state_lookup: true or finish_write: true). Unsolicited messages may // arrive to update our handle if necessary. We don't want to block on // this channel write if this was an unsolicited message. resps <- resp } resp, err = s.stream.Recv() } if st, ok := status.FromError(err); ok && st.Code() == codes.Aborted { for _, d := range st.Details() { if e, ok := d.(*storagepb.BidiWriteObjectRedirectedError); ok { // If we can handle this error, wrap it with the sentinel so it gets // retried. if ok := s.handleRedirectionError(e); ok { err = fmt.Errorf("%w%w", bidiWriteObjectRedirectionError{}, err) } } } } // TODO: automatically reconnect on retriable recv errors, even if there are // no sends occurring. s.recvErr = err close(resps) } func (s *gRPCAppendBidiWriteBufferSender) sendOnConnectedStream(buf []byte, offset int64, flush, finishWrite, sendFirstMessage bool) (obj *storagepb.Object, err error) { var req *storagepb.BidiWriteObjectRequest finalizeObject := finishWrite && s.finalizeOnClose if finishWrite { // Always flush when finishing the Write, even if not finalizing. req = bidiWriteObjectRequest(buf, offset, true, finalizeObject) } else { req = bidiWriteObjectRequest(buf, offset, flush, false) } if finalizeObject { // appendable objects pass checksums on the finalize message only req.ObjectChecksums = s.objectChecksums } if sendFirstMessage { proto.Merge(req, s.firstMessage) } if err = s.stream.Send(req); err != nil { return nil, err } if finishWrite { s.stream.CloseSend() for resp := range s.recvs { if resp.GetResource() != nil { obj = resp.GetResource() } // When closing the stream, update the object resource to reflect // the persisted size. We get a new object from the stream if // the object was finalized, but not if it's unfinalized. if s.objResource != nil && resp.GetPersistedSize() > 0 { s.objResource.Size = resp.GetPersistedSize() } } if s.recvErr != io.EOF { return nil, s.recvErr } if obj.GetSize() > s.flushOffset { s.flushOffset = obj.GetSize() s.progress(s.flushOffset) } return } if flush { // We don't necessarily expect multiple responses for a single flush, but // this allows the server to send multiple responses if it wants to. flushOffset := s.flushOffset // Await a response on the stream. Loop at least once or until the // persisted offset matches the flush offset. for { resp, ok := <-s.recvs if !ok { return nil, s.recvErr } pSize := resp.GetPersistedSize() rSize := resp.GetResource().GetSize() if flushOffset < pSize { flushOffset = pSize } if flushOffset < rSize { flushOffset = rSize } // On the first flush, we expect to get an object resource back and // should return it. if resp.GetResource() != nil { obj = resp.GetResource() } if flushOffset <= offset+int64(len(buf)) { break } } if s.flushOffset < flushOffset { s.flushOffset = flushOffset s.progress(s.flushOffset) } } return } func (s *gRPCAppendBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) { for { sendFirstMessage := false if s.stream == nil { sendFirstMessage = true if err = s.connect(ctx); err != nil { return } } obj, err = s.sendOnConnectedStream(buf, offset, flush, finishWrite, sendFirstMessage) if obj != nil { s.objResource = obj } if err == nil { return } // await recv stream termination for range s.recvs { } if s.recvErr != io.EOF { err = s.recvErr } s.stream = nil return } } ================================================ FILE: vendor/cloud.google.com/go/storage/hmac.go ================================================ // Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "errors" "fmt" "time" "google.golang.org/api/iterator" raw "google.golang.org/api/storage/v1" ) // HMACState is the state of the HMAC key. type HMACState string const ( // Active is the status for an active key that can be used to sign // requests. Active HMACState = "ACTIVE" // Inactive is the status for an inactive key thus requests signed by // this key will be denied. Inactive HMACState = "INACTIVE" // Deleted is the status for a key that is deleted. // Once in this state the key cannot key cannot be recovered // and does not count towards key limits. Deleted keys will be cleaned // up later. Deleted HMACState = "DELETED" ) // HMACKey is the representation of a Google Cloud Storage HMAC key. // // HMAC keys are used to authenticate signed access to objects. To enable HMAC key // authentication, please visit https://cloud.google.com/storage/docs/migrating. type HMACKey struct { // The HMAC's secret key. Secret string // AccessID is the ID of the HMAC key. AccessID string // Etag is the HTTP/1.1 Entity tag. Etag string // ID is the ID of the HMAC key, including the ProjectID and AccessID. ID string // ProjectID is the ID of the project that owns the // service account to which the key authenticates. ProjectID string // ServiceAccountEmail is the email address // of the key's associated service account. ServiceAccountEmail string // CreatedTime is the creation time of the HMAC key. CreatedTime time.Time // UpdatedTime is the last modification time of the HMAC key metadata. UpdatedTime time.Time // State is the state of the HMAC key. // It can be one of StateActive, StateInactive or StateDeleted. State HMACState } // HMACKeyHandle helps provide access and management for HMAC keys. type HMACKeyHandle struct { projectID string accessID string retry *retryConfig tc storageClient } // HMACKeyHandle creates a handle that will be used for HMACKey operations. func (c *Client) HMACKeyHandle(projectID, accessID string) *HMACKeyHandle { return &HMACKeyHandle{ projectID: projectID, accessID: accessID, retry: c.retry, tc: c.tc, } } // Get invokes an RPC to retrieve the HMAC key referenced by the // HMACKeyHandle's accessID. // // Options such as UserProjectForHMACKeys can be used to set the // userProject to be billed against for operations. // Note: gRPC is not supported. func (hkh *HMACKeyHandle) Get(ctx context.Context, opts ...HMACKeyOption) (*HMACKey, error) { desc := new(hmacKeyDesc) for _, opt := range opts { opt.withHMACKeyDesc(desc) } o := makeStorageOpts(true, hkh.retry, desc.userProjectID) hk, err := hkh.tc.GetHMACKey(ctx, hkh.projectID, hkh.accessID, o...) return hk, err } // Delete invokes an RPC to delete the key referenced by accessID, on Google Cloud Storage. // Only inactive HMAC keys can be deleted. // After deletion, a key cannot be used to authenticate requests. // Note: gRPC is not supported. func (hkh *HMACKeyHandle) Delete(ctx context.Context, opts ...HMACKeyOption) error { desc := new(hmacKeyDesc) for _, opt := range opts { opt.withHMACKeyDesc(desc) } o := makeStorageOpts(true, hkh.retry, desc.userProjectID) return hkh.tc.DeleteHMACKey(ctx, hkh.projectID, hkh.accessID, o...) } func toHMACKeyFromRaw(hk *raw.HmacKey, updatedTimeCanBeNil bool) (*HMACKey, error) { hkmd := hk.Metadata if hkmd == nil { return nil, errors.New("field Metadata cannot be nil") } createdTime, err := time.Parse(time.RFC3339, hkmd.TimeCreated) if err != nil { return nil, fmt.Errorf("field CreatedTime: %w", err) } updatedTime, err := time.Parse(time.RFC3339, hkmd.Updated) if err != nil && !updatedTimeCanBeNil { return nil, fmt.Errorf("field UpdatedTime: %w", err) } hmKey := &HMACKey{ AccessID: hkmd.AccessId, Secret: hk.Secret, Etag: hkmd.Etag, ID: hkmd.Id, State: HMACState(hkmd.State), ProjectID: hkmd.ProjectId, CreatedTime: createdTime, UpdatedTime: updatedTime, ServiceAccountEmail: hkmd.ServiceAccountEmail, } return hmKey, nil } // CreateHMACKey invokes an RPC for Google Cloud Storage to create a new HMACKey. // Note: gRPC is not supported. func (c *Client) CreateHMACKey(ctx context.Context, projectID, serviceAccountEmail string, opts ...HMACKeyOption) (*HMACKey, error) { if projectID == "" { return nil, errors.New("storage: expecting a non-blank projectID") } if serviceAccountEmail == "" { return nil, errors.New("storage: expecting a non-blank service account email") } desc := new(hmacKeyDesc) for _, opt := range opts { opt.withHMACKeyDesc(desc) } o := makeStorageOpts(false, c.retry, desc.userProjectID) hk, err := c.tc.CreateHMACKey(ctx, projectID, serviceAccountEmail, o...) return hk, err } // HMACKeyAttrsToUpdate defines the attributes of an HMACKey that will be updated. type HMACKeyAttrsToUpdate struct { // State is required and must be either StateActive or StateInactive. State HMACState // Etag is an optional field and it is the HTTP/1.1 Entity tag. Etag string } // Update mutates the HMACKey referred to by accessID. // Note: gRPC is not supported. func (h *HMACKeyHandle) Update(ctx context.Context, au HMACKeyAttrsToUpdate, opts ...HMACKeyOption) (*HMACKey, error) { if au.State != Active && au.State != Inactive { return nil, fmt.Errorf("storage: invalid state %q for update, must be either %q or %q", au.State, Active, Inactive) } desc := new(hmacKeyDesc) for _, opt := range opts { opt.withHMACKeyDesc(desc) } isIdempotent := len(au.Etag) > 0 o := makeStorageOpts(isIdempotent, h.retry, desc.userProjectID) hk, err := h.tc.UpdateHMACKey(ctx, h.projectID, desc.forServiceAccountEmail, h.accessID, &au, o...) return hk, err } // An HMACKeysIterator is an iterator over HMACKeys. // // Note: This iterator is not safe for concurrent operations without explicit synchronization. type HMACKeysIterator struct { ctx context.Context raw *raw.ProjectsHmacKeysService projectID string hmacKeys []*HMACKey pageInfo *iterator.PageInfo nextFunc func() error index int desc hmacKeyDesc retry *retryConfig } // ListHMACKeys returns an iterator for listing HMACKeys. // // Note: This iterator is not safe for concurrent operations without explicit synchronization. // Note: gRPC is not supported. func (c *Client) ListHMACKeys(ctx context.Context, projectID string, opts ...HMACKeyOption) *HMACKeysIterator { desc := new(hmacKeyDesc) for _, opt := range opts { opt.withHMACKeyDesc(desc) } o := makeStorageOpts(true, c.retry, desc.userProjectID) return c.tc.ListHMACKeys(ctx, projectID, desc.forServiceAccountEmail, desc.showDeletedKeys, o...) } // Next returns the next result. Its second return value is iterator.Done if // there are no more results. Once Next returns iterator.Done, all subsequent // calls will return iterator.Done. // // Note: This iterator is not safe for concurrent operations without explicit synchronization. func (it *HMACKeysIterator) Next() (*HMACKey, error) { if err := it.nextFunc(); err != nil { return nil, err } key := it.hmacKeys[it.index] it.index++ return key, nil } // PageInfo supports pagination. See the google.golang.org/api/iterator package for details. // // Note: This iterator is not safe for concurrent operations without explicit synchronization. func (it *HMACKeysIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } func (it *HMACKeysIterator) fetch(pageSize int, pageToken string) (token string, err error) { // TODO: Remove fetch method upon integration. This method is internalized into // httpStorageClient.ListHMACKeys() as it is the only caller. call := it.raw.List(it.projectID) if pageToken != "" { call = call.PageToken(pageToken) } if it.desc.showDeletedKeys { call = call.ShowDeletedKeys(true) } if it.desc.userProjectID != "" { call = call.UserProject(it.desc.userProjectID) } if it.desc.forServiceAccountEmail != "" { call = call.ServiceAccountEmail(it.desc.forServiceAccountEmail) } if pageSize > 0 { call = call.MaxResults(int64(pageSize)) } var resp *raw.HmacKeysMetadata err = run(it.ctx, func(ctx context.Context) error { resp, err = call.Context(ctx).Do() return err }, it.retry, true) if err != nil { return "", err } for _, metadata := range resp.Items { hk := &raw.HmacKey{ Metadata: metadata, } hkey, err := toHMACKeyFromRaw(hk, true) if err != nil { return "", err } it.hmacKeys = append(it.hmacKeys, hkey) } return resp.NextPageToken, nil } type hmacKeyDesc struct { forServiceAccountEmail string showDeletedKeys bool userProjectID string } // HMACKeyOption configures the behavior of HMACKey related methods and actions. type HMACKeyOption interface { withHMACKeyDesc(*hmacKeyDesc) } type hmacKeyDescFunc func(*hmacKeyDesc) func (hkdf hmacKeyDescFunc) withHMACKeyDesc(hkd *hmacKeyDesc) { hkdf(hkd) } // ForHMACKeyServiceAccountEmail returns HMAC Keys that are // associated with the email address of a service account in the project. // // Only one service account email can be used as a filter, so if multiple // of these options are applied, the last email to be set will be used. func ForHMACKeyServiceAccountEmail(serviceAccountEmail string) HMACKeyOption { return hmacKeyDescFunc(func(hkd *hmacKeyDesc) { hkd.forServiceAccountEmail = serviceAccountEmail }) } // ShowDeletedHMACKeys will also list keys whose state is "DELETED". func ShowDeletedHMACKeys() HMACKeyOption { return hmacKeyDescFunc(func(hkd *hmacKeyDesc) { hkd.showDeletedKeys = true }) } // UserProjectForHMACKeys will bill the request against userProjectID // if userProjectID is non-empty. // // Note: This is a noop right now and only provided for API compatibility. func UserProjectForHMACKeys(userProjectID string) HMACKeyOption { return hmacKeyDescFunc(func(hkd *hmacKeyDesc) { hkd.userProjectID = userProjectID }) } ================================================ FILE: vendor/cloud.google.com/go/storage/http_client.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "encoding/base64" "errors" "fmt" "hash/crc32" "io" "log" "net/http" "net/url" "os" "reflect" "strconv" "strings" "time" "cloud.google.com/go/iam/apiv1/iampb" "cloud.google.com/go/internal/optional" "cloud.google.com/go/internal/trace" "github.com/google/uuid" "github.com/googleapis/gax-go/v2/callctx" "golang.org/x/oauth2/google" "google.golang.org/api/googleapi" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" raw "google.golang.org/api/storage/v1" "google.golang.org/api/transport" htransport "google.golang.org/api/transport/http" ) // httpStorageClient is the HTTP-JSON API implementation of the transport-agnostic // storageClient interface. type httpStorageClient struct { creds *google.Credentials hc *http.Client xmlHost string raw *raw.Service scheme string settings *settings config *storageConfig dynamicReadReqStallTimeout *bucketDelayManager } // newHTTPStorageClient initializes a new storageClient that uses the HTTP-JSON // Storage API. func newHTTPStorageClient(ctx context.Context, opts ...storageOption) (storageClient, error) { s := initSettings(opts...) o := s.clientOption config := newStorageConfig(o...) var creds *google.Credentials // In general, it is recommended to use raw.NewService instead of htransport.NewClient // since raw.NewService configures the correct default endpoints when initializing the // internal http client. However, in our case, "NewRangeReader" in reader.go needs to // access the http client directly to make requests, so we create the client manually // here so it can be re-used by both reader.go and raw.NewService. This means we need to // manually configure the default endpoint options on the http client. Furthermore, we // need to account for STORAGE_EMULATOR_HOST override when setting the default endpoints. if host := os.Getenv("STORAGE_EMULATOR_HOST"); host == "" { // Prepend default options to avoid overriding options passed by the user. o = append([]option.ClientOption{option.WithScopes(ScopeFullControl, "https://www.googleapis.com/auth/cloud-platform"), option.WithUserAgent(userAgent)}, o...) o = append(o, internaloption.WithDefaultEndpointTemplate("https://storage.UNIVERSE_DOMAIN/storage/v1/"), internaloption.WithDefaultMTLSEndpoint("https://storage.mtls.googleapis.com/storage/v1/"), internaloption.WithDefaultUniverseDomain("googleapis.com"), ) // Don't error out here. The user may have passed in their own HTTP // client which does not auth with ADC or other common conventions. c, err := transport.Creds(ctx, o...) if err == nil { creds = c o = append(o, internaloption.WithCredentials(creds)) } } else { var hostURL *url.URL if strings.Contains(host, "://") { h, err := url.Parse(host) if err != nil { return nil, err } hostURL = h } else { // Add scheme for user if not supplied in STORAGE_EMULATOR_HOST // URL is only parsed correctly if it has a scheme, so we build it ourselves hostURL = &url.URL{Scheme: "http", Host: host} } hostURL.Path = "storage/v1/" endpoint := hostURL.String() // Append the emulator host as default endpoint for the user o = append([]option.ClientOption{option.WithoutAuthentication()}, o...) o = append(o, internaloption.WithDefaultEndpointTemplate(endpoint)) o = append(o, internaloption.WithDefaultMTLSEndpoint(endpoint)) } s.clientOption = o // htransport selects the correct endpoint among WithEndpoint (user override), WithDefaultEndpointTemplate, and WithDefaultMTLSEndpoint. hc, ep, err := htransport.NewClient(ctx, s.clientOption...) if err != nil { return nil, fmt.Errorf("dialing: %w", err) } // RawService should be created with the chosen endpoint to take account of user override. rawService, err := raw.NewService(ctx, option.WithEndpoint(ep), option.WithHTTPClient(hc)) if err != nil { return nil, fmt.Errorf("storage client: %w", err) } // Update xmlHost and scheme with the chosen endpoint. u, err := url.Parse(ep) if err != nil { return nil, fmt.Errorf("supplied endpoint %q is not valid: %w", ep, err) } var bd *bucketDelayManager if config.readStallTimeoutConfig != nil { drrstConfig := config.readStallTimeoutConfig bd, err = newBucketDelayManager( drrstConfig.TargetPercentile, getDynamicReadReqIncreaseRateFromEnv(), getDynamicReadReqInitialTimeoutSecFromEnv(drrstConfig.Min), drrstConfig.Min, defaultDynamicReqdReqMaxTimeout) if err != nil { return nil, fmt.Errorf("creating dynamic-delay: %w", err) } } return &httpStorageClient{ creds: creds, hc: hc, xmlHost: u.Host, raw: rawService, scheme: u.Scheme, settings: s, config: &config, dynamicReadReqStallTimeout: bd, }, nil } func (c *httpStorageClient) Close() error { c.hc.CloseIdleConnections() return nil } // Top-level methods. func (c *httpStorageClient) GetServiceAccount(ctx context.Context, project string, opts ...storageOption) (string, error) { s := callSettings(c.settings, opts...) call := c.raw.Projects.ServiceAccount.Get(project) var res *raw.ServiceAccount err := run(ctx, func(ctx context.Context) error { var err error res, err = call.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return "", err } return res.EmailAddress, nil } func (c *httpStorageClient) CreateBucket(ctx context.Context, project, bucket string, attrs *BucketAttrs, enableObjectRetention *bool, opts ...storageOption) (*BucketAttrs, error) { s := callSettings(c.settings, opts...) var bkt *raw.Bucket if attrs != nil { bkt = attrs.toRawBucket() } else { bkt = &raw.Bucket{} } bkt.Name = bucket // If there is lifecycle information but no location, explicitly set // the location. This is a GCS quirk/bug. if bkt.Location == "" && bkt.Lifecycle != nil { bkt.Location = "US" } req := c.raw.Buckets.Insert(project, bkt) if attrs != nil && attrs.PredefinedACL != "" { req.PredefinedAcl(attrs.PredefinedACL) } if attrs != nil && attrs.PredefinedDefaultObjectACL != "" { req.PredefinedDefaultObjectAcl(attrs.PredefinedDefaultObjectACL) } if enableObjectRetention != nil { req.EnableObjectRetention(*enableObjectRetention) } var battrs *BucketAttrs err := run(ctx, func(ctx context.Context) error { b, err := req.Context(ctx).Do() if err != nil { return err } battrs, err = newBucket(b) return err }, s.retry, s.idempotent) return battrs, err } func (c *httpStorageClient) ListBuckets(ctx context.Context, project string, opts ...storageOption) *BucketIterator { s := callSettings(c.settings, opts...) it := &BucketIterator{ ctx: ctx, projectID: project, } fetch := func(pageSize int, pageToken string) (token string, err error) { req := c.raw.Buckets.List(it.projectID) req.Projection("full") req.Prefix(it.Prefix) req.PageToken(pageToken) if pageSize > 0 { req.MaxResults(int64(pageSize)) } var resp *raw.Buckets err = run(it.ctx, func(ctx context.Context) error { resp, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return "", err } for _, item := range resp.Items { b, err := newBucket(item) if err != nil { return "", err } it.buckets = append(it.buckets, b) } return resp.NextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo( fetch, func() int { return len(it.buckets) }, func() interface{} { b := it.buckets; it.buckets = nil; return b }) return it } // Bucket methods. func (c *httpStorageClient) DeleteBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error { s := callSettings(c.settings, opts...) req := c.raw.Buckets.Delete(bucket) if err := applyBucketConds("httpStorageClient.DeleteBucket", conds, req); err != nil { return err } if s.userProject != "" { req.UserProject(s.userProject) } return run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent) } func (c *httpStorageClient) GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) { s := callSettings(c.settings, opts...) req := c.raw.Buckets.Get(bucket).Projection("full") err := applyBucketConds("httpStorageClient.GetBucket", conds, req) if err != nil { return nil, err } if s.userProject != "" { req.UserProject(s.userProject) } var resp *raw.Bucket err = run(ctx, func(ctx context.Context) error { resp, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return nil, formatBucketError(err) } return newBucket(resp) } func (c *httpStorageClient) UpdateBucket(ctx context.Context, bucket string, uattrs *BucketAttrsToUpdate, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) { s := callSettings(c.settings, opts...) rb := uattrs.toRawBucket() req := c.raw.Buckets.Patch(bucket, rb).Projection("full") err := applyBucketConds("httpStorageClient.UpdateBucket", conds, req) if err != nil { return nil, err } if s.userProject != "" { req.UserProject(s.userProject) } if uattrs != nil && uattrs.PredefinedACL != "" { req.PredefinedAcl(uattrs.PredefinedACL) } if uattrs != nil && uattrs.PredefinedDefaultObjectACL != "" { req.PredefinedDefaultObjectAcl(uattrs.PredefinedDefaultObjectACL) } var rawBucket *raw.Bucket err = run(ctx, func(ctx context.Context) error { rawBucket, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return nil, err } return newBucket(rawBucket) } func (c *httpStorageClient) LockBucketRetentionPolicy(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) error { s := callSettings(c.settings, opts...) var metageneration int64 if conds != nil { metageneration = conds.MetagenerationMatch } req := c.raw.Buckets.LockRetentionPolicy(bucket, metageneration) return run(ctx, func(ctx context.Context) error { _, err := req.Context(ctx).Do() return err }, s.retry, s.idempotent) } func (c *httpStorageClient) ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator { s := callSettings(c.settings, opts...) it := &ObjectIterator{ ctx: ctx, } if q != nil { it.query = *q } fetch := func(pageSize int, pageToken string) (string, error) { var err error // Add trace span around List API call within the fetch. ctx, _ = startSpan(ctx, "httpStorageClient.ObjectsListCall") defer func() { endSpan(ctx, err) }() req := c.raw.Objects.List(bucket) if it.query.SoftDeleted { req.SoftDeleted(it.query.SoftDeleted) } projection := it.query.Projection if projection == ProjectionDefault { projection = ProjectionFull } req.Projection(projection.String()) req.Delimiter(it.query.Delimiter) req.Prefix(it.query.Prefix) req.StartOffset(it.query.StartOffset) req.EndOffset(it.query.EndOffset) req.Versions(it.query.Versions) req.IncludeTrailingDelimiter(it.query.IncludeTrailingDelimiter) req.MatchGlob(it.query.MatchGlob) req.IncludeFoldersAsPrefixes(it.query.IncludeFoldersAsPrefixes) if selection := it.query.toFieldSelection(); selection != "" { req.Fields("nextPageToken", googleapi.Field(selection)) } req.PageToken(pageToken) if s.userProject != "" { req.UserProject(s.userProject) } if pageSize > 0 { req.MaxResults(int64(pageSize)) } var resp *raw.Objects err = run(it.ctx, func(ctx context.Context) error { resp, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return "", formatBucketError(err) } for _, item := range resp.Items { it.items = append(it.items, newObject(item)) } for _, prefix := range resp.Prefixes { it.items = append(it.items, &ObjectAttrs{Prefix: prefix}) } return resp.NextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo( fetch, func() int { return len(it.items) }, func() interface{} { b := it.items; it.items = nil; return b }) return it } // Object metadata methods. func (c *httpStorageClient) DeleteObject(ctx context.Context, bucket, object string, gen int64, conds *Conditions, opts ...storageOption) error { s := callSettings(c.settings, opts...) req := c.raw.Objects.Delete(bucket, object).Context(ctx) if err := applyConds("Delete", gen, conds, req); err != nil { return err } if s.userProject != "" { req.UserProject(s.userProject) } err := run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent) return formatObjectErr(err) } func (c *httpStorageClient) GetObject(ctx context.Context, params *getObjectParams, opts ...storageOption) (*ObjectAttrs, error) { s := callSettings(c.settings, opts...) req := c.raw.Objects.Get(params.bucket, params.object).Projection("full").Context(ctx) if err := applyConds("Attrs", params.gen, params.conds, req); err != nil { return nil, err } if s.userProject != "" { req.UserProject(s.userProject) } if err := setEncryptionHeaders(req.Header(), params.encryptionKey, false); err != nil { return nil, err } if params.softDeleted { req.SoftDeleted(params.softDeleted) } var obj *raw.Object var err error err = run(ctx, func(ctx context.Context) error { obj, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return nil, formatObjectErr(err) } return newObject(obj), nil } func (c *httpStorageClient) UpdateObject(ctx context.Context, params *updateObjectParams, opts ...storageOption) (*ObjectAttrs, error) { uattrs := params.uattrs s := callSettings(c.settings, opts...) var attrs ObjectAttrs // Lists of fields to send, and set to null, in the JSON. var forceSendFields, nullFields []string if uattrs.ContentType != nil { attrs.ContentType = optional.ToString(uattrs.ContentType) // For ContentType, sending the empty string is a no-op. // Instead we send a null. if attrs.ContentType == "" { nullFields = append(nullFields, "ContentType") } else { forceSendFields = append(forceSendFields, "ContentType") } } if uattrs.ContentLanguage != nil { attrs.ContentLanguage = optional.ToString(uattrs.ContentLanguage) // For ContentLanguage it's an error to send the empty string. // Instead we send a null. if attrs.ContentLanguage == "" { nullFields = append(nullFields, "ContentLanguage") } else { forceSendFields = append(forceSendFields, "ContentLanguage") } } if uattrs.ContentEncoding != nil { attrs.ContentEncoding = optional.ToString(uattrs.ContentEncoding) forceSendFields = append(forceSendFields, "ContentEncoding") } if uattrs.ContentDisposition != nil { attrs.ContentDisposition = optional.ToString(uattrs.ContentDisposition) forceSendFields = append(forceSendFields, "ContentDisposition") } if uattrs.CacheControl != nil { attrs.CacheControl = optional.ToString(uattrs.CacheControl) forceSendFields = append(forceSendFields, "CacheControl") } if uattrs.EventBasedHold != nil { attrs.EventBasedHold = optional.ToBool(uattrs.EventBasedHold) forceSendFields = append(forceSendFields, "EventBasedHold") } if uattrs.TemporaryHold != nil { attrs.TemporaryHold = optional.ToBool(uattrs.TemporaryHold) forceSendFields = append(forceSendFields, "TemporaryHold") } if !uattrs.CustomTime.IsZero() { attrs.CustomTime = uattrs.CustomTime forceSendFields = append(forceSendFields, "CustomTime") } if uattrs.Metadata != nil { attrs.Metadata = uattrs.Metadata if len(attrs.Metadata) == 0 { // Sending the empty map is a no-op. We send null instead. nullFields = append(nullFields, "Metadata") } else { forceSendFields = append(forceSendFields, "Metadata") } } if uattrs.ACL != nil { attrs.ACL = uattrs.ACL // It's an error to attempt to delete the ACL, so // we don't append to nullFields here. forceSendFields = append(forceSendFields, "Acl") } if uattrs.Retention != nil { // For ObjectRetention it's an error to send empty fields. // Instead we send a null as the user's intention is to remove. if uattrs.Retention.Mode == "" && uattrs.Retention.RetainUntil.IsZero() { nullFields = append(nullFields, "Retention") } else { attrs.Retention = uattrs.Retention forceSendFields = append(forceSendFields, "Retention") } } rawObj := attrs.toRawObject(params.bucket) rawObj.ForceSendFields = forceSendFields rawObj.NullFields = nullFields call := c.raw.Objects.Patch(params.bucket, params.object, rawObj).Projection("full") if err := applyConds("Update", params.gen, params.conds, call); err != nil { return nil, err } if s.userProject != "" { call.UserProject(s.userProject) } if uattrs.PredefinedACL != "" { call.PredefinedAcl(uattrs.PredefinedACL) } if err := setEncryptionHeaders(call.Header(), params.encryptionKey, false); err != nil { return nil, err } if params.overrideRetention != nil { call.OverrideUnlockedRetention(*params.overrideRetention) } var obj *raw.Object var err error err = run(ctx, func(ctx context.Context) error { obj, err = call.Context(ctx).Do(); return err }, s.retry, s.idempotent) if err != nil { return nil, formatObjectErr(err) } return newObject(obj), nil } func (c *httpStorageClient) RestoreObject(ctx context.Context, params *restoreObjectParams, opts ...storageOption) (*ObjectAttrs, error) { s := callSettings(c.settings, opts...) req := c.raw.Objects.Restore(params.bucket, params.object, params.gen).Context(ctx) // Do not set the generation here since it's not an optional condition; it gets set above. if err := applyConds("RestoreObject", defaultGen, params.conds, req); err != nil { return nil, err } if s.userProject != "" { req.UserProject(s.userProject) } if params.copySourceACL { req.CopySourceAcl(params.copySourceACL) } if err := setEncryptionHeaders(req.Header(), params.encryptionKey, false); err != nil { return nil, err } var obj *raw.Object var err error err = run(ctx, func(ctx context.Context) error { obj, err = req.Context(ctx).Do(); return err }, s.retry, s.idempotent) if err != nil { return nil, formatObjectErr(err) } return newObject(obj), err } func (c *httpStorageClient) MoveObject(ctx context.Context, params *moveObjectParams, opts ...storageOption) (*ObjectAttrs, error) { s := callSettings(c.settings, opts...) req := c.raw.Objects.Move(params.bucket, params.srcObject, params.dstObject).Context(ctx) if err := applyConds("MoveObjectDestination", defaultGen, params.dstConds, req); err != nil { return nil, err } if err := applySourceConds("MoveObjectSource", defaultGen, params.srcConds, req); err != nil { return nil, err } if s.userProject != "" { req.UserProject(s.userProject) } if err := setEncryptionHeaders(req.Header(), params.encryptionKey, false); err != nil { return nil, err } var obj *raw.Object var err error err = run(ctx, func(ctx context.Context) error { obj, err = req.Context(ctx).Do(); return err }, s.retry, s.idempotent) if err != nil { return nil, formatObjectErr(err) } return newObject(obj), err } // Default Object ACL methods. func (c *httpStorageClient) DeleteDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error { s := callSettings(c.settings, opts...) req := c.raw.DefaultObjectAccessControls.Delete(bucket, string(entity)) configureACLCall(ctx, s.userProject, req) return run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent) } func (c *httpStorageClient) ListDefaultObjectACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) { s := callSettings(c.settings, opts...) var acls *raw.ObjectAccessControls var err error req := c.raw.DefaultObjectAccessControls.List(bucket) configureACLCall(ctx, s.userProject, req) err = run(ctx, func(ctx context.Context) error { acls, err = req.Context(ctx).Do() return err }, s.retry, true) if err != nil { return nil, err } return toObjectACLRules(acls.Items), nil } func (c *httpStorageClient) UpdateDefaultObjectACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error { s := callSettings(c.settings, opts...) type setRequest interface { Do(opts ...googleapi.CallOption) (*raw.ObjectAccessControl, error) Header() http.Header } acl := &raw.ObjectAccessControl{ Bucket: bucket, Entity: string(entity), Role: string(role), } var err error req := c.raw.DefaultObjectAccessControls.Update(bucket, string(entity), acl) configureACLCall(ctx, s.userProject, req) return run(ctx, func(ctx context.Context) error { _, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) } // Bucket ACL methods. func (c *httpStorageClient) DeleteBucketACL(ctx context.Context, bucket string, entity ACLEntity, opts ...storageOption) error { s := callSettings(c.settings, opts...) req := c.raw.BucketAccessControls.Delete(bucket, string(entity)) configureACLCall(ctx, s.userProject, req) return run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent) } func (c *httpStorageClient) ListBucketACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) { s := callSettings(c.settings, opts...) var acls *raw.BucketAccessControls var err error req := c.raw.BucketAccessControls.List(bucket) configureACLCall(ctx, s.userProject, req) err = run(ctx, func(ctx context.Context) error { acls, err = req.Context(ctx).Do() return err }, s.retry, true) if err != nil { return nil, err } return toBucketACLRules(acls.Items), nil } func (c *httpStorageClient) UpdateBucketACL(ctx context.Context, bucket string, entity ACLEntity, role ACLRole, opts ...storageOption) error { s := callSettings(c.settings, opts...) acl := &raw.BucketAccessControl{ Bucket: bucket, Entity: string(entity), Role: string(role), } req := c.raw.BucketAccessControls.Update(bucket, string(entity), acl) configureACLCall(ctx, s.userProject, req) var err error return run(ctx, func(ctx context.Context) error { _, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) } // configureACLCall sets the context and user project on the apiary library call. // This will panic if the call does not have the correct methods. func configureACLCall(ctx context.Context, userProject string, call interface{ Header() http.Header }) { vc := reflect.ValueOf(call) vc.MethodByName("Context").Call([]reflect.Value{reflect.ValueOf(ctx)}) if userProject != "" { vc.MethodByName("UserProject").Call([]reflect.Value{reflect.ValueOf(userProject)}) } } // Object ACL methods. func (c *httpStorageClient) DeleteObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, opts ...storageOption) error { s := callSettings(c.settings, opts...) req := c.raw.ObjectAccessControls.Delete(bucket, object, string(entity)) configureACLCall(ctx, s.userProject, req) return run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent) } // ListObjectACLs retrieves object ACL entries. By default, it operates on the latest generation of this object. // Selecting a specific generation of this object is not currently supported by the client. func (c *httpStorageClient) ListObjectACLs(ctx context.Context, bucket, object string, opts ...storageOption) ([]ACLRule, error) { s := callSettings(c.settings, opts...) var acls *raw.ObjectAccessControls var err error req := c.raw.ObjectAccessControls.List(bucket, object) configureACLCall(ctx, s.userProject, req) err = run(ctx, func(ctx context.Context) error { acls, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return nil, err } return toObjectACLRules(acls.Items), nil } func (c *httpStorageClient) UpdateObjectACL(ctx context.Context, bucket, object string, entity ACLEntity, role ACLRole, opts ...storageOption) error { s := callSettings(c.settings, opts...) type setRequest interface { Do(opts ...googleapi.CallOption) (*raw.ObjectAccessControl, error) Header() http.Header } acl := &raw.ObjectAccessControl{ Bucket: bucket, Entity: string(entity), Role: string(role), } var err error req := c.raw.ObjectAccessControls.Update(bucket, object, string(entity), acl) configureACLCall(ctx, s.userProject, req) return run(ctx, func(ctx context.Context) error { _, err = req.Context(ctx).Do() return err }, s.retry, s.idempotent) } // Media operations. func (c *httpStorageClient) ComposeObject(ctx context.Context, req *composeObjectRequest, opts ...storageOption) (*ObjectAttrs, error) { s := callSettings(c.settings, opts...) rawReq := &raw.ComposeRequest{} // Compose requires a non-empty Destination, so we always set it, // even if the caller-provided ObjectAttrs is the zero value. rawReq.Destination = req.dstObject.attrs.toRawObject(req.dstBucket) if req.sendCRC32C { rawReq.Destination.Crc32c = encodeUint32(req.dstObject.attrs.CRC32C) } for _, src := range req.srcs { srcObj := &raw.ComposeRequestSourceObjects{ Name: src.name, } if err := applyConds("ComposeFrom source", src.gen, src.conds, composeSourceObj{srcObj}); err != nil { return nil, err } rawReq.SourceObjects = append(rawReq.SourceObjects, srcObj) } call := c.raw.Objects.Compose(req.dstBucket, req.dstObject.name, rawReq) if err := applyConds("ComposeFrom destination", defaultGen, req.dstObject.conds, call); err != nil { return nil, err } if s.userProject != "" { call.UserProject(s.userProject) } if req.predefinedACL != "" { call.DestinationPredefinedAcl(req.predefinedACL) } if err := setEncryptionHeaders(call.Header(), req.dstObject.encryptionKey, false); err != nil { return nil, err } var obj *raw.Object var err error retryCall := func(ctx context.Context) error { obj, err = call.Context(ctx).Do(); return err } if err := run(ctx, retryCall, s.retry, s.idempotent); err != nil { return nil, formatObjectErr(err) } return newObject(obj), nil } func (c *httpStorageClient) RewriteObject(ctx context.Context, req *rewriteObjectRequest, opts ...storageOption) (*rewriteObjectResponse, error) { s := callSettings(c.settings, opts...) rawObject := req.dstObject.attrs.toRawObject("") call := c.raw.Objects.Rewrite(req.srcObject.bucket, req.srcObject.name, req.dstObject.bucket, req.dstObject.name, rawObject) call.Projection("full") if req.token != "" { call.RewriteToken(req.token) } if req.dstObject.keyName != "" { call.DestinationKmsKeyName(req.dstObject.keyName) } if req.predefinedACL != "" { call.DestinationPredefinedAcl(req.predefinedACL) } if err := applyConds("Copy destination", defaultGen, req.dstObject.conds, call); err != nil { return nil, err } if err := applySourceConds("Copy source", req.srcObject.gen, req.srcObject.conds, call); err != nil { return nil, err } if s.userProject != "" { call.UserProject(s.userProject) } // Set destination encryption headers. if err := setEncryptionHeaders(call.Header(), req.dstObject.encryptionKey, false); err != nil { return nil, err } // Set source encryption headers. if err := setEncryptionHeaders(call.Header(), req.srcObject.encryptionKey, true); err != nil { return nil, err } if req.maxBytesRewrittenPerCall != 0 { call.MaxBytesRewrittenPerCall(req.maxBytesRewrittenPerCall) } var res *raw.RewriteResponse var err error retryCall := func(ctx context.Context) error { res, err = call.Context(ctx).Do(); return err } if err := run(ctx, retryCall, s.retry, s.idempotent); err != nil { return nil, formatObjectErr(err) } r := &rewriteObjectResponse{ done: res.Done, written: res.TotalBytesRewritten, size: res.ObjectSize, token: res.RewriteToken, resource: newObject(res.Resource), } return r, nil } // NewMultiRangeDownloader is not supported by http client. func (c *httpStorageClient) NewMultiRangeDownloader(ctx context.Context, params *newMultiRangeDownloaderParams, opts ...storageOption) (mr *MultiRangeDownloader, err error) { return nil, errMethodNotSupported } func (c *httpStorageClient) NewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) { ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.httpStorageClient.NewRangeReader") defer func() { trace.EndSpan(ctx, err) }() s := callSettings(c.settings, opts...) if c.config.useJSONforReads { return c.newRangeReaderJSON(ctx, params, s) } return c.newRangeReaderXML(ctx, params, s) } func (c *httpStorageClient) newRangeReaderXML(ctx context.Context, params *newRangeReaderParams, s *settings) (r *Reader, err error) { requestID := uuid.New() u := &url.URL{ Scheme: c.scheme, Host: c.xmlHost, Path: fmt.Sprintf("/%s/%s", params.bucket, params.object), RawPath: fmt.Sprintf("/%s/%s", params.bucket, url.PathEscape(params.object)), } verb := "GET" if params.length == 0 { verb = "HEAD" } req, err := http.NewRequest(verb, u.String(), nil) if err != nil { return nil, err } if s.userProject != "" { req.Header.Set("X-Goog-User-Project", s.userProject) } if err := setRangeReaderHeaders(req.Header, params); err != nil { return nil, err } reopen := readerReopen(ctx, req.Header, params, s, func(ctx context.Context) (*http.Response, error) { setHeadersFromCtx(ctx, req.Header) if c.dynamicReadReqStallTimeout == nil { return c.hc.Do(req.WithContext(ctx)) } cancelCtx, cancel := context.WithCancel(ctx) var ( res *http.Response err error ) done := make(chan bool) go func() { reqStartTime := time.Now() res, err = c.hc.Do(req.WithContext(cancelCtx)) if err == nil { reqLatency := time.Since(reqStartTime) c.dynamicReadReqStallTimeout.update(params.bucket, reqLatency) } else if errors.Is(err, context.Canceled) { // context.Canceled means operation took more than current dynamicTimeout, // hence should be increased. c.dynamicReadReqStallTimeout.increase(params.bucket) } done <- true }() // Wait until stall timeout or request is successful. stallTimeout := c.dynamicReadReqStallTimeout.getValue(params.bucket) timer := time.After(stallTimeout) select { case <-timer: log.Printf("[%s] stalled read-req cancelled after %fs", requestID, stallTimeout.Seconds()) cancel() <-done if res != nil && res.Body != nil { res.Body.Close() } return res, context.DeadlineExceeded case <-done: cancel = nil } return res, err }, func() error { return setConditionsHeaders(req.Header, params.conds) }, func() { req.URL.RawQuery = fmt.Sprintf("generation=%d", params.gen) }) res, err := reopen(0) if err != nil { return nil, err } return parseReadResponse(res, params, reopen) } func (c *httpStorageClient) newRangeReaderJSON(ctx context.Context, params *newRangeReaderParams, s *settings) (r *Reader, err error) { call := c.raw.Objects.Get(params.bucket, params.object) call.Projection("full") if s.userProject != "" { call.UserProject(s.userProject) } if err := setRangeReaderHeaders(call.Header(), params); err != nil { return nil, err } reopen := readerReopen(ctx, call.Header(), params, s, func(ctx context.Context) (*http.Response, error) { return call.Context(ctx).Download() }, func() error { return applyConds("NewReader", params.gen, params.conds, call) }, func() { call.Generation(params.gen) }) res, err := reopen(0) if err != nil { return nil, err } return parseReadResponse(res, params, reopen) } func (c *httpStorageClient) OpenWriter(params *openWriterParams, opts ...storageOption) (*io.PipeWriter, error) { if params.append { return nil, errors.New("storage: append not supported on HTTP Client; use gRPC") } s := callSettings(c.settings, opts...) errorf := params.setError setObj := params.setObj progress := params.progress attrs := params.attrs params.setFlush(func() (int64, error) { return 0, errors.New("Writer.Flush is only supported for gRPC-based clients") }) mediaOpts := []googleapi.MediaOption{ googleapi.ChunkSize(params.chunkSize), } if c := attrs.ContentType; c != "" || params.forceEmptyContentType { mediaOpts = append(mediaOpts, googleapi.ContentType(c)) } if params.chunkRetryDeadline != 0 { mediaOpts = append(mediaOpts, googleapi.ChunkRetryDeadline(params.chunkRetryDeadline)) } if params.chunkTransferTimeout != 0 { mediaOpts = append(mediaOpts, googleapi.ChunkTransferTimeout(params.chunkTransferTimeout)) } pr, pw := io.Pipe() go func() { defer close(params.donec) rawObj := attrs.toRawObject(params.bucket) if params.sendCRC32C { rawObj.Crc32c = encodeUint32(attrs.CRC32C) } if attrs.MD5 != nil { rawObj.Md5Hash = base64.StdEncoding.EncodeToString(attrs.MD5) } call := c.raw.Objects.Insert(params.bucket, rawObj). Media(pr, mediaOpts...). Projection("full"). Context(params.ctx). Name(params.attrs.Name) call.ProgressUpdater(func(n, _ int64) { progress(n) }) if attrs.KMSKeyName != "" { call.KmsKeyName(attrs.KMSKeyName) } if attrs.PredefinedACL != "" { call.PredefinedAcl(attrs.PredefinedACL) } if err := setEncryptionHeaders(call.Header(), params.encryptionKey, false); err != nil { errorf(err) pr.CloseWithError(err) return } var resp *raw.Object err := applyConds("NewWriter", defaultGen, params.conds, call) if err == nil { if s.userProject != "" { call.UserProject(s.userProject) } // TODO(tritone): Remove this code when Uploads begin to support // retry attempt header injection with "client header" injection. setClientHeader(call.Header()) // The internals that perform call.Do automatically retry both the initial // call to set up the upload as well as calls to upload individual chunks // for a resumable upload (as long as the chunk size is non-zero). Hence // there is no need to add retries here. // Retry only when the operation is idempotent or the retry policy is RetryAlways. var useRetry bool if (s.retry == nil || s.retry.policy == RetryIdempotent) && s.idempotent { useRetry = true } else if s.retry != nil && s.retry.policy == RetryAlways { useRetry = true } if useRetry { if s.retry != nil { call.WithRetry(s.retry.backoff, s.retry.shouldRetry) } else { call.WithRetry(nil, nil) } } resp, err = call.Do() } if err != nil { errorf(err) pr.CloseWithError(err) return } setObj(newObject(resp)) }() return pw, nil } // IAM methods. func (c *httpStorageClient) GetIamPolicy(ctx context.Context, resource string, version int32, opts ...storageOption) (*iampb.Policy, error) { s := callSettings(c.settings, opts...) call := c.raw.Buckets.GetIamPolicy(resource).OptionsRequestedPolicyVersion(int64(version)) if s.userProject != "" { call.UserProject(s.userProject) } var rp *raw.Policy err := run(ctx, func(ctx context.Context) error { var err error rp, err = call.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return nil, err } return iamFromStoragePolicy(rp), nil } func (c *httpStorageClient) SetIamPolicy(ctx context.Context, resource string, policy *iampb.Policy, opts ...storageOption) error { s := callSettings(c.settings, opts...) rp := iamToStoragePolicy(policy) call := c.raw.Buckets.SetIamPolicy(resource, rp) if s.userProject != "" { call.UserProject(s.userProject) } return run(ctx, func(ctx context.Context) error { _, err := call.Context(ctx).Do() return err }, s.retry, s.idempotent) } func (c *httpStorageClient) TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) { s := callSettings(c.settings, opts...) call := c.raw.Buckets.TestIamPermissions(resource, permissions) if s.userProject != "" { call.UserProject(s.userProject) } var res *raw.TestIamPermissionsResponse err := run(ctx, func(ctx context.Context) error { var err error res, err = call.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return nil, err } return res.Permissions, nil } // HMAC Key methods. func (c *httpStorageClient) GetHMACKey(ctx context.Context, project, accessID string, opts ...storageOption) (*HMACKey, error) { s := callSettings(c.settings, opts...) call := c.raw.Projects.HmacKeys.Get(project, accessID) if s.userProject != "" { call = call.UserProject(s.userProject) } var metadata *raw.HmacKeyMetadata var err error if err := run(ctx, func(ctx context.Context) error { metadata, err = call.Context(ctx).Do() return err }, s.retry, s.idempotent); err != nil { return nil, err } hk := &raw.HmacKey{ Metadata: metadata, } return toHMACKeyFromRaw(hk, false) } func (c *httpStorageClient) ListHMACKeys(ctx context.Context, project, serviceAccountEmail string, showDeletedKeys bool, opts ...storageOption) *HMACKeysIterator { s := callSettings(c.settings, opts...) it := &HMACKeysIterator{ ctx: ctx, raw: c.raw.Projects.HmacKeys, projectID: project, retry: s.retry, } fetch := func(pageSize int, pageToken string) (token string, err error) { call := c.raw.Projects.HmacKeys.List(project) if pageToken != "" { call = call.PageToken(pageToken) } if pageSize > 0 { call = call.MaxResults(int64(pageSize)) } if showDeletedKeys { call = call.ShowDeletedKeys(true) } if s.userProject != "" { call = call.UserProject(s.userProject) } if serviceAccountEmail != "" { call = call.ServiceAccountEmail(serviceAccountEmail) } var resp *raw.HmacKeysMetadata err = run(it.ctx, func(ctx context.Context) error { resp, err = call.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return "", err } for _, metadata := range resp.Items { hk := &raw.HmacKey{ Metadata: metadata, } hkey, err := toHMACKeyFromRaw(hk, true) if err != nil { return "", err } it.hmacKeys = append(it.hmacKeys, hkey) } return resp.NextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo( fetch, func() int { return len(it.hmacKeys) - it.index }, func() interface{} { prev := it.hmacKeys it.hmacKeys = it.hmacKeys[:0] it.index = 0 return prev }) return it } func (c *httpStorageClient) UpdateHMACKey(ctx context.Context, project, serviceAccountEmail, accessID string, attrs *HMACKeyAttrsToUpdate, opts ...storageOption) (*HMACKey, error) { s := callSettings(c.settings, opts...) call := c.raw.Projects.HmacKeys.Update(project, accessID, &raw.HmacKeyMetadata{ Etag: attrs.Etag, State: string(attrs.State), }) if s.userProject != "" { call = call.UserProject(s.userProject) } var metadata *raw.HmacKeyMetadata var err error if err := run(ctx, func(ctx context.Context) error { metadata, err = call.Context(ctx).Do() return err }, s.retry, s.idempotent); err != nil { return nil, err } hk := &raw.HmacKey{ Metadata: metadata, } return toHMACKeyFromRaw(hk, false) } func (c *httpStorageClient) CreateHMACKey(ctx context.Context, project, serviceAccountEmail string, opts ...storageOption) (*HMACKey, error) { s := callSettings(c.settings, opts...) call := c.raw.Projects.HmacKeys.Create(project, serviceAccountEmail) if s.userProject != "" { call = call.UserProject(s.userProject) } var hk *raw.HmacKey if err := run(ctx, func(ctx context.Context) error { h, err := call.Context(ctx).Do() hk = h return err }, s.retry, s.idempotent); err != nil { return nil, err } return toHMACKeyFromRaw(hk, true) } func (c *httpStorageClient) DeleteHMACKey(ctx context.Context, project string, accessID string, opts ...storageOption) error { s := callSettings(c.settings, opts...) call := c.raw.Projects.HmacKeys.Delete(project, accessID) if s.userProject != "" { call = call.UserProject(s.userProject) } return run(ctx, func(ctx context.Context) error { return call.Context(ctx).Do() }, s.retry, s.idempotent) } // Notification methods. // ListNotifications returns all the Notifications configured for this bucket, as a map indexed by notification ID. // // Note: This API does not support pagination. However, entity limits cap the number of notifications on a single bucket, // so all results will be returned in the first response. See https://cloud.google.com/storage/quotas#buckets. func (c *httpStorageClient) ListNotifications(ctx context.Context, bucket string, opts ...storageOption) (n map[string]*Notification, err error) { s := callSettings(c.settings, opts...) call := c.raw.Notifications.List(bucket) if s.userProject != "" { call.UserProject(s.userProject) } var res *raw.Notifications err = run(ctx, func(ctx context.Context) error { res, err = call.Context(ctx).Do() return err }, s.retry, true) if err != nil { return nil, err } return notificationsToMap(res.Items), nil } func (c *httpStorageClient) CreateNotification(ctx context.Context, bucket string, n *Notification, opts ...storageOption) (ret *Notification, err error) { s := callSettings(c.settings, opts...) call := c.raw.Notifications.Insert(bucket, toRawNotification(n)) if s.userProject != "" { call.UserProject(s.userProject) } var rn *raw.Notification err = run(ctx, func(ctx context.Context) error { rn, err = call.Context(ctx).Do() return err }, s.retry, s.idempotent) if err != nil { return nil, err } return toNotification(rn), nil } func (c *httpStorageClient) DeleteNotification(ctx context.Context, bucket string, id string, opts ...storageOption) (err error) { s := callSettings(c.settings, opts...) call := c.raw.Notifications.Delete(bucket, id) if s.userProject != "" { call.UserProject(s.userProject) } return run(ctx, func(ctx context.Context) error { return call.Context(ctx).Do() }, s.retry, s.idempotent) } type httpReader struct { body io.ReadCloser seen int64 reopen func(seen int64) (*http.Response, error) checkCRC bool // should we check the CRC? wantCRC uint32 // the CRC32c value the server sent in the header gotCRC uint32 // running crc } func (r *httpReader) Read(p []byte) (int, error) { n := 0 for len(p[n:]) > 0 { m, err := r.body.Read(p[n:]) n += m r.seen += int64(m) if r.checkCRC { r.gotCRC = crc32.Update(r.gotCRC, crc32cTable, p[:n]) } if err == nil { return n, nil } if err == io.EOF { // Check CRC here. It would be natural to check it in Close, but // everybody defers Close on the assumption that it doesn't return // anything worth looking at. if r.checkCRC { if r.gotCRC != r.wantCRC { return n, fmt.Errorf("storage: bad CRC on read: got %d, want %d", r.gotCRC, r.wantCRC) } } return n, err } // Read failed (likely due to connection issues), but we will try to reopen // the pipe and continue. Send a ranged read request that takes into account // the number of bytes we've already seen. res, err := r.reopen(r.seen) if err != nil { // reopen already retries return n, err } r.body.Close() r.body = res.Body } return n, nil } func (r *httpReader) Close() error { return r.body.Close() } func setRangeReaderHeaders(h http.Header, params *newRangeReaderParams) error { if params.readCompressed { h.Set("Accept-Encoding", "gzip") } if err := setEncryptionHeaders(h, params.encryptionKey, false); err != nil { return err } return nil } // readerReopen initiates a Read with offset and length, assuming we // have already read seen bytes. func readerReopen(ctx context.Context, header http.Header, params *newRangeReaderParams, s *settings, doDownload func(context.Context) (*http.Response, error), applyConditions func() error, setGeneration func()) func(int64) (*http.Response, error) { return func(seen int64) (*http.Response, error) { // If the context has already expired, return immediately without making a // call. if err := ctx.Err(); err != nil { return nil, err } start := params.offset + seen if params.length < 0 && start < 0 { header.Set("Range", fmt.Sprintf("bytes=%d", start)) } else if params.length < 0 && start > 0 { header.Set("Range", fmt.Sprintf("bytes=%d-", start)) } else if params.length > 0 { // The end character isn't affected by how many bytes we've seen. header.Set("Range", fmt.Sprintf("bytes=%d-%d", start, params.offset+params.length-1)) } // We wait to assign conditions here because the generation number can change in between reopen() runs. if err := applyConditions(); err != nil { return nil, err } // If an object generation is specified, include generation as query string parameters. if params.gen >= 0 { setGeneration() } var err error var res *http.Response err = run(ctx, func(ctx context.Context) error { res, err = doDownload(ctx) if err != nil { return formatObjectErr(err) } if res.StatusCode == http.StatusNotFound { // this check is necessary only for XML res.Body.Close() return ErrObjectNotExist } if res.StatusCode < 200 || res.StatusCode > 299 { body, _ := io.ReadAll(res.Body) res.Body.Close() return &googleapi.Error{ Code: res.StatusCode, Header: res.Header, Body: string(body), } } partialContentNotSatisfied := !decompressiveTranscoding(res) && start > 0 && params.length != 0 && res.StatusCode != http.StatusPartialContent if partialContentNotSatisfied { res.Body.Close() return errors.New("storage: partial request not satisfied") } // With "Content-Encoding": "gzip" aka decompressive transcoding, GCS serves // back the whole file regardless of the range count passed in as per: // https://cloud.google.com/storage/docs/transcoding#range, // thus we have to manually move the body forward by seen bytes. if decompressiveTranscoding(res) && seen > 0 { _, _ = io.CopyN(io.Discard, res.Body, seen) } // If a generation hasn't been specified, and this is the first response we get, let's record the // generation. In future requests we'll use this generation as a precondition to avoid data races. if params.gen < 0 && res.Header.Get("X-Goog-Generation") != "" { gen64, err := strconv.ParseInt(res.Header.Get("X-Goog-Generation"), 10, 64) if err != nil { return err } params.gen = gen64 } return nil }, s.retry, s.idempotent) if err != nil { return nil, err } return res, nil } } func parseReadResponse(res *http.Response, params *newRangeReaderParams, reopen func(int64) (*http.Response, error)) (*Reader, error) { var err error var ( size int64 // total size of object, even if a range was requested. checkCRC bool crc uint32 startOffset int64 // non-zero if range request. ) if res.StatusCode == http.StatusPartialContent { cr := strings.TrimSpace(res.Header.Get("Content-Range")) if !strings.HasPrefix(cr, "bytes ") || !strings.Contains(cr, "/") { return nil, fmt.Errorf("storage: invalid Content-Range %q", cr) } // Content range is formatted -/. We take // the total size. size, err = strconv.ParseInt(cr[strings.LastIndex(cr, "/")+1:], 10, 64) if err != nil { return nil, fmt.Errorf("storage: invalid Content-Range %q", cr) } dashIndex := strings.Index(cr, "-") if dashIndex >= 0 { startOffset, err = strconv.ParseInt(cr[len("bytes="):dashIndex], 10, 64) if err != nil { return nil, fmt.Errorf("storage: invalid Content-Range %q: %w", cr, err) } } } else { size = res.ContentLength } // Check the CRC iff all of the following hold: // - We asked for content (length != 0). // - We got all the content (status != PartialContent). // - The server sent a CRC header. // - The Go http stack did not uncompress the file. // - We were not served compressed data that was uncompressed on download. // The problem with the last two cases is that the CRC will not match -- GCS // computes it on the compressed contents, but we compute it on the // uncompressed contents. crc, checkCRC = parseCRC32c(res) if params.length == 0 || res.StatusCode == http.StatusPartialContent || res.Uncompressed || uncompressedByServer(res) { checkCRC = false } remain := res.ContentLength body := res.Body // If the user requested zero bytes, explicitly close and remove the request // body. if params.length == 0 { remain = 0 body.Close() body = emptyBody } var metaGen int64 if res.Header.Get("X-Goog-Metageneration") != "" { metaGen, err = strconv.ParseInt(res.Header.Get("X-Goog-Metageneration"), 10, 64) if err != nil { return nil, err } } var lm time.Time if res.Header.Get("Last-Modified") != "" { lm, err = http.ParseTime(res.Header.Get("Last-Modified")) if err != nil { return nil, err } } metadata := map[string]string{} for key, values := range res.Header { if len(values) > 0 && strings.HasPrefix(key, "X-Goog-Meta-") { key := key[len("X-Goog-Meta-"):] metadata[key] = values[0] } } attrs := ReaderObjectAttrs{ Size: size, ContentType: res.Header.Get("Content-Type"), ContentEncoding: res.Header.Get("Content-Encoding"), CacheControl: res.Header.Get("Cache-Control"), LastModified: lm, StartOffset: startOffset, Generation: params.gen, Metageneration: metaGen, CRC32C: crc, Decompressed: res.Uncompressed || uncompressedByServer(res), } return &Reader{ Attrs: attrs, objectMetadata: &metadata, size: size, remain: remain, checkCRC: checkCRC, reader: &httpReader{ reopen: reopen, body: body, wantCRC: crc, checkCRC: checkCRC, }, }, nil } // setHeadersFromCtx sets custom headers passed in via the context on the header, // replacing any header with the same key (which avoids duplicating invocation headers). // This is only required for XML; for gRPC & JSON requests this is handled in // the GAPIC and Apiary layers respectively. func setHeadersFromCtx(ctx context.Context, header http.Header) { ctxHeaders := callctx.HeadersFromContext(ctx) for k, vals := range ctxHeaders { // Merge x-goog-api-client values into a single space-separated value. if strings.EqualFold(k, xGoogHeaderKey) { alreadySetValues := header.Values(xGoogHeaderKey) vals = append(vals, alreadySetValues...) if len(vals) > 0 { xGoogHeader := vals[0] for _, v := range vals[1:] { xGoogHeader = strings.Join([]string{xGoogHeader, v}, " ") } header.Set(k, xGoogHeader) } } else { for _, v := range vals { header.Set(k, v) } } } } ================================================ FILE: vendor/cloud.google.com/go/storage/iam.go ================================================ // Copyright 2017 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "cloud.google.com/go/iam" "cloud.google.com/go/iam/apiv1/iampb" raw "google.golang.org/api/storage/v1" "google.golang.org/genproto/googleapis/type/expr" ) // IAM provides access to IAM access control for the bucket. func (b *BucketHandle) IAM() *iam.Handle { return iam.InternalNewHandleClient(&iamClient{ userProject: b.userProject, retry: b.retry, client: b.c, }, b.name) } // iamClient implements the iam.client interface. type iamClient struct { userProject string retry *retryConfig client *Client } func (c *iamClient) Get(ctx context.Context, resource string) (p *iampb.Policy, err error) { return c.GetWithVersion(ctx, resource, 1) } func (c *iamClient) GetWithVersion(ctx context.Context, resource string, requestedPolicyVersion int32) (p *iampb.Policy, err error) { ctx, _ = startSpan(ctx, "storage.IAM.Get") defer func() { endSpan(ctx, err) }() o := makeStorageOpts(true, c.retry, c.userProject) return c.client.tc.GetIamPolicy(ctx, resource, requestedPolicyVersion, o...) } func (c *iamClient) Set(ctx context.Context, resource string, p *iampb.Policy) (err error) { ctx, _ = startSpan(ctx, "storage.IAM.Set") defer func() { endSpan(ctx, err) }() isIdempotent := len(p.Etag) > 0 o := makeStorageOpts(isIdempotent, c.retry, c.userProject) return c.client.tc.SetIamPolicy(ctx, resource, p, o...) } func (c *iamClient) Test(ctx context.Context, resource string, perms []string) (permissions []string, err error) { ctx, _ = startSpan(ctx, "storage.IAM.Test") defer func() { endSpan(ctx, err) }() o := makeStorageOpts(true, c.retry, c.userProject) return c.client.tc.TestIamPermissions(ctx, resource, perms, o...) } func iamToStoragePolicy(ip *iampb.Policy) *raw.Policy { return &raw.Policy{ Bindings: iamToStorageBindings(ip.Bindings), Etag: string(ip.Etag), Version: int64(ip.Version), } } func iamToStorageBindings(ibs []*iampb.Binding) []*raw.PolicyBindings { var rbs []*raw.PolicyBindings for _, ib := range ibs { rbs = append(rbs, &raw.PolicyBindings{ Role: ib.Role, Members: ib.Members, Condition: iamToStorageCondition(ib.Condition), }) } return rbs } func iamToStorageCondition(exprpb *expr.Expr) *raw.Expr { if exprpb == nil { return nil } return &raw.Expr{ Expression: exprpb.Expression, Description: exprpb.Description, Location: exprpb.Location, Title: exprpb.Title, } } func iamFromStoragePolicy(rp *raw.Policy) *iampb.Policy { return &iampb.Policy{ Bindings: iamFromStorageBindings(rp.Bindings), Etag: []byte(rp.Etag), } } func iamFromStorageBindings(rbs []*raw.PolicyBindings) []*iampb.Binding { var ibs []*iampb.Binding for _, rb := range rbs { ibs = append(ibs, &iampb.Binding{ Role: rb.Role, Members: rb.Members, Condition: iamFromStorageCondition(rb.Condition), }) } return ibs } func iamFromStorageCondition(rawexpr *raw.Expr) *expr.Expr { if rawexpr == nil { return nil } return &expr.Expr{ Expression: rawexpr.Expression, Description: rawexpr.Description, Location: rawexpr.Location, Title: rawexpr.Title, } } ================================================ FILE: vendor/cloud.google.com/go/storage/internal/apiv2/auxiliary.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package storage import ( storagepb "cloud.google.com/go/storage/internal/apiv2/storagepb" "google.golang.org/api/iterator" ) // BucketIterator manages a stream of *storagepb.Bucket. type BucketIterator struct { items []*storagepb.Bucket pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*storagepb.Bucket, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *BucketIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *BucketIterator) Next() (*storagepb.Bucket, error) { var item *storagepb.Bucket if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *BucketIterator) bufLen() int { return len(it.items) } func (it *BucketIterator) takeBuf() interface{} { b := it.items it.items = nil return b } // ObjectIterator manages a stream of *storagepb.Object. type ObjectIterator struct { items []*storagepb.Object pageInfo *iterator.PageInfo nextFunc func() error // Response is the raw response for the current page. // It must be cast to the RPC response type. // Calling Next() or InternalFetch() updates this value. Response interface{} // InternalFetch is for use by the Google Cloud Libraries only. // It is not part of the stable interface of this package. // // InternalFetch returns results from a single call to the underlying RPC. // The number of results is no greater than pageSize. // If there are no more results, nextPageToken is empty and err is nil. InternalFetch func(pageSize int, pageToken string) (results []*storagepb.Object, nextPageToken string, err error) } // PageInfo supports pagination. See the [google.golang.org/api/iterator] package for details. func (it *ObjectIterator) PageInfo() *iterator.PageInfo { return it.pageInfo } // Next returns the next result. Its second return value is iterator.Done if there are no more // results. Once Next returns Done, all subsequent calls will return Done. func (it *ObjectIterator) Next() (*storagepb.Object, error) { var item *storagepb.Object if err := it.nextFunc(); err != nil { return item, err } item = it.items[0] it.items = it.items[1:] return item, nil } func (it *ObjectIterator) bufLen() int { return len(it.items) } func (it *ObjectIterator) takeBuf() interface{} { b := it.items it.items = nil return b } ================================================ FILE: vendor/cloud.google.com/go/storage/internal/apiv2/auxiliary_go123.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. //go:build go1.23 package storage import ( "iter" storagepb "cloud.google.com/go/storage/internal/apiv2/storagepb" "github.com/googleapis/gax-go/v2/iterator" ) // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *BucketIterator) All() iter.Seq2[*storagepb.Bucket, error] { return iterator.RangeAdapter(it.Next) } // All returns an iterator. If an error is returned by the iterator, the // iterator will stop after that iteration. func (it *ObjectIterator) All() iter.Seq2[*storagepb.Object, error] { return iterator.RangeAdapter(it.Next) } ================================================ FILE: vendor/cloud.google.com/go/storage/internal/apiv2/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. // Package storage is an auto-generated package for the // Cloud Storage API. // // This folder contains protocol buffer definitions for an API only // accessible to select customers. Customers not participating should not // depend on this file. Please contact Google Cloud sales if you are // interested. Unless told otherwise by a Google Cloud representative, do not // use or otherwise rely on any of the contents of this folder. If you would // like to use Cloud Storage, please consult our official documentation (at // https://cloud.google.com/storage/docs/apis) for details on our XML and // JSON APIs, or else consider one of our client libraries (at // https://cloud.google.com/storage/docs/reference/libraries). // // # General documentation // // For information that is relevant for all client libraries please reference // https://pkg.go.dev/cloud.google.com/go#pkg-overview. Some information on this // page includes: // // - [Authentication and Authorization] // - [Timeouts and Cancellation] // - [Testing against Client Libraries] // - [Debugging Client Libraries] // - [Inspecting errors] // // # Example usage // // To get started with this package, create a client. // // // go get cloud.google.com/go/storage/internal/apiv2@latest // ctx := context.Background() // // This snippet has been automatically generated and should be regarded as a code template only. // // It will require modifications to work: // // - It may require correct/in-range values for request initialization. // // - It may require specifying regional endpoints when creating the service client as shown in: // // https://pkg.go.dev/cloud.google.com/go#hdr-Client_Options // c, err := storage.NewClient(ctx) // if err != nil { // // TODO: Handle error. // } // defer c.Close() // // The client will use your default application credentials. Clients should be reused instead of created as needed. // The methods of Client are safe for concurrent use by multiple goroutines. // The returned client must be Closed when it is done being used. // // # Using the Client // // The following is an example of making an API call with the newly created client, mentioned above. // // stream, err := c.BidiReadObject(ctx) // if err != nil { // // TODO: Handle error. // } // go func() { // reqs := []*storagepb.BidiReadObjectRequest{ // // TODO: Create requests. // } // for _, req := range reqs { // if err := stream.Send(req); err != nil { // // TODO: Handle error. // } // } // stream.CloseSend() // }() // for { // resp, err := stream.Recv() // if err == io.EOF { // break // } // if err != nil { // // TODO: handle error. // } // // TODO: Use resp. // _ = resp // } // // # Use of Context // // The ctx passed to NewClient is used for authentication requests and // for creating the underlying connection, but is not used for subsequent calls. // Individual methods on the client use the ctx given to them. // // To close the open connection, use the Close() method. // // [Authentication and Authorization]: https://pkg.go.dev/cloud.google.com/go#hdr-Authentication_and_Authorization // [Timeouts and Cancellation]: https://pkg.go.dev/cloud.google.com/go#hdr-Timeouts_and_Cancellation // [Testing against Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Testing // [Debugging Client Libraries]: https://pkg.go.dev/cloud.google.com/go#hdr-Debugging // [Inspecting errors]: https://pkg.go.dev/cloud.google.com/go#hdr-Inspecting_errors package storage // import "cloud.google.com/go/storage/internal/apiv2" ================================================ FILE: vendor/cloud.google.com/go/storage/internal/apiv2/gapic_metadata.json ================================================ { "schema": "1.0", "comment": "This file maps proto services/RPCs to the corresponding library clients/methods.", "language": "go", "protoPackage": "google.storage.v2", "libraryPackage": "cloud.google.com/go/storage/internal/apiv2", "services": { "Storage": { "clients": { "grpc": { "libraryClient": "Client", "rpcs": { "BidiReadObject": { "methods": [ "BidiReadObject" ] }, "BidiWriteObject": { "methods": [ "BidiWriteObject" ] }, "CancelResumableWrite": { "methods": [ "CancelResumableWrite" ] }, "ComposeObject": { "methods": [ "ComposeObject" ] }, "CreateBucket": { "methods": [ "CreateBucket" ] }, "DeleteBucket": { "methods": [ "DeleteBucket" ] }, "DeleteObject": { "methods": [ "DeleteObject" ] }, "GetBucket": { "methods": [ "GetBucket" ] }, "GetIamPolicy": { "methods": [ "GetIamPolicy" ] }, "GetObject": { "methods": [ "GetObject" ] }, "ListBuckets": { "methods": [ "ListBuckets" ] }, "ListObjects": { "methods": [ "ListObjects" ] }, "LockBucketRetentionPolicy": { "methods": [ "LockBucketRetentionPolicy" ] }, "MoveObject": { "methods": [ "MoveObject" ] }, "QueryWriteStatus": { "methods": [ "QueryWriteStatus" ] }, "ReadObject": { "methods": [ "ReadObject" ] }, "RestoreObject": { "methods": [ "RestoreObject" ] }, "RewriteObject": { "methods": [ "RewriteObject" ] }, "SetIamPolicy": { "methods": [ "SetIamPolicy" ] }, "StartResumableWrite": { "methods": [ "StartResumableWrite" ] }, "TestIamPermissions": { "methods": [ "TestIamPermissions" ] }, "UpdateBucket": { "methods": [ "UpdateBucket" ] }, "UpdateObject": { "methods": [ "UpdateObject" ] }, "WriteObject": { "methods": [ "WriteObject" ] } } } } } } } ================================================ FILE: vendor/cloud.google.com/go/storage/internal/apiv2/helpers.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package storage import ( "context" "log/slog" "github.com/googleapis/gax-go/v2/internallog/grpclog" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/protobuf/proto" ) const serviceName = "storage.googleapis.com" // For more information on implementing a client constructor hook, see // https://github.com/googleapis/google-cloud-go/wiki/Customizing-constructors. type clientHookParams struct{} type clientHook func(context.Context, clientHookParams) ([]option.ClientOption, error) var versionClient string func getVersionClient() string { if versionClient == "" { return "UNKNOWN" } return versionClient } // DefaultAuthScopes reports the default set of authentication scopes to use with this package. func DefaultAuthScopes() []string { return []string{ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/cloud-platform.read-only", "https://www.googleapis.com/auth/devstorage.full_control", "https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/devstorage.read_write", } } func executeRPC[I proto.Message, O proto.Message](ctx context.Context, fn func(context.Context, I, ...grpc.CallOption) (O, error), req I, opts []grpc.CallOption, logger *slog.Logger, rpc string) (O, error) { var zero O logger.DebugContext(ctx, "api request", "serviceName", serviceName, "rpcName", rpc, "request", grpclog.ProtoMessageRequest(ctx, req)) resp, err := fn(ctx, req, opts...) if err != nil { return zero, err } logger.DebugContext(ctx, "api response", "serviceName", serviceName, "rpcName", rpc, "response", grpclog.ProtoMessageResponse(resp)) return resp, err } ================================================ FILE: vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go_gapic. DO NOT EDIT. package storage import ( "context" "fmt" "log/slog" "math" "net/url" "regexp" "strings" "time" iampb "cloud.google.com/go/iam/apiv1/iampb" storagepb "cloud.google.com/go/storage/internal/apiv2/storagepb" gax "github.com/googleapis/gax-go/v2" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" gtransport "google.golang.org/api/transport/grpc" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/protobuf/proto" ) var newClientHook clientHook // CallOptions contains the retry settings for each method of Client. type CallOptions struct { DeleteBucket []gax.CallOption GetBucket []gax.CallOption CreateBucket []gax.CallOption ListBuckets []gax.CallOption LockBucketRetentionPolicy []gax.CallOption GetIamPolicy []gax.CallOption SetIamPolicy []gax.CallOption TestIamPermissions []gax.CallOption UpdateBucket []gax.CallOption ComposeObject []gax.CallOption DeleteObject []gax.CallOption RestoreObject []gax.CallOption CancelResumableWrite []gax.CallOption GetObject []gax.CallOption ReadObject []gax.CallOption BidiReadObject []gax.CallOption UpdateObject []gax.CallOption WriteObject []gax.CallOption BidiWriteObject []gax.CallOption ListObjects []gax.CallOption RewriteObject []gax.CallOption StartResumableWrite []gax.CallOption QueryWriteStatus []gax.CallOption MoveObject []gax.CallOption } func defaultGRPCClientOptions() []option.ClientOption { return []option.ClientOption{ internaloption.WithDefaultEndpoint("storage.googleapis.com:443"), internaloption.WithDefaultEndpointTemplate("storage.UNIVERSE_DOMAIN:443"), internaloption.WithDefaultMTLSEndpoint("storage.mtls.googleapis.com:443"), internaloption.WithDefaultUniverseDomain("googleapis.com"), internaloption.WithDefaultAudience("https://storage.googleapis.com/"), internaloption.WithDefaultScopes(DefaultAuthScopes()...), internaloption.EnableJwtWithScope(), internaloption.EnableNewAuthLibrary(), option.WithGRPCDialOption(grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt32))), } } func defaultCallOptions() *CallOptions { return &CallOptions{ DeleteBucket: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, GetBucket: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, CreateBucket: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, ListBuckets: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, LockBucketRetentionPolicy: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, GetIamPolicy: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, SetIamPolicy: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, TestIamPermissions: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, UpdateBucket: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, ComposeObject: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, DeleteObject: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, RestoreObject: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, CancelResumableWrite: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, GetObject: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, ReadObject: []gax.CallOption{ gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, BidiReadObject: []gax.CallOption{ gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, UpdateObject: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, WriteObject: []gax.CallOption{ gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, BidiWriteObject: []gax.CallOption{ gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, ListObjects: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, RewriteObject: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, StartResumableWrite: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, QueryWriteStatus: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, MoveObject: []gax.CallOption{ gax.WithTimeout(60000 * time.Millisecond), gax.WithRetry(func() gax.Retryer { return gax.OnCodes([]codes.Code{ codes.DeadlineExceeded, codes.Unavailable, }, gax.Backoff{ Initial: 1000 * time.Millisecond, Max: 60000 * time.Millisecond, Multiplier: 2.00, }) }), }, } } // internalClient is an interface that defines the methods available from Cloud Storage API. type internalClient interface { Close() error setGoogleClientInfo(...string) Connection() *grpc.ClientConn DeleteBucket(context.Context, *storagepb.DeleteBucketRequest, ...gax.CallOption) error GetBucket(context.Context, *storagepb.GetBucketRequest, ...gax.CallOption) (*storagepb.Bucket, error) CreateBucket(context.Context, *storagepb.CreateBucketRequest, ...gax.CallOption) (*storagepb.Bucket, error) ListBuckets(context.Context, *storagepb.ListBucketsRequest, ...gax.CallOption) *BucketIterator LockBucketRetentionPolicy(context.Context, *storagepb.LockBucketRetentionPolicyRequest, ...gax.CallOption) (*storagepb.Bucket, error) GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest, ...gax.CallOption) (*iampb.Policy, error) SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest, ...gax.CallOption) (*iampb.Policy, error) TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest, ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) UpdateBucket(context.Context, *storagepb.UpdateBucketRequest, ...gax.CallOption) (*storagepb.Bucket, error) ComposeObject(context.Context, *storagepb.ComposeObjectRequest, ...gax.CallOption) (*storagepb.Object, error) DeleteObject(context.Context, *storagepb.DeleteObjectRequest, ...gax.CallOption) error RestoreObject(context.Context, *storagepb.RestoreObjectRequest, ...gax.CallOption) (*storagepb.Object, error) CancelResumableWrite(context.Context, *storagepb.CancelResumableWriteRequest, ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error) GetObject(context.Context, *storagepb.GetObjectRequest, ...gax.CallOption) (*storagepb.Object, error) ReadObject(context.Context, *storagepb.ReadObjectRequest, ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error) BidiReadObject(context.Context, ...gax.CallOption) (storagepb.Storage_BidiReadObjectClient, error) UpdateObject(context.Context, *storagepb.UpdateObjectRequest, ...gax.CallOption) (*storagepb.Object, error) WriteObject(context.Context, ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error) BidiWriteObject(context.Context, ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error) ListObjects(context.Context, *storagepb.ListObjectsRequest, ...gax.CallOption) *ObjectIterator RewriteObject(context.Context, *storagepb.RewriteObjectRequest, ...gax.CallOption) (*storagepb.RewriteResponse, error) StartResumableWrite(context.Context, *storagepb.StartResumableWriteRequest, ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error) QueryWriteStatus(context.Context, *storagepb.QueryWriteStatusRequest, ...gax.CallOption) (*storagepb.QueryWriteStatusResponse, error) MoveObject(context.Context, *storagepb.MoveObjectRequest, ...gax.CallOption) (*storagepb.Object, error) } // Client is a client for interacting with Cloud Storage API. // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. // // API Overview and Naming SyntaxThe Cloud Storage gRPC API allows applications to read and write data through // the abstractions of buckets and objects. For a description of these // abstractions please see https://cloud.google.com/storage/docs (at https://cloud.google.com/storage/docs). // // Resources are named as follows: // // Projects are referred to as they are defined by the Resource Manager API, // using strings like projects/123456 or projects/my-string-id. // // Buckets are named using string names of the form: // projects/{project}/buckets/{bucket} // For globally unique buckets, _ may be substituted for the project. // // Objects are uniquely identified by their name along with the name of the // bucket they belong to, as separate strings in this API. For example: // // ReadObjectRequest { // bucket: ‘projects/_/buckets/my-bucket’ // object: ‘my-object’ // } // Note that object names can contain / characters, which are treated as // any other character (no special directory semantics). type Client struct { // The internal transport-dependent client. internalClient internalClient // The call options for this service. CallOptions *CallOptions } // Wrapper methods routed to the internal client. // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *Client) Close() error { return c.internalClient.Close() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *Client) setGoogleClientInfo(keyval ...string) { c.internalClient.setGoogleClientInfo(keyval...) } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *Client) Connection() *grpc.ClientConn { return c.internalClient.Connection() } // DeleteBucket permanently deletes an empty bucket. func (c *Client) DeleteBucket(ctx context.Context, req *storagepb.DeleteBucketRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteBucket(ctx, req, opts...) } // GetBucket returns metadata for the specified bucket. func (c *Client) GetBucket(ctx context.Context, req *storagepb.GetBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) { return c.internalClient.GetBucket(ctx, req, opts...) } // CreateBucket creates a new bucket. func (c *Client) CreateBucket(ctx context.Context, req *storagepb.CreateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) { return c.internalClient.CreateBucket(ctx, req, opts...) } // ListBuckets retrieves a list of buckets for a given project. func (c *Client) ListBuckets(ctx context.Context, req *storagepb.ListBucketsRequest, opts ...gax.CallOption) *BucketIterator { return c.internalClient.ListBuckets(ctx, req, opts...) } // LockBucketRetentionPolicy locks retention policy on a bucket. func (c *Client) LockBucketRetentionPolicy(ctx context.Context, req *storagepb.LockBucketRetentionPolicyRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) { return c.internalClient.LockBucketRetentionPolicy(ctx, req, opts...) } // GetIamPolicy gets the IAM policy for a specified bucket. // The resource field in the request should be // projects/_/buckets/{bucket}. func (c *Client) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { return c.internalClient.GetIamPolicy(ctx, req, opts...) } // SetIamPolicy updates an IAM policy for the specified bucket. // The resource field in the request should be // projects/_/buckets/{bucket}. func (c *Client) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { return c.internalClient.SetIamPolicy(ctx, req, opts...) } // TestIamPermissions tests a set of permissions on the given bucket, object, or managed folder // to see which, if any, are held by the caller. // The resource field in the request should be // projects/_/buckets/{bucket} for a bucket, // projects/_/buckets/{bucket}/objects/{object} for an object, or // projects/_/buckets/{bucket}/managedFolders/{managedFolder} // for a managed folder. func (c *Client) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) { return c.internalClient.TestIamPermissions(ctx, req, opts...) } // UpdateBucket updates a bucket. Equivalent to JSON API’s storage.buckets.patch method. func (c *Client) UpdateBucket(ctx context.Context, req *storagepb.UpdateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) { return c.internalClient.UpdateBucket(ctx, req, opts...) } // ComposeObject concatenates a list of existing objects into a new object in the same // bucket. func (c *Client) ComposeObject(ctx context.Context, req *storagepb.ComposeObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { return c.internalClient.ComposeObject(ctx, req, opts...) } // DeleteObject deletes an object and its metadata. Deletions are permanent if versioning // is not enabled for the bucket, or if the generation parameter is used, or // if soft delete (at https://cloud.google.com/storage/docs/soft-delete) is not // enabled for the bucket. // When this API is used to delete an object from a bucket that has soft // delete policy enabled, the object becomes soft deleted, and the // softDeleteTime and hardDeleteTime properties are set on the object. // This API cannot be used to permanently delete soft-deleted objects. // Soft-deleted objects are permanently deleted according to their // hardDeleteTime. // // You can use the [RestoreObject][google.storage.v2.Storage.RestoreObject] // API to restore soft-deleted objects until the soft delete retention period // has passed. // // IAM Permissions: // // Requires storage.objects.delete // IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. func (c *Client) DeleteObject(ctx context.Context, req *storagepb.DeleteObjectRequest, opts ...gax.CallOption) error { return c.internalClient.DeleteObject(ctx, req, opts...) } // RestoreObject restores a soft-deleted object. func (c *Client) RestoreObject(ctx context.Context, req *storagepb.RestoreObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { return c.internalClient.RestoreObject(ctx, req, opts...) } // CancelResumableWrite cancels an in-progress resumable upload. // // Any attempts to write to the resumable upload after cancelling the upload // will fail. // // The behavior for currently in progress write operations is not guaranteed - // they could either complete before the cancellation or fail if the // cancellation completes first. func (c *Client) CancelResumableWrite(ctx context.Context, req *storagepb.CancelResumableWriteRequest, opts ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error) { return c.internalClient.CancelResumableWrite(ctx, req, opts...) } // GetObject retrieves object metadata. // // IAM Permissions: // // Requires storage.objects.get // IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. To return object ACLs, the authenticated user must also have // the storage.objects.getIamPolicy permission. func (c *Client) GetObject(ctx context.Context, req *storagepb.GetObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { return c.internalClient.GetObject(ctx, req, opts...) } // ReadObject retrieves object data. // // IAM Permissions: // // Requires storage.objects.get // IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. func (c *Client) ReadObject(ctx context.Context, req *storagepb.ReadObjectRequest, opts ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error) { return c.internalClient.ReadObject(ctx, req, opts...) } // BidiReadObject reads an object’s data. // // This is a bi-directional API with the added support for reading multiple // ranges within one stream both within and across multiple messages. // If the server encountered an error for any of the inputs, the stream will // be closed with the relevant error code. // Because the API allows for multiple outstanding requests, when the stream // is closed the error response will contain a BidiReadObjectRangesError proto // in the error extension describing the error for each outstanding read_id. // // IAM Permissions: // // # Requires storage.objects.get // // IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. // // This API is currently in preview and is not yet available for general // use. func (c *Client) BidiReadObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiReadObjectClient, error) { return c.internalClient.BidiReadObject(ctx, opts...) } // UpdateObject updates an object’s metadata. // Equivalent to JSON API’s storage.objects.patch. func (c *Client) UpdateObject(ctx context.Context, req *storagepb.UpdateObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { return c.internalClient.UpdateObject(ctx, req, opts...) } // WriteObject stores a new object and metadata. // // An object can be written either in a single message stream or in a // resumable sequence of message streams. To write using a single stream, // the client should include in the first message of the stream an // WriteObjectSpec describing the destination bucket, object, and any // preconditions. Additionally, the final message must set ‘finish_write’ to // true, or else it is an error. // // For a resumable write, the client should instead call // StartResumableWrite(), populating a WriteObjectSpec into that request. // They should then attach the returned upload_id to the first message of // each following call to WriteObject. If the stream is closed before // finishing the upload (either explicitly by the client or due to a network // error or an error response from the server), the client should do as // follows: // // Check the result Status of the stream, to determine if writing can be // resumed on this stream or must be restarted from scratch (by calling // StartResumableWrite()). The resumable errors are DEADLINE_EXCEEDED, // INTERNAL, and UNAVAILABLE. For each case, the client should use binary // exponential backoff before retrying. Additionally, writes can be // resumed after RESOURCE_EXHAUSTED errors, but only after taking // appropriate measures, which may include reducing aggregate send rate // across clients and/or requesting a quota increase for your project. // // If the call to WriteObject returns ABORTED, that indicates // concurrent attempts to update the resumable write, caused either by // multiple racing clients or by a single client where the previous // request was timed out on the client side but nonetheless reached the // server. In this case the client should take steps to prevent further // concurrent writes (e.g., increase the timeouts, stop using more than // one process to perform the upload, etc.), and then should follow the // steps below for resuming the upload. // // For resumable errors, the client should call QueryWriteStatus() and // then continue writing from the returned persisted_size. This may be // less than the amount of data the client previously sent. Note also that // it is acceptable to send data starting at an offset earlier than the // returned persisted_size; in this case, the service will skip data at // offsets that were already persisted (without checking that it matches // the previously written data), and write only the data starting from the // persisted offset. Even though the data isn’t written, it may still // incur a performance cost over resuming at the correct write offset. // This behavior can make client-side handling simpler in some cases. // // Clients must only send data that is a multiple of 256 KiB per message, // unless the object is being finished with finish_write set to true. // // The service will not view the object as complete until the client has // sent a WriteObjectRequest with finish_write set to true. Sending any // requests on a stream after sending a request with finish_write set to // true will cause an error. The client should check the response it // receives to determine how much data the service was able to commit and // whether the service views the object as complete. // // Attempting to resume an already finalized object will result in an OK // status, with a WriteObjectResponse containing the finalized object’s // metadata. // // Alternatively, the BidiWriteObject operation may be used to write an // object with controls over flushing and the ability to fetch the ability to // determine the current persisted size. // // IAM Permissions: // // Requires storage.objects.create // IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. func (c *Client) WriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error) { return c.internalClient.WriteObject(ctx, opts...) } // BidiWriteObject stores a new object and metadata. // // This is similar to the WriteObject call with the added support for // manual flushing of persisted state, and the ability to determine current // persisted size without closing the stream. // // The client may specify one or both of the state_lookup and flush fields // in each BidiWriteObjectRequest. If flush is specified, the data written // so far will be persisted to storage. If state_lookup is specified, the // service will respond with a BidiWriteObjectResponse that contains the // persisted size. If both flush and state_lookup are specified, the flush // will always occur before a state_lookup, so that both may be set in the // same request and the returned state will be the state of the object // post-flush. When the stream is closed, a BidiWriteObjectResponse will // always be sent to the client, regardless of the value of state_lookup. func (c *Client) BidiWriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error) { return c.internalClient.BidiWriteObject(ctx, opts...) } // ListObjects retrieves a list of objects matching the criteria. // // IAM Permissions: // // The authenticated user requires storage.objects.list // IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) // to use this method. To return object ACLs, the authenticated user must also // have the storage.objects.getIamPolicy permission. func (c *Client) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator { return c.internalClient.ListObjects(ctx, req, opts...) } // RewriteObject rewrites a source object to a destination object. Optionally overrides // metadata. func (c *Client) RewriteObject(ctx context.Context, req *storagepb.RewriteObjectRequest, opts ...gax.CallOption) (*storagepb.RewriteResponse, error) { return c.internalClient.RewriteObject(ctx, req, opts...) } // StartResumableWrite starts a resumable write operation. This // method is part of the Resumable // upload (at https://cloud.google.com/storage/docs/resumable-uploads) feature. // This allows you to upload large objects in multiple chunks, which is more // resilient to network interruptions than a single upload. The validity // duration of the write operation, and the consequences of it becoming // invalid, are service-dependent. // // IAM Permissions: // // Requires storage.objects.create // IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. func (c *Client) StartResumableWrite(ctx context.Context, req *storagepb.StartResumableWriteRequest, opts ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error) { return c.internalClient.StartResumableWrite(ctx, req, opts...) } // QueryWriteStatus determines the persisted_size of an object that is being written. This // method is part of the resumable // upload (at https://cloud.google.com/storage/docs/resumable-uploads) feature. // The returned value is the size of the object that has been persisted so // far. The value can be used as the write_offset for the next Write() // call. // // If the object does not exist, meaning if it was deleted, or the // first Write() has not yet reached the service, this method returns the // error NOT_FOUND. // // This method is useful for clients that buffer data and need to know which // data can be safely evicted. The client can call QueryWriteStatus() at any // time to determine how much data has been logged for this object. // For any sequence of QueryWriteStatus() calls for a given // object name, the sequence of returned persisted_size values are // non-decreasing. func (c *Client) QueryWriteStatus(ctx context.Context, req *storagepb.QueryWriteStatusRequest, opts ...gax.CallOption) (*storagepb.QueryWriteStatusResponse, error) { return c.internalClient.QueryWriteStatus(ctx, req, opts...) } // MoveObject moves the source object to the destination object in the same bucket. func (c *Client) MoveObject(ctx context.Context, req *storagepb.MoveObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { return c.internalClient.MoveObject(ctx, req, opts...) } // gRPCClient is a client for interacting with Cloud Storage API over gRPC transport. // // Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. type gRPCClient struct { // Connection pool of gRPC connections to the service. connPool gtransport.ConnPool // Points back to the CallOptions field of the containing Client CallOptions **CallOptions // The gRPC API client. client storagepb.StorageClient // The x-goog-* metadata to be sent with each request. xGoogHeaders []string logger *slog.Logger } // NewClient creates a new storage client based on gRPC. // The returned client must be Closed when it is done being used to clean up its underlying connections. // // API Overview and Naming SyntaxThe Cloud Storage gRPC API allows applications to read and write data through // the abstractions of buckets and objects. For a description of these // abstractions please see https://cloud.google.com/storage/docs (at https://cloud.google.com/storage/docs). // // Resources are named as follows: // // Projects are referred to as they are defined by the Resource Manager API, // using strings like projects/123456 or projects/my-string-id. // // Buckets are named using string names of the form: // projects/{project}/buckets/{bucket} // For globally unique buckets, _ may be substituted for the project. // // Objects are uniquely identified by their name along with the name of the // bucket they belong to, as separate strings in this API. For example: // // ReadObjectRequest { // bucket: ‘projects/_/buckets/my-bucket’ // object: ‘my-object’ // } // Note that object names can contain / characters, which are treated as // any other character (no special directory semantics). func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { clientOpts := defaultGRPCClientOptions() if newClientHook != nil { hookOpts, err := newClientHook(ctx, clientHookParams{}) if err != nil { return nil, err } clientOpts = append(clientOpts, hookOpts...) } connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...) if err != nil { return nil, err } client := Client{CallOptions: defaultCallOptions()} c := &gRPCClient{ connPool: connPool, client: storagepb.NewStorageClient(connPool), CallOptions: &client.CallOptions, logger: internaloption.GetLogger(opts), } c.setGoogleClientInfo() client.internalClient = c return &client, nil } // Connection returns a connection to the API service. // // Deprecated: Connections are now pooled so this method does not always // return the same resource. func (c *gRPCClient) Connection() *grpc.ClientConn { return c.connPool.Conn() } // setGoogleClientInfo sets the name and version of the application in // the `x-goog-api-client` header passed on each request. Intended for // use by Google-written clients. func (c *gRPCClient) setGoogleClientInfo(keyval ...string) { kv := append([]string{"gl-go", gax.GoVersion}, keyval...) kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version) c.xGoogHeaders = []string{ "x-goog-api-client", gax.XGoogHeader(kv...), } } // Close closes the connection to the API service. The user should invoke this when // the client is no longer required. func (c *gRPCClient) Close() error { return c.connPool.Close() } func (c *gRPCClient) DeleteBucket(ctx context.Context, req *storagepb.DeleteBucketRequest, opts ...gax.CallOption) error { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetName()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetName())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetName())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteBucket[0:len((*c.CallOptions).DeleteBucket):len((*c.CallOptions).DeleteBucket)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.client.DeleteBucket, req, settings.GRPC, c.logger, "DeleteBucket") return err }, opts...) return err } func (c *gRPCClient) GetBucket(ctx context.Context, req *storagepb.GetBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetName()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetName())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetName())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetBucket[0:len((*c.CallOptions).GetBucket):len((*c.CallOptions).GetBucket)], opts...) var resp *storagepb.Bucket err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.GetBucket, req, settings.GRPC, c.logger, "GetBucket") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) CreateBucket(ctx context.Context, req *storagepb.CreateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetParent()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])) > 0 { routingHeadersMap["project"] = url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1]) } if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetBucket().GetProject()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket().GetProject())[1])) > 0 { routingHeadersMap["project"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket().GetProject())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CreateBucket[0:len((*c.CallOptions).CreateBucket):len((*c.CallOptions).CreateBucket)], opts...) var resp *storagepb.Bucket err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.CreateBucket, req, settings.GRPC, c.logger, "CreateBucket") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) ListBuckets(ctx context.Context, req *storagepb.ListBucketsRequest, opts ...gax.CallOption) *BucketIterator { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetParent()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])) > 0 { routingHeadersMap["project"] = url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListBuckets[0:len((*c.CallOptions).ListBuckets):len((*c.CallOptions).ListBuckets)], opts...) it := &BucketIterator{} req = proto.Clone(req).(*storagepb.ListBucketsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*storagepb.Bucket, string, error) { resp := &storagepb.ListBucketsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.ListBuckets, req, settings.GRPC, c.logger, "ListBuckets") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetBuckets(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *gRPCClient) LockBucketRetentionPolicy(ctx context.Context, req *storagepb.LockBucketRetentionPolicyRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).LockBucketRetentionPolicy[0:len((*c.CallOptions).LockBucketRetentionPolicy):len((*c.CallOptions).LockBucketRetentionPolicy)], opts...) var resp *storagepb.Bucket err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.LockBucketRetentionPolicy, req, settings.GRPC, c.logger, "LockBucketRetentionPolicy") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetIamPolicy[0:len((*c.CallOptions).GetIamPolicy):len((*c.CallOptions).GetIamPolicy)], opts...) var resp *iampb.Policy err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.GetIamPolicy, req, settings.GRPC, c.logger, "GetIamPolicy") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).SetIamPolicy[0:len((*c.CallOptions).SetIamPolicy):len((*c.CallOptions).SetIamPolicy)], opts...) var resp *iampb.Policy err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.SetIamPolicy, req, settings.GRPC, c.logger, "SetIamPolicy") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1]) } if reg := regexp.MustCompile("(?Pprojects/[^/]+/buckets/[^/]+)/objects(?:/.*)?"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1]) } if reg := regexp.MustCompile("(?Pprojects/[^/]+/buckets/[^/]+)/managedFolders(?:/.*)?"); reg.MatchString(req.GetResource()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetResource())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).TestIamPermissions[0:len((*c.CallOptions).TestIamPermissions):len((*c.CallOptions).TestIamPermissions)], opts...) var resp *iampb.TestIamPermissionsResponse err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.TestIamPermissions, req, settings.GRPC, c.logger, "TestIamPermissions") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) UpdateBucket(ctx context.Context, req *storagepb.UpdateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetBucket().GetName()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket().GetName())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket().GetName())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateBucket[0:len((*c.CallOptions).UpdateBucket):len((*c.CallOptions).UpdateBucket)], opts...) var resp *storagepb.Bucket err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.UpdateBucket, req, settings.GRPC, c.logger, "UpdateBucket") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) ComposeObject(ctx context.Context, req *storagepb.ComposeObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetDestination().GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetDestination().GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetDestination().GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ComposeObject[0:len((*c.CallOptions).ComposeObject):len((*c.CallOptions).ComposeObject)], opts...) var resp *storagepb.Object err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.ComposeObject, req, settings.GRPC, c.logger, "ComposeObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) DeleteObject(ctx context.Context, req *storagepb.DeleteObjectRequest, opts ...gax.CallOption) error { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).DeleteObject[0:len((*c.CallOptions).DeleteObject):len((*c.CallOptions).DeleteObject)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error _, err = executeRPC(ctx, c.client.DeleteObject, req, settings.GRPC, c.logger, "DeleteObject") return err }, opts...) return err } func (c *gRPCClient) RestoreObject(ctx context.Context, req *storagepb.RestoreObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).RestoreObject[0:len((*c.CallOptions).RestoreObject):len((*c.CallOptions).RestoreObject)], opts...) var resp *storagepb.Object err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.RestoreObject, req, settings.GRPC, c.logger, "RestoreObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) CancelResumableWrite(ctx context.Context, req *storagepb.CancelResumableWriteRequest, opts ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?"); reg.MatchString(req.GetUploadId()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetUploadId())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetUploadId())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).CancelResumableWrite[0:len((*c.CallOptions).CancelResumableWrite):len((*c.CallOptions).CancelResumableWrite)], opts...) var resp *storagepb.CancelResumableWriteResponse err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.CancelResumableWrite, req, settings.GRPC, c.logger, "CancelResumableWrite") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) GetObject(ctx context.Context, req *storagepb.GetObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).GetObject[0:len((*c.CallOptions).GetObject):len((*c.CallOptions).GetObject)], opts...) var resp *storagepb.Object err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.GetObject, req, settings.GRPC, c.logger, "GetObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) ReadObject(ctx context.Context, req *storagepb.ReadObjectRequest, opts ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ReadObject[0:len((*c.CallOptions).ReadObject):len((*c.CallOptions).ReadObject)], opts...) var resp storagepb.Storage_ReadObjectClient err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error c.logger.DebugContext(ctx, "api streaming client request", "serviceName", serviceName, "rpcName", "ReadObject") resp, err = c.client.ReadObject(ctx, req, settings.GRPC...) c.logger.DebugContext(ctx, "api streaming client response", "serviceName", serviceName, "rpcName", "ReadObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) BidiReadObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiReadObjectClient, error) { ctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...) var resp storagepb.Storage_BidiReadObjectClient opts = append((*c.CallOptions).BidiReadObject[0:len((*c.CallOptions).BidiReadObject):len((*c.CallOptions).BidiReadObject)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error c.logger.DebugContext(ctx, "api streaming client request", "serviceName", serviceName, "rpcName", "BidiReadObject") resp, err = c.client.BidiReadObject(ctx, settings.GRPC...) c.logger.DebugContext(ctx, "api streaming client response", "serviceName", serviceName, "rpcName", "BidiReadObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) UpdateObject(ctx context.Context, req *storagepb.UpdateObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetObject().GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetObject().GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetObject().GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).UpdateObject[0:len((*c.CallOptions).UpdateObject):len((*c.CallOptions).UpdateObject)], opts...) var resp *storagepb.Object err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.UpdateObject, req, settings.GRPC, c.logger, "UpdateObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) WriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error) { ctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...) var resp storagepb.Storage_WriteObjectClient opts = append((*c.CallOptions).WriteObject[0:len((*c.CallOptions).WriteObject):len((*c.CallOptions).WriteObject)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error c.logger.DebugContext(ctx, "api streaming client request", "serviceName", serviceName, "rpcName", "WriteObject") resp, err = c.client.WriteObject(ctx, settings.GRPC...) c.logger.DebugContext(ctx, "api streaming client response", "serviceName", serviceName, "rpcName", "WriteObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) BidiWriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error) { ctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...) var resp storagepb.Storage_BidiWriteObjectClient opts = append((*c.CallOptions).BidiWriteObject[0:len((*c.CallOptions).BidiWriteObject):len((*c.CallOptions).BidiWriteObject)], opts...) err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error c.logger.DebugContext(ctx, "api streaming client request", "serviceName", serviceName, "rpcName", "BidiWriteObject") resp, err = c.client.BidiWriteObject(ctx, settings.GRPC...) c.logger.DebugContext(ctx, "api streaming client response", "serviceName", serviceName, "rpcName", "BidiWriteObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetParent()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetParent())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).ListObjects[0:len((*c.CallOptions).ListObjects):len((*c.CallOptions).ListObjects)], opts...) it := &ObjectIterator{} req = proto.Clone(req).(*storagepb.ListObjectsRequest) it.InternalFetch = func(pageSize int, pageToken string) ([]*storagepb.Object, string, error) { resp := &storagepb.ListObjectsResponse{} if pageToken != "" { req.PageToken = pageToken } if pageSize > math.MaxInt32 { req.PageSize = math.MaxInt32 } else if pageSize != 0 { req.PageSize = int32(pageSize) } err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.ListObjects, req, settings.GRPC, c.logger, "ListObjects") return err }, opts...) if err != nil { return nil, "", err } it.Response = resp return resp.GetObjects(), resp.GetNextPageToken(), nil } fetch := func(pageSize int, pageToken string) (string, error) { items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) if err != nil { return "", err } it.items = append(it.items, items...) return nextPageToken, nil } it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) it.pageInfo.MaxSize = int(req.GetPageSize()) it.pageInfo.Token = req.GetPageToken() return it } func (c *gRPCClient) RewriteObject(ctx context.Context, req *storagepb.RewriteObjectRequest, opts ...gax.CallOption) (*storagepb.RewriteResponse, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(.*)"); reg.MatchString(req.GetSourceBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetSourceBucket())[1])) > 0 { routingHeadersMap["source_bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetSourceBucket())[1]) } if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetDestinationBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetDestinationBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetDestinationBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).RewriteObject[0:len((*c.CallOptions).RewriteObject):len((*c.CallOptions).RewriteObject)], opts...) var resp *storagepb.RewriteResponse err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.RewriteObject, req, settings.GRPC, c.logger, "RewriteObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) StartResumableWrite(ctx context.Context, req *storagepb.StartResumableWriteRequest, opts ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetWriteObjectSpec().GetResource().GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetWriteObjectSpec().GetResource().GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetWriteObjectSpec().GetResource().GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).StartResumableWrite[0:len((*c.CallOptions).StartResumableWrite):len((*c.CallOptions).StartResumableWrite)], opts...) var resp *storagepb.StartResumableWriteResponse err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.StartResumableWrite, req, settings.GRPC, c.logger, "StartResumableWrite") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) QueryWriteStatus(ctx context.Context, req *storagepb.QueryWriteStatusRequest, opts ...gax.CallOption) (*storagepb.QueryWriteStatusResponse, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?Pprojects/[^/]+/buckets/[^/]+)(?:/.*)?"); reg.MatchString(req.GetUploadId()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetUploadId())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetUploadId())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).QueryWriteStatus[0:len((*c.CallOptions).QueryWriteStatus):len((*c.CallOptions).QueryWriteStatus)], opts...) var resp *storagepb.QueryWriteStatusResponse err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.QueryWriteStatus, req, settings.GRPC, c.logger, "QueryWriteStatus") return err }, opts...) if err != nil { return nil, err } return resp, nil } func (c *gRPCClient) MoveObject(ctx context.Context, req *storagepb.MoveObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) { routingHeaders := "" routingHeadersMap := make(map[string]string) if reg := regexp.MustCompile("(?P.*)"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 { routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1]) } for headerName, headerValue := range routingHeadersMap { routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue) } routingHeaders = strings.TrimSuffix(routingHeaders, "&") hds := []string{"x-goog-request-params", routingHeaders} hds = append(c.xGoogHeaders, hds...) ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...) opts = append((*c.CallOptions).MoveObject[0:len((*c.CallOptions).MoveObject):len((*c.CallOptions).MoveObject)], opts...) var resp *storagepb.Object err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { var err error resp, err = executeRPC(ctx, c.client.MoveObject, req, settings.GRPC, c.logger, "MoveObject") return err }, opts...) if err != nil { return nil, err } return resp, nil } ================================================ FILE: vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v4.25.3 // source: google/storage/v2/storage.proto package storagepb import ( context "context" reflect "reflect" sync "sync" iampb "cloud.google.com/go/iam/apiv1/iampb" _ "google.golang.org/genproto/googleapis/api/annotations" status "google.golang.org/genproto/googleapis/rpc/status" date "google.golang.org/genproto/googleapis/type/date" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status1 "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" durationpb "google.golang.org/protobuf/types/known/durationpb" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // A collection of constant values meaningful to the Storage API. type ServiceConstants_Values int32 const ( // Unused. Proto3 requires first enum to be 0. ServiceConstants_VALUES_UNSPECIFIED ServiceConstants_Values = 0 // The maximum size chunk that can will be returned in a single // ReadRequest. // 2 MiB. ServiceConstants_MAX_READ_CHUNK_BYTES ServiceConstants_Values = 2097152 // The maximum size chunk that can be sent in a single WriteObjectRequest. // 2 MiB. ServiceConstants_MAX_WRITE_CHUNK_BYTES ServiceConstants_Values = 2097152 // The maximum size of an object in MB - whether written in a single stream // or composed from multiple other objects. // 5 TiB. ServiceConstants_MAX_OBJECT_SIZE_MB ServiceConstants_Values = 5242880 // The maximum length field name that can be sent in a single // custom metadata field. // 1 KiB. ServiceConstants_MAX_CUSTOM_METADATA_FIELD_NAME_BYTES ServiceConstants_Values = 1024 // The maximum length field value that can be sent in a single // custom_metadata field. // 4 KiB. ServiceConstants_MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES ServiceConstants_Values = 4096 // The maximum total bytes that can be populated into all field names and // values of the custom_metadata for one object. // 8 KiB. ServiceConstants_MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES ServiceConstants_Values = 8192 // The maximum total bytes that can be populated into all bucket metadata // fields. // 20 KiB. ServiceConstants_MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES ServiceConstants_Values = 20480 // The maximum number of NotificationConfigs that can be registered // for a given bucket. ServiceConstants_MAX_NOTIFICATION_CONFIGS_PER_BUCKET ServiceConstants_Values = 100 // The maximum number of LifecycleRules that can be registered for a given // bucket. ServiceConstants_MAX_LIFECYCLE_RULES_PER_BUCKET ServiceConstants_Values = 100 // The maximum number of custom attributes per NotificationConfigs. ServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTES ServiceConstants_Values = 5 // The maximum length of a custom attribute key included in // NotificationConfig. ServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH ServiceConstants_Values = 256 // The maximum length of a custom attribute value included in a // NotificationConfig. ServiceConstants_MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH ServiceConstants_Values = 1024 // The maximum number of key/value entries per bucket label. ServiceConstants_MAX_LABELS_ENTRIES_COUNT ServiceConstants_Values = 64 // The maximum character length of the key or value in a bucket // label map. ServiceConstants_MAX_LABELS_KEY_VALUE_LENGTH ServiceConstants_Values = 63 // The maximum byte size of the key or value in a bucket label // map. ServiceConstants_MAX_LABELS_KEY_VALUE_BYTES ServiceConstants_Values = 128 // The maximum number of object IDs that can be included in a // DeleteObjectsRequest. ServiceConstants_MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST ServiceConstants_Values = 1000 // The maximum number of days for which a token returned by the // GetListObjectsSplitPoints RPC is valid. ServiceConstants_SPLIT_TOKEN_MAX_VALID_DAYS ServiceConstants_Values = 14 ) // Enum value maps for ServiceConstants_Values. var ( ServiceConstants_Values_name = map[int32]string{ 0: "VALUES_UNSPECIFIED", 2097152: "MAX_READ_CHUNK_BYTES", // Duplicate value: 2097152: "MAX_WRITE_CHUNK_BYTES", 5242880: "MAX_OBJECT_SIZE_MB", 1024: "MAX_CUSTOM_METADATA_FIELD_NAME_BYTES", 4096: "MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES", 8192: "MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES", 20480: "MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES", 100: "MAX_NOTIFICATION_CONFIGS_PER_BUCKET", // Duplicate value: 100: "MAX_LIFECYCLE_RULES_PER_BUCKET", 5: "MAX_NOTIFICATION_CUSTOM_ATTRIBUTES", 256: "MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH", // Duplicate value: 1024: "MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH", 64: "MAX_LABELS_ENTRIES_COUNT", 63: "MAX_LABELS_KEY_VALUE_LENGTH", 128: "MAX_LABELS_KEY_VALUE_BYTES", 1000: "MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST", 14: "SPLIT_TOKEN_MAX_VALID_DAYS", } ServiceConstants_Values_value = map[string]int32{ "VALUES_UNSPECIFIED": 0, "MAX_READ_CHUNK_BYTES": 2097152, "MAX_WRITE_CHUNK_BYTES": 2097152, "MAX_OBJECT_SIZE_MB": 5242880, "MAX_CUSTOM_METADATA_FIELD_NAME_BYTES": 1024, "MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES": 4096, "MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES": 8192, "MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES": 20480, "MAX_NOTIFICATION_CONFIGS_PER_BUCKET": 100, "MAX_LIFECYCLE_RULES_PER_BUCKET": 100, "MAX_NOTIFICATION_CUSTOM_ATTRIBUTES": 5, "MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH": 256, "MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH": 1024, "MAX_LABELS_ENTRIES_COUNT": 64, "MAX_LABELS_KEY_VALUE_LENGTH": 63, "MAX_LABELS_KEY_VALUE_BYTES": 128, "MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST": 1000, "SPLIT_TOKEN_MAX_VALID_DAYS": 14, } ) func (x ServiceConstants_Values) Enum() *ServiceConstants_Values { p := new(ServiceConstants_Values) *p = x return p } func (x ServiceConstants_Values) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ServiceConstants_Values) Descriptor() protoreflect.EnumDescriptor { return file_google_storage_v2_storage_proto_enumTypes[0].Descriptor() } func (ServiceConstants_Values) Type() protoreflect.EnumType { return &file_google_storage_v2_storage_proto_enumTypes[0] } func (x ServiceConstants_Values) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use ServiceConstants_Values.Descriptor instead. func (ServiceConstants_Values) EnumDescriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{42, 0} } // Request message for DeleteBucket. type DeleteBucketRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Name of a bucket to delete. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // If set, only deletes the bucket if its metageneration matches this value. IfMetagenerationMatch *int64 `protobuf:"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // If set, only deletes the bucket if its metageneration does not match this // value. IfMetagenerationNotMatch *int64 `protobuf:"varint,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` } func (x *DeleteBucketRequest) Reset() { *x = DeleteBucketRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteBucketRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteBucketRequest) ProtoMessage() {} func (x *DeleteBucketRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteBucketRequest.ProtoReflect.Descriptor instead. func (*DeleteBucketRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{0} } func (x *DeleteBucketRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *DeleteBucketRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *DeleteBucketRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } // Request message for GetBucket. type GetBucketRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Name of a bucket. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // If set, and if the bucket's current metageneration does not match the // specified value, the request will return an error. IfMetagenerationMatch *int64 `protobuf:"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // If set, and if the bucket's current metageneration matches the specified // value, the request will return an error. IfMetagenerationNotMatch *int64 `protobuf:"varint,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // Mask specifying which fields to read. // A "*" field may be used to indicate all fields. // If no mask is specified, will default to all fields. ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"` } func (x *GetBucketRequest) Reset() { *x = GetBucketRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetBucketRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetBucketRequest) ProtoMessage() {} func (x *GetBucketRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetBucketRequest.ProtoReflect.Descriptor instead. func (*GetBucketRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{1} } func (x *GetBucketRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *GetBucketRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *GetBucketRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *GetBucketRequest) GetReadMask() *fieldmaskpb.FieldMask { if x != nil { return x.ReadMask } return nil } // Request message for CreateBucket. type CreateBucketRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The project to which this bucket will belong. Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // Properties of the new bucket being inserted. // The name of the bucket is specified in the `bucket_id` field. Populating // `bucket.name` field will result in an error. // The project of the bucket must be specified in the `bucket.project` field. // This field must be in `projects/{projectIdentifier}` format, // {projectIdentifier} can be the project ID or project number. The `parent` // field must be either empty or `projects/_`. Bucket *Bucket `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. The ID to use for this bucket, which will become the final // component of the bucket's resource name. For example, the value `foo` might // result in a bucket with the name `projects/123456/buckets/foo`. BucketId string `protobuf:"bytes,3,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` // Apply a predefined set of access controls to this bucket. // Valid values are "authenticatedRead", "private", "projectPrivate", // "publicRead", or "publicReadWrite". PredefinedAcl string `protobuf:"bytes,6,opt,name=predefined_acl,json=predefinedAcl,proto3" json:"predefined_acl,omitempty"` // Apply a predefined set of default object access controls to this bucket. // Valid values are "authenticatedRead", "bucketOwnerFullControl", // "bucketOwnerRead", "private", "projectPrivate", or "publicRead". PredefinedDefaultObjectAcl string `protobuf:"bytes,7,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3" json:"predefined_default_object_acl,omitempty"` } func (x *CreateBucketRequest) Reset() { *x = CreateBucketRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CreateBucketRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CreateBucketRequest) ProtoMessage() {} func (x *CreateBucketRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CreateBucketRequest.ProtoReflect.Descriptor instead. func (*CreateBucketRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{2} } func (x *CreateBucketRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *CreateBucketRequest) GetBucket() *Bucket { if x != nil { return x.Bucket } return nil } func (x *CreateBucketRequest) GetBucketId() string { if x != nil { return x.BucketId } return "" } func (x *CreateBucketRequest) GetPredefinedAcl() string { if x != nil { return x.PredefinedAcl } return "" } func (x *CreateBucketRequest) GetPredefinedDefaultObjectAcl() string { if x != nil { return x.PredefinedDefaultObjectAcl } return "" } // Request message for ListBuckets. type ListBucketsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The project whose buckets we are listing. Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // Maximum number of buckets to return in a single response. The service will // use this parameter or 1,000 items, whichever is smaller. If "acl" is // present in the read_mask, the service will use this parameter of 200 items, // whichever is smaller. PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // A previously-returned page token representing part of the larger set of // results to view. PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // Filter results to buckets whose names begin with this prefix. Prefix string `protobuf:"bytes,4,opt,name=prefix,proto3" json:"prefix,omitempty"` // Mask specifying which fields to read from each result. // If no mask is specified, will default to all fields except items.owner, // items.acl, and items.default_object_acl. // * may be used to mean "all fields". ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"` } func (x *ListBucketsRequest) Reset() { *x = ListBucketsRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListBucketsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListBucketsRequest) ProtoMessage() {} func (x *ListBucketsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListBucketsRequest.ProtoReflect.Descriptor instead. func (*ListBucketsRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{3} } func (x *ListBucketsRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *ListBucketsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListBucketsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } func (x *ListBucketsRequest) GetPrefix() string { if x != nil { return x.Prefix } return "" } func (x *ListBucketsRequest) GetReadMask() *fieldmaskpb.FieldMask { if x != nil { return x.ReadMask } return nil } // The result of a call to Buckets.ListBuckets type ListBucketsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The list of items. Buckets []*Bucket `protobuf:"bytes,1,rep,name=buckets,proto3" json:"buckets,omitempty"` // The continuation token, used to page through large result sets. Provide // this value in a subsequent request to return the next page of results. NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListBucketsResponse) Reset() { *x = ListBucketsResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListBucketsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListBucketsResponse) ProtoMessage() {} func (x *ListBucketsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListBucketsResponse.ProtoReflect.Descriptor instead. func (*ListBucketsResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{4} } func (x *ListBucketsResponse) GetBuckets() []*Bucket { if x != nil { return x.Buckets } return nil } func (x *ListBucketsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // Request message for LockBucketRetentionPolicyRequest. type LockBucketRetentionPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Name of a bucket. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. Makes the operation conditional on whether bucket's current // metageneration matches the given value. Must be positive. IfMetagenerationMatch int64 `protobuf:"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3" json:"if_metageneration_match,omitempty"` } func (x *LockBucketRetentionPolicyRequest) Reset() { *x = LockBucketRetentionPolicyRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *LockBucketRetentionPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*LockBucketRetentionPolicyRequest) ProtoMessage() {} func (x *LockBucketRetentionPolicyRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use LockBucketRetentionPolicyRequest.ProtoReflect.Descriptor instead. func (*LockBucketRetentionPolicyRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{5} } func (x *LockBucketRetentionPolicyRequest) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *LockBucketRetentionPolicyRequest) GetIfMetagenerationMatch() int64 { if x != nil { return x.IfMetagenerationMatch } return 0 } // Request for UpdateBucket method. type UpdateBucketRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The bucket to update. // The bucket's `name` field will be used to identify the bucket. Bucket *Bucket `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // If set, will only modify the bucket if its metageneration matches this // value. IfMetagenerationMatch *int64 `protobuf:"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // If set, will only modify the bucket if its metageneration does not match // this value. IfMetagenerationNotMatch *int64 `protobuf:"varint,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // Apply a predefined set of access controls to this bucket. // Valid values are "authenticatedRead", "private", "projectPrivate", // "publicRead", or "publicReadWrite". PredefinedAcl string `protobuf:"bytes,8,opt,name=predefined_acl,json=predefinedAcl,proto3" json:"predefined_acl,omitempty"` // Apply a predefined set of default object access controls to this bucket. // Valid values are "authenticatedRead", "bucketOwnerFullControl", // "bucketOwnerRead", "private", "projectPrivate", or "publicRead". PredefinedDefaultObjectAcl string `protobuf:"bytes,9,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3" json:"predefined_default_object_acl,omitempty"` // Required. List of fields to be updated. // // To specify ALL fields, equivalent to the JSON API's "update" function, // specify a single field with the value `*`. Note: not recommended. If a new // field is introduced at a later time, an older client updating with the `*` // may accidentally reset the new field's value. // // Not specifying any fields is an error. UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,6,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` } func (x *UpdateBucketRequest) Reset() { *x = UpdateBucketRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateBucketRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateBucketRequest) ProtoMessage() {} func (x *UpdateBucketRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateBucketRequest.ProtoReflect.Descriptor instead. func (*UpdateBucketRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{6} } func (x *UpdateBucketRequest) GetBucket() *Bucket { if x != nil { return x.Bucket } return nil } func (x *UpdateBucketRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *UpdateBucketRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *UpdateBucketRequest) GetPredefinedAcl() string { if x != nil { return x.PredefinedAcl } return "" } func (x *UpdateBucketRequest) GetPredefinedDefaultObjectAcl() string { if x != nil { return x.PredefinedDefaultObjectAcl } return "" } func (x *UpdateBucketRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } // Request message for ComposeObject. type ComposeObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Properties of the resulting object. Destination *Object `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"` // The list of source objects that will be concatenated into a single object. SourceObjects []*ComposeObjectRequest_SourceObject `protobuf:"bytes,2,rep,name=source_objects,json=sourceObjects,proto3" json:"source_objects,omitempty"` // Apply a predefined set of access controls to the destination object. // Valid values are "authenticatedRead", "bucketOwnerFullControl", // "bucketOwnerRead", "private", "projectPrivate", or "publicRead". DestinationPredefinedAcl string `protobuf:"bytes,9,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3" json:"destination_predefined_acl,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,5,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Resource name of the Cloud KMS key, of the form // `projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key`, // that will be used to encrypt the object. Overrides the object // metadata's `kms_key_name` value, if any. KmsKey string `protobuf:"bytes,6,opt,name=kms_key,json=kmsKey,proto3" json:"kms_key,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,7,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // The checksums of the complete object. This will be validated against the // combined checksums of the component objects. ObjectChecksums *ObjectChecksums `protobuf:"bytes,10,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"` } func (x *ComposeObjectRequest) Reset() { *x = ComposeObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ComposeObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ComposeObjectRequest) ProtoMessage() {} func (x *ComposeObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ComposeObjectRequest.ProtoReflect.Descriptor instead. func (*ComposeObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{7} } func (x *ComposeObjectRequest) GetDestination() *Object { if x != nil { return x.Destination } return nil } func (x *ComposeObjectRequest) GetSourceObjects() []*ComposeObjectRequest_SourceObject { if x != nil { return x.SourceObjects } return nil } func (x *ComposeObjectRequest) GetDestinationPredefinedAcl() string { if x != nil { return x.DestinationPredefinedAcl } return "" } func (x *ComposeObjectRequest) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *ComposeObjectRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *ComposeObjectRequest) GetKmsKey() string { if x != nil { return x.KmsKey } return "" } func (x *ComposeObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } func (x *ComposeObjectRequest) GetObjectChecksums() *ObjectChecksums { if x != nil { return x.ObjectChecksums } return nil } // Message for deleting an object. // `bucket` and `object` **must** be set. type DeleteObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Name of the bucket in which the object resides. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. The name of the finalized object to delete. // Note: If you want to delete an unfinalized resumable upload please use // `CancelResumableWrite`. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, permanently deletes a specific revision of this object (as // opposed to the latest version, the default). Generation int64 `protobuf:"varint,4,opt,name=generation,proto3" json:"generation,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,5,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's live generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *int64 `protobuf:"varint,6,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,7,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,8,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` } func (x *DeleteObjectRequest) Reset() { *x = DeleteObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *DeleteObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeleteObjectRequest) ProtoMessage() {} func (x *DeleteObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeleteObjectRequest.ProtoReflect.Descriptor instead. func (*DeleteObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{8} } func (x *DeleteObjectRequest) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *DeleteObjectRequest) GetObject() string { if x != nil { return x.Object } return "" } func (x *DeleteObjectRequest) GetGeneration() int64 { if x != nil { return x.Generation } return 0 } func (x *DeleteObjectRequest) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *DeleteObjectRequest) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *DeleteObjectRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *DeleteObjectRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *DeleteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } // Message for restoring an object. // `bucket`, `object`, and `generation` **must** be set. type RestoreObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Name of the bucket in which the object resides. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. The name of the object to restore. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // Required. The specific revision of the object to restore. Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // Optional. Restore token used to differentiate soft-deleted objects with the // same name and generation. Only applicable for hierarchical namespace // buckets. This parameter is optional, and is only required in the rare case // when there are multiple soft-deleted objects with the same name and // generation. RestoreToken string `protobuf:"bytes,11,opt,name=restore_token,json=restoreToken,proto3" json:"restore_token,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's live generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *int64 `protobuf:"varint,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // If false or unset, the bucket's default object ACL will be used. // If true, copy the source object's access controls. // Return an error if bucket has UBLA enabled. CopySourceAcl *bool `protobuf:"varint,9,opt,name=copy_source_acl,json=copySourceAcl,proto3,oneof" json:"copy_source_acl,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` } func (x *RestoreObjectRequest) Reset() { *x = RestoreObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *RestoreObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*RestoreObjectRequest) ProtoMessage() {} func (x *RestoreObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RestoreObjectRequest.ProtoReflect.Descriptor instead. func (*RestoreObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{9} } func (x *RestoreObjectRequest) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *RestoreObjectRequest) GetObject() string { if x != nil { return x.Object } return "" } func (x *RestoreObjectRequest) GetGeneration() int64 { if x != nil { return x.Generation } return 0 } func (x *RestoreObjectRequest) GetRestoreToken() string { if x != nil { return x.RestoreToken } return "" } func (x *RestoreObjectRequest) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *RestoreObjectRequest) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *RestoreObjectRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *RestoreObjectRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *RestoreObjectRequest) GetCopySourceAcl() bool { if x != nil && x.CopySourceAcl != nil { return *x.CopySourceAcl } return false } func (x *RestoreObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } // Message for canceling an in-progress resumable upload. // `upload_id` **must** be set. type CancelResumableWriteRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The upload_id of the resumable upload to cancel. This should be // copied from the `upload_id` field of `StartResumableWriteResponse`. UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } func (x *CancelResumableWriteRequest) Reset() { *x = CancelResumableWriteRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CancelResumableWriteRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*CancelResumableWriteRequest) ProtoMessage() {} func (x *CancelResumableWriteRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CancelResumableWriteRequest.ProtoReflect.Descriptor instead. func (*CancelResumableWriteRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{10} } func (x *CancelResumableWriteRequest) GetUploadId() string { if x != nil { return x.UploadId } return "" } // Empty response message for canceling an in-progress resumable upload, will be // extended as needed. type CancelResumableWriteResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *CancelResumableWriteResponse) Reset() { *x = CancelResumableWriteResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CancelResumableWriteResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*CancelResumableWriteResponse) ProtoMessage() {} func (x *CancelResumableWriteResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CancelResumableWriteResponse.ProtoReflect.Descriptor instead. func (*CancelResumableWriteResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{11} } // Request message for ReadObject. type ReadObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The name of the bucket containing the object to read. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. The name of the object to read. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed // to the latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // The offset for the first byte to return in the read, relative to the start // of the object. // // A negative `read_offset` value will be interpreted as the number of bytes // back from the end of the object to be returned. For example, if an object's // length is 15 bytes, a ReadObjectRequest with `read_offset` = -5 and // `read_limit` = 3 would return bytes 10 through 12 of the object. Requesting // a negative offset with magnitude larger than the size of the object will // return the entire object. ReadOffset int64 `protobuf:"varint,4,opt,name=read_offset,json=readOffset,proto3" json:"read_offset,omitempty"` // The maximum number of `data` bytes the server is allowed to return in the // sum of all `Object` messages. A `read_limit` of zero indicates that there // is no limit, and a negative `read_limit` will cause an error. // // If the stream returns fewer bytes than allowed by the `read_limit` and no // error occurred, the stream includes all data from the `read_offset` to the // end of the resource. ReadLimit int64 `protobuf:"varint,5,opt,name=read_limit,json=readLimit,proto3" json:"read_limit,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,6,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's live generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *int64 `protobuf:"varint,7,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,8,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,9,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // Mask specifying which fields to read. // The checksummed_data field and its children will always be present. // If no mask is specified, will default to all fields except metadata.owner // and metadata.acl. // * may be used to mean "all fields". ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,12,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"` } func (x *ReadObjectRequest) Reset() { *x = ReadObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ReadObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ReadObjectRequest) ProtoMessage() {} func (x *ReadObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ReadObjectRequest.ProtoReflect.Descriptor instead. func (*ReadObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{12} } func (x *ReadObjectRequest) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *ReadObjectRequest) GetObject() string { if x != nil { return x.Object } return "" } func (x *ReadObjectRequest) GetGeneration() int64 { if x != nil { return x.Generation } return 0 } func (x *ReadObjectRequest) GetReadOffset() int64 { if x != nil { return x.ReadOffset } return 0 } func (x *ReadObjectRequest) GetReadLimit() int64 { if x != nil { return x.ReadLimit } return 0 } func (x *ReadObjectRequest) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *ReadObjectRequest) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *ReadObjectRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *ReadObjectRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *ReadObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } func (x *ReadObjectRequest) GetReadMask() *fieldmaskpb.FieldMask { if x != nil { return x.ReadMask } return nil } // Request message for GetObject. type GetObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Name of the bucket in which the object resides. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. Name of the object. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed to the // latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // If true, return the soft-deleted version of this object. SoftDeleted *bool `protobuf:"varint,11,opt,name=soft_deleted,json=softDeleted,proto3,oneof" json:"soft_deleted,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's live generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *int64 `protobuf:"varint,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // Mask specifying which fields to read. // If no mask is specified, will default to all fields except metadata.acl and // metadata.owner. // * may be used to mean "all fields". ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,10,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"` // Optional. Restore token used to differentiate soft-deleted objects with the // same name and generation. Only applicable for hierarchical namespace // buckets and if soft_deleted is set to true. This parameter is optional, and // is only required in the rare case when there are multiple soft-deleted // objects with the same name and generation. RestoreToken string `protobuf:"bytes,12,opt,name=restore_token,json=restoreToken,proto3" json:"restore_token,omitempty"` } func (x *GetObjectRequest) Reset() { *x = GetObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *GetObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetObjectRequest) ProtoMessage() {} func (x *GetObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetObjectRequest.ProtoReflect.Descriptor instead. func (*GetObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{13} } func (x *GetObjectRequest) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *GetObjectRequest) GetObject() string { if x != nil { return x.Object } return "" } func (x *GetObjectRequest) GetGeneration() int64 { if x != nil { return x.Generation } return 0 } func (x *GetObjectRequest) GetSoftDeleted() bool { if x != nil && x.SoftDeleted != nil { return *x.SoftDeleted } return false } func (x *GetObjectRequest) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *GetObjectRequest) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *GetObjectRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *GetObjectRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *GetObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } func (x *GetObjectRequest) GetReadMask() *fieldmaskpb.FieldMask { if x != nil { return x.ReadMask } return nil } func (x *GetObjectRequest) GetRestoreToken() string { if x != nil { return x.RestoreToken } return "" } // Response message for ReadObject. type ReadObjectResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A portion of the data for the object. The service **may** leave `data` // empty for any given `ReadResponse`. This enables the service to inform the // client that the request is still live while it is running an operation to // generate more data. ChecksummedData *ChecksummedData `protobuf:"bytes,1,opt,name=checksummed_data,json=checksummedData,proto3" json:"checksummed_data,omitempty"` // The checksums of the complete object. If the object is downloaded in full, // the client should compute one of these checksums over the downloaded object // and compare it against the value provided here. ObjectChecksums *ObjectChecksums `protobuf:"bytes,2,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"` // If read_offset and or read_limit was specified on the // ReadObjectRequest, ContentRange will be populated on the first // ReadObjectResponse message of the read stream. ContentRange *ContentRange `protobuf:"bytes,3,opt,name=content_range,json=contentRange,proto3" json:"content_range,omitempty"` // Metadata of the object whose media is being returned. // Only populated in the first response in the stream. Metadata *Object `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` } func (x *ReadObjectResponse) Reset() { *x = ReadObjectResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ReadObjectResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ReadObjectResponse) ProtoMessage() {} func (x *ReadObjectResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ReadObjectResponse.ProtoReflect.Descriptor instead. func (*ReadObjectResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{14} } func (x *ReadObjectResponse) GetChecksummedData() *ChecksummedData { if x != nil { return x.ChecksummedData } return nil } func (x *ReadObjectResponse) GetObjectChecksums() *ObjectChecksums { if x != nil { return x.ObjectChecksums } return nil } func (x *ReadObjectResponse) GetContentRange() *ContentRange { if x != nil { return x.ContentRange } return nil } func (x *ReadObjectResponse) GetMetadata() *Object { if x != nil { return x.Metadata } return nil } // Describes the object to read in a BidiReadObject request. type BidiReadObjectSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The name of the bucket containing the object to read. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. The name of the object to read. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // If present, selects a specific revision of this object (as opposed // to the latest version, the default). Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,4,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's live generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *int64 `protobuf:"varint,5,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,6,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // Mask specifying which fields to read. // The checksummed_data field and its children will always be present. // If no mask is specified, will default to all fields except metadata.owner // and metadata.acl. // * may be used to mean "all fields". // As per https://google.aip.dev/161, this field is deprecated. // As an alternative, grpc metadata can be used: // https://cloud.google.com/apis/docs/system-parameters#definitions // // Deprecated: Marked as deprecated in google/storage/v2/storage.proto. ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,12,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"` // The client can optionally set this field. The read handle is an optimized // way of creating new streams. Read handles are generated and periodically // refreshed from prior reads. ReadHandle *BidiReadHandle `protobuf:"bytes,13,opt,name=read_handle,json=readHandle,proto3,oneof" json:"read_handle,omitempty"` // The routing token that influences request routing for the stream. Must be // provided if a BidiReadObjectRedirectedError is returned. RoutingToken *string `protobuf:"bytes,14,opt,name=routing_token,json=routingToken,proto3,oneof" json:"routing_token,omitempty"` } func (x *BidiReadObjectSpec) Reset() { *x = BidiReadObjectSpec{} mi := &file_google_storage_v2_storage_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiReadObjectSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiReadObjectSpec) ProtoMessage() {} func (x *BidiReadObjectSpec) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiReadObjectSpec.ProtoReflect.Descriptor instead. func (*BidiReadObjectSpec) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{15} } func (x *BidiReadObjectSpec) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *BidiReadObjectSpec) GetObject() string { if x != nil { return x.Object } return "" } func (x *BidiReadObjectSpec) GetGeneration() int64 { if x != nil { return x.Generation } return 0 } func (x *BidiReadObjectSpec) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *BidiReadObjectSpec) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *BidiReadObjectSpec) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *BidiReadObjectSpec) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *BidiReadObjectSpec) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } // Deprecated: Marked as deprecated in google/storage/v2/storage.proto. func (x *BidiReadObjectSpec) GetReadMask() *fieldmaskpb.FieldMask { if x != nil { return x.ReadMask } return nil } func (x *BidiReadObjectSpec) GetReadHandle() *BidiReadHandle { if x != nil { return x.ReadHandle } return nil } func (x *BidiReadObjectSpec) GetRoutingToken() string { if x != nil && x.RoutingToken != nil { return *x.RoutingToken } return "" } // Request message for BidiReadObject. type BidiReadObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The first message of each stream should set this field. If this is not // the first message, an error will be returned. Describes the object to read. ReadObjectSpec *BidiReadObjectSpec `protobuf:"bytes,1,opt,name=read_object_spec,json=readObjectSpec,proto3" json:"read_object_spec,omitempty"` // Provides a list of 0 or more (up to 100) ranges to read. If a single range // is large enough to require multiple responses, they are guaranteed to be // delivered in increasing offset order. There are no ordering guarantees // across ranges. When no ranges are provided, the response message will not // include ObjectRangeData. For full object downloads, the offset and size can // be set to 0. ReadRanges []*ReadRange `protobuf:"bytes,8,rep,name=read_ranges,json=readRanges,proto3" json:"read_ranges,omitempty"` } func (x *BidiReadObjectRequest) Reset() { *x = BidiReadObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiReadObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiReadObjectRequest) ProtoMessage() {} func (x *BidiReadObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiReadObjectRequest.ProtoReflect.Descriptor instead. func (*BidiReadObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{16} } func (x *BidiReadObjectRequest) GetReadObjectSpec() *BidiReadObjectSpec { if x != nil { return x.ReadObjectSpec } return nil } func (x *BidiReadObjectRequest) GetReadRanges() []*ReadRange { if x != nil { return x.ReadRanges } return nil } // Response message for BidiReadObject. type BidiReadObjectResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A portion of the object's data. The service **may** leave data // empty for any given ReadResponse. This enables the service to inform the // client that the request is still live while it is running an operation to // generate more data. // The service **may** pipeline multiple responses belonging to different read // requests. Each ObjectRangeData entry will have a read_id // set to the same value as the corresponding source read request. ObjectDataRanges []*ObjectRangeData `protobuf:"bytes,6,rep,name=object_data_ranges,json=objectDataRanges,proto3" json:"object_data_ranges,omitempty"` // Metadata of the object whose media is being returned. // Only populated in the first response in the stream and not populated when // the stream is opened with a read handle. Metadata *Object `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` // This field will be periodically refreshed, however it may not be set in // every response. It allows the client to more efficiently open subsequent // bidirectional streams to the same object. ReadHandle *BidiReadHandle `protobuf:"bytes,7,opt,name=read_handle,json=readHandle,proto3" json:"read_handle,omitempty"` } func (x *BidiReadObjectResponse) Reset() { *x = BidiReadObjectResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiReadObjectResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiReadObjectResponse) ProtoMessage() {} func (x *BidiReadObjectResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiReadObjectResponse.ProtoReflect.Descriptor instead. func (*BidiReadObjectResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{17} } func (x *BidiReadObjectResponse) GetObjectDataRanges() []*ObjectRangeData { if x != nil { return x.ObjectDataRanges } return nil } func (x *BidiReadObjectResponse) GetMetadata() *Object { if x != nil { return x.Metadata } return nil } func (x *BidiReadObjectResponse) GetReadHandle() *BidiReadHandle { if x != nil { return x.ReadHandle } return nil } // Error proto containing details for a redirected read. This error is only // returned on initial open in case of a redirect. type BidiReadObjectRedirectedError struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The read handle for the redirected read. The client can use this for the // subsequent open. ReadHandle *BidiReadHandle `protobuf:"bytes,1,opt,name=read_handle,json=readHandle,proto3" json:"read_handle,omitempty"` // The routing token that should be used when reopening the read stream. RoutingToken *string `protobuf:"bytes,2,opt,name=routing_token,json=routingToken,proto3,oneof" json:"routing_token,omitempty"` } func (x *BidiReadObjectRedirectedError) Reset() { *x = BidiReadObjectRedirectedError{} mi := &file_google_storage_v2_storage_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiReadObjectRedirectedError) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiReadObjectRedirectedError) ProtoMessage() {} func (x *BidiReadObjectRedirectedError) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiReadObjectRedirectedError.ProtoReflect.Descriptor instead. func (*BidiReadObjectRedirectedError) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{18} } func (x *BidiReadObjectRedirectedError) GetReadHandle() *BidiReadHandle { if x != nil { return x.ReadHandle } return nil } func (x *BidiReadObjectRedirectedError) GetRoutingToken() string { if x != nil && x.RoutingToken != nil { return *x.RoutingToken } return "" } // Error proto containing details for a redirected write. This error is only // returned on initial open in case of a redirect. type BidiWriteObjectRedirectedError struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The routing token that should be used when reopening the write stream. RoutingToken *string `protobuf:"bytes,1,opt,name=routing_token,json=routingToken,proto3,oneof" json:"routing_token,omitempty"` // Opaque value describing a previous write. WriteHandle *BidiWriteHandle `protobuf:"bytes,2,opt,name=write_handle,json=writeHandle,proto3,oneof" json:"write_handle,omitempty"` // The generation of the object that triggered the redirect. // Note that if this error was returned as part of an appendable object // create, this object generation is now successfully created and // append_object_spec should be used when reconnecting. Generation *int64 `protobuf:"varint,3,opt,name=generation,proto3,oneof" json:"generation,omitempty"` } func (x *BidiWriteObjectRedirectedError) Reset() { *x = BidiWriteObjectRedirectedError{} mi := &file_google_storage_v2_storage_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiWriteObjectRedirectedError) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiWriteObjectRedirectedError) ProtoMessage() {} func (x *BidiWriteObjectRedirectedError) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiWriteObjectRedirectedError.ProtoReflect.Descriptor instead. func (*BidiWriteObjectRedirectedError) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{19} } func (x *BidiWriteObjectRedirectedError) GetRoutingToken() string { if x != nil && x.RoutingToken != nil { return *x.RoutingToken } return "" } func (x *BidiWriteObjectRedirectedError) GetWriteHandle() *BidiWriteHandle { if x != nil { return x.WriteHandle } return nil } func (x *BidiWriteObjectRedirectedError) GetGeneration() int64 { if x != nil && x.Generation != nil { return *x.Generation } return 0 } // Error extension proto containing details for all outstanding reads on the // failed stream type BidiReadObjectError struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The error code for each outstanding read_range ReadRangeErrors []*ReadRangeError `protobuf:"bytes,1,rep,name=read_range_errors,json=readRangeErrors,proto3" json:"read_range_errors,omitempty"` } func (x *BidiReadObjectError) Reset() { *x = BidiReadObjectError{} mi := &file_google_storage_v2_storage_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiReadObjectError) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiReadObjectError) ProtoMessage() {} func (x *BidiReadObjectError) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiReadObjectError.ProtoReflect.Descriptor instead. func (*BidiReadObjectError) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{20} } func (x *BidiReadObjectError) GetReadRangeErrors() []*ReadRangeError { if x != nil { return x.ReadRangeErrors } return nil } // Error extension proto containing details for a single range read type ReadRangeError struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The id of the corresponding read_range ReadId int64 `protobuf:"varint,1,opt,name=read_id,json=readId,proto3" json:"read_id,omitempty"` // The status which should be an enum value of [google.rpc.Code]. Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` } func (x *ReadRangeError) Reset() { *x = ReadRangeError{} mi := &file_google_storage_v2_storage_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ReadRangeError) String() string { return protoimpl.X.MessageStringOf(x) } func (*ReadRangeError) ProtoMessage() {} func (x *ReadRangeError) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ReadRangeError.ProtoReflect.Descriptor instead. func (*ReadRangeError) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{21} } func (x *ReadRangeError) GetReadId() int64 { if x != nil { return x.ReadId } return 0 } func (x *ReadRangeError) GetStatus() *status.Status { if x != nil { return x.Status } return nil } // Describes a range of bytes to read in a BidiReadObjectRanges request. type ReadRange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The offset for the first byte to return in the read, relative to // the start of the object. // // A negative read_offset value will be interpreted as the number of bytes // back from the end of the object to be returned. For example, if an object's // length is 15 bytes, a ReadObjectRequest with read_offset = -5 and // read_length = 3 would return bytes 10 through 12 of the object. Requesting // a negative offset with magnitude larger than the size of the object will // return the entire object. A read_offset larger than the size of the object // will result in an OutOfRange error. ReadOffset int64 `protobuf:"varint,1,opt,name=read_offset,json=readOffset,proto3" json:"read_offset,omitempty"` // Optional. The maximum number of data bytes the server is allowed to return // across all response messages with the same read_id. A read_length of zero // indicates to read until the resource end, and a negative read_length will // cause an error. If the stream returns fewer bytes than allowed by the // read_length and no error occurred, the stream includes all data from the // read_offset to the resource end. ReadLength int64 `protobuf:"varint,2,opt,name=read_length,json=readLength,proto3" json:"read_length,omitempty"` // Required. Read identifier provided by the client. When the client issues // more than one outstanding ReadRange on the same stream, responses can be // mapped back to their corresponding requests using this value. Clients must // ensure that all outstanding requests have different read_id values. The // server may close the stream with an error if this condition is not met. ReadId int64 `protobuf:"varint,3,opt,name=read_id,json=readId,proto3" json:"read_id,omitempty"` } func (x *ReadRange) Reset() { *x = ReadRange{} mi := &file_google_storage_v2_storage_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ReadRange) String() string { return protoimpl.X.MessageStringOf(x) } func (*ReadRange) ProtoMessage() {} func (x *ReadRange) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ReadRange.ProtoReflect.Descriptor instead. func (*ReadRange) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{22} } func (x *ReadRange) GetReadOffset() int64 { if x != nil { return x.ReadOffset } return 0 } func (x *ReadRange) GetReadLength() int64 { if x != nil { return x.ReadLength } return 0 } func (x *ReadRange) GetReadId() int64 { if x != nil { return x.ReadId } return 0 } // Contains data and metadata for a range of an object. type ObjectRangeData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A portion of the data for the object. ChecksummedData *ChecksummedData `protobuf:"bytes,1,opt,name=checksummed_data,json=checksummedData,proto3" json:"checksummed_data,omitempty"` // The ReadRange describes the content being returned with read_id set to the // corresponding ReadObjectRequest in the stream. Multiple ObjectRangeData // messages may have the same read_id but increasing offsets. // ReadObjectResponse messages with the same read_id are guaranteed to be // delivered in increasing offset order. ReadRange *ReadRange `protobuf:"bytes,2,opt,name=read_range,json=readRange,proto3" json:"read_range,omitempty"` // If set, indicates there are no more bytes to read for the given ReadRange. RangeEnd bool `protobuf:"varint,3,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` } func (x *ObjectRangeData) Reset() { *x = ObjectRangeData{} mi := &file_google_storage_v2_storage_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ObjectRangeData) String() string { return protoimpl.X.MessageStringOf(x) } func (*ObjectRangeData) ProtoMessage() {} func (x *ObjectRangeData) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ObjectRangeData.ProtoReflect.Descriptor instead. func (*ObjectRangeData) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{23} } func (x *ObjectRangeData) GetChecksummedData() *ChecksummedData { if x != nil { return x.ChecksummedData } return nil } func (x *ObjectRangeData) GetReadRange() *ReadRange { if x != nil { return x.ReadRange } return nil } func (x *ObjectRangeData) GetRangeEnd() bool { if x != nil { return x.RangeEnd } return false } // BidiReadHandle contains a handle from a previous BiDiReadObject // invocation. The client can use this instead of BidiReadObjectSpec as an // optimized way of opening subsequent bidirectional streams to the same object. type BidiReadHandle struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Opaque value describing a previous read. Handle []byte `protobuf:"bytes,1,opt,name=handle,proto3" json:"handle,omitempty"` } func (x *BidiReadHandle) Reset() { *x = BidiReadHandle{} mi := &file_google_storage_v2_storage_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiReadHandle) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiReadHandle) ProtoMessage() {} func (x *BidiReadHandle) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiReadHandle.ProtoReflect.Descriptor instead. func (*BidiReadHandle) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{24} } func (x *BidiReadHandle) GetHandle() []byte { if x != nil { return x.Handle } return nil } // BidiWriteHandle contains a handle from a previous BidiWriteObject // invocation. The client can use this as an optimized way of opening subsequent // bidirectional streams to the same object. type BidiWriteHandle struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Opaque value describing a previous write. Handle []byte `protobuf:"bytes,1,opt,name=handle,proto3" json:"handle,omitempty"` } func (x *BidiWriteHandle) Reset() { *x = BidiWriteHandle{} mi := &file_google_storage_v2_storage_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiWriteHandle) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiWriteHandle) ProtoMessage() {} func (x *BidiWriteHandle) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiWriteHandle.ProtoReflect.Descriptor instead. func (*BidiWriteHandle) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{25} } func (x *BidiWriteHandle) GetHandle() []byte { if x != nil { return x.Handle } return nil } // Describes an attempt to insert an object, possibly over multiple requests. type WriteObjectSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Destination object, including its name and its metadata. Resource *Object `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` // Apply a predefined set of access controls to this object. // Valid values are "authenticatedRead", "bucketOwnerFullControl", // "bucketOwnerRead", "private", "projectPrivate", or "publicRead". PredefinedAcl string `protobuf:"bytes,7,opt,name=predefined_acl,json=predefinedAcl,proto3" json:"predefined_acl,omitempty"` // Makes the operation conditional on whether the object's current // generation matches the given value. Setting to 0 makes the operation // succeed only if there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,3,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's live // generation does not match the given value. If no live object exists, the // precondition fails. Setting to 0 makes the operation succeed only if // there is a live version of the object. IfGenerationNotMatch *int64 `protobuf:"varint,4,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,5,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,6,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // The expected final object size being uploaded. // If this value is set, closing the stream after writing fewer or more than // `object_size` bytes will result in an OUT_OF_RANGE error. // // This situation is considered a client error, and if such an error occurs // you must start the upload over from scratch, this time sending the correct // number of bytes. ObjectSize *int64 `protobuf:"varint,8,opt,name=object_size,json=objectSize,proto3,oneof" json:"object_size,omitempty"` // If true, the object will be created in appendable mode. // This field may only be set when using BidiWriteObject. Appendable *bool `protobuf:"varint,9,opt,name=appendable,proto3,oneof" json:"appendable,omitempty"` } func (x *WriteObjectSpec) Reset() { *x = WriteObjectSpec{} mi := &file_google_storage_v2_storage_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *WriteObjectSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*WriteObjectSpec) ProtoMessage() {} func (x *WriteObjectSpec) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use WriteObjectSpec.ProtoReflect.Descriptor instead. func (*WriteObjectSpec) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{26} } func (x *WriteObjectSpec) GetResource() *Object { if x != nil { return x.Resource } return nil } func (x *WriteObjectSpec) GetPredefinedAcl() string { if x != nil { return x.PredefinedAcl } return "" } func (x *WriteObjectSpec) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *WriteObjectSpec) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *WriteObjectSpec) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *WriteObjectSpec) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *WriteObjectSpec) GetObjectSize() int64 { if x != nil && x.ObjectSize != nil { return *x.ObjectSize } return 0 } func (x *WriteObjectSpec) GetAppendable() bool { if x != nil && x.Appendable != nil { return *x.Appendable } return false } // Request message for WriteObject. type WriteObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The first message of each stream should set one of the following. // // Types that are assignable to FirstMessage: // // *WriteObjectRequest_UploadId // *WriteObjectRequest_WriteObjectSpec FirstMessage isWriteObjectRequest_FirstMessage `protobuf_oneof:"first_message"` // Required. The offset from the beginning of the object at which the data // should be written. // // In the first `WriteObjectRequest` of a `WriteObject()` action, it // indicates the initial offset for the `Write()` call. The value **must** be // equal to the `persisted_size` that a call to `QueryWriteStatus()` would // return (0 if this is the first write to the object). // // On subsequent calls, this value **must** be no larger than the sum of the // first `write_offset` and the sizes of all `data` chunks sent previously on // this stream. // // An incorrect value will cause an error. WriteOffset int64 `protobuf:"varint,3,opt,name=write_offset,json=writeOffset,proto3" json:"write_offset,omitempty"` // A portion of the data for the object. // // Types that are assignable to Data: // // *WriteObjectRequest_ChecksummedData Data isWriteObjectRequest_Data `protobuf_oneof:"data"` // Checksums for the complete object. If the checksums computed by the service // don't match the specified checksums the call will fail. May only be // provided in the first or last request (either with first_message, or // finish_write set). ObjectChecksums *ObjectChecksums `protobuf:"bytes,6,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"` // If `true`, this indicates that the write is complete. Sending any // `WriteObjectRequest`s subsequent to one in which `finish_write` is `true` // will cause an error. // For a non-resumable write (where the upload_id was not set in the first // message), it is an error not to set this field in the final message of the // stream. FinishWrite bool `protobuf:"varint,7,opt,name=finish_write,json=finishWrite,proto3" json:"finish_write,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` } func (x *WriteObjectRequest) Reset() { *x = WriteObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *WriteObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*WriteObjectRequest) ProtoMessage() {} func (x *WriteObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use WriteObjectRequest.ProtoReflect.Descriptor instead. func (*WriteObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{27} } func (m *WriteObjectRequest) GetFirstMessage() isWriteObjectRequest_FirstMessage { if m != nil { return m.FirstMessage } return nil } func (x *WriteObjectRequest) GetUploadId() string { if x, ok := x.GetFirstMessage().(*WriteObjectRequest_UploadId); ok { return x.UploadId } return "" } func (x *WriteObjectRequest) GetWriteObjectSpec() *WriteObjectSpec { if x, ok := x.GetFirstMessage().(*WriteObjectRequest_WriteObjectSpec); ok { return x.WriteObjectSpec } return nil } func (x *WriteObjectRequest) GetWriteOffset() int64 { if x != nil { return x.WriteOffset } return 0 } func (m *WriteObjectRequest) GetData() isWriteObjectRequest_Data { if m != nil { return m.Data } return nil } func (x *WriteObjectRequest) GetChecksummedData() *ChecksummedData { if x, ok := x.GetData().(*WriteObjectRequest_ChecksummedData); ok { return x.ChecksummedData } return nil } func (x *WriteObjectRequest) GetObjectChecksums() *ObjectChecksums { if x != nil { return x.ObjectChecksums } return nil } func (x *WriteObjectRequest) GetFinishWrite() bool { if x != nil { return x.FinishWrite } return false } func (x *WriteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } type isWriteObjectRequest_FirstMessage interface { isWriteObjectRequest_FirstMessage() } type WriteObjectRequest_UploadId struct { // For resumable uploads. This should be the `upload_id` returned from a // call to `StartResumableWriteResponse`. UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3,oneof"` } type WriteObjectRequest_WriteObjectSpec struct { // For non-resumable uploads. Describes the overall upload, including the // destination bucket and object name, preconditions, etc. WriteObjectSpec *WriteObjectSpec `protobuf:"bytes,2,opt,name=write_object_spec,json=writeObjectSpec,proto3,oneof"` } func (*WriteObjectRequest_UploadId) isWriteObjectRequest_FirstMessage() {} func (*WriteObjectRequest_WriteObjectSpec) isWriteObjectRequest_FirstMessage() {} type isWriteObjectRequest_Data interface { isWriteObjectRequest_Data() } type WriteObjectRequest_ChecksummedData struct { // The data to insert. If a crc32c checksum is provided that doesn't match // the checksum computed by the service, the request will fail. ChecksummedData *ChecksummedData `protobuf:"bytes,4,opt,name=checksummed_data,json=checksummedData,proto3,oneof"` } func (*WriteObjectRequest_ChecksummedData) isWriteObjectRequest_Data() {} // Response message for WriteObject. type WriteObjectResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The response will set one of the following. // // Types that are assignable to WriteStatus: // // *WriteObjectResponse_PersistedSize // *WriteObjectResponse_Resource WriteStatus isWriteObjectResponse_WriteStatus `protobuf_oneof:"write_status"` } func (x *WriteObjectResponse) Reset() { *x = WriteObjectResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *WriteObjectResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*WriteObjectResponse) ProtoMessage() {} func (x *WriteObjectResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use WriteObjectResponse.ProtoReflect.Descriptor instead. func (*WriteObjectResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{28} } func (m *WriteObjectResponse) GetWriteStatus() isWriteObjectResponse_WriteStatus { if m != nil { return m.WriteStatus } return nil } func (x *WriteObjectResponse) GetPersistedSize() int64 { if x, ok := x.GetWriteStatus().(*WriteObjectResponse_PersistedSize); ok { return x.PersistedSize } return 0 } func (x *WriteObjectResponse) GetResource() *Object { if x, ok := x.GetWriteStatus().(*WriteObjectResponse_Resource); ok { return x.Resource } return nil } type isWriteObjectResponse_WriteStatus interface { isWriteObjectResponse_WriteStatus() } type WriteObjectResponse_PersistedSize struct { // The total number of bytes that have been processed for the given object // from all `WriteObject` calls. Only set if the upload has not finalized. PersistedSize int64 `protobuf:"varint,1,opt,name=persisted_size,json=persistedSize,proto3,oneof"` } type WriteObjectResponse_Resource struct { // A resource containing the metadata for the uploaded object. Only set if // the upload has finalized. Resource *Object `protobuf:"bytes,2,opt,name=resource,proto3,oneof"` } func (*WriteObjectResponse_PersistedSize) isWriteObjectResponse_WriteStatus() {} func (*WriteObjectResponse_Resource) isWriteObjectResponse_WriteStatus() {} // Describes an attempt to append to an object, possibly over multiple requests. type AppendObjectSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The name of the bucket containing the object to write. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. The name of the object to open for writing. Object string `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` // Required. The generation number of the object to open for writing. Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,4,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,5,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // An optional routing token that influences request routing for the stream. // Must be provided if a BidiWriteObjectRedirectedError is returned. RoutingToken *string `protobuf:"bytes,6,opt,name=routing_token,json=routingToken,proto3,oneof" json:"routing_token,omitempty"` // An optional write handle returned from a previous BidiWriteObjectResponse // message or a BidiWriteObjectRedirectedError error. WriteHandle *BidiWriteHandle `protobuf:"bytes,7,opt,name=write_handle,json=writeHandle,proto3,oneof" json:"write_handle,omitempty"` } func (x *AppendObjectSpec) Reset() { *x = AppendObjectSpec{} mi := &file_google_storage_v2_storage_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *AppendObjectSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*AppendObjectSpec) ProtoMessage() {} func (x *AppendObjectSpec) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AppendObjectSpec.ProtoReflect.Descriptor instead. func (*AppendObjectSpec) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{29} } func (x *AppendObjectSpec) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *AppendObjectSpec) GetObject() string { if x != nil { return x.Object } return "" } func (x *AppendObjectSpec) GetGeneration() int64 { if x != nil { return x.Generation } return 0 } func (x *AppendObjectSpec) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *AppendObjectSpec) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *AppendObjectSpec) GetRoutingToken() string { if x != nil && x.RoutingToken != nil { return *x.RoutingToken } return "" } func (x *AppendObjectSpec) GetWriteHandle() *BidiWriteHandle { if x != nil { return x.WriteHandle } return nil } // Request message for BidiWriteObject. type BidiWriteObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The first message of each stream should set one of the following. // // Types that are assignable to FirstMessage: // // *BidiWriteObjectRequest_UploadId // *BidiWriteObjectRequest_WriteObjectSpec // *BidiWriteObjectRequest_AppendObjectSpec FirstMessage isBidiWriteObjectRequest_FirstMessage `protobuf_oneof:"first_message"` // Required. The offset from the beginning of the object at which the data // should be written. // // In the first `WriteObjectRequest` of a `WriteObject()` action, it // indicates the initial offset for the `Write()` call. The value **must** be // equal to the `persisted_size` that a call to `QueryWriteStatus()` would // return (0 if this is the first write to the object). // // On subsequent calls, this value **must** be no larger than the sum of the // first `write_offset` and the sizes of all `data` chunks sent previously on // this stream. // // An invalid value will cause an error. WriteOffset int64 `protobuf:"varint,3,opt,name=write_offset,json=writeOffset,proto3" json:"write_offset,omitempty"` // A portion of the data for the object. // // Types that are assignable to Data: // // *BidiWriteObjectRequest_ChecksummedData Data isBidiWriteObjectRequest_Data `protobuf_oneof:"data"` // Checksums for the complete object. If the checksums computed by the service // don't match the specified checksums the call will fail. May only be // provided in the first request or the // last request (with finish_write set). ObjectChecksums *ObjectChecksums `protobuf:"bytes,6,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"` // For each BidiWriteObjectRequest where state_lookup is `true` or the client // closes the stream, the service will send a BidiWriteObjectResponse // containing the current persisted size. The persisted size sent in responses // covers all the bytes the server has persisted thus far and can be used to // decide what data is safe for the client to drop. Note that the object's // current size reported by the BidiWriteObjectResponse may lag behind the // number of bytes written by the client. This field is ignored if // `finish_write` is set to true. StateLookup bool `protobuf:"varint,7,opt,name=state_lookup,json=stateLookup,proto3" json:"state_lookup,omitempty"` // Persists data written on the stream, up to and including the current // message, to permanent storage. This option should be used sparingly as it // may reduce performance. Ongoing writes will periodically be persisted on // the server even when `flush` is not set. This field is ignored if // `finish_write` is set to true since there's no need to checkpoint or flush // if this message completes the write. Flush bool `protobuf:"varint,8,opt,name=flush,proto3" json:"flush,omitempty"` // If `true`, this indicates that the write is complete. Sending any // `WriteObjectRequest`s subsequent to one in which `finish_write` is `true` // will cause an error. // For a non-resumable write (where the upload_id was not set in the first // message), it is an error not to set this field in the final message of the // stream. FinishWrite bool `protobuf:"varint,9,opt,name=finish_write,json=finishWrite,proto3" json:"finish_write,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` } func (x *BidiWriteObjectRequest) Reset() { *x = BidiWriteObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiWriteObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiWriteObjectRequest) ProtoMessage() {} func (x *BidiWriteObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiWriteObjectRequest.ProtoReflect.Descriptor instead. func (*BidiWriteObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{30} } func (m *BidiWriteObjectRequest) GetFirstMessage() isBidiWriteObjectRequest_FirstMessage { if m != nil { return m.FirstMessage } return nil } func (x *BidiWriteObjectRequest) GetUploadId() string { if x, ok := x.GetFirstMessage().(*BidiWriteObjectRequest_UploadId); ok { return x.UploadId } return "" } func (x *BidiWriteObjectRequest) GetWriteObjectSpec() *WriteObjectSpec { if x, ok := x.GetFirstMessage().(*BidiWriteObjectRequest_WriteObjectSpec); ok { return x.WriteObjectSpec } return nil } func (x *BidiWriteObjectRequest) GetAppendObjectSpec() *AppendObjectSpec { if x, ok := x.GetFirstMessage().(*BidiWriteObjectRequest_AppendObjectSpec); ok { return x.AppendObjectSpec } return nil } func (x *BidiWriteObjectRequest) GetWriteOffset() int64 { if x != nil { return x.WriteOffset } return 0 } func (m *BidiWriteObjectRequest) GetData() isBidiWriteObjectRequest_Data { if m != nil { return m.Data } return nil } func (x *BidiWriteObjectRequest) GetChecksummedData() *ChecksummedData { if x, ok := x.GetData().(*BidiWriteObjectRequest_ChecksummedData); ok { return x.ChecksummedData } return nil } func (x *BidiWriteObjectRequest) GetObjectChecksums() *ObjectChecksums { if x != nil { return x.ObjectChecksums } return nil } func (x *BidiWriteObjectRequest) GetStateLookup() bool { if x != nil { return x.StateLookup } return false } func (x *BidiWriteObjectRequest) GetFlush() bool { if x != nil { return x.Flush } return false } func (x *BidiWriteObjectRequest) GetFinishWrite() bool { if x != nil { return x.FinishWrite } return false } func (x *BidiWriteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } type isBidiWriteObjectRequest_FirstMessage interface { isBidiWriteObjectRequest_FirstMessage() } type BidiWriteObjectRequest_UploadId struct { // For resumable uploads. This should be the `upload_id` returned from a // call to `StartResumableWriteResponse`. UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3,oneof"` } type BidiWriteObjectRequest_WriteObjectSpec struct { // For non-resumable uploads. Describes the overall upload, including the // destination bucket and object name, preconditions, etc. WriteObjectSpec *WriteObjectSpec `protobuf:"bytes,2,opt,name=write_object_spec,json=writeObjectSpec,proto3,oneof"` } type BidiWriteObjectRequest_AppendObjectSpec struct { // For appendable uploads. Describes the object to append to. AppendObjectSpec *AppendObjectSpec `protobuf:"bytes,11,opt,name=append_object_spec,json=appendObjectSpec,proto3,oneof"` } func (*BidiWriteObjectRequest_UploadId) isBidiWriteObjectRequest_FirstMessage() {} func (*BidiWriteObjectRequest_WriteObjectSpec) isBidiWriteObjectRequest_FirstMessage() {} func (*BidiWriteObjectRequest_AppendObjectSpec) isBidiWriteObjectRequest_FirstMessage() {} type isBidiWriteObjectRequest_Data interface { isBidiWriteObjectRequest_Data() } type BidiWriteObjectRequest_ChecksummedData struct { // The data to insert. If a crc32c checksum is provided that doesn't match // the checksum computed by the service, the request will fail. ChecksummedData *ChecksummedData `protobuf:"bytes,4,opt,name=checksummed_data,json=checksummedData,proto3,oneof"` } func (*BidiWriteObjectRequest_ChecksummedData) isBidiWriteObjectRequest_Data() {} // Response message for BidiWriteObject. type BidiWriteObjectResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The response will set one of the following. // // Types that are assignable to WriteStatus: // // *BidiWriteObjectResponse_PersistedSize // *BidiWriteObjectResponse_Resource WriteStatus isBidiWriteObjectResponse_WriteStatus `protobuf_oneof:"write_status"` // An optional write handle that will periodically be present in response // messages. Clients should save it for later use in establishing a new stream // if a connection is interrupted. WriteHandle *BidiWriteHandle `protobuf:"bytes,3,opt,name=write_handle,json=writeHandle,proto3,oneof" json:"write_handle,omitempty"` } func (x *BidiWriteObjectResponse) Reset() { *x = BidiWriteObjectResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BidiWriteObjectResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*BidiWriteObjectResponse) ProtoMessage() {} func (x *BidiWriteObjectResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BidiWriteObjectResponse.ProtoReflect.Descriptor instead. func (*BidiWriteObjectResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{31} } func (m *BidiWriteObjectResponse) GetWriteStatus() isBidiWriteObjectResponse_WriteStatus { if m != nil { return m.WriteStatus } return nil } func (x *BidiWriteObjectResponse) GetPersistedSize() int64 { if x, ok := x.GetWriteStatus().(*BidiWriteObjectResponse_PersistedSize); ok { return x.PersistedSize } return 0 } func (x *BidiWriteObjectResponse) GetResource() *Object { if x, ok := x.GetWriteStatus().(*BidiWriteObjectResponse_Resource); ok { return x.Resource } return nil } func (x *BidiWriteObjectResponse) GetWriteHandle() *BidiWriteHandle { if x != nil { return x.WriteHandle } return nil } type isBidiWriteObjectResponse_WriteStatus interface { isBidiWriteObjectResponse_WriteStatus() } type BidiWriteObjectResponse_PersistedSize struct { // The total number of bytes that have been processed for the given object // from all `WriteObject` calls. Only set if the upload has not finalized. PersistedSize int64 `protobuf:"varint,1,opt,name=persisted_size,json=persistedSize,proto3,oneof"` } type BidiWriteObjectResponse_Resource struct { // A resource containing the metadata for the uploaded object. Only set if // the upload has finalized. Resource *Object `protobuf:"bytes,2,opt,name=resource,proto3,oneof"` } func (*BidiWriteObjectResponse_PersistedSize) isBidiWriteObjectResponse_WriteStatus() {} func (*BidiWriteObjectResponse_Resource) isBidiWriteObjectResponse_WriteStatus() {} // Request message for ListObjects. type ListObjectsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Name of the bucket in which to look for objects. Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` // Maximum number of `items` plus `prefixes` to return // in a single page of responses. As duplicate `prefixes` are // omitted, fewer total results may be returned than requested. The service // will use this parameter or 1,000 items, whichever is smaller. PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // A previously-returned page token representing part of the larger set of // results to view. PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // If set, returns results in a directory-like mode. `items` will contain // only objects whose names, aside from the `prefix`, do not // contain `delimiter`. Objects whose names, aside from the // `prefix`, contain `delimiter` will have their name, // truncated after the `delimiter`, returned in // `prefixes`. Duplicate `prefixes` are omitted. Delimiter string `protobuf:"bytes,4,opt,name=delimiter,proto3" json:"delimiter,omitempty"` // If true, objects that end in exactly one instance of `delimiter` // will have their metadata included in `items` in addition to // `prefixes`. IncludeTrailingDelimiter bool `protobuf:"varint,5,opt,name=include_trailing_delimiter,json=includeTrailingDelimiter,proto3" json:"include_trailing_delimiter,omitempty"` // Filter results to objects whose names begin with this prefix. Prefix string `protobuf:"bytes,6,opt,name=prefix,proto3" json:"prefix,omitempty"` // If `true`, lists all versions of an object as distinct results. // For more information, see // [Object // Versioning](https://cloud.google.com/storage/docs/object-versioning). Versions bool `protobuf:"varint,7,opt,name=versions,proto3" json:"versions,omitempty"` // Mask specifying which fields to read from each result. // If no mask is specified, will default to all fields except items.acl and // items.owner. // * may be used to mean "all fields". ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,8,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"` // Optional. Filter results to objects whose names are lexicographically equal // to or after lexicographic_start. If lexicographic_end is also set, the // objects listed have names between lexicographic_start (inclusive) and // lexicographic_end (exclusive). LexicographicStart string `protobuf:"bytes,10,opt,name=lexicographic_start,json=lexicographicStart,proto3" json:"lexicographic_start,omitempty"` // Optional. Filter results to objects whose names are lexicographically // before lexicographic_end. If lexicographic_start is also set, the objects // listed have names between lexicographic_start (inclusive) and // lexicographic_end (exclusive). LexicographicEnd string `protobuf:"bytes,11,opt,name=lexicographic_end,json=lexicographicEnd,proto3" json:"lexicographic_end,omitempty"` // Optional. If true, only list all soft-deleted versions of the object. // Soft delete policy is required to set this option. SoftDeleted bool `protobuf:"varint,12,opt,name=soft_deleted,json=softDeleted,proto3" json:"soft_deleted,omitempty"` // Optional. If true, will also include folders and managed folders (besides // objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'. IncludeFoldersAsPrefixes bool `protobuf:"varint,13,opt,name=include_folders_as_prefixes,json=includeFoldersAsPrefixes,proto3" json:"include_folders_as_prefixes,omitempty"` // Optional. Filter results to objects and prefixes that match this glob // pattern. See [List Objects Using // Glob](https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-objects-and-prefixes-using-glob) // for the full syntax. MatchGlob string `protobuf:"bytes,14,opt,name=match_glob,json=matchGlob,proto3" json:"match_glob,omitempty"` } func (x *ListObjectsRequest) Reset() { *x = ListObjectsRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListObjectsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListObjectsRequest) ProtoMessage() {} func (x *ListObjectsRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListObjectsRequest.ProtoReflect.Descriptor instead. func (*ListObjectsRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{32} } func (x *ListObjectsRequest) GetParent() string { if x != nil { return x.Parent } return "" } func (x *ListObjectsRequest) GetPageSize() int32 { if x != nil { return x.PageSize } return 0 } func (x *ListObjectsRequest) GetPageToken() string { if x != nil { return x.PageToken } return "" } func (x *ListObjectsRequest) GetDelimiter() string { if x != nil { return x.Delimiter } return "" } func (x *ListObjectsRequest) GetIncludeTrailingDelimiter() bool { if x != nil { return x.IncludeTrailingDelimiter } return false } func (x *ListObjectsRequest) GetPrefix() string { if x != nil { return x.Prefix } return "" } func (x *ListObjectsRequest) GetVersions() bool { if x != nil { return x.Versions } return false } func (x *ListObjectsRequest) GetReadMask() *fieldmaskpb.FieldMask { if x != nil { return x.ReadMask } return nil } func (x *ListObjectsRequest) GetLexicographicStart() string { if x != nil { return x.LexicographicStart } return "" } func (x *ListObjectsRequest) GetLexicographicEnd() string { if x != nil { return x.LexicographicEnd } return "" } func (x *ListObjectsRequest) GetSoftDeleted() bool { if x != nil { return x.SoftDeleted } return false } func (x *ListObjectsRequest) GetIncludeFoldersAsPrefixes() bool { if x != nil { return x.IncludeFoldersAsPrefixes } return false } func (x *ListObjectsRequest) GetMatchGlob() string { if x != nil { return x.MatchGlob } return "" } // Request object for `QueryWriteStatus`. type QueryWriteStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The name of the resume token for the object whose write status is // being requested. UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,2,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` } func (x *QueryWriteStatusRequest) Reset() { *x = QueryWriteStatusRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *QueryWriteStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueryWriteStatusRequest) ProtoMessage() {} func (x *QueryWriteStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use QueryWriteStatusRequest.ProtoReflect.Descriptor instead. func (*QueryWriteStatusRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{33} } func (x *QueryWriteStatusRequest) GetUploadId() string { if x != nil { return x.UploadId } return "" } func (x *QueryWriteStatusRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } // Response object for `QueryWriteStatus`. type QueryWriteStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The response will set one of the following. // // Types that are assignable to WriteStatus: // // *QueryWriteStatusResponse_PersistedSize // *QueryWriteStatusResponse_Resource WriteStatus isQueryWriteStatusResponse_WriteStatus `protobuf_oneof:"write_status"` } func (x *QueryWriteStatusResponse) Reset() { *x = QueryWriteStatusResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *QueryWriteStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueryWriteStatusResponse) ProtoMessage() {} func (x *QueryWriteStatusResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use QueryWriteStatusResponse.ProtoReflect.Descriptor instead. func (*QueryWriteStatusResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{34} } func (m *QueryWriteStatusResponse) GetWriteStatus() isQueryWriteStatusResponse_WriteStatus { if m != nil { return m.WriteStatus } return nil } func (x *QueryWriteStatusResponse) GetPersistedSize() int64 { if x, ok := x.GetWriteStatus().(*QueryWriteStatusResponse_PersistedSize); ok { return x.PersistedSize } return 0 } func (x *QueryWriteStatusResponse) GetResource() *Object { if x, ok := x.GetWriteStatus().(*QueryWriteStatusResponse_Resource); ok { return x.Resource } return nil } type isQueryWriteStatusResponse_WriteStatus interface { isQueryWriteStatusResponse_WriteStatus() } type QueryWriteStatusResponse_PersistedSize struct { // The total number of bytes that have been processed for the given object // from all `WriteObject` calls. This is the correct value for the // 'write_offset' field to use when resuming the `WriteObject` operation. // Only set if the upload has not finalized. PersistedSize int64 `protobuf:"varint,1,opt,name=persisted_size,json=persistedSize,proto3,oneof"` } type QueryWriteStatusResponse_Resource struct { // A resource containing the metadata for the uploaded object. Only set if // the upload has finalized. Resource *Object `protobuf:"bytes,2,opt,name=resource,proto3,oneof"` } func (*QueryWriteStatusResponse_PersistedSize) isQueryWriteStatusResponse_WriteStatus() {} func (*QueryWriteStatusResponse_Resource) isQueryWriteStatusResponse_WriteStatus() {} // Request message for RewriteObject. // If the source object is encrypted using a Customer-Supplied Encryption Key // the key information must be provided in the copy_source_encryption_algorithm, // copy_source_encryption_key_bytes, and copy_source_encryption_key_sha256_bytes // fields. If the destination object should be encrypted the keying information // should be provided in the encryption_algorithm, encryption_key_bytes, and // encryption_key_sha256_bytes fields of the // common_object_request_params.customer_encryption field. type RewriteObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Immutable. The name of the destination object. // See the // [Naming Guidelines](https://cloud.google.com/storage/docs/objects#naming). // Example: `test.txt` // The `name` field by itself does not uniquely identify a Cloud Storage // object. A Cloud Storage object is uniquely identified by the tuple of // (bucket, object, generation). DestinationName string `protobuf:"bytes,24,opt,name=destination_name,json=destinationName,proto3" json:"destination_name,omitempty"` // Required. Immutable. The name of the bucket containing the destination // object. DestinationBucket string `protobuf:"bytes,25,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"` // The name of the Cloud KMS key that will be used to encrypt the destination // object. The Cloud KMS key must be located in same location as the object. // If the parameter is not specified, the request uses the destination // bucket's default encryption key, if any, or else the Google-managed // encryption key. DestinationKmsKey string `protobuf:"bytes,27,opt,name=destination_kms_key,json=destinationKmsKey,proto3" json:"destination_kms_key,omitempty"` // Properties of the destination, post-rewrite object. // The `name`, `bucket` and `kms_key` fields must not be populated (these // values are specified in the `destination_name`, `destination_bucket`, and // `destination_kms_key` fields). // If `destination` is present it will be used to construct the destination // object's metadata; otherwise the destination object's metadata will be // copied from the source object. Destination *Object `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"` // Required. Name of the bucket in which to find the source object. SourceBucket string `protobuf:"bytes,2,opt,name=source_bucket,json=sourceBucket,proto3" json:"source_bucket,omitempty"` // Required. Name of the source object. SourceObject string `protobuf:"bytes,3,opt,name=source_object,json=sourceObject,proto3" json:"source_object,omitempty"` // If present, selects a specific revision of the source object (as opposed to // the latest version, the default). SourceGeneration int64 `protobuf:"varint,4,opt,name=source_generation,json=sourceGeneration,proto3" json:"source_generation,omitempty"` // Include this field (from the previous rewrite response) on each rewrite // request after the first one, until the rewrite response 'done' flag is // true. Calls that provide a rewriteToken can omit all other request fields, // but if included those fields must match the values provided in the first // rewrite request. RewriteToken string `protobuf:"bytes,5,opt,name=rewrite_token,json=rewriteToken,proto3" json:"rewrite_token,omitempty"` // Apply a predefined set of access controls to the destination object. // Valid values are "authenticatedRead", "bucketOwnerFullControl", // "bucketOwnerRead", "private", "projectPrivate", or "publicRead". DestinationPredefinedAcl string `protobuf:"bytes,28,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3" json:"destination_predefined_acl,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,7,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's live generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *int64 `protobuf:"varint,8,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the destination object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,9,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the destination object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,10,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // Makes the operation conditional on whether the source object's live // generation matches the given value. IfSourceGenerationMatch *int64 `protobuf:"varint,11,opt,name=if_source_generation_match,json=ifSourceGenerationMatch,proto3,oneof" json:"if_source_generation_match,omitempty"` // Makes the operation conditional on whether the source object's live // generation does not match the given value. IfSourceGenerationNotMatch *int64 `protobuf:"varint,12,opt,name=if_source_generation_not_match,json=ifSourceGenerationNotMatch,proto3,oneof" json:"if_source_generation_not_match,omitempty"` // Makes the operation conditional on whether the source object's current // metageneration matches the given value. IfSourceMetagenerationMatch *int64 `protobuf:"varint,13,opt,name=if_source_metageneration_match,json=ifSourceMetagenerationMatch,proto3,oneof" json:"if_source_metageneration_match,omitempty"` // Makes the operation conditional on whether the source object's current // metageneration does not match the given value. IfSourceMetagenerationNotMatch *int64 `protobuf:"varint,14,opt,name=if_source_metageneration_not_match,json=ifSourceMetagenerationNotMatch,proto3,oneof" json:"if_source_metageneration_not_match,omitempty"` // The maximum number of bytes that will be rewritten per rewrite request. // Most callers // shouldn't need to specify this parameter - it is primarily in place to // support testing. If specified the value must be an integral multiple of // 1 MiB (1048576). Also, this only applies to requests where the source and // destination span locations and/or storage classes. Finally, this value must // not change across rewrite calls else you'll get an error that the // `rewriteToken` is invalid. MaxBytesRewrittenPerCall int64 `protobuf:"varint,15,opt,name=max_bytes_rewritten_per_call,json=maxBytesRewrittenPerCall,proto3" json:"max_bytes_rewritten_per_call,omitempty"` // The algorithm used to encrypt the source object, if any. Used if the source // object was encrypted with a Customer-Supplied Encryption Key. CopySourceEncryptionAlgorithm string `protobuf:"bytes,16,opt,name=copy_source_encryption_algorithm,json=copySourceEncryptionAlgorithm,proto3" json:"copy_source_encryption_algorithm,omitempty"` // The raw bytes (not base64-encoded) AES-256 encryption key used to encrypt // the source object, if it was encrypted with a Customer-Supplied Encryption // Key. CopySourceEncryptionKeyBytes []byte `protobuf:"bytes,21,opt,name=copy_source_encryption_key_bytes,json=copySourceEncryptionKeyBytes,proto3" json:"copy_source_encryption_key_bytes,omitempty"` // The raw bytes (not base64-encoded) SHA256 hash of the encryption key used // to encrypt the source object, if it was encrypted with a Customer-Supplied // Encryption Key. CopySourceEncryptionKeySha256Bytes []byte `protobuf:"bytes,22,opt,name=copy_source_encryption_key_sha256_bytes,json=copySourceEncryptionKeySha256Bytes,proto3" json:"copy_source_encryption_key_sha256_bytes,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,19,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // The checksums of the complete object. This will be used to validate the // destination object after rewriting. ObjectChecksums *ObjectChecksums `protobuf:"bytes,29,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"` } func (x *RewriteObjectRequest) Reset() { *x = RewriteObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *RewriteObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*RewriteObjectRequest) ProtoMessage() {} func (x *RewriteObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RewriteObjectRequest.ProtoReflect.Descriptor instead. func (*RewriteObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{35} } func (x *RewriteObjectRequest) GetDestinationName() string { if x != nil { return x.DestinationName } return "" } func (x *RewriteObjectRequest) GetDestinationBucket() string { if x != nil { return x.DestinationBucket } return "" } func (x *RewriteObjectRequest) GetDestinationKmsKey() string { if x != nil { return x.DestinationKmsKey } return "" } func (x *RewriteObjectRequest) GetDestination() *Object { if x != nil { return x.Destination } return nil } func (x *RewriteObjectRequest) GetSourceBucket() string { if x != nil { return x.SourceBucket } return "" } func (x *RewriteObjectRequest) GetSourceObject() string { if x != nil { return x.SourceObject } return "" } func (x *RewriteObjectRequest) GetSourceGeneration() int64 { if x != nil { return x.SourceGeneration } return 0 } func (x *RewriteObjectRequest) GetRewriteToken() string { if x != nil { return x.RewriteToken } return "" } func (x *RewriteObjectRequest) GetDestinationPredefinedAcl() string { if x != nil { return x.DestinationPredefinedAcl } return "" } func (x *RewriteObjectRequest) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *RewriteObjectRequest) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *RewriteObjectRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *RewriteObjectRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *RewriteObjectRequest) GetIfSourceGenerationMatch() int64 { if x != nil && x.IfSourceGenerationMatch != nil { return *x.IfSourceGenerationMatch } return 0 } func (x *RewriteObjectRequest) GetIfSourceGenerationNotMatch() int64 { if x != nil && x.IfSourceGenerationNotMatch != nil { return *x.IfSourceGenerationNotMatch } return 0 } func (x *RewriteObjectRequest) GetIfSourceMetagenerationMatch() int64 { if x != nil && x.IfSourceMetagenerationMatch != nil { return *x.IfSourceMetagenerationMatch } return 0 } func (x *RewriteObjectRequest) GetIfSourceMetagenerationNotMatch() int64 { if x != nil && x.IfSourceMetagenerationNotMatch != nil { return *x.IfSourceMetagenerationNotMatch } return 0 } func (x *RewriteObjectRequest) GetMaxBytesRewrittenPerCall() int64 { if x != nil { return x.MaxBytesRewrittenPerCall } return 0 } func (x *RewriteObjectRequest) GetCopySourceEncryptionAlgorithm() string { if x != nil { return x.CopySourceEncryptionAlgorithm } return "" } func (x *RewriteObjectRequest) GetCopySourceEncryptionKeyBytes() []byte { if x != nil { return x.CopySourceEncryptionKeyBytes } return nil } func (x *RewriteObjectRequest) GetCopySourceEncryptionKeySha256Bytes() []byte { if x != nil { return x.CopySourceEncryptionKeySha256Bytes } return nil } func (x *RewriteObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } func (x *RewriteObjectRequest) GetObjectChecksums() *ObjectChecksums { if x != nil { return x.ObjectChecksums } return nil } // A rewrite response. type RewriteResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The total bytes written so far, which can be used to provide a waiting user // with a progress indicator. This property is always present in the response. TotalBytesRewritten int64 `protobuf:"varint,1,opt,name=total_bytes_rewritten,json=totalBytesRewritten,proto3" json:"total_bytes_rewritten,omitempty"` // The total size of the object being copied in bytes. This property is always // present in the response. ObjectSize int64 `protobuf:"varint,2,opt,name=object_size,json=objectSize,proto3" json:"object_size,omitempty"` // `true` if the copy is finished; otherwise, `false` if // the copy is in progress. This property is always present in the response. Done bool `protobuf:"varint,3,opt,name=done,proto3" json:"done,omitempty"` // A token to use in subsequent requests to continue copying data. This token // is present in the response only when there is more data to copy. RewriteToken string `protobuf:"bytes,4,opt,name=rewrite_token,json=rewriteToken,proto3" json:"rewrite_token,omitempty"` // A resource containing the metadata for the copied-to object. This property // is present in the response only when copying completes. Resource *Object `protobuf:"bytes,5,opt,name=resource,proto3" json:"resource,omitempty"` } func (x *RewriteResponse) Reset() { *x = RewriteResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *RewriteResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*RewriteResponse) ProtoMessage() {} func (x *RewriteResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RewriteResponse.ProtoReflect.Descriptor instead. func (*RewriteResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{36} } func (x *RewriteResponse) GetTotalBytesRewritten() int64 { if x != nil { return x.TotalBytesRewritten } return 0 } func (x *RewriteResponse) GetObjectSize() int64 { if x != nil { return x.ObjectSize } return 0 } func (x *RewriteResponse) GetDone() bool { if x != nil { return x.Done } return false } func (x *RewriteResponse) GetRewriteToken() string { if x != nil { return x.RewriteToken } return "" } func (x *RewriteResponse) GetResource() *Object { if x != nil { return x.Resource } return nil } // Request message for MoveObject. type MoveObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Name of the bucket in which the object resides. Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` // Required. Name of the source object. SourceObject string `protobuf:"bytes,2,opt,name=source_object,json=sourceObject,proto3" json:"source_object,omitempty"` // Required. Name of the destination object. DestinationObject string `protobuf:"bytes,3,opt,name=destination_object,json=destinationObject,proto3" json:"destination_object,omitempty"` // Optional. Makes the operation conditional on whether the source object's // current generation matches the given value. `if_source_generation_match` // and `if_source_generation_not_match` conditions are mutually exclusive: // it's an error for both of them to be set in the request. IfSourceGenerationMatch *int64 `protobuf:"varint,4,opt,name=if_source_generation_match,json=ifSourceGenerationMatch,proto3,oneof" json:"if_source_generation_match,omitempty"` // Optional. Makes the operation conditional on whether the source object's // current generation does not match the given value. // `if_source_generation_match` and `if_source_generation_not_match` // conditions are mutually exclusive: it's an error for both of them to be set // in the request. IfSourceGenerationNotMatch *int64 `protobuf:"varint,5,opt,name=if_source_generation_not_match,json=ifSourceGenerationNotMatch,proto3,oneof" json:"if_source_generation_not_match,omitempty"` // Optional. Makes the operation conditional on whether the source object's // current metageneration matches the given value. // `if_source_metageneration_match` and `if_source_metageneration_not_match` // conditions are mutually exclusive: it's an error for both of them to be set // in the request. IfSourceMetagenerationMatch *int64 `protobuf:"varint,6,opt,name=if_source_metageneration_match,json=ifSourceMetagenerationMatch,proto3,oneof" json:"if_source_metageneration_match,omitempty"` // Optional. Makes the operation conditional on whether the source object's // current metageneration does not match the given value. // `if_source_metageneration_match` and `if_source_metageneration_not_match` // conditions are mutually exclusive: it's an error for both of them to be set // in the request. IfSourceMetagenerationNotMatch *int64 `protobuf:"varint,7,opt,name=if_source_metageneration_not_match,json=ifSourceMetagenerationNotMatch,proto3,oneof" json:"if_source_metageneration_not_match,omitempty"` // Optional. Makes the operation conditional on whether the destination // object's current generation matches the given value. Setting to 0 makes the // operation succeed only if there are no live versions of the object. // `if_generation_match` and `if_generation_not_match` conditions are mutually // exclusive: it's an error for both of them to be set in the request. IfGenerationMatch *int64 `protobuf:"varint,8,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Optional. Makes the operation conditional on whether the destination // object's current generation does not match the given value. If no live // object exists, the precondition fails. Setting to 0 makes the operation // succeed only if there is a live version of the object. // `if_generation_match` and `if_generation_not_match` conditions are mutually // exclusive: it's an error for both of them to be set in the request. IfGenerationNotMatch *int64 `protobuf:"varint,9,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Optional. Makes the operation conditional on whether the destination // object's current metageneration matches the given value. // `if_metageneration_match` and `if_metageneration_not_match` conditions are // mutually exclusive: it's an error for both of them to be set in the // request. IfMetagenerationMatch *int64 `protobuf:"varint,10,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Optional. Makes the operation conditional on whether the destination // object's current metageneration does not match the given value. // `if_metageneration_match` and `if_metageneration_not_match` conditions are // mutually exclusive: it's an error for both of them to be set in the // request. IfMetagenerationNotMatch *int64 `protobuf:"varint,11,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` } func (x *MoveObjectRequest) Reset() { *x = MoveObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *MoveObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*MoveObjectRequest) ProtoMessage() {} func (x *MoveObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use MoveObjectRequest.ProtoReflect.Descriptor instead. func (*MoveObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{37} } func (x *MoveObjectRequest) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *MoveObjectRequest) GetSourceObject() string { if x != nil { return x.SourceObject } return "" } func (x *MoveObjectRequest) GetDestinationObject() string { if x != nil { return x.DestinationObject } return "" } func (x *MoveObjectRequest) GetIfSourceGenerationMatch() int64 { if x != nil && x.IfSourceGenerationMatch != nil { return *x.IfSourceGenerationMatch } return 0 } func (x *MoveObjectRequest) GetIfSourceGenerationNotMatch() int64 { if x != nil && x.IfSourceGenerationNotMatch != nil { return *x.IfSourceGenerationNotMatch } return 0 } func (x *MoveObjectRequest) GetIfSourceMetagenerationMatch() int64 { if x != nil && x.IfSourceMetagenerationMatch != nil { return *x.IfSourceMetagenerationMatch } return 0 } func (x *MoveObjectRequest) GetIfSourceMetagenerationNotMatch() int64 { if x != nil && x.IfSourceMetagenerationNotMatch != nil { return *x.IfSourceMetagenerationNotMatch } return 0 } func (x *MoveObjectRequest) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *MoveObjectRequest) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *MoveObjectRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *MoveObjectRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } // Request message StartResumableWrite. type StartResumableWriteRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. Contains the information necessary to start a resumable write. WriteObjectSpec *WriteObjectSpec `protobuf:"bytes,1,opt,name=write_object_spec,json=writeObjectSpec,proto3" json:"write_object_spec,omitempty"` // A set of parameters common to Storage API requests related to an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,3,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` // The checksums of the complete object. This is used to validate the // uploaded object. For each upload, `object_checksums` can be provided when // initiating a resumable upload with`StartResumableWriteRequest` or when // completing a write with `WriteObjectRequest` with // `finish_write` set to `true`. ObjectChecksums *ObjectChecksums `protobuf:"bytes,5,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"` } func (x *StartResumableWriteRequest) Reset() { *x = StartResumableWriteRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *StartResumableWriteRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*StartResumableWriteRequest) ProtoMessage() {} func (x *StartResumableWriteRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use StartResumableWriteRequest.ProtoReflect.Descriptor instead. func (*StartResumableWriteRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{38} } func (x *StartResumableWriteRequest) GetWriteObjectSpec() *WriteObjectSpec { if x != nil { return x.WriteObjectSpec } return nil } func (x *StartResumableWriteRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } func (x *StartResumableWriteRequest) GetObjectChecksums() *ObjectChecksums { if x != nil { return x.ObjectChecksums } return nil } // Response object for `StartResumableWrite`. type StartResumableWriteResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A unique identifier for the initiated resumable write operation. // As the ID grants write access, you should keep it confidential during // the upload to prevent unauthorized access and data tampering during your // upload. This ID should be included in subsequent `WriteObject` requests to // upload the object data. UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } func (x *StartResumableWriteResponse) Reset() { *x = StartResumableWriteResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *StartResumableWriteResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*StartResumableWriteResponse) ProtoMessage() {} func (x *StartResumableWriteResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use StartResumableWriteResponse.ProtoReflect.Descriptor instead. func (*StartResumableWriteResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{39} } func (x *StartResumableWriteResponse) GetUploadId() string { if x != nil { return x.UploadId } return "" } // Request message for UpdateObject. type UpdateObjectRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The object to update. // The object's bucket and name fields are used to identify the object to // update. If present, the object's generation field selects a specific // revision of this object whose metadata should be updated. Otherwise, // assumes the live version of the object. Object *Object `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` // Makes the operation conditional on whether the object's current generation // matches the given value. Setting to 0 makes the operation succeed only if // there are no live versions of the object. IfGenerationMatch *int64 `protobuf:"varint,2,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` // Makes the operation conditional on whether the object's live generation // does not match the given value. If no live object exists, the precondition // fails. Setting to 0 makes the operation succeed only if there is a live // version of the object. IfGenerationNotMatch *int64 `protobuf:"varint,3,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration matches the given value. IfMetagenerationMatch *int64 `protobuf:"varint,4,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"` // Makes the operation conditional on whether the object's current // metageneration does not match the given value. IfMetagenerationNotMatch *int64 `protobuf:"varint,5,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"` // Apply a predefined set of access controls to this object. // Valid values are "authenticatedRead", "bucketOwnerFullControl", // "bucketOwnerRead", "private", "projectPrivate", or "publicRead". PredefinedAcl string `protobuf:"bytes,10,opt,name=predefined_acl,json=predefinedAcl,proto3" json:"predefined_acl,omitempty"` // Required. List of fields to be updated. // // To specify ALL fields, equivalent to the JSON API's "update" function, // specify a single field with the value `*`. Note: not recommended. If a new // field is introduced at a later time, an older client updating with the `*` // may accidentally reset the new field's value. // // Not specifying any fields is an error. UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,7,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` // A set of parameters common to Storage API requests concerning an object. CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"` } func (x *UpdateObjectRequest) Reset() { *x = UpdateObjectRequest{} mi := &file_google_storage_v2_storage_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *UpdateObjectRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*UpdateObjectRequest) ProtoMessage() {} func (x *UpdateObjectRequest) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UpdateObjectRequest.ProtoReflect.Descriptor instead. func (*UpdateObjectRequest) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{40} } func (x *UpdateObjectRequest) GetObject() *Object { if x != nil { return x.Object } return nil } func (x *UpdateObjectRequest) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } func (x *UpdateObjectRequest) GetIfGenerationNotMatch() int64 { if x != nil && x.IfGenerationNotMatch != nil { return *x.IfGenerationNotMatch } return 0 } func (x *UpdateObjectRequest) GetIfMetagenerationMatch() int64 { if x != nil && x.IfMetagenerationMatch != nil { return *x.IfMetagenerationMatch } return 0 } func (x *UpdateObjectRequest) GetIfMetagenerationNotMatch() int64 { if x != nil && x.IfMetagenerationNotMatch != nil { return *x.IfMetagenerationNotMatch } return 0 } func (x *UpdateObjectRequest) GetPredefinedAcl() string { if x != nil { return x.PredefinedAcl } return "" } func (x *UpdateObjectRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { return x.UpdateMask } return nil } func (x *UpdateObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestParams { if x != nil { return x.CommonObjectRequestParams } return nil } // Parameters that can be passed to any object request. type CommonObjectRequestParams struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Encryption algorithm used with the Customer-Supplied Encryption Keys // feature. EncryptionAlgorithm string `protobuf:"bytes,1,opt,name=encryption_algorithm,json=encryptionAlgorithm,proto3" json:"encryption_algorithm,omitempty"` // Encryption key used with the Customer-Supplied Encryption Keys feature. // In raw bytes format (not base64-encoded). EncryptionKeyBytes []byte `protobuf:"bytes,4,opt,name=encryption_key_bytes,json=encryptionKeyBytes,proto3" json:"encryption_key_bytes,omitempty"` // SHA256 hash of encryption key used with the Customer-Supplied Encryption // Keys feature. EncryptionKeySha256Bytes []byte `protobuf:"bytes,5,opt,name=encryption_key_sha256_bytes,json=encryptionKeySha256Bytes,proto3" json:"encryption_key_sha256_bytes,omitempty"` } func (x *CommonObjectRequestParams) Reset() { *x = CommonObjectRequestParams{} mi := &file_google_storage_v2_storage_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CommonObjectRequestParams) String() string { return protoimpl.X.MessageStringOf(x) } func (*CommonObjectRequestParams) ProtoMessage() {} func (x *CommonObjectRequestParams) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CommonObjectRequestParams.ProtoReflect.Descriptor instead. func (*CommonObjectRequestParams) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{41} } func (x *CommonObjectRequestParams) GetEncryptionAlgorithm() string { if x != nil { return x.EncryptionAlgorithm } return "" } func (x *CommonObjectRequestParams) GetEncryptionKeyBytes() []byte { if x != nil { return x.EncryptionKeyBytes } return nil } func (x *CommonObjectRequestParams) GetEncryptionKeySha256Bytes() []byte { if x != nil { return x.EncryptionKeySha256Bytes } return nil } // Shared constants. type ServiceConstants struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *ServiceConstants) Reset() { *x = ServiceConstants{} mi := &file_google_storage_v2_storage_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ServiceConstants) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServiceConstants) ProtoMessage() {} func (x *ServiceConstants) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServiceConstants.ProtoReflect.Descriptor instead. func (*ServiceConstants) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{42} } // A bucket. type Bucket struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Immutable. The name of the bucket. // Format: `projects/{project}/buckets/{bucket}` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Output only. The user-chosen part of the bucket name. The `{bucket}` // portion of the `name` field. For globally unique buckets, this is equal to // the "bucket name" of other Cloud Storage APIs. Example: "pub". BucketId string `protobuf:"bytes,2,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` // The etag of the bucket. // If included in the metadata of an UpdateBucketRequest, the operation will // only be performed if the etag matches that of the bucket. Etag string `protobuf:"bytes,29,opt,name=etag,proto3" json:"etag,omitempty"` // Immutable. The project which owns this bucket, in the format of // "projects/{projectIdentifier}". // {projectIdentifier} can be the project ID or project number. Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` // Output only. The metadata generation of this bucket. Metageneration int64 `protobuf:"varint,4,opt,name=metageneration,proto3" json:"metageneration,omitempty"` // Immutable. The location of the bucket. Object data for objects in the // bucket resides in physical storage within this region. Defaults to `US`. // See the // [https://developers.google.com/storage/docs/concepts-techniques#specifyinglocations"][developer's // guide] for the authoritative list. Attempting to update this field after // the bucket is created will result in an error. Location string `protobuf:"bytes,5,opt,name=location,proto3" json:"location,omitempty"` // Output only. The location type of the bucket (region, dual-region, // multi-region, etc). LocationType string `protobuf:"bytes,6,opt,name=location_type,json=locationType,proto3" json:"location_type,omitempty"` // The bucket's default storage class, used whenever no storageClass is // specified for a newly-created object. This defines how objects in the // bucket are stored and determines the SLA and the cost of storage. // If this value is not specified when the bucket is created, it will default // to `STANDARD`. For more information, see // https://developers.google.com/storage/docs/storage-classes. StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` // The recovery point objective for cross-region replication of the bucket. // Applicable only for dual- and multi-region buckets. "DEFAULT" uses default // replication. "ASYNC_TURBO" enables turbo replication, valid for dual-region // buckets only. If rpo is not specified when the bucket is created, it // defaults to "DEFAULT". For more information, see // https://cloud.google.com/storage/docs/availability-durability#turbo-replication. Rpo string `protobuf:"bytes,27,opt,name=rpo,proto3" json:"rpo,omitempty"` // Access controls on the bucket. // If iam_config.uniform_bucket_level_access is enabled on this bucket, // requests to set, read, or modify acl is an error. Acl []*BucketAccessControl `protobuf:"bytes,8,rep,name=acl,proto3" json:"acl,omitempty"` // Default access controls to apply to new objects when no ACL is provided. // If iam_config.uniform_bucket_level_access is enabled on this bucket, // requests to set, read, or modify acl is an error. DefaultObjectAcl []*ObjectAccessControl `protobuf:"bytes,9,rep,name=default_object_acl,json=defaultObjectAcl,proto3" json:"default_object_acl,omitempty"` // The bucket's lifecycle config. See // [https://developers.google.com/storage/docs/lifecycle]Lifecycle Management] // for more information. Lifecycle *Bucket_Lifecycle `protobuf:"bytes,10,opt,name=lifecycle,proto3" json:"lifecycle,omitempty"` // Output only. The creation time of the bucket. CreateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // The bucket's [https://www.w3.org/TR/cors/][Cross-Origin Resource Sharing] // (CORS) config. Cors []*Bucket_Cors `protobuf:"bytes,12,rep,name=cors,proto3" json:"cors,omitempty"` // Output only. The modification time of the bucket. UpdateTime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // The default value for event-based hold on newly created objects in this // bucket. Event-based hold is a way to retain objects indefinitely until an // event occurs, signified by the // hold's release. After being released, such objects will be subject to // bucket-level retention (if any). One sample use case of this flag is for // banks to hold loan documents for at least 3 years after loan is paid in // full. Here, bucket-level retention is 3 years and the event is loan being // paid in full. In this example, these objects will be held intact for any // number of years until the event has occurred (event-based hold on the // object is released) and then 3 more years after that. That means retention // duration of the objects begins from the moment event-based hold // transitioned from true to false. Objects under event-based hold cannot be // deleted, overwritten or archived until the hold is removed. DefaultEventBasedHold bool `protobuf:"varint,14,opt,name=default_event_based_hold,json=defaultEventBasedHold,proto3" json:"default_event_based_hold,omitempty"` // User-provided labels, in key/value pairs. Labels map[string]string `protobuf:"bytes,15,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The bucket's website config, controlling how the service behaves // when accessing bucket contents as a web site. See the // [https://cloud.google.com/storage/docs/static-website][Static Website // Examples] for more information. Website *Bucket_Website `protobuf:"bytes,16,opt,name=website,proto3" json:"website,omitempty"` // The bucket's versioning config. Versioning *Bucket_Versioning `protobuf:"bytes,17,opt,name=versioning,proto3" json:"versioning,omitempty"` // The bucket's logging config, which defines the destination bucket // and name prefix (if any) for the current bucket's logs. Logging *Bucket_Logging `protobuf:"bytes,18,opt,name=logging,proto3" json:"logging,omitempty"` // Output only. The owner of the bucket. This is always the project team's // owner group. Owner *Owner `protobuf:"bytes,19,opt,name=owner,proto3" json:"owner,omitempty"` // Encryption config for a bucket. Encryption *Bucket_Encryption `protobuf:"bytes,20,opt,name=encryption,proto3" json:"encryption,omitempty"` // The bucket's billing config. Billing *Bucket_Billing `protobuf:"bytes,21,opt,name=billing,proto3" json:"billing,omitempty"` // The bucket's retention policy. The retention policy enforces a minimum // retention time for all objects contained in the bucket, based on their // creation time. Any attempt to overwrite or delete objects younger than the // retention period will result in a PERMISSION_DENIED error. An unlocked // retention policy can be modified or removed from the bucket via a // storage.buckets.update operation. A locked retention policy cannot be // removed or shortened in duration for the lifetime of the bucket. // Attempting to remove or decrease period of a locked retention policy will // result in a PERMISSION_DENIED error. RetentionPolicy *Bucket_RetentionPolicy `protobuf:"bytes,22,opt,name=retention_policy,json=retentionPolicy,proto3" json:"retention_policy,omitempty"` // The bucket's IAM config. IamConfig *Bucket_IamConfig `protobuf:"bytes,23,opt,name=iam_config,json=iamConfig,proto3" json:"iam_config,omitempty"` // Reserved for future use. SatisfiesPzs bool `protobuf:"varint,25,opt,name=satisfies_pzs,json=satisfiesPzs,proto3" json:"satisfies_pzs,omitempty"` // Configuration that, if present, specifies the data placement for a // [https://cloud.google.com/storage/docs/locations#location-dr][configurable // dual-region]. CustomPlacementConfig *Bucket_CustomPlacementConfig `protobuf:"bytes,26,opt,name=custom_placement_config,json=customPlacementConfig,proto3" json:"custom_placement_config,omitempty"` // The bucket's Autoclass configuration. If there is no configuration, the // Autoclass feature will be disabled and have no effect on the bucket. Autoclass *Bucket_Autoclass `protobuf:"bytes,28,opt,name=autoclass,proto3" json:"autoclass,omitempty"` // Optional. The bucket's hierarchical namespace configuration. If there is no // configuration, the hierarchical namespace feature will be disabled and have // no effect on the bucket. HierarchicalNamespace *Bucket_HierarchicalNamespace `protobuf:"bytes,32,opt,name=hierarchical_namespace,json=hierarchicalNamespace,proto3" json:"hierarchical_namespace,omitempty"` // Optional. The bucket's soft delete policy. The soft delete policy prevents // soft-deleted objects from being permanently deleted. SoftDeletePolicy *Bucket_SoftDeletePolicy `protobuf:"bytes,31,opt,name=soft_delete_policy,json=softDeletePolicy,proto3" json:"soft_delete_policy,omitempty"` } func (x *Bucket) Reset() { *x = Bucket{} mi := &file_google_storage_v2_storage_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket) ProtoMessage() {} func (x *Bucket) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket.ProtoReflect.Descriptor instead. func (*Bucket) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43} } func (x *Bucket) GetName() string { if x != nil { return x.Name } return "" } func (x *Bucket) GetBucketId() string { if x != nil { return x.BucketId } return "" } func (x *Bucket) GetEtag() string { if x != nil { return x.Etag } return "" } func (x *Bucket) GetProject() string { if x != nil { return x.Project } return "" } func (x *Bucket) GetMetageneration() int64 { if x != nil { return x.Metageneration } return 0 } func (x *Bucket) GetLocation() string { if x != nil { return x.Location } return "" } func (x *Bucket) GetLocationType() string { if x != nil { return x.LocationType } return "" } func (x *Bucket) GetStorageClass() string { if x != nil { return x.StorageClass } return "" } func (x *Bucket) GetRpo() string { if x != nil { return x.Rpo } return "" } func (x *Bucket) GetAcl() []*BucketAccessControl { if x != nil { return x.Acl } return nil } func (x *Bucket) GetDefaultObjectAcl() []*ObjectAccessControl { if x != nil { return x.DefaultObjectAcl } return nil } func (x *Bucket) GetLifecycle() *Bucket_Lifecycle { if x != nil { return x.Lifecycle } return nil } func (x *Bucket) GetCreateTime() *timestamppb.Timestamp { if x != nil { return x.CreateTime } return nil } func (x *Bucket) GetCors() []*Bucket_Cors { if x != nil { return x.Cors } return nil } func (x *Bucket) GetUpdateTime() *timestamppb.Timestamp { if x != nil { return x.UpdateTime } return nil } func (x *Bucket) GetDefaultEventBasedHold() bool { if x != nil { return x.DefaultEventBasedHold } return false } func (x *Bucket) GetLabels() map[string]string { if x != nil { return x.Labels } return nil } func (x *Bucket) GetWebsite() *Bucket_Website { if x != nil { return x.Website } return nil } func (x *Bucket) GetVersioning() *Bucket_Versioning { if x != nil { return x.Versioning } return nil } func (x *Bucket) GetLogging() *Bucket_Logging { if x != nil { return x.Logging } return nil } func (x *Bucket) GetOwner() *Owner { if x != nil { return x.Owner } return nil } func (x *Bucket) GetEncryption() *Bucket_Encryption { if x != nil { return x.Encryption } return nil } func (x *Bucket) GetBilling() *Bucket_Billing { if x != nil { return x.Billing } return nil } func (x *Bucket) GetRetentionPolicy() *Bucket_RetentionPolicy { if x != nil { return x.RetentionPolicy } return nil } func (x *Bucket) GetIamConfig() *Bucket_IamConfig { if x != nil { return x.IamConfig } return nil } func (x *Bucket) GetSatisfiesPzs() bool { if x != nil { return x.SatisfiesPzs } return false } func (x *Bucket) GetCustomPlacementConfig() *Bucket_CustomPlacementConfig { if x != nil { return x.CustomPlacementConfig } return nil } func (x *Bucket) GetAutoclass() *Bucket_Autoclass { if x != nil { return x.Autoclass } return nil } func (x *Bucket) GetHierarchicalNamespace() *Bucket_HierarchicalNamespace { if x != nil { return x.HierarchicalNamespace } return nil } func (x *Bucket) GetSoftDeletePolicy() *Bucket_SoftDeletePolicy { if x != nil { return x.SoftDeletePolicy } return nil } // An access-control entry. type BucketAccessControl struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The access permission for the entity. Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` // The ID of the access-control entry. Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` // The entity holding the permission, in one of the following forms: // * `user-{userid}` // * `user-{email}` // * `group-{groupid}` // * `group-{email}` // * `domain-{domain}` // * `project-{team}-{projectnumber}` // * `project-{team}-{projectid}` // * `allUsers` // * `allAuthenticatedUsers` // Examples: // * The user `liz@example.com` would be `user-liz@example.com`. // * The group `example@googlegroups.com` would be // `group-example@googlegroups.com` // * All members of the Google Apps for Business domain `example.com` would be // `domain-example.com` // For project entities, `project-{team}-{projectnumber}` format will be // returned on response. Entity string `protobuf:"bytes,3,opt,name=entity,proto3" json:"entity,omitempty"` // Output only. The alternative entity format, if exists. For project // entities, `project-{team}-{projectid}` format will be returned on response. EntityAlt string `protobuf:"bytes,9,opt,name=entity_alt,json=entityAlt,proto3" json:"entity_alt,omitempty"` // The ID for the entity, if any. EntityId string `protobuf:"bytes,4,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"` // The etag of the BucketAccessControl. // If included in the metadata of an update or delete request message, the // operation operation will only be performed if the etag matches that of the // bucket's BucketAccessControl. Etag string `protobuf:"bytes,8,opt,name=etag,proto3" json:"etag,omitempty"` // The email address associated with the entity, if any. Email string `protobuf:"bytes,5,opt,name=email,proto3" json:"email,omitempty"` // The domain associated with the entity, if any. Domain string `protobuf:"bytes,6,opt,name=domain,proto3" json:"domain,omitempty"` // The project team associated with the entity, if any. ProjectTeam *ProjectTeam `protobuf:"bytes,7,opt,name=project_team,json=projectTeam,proto3" json:"project_team,omitempty"` } func (x *BucketAccessControl) Reset() { *x = BucketAccessControl{} mi := &file_google_storage_v2_storage_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *BucketAccessControl) String() string { return protoimpl.X.MessageStringOf(x) } func (*BucketAccessControl) ProtoMessage() {} func (x *BucketAccessControl) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BucketAccessControl.ProtoReflect.Descriptor instead. func (*BucketAccessControl) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{44} } func (x *BucketAccessControl) GetRole() string { if x != nil { return x.Role } return "" } func (x *BucketAccessControl) GetId() string { if x != nil { return x.Id } return "" } func (x *BucketAccessControl) GetEntity() string { if x != nil { return x.Entity } return "" } func (x *BucketAccessControl) GetEntityAlt() string { if x != nil { return x.EntityAlt } return "" } func (x *BucketAccessControl) GetEntityId() string { if x != nil { return x.EntityId } return "" } func (x *BucketAccessControl) GetEtag() string { if x != nil { return x.Etag } return "" } func (x *BucketAccessControl) GetEmail() string { if x != nil { return x.Email } return "" } func (x *BucketAccessControl) GetDomain() string { if x != nil { return x.Domain } return "" } func (x *BucketAccessControl) GetProjectTeam() *ProjectTeam { if x != nil { return x.ProjectTeam } return nil } // Message used to convey content being read or written, along with an optional // checksum. type ChecksummedData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Optional. The data. Content []byte `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` // If set, the CRC32C digest of the content field. Crc32C *uint32 `protobuf:"fixed32,2,opt,name=crc32c,proto3,oneof" json:"crc32c,omitempty"` } func (x *ChecksummedData) Reset() { *x = ChecksummedData{} mi := &file_google_storage_v2_storage_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ChecksummedData) String() string { return protoimpl.X.MessageStringOf(x) } func (*ChecksummedData) ProtoMessage() {} func (x *ChecksummedData) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ChecksummedData.ProtoReflect.Descriptor instead. func (*ChecksummedData) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{45} } func (x *ChecksummedData) GetContent() []byte { if x != nil { return x.Content } return nil } func (x *ChecksummedData) GetCrc32C() uint32 { if x != nil && x.Crc32C != nil { return *x.Crc32C } return 0 } // Message used for storing full (not subrange) object checksums. type ObjectChecksums struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // CRC32C digest of the object data. Computed by the Cloud Storage service for // all written objects. // If set in a WriteObjectRequest, service will validate that the stored // object matches this checksum. Crc32C *uint32 `protobuf:"fixed32,1,opt,name=crc32c,proto3,oneof" json:"crc32c,omitempty"` // 128 bit MD5 hash of the object data. // For more information about using the MD5 hash, see // [https://cloud.google.com/storage/docs/hashes-etags#json-api][Hashes and // ETags: Best Practices]. // Not all objects will provide an MD5 hash. For example, composite objects // provide only crc32c hashes. This value is equivalent to running `cat // object.txt | openssl md5 -binary` Md5Hash []byte `protobuf:"bytes,2,opt,name=md5_hash,json=md5Hash,proto3" json:"md5_hash,omitempty"` } func (x *ObjectChecksums) Reset() { *x = ObjectChecksums{} mi := &file_google_storage_v2_storage_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ObjectChecksums) String() string { return protoimpl.X.MessageStringOf(x) } func (*ObjectChecksums) ProtoMessage() {} func (x *ObjectChecksums) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ObjectChecksums.ProtoReflect.Descriptor instead. func (*ObjectChecksums) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{46} } func (x *ObjectChecksums) GetCrc32C() uint32 { if x != nil && x.Crc32C != nil { return *x.Crc32C } return 0 } func (x *ObjectChecksums) GetMd5Hash() []byte { if x != nil { return x.Md5Hash } return nil } // Describes the Customer-Supplied Encryption Key mechanism used to store an // Object's data at rest. type CustomerEncryption struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The encryption algorithm. EncryptionAlgorithm string `protobuf:"bytes,1,opt,name=encryption_algorithm,json=encryptionAlgorithm,proto3" json:"encryption_algorithm,omitempty"` // SHA256 hash value of the encryption key. // In raw bytes format (not base64-encoded). KeySha256Bytes []byte `protobuf:"bytes,3,opt,name=key_sha256_bytes,json=keySha256Bytes,proto3" json:"key_sha256_bytes,omitempty"` } func (x *CustomerEncryption) Reset() { *x = CustomerEncryption{} mi := &file_google_storage_v2_storage_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *CustomerEncryption) String() string { return protoimpl.X.MessageStringOf(x) } func (*CustomerEncryption) ProtoMessage() {} func (x *CustomerEncryption) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CustomerEncryption.ProtoReflect.Descriptor instead. func (*CustomerEncryption) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{47} } func (x *CustomerEncryption) GetEncryptionAlgorithm() string { if x != nil { return x.EncryptionAlgorithm } return "" } func (x *CustomerEncryption) GetKeySha256Bytes() []byte { if x != nil { return x.KeySha256Bytes } return nil } // An object. type Object struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Immutable. The name of this object. Nearly any sequence of unicode // characters is valid. See // [Guidelines](https://cloud.google.com/storage/docs/objects#naming). // Example: `test.txt` // The `name` field by itself does not uniquely identify a Cloud Storage // object. A Cloud Storage object is uniquely identified by the tuple of // (bucket, object, generation). Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Immutable. The name of the bucket containing this object. Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` // The etag of the object. // If included in the metadata of an update or delete request message, the // operation will only be performed if the etag matches that of the live // object. Etag string `protobuf:"bytes,27,opt,name=etag,proto3" json:"etag,omitempty"` // Immutable. The content generation of this object. Used for object // versioning. Generation int64 `protobuf:"varint,3,opt,name=generation,proto3" json:"generation,omitempty"` // Output only. Restore token used to differentiate deleted objects with the // same name and generation. This field is output only, and only set for // deleted objects in HNS buckets. RestoreToken *string `protobuf:"bytes,35,opt,name=restore_token,json=restoreToken,proto3,oneof" json:"restore_token,omitempty"` // Output only. The version of the metadata for this generation of this // object. Used for preconditions and for detecting changes in metadata. A // metageneration number is only meaningful in the context of a particular // generation of a particular object. Metageneration int64 `protobuf:"varint,4,opt,name=metageneration,proto3" json:"metageneration,omitempty"` // Storage class of the object. StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` // Output only. Content-Length of the object data in bytes, matching // [https://tools.ietf.org/html/rfc7230#section-3.3.2][RFC 7230 §3.3.2]. Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` // Content-Encoding of the object data, matching // [https://tools.ietf.org/html/rfc7231#section-3.1.2.2][RFC 7231 §3.1.2.2] ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` // Content-Disposition of the object data, matching // [https://tools.ietf.org/html/rfc6266][RFC 6266]. ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` // Cache-Control directive for the object data, matching // [https://tools.ietf.org/html/rfc7234#section-5.2"][RFC 7234 §5.2]. // If omitted, and the object is accessible to all anonymous users, the // default will be `public, max-age=3600`. CacheControl string `protobuf:"bytes,9,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` // Access controls on the object. // If iam_config.uniform_bucket_level_access is enabled on the parent // bucket, requests to set, read, or modify acl is an error. Acl []*ObjectAccessControl `protobuf:"bytes,10,rep,name=acl,proto3" json:"acl,omitempty"` // Content-Language of the object data, matching // [https://tools.ietf.org/html/rfc7231#section-3.1.3.2][RFC 7231 §3.1.3.2]. ContentLanguage string `protobuf:"bytes,11,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` // Output only. If this object is noncurrent, this is the time when the object // became noncurrent. DeleteTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=delete_time,json=deleteTime,proto3" json:"delete_time,omitempty"` // Output only. The time when the object was finalized. FinalizeTime *timestamppb.Timestamp `protobuf:"bytes,36,opt,name=finalize_time,json=finalizeTime,proto3" json:"finalize_time,omitempty"` // Content-Type of the object data, matching // [https://tools.ietf.org/html/rfc7231#section-3.1.1.5][RFC 7231 §3.1.1.5]. // If an object is stored without a Content-Type, it is served as // `application/octet-stream`. ContentType string `protobuf:"bytes,13,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` // Output only. The creation time of the object. CreateTime *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // Output only. Number of underlying components that make up this object. // Components are accumulated by compose operations. ComponentCount int32 `protobuf:"varint,15,opt,name=component_count,json=componentCount,proto3" json:"component_count,omitempty"` // Output only. Hashes for the data part of this object. This field is used // for output only and will be silently ignored if provided in requests. The // checksums of the complete object regardless of data range. If the object is // downloaded in full, the client should compute one of these checksums over // the downloaded object and compare it against the value provided here. Checksums *ObjectChecksums `protobuf:"bytes,16,opt,name=checksums,proto3" json:"checksums,omitempty"` // Output only. The modification time of the object metadata. // Set initially to object creation time and then updated whenever any // metadata of the object changes. This includes changes made by a requester, // such as modifying custom metadata, as well as changes made by Cloud Storage // on behalf of a requester, such as changing the storage class based on an // Object Lifecycle Configuration. UpdateTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // Cloud KMS Key used to encrypt this object, if the object is encrypted by // such a key. KmsKey string `protobuf:"bytes,18,opt,name=kms_key,json=kmsKey,proto3" json:"kms_key,omitempty"` // Output only. The time at which the object's storage class was last changed. // When the object is initially created, it will be set to time_created. UpdateStorageClassTime *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=update_storage_class_time,json=updateStorageClassTime,proto3" json:"update_storage_class_time,omitempty"` // Whether an object is under temporary hold. While this flag is set to true, // the object is protected against deletion and overwrites. A common use case // of this flag is regulatory investigations where objects need to be retained // while the investigation is ongoing. Note that unlike event-based hold, // temporary hold does not impact retention expiration time of an object. TemporaryHold bool `protobuf:"varint,20,opt,name=temporary_hold,json=temporaryHold,proto3" json:"temporary_hold,omitempty"` // A server-determined value that specifies the earliest time that the // object's retention period expires. // Note 1: This field is not provided for objects with an active event-based // hold, since retention expiration is unknown until the hold is removed. // Note 2: This value can be provided even when temporary hold is set (so that // the user can reason about policy without having to first unset the // temporary hold). RetentionExpireTime *timestamppb.Timestamp `protobuf:"bytes,21,opt,name=retention_expire_time,json=retentionExpireTime,proto3" json:"retention_expire_time,omitempty"` // User-provided metadata, in key/value pairs. Metadata map[string]string `protobuf:"bytes,22,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Whether an object is under event-based hold. // An event-based hold is a way to force the retention of an object until // after some event occurs. Once the hold is released by explicitly setting // this field to false, the object will become subject to any bucket-level // retention policy, except that the retention duration will be calculated // from the time the event based hold was lifted, rather than the time the // object was created. // // In a WriteObject request, not setting this field implies that the value // should be taken from the parent bucket's "default_event_based_hold" field. // In a response, this field will always be set to true or false. EventBasedHold *bool `protobuf:"varint,23,opt,name=event_based_hold,json=eventBasedHold,proto3,oneof" json:"event_based_hold,omitempty"` // Output only. The owner of the object. This will always be the uploader of // the object. Owner *Owner `protobuf:"bytes,24,opt,name=owner,proto3" json:"owner,omitempty"` // Metadata of Customer-Supplied Encryption Key, if the object is encrypted by // such a key. CustomerEncryption *CustomerEncryption `protobuf:"bytes,25,opt,name=customer_encryption,json=customerEncryption,proto3" json:"customer_encryption,omitempty"` // A user-specified timestamp set on an object. CustomTime *timestamppb.Timestamp `protobuf:"bytes,26,opt,name=custom_time,json=customTime,proto3" json:"custom_time,omitempty"` // Output only. This is the time when the object became soft-deleted. // // Soft-deleted objects are only accessible if a soft_delete_policy is // enabled. Also see hard_delete_time. SoftDeleteTime *timestamppb.Timestamp `protobuf:"bytes,28,opt,name=soft_delete_time,json=softDeleteTime,proto3,oneof" json:"soft_delete_time,omitempty"` // Output only. The time when the object will be permanently deleted. // // Only set when an object becomes soft-deleted with a soft_delete_policy. // Otherwise, the object will not be accessible. HardDeleteTime *timestamppb.Timestamp `protobuf:"bytes,29,opt,name=hard_delete_time,json=hardDeleteTime,proto3,oneof" json:"hard_delete_time,omitempty"` } func (x *Object) Reset() { *x = Object{} mi := &file_google_storage_v2_storage_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Object) String() string { return protoimpl.X.MessageStringOf(x) } func (*Object) ProtoMessage() {} func (x *Object) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Object.ProtoReflect.Descriptor instead. func (*Object) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{48} } func (x *Object) GetName() string { if x != nil { return x.Name } return "" } func (x *Object) GetBucket() string { if x != nil { return x.Bucket } return "" } func (x *Object) GetEtag() string { if x != nil { return x.Etag } return "" } func (x *Object) GetGeneration() int64 { if x != nil { return x.Generation } return 0 } func (x *Object) GetRestoreToken() string { if x != nil && x.RestoreToken != nil { return *x.RestoreToken } return "" } func (x *Object) GetMetageneration() int64 { if x != nil { return x.Metageneration } return 0 } func (x *Object) GetStorageClass() string { if x != nil { return x.StorageClass } return "" } func (x *Object) GetSize() int64 { if x != nil { return x.Size } return 0 } func (x *Object) GetContentEncoding() string { if x != nil { return x.ContentEncoding } return "" } func (x *Object) GetContentDisposition() string { if x != nil { return x.ContentDisposition } return "" } func (x *Object) GetCacheControl() string { if x != nil { return x.CacheControl } return "" } func (x *Object) GetAcl() []*ObjectAccessControl { if x != nil { return x.Acl } return nil } func (x *Object) GetContentLanguage() string { if x != nil { return x.ContentLanguage } return "" } func (x *Object) GetDeleteTime() *timestamppb.Timestamp { if x != nil { return x.DeleteTime } return nil } func (x *Object) GetFinalizeTime() *timestamppb.Timestamp { if x != nil { return x.FinalizeTime } return nil } func (x *Object) GetContentType() string { if x != nil { return x.ContentType } return "" } func (x *Object) GetCreateTime() *timestamppb.Timestamp { if x != nil { return x.CreateTime } return nil } func (x *Object) GetComponentCount() int32 { if x != nil { return x.ComponentCount } return 0 } func (x *Object) GetChecksums() *ObjectChecksums { if x != nil { return x.Checksums } return nil } func (x *Object) GetUpdateTime() *timestamppb.Timestamp { if x != nil { return x.UpdateTime } return nil } func (x *Object) GetKmsKey() string { if x != nil { return x.KmsKey } return "" } func (x *Object) GetUpdateStorageClassTime() *timestamppb.Timestamp { if x != nil { return x.UpdateStorageClassTime } return nil } func (x *Object) GetTemporaryHold() bool { if x != nil { return x.TemporaryHold } return false } func (x *Object) GetRetentionExpireTime() *timestamppb.Timestamp { if x != nil { return x.RetentionExpireTime } return nil } func (x *Object) GetMetadata() map[string]string { if x != nil { return x.Metadata } return nil } func (x *Object) GetEventBasedHold() bool { if x != nil && x.EventBasedHold != nil { return *x.EventBasedHold } return false } func (x *Object) GetOwner() *Owner { if x != nil { return x.Owner } return nil } func (x *Object) GetCustomerEncryption() *CustomerEncryption { if x != nil { return x.CustomerEncryption } return nil } func (x *Object) GetCustomTime() *timestamppb.Timestamp { if x != nil { return x.CustomTime } return nil } func (x *Object) GetSoftDeleteTime() *timestamppb.Timestamp { if x != nil { return x.SoftDeleteTime } return nil } func (x *Object) GetHardDeleteTime() *timestamppb.Timestamp { if x != nil { return x.HardDeleteTime } return nil } // An access-control entry. type ObjectAccessControl struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The access permission for the entity. One of the following values: // * `READER` // * `WRITER` // * `OWNER` Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` // The ID of the access-control entry. Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` // The entity holding the permission, in one of the following forms: // * `user-{userid}` // * `user-{email}` // * `group-{groupid}` // * `group-{email}` // * `domain-{domain}` // * `project-{team}-{projectnumber}` // * `project-{team}-{projectid}` // * `allUsers` // * `allAuthenticatedUsers` // Examples: // * The user `liz@example.com` would be `user-liz@example.com`. // * The group `example@googlegroups.com` would be // `group-example@googlegroups.com`. // * All members of the Google Apps for Business domain `example.com` would be // `domain-example.com`. // For project entities, `project-{team}-{projectnumber}` format will be // returned on response. Entity string `protobuf:"bytes,3,opt,name=entity,proto3" json:"entity,omitempty"` // Output only. The alternative entity format, if exists. For project // entities, `project-{team}-{projectid}` format will be returned on response. EntityAlt string `protobuf:"bytes,9,opt,name=entity_alt,json=entityAlt,proto3" json:"entity_alt,omitempty"` // The ID for the entity, if any. EntityId string `protobuf:"bytes,4,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"` // The etag of the ObjectAccessControl. // If included in the metadata of an update or delete request message, the // operation will only be performed if the etag matches that of the live // object's ObjectAccessControl. Etag string `protobuf:"bytes,8,opt,name=etag,proto3" json:"etag,omitempty"` // The email address associated with the entity, if any. Email string `protobuf:"bytes,5,opt,name=email,proto3" json:"email,omitempty"` // The domain associated with the entity, if any. Domain string `protobuf:"bytes,6,opt,name=domain,proto3" json:"domain,omitempty"` // The project team associated with the entity, if any. ProjectTeam *ProjectTeam `protobuf:"bytes,7,opt,name=project_team,json=projectTeam,proto3" json:"project_team,omitempty"` } func (x *ObjectAccessControl) Reset() { *x = ObjectAccessControl{} mi := &file_google_storage_v2_storage_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ObjectAccessControl) String() string { return protoimpl.X.MessageStringOf(x) } func (*ObjectAccessControl) ProtoMessage() {} func (x *ObjectAccessControl) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ObjectAccessControl.ProtoReflect.Descriptor instead. func (*ObjectAccessControl) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{49} } func (x *ObjectAccessControl) GetRole() string { if x != nil { return x.Role } return "" } func (x *ObjectAccessControl) GetId() string { if x != nil { return x.Id } return "" } func (x *ObjectAccessControl) GetEntity() string { if x != nil { return x.Entity } return "" } func (x *ObjectAccessControl) GetEntityAlt() string { if x != nil { return x.EntityAlt } return "" } func (x *ObjectAccessControl) GetEntityId() string { if x != nil { return x.EntityId } return "" } func (x *ObjectAccessControl) GetEtag() string { if x != nil { return x.Etag } return "" } func (x *ObjectAccessControl) GetEmail() string { if x != nil { return x.Email } return "" } func (x *ObjectAccessControl) GetDomain() string { if x != nil { return x.Domain } return "" } func (x *ObjectAccessControl) GetProjectTeam() *ProjectTeam { if x != nil { return x.ProjectTeam } return nil } // The result of a call to Objects.ListObjects type ListObjectsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The list of items. Objects []*Object `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"` // The list of prefixes of objects matching-but-not-listed up to and including // the requested delimiter. Prefixes []string `protobuf:"bytes,2,rep,name=prefixes,proto3" json:"prefixes,omitempty"` // The continuation token, used to page through large result sets. Provide // this value in a subsequent request to return the next page of results. NextPageToken string `protobuf:"bytes,3,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } func (x *ListObjectsResponse) Reset() { *x = ListObjectsResponse{} mi := &file_google_storage_v2_storage_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ListObjectsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ListObjectsResponse) ProtoMessage() {} func (x *ListObjectsResponse) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ListObjectsResponse.ProtoReflect.Descriptor instead. func (*ListObjectsResponse) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{50} } func (x *ListObjectsResponse) GetObjects() []*Object { if x != nil { return x.Objects } return nil } func (x *ListObjectsResponse) GetPrefixes() []string { if x != nil { return x.Prefixes } return nil } func (x *ListObjectsResponse) GetNextPageToken() string { if x != nil { return x.NextPageToken } return "" } // Represents the Viewers, Editors, or Owners of a given project. type ProjectTeam struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The project number. ProjectNumber string `protobuf:"bytes,1,opt,name=project_number,json=projectNumber,proto3" json:"project_number,omitempty"` // The team. Team string `protobuf:"bytes,2,opt,name=team,proto3" json:"team,omitempty"` } func (x *ProjectTeam) Reset() { *x = ProjectTeam{} mi := &file_google_storage_v2_storage_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ProjectTeam) String() string { return protoimpl.X.MessageStringOf(x) } func (*ProjectTeam) ProtoMessage() {} func (x *ProjectTeam) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ProjectTeam.ProtoReflect.Descriptor instead. func (*ProjectTeam) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{51} } func (x *ProjectTeam) GetProjectNumber() string { if x != nil { return x.ProjectNumber } return "" } func (x *ProjectTeam) GetTeam() string { if x != nil { return x.Team } return "" } // The owner of a specific resource. type Owner struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The entity, in the form `user-`*userId*. Entity string `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` // The ID for the entity. EntityId string `protobuf:"bytes,2,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"` } func (x *Owner) Reset() { *x = Owner{} mi := &file_google_storage_v2_storage_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Owner) String() string { return protoimpl.X.MessageStringOf(x) } func (*Owner) ProtoMessage() {} func (x *Owner) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Owner.ProtoReflect.Descriptor instead. func (*Owner) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{52} } func (x *Owner) GetEntity() string { if x != nil { return x.Entity } return "" } func (x *Owner) GetEntityId() string { if x != nil { return x.EntityId } return "" } // Specifies a requested range of bytes to download. type ContentRange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The starting offset of the object data. This value is inclusive. Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"` // The ending offset of the object data. This value is exclusive. End int64 `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"` // The complete length of the object data. CompleteLength int64 `protobuf:"varint,3,opt,name=complete_length,json=completeLength,proto3" json:"complete_length,omitempty"` } func (x *ContentRange) Reset() { *x = ContentRange{} mi := &file_google_storage_v2_storage_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ContentRange) String() string { return protoimpl.X.MessageStringOf(x) } func (*ContentRange) ProtoMessage() {} func (x *ContentRange) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ContentRange.ProtoReflect.Descriptor instead. func (*ContentRange) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{53} } func (x *ContentRange) GetStart() int64 { if x != nil { return x.Start } return 0 } func (x *ContentRange) GetEnd() int64 { if x != nil { return x.End } return 0 } func (x *ContentRange) GetCompleteLength() int64 { if x != nil { return x.CompleteLength } return 0 } // Description of a source object for a composition request. type ComposeObjectRequest_SourceObject struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Required. The source object's name. All source objects must reside in the // same bucket. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The generation of this object to use as the source. Generation int64 `protobuf:"varint,2,opt,name=generation,proto3" json:"generation,omitempty"` // Conditions that must be met for this operation to execute. ObjectPreconditions *ComposeObjectRequest_SourceObject_ObjectPreconditions `protobuf:"bytes,3,opt,name=object_preconditions,json=objectPreconditions,proto3" json:"object_preconditions,omitempty"` } func (x *ComposeObjectRequest_SourceObject) Reset() { *x = ComposeObjectRequest_SourceObject{} mi := &file_google_storage_v2_storage_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ComposeObjectRequest_SourceObject) String() string { return protoimpl.X.MessageStringOf(x) } func (*ComposeObjectRequest_SourceObject) ProtoMessage() {} func (x *ComposeObjectRequest_SourceObject) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ComposeObjectRequest_SourceObject.ProtoReflect.Descriptor instead. func (*ComposeObjectRequest_SourceObject) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{7, 0} } func (x *ComposeObjectRequest_SourceObject) GetName() string { if x != nil { return x.Name } return "" } func (x *ComposeObjectRequest_SourceObject) GetGeneration() int64 { if x != nil { return x.Generation } return 0 } func (x *ComposeObjectRequest_SourceObject) GetObjectPreconditions() *ComposeObjectRequest_SourceObject_ObjectPreconditions { if x != nil { return x.ObjectPreconditions } return nil } // Preconditions for a source object of a composition request. type ComposeObjectRequest_SourceObject_ObjectPreconditions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Only perform the composition if the generation of the source object // that would be used matches this value. If this value and a generation // are both specified, they must be the same value or the call will fail. IfGenerationMatch *int64 `protobuf:"varint,1,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"` } func (x *ComposeObjectRequest_SourceObject_ObjectPreconditions) Reset() { *x = ComposeObjectRequest_SourceObject_ObjectPreconditions{} mi := &file_google_storage_v2_storage_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ComposeObjectRequest_SourceObject_ObjectPreconditions) String() string { return protoimpl.X.MessageStringOf(x) } func (*ComposeObjectRequest_SourceObject_ObjectPreconditions) ProtoMessage() {} func (x *ComposeObjectRequest_SourceObject_ObjectPreconditions) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ComposeObjectRequest_SourceObject_ObjectPreconditions.ProtoReflect.Descriptor instead. func (*ComposeObjectRequest_SourceObject_ObjectPreconditions) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{7, 0, 0} } func (x *ComposeObjectRequest_SourceObject_ObjectPreconditions) GetIfGenerationMatch() int64 { if x != nil && x.IfGenerationMatch != nil { return *x.IfGenerationMatch } return 0 } // Billing properties of a bucket. type Bucket_Billing struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // When set to true, Requester Pays is enabled for this bucket. RequesterPays bool `protobuf:"varint,1,opt,name=requester_pays,json=requesterPays,proto3" json:"requester_pays,omitempty"` } func (x *Bucket_Billing) Reset() { *x = Bucket_Billing{} mi := &file_google_storage_v2_storage_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Billing) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Billing) ProtoMessage() {} func (x *Bucket_Billing) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Billing.ProtoReflect.Descriptor instead. func (*Bucket_Billing) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 0} } func (x *Bucket_Billing) GetRequesterPays() bool { if x != nil { return x.RequesterPays } return false } // Cross-Origin Response sharing (CORS) properties for a bucket. // For more on Cloud Storage and CORS, see // https://cloud.google.com/storage/docs/cross-origin. // For more on CORS in general, see https://tools.ietf.org/html/rfc6454. type Bucket_Cors struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The list of Origins eligible to receive CORS response headers. See // [https://tools.ietf.org/html/rfc6454][RFC 6454] for more on origins. // Note: "*" is permitted in the list of origins, and means "any Origin". Origin []string `protobuf:"bytes,1,rep,name=origin,proto3" json:"origin,omitempty"` // The list of HTTP methods on which to include CORS response headers, // (`GET`, `OPTIONS`, `POST`, etc) Note: "*" is permitted in the list of // methods, and means "any method". Method []string `protobuf:"bytes,2,rep,name=method,proto3" json:"method,omitempty"` // The list of HTTP headers other than the // [https://www.w3.org/TR/cors/#simple-response-header][simple response // headers] to give permission for the user-agent to share across domains. ResponseHeader []string `protobuf:"bytes,3,rep,name=response_header,json=responseHeader,proto3" json:"response_header,omitempty"` // The value, in seconds, to return in the // [https://www.w3.org/TR/cors/#access-control-max-age-response-header][Access-Control-Max-Age // header] used in preflight responses. MaxAgeSeconds int32 `protobuf:"varint,4,opt,name=max_age_seconds,json=maxAgeSeconds,proto3" json:"max_age_seconds,omitempty"` } func (x *Bucket_Cors) Reset() { *x = Bucket_Cors{} mi := &file_google_storage_v2_storage_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Cors) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Cors) ProtoMessage() {} func (x *Bucket_Cors) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Cors.ProtoReflect.Descriptor instead. func (*Bucket_Cors) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 1} } func (x *Bucket_Cors) GetOrigin() []string { if x != nil { return x.Origin } return nil } func (x *Bucket_Cors) GetMethod() []string { if x != nil { return x.Method } return nil } func (x *Bucket_Cors) GetResponseHeader() []string { if x != nil { return x.ResponseHeader } return nil } func (x *Bucket_Cors) GetMaxAgeSeconds() int32 { if x != nil { return x.MaxAgeSeconds } return 0 } // Encryption properties of a bucket. type Bucket_Encryption struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The name of the Cloud KMS key that will be used to encrypt objects // inserted into this bucket, if no encryption method is specified. DefaultKmsKey string `protobuf:"bytes,1,opt,name=default_kms_key,json=defaultKmsKey,proto3" json:"default_kms_key,omitempty"` } func (x *Bucket_Encryption) Reset() { *x = Bucket_Encryption{} mi := &file_google_storage_v2_storage_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Encryption) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Encryption) ProtoMessage() {} func (x *Bucket_Encryption) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Encryption.ProtoReflect.Descriptor instead. func (*Bucket_Encryption) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 2} } func (x *Bucket_Encryption) GetDefaultKmsKey() string { if x != nil { return x.DefaultKmsKey } return "" } // Bucket restriction options. type Bucket_IamConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Bucket restriction options currently enforced on the bucket. UniformBucketLevelAccess *Bucket_IamConfig_UniformBucketLevelAccess `protobuf:"bytes,1,opt,name=uniform_bucket_level_access,json=uniformBucketLevelAccess,proto3" json:"uniform_bucket_level_access,omitempty"` // Whether IAM will enforce public access prevention. Valid values are // "enforced" or "inherited". PublicAccessPrevention string `protobuf:"bytes,3,opt,name=public_access_prevention,json=publicAccessPrevention,proto3" json:"public_access_prevention,omitempty"` } func (x *Bucket_IamConfig) Reset() { *x = Bucket_IamConfig{} mi := &file_google_storage_v2_storage_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_IamConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_IamConfig) ProtoMessage() {} func (x *Bucket_IamConfig) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_IamConfig.ProtoReflect.Descriptor instead. func (*Bucket_IamConfig) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 3} } func (x *Bucket_IamConfig) GetUniformBucketLevelAccess() *Bucket_IamConfig_UniformBucketLevelAccess { if x != nil { return x.UniformBucketLevelAccess } return nil } func (x *Bucket_IamConfig) GetPublicAccessPrevention() string { if x != nil { return x.PublicAccessPrevention } return "" } // Lifecycle properties of a bucket. // For more information, see https://cloud.google.com/storage/docs/lifecycle. type Bucket_Lifecycle struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A lifecycle management rule, which is made of an action to take and the // condition(s) under which the action will be taken. Rule []*Bucket_Lifecycle_Rule `protobuf:"bytes,1,rep,name=rule,proto3" json:"rule,omitempty"` } func (x *Bucket_Lifecycle) Reset() { *x = Bucket_Lifecycle{} mi := &file_google_storage_v2_storage_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Lifecycle) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Lifecycle) ProtoMessage() {} func (x *Bucket_Lifecycle) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Lifecycle.ProtoReflect.Descriptor instead. func (*Bucket_Lifecycle) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 4} } func (x *Bucket_Lifecycle) GetRule() []*Bucket_Lifecycle_Rule { if x != nil { return x.Rule } return nil } // Logging-related properties of a bucket. type Bucket_Logging struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The destination bucket where the current bucket's logs should be placed, // using path format (like `projects/123456/buckets/foo`). LogBucket string `protobuf:"bytes,1,opt,name=log_bucket,json=logBucket,proto3" json:"log_bucket,omitempty"` // A prefix for log object names. LogObjectPrefix string `protobuf:"bytes,2,opt,name=log_object_prefix,json=logObjectPrefix,proto3" json:"log_object_prefix,omitempty"` } func (x *Bucket_Logging) Reset() { *x = Bucket_Logging{} mi := &file_google_storage_v2_storage_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Logging) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Logging) ProtoMessage() {} func (x *Bucket_Logging) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Logging.ProtoReflect.Descriptor instead. func (*Bucket_Logging) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 5} } func (x *Bucket_Logging) GetLogBucket() string { if x != nil { return x.LogBucket } return "" } func (x *Bucket_Logging) GetLogObjectPrefix() string { if x != nil { return x.LogObjectPrefix } return "" } // Retention policy properties of a bucket. type Bucket_RetentionPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Server-determined value that indicates the time from which policy was // enforced and effective. EffectiveTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=effective_time,json=effectiveTime,proto3" json:"effective_time,omitempty"` // Once locked, an object retention policy cannot be modified. IsLocked bool `protobuf:"varint,2,opt,name=is_locked,json=isLocked,proto3" json:"is_locked,omitempty"` // The duration that objects need to be retained. Retention duration must be // greater than zero and less than 100 years. Note that enforcement of // retention periods less than a day is not guaranteed. Such periods should // only be used for testing purposes. Any `nanos` value specified will be // rounded down to the nearest second. RetentionDuration *durationpb.Duration `protobuf:"bytes,4,opt,name=retention_duration,json=retentionDuration,proto3" json:"retention_duration,omitempty"` } func (x *Bucket_RetentionPolicy) Reset() { *x = Bucket_RetentionPolicy{} mi := &file_google_storage_v2_storage_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_RetentionPolicy) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_RetentionPolicy) ProtoMessage() {} func (x *Bucket_RetentionPolicy) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_RetentionPolicy.ProtoReflect.Descriptor instead. func (*Bucket_RetentionPolicy) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 6} } func (x *Bucket_RetentionPolicy) GetEffectiveTime() *timestamppb.Timestamp { if x != nil { return x.EffectiveTime } return nil } func (x *Bucket_RetentionPolicy) GetIsLocked() bool { if x != nil { return x.IsLocked } return false } func (x *Bucket_RetentionPolicy) GetRetentionDuration() *durationpb.Duration { if x != nil { return x.RetentionDuration } return nil } // Soft delete policy properties of a bucket. type Bucket_SoftDeletePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The period of time that soft-deleted objects in the bucket must be // retained and cannot be permanently deleted. The duration must be greater // than or equal to 7 days and less than 1 year. RetentionDuration *durationpb.Duration `protobuf:"bytes,1,opt,name=retention_duration,json=retentionDuration,proto3,oneof" json:"retention_duration,omitempty"` // Time from which the policy was effective. This is service-provided. EffectiveTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=effective_time,json=effectiveTime,proto3,oneof" json:"effective_time,omitempty"` } func (x *Bucket_SoftDeletePolicy) Reset() { *x = Bucket_SoftDeletePolicy{} mi := &file_google_storage_v2_storage_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_SoftDeletePolicy) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_SoftDeletePolicy) ProtoMessage() {} func (x *Bucket_SoftDeletePolicy) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_SoftDeletePolicy.ProtoReflect.Descriptor instead. func (*Bucket_SoftDeletePolicy) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 7} } func (x *Bucket_SoftDeletePolicy) GetRetentionDuration() *durationpb.Duration { if x != nil { return x.RetentionDuration } return nil } func (x *Bucket_SoftDeletePolicy) GetEffectiveTime() *timestamppb.Timestamp { if x != nil { return x.EffectiveTime } return nil } // Properties of a bucket related to versioning. // For more on Cloud Storage versioning, see // https://cloud.google.com/storage/docs/object-versioning. type Bucket_Versioning struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // While set to true, versioning is fully enabled for this bucket. Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` } func (x *Bucket_Versioning) Reset() { *x = Bucket_Versioning{} mi := &file_google_storage_v2_storage_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Versioning) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Versioning) ProtoMessage() {} func (x *Bucket_Versioning) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Versioning.ProtoReflect.Descriptor instead. func (*Bucket_Versioning) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 8} } func (x *Bucket_Versioning) GetEnabled() bool { if x != nil { return x.Enabled } return false } // Properties of a bucket related to accessing the contents as a static // website. For more on hosting a static website via Cloud Storage, see // https://cloud.google.com/storage/docs/hosting-static-website. type Bucket_Website struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // If the requested object path is missing, the service will ensure the path // has a trailing '/', append this suffix, and attempt to retrieve the // resulting object. This allows the creation of `index.html` // objects to represent directory pages. MainPageSuffix string `protobuf:"bytes,1,opt,name=main_page_suffix,json=mainPageSuffix,proto3" json:"main_page_suffix,omitempty"` // If the requested object path is missing, and any // `mainPageSuffix` object is missing, if applicable, the service // will return the named object from this bucket as the content for a // [https://tools.ietf.org/html/rfc7231#section-6.5.4][404 Not Found] // result. NotFoundPage string `protobuf:"bytes,2,opt,name=not_found_page,json=notFoundPage,proto3" json:"not_found_page,omitempty"` } func (x *Bucket_Website) Reset() { *x = Bucket_Website{} mi := &file_google_storage_v2_storage_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Website) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Website) ProtoMessage() {} func (x *Bucket_Website) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Website.ProtoReflect.Descriptor instead. func (*Bucket_Website) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 9} } func (x *Bucket_Website) GetMainPageSuffix() string { if x != nil { return x.MainPageSuffix } return "" } func (x *Bucket_Website) GetNotFoundPage() string { if x != nil { return x.NotFoundPage } return "" } // Configuration for Custom Dual Regions. It should specify precisely two // eligible regions within the same Multiregion. More information on regions // may be found [https://cloud.google.com/storage/docs/locations][here]. type Bucket_CustomPlacementConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // List of locations to use for data placement. DataLocations []string `protobuf:"bytes,1,rep,name=data_locations,json=dataLocations,proto3" json:"data_locations,omitempty"` } func (x *Bucket_CustomPlacementConfig) Reset() { *x = Bucket_CustomPlacementConfig{} mi := &file_google_storage_v2_storage_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_CustomPlacementConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_CustomPlacementConfig) ProtoMessage() {} func (x *Bucket_CustomPlacementConfig) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_CustomPlacementConfig.ProtoReflect.Descriptor instead. func (*Bucket_CustomPlacementConfig) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 10} } func (x *Bucket_CustomPlacementConfig) GetDataLocations() []string { if x != nil { return x.DataLocations } return nil } // Configuration for a bucket's Autoclass feature. type Bucket_Autoclass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Enables Autoclass. Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` // Output only. Latest instant at which the `enabled` field was set to true // after being disabled/unconfigured or set to false after being enabled. If // Autoclass is enabled when the bucket is created, the toggle_time is set // to the bucket creation time. ToggleTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=toggle_time,json=toggleTime,proto3" json:"toggle_time,omitempty"` // An object in an Autoclass bucket will eventually cool down to the // terminal storage class if there is no access to the object. // The only valid values are NEARLINE and ARCHIVE. TerminalStorageClass *string `protobuf:"bytes,3,opt,name=terminal_storage_class,json=terminalStorageClass,proto3,oneof" json:"terminal_storage_class,omitempty"` // Output only. Latest instant at which the autoclass terminal storage class // was updated. TerminalStorageClassUpdateTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=terminal_storage_class_update_time,json=terminalStorageClassUpdateTime,proto3,oneof" json:"terminal_storage_class_update_time,omitempty"` } func (x *Bucket_Autoclass) Reset() { *x = Bucket_Autoclass{} mi := &file_google_storage_v2_storage_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Autoclass) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Autoclass) ProtoMessage() {} func (x *Bucket_Autoclass) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Autoclass.ProtoReflect.Descriptor instead. func (*Bucket_Autoclass) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 11} } func (x *Bucket_Autoclass) GetEnabled() bool { if x != nil { return x.Enabled } return false } func (x *Bucket_Autoclass) GetToggleTime() *timestamppb.Timestamp { if x != nil { return x.ToggleTime } return nil } func (x *Bucket_Autoclass) GetTerminalStorageClass() string { if x != nil && x.TerminalStorageClass != nil { return *x.TerminalStorageClass } return "" } func (x *Bucket_Autoclass) GetTerminalStorageClassUpdateTime() *timestamppb.Timestamp { if x != nil { return x.TerminalStorageClassUpdateTime } return nil } // Configuration for a bucket's hierarchical namespace feature. type Bucket_HierarchicalNamespace struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Optional. Enables the hierarchical namespace feature. Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` } func (x *Bucket_HierarchicalNamespace) Reset() { *x = Bucket_HierarchicalNamespace{} mi := &file_google_storage_v2_storage_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_HierarchicalNamespace) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_HierarchicalNamespace) ProtoMessage() {} func (x *Bucket_HierarchicalNamespace) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_HierarchicalNamespace.ProtoReflect.Descriptor instead. func (*Bucket_HierarchicalNamespace) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 12} } func (x *Bucket_HierarchicalNamespace) GetEnabled() bool { if x != nil { return x.Enabled } return false } // Settings for Uniform Bucket level access. // See https://cloud.google.com/storage/docs/uniform-bucket-level-access. type Bucket_IamConfig_UniformBucketLevelAccess struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // If set, access checks only use bucket-level IAM policies or above. Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` // The deadline time for changing // `iam_config.uniform_bucket_level_access.enabled` from `true` to // `false`. Mutable until the specified deadline is reached, but not // afterward. LockTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=lock_time,json=lockTime,proto3" json:"lock_time,omitempty"` } func (x *Bucket_IamConfig_UniformBucketLevelAccess) Reset() { *x = Bucket_IamConfig_UniformBucketLevelAccess{} mi := &file_google_storage_v2_storage_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_IamConfig_UniformBucketLevelAccess) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_IamConfig_UniformBucketLevelAccess) ProtoMessage() {} func (x *Bucket_IamConfig_UniformBucketLevelAccess) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_IamConfig_UniformBucketLevelAccess.ProtoReflect.Descriptor instead. func (*Bucket_IamConfig_UniformBucketLevelAccess) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 3, 0} } func (x *Bucket_IamConfig_UniformBucketLevelAccess) GetEnabled() bool { if x != nil { return x.Enabled } return false } func (x *Bucket_IamConfig_UniformBucketLevelAccess) GetLockTime() *timestamppb.Timestamp { if x != nil { return x.LockTime } return nil } // A lifecycle Rule, combining an action to take on an object and a // condition which will trigger that action. type Bucket_Lifecycle_Rule struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The action to take. Action *Bucket_Lifecycle_Rule_Action `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` // The condition(s) under which the action will be taken. Condition *Bucket_Lifecycle_Rule_Condition `protobuf:"bytes,2,opt,name=condition,proto3" json:"condition,omitempty"` } func (x *Bucket_Lifecycle_Rule) Reset() { *x = Bucket_Lifecycle_Rule{} mi := &file_google_storage_v2_storage_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Lifecycle_Rule) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Lifecycle_Rule) ProtoMessage() {} func (x *Bucket_Lifecycle_Rule) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Lifecycle_Rule.ProtoReflect.Descriptor instead. func (*Bucket_Lifecycle_Rule) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 4, 0} } func (x *Bucket_Lifecycle_Rule) GetAction() *Bucket_Lifecycle_Rule_Action { if x != nil { return x.Action } return nil } func (x *Bucket_Lifecycle_Rule) GetCondition() *Bucket_Lifecycle_Rule_Condition { if x != nil { return x.Condition } return nil } // An action to take on an object. type Bucket_Lifecycle_Rule_Action struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Type of the action. Currently, only `Delete`, `SetStorageClass`, and // `AbortIncompleteMultipartUpload` are supported. Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Target storage class. Required iff the type of the action is // SetStorageClass. StorageClass string `protobuf:"bytes,2,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` } func (x *Bucket_Lifecycle_Rule_Action) Reset() { *x = Bucket_Lifecycle_Rule_Action{} mi := &file_google_storage_v2_storage_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Lifecycle_Rule_Action) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Lifecycle_Rule_Action) ProtoMessage() {} func (x *Bucket_Lifecycle_Rule_Action) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Lifecycle_Rule_Action.ProtoReflect.Descriptor instead. func (*Bucket_Lifecycle_Rule_Action) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 4, 0, 0} } func (x *Bucket_Lifecycle_Rule_Action) GetType() string { if x != nil { return x.Type } return "" } func (x *Bucket_Lifecycle_Rule_Action) GetStorageClass() string { if x != nil { return x.StorageClass } return "" } // A condition of an object which triggers some action. type Bucket_Lifecycle_Rule_Condition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Age of an object (in days). This condition is satisfied when an // object reaches the specified age. // A value of 0 indicates that all objects immediately match this // condition. AgeDays *int32 `protobuf:"varint,1,opt,name=age_days,json=ageDays,proto3,oneof" json:"age_days,omitempty"` // This condition is satisfied when an object is created before midnight // of the specified date in UTC. CreatedBefore *date.Date `protobuf:"bytes,2,opt,name=created_before,json=createdBefore,proto3" json:"created_before,omitempty"` // Relevant only for versioned objects. If the value is // `true`, this condition matches live objects; if the value // is `false`, it matches archived objects. IsLive *bool `protobuf:"varint,3,opt,name=is_live,json=isLive,proto3,oneof" json:"is_live,omitempty"` // Relevant only for versioned objects. If the value is N, this // condition is satisfied when there are at least N versions (including // the live version) newer than this version of the object. NumNewerVersions *int32 `protobuf:"varint,4,opt,name=num_newer_versions,json=numNewerVersions,proto3,oneof" json:"num_newer_versions,omitempty"` // Objects having any of the storage classes specified by this condition // will be matched. Values include `MULTI_REGIONAL`, `REGIONAL`, // `NEARLINE`, `COLDLINE`, `STANDARD`, and // `DURABLE_REDUCED_AVAILABILITY`. MatchesStorageClass []string `protobuf:"bytes,5,rep,name=matches_storage_class,json=matchesStorageClass,proto3" json:"matches_storage_class,omitempty"` // Number of days that have elapsed since the custom timestamp set on an // object. // The value of the field must be a nonnegative integer. DaysSinceCustomTime *int32 `protobuf:"varint,7,opt,name=days_since_custom_time,json=daysSinceCustomTime,proto3,oneof" json:"days_since_custom_time,omitempty"` // An object matches this condition if the custom timestamp set on the // object is before the specified date in UTC. CustomTimeBefore *date.Date `protobuf:"bytes,8,opt,name=custom_time_before,json=customTimeBefore,proto3" json:"custom_time_before,omitempty"` // This condition is relevant only for versioned objects. An object // version satisfies this condition only if these many days have been // passed since it became noncurrent. The value of the field must be a // nonnegative integer. If it's zero, the object version will become // eligible for Lifecycle action as soon as it becomes noncurrent. DaysSinceNoncurrentTime *int32 `protobuf:"varint,9,opt,name=days_since_noncurrent_time,json=daysSinceNoncurrentTime,proto3,oneof" json:"days_since_noncurrent_time,omitempty"` // This condition is relevant only for versioned objects. An object // version satisfies this condition only if it became noncurrent before // the specified date in UTC. NoncurrentTimeBefore *date.Date `protobuf:"bytes,10,opt,name=noncurrent_time_before,json=noncurrentTimeBefore,proto3" json:"noncurrent_time_before,omitempty"` // List of object name prefixes. If any prefix exactly matches the // beginning of the object name, the condition evaluates to true. MatchesPrefix []string `protobuf:"bytes,11,rep,name=matches_prefix,json=matchesPrefix,proto3" json:"matches_prefix,omitempty"` // List of object name suffixes. If any suffix exactly matches the // end of the object name, the condition evaluates to true. MatchesSuffix []string `protobuf:"bytes,12,rep,name=matches_suffix,json=matchesSuffix,proto3" json:"matches_suffix,omitempty"` } func (x *Bucket_Lifecycle_Rule_Condition) Reset() { *x = Bucket_Lifecycle_Rule_Condition{} mi := &file_google_storage_v2_storage_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Bucket_Lifecycle_Rule_Condition) String() string { return protoimpl.X.MessageStringOf(x) } func (*Bucket_Lifecycle_Rule_Condition) ProtoMessage() {} func (x *Bucket_Lifecycle_Rule_Condition) ProtoReflect() protoreflect.Message { mi := &file_google_storage_v2_storage_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Bucket_Lifecycle_Rule_Condition.ProtoReflect.Descriptor instead. func (*Bucket_Lifecycle_Rule_Condition) Descriptor() ([]byte, []int) { return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{43, 4, 0, 1} } func (x *Bucket_Lifecycle_Rule_Condition) GetAgeDays() int32 { if x != nil && x.AgeDays != nil { return *x.AgeDays } return 0 } func (x *Bucket_Lifecycle_Rule_Condition) GetCreatedBefore() *date.Date { if x != nil { return x.CreatedBefore } return nil } func (x *Bucket_Lifecycle_Rule_Condition) GetIsLive() bool { if x != nil && x.IsLive != nil { return *x.IsLive } return false } func (x *Bucket_Lifecycle_Rule_Condition) GetNumNewerVersions() int32 { if x != nil && x.NumNewerVersions != nil { return *x.NumNewerVersions } return 0 } func (x *Bucket_Lifecycle_Rule_Condition) GetMatchesStorageClass() []string { if x != nil { return x.MatchesStorageClass } return nil } func (x *Bucket_Lifecycle_Rule_Condition) GetDaysSinceCustomTime() int32 { if x != nil && x.DaysSinceCustomTime != nil { return *x.DaysSinceCustomTime } return 0 } func (x *Bucket_Lifecycle_Rule_Condition) GetCustomTimeBefore() *date.Date { if x != nil { return x.CustomTimeBefore } return nil } func (x *Bucket_Lifecycle_Rule_Condition) GetDaysSinceNoncurrentTime() int32 { if x != nil && x.DaysSinceNoncurrentTime != nil { return *x.DaysSinceNoncurrentTime } return 0 } func (x *Bucket_Lifecycle_Rule_Condition) GetNoncurrentTimeBefore() *date.Date { if x != nil { return x.NoncurrentTimeBefore } return nil } func (x *Bucket_Lifecycle_Rule_Condition) GetMatchesPrefix() []string { if x != nil { return x.MatchesPrefix } return nil } func (x *Bucket_Lifecycle_Rule_Condition) GetMatchesSuffix() []string { if x != nil { return x.MatchesSuffix } return nil } var File_google_storage_v2_storage_proto protoreflect.FileDescriptor var file_google_storage_v2_storage_proto_rawDesc = []byte{ 0x0a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8d, 0x02, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xd6, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0x93, 0x02, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x12, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x41, 0x0a, 0x1d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x22, 0xf3, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x12, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0x72, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x20, 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb6, 0x03, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x41, 0x0a, 0x1d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xc3, 0x07, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x07, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x1a, 0xa8, 0x02, 0x0a, 0x0c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7b, 0x0a, 0x14, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x62, 0x0a, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xe2, 0x04, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xd3, 0x05, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x63, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6c, 0x22, 0x3f, 0x0a, 0x1b, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xec, 0x05, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x04, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0x8e, 0x06, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x05, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xaf, 0x02, 0x0a, 0x12, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc6, 0x06, 0x0a, 0x12, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x02, 0x18, 0x01, 0x48, 0x04, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x16, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x1d, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xed, 0x01, 0x0a, 0x1e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x01, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x13, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x55, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x75, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x22, 0xba, 0x01, 0x0a, 0x0f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x6e, 0x64, 0x22, 0x2d, 0x0a, 0x0e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2e, 0x0a, 0x0f, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0xc0, 0x04, 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xf8, 0x03, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x50, 0x0a, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x01, 0x0a, 0x13, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xe9, 0x03, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x03, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x8a, 0x05, 0x0a, 0x16, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x50, 0x0a, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x53, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x10, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe8, 0x01, 0x0a, 0x17, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x01, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0xe3, 0x04, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x41, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x47, 0x6c, 0x6f, 0x62, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xaa, 0x01, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb5, 0x0e, 0x0a, 0x14, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x56, 0x0a, 0x13, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3c, 0x0a, 0x1a, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x17, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, 0x1a, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x06, 0x52, 0x1b, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x22, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x48, 0x07, 0x52, 0x1e, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x1c, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x50, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x47, 0x0a, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x46, 0x0a, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x1c, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x27, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x22, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xd6, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xec, 0x07, 0x0a, 0x11, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x32, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x45, 0x0a, 0x1a, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x17, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x01, 0x52, 0x1a, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x02, 0x52, 0x1b, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x22, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x03, 0x52, 0x1e, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x04, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x05, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x06, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x07, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xaf, 0x02, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x22, 0x3a, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x87, 0x05, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xbf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xca, 0x05, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x22, 0xb5, 0x05, 0x0a, 0x06, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x14, 0x4d, 0x41, 0x58, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x80, 0x80, 0x01, 0x12, 0x1c, 0x0a, 0x15, 0x4d, 0x41, 0x58, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x80, 0x80, 0x01, 0x12, 0x19, 0x0a, 0x12, 0x4d, 0x41, 0x58, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4d, 0x42, 0x10, 0x80, 0x80, 0xc0, 0x02, 0x12, 0x29, 0x0a, 0x24, 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x08, 0x12, 0x2a, 0x0a, 0x25, 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x20, 0x12, 0x29, 0x0a, 0x24, 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x40, 0x12, 0x2a, 0x0a, 0x24, 0x4d, 0x41, 0x58, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0xa0, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x64, 0x12, 0x22, 0x0a, 0x1e, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x49, 0x46, 0x45, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x64, 0x12, 0x26, 0x0a, 0x22, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x53, 0x10, 0x05, 0x12, 0x31, 0x0a, 0x2c, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x80, 0x02, 0x12, 0x33, 0x0a, 0x2e, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x80, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x53, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x49, 0x45, 0x53, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x40, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x53, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x3f, 0x12, 0x1f, 0x0a, 0x1a, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x53, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x01, 0x12, 0x2e, 0x0a, 0x29, 0x4d, 0x41, 0x58, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x44, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0xe8, 0x07, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44, 0x41, 0x59, 0x53, 0x10, 0x0e, 0x1a, 0x02, 0x10, 0x01, 0x22, 0x86, 0x24, 0x0a, 0x06, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x70, 0x6f, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x70, 0x6f, 0x12, 0x38, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x54, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x41, 0x0a, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x6f, 0x72, 0x73, 0x52, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x48, 0x6f, 0x6c, 0x64, 0x12, 0x3d, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x54, 0x0a, 0x10, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x42, 0x0a, 0x0a, 0x69, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x09, 0x69, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73, 0x5f, 0x70, 0x7a, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73, 0x50, 0x7a, 0x73, 0x12, 0x67, 0x0a, 0x17, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x6b, 0x0a, 0x16, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5d, 0x0a, 0x12, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x30, 0x0a, 0x07, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x50, 0x61, 0x79, 0x73, 0x1a, 0x87, 0x01, 0x0a, 0x04, 0x43, 0x6f, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x1a, 0x5c, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x1a, 0xb1, 0x02, 0x0a, 0x09, 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x7b, 0x0a, 0x1b, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x18, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x6d, 0x0a, 0x18, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0xdb, 0x07, 0x0a, 0x09, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x1a, 0x8f, 0x07, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x41, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x1a, 0xa8, 0x05, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, 0x61, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x69, 0x73, 0x4c, 0x69, 0x76, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x4e, 0x65, 0x77, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x13, 0x64, 0x61, 0x79, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x1a, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x17, 0x64, 0x61, 0x79, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x16, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x14, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x54, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x67, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0xbb, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x41, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x12, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xd3, 0x01, 0x0a, 0x10, 0x53, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x26, 0x0a, 0x0a, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x59, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x67, 0x65, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x3e, 0x0a, 0x15, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xd6, 0x02, 0x0a, 0x09, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0b, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x16, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x70, 0x0a, 0x22, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x01, 0x52, 0x1e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x36, 0x0a, 0x15, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x58, 0xea, 0x41, 0x55, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x23, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x7d, 0x2a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x32, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x97, 0x02, 0x0a, 0x13, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x61, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x6c, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x22, 0x5a, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x05, 0xe0, 0x41, 0x01, 0x08, 0x01, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x22, 0x54, 0x0a, 0x0f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x64, 0x35, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x64, 0x35, 0x48, 0x61, 0x73, 0x68, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x22, 0x71, 0x0a, 0x12, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x28, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xbd, 0x0e, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x23, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x38, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x5a, 0x0a, 0x19, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x48, 0x6f, 0x6c, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x0a, 0x10, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x48, 0x6f, 0x6c, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x02, 0x52, 0x0e, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x10, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x03, 0x52, 0x0e, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x97, 0x02, 0x0a, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x61, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x6c, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x22, 0x8e, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x48, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x3c, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0x5f, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x32, 0xc1, 0x1e, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x72, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x6f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x22, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x58, 0xda, 0x41, 0x17, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x1e, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x93, 0x01, 0x0a, 0x19, 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x26, 0xda, 0x41, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x75, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x2a, 0xda, 0x41, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x7c, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x31, 0xda, 0x41, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x96, 0x02, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xaa, 0x01, 0xda, 0x41, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x8c, 0x01, 0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x34, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2a, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x12, 0x8a, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x37, 0xda, 0x41, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x7e, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x29, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x8d, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x38, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0xda, 0x41, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xa5, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x30, 0x01, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x0a, 0x17, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x28, 0x01, 0x30, 0x01, 0x12, 0x8c, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x39, 0xda, 0x41, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x0a, 0x0d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x60, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6e, 0x0a, 0x0f, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x0f, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x12, 0x30, 0x0a, 0x21, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0xda, 0x41, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0x96, 0x01, 0x0a, 0x0a, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x47, 0xda, 0x41, 0x27, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x1a, 0xa7, 0x02, 0xca, 0x41, 0x16, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x8a, 0x02, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0xe2, 0x01, 0xea, 0x41, 0x78, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x12, 0x53, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x52, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x7d, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x42, 0x0c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x70, 0x62, 0x3b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_google_storage_v2_storage_proto_rawDescOnce sync.Once file_google_storage_v2_storage_proto_rawDescData = file_google_storage_v2_storage_proto_rawDesc ) func file_google_storage_v2_storage_proto_rawDescGZIP() []byte { file_google_storage_v2_storage_proto_rawDescOnce.Do(func() { file_google_storage_v2_storage_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_storage_v2_storage_proto_rawDescData) }) return file_google_storage_v2_storage_proto_rawDescData } var file_google_storage_v2_storage_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_google_storage_v2_storage_proto_msgTypes = make([]protoimpl.MessageInfo, 75) var file_google_storage_v2_storage_proto_goTypes = []any{ (ServiceConstants_Values)(0), // 0: google.storage.v2.ServiceConstants.Values (*DeleteBucketRequest)(nil), // 1: google.storage.v2.DeleteBucketRequest (*GetBucketRequest)(nil), // 2: google.storage.v2.GetBucketRequest (*CreateBucketRequest)(nil), // 3: google.storage.v2.CreateBucketRequest (*ListBucketsRequest)(nil), // 4: google.storage.v2.ListBucketsRequest (*ListBucketsResponse)(nil), // 5: google.storage.v2.ListBucketsResponse (*LockBucketRetentionPolicyRequest)(nil), // 6: google.storage.v2.LockBucketRetentionPolicyRequest (*UpdateBucketRequest)(nil), // 7: google.storage.v2.UpdateBucketRequest (*ComposeObjectRequest)(nil), // 8: google.storage.v2.ComposeObjectRequest (*DeleteObjectRequest)(nil), // 9: google.storage.v2.DeleteObjectRequest (*RestoreObjectRequest)(nil), // 10: google.storage.v2.RestoreObjectRequest (*CancelResumableWriteRequest)(nil), // 11: google.storage.v2.CancelResumableWriteRequest (*CancelResumableWriteResponse)(nil), // 12: google.storage.v2.CancelResumableWriteResponse (*ReadObjectRequest)(nil), // 13: google.storage.v2.ReadObjectRequest (*GetObjectRequest)(nil), // 14: google.storage.v2.GetObjectRequest (*ReadObjectResponse)(nil), // 15: google.storage.v2.ReadObjectResponse (*BidiReadObjectSpec)(nil), // 16: google.storage.v2.BidiReadObjectSpec (*BidiReadObjectRequest)(nil), // 17: google.storage.v2.BidiReadObjectRequest (*BidiReadObjectResponse)(nil), // 18: google.storage.v2.BidiReadObjectResponse (*BidiReadObjectRedirectedError)(nil), // 19: google.storage.v2.BidiReadObjectRedirectedError (*BidiWriteObjectRedirectedError)(nil), // 20: google.storage.v2.BidiWriteObjectRedirectedError (*BidiReadObjectError)(nil), // 21: google.storage.v2.BidiReadObjectError (*ReadRangeError)(nil), // 22: google.storage.v2.ReadRangeError (*ReadRange)(nil), // 23: google.storage.v2.ReadRange (*ObjectRangeData)(nil), // 24: google.storage.v2.ObjectRangeData (*BidiReadHandle)(nil), // 25: google.storage.v2.BidiReadHandle (*BidiWriteHandle)(nil), // 26: google.storage.v2.BidiWriteHandle (*WriteObjectSpec)(nil), // 27: google.storage.v2.WriteObjectSpec (*WriteObjectRequest)(nil), // 28: google.storage.v2.WriteObjectRequest (*WriteObjectResponse)(nil), // 29: google.storage.v2.WriteObjectResponse (*AppendObjectSpec)(nil), // 30: google.storage.v2.AppendObjectSpec (*BidiWriteObjectRequest)(nil), // 31: google.storage.v2.BidiWriteObjectRequest (*BidiWriteObjectResponse)(nil), // 32: google.storage.v2.BidiWriteObjectResponse (*ListObjectsRequest)(nil), // 33: google.storage.v2.ListObjectsRequest (*QueryWriteStatusRequest)(nil), // 34: google.storage.v2.QueryWriteStatusRequest (*QueryWriteStatusResponse)(nil), // 35: google.storage.v2.QueryWriteStatusResponse (*RewriteObjectRequest)(nil), // 36: google.storage.v2.RewriteObjectRequest (*RewriteResponse)(nil), // 37: google.storage.v2.RewriteResponse (*MoveObjectRequest)(nil), // 38: google.storage.v2.MoveObjectRequest (*StartResumableWriteRequest)(nil), // 39: google.storage.v2.StartResumableWriteRequest (*StartResumableWriteResponse)(nil), // 40: google.storage.v2.StartResumableWriteResponse (*UpdateObjectRequest)(nil), // 41: google.storage.v2.UpdateObjectRequest (*CommonObjectRequestParams)(nil), // 42: google.storage.v2.CommonObjectRequestParams (*ServiceConstants)(nil), // 43: google.storage.v2.ServiceConstants (*Bucket)(nil), // 44: google.storage.v2.Bucket (*BucketAccessControl)(nil), // 45: google.storage.v2.BucketAccessControl (*ChecksummedData)(nil), // 46: google.storage.v2.ChecksummedData (*ObjectChecksums)(nil), // 47: google.storage.v2.ObjectChecksums (*CustomerEncryption)(nil), // 48: google.storage.v2.CustomerEncryption (*Object)(nil), // 49: google.storage.v2.Object (*ObjectAccessControl)(nil), // 50: google.storage.v2.ObjectAccessControl (*ListObjectsResponse)(nil), // 51: google.storage.v2.ListObjectsResponse (*ProjectTeam)(nil), // 52: google.storage.v2.ProjectTeam (*Owner)(nil), // 53: google.storage.v2.Owner (*ContentRange)(nil), // 54: google.storage.v2.ContentRange (*ComposeObjectRequest_SourceObject)(nil), // 55: google.storage.v2.ComposeObjectRequest.SourceObject (*ComposeObjectRequest_SourceObject_ObjectPreconditions)(nil), // 56: google.storage.v2.ComposeObjectRequest.SourceObject.ObjectPreconditions (*Bucket_Billing)(nil), // 57: google.storage.v2.Bucket.Billing (*Bucket_Cors)(nil), // 58: google.storage.v2.Bucket.Cors (*Bucket_Encryption)(nil), // 59: google.storage.v2.Bucket.Encryption (*Bucket_IamConfig)(nil), // 60: google.storage.v2.Bucket.IamConfig (*Bucket_Lifecycle)(nil), // 61: google.storage.v2.Bucket.Lifecycle (*Bucket_Logging)(nil), // 62: google.storage.v2.Bucket.Logging (*Bucket_RetentionPolicy)(nil), // 63: google.storage.v2.Bucket.RetentionPolicy (*Bucket_SoftDeletePolicy)(nil), // 64: google.storage.v2.Bucket.SoftDeletePolicy (*Bucket_Versioning)(nil), // 65: google.storage.v2.Bucket.Versioning (*Bucket_Website)(nil), // 66: google.storage.v2.Bucket.Website (*Bucket_CustomPlacementConfig)(nil), // 67: google.storage.v2.Bucket.CustomPlacementConfig (*Bucket_Autoclass)(nil), // 68: google.storage.v2.Bucket.Autoclass (*Bucket_HierarchicalNamespace)(nil), // 69: google.storage.v2.Bucket.HierarchicalNamespace nil, // 70: google.storage.v2.Bucket.LabelsEntry (*Bucket_IamConfig_UniformBucketLevelAccess)(nil), // 71: google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccess (*Bucket_Lifecycle_Rule)(nil), // 72: google.storage.v2.Bucket.Lifecycle.Rule (*Bucket_Lifecycle_Rule_Action)(nil), // 73: google.storage.v2.Bucket.Lifecycle.Rule.Action (*Bucket_Lifecycle_Rule_Condition)(nil), // 74: google.storage.v2.Bucket.Lifecycle.Rule.Condition nil, // 75: google.storage.v2.Object.MetadataEntry (*fieldmaskpb.FieldMask)(nil), // 76: google.protobuf.FieldMask (*status.Status)(nil), // 77: google.rpc.Status (*timestamppb.Timestamp)(nil), // 78: google.protobuf.Timestamp (*durationpb.Duration)(nil), // 79: google.protobuf.Duration (*date.Date)(nil), // 80: google.type.Date (*iampb.GetIamPolicyRequest)(nil), // 81: google.iam.v1.GetIamPolicyRequest (*iampb.SetIamPolicyRequest)(nil), // 82: google.iam.v1.SetIamPolicyRequest (*iampb.TestIamPermissionsRequest)(nil), // 83: google.iam.v1.TestIamPermissionsRequest (*emptypb.Empty)(nil), // 84: google.protobuf.Empty (*iampb.Policy)(nil), // 85: google.iam.v1.Policy (*iampb.TestIamPermissionsResponse)(nil), // 86: google.iam.v1.TestIamPermissionsResponse } var file_google_storage_v2_storage_proto_depIdxs = []int32{ 76, // 0: google.storage.v2.GetBucketRequest.read_mask:type_name -> google.protobuf.FieldMask 44, // 1: google.storage.v2.CreateBucketRequest.bucket:type_name -> google.storage.v2.Bucket 76, // 2: google.storage.v2.ListBucketsRequest.read_mask:type_name -> google.protobuf.FieldMask 44, // 3: google.storage.v2.ListBucketsResponse.buckets:type_name -> google.storage.v2.Bucket 44, // 4: google.storage.v2.UpdateBucketRequest.bucket:type_name -> google.storage.v2.Bucket 76, // 5: google.storage.v2.UpdateBucketRequest.update_mask:type_name -> google.protobuf.FieldMask 49, // 6: google.storage.v2.ComposeObjectRequest.destination:type_name -> google.storage.v2.Object 55, // 7: google.storage.v2.ComposeObjectRequest.source_objects:type_name -> google.storage.v2.ComposeObjectRequest.SourceObject 42, // 8: google.storage.v2.ComposeObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 47, // 9: google.storage.v2.ComposeObjectRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums 42, // 10: google.storage.v2.DeleteObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 42, // 11: google.storage.v2.RestoreObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 42, // 12: google.storage.v2.ReadObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 76, // 13: google.storage.v2.ReadObjectRequest.read_mask:type_name -> google.protobuf.FieldMask 42, // 14: google.storage.v2.GetObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 76, // 15: google.storage.v2.GetObjectRequest.read_mask:type_name -> google.protobuf.FieldMask 46, // 16: google.storage.v2.ReadObjectResponse.checksummed_data:type_name -> google.storage.v2.ChecksummedData 47, // 17: google.storage.v2.ReadObjectResponse.object_checksums:type_name -> google.storage.v2.ObjectChecksums 54, // 18: google.storage.v2.ReadObjectResponse.content_range:type_name -> google.storage.v2.ContentRange 49, // 19: google.storage.v2.ReadObjectResponse.metadata:type_name -> google.storage.v2.Object 42, // 20: google.storage.v2.BidiReadObjectSpec.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 76, // 21: google.storage.v2.BidiReadObjectSpec.read_mask:type_name -> google.protobuf.FieldMask 25, // 22: google.storage.v2.BidiReadObjectSpec.read_handle:type_name -> google.storage.v2.BidiReadHandle 16, // 23: google.storage.v2.BidiReadObjectRequest.read_object_spec:type_name -> google.storage.v2.BidiReadObjectSpec 23, // 24: google.storage.v2.BidiReadObjectRequest.read_ranges:type_name -> google.storage.v2.ReadRange 24, // 25: google.storage.v2.BidiReadObjectResponse.object_data_ranges:type_name -> google.storage.v2.ObjectRangeData 49, // 26: google.storage.v2.BidiReadObjectResponse.metadata:type_name -> google.storage.v2.Object 25, // 27: google.storage.v2.BidiReadObjectResponse.read_handle:type_name -> google.storage.v2.BidiReadHandle 25, // 28: google.storage.v2.BidiReadObjectRedirectedError.read_handle:type_name -> google.storage.v2.BidiReadHandle 26, // 29: google.storage.v2.BidiWriteObjectRedirectedError.write_handle:type_name -> google.storage.v2.BidiWriteHandle 22, // 30: google.storage.v2.BidiReadObjectError.read_range_errors:type_name -> google.storage.v2.ReadRangeError 77, // 31: google.storage.v2.ReadRangeError.status:type_name -> google.rpc.Status 46, // 32: google.storage.v2.ObjectRangeData.checksummed_data:type_name -> google.storage.v2.ChecksummedData 23, // 33: google.storage.v2.ObjectRangeData.read_range:type_name -> google.storage.v2.ReadRange 49, // 34: google.storage.v2.WriteObjectSpec.resource:type_name -> google.storage.v2.Object 27, // 35: google.storage.v2.WriteObjectRequest.write_object_spec:type_name -> google.storage.v2.WriteObjectSpec 46, // 36: google.storage.v2.WriteObjectRequest.checksummed_data:type_name -> google.storage.v2.ChecksummedData 47, // 37: google.storage.v2.WriteObjectRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums 42, // 38: google.storage.v2.WriteObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 49, // 39: google.storage.v2.WriteObjectResponse.resource:type_name -> google.storage.v2.Object 26, // 40: google.storage.v2.AppendObjectSpec.write_handle:type_name -> google.storage.v2.BidiWriteHandle 27, // 41: google.storage.v2.BidiWriteObjectRequest.write_object_spec:type_name -> google.storage.v2.WriteObjectSpec 30, // 42: google.storage.v2.BidiWriteObjectRequest.append_object_spec:type_name -> google.storage.v2.AppendObjectSpec 46, // 43: google.storage.v2.BidiWriteObjectRequest.checksummed_data:type_name -> google.storage.v2.ChecksummedData 47, // 44: google.storage.v2.BidiWriteObjectRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums 42, // 45: google.storage.v2.BidiWriteObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 49, // 46: google.storage.v2.BidiWriteObjectResponse.resource:type_name -> google.storage.v2.Object 26, // 47: google.storage.v2.BidiWriteObjectResponse.write_handle:type_name -> google.storage.v2.BidiWriteHandle 76, // 48: google.storage.v2.ListObjectsRequest.read_mask:type_name -> google.protobuf.FieldMask 42, // 49: google.storage.v2.QueryWriteStatusRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 49, // 50: google.storage.v2.QueryWriteStatusResponse.resource:type_name -> google.storage.v2.Object 49, // 51: google.storage.v2.RewriteObjectRequest.destination:type_name -> google.storage.v2.Object 42, // 52: google.storage.v2.RewriteObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 47, // 53: google.storage.v2.RewriteObjectRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums 49, // 54: google.storage.v2.RewriteResponse.resource:type_name -> google.storage.v2.Object 27, // 55: google.storage.v2.StartResumableWriteRequest.write_object_spec:type_name -> google.storage.v2.WriteObjectSpec 42, // 56: google.storage.v2.StartResumableWriteRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 47, // 57: google.storage.v2.StartResumableWriteRequest.object_checksums:type_name -> google.storage.v2.ObjectChecksums 49, // 58: google.storage.v2.UpdateObjectRequest.object:type_name -> google.storage.v2.Object 76, // 59: google.storage.v2.UpdateObjectRequest.update_mask:type_name -> google.protobuf.FieldMask 42, // 60: google.storage.v2.UpdateObjectRequest.common_object_request_params:type_name -> google.storage.v2.CommonObjectRequestParams 45, // 61: google.storage.v2.Bucket.acl:type_name -> google.storage.v2.BucketAccessControl 50, // 62: google.storage.v2.Bucket.default_object_acl:type_name -> google.storage.v2.ObjectAccessControl 61, // 63: google.storage.v2.Bucket.lifecycle:type_name -> google.storage.v2.Bucket.Lifecycle 78, // 64: google.storage.v2.Bucket.create_time:type_name -> google.protobuf.Timestamp 58, // 65: google.storage.v2.Bucket.cors:type_name -> google.storage.v2.Bucket.Cors 78, // 66: google.storage.v2.Bucket.update_time:type_name -> google.protobuf.Timestamp 70, // 67: google.storage.v2.Bucket.labels:type_name -> google.storage.v2.Bucket.LabelsEntry 66, // 68: google.storage.v2.Bucket.website:type_name -> google.storage.v2.Bucket.Website 65, // 69: google.storage.v2.Bucket.versioning:type_name -> google.storage.v2.Bucket.Versioning 62, // 70: google.storage.v2.Bucket.logging:type_name -> google.storage.v2.Bucket.Logging 53, // 71: google.storage.v2.Bucket.owner:type_name -> google.storage.v2.Owner 59, // 72: google.storage.v2.Bucket.encryption:type_name -> google.storage.v2.Bucket.Encryption 57, // 73: google.storage.v2.Bucket.billing:type_name -> google.storage.v2.Bucket.Billing 63, // 74: google.storage.v2.Bucket.retention_policy:type_name -> google.storage.v2.Bucket.RetentionPolicy 60, // 75: google.storage.v2.Bucket.iam_config:type_name -> google.storage.v2.Bucket.IamConfig 67, // 76: google.storage.v2.Bucket.custom_placement_config:type_name -> google.storage.v2.Bucket.CustomPlacementConfig 68, // 77: google.storage.v2.Bucket.autoclass:type_name -> google.storage.v2.Bucket.Autoclass 69, // 78: google.storage.v2.Bucket.hierarchical_namespace:type_name -> google.storage.v2.Bucket.HierarchicalNamespace 64, // 79: google.storage.v2.Bucket.soft_delete_policy:type_name -> google.storage.v2.Bucket.SoftDeletePolicy 52, // 80: google.storage.v2.BucketAccessControl.project_team:type_name -> google.storage.v2.ProjectTeam 50, // 81: google.storage.v2.Object.acl:type_name -> google.storage.v2.ObjectAccessControl 78, // 82: google.storage.v2.Object.delete_time:type_name -> google.protobuf.Timestamp 78, // 83: google.storage.v2.Object.finalize_time:type_name -> google.protobuf.Timestamp 78, // 84: google.storage.v2.Object.create_time:type_name -> google.protobuf.Timestamp 47, // 85: google.storage.v2.Object.checksums:type_name -> google.storage.v2.ObjectChecksums 78, // 86: google.storage.v2.Object.update_time:type_name -> google.protobuf.Timestamp 78, // 87: google.storage.v2.Object.update_storage_class_time:type_name -> google.protobuf.Timestamp 78, // 88: google.storage.v2.Object.retention_expire_time:type_name -> google.protobuf.Timestamp 75, // 89: google.storage.v2.Object.metadata:type_name -> google.storage.v2.Object.MetadataEntry 53, // 90: google.storage.v2.Object.owner:type_name -> google.storage.v2.Owner 48, // 91: google.storage.v2.Object.customer_encryption:type_name -> google.storage.v2.CustomerEncryption 78, // 92: google.storage.v2.Object.custom_time:type_name -> google.protobuf.Timestamp 78, // 93: google.storage.v2.Object.soft_delete_time:type_name -> google.protobuf.Timestamp 78, // 94: google.storage.v2.Object.hard_delete_time:type_name -> google.protobuf.Timestamp 52, // 95: google.storage.v2.ObjectAccessControl.project_team:type_name -> google.storage.v2.ProjectTeam 49, // 96: google.storage.v2.ListObjectsResponse.objects:type_name -> google.storage.v2.Object 56, // 97: google.storage.v2.ComposeObjectRequest.SourceObject.object_preconditions:type_name -> google.storage.v2.ComposeObjectRequest.SourceObject.ObjectPreconditions 71, // 98: google.storage.v2.Bucket.IamConfig.uniform_bucket_level_access:type_name -> google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccess 72, // 99: google.storage.v2.Bucket.Lifecycle.rule:type_name -> google.storage.v2.Bucket.Lifecycle.Rule 78, // 100: google.storage.v2.Bucket.RetentionPolicy.effective_time:type_name -> google.protobuf.Timestamp 79, // 101: google.storage.v2.Bucket.RetentionPolicy.retention_duration:type_name -> google.protobuf.Duration 79, // 102: google.storage.v2.Bucket.SoftDeletePolicy.retention_duration:type_name -> google.protobuf.Duration 78, // 103: google.storage.v2.Bucket.SoftDeletePolicy.effective_time:type_name -> google.protobuf.Timestamp 78, // 104: google.storage.v2.Bucket.Autoclass.toggle_time:type_name -> google.protobuf.Timestamp 78, // 105: google.storage.v2.Bucket.Autoclass.terminal_storage_class_update_time:type_name -> google.protobuf.Timestamp 78, // 106: google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccess.lock_time:type_name -> google.protobuf.Timestamp 73, // 107: google.storage.v2.Bucket.Lifecycle.Rule.action:type_name -> google.storage.v2.Bucket.Lifecycle.Rule.Action 74, // 108: google.storage.v2.Bucket.Lifecycle.Rule.condition:type_name -> google.storage.v2.Bucket.Lifecycle.Rule.Condition 80, // 109: google.storage.v2.Bucket.Lifecycle.Rule.Condition.created_before:type_name -> google.type.Date 80, // 110: google.storage.v2.Bucket.Lifecycle.Rule.Condition.custom_time_before:type_name -> google.type.Date 80, // 111: google.storage.v2.Bucket.Lifecycle.Rule.Condition.noncurrent_time_before:type_name -> google.type.Date 1, // 112: google.storage.v2.Storage.DeleteBucket:input_type -> google.storage.v2.DeleteBucketRequest 2, // 113: google.storage.v2.Storage.GetBucket:input_type -> google.storage.v2.GetBucketRequest 3, // 114: google.storage.v2.Storage.CreateBucket:input_type -> google.storage.v2.CreateBucketRequest 4, // 115: google.storage.v2.Storage.ListBuckets:input_type -> google.storage.v2.ListBucketsRequest 6, // 116: google.storage.v2.Storage.LockBucketRetentionPolicy:input_type -> google.storage.v2.LockBucketRetentionPolicyRequest 81, // 117: google.storage.v2.Storage.GetIamPolicy:input_type -> google.iam.v1.GetIamPolicyRequest 82, // 118: google.storage.v2.Storage.SetIamPolicy:input_type -> google.iam.v1.SetIamPolicyRequest 83, // 119: google.storage.v2.Storage.TestIamPermissions:input_type -> google.iam.v1.TestIamPermissionsRequest 7, // 120: google.storage.v2.Storage.UpdateBucket:input_type -> google.storage.v2.UpdateBucketRequest 8, // 121: google.storage.v2.Storage.ComposeObject:input_type -> google.storage.v2.ComposeObjectRequest 9, // 122: google.storage.v2.Storage.DeleteObject:input_type -> google.storage.v2.DeleteObjectRequest 10, // 123: google.storage.v2.Storage.RestoreObject:input_type -> google.storage.v2.RestoreObjectRequest 11, // 124: google.storage.v2.Storage.CancelResumableWrite:input_type -> google.storage.v2.CancelResumableWriteRequest 14, // 125: google.storage.v2.Storage.GetObject:input_type -> google.storage.v2.GetObjectRequest 13, // 126: google.storage.v2.Storage.ReadObject:input_type -> google.storage.v2.ReadObjectRequest 17, // 127: google.storage.v2.Storage.BidiReadObject:input_type -> google.storage.v2.BidiReadObjectRequest 41, // 128: google.storage.v2.Storage.UpdateObject:input_type -> google.storage.v2.UpdateObjectRequest 28, // 129: google.storage.v2.Storage.WriteObject:input_type -> google.storage.v2.WriteObjectRequest 31, // 130: google.storage.v2.Storage.BidiWriteObject:input_type -> google.storage.v2.BidiWriteObjectRequest 33, // 131: google.storage.v2.Storage.ListObjects:input_type -> google.storage.v2.ListObjectsRequest 36, // 132: google.storage.v2.Storage.RewriteObject:input_type -> google.storage.v2.RewriteObjectRequest 39, // 133: google.storage.v2.Storage.StartResumableWrite:input_type -> google.storage.v2.StartResumableWriteRequest 34, // 134: google.storage.v2.Storage.QueryWriteStatus:input_type -> google.storage.v2.QueryWriteStatusRequest 38, // 135: google.storage.v2.Storage.MoveObject:input_type -> google.storage.v2.MoveObjectRequest 84, // 136: google.storage.v2.Storage.DeleteBucket:output_type -> google.protobuf.Empty 44, // 137: google.storage.v2.Storage.GetBucket:output_type -> google.storage.v2.Bucket 44, // 138: google.storage.v2.Storage.CreateBucket:output_type -> google.storage.v2.Bucket 5, // 139: google.storage.v2.Storage.ListBuckets:output_type -> google.storage.v2.ListBucketsResponse 44, // 140: google.storage.v2.Storage.LockBucketRetentionPolicy:output_type -> google.storage.v2.Bucket 85, // 141: google.storage.v2.Storage.GetIamPolicy:output_type -> google.iam.v1.Policy 85, // 142: google.storage.v2.Storage.SetIamPolicy:output_type -> google.iam.v1.Policy 86, // 143: google.storage.v2.Storage.TestIamPermissions:output_type -> google.iam.v1.TestIamPermissionsResponse 44, // 144: google.storage.v2.Storage.UpdateBucket:output_type -> google.storage.v2.Bucket 49, // 145: google.storage.v2.Storage.ComposeObject:output_type -> google.storage.v2.Object 84, // 146: google.storage.v2.Storage.DeleteObject:output_type -> google.protobuf.Empty 49, // 147: google.storage.v2.Storage.RestoreObject:output_type -> google.storage.v2.Object 12, // 148: google.storage.v2.Storage.CancelResumableWrite:output_type -> google.storage.v2.CancelResumableWriteResponse 49, // 149: google.storage.v2.Storage.GetObject:output_type -> google.storage.v2.Object 15, // 150: google.storage.v2.Storage.ReadObject:output_type -> google.storage.v2.ReadObjectResponse 18, // 151: google.storage.v2.Storage.BidiReadObject:output_type -> google.storage.v2.BidiReadObjectResponse 49, // 152: google.storage.v2.Storage.UpdateObject:output_type -> google.storage.v2.Object 29, // 153: google.storage.v2.Storage.WriteObject:output_type -> google.storage.v2.WriteObjectResponse 32, // 154: google.storage.v2.Storage.BidiWriteObject:output_type -> google.storage.v2.BidiWriteObjectResponse 51, // 155: google.storage.v2.Storage.ListObjects:output_type -> google.storage.v2.ListObjectsResponse 37, // 156: google.storage.v2.Storage.RewriteObject:output_type -> google.storage.v2.RewriteResponse 40, // 157: google.storage.v2.Storage.StartResumableWrite:output_type -> google.storage.v2.StartResumableWriteResponse 35, // 158: google.storage.v2.Storage.QueryWriteStatus:output_type -> google.storage.v2.QueryWriteStatusResponse 49, // 159: google.storage.v2.Storage.MoveObject:output_type -> google.storage.v2.Object 136, // [136:160] is the sub-list for method output_type 112, // [112:136] is the sub-list for method input_type 112, // [112:112] is the sub-list for extension type_name 112, // [112:112] is the sub-list for extension extendee 0, // [0:112] is the sub-list for field type_name } func init() { file_google_storage_v2_storage_proto_init() } func file_google_storage_v2_storage_proto_init() { if File_google_storage_v2_storage_proto != nil { return } file_google_storage_v2_storage_proto_msgTypes[0].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[1].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[3].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[6].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[7].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[8].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[9].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[12].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[13].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[15].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[18].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[19].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[26].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[27].OneofWrappers = []any{ (*WriteObjectRequest_UploadId)(nil), (*WriteObjectRequest_WriteObjectSpec)(nil), (*WriteObjectRequest_ChecksummedData)(nil), } file_google_storage_v2_storage_proto_msgTypes[28].OneofWrappers = []any{ (*WriteObjectResponse_PersistedSize)(nil), (*WriteObjectResponse_Resource)(nil), } file_google_storage_v2_storage_proto_msgTypes[29].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[30].OneofWrappers = []any{ (*BidiWriteObjectRequest_UploadId)(nil), (*BidiWriteObjectRequest_WriteObjectSpec)(nil), (*BidiWriteObjectRequest_AppendObjectSpec)(nil), (*BidiWriteObjectRequest_ChecksummedData)(nil), } file_google_storage_v2_storage_proto_msgTypes[31].OneofWrappers = []any{ (*BidiWriteObjectResponse_PersistedSize)(nil), (*BidiWriteObjectResponse_Resource)(nil), } file_google_storage_v2_storage_proto_msgTypes[32].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[34].OneofWrappers = []any{ (*QueryWriteStatusResponse_PersistedSize)(nil), (*QueryWriteStatusResponse_Resource)(nil), } file_google_storage_v2_storage_proto_msgTypes[35].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[37].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[40].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[45].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[46].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[48].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[55].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[63].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[67].OneofWrappers = []any{} file_google_storage_v2_storage_proto_msgTypes[73].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_storage_v2_storage_proto_rawDesc, NumEnums: 1, NumMessages: 75, NumExtensions: 0, NumServices: 1, }, GoTypes: file_google_storage_v2_storage_proto_goTypes, DependencyIndexes: file_google_storage_v2_storage_proto_depIdxs, EnumInfos: file_google_storage_v2_storage_proto_enumTypes, MessageInfos: file_google_storage_v2_storage_proto_msgTypes, }.Build() File_google_storage_v2_storage_proto = out.File file_google_storage_v2_storage_proto_rawDesc = nil file_google_storage_v2_storage_proto_goTypes = nil file_google_storage_v2_storage_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 // StorageClient is the client API for Storage service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type StorageClient interface { // Permanently deletes an empty bucket. DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Returns metadata for the specified bucket. GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) // Creates a new bucket. CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) // Retrieves a list of buckets for a given project. ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) // Locks retention policy on a bucket. LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) // Gets the IAM policy for a specified bucket. // The `resource` field in the request should be // `projects/_/buckets/{bucket}`. GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) // Updates an IAM policy for the specified bucket. // The `resource` field in the request should be // `projects/_/buckets/{bucket}`. SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) // Tests a set of permissions on the given bucket, object, or managed folder // to see which, if any, are held by the caller. // The `resource` field in the request should be // `projects/_/buckets/{bucket}` for a bucket, // `projects/_/buckets/{bucket}/objects/{object}` for an object, or // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` // for a managed folder. TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) // Updates a bucket. Equivalent to JSON API's storage.buckets.patch method. UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) // Concatenates a list of existing objects into a new object in the same // bucket. ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) // Deletes an object and its metadata. Deletions are permanent if versioning // is not enabled for the bucket, or if the generation parameter is used, or // if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not // enabled for the bucket. // When this API is used to delete an object from a bucket that has soft // delete policy enabled, the object becomes soft deleted, and the // `softDeleteTime` and `hardDeleteTime` properties are set on the object. // This API cannot be used to permanently delete soft-deleted objects. // Soft-deleted objects are permanently deleted according to their // `hardDeleteTime`. // // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject] // API to restore soft-deleted objects until the soft delete retention period // has passed. // // **IAM Permissions**: // // Requires `storage.objects.delete` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Restores a soft-deleted object. RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) // Cancels an in-progress resumable upload. // // Any attempts to write to the resumable upload after cancelling the upload // will fail. // // The behavior for currently in progress write operations is not guaranteed - // they could either complete before the cancellation or fail if the // cancellation completes first. CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) // Retrieves object metadata. // // **IAM Permissions**: // // Requires `storage.objects.get` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. To return object ACLs, the authenticated user must also have // the `storage.objects.getIamPolicy` permission. GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) // Retrieves object data. // // **IAM Permissions**: // // Requires `storage.objects.get` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) // Reads an object's data. // // This is a bi-directional API with the added support for reading multiple // ranges within one stream both within and across multiple messages. // If the server encountered an error for any of the inputs, the stream will // be closed with the relevant error code. // Because the API allows for multiple outstanding requests, when the stream // is closed the error response will contain a BidiReadObjectRangesError proto // in the error extension describing the error for each outstanding read_id. // // **IAM Permissions**: // // Requires `storage.objects.get` // // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. // // This API is currently in preview and is not yet available for general // use. BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) // Updates an object's metadata. // Equivalent to JSON API's storage.objects.patch. UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) // Stores a new object and metadata. // // An object can be written either in a single message stream or in a // resumable sequence of message streams. To write using a single stream, // the client should include in the first message of the stream an // `WriteObjectSpec` describing the destination bucket, object, and any // preconditions. Additionally, the final message must set 'finish_write' to // true, or else it is an error. // // For a resumable write, the client should instead call // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request. // They should then attach the returned `upload_id` to the first message of // each following call to `WriteObject`. If the stream is closed before // finishing the upload (either explicitly by the client or due to a network // error or an error response from the server), the client should do as // follows: // - Check the result Status of the stream, to determine if writing can be // resumed on this stream or must be restarted from scratch (by calling // `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED, // INTERNAL, and UNAVAILABLE. For each case, the client should use binary // exponential backoff before retrying. Additionally, writes can be // resumed after RESOURCE_EXHAUSTED errors, but only after taking // appropriate measures, which may include reducing aggregate send rate // across clients and/or requesting a quota increase for your project. // - If the call to `WriteObject` returns `ABORTED`, that indicates // concurrent attempts to update the resumable write, caused either by // multiple racing clients or by a single client where the previous // request was timed out on the client side but nonetheless reached the // server. In this case the client should take steps to prevent further // concurrent writes (e.g., increase the timeouts, stop using more than // one process to perform the upload, etc.), and then should follow the // steps below for resuming the upload. // - For resumable errors, the client should call `QueryWriteStatus()` and // then continue writing from the returned `persisted_size`. This may be // less than the amount of data the client previously sent. Note also that // it is acceptable to send data starting at an offset earlier than the // returned `persisted_size`; in this case, the service will skip data at // offsets that were already persisted (without checking that it matches // the previously written data), and write only the data starting from the // persisted offset. Even though the data isn't written, it may still // incur a performance cost over resuming at the correct write offset. // This behavior can make client-side handling simpler in some cases. // - Clients must only send data that is a multiple of 256 KiB per message, // unless the object is being finished with `finish_write` set to `true`. // // The service will not view the object as complete until the client has // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any // requests on a stream after sending a request with `finish_write` set to // `true` will cause an error. The client **should** check the response it // receives to determine how much data the service was able to commit and // whether the service views the object as complete. // // Attempting to resume an already finalized object will result in an OK // status, with a `WriteObjectResponse` containing the finalized object's // metadata. // // Alternatively, the BidiWriteObject operation may be used to write an // object with controls over flushing and the ability to fetch the ability to // determine the current persisted size. // // **IAM Permissions**: // // Requires `storage.objects.create` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) // Stores a new object and metadata. // // This is similar to the WriteObject call with the added support for // manual flushing of persisted state, and the ability to determine current // persisted size without closing the stream. // // The client may specify one or both of the `state_lookup` and `flush` fields // in each BidiWriteObjectRequest. If `flush` is specified, the data written // so far will be persisted to storage. If `state_lookup` is specified, the // service will respond with a BidiWriteObjectResponse that contains the // persisted size. If both `flush` and `state_lookup` are specified, the flush // will always occur before a `state_lookup`, so that both may be set in the // same request and the returned state will be the state of the object // post-flush. When the stream is closed, a BidiWriteObjectResponse will // always be sent to the client, regardless of the value of `state_lookup`. BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) // Retrieves a list of objects matching the criteria. // // **IAM Permissions**: // // The authenticated user requires `storage.objects.list` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) // to use this method. To return object ACLs, the authenticated user must also // have the `storage.objects.getIamPolicy` permission. ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) // Rewrites a source object to a destination object. Optionally overrides // metadata. RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) // Starts a resumable write operation. This // method is part of the [Resumable // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. // This allows you to upload large objects in multiple chunks, which is more // resilient to network interruptions than a single upload. The validity // duration of the write operation, and the consequences of it becoming // invalid, are service-dependent. // // **IAM Permissions**: // // Requires `storage.objects.create` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) // Determines the `persisted_size` of an object that is being written. This // method is part of the [resumable // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. // The returned value is the size of the object that has been persisted so // far. The value can be used as the `write_offset` for the next `Write()` // call. // // If the object does not exist, meaning if it was deleted, or the // first `Write()` has not yet reached the service, this method returns the // error `NOT_FOUND`. // // This method is useful for clients that buffer data and need to know which // data can be safely evicted. The client can call `QueryWriteStatus()` at any // time to determine how much data has been logged for this object. // For any sequence of `QueryWriteStatus()` calls for a given // object name, the sequence of returned `persisted_size` values are // non-decreasing. QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) // Moves the source object to the destination object in the same bucket. MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) } type storageClient struct { cc grpc.ClientConnInterface } func NewStorageClient(cc grpc.ClientConnInterface) StorageClient { return &storageClient{cc} } func (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/CreateBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) { out := new(ListBucketsResponse) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ListBuckets", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/LockBucketRetentionPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) { out := new(iampb.Policy) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetIamPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) { out := new(iampb.Policy) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/SetIamPolicy", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) { out := new(iampb.TestIamPermissionsResponse) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/TestIamPermissions", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) { out := new(Bucket) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/UpdateBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ComposeObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/RestoreObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) { out := new(CancelResumableWriteResponse) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/CancelResumableWrite", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) { stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[0], "/google.storage.v2.Storage/ReadObject", opts...) if err != nil { return nil, err } x := &storageReadObjectClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } if err := x.ClientStream.CloseSend(); err != nil { return nil, err } return x, nil } type Storage_ReadObjectClient interface { Recv() (*ReadObjectResponse, error) grpc.ClientStream } type storageReadObjectClient struct { grpc.ClientStream } func (x *storageReadObjectClient) Recv() (*ReadObjectResponse, error) { m := new(ReadObjectResponse) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func (c *storageClient) BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) { stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[1], "/google.storage.v2.Storage/BidiReadObject", opts...) if err != nil { return nil, err } x := &storageBidiReadObjectClient{stream} return x, nil } type Storage_BidiReadObjectClient interface { Send(*BidiReadObjectRequest) error Recv() (*BidiReadObjectResponse, error) grpc.ClientStream } type storageBidiReadObjectClient struct { grpc.ClientStream } func (x *storageBidiReadObjectClient) Send(m *BidiReadObjectRequest) error { return x.ClientStream.SendMsg(m) } func (x *storageBidiReadObjectClient) Recv() (*BidiReadObjectResponse, error) { m := new(BidiReadObjectResponse) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func (c *storageClient) UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/UpdateObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) { stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[2], "/google.storage.v2.Storage/WriteObject", opts...) if err != nil { return nil, err } x := &storageWriteObjectClient{stream} return x, nil } type Storage_WriteObjectClient interface { Send(*WriteObjectRequest) error CloseAndRecv() (*WriteObjectResponse, error) grpc.ClientStream } type storageWriteObjectClient struct { grpc.ClientStream } func (x *storageWriteObjectClient) Send(m *WriteObjectRequest) error { return x.ClientStream.SendMsg(m) } func (x *storageWriteObjectClient) CloseAndRecv() (*WriteObjectResponse, error) { if err := x.ClientStream.CloseSend(); err != nil { return nil, err } m := new(WriteObjectResponse) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func (c *storageClient) BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) { stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[3], "/google.storage.v2.Storage/BidiWriteObject", opts...) if err != nil { return nil, err } x := &storageBidiWriteObjectClient{stream} return x, nil } type Storage_BidiWriteObjectClient interface { Send(*BidiWriteObjectRequest) error Recv() (*BidiWriteObjectResponse, error) grpc.ClientStream } type storageBidiWriteObjectClient struct { grpc.ClientStream } func (x *storageBidiWriteObjectClient) Send(m *BidiWriteObjectRequest) error { return x.ClientStream.SendMsg(m) } func (x *storageBidiWriteObjectClient) Recv() (*BidiWriteObjectResponse, error) { m := new(BidiWriteObjectResponse) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func (c *storageClient) ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) { out := new(ListObjectsResponse) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ListObjects", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) { out := new(RewriteResponse) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/RewriteObject", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) { out := new(StartResumableWriteResponse) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/StartResumableWrite", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) { out := new(QueryWriteStatusResponse) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/QueryWriteStatus", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *storageClient) MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) { out := new(Object) err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/MoveObject", in, out, opts...) if err != nil { return nil, err } return out, nil } // StorageServer is the server API for Storage service. type StorageServer interface { // Permanently deletes an empty bucket. DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) // Returns metadata for the specified bucket. GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) // Creates a new bucket. CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) // Retrieves a list of buckets for a given project. ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) // Locks retention policy on a bucket. LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) // Gets the IAM policy for a specified bucket. // The `resource` field in the request should be // `projects/_/buckets/{bucket}`. GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) // Updates an IAM policy for the specified bucket. // The `resource` field in the request should be // `projects/_/buckets/{bucket}`. SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) // Tests a set of permissions on the given bucket, object, or managed folder // to see which, if any, are held by the caller. // The `resource` field in the request should be // `projects/_/buckets/{bucket}` for a bucket, // `projects/_/buckets/{bucket}/objects/{object}` for an object, or // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}` // for a managed folder. TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) // Updates a bucket. Equivalent to JSON API's storage.buckets.patch method. UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) // Concatenates a list of existing objects into a new object in the same // bucket. ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) // Deletes an object and its metadata. Deletions are permanent if versioning // is not enabled for the bucket, or if the generation parameter is used, or // if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not // enabled for the bucket. // When this API is used to delete an object from a bucket that has soft // delete policy enabled, the object becomes soft deleted, and the // `softDeleteTime` and `hardDeleteTime` properties are set on the object. // This API cannot be used to permanently delete soft-deleted objects. // Soft-deleted objects are permanently deleted according to their // `hardDeleteTime`. // // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject] // API to restore soft-deleted objects until the soft delete retention period // has passed. // // **IAM Permissions**: // // Requires `storage.objects.delete` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) // Restores a soft-deleted object. RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) // Cancels an in-progress resumable upload. // // Any attempts to write to the resumable upload after cancelling the upload // will fail. // // The behavior for currently in progress write operations is not guaranteed - // they could either complete before the cancellation or fail if the // cancellation completes first. CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) // Retrieves object metadata. // // **IAM Permissions**: // // Requires `storage.objects.get` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. To return object ACLs, the authenticated user must also have // the `storage.objects.getIamPolicy` permission. GetObject(context.Context, *GetObjectRequest) (*Object, error) // Retrieves object data. // // **IAM Permissions**: // // Requires `storage.objects.get` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error // Reads an object's data. // // This is a bi-directional API with the added support for reading multiple // ranges within one stream both within and across multiple messages. // If the server encountered an error for any of the inputs, the stream will // be closed with the relevant error code. // Because the API allows for multiple outstanding requests, when the stream // is closed the error response will contain a BidiReadObjectRangesError proto // in the error extension describing the error for each outstanding read_id. // // **IAM Permissions**: // // Requires `storage.objects.get` // // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. // // This API is currently in preview and is not yet available for general // use. BidiReadObject(Storage_BidiReadObjectServer) error // Updates an object's metadata. // Equivalent to JSON API's storage.objects.patch. UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) // Stores a new object and metadata. // // An object can be written either in a single message stream or in a // resumable sequence of message streams. To write using a single stream, // the client should include in the first message of the stream an // `WriteObjectSpec` describing the destination bucket, object, and any // preconditions. Additionally, the final message must set 'finish_write' to // true, or else it is an error. // // For a resumable write, the client should instead call // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request. // They should then attach the returned `upload_id` to the first message of // each following call to `WriteObject`. If the stream is closed before // finishing the upload (either explicitly by the client or due to a network // error or an error response from the server), the client should do as // follows: // - Check the result Status of the stream, to determine if writing can be // resumed on this stream or must be restarted from scratch (by calling // `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED, // INTERNAL, and UNAVAILABLE. For each case, the client should use binary // exponential backoff before retrying. Additionally, writes can be // resumed after RESOURCE_EXHAUSTED errors, but only after taking // appropriate measures, which may include reducing aggregate send rate // across clients and/or requesting a quota increase for your project. // - If the call to `WriteObject` returns `ABORTED`, that indicates // concurrent attempts to update the resumable write, caused either by // multiple racing clients or by a single client where the previous // request was timed out on the client side but nonetheless reached the // server. In this case the client should take steps to prevent further // concurrent writes (e.g., increase the timeouts, stop using more than // one process to perform the upload, etc.), and then should follow the // steps below for resuming the upload. // - For resumable errors, the client should call `QueryWriteStatus()` and // then continue writing from the returned `persisted_size`. This may be // less than the amount of data the client previously sent. Note also that // it is acceptable to send data starting at an offset earlier than the // returned `persisted_size`; in this case, the service will skip data at // offsets that were already persisted (without checking that it matches // the previously written data), and write only the data starting from the // persisted offset. Even though the data isn't written, it may still // incur a performance cost over resuming at the correct write offset. // This behavior can make client-side handling simpler in some cases. // - Clients must only send data that is a multiple of 256 KiB per message, // unless the object is being finished with `finish_write` set to `true`. // // The service will not view the object as complete until the client has // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any // requests on a stream after sending a request with `finish_write` set to // `true` will cause an error. The client **should** check the response it // receives to determine how much data the service was able to commit and // whether the service views the object as complete. // // Attempting to resume an already finalized object will result in an OK // status, with a `WriteObjectResponse` containing the finalized object's // metadata. // // Alternatively, the BidiWriteObject operation may be used to write an // object with controls over flushing and the ability to fetch the ability to // determine the current persisted size. // // **IAM Permissions**: // // Requires `storage.objects.create` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. WriteObject(Storage_WriteObjectServer) error // Stores a new object and metadata. // // This is similar to the WriteObject call with the added support for // manual flushing of persisted state, and the ability to determine current // persisted size without closing the stream. // // The client may specify one or both of the `state_lookup` and `flush` fields // in each BidiWriteObjectRequest. If `flush` is specified, the data written // so far will be persisted to storage. If `state_lookup` is specified, the // service will respond with a BidiWriteObjectResponse that contains the // persisted size. If both `flush` and `state_lookup` are specified, the flush // will always occur before a `state_lookup`, so that both may be set in the // same request and the returned state will be the state of the object // post-flush. When the stream is closed, a BidiWriteObjectResponse will // always be sent to the client, regardless of the value of `state_lookup`. BidiWriteObject(Storage_BidiWriteObjectServer) error // Retrieves a list of objects matching the criteria. // // **IAM Permissions**: // // The authenticated user requires `storage.objects.list` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) // to use this method. To return object ACLs, the authenticated user must also // have the `storage.objects.getIamPolicy` permission. ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) // Rewrites a source object to a destination object. Optionally overrides // metadata. RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) // Starts a resumable write operation. This // method is part of the [Resumable // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. // This allows you to upload large objects in multiple chunks, which is more // resilient to network interruptions than a single upload. The validity // duration of the write operation, and the consequences of it becoming // invalid, are service-dependent. // // **IAM Permissions**: // // Requires `storage.objects.create` // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on // the bucket. StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) // Determines the `persisted_size` of an object that is being written. This // method is part of the [resumable // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature. // The returned value is the size of the object that has been persisted so // far. The value can be used as the `write_offset` for the next `Write()` // call. // // If the object does not exist, meaning if it was deleted, or the // first `Write()` has not yet reached the service, this method returns the // error `NOT_FOUND`. // // This method is useful for clients that buffer data and need to know which // data can be safely evicted. The client can call `QueryWriteStatus()` at any // time to determine how much data has been logged for this object. // For any sequence of `QueryWriteStatus()` calls for a given // object name, the sequence of returned `persisted_size` values are // non-decreasing. QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) // Moves the source object to the destination object in the same bucket. MoveObject(context.Context, *MoveObjectRequest) (*Object, error) } // UnimplementedStorageServer can be embedded to have forward compatible implementations. type UnimplementedStorageServer struct { } func (*UnimplementedStorageServer) DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) { return nil, status1.Errorf(codes.Unimplemented, "method DeleteBucket not implemented") } func (*UnimplementedStorageServer) GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) { return nil, status1.Errorf(codes.Unimplemented, "method GetBucket not implemented") } func (*UnimplementedStorageServer) CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) { return nil, status1.Errorf(codes.Unimplemented, "method CreateBucket not implemented") } func (*UnimplementedStorageServer) ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method ListBuckets not implemented") } func (*UnimplementedStorageServer) LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) { return nil, status1.Errorf(codes.Unimplemented, "method LockBucketRetentionPolicy not implemented") } func (*UnimplementedStorageServer) GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) { return nil, status1.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented") } func (*UnimplementedStorageServer) SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) { return nil, status1.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented") } func (*UnimplementedStorageServer) TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented") } func (*UnimplementedStorageServer) UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) { return nil, status1.Errorf(codes.Unimplemented, "method UpdateBucket not implemented") } func (*UnimplementedStorageServer) ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) { return nil, status1.Errorf(codes.Unimplemented, "method ComposeObject not implemented") } func (*UnimplementedStorageServer) DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) { return nil, status1.Errorf(codes.Unimplemented, "method DeleteObject not implemented") } func (*UnimplementedStorageServer) RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) { return nil, status1.Errorf(codes.Unimplemented, "method RestoreObject not implemented") } func (*UnimplementedStorageServer) CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method CancelResumableWrite not implemented") } func (*UnimplementedStorageServer) GetObject(context.Context, *GetObjectRequest) (*Object, error) { return nil, status1.Errorf(codes.Unimplemented, "method GetObject not implemented") } func (*UnimplementedStorageServer) ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error { return status1.Errorf(codes.Unimplemented, "method ReadObject not implemented") } func (*UnimplementedStorageServer) BidiReadObject(Storage_BidiReadObjectServer) error { return status1.Errorf(codes.Unimplemented, "method BidiReadObject not implemented") } func (*UnimplementedStorageServer) UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) { return nil, status1.Errorf(codes.Unimplemented, "method UpdateObject not implemented") } func (*UnimplementedStorageServer) WriteObject(Storage_WriteObjectServer) error { return status1.Errorf(codes.Unimplemented, "method WriteObject not implemented") } func (*UnimplementedStorageServer) BidiWriteObject(Storage_BidiWriteObjectServer) error { return status1.Errorf(codes.Unimplemented, "method BidiWriteObject not implemented") } func (*UnimplementedStorageServer) ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method ListObjects not implemented") } func (*UnimplementedStorageServer) RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method RewriteObject not implemented") } func (*UnimplementedStorageServer) StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method StartResumableWrite not implemented") } func (*UnimplementedStorageServer) QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method QueryWriteStatus not implemented") } func (*UnimplementedStorageServer) MoveObject(context.Context, *MoveObjectRequest) (*Object, error) { return nil, status1.Errorf(codes.Unimplemented, "method MoveObject not implemented") } func RegisterStorageServer(s *grpc.Server, srv StorageServer) { s.RegisterService(&_Storage_serviceDesc, srv) } func _Storage_DeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).DeleteBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/DeleteBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).DeleteBucket(ctx, req.(*DeleteBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/GetBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetBucket(ctx, req.(*GetBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_CreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).CreateBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/CreateBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).CreateBucket(ctx, req.(*CreateBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ListBuckets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListBucketsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ListBuckets(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/ListBuckets", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ListBuckets(ctx, req.(*ListBucketsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_LockBucketRetentionPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(LockBucketRetentionPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).LockBucketRetentionPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/LockBucketRetentionPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).LockBucketRetentionPolicy(ctx, req.(*LockBucketRetentionPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(iampb.GetIamPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/GetIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetIamPolicy(ctx, req.(*iampb.GetIamPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(iampb.SetIamPolicyRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).SetIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/SetIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).SetIamPolicy(ctx, req.(*iampb.SetIamPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(iampb.TestIamPermissionsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).TestIamPermissions(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/TestIamPermissions", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).TestIamPermissions(ctx, req.(*iampb.TestIamPermissionsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_UpdateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).UpdateBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/UpdateBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).UpdateBucket(ctx, req.(*UpdateBucketRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ComposeObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ComposeObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ComposeObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/ComposeObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ComposeObject(ctx, req.(*ComposeObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DeleteObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).DeleteObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/DeleteObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).DeleteObject(ctx, req.(*DeleteObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RestoreObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).RestoreObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/RestoreObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).RestoreObject(ctx, req.(*RestoreObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_CancelResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CancelResumableWriteRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).CancelResumableWrite(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/CancelResumableWrite", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).CancelResumableWrite(ctx, req.(*CancelResumableWriteRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_GetObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).GetObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/GetObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).GetObject(ctx, req.(*GetObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_ReadObject_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(ReadObjectRequest) if err := stream.RecvMsg(m); err != nil { return err } return srv.(StorageServer).ReadObject(m, &storageReadObjectServer{stream}) } type Storage_ReadObjectServer interface { Send(*ReadObjectResponse) error grpc.ServerStream } type storageReadObjectServer struct { grpc.ServerStream } func (x *storageReadObjectServer) Send(m *ReadObjectResponse) error { return x.ServerStream.SendMsg(m) } func _Storage_BidiReadObject_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(StorageServer).BidiReadObject(&storageBidiReadObjectServer{stream}) } type Storage_BidiReadObjectServer interface { Send(*BidiReadObjectResponse) error Recv() (*BidiReadObjectRequest, error) grpc.ServerStream } type storageBidiReadObjectServer struct { grpc.ServerStream } func (x *storageBidiReadObjectServer) Send(m *BidiReadObjectResponse) error { return x.ServerStream.SendMsg(m) } func (x *storageBidiReadObjectServer) Recv() (*BidiReadObjectRequest, error) { m := new(BidiReadObjectRequest) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func _Storage_UpdateObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).UpdateObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/UpdateObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).UpdateObject(ctx, req.(*UpdateObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_WriteObject_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(StorageServer).WriteObject(&storageWriteObjectServer{stream}) } type Storage_WriteObjectServer interface { SendAndClose(*WriteObjectResponse) error Recv() (*WriteObjectRequest, error) grpc.ServerStream } type storageWriteObjectServer struct { grpc.ServerStream } func (x *storageWriteObjectServer) SendAndClose(m *WriteObjectResponse) error { return x.ServerStream.SendMsg(m) } func (x *storageWriteObjectServer) Recv() (*WriteObjectRequest, error) { m := new(WriteObjectRequest) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func _Storage_BidiWriteObject_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(StorageServer).BidiWriteObject(&storageBidiWriteObjectServer{stream}) } type Storage_BidiWriteObjectServer interface { Send(*BidiWriteObjectResponse) error Recv() (*BidiWriteObjectRequest, error) grpc.ServerStream } type storageBidiWriteObjectServer struct { grpc.ServerStream } func (x *storageBidiWriteObjectServer) Send(m *BidiWriteObjectResponse) error { return x.ServerStream.SendMsg(m) } func (x *storageBidiWriteObjectServer) Recv() (*BidiWriteObjectRequest, error) { m := new(BidiWriteObjectRequest) if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func _Storage_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListObjectsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).ListObjects(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/ListObjects", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).ListObjects(ctx, req.(*ListObjectsRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_RewriteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RewriteObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).RewriteObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/RewriteObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).RewriteObject(ctx, req.(*RewriteObjectRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_StartResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(StartResumableWriteRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).StartResumableWrite(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/StartResumableWrite", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).StartResumableWrite(ctx, req.(*StartResumableWriteRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_QueryWriteStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryWriteStatusRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).QueryWriteStatus(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/QueryWriteStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).QueryWriteStatus(ctx, req.(*QueryWriteStatusRequest)) } return interceptor(ctx, in, info, handler) } func _Storage_MoveObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MoveObjectRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StorageServer).MoveObject(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/google.storage.v2.Storage/MoveObject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StorageServer).MoveObject(ctx, req.(*MoveObjectRequest)) } return interceptor(ctx, in, info, handler) } var _Storage_serviceDesc = grpc.ServiceDesc{ ServiceName: "google.storage.v2.Storage", HandlerType: (*StorageServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "DeleteBucket", Handler: _Storage_DeleteBucket_Handler, }, { MethodName: "GetBucket", Handler: _Storage_GetBucket_Handler, }, { MethodName: "CreateBucket", Handler: _Storage_CreateBucket_Handler, }, { MethodName: "ListBuckets", Handler: _Storage_ListBuckets_Handler, }, { MethodName: "LockBucketRetentionPolicy", Handler: _Storage_LockBucketRetentionPolicy_Handler, }, { MethodName: "GetIamPolicy", Handler: _Storage_GetIamPolicy_Handler, }, { MethodName: "SetIamPolicy", Handler: _Storage_SetIamPolicy_Handler, }, { MethodName: "TestIamPermissions", Handler: _Storage_TestIamPermissions_Handler, }, { MethodName: "UpdateBucket", Handler: _Storage_UpdateBucket_Handler, }, { MethodName: "ComposeObject", Handler: _Storage_ComposeObject_Handler, }, { MethodName: "DeleteObject", Handler: _Storage_DeleteObject_Handler, }, { MethodName: "RestoreObject", Handler: _Storage_RestoreObject_Handler, }, { MethodName: "CancelResumableWrite", Handler: _Storage_CancelResumableWrite_Handler, }, { MethodName: "GetObject", Handler: _Storage_GetObject_Handler, }, { MethodName: "UpdateObject", Handler: _Storage_UpdateObject_Handler, }, { MethodName: "ListObjects", Handler: _Storage_ListObjects_Handler, }, { MethodName: "RewriteObject", Handler: _Storage_RewriteObject_Handler, }, { MethodName: "StartResumableWrite", Handler: _Storage_StartResumableWrite_Handler, }, { MethodName: "QueryWriteStatus", Handler: _Storage_QueryWriteStatus_Handler, }, { MethodName: "MoveObject", Handler: _Storage_MoveObject_Handler, }, }, Streams: []grpc.StreamDesc{ { StreamName: "ReadObject", Handler: _Storage_ReadObject_Handler, ServerStreams: true, }, { StreamName: "BidiReadObject", Handler: _Storage_BidiReadObject_Handler, ServerStreams: true, ClientStreams: true, }, { StreamName: "WriteObject", Handler: _Storage_WriteObject_Handler, ClientStreams: true, }, { StreamName: "BidiWriteObject", Handler: _Storage_BidiWriteObject_Handler, ServerStreams: true, ClientStreams: true, }, }, Metadata: "google/storage/v2/storage.proto", } ================================================ FILE: vendor/cloud.google.com/go/storage/internal/apiv2/version.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Code generated by gapicgen. DO NOT EDIT. package storage import "cloud.google.com/go/storage/internal" func init() { versionClient = internal.Version } ================================================ FILE: vendor/cloud.google.com/go/storage/internal/experimental.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // All options in this package are experimental. package internal var ( // WithMetricInterval is a function which is implemented by storage package. // It sets how often to emit metrics when using NewPeriodicReader and must be // greater than 1 minute. WithMetricInterval any // func (*time.Duration) option.ClientOption // WithMetricExporter is a function which is implemented by storage package. // Set an alternate client-side metric Exporter to emit metrics through. WithMetricExporter any // func (*metric.Exporter) option.ClientOption // WithReadStallTimeout is a function which is implemented by storage package. // It takes ReadStallTimeoutConfig as inputs and returns a option.ClientOption. WithReadStallTimeout any // func (*ReadStallTimeoutConfig) option.ClientOption // WithGRPCBidiReads is a function which is implemented by the storage package. // It sets the gRPC client to use the BidiReadObject API for downloads. WithGRPCBidiReads any // func() option.ClientOption // WithZonalBucketAPIs is a function which is implemented by the storage package. // It sets the gRPC client to use the BidiReadObject API for downloads and // appendable object semantics by default for uploads. WithZonalBucketAPIs any // func() option.ClientOption ) ================================================ FILE: vendor/cloud.google.com/go/storage/internal/version.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal // Version is the current tagged release of the library. const Version = "1.54.0" ================================================ FILE: vendor/cloud.google.com/go/storage/invoke.go ================================================ // Copyright 2014 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "errors" "fmt" "io" "net" "net/url" "os" "strings" "sync" "time" "cloud.google.com/go/internal" "cloud.google.com/go/internal/version" sinternal "cloud.google.com/go/storage/internal" "github.com/google/uuid" gax "github.com/googleapis/gax-go/v2" "github.com/googleapis/gax-go/v2/callctx" "google.golang.org/api/googleapi" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) var defaultRetry *retryConfig = &retryConfig{} var xGoogDefaultHeader = fmt.Sprintf("gl-go/%s gccl/%s", version.Go(), sinternal.Version) const ( xGoogHeaderKey = "x-goog-api-client" idempotencyHeaderKey = "x-goog-gcs-idempotency-token" cookieHeaderKey = "cookie" directpathCookieHeaderKey = "x-directpath-tracing-cookie" ) var ( cookieHeader = sync.OnceValue(func() string { return os.Getenv("GOOGLE_SDK_GO_TRACING_COOKIE") }) ) func (r *retryConfig) runShouldRetry(err error) bool { if r == nil || r.shouldRetry == nil { return ShouldRetry(err) } return r.shouldRetry(err) } // run determines whether a retry is necessary based on the config and // idempotency information. It then calls the function with or without retries // as appropriate, using the configured settings. func run(ctx context.Context, call func(ctx context.Context) error, retry *retryConfig, isIdempotent bool) error { attempts := 1 invocationID := uuid.New().String() if retry == nil { retry = defaultRetry } if (retry.policy == RetryIdempotent && !isIdempotent) || retry.policy == RetryNever { ctxWithHeaders := setInvocationHeaders(ctx, invocationID, attempts) return call(ctxWithHeaders) } bo := gax.Backoff{} if retry.backoff != nil { bo.Multiplier = retry.backoff.Multiplier bo.Initial = retry.backoff.Initial bo.Max = retry.backoff.Max } var quitAfterTimer *time.Timer if retry.maxRetryDuration != 0 { quitAfterTimer = time.NewTimer(retry.maxRetryDuration) defer quitAfterTimer.Stop() } var lastErr error return internal.Retry(ctx, bo, func() (stop bool, err error) { if retry.maxRetryDuration != 0 { select { case <-quitAfterTimer.C: if lastErr == nil { return true, fmt.Errorf("storage: request not sent, choose a larger value for the retry deadline (currently set to %s)", retry.maxRetryDuration) } return true, fmt.Errorf("storage: retry deadline of %s reached after %v attempts; last error: %w", retry.maxRetryDuration, attempts, lastErr) default: } } ctxWithHeaders := setInvocationHeaders(ctx, invocationID, attempts) lastErr = call(ctxWithHeaders) if lastErr != nil && retry.maxAttempts != nil && attempts >= *retry.maxAttempts { return true, fmt.Errorf("storage: retry failed after %v attempts; last error: %w", *retry.maxAttempts, lastErr) } attempts++ retryable := retry.runShouldRetry(lastErr) // Explicitly check context cancellation so that we can distinguish between a // DEADLINE_EXCEEDED error from the server and a user-set context deadline. // Unfortunately gRPC will codes.DeadlineExceeded (which may be retryable if it's // sent by the server) in both cases. if ctxErr := ctx.Err(); errors.Is(ctxErr, context.Canceled) || errors.Is(ctxErr, context.DeadlineExceeded) { retryable = false } return !retryable, lastErr }) } // Sets invocation ID headers on the context which will be propagated as // headers in the call to the service (for both gRPC and HTTP). func setInvocationHeaders(ctx context.Context, invocationID string, attempts int) context.Context { invocationHeader := fmt.Sprintf("gccl-invocation-id/%v gccl-attempt-count/%v", invocationID, attempts) xGoogHeader := strings.Join([]string{invocationHeader, xGoogDefaultHeader}, " ") ctx = callctx.SetHeaders(ctx, xGoogHeaderKey, xGoogHeader) ctx = callctx.SetHeaders(ctx, idempotencyHeaderKey, invocationID) if c := cookieHeader(); c != "" { ctx = callctx.SetHeaders(ctx, cookieHeaderKey, c) ctx = callctx.SetHeaders(ctx, directpathCookieHeaderKey, c) } return ctx } // ShouldRetry returns true if an error is retryable, based on best practice // guidance from GCS. See // https://cloud.google.com/storage/docs/retry-strategy#go for more information // on what errors are considered retryable. // // If you would like to customize retryable errors, use the WithErrorFunc to // supply a RetryOption to your library calls. For example, to retry additional // errors, you can write a custom func that wraps ShouldRetry and also specifies // additional errors that should return true. func ShouldRetry(err error) bool { if err == nil { return false } if errors.Is(err, io.ErrUnexpectedEOF) { return true } if errors.Is(err, net.ErrClosed) { return true } switch e := err.(type) { case *googleapi.Error: // Retry on 408, 429, and 5xx, according to // https://cloud.google.com/storage/docs/exponential-backoff. return e.Code == 408 || e.Code == 429 || (e.Code >= 500 && e.Code < 600) case *net.OpError, *url.Error: // Retry socket-level errors ECONNREFUSED and ECONNRESET (from syscall). // Unfortunately the error type is unexported, so we resort to string // matching. retriable := []string{"connection refused", "connection reset", "broken pipe"} for _, s := range retriable { if strings.Contains(e.Error(), s) { return true } } // TODO: remove when https://github.com/golang/go/issues/53472 is resolved. // We don't want to retry io.EOF errors, since these can indicate normal // functioning terminations such as internally in the case of Reader and // externally in the case of iterator methods. However, the linked bug // requires us to retry EOFs that it causes. We can distinguish // EOFs caused by the bug because they are not wrapped correctly. if !errors.Is(err, io.EOF) && strings.Contains(err.Error(), "EOF") { return true } case *net.DNSError: if e.IsTemporary { return true } case interface{ Temporary() bool }: if e.Temporary() { return true } } // UNAVAILABLE, RESOURCE_EXHAUSTED, INTERNAL, and DEADLINE_EXCEEDED codes are all retryable for gRPC. if st, ok := status.FromError(err); ok { if code := st.Code(); code == codes.Unavailable || code == codes.ResourceExhausted || code == codes.Internal || code == codes.DeadlineExceeded { return true } } // Unwrap is only supported in go1.13.x+ if e, ok := err.(interface{ Unwrap() error }); ok { return ShouldRetry(e.Unwrap()) } return false } ================================================ FILE: vendor/cloud.google.com/go/storage/notifications.go ================================================ // Copyright 2017 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "errors" "fmt" "regexp" raw "google.golang.org/api/storage/v1" ) // A Notification describes how to send Cloud PubSub messages when certain // events occur in a bucket. type Notification struct { //The ID of the notification. ID string // The ID of the topic to which this subscription publishes. TopicID string // The ID of the project to which the topic belongs. TopicProjectID string // Only send notifications about listed event types. If empty, send notifications // for all event types. // See https://cloud.google.com/storage/docs/pubsub-notifications#events. EventTypes []string // If present, only apply this notification configuration to object names that // begin with this prefix. ObjectNamePrefix string // An optional list of additional attributes to attach to each Cloud PubSub // message published for this notification subscription. CustomAttributes map[string]string // The contents of the message payload. // See https://cloud.google.com/storage/docs/pubsub-notifications#payload. PayloadFormat string } // Values for Notification.PayloadFormat. const ( // Send no payload with notification messages. NoPayload = "NONE" // Send object metadata as JSON with notification messages. JSONPayload = "JSON_API_V1" ) // Values for Notification.EventTypes. const ( // Event that occurs when an object is successfully created. ObjectFinalizeEvent = "OBJECT_FINALIZE" // Event that occurs when the metadata of an existing object changes. ObjectMetadataUpdateEvent = "OBJECT_METADATA_UPDATE" // Event that occurs when an object is permanently deleted. ObjectDeleteEvent = "OBJECT_DELETE" // Event that occurs when the live version of an object becomes an // archived version. ObjectArchiveEvent = "OBJECT_ARCHIVE" ) func toNotification(rn *raw.Notification) *Notification { n := &Notification{ ID: rn.Id, EventTypes: rn.EventTypes, ObjectNamePrefix: rn.ObjectNamePrefix, CustomAttributes: rn.CustomAttributes, PayloadFormat: rn.PayloadFormat, } n.TopicProjectID, n.TopicID = parseNotificationTopic(rn.Topic) return n } var topicRE = regexp.MustCompile(`^//pubsub\.googleapis\.com/projects/([^/]+)/topics/([^/]+)`) // parseNotificationTopic extracts the project and topic IDs from from the full // resource name returned by the service. If the name is malformed, it returns // "?" for both IDs. func parseNotificationTopic(nt string) (projectID, topicID string) { matches := topicRE.FindStringSubmatch(nt) if matches == nil { return "?", "?" } return matches[1], matches[2] } func toRawNotification(n *Notification) *raw.Notification { return &raw.Notification{ Id: n.ID, Topic: fmt.Sprintf("//pubsub.googleapis.com/projects/%s/topics/%s", n.TopicProjectID, n.TopicID), EventTypes: n.EventTypes, ObjectNamePrefix: n.ObjectNamePrefix, CustomAttributes: n.CustomAttributes, PayloadFormat: string(n.PayloadFormat), } } // AddNotification adds a notification to b. You must set n's TopicProjectID, TopicID // and PayloadFormat, and must not set its ID. The other fields are all optional. The // returned Notification's ID can be used to refer to it. // Note: gRPC is not supported. func (b *BucketHandle) AddNotification(ctx context.Context, n *Notification) (ret *Notification, err error) { ctx, _ = startSpan(ctx, "Bucket.AddNotification") defer func() { endSpan(ctx, err) }() if n.ID != "" { return nil, errors.New("storage: AddNotification: ID must not be set") } if n.TopicProjectID == "" { return nil, errors.New("storage: AddNotification: missing TopicProjectID") } if n.TopicID == "" { return nil, errors.New("storage: AddNotification: missing TopicID") } opts := makeStorageOpts(false, b.retry, b.userProject) ret, err = b.c.tc.CreateNotification(ctx, b.name, n, opts...) return ret, err } // Notifications returns all the Notifications configured for this bucket, as a map // indexed by notification ID. // Note: gRPC is not supported. func (b *BucketHandle) Notifications(ctx context.Context) (n map[string]*Notification, err error) { ctx, _ = startSpan(ctx, "Bucket.Notifications") defer func() { endSpan(ctx, err) }() opts := makeStorageOpts(true, b.retry, b.userProject) n, err = b.c.tc.ListNotifications(ctx, b.name, opts...) return n, err } func notificationsToMap(rns []*raw.Notification) map[string]*Notification { m := map[string]*Notification{} for _, rn := range rns { m[rn.Id] = toNotification(rn) } return m } // DeleteNotification deletes the notification with the given ID. // Note: gRPC is not supported. func (b *BucketHandle) DeleteNotification(ctx context.Context, id string) (err error) { ctx, _ = startSpan(ctx, "Bucket.DeleteNotification") defer func() { endSpan(ctx, err) }() opts := makeStorageOpts(true, b.retry, b.userProject) return b.c.tc.DeleteNotification(ctx, b.name, id, opts...) } ================================================ FILE: vendor/cloud.google.com/go/storage/option.go ================================================ // Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "os" "strconv" "time" "cloud.google.com/go/storage/experimental" storageinternal "cloud.google.com/go/storage/internal" "go.opentelemetry.io/otel/sdk/metric" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" ) const ( dynamicReadReqIncreaseRateEnv = "DYNAMIC_READ_REQ_INCREASE_RATE" dynamicReadReqInitialTimeoutEnv = "DYNAMIC_READ_REQ_INITIAL_TIMEOUT" defaultDynamicReadReqIncreaseRate = 15.0 defaultDynamicReqdReqMaxTimeout = 1 * time.Hour defaultDynamicReadReqMinTimeout = 500 * time.Millisecond defaultTargetPercentile = 0.99 ) func init() { // initialize experimental options storageinternal.WithMetricExporter = withMetricExporter storageinternal.WithMetricInterval = withMetricInterval storageinternal.WithReadStallTimeout = withReadStallTimeout storageinternal.WithGRPCBidiReads = withGRPCBidiReads storageinternal.WithZonalBucketAPIs = withZonalBucketAPIs } // getDynamicReadReqIncreaseRateFromEnv returns the value set in the env variable. // It returns defaultDynamicReadReqIncreaseRate if env is not set or the set value is invalid. func getDynamicReadReqIncreaseRateFromEnv() float64 { increaseRate := os.Getenv(dynamicReadReqIncreaseRateEnv) if increaseRate == "" { return defaultDynamicReadReqIncreaseRate } val, err := strconv.ParseFloat(increaseRate, 64) if err != nil { return defaultDynamicReadReqIncreaseRate } return val } // getDynamicReadReqInitialTimeoutSecFromEnv returns the value set in the env variable. // It returns the passed defaultVal if env is not set or the set value is invalid. func getDynamicReadReqInitialTimeoutSecFromEnv(defaultVal time.Duration) time.Duration { initialTimeout := os.Getenv(dynamicReadReqInitialTimeoutEnv) if initialTimeout == "" { return defaultVal } val, err := time.ParseDuration(initialTimeout) if err != nil { return defaultVal } return val } // set through storageClientOptions. type storageConfig struct { useJSONforReads bool readAPIWasSet bool disableClientMetrics bool metricExporter *metric.Exporter metricInterval time.Duration manualReader *metric.ManualReader readStallTimeoutConfig *experimental.ReadStallTimeoutConfig grpcBidiReads bool grpcAppendableUploads bool } // newStorageConfig generates a new storageConfig with all the given // storageClientOptions applied. func newStorageConfig(opts ...option.ClientOption) storageConfig { var conf storageConfig for _, opt := range opts { if storageOpt, ok := opt.(storageClientOption); ok { storageOpt.ApplyStorageOpt(&conf) } } return conf } // A storageClientOption is an option for a Google Storage client. type storageClientOption interface { option.ClientOption ApplyStorageOpt(*storageConfig) } // WithJSONReads is an option that may be passed to [NewClient]. // It sets the client to use the Cloud Storage JSON API for object // reads. Currently, the default API used for reads is XML, but JSON will // become the default in a future release. // // Setting this option is required to use the GenerationNotMatch condition. We // also recommend using JSON reads to ensure consistency with other client // operations (all of which use JSON by default). // // Note that when this option is set, reads will return a zero date for // [ReaderObjectAttrs].LastModified and may return a different value for // [ReaderObjectAttrs].CacheControl. func WithJSONReads() option.ClientOption { return &withReadAPI{useJSON: true} } // WithXMLReads is an option that may be passed to [NewClient]. // It sets the client to use the Cloud Storage XML API for object reads. // // This is the current default, but the default will switch to JSON in a future // release. func WithXMLReads() option.ClientOption { return &withReadAPI{useJSON: false} } type withReadAPI struct { internaloption.EmbeddableAdapter useJSON bool } func (w *withReadAPI) ApplyStorageOpt(c *storageConfig) { c.useJSONforReads = w.useJSON c.readAPIWasSet = true } type withDisabledClientMetrics struct { internaloption.EmbeddableAdapter disabledClientMetrics bool } // WithDisabledClientMetrics is an option that may be passed to [NewClient]. // gRPC metrics are enabled by default in the GCS client and will export the // gRPC telemetry discussed in [gRFC/66] and [gRFC/78] to // [Google Cloud Monitoring]. The option is used to disable metrics. // Google Cloud Support can use this information to more quickly diagnose // problems related to GCS and gRPC. // Sending this data does not incur any billing charges, and requires minimal // CPU (a single RPC every few minutes) or memory (a few KiB to batch the // telemetry). // // The default is to enable client metrics. To opt-out of metrics collected use // this option. // // [gRFC/66]: https://github.com/grpc/proposal/blob/master/A66-otel-stats.md // [gRFC/78]: https://github.com/grpc/proposal/blob/master/A78-grpc-metrics-wrr-pf-xds.md // [Google Cloud Monitoring]: https://cloud.google.com/monitoring/docs func WithDisabledClientMetrics() option.ClientOption { return &withDisabledClientMetrics{disabledClientMetrics: true} } func (w *withDisabledClientMetrics) ApplyStorageOpt(c *storageConfig) { c.disableClientMetrics = w.disabledClientMetrics } type withMeterOptions struct { internaloption.EmbeddableAdapter // set sampling interval interval time.Duration } func withMetricInterval(interval time.Duration) option.ClientOption { return &withMeterOptions{interval: interval} } func (w *withMeterOptions) ApplyStorageOpt(c *storageConfig) { c.metricInterval = w.interval } type withMetricExporterConfig struct { internaloption.EmbeddableAdapter // exporter override metricExporter *metric.Exporter } func withMetricExporter(ex *metric.Exporter) option.ClientOption { return &withMetricExporterConfig{metricExporter: ex} } func (w *withMetricExporterConfig) ApplyStorageOpt(c *storageConfig) { c.metricExporter = w.metricExporter } type withTestMetricReaderConfig struct { internaloption.EmbeddableAdapter // reader override metricReader *metric.ManualReader } func withTestMetricReader(ex *metric.ManualReader) option.ClientOption { return &withTestMetricReaderConfig{metricReader: ex} } func (w *withTestMetricReaderConfig) ApplyStorageOpt(c *storageConfig) { c.manualReader = w.metricReader } // WithReadStallTimeout is an option that may be passed to [NewClient]. // It enables the client to retry the stalled read request, happens as part of // storage.Reader creation. As the name suggest, timeout is adjusted dynamically // based on past observed read-req latencies. // // This is only supported for the read operation and that too for http(XML) client. // Grpc read-operation will be supported soon. func withReadStallTimeout(rstc *experimental.ReadStallTimeoutConfig) option.ClientOption { // TODO (raj-prince): To keep separate dynamicDelay instance for different BucketHandle. // Currently, dynamicTimeout is kept at the client and hence shared across all the // BucketHandle, which is not the ideal state. As latency depends on location of VM // and Bucket, and read latency of different buckets may lie in different range. // Hence having a separate dynamicTimeout instance at BucketHandle level will // be better if rstc.Min == time.Duration(0) { rstc.Min = defaultDynamicReadReqMinTimeout } if rstc.TargetPercentile == 0 { rstc.TargetPercentile = defaultTargetPercentile } return &withReadStallTimeoutConfig{ readStallTimeoutConfig: rstc, } } type withReadStallTimeoutConfig struct { internaloption.EmbeddableAdapter readStallTimeoutConfig *experimental.ReadStallTimeoutConfig } func (wrstc *withReadStallTimeoutConfig) ApplyStorageOpt(config *storageConfig) { config.readStallTimeoutConfig = wrstc.readStallTimeoutConfig } func withGRPCBidiReads() option.ClientOption { return &withGRPCBidiReadsConfig{} } type withGRPCBidiReadsConfig struct { internaloption.EmbeddableAdapter } func (w *withGRPCBidiReadsConfig) ApplyStorageOpt(config *storageConfig) { config.grpcBidiReads = true } func withZonalBucketAPIs() option.ClientOption { return &withZonalBucketAPIsConfig{} } type withZonalBucketAPIsConfig struct { internaloption.EmbeddableAdapter } func (w *withZonalBucketAPIsConfig) ApplyStorageOpt(config *storageConfig) { // Use both appendable upload semantics and bidi reads. config.grpcAppendableUploads = true config.grpcBidiReads = true } ================================================ FILE: vendor/cloud.google.com/go/storage/post_policy_v4.go ================================================ // Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "encoding/base64" "encoding/json" "errors" "fmt" "net/url" "strings" "time" ) // PostPolicyV4Options are used to construct a signed post policy. // Please see https://cloud.google.com/storage/docs/xml-api/post-object // for reference about the fields. type PostPolicyV4Options struct { // GoogleAccessID represents the authorizer of the signed post policy generation. // It is typically the Google service account client email address from // the Google Developers Console in the form of "xxx@developer.gserviceaccount.com". // Required. GoogleAccessID string // PrivateKey is the Google service account private key. It is obtainable // from the Google Developers Console. // At https://console.developers.google.com/project//apiui/credential, // create a service account client ID or reuse one of your existing service account // credentials. Click on the "Generate new P12 key" to generate and download // a new private key. Once you download the P12 file, use the following command // to convert it into a PEM file. // // $ openssl pkcs12 -in key.p12 -passin pass:notasecret -out key.pem -nodes // // Provide the contents of the PEM file as a byte slice. // Exactly one of PrivateKey or SignBytes must be non-nil. PrivateKey []byte // SignBytes is a function for implementing custom signing. // // Deprecated: Use SignRawBytes. If both SignBytes and SignRawBytes are defined, // SignBytes will be ignored. // This SignBytes function expects the bytes it receives to be hashed, while // SignRawBytes accepts the raw bytes without hashing, allowing more flexibility. // Add the following to the top of your signing function to hash the bytes // to use SignRawBytes instead: // shaSum := sha256.Sum256(bytes) // bytes = shaSum[:] // SignBytes func(hashBytes []byte) (signature []byte, err error) // SignRawBytes is a function for implementing custom signing. For example, if // your application is running on Google App Engine, you can use // appengine's internal signing function: // ctx := appengine.NewContext(request) // acc, _ := appengine.ServiceAccount(ctx) // &PostPolicyV4Options{ // GoogleAccessID: acc, // SignRawBytes: func(b []byte) ([]byte, error) { // _, signedBytes, err := appengine.SignBytes(ctx, b) // return signedBytes, err // }, // // etc. // }) // // SignRawBytes is equivalent to the SignBytes field on SignedURLOptions; // that is, you may use the same signing function for the two. // // Exactly one of PrivateKey or SignRawBytes must be non-nil. SignRawBytes func(bytes []byte) (signature []byte, err error) // Expires is the expiration time on the signed post policy. // It must be a time in the future. // Required. Expires time.Time // Style provides options for the type of URL to use. Options are // PathStyle (default), BucketBoundHostname, and VirtualHostedStyle. See // https://cloud.google.com/storage/docs/request-endpoints for details. // Optional. Style URLStyle // Insecure when set indicates that the generated URL's scheme // will use "http" instead of "https" (default). // Optional. Insecure bool // Fields specifies the attributes of a PostPolicyV4 request. // When Fields is non-nil, its attributes must match those that will // passed into field Conditions. // Optional. Fields *PolicyV4Fields // The conditions that the uploaded file will be expected to conform to. // When used, the failure of an upload to satisfy a condition will result in // a 4XX status code, back with the message describing the problem. // Optional. Conditions []PostPolicyV4Condition // Hostname sets the host of the signed post policy. This field overrides // any endpoint set on a storage Client or through STORAGE_EMULATOR_HOST. // Only compatible with PathStyle URLStyle. // Optional. Hostname string shouldHashSignBytes bool } func (opts *PostPolicyV4Options) clone() *PostPolicyV4Options { return &PostPolicyV4Options{ GoogleAccessID: opts.GoogleAccessID, PrivateKey: opts.PrivateKey, SignBytes: opts.SignBytes, SignRawBytes: opts.SignRawBytes, Expires: opts.Expires, Style: opts.Style, Insecure: opts.Insecure, Fields: opts.Fields, Conditions: opts.Conditions, shouldHashSignBytes: opts.shouldHashSignBytes, Hostname: opts.Hostname, } } // PolicyV4Fields describes the attributes for a PostPolicyV4 request. type PolicyV4Fields struct { // ACL specifies the access control permissions for the object. // Optional. ACL string // CacheControl specifies the caching directives for the object. // Optional. CacheControl string // ContentType specifies the media type of the object. // Optional. ContentType string // ContentDisposition specifies how the file will be served back to requesters. // Optional. ContentDisposition string // ContentEncoding specifies the decompressive transcoding that the object. // This field is complementary to ContentType in that the file could be // compressed but ContentType specifies the file's original media type. // Optional. ContentEncoding string // Metadata specifies custom metadata for the object. // If any key doesn't begin with "x-goog-meta-", an error will be returned. // Optional. Metadata map[string]string // StatusCodeOnSuccess when set, specifies the status code that Cloud Storage // will serve back on successful upload of the object. // Optional. StatusCodeOnSuccess int // RedirectToURLOnSuccess when set, specifies the URL that Cloud Storage // will serve back on successful upload of the object. // Optional. RedirectToURLOnSuccess string } // PostPolicyV4 describes the URL and respective form fields for a generated PostPolicyV4 request. type PostPolicyV4 struct { // URL is the generated URL that the file upload will be made to. URL string // Fields specifies the generated key-values that the file uploader // must include in their multipart upload form. Fields map[string]string } // PostPolicyV4Condition describes the constraints that the subsequent // object upload's multipart form fields will be expected to conform to. type PostPolicyV4Condition interface { isEmpty() bool json.Marshaler } type startsWith struct { key, value string } func (sw *startsWith) MarshalJSON() ([]byte, error) { return json.Marshal([]string{"starts-with", sw.key, sw.value}) } func (sw *startsWith) isEmpty() bool { return sw.value == "" } // ConditionStartsWith checks that an attributes starts with value. // An empty value will cause this condition to be ignored. func ConditionStartsWith(key, value string) PostPolicyV4Condition { return &startsWith{key, value} } type contentLengthRangeCondition struct { start, end uint64 } func (clr *contentLengthRangeCondition) MarshalJSON() ([]byte, error) { return json.Marshal([]interface{}{"content-length-range", clr.start, clr.end}) } func (clr *contentLengthRangeCondition) isEmpty() bool { return clr.start == 0 && clr.end == 0 } type singleValueCondition struct { name, value string } func (svc *singleValueCondition) MarshalJSON() ([]byte, error) { return json.Marshal(map[string]string{svc.name: svc.value}) } func (svc *singleValueCondition) isEmpty() bool { return svc.value == "" } // ConditionContentLengthRange constraints the limits that the // multipart upload's range header will be expected to be within. func ConditionContentLengthRange(start, end uint64) PostPolicyV4Condition { return &contentLengthRangeCondition{start, end} } func conditionRedirectToURLOnSuccess(redirectURL string) PostPolicyV4Condition { return &singleValueCondition{"success_action_redirect", redirectURL} } func conditionStatusCodeOnSuccess(statusCode int) PostPolicyV4Condition { svc := &singleValueCondition{name: "success_action_status"} if statusCode > 0 { svc.value = fmt.Sprintf("%d", statusCode) } return svc } // GenerateSignedPostPolicyV4 generates a PostPolicyV4 value from bucket, object and opts. // The generated URL and fields will then allow an unauthenticated client to perform multipart uploads. // If initializing a Storage Client, instead use the Bucket.GenerateSignedPostPolicyV4 // method which uses the Client's credentials to handle authentication. func GenerateSignedPostPolicyV4(bucket, object string, opts *PostPolicyV4Options) (*PostPolicyV4, error) { if bucket == "" { return nil, errors.New("storage: bucket must be non-empty") } if object == "" { return nil, errors.New("storage: object must be non-empty") } now := utcNow() if err := validatePostPolicyV4Options(opts, now); err != nil { return nil, err } var signingFn func(hashedBytes []byte) ([]byte, error) switch { case opts.SignRawBytes != nil: signingFn = opts.SignRawBytes case opts.shouldHashSignBytes: signingFn = opts.SignBytes case len(opts.PrivateKey) != 0: parsedRSAPrivKey, err := parseKey(opts.PrivateKey) if err != nil { return nil, err } signingFn = func(b []byte) ([]byte, error) { sum := sha256.Sum256(b) return rsa.SignPKCS1v15(rand.Reader, parsedRSAPrivKey, crypto.SHA256, sum[:]) } default: return nil, errors.New("storage: exactly one of PrivateKey or SignRawBytes must be set") } var descFields PolicyV4Fields if opts.Fields != nil { descFields = *opts.Fields } if err := validateMetadata(descFields.Metadata); err != nil { return nil, err } // Build the policy. conds := make([]PostPolicyV4Condition, len(opts.Conditions)) copy(conds, opts.Conditions) conds = append(conds, // These are ordered lexicographically. Technically the order doesn't matter // for creating the policy, but we use this order to match the // cross-language conformance tests for this feature. &singleValueCondition{"acl", descFields.ACL}, &singleValueCondition{"cache-control", descFields.CacheControl}, &singleValueCondition{"content-disposition", descFields.ContentDisposition}, &singleValueCondition{"content-encoding", descFields.ContentEncoding}, &singleValueCondition{"content-type", descFields.ContentType}, conditionRedirectToURLOnSuccess(descFields.RedirectToURLOnSuccess), conditionStatusCodeOnSuccess(descFields.StatusCodeOnSuccess), ) YYYYMMDD := now.Format(yearMonthDay) policyFields := map[string]string{ "key": object, "x-goog-date": now.Format(iso8601), "x-goog-credential": opts.GoogleAccessID + "/" + YYYYMMDD + "/auto/storage/goog4_request", "x-goog-algorithm": "GOOG4-RSA-SHA256", "acl": descFields.ACL, "cache-control": descFields.CacheControl, "content-disposition": descFields.ContentDisposition, "content-encoding": descFields.ContentEncoding, "content-type": descFields.ContentType, "success_action_redirect": descFields.RedirectToURLOnSuccess, } for key, value := range descFields.Metadata { conds = append(conds, &singleValueCondition{key, value}) policyFields[key] = value } // Following from the order expected by the conformance test cases, // hence manually inserting these fields in a specific order. conds = append(conds, &singleValueCondition{"bucket", bucket}, &singleValueCondition{"key", object}, &singleValueCondition{"x-goog-date", now.Format(iso8601)}, &singleValueCondition{ name: "x-goog-credential", value: opts.GoogleAccessID + "/" + YYYYMMDD + "/auto/storage/goog4_request", }, &singleValueCondition{"x-goog-algorithm", "GOOG4-RSA-SHA256"}, ) nonEmptyConds := make([]PostPolicyV4Condition, 0, len(opts.Conditions)) for _, cond := range conds { if cond == nil || !cond.isEmpty() { nonEmptyConds = append(nonEmptyConds, cond) } } condsAsJSON, err := json.Marshal(map[string]interface{}{ "conditions": nonEmptyConds, "expiration": opts.Expires.Format(time.RFC3339), }) if err != nil { return nil, fmt.Errorf("storage: PostPolicyV4 JSON serialization failed: %w", err) } b64Policy := base64.StdEncoding.EncodeToString(condsAsJSON) var signature []byte var signErr error if opts.shouldHashSignBytes { // SignBytes expects hashed bytes as input instead of raw bytes, so we hash them shaSum := sha256.Sum256([]byte(b64Policy)) signature, signErr = signingFn(shaSum[:]) } else { signature, signErr = signingFn([]byte(b64Policy)) } if signErr != nil { return nil, signErr } policyFields["policy"] = b64Policy policyFields["x-goog-signature"] = fmt.Sprintf("%x", signature) // Construct the URL. scheme := "https" if opts.Insecure { scheme = "http" } path := opts.Style.path(bucket, "") + "/" u := &url.URL{ Path: path, RawPath: pathEncodeV4(path), Host: opts.Style.host(opts.Hostname, bucket), Scheme: scheme, } if descFields.StatusCodeOnSuccess > 0 { policyFields["success_action_status"] = fmt.Sprintf("%d", descFields.StatusCodeOnSuccess) } // Clear out fields with blanks values. for key, value := range policyFields { if value == "" { delete(policyFields, key) } } pp4 := &PostPolicyV4{ Fields: policyFields, URL: u.String(), } return pp4, nil } // validatePostPolicyV4Options checks that: // * GoogleAccessID is set // * either PrivateKey or SignRawBytes/SignBytes is set, but not both // * the deadline set in Expires is not in the past // * if Style is not set, it'll use PathStyle // * sets shouldHashSignBytes to true if opts.SignBytes should be used func validatePostPolicyV4Options(opts *PostPolicyV4Options, now time.Time) error { if opts == nil || opts.GoogleAccessID == "" { return errors.New("storage: missing required GoogleAccessID") } if privBlank, signBlank := len(opts.PrivateKey) == 0, opts.SignBytes == nil && opts.SignRawBytes == nil; privBlank == signBlank { return errors.New("storage: exactly one of PrivateKey or SignRawBytes must be set") } if opts.Expires.Before(now) { return errors.New("storage: expecting Expires to be in the future") } if opts.Style == nil { opts.Style = PathStyle() } if opts.SignRawBytes == nil && opts.SignBytes != nil { opts.shouldHashSignBytes = true } return nil } // validateMetadata ensures that all keys passed in have a prefix of "x-goog-meta-", // otherwise it will return an error. func validateMetadata(hdrs map[string]string) (err error) { if len(hdrs) == 0 { return nil } badKeys := make([]string, 0, len(hdrs)) for key := range hdrs { if !strings.HasPrefix(key, "x-goog-meta-") { badKeys = append(badKeys, key) } } if len(badKeys) != 0 { err = errors.New("storage: expected metadata to begin with x-goog-meta-, got " + strings.Join(badKeys, ", ")) } return } ================================================ FILE: vendor/cloud.google.com/go/storage/reader.go ================================================ // Copyright 2016 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "fmt" "hash/crc32" "io" "io/ioutil" "net/http" "strings" "sync" "time" "cloud.google.com/go/internal/trace" ) var crc32cTable = crc32.MakeTable(crc32.Castagnoli) // ReaderObjectAttrs are attributes about the object being read. These are populated // during the New call. This struct only holds a subset of object attributes: to // get the full set of attributes, use ObjectHandle.Attrs. // // Each field is read-only. type ReaderObjectAttrs struct { // Size is the length of the object's content. Size int64 // StartOffset is the byte offset within the object // from which reading begins. // This value is only non-zero for range requests. StartOffset int64 // ContentType is the MIME type of the object's content. ContentType string // ContentEncoding is the encoding of the object's content. ContentEncoding string // CacheControl specifies whether and for how long browser and Internet // caches are allowed to cache your objects. CacheControl string // LastModified is the time that the object was last modified. LastModified time.Time // Generation is the generation number of the object's content. Generation int64 // Metageneration is the version of the metadata for this object at // this generation. This field is used for preconditions and for // detecting changes in metadata. A metageneration number is only // meaningful in the context of a particular generation of a // particular object. Metageneration int64 // CRC32C is the CRC32 checksum of the entire object's content using the // Castagnoli93 polynomial, if available. CRC32C uint32 // Decompressed is true if the object is stored as a gzip file and was // decompressed when read. // Objects are automatically decompressed if the object's metadata property // "Content-Encoding" is set to "gzip" or satisfies decompressive // transcoding as per https://cloud.google.com/storage/docs/transcoding. // // To prevent decompression on reads, use [ObjectHandle.ReadCompressed]. Decompressed bool } // NewReader creates a new Reader to read the contents of the // object. // ErrObjectNotExist will be returned if the object is not found. // // The caller must call Close on the returned Reader when done reading. // // By default, reads are made using the Cloud Storage XML API. We recommend // using the JSON API instead, which can be done by setting [WithJSONReads] // when calling [NewClient]. This ensures consistency with other client // operations, which all use JSON. JSON will become the default in a future // release. func (o *ObjectHandle) NewReader(ctx context.Context) (*Reader, error) { return o.NewRangeReader(ctx, 0, -1) } // NewRangeReader reads part of an object, reading at most length bytes // starting at the given offset. If length is negative, the object is read // until the end. If offset is negative, the object is read abs(offset) bytes // from the end, and length must also be negative to indicate all remaining // bytes will be read. // // If the object's metadata property "Content-Encoding" is set to "gzip" or satisfies // decompressive transcoding per https://cloud.google.com/storage/docs/transcoding // that file will be served back whole, regardless of the requested range as // Google Cloud Storage dictates. If decompressive transcoding occurs, // [Reader.Attrs.Decompressed] will be true. // // By default, reads are made using the Cloud Storage XML API. We recommend // using the JSON API instead, which can be done by setting [WithJSONReads] // when calling [NewClient]. This ensures consistency with other client // operations, which all use JSON. JSON will become the default in a future // release. func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) (r *Reader, err error) { // This span covers the life of the reader. It is closed via the context // in Reader.Close. ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Reader") if err := o.validate(); err != nil { return nil, err } if offset < 0 && length >= 0 { return nil, fmt.Errorf("storage: invalid offset %d < 0 requires negative length", offset) } if o.conds != nil { if err := o.conds.validate("NewRangeReader"); err != nil { return nil, err } } opts := makeStorageOpts(true, o.retry, o.userProject) params := &newRangeReaderParams{ bucket: o.bucket, object: o.object, gen: o.gen, offset: offset, length: length, encryptionKey: o.encryptionKey, conds: o.conds, readCompressed: o.readCompressed, handle: &o.readHandle, } r, err = o.c.tc.NewRangeReader(ctx, params, opts...) // Pass the context so that the span can be closed in Reader.Close, or close the // span now if there is an error. if err == nil { r.ctx = ctx } else { trace.EndSpan(ctx, err) } return r, err } // NewMultiRangeDownloader creates a multi-range reader for an object. // Must be called on a gRPC client created using [NewGRPCClient]. // // This uses the gRPC-specific bi-directional read API, which is in private // preview; please contact your account manager if interested. The option // [experimental.WithGRPCBidiReads] or [experimental.WithZonalBucketAPIs] // must be selected in order to use this API. func (o *ObjectHandle) NewMultiRangeDownloader(ctx context.Context) (mrd *MultiRangeDownloader, err error) { // This span covers the life of the reader. It is closed via the context // in Reader.Close. ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.MultiRangeDownloader") if err := o.validate(); err != nil { return nil, err } if o.conds != nil { if err := o.conds.validate("NewMultiRangeDownloader"); err != nil { return nil, err } } opts := makeStorageOpts(true, o.retry, o.userProject) params := &newMultiRangeDownloaderParams{ bucket: o.bucket, conds: o.conds, encryptionKey: o.encryptionKey, gen: o.gen, object: o.object, handle: &o.readHandle, } r, err := o.c.tc.NewMultiRangeDownloader(ctx, params, opts...) // Pass the context so that the span can be closed in MultiRangeDownloader.Close(), or close the // span now if there is an error. if err == nil { r.ctx = ctx } else { trace.EndSpan(ctx, err) } return r, err } // decompressiveTranscoding returns true if the request was served decompressed // and different than its original storage form. This happens when the "Content-Encoding" // header is "gzip". // See: // - https://cloud.google.com/storage/docs/transcoding#transcoding_and_gzip // - https://github.com/googleapis/google-cloud-go/issues/1800 func decompressiveTranscoding(res *http.Response) bool { // Decompressive Transcoding. return res.Header.Get("Content-Encoding") == "gzip" || res.Header.Get("X-Goog-Stored-Content-Encoding") == "gzip" } func uncompressedByServer(res *http.Response) bool { // If the data is stored as gzip but is not encoded as gzip, then it // was uncompressed by the server. return res.Header.Get("X-Goog-Stored-Content-Encoding") == "gzip" && res.Header.Get("Content-Encoding") != "gzip" } // parseCRC32c parses the crc32c hash from the X-Goog-Hash header. // It can parse headers in the form [crc32c=xxx md5=xxx] (XML responses) or the // form [crc32c=xxx,md5=xxx] (JSON responses). The md5 hash is ignored. func parseCRC32c(res *http.Response) (uint32, bool) { const prefix = "crc32c=" for _, spec := range res.Header["X-Goog-Hash"] { values := strings.Split(spec, ",") for _, v := range values { if strings.HasPrefix(v, prefix) { c, err := decodeUint32(v[len(prefix):]) if err == nil { return c, true } } } } return 0, false } // setConditionsHeaders sets precondition request headers for downloads // using the XML API. It assumes that the conditions have been validated. func setConditionsHeaders(headers http.Header, conds *Conditions) error { if conds == nil { return nil } if conds.MetagenerationMatch != 0 { headers.Set("x-goog-if-metageneration-match", fmt.Sprint(conds.MetagenerationMatch)) } switch { case conds.GenerationMatch != 0: headers.Set("x-goog-if-generation-match", fmt.Sprint(conds.GenerationMatch)) case conds.DoesNotExist: headers.Set("x-goog-if-generation-match", "0") } return nil } var emptyBody = ioutil.NopCloser(strings.NewReader("")) // Reader reads a Cloud Storage object. // It implements io.Reader. // // Typically, a Reader computes the CRC of the downloaded content and compares it to // the stored CRC, returning an error from Read if there is a mismatch. This integrity check // is skipped if transcoding occurs. See https://cloud.google.com/storage/docs/transcoding. type Reader struct { Attrs ReaderObjectAttrs objectMetadata *map[string]string seen, remain, size int64 checkCRC bool // Did we check the CRC? This is now only used by tests. reader io.ReadCloser ctx context.Context mu sync.Mutex handle *ReadHandle } // Close closes the Reader. It must be called when done reading. func (r *Reader) Close() error { err := r.reader.Close() trace.EndSpan(r.ctx, err) return err } func (r *Reader) Read(p []byte) (int, error) { n, err := r.reader.Read(p) if r.remain != -1 { r.remain -= int64(n) } return n, err } // WriteTo writes all the data from the Reader to w. Fulfills the io.WriterTo interface. // This is called implicitly when calling io.Copy on a Reader. func (r *Reader) WriteTo(w io.Writer) (int64, error) { // This implicitly calls r.reader.WriteTo for gRPC only. JSON and XML don't have an // implementation of WriteTo. n, err := io.Copy(w, r.reader) if r.remain != -1 { r.remain -= int64(n) } return n, err } // Size returns the size of the object in bytes. // The returned value is always the same and is not affected by // calls to Read or Close. // // Deprecated: use Reader.Attrs.Size. func (r *Reader) Size() int64 { return r.Attrs.Size } // Remain returns the number of bytes left to read, or -1 if unknown. func (r *Reader) Remain() int64 { return r.remain } // ContentType returns the content type of the object. // // Deprecated: use Reader.Attrs.ContentType. func (r *Reader) ContentType() string { return r.Attrs.ContentType } // ContentEncoding returns the content encoding of the object. // // Deprecated: use Reader.Attrs.ContentEncoding. func (r *Reader) ContentEncoding() string { return r.Attrs.ContentEncoding } // CacheControl returns the cache control of the object. // // Deprecated: use Reader.Attrs.CacheControl. func (r *Reader) CacheControl() string { return r.Attrs.CacheControl } // LastModified returns the value of the Last-Modified header. // // Deprecated: use Reader.Attrs.LastModified. func (r *Reader) LastModified() (time.Time, error) { return r.Attrs.LastModified, nil } // Metadata returns user-provided metadata, in key/value pairs. // // It can be nil if no metadata is present, or if the client uses the JSON // API for downloads. Only the XML and gRPC APIs support getting // custom metadata via the Reader; for JSON make a separate call to // ObjectHandle.Attrs. func (r *Reader) Metadata() map[string]string { if r.objectMetadata != nil { return *r.objectMetadata } return nil } // ReadHandle returns the read handle associated with an object. // ReadHandle will be periodically refreshed. // // ReadHandle requires the gRPC-specific bi-directional read API, which is in // private preview; please contact your account manager if interested. // Note that this only valid for gRPC and only with zonal buckets. func (r *Reader) ReadHandle() ReadHandle { if r.handle == nil { r.handle = &ReadHandle{} } r.mu.Lock() defer r.mu.Unlock() return (*r.handle) } // MultiRangeDownloader reads a Cloud Storage object. // // Typically, a MultiRangeDownloader opens a stream to which we can add // different ranges to read from the object. // // This API is currently in preview and is not yet available for general use. type MultiRangeDownloader struct { Attrs ReaderObjectAttrs reader multiRangeDownloader ctx context.Context } type multiRangeDownloader interface { add(output io.Writer, offset, limit int64, callback func(int64, int64, error)) wait() close() error getHandle() []byte error() error } // Add adds a new range to MultiRangeDownloader. // // The offset for the first byte to return in the read, relative to the start // of the object. // // A negative offset value will be interpreted as the number of bytes from the // end of the object to be returned. Requesting a negative offset with magnitude // larger than the size of the object will return the entire object. An offset // larger than the size of the object will result in an OutOfRange error. // // A limit of zero indicates that there is no limit, and a negative limit will // cause an error. // // This will initiate the read range but is non-blocking; call callback to // process the result. Add is thread-safe and can be called simultaneously // from different goroutines. // // Callback will be called with the offset, length of data read, and error // of the read. Note that the length of the data read may be less than the // requested length if the end of the object is reached. func (mrd *MultiRangeDownloader) Add(output io.Writer, offset, length int64, callback func(int64, int64, error)) { mrd.reader.add(output, offset, length, callback) } // Close the MultiRangeDownloader. It must be called when done reading. // Adding new ranges after this has been called will cause an error. // // This will immediately close the stream and can result in a // "stream closed early" error if a response for a range is still not processed. // Call [MultiRangeDownloader.Wait] to avoid this error. func (mrd *MultiRangeDownloader) Close() error { err := mrd.reader.close() trace.EndSpan(mrd.ctx, err) return err } // Wait for all the responses to process on the stream. // Adding new ranges after this has been called will cause an error. // Wait will wait for all callbacks to finish. func (mrd *MultiRangeDownloader) Wait() { mrd.reader.wait() } // GetHandle returns the read handle. This can be used to further speed up the // follow up read if the same object is read through a different stream. func (mrd *MultiRangeDownloader) GetHandle() []byte { return mrd.reader.getHandle() } // Error returns an error if the MultiRangeDownloader is in a permanent failure // state. It returns a nil error if the MultiRangeDownloader is open and can be // used. func (mrd *MultiRangeDownloader) Error() error { return mrd.reader.error() } ================================================ FILE: vendor/cloud.google.com/go/storage/storage.go ================================================ // Copyright 2014 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "bytes" "context" "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "encoding/base64" "encoding/hex" "encoding/pem" "errors" "fmt" "net/http" "net/url" "os" "reflect" "regexp" "sort" "strconv" "strings" "time" "unicode/utf8" "cloud.google.com/go/internal/optional" "cloud.google.com/go/internal/trace" "cloud.google.com/go/storage/internal" "cloud.google.com/go/storage/internal/apiv2/storagepb" "github.com/googleapis/gax-go/v2" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/metricdata" "golang.org/x/oauth2/google" "google.golang.org/api/googleapi" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" raw "google.golang.org/api/storage/v1" "google.golang.org/api/transport" htransport "google.golang.org/api/transport/http" "google.golang.org/grpc/codes" "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/stats/opentelemetry" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/types/known/fieldmaskpb" "google.golang.org/protobuf/types/known/timestamppb" ) // Methods which can be used in signed URLs. var signedURLMethods = map[string]bool{"DELETE": true, "GET": true, "HEAD": true, "POST": true, "PUT": true} var ( // ErrBucketNotExist indicates that the bucket does not exist. It should be // checked for using [errors.Is] instead of direct equality. ErrBucketNotExist = errors.New("storage: bucket doesn't exist") // ErrObjectNotExist indicates that the object does not exist. It should be // checked for using [errors.Is] instead of direct equality. ErrObjectNotExist = errors.New("storage: object doesn't exist") // errMethodNotSupported indicates that the method called is not currently supported by the client. // TODO: Export this error when launching the transport-agnostic client. errMethodNotSupported = errors.New("storage: method is not currently supported") // errSignedURLMethodNotValid indicates that given HTTP method is not valid. errSignedURLMethodNotValid = fmt.Errorf("storage: HTTP method should be one of %v", reflect.ValueOf(signedURLMethods).MapKeys()) ) var userAgent = fmt.Sprintf("gcloud-golang-storage/%s", internal.Version) const ( // ScopeFullControl grants permissions to manage your // data and permissions in Google Cloud Storage. ScopeFullControl = raw.DevstorageFullControlScope // ScopeReadOnly grants permissions to // view your data in Google Cloud Storage. ScopeReadOnly = raw.DevstorageReadOnlyScope // ScopeReadWrite grants permissions to manage your // data in Google Cloud Storage. ScopeReadWrite = raw.DevstorageReadWriteScope // aes256Algorithm is the AES256 encryption algorithm used with the // Customer-Supplied Encryption Keys feature. aes256Algorithm = "AES256" // defaultGen indicates the latest object generation by default, // using a negative value. defaultGen = int64(-1) ) // TODO: remove this once header with invocation ID is applied to all methods. func setClientHeader(headers http.Header) { headers.Set("x-goog-api-client", xGoogDefaultHeader) } // Client is a client for interacting with Google Cloud Storage. // // Clients should be reused instead of created as needed. // The methods of Client are safe for concurrent use by multiple goroutines. type Client struct { hc *http.Client raw *raw.Service // Scheme describes the scheme under the current host. scheme string // xmlHost is the default host used for XML requests. xmlHost string // May be nil. creds *google.Credentials retry *retryConfig // tc is the transport-agnostic client implemented with either gRPC or HTTP. tc storageClient // Option to use gRRPC appendable upload API was set. grpcAppendableUploads bool } // NewClient creates a new Google Cloud Storage client using the HTTP transport. // The default scope is ScopeFullControl. To use a different scope, like // ScopeReadOnly, use option.WithScopes. // // Clients should be reused instead of created as needed. The methods of Client // are safe for concurrent use by multiple goroutines. // // You may configure the client by passing in options from the [google.golang.org/api/option] // package. You may also use options defined in this package, such as [WithJSONReads]. func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { var creds *google.Credentials // In general, it is recommended to use raw.NewService instead of htransport.NewClient // since raw.NewService configures the correct default endpoints when initializing the // internal http client. However, in our case, "NewRangeReader" in reader.go needs to // access the http client directly to make requests, so we create the client manually // here so it can be re-used by both reader.go and raw.NewService. This means we need to // manually configure the default endpoint options on the http client. Furthermore, we // need to account for STORAGE_EMULATOR_HOST override when setting the default endpoints. if host := os.Getenv("STORAGE_EMULATOR_HOST"); host == "" { // Prepend default options to avoid overriding options passed by the user. opts = append([]option.ClientOption{option.WithScopes(ScopeFullControl, "https://www.googleapis.com/auth/cloud-platform"), option.WithUserAgent(userAgent)}, opts...) opts = append(opts, internaloption.WithDefaultEndpointTemplate("https://storage.UNIVERSE_DOMAIN/storage/v1/"), internaloption.WithDefaultMTLSEndpoint("https://storage.mtls.googleapis.com/storage/v1/"), internaloption.WithDefaultUniverseDomain("googleapis.com"), ) // Don't error out here. The user may have passed in their own HTTP // client which does not auth with ADC or other common conventions. c, err := transport.Creds(ctx, opts...) if err == nil { creds = c opts = append(opts, internaloption.WithCredentials(creds)) } } else { var hostURL *url.URL if strings.Contains(host, "://") { h, err := url.Parse(host) if err != nil { return nil, err } hostURL = h } else { // Add scheme for user if not supplied in STORAGE_EMULATOR_HOST // URL is only parsed correctly if it has a scheme, so we build it ourselves hostURL = &url.URL{Scheme: "http", Host: host} } hostURL.Path = "storage/v1/" endpoint := hostURL.String() // Append the emulator host as default endpoint for the user opts = append([]option.ClientOption{ option.WithoutAuthentication(), internaloption.SkipDialSettingsValidation(), internaloption.WithDefaultEndpointTemplate(endpoint), internaloption.WithDefaultMTLSEndpoint(endpoint), }, opts...) } // htransport selects the correct endpoint among WithEndpoint (user override), WithDefaultEndpointTemplate, and WithDefaultMTLSEndpoint. hc, ep, err := htransport.NewClient(ctx, opts...) if err != nil { return nil, fmt.Errorf("dialing: %w", err) } // RawService should be created with the chosen endpoint to take account of user override. rawService, err := raw.NewService(ctx, option.WithEndpoint(ep), option.WithHTTPClient(hc)) if err != nil { return nil, fmt.Errorf("storage client: %w", err) } // Update xmlHost and scheme with the chosen endpoint. u, err := url.Parse(ep) if err != nil { return nil, fmt.Errorf("supplied endpoint %q is not valid: %w", ep, err) } tc, err := newHTTPStorageClient(ctx, withClientOptions(opts...)) if err != nil { return nil, fmt.Errorf("storage: %w", err) } return &Client{ hc: hc, raw: rawService, scheme: u.Scheme, xmlHost: u.Host, creds: creds, tc: tc, }, nil } // NewGRPCClient creates a new Storage client using the gRPC transport and API. // Client methods which have not been implemented in gRPC will return an error. // In particular, methods for Cloud Pub/Sub notifications, Service Account HMAC // keys, and ServiceAccount are not supported. // Using a non-default universe domain is also not supported with the Storage // gRPC client. // // Clients should be reused instead of created as needed. The methods of Client // are safe for concurrent use by multiple goroutines. // // You may configure the client by passing in options from the [google.golang.org/api/option] // package. func NewGRPCClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { tc, err := newGRPCStorageClient(ctx, withClientOptions(opts...)) if err != nil { return nil, err } return &Client{ tc: tc, grpcAppendableUploads: tc.config.grpcAppendableUploads, }, nil } // CheckDirectConnectivitySupported checks if gRPC direct connectivity // is available for a specific bucket from the environment where the client // is running. A `nil` error represents Direct Connectivity was detected. // Direct connectivity is expected to be available when running from inside // GCP and connecting to a bucket in the same region. // // Experimental helper that's subject to change. // // You can pass in [option.ClientOption] you plan on passing to [NewGRPCClient] func CheckDirectConnectivitySupported(ctx context.Context, bucket string, opts ...option.ClientOption) error { view := metric.NewView( metric.Instrument{ Name: "grpc.client.attempt.duration", Kind: metric.InstrumentKindHistogram, }, metric.Stream{AttributeFilter: attribute.NewAllowKeysFilter("grpc.lb.locality")}, ) mr := metric.NewManualReader() provider := metric.NewMeterProvider(metric.WithReader(mr), metric.WithView(view)) // Provider handles shutting down ManualReader defer provider.Shutdown(ctx) mo := opentelemetry.MetricsOptions{ MeterProvider: provider, Metrics: stats.NewMetrics("grpc.client.attempt.duration"), OptionalLabels: []string{"grpc.lb.locality"}, } combinedOpts := append(opts, WithDisabledClientMetrics(), option.WithGRPCDialOption(opentelemetry.DialOption(opentelemetry.Options{MetricsOptions: mo}))) client, err := NewGRPCClient(ctx, combinedOpts...) if err != nil { return fmt.Errorf("storage.NewGRPCClient: %w", err) } defer client.Close() if _, err = client.Bucket(bucket).Attrs(ctx); err != nil { return fmt.Errorf("Bucket.Attrs: %w", err) } // Call manual reader to collect metric rm := metricdata.ResourceMetrics{} if err = mr.Collect(context.Background(), &rm); err != nil { return fmt.Errorf("ManualReader.Collect: %w", err) } for _, sm := range rm.ScopeMetrics { for _, m := range sm.Metrics { if m.Name == "grpc.client.attempt.duration" { hist := m.Data.(metricdata.Histogram[float64]) for _, d := range hist.DataPoints { v, present := d.Attributes.Value("grpc.lb.locality") if present && v.AsString() != "" && v.AsString() != "{}" { return nil } } } } } return errors.New("storage: direct connectivity not detected") } // Close closes the Client. // // Close need not be called at program exit. func (c *Client) Close() error { // Set fields to nil so that subsequent uses will panic. c.hc = nil c.raw = nil c.creds = nil if c.tc != nil { return c.tc.Close() } return nil } // SigningScheme determines the API version to use when signing URLs. type SigningScheme int const ( // SigningSchemeDefault is presently V2 and will change to V4 in the future. SigningSchemeDefault SigningScheme = iota // SigningSchemeV2 uses the V2 scheme to sign URLs. SigningSchemeV2 // SigningSchemeV4 uses the V4 scheme to sign URLs. SigningSchemeV4 ) // URLStyle determines the style to use for the signed URL. PathStyle is the // default. All non-default options work with V4 scheme only. See // https://cloud.google.com/storage/docs/request-endpoints for details. type URLStyle interface { // host should return the host portion of the signed URL, not including // the scheme (e.g. storage.googleapis.com). host(hostname, bucket string) string // path should return the path portion of the signed URL, which may include // both the bucket and object name or only the object name depending on the // style. path(bucket, object string) string } type pathStyle struct{} type virtualHostedStyle struct{} type bucketBoundHostname struct { hostname string } func (s pathStyle) host(hostname, bucket string) string { if hostname != "" { return stripScheme(hostname) } if host := os.Getenv("STORAGE_EMULATOR_HOST"); host != "" { return stripScheme(host) } return "storage.googleapis.com" } func (s virtualHostedStyle) host(hostname, bucket string) string { if hostname != "" { return bucket + "." + stripScheme(hostname) } if host := os.Getenv("STORAGE_EMULATOR_HOST"); host != "" { return bucket + "." + stripScheme(host) } return bucket + ".storage.googleapis.com" } func (s bucketBoundHostname) host(_, bucket string) string { return s.hostname } func (s pathStyle) path(bucket, object string) string { p := bucket if object != "" { p += "/" + object } return p } func (s virtualHostedStyle) path(bucket, object string) string { return object } func (s bucketBoundHostname) path(bucket, object string) string { return object } // PathStyle is the default style, and will generate a URL of the form // "//". By default, is // storage.googleapis.com, but setting an endpoint on the storage Client or // through STORAGE_EMULATOR_HOST overrides this. Setting Hostname on // SignedURLOptions or PostPolicyV4Options overrides everything else. func PathStyle() URLStyle { return pathStyle{} } // VirtualHostedStyle generates a URL relative to the bucket's virtual // hostname, e.g. ".storage.googleapis.com/". func VirtualHostedStyle() URLStyle { return virtualHostedStyle{} } // BucketBoundHostname generates a URL with a custom hostname tied to a // specific GCS bucket. The desired hostname should be passed in using the // hostname argument. Generated urls will be of the form // "/". See // https://cloud.google.com/storage/docs/request-endpoints#cname and // https://cloud.google.com/load-balancing/docs/https/adding-backend-buckets-to-load-balancers // for details. Note that for CNAMEs, only HTTP is supported, so Insecure must // be set to true. func BucketBoundHostname(hostname string) URLStyle { return bucketBoundHostname{hostname: hostname} } // Strips the scheme from a host if it contains it func stripScheme(host string) string { if strings.Contains(host, "://") { host = strings.SplitN(host, "://", 2)[1] } return host } // SignedURLOptions allows you to restrict the access to the signed URL. type SignedURLOptions struct { // GoogleAccessID represents the authorizer of the signed URL generation. // It is typically the Google service account client email address from // the Google Developers Console in the form of "xxx@developer.gserviceaccount.com". // Required. GoogleAccessID string // PrivateKey is the Google service account private key. It is obtainable // from the Google Developers Console. // At https://console.developers.google.com/project//apiui/credential, // create a service account client ID or reuse one of your existing service account // credentials. Click on the "Generate new P12 key" to generate and download // a new private key. Once you download the P12 file, use the following command // to convert it into a PEM file. // // $ openssl pkcs12 -in key.p12 -passin pass:notasecret -out key.pem -nodes // // Provide the contents of the PEM file as a byte slice. // Exactly one of PrivateKey or SignBytes must be non-nil. PrivateKey []byte // SignBytes is a function for implementing custom signing. For example, if // your application is running on Google App Engine, you can use // appengine's internal signing function: // ctx := appengine.NewContext(request) // acc, _ := appengine.ServiceAccount(ctx) // url, err := SignedURL("bucket", "object", &SignedURLOptions{ // GoogleAccessID: acc, // SignBytes: func(b []byte) ([]byte, error) { // _, signedBytes, err := appengine.SignBytes(ctx, b) // return signedBytes, err // }, // // etc. // }) // // Exactly one of PrivateKey or SignBytes must be non-nil. SignBytes func([]byte) ([]byte, error) // Method is the HTTP method to be used with the signed URL. // Signed URLs can be used with GET, HEAD, PUT, and DELETE requests. // Required. Method string // Expires is the expiration time on the signed URL. It must be // a datetime in the future. For SigningSchemeV4, the expiration may be no // more than seven days in the future. // Required. Expires time.Time // ContentType is the content type header the client must provide // to use the generated signed URL. // Optional. ContentType string // Headers is a list of extension headers the client must provide // in order to use the generated signed URL. Each must be a string of the // form "key:values", with multiple values separated by a semicolon. // Optional. Headers []string // QueryParameters is a map of additional query parameters. When // SigningScheme is V4, this is used in computing the signature, and the // client must use the same query parameters when using the generated signed // URL. // Optional. QueryParameters url.Values // MD5 is the base64 encoded MD5 checksum of the file. // If provided, the client should provide the exact value on the request // header in order to use the signed URL. // Optional. MD5 string // Style provides options for the type of URL to use. Options are // PathStyle (default), BucketBoundHostname, and VirtualHostedStyle. See // https://cloud.google.com/storage/docs/request-endpoints for details. // Only supported for V4 signing. // Optional. Style URLStyle // Insecure determines whether the signed URL should use HTTPS (default) or // HTTP. // Only supported for V4 signing. // Optional. Insecure bool // Scheme determines the version of URL signing to use. Default is // SigningSchemeV2. Scheme SigningScheme // Hostname sets the host of the signed URL. This field overrides any // endpoint set on a storage Client or through STORAGE_EMULATOR_HOST. // Only compatible with PathStyle and VirtualHostedStyle URLStyles. // Optional. Hostname string } func (opts *SignedURLOptions) clone() *SignedURLOptions { return &SignedURLOptions{ GoogleAccessID: opts.GoogleAccessID, SignBytes: opts.SignBytes, PrivateKey: opts.PrivateKey, Method: opts.Method, Expires: opts.Expires, ContentType: opts.ContentType, Headers: opts.Headers, QueryParameters: opts.QueryParameters, MD5: opts.MD5, Style: opts.Style, Insecure: opts.Insecure, Scheme: opts.Scheme, Hostname: opts.Hostname, } } var ( tabRegex = regexp.MustCompile(`[\t]+`) // I was tempted to call this spacex. :) spaceRegex = regexp.MustCompile(` +`) canonicalHeaderRegexp = regexp.MustCompile(`(?i)^(x-goog-[^:]+):(.*)?$`) excludedCanonicalHeaders = map[string]bool{ "x-goog-encryption-key": true, "x-goog-encryption-key-sha256": true, } ) // v2SanitizeHeaders applies the specifications for canonical extension headers at // https://cloud.google.com/storage/docs/access-control/signed-urls-v2#about-canonical-extension-headers func v2SanitizeHeaders(hdrs []string) []string { headerMap := map[string][]string{} for _, hdr := range hdrs { // No leading or trailing whitespaces. sanitizedHeader := strings.TrimSpace(hdr) var header, value string // Only keep canonical headers, discard any others. headerMatches := canonicalHeaderRegexp.FindStringSubmatch(sanitizedHeader) if len(headerMatches) == 0 { continue } header = headerMatches[1] value = headerMatches[2] header = strings.ToLower(strings.TrimSpace(header)) value = strings.TrimSpace(value) if excludedCanonicalHeaders[header] { // Do not keep any deliberately excluded canonical headers when signing. continue } if len(value) > 0 { // Remove duplicate headers by appending the values of duplicates // in their order of appearance. headerMap[header] = append(headerMap[header], value) } } var sanitizedHeaders []string for header, values := range headerMap { // There should be no spaces around the colon separating the header name // from the header value or around the values themselves. The values // should be separated by commas. // // NOTE: The semantics for headers without a value are not clear. // However from specifications these should be edge-cases anyway and we // should assume that there will be no canonical headers using empty // values. Any such headers are discarded at the regexp stage above. sanitizedHeaders = append(sanitizedHeaders, fmt.Sprintf("%s:%s", header, strings.Join(values, ","))) } sort.Strings(sanitizedHeaders) return sanitizedHeaders } // v4SanitizeHeaders applies the specifications for canonical extension headers // at https://cloud.google.com/storage/docs/authentication/canonical-requests#about-headers. // // V4 does a couple things differently from V2: // - Headers get sorted by key, instead of by key:value. We do this in // signedURLV4. // - There's no canonical regexp: we simply split headers on :. // - We don't exclude canonical headers. // - We replace leading and trailing spaces in header values, like v2, but also // all intermediate space duplicates get stripped. That is, there's only ever // a single consecutive space. func v4SanitizeHeaders(hdrs []string) []string { headerMap := map[string][]string{} for _, hdr := range hdrs { // No leading or trailing whitespaces. sanitizedHeader := strings.TrimSpace(hdr) var key, value string headerMatches := strings.SplitN(sanitizedHeader, ":", 2) if len(headerMatches) < 2 { continue } key = headerMatches[0] value = headerMatches[1] key = strings.ToLower(strings.TrimSpace(key)) value = strings.TrimSpace(value) value = string(spaceRegex.ReplaceAll([]byte(value), []byte(" "))) value = string(tabRegex.ReplaceAll([]byte(value), []byte("\t"))) if len(value) > 0 { // Remove duplicate headers by appending the values of duplicates // in their order of appearance. headerMap[key] = append(headerMap[key], value) } } var sanitizedHeaders []string for header, values := range headerMap { // There should be no spaces around the colon separating the header name // from the header value or around the values themselves. The values // should be separated by commas. // // NOTE: The semantics for headers without a value are not clear. // However from specifications these should be edge-cases anyway and we // should assume that there will be no canonical headers using empty // values. Any such headers are discarded at the regexp stage above. sanitizedHeaders = append(sanitizedHeaders, fmt.Sprintf("%s:%s", header, strings.Join(values, ","))) } return sanitizedHeaders } // SignedURL returns a URL for the specified object. Signed URLs allow anyone // access to a restricted resource for a limited time without needing a // Google account or signing in. For more information about signed URLs, see // https://cloud.google.com/storage/docs/accesscontrol#signed_urls_query_string_authentication // If initializing a Storage Client, instead use the Bucket.SignedURL method // which uses the Client's credentials to handle authentication. func SignedURL(bucket, object string, opts *SignedURLOptions) (string, error) { now := utcNow() if err := validateOptions(opts, now); err != nil { return "", err } switch opts.Scheme { case SigningSchemeV2: opts.Headers = v2SanitizeHeaders(opts.Headers) return signedURLV2(bucket, object, opts) case SigningSchemeV4: opts.Headers = v4SanitizeHeaders(opts.Headers) return signedURLV4(bucket, object, opts, now) default: // SigningSchemeDefault opts.Headers = v2SanitizeHeaders(opts.Headers) return signedURLV2(bucket, object, opts) } } func validateOptions(opts *SignedURLOptions, now time.Time) error { if opts == nil { return errors.New("storage: missing required SignedURLOptions") } if opts.GoogleAccessID == "" { return errors.New("storage: missing required GoogleAccessID") } if (opts.PrivateKey == nil) == (opts.SignBytes == nil) { return errors.New("storage: exactly one of PrivateKey or SignedBytes must be set") } opts.Method = strings.ToUpper(opts.Method) if _, ok := signedURLMethods[opts.Method]; !ok { return errSignedURLMethodNotValid } if opts.Expires.IsZero() { return errors.New("storage: missing required expires option") } if opts.MD5 != "" { md5, err := base64.StdEncoding.DecodeString(opts.MD5) if err != nil || len(md5) != 16 { return errors.New("storage: invalid MD5 checksum") } } if opts.Style == nil { opts.Style = PathStyle() } if _, ok := opts.Style.(pathStyle); !ok && opts.Scheme == SigningSchemeV2 { return errors.New("storage: only path-style URLs are permitted with SigningSchemeV2") } if opts.Scheme == SigningSchemeV4 { cutoff := now.Add(604801 * time.Second) // 7 days + 1 second if !opts.Expires.Before(cutoff) { return errors.New("storage: expires must be within seven days from now") } } return nil } const ( iso8601 = "20060102T150405Z" yearMonthDay = "20060102" ) // utcNow returns the current time in UTC and is a variable to allow for // reassignment in tests to provide deterministic signed URL values. var utcNow = func() time.Time { return time.Now().UTC() } // extractHeaderNames takes in a series of key:value headers and returns the // header names only. func extractHeaderNames(kvs []string) []string { var res []string for _, header := range kvs { nameValue := strings.SplitN(header, ":", 2) res = append(res, nameValue[0]) } return res } // pathEncodeV4 creates an encoded string that matches the v4 signature spec. // Following the spec precisely is necessary in order to ensure that the URL // and signing string are correctly formed, and Go's url.PathEncode and // url.QueryEncode don't generate an exact match without some additional logic. func pathEncodeV4(path string) string { segments := strings.Split(path, "/") var encodedSegments []string for _, s := range segments { encodedSegments = append(encodedSegments, url.QueryEscape(s)) } encodedStr := strings.Join(encodedSegments, "/") encodedStr = strings.Replace(encodedStr, "+", "%20", -1) return encodedStr } // signedURLV4 creates a signed URL using the sigV4 algorithm. func signedURLV4(bucket, name string, opts *SignedURLOptions, now time.Time) (string, error) { buf := &bytes.Buffer{} fmt.Fprintf(buf, "%s\n", opts.Method) u := &url.URL{Path: opts.Style.path(bucket, name)} u.RawPath = pathEncodeV4(u.Path) // Note: we have to add a / here because GCS does so auto-magically, despite // our encoding not doing so (and we have to exactly match their // canonical query). fmt.Fprintf(buf, "/%s\n", u.RawPath) headerNames := append(extractHeaderNames(opts.Headers), "host") if opts.ContentType != "" { headerNames = append(headerNames, "content-type") } if opts.MD5 != "" { headerNames = append(headerNames, "content-md5") } sort.Strings(headerNames) signedHeaders := strings.Join(headerNames, ";") timestamp := now.Format(iso8601) credentialScope := fmt.Sprintf("%s/auto/storage/goog4_request", now.Format(yearMonthDay)) canonicalQueryString := url.Values{ "X-Goog-Algorithm": {"GOOG4-RSA-SHA256"}, "X-Goog-Credential": {fmt.Sprintf("%s/%s", opts.GoogleAccessID, credentialScope)}, "X-Goog-Date": {timestamp}, "X-Goog-Expires": {fmt.Sprintf("%d", int(opts.Expires.Sub(now).Seconds()))}, "X-Goog-SignedHeaders": {signedHeaders}, } // Add user-supplied query parameters to the canonical query string. For V4, // it's necessary to include these. for k, v := range opts.QueryParameters { canonicalQueryString[k] = append(canonicalQueryString[k], v...) } // url.Values.Encode escaping is correct, except that a space must be replaced // by `%20` rather than `+`. escapedQuery := strings.Replace(canonicalQueryString.Encode(), "+", "%20", -1) fmt.Fprintf(buf, "%s\n", escapedQuery) // Fill in the hostname based on the desired URL style. u.Host = opts.Style.host(opts.Hostname, bucket) // Fill in the URL scheme. if opts.Insecure { u.Scheme = "http" } else { u.Scheme = "https" } var headersWithValue []string headersWithValue = append(headersWithValue, "host:"+u.Hostname()) headersWithValue = append(headersWithValue, opts.Headers...) if opts.ContentType != "" { headersWithValue = append(headersWithValue, "content-type:"+opts.ContentType) } if opts.MD5 != "" { headersWithValue = append(headersWithValue, "content-md5:"+opts.MD5) } // Trim extra whitespace from headers and replace with a single space. var trimmedHeaders []string for _, h := range headersWithValue { trimmedHeaders = append(trimmedHeaders, strings.Join(strings.Fields(h), " ")) } canonicalHeaders := strings.Join(sortHeadersByKey(trimmedHeaders), "\n") fmt.Fprintf(buf, "%s\n\n", canonicalHeaders) fmt.Fprintf(buf, "%s\n", signedHeaders) // If the user provides a value for X-Goog-Content-SHA256, we must use // that value in the request string. If not, we use UNSIGNED-PAYLOAD. sha256Header := false for _, h := range trimmedHeaders { if strings.HasPrefix(strings.ToLower(h), "x-goog-content-sha256") && strings.Contains(h, ":") { sha256Header = true fmt.Fprintf(buf, "%s", strings.SplitN(h, ":", 2)[1]) break } } if !sha256Header { fmt.Fprint(buf, "UNSIGNED-PAYLOAD") } sum := sha256.Sum256(buf.Bytes()) hexDigest := hex.EncodeToString(sum[:]) signBuf := &bytes.Buffer{} fmt.Fprint(signBuf, "GOOG4-RSA-SHA256\n") fmt.Fprintf(signBuf, "%s\n", timestamp) fmt.Fprintf(signBuf, "%s\n", credentialScope) fmt.Fprintf(signBuf, "%s", hexDigest) signBytes := opts.SignBytes if opts.PrivateKey != nil { key, err := parseKey(opts.PrivateKey) if err != nil { return "", err } signBytes = func(b []byte) ([]byte, error) { sum := sha256.Sum256(b) return rsa.SignPKCS1v15( rand.Reader, key, crypto.SHA256, sum[:], ) } } b, err := signBytes(signBuf.Bytes()) if err != nil { return "", err } signature := hex.EncodeToString(b) canonicalQueryString.Set("X-Goog-Signature", string(signature)) u.RawQuery = canonicalQueryString.Encode() return u.String(), nil } // takes a list of headerKey:headervalue1,headervalue2,etc and sorts by header // key. func sortHeadersByKey(hdrs []string) []string { headersMap := map[string]string{} var headersKeys []string for _, h := range hdrs { parts := strings.SplitN(h, ":", 2) k := parts[0] v := parts[1] headersMap[k] = v headersKeys = append(headersKeys, k) } sort.Strings(headersKeys) var sorted []string for _, k := range headersKeys { v := headersMap[k] sorted = append(sorted, fmt.Sprintf("%s:%s", k, v)) } return sorted } func signedURLV2(bucket, name string, opts *SignedURLOptions) (string, error) { signBytes := opts.SignBytes if opts.PrivateKey != nil { key, err := parseKey(opts.PrivateKey) if err != nil { return "", err } signBytes = func(b []byte) ([]byte, error) { sum := sha256.Sum256(b) return rsa.SignPKCS1v15( rand.Reader, key, crypto.SHA256, sum[:], ) } } u := &url.URL{ Path: fmt.Sprintf("/%s/%s", bucket, name), } buf := &bytes.Buffer{} fmt.Fprintf(buf, "%s\n", opts.Method) fmt.Fprintf(buf, "%s\n", opts.MD5) fmt.Fprintf(buf, "%s\n", opts.ContentType) fmt.Fprintf(buf, "%d\n", opts.Expires.Unix()) if len(opts.Headers) > 0 { fmt.Fprintf(buf, "%s\n", strings.Join(opts.Headers, "\n")) } fmt.Fprintf(buf, "%s", u.String()) b, err := signBytes(buf.Bytes()) if err != nil { return "", err } encoded := base64.StdEncoding.EncodeToString(b) u.Scheme = "https" u.Host = PathStyle().host(opts.Hostname, bucket) q := u.Query() q.Set("GoogleAccessId", opts.GoogleAccessID) q.Set("Expires", fmt.Sprintf("%d", opts.Expires.Unix())) q.Set("Signature", string(encoded)) u.RawQuery = q.Encode() return u.String(), nil } // ReadHandle associated with the object. This is periodically refreshed. type ReadHandle []byte // ObjectHandle provides operations on an object in a Google Cloud Storage bucket. // Use BucketHandle.Object to get a handle. type ObjectHandle struct { c *Client bucket string object string acl ACLHandle gen int64 // a negative value indicates latest conds *Conditions encryptionKey []byte // AES-256 key userProject string // for requester-pays buckets readCompressed bool // Accept-Encoding: gzip retry *retryConfig overrideRetention *bool softDeleted bool readHandle ReadHandle } // ReadHandle returns a new ObjectHandle that uses the ReadHandle to open the objects. // // Objects that have already been opened can be opened an additional time, // using a read handle returned in the response, at lower latency. // This produces the exact same object and generation and does not check if // the generation is still the newest one. // Note that this will be a noop unless it's set on a gRPC client on buckets with // bi-directional read API access. // Also note that you can get a ReadHandle only via calling reader.ReadHandle() on a // previous read of the same object. func (o *ObjectHandle) ReadHandle(r ReadHandle) *ObjectHandle { o2 := *o o2.readHandle = r return &o2 } // ACL provides access to the object's access control list. // This controls who can read and write this object. // This call does not perform any network operations. func (o *ObjectHandle) ACL() *ACLHandle { return &o.acl } // Generation returns a new ObjectHandle that operates on a specific generation // of the object. // By default, the handle operates on the latest generation. Not // all operations work when given a specific generation; check the API // endpoints at https://cloud.google.com/storage/docs/json_api/ for details. func (o *ObjectHandle) Generation(gen int64) *ObjectHandle { o2 := *o o2.gen = gen return &o2 } // If returns a new ObjectHandle that applies a set of preconditions. // Preconditions already set on the ObjectHandle are ignored. The supplied // Conditions must have at least one field set to a non-default value; // otherwise an error will be returned from any operation on the ObjectHandle. // Operations on the new handle will return an error if the preconditions are not // satisfied. See https://cloud.google.com/storage/docs/generations-preconditions // for more details. func (o *ObjectHandle) If(conds Conditions) *ObjectHandle { o2 := *o o2.conds = &conds return &o2 } // Key returns a new ObjectHandle that uses the supplied encryption // key to encrypt and decrypt the object's contents. // // Encryption key must be a 32-byte AES-256 key. // See https://cloud.google.com/storage/docs/encryption for details. func (o *ObjectHandle) Key(encryptionKey []byte) *ObjectHandle { o2 := *o o2.encryptionKey = encryptionKey return &o2 } // Attrs returns meta information about the object. // ErrObjectNotExist will be returned if the object is not found. func (o *ObjectHandle) Attrs(ctx context.Context) (attrs *ObjectAttrs, err error) { ctx, _ = startSpan(ctx, "Object.Attrs") defer func() { endSpan(ctx, err) }() if err := o.validate(); err != nil { return nil, err } opts := makeStorageOpts(true, o.retry, o.userProject) return o.c.tc.GetObject(ctx, &getObjectParams{o.bucket, o.object, o.gen, o.encryptionKey, o.conds, o.softDeleted}, opts...) } // Update updates an object with the provided attributes. See // ObjectAttrsToUpdate docs for details on treatment of zero values. // ErrObjectNotExist will be returned if the object is not found. func (o *ObjectHandle) Update(ctx context.Context, uattrs ObjectAttrsToUpdate) (oa *ObjectAttrs, err error) { ctx, _ = startSpan(ctx, "Object.Update") defer func() { endSpan(ctx, err) }() if err := o.validate(); err != nil { return nil, err } isIdempotent := o.conds != nil && o.conds.MetagenerationMatch != 0 opts := makeStorageOpts(isIdempotent, o.retry, o.userProject) return o.c.tc.UpdateObject(ctx, &updateObjectParams{ bucket: o.bucket, object: o.object, uattrs: &uattrs, gen: o.gen, encryptionKey: o.encryptionKey, conds: o.conds, overrideRetention: o.overrideRetention, }, opts...) } // BucketName returns the name of the bucket. func (o *ObjectHandle) BucketName() string { return o.bucket } // ObjectName returns the name of the object. func (o *ObjectHandle) ObjectName() string { return o.object } // ObjectAttrsToUpdate is used to update the attributes of an object. // Only fields set to non-nil values will be updated. // For all fields except CustomTime and Retention, set the field to its zero // value to delete it. CustomTime cannot be deleted or changed to an earlier // time once set. Retention can be deleted (only if the Mode is Unlocked) by // setting it to an empty value (not nil). // // For example, to change ContentType and delete ContentEncoding, Metadata and // Retention, use: // // ObjectAttrsToUpdate{ // ContentType: "text/html", // ContentEncoding: "", // Metadata: map[string]string{}, // Retention: &ObjectRetention{}, // } type ObjectAttrsToUpdate struct { EventBasedHold optional.Bool TemporaryHold optional.Bool ContentType optional.String ContentLanguage optional.String ContentEncoding optional.String ContentDisposition optional.String CacheControl optional.String CustomTime time.Time // Cannot be deleted or backdated from its current value. Metadata map[string]string // Set to map[string]string{} to delete. ACL []ACLRule // If not empty, applies a predefined set of access controls. ACL must be nil. // See https://cloud.google.com/storage/docs/json_api/v1/objects/patch. PredefinedACL string // Retention contains the retention configuration for this object. // Operations other than setting the retention for the first time or // extending the RetainUntil time on the object retention must be done // on an ObjectHandle with OverrideUnlockedRetention set to true. Retention *ObjectRetention } // Delete deletes the single specified object. func (o *ObjectHandle) Delete(ctx context.Context) (err error) { ctx, _ = startSpan(ctx, "Object.Delete") defer func() { endSpan(ctx, err) }() if err := o.validate(); err != nil { return err } // Delete is idempotent if GenerationMatch or Generation have been passed in. // The default generation is negative to get the latest version of the object. isIdempotent := (o.conds != nil && o.conds.GenerationMatch != 0) || o.gen >= 0 opts := makeStorageOpts(isIdempotent, o.retry, o.userProject) return o.c.tc.DeleteObject(ctx, o.bucket, o.object, o.gen, o.conds, opts...) } // ReadCompressed when true causes the read to happen without decompressing. func (o *ObjectHandle) ReadCompressed(compressed bool) *ObjectHandle { o2 := *o o2.readCompressed = compressed return &o2 } // OverrideUnlockedRetention provides an option for overriding an Unlocked // Retention policy. This must be set to true in order to change a policy // from Unlocked to Locked, to set it to null, or to reduce its // RetainUntil attribute. It is not required for setting the ObjectRetention for // the first time nor for extending the RetainUntil time. func (o *ObjectHandle) OverrideUnlockedRetention(override bool) *ObjectHandle { o2 := *o o2.overrideRetention = &override return &o2 } // SoftDeleted returns an object handle that can be used to get an object that // has been soft deleted. To get a soft deleted object, the generation must be // set on the object using ObjectHandle.Generation. // Note that an error will be returned if a live object is queried using this. func (o *ObjectHandle) SoftDeleted() *ObjectHandle { o2 := *o o2.softDeleted = true return &o2 } // RestoreOptions allows you to set options when restoring an object. type RestoreOptions struct { /// CopySourceACL indicates whether the restored object should copy the // access controls of the source object. Only valid for buckets with // fine-grained access. If uniform bucket-level access is enabled, setting // CopySourceACL will cause an error. CopySourceACL bool } // Restore will restore a soft-deleted object to a live object. // Note that you must specify a generation to use this method. func (o *ObjectHandle) Restore(ctx context.Context, opts *RestoreOptions) (*ObjectAttrs, error) { if err := o.validate(); err != nil { return nil, err } // Since the generation is required by restore calls, we set the default to // 0 instead of a negative value, which returns a more descriptive error. gen := o.gen if o.gen == defaultGen { gen = 0 } // Restore is always idempotent because Generation is a required param. sOpts := makeStorageOpts(true, o.retry, o.userProject) return o.c.tc.RestoreObject(ctx, &restoreObjectParams{ bucket: o.bucket, object: o.object, gen: gen, conds: o.conds, copySourceACL: opts.CopySourceACL, }, sOpts...) } // Move changes the name of the object to the destination name. // It can only be used to rename an object within the same bucket. The // bucket must have [HierarchicalNamespace] enabled to use this method. // // Any preconditions set on the ObjectHandle will be applied for the source // object. Set preconditions on the destination object using // [MoveObjectDestination.Conditions]. // // This API is in preview and is not yet publicly available. func (o *ObjectHandle) Move(ctx context.Context, destination MoveObjectDestination) (*ObjectAttrs, error) { if err := o.validate(); err != nil { return nil, err } sOpts := makeStorageOpts(true, o.retry, o.userProject) return o.c.tc.MoveObject(ctx, &moveObjectParams{ bucket: o.bucket, srcObject: o.object, dstObject: destination.Object, srcConds: o.conds, dstConds: destination.Conditions, encryptionKey: o.encryptionKey, }, sOpts...) } // MoveObjectDestination provides the destination object name and (optional) preconditions // for [ObjectHandle.Move]. type MoveObjectDestination struct { Object string Conditions *Conditions } // NewWriter returns a storage Writer that writes to the GCS object // associated with this ObjectHandle. // // A new object will be created unless an object with this name already exists. // Otherwise any previous object with the same name will be replaced. // The object will not be available (and any previous object will remain) // until Close has been called. // // Attributes can be set on the object by modifying the returned Writer's // ObjectAttrs field before the first call to Write. If no ContentType // attribute is specified, the content type will be automatically sniffed // using net/http.DetectContentType. // // Note that each Writer allocates an internal buffer of size Writer.ChunkSize. // See the ChunkSize docs for more information. // // It is the caller's responsibility to call Close when writing is done. To // stop writing without saving the data, cancel the context. func (o *ObjectHandle) NewWriter(ctx context.Context) *Writer { ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Writer") return &Writer{ ctx: ctx, o: o, donec: make(chan struct{}), ObjectAttrs: ObjectAttrs{Name: o.object}, ChunkSize: googleapi.DefaultUploadChunkSize, Append: o.c.grpcAppendableUploads, } } // NewWriterFromAppendableObject opens a new Writer to an object which has been // partially flushed to GCS, but not finalized. It returns the Writer as well // as the current end offset of the object. All bytes written will be appended // continuing from the offset. // // Generation must be set on the ObjectHandle or an error will be returned. // // Writer fields such as ChunkSize or ChunkRetryDuration can be set only // by setting the equivalent field in [AppendableWriterOpts]. Attributes set // on the returned Writer will not be honored since the stream to GCS has // already been opened. Some fields such as ObjectAttrs and checksums cannot // be set on a takeover for append. // // It is the caller's responsibility to call Close when writing is complete to // close the stream. // Calling Close or Flush is necessary to sync any data in the pipe to GCS. // // The returned Writer is not safe to use across multiple go routines. In // addition, if you attempt to append to the same object from multiple // Writers at the same time, an error will be returned on Flush or Close. // // NewWriterFromAppendableObject is supported only for gRPC clients and only for // objects which were created append semantics and not finalized. // This feature is in preview and is not yet available for general use. func (o *ObjectHandle) NewWriterFromAppendableObject(ctx context.Context, opts *AppendableWriterOpts) (*Writer, int64, error) { ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Writer") if o.gen < 0 { return nil, 0, errors.New("storage: ObjectHandle.Generation must be set to use NewWriterFromAppendableObject") } w := &Writer{ ctx: ctx, o: o, donec: make(chan struct{}), ObjectAttrs: ObjectAttrs{Name: o.object}, Append: true, } opts.apply(w) if w.ChunkSize == 0 { w.ChunkSize = googleapi.DefaultUploadChunkSize } err := w.openWriter() if err != nil { return nil, 0, err } return w, w.takeoverOffset, nil } // AppendableWriterOpts provides options to set on a Writer initialized // by [NewWriterFromAppendableObject]. Writer options must be set via this // struct rather than being modified on the returned Writer. All Writer // fields not present in this struct cannot be set when taking over an // appendable object. // // AppendableWriterOpts is supported only for gRPC clients and only for // objects which were created append semantics and not finalized. // This feature is in preview and is not yet available for general use. type AppendableWriterOpts struct { // ChunkSize: See Writer.ChunkSize. ChunkSize int // ChunkRetryDeadline: See Writer.ChunkRetryDeadline. ChunkRetryDeadline time.Duration // ProgressFunc: See Writer.ProgressFunc. ProgressFunc func(int64) // FinalizeOnClose: See Writer.FinalizeOnClose. FinalizeOnClose bool } func (opts *AppendableWriterOpts) apply(w *Writer) { if opts == nil { return } w.ChunkRetryDeadline = opts.ChunkRetryDeadline w.ProgressFunc = opts.ProgressFunc w.ChunkSize = opts.ChunkSize w.FinalizeOnClose = opts.FinalizeOnClose } func (o *ObjectHandle) validate() error { if o.bucket == "" { return errors.New("storage: bucket name is empty") } if o.object == "" { return errors.New("storage: object name is empty") } if !utf8.ValidString(o.object) { return fmt.Errorf("storage: object name %q is not valid UTF-8", o.object) } // Names . and .. are not valid; see https://cloud.google.com/storage/docs/objects#naming if o.object == "." || o.object == ".." { return fmt.Errorf("storage: object name %q is not valid", o.object) } return nil } // parseKey converts the binary contents of a private key file to an // *rsa.PrivateKey. It detects whether the private key is in a PEM container or // not. If so, it extracts the private key from PEM container before // conversion. It only supports PEM containers with no passphrase. func parseKey(key []byte) (*rsa.PrivateKey, error) { if block, _ := pem.Decode(key); block != nil { key = block.Bytes } parsedKey, err := x509.ParsePKCS8PrivateKey(key) if err != nil { parsedKey, err = x509.ParsePKCS1PrivateKey(key) if err != nil { return nil, err } } parsed, ok := parsedKey.(*rsa.PrivateKey) if !ok { return nil, errors.New("oauth2: private key is invalid") } return parsed, nil } // toRawObject copies the editable attributes from o to the raw library's Object type. func (o *ObjectAttrs) toRawObject(bucket string) *raw.Object { var ret string if !o.RetentionExpirationTime.IsZero() { ret = o.RetentionExpirationTime.Format(time.RFC3339) } var ct string if !o.CustomTime.IsZero() { ct = o.CustomTime.Format(time.RFC3339) } return &raw.Object{ Bucket: bucket, Name: o.Name, EventBasedHold: o.EventBasedHold, TemporaryHold: o.TemporaryHold, RetentionExpirationTime: ret, ContentType: o.ContentType, ContentEncoding: o.ContentEncoding, ContentLanguage: o.ContentLanguage, CacheControl: o.CacheControl, ContentDisposition: o.ContentDisposition, StorageClass: o.StorageClass, Acl: toRawObjectACL(o.ACL), Metadata: o.Metadata, CustomTime: ct, Retention: o.Retention.toRawObjectRetention(), } } // toProtoObject copies the editable attributes from o to the proto library's Object type. func (o *ObjectAttrs) toProtoObject(b string) *storagepb.Object { // For now, there are only globally unique buckets, and "_" is the alias // project ID for such buckets. If the bucket is not provided, like in the // destination ObjectAttrs of a Copy, do not attempt to format it. if b != "" { b = bucketResourceName(globalProjectAlias, b) } return &storagepb.Object{ Bucket: b, Name: o.Name, EventBasedHold: proto.Bool(o.EventBasedHold), TemporaryHold: o.TemporaryHold, ContentType: o.ContentType, ContentEncoding: o.ContentEncoding, ContentLanguage: o.ContentLanguage, CacheControl: o.CacheControl, ContentDisposition: o.ContentDisposition, StorageClass: o.StorageClass, Acl: toProtoObjectACL(o.ACL), Metadata: o.Metadata, CreateTime: toProtoTimestamp(o.Created), FinalizeTime: toProtoTimestamp(o.Finalized), CustomTime: toProtoTimestamp(o.CustomTime), DeleteTime: toProtoTimestamp(o.Deleted), RetentionExpireTime: toProtoTimestamp(o.RetentionExpirationTime), UpdateTime: toProtoTimestamp(o.Updated), KmsKey: o.KMSKeyName, Generation: o.Generation, Size: o.Size, } } // toProtoObject copies the attributes to update from uattrs to the proto library's Object type. func (uattrs *ObjectAttrsToUpdate) toProtoObject(bucket, object string) *storagepb.Object { o := &storagepb.Object{ Name: object, Bucket: bucket, } if uattrs == nil { return o } if uattrs.EventBasedHold != nil { o.EventBasedHold = proto.Bool(optional.ToBool(uattrs.EventBasedHold)) } if uattrs.TemporaryHold != nil { o.TemporaryHold = optional.ToBool(uattrs.TemporaryHold) } if uattrs.ContentType != nil { o.ContentType = optional.ToString(uattrs.ContentType) } if uattrs.ContentLanguage != nil { o.ContentLanguage = optional.ToString(uattrs.ContentLanguage) } if uattrs.ContentEncoding != nil { o.ContentEncoding = optional.ToString(uattrs.ContentEncoding) } if uattrs.ContentDisposition != nil { o.ContentDisposition = optional.ToString(uattrs.ContentDisposition) } if uattrs.CacheControl != nil { o.CacheControl = optional.ToString(uattrs.CacheControl) } if !uattrs.CustomTime.IsZero() { o.CustomTime = toProtoTimestamp(uattrs.CustomTime) } if uattrs.ACL != nil { o.Acl = toProtoObjectACL(uattrs.ACL) } o.Metadata = uattrs.Metadata return o } // ObjectAttrs represents the metadata for a Google Cloud Storage (GCS) object. type ObjectAttrs struct { // Bucket is the name of the bucket containing this GCS object. // This field is read-only. Bucket string // Name is the name of the object within the bucket. // This field is read-only. Name string // ContentType is the MIME type of the object's content. ContentType string // ContentLanguage is the content language of the object's content. ContentLanguage string // CacheControl is the Cache-Control header to be sent in the response // headers when serving the object data. CacheControl string // EventBasedHold specifies whether an object is under event-based hold. New // objects created in a bucket whose DefaultEventBasedHold is set will // default to that value. EventBasedHold bool // TemporaryHold specifies whether an object is under temporary hold. While // this flag is set to true, the object is protected against deletion and // overwrites. TemporaryHold bool // RetentionExpirationTime is a server-determined value that specifies the // earliest time that the object's retention period expires. // This is a read-only field. RetentionExpirationTime time.Time // ACL is the list of access control rules for the object. ACL []ACLRule // If not empty, applies a predefined set of access controls. It should be set // only when writing, copying or composing an object. When copying or composing, // it acts as the destinationPredefinedAcl parameter. // PredefinedACL is always empty for ObjectAttrs returned from the service. // See https://cloud.google.com/storage/docs/json_api/v1/objects/insert // for valid values. PredefinedACL string // Owner is the owner of the object. This field is read-only. // // If non-zero, it is in the form of "user-". Owner string // Size is the length of the object's content. This field is read-only. Size int64 // ContentEncoding is the encoding of the object's content. ContentEncoding string // ContentDisposition is the optional Content-Disposition header of the object // sent in the response headers. ContentDisposition string // MD5 is the MD5 hash of the object's content. This field is read-only, // except when used from a Writer. If set on a Writer, the uploaded // data is rejected if its MD5 hash does not match this field. MD5 []byte // CRC32C is the CRC32 checksum of the object's content using the Castagnoli93 // polynomial. This field is read-only, except when used from a Writer or // Composer. In those cases, if the SendCRC32C field in the Writer or Composer // is set to is true, the uploaded data is rejected if its CRC32C hash does // not match this field. // // Note: For a Writer, SendCRC32C must be set to true BEFORE the first call to // Writer.Write() in order to send the checksum. CRC32C uint32 // MediaLink is an URL to the object's content. This field is read-only. MediaLink string // Metadata represents user-provided metadata, in key/value pairs. // It can be nil if no metadata is provided. // // For object downloads using Reader, metadata keys are sent as headers. // Therefore, avoid setting metadata keys using characters that are not valid // for headers. See https://www.rfc-editor.org/rfc/rfc7230#section-3.2.6. Metadata map[string]string // Generation is the generation number of the object's content. // This field is read-only. Generation int64 // Metageneration is the version of the metadata for this // object at this generation. This field is used for preconditions // and for detecting changes in metadata. A metageneration number // is only meaningful in the context of a particular generation // of a particular object. This field is read-only. Metageneration int64 // StorageClass is the storage class of the object. This defines // how objects are stored and determines the SLA and the cost of storage. // Typical values are "STANDARD", "NEARLINE", "COLDLINE" and "ARCHIVE". // Defaults to "STANDARD". // See https://cloud.google.com/storage/docs/storage-classes for all // valid values. StorageClass string // Created is the time the object was created. This field is read-only. Created time.Time // Finalized is the time the object contents were finalized. This may differ // from Created for appendable objects. This field is read-only. Finalized time.Time // Deleted is the time the object was deleted. // If not deleted, it is the zero value. This field is read-only. Deleted time.Time // Updated is the creation or modification time of the object. // For buckets with versioning enabled, changing an object's // metadata does not change this property. This field is read-only. Updated time.Time // CustomerKeySHA256 is the base64-encoded SHA-256 hash of the // customer-supplied encryption key for the object. It is empty if there is // no customer-supplied encryption key. // See // https://cloud.google.com/storage/docs/encryption for more about // encryption in Google Cloud Storage. CustomerKeySHA256 string // Cloud KMS key name, in the form // projects/P/locations/L/keyRings/R/cryptoKeys/K, used to encrypt this object, // if the object is encrypted by such a key. // // Providing both a KMSKeyName and a customer-supplied encryption key (via // ObjectHandle.Key) will result in an error when writing an object. KMSKeyName string // Prefix is set only for ObjectAttrs which represent synthetic "directory // entries" when iterating over buckets using Query.Delimiter. See // ObjectIterator.Next. When set, no other fields in ObjectAttrs will be // populated. Prefix string // Etag is the HTTP/1.1 Entity tag for the object. // This field is read-only. Etag string // A user-specified timestamp which can be applied to an object. This is // typically set in order to use the CustomTimeBefore and DaysSinceCustomTime // LifecycleConditions to manage object lifecycles. // // CustomTime cannot be removed once set on an object. It can be updated to a // later value but not to an earlier one. For more information see // https://cloud.google.com/storage/docs/metadata#custom-time . CustomTime time.Time // ComponentCount is the number of objects contained within a composite object. // For non-composite objects, the value will be zero. // This field is read-only. ComponentCount int64 // Retention contains the retention configuration for this object. // ObjectRetention cannot be configured or reported through the gRPC API. Retention *ObjectRetention // SoftDeleteTime is the time when the object became soft-deleted. // Soft-deleted objects are only accessible on an object handle returned by // ObjectHandle.SoftDeleted; if ObjectHandle.SoftDeleted has not been set, // ObjectHandle.Attrs will return ErrObjectNotExist if the object is soft-deleted. // This field is read-only. SoftDeleteTime time.Time // HardDeleteTime is the time when the object will be permanently deleted. // Only set when an object becomes soft-deleted with a soft delete policy. // Soft-deleted objects are only accessible on an object handle returned by // ObjectHandle.SoftDeleted; if ObjectHandle.SoftDeleted has not been set, // ObjectHandle.Attrs will return ErrObjectNotExist if the object is soft-deleted. // This field is read-only. HardDeleteTime time.Time } // ObjectRetention contains the retention configuration for this object. type ObjectRetention struct { // Mode is the retention policy's mode on this object. Valid values are // "Locked" and "Unlocked". // Locked retention policies cannot be changed. Unlocked policies require an // override to change. Mode string // RetainUntil is the time this object will be retained until. RetainUntil time.Time } func (r *ObjectRetention) toRawObjectRetention() *raw.ObjectRetention { if r == nil { return nil } return &raw.ObjectRetention{ Mode: r.Mode, RetainUntilTime: r.RetainUntil.Format(time.RFC3339), } } func toObjectRetention(r *raw.ObjectRetention) *ObjectRetention { if r == nil { return nil } return &ObjectRetention{ Mode: r.Mode, RetainUntil: convertTime(r.RetainUntilTime), } } // convertTime converts a time in RFC3339 format to time.Time. // If any error occurs in parsing, the zero-value time.Time is silently returned. func convertTime(t string) time.Time { var r time.Time if t != "" { r, _ = time.Parse(time.RFC3339, t) } return r } func convertProtoTime(t *timestamppb.Timestamp) time.Time { var r time.Time if t != nil { r = t.AsTime() } return r } func toProtoTimestamp(t time.Time) *timestamppb.Timestamp { if t.IsZero() { return nil } return timestamppb.New(t) } func newObject(o *raw.Object) *ObjectAttrs { if o == nil { return nil } owner := "" if o.Owner != nil { owner = o.Owner.Entity } md5, _ := base64.StdEncoding.DecodeString(o.Md5Hash) crc32c, _ := decodeUint32(o.Crc32c) var sha256 string if o.CustomerEncryption != nil { sha256 = o.CustomerEncryption.KeySha256 } return &ObjectAttrs{ Bucket: o.Bucket, Name: o.Name, ContentType: o.ContentType, ContentLanguage: o.ContentLanguage, CacheControl: o.CacheControl, EventBasedHold: o.EventBasedHold, TemporaryHold: o.TemporaryHold, RetentionExpirationTime: convertTime(o.RetentionExpirationTime), ACL: toObjectACLRules(o.Acl), Owner: owner, ContentEncoding: o.ContentEncoding, ContentDisposition: o.ContentDisposition, Size: int64(o.Size), MD5: md5, CRC32C: crc32c, MediaLink: o.MediaLink, Metadata: o.Metadata, Generation: o.Generation, Metageneration: o.Metageneration, StorageClass: o.StorageClass, CustomerKeySHA256: sha256, KMSKeyName: o.KmsKeyName, Created: convertTime(o.TimeCreated), Finalized: convertTime(o.TimeFinalized), Deleted: convertTime(o.TimeDeleted), Updated: convertTime(o.Updated), Etag: o.Etag, CustomTime: convertTime(o.CustomTime), ComponentCount: o.ComponentCount, Retention: toObjectRetention(o.Retention), SoftDeleteTime: convertTime(o.SoftDeleteTime), HardDeleteTime: convertTime(o.HardDeleteTime), } } func newObjectFromProto(o *storagepb.Object) *ObjectAttrs { if o == nil { return nil } return &ObjectAttrs{ Bucket: parseBucketName(o.Bucket), Name: o.Name, ContentType: o.ContentType, ContentLanguage: o.ContentLanguage, CacheControl: o.CacheControl, EventBasedHold: o.GetEventBasedHold(), TemporaryHold: o.TemporaryHold, RetentionExpirationTime: convertProtoTime(o.GetRetentionExpireTime()), ACL: toObjectACLRulesFromProto(o.GetAcl()), Owner: o.GetOwner().GetEntity(), ContentEncoding: o.ContentEncoding, ContentDisposition: o.ContentDisposition, Size: int64(o.Size), MD5: o.GetChecksums().GetMd5Hash(), CRC32C: o.GetChecksums().GetCrc32C(), Metadata: o.Metadata, Generation: o.Generation, Metageneration: o.Metageneration, StorageClass: o.StorageClass, // CustomerKeySHA256 needs to be presented as base64 encoded, but the response from gRPC is not. CustomerKeySHA256: base64.StdEncoding.EncodeToString(o.GetCustomerEncryption().GetKeySha256Bytes()), KMSKeyName: o.GetKmsKey(), Created: convertProtoTime(o.GetCreateTime()), Finalized: convertProtoTime(o.GetFinalizeTime()), Deleted: convertProtoTime(o.GetDeleteTime()), Updated: convertProtoTime(o.GetUpdateTime()), CustomTime: convertProtoTime(o.GetCustomTime()), ComponentCount: int64(o.ComponentCount), SoftDeleteTime: convertProtoTime(o.GetSoftDeleteTime()), HardDeleteTime: convertProtoTime(o.GetHardDeleteTime()), } } // Decode a uint32 encoded in Base64 in big-endian byte order. func decodeUint32(b64 string) (uint32, error) { d, err := base64.StdEncoding.DecodeString(b64) if err != nil { return 0, err } if len(d) != 4 { return 0, fmt.Errorf("storage: %q does not encode a 32-bit value", d) } return uint32(d[0])<<24 + uint32(d[1])<<16 + uint32(d[2])<<8 + uint32(d[3]), nil } // Encode a uint32 as Base64 in big-endian byte order. func encodeUint32(u uint32) string { b := []byte{byte(u >> 24), byte(u >> 16), byte(u >> 8), byte(u)} return base64.StdEncoding.EncodeToString(b) } // Projection is enumerated type for Query.Projection. type Projection int const ( // ProjectionDefault returns all fields of objects. ProjectionDefault Projection = iota // ProjectionFull returns all fields of objects. ProjectionFull // ProjectionNoACL returns all fields of objects except for Owner and ACL. ProjectionNoACL ) func (p Projection) String() string { switch p { case ProjectionFull: return "full" case ProjectionNoACL: return "noAcl" default: return "" } } // Query represents a query to filter objects from a bucket. type Query struct { // Delimiter returns results in a directory-like fashion. // Results will contain only objects whose names, aside from the // prefix, do not contain delimiter. Objects whose names, // aside from the prefix, contain delimiter will have their name, // truncated after the delimiter, returned in prefixes. // Duplicate prefixes are omitted. // Must be set to / when used with the MatchGlob parameter to filter results // in a directory-like mode. // Optional. Delimiter string // Prefix is the prefix filter to query objects // whose names begin with this prefix. // Optional. Prefix string // Versions indicates whether multiple versions of the same // object will be included in the results. Versions bool // attrSelection is used to select only specific fields to be returned by // the query. It is set by the user calling SetAttrSelection. These // are used by toFieldMask and toFieldSelection for gRPC and HTTP/JSON // clients respectively. attrSelection []string // StartOffset is used to filter results to objects whose names are // lexicographically equal to or after startOffset. If endOffset is also set, // the objects listed will have names between startOffset (inclusive) and // endOffset (exclusive). StartOffset string // EndOffset is used to filter results to objects whose names are // lexicographically before endOffset. If startOffset is also set, the objects // listed will have names between startOffset (inclusive) and endOffset (exclusive). EndOffset string // Projection defines the set of properties to return. It will default to ProjectionFull, // which returns all properties. Passing ProjectionNoACL will omit Owner and ACL, // which may improve performance when listing many objects. Projection Projection // IncludeTrailingDelimiter controls how objects which end in a single // instance of Delimiter (for example, if Query.Delimiter = "/" and the // object name is "foo/bar/") are included in the results. By default, these // objects only show up as prefixes. If IncludeTrailingDelimiter is set to // true, they will also be included as objects and their metadata will be // populated in the returned ObjectAttrs. IncludeTrailingDelimiter bool // MatchGlob is a glob pattern used to filter results (for example, foo*bar). See // https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-object-glob // for syntax details. When Delimiter is set in conjunction with MatchGlob, // it must be set to /. MatchGlob string // IncludeFoldersAsPrefixes includes Folders and Managed Folders in the set of // prefixes returned by the query. Only applicable if Delimiter is set to /. IncludeFoldersAsPrefixes bool // SoftDeleted indicates whether to list soft-deleted objects. // If true, only objects that have been soft-deleted will be listed. // By default, soft-deleted objects are not listed. SoftDeleted bool } // attrToFieldMap maps the field names of ObjectAttrs to the underlying field // names in the API call. Only the ObjectAttrs field names are visible to users // because they are already part of the public API of the package. var attrToFieldMap = map[string]string{ "Bucket": "bucket", "Name": "name", "ContentType": "contentType", "ContentLanguage": "contentLanguage", "CacheControl": "cacheControl", "EventBasedHold": "eventBasedHold", "TemporaryHold": "temporaryHold", "RetentionExpirationTime": "retentionExpirationTime", "ACL": "acl", "Owner": "owner", "ContentEncoding": "contentEncoding", "ContentDisposition": "contentDisposition", "Size": "size", "MD5": "md5Hash", "CRC32C": "crc32c", "MediaLink": "mediaLink", "Metadata": "metadata", "Generation": "generation", "Metageneration": "metageneration", "StorageClass": "storageClass", "CustomerKeySHA256": "customerEncryption", "KMSKeyName": "kmsKeyName", "Created": "timeCreated", "Finalized": "timeFinalized", "Deleted": "timeDeleted", "Updated": "updated", "Etag": "etag", "CustomTime": "customTime", "ComponentCount": "componentCount", "Retention": "retention", "HardDeleteTime": "hardDeleteTime", "SoftDeleteTime": "softDeleteTime", } // attrToProtoFieldMap maps the field names of ObjectAttrs to the underlying field // names in the protobuf Object message. var attrToProtoFieldMap = map[string]string{ "Name": "name", "Bucket": "bucket", "Etag": "etag", "Generation": "generation", "Metageneration": "metageneration", "StorageClass": "storage_class", "Size": "size", "ContentEncoding": "content_encoding", "ContentDisposition": "content_disposition", "CacheControl": "cache_control", "ACL": "acl", "ContentLanguage": "content_language", "Deleted": "delete_time", "ContentType": "content_type", "Created": "create_time", "Finalized": "finalize_time", "CRC32C": "checksums.crc32c", "MD5": "checksums.md5_hash", "Updated": "update_time", "KMSKeyName": "kms_key", "TemporaryHold": "temporary_hold", "RetentionExpirationTime": "retention_expire_time", "Metadata": "metadata", "EventBasedHold": "event_based_hold", "Owner": "owner", "CustomerKeySHA256": "customer_encryption", "CustomTime": "custom_time", "ComponentCount": "component_count", "HardDeleteTime": "hard_delete_time", "SoftDeleteTime": "soft_delete_time", // MediaLink was explicitly excluded from the proto as it is an HTTP-ism. // "MediaLink": "mediaLink", // TODO: add object retention - b/308194853 } // SetAttrSelection makes the query populate only specific attributes of // objects. When iterating over objects, if you only need each object's name // and size, pass []string{"Name", "Size"} to this method. Only these fields // will be fetched for each object across the network; the other fields of // ObjectAttr will remain at their default values. This is a performance // optimization; for more information, see // https://cloud.google.com/storage/docs/json_api/v1/how-tos/performance func (q *Query) SetAttrSelection(attrs []string) error { // Validate selections. for _, attr := range attrs { // If the attr is acceptable for one of the two sets, then it is OK. // If it is not acceptable for either, then return an error. // The respective masking implementations ignore unknown attrs which // makes switching between transports a little easier. _, okJSON := attrToFieldMap[attr] _, okGRPC := attrToProtoFieldMap[attr] if !okJSON && !okGRPC { return fmt.Errorf("storage: attr %v is not valid", attr) } } q.attrSelection = attrs return nil } func (q *Query) toFieldSelection() string { if q == nil || len(q.attrSelection) == 0 { return "" } fieldSet := make(map[string]bool) for _, attr := range q.attrSelection { field, ok := attrToFieldMap[attr] if !ok { // Future proofing, skip unknown fields, let SetAttrSelection handle // error modes. continue } fieldSet[field] = true } var s string if len(fieldSet) > 0 { var b bytes.Buffer b.WriteString("prefixes,items(") first := true for field := range fieldSet { if !first { b.WriteString(",") } first = false b.WriteString(field) } b.WriteString(")") s = b.String() } return s } func (q *Query) toFieldMask() *fieldmaskpb.FieldMask { // The default behavior with no Query is ProjectionDefault (i.e. ProjectionFull). if q == nil { return &fieldmaskpb.FieldMask{Paths: []string{"*"}} } // User selected attributes via q.SetAttrSeleciton. This takes precedence // over the Projection. if numSelected := len(q.attrSelection); numSelected > 0 { protoFieldPaths := make([]string, 0, numSelected) for _, attr := range q.attrSelection { pf, ok := attrToProtoFieldMap[attr] if !ok { // Future proofing, skip unknown fields, let SetAttrSelection // handle error modes. continue } protoFieldPaths = append(protoFieldPaths, pf) } return &fieldmaskpb.FieldMask{Paths: protoFieldPaths} } // ProjectDefault == ProjectionFull which means all fields. fm := &fieldmaskpb.FieldMask{Paths: []string{"*"}} if q.Projection == ProjectionNoACL { paths := make([]string, 0, len(attrToProtoFieldMap)-2) // omitting two fields for _, f := range attrToProtoFieldMap { // Skip the acl and owner fields for "NoACL". if f == "acl" || f == "owner" { continue } paths = append(paths, f) } fm.Paths = paths } return fm } // Conditions constrain methods to act on specific generations of // objects. // // The zero value is an empty set of constraints. Not all conditions or // combinations of conditions are applicable to all methods. // See https://cloud.google.com/storage/docs/generations-preconditions // for details on how these operate. type Conditions struct { // Generation constraints. // At most one of the following can be set to a non-zero value. // GenerationMatch specifies that the object must have the given generation // for the operation to occur. // If GenerationMatch is zero, it has no effect. // Use DoesNotExist to specify that the object does not exist in the bucket. GenerationMatch int64 // GenerationNotMatch specifies that the object must not have the given // generation for the operation to occur. // If GenerationNotMatch is zero, it has no effect. // This condition only works for object reads if the WithJSONReads client // option is set. GenerationNotMatch int64 // DoesNotExist specifies that the object must not exist in the bucket for // the operation to occur. // If DoesNotExist is false, it has no effect. DoesNotExist bool // Metadata generation constraints. // At most one of the following can be set to a non-zero value. // MetagenerationMatch specifies that the object must have the given // metageneration for the operation to occur. // If MetagenerationMatch is zero, it has no effect. MetagenerationMatch int64 // MetagenerationNotMatch specifies that the object must not have the given // metageneration for the operation to occur. // If MetagenerationNotMatch is zero, it has no effect. // This condition only works for object reads if the WithJSONReads client // option is set. MetagenerationNotMatch int64 } func (c *Conditions) validate(method string) error { if *c == (Conditions{}) { return fmt.Errorf("storage: %s: empty conditions", method) } if !c.isGenerationValid() { return fmt.Errorf("storage: %s: multiple conditions specified for generation", method) } if !c.isMetagenerationValid() { return fmt.Errorf("storage: %s: multiple conditions specified for metageneration", method) } return nil } func (c *Conditions) isGenerationValid() bool { n := 0 if c.GenerationMatch != 0 { n++ } if c.GenerationNotMatch != 0 { n++ } if c.DoesNotExist { n++ } return n <= 1 } func (c *Conditions) isMetagenerationValid() bool { return c.MetagenerationMatch == 0 || c.MetagenerationNotMatch == 0 } // applyConds modifies the provided call using the conditions in conds. // call is something that quacks like a *raw.WhateverCall. func applyConds(method string, gen int64, conds *Conditions, call interface{}) error { cval := reflect.ValueOf(call) if gen >= 0 { if !setGeneration(cval, gen) { return fmt.Errorf("storage: %s: generation not supported", method) } } if conds == nil { return nil } if err := conds.validate(method); err != nil { return err } switch { case conds.GenerationMatch != 0: if !setIfGenerationMatch(cval, conds.GenerationMatch) { return fmt.Errorf("storage: %s: ifGenerationMatch not supported", method) } case conds.GenerationNotMatch != 0: if !setIfGenerationNotMatch(cval, conds.GenerationNotMatch) { return fmt.Errorf("storage: %s: ifGenerationNotMatch not supported", method) } case conds.DoesNotExist: if !setIfGenerationMatch(cval, int64(0)) { return fmt.Errorf("storage: %s: DoesNotExist not supported", method) } } switch { case conds.MetagenerationMatch != 0: if !setIfMetagenerationMatch(cval, conds.MetagenerationMatch) { return fmt.Errorf("storage: %s: ifMetagenerationMatch not supported", method) } case conds.MetagenerationNotMatch != 0: if !setIfMetagenerationNotMatch(cval, conds.MetagenerationNotMatch) { return fmt.Errorf("storage: %s: ifMetagenerationNotMatch not supported", method) } } return nil } // applySourceConds modifies the provided call using the conditions in conds. // call is something that quacks like a *raw.WhateverCall. // This is specifically for calls like Rewrite and Move which have a source and destination // object. func applySourceConds(method string, gen int64, conds *Conditions, call interface{}) error { cval := reflect.ValueOf(call) if gen >= 0 { if !setSourceGeneration(cval, gen) { return fmt.Errorf("storage: %s: source generation not supported", method) } } if conds == nil { return nil } if err := conds.validate(method); err != nil { return err } switch { case conds.GenerationMatch != 0: if !setIfSourceGenerationMatch(cval, conds.GenerationMatch) { return fmt.Errorf("storage: %s: ifSourceGenerationMatch not supported", method) } case conds.GenerationNotMatch != 0: if !setIfSourceGenerationNotMatch(cval, conds.GenerationNotMatch) { return fmt.Errorf("storage: %s: ifSourceGenerationNotMatch not supported", method) } case conds.DoesNotExist: if !setIfSourceGenerationMatch(cval, int64(0)) { return fmt.Errorf("storage: %s: DoesNotExist not supported", method) } } switch { case conds.MetagenerationMatch != 0: if !setIfSourceMetagenerationMatch(cval, conds.MetagenerationMatch) { return fmt.Errorf("storage: %s: ifSourceMetagenerationMatch not supported", method) } case conds.MetagenerationNotMatch != 0: if !setIfSourceMetagenerationNotMatch(cval, conds.MetagenerationNotMatch) { return fmt.Errorf("storage: %s: ifSourceMetagenerationNotMatch not supported", method) } } return nil } // applySourceCondsProto validates and attempts to set the conditions on a protobuf // message using protobuf reflection. This is specifically for RPCs which have separate // preconditions for source and destination objects (e.g. Rewrite and Move). func applySourceCondsProto(method string, gen int64, conds *Conditions, msg proto.Message) error { rmsg := msg.ProtoReflect() if gen >= 0 { if !setConditionProtoField(rmsg, "source_generation", gen) { return fmt.Errorf("storage: %s: generation not supported", method) } } if conds == nil { return nil } if err := conds.validate(method); err != nil { return err } switch { case conds.GenerationMatch != 0: if !setConditionProtoField(rmsg, "if_source_generation_match", conds.GenerationMatch) { return fmt.Errorf("storage: %s: ifSourceGenerationMatch not supported", method) } case conds.GenerationNotMatch != 0: if !setConditionProtoField(rmsg, "if_source_generation_not_match", conds.GenerationNotMatch) { return fmt.Errorf("storage: %s: ifSourceGenerationNotMatch not supported", method) } case conds.DoesNotExist: if !setConditionProtoField(rmsg, "if_source_generation_match", int64(0)) { return fmt.Errorf("storage: %s: DoesNotExist not supported", method) } } switch { case conds.MetagenerationMatch != 0: if !setConditionProtoField(rmsg, "if_source_metageneration_match", conds.MetagenerationMatch) { return fmt.Errorf("storage: %s: ifSourceMetagenerationMatch not supported", method) } case conds.MetagenerationNotMatch != 0: if !setConditionProtoField(rmsg, "if_source_metageneration_not_match", conds.MetagenerationNotMatch) { return fmt.Errorf("storage: %s: ifSourceMetagenerationNotMatch not supported", method) } } return nil } // setGeneration sets Generation on a *raw.WhateverCall. // We can't use anonymous interfaces because the return type is // different, since the field setters are builders. // We also make sure to supply a compile-time constant to MethodByName; // otherwise, the Go Linker will disable dead code elimination, leading // to larger binaries for all packages that import storage. func setGeneration(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("Generation"), value) } // setIfGenerationMatch sets IfGenerationMatch on a *raw.WhateverCall. // See also setGeneration. func setIfGenerationMatch(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("IfGenerationMatch"), value) } // setIfGenerationNotMatch sets IfGenerationNotMatch on a *raw.WhateverCall. // See also setGeneration. func setIfGenerationNotMatch(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("IfGenerationNotMatch"), value) } // setIfMetagenerationMatch sets IfMetagenerationMatch on a *raw.WhateverCall. // See also setGeneration. func setIfMetagenerationMatch(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("IfMetagenerationMatch"), value) } // setIfMetagenerationNotMatch sets IfMetagenerationNotMatch on a *raw.WhateverCall. // See also setGeneration. func setIfMetagenerationNotMatch(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("IfMetagenerationNotMatch"), value) } // More methods to set source object precondition fields (used by Rewrite and Move APIs). func setSourceGeneration(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("SourceGeneration"), value) } func setIfSourceGenerationMatch(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("IfSourceGenerationMatch"), value) } func setIfSourceGenerationNotMatch(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("IfSourceGenerationNotMatch"), value) } func setIfSourceMetagenerationMatch(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("IfSourceMetagenerationMatch"), value) } func setIfSourceMetagenerationNotMatch(cval reflect.Value, value interface{}) bool { return setCondition(cval.MethodByName("IfSourceMetagenerationNotMatch"), value) } func setCondition(setter reflect.Value, value interface{}) bool { if setter.IsValid() { setter.Call([]reflect.Value{reflect.ValueOf(value)}) } return setter.IsValid() } // Retryer returns an object handle that is configured with custom retry // behavior as specified by the options that are passed to it. All operations // on the new handle will use the customized retry configuration. // These retry options will merge with the bucket's retryer (if set) for the // returned handle. Options passed into this method will take precedence over // retry options on the bucket and client. Note that you must explicitly pass in // each option you want to override. func (o *ObjectHandle) Retryer(opts ...RetryOption) *ObjectHandle { o2 := *o var retry *retryConfig if o.retry != nil { // merge the options with the existing retry retry = o.retry } else { retry = &retryConfig{} } for _, opt := range opts { opt.apply(retry) } o2.retry = retry o2.acl.retry = retry return &o2 } // SetRetry configures the client with custom retry behavior as specified by the // options that are passed to it. All operations using this client will use the // customized retry configuration. // This should be called once before using the client for network operations, as // there could be indeterminate behaviour with operations in progress. // Retry options set on a bucket or object handle will take precedence over // these options. func (c *Client) SetRetry(opts ...RetryOption) { var retry *retryConfig if c.retry != nil { // merge the options with the existing retry retry = c.retry } else { retry = &retryConfig{} } for _, opt := range opts { opt.apply(retry) } c.retry = retry } // RetryOption allows users to configure non-default retry behavior for API // calls made to GCS. type RetryOption interface { apply(config *retryConfig) } // WithBackoff allows configuration of the backoff timing used for retries. // Available configuration options (Initial, Max and Multiplier) are described // at https://pkg.go.dev/github.com/googleapis/gax-go/v2#Backoff. If any fields // are not supplied by the user, gax default values will be used. func WithBackoff(backoff gax.Backoff) RetryOption { return &withBackoff{ backoff: backoff, } } type withBackoff struct { backoff gax.Backoff } func (wb *withBackoff) apply(config *retryConfig) { config.backoff = &wb.backoff } // WithMaxAttempts configures the maximum number of times an API call can be made // in the case of retryable errors. // For example, if you set WithMaxAttempts(5), the operation will be attempted up to 5 // times total (initial call plus 4 retries). // Without this setting, operations will continue retrying indefinitely // until either the context is canceled or a deadline is reached. func WithMaxAttempts(maxAttempts int) RetryOption { return &withMaxAttempts{ maxAttempts: maxAttempts, } } type withMaxAttempts struct { maxAttempts int } func (wb *withMaxAttempts) apply(config *retryConfig) { config.maxAttempts = &wb.maxAttempts } // RetryPolicy describes the available policies for which operations should be // retried. The default is `RetryIdempotent`. type RetryPolicy int const ( // RetryIdempotent causes only idempotent operations to be retried when the // service returns a transient error. Using this policy, fully idempotent // operations (such as `ObjectHandle.Attrs()`) will always be retried. // Conditionally idempotent operations (for example `ObjectHandle.Update()`) // will be retried only if the necessary conditions have been supplied (in // the case of `ObjectHandle.Update()` this would mean supplying a // `Conditions.MetagenerationMatch` condition is required). RetryIdempotent RetryPolicy = iota // RetryAlways causes all operations to be retried when the service returns a // transient error, regardless of idempotency considerations. RetryAlways // RetryNever causes the client to not perform retries on failed operations. RetryNever ) // WithPolicy allows the configuration of which operations should be performed // with retries for transient errors. func WithPolicy(policy RetryPolicy) RetryOption { return &withPolicy{ policy: policy, } } type withPolicy struct { policy RetryPolicy } func (ws *withPolicy) apply(config *retryConfig) { config.policy = ws.policy } // WithErrorFunc allows users to pass a custom function to the retryer. Errors // will be retried if and only if `shouldRetry(err)` returns true. // By default, the following errors are retried (see ShouldRetry for the default // function): // // - HTTP responses with codes 408, 429, 502, 503, and 504. // // - Transient network errors such as connection reset and io.ErrUnexpectedEOF. // // - Errors which are considered transient using the Temporary() interface. // // - Wrapped versions of these errors. // // This option can be used to retry on a different set of errors than the // default. Users can use the default ShouldRetry function inside their custom // function if they only want to make minor modifications to default behavior. func WithErrorFunc(shouldRetry func(err error) bool) RetryOption { return &withErrorFunc{ shouldRetry: shouldRetry, } } type withErrorFunc struct { shouldRetry func(err error) bool } func (wef *withErrorFunc) apply(config *retryConfig) { config.shouldRetry = wef.shouldRetry } type retryConfig struct { backoff *gax.Backoff policy RetryPolicy shouldRetry func(err error) bool maxAttempts *int // maxRetryDuration, if set, specifies a deadline after which the request // will no longer be retried. A value of 0 allows infinite retries. // maxRetryDuration is currently only set by Writer.ChunkRetryDeadline. maxRetryDuration time.Duration } func (r *retryConfig) clone() *retryConfig { if r == nil { return nil } var bo *gax.Backoff if r.backoff != nil { bo = &gax.Backoff{ Initial: r.backoff.Initial, Max: r.backoff.Max, Multiplier: r.backoff.Multiplier, } } return &retryConfig{ backoff: bo, policy: r.policy, shouldRetry: r.shouldRetry, maxAttempts: r.maxAttempts, maxRetryDuration: r.maxRetryDuration, } } // composeSourceObj wraps a *raw.ComposeRequestSourceObjects, but adds the methods // that modifyCall searches for by name. type composeSourceObj struct { src *raw.ComposeRequestSourceObjects } func (c composeSourceObj) Generation(gen int64) { c.src.Generation = gen } func (c composeSourceObj) IfGenerationMatch(gen int64) { // It's safe to overwrite ObjectPreconditions, since its only field is // IfGenerationMatch. c.src.ObjectPreconditions = &raw.ComposeRequestSourceObjectsObjectPreconditions{ IfGenerationMatch: gen, } } func setEncryptionHeaders(headers http.Header, key []byte, copySource bool) error { if key == nil { return nil } // TODO(jbd): Ask the API team to return a more user-friendly error // and avoid doing this check at the client level. if len(key) != 32 { return errors.New("storage: not a 32-byte AES-256 key") } var cs string if copySource { cs = "copy-source-" } headers.Set("x-goog-"+cs+"encryption-algorithm", aes256Algorithm) headers.Set("x-goog-"+cs+"encryption-key", base64.StdEncoding.EncodeToString(key)) keyHash := sha256.Sum256(key) headers.Set("x-goog-"+cs+"encryption-key-sha256", base64.StdEncoding.EncodeToString(keyHash[:])) return nil } // toProtoCommonObjectRequestParams sets customer-supplied encryption to the proto library's CommonObjectRequestParams. func toProtoCommonObjectRequestParams(key []byte) *storagepb.CommonObjectRequestParams { if key == nil { return nil } keyHash := sha256.Sum256(key) return &storagepb.CommonObjectRequestParams{ EncryptionAlgorithm: aes256Algorithm, EncryptionKeyBytes: key, EncryptionKeySha256Bytes: keyHash[:], } } func toProtoChecksums(sendCRC32C bool, attrs *ObjectAttrs) *storagepb.ObjectChecksums { var checksums *storagepb.ObjectChecksums if sendCRC32C { checksums = &storagepb.ObjectChecksums{ Crc32C: proto.Uint32(attrs.CRC32C), } } if len(attrs.MD5) != 0 { if checksums == nil { checksums = &storagepb.ObjectChecksums{ Md5Hash: attrs.MD5, } } else { checksums.Md5Hash = attrs.MD5 } } return checksums } // ServiceAccount fetches the email address of the given project's Google Cloud Storage service account. // Note: gRPC is not supported. func (c *Client) ServiceAccount(ctx context.Context, projectID string) (string, error) { o := makeStorageOpts(true, c.retry, "") return c.tc.GetServiceAccount(ctx, projectID, o...) } // bucketResourceName formats the given project ID and bucketResourceName ID // into a Bucket resource name. This is the format necessary for the gRPC API as // it conforms to the Resource-oriented design practices in https://google.aip.dev/121. func bucketResourceName(p, b string) string { return fmt.Sprintf("projects/%s/buckets/%s", p, b) } // parseBucketName strips the leading resource path segment and returns the // bucket ID, which is the simple Bucket name typical of the v1 API. func parseBucketName(b string) string { sep := strings.LastIndex(b, "/") return b[sep+1:] } // parseProjectNumber consume the given resource name and parses out the project // number if one is present i.e. it is not a project ID. func parseProjectNumber(r string) uint64 { projectID := regexp.MustCompile(`projects\/([0-9]+)\/?`) if matches := projectID.FindStringSubmatch(r); len(matches) > 0 { // Capture group follows the matched segment. For example: // input: projects/123/bars/456 // output: [projects/123/, 123] number, err := strconv.ParseUint(matches[1], 10, 64) if err != nil { return 0 } return number } return 0 } // toProjectResource accepts a project ID and formats it as a Project resource // name. func toProjectResource(project string) string { return fmt.Sprintf("projects/%s", project) } // setConditionProtoField uses protobuf reflection to set named condition field // to the given condition value if supported on the protobuf message. func setConditionProtoField(m protoreflect.Message, f string, v int64) bool { fields := m.Descriptor().Fields() if rf := fields.ByName(protoreflect.Name(f)); rf != nil { m.Set(rf, protoreflect.ValueOfInt64(v)) return true } return false } // applyCondsProto validates and attempts to set the conditions on a protobuf // message using protobuf reflection. func applyCondsProto(method string, gen int64, conds *Conditions, msg proto.Message) error { rmsg := msg.ProtoReflect() if gen >= 0 { if !setConditionProtoField(rmsg, "generation", gen) { return fmt.Errorf("storage: %s: generation not supported", method) } } if conds == nil { return nil } if err := conds.validate(method); err != nil { return err } switch { case conds.GenerationMatch != 0: if !setConditionProtoField(rmsg, "if_generation_match", conds.GenerationMatch) { return fmt.Errorf("storage: %s: ifGenerationMatch not supported", method) } case conds.GenerationNotMatch != 0: if !setConditionProtoField(rmsg, "if_generation_not_match", conds.GenerationNotMatch) { return fmt.Errorf("storage: %s: ifGenerationNotMatch not supported", method) } case conds.DoesNotExist: if !setConditionProtoField(rmsg, "if_generation_match", int64(0)) { return fmt.Errorf("storage: %s: DoesNotExist not supported", method) } } switch { case conds.MetagenerationMatch != 0: if !setConditionProtoField(rmsg, "if_metageneration_match", conds.MetagenerationMatch) { return fmt.Errorf("storage: %s: ifMetagenerationMatch not supported", method) } case conds.MetagenerationNotMatch != 0: if !setConditionProtoField(rmsg, "if_metageneration_not_match", conds.MetagenerationNotMatch) { return fmt.Errorf("storage: %s: ifMetagenerationNotMatch not supported", method) } } return nil } // formatObjectErr checks if the provided error is NotFound and if so, wraps // it in an ErrObjectNotExist error. If not, formatObjectErr has no effect. func formatObjectErr(err error) error { var e *googleapi.Error if s, ok := status.FromError(err); (ok && s.Code() == codes.NotFound) || (errors.As(err, &e) && e.Code == http.StatusNotFound) { return fmt.Errorf("%w: %w", ErrObjectNotExist, err) } return err } // formatBucketError checks if the provided error is NotFound and if so, wraps // it in an ErrBucketNotExist error. If not, formatBucketError has no effect. func formatBucketError(err error) error { var e *googleapi.Error if s, ok := status.FromError(err); (ok && s.Code() == codes.NotFound) || (errors.As(err, &e) && e.Code == http.StatusNotFound) { return fmt.Errorf("%w: %w", ErrBucketNotExist, err) } return err } ================================================ FILE: vendor/cloud.google.com/go/storage/storage.replay ================================================ { "Initial": "IjIwMTktMDUtMDJUMjI6MjM6NTMuNDAzNDMyMDEzWiI=", "Version": "0.2", "Converter": { "ClearHeaders": [ "^X-Goog-.*Encryption-Key$" ], "RemoveRequestHeaders": [ "^Authorization$", "^Proxy-Authorization$", "^Connection$", "^Content-Type$", "^Date$", "^Host$", "^Transfer-Encoding$", "^Via$", "^X-Forwarded-.*$", "^X-Cloud-Trace-Context$", "^X-Goog-Api-Client$", "^X-Google-.*$", "^X-Gfe-.*$" ], "RemoveResponseHeaders": [ "^X-Google-.*$", "^X-Gfe-.*$" ], "ClearParams": null, "RemoveParams": null }, "Entries": [ { "ID": "f5f231bed6e14b7f", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "60" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIn0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "485" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:54 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrZvgYBWgsCwPaGI9bo1ccC0WCBc8kJgydTwioDtXR9xps4HiDoKXI-vjYUl876SMqF0JhmhaEBgvxrIL9Y989YCFrH65xGys_r1JbPdi9M9N0kS3M" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NC42MTBaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "9a9914424ef59619", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "60" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIn0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "485" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:55 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqFvRYrCleVqpn0QshSvzW5I1-8o7N6vGYh8o5G1f-AHnsX2N_x-NKJrvlxnXqm9auw5gMoWFaJTSTtKL5y85WlQ_eAjmmlrkD4tbHYBZJ386xgaZw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU1LjEwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NS4xMDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "17f2abbdd781a33b", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0002?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:55 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:23:55 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoYoTmTG5mxpFGPvmECUTlGMlQwhfmqGsZtBtZ9xV89Pw3q-p5BBeX_3imdofr_7EBT7nBm4v5alpg45Zi8a8ET28qBH2xfNe4n15HR-1fhGou2wQU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU1LjEwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NS4xMDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "6752f5a9a036af11", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0002?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:23:56 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur4bFsk4ylv96GsTkuDKG--hVaCR_UEhZ_fAzMGt5Eu5ZKncHOLjU_f2PcNP9saFGW-UkH9jXwt_nuR0G2zXOBjMJmLdd7Ml61bGMMrJeVa0OtcGpM" ] }, "Body": "" } }, { "ID": "9c25646df7aacad9", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "543" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJsYWJlbHMiOnsiZW1wdHkiOiIiLCJsMSI6InYxIn0sImxpZmVjeWNsZSI6eyJydWxlIjpbeyJhY3Rpb24iOnsic3RvcmFnZUNsYXNzIjoiTkVBUkxJTkUiLCJ0eXBlIjoiU2V0U3RvcmFnZUNsYXNzIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjEwLCJjcmVhdGVkQmVmb3JlIjoiMjAxNy0wMS0wMSIsImlzTGl2ZSI6ZmFsc2UsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTVVMVElfUkVHSU9OQUwiLCJTVEFOREFSRCJdLCJudW1OZXdlclZlcnNpb25zIjozfX0seyJhY3Rpb24iOnsidHlwZSI6IkRlbGV0ZSJ9LCJjb25kaXRpb24iOnsiYWdlIjozMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOnRydWUsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTkVBUkxJTkUiXSwibnVtTmV3ZXJWZXJzaW9ucyI6MTB9fV19LCJsb2NhdGlvbiI6IlVTIiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIiwidmVyc2lvbmluZyI6eyJlbmFibGVkIjp0cnVlfX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "926" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:56 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq6CjN9PjjzT3LmHxW_tU_ciQ1rahetoQGbX_gX8EC5il7tPJi2yxi5VZxnDNrp1h14b7Ix8tnvtkHufAyO1-lMRutdHK5GSzonff78Nm6KPAKN5fU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU2LjQwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1Ni40MDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOnRydWV9LCJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJTZXRTdG9yYWdlQ2xhc3MiLCJzdG9yYWdlQ2xhc3MiOiJORUFSTElORSJ9LCJjb25kaXRpb24iOnsiYWdlIjoxMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOmZhbHNlLCJtYXRjaGVzU3RvcmFnZUNsYXNzIjpbIk1VTFRJX1JFR0lPTkFMIiwiU1RBTkRBUkQiXSwibnVtTmV3ZXJWZXJzaW9ucyI6M319LHsiYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzAsImNyZWF0ZWRCZWZvcmUiOiIyMDE3LTAxLTAxIiwiaXNMaXZlIjp0cnVlLCJtYXRjaGVzU3RvcmFnZUNsYXNzIjpbIk5FQVJMSU5FIl0sIm51bU5ld2VyVmVyc2lvbnMiOjEwfX1dfSwibGFiZWxzIjp7ImwxIjoidjEiLCJlbXB0eSI6IiJ9LCJzdG9yYWdlQ2xhc3MiOiJORUFSTElORSIsImV0YWciOiJDQUU9In0=" } }, { "ID": "f795b9adcb1b546e", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0002?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2872" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:56 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:23:56 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up2-mWQyRDbFSpF6U96vQpaBYr74NgiUWh3-KZnLWaFYnhQti1tgKWNtL15YgK8blaRSnzGeACPA6jNuM34yhr7bxztrdN2tobEQAzD5RVgzpqx14w" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU2LjQwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1Ni40MDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6dHJ1ZX0sImxpZmVjeWNsZSI6eyJydWxlIjpbeyJhY3Rpb24iOnsidHlwZSI6IlNldFN0b3JhZ2VDbGFzcyIsInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjEwLCJjcmVhdGVkQmVmb3JlIjoiMjAxNy0wMS0wMSIsImlzTGl2ZSI6ZmFsc2UsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTVVMVElfUkVHSU9OQUwiLCJTVEFOREFSRCJdLCJudW1OZXdlclZlcnNpb25zIjozfX0seyJhY3Rpb24iOnsidHlwZSI6IkRlbGV0ZSJ9LCJjb25kaXRpb24iOnsiYWdlIjozMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOnRydWUsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTkVBUkxJTkUiXSwibnVtTmV3ZXJWZXJzaW9ucyI6MTB9fV19LCJsYWJlbHMiOnsibDEiOiJ2MSIsImVtcHR5IjoiIn0sInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "2ee3f84c4e4045fb", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0002?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:23:57 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UplJEr-Hxa3hDFT5ozLEHYhHfaxlYFpc9Vwm8AL831-w_7BBgxHjjEsU8Br_uLnLes0h9hz37iuE9V8uVZ2liHY7ZD4piNH31oyapjCtwyXrukIP94" ] }, "Body": "" } }, { "ID": "16f19dbf8e206756", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:57 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:23:57 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqvp5XjvB8nhNuz-bTeN9OklTfiBGldYKkcY13JF6oUfpV0z_jwoEQD3B3Ss3wWpaSmZfePjo7fkkr-hP3jbrUazNHaqQliiHqOBSNmSoPmwJpzfOI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NC42MTBaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "949f5ce411d6f672", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:58 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpVeVcmmuUyOt3Hbja89_Ewi6GRsJtRduqK93OT4Ys1aK5GqDWeGxyDbczUyRLeUYvZgtJzYLwVOOUszqAF4ipSXgZ1L_byd9cJ7ttVfQ_ceQBXxY4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1NC42MTBaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "b75303fbdafb66d0", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "64" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJsYWJlbHMiOnsiZW1wdHkiOiIiLCJsMSI6InYxIn0sInZlcnNpb25pbmciOnsiZW5hYmxlZCI6dHJ1ZX19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2493" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:58 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqDnNlC3m95GplHjE79aqzhtwgfJCWQjHaCFG4i7qmTFliz2gdE4OiOnKAPIoNqxEngE35065YXNYA65aMSSeEluDKmQ__rJXcS_DpRdoYP4rZIyPo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1OC40MzZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6dHJ1ZX0sImxhYmVscyI6eyJlbXB0eSI6IiIsImwxIjoidjEifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9" } }, { "ID": "831805b62d969707", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "93" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJsYWJlbHMiOnsiYWJzZW50IjpudWxsLCJlbXB0eSI6bnVsbCwibDEiOiJ2MiIsIm5ldyI6Im5ldyJ9LCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2495" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:59 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq8yNb3V9Kq8zPa_pdVrJIYv83v4fu6xAHwktfTz_Cy4K1rpi8xrDzYmw5wICaazfMcAiYPhM8r4Y6WkeOyeCRInvkJ6ndduhNN_dgu1U59uI5F3Qc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1OS4wMzJaIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBTT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6ZmFsc2V9LCJsYWJlbHMiOnsibDEiOiJ2MiIsIm5ldyI6Im5ldyJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQU09In0=" } }, { "ID": "8a816d061fe9e7e0", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "77" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzB9fV19fQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2570" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:23:59 GMT" ], "Etag": [ "CAQ=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrbjywEmDPkqxln7-Nx_8ngRxoWvncfCx1fGVpPZGEjjmg8OJgv0uaczxapjlNeEcvMnqWI_RVzG6_588QaO8nCnPVnE2kkIek3D_t6UNL9CCPYLRc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMzo1OS41MzBaIiwibWV0YWdlbmVyYXRpb24iOiI0IiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FRPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVE9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQVE9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVE9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBUT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6ZmFsc2V9LCJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzB9fV19LCJsYWJlbHMiOnsibDEiOiJ2MiIsIm5ldyI6Im5ldyJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQVE9In0=" } }, { "ID": "6a60397ebae323e7", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiYnVja2V0UG9saWN5T25seSJ9Cg==", "dGVzdA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3305" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:00 GMT" ], "Etag": [ "CPmu4bnx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UokOvJnDKKHAQOa8mJLrxFpWWvQ2U_BC_3uI0Z4x870Q068evHio_t_YudbSq614h77-ofhBsyHpoknWnm_YrnXxkHzopreKoMBykFIcbsSB8TDKEE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LzE1NTY4MzU4NDAwNTUxNjEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5IiwibmFtZSI6ImJ1Y2tldFBvbGljeU9ubHkiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMC4wNTRaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDAuMDU0WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjAwLjA1NFoiLCJzaXplIjoiNCIsIm1kNUhhc2giOiJDWTlyelVZaDAzUEszazZESmllMDlnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0UG9saWN5T25seT9nZW5lcmF0aW9uPTE1NTY4MzU4NDAwNTUxNjEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldFBvbGljeU9ubHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUG11NGJueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0UG9saWN5T25seSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQwMDU1MTYxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BtdTRibngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkvMTU1NjgzNTg0MDA1NTE2MS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0UG9saWN5T25seS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUG11NGJueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0UG9saWN5T25seSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQwMDU1MTYxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BtdTRibngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJocUJ5d0E9PSIsImV0YWciOiJDUG11NGJueC9lRUNFQUU9In0=" } }, { "ID": "32d392d1da32f27b", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketPolicyOnly/acl/user-test%40example.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "111" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJ1c2VyLXRlc3RAZXhhbXBsZS5jb20iLCJyb2xlIjoiUkVBREVSIn0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "519" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:00 GMT" ], "Etag": [ "CPmu4bnx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoau0xgFp6ib5wM0bBWjRlklvDRPOu0VZ-LFCeENUWXutmkXSfgUbtr2Nuefb7Pm_yLvCNqtB9B6k_N1V7AlvkN4_JEz67ZSXQ_sAD5L1teQIpGiqA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3VzZXItdGVzdEBleGFtcGxlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldFBvbGljeU9ubHkvYWNsL3VzZXItdGVzdEBleGFtcGxlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InVzZXItdGVzdEBleGFtcGxlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJlbWFpbCI6InRlc3RAZXhhbXBsZS5jb20iLCJldGFnIjoiQ1BtdTRibngvZUVDRUFJPSJ9" } }, { "ID": "6e3d0eda38a3ab6e", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "59" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6dHJ1ZX19fQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "663" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:01 GMT" ], "Etag": [ "CAU=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpSPFJHLzusxOr_OvhStJlWEpOs2EuthMO0Ys6pS9bsQeP0fthp_VUZfa8_sN8TX6PJYpxIdFlxB2QUaIujot1cUrssoU74XFrAwoqhlmiE5y9Aw-w" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMS4yNDJaIiwibWV0YWdlbmVyYXRpb24iOiI1IiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOnRydWUsImxvY2tlZFRpbWUiOiIyMDE5LTA3LTMxVDIyOjI0OjAxLjIzMFoifX0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FVPSJ9" } }, { "ID": "8f8dbb687dc49edb", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13230" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:01 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:01 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpGpW2zLlN7nAgV5IVkKU3kx4QWHCkzAgMa-QPC1PyCol8CP9W605bMUmFMeerbR4enzmeNMvtb4a2HzBPUZ296YfGdtkt_6Guq82E226xzC5TPq4w" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiQ2Fubm90IGdldCBsZWdhY3kgQUNMcyBmb3IgYSBidWNrZXQgdGhhdCBoYXMgZW5hYmxlZCBCdWNrZXQgUG9saWN5IE9ubHkuIFJlYWQgbW9yZSBhdCBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2J1Y2tldC1wb2xpY3ktb25seS4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5WQUxJRF9SRVFVRVNUX0ZPUl9CVUNLRVRfUE9MSUNZX09OTFlfUkVTT1VSQ0U6IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUlOVkFMSURfVkFMVUUsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5WQUxJRF9SRVFVRVNUX0ZPUl9CVUNLRVRfUE9MSUNZX09OTFlfUkVTT1VSQ0U6IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLklOVkFMSURfVkFMVUUsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTlZBTElEX1JFUVVFU1RfRk9SX0JVQ0tFVF9QT0xJQ1lfT05MWV9SRVNPVVJDRTogQ2Fubm90IGdldCBsZWdhY3kgQUNMcyBmb3IgYSBidWNrZXQgdGhhdCBoYXMgZW5hYmxlZCBCdWNrZXQgUG9saWN5IE9ubHkuIFJlYWQgbW9yZSBhdCBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2J1Y2tldC1wb2xpY3ktb25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ2Fubm90IGdldCBsZWdhY3kgQUNMcyBmb3IgYSBidWNrZXQgdGhhdCBoYXMgZW5hYmxlZCBCdWNrZXQgUG9saWN5IE9ubHkuIFJlYWQgbW9yZSBhdCBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2J1Y2tldC1wb2xpY3ktb25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1JTlZBTElEX1ZBTFVFLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9Q2Fubm90IGdldCBsZWdhY3kgQUNMcyBmb3IgYSBidWNrZXQgdGhhdCBoYXMgZW5hYmxlZCBCdWNrZXQgUG9saWN5IE9ubHkuIFJlYWQgbW9yZSBhdCBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2J1Y2tldC1wb2xpY3ktb25seS4sIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPUNhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuLCByZWFzb249aW52YWxpZCwgcnBjQ29kZT00MDB9IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5WQUxJRF9SRVFVRVNUX0ZPUl9CVUNLRVRfUE9MSUNZX09OTFlfUkVTT1VSQ0U6IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkNhbm5vdCBnZXQgbGVnYWN5IEFDTHMgZm9yIGEgYnVja2V0IHRoYXQgaGFzIGVuYWJsZWQgQnVja2V0IFBvbGljeSBPbmx5LiBSZWFkIG1vcmUgYXQgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9idWNrZXQtcG9saWN5LW9ubHkuIn19" } }, { "ID": "42ce6421b2c9fae4", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketPolicyOnly/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13358" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:02 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:02 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqJwxja3nYzWYbg_I5gWvOiow2ORuo8tNA-_Vzw7DX_YVhhb6_p1giUk3WjUHWt-lyDA13adhPGi4BDfIXzQyf-ZL3lsHoa2sNm29BIqRznw4mkAdE" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1GT1JCSURERU4sIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9Zm9yYmlkZGVuLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5GT1JCSURERU4sIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmdldCBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5nZXQgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRQb2xpY3lPbmx5LiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmdldCBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAzLCJtZXNzYWdlIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS4ifX0=" } }, { "ID": "0ca0bddf513110f4", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "45" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnt9fX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "624" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:02 GMT" ], "Etag": [ "CAY=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpdDWPDU9-gPzHEieE0Rqx_40yf8fJLhwAP6fVsdS4F7I7sWj0h-Ti7VoDWciZgI_lgNUB7qyh08wjTAxrTLTsSiIYt2GR6ksxhDRupMoPWni5kXmE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMi4zNjFaIiwibWV0YWdlbmVyYXRpb24iOiI2IiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FZPSJ9" } }, { "ID": "8a8bee740102593d", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketPolicyOnly/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2964" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:02 GMT" ], "Etag": [ "CPmu4bnx/eECEAI=" ], "Expires": [ "Thu, 02 May 2019 22:24:02 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq59Mf8Ea4fgpDnUzupeIP3bGt3VpyI6HjL4KJtDKAD_h-Ua-AJSX3u3x4TCsx2MZcIVhMs9pW9SWsrIcsvsr3kGt2Je9W87LElbN5dlw02EItBcR4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldFBvbGljeU9ubHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUG11NGJueC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0UG9saWN5T25seSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQwMDU1MTYxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BtdTRibngvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkvMTU1NjgzNTg0MDA1NTE2MS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0UG9saWN5T25seS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldFBvbGljeU9ubHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MDA1NTE2MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUG11NGJueC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0UG9saWN5T25seS8xNTU2ODM1ODQwMDU1MTYxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0UG9saWN5T25seSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQwMDU1MTYxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BtdTRibngvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldFBvbGljeU9ubHkvMTU1NjgzNTg0MDA1NTE2MS91c2VyLXRlc3RAZXhhbXBsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRQb2xpY3lPbmx5L2FjbC91c2VyLXRlc3RAZXhhbXBsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJidWNrZXRQb2xpY3lPbmx5IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDAwNTUxNjEiLCJlbnRpdHkiOiJ1c2VyLXRlc3RAZXhhbXBsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZW1haWwiOiJ0ZXN0QGV4YW1wbGUuY29tIiwiZXRhZyI6IkNQbXU0Ym54L2VFQ0VBST0ifV19" } }, { "ID": "91ba2c22c5f5de9a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketPolicyOnly?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:03 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrwotKay181GHzZsWfp6BzJA4FDOIfK2s1WlzB9p8QsIEX42AtvMhkgLWqSIyEhb-MSv9snqx0WRwUs5sDN3_5NVoFTzQeLkDBR9mbsixI-udc8SLI" ] }, "Body": "" } }, { "ID": "43fec6c3a8c8cb63", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiY29uZGRlbCJ9Cg==", "Zm9v" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3161" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:03 GMT" ], "Etag": [ "CNHLq7vx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrrYnzZRz4GFV3BsHoF-vv9v2Lc13Wp6-P5iowSZFjqyykVhYZ6CkesIVxA2v2xNCbVeWgCBXCFFt9fje73cis1cECwwqrYLr5QF5bZCy4TsJ-LT8k" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsLzE1NTY4MzU4NDMzNjg0MDEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb25kZGVsIiwibmFtZSI6ImNvbmRkZWwiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MzM2ODQwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMy4zNjhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDMuMzY4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjAzLjM2OFoiLCJzaXplIjoiMyIsIm1kNUhhc2giOiJyTDBZMjB6QytGenQ3MlZQek1TazJBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29uZGRlbD9nZW5lcmF0aW9uPTE1NTY4MzU4NDMzNjg0MDEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbC8xNTU2ODM1ODQzMzY4NDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbmRkZWwvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbmRkZWwiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MzM2ODQwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTkhMcTd2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbC8xNTU2ODM1ODQzMzY4NDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb25kZGVsL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29uZGRlbCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQzMzY4NDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ05ITHE3dngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbmRkZWwvMTU1NjgzNTg0MzM2ODQwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29uZGRlbC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbmRkZWwiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0MzM2ODQwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTkhMcTd2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbC8xNTU2ODM1ODQzMzY4NDAxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb25kZGVsL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29uZGRlbCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQzMzY4NDAxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ05ITHE3dngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJ6OFN1SFE9PSIsImV0YWciOiJDTkhMcTd2eC9lRUNFQUU9In0=" } }, { "ID": "ba03d9efb1402903", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/conddel?alt=json\u0026generation=1556835843368400\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12249" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:03 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:03 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Ur-mcvaL-eBgBoviwBg_r8LyEEK3JNyFaj0cFy2neOMo1pVkWpkGQ-3gz8vQNtAGoX-Q7_CMYLNv_I0pOoy5iRr-MdYKny5ICdC1s3ji5DwL7sqmn0" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbmRkZWxcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6T0JKRUNUX05PVF9GT1VORDogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbmRkZWxcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6Ok9CSkVDVF9OT1RfRk9VTkQ6IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5uYW1lLCBtZXNzYWdlPU5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbCwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5uYW1lLCBtZXNzYWdlPU5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29uZGRlbCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6T0JKRUNUX05PVF9GT1VORDogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbmRkZWxcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb25kZGVsIn19" } }, { "ID": "e26af2cd4673cc7c", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/conddel?alt=json\u0026ifMetagenerationMatch=2\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 412, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12051" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:03 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:03 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uopfd5TJBzhGauzgyZW0h-TNFtDHz34k0kjbeuTeQPnMGBaiSFz9FdWA2gxp7qKp-V586voh7kqHgnVSW_QI4bWEuC35pj8NbCmmpNL_9pstpCgckw" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImNvbmRpdGlvbk5vdE1ldCIsIm1lc3NhZ2UiOiJQcmVjb25kaXRpb24gRmFpbGVkIiwibG9jYXRpb25UeXBlIjoiaGVhZGVyIiwibG9jYXRpb24iOiJJZi1NYXRjaCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1QUkVDT05ESVRJT05fRkFJTEVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OklOQ09SUkVDVF9NRVRBX0dFTkVSQVRJT05fU1BFQ0lGSUVEOiBFeHBlY3RlZCBtZXRhZGF0YSBnZW5lcmF0aW9uIHRvIG1hdGNoIDIsIGJ1dCBhY3R1YWwgdmFsdWUgd2FzIDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBFeHBlY3RlZCBtZXRhZGF0YSBnZW5lcmF0aW9uIHRvIG1hdGNoIDIsIGJ1dCBhY3R1YWwgdmFsdWUgd2FzIDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPXByZWNvbmRpdGlvbkZhaWxlZCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uQ09ORElUSU9OX05PVF9NRVQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUNPTkRJVElPTl9OT1RfTUVULCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9bnVsbCwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWhlYWRlcnMuSWYtTWF0Y2gsIG1lc3NhZ2U9UHJlY29uZGl0aW9uIEZhaWxlZCwgcmVhc29uPWNvbmRpdGlvbk5vdE1ldCwgcnBjQ29kZT00MTJ9IFByZWNvbmRpdGlvbiBGYWlsZWQ6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogRXhwZWN0ZWQgbWV0YWRhdGEgZ2VuZXJhdGlvbiB0byBtYXRjaCAyLCBidXQgYWN0dWFsIHZhbHVlIHdhcyAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MTIsIm1lc3NhZ2UiOiJQcmVjb25kaXRpb24gRmFpbGVkIn19" } }, { "ID": "857f8a30eb55b023", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/conddel?alt=json\u0026ifMetagenerationNotMatch=1\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 304, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uprv3QMjU4zz49ScYI4YaY9FitNwO7wGMQ1KZ8Y99w4D7keznFfA8M80bMdKvSH55jsWsDoLKcQ1VvIqIEUw88NqSfUM7E5SR_y5zfDaCf_uHSlgPM" ] }, "Body": "" } }, { "ID": "4c69a7dc19302935", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/conddel?alt=json\u0026generation=1556835843368401\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpoiZa1zqMV-8ZkeUrvT6Xi0uJul6yGWWth5s3YbFtA2p0-6vc_54sNtEbxbnsASZyMDXLelHaCSixgcVT6JDVELrXHDim9gHcjjlSTF6BsHWu181A" ] }, "Body": "" } }, { "ID": "834f05b1eb2dbc32", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoib2JqMSJ9Cg==", "TuDshcL7vdCAXh8L42NvEQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3150" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Etag": [ "CLnS+bvx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UozIFQVqWdhJxDLMyV7dfkeraSOw2Mw_AsI_aCWnAUudrz4HjQgZ4kbnvKXJfNF3SMQhxzxZHhk1Otmw7PgPxL7HyDkPDyK1DeHDc8GyfY1B3Q3YfA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9" } }, { "ID": "34a1730e8bbe1d09", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoib2JqMiJ9Cg==", "55GZ37DvGFQS3PnkEKv3Jg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3150" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:05 GMT" ], "Etag": [ "CJ2Xkrzx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoVrbP1vUH6TU_zfm_Aaca624z-91MoULnLIBcn9Hg4htv5T5Z6B4XYJMFZUuDjWWeBhR6EpG1UZL4iJe0TJybYQ2CCsB_k63CcOex39xaOIT8UYUA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyIiwibmFtZSI6Im9iajIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiQ0Mxd2x3ck1PSXEwZHZNa015bFVoZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajI/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ1MDQ5MjQ1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoialY1QVZRPT0iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9" } }, { "ID": "b7c2c8ec1e65fb6d", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoib2JqL3dpdGgvc2xhc2hlcyJ9Cg==", "kT7fkMXrRdrhn2P2+EeT5g==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3366" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:05 GMT" ], "Etag": [ "COqurrzx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrEgFAbU2gAqyKMITI9vr9kAgIBfNY3ZGs1l2_X4e-fVtNb01M9N81N-83LdChVzrk8iB09yuKUKdxRc0nMYrgy7S1fqPwbJdsQ6TJfMB05JJj6qr4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcyIsIm5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6InVlei9oSjZ3QXJlRFFuY2NEVWR4Zmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcz9nZW5lcmF0aW9uPTE1NTY4MzU4NDU1MTEwMTgmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoib2VvK0ZBPT0iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9" } }, { "ID": "0dbae3d4b454f434", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj%2Fwith%2Fslashes?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3366" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:05 GMT" ], "Etag": [ "COqurrzx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqk7CzWGAqaT12X_fTymveyPtsPJIPHD814QaAOIQLA_AJo_4OtnQOOXJM2jJhIZ1Co4NgEmboDUG9su4SN5fDTHObNh9elLts9VpUJ9iSYrIsn-Os" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcyIsIm5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6InVlei9oSjZ3QXJlRFFuY2NEVWR4Zmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcz9nZW5lcmF0aW9uPTE1NTY4MzU4NDU1MTEwMTgmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoib2VvK0ZBPT0iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9" } }, { "ID": "3793882b91d38a07", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3150" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:06 GMT" ], "Etag": [ "CLnS+bvx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpzUH_BRjU20OGbDAW2dy0lx9Gk_1Ko7zks6KG6OEpq0pBPfCIBjkCeIZTxKxtvxnOd1hqlZF7SlbNoyNUqX5UFXpZY5NjP5GTeUkm512vaBR5vnDI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9" } }, { "ID": "39924c2826bcd33f", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj2?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3150" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:06 GMT" ], "Etag": [ "CJ2Xkrzx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrgOr-dpWoY-JJi6vRigJX3Mpi_WQ4zWvWKK382DCP-mzWSnrpbaOzijhTCdNz6pmXskVVs30APwlqZgvb-S6xAwXqKJG5n6832Py4UlTdDR_INTew" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyIiwibmFtZSI6Im9iajIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiQ0Mxd2x3ck1PSXEwZHZNa015bFVoZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajI/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ1MDQ5MjQ1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoialY1QVZRPT0iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9" } }, { "ID": "89ea9ab5e21a635e", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "9705" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:06 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:06 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqj9dj5PbUhIU3baBv98vMViDP-BnVPs0APrFYL4jSbKc7fK6eAGoyDfsccGzxK-t0lGvozizW4ltrga8DXo_oxlZ9-k5a85v9i0PWTFIisPC7xuL8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19" } }, { "ID": "b27c106562362f6b", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=1\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3446" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:06 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:06 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoIo3JJa2rfg9_o3bXN_5QU6XU_iIrWYfuEuvKTQL0O5tjIHkODIDd4biyHxjbGNFnrQNbkiEUXWEBlo-3fTVgfFTOWuaPpgae-SafTBP8h5X5ddJ4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNoQnZZbW92ZDJsMGFDOXpiR0Z6YUdWeiIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcyIsIm5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6InVlei9oSjZ3QXJlRFFuY2NEVWR4Zmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcz9nZW5lcmF0aW9uPTE1NTY4MzU4NDU1MTEwMTgmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoib2VvK0ZBPT0iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XX0=" } }, { "ID": "ca654b46531c4cb2", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=1\u0026pageToken=ChBvYmovd2l0aC9zbGFzaGVz\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3214" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:07 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:07 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqINI0Ii418NlxoYErOrjhTKb3-G3n-8h1Ryc_4YT4Tksc7WXA9m4CcJWInyhJahYC-UUrM47O5EK-3FUt3toZOZxWlbwhE6Sfnra0H-CqjmvxWyRs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnUnZZbW94IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEiLCJuYW1lIjoib2JqMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJTbmEvVVd2N21jWkkyM29FNXRVYWJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NDQ2NDcyMjUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In1dfQ==" } }, { "ID": "0186889a60e651db", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=1\u0026pageToken=CgRvYmox\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3187" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:07 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:07 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpFTK3QnFf4m9htpY4s3P9_NHuDiQl8InpJoWPOaQHo0XaYnSoSqkH7CcUbm0-sWamsCZbd4DHoXHLCrea3ff9rLpWlptkL0aMKV_Dleb1Xm-j14fQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIiLCJuYW1lIjoib2JqMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJDQzF3bHdyTU9JcTBkdk1rTXlsVWhnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMj9nZW5lcmF0aW9uPTE1NTY4MzU4NDUwNDkyNDUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJqVjVBVlE9PSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dfQ==" } }, { "ID": "a253776f79c46fe1", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=1\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3446" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:07 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:07 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoadifz-4B7kC7DvXOyrNa5omK5-DXUNJBtT_d5I1jciPUvGlRm1L1vkvVMU1Y5n9zFig2CF_qqBLlcdvoYCaUeaNUu706L0fKJhJkA8vV5JUvFq0E" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNoQnZZbW92ZDJsMGFDOXpiR0Z6YUdWeiIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcyIsIm5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6InVlei9oSjZ3QXJlRFFuY2NEVWR4Zmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcz9nZW5lcmF0aW9uPTE1NTY4MzU4NDU1MTEwMTgmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoib2VvK0ZBPT0iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XX0=" } }, { "ID": "dc8959751769ee9c", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=1\u0026pageToken=ChBvYmovd2l0aC9zbGFzaGVz\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3214" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:08 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:08 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqLeV9n2aiAq15pl3CqEWOt3_OYHsxbG0lHFIKr7Emh5btUEXLXl4nZWPi27LinKW7i0LYvp-HZK5b9E742MR_PNFe87treTpz_QgUmchGPKLcdZVM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnUnZZbW94IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEiLCJuYW1lIjoib2JqMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJTbmEvVVd2N21jWkkyM29FNXRVYWJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NDQ2NDcyMjUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQUU9In1dfQ==" } }, { "ID": "23f7f167269db6b2", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=1\u0026pageToken=CgRvYmox\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3187" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:08 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:08 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo4hY4jSbETgB5jf-AU8_b1sRvfTSrlt_Pt6UXiuTte4GtueVBgDwuMEliwE2-nOSiRE6juXOCbR1LQlRrpek1TLeRRf1cCVbz90YcCIGhWV_zFz0o" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIiLCJuYW1lIjoib2JqMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJDQzF3bHdyTU9JcTBkdk1rTXlsVWhnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMj9nZW5lcmF0aW9uPTE1NTY4MzU4NDUwNDkyNDUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJqVjVBVlE9PSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dfQ==" } }, { "ID": "518c5855f7f2035b", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=2\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "6581" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:09 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:09 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqGaiKkmr1oBduBvG8APGBVoM_Ve7zHw4TBuyV3QYcFr9SYzEnATEwE5P6BH-yBsVXSmaRLej1a55x18Bra_ZAC7nYh2UKvWM66JGE3U1muaDBabyw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnUnZZbW94IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9XX0=" } }, { "ID": "5887398d8cd8c906", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=2\u0026pageToken=CgRvYmox\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3187" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:09 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:09 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqGAvr7ojM3PcmnrTMTX-TXgYKzfo-3gzwYU_l9OaCfpth_ad2lWUJf6w6B8pjEGsAFZJvNueCHYGSJdx6YJ7NAe71oah1xi6lGQvQkWEwAl0fXd7Y" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIiLCJuYW1lIjoib2JqMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJDQzF3bHdyTU9JcTBkdk1rTXlsVWhnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMj9nZW5lcmF0aW9uPTE1NTY4MzU4NDUwNDkyNDUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJqVjVBVlE9PSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dfQ==" } }, { "ID": "81d53e304c7ed90d", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=2\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "6581" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:09 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:09 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur9XEMeCefUS1K7QkIxrxZboQ1zQ5SkrEUZMzrQdNBNAuDQnpDczXzJvF-rZmxFVYSdMySScTTu-FICOdI91b-fQVRomrqAxJwgn60FoObIVVpgkog" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwibmV4dFBhZ2VUb2tlbiI6IkNnUnZZbW94IiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9XX0=" } }, { "ID": "0be1bdae5ba86bfd", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=2\u0026pageToken=CgRvYmox\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3187" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:10 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:10 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UocXesX_BUCirPixQFUhYfAIoR0Os309HMGHarzTGrqH1PkmHuGaaiNSH_pJq8nnWUXEnjk1cvuPGJWCF21t7EJQtCIGBWQoPBNV6OpvALZGdpPXuI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIiLCJuYW1lIjoib2JqMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJDQzF3bHdyTU9JcTBkdk1rTXlsVWhnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMj9nZW5lcmF0aW9uPTE1NTY4MzU4NDUwNDkyNDUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJqVjVBVlE9PSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dfQ==" } }, { "ID": "592a3fdf8b5a83e5", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=3\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "9705" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:10 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:10 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoS2FM55Dkg1PRaNQBzsu5KBns-svmRrQ5byrUGRHgnsBQQDdE3ZznljVTrNq3wDAClddQ4zbCMQSLdqxPPNlom-n1tMg1hO8s6kS8_CTWy2SOM6As" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19" } }, { "ID": "b01846866b585241", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=3\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "9705" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:10 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:10 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo22tWMx8uW6afXbfFrFT8UZzPbsqPItYMdRAPHNEuksgeqWI2US_xblUG6C8WgcHvfEeR_19eVmBTmW6QE7rmosaIm_raZxW9FuCHHiSi8TJnZ1CI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19" } }, { "ID": "2eeefee032c6e805", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=13\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "9705" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:11 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:11 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq55nB00t16AHTo1gSxBFUNplz5SJcGYBOeCPsK-MD5OLO_kHKT3YNZq69AAHpozaWVrTU_jDQqiqMFSoPhhmlF2dR1mcq6Ihk_y8uuFY6FM4O_hmI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19" } }, { "ID": "11bfe17bc978cdfd", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026maxResults=13\u0026pageToken=\u0026prefix=obj\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "9705" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:11 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:11 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UotgN85lDspseXEgwnXhmfSmio9oOxSzhqtyabApVH0KQz_aVg3DbQ7m0Z0L9SzPzzmNEUfU6xhAT5xQAXf-wvY1NHDFxdf9IJ6YoVNhN0aHN-75hY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzIiwibmFtZSI6Im9iai93aXRoL3NsYXNoZXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidWV6L2hKNndBcmVEUW5jY0RVZHhmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzP2dlbmVyYXRpb249MTU1NjgzNTg0NTUxMTAxOCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iai93aXRoL3NsYXNoZXMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTUxMTAxOCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJvZW8rRkE9PSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMiIsIm5hbWUiOiJvYmoyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IkNDMXdsd3JNT0lxMGR2TWtNeWxVaGc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyP2dlbmVyYXRpb249MTU1NjgzNTg0NTA0OTI0NSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMi8xNTU2ODM1ODQ1MDQ5MjQ1L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1MDQ5MjQ1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSjJYa3J6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6ImpWNUFWUT09IiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV19" } }, { "ID": "c05bfa6f1a43381b", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:11 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:11 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrVVjXVa2SMY6cjYeIgdcZOivQwE2Crz6UPZs2VXVBFMwReZs7kKbETuTMwuEMHKKm_LIrk-o6jS07MimubSWVxGMzT1BtCacU1X2Go_RckmyJPZso" ] }, "Body": "TuDshcL7vdCAXh8L42NvEQ==" } }, { "ID": "f2932604385db16e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrADckAOw2vMHdy0qy02f20x-8s_Ue81-NYwSpKeqp6Zx6eCPReLM6qXUyxFz0xHNGob5WJA8J4ctl6ZFzL2fEVwBMNY8xxzpkKOAwSu9n9e0OE63E" ] }, "Body": "TuDshcL7vdCAXh8L42NvEQ==" } }, { "ID": "8581afc6216ad2cb", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj2", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"082d70970acc388ab476f32433295486\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:05 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:05 GMT" ], "X-Goog-Generation": [ "1556835845049245" ], "X-Goog-Hash": [ "crc32c=jV5AVQ==", "md5=CC1wlwrMOIq0dvMkMylUhg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrkoYpGTn57WC5t-sItsEdWimp47AtSuqw8autFOD3TirChrdQThg_Fh-kykfgvnTaOyiw1InKeYs0Z2MISmjUpu4uHUUGDKTX6W0zQEuUks7i2BqQ" ] }, "Body": "55GZ37DvGFQS3PnkEKv3Jg==" } }, { "ID": "ae129e597d5dd3e8", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj2", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"082d70970acc388ab476f32433295486\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:05 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:05 GMT" ], "X-Goog-Generation": [ "1556835845049245" ], "X-Goog-Hash": [ "crc32c=jV5AVQ==", "md5=CC1wlwrMOIq0dvMkMylUhg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoaoET13zBO6-kmfarxy5tCZhmqc2oO38xOd6m6OQ55e-MyyKYM35hNakm5xYdWaoUNsKwVCiklp4HtYE8afVObxcDERuTCgyTw-olewCN6VBwd-H0" ] }, "Body": "55GZ37DvGFQS3PnkEKv3Jg==" } }, { "ID": "11acf26dc7680b3e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj/with/slashes", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"b9ecff849eb002b78342771c0d47717e\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:05 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:05 GMT" ], "X-Goog-Generation": [ "1556835845511018" ], "X-Goog-Hash": [ "crc32c=oeo+FA==", "md5=uez/hJ6wAreDQnccDUdxfg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up_XtsS2bu4fnGI-Z85gqz1MECYqweRqin42arAyEfpJpZwmadI1-Op9V7n-q3UaYyRtUWFR7an7zKxWhJ_CB6PXz-C55C1nPoI7EWVEV2oXcS-q8c" ] }, "Body": "kT7fkMXrRdrhn2P2+EeT5g==" } }, { "ID": "ff72204b0c538268", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj/with/slashes", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"b9ecff849eb002b78342771c0d47717e\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:05 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:05 GMT" ], "X-Goog-Generation": [ "1556835845511018" ], "X-Goog-Hash": [ "crc32c=oeo+FA==", "md5=uez/hJ6wAreDQnccDUdxfg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqrjLdnTX47-_XGNBlBZ0rEgsIkYJMzixBaVmhjn8IsK66UpQAUO-njMM-WznI-DBNIbXVTcPQKZBNe2ZHZEskfuRjsFwMjtooyUH_PqTfZnARVv8M" ] }, "Body": "kT7fkMXrRdrhn2P2+EeT5g==" } }, { "ID": "7972502f866e015e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Range": [ "bytes=0-15" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoNiJIZYFETpngMkDItRU7PtN7Fv4bDU7Kfvndst1JR2eGmW-tOMTfng8Abx6EWwPvvodLkSk-1TM4Gywxzh3c24gPDN4NsQMuh40Mfp0Jvg1syOls" ] }, "Body": "TuDshcL7vdCAXh8L42NvEQ==" } }, { "ID": "251a62254c59cbd1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Range": [ "bytes=0-7" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "8" ], "Content-Range": [ "bytes 0-7/16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UobLFpkqodTM1bHuzS0GzRCKZypPQkf3nH1hbOexCjgjAcheZhV_zxJRyLhOYZoW8ABEaVMJLULNrzAm1VZs4JrTdtT46fYIcQe7OBeJp0aHI7Lr5s" ] }, "Body": "TuDshcL7vdA=" } }, { "ID": "2482617229166e50", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Range": [ "bytes=8-23" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "8" ], "Content-Range": [ "bytes 8-15/16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uon8ZtKgOTqFm36bWHd3hf535jPGQBEX9j2yPrr11_ycAJjfI4A-mFWMTsFRR3nwSo68784B9TUPUjQd0cib0QIrfBjfDcz91p6oPJG3VpV9afywIY" ] }, "Body": "gF4fC+NjbxE=" } }, { "ID": "74ff0c5848c7dba6", "Request": { "Method": "HEAD", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:12 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqKc-08ZJEWVbyaV84xKlnrHkl2PBuBUQP6xtx6TzZW0fsjyZ-SHshiy-QMGCuP1UF4x1ettHyDvRbAleHIXy4y7wMwoUWST2NKs_0oRA0oVqOoKtQ" ] }, "Body": "" } }, { "ID": "90888164f5d2d40d", "Request": { "Method": "HEAD", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:13 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:13 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoTSlg3r_LSoiqQyJVJDzL-0xNj6jlSNp9zLUmlPtu3xbhCLBDNAxY9CRbyEjw7UudDcsFOe43C3QlsVjoBJln1q179ZspYWXY-fHqjrztAfJkZUpU" ] }, "Body": "" } }, { "ID": "7961f3dc74fa0663", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Range": [ "bytes=8-" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "8" ], "Content-Range": [ "bytes 8-15/16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:13 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:13 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqJjC8HFLb8u_EaJVF0_TUOhNWhbooW0oANE8_LPjoIdLcoU42caZe7LjgbTIjCb0Ss3horP2noxirF3u3FGq0Yoh4rjuHBVhwZcemZHnKLgJUUbQQ" ] }, "Body": "gF4fC+NjbxE=" } }, { "ID": "af8c1fcfa456592a", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Range": [ "bytes=0-31" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:13 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:13 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqq6ro5-i6q8pIDup0yW35uFEynuLK95P8OSFhj7b70DK33tjv3fkOdkobsfwplOAGuNME2bLjQuyy8mhd2xBbNjyjvXt13Nc48PB4M2t_46RoM3Ak" ] }, "Body": "TuDshcL7vdCAXh8L42NvEQ==" } }, { "ID": "d312c241da5bd348", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Range": [ "bytes=32-41" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 416, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "167" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:13 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:13 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpAvzLs-GgdTPEGM2kvABFTxehSb-DhZQ2Y31nQ9ad0RMmfIMtVGRBXvkXo7FwGAy78ZHMSGWRKG-DYMy6JU9PCM4Tpo8PDmm4-rHa_LVpH2dFN-JM" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+SW52YWxpZFJhbmdlPC9Db2RlPjxNZXNzYWdlPlRoZSByZXF1ZXN0ZWQgcmFuZ2UgY2Fubm90IGJlIHNhdGlzZmllZC48L01lc3NhZ2U+PERldGFpbHM+Ynl0ZXM9MzItNDE8L0RldGFpbHM+PC9FcnJvcj4=" } }, { "ID": "2bbd010d0173c966", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3150" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:13 GMT" ], "Etag": [ "CLnS+bvx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpZDScoUU4zzBoXc21jt6C1vcW1SrU6ELiWodrCID-OoNKVMbecv_DSgHZATQGs4GS-BebkzqdalqTq5C77aKXQMxiks-9A5kyrc8N4aY9L5YndaI8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFFPSJ9" } }, { "ID": "e3522e1cc7aef940", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2570" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:13 GMT" ], "Etag": [ "CAY=" ], "Expires": [ "Thu, 02 May 2019 22:24:13 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur5x_r1PKMQrnKbsfUWRR6wBwFQTM8U9mGwyq_fK56rrHE_UoLDxLRpiuaFGLVi9L4Hj67UXH76drA6KQQQgOsMVo0YEl1pVS2P7OKQ64WF4NubRCU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowMi4zNjFaIiwibWV0YWdlbmVyYXRpb24iOiI2IiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FZPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQVk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBWT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBWT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6ZmFsc2V9LCJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzB9fV19LCJsYWJlbHMiOnsibDEiOiJ2MiIsIm5ldyI6Im5ldyJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQVk9In0=" } }, { "ID": "77ed46692038573c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3333" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:14 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpBnZgUt8GyAer5VG-_nEuf3YizRjF2t4MS6vOflI_Vid1-zVpQ99TuphB3pZjPZNI5ZoHJxCmDv3lyLwyhUDvk_p_NO9x8qZTEpjf1EOO5uxRsOxo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTYiLCJvYmplY3RTaXplIjoiMTYiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDE0NDc5MiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMSIsIm5hbWUiOiJjb3B5LW9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NDE0NDc5MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNC4xNDRaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTQuMTQ0WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE0LjE0NFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NTQxNDQ3OTImYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxLzE1NTY4MzU4NTQxNDQ3OTIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29weS1vYmoxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb3B5LW9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NDE0NDc5MiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSmlxdmNEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxLzE1NTY4MzU4NTQxNDQ3OTIvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvcHktb2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU0MTQ0NzkyIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0ppcXZjRHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMS8xNTU2ODM1ODU0MTQ0NzkyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb3B5LW9iajEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb3B5LW9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NDE0NDc5MiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSmlxdmNEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxLzE1NTY4MzU4NTQxNDQ3OTIvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvcHktb2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU0MTQ0NzkyIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0ppcXZjRHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDSmlxdmNEeC9lRUNFQUU9In19" } }, { "ID": "9187dbb998c64d40", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "31" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJjb250ZW50RW5jb2RpbmciOiJpZGVudGl0eSJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3299" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:14 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpyrF7U9KSc3XcJb-T_KGf3Fg2yhFUjJqTl06wpqqhG5IT6chgLCWKnLTuamfHtVq8XcP7acZy4TGyKIEvZ4L36TGTfSM8Zp_JyF8K4rN5p375VBMc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTYiLCJvYmplY3RTaXplIjoiMTYiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDc0NzU0MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMSIsIm5hbWUiOiJjb3B5LW9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NDc0NzU0MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNC43NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTQuNzQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE0Ljc0N1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NTQ3NDc1NDMmYWx0PW1lZGlhIiwiY29udGVudEVuY29kaW5nIjoiaWRlbnRpdHkiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDc0NzU0My9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb3B5LW9iajEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvcHktb2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU0NzQ3NTQzIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKZVA0c0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDc0NzU0My9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29weS1vYmoxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29weS1vYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTQ3NDc1NDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmVQNHNEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxLzE1NTY4MzU4NTQ3NDc1NDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvcHktb2JqMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvcHktb2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU0NzQ3NTQzIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKZVA0c0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEvMTU1NjgzNTg1NDc0NzU0My91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29weS1vYmoxL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29weS1vYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTQ3NDc1NDMiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmVQNHNEeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkNUNmRUQT09IiwiZXRhZyI6IkNKZVA0c0R4L2VFQ0VBRT0ifX0=" } }, { "ID": "c199412d75fadc45", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "193" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhY2wiOlt7ImVudGl0eSI6ImRvbWFpbi1nb29nbGUuY29tIiwicm9sZSI6IlJFQURFUiJ9XSwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJjb250ZW50VHlwZSI6InRleHQvaHRtbCIsIm1ldGFkYXRhIjp7ImtleSI6InZhbHVlIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2046" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:15 GMT" ], "Etag": [ "CLnS+bvx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqKO5A_yihnTzTSNbXxyLm-I3MkyC58APsD1U6RZ5_xpjjjL3nXVZIyACkeiDKXRZyU_oP1Yt0FeX23ONp6JeNyoy0J0kW8GwGMgPeN1ATdWGzCMXs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNS4yMjBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJTbmEvVVd2N21jWkkyM29FNXRVYWJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NDQ2NDcyMjUmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJtZXRhZGF0YSI6eyJrZXkiOiJ2YWx1ZSJ9LCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6ImRvbWFpbi1nb29nbGUuY29tIiwicm9sZSI6IlJFQURFUiIsImRvbWFpbiI6Imdvb2dsZS5jb20iLCJldGFnIjoiQ0xuUytidngvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBST0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQ1Q2ZFRBPT0iLCJldGFnIjoiQ0xuUytidngvZUVDRUFJPSJ9" } }, { "ID": "c845025158c6b7d0", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "120" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50TGFuZ3VhZ2UiOm51bGwsImNvbnRlbnRUeXBlIjpudWxsLCJtZXRhZGF0YSI6bnVsbH0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1970" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:15 GMT" ], "Etag": [ "CLnS+bvx/eECEAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UryOVdmGzCqBOS2ZZ0nw1SqbHF7qJ1CeTxgb6a1BJyoA42NTNZ8RdEVQGNF5u2hWdSQW79cBOonxjms_MoogyDJVAtKHl1rys87QHF6-750NNNSoEw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxIiwibmFtZSI6Im9iajEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NDY0NzIyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTUuNTI3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiU25hL1VXdjdtY1pJMjNvRTV0VWFiUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajE/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ0NjQ3MjI1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNS9kb21haW4tZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoxL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xuUytidngvZUVDRUFNPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQU09In0=" } }, { "ID": "811b0b9d4980b14f", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiY2hlY2tzdW0tb2JqZWN0In0K", "aGVsbG93b3JsZA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3305" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:16 GMT" ], "Etag": [ "CIGhrMHx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqJTh_P91pby-vQkRF12GexDihy7TZAlUPamDV_REldvXeqvbrWY_kB0Vcp1lYyuIY7EK2_eMBYYSRMMIVEYz5fxxt51-9Br_UmYvnuRgjhfC16AuA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jaGVja3N1bS1vYmplY3QvMTU1NjgzNTg1NTk2MjI0MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdCIsIm5hbWUiOiJjaGVja3N1bS1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NTk2MjI0MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNS45NjFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTUuOTYxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE1Ljk2MVoiLCJzaXplIjoiMTAiLCJtZDVIYXNoIjoiL0Y0RGpUaWxjRElJVkVIbi9uQVFzQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdD9nZW5lcmF0aW9uPTE1NTY4MzU4NTU5NjIyNDEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY2hlY2tzdW0tb2JqZWN0LzE1NTY4MzU4NTU5NjIyNDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjaGVja3N1bS1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NTk2MjI0MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSUdock1IeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY2hlY2tzdW0tb2JqZWN0LzE1NTY4MzU4NTU5NjIyNDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNoZWNrc3VtLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0lHaHJNSHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NoZWNrc3VtLW9iamVjdC8xNTU2ODM1ODU1OTYyMjQxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jaGVja3N1bS1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjaGVja3N1bS1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NTk2MjI0MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSUdock1IeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY2hlY2tzdW0tb2JqZWN0LzE1NTY4MzU4NTU5NjIyNDEvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNoZWNrc3VtLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0lHaHJNSHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJWc3UwZ0E9PSIsImV0YWciOiJDSUdock1IeC9lRUNFQUU9In0=" } }, { "ID": "69c77b8bdd7cc643", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiemVyby1vYmplY3QifQo=", "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3240" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:16 GMT" ], "Etag": [ "CLirz8Hx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur2iXVwACD0yFKYjt0WT-lW1Tx6PtpOgDYttPBWBnJZ3CPf4cUK7heI_9SwdzYXoieaRHDj9n3w3M_SExedwQqQ-GTOY9qM9DPmrPy11hEny0WjECc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby1vYmplY3QiLCJuYW1lIjoiemVyby1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NjUzNzAxNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNi41MzZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTYuNTM2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE2LjUzNloiLCJzaXplIjoiMCIsIm1kNUhhc2giOiIxQjJNMlk4QXNnVHBnQW1ZN1BoQ2ZnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby1vYmplY3Q/Z2VuZXJhdGlvbj0xNTU2ODM1ODU2NTM3MDE2JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3plcm8tb2JqZWN0LzE1NTY4MzU4NTY1MzcwMTYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby1vYmplY3QvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xpcno4SHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3plcm8tb2JqZWN0LzE1NTY4MzU4NTY1MzcwMTYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiemVyby1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NjUzNzAxNiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvLW9iamVjdC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xpcno4SHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3plcm8tb2JqZWN0LzE1NTY4MzU4NTY1MzcwMTYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiemVyby1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1NjUzNzAxNiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQUFBQUFBPT0iLCJldGFnIjoiQ0xpcno4SHgvZUVDRUFFPSJ9" } }, { "ID": "1017883279ca634a", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1/acl/allUsers?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "98" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJhbGxVc2VycyIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "417" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:17 GMT" ], "Etag": [ "CLnS+bvx/eECEAQ=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoKqYaaFUj6b4ezS4lnnQgYv4CHVSsqhVSlLP3QqpItNahh25KnLzbTccK_idrfjKV0gExzr17MvFmoRw7oUIWyJJINmpEXEw5EmHScxipsb3KbWZ8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L2FsbFVzZXJzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvYWxsVXNlcnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJhbGxVc2VycyIsInJvbGUiOiJSRUFERVIiLCJldGFnIjoiQ0xuUytidngvZUVDRUFRPSJ9" } }, { "ID": "35f04bf2400be96f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj1", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 02 May 2019 22:24:17 GMT" ], "Etag": [ "\"4a76bf516bfb99c648db7a04e6d51a6d\"" ], "Expires": [ "Thu, 02 May 2019 22:25:17 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:04 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:04 GMT" ], "X-Goog-Generation": [ "1556835844647225" ], "X-Goog-Hash": [ "crc32c=CT6dTA==", "md5=Sna/UWv7mcZI23oE5tUabQ==" ], "X-Goog-Metageneration": [ "4" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqC9teasrZdeHJo8KLaQQ251d02ORMxXreH3TKcaQp4NWLVbpiAw1GpW9WeSdFgbpWtVDdyzfjE93gAs6uA0kdlDPZsIEfJVK3GFfaZE2aW5aFCn8Y" ] }, "Body": "TuDshcL7vdCAXh8L42NvEQ==" } }, { "ID": "d01040504d2a91c4", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoib2JqMSJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "30343" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:17 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "Www-Authenticate": [ "Bearer realm=\"https://accounts.google.com/\"" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqRhLZOcm0K7eNByUzCBgYfgiytuZ6Hj06jPkbkK77LS80OPgO_78AL530-2AcrlLe1fIy0jM0tonLLncLuOszrqKcGgVhqEJuE48-67vqBRACjqmY" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS4iLCJsb2NhdGlvblR5cGUiOiJoZWFkZXIiLCJsb2NhdGlvbiI6IkF1dGhvcml6YXRpb24iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1MT0dJTl9SRVFVSVJFRCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9Y29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUxPR0lOX1JFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dW5hdXRob3JpemVkLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuYXV0aGVudGljYXRlZF91c2VyLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS4sIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1oZWFkZXJzLkF1dGhvcml6YXRpb24sIG1lc3NhZ2U9QW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMX0gQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e1dXVy1BdXRoZW50aWNhdGU9W0JlYXJlciByZWFsbT1cImh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9cIl19LCBodHRwU3RhdHVzPXVuYXV0aG9yaXplZCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9UkVRVUlSRUQsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LmF1dGhlbnRpY2F0ZWRfdXNlciwgbWVzc2FnZT1Bbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249aGVhZGVycy5BdXRob3JpemF0aW9uLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS4sIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDF9IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuYXV0aC5BdXRoZW50aWNhdG9ySW50ZXJjZXB0b3IuYWRkQ2hhbGxlbmdlSGVhZGVyKEF1dGhlbnRpY2F0b3JJbnRlcmNlcHRvci5qYXZhOjI2OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmF1dGguQXV0aGVudGljYXRvckludGVyY2VwdG9yLnByb2Nlc3NFcnJvclJlc3BvbnNlKEF1dGhlbnRpY2F0b3JJbnRlcmNlcHRvci5qYXZhOjIzNilcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmF1dGguR2FpYU1pbnRJbnRlcmNlcHRvci5wcm9jZXNzRXJyb3JSZXNwb25zZShHYWlhTWludEludGVyY2VwdG9yLmphdmE6NzY4KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuQXJvdW5kSW50ZXJjZXB0b3JXcmFwcGVyLnByb2Nlc3NFcnJvclJlc3BvbnNlKEFyb3VuZEludGVyY2VwdG9yV3JhcHBlci5qYXZhOjI4KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc3RhdHMuU3RhdHNCb290c3RyYXAkSW50ZXJjZXB0b3JTdGF0c1JlY29yZGVyLnByb2Nlc3NFcnJvclJlc3BvbnNlKFN0YXRzQm9vdHN0cmFwLmphdmE6MzE1KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24uaGFuZGxlRXJyb3JSZXNwb25zZShJbnRlcmNlcHRpb25zLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24uYWNjZXNzJDIwMChJbnRlcmNlcHRpb25zLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24kMS5jYWxsKEludGVyY2VwdGlvbnMuamF2YToxNDQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLmludGVyY2VwdC5JbnRlcmNlcHRpb25zJEFyb3VuZEludGVyY2VwdGlvbiQxLmNhbGwoSW50ZXJjZXB0aW9ucy5qYXZhOjEzNylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldEV4Y2VwdGlvbihBYnN0cmFjdEZ1dHVyZS5qYXZhOjc1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2OClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1MT0dJTl9SRVFVSVJFRCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPXVuYXV0aG9yaXplZCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9UkVRVUlSRUQsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LmF1dGhlbnRpY2F0ZWRfdXNlciwgbWVzc2FnZT1Bbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249aGVhZGVycy5BdXRob3JpemF0aW9uLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS4sIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDF9IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0Li4uIDIwIG1vcmVcbiJ9XSwiY29kZSI6NDAxLCJtZXNzYWdlIjoiQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLiJ9fQ==" } }, { "ID": "db327c92dac99584", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:18 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoa0LrEhOIeq-iYERbwsOkXjr0QR1ANe3tDsleUqoFNU7fRIruaqYikdnU1svzhc8iGRwx0A5dAGYQ_mM045LN_oxU1c76ugXtnWS2PW8wBcmst7hk" ] }, "Body": "" } }, { "ID": "e70c028bd3dc9250", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12275" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:18 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:18 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqrvFq18HewCbAkJcD7BmKgE8_WOFqSNkcwbpbNqCDPIy5jLVf2fIaHdg76_1rHuAHTtFM84Zr6euptOehRZOqA38Zc_BrJUSZKjg686imvazehpBc" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6Ok9CSkVDVF9OT1RfRk9VTkQ6IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6T0JKRUNUX05PVF9GT1VORDogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPW5vdEZvdW5kLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5OT1RfRk9VTkQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1OT1RfRk9VTkQsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLm5hbWUsIG1lc3NhZ2U9Tm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEsIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2VfaWQubmFtZSwgbWVzc2FnZT1ObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMSwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajE6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEifX0=" } }, { "ID": "4d7120b41e583669", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/copy-obj1?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12215" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:18 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:18 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UoJ1cGOQjoNiRk8qv-igyccVp3Vg_ut7NLSEO3A-yyQwgGnoXR5jPbi3tuomYWrS57GIvd6GpShkcAYSIJ2e94Jx_1SseYkYtlSF8a7qsDU0OVFYgM" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6Ok9CSkVDVF9OT1RfRk9VTkQ6IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6MzA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTo3MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5nZXQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjgxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6T0JKRUNUX05PVF9GT1VORDogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE5vIHN1Y2ggb2JqZWN0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29weS1vYmoxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPW5vdEZvdW5kLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5OT1RfRk9VTkQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjMwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6NzApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZ2V0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo4MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1OT1RfRk9VTkQsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLm5hbWUsIG1lc3NhZ2U9Tm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEsIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2VfaWQubmFtZSwgbWVzc2FnZT1ObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMSwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajE6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpPQkpFQ1RfTk9UX0ZPVU5EOiBObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvcHktb2JqMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjMwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6NzApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZ2V0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo4MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm8gc3VjaCBvYmplY3Q6IGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb3B5LW9iajEifX0=" } }, { "ID": "e7711da9b067a58f", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/composed1/compose?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "156" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6Im9iajEifSx7Im5hbWUiOiJvYmoyIn0seyJuYW1lIjoib2JqL3dpdGgvc2xhc2hlcyJ9XX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "750" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:19 GMT" ], "Etag": [ "CI2048Lx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoJ5Us6Rp03fUUqSAPFFGPuqW2qR4gCfzJ4w3W1Kx8C0JGfNDxte0QlBoVEi4K7rV5zkUY1IXQvIk6FOU3DxP8ECZdxkVJBW57Jf5iXo8kRyLVu7OA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb21wb3NlZDEvMTU1NjgzNTg1ODk2Mjk1NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMSIsIm5hbWUiOiJjb21wb3NlZDEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1ODk2Mjk1NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxOC45NjJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTguOTYyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE4Ljk2MloiLCJzaXplIjoiNDgiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQxP2dlbmVyYXRpb249MTU1NjgzNTg1ODk2Mjk1NyZhbHQ9bWVkaWEiLCJjcmMzMmMiOiJBYldCeVE9PSIsImNvbXBvbmVudENvdW50IjozLCJldGFnIjoiQ0kyMDQ4THgvZUVDRUFFPSJ9" } }, { "ID": "de5d78de4310ff60", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/composed1", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "48" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 02 May 2019 22:24:19 GMT" ], "Etag": [ "\"-CI2048Lx/eECEAE=\"" ], "Expires": [ "Thu, 02 May 2019 22:24:19 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:18 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Component-Count": [ "3" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:18 GMT" ], "X-Goog-Generation": [ "1556835858962957" ], "X-Goog-Hash": [ "crc32c=AbWByQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "48" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqprnxhGEtAMeMcwiKn43QTEdsHrB7k_jCjOqnvH984bk5CIjIhSalrDVNwlLb37IU67jIYyIY1Nq8uaSz5HGUROWwpE6SVmGvIGXnuAbTP7x8Ez5w" ] }, "Body": "TuDshcL7vdCAXh8L42NvEeeRmd+w7xhUEtz55BCr9yaRPt+QxetF2uGfY/b4R5Pm" } }, { "ID": "4b7c14a3f35089ce", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/composed2/compose?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "182" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50VHlwZSI6InRleHQvanNvbiJ9LCJzb3VyY2VPYmplY3RzIjpbeyJuYW1lIjoib2JqMSJ9LHsibmFtZSI6Im9iajIifSx7Im5hbWUiOiJvYmovd2l0aC9zbGFzaGVzIn1dfQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "776" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:19 GMT" ], "Etag": [ "CP+RiMPx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrMYc2wH1kAYUthDQQhZ4gGQU6kYXq6KGs1msu9ifujWYQ2dwS5ifqZFWiTYf74Rq2y9VkzALfhjkTK6anDL-SwHxUH3IwMe8j1rrrbaMbv7eLQCR8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb21wb3NlZDIvMTU1NjgzNTg1OTU2NDc5OSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMiIsIm5hbWUiOiJjb21wb3NlZDIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1OTU2NDc5OSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9qc29uIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE5LjU2NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxOS41NjRaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTkuNTY0WiIsInNpemUiOiI0OCIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDI/Z2VuZXJhdGlvbj0xNTU2ODM1ODU5NTY0Nzk5JmFsdD1tZWRpYSIsImNyYzMyYyI6IkFiV0J5UT09IiwiY29tcG9uZW50Q291bnQiOjMsImV0YWciOiJDUCtSaU1QeC9lRUNFQUU9In0=" } }, { "ID": "26a4cb091ed2f1bd", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/composed2", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "48" ], "Content-Type": [ "text/json" ], "Date": [ "Thu, 02 May 2019 22:24:19 GMT" ], "Etag": [ "\"-CP+RiMPx/eECEAE=\"" ], "Expires": [ "Thu, 02 May 2019 22:24:19 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:19 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Component-Count": [ "3" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:19 GMT" ], "X-Goog-Generation": [ "1556835859564799" ], "X-Goog-Hash": [ "crc32c=AbWByQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "48" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur-t-yqapXjBzjIrFWFhaT080f06JahbskCp0DC_-izUjPK4fYn556m2qyRDgj9HjkkDPtKR6dauzF5afjNZZ61bN_dTvw15d82A206-SdS1Jv_YM4" ] }, "Body": "TuDshcL7vdCAXh8L42NvEeeRmd+w7xhUEtz55BCr9yaRPt+QxetF2uGfY/b4R5Pm" } }, { "ID": "6b59ed7d3d098970", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50RW5jb2RpbmciOiJnemlwIiwibmFtZSI6Imd6aXAtdGVzdCJ9Cg==", "H4sIAAAAAAAA/2IgEgACAAD//7E97OkoAAAA" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3227" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:20 GMT" ], "Etag": [ "CNuJssPx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoXNmswaWh2Gfcz1pYPy7etwk09Nz_dmuYVq55M2p3ox38A3mC0QgoHf-hL1uCZxQvusJSIHeugTQvmCgZvRdXV-3juD0W8KI669m0EILAHSfnVoJ8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nemlwLXRlc3QvMTU1NjgzNTg2MDI1MTg2NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdCIsIm5hbWUiOiJnemlwLXRlc3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24veC1nemlwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjIwLjI1MVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyMC4yNTFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjAuMjUxWiIsInNpemUiOiIyNyIsIm1kNUhhc2giOiJPdEN3K2FSUklScUtHRkFFT2F4K3F3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ3ppcC10ZXN0P2dlbmVyYXRpb249MTU1NjgzNTg2MDI1MTg2NyZhbHQ9bWVkaWEiLCJjb250ZW50RW5jb2RpbmciOiJnemlwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ3ppcC10ZXN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJnemlwLXRlc3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imd6aXAtdGVzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYwMjUxODY3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ051SnNzUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2d6aXAtdGVzdC8xNTU2ODM1ODYwMjUxODY3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9nemlwLXRlc3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJnemlwLXRlc3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imd6aXAtdGVzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYwMjUxODY3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ051SnNzUHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiI5RGh3QkE9PSIsImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0=" } }, { "ID": "070a9af78f7967bf", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/gzip-test", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "none" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Type": [ "application/x-gzip" ], "Date": [ "Thu, 02 May 2019 22:24:20 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:20 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:20 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Accept-Encoding" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:20 GMT" ], "X-Goog-Generation": [ "1556835860251867" ], "X-Goog-Hash": [ "crc32c=9DhwBA==", "md5=OtCw+aRRIRqKGFAEOax+qw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "gzip" ], "X-Goog-Stored-Content-Length": [ "27" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UosPALnXk-3j5nBlDDWX7hBP4xBNcCe7lGNkEU-sHHTWsRexFWLoB-1gn8RfnlqS6Q5ZTrR86NBxpP1T0bFxgHnlYUYGh-G3mThRCgGIAWjXggOeOU" ] }, "Body": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" } }, { "ID": "3ece6665583d65fb", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/obj-not-exists", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "225" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:20 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:20 GMT" ], "Server": [ "UploadServer" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uph0zmuYk7ZmOWzbNkj24Iai85wz2vKj0mMnMkIHIoDUlDAUCA0e_CgFT5fV_XAvgUx06I9FspomkB_ImflSVCvj55GK6zEoY5iV1hN96nh4AmPBN0" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+Tm9TdWNoS2V5PC9Db2RlPjxNZXNzYWdlPlRoZSBzcGVjaWZpZWQga2V5IGRvZXMgbm90IGV4aXN0LjwvTWVzc2FnZT48RGV0YWlscz5ObyBzdWNoIG9iamVjdDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai1ub3QtZXhpc3RzPC9EZXRhaWxzPjwvRXJyb3I+" } }, { "ID": "602f4fdfff4e490c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoic2lnbmVkVVJMIn0K", "VGhpcyBpcyBhIHRlc3Qgb2YgU2lnbmVkVVJMLgo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3230" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:21 GMT" ], "Etag": [ "CNat6MPx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoWSi2VcVAHJJzhGSPjVT17kZYaCh3uZvWXBU0R4hVmPZJ10gvbv_Ucrfd2kwrBvRYoZaQcYkY5Q3M-oywiCNtLm6SM9InWHz2Omc-0pWJJjfQWPCM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zaWduZWRVUkwvMTU1NjgzNTg2MTE0MTIwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTCIsIm5hbWUiOiJzaWduZWRVUkwiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MTE0MTIwNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyMS4xNDBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjEuMTQwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjIxLjE0MFoiLCJzaXplIjoiMjkiLCJtZDVIYXNoIjoiSnl4dmd3bTluMk1zckdUTVBiTWVZQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTD9nZW5lcmF0aW9uPTE1NTY4MzU4NjExNDEyMDYmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc2lnbmVkVVJMLzE1NTY4MzU4NjExNDEyMDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJML2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzaWduZWRVUkwiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MTE0MTIwNiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc2lnbmVkVVJMLzE1NTY4MzU4NjExNDEyMDYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNpZ25lZFVSTCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ05hdDZNUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NpZ25lZFVSTC8xNTU2ODM1ODYxMTQxMjA2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zaWduZWRVUkwvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzaWduZWRVUkwiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MTE0MTIwNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc2lnbmVkVVJMLzE1NTY4MzU4NjExNDEyMDYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNpZ25lZFVSTCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ05hdDZNUHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJaVHFBTHc9PSIsImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In0=" } }, { "ID": "4a1c9dc802f4427c", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "119" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:23 GMT" ], "Etag": [ "CAc=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrbFZENfdiDkKpD_H_zm44x7h5bTZ3VD6MEoiiXuMwxHHK-zCSSoPRA2ALNUXoR3EcS1c-huuyZBIiw7ULKii7BNqKz0RMu4lWRxrDRQBOjGwKDDgE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQWM9In0=" } }, { "ID": "e12cb7360f4fd8dd", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/defaultObjectAcl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "684" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:23 GMT" ], "Etag": [ "CAc=" ], "Expires": [ "Thu, 02 May 2019 22:24:23 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrVJI9g41JQEDEgaIAOXKSCe2B8xklFKSoIciM7uC0uod7t7NzXfxsIrI6mQeZGkWa2B12xdKpSJBndrNbBvygZ6aXxpBBvL8d80NJ42u8KQC7AaFE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBYz0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQWM9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBYz0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBYz0ifV19" } }, { "ID": "d25b1dc2d7247768", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYWNsMSJ9Cg==", "/pXmp0sD+azbBKjod9MhwQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3631" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:24 GMT" ], "Etag": [ "COr+pcXx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UosBTMUgCzCYlGDKqRCN7Kexl832zyi4FxoRqfYtmTr8yv63z4BAQBeCTLajyZqMbRyzjje7TtPPYomUSv_8zrQ8bFdXlNzbTSeKK8kXi2Ys82jus4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxIiwibmFtZSI6ImFjbDEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI0LjI0N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyNC4yNDdaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjQuMjQ3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiIwRTl0Rk5wWmowL1dLT0o2ZlY5cGF3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMT9nZW5lcmF0aW9uPTE1NTY4MzU4NjQyNDgxNzAmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09yK3BjWHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDEvMTU1NjgzNTg2NDI0ODE3MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkZpRG1WZz09IiwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBRT0ifQ==" } }, { "ID": "1d3df0d90130f5fe", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYWNsMiJ9Cg==", "HSHw5Wsm5u7iJL/jjKkPVQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3631" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:24 GMT" ], "Etag": [ "CJrxw8Xx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpMl0_NB41LujALQWmul06CCiuw7okuKlhYG_qilsoXlld2qoYgc2-ABYogriA37QOJMK5ZlJ5sYzP2Mp7CTSzK9uccFLi10TdrGFMUjUpD0OvcXrE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyIiwibmFtZSI6ImFjbDIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI0LjczN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyNC43MzdaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjQuNzM3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJjOStPL3JnMjRIVEZCYytldFdqZWZnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMj9nZW5lcmF0aW9uPTE1NTY4MzU4NjQ3Mzc5NDYmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMi8xNTU2ODM1ODY0NzM3OTQ2L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSnJ4dzhYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMi8xNTU2ODM1ODY0NzM3OTQ2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0NzM3OTQ2IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0pyeHc4WHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDIvMTU1NjgzNTg2NDczNzk0Ni9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSnJ4dzhYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMi8xNTU2ODM1ODY0NzM3OTQ2L2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMi9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQ3Mzc5NDYiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDIvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQ3Mzc5NDYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSnJ4dzhYeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkF0TlJ0QT09IiwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifQ==" } }, { "ID": "a270daf4f72d9d3d", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/acl1/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2767" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:25 GMT" ], "Etag": [ "COr+pcXx/eECEAE=" ], "Expires": [ "Thu, 02 May 2019 22:24:25 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UranlihhkPcnPzTT2UYs4r6Hritk60lULu-pzO6YX-EWIlMlFiXzKmxaZVgOcPfnCgfJsRktKsL_TbFun1PfupraBREfYklCvRXKvJ_526gW-Jf9zs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09yK3BjWHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDEvMTU1NjgzNTg2NDI0ODE3MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDI0ODE3MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3IrcGNYeC9lRUNFQUU9In1dfQ==" } }, { "ID": "328125b2bc991e95", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/acl1/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:25 GMT" ], "Etag": [ "COr+pcXx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UosP78wuW4e1mPLJgcCbCxBC4Je5LWjKugd0fVK51u-P3qeXbQXj4_Amo25ZHyut2LZvoipvmK95xEvebSyVyzVydKyU2VSbHLDkwnRpR-nr9UGIf0" ] }, "Body": "" } }, { "ID": "1c7595376917851f", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:26 GMT" ], "Etag": [ "CAg=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqnZXiLrdCFoctnkKUqdvXLdSp9xumFk20gsRJc4xB1CTZ14aLZYwbDJmi90E28Q2_E4klaJBOaB1OCcpbDBoF1N9E9Bk3VEaNYYrHKMoECuO7RMPs" ] }, "Body": "" } }, { "ID": "4183198b151a3557", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/acl/user-jbd%40google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "109" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJ1c2VyLWpiZEBnb29nbGUuY29tIiwicm9sZSI6IlJFQURFUiJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "386" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:27 GMT" ], "Etag": [ "CAk=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo361-YkcyyOvd5CL4q3LgTM1Bk4RdkPY3cn-qOm6Dn0vghTnmIE9VKkzGiOnjRNnD7SWXGMqpxaCGvCt6P44D55PqOwAtVTF8PNwmEK9HWCoVXABo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvdXNlci1qYmRAZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvdXNlci1qYmRAZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InVzZXItamJkQGdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZW1haWwiOiJqYmRAZ29vZ2xlLmNvbSIsImV0YWciOiJDQWs9In0=" } }, { "ID": "e98f53a71d8839c9", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1789" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:28 GMT" ], "Etag": [ "CAk=" ], "Expires": [ "Thu, 02 May 2019 22:24:28 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrqACfvLjoBUrCN_6ksyMdPlv7yPWQGo1D9u1UiCCgFDRlEwr6NOp18BSxaeTuMIabf2ciNj7_Ba1W6YCz64HlcYyQOoEXNfGYGKcAqGTubXsGHPVk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FrPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQWs9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQWs9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvdXNlci1qYmRAZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvdXNlci1qYmRAZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImVudGl0eSI6InVzZXItamJkQGdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZW1haWwiOiJqYmRAZ29vZ2xlLmNvbSIsImV0YWciOiJDQWs9In1dfQ==" } }, { "ID": "28b9a29086758e65", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/acl/user-jbd%40google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:28 GMT" ], "Etag": [ "CAo=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UozsFdtI43Ltv91E18-CrdRZ4pQDVZXReJOVhpWDu3mxNA7rrWU7hNGl4kPMd0FgcVWDigZA5JBNsYbFV113Ew6Cp2uTsuk0uI1io_mhA6-Lmd2h18" ] }, "Body": "" } }, { "ID": "8ef9f7b6caefd750", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiZ29waGVyIn0K", "ZGF0YQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3196" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:29 GMT" ], "Etag": [ "CIXH3cfx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo97hrh9l4pmrJQqaH8Qu3axsdbEPH2Y8GSEso8-ExKuf4ot8o2uS79ROJcgCtql4vLQJ_4L8q0Z7E9E2WYbbl6vKUYKdQiCI0POisS9o_ViNh9-Yk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nb3BoZXIvMTU1NjgzNTg2OTM1MjgzNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2dvcGhlciIsIm5hbWUiOiJnb3BoZXIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2OTM1MjgzNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyOS4zNTJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjkuMzUyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI5LjM1MloiLCJzaXplIjoiNCIsIm1kNUhhc2giOiJqWGQvT0YwOS9zaUJYU0QzU1dBbTNBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ29waGVyP2dlbmVyYXRpb249MTU1NjgzNTg2OTM1MjgzNyZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nb3BoZXIvMTU1NjgzNTg2OTM1MjgzNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9nb3BoZXIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImdvcGhlciIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY5MzUyODM3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJWEgzY2Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nb3BoZXIvMTU1NjgzNTg2OTM1MjgzNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ29waGVyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiZ29waGVyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjkzNTI4MzciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSVhIM2NmeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ29waGVyLzE1NTY4MzU4NjkzNTI4MzcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2dvcGhlci9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImdvcGhlciIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY5MzUyODM3IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJWEgzY2Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nb3BoZXIvMTU1NjgzNTg2OTM1MjgzNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ29waGVyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiZ29waGVyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjkzNTI4MzciLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSVhIM2NmeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InJ0aDkwUT09IiwiZXRhZyI6IkNJWEgzY2Z4L2VFQ0VBRT0ifQ==" } }, { "ID": "ae3a5920bc8a9c3c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoi0JPQvtGE0LXRgNC+0LLQuCJ9Cg==", "ZGF0YQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3548" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:29 GMT" ], "Etag": [ "CPzK+8fx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrPLZGQqU8j04JqxMmfsqas3HGTlrdx5NM99YR5nCedJYGMSaZ1ynvd2UbUcdwps_gfRo__0XapzHuD3hM_bshff65qlnw_i2cOwp97N2EhfUsZ1X4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS/Qk9C+0YTQtdGA0L7QstC4LzE1NTY4MzU4Njk4NDQ4NjAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjgiLCJuYW1lIjoi0JPQvtGE0LXRgNC+0LLQuCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY5ODQ0ODYwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI5Ljg0NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyOS44NDRaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjkuODQ0WiIsInNpemUiOiI0IiwibWQ1SGFzaCI6ImpYZC9PRjA5L3NpQlhTRDNTV0FtM0E9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjg/Z2VuZXJhdGlvbj0xNTU2ODM1ODY5ODQ0ODYwJmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL9CT0L7RhNC10YDQvtCy0LgvMTU1NjgzNTg2OTg0NDg2MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjgvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ItCT0L7RhNC10YDQvtCy0LgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2OTg0NDg2MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUHpLKzhmeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEv0JPQvtGE0LXRgNC+0LLQuC8xNTU2ODM1ODY5ODQ0ODYwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiLQk9C+0YTQtdGA0L7QstC4IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Njk4NDQ4NjAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUHpLKzhmeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEv0JPQvtGE0LXRgNC+0LLQuC8xNTU2ODM1ODY5ODQ0ODYwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby8lRDAlOTMlRDAlQkUlRDElODQlRDAlQjUlRDElODAlRDAlQkUlRDAlQjIlRDAlQjgvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiLQk9C+0YTQtdGA0L7QstC4IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Njk4NDQ4NjAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1B6Sys4ZngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL9CT0L7RhNC10YDQvtCy0LgvMTU1NjgzNTg2OTg0NDg2MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vJUQwJTkzJUQwJUJFJUQxJTg0JUQwJUI1JUQxJTgwJUQwJUJFJUQwJUIyJUQwJUI4L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoi0JPQvtGE0LXRgNC+0LLQuCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY5ODQ0ODYwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1B6Sys4ZngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJydGg5MFE9PSIsImV0YWciOiJDUHpLKzhmeC9lRUNFQUU9In0=" } }, { "ID": "0104a746dbe20580", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYSJ9Cg==", "ZGF0YQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3116" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:30 GMT" ], "Etag": [ "COKVlMjx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqY12miALkWDvx8PHEyL23oxWZlw8Jq7Cn6kS8E8_Tn1tTWWoTuS_pWb5pi9qevCIvqK6aTK56MzwrMuy9axIjpw5yyMZ42MaWK_YFkBr95OnK5IbM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hLzE1NTY4MzU4NzAyNDc2NTAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hIiwibmFtZSI6ImEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDI0NzY1MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMC4yNDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzAuMjQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMwLjI0N1oiLCJzaXplIjoiNCIsIm1kNUhhc2giOiJqWGQvT0YwOS9zaUJYU0QzU1dBbTNBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYT9nZW5lcmF0aW9uPTE1NTY4MzU4NzAyNDc2NTAmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYS8xNTU2ODM1ODcwMjQ3NjUwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2EvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDI0NzY1MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT0tWbE1qeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYS8xNTU2ODM1ODcwMjQ3NjUwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODcwMjQ3NjUwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09LVmxNangvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2EvMTU1NjgzNTg3MDI0NzY1MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDI0NzY1MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT0tWbE1qeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYS8xNTU2ODM1ODcwMjQ3NjUwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODcwMjQ3NjUwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09LVmxNangvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJydGg5MFE9PSIsImV0YWciOiJDT0tWbE1qeC9lRUNFQUU9In0=" } }, { "ID": "da19af085be0fb47", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSJ9Cg==", "ZGF0YQ==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "19484" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:30 GMT" ], "Etag": [ "CLmmusjx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrAJr55dqTDkY_jBKB0vAWyE0owtzB_kEoH91_FKTr9C3bHd8fWUiTrsruL5mgwXg2l8gbPiOXad-A9HIJ3Zt_AeXq_p0m-Q8LrHQqJ6sAKsbzV4Zw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLzE1NTY4MzU4NzA4NzIzNzciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIiwibmFtZSI6ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDg3MjM3NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMC44NzJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzAuODcyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMwLjg3MloiLCJzaXplIjoiNCIsIm1kNUhhc2giOiJqWGQvT0YwOS9zaUJYU0QzU1dBbTNBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYT9nZW5lcmF0aW9uPTE1NTY4MzU4NzA4NzIzNzcmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS8xNTU2ODM1ODcwODcyMzc3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDg3MjM3NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTG1tdXNqeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS8xNTU2ODM1ODcwODcyMzc3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODcwODcyMzc3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xtbXVzangvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEvMTU1NjgzNTg3MDg3MjM3Ny9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MDg3MjM3NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTG1tdXNqeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS8xNTU2ODM1ODcwODcyMzc3L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODcwODcyMzc3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xtbXVzangvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJydGg5MFE9PSIsImV0YWciOiJDTG1tdXNqeC9lRUNFQUU9In0=" } }, { "ID": "96f915707a76c50c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAifQo=", "ZGF0YQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "2948" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:31 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrQIwi81TFCNpDIZUjs_5tSUFqURLnaBF7g2l1sGMuHCTWZeLyr45VWkcc8fUDYnF-P84QixYQbTzJGuJzOOx7mw1qluYDqoORFGPICfvKmNxrZM3A" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IlJlcXVpcmVkIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89bnVsbCwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLlJFUVVJUkVELCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuaWQubmFtZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlLmlkLm5hbWUsIG1lc3NhZ2U9UmVxdWlyZWQsIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDB9IFJlcXVpcmVkXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAwLCJtZXNzYWdlIjoiUmVxdWlyZWQifX0=" } }, { "ID": "7a562d6e65ef8a7a", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEifQo=", "ZGF0YQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "4785" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:31 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Ups-3Re4_9njFMmkYwND6BuK5cgxs5tKVRwQ2CGkcks-K0aALbethXTYaEb6fLos6w_FSnM8YkPGM3TETCAoyYpVbQPlotXR9CH3DXngjQNv0yv_ZQ" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiVGhlIG1heGltdW0gb2JqZWN0IGxlbmd0aCBpcyAxMDI0IGNoYXJhY3RlcnMsIGJ1dCBnb3QgYSBuYW1lIHdpdGggMTAyNSBjaGFyYWN0ZXJzOiAnJ2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLi4uJyciLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPW51bGwsIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5JTlZBTElEX1ZBTFVFLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1JTlZBTElEX1ZBTFVFLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5pZC5uYW1lLCBtZXNzYWdlPVRoZSBtYXhpbXVtIG9iamVjdCBsZW5ndGggaXMgMTAyNCBjaGFyYWN0ZXJzLCBidXQgZ290IGEgbmFtZSB3aXRoIDEwMjUgY2hhcmFjdGVyczogJydhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS4uLicnLCB1bm5hbWVkQXJndW1lbnRzPVthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYV19LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuaWQubmFtZSwgbWVzc2FnZT1UaGUgbWF4aW11bSBvYmplY3QgbGVuZ3RoIGlzIDEwMjQgY2hhcmFjdGVycywgYnV0IGdvdCBhIG5hbWUgd2l0aCAxMDI1IGNoYXJhY3RlcnM6ICcnYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEuLi4nJywgcmVhc29uPWludmFsaWQsIHJwY0NvZGU9NDAwfSBUaGUgbWF4aW11bSBvYmplY3QgbGVuZ3RoIGlzIDEwMjQgY2hhcmFjdGVycywgYnV0IGdvdCBhIG5hbWUgd2l0aCAxMDI1IGNoYXJhY3RlcnM6ICcnYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEuLi4nJ1xuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IlRoZSBtYXhpbXVtIG9iamVjdCBsZW5ndGggaXMgMTAyNCBjaGFyYWN0ZXJzLCBidXQgZ290IGEgbmFtZSB3aXRoIDEwMjUgY2hhcmFjdGVyczogJydhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS4uLicnIn19" } }, { "ID": "239b642e1919a84a", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoibmV3XG5saW5lcyJ9Cg==", "ZGF0YQ==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "3270" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:31 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Urk-XOPoshQkyIHYZp241R2W5lOuLwqPMx606rubzPOaGggM2z_sZO93dYCJHffXuPDOjy64lIxrBXIYW4QT04eM932jPtzPdVd-PFWssV9RYk83JE" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiRGlzYWxsb3dlZCB1bmljb2RlIGNoYXJhY3RlcnMgcHJlc2VudCBpbiBvYmplY3QgbmFtZSAnJ25ld1xubGluZXMnJyIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1JTlZBTElEX1ZBTFVFLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89bnVsbCwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLklOVkFMSURfVkFMVUUsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPW51bGwsIGVycm9yUHJvdG9Db2RlPUlOVkFMSURfVkFMVUUsIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlLmlkLm5hbWUsIG1lc3NhZ2U9RGlzYWxsb3dlZCB1bmljb2RlIGNoYXJhY3RlcnMgcHJlc2VudCBpbiBvYmplY3QgbmFtZSAnJ25ld1xubGluZXMnJywgdW5uYW1lZEFyZ3VtZW50cz1bbmV3XG5saW5lc119LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuaWQubmFtZSwgbWVzc2FnZT1EaXNhbGxvd2VkIHVuaWNvZGUgY2hhcmFjdGVycyBwcmVzZW50IGluIG9iamVjdCBuYW1lICcnbmV3XG5saW5lcycnLCByZWFzb249aW52YWxpZCwgcnBjQ29kZT00MDB9IERpc2FsbG93ZWQgdW5pY29kZSBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gb2JqZWN0IG5hbWUgJyduZXdcbmxpbmVzJydcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJEaXNhbGxvd2VkIHVuaWNvZGUgY2hhcmFjdGVycyBwcmVzZW50IGluIG9iamVjdCBuYW1lICcnbmV3XG5saW5lcycnIn19" } }, { "ID": "3cd795cb0b675f98", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:31 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpOXjD9T_c_FRByyyA-CjE753kXZefEzIwQdrNG6OewoHOvKC3Bb9LleziQ6-ymVDg-F1S1eeQeFNJH7nJxDsdA_VmxOjeBzTDB_F3--_1NtwMF6Do" ] }, "Body": "" } }, { "ID": "361d4541e2cb460a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/a?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:31 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpomJFlpfOIJoFvdCmQgD2dRXSREzV1ToI2ntcHi8I9tSyzMCUk0ZrytllkwR_nU8WFZ0YuXVl0Kwsq1EhJL85RlBgCkBNc1P-yVMyNbdt5YrooKok" ] }, "Body": "" } }, { "ID": "a4e929446e49411d", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/%D0%93%D0%BE%D1%84%D0%B5%D1%80%D0%BE%D0%B2%D0%B8?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:31 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqmdInqhuXhUxVjtfRvXvHd6Rmo1ODUbeNFFTBW4diuT7HDjzmYnvd4TU6oJPqbck52yFAR99fMx4Tks1TllSUCB4GsMVbBNENfZU6te-hXIB8XyJs" ] }, "Body": "" } }, { "ID": "89b2ef62a071f7b9", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/gopher?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:24:32 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrRgapcSgK1GOswXS37Vynb9BRj0go8bNPOBtrFZ3TDr-nzIdlvKBQuwHtXl4Tlb-mLl-A65zL5Iw3unCEuy6lwtWl5-V7REtcIVHkrWLK5AoLoHqA" ] }, "Body": "" } }, { "ID": "ca91b2e4ee4555cb", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiY29udGVudCJ9Cg==", "SXQgd2FzIHRoZSBiZXN0IG9mIHRpbWVzLCBpdCB3YXMgdGhlIHdvcnN0IG9mIHRpbWVzLg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3213" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:32 GMT" ], "Etag": [ "CLGNmsnx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UovWW5HSrWbcvQoWGU3c_n64wwcau06tjEM-fzdADFSbmmylG3VLjae6MRNIM4B9gDitCKfjo1_xPQNAZEmMYzRplVmdI4cIrBC8ursFSUywoCSJeU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzI0NDIwMzMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMi40NDFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzIuNDQxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMyLjQ0MVoiLCJzaXplIjoiNTIiLCJtZDVIYXNoIjoiSzI4NUF3S1dXZlZSZEJjQ1VYaHpOZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQ/Z2VuZXJhdGlvbj0xNTU2ODM1ODcyNDQyMDMzJmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzI0NDIwMzMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMR05tc254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzI0NDIwMzMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzI0NDIwMzMiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMR05tc254L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiRmNYTThRPT0iLCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9" } }, { "ID": "eb678345630fe080", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3213" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:32 GMT" ], "Etag": [ "CLGNmsnx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrtPOErXGrnlQtXCV1PhgO5nz80m75Fzs7DoR-y8Ava3jvL9NDJ4L-i8SIV_tktR8VqCvv9uh-X1ltJCj3isa_oY8TlV-OsZeIiESuDrRTYueQWQP0" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzI0NDIwMzMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMi40NDFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzIuNDQxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMyLjQ0MVoiLCJzaXplIjoiNTIiLCJtZDVIYXNoIjoiSzI4NUF3S1dXZlZSZEJjQ1VYaHpOZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQ/Z2VuZXJhdGlvbj0xNTU2ODM1ODcyNDQyMDMzJmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzI0NDIwMzMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNMR05tc254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzI0NDIwMzMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzI0NDIwMzMiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MjQ0MjAzMy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MjQ0MjAzMyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNMR05tc254L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiRmNYTThRPT0iLCJldGFnIjoiQ0xHTm1zbngvZUVDRUFFPSJ9" } }, { "ID": "d76ba152a62e7dc1", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJuYW1lIjoiY29udGVudCJ9Cg==", "PGh0bWw+PGhlYWQ+PHRpdGxlPk15IGZpcnN0IHBhZ2U8L3RpdGxlPjwvaGVhZD48L2h0bWw+" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3212" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:33 GMT" ], "Etag": [ "CLPJv8nx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqk5XoKCyt74JBpeU8oREfzh3e0LLtXupBjcWtsFfHNZDEn4DjcmzWo6resyQ1gEisBp_STlU4hVaU3MbTyX3LM443_Gsu4ouZGdf3ZTvTzsLD_zNw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzMwNTU5MjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMzLjA1NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMy4wNTVaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzMuMDU1WiIsInNpemUiOiI1NCIsIm1kNUhhc2giOiJOOHA4L3M5RndkQUFubHZyL2xFQWpRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudD9nZW5lcmF0aW9uPTE1NTY4MzU4NzMwNTU5MjMmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczMDU1OTIzIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xQSnY4bngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MzA1NTkyMy9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczMDU1OTIzIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xQSnY4bngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJHb1Vic1E9PSIsImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0=" } }, { "ID": "f785ed7f0490bb6d", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3212" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:33 GMT" ], "Etag": [ "CLPJv8nx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrCqpaad9mhxk7VZgTc8xIunote5-AHPp3vYkUbSU8uiVcq65rcnrbtIuCqJ63JTuVJvKw7pFwnLjyn5fL37JzfXLhmLAowAV67_Qqtxxhiy4WQars" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzMwNTU5MjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMzLjA1NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMy4wNTVaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzMuMDU1WiIsInNpemUiOiI1NCIsIm1kNUhhc2giOiJOOHA4L3M5RndkQUFubHZyL2xFQWpRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudD9nZW5lcmF0aW9uPTE1NTY4MzU4NzMwNTU5MjMmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczMDU1OTIzIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0xQSnY4bngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3MzA1NTkyMy9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3MzA1NTkyMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczMDU1OTIzL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczMDU1OTIzIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0xQSnY4bngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJHb1Vic1E9PSIsImV0YWciOiJDTFBKdjhueC9lRUNFQUU9In0=" } }, { "ID": "096d156b863922d6", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvaHRtbCIsIm5hbWUiOiJjb250ZW50In0K", "PGh0bWw+PGhlYWQ+PHRpdGxlPk15IGZpcnN0IHBhZ2U8L3RpdGxlPjwvaGVhZD48L2h0bWw+" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3197" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:33 GMT" ], "Etag": [ "CPW+6cnx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoivaSzjVdOm2KP4nXCF8VQDNHXmlNjm9rZwTaWzjvBmH3oK01QYTnHqZ5DhYRewu_1H0KoQgFpUIC-M4OKZoOhRHrq0-H8HLT__SqD1D5cmezrqHo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzM3NDI3MDkiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMzLjc0MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMy43NDJaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzMuNzQyWiIsInNpemUiOiI1NCIsIm1kNUhhc2giOiJOOHA4L3M5RndkQUFubHZyL2xFQWpRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudD9nZW5lcmF0aW9uPTE1NTY4MzU4NzM3NDI3MDkmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczNzQyNzA5IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BXKzZjbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3Mzc0MjcwOS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczNzQyNzA5IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BXKzZjbngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJHb1Vic1E9PSIsImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0=" } }, { "ID": "0e96d304e9558094", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3197" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:34 GMT" ], "Etag": [ "CPW+6cnx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoc-8JwtQprLtec5Ft6q3z4p0ooDaCCLmO9oVgrOXvBpoFhApztj8anfFwEcHdzpB6FBlUFqou0viF_HLHJvHolsxeCCoDOhqyIggOOlWjnSRg8XzY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzM3NDI3MDkiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9odG1sIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjMzLjc0MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozMy43NDJaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzMuNzQyWiIsInNpemUiOiI1NCIsIm1kNUhhc2giOiJOOHA4L3M5RndkQUFubHZyL2xFQWpRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudD9nZW5lcmF0aW9uPTE1NTY4MzU4NzM3NDI3MDkmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczNzQyNzA5IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BXKzZjbngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3Mzc0MjcwOS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3Mzc0MjcwOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODczNzQyNzA5L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODczNzQyNzA5IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BXKzZjbngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJHb1Vic1E9PSIsImV0YWciOiJDUFcrNmNueC9lRUNFQUU9In0=" } }, { "ID": "b4c8dedc10a69e07", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6ImltYWdlL2pwZWciLCJuYW1lIjoiY29udGVudCJ9Cg==", "PGh0bWw+PGhlYWQ+PHRpdGxlPk15IGZpcnN0IHBhZ2U8L3RpdGxlPjwvaGVhZD48L2h0bWw+" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3198" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:34 GMT" ], "Etag": [ "CM/Yjsrx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpC3UBVkNENjfRoaL2M1fPRh-iTDTwCsgF8O3TOX_iBuXcDxMjOoTmrIhD4cE5g1s7PObP66TZB1lecFypnLz8hL-aowsOxUMuL0KXJvrgoGxKHUFg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiaW1hZ2UvanBlZyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNC4zNTFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzQuMzUxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM0LjM1MVoiLCJzaXplIjoiNTQiLCJtZDVIYXNoIjoiTjhwOC9zOUZ3ZEFBbmx2ci9sRUFqUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQ/Z2VuZXJhdGlvbj0xNTU2ODM1ODc0MzUyMjA3JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiR29VYnNRPT0iLCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9" } }, { "ID": "c45640ec17230f64", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3198" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:34 GMT" ], "Etag": [ "CM/Yjsrx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrvqLsOaMe2H6Xh3MyDCOuHmLzU1fn_Zh6kHLkpTpn4EWj3nFkeROu1g-cABD151cTh8YmY798iEku-Q3TnZIMZ5mexmHiCJKdUhAolbSd9b_apMK8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50IiwibmFtZSI6ImNvbnRlbnQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiaW1hZ2UvanBlZyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNC4zNTFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzQuMzUxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM0LjM1MVoiLCJzaXplIjoiNTQiLCJtZDVIYXNoIjoiTjhwOC9zOUZ3ZEFBbmx2ci9sRUFqUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQ/Z2VuZXJhdGlvbj0xNTU2ODM1ODc0MzUyMjA3JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbnRlbnQvMTU1NjgzNTg3NDM1MjIwNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbnRlbnQiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NDM1MjIwNyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiR29VYnNRPT0iLCJldGFnIjoiQ00vWWpzcngvZUVDRUFFPSJ9" } }, { "ID": "752ab630b062d61e", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiY3VzdG9tZXItZW5jcnlwdGlvbiJ9Cg==", "dG9wIHNlY3JldC4=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3482" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:35 GMT" ], "Etag": [ "CPjnucrx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpaWw6jJMKNOoCNMXwJNVVsxqzPhGfMo-5g3krJ7A8_PSGTx4W2OakfmtDvzOpg1hexLJcsWunNHfyWVXsjBpM58dtQlM6VucQW4Uxndlb9RIp0UhM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuMDU4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24/Z2VuZXJhdGlvbj0xNTU2ODM1ODc1MDU4NjgwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoicjBOR3JnPT0iLCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0=" } }, { "ID": "3f4d8fd0e94ca6de", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3425" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:35 GMT" ], "Etag": [ "CPjnucrx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoO-NbHUptMgzQPx9zApWGCeqMgfkk2mt6PJl1iWbq8ocUYq_0ud8gPuj9bcBTBOBdqewKzSouddziC-BFLoOdQJ6ElkN136q5y39ZRDN4zq6UWLUs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuMDU4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbj9nZW5lcmF0aW9uPTE1NTY4MzU4NzUwNTg2ODAmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0=" } }, { "ID": "0355971107342253", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3482" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:35 GMT" ], "Etag": [ "CPjnucrx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UryZM2k28xNlFIDnXCH6SJ8RA2lDVNIx-5_eYRExB4-D1-dg_3fWvU3AREwoow4DvlYN4eyzA1AthWs5y0tYZEzvamBoZufkrXPmD64aT8kzAatns8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuMDU4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24/Z2VuZXJhdGlvbj0xNTU2ODM1ODc1MDU4NjgwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoicjBOR3JnPT0iLCJldGFnIjoiQ1BqbnVjcngvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0=" } }, { "ID": "8f8c7cba5307c918", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "85" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3448" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:36 GMT" ], "Etag": [ "CPjnucrx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Upnljw7UWMuKFeJUJp_gu-lyfzDRVTwgInddze_9zF5waX4glKKpcRrGpe50cvS8dV_xbbKLQa-CqAMVxlEp7qIHsmTdUR1amjrq0w9U_qrn4gYwSw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuOTIwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbj9nZW5lcmF0aW9uPTE1NTY4MzU4NzUwNTg2ODAmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUGpudWNyeC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQUk9IiwiY3VzdG9tZXJFbmNyeXB0aW9uIjp7ImVuY3J5cHRpb25BbGdvcml0aG0iOiJBRVMyNTYiLCJrZXlTaGEyNTYiOiJIK0xtblhoUm9lSTZUTVc1YnNWNkh5VWs2cHlHYzJJTWJxWWJBWEJjcHMwPSJ9fQ==" } }, { "ID": "fc766ddbbfcd9d8a", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "85" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3505" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:36 GMT" ], "Etag": [ "CPjnucrx/eECEAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqlTuEeQHkdcuHKu_aWtuYjopXaORKyG9TF597i1ybzIPgJHE_oiKH-xYwG_D2txhF_Sv6Jzfy44Dfga1bINCpPLseDEeD_Ez4rvxx8baTX1uJ7lJo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uIiwibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNS4wNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzYuMjI1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24/Z2VuZXJhdGlvbj0xNTU2ODM1ODc1MDU4NjgwJmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUGpudWNyeC9lRUNFQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi8xNTU2ODM1ODc1MDU4NjgwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1BqbnVjcngvZUVDRUFNPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJyME5Hcmc9PSIsImV0YWciOiJDUGpudWNyeC9lRUNFQU09IiwiY3VzdG9tZXJFbmNyeXB0aW9uIjp7ImVuY3J5cHRpb25BbGdvcml0aG0iOiJBRVMyNTYiLCJrZXlTaGEyNTYiOiJIK0xtblhoUm9lSTZUTVc1YnNWNkh5VWs2cHlHYzJJTWJxWWJBWEJjcHMwPSJ9fQ==" } }, { "ID": "fb1e502029272329", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "277" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:36 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:36 GMT" ], "Server": [ "UploadServer" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Urm5pF1ghApp-RiVg_TAipd-LdTbF-hcDPcVRYbmj7KUIQxnsMUF5WOcrMA1t7ZltdvPZhyfsELISuH6DGJlUUedaCNH-B5j580GjBYLUKCwmAADeM" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+UmVzb3VyY2VJc0VuY3J5cHRlZFdpdGhDdXN0b21lckVuY3J5cHRpb25LZXk8L0NvZGU+PE1lc3NhZ2U+VGhlIHJlc291cmNlIGlzIGVuY3J5cHRlZCB3aXRoIGEgY3VzdG9tZXIgZW5jcnlwdGlvbiBrZXkuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjwvRGV0YWlscz48L0Vycm9yPg==" } }, { "ID": "c151ba4fab0c6499", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 02 May 2019 22:24:36 GMT" ], "Etag": [ "\"-CPjnucrx/eECEAM=\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:35 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:35 GMT" ], "X-Goog-Generation": [ "1556835875058680" ], "X-Goog-Hash": [ "crc32c=r0NGrg==", "md5=xwWNFa0VdXPmlAwrlcAJcg==" ], "X-Goog-Metageneration": [ "3" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur68mIGQ8VAtTRZs4F6ixZZYKcqe1oTqWHWqmp7gNF-81XKf2xX6eS4PcegbKx7bYnb4i6dzTCoLlbaJRNHwwLVzNbYMkGNy_bTHbWYTgtlBSKVtWs" ] }, "Body": "dG9wIHNlY3JldC4=" } }, { "ID": "e09c6326cc60ad82", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12563" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:36 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqldLQvGKuu2fihIdwh7CvU7W0yE3vUXu8jqefTPSMhlGgvR1EfeYFqjk_Zxj7fEpv7AjugvHnn1DmkJxJWhrZyM8b5gS4uJID92D_018h2YHH1r30" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlc291cmNlSXNFbmNyeXB0ZWRXaXRoQ3VzdG9tZXJFbmNyeXB0aW9uS2V5IiwibWVzc2FnZSI6IlRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiIsImV4dGVuZGVkSGVscCI6Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMiLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUlOVkFMSURfVkFMVUUsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPWh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4uUkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVksIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWSwgZXJyb3JQcm90b0RvbWFpbj1jbG91ZC5iaWdzdG9yZS5hcGkuQmlnc3RvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9VGhlIHJlcXVlc3RlZCBvYmplY3QgaXMgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1UaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4sIHJlYXNvbj1yZXNvdXJjZUlzRW5jcnlwdGVkV2l0aEN1c3RvbWVyRW5jcnlwdGlvbktleSwgcnBjQ29kZT00MDB9IFRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlJFU09VUkNFX0lTX0VOQ1JZUFRFRF9XSVRIX0NVU1RPTUVSX0VOQ1JZUFRJT05fS0VZXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QucmV3cml0ZShSZXdyaXRlT2JqZWN0LmphdmE6MjAwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjE5Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5yZXdyaXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJUaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4ifX0=" } }, { "ID": "6c83b36cc6fc482c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Copy-Source-Encryption-Algorithm": [ "AES256" ], "X-Goog-Copy-Source-Encryption-Key": [ "CLEARED" ], "X-Goog-Copy-Source-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3527" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:37 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqGOUzu40Jq-_GztkQxoFN64MHcSoZjph7ivV8tqrp6ENxFIB0c82xqEdKKfcpqbJ2YXtXQgwflZgX-uiVOgGY_1c8SLoV7geQMfErTz1Q0NDM4YDM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3NzEwODYxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMiIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NzEwODYxNCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNy4xMDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzcuMTA4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM3LjEwOFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMj9nZW5lcmF0aW9uPTE1NTY4MzU4NzcxMDg2MTQmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3NzEwODYxNC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc3MTA4NjE0IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJYjN0c3Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3NzEwODYxNC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzcxMDg2MTQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSWIzdHN2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4NzcxMDg2MTQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc3MTA4NjE0IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJYjN0c3Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3NzEwODYxNC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzcxMDg2MTQiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSWIzdHN2eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InIwTkdyZz09IiwiZXRhZyI6IkNJYjN0c3Z4L2VFQ0VBRT0ifX0=" } }, { "ID": "e499f3b7077fb222", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-2", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 02 May 2019 22:24:37 GMT" ], "Etag": [ "\"c7058d15ad157573e6940c2b95c00972\"" ], "Expires": [ "Thu, 02 May 2019 22:24:37 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:37 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:37 GMT" ], "X-Goog-Generation": [ "1556835877108614" ], "X-Goog-Hash": [ "crc32c=r0NGrg==", "md5=xwWNFa0VdXPmlAwrlcAJcg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpfEf1WUM8E5dSmOe1sOfgheagnlrcFUolvMMBiP6jDvPqoS7Sx0IwklM-DwnuAbBJPQ_EHhX-42njQu9vUjXqamH1U6np0Vmi0BngqFYOTc9MVP3M" ] }, "Body": "dG9wIHNlY3JldC4=" } }, { "ID": "9e67dfa901c4e619", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12563" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:37 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UoYPZ-j39Sr1Whn6F3PYeVaxqIIjS_fBgSNkBO7f7B8RMWih6iCCLf1cPDXB3Br-0XBkdm6i9N9fGeK84_laVYWuJc0uJwSCXydk0bSWezw0qec5yE" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlc291cmNlSXNFbmNyeXB0ZWRXaXRoQ3VzdG9tZXJFbmNyeXB0aW9uS2V5IiwibWVzc2FnZSI6IlRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiIsImV4dGVuZGVkSGVscCI6Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMiLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUlOVkFMSURfVkFMVUUsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPWh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4uUkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVksIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWSwgZXJyb3JQcm90b0RvbWFpbj1jbG91ZC5iaWdzdG9yZS5hcGkuQmlnc3RvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9VGhlIHJlcXVlc3RlZCBvYmplY3QgaXMgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1UaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4sIHJlYXNvbj1yZXNvdXJjZUlzRW5jcnlwdGVkV2l0aEN1c3RvbWVyRW5jcnlwdGlvbktleSwgcnBjQ29kZT00MDB9IFRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlJFU09VUkNFX0lTX0VOQ1JZUFRFRF9XSVRIX0NVU1RPTUVSX0VOQ1JZUFRJT05fS0VZXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QucmV3cml0ZShSZXdyaXRlT2JqZWN0LmphdmE6MjAwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjE5Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5yZXdyaXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJUaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4ifX0=" } }, { "ID": "670f74ac2a0b734e", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Copy-Source-Encryption-Algorithm": [ "AES256" ], "X-Goog-Copy-Source-Encryption-Key": [ "CLEARED" ], "X-Goog-Copy-Source-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3640" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:38 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoWwxnT2DHS1ymBhZJmnwxQiajAVYbOH62dyhX86syLNW_TlPnzYaM_7kACpN8ar5EeAHQ9fsMSHP4CqMcb6ZWg5KY3OkbPvfitdLalAA9MXxMFqoo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODE4MzI1MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMiIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3ODE4MzI1MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozOC4xODJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzguMTgyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM4LjE4MloiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMj9nZW5lcmF0aW9uPTE1NTY4MzU4NzgxODMyNTEmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODE4MzI1MS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc4MTgzMjUxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOUEMrTXZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODE4MzI1MS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzgxODMyNTEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTlBDK012eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4NzgxODMyNTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc4MTgzMjUxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOUEMrTXZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODE4MzI1MS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzgxODMyNTEiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTlBDK012eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InIwTkdyZz09IiwiZXRhZyI6IkNOUEMrTXZ4L2VFQ0VBRT0iLCJjdXN0b21lckVuY3J5cHRpb24iOnsiZW5jcnlwdGlvbkFsZ29yaXRobSI6IkFFUzI1NiIsImtleVNoYTI1NiI6IkZuQnZmUTFkRHN5UzhrSEQrYUI2SEhJZ2xEb1E1SW03V1lEbTNYWVRHclE9In19fQ==" } }, { "ID": "9c6e7ad2d8e2c68a", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-2", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "277" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:38 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:38 GMT" ], "Server": [ "UploadServer" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UoSrQtDkljyQ-aUJoC8m6nY20wZiHLTwh4znEZ5hyKxLQUrZIi7PnU416twfTwfPXWvd4cPGZC3NVdpJWg332KnUKSEdFPY2BQwLJ-_9S5eVdwMrf8" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+UmVzb3VyY2VJc0VuY3J5cHRlZFdpdGhDdXN0b21lckVuY3J5cHRpb25LZXk8L0NvZGU+PE1lc3NhZ2U+VGhlIHJlc291cmNlIGlzIGVuY3J5cHRlZCB3aXRoIGEgY3VzdG9tZXIgZW5jcnlwdGlvbiBrZXkuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjwvRGV0YWlscz48L0Vycm9yPg==" } }, { "ID": "b5fbec9f26148f95", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-2", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Language": [ "en" ], "Content-Length": [ "11" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 02 May 2019 22:24:38 GMT" ], "Etag": [ "\"-CNPC+Mvx/eECEAE=\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:38 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key-Sha256": [ "FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:38 GMT" ], "X-Goog-Generation": [ "1556835878183251" ], "X-Goog-Hash": [ "crc32c=r0NGrg==", "md5=xwWNFa0VdXPmlAwrlcAJcg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "11" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpTr8Qws5nL-el_ied6M7FYtryiLpFfhGNN-TxakIl1FCAOBJwMeq6_KBQ0l4UmT8VePQQ9h_S8r55NolBB1Ex12-iKvooCkTsNmvQ4rE4hOqQGbLc" ] }, "Body": "dG9wIHNlY3JldC4=" } }, { "ID": "616de25561ebbffa", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Copy-Source-Encryption-Algorithm": [ "AES256" ], "X-Goog-Copy-Source-Encryption-Key": [ "CLEARED" ], "X-Goog-Copy-Source-Encryption-Key-Sha256": [ "FnBvfQ1dDsyS8kHD+aB6HHIglDoQ5Im7WYDm3XYTGrQ=" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3640" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:39 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqyD8XYw6tgOBbcxdUIVAw_vXrrryw0bgh-L-jRW0hyJt0lCHU9K26isn6tykgml7UgX52dgw65xD_ht4yxbHkY_VFl6MkEY6H-mWRx0_52xj49RW8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODk5ODUxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMiIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3ODk5ODUxMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozOC45OThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzguOTk4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM4Ljk5OFoiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMj9nZW5lcmF0aW9uPTE1NTY4MzU4Nzg5OTg1MTEmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODk5ODUxMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc4OTk4NTExIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPK2pxc3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODk5ODUxMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Nzg5OTg1MTEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTytqcXN6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4Nzg5OTg1MTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc4OTk4NTExIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPK2pxc3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg3ODk5ODUxMS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Nzg5OTg1MTEiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTytqcXN6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InIwTkdyZz09IiwiZXRhZyI6IkNPK2pxc3p4L2VFQ0VBRT0iLCJjdXN0b21lckVuY3J5cHRpb24iOnsiZW5jcnlwdGlvbkFsZ29yaXRobSI6IkFFUzI1NiIsImtleVNoYTI1NiI6IkgrTG1uWGhSb2VJNlRNVzVic1Y2SHlVazZweUdjMklNYnFZYkFYQmNwczA9In19fQ==" } }, { "ID": "2ddf1402c6efc3a8", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-3/compose?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "160" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24ifSx7Im5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIifV19Cg==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13334" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:39 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrFitgTFIY6yt8kk3zprPGtWncWc7Ad6oUFVXVdE0O3QqK0qlYGB7RSw-dwN1AvMk4Sndi8gR22cF8qs88ZlmdAxB-1zYdUNqwArmpP2xni66xX-L4" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlc291cmNlSXNFbmNyeXB0ZWRXaXRoQ3VzdG9tZXJFbmNyeXB0aW9uS2V5IiwibWVzc2FnZSI6IlRoZSB0YXJnZXQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiIsImV4dGVuZGVkSGVscCI6Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9zdG9yYWdlL2RvY3MvZW5jcnlwdGlvbiNjdXN0b21lci1zdXBwbGllZF9lbmNyeXB0aW9uX2tleXMiLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uKSBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uKSBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWTogQ29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6MTk5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmNvbXBvc2UoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1odHRwczovL2Nsb3VkLmdvb2dsZS5jb20vc3RvcmFnZS9kb2NzL2VuY3J5cHRpb24jY3VzdG9tZXItc3VwcGxpZWRfZW5jcnlwdGlvbl9rZXlzLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLlJFU09VUkNFX0lTX0VOQ1JZUFRFRF9XSVRIX0NVU1RPTUVSX0VOQ1JZUFRJT05fS0VZLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVTT1VSQ0VfSVNfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uKSBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uKSBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWSwgZXJyb3JQcm90b0RvbWFpbj1jbG91ZC5iaWdzdG9yZS5hcGkuQmlnc3RvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9Q29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9VGhlIHRhcmdldCBvYmplY3QgaXMgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuLCByZWFzb249cmVzb3VyY2VJc0VuY3J5cHRlZFdpdGhDdXN0b21lckVuY3J5cHRpb25LZXksIHJwY0NvZGU9NDAwfSBUaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9JU19FTkNSWVBURURfV0lUSF9DVVNUT01FUl9FTkNSWVBUSU9OX0tFWTogQ29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6MTk5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmNvbXBvc2UoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ29tcG9uZW50IG9iamVjdCAoZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24pIGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJUaGUgdGFyZ2V0IG9iamVjdCBpcyBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS4ifX0=" } }, { "ID": "eea75f5f6c3c7e89", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-3/compose?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "160" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24ifSx7Im5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIifV19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "911" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:39 GMT" ], "Etag": [ "CPDp3szx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uotyvz71ZfU1J_hl3NsDz9ldw92nWlIp9muxpBUsdv0nTyfJEqz-yQFyEwE2UM11wv7tkpLQfffGlKhlx7CVK0S1UYJnS2XQu2P0Uiz5bbamHxE520" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMyIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3OTg1OTQ0MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozOS44NTlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzkuODU5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM5Ljg1OVoiLCJzaXplIjoiMjIiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0zP2dlbmVyYXRpb249MTU1NjgzNTg3OTg1OTQ0MCZhbHQ9bWVkaWEiLCJjcmMzMmMiOiI1ajF5cGc9PSIsImNvbXBvbmVudENvdW50IjoyLCJldGFnIjoiQ1BEcDNzengvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0=" } }, { "ID": "b19fb82ecf450b51", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-3", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "277" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:40 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:40 GMT" ], "Server": [ "UploadServer" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Urcj3TJ6B5h4Q0DT7G_ioI_Icu9iv65m57OlRH6h9mKD9zZZl320H3QD6A7fNd1UPBSGGDZ9I0TG4_lSFa8JgkJQEVRGVRvVQv36b7ArCuGmg0loV0" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+UmVzb3VyY2VJc0VuY3J5cHRlZFdpdGhDdXN0b21lckVuY3J5cHRpb25LZXk8L0NvZGU+PE1lc3NhZ2U+VGhlIHJlc291cmNlIGlzIGVuY3J5cHRlZCB3aXRoIGEgY3VzdG9tZXIgZW5jcnlwdGlvbiBrZXkuPC9NZXNzYWdlPjxEZXRhaWxzPlRoZSByZXF1ZXN0ZWQgb2JqZWN0IGlzIGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LjwvRGV0YWlscz48L0Vycm9yPg==" } }, { "ID": "1f0a12bd00a88965", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/customer-encryption-3", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "22" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 02 May 2019 22:24:40 GMT" ], "Etag": [ "\"-CPDp3szx/eECEAE=\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:39 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Component-Count": [ "2" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:24:39 GMT" ], "X-Goog-Generation": [ "1556835879859440" ], "X-Goog-Hash": [ "crc32c=5j1ypg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "22" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur7DoEkjdrkGGrYpsCDbd2Y6c_Mu8sEA7cN_k06l4WjY25UJsijDFWSlSIA9SCi-ouLuI3if4Rh33a5n5vKcN3oSYjzK92eSPVCczEpQdILKFWyQh4" ] }, "Body": "dG9wIHNlY3JldC50b3Agc2VjcmV0Lg==" } }, { "ID": "f649a81672a92823", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Copy-Source-Encryption-Algorithm": [ "AES256" ], "X-Goog-Copy-Source-Encryption-Key": [ "CLEARED" ], "X-Goog-Copy-Source-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3527" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:40 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrfhqrYGhW8ew5dxbfg_DcMhaJh6k2oY_JqMwPRSDtS3Ef5kljeo8oTONrxRIAP8I0ScqxFCy7okNejkqOeO4Vr1TBZ2mc4MDjwiJA52ERSgZMUyvM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMTEiLCJvYmplY3RTaXplIjoiMTEiLCJkb25lIjp0cnVlLCJyZXNvdXJjZSI6eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg4MDcxNzUwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMiIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MDcxNzUwNiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0MC43MTdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDAuNzE3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQwLjcxN1oiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoieHdXTkZhMFZkWFBtbEF3cmxjQUpjZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMj9nZW5lcmF0aW9uPTE1NTY4MzU4ODA3MTc1MDYmYWx0PW1lZGlhIiwiY29udGVudExhbmd1YWdlIjoiZW4iLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg4MDcxNzUwNi9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgwNzE3NTA2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNS1prODN4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg4MDcxNzUwNi9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODA3MTc1MDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgwNzE3NTA2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNS1prODN4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIvMTU1NjgzNTg4MDcxNzUwNi91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODA3MTc1MDYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InIwTkdyZz09IiwiZXRhZyI6IkNNS1prODN4L2VFQ0VBRT0ifX0=" } }, { "ID": "61763fd57e906039", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-3/compose?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "129" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "H+LmnXhRoeI6TMW5bsV6HyUk6pyGc2IMbqYbAXBcps0=" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiJ9XX0K" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13444" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:41 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Ur7TRBQyfrSgWnsPL0CVfQCd5s_QJN9pRUHB1YttIoObh1YkzCEtuRxrwyKYtccpyodUCMmTVRyD6d0oDy-c2_Q7GK-_6OC5h_EF_1e9-t6E8VZCQ8" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlc291cmNlTm90RW5jcnlwdGVkV2l0aEN1c3RvbWVyRW5jcnlwdGlvbktleSIsIm1lc3NhZ2UiOiJUaGUgdGFyZ2V0IG9iamVjdCBpcyBub3QgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuIiwiZXh0ZW5kZWRIZWxwIjoiaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9lbmNyeXB0aW9uI2N1c3RvbWVyLXN1cHBsaWVkX2VuY3J5cHRpb25fa2V5cyIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3N0b3JhZ2UvZG9jcy9lbmNyeXB0aW9uI2N1c3RvbWVyLXN1cHBsaWVkX2VuY3J5cHRpb25fa2V5cywgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1jbG91ZC5iaWdzdG9yZS5hcGkuQmlnc3RvcmVFcnJvckRvbWFpbi5SRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVksIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVksIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuZW5jcnlwdGlvbktleSwgbWVzc2FnZT1Db21wb25lbnQgb2JqZWN0IChnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yKSB1cyBub3QgZW5jcnlwdGVkIGJ5IGEgY3VzdG9tZXItc3VwcGxpZWQgZW5jcnlwdGlvbiBrZXkuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LmVuY3J5cHRpb25LZXksIG1lc3NhZ2U9VGhlIHRhcmdldCBvYmplY3QgaXMgbm90IGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiwgcmVhc29uPXJlc291cmNlTm90RW5jcnlwdGVkV2l0aEN1c3RvbWVyRW5jcnlwdGlvbktleSwgcnBjQ29kZT00MDB9IFRoZSB0YXJnZXQgb2JqZWN0IGlzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpSRVNPVVJDRV9OT1RfRU5DUllQVEVEX1dJVEhfQ1VTVE9NRVJfRU5DUllQVElPTl9LRVk6IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENvbXBvbmVudCBvYmplY3QgKGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTIpIHVzIG5vdCBlbmNyeXB0ZWQgYnkgYSBjdXN0b21lci1zdXBwbGllZCBlbmNyeXB0aW9uIGtleS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAwLCJtZXNzYWdlIjoiVGhlIHRhcmdldCBvYmplY3QgaXMgbm90IGVuY3J5cHRlZCBieSBhIGN1c3RvbWVyLXN1cHBsaWVkIGVuY3J5cHRpb24ga2V5LiJ9fQ==" } }, { "ID": "b45cb452c78d7b50", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2571" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:41 GMT" ], "Etag": [ "CAo=" ], "Expires": [ "Thu, 02 May 2019 22:24:41 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq2YnotZtU1JMnJw10vtgVDeukiWK_4DXx0QFWA91CaCYLPXLDKzCzY8xqb6EGkVxvw731As27REu_hYOqZTwSfJJ6SeHemliLV9JgQYjfngxL0HFA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyOC44ODJaIiwibWV0YWdlbmVyYXRpb24iOiIxMCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBbz0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FvPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FvPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQW89In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FvPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQW89In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7Im5ldyI6Im5ldyIsImwxIjoidjIifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FvPSJ9" } }, { "ID": "6831287fd0edbcd4", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoicG9zYyJ9Cg==", "Zm9v" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3128" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:42 GMT" ], "Etag": [ "CJek2c3x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrXGhYaqbrodjXeCKtZGAt0hM0GrM8GBcZBkGkLJ7550-Iqaxp681SkhDDDOp0V3-xMmoq3rjWOC8A4XvJfAzgxGsO2VekCUJgUBMalL8hEAur49q8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjLzE1NTY4MzU4ODE4NjU3NTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjIiwibmFtZSI6InBvc2MiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0MS44NjVaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDEuODY1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQxLjg2NVoiLCJzaXplIjoiMyIsIm1kNUhhc2giOiJyTDBZMjB6QytGenQ3MlZQek1TazJBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYz9nZW5lcmF0aW9uPTE1NTY4MzU4ODE4NjU3NTEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgxODY1NzUxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0plazJjM3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4MTg2NTc1MS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgxODY1NzUxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0plazJjM3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJ6OFN1SFE9PSIsImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0=" } }, { "ID": "7588cdc84e3976f4", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/posc?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3128" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:42 GMT" ], "Etag": [ "CJek2c3x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpGBHQWnSHLUYlW5nck2w_3QN4x5uYmOM-GIatNzD1tqhzK0JOf7rBe1BKILpdyEUPlSmrLwrukcqJwHgfezE50OQL7ha9n6_fc6qUMoVwkEGawOgA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjLzE1NTY4MzU4ODE4NjU3NTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjIiwibmFtZSI6InBvc2MiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0MS44NjVaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDEuODY1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQxLjg2NVoiLCJzaXplIjoiMyIsIm1kNUhhc2giOiJyTDBZMjB6QytGenQ3MlZQek1TazJBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYz9nZW5lcmF0aW9uPTE1NTY4MzU4ODE4NjU3NTEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgxODY1NzUxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0plazJjM3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4MTg2NTc1MS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MTg2NTc1MSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgxODY1NzUxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgxODY1NzUxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0plazJjM3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJ6OFN1SFE9PSIsImV0YWciOiJDSmVrMmMzeC9lRUNFQUU9In0=" } }, { "ID": "974ed1b42608e806", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/posc/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/posc?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "34" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:42 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrKCtuc_GsAj6sf3zXpqT2_KZrdL0SEwsunv07k0DaaEHMj8gkX4kRCcm5r8AUrD9RNYjoKeceiCyY4pDN8nrHljshmEIXF2P29Oyd0KSuqDjsNeps" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiMyIsIm9iamVjdFNpemUiOiIzIiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgyNzYwNjA3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYyIsIm5hbWUiOiJwb3NjIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDIuNzYwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQyLjc2MFoiLCJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Mi43NjBaIiwic2l6ZSI6IjMiLCJtZDVIYXNoIjoickwwWTIwekMrRnp0NzJWUHpNU2syQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2M/Z2VuZXJhdGlvbj0xNTU2ODM1ODgyNzYwNjA3JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4Mjc2MDYwNyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKL3pqODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjLzE1NTY4MzU4ODI3NjA2MDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4Mjc2MDYwNyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKL3pqODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiejhTdUhRPT0iLCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9fQ==" } }, { "ID": "a2be30bf1e3cb539", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoicG9zYzIiLCJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCJ9Cg==", "eHh4" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3150" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:43 GMT" ], "Etag": [ "CILrp87x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqziYHpTkcbyMFRtHko_e04Rze8FHLbALw476U2bB9k_SqPwILBzxKRLzFvRN4q3RLt4xR1mpR2lgJ1Zq0BNYCefLOZsOeq4JbzJYLxGL5V799xkQ8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYzIiLCJuYW1lIjoicG9zYzIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzE1Mjc3MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0My4xNTJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDMuMTUyWiIsInN0b3JhZ2VDbGFzcyI6Ik1VTFRJX1JFR0lPTkFMIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQzLjE1MloiLCJzaXplIjoiMyIsIm1kNUhhc2giOiI5V0dxOXU4TDhVMUNDTHRHcE15enJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYzI/Z2VuZXJhdGlvbj0xNTU2ODM1ODgzMTUyNzcwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MyLzE1NTY4MzU4ODMxNTI3NzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYzIvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0lMcnA4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MyLzE1NTY4MzU4ODMxNTI3NzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYzIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzE1Mjc3MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0lMcnA4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MyLzE1NTY4MzU4ODMxNTI3NzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoicG9zYzIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzE1Mjc3MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiMTdxQUJRPT0iLCJldGFnIjoiQ0lMcnA4N3gvZUVDRUFFPSJ9" } }, { "ID": "d570e13411ade628", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiYnVja2V0SW5Db3B5QXR0cnMifQo=", "Zm9v" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3336" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:43 GMT" ], "Etag": [ "CPCDx87x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrltsLp6xgl5GQBA_ZoqyMKcRlP-MvWyo0epRXUAbOAkOUUpAOgezp4fFQRP5wEM1fq771AWUgtYvQ3HLXCnwxmDaCqJxEhICiYhxDp8RpvCnn3xuI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0SW5Db3B5QXR0cnMiLCJuYW1lIjoiYnVja2V0SW5Db3B5QXR0cnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzY2Mzg1NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0My42NjNaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDMuNjYzWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQzLjY2M1oiLCJzaXplIjoiMyIsIm1kNUhhc2giOiJyTDBZMjB6QytGenQ3MlZQek1TazJBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0SW5Db3B5QXR0cnM/Z2VuZXJhdGlvbj0xNTU2ODM1ODgzNjYzODU2JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldEluQ29weUF0dHJzLzE1NTY4MzU4ODM2NjM4NTYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0SW5Db3B5QXR0cnMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldEluQ29weUF0dHJzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BDRHg4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldEluQ29weUF0dHJzLzE1NTY4MzU4ODM2NjM4NTYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0SW5Db3B5QXR0cnMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzY2Mzg1NiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRJbkNvcHlBdHRycy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldEluQ29weUF0dHJzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BDRHg4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2J1Y2tldEluQ29weUF0dHJzLzE1NTY4MzU4ODM2NjM4NTYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYnVja2V0SW5Db3B5QXR0cnMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MzY2Mzg1NiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiejhTdUhRPT0iLCJldGFnIjoiQ1BDRHg4N3gvZUVDRUFFPSJ9" } }, { "ID": "284a06aa5d3f4c0f", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketInCopyAttrs/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/bucketInCopyAttrs?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "62" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEifQo=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "2972" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:43 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqEuzT5vUHzBcQTT84B5lbxQRZ8Wazbvf7pARGdim0OKOWWM6MdR9KrH11f9w9bxrybc2YHzoveHnAwpEgFzwUcXlLN8xDttCt9pwOnPMX3My8utXg" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IlJlcXVpcmVkIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89bnVsbCwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWJhZFJlcXVlc3QsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLlJFUVVJUkVELCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuZGVzdGluYXRpb25fcmVzb3VyY2UuaWQubmFtZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LmRlc3RpbmF0aW9uX3Jlc291cmNlLmlkLm5hbWUsIG1lc3NhZ2U9UmVxdWlyZWQsIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDB9IFJlcXVpcmVkXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAwLCJtZXNzYWdlIjoiUmVxdWlyZWQifX0=" } }, { "ID": "631a4dc25c1479df", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjcmMzMmMiOiJjSCtBK3c9PSIsIm5hbWUiOiJoYXNoZXNPblVwbG9hZC0xIn0K", "SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3321" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:44 GMT" ], "Etag": [ "CIes587x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up5pzFgsk-trM6xfNGHCutAafrBhKStla4toQDjvEsTPe4TTesYnwc0KLg9WK95RXOKqdm_KUngd4hv6Tucfns_MALlJyx1s6A2cZR3vco6jKPTW00" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODQxOTMyODciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xIiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDE5MzI4NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0NC4xOTJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDQuMTkyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ0LjE5MloiLCJzaXplIjoiMjciLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTE/Z2VuZXJhdGlvbj0xNTU2ODM1ODg0MTkzMjg3JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDE5MzI4Ny9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODQxOTMyODciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0llczU4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDE5MzI4Ny9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDE5MzI4NyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNJZXM1ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODQxOTMyODcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODQxOTMyODciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0llczU4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDE5MzI4Ny91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDE5MzI4NyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNJZXM1ODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiY0grQSt3PT0iLCJldGFnIjoiQ0llczU4N3gvZUVDRUFFPSJ9" } }, { "ID": "e60d42eeeafea205", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjcmMzMmMiOiJjSCtBL0E9PSIsIm5hbWUiOiJoYXNoZXNPblVwbG9hZC0xIn0K", "SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "3301" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:44 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpZ9QOOcNdGntWr097PRNnaDFbt2xarczbyHRwkwxSiwRZIhV26iZGbh5vHIpvl3Z5Dxc7hjtWuutHTMn8jpCTEowLJNAre2A6mZxVNtV52Vh6XDX4" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiUHJvdmlkZWQgQ1JDMzJDIFwiY0grQS9BPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDMzJDIFwiY0grQSt3PT1cIi4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPW51bGwsIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5JTlZBTElEX1ZBTFVFLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1JTlZBTElEX1ZBTFVFLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5jcmMzMmMsIG1lc3NhZ2U9UHJvdmlkZWQgQ1JDMzJDIFwiY0grQS9BPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDMzJDIFwiY0grQSt3PT1cIi4sIHVubmFtZWRBcmd1bWVudHM9W2NIK0EvQT09XX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5jcmMzMmMsIG1lc3NhZ2U9UHJvdmlkZWQgQ1JDMzJDIFwiY0grQS9BPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDMzJDIFwiY0grQSt3PT1cIi4sIHJlYXNvbj1pbnZhbGlkLCBycGNDb2RlPTQwMH0gUHJvdmlkZWQgQ1JDMzJDIFwiY0grQS9BPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDMzJDIFwiY0grQSt3PT1cIi5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJQcm92aWRlZCBDUkMzMkMgXCJjSCtBL0E9PVwiIGRvZXNuJ3QgbWF0Y2ggY2FsY3VsYXRlZCBDUkMzMkMgXCJjSCtBK3c9PVwiLiJ9fQ==" } }, { "ID": "5a293e6162b30ef3", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiaGFzaGVzT25VcGxvYWQtMSJ9Cg==", "SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3321" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:44 GMT" ], "Etag": [ "CJuDg8/x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqgpXYBQOYHYXTQAVb7IGna0BRqHaB7oBdZ19frcgAVGErLbEHe3bESKZ7zKSO6r0AtvqwfCEuJty95EeD5MkwqIsXbr88YcTG0j7M-g4yTKkejukI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODQ2NDY4MTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xIiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDY0NjgxMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0NC42NDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDQuNjQ2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ0LjY0NloiLCJzaXplIjoiMjciLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTE/Z2VuZXJhdGlvbj0xNTU2ODM1ODg0NjQ2ODExJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDY0NjgxMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODQ2NDY4MTEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0p1RGc4L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDY0NjgxMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDY0NjgxMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKdURnOC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODQ2NDY4MTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODQ2NDY4MTEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0p1RGc4L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NDY0NjgxMS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NDY0NjgxMSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKdURnOC94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiY0grQSt3PT0iLCJldGFnIjoiQ0p1RGc4L3gvZUVDRUFFPSJ9" } }, { "ID": "19f19648f1196c10", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEifQo=", "SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3321" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:45 GMT" ], "Etag": [ "CKDem8/x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqAmKuvPxUsjTHDB5nMuNG92dU0gql0Yol2zlvPDWEDuXHQRLhOJzYBAH207Ot-_IB22pH5QSfTaTayqEWBUfkobCR9YGVa79W0LG4fv9fnAjxk5Cs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODUwNTE2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xIiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0NS4wNTFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDUuMDUxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ1LjA1MVoiLCJzaXplIjoiMjciLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTE/Z2VuZXJhdGlvbj0xNTU2ODM1ODg1MDUxNjgwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODUwNTE2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNLRGVtOC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODUwNTE2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODUwNTE2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNLRGVtOC94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiY0grQSt3PT0iLCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9" } }, { "ID": "880416f9891fc25f", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJtZDVIYXNoIjoib3ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEifQo=", "SSBjYW4ndCB3YWl0IHRvIGJlIHZlcmlmaWVk" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "3515" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:45 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UoFC5_DRlr9xktR_eWpfuFqiZRbenVOATtUEg3tfJC8JbCqagKQzn0_sYLvxvG52ordbl2Nwo0L6Y0AbwuenLAo1uoX4uzHnro-JiY8MkdQEsO3uSA" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImludmFsaWQiLCJtZXNzYWdlIjoiUHJvdmlkZWQgTUQ1IGhhc2ggXCJvdlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgTUQ1IGhhc2ggXCJvZlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIi4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9SU5WQUxJRF9WQUxVRSwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPW51bGwsIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5JTlZBTElEX1ZBTFVFLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1udWxsLCBlcnJvclByb3RvQ29kZT1JTlZBTElEX1ZBTFVFLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5tZDVfaGFzaF9iYXNlNjQsIG1lc3NhZ2U9UHJvdmlkZWQgTUQ1IGhhc2ggXCJvdlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgTUQ1IGhhc2ggXCJvZlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIi4sIHVubmFtZWRBcmd1bWVudHM9W292WmpHbGNYUEppR09BZktGYkpsMVE9PV19LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UubWQ1X2hhc2hfYmFzZTY0LCBtZXNzYWdlPVByb3ZpZGVkIE1ENSBoYXNoIFwib3ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09XCIgZG9lc24ndCBtYXRjaCBjYWxjdWxhdGVkIE1ENSBoYXNoIFwib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09XCIuLCByZWFzb249aW52YWxpZCwgcnBjQ29kZT00MDB9IFByb3ZpZGVkIE1ENSBoYXNoIFwib3ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09XCIgZG9lc24ndCBtYXRjaCBjYWxjdWxhdGVkIE1ENSBoYXNoIFwib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09XCIuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAwLCJtZXNzYWdlIjoiUHJvdmlkZWQgTUQ1IGhhc2ggXCJvdlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIiBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgTUQ1IGhhc2ggXCJvZlpqR2xjWFBKaUdPQWZLRmJKbDFRPT1cIi4ifX0=" } }, { "ID": "e1a7bef7c2f0f7b9", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/iam?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "341" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:45 GMT" ], "Etag": [ "CAo=" ], "Expires": [ "Thu, 02 May 2019 22:24:45 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrDioJ0fktjtyI_mABE4-oH9KqDlurM5mWiYDhoDp_LRJYSPvDxjuoaYzNhjoTHdHPALySTzCxScTstm27R-praR27EAm4Gx9k3wHAAwKJUptqRnFE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNwb2xpY3kiLCJyZXNvdXJjZUlkIjoicHJvamVjdHMvXy9idWNrZXRzL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImJpbmRpbmdzIjpbeyJyb2xlIjoicm9sZXMvc3RvcmFnZS5sZWdhY3lCdWNrZXRPd25lciIsIm1lbWJlcnMiOlsicHJvamVjdEVkaXRvcjpkZWtsZXJrLXNhbmRib3giLCJwcm9qZWN0T3duZXI6ZGVrbGVyay1zYW5kYm94Il19LHsicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0UmVhZGVyIiwibWVtYmVycyI6WyJwcm9qZWN0Vmlld2VyOmRla2xlcmstc2FuZGJveCJdfV0sImV0YWciOiJDQW89In0=" } }, { "ID": "df5371a2b0cd8c3b", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/iam?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "317" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJiaW5kaW5ncyI6W3sibWVtYmVycyI6WyJwcm9qZWN0RWRpdG9yOmRla2xlcmstc2FuZGJveCIsInByb2plY3RPd25lcjpkZWtsZXJrLXNhbmRib3giXSwicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0T3duZXIifSx7Im1lbWJlcnMiOlsicHJvamVjdFZpZXdlcjpkZWtsZXJrLXNhbmRib3giXSwicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0UmVhZGVyIn0seyJtZW1iZXJzIjpbInByb2plY3RWaWV3ZXI6ZGVrbGVyay1zYW5kYm94Il0sInJvbGUiOiJyb2xlcy9zdG9yYWdlLm9iamVjdFZpZXdlciJ9XSwiZXRhZyI6IkNBbz0ifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "423" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:46 GMT" ], "Etag": [ "CAs=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrAVgetrpv1xjtKv2B7KFBdnbg20V-btiRn3sD4kQF7shWIQ1-FqJMRsbYfcYJyTMQHv_BhW_eVzvcc56z0LOcYfE-wbCRZpqYjen6c-bVcMzPet2A" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNwb2xpY3kiLCJyZXNvdXJjZUlkIjoicHJvamVjdHMvXy9idWNrZXRzL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImJpbmRpbmdzIjpbeyJyb2xlIjoicm9sZXMvc3RvcmFnZS5sZWdhY3lCdWNrZXRPd25lciIsIm1lbWJlcnMiOlsicHJvamVjdEVkaXRvcjpkZWtsZXJrLXNhbmRib3giLCJwcm9qZWN0T3duZXI6ZGVrbGVyay1zYW5kYm94Il19LHsicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0UmVhZGVyIiwibWVtYmVycyI6WyJwcm9qZWN0Vmlld2VyOmRla2xlcmstc2FuZGJveCJdfSx7InJvbGUiOiJyb2xlcy9zdG9yYWdlLm9iamVjdFZpZXdlciIsIm1lbWJlcnMiOlsicHJvamVjdFZpZXdlcjpkZWtsZXJrLXNhbmRib3giXX1dLCJldGFnIjoiQ0FzPSJ9" } }, { "ID": "feaa4b1a4dda0450", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/iam?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "423" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:46 GMT" ], "Etag": [ "CAs=" ], "Expires": [ "Thu, 02 May 2019 22:24:46 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqwMVZVQQ8s-ZBUJDLKyC-qMMTANncoBhRQWlMCITVUXQrTnFGGxu4GdKyVcuudrSa-DWy5w5iLE-i4a407GopUNma3xIq1eNiyVAziPD7jQ4YluzA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNwb2xpY3kiLCJyZXNvdXJjZUlkIjoicHJvamVjdHMvXy9idWNrZXRzL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImJpbmRpbmdzIjpbeyJyb2xlIjoicm9sZXMvc3RvcmFnZS5sZWdhY3lCdWNrZXRPd25lciIsIm1lbWJlcnMiOlsicHJvamVjdEVkaXRvcjpkZWtsZXJrLXNhbmRib3giLCJwcm9qZWN0T3duZXI6ZGVrbGVyay1zYW5kYm94Il19LHsicm9sZSI6InJvbGVzL3N0b3JhZ2UubGVnYWN5QnVja2V0UmVhZGVyIiwibWVtYmVycyI6WyJwcm9qZWN0Vmlld2VyOmRla2xlcmstc2FuZGJveCJdfSx7InJvbGUiOiJyb2xlcy9zdG9yYWdlLm9iamVjdFZpZXdlciIsIm1lbWJlcnMiOlsicHJvamVjdFZpZXdlcjpkZWtsZXJrLXNhbmRib3giXX1dLCJldGFnIjoiQ0FzPSJ9" } }, { "ID": "23d94c8a09c0c334", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/iam/testPermissions?alt=json\u0026permissions=storage.buckets.get\u0026permissions=storage.buckets.delete\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "108" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:46 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:46 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoR-XKWu9nOWmFZve2-NeDyDvZDo5rYpPD3avVEmZkZ-lODvHCSR0D7zdPeCa61L5EtOIYJBqmC0D9Xc229A1GDS5d91vgAGuzRoxRnNa9DjBw68xM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSN0ZXN0SWFtUGVybWlzc2lvbnNSZXNwb25zZSIsInBlcm1pc3Npb25zIjpbInN0b3JhZ2UuYnVja2V0cy5nZXQiLCJzdG9yYWdlLmJ1Y2tldHMuZGVsZXRlIl19" } }, { "ID": "3d0a13fe961ed15c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "93" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIn0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "518" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:47 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoIRjhruHo5rweyX35Zt-Mzm5UDD5vr4319gSNjtnJHD2RWtVLvQdjuZ0jv-XKT3s1xcJO7CvoU-qAehCknukI5ssvv2LgwazyhnkcuFws3isqM9uo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ2LjgwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Ni44MDNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImJpbGxpbmciOnsicmVxdWVzdGVyUGF5cyI6dHJ1ZX0sImV0YWciOiJDQUU9In0=" } }, { "ID": "c1f385994f4db8e3", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/user-integration%40gcloud-golang-firestore-tests.iam.gserviceaccount.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "159" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIn0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "589" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:48 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UozEPu-BKQnmBUxTwsOWB7mmIPC5lppmUt6lA150OiXgQttSVRetVysUp299p7PbjI08qchUQl2idgMbfBCScDL5SuoHi_u9ani0DXYX2OV9QXAovQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "ccb3141a79c55333", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3054" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:48 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:24:48 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoG9XpooOFPlHtC8fg7llzYYETQUMEm0PvG4TbxBF5KdfCdB_sxNi0Yy9KrAmMDPBVyq0Iuaq7mzQOhQe9lXe5PBOc8-CGTXZiEMkMMJe3OYxjExIM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ2LjgwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Ny45MTlaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBST0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FJPSJ9" } }, { "ID": "2d4244737318f2d5", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3054" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:48 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:24:48 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqn_UdEXhLLXE1QsYjwtyqQlzX3nDvpAO1WNpRkHhyV39RJKkxMBrcd8f6Xo3VZFDps7iKuQHnW49yRqjh42062lkisOH7otDXrdAKAih4Iz9fzERM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ2LjgwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Ny45MTlaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBST0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FJPSJ9" } }, { "ID": "b63c3951975a766e", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12183" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:49 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:49 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uq-LP6kQLHNpjT5jYVkPzNXyfr838sGr4jGMVPq-FOq01ayCWvyWVAsvUbxp0NSdOYJcW-z0i2NkQLuSKGQYrX_3z8LW1Vb4uL2jxfC8kSiuz28hkA" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjEwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MzMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuZ2V0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo4Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "0764f2598b67c664", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "3054" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:49 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:24:49 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrGddSv5GSaZB7qBmb0PigbMbJmWs91JB0W99oOTcbMeUk9QeBf-7QF7W_BpAn3wNxqVD5cBDPgGuKrZCfYv77SgCGxcPW-jrXsUY5h50q8eFL0_3o" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ2LjgwM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Ny45MTlaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBST0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FJPSJ9" } }, { "ID": "bdb0ff507e4df251", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13039" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:49 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:49 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Up8t6bOWiJucB8KpVlIp8WjWLSUKssQaynZNguVy_oBM2ggBePUFnoteMcbw_L9aSHoD4hwi91dMaBC4aVc6VuaMSBSVuCe0L_0IymxhBIx3SRj_As" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "d2e66ae2cc0d11bc", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3133" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:50 GMT" ], "Etag": [ "COq52NHx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqQ_qlqWPPh6t8-gwPlD5zRB96zsmFgzyez4LG3XN4uErivnyHcCeeHje_i95VLJcWYXn7_-knEn0faPBCCAIStf4fXGs_Lz_VzHK6CLBZjU-oBxcU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDI0MDc0NiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MDI0MDc0NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MC4yNDBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTAuMjQwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUwLjI0MFoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MDI0MDc0NiZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDI0MDc0Ni9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkwMjQwNzQ2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPcTUyTkh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDI0MDc0Ni9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTAyNDA3NDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3E1Mk5IeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTAyNDA3NDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkwMjQwNzQ2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcTUyTkh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDI0MDc0Ni91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTAyNDA3NDYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3E1Mk5IeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPcTUyTkh4L2VFQ0VBRT0ifQ==" } }, { "ID": "89b2bc9232a865a4", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3133" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:50 GMT" ], "Etag": [ "CJTz9tHx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrymnpCwS6vZ0kM33ZD4nBupWs9hAuaOGpwiNcS4GJctgaLPe9CQ0Ada06yQV1aEfh9FtX6lgYh9jHwbsT6qdgOYOYe9yGDdAF9f91aE4y4VUHQHts" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDczOTYwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MDczOTYwNCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MC43MzlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTAuNzM5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUwLjczOVoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MDczOTYwNCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDczOTYwNC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkwNzM5NjA0IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKVHo5dEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDczOTYwNC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTA3Mzk2MDQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSlR6OXRIeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTA3Mzk2MDQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkwNzM5NjA0IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKVHo5dEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MDczOTYwNC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTA3Mzk2MDQiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSlR6OXRIeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNKVHo5dEh4L2VFQ0VBRT0ifQ==" } }, { "ID": "a70634faba29225b", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12243" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:51 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqsIKUUc6WyIHUlDvAIDlXVeOofVG4sVV3Rus8ktfPMTUTI7e4PH4657AoDnNOKKy9TOgt8yUtUvCNvDFQC1xwVApFofRhWT3kcjsEYRgZPCDDsUqM" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "5539336327f2e0ba", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:51 GMT" ], "Etag": [ "COGeqNLx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrH7pn9r8O1Zu1Nc2aNUO_CO75MyvOJyONGw27TUkfWRSSmFIWJUZ6F3e3OprVF5jKtAkQ73puZbyNCK6mozyHrmPRRa0mtyuBPhkYg4DzPGkXJOSU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTEuNTQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifQ==" } }, { "ID": "029ec3d54709e7ce", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13099" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:52 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqcpItVCw5LaIWvDckOjfoChIifJGtuURBAmgtpzzna_iVOfDSaQOhxiMDVfYkV3mKG7__z0WTNRdVpa2Zs2IPcIAKwqwSeIMaLtz--MluSCHv9kc8" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "bc0d0ed808bc8e68", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:52 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:51 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1556835891548001" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpljfpVGJewuMZUyJZ8DU7j2k6JmfPqXXgkeeu8vGdK5j-C_DUgpubS4nFEp1z8EsN-fUdceCxfiy-FGIJiFpME38hWnztW_WIn6zeSh6LCbwIK9oM" ] }, "Body": "aGVsbG8=" } }, { "ID": "b695481e00d2d6d9", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ], "X-Goog-User-Project": [ "deklerk-sandbox" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:52 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:51 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1556835891548001" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrmYf7b7ig2ase_O8qHEsgSAXifAlxVdDy_Zh5Qaqx1IlL1wkTvy1BSblI6ZDz3M2X-Y6KrdJp1IaP6nDU1F_Yhyt84Y7dOG80r2g-x4E7NAyyjV0o" ] }, "Body": "aGVsbG8=" } }, { "ID": "2fe3b6cc96ffa451", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "266" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:52 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:52 GMT" ], "Server": [ "UploadServer" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Ur-S2G_BUo7MzXUj-7vUDuVFWfBIA5GJYfTdaeruyelzRGFimnhov8wRB_ozWC2cGPQ-a2xQk8bw_cVV_D2Q7c7rdR1ujaTM3oIjr8vjsJBZXa1VeA" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+VXNlclByb2plY3RNaXNzaW5nPC9Db2RlPjxNZXNzYWdlPkJ1Y2tldCBpcyBhIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjwvTWVzc2FnZT48RGV0YWlscz5CdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci48L0RldGFpbHM+PC9FcnJvcj4=" } }, { "ID": "59bdcad91d723d0e", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ], "X-Goog-User-Project": [ "gcloud-golang-firestore-tests" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "5" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:24:52 GMT" ], "Etag": [ "\"5d41402abc4b2a76b9719d911017c592\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:24:51 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1556835891548001" ], "X-Goog-Hash": [ "crc32c=mnG7TA==", "md5=XUFAKrxLKna5cZ2REBfFkg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "5" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up3lrNfk5bvup2RRbcsT6CeDACQitaiF3BTMyQ7B23ACtTqwWweq9ooOfZn3CX7tsbzljhlY_009nsTXXQwm7V_xNNd8FZwT44CzSpul-SZIRODC2w" ] }, "Body": "aGVsbG8=" } }, { "ID": "7b7b6a79cd2a53e3", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0003/foo", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ], "X-Goog-User-Project": [ "veener-jba" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "342" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:52 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:52 GMT" ], "Server": [ "UploadServer" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpT7Ge_QpcDrqajg6a4kZrmoA55ZSma9IM3pyz0Ow1bu5nLURc0V7cAThbvikg47_O-ox0uMdF6zBbtVtKL7olyMUGd9wqCQ9ubELVoJXiNMDehvXY" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+VXNlclByb2plY3RBY2Nlc3NEZW5pZWQ8L0NvZGU+PE1lc3NhZ2U+UmVxdWVzdGVyIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBwZXJtaXNzaW9ucyBvbiB1c2VyIHByb2plY3QuPC9NZXNzYWdlPjxEZXRhaWxzPmludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuPC9EZXRhaWxzPjwvRXJyb3I+" } }, { "ID": "914bca19df35cbed", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:53 GMT" ], "Etag": [ "COGeqNLx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpM7lBsoxgNb-rh81Lfe0tWFGTkXQYfEB12ofkKZ8SK8kK5bPRUsQMVhm3aYB2N9e5_QSBZA25my-t5LpgR8TVW1lNTGd97OoD7bdBhP_CGo3xMbos" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTEuNTQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifQ==" } }, { "ID": "164b4ffce0c7e233", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:53 GMT" ], "Etag": [ "COGeqNLx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqbRkPvid4Zo9mQsbMXlTlOQ1womp_CnHUJcNWRamG_lp4ABhgVPVOdL8lE11J3tmvVkYhzcEPpIJuA_RTvuAbssXFsNo9Fu14cQ44HwhSRYk7r_dU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTEuNTQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifQ==" } }, { "ID": "d04d3cb2ac9d6376", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12183" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:53 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:53 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrcH6PdfDpm0th9SnZgYwMYIiYGYz2VvNs-Nb0VYFbZdA4QXfOJiRFg-xKqmDq09HRt7j8OwTDO7UMm2EiqwjPz7j_JPIvfcCzfCnVVoF3XiZFomuQ" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjMwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6NzApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZ2V0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo4MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "8b3aeb1f423d76c5", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:54 GMT" ], "Etag": [ "COGeqNLx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoX_zzYo9AYFb44YmIz49k5z8v8ITzEQsDrSxEE50-7AC-ndg18Yo5DFAZ9ZFCDtT5P7kch3c0-YlkhX-5oYCUIm-mmPmoTg0CKWVI0TJ9la9z9-vE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTEuNTQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBRT0ifQ==" } }, { "ID": "f32edc9a9263c0a1", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13039" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:54 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:54 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uok5lyOpE3YUZDwRz_bsA-E-xzWeqaApyadumOOFoA_YmOi_xnvFaJr6gfp9Gaktbpud9mv8qDCIvq1Yu7CyAVY0ScanSfNCke3naR_G7kPKYgrywY" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTozMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5HZXRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldE9iamVjdC5qYXZhOjcwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmdldChPYmplY3RzRGVsZWdhdG9yLmphdmE6ODEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6MzA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTo3MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5nZXQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjgxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkdldE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0T2JqZWN0LmphdmE6MzA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuR2V0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRPYmplY3QuamF2YTo3MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5nZXQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjgxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "da73739950dbfa82", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "85" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3216" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:54 GMT" ], "Etag": [ "COGeqNLx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrdpofRnchjkCQz5LLoghzg-RHoGATH3xbgJVW0LKGBkH025w5EB5RlGmHHnmXuPtK_5Ffyl1bxjmoc_h7_vGvjcxWbHv9-NKe9fLO_oNYRmw-ffvU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTQuNzM4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBST0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFJPSJ9" } }, { "ID": "94e697431c9323b9", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "85" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3216" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:55 GMT" ], "Etag": [ "COGeqNLx/eECEAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqhr0guIL00afW_qpaRvxEGRSJEWTtfrZP2Tv8Vqt2xas1ivvvMHVbSpT12ltU7FjytFhno9SFXTS8pW1S0S8qJdFctUCa83tkcQRXgN1uPUwhX1ws" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTUuMTMwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFNPSJ9" } }, { "ID": "3c5d694690a75054", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "85" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12375" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:55 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UogsU3nh3dfRYWq9YqTmJc7CfCX1U0b-IrWpDCM7M4YwfuUWgzzzcydWdHLrF0UPqRxNFQj3eMHBbDuHYcF0xuUNah4g5J_nt26feHRp-moh7uFXNw" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5VcGRhdGVBbmRQYXRjaE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQW5kUGF0Y2hPYmplY3QuamF2YTo0MjgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5VcGRhdGVBbmRQYXRjaE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQW5kUGF0Y2hPYmplY3QuamF2YTo1OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci51cGRhdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEwMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "e050063f79f64820", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "85" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3216" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:55 GMT" ], "Etag": [ "COGeqNLx/eECEAQ=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq4hs_SY8_2HHPHu8NfVIkOdwmZz7h6XH0nWRSTQJSqzQZQGvv1p83Z6W209h3bXsbN9_ESiU3OIyLRwmEldfBP94hRhN5t1JnagcKPcMEOv8FtvHs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsIm1ldGFnZW5lcmF0aW9uIjoiNCIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo1MS41NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NTUuODI0WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjUxLjU0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTg5MTU0ODAwMSZhbHQ9bWVkaWEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTg5MTU0ODAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBUT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFRPSJ9" } }, { "ID": "f7edef926cdb7d75", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "85" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiJ9Cg==" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13231" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:56 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqyQ9DLrBDGkx7uOkrIKrzMMYA4YygdFsd1si16n2Lr4I5Rfp1lxwadC3jThiJbE-cDyuZATHtvM2bzpsRDPJzbmKgtxYydHykiB-oCsSFqfwy50gw" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NDI4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuVXBkYXRlQW5kUGF0Y2hPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFuZFBhdGNoT2JqZWN0LmphdmE6NTgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IudXBkYXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlVwZGF0ZUFuZFBhdGNoT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBbmRQYXRjaE9iamVjdC5qYXZhOjQyOClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlVwZGF0ZUFuZFBhdGNoT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBbmRQYXRjaE9iamVjdC5qYXZhOjU4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnVwZGF0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlVwZGF0ZUFuZFBhdGNoT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBbmRQYXRjaE9iamVjdC5qYXZhOjQyOClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlVwZGF0ZUFuZFBhdGNoT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBbmRQYXRjaE9iamVjdC5qYXZhOjU4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnVwZGF0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "2745d195a40b86f1", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "377" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:57 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpGeWJRYTNsu57knuRFhwHuoeUMIJhUtuQj4PLhGDoFcITB2Y--7JgaOCVhepJ6a5RRKvU9d3UrAyrtbGNOVHyW2WAbN_KpfkiFhYq8l7HPERpLDjg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQU09In0=" } }, { "ID": "5258a70437064146", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "377" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:57 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqImoOCe_iDYCV8XHpaaEXPn-jeAf0M1MyixGju1tNCSTBIMEKDzh_wxVxapMmXWPnOes7YX0T0Fr663x7eJCl85B0EGXggUgp8bqeDV3cJ-mqeDrY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQU09In0=" } }, { "ID": "5cef2c464b7356c8", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12243" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:58 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpH5br-AVWN2g1nkkM_FJWZIjgOgh2NGLuiyYUS7QD2DSs6B-c0IQHgC2NUyy0eZq4McQhwxBGhUJ05-WeD_bX35i7skN7Jn_q3ELAaDwpi6_x3Z8c" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6OTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6MjcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLnVwZGF0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "11cd5140a264e423", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "377" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:58 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo2_tsxxuZC3Ni-A0zL0E9w8OVne0sWfLi61Cv48eTWj2R4F6G0AmXZU7J8L-WnDJf4s-6GpZV0SyQqrjBA_Mp75pJfWb6cl9_7oimTy8HPnxAtMwc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQU09In0=" } }, { "ID": "dac6629e58d45469", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13099" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:58 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrTXUzCa6WOvWD6NqoHhkdwRtG0Z4h0QurHOuKU1gyAWzXOt8lc1NVsLqe-6m8siE76k7l8g0EY3Le273_4GFB81gHMhM4qBOOgbwSBgLl4zKHZspU" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "1c8663192ed534e8", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2370" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:59 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Thu, 02 May 2019 22:24:59 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqfc2TzyVBAwGuVpWWQt7OYr3IQEmVj5R7LIr5LSRAhwFernkoD6TFVnJno_ria4LL8P9tSQgzCF7uJpStJTpYgTOiW5FqTxQ-AgbOjFmAMjah3o6U" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9kb21haW4tZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBTT0ifV19" } }, { "ID": "51858ae7ea77845a", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2370" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:59 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Thu, 02 May 2019 22:24:59 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqc5V7vaPL-d4aMLJi5QXyxZYWWtGBx0QuvfeB8rFlhwPGPFLQUABxm_XXkR0AOeIqdZ-intSu7I5srWdFKX85aY8r-z4oRTuB-CjGUe5uMiXQzXU4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9kb21haW4tZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBTT0ifV19" } }, { "ID": "8248d1314da9a068", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12203" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:24:59 GMT" ], "Expires": [ "Thu, 02 May 2019 22:24:59 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uqrg4CYWnZtCkMXT5KHCcQXY-aSGc6JuuEoVkTtKgObB9qr-dE-5sMKCrbTfpFudhid3ulDpkNuOUmRmBy4k7QQoRxqgues_a8dB85cOybZKZTM864" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9UkVRVUlSRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfTUlTU0lORzogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4ifX0=" } }, { "ID": "8c1628782bcf7eaf", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2370" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:00 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Thu, 02 May 2019 22:25:00 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqmer5wTHG4zziRJUR_QqUbX_xgytHZkMg2KFntbVz8pn55RFN7idAyYcqz3AhqthLD-bHH2Lggdg4MuIdjHVk_kKHxvDdqI0p814avmZPYAhJdvsE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsImVudGl0eSI6InVzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9kb21haW4tZ29vZ2xlLmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBTT0ifV19" } }, { "ID": "6813d64060667ba0", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13059" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:00 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:00 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpsvYC9PE_CO5H9MncFfA0uYzQqFBOqu0_zdexcxDTJ22CO_vv1LiRY6ZSC49_FMeUZBA3KdMfOnS7DsSxBpqrLC9ZM6GAs2sFolmZKhp0RWJjvOzs" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9Rk9SQklEREVOLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMywibWVzc2FnZSI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuIn19" } }, { "ID": "76ac0290041d5a26", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:01 GMT" ], "Etag": [ "CAQ=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur-ejQ-G_PN4CMllngdiEh1SqHQNy8TXBA-htpazVSOadp1oThRsYsQuflX2kwkDQHFpeo1UgDPXqi5BRq8qZUBsM2koJIMOp-APWnB8T_qsTHlY30" ] }, "Body": "" } }, { "ID": "0de0d173f3f5c2cc", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11631" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:01 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:01 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqLOtWcLW6yZk8n72e3qkdl4ft2-s7FJFYyRv_5REkk9Q6d7qk6Pcpcy_HMCJFgKTV5RZzzIU3k5hceknIV1XNGVWK7gOCFimyeb8sFjNZC7y7rypI" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19" } }, { "ID": "eb2af5bce5b9e1df", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12243" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:02 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:02 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uqgaldc1OJvgmfZxcZs4i5d6EXMyFK93ZUJLzSK8Vo-qPYKRwhvPzK8GFv3gqrdyjBbvdc2Uz57nCwy10LhC5AD2pscln8VbaQIOAHqxvkwsqV27Rw" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "ad55ad01147a8c62", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11631" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:02 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:02 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UoQpkkPNbb1CGY8lAzUfymkmZ7PNlRK6hK3deBeoMip13ARTb212DIgf4lgUDM8PVQsAqcnKwzNulbZICoGzHwrsBZfyi7p5TGX2yJHLXSAGEY0MBE" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19" } }, { "ID": "1ef9ea9b9bc398a6", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13099" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:03 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:03 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Ur5WrZwygTHM0dDH6L1kypZzaAQtCwxt9wA7VXvgnjwrfwdRnTw0D7K3VLYLRTPDcf8mRFn5CetkcimFxfqUDoWLMF7bH1TLiBr38K6aBU74aRWUd4" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "5c1cadcffc6c95e0", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "119" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:04 GMT" ], "Etag": [ "CAU=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo_n__u-lZKgZqveqge9YBw7wQMldCd4t0io7l_L_nlcF4DSPBPvZd9jGPCstE1EYuQS9L-Z3Y53Q15FlqM1IcmRDv6bYEJQWqkpuzCRRa_TLh9P7A" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQVU9In0=" } }, { "ID": "4a615256ab8c55b4", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "119" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:04 GMT" ], "Etag": [ "CAU=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpwGIlBhvugAIHxiObS0RPpJ40OY_R3exJfPh5IHLLB3SrdYtGMpD01QLdxc3E0IPGkBiTrwM-Z2X1gMcxuOqJWJUrhV4xTFe_n5G8bBxzievz39F4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQVU9In0=" } }, { "ID": "63c0acd95aa571a1", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12243" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:04 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqNu5DFt-lpr-_4YX8LRIhoi3KVRYVgFAlG7WOPsY7IGJ2NLZSF3SQhmkvfL_IKZ0FWIwx1nGT6HBBe9t2RYXNE1kXis-9KgEaAWhrEByTud5QGx5c" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6OTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6MjcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLnVwZGF0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "3c6b1be88134f9d9", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "119" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:05 GMT" ], "Etag": [ "CAU=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqzTVWCTbjlM7VCFWFbOojrtt8ZMY9bRy0eXj0Uxj3gaYalvwqR0WBrtbX0iGQ-aN5pv3-Acc7EWIoHBa37YbMpx9fuoJUpTswmdpiCOH3wbMN7tIk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDQVU9In0=" } }, { "ID": "60cde48b740e9a63", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13099" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:05 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrLyiKgPsp1RDgH3Q2SGlQAwTvGJwVDvb9U9FfvTysIFo6sO-5AoXrGPQfZpr80aMOEKojmPksURjhsteWSV9gdPsOlPIJMorxvQMHeomMCh-Bgmuo" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "95b915570e7c2375", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "684" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:05 GMT" ], "Etag": [ "CAU=" ], "Expires": [ "Thu, 02 May 2019 22:25:05 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrOZjNI5VbLPTLuBwhSAdcgxvqgcFpH-ED4XyEgIbnndmtC_zJ0lkLfudymSRpdRE4NBxn1Vp-AmZnb1ONsP2I1GBnLYfpYRbzFQpmihPrgBkDnaB4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBVT0ifV19" } }, { "ID": "e4170c637b705043", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "684" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:05 GMT" ], "Etag": [ "CAU=" ], "Expires": [ "Thu, 02 May 2019 22:25:05 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqXQonYrNQZxcXoDllGz19Ruu-Eq1_3FVjMndISB0h1O1ojodwFr2Xor2nZHBZgv3NN_YOSrunnT_KYTfBFNdqtVvqVC2L19Qhwk-cxse_FqrMVbIM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBVT0ifV19" } }, { "ID": "a3918deffd2f8f0f", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12203" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:06 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:06 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpCCE2tr_4iWFlwmQkFVvzfskSWvZdvohQYV52oXF-tWUfie6Brp5TYrvUYx7jH8zsTg9qqk_kv0th8pOA1WsHahBUbDYuaqAmW0EpSJI6_xjBPdZ8" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9UkVRVUlSRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfTUlTU0lORzogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4ifX0=" } }, { "ID": "42a941620757dac5", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "684" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:06 GMT" ], "Etag": [ "CAU=" ], "Expires": [ "Thu, 02 May 2019 22:25:06 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoqov2civPKG8oSKmpVgUSoOD4W3rev4av_O6jgxkc5tSpPMgtxZeG3NznVRuFJLgClao2zPH8BvZIxTAAPUi_R-H0zgPz6ou8k9SMzLrcgW_HW100" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBVT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNBVT0ifV19" } }, { "ID": "ae79f2e22d58681a", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13059" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:06 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:06 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqP_EhJin_8uqVkiSwAv0jBAI8A0o7nSwNAQ-Z_EdAnq2PItIGJZl5NOE_xcDTFce_ncHfsf6LvV4NMvuxiOsl32BOddZj_6x5dC36QqrKvhXKaQJ0" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9Rk9SQklEREVOLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMywibWVzc2FnZSI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuIn19" } }, { "ID": "99becaf4890b3c21", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:08 GMT" ], "Etag": [ "CAY=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpWMu40YNkuE3QcNByTmrKw_cnq4a8DVtcknBJ7gTnLdH1BC6CqoFOStPpa6y4PMmdpLpquozlOzvI4NWjgZYp1d9F_wBEyaq-wquTQAWGXNy3qktY" ] }, "Body": "" } }, { "ID": "586ccc26d5a22712", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11631" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:08 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:08 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpsRO9GedosQ-kg2lCQpx2S6C0-HH592CdB3SU9yGMwEEGKX9md7KGeSDhecrm_6Ug6tyYtEMlsMq08YBAKGprXfcN9130mRolu_HVey3CcrXK1nZ0" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19" } }, { "ID": "fad4bdab588e0f3a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12243" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:08 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:08 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UoUefKoF0asUvxzmAtX5z5m_5FRy9UfliKkjQN8cYyrHAotGwiQA72QN0lYfA0HXbe7gFRokwBAY8R5OpHcEdRq5K9sw8AwHuNtruFtBMxjN0D3hR4" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "23bb9ce53da2f525", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11631" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:09 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:09 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Upa2KE5JJOXq2FOn7RHasJpOeeHqWU2kk3BC4cQcGQ9jGzh6XIksN6Z6u1NVoCbxW7-3zGiZMdAop-oa_EuyPAauD__JgzNPdngeNeXO7lsGaVI6i8" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19" } }, { "ID": "46482e47e655836d", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/defaultObjectAcl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13099" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:09 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:09 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Urze42blCAS2Dskbf5jkbCkdo5IhfOjcTlcufV1ooZd5x_QD0zK1gRoXLXfvLjKHEKaJ7cuDeSRmNjuqgEoxJFMmXUoPOIetWLYbH0G-lJcM6tydew" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "856a1fb5ffdb000f", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "463" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:09 GMT" ], "Etag": [ "COGeqNLx/eECEAU=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoFSnYuPlv_JejZ0nEjoWRXeLwj0MS-ddTlIaSOjaK5BudyIcIOeVDEeyFYWsF-GCZzMC0F7v-UEw0_lbsYBXCMZcLp6WZu_s3OPDREhpz2s3Txw-s" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBVT0ifQ==" } }, { "ID": "a74c3e1b541a9ffc", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "463" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:10 GMT" ], "Etag": [ "COGeqNLx/eECEAU=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ury3MiMZho3xaSHmFgwHNvKIHTa0_gZzfKvX8FW6iVGNkdSbXvmVypIUuIoKXDjd4rOXpFghdoJlES9A_iXUvZyfWAZLvWqR1w6sDRymrIARVd0dPE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBVT0ifQ==" } }, { "ID": "913da4fa24ea5f1f", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12243" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:10 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UoKAxObyNBS_Mew44t3k1u80cLBGQW_I2ohrF96rIjZRxFscjGFrvsOHfLxw78rTRnpHmfA0uXnNz8T2FPc_Op16Lnn1YkfyOezSEhDBx11qZbinEE" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6OTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5VcGRhdGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChVcGRhdGVBY2xzLmphdmE6MjcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLnVwZGF0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "5dbdf24cae75e565", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "463" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:10 GMT" ], "Etag": [ "COGeqNLx/eECEAU=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpoJgRZ665WjiUif7SnQ-Vg4B0kJl-UQ_kIk5XgmcQIL5zmCBp3NCxjksybkvNKpGcQnIJSLevfyWd2fugRv5y5vxmEBgqFffIy8ibTIyBDH4b7R74" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL2RvbWFpbi1nb29nbGUuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4OTE1NDgwMDEiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNPR2VxTkx4L2VFQ0VBVT0ifQ==" } }, { "ID": "f41892a142fe6d2b", "Request": { "Method": "PUT", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "107" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIifQo=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13099" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:11 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpThInLTHhtepE7J4k-Rg6OoLRyOqnjPz4sZmfIH6wp5TSIyLrZQhExKAP52XbwUwMYp7x-xypSMY5kfR66I-dmpRWaFkfs0Lhy-Z6kqb5JUXSppqk" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjkwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuVXBkYXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoVXBkYXRlQWNscy5qYXZhOjI3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci51cGRhdGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YTo5MClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLlVwZGF0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFVwZGF0ZUFjbHMuamF2YToyNylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IudXBkYXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "5eb0710be2571dab", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2800" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:11 GMT" ], "Etag": [ "COGeqNLx/eECEAU=" ], "Expires": [ "Thu, 02 May 2019 22:25:11 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpbetUCGwYg4rhIR-DP3ntPqbkFwSqutNltVR55I4qedP-rZ5hC7ospMy6hZ4aQaNOhNv0frmst8MQZ0j6Mp8BcTC6qy7mU8bhEAiMGLycR5XxUWfI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In1dfQ==" } }, { "ID": "56aaafb0a24b0644", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2800" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:11 GMT" ], "Etag": [ "COGeqNLx/eECEAU=" ], "Expires": [ "Thu, 02 May 2019 22:25:11 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrqQczDm-dzjgTlLFcJ2lXQrMTpQ_8UP-1hNbGj7eZEgZcbxWA-oyXqEe4tJXq3gYdZ3mEIcAzaDtNeBHWidpIev7kdXWank04_JSWbQtU2UomJqeU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In1dfQ==" } }, { "ID": "3bbc40d778939612", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12203" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Ur5kJWpLwxz76BKPll75-nOsLv_uoh7X-TW0SbNHCYEzkGq8VZ-W8a5tKGUF6rKea4ejr4MhcqJVr1Zu7O-zNAfQWJMsHC9CTkOrPa5Iu1s0KBJDdY" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9UkVRVUlSRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfTUlTU0lORzogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4ifX0=" } }, { "ID": "a2868e9e376e356b", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2800" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Etag": [ "COGeqNLx/eECEAU=" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoyZfAJB3TroGxzYv0gy7dHUwpU0jtIeU_EyQSFQKzHlHbyRa33r_a-B1aHw5tHaoawuDvv7skisdx10yhmm9ZRrPw0ibwpMkX5Cwhf0OK85DF84jM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9scyIsIml0ZW1zIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJvYmplY3QiOiJmb28iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg5MTU0ODAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU4OTE1NDgwMDEvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvdXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ09HZXFOTHgvZUVDRUFVPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2Zvby8xNTU2ODM1ODkxNTQ4MDAxL2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODkxNTQ4MDAxIiwiZW50aXR5IjoiZG9tYWluLWdvb2dsZS5jb20iLCJyb2xlIjoiUkVBREVSIiwiZG9tYWluIjoiZ29vZ2xlLmNvbSIsImV0YWciOiJDT0dlcU5MeC9lRUNFQVU9In1dfQ==" } }, { "ID": "ffb216dc74ccc27e", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13059" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:12 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqBumxgw_FTJlt7J3xLsBDxljAcEyC2G5aQqhEibawMttB-ogPabqDfz8ZN65WtOikIggZQ8OqW8zigV4Q5vfQkog7NMasAuivcMjhAsgqv_6qWv_E" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MTAxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuTGlzdEFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExpc3RBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmxpc3QoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YTo4OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9Rk9SQklEREVOLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToxMDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5MaXN0QWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTGlzdEFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IubGlzdChBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjEwMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkxpc3RBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0QWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5saXN0KEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6ODkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMywibWVzc2FnZSI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuIn19" } }, { "ID": "183157f40c6c1bcd", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:13 GMT" ], "Etag": [ "COGeqNLx/eECEAY=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrC6xxVQeIIjitNwDv5PhDUIBQbtGdHJDi_AmLs8vTbGzkby-5hguMIwI_UeHlCuGF1u5jBoVwCOgSqJBiJJ5fxh8oCzBn-nHGcGAdIOeQt7gTL0RQ" ] }, "Body": "" } }, { "ID": "4b6b925053570053", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11631" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:13 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:13 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpiIBwh04pJH1-X9d1oJluF_2ZCJEFLzF4E7SI-easf2noIolxavCbpH7NP9GMmNXnVK_ZJm4kW8coV5ArXDr-Rwodjnd9Bn2hFiJ_puNeWWldJ6mA" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19" } }, { "ID": "9b4f9c448170e89d", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12243" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:14 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:14 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqHc1VVBdvXFq9aDPAprpXNP5xPt-ZtPdYXwCQPHX_s4gkCMom31AtHeDocV_hker5qryWoYnRD8PPu5c7JqDNQ75v7GgE1vO5xAt7AqWPoLU5MO5A" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "692d41cf9ea91eb2", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11631" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:14 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:14 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpuFB_mdJg9Fd7Sj06Xdcrj7Up2xXVc_P-SgISEEtiv4v9doPXzNbzBz92Q2UfEchYWSQnikHhS34dUAOefj9J4vaBYqjc9RjFmrn8YcPNyS8aWKgI" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0xfU0NPUEVfTk9UX0ZPVU5EOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1OT1RfRk9VTkQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9bm90Rm91bmQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLk5PVF9GT1VORCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDTF9TQ09QRV9OT1RfRk9VTkQ6IFNwZWNpZmllZCBBQ0wgc2NvcGUgd2FzIG5vdCBmb3VuZFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6ODYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYWNscy5EZWxldGVBY2xzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVBY2xzLmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmRlbGV0ZShBY2Nlc3NDb250cm9sc0RlbGVnYXRvci5qYXZhOjEwOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5zY29wZSwgbWVzc2FnZT1udWxsLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249ZW50aXR5LnJlc291cmNlX2lkLnNjb3BlLCBtZXNzYWdlPU5vdCBGb3VuZCwgcmVhc29uPW5vdEZvdW5kLCBycGNDb2RlPTQwNH0gTm90IEZvdW5kOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNMX1NDT1BFX05PVF9GT1VORDogU3BlY2lmaWVkIEFDTCBzY29wZSB3YXMgbm90IGZvdW5kXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBTcGVjaWZpZWQgQUNMIHNjb3BlIHdhcyBub3QgZm91bmRcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19" } }, { "ID": "db035a3cc51de007", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/acl/domain-google.com?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13099" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:14 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:14 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrGb7BqO44vNpZjBnLrSI6_jVCVRFevSqm5eux2DIE2zmUY3sH0T0st7OOsLPcBjvLSbDfijMcdJwsgpM1fQGcerB9bS8Ffd4Qgzdjth0I8FreV4Vs" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjg2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmFjbHMuRGVsZXRlQWNscy5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlQWNscy5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5BY2Nlc3NDb250cm9sc0RlbGVnYXRvci5kZWxldGUoQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YTo4Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5hY2xzLkRlbGV0ZUFjbHMuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZUFjbHMuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQWNjZXNzQ29udHJvbHNEZWxlZ2F0b3IuZGVsZXRlKEFjY2Vzc0NvbnRyb2xzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "e1d95794cb6be989", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3273" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:15 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoVcH2L0r9wGab--fnRuKptLRoUoHCUHfRegh3rKNQExHVsYLnt1NFwOKFa_6hRbeYXO1aY8-F-KiD6IY3sWykIKXr5iqelEJHTWEMQ8wHuzIcWLO8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1MjY2MjE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weSIsIm5hbWUiOiJjb3B5IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTUyNjYyMTQiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTUuMjY1WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE1LjI2NVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxNS4yNjVaIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHk/Z2VuZXJhdGlvbj0xNTU2ODM1OTE1MjY2MjE0JmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1MjY2MjE0L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNTI2NjIxNCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDS2J4ejkzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1MjY2MjE0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE1MjY2MjE0IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0tieHo5M3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2NvcHkvMTU1NjgzNTkxNTI2NjIxNC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNTI2NjIxNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDS2J4ejkzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1MjY2MjE0L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE1MjY2MjE0IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0tieHo5M3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDS2J4ejkzeC9lRUNFQUU9In19" } }, { "ID": "297f13e741cceb04", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3273" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:15 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UroLXQs6945-UOUyN7qOhICUNnGSzCVrNCv5DD9uMyvgD08zpuufBZj8WM8Fxe0DuOuQowqbPEn1UdJdbFTW7puyeY4zX8fM6UgT7SZIVB0Xi-B0OM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1ODQxOTk3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weSIsIm5hbWUiOiJjb3B5IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTU4NDE5OTciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTUuODQxWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE1Ljg0MVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxNS44NDFaIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHk/Z2VuZXJhdGlvbj0xNTU2ODM1OTE1ODQxOTk3JmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1ODQxOTk3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNTg0MTk5NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTTJEODkzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1ODQxOTk3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE1ODQxOTk3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ00yRDg5M3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2NvcHkvMTU1NjgzNTkxNTg0MTk5Ny9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNTg0MTk5NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTTJEODkzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE1ODQxOTk3L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE1ODQxOTk3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ00yRDg5M3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTTJEODkzeC9lRUNFQUU9In19" } }, { "ID": "9617f04d2dc95a7c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12683" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:16 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqeJiJeDLLZgn9vlRyNk1plY-7dcPXaz47gPNAhMqmSx5ZMvg6pqWj18PVUR65UGuWE7Amtua_zqsv0dVyDZE2FFceMeIQcQ2n6noklvRS9kxPXcEU" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9UkVRVUlSRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuLCBkb21haW49Z2xvYmFsLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9YmFkUmVxdWVzdCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfTUlTU0lORzogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QucmV3cml0ZShSZXdyaXRlT2JqZWN0LmphdmE6MjAwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjE5Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5yZXdyaXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMCwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4ifX0=" } }, { "ID": "2309e069a65c894f", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3333" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:16 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpxhvVZmlJMvR93BoI0JsL0TYbDN-kmlYHQOOlRfb-Nnqpc8iUImRtJT8Qvx0XWrOsALmLv4Oub_aeCCWkHPvqaF28oAazlhqRZYoxrPlaQlW0N1Qs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE2NjM3MTY1Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weSIsIm5hbWUiOiJjb3B5IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTY2MzcxNjUiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTYuNjM2WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE2LjYzNloiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxNi42MzZaIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHk/Z2VuZXJhdGlvbj0xNTU2ODM1OTE2NjM3MTY1JmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE2NjM3MTY1L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2NvcHkvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNjYzNzE2NSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTzNIbzk3eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE2NjM3MTY1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE2NjM3MTY1IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ08zSG85N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL2NvcHkvMTU1NjgzNTkxNjYzNzE2NS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29weS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImNvcHkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNjYzNzE2NSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTzNIbzk3eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvY29weS8xNTU2ODM1OTE2NjM3MTY1L3VzZXItaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb3B5L2FjbC91c2VyLWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiY29weSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE2NjM3MTY1IiwiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ08zSG85N3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTzNIbzk3eC9lRUNFQUU9In19" } }, { "ID": "d2fe101ea1da654d", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo/rewriteTo/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\u0026prettyPrint=false\u0026projection=full\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13539" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:16 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqjFigs6aYtqXW_7VucOIgJY2MQZwuLv9B12s2ffhWgWDxtJyjLinG4A8U9gKBCpiTt9jUvdHKtaG20qZfyfN9Q1eVAkUQh_zv7ESbqnWhsiheI7zw" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5yZXdyaXRlKFJld3JpdGVPYmplY3QuamF2YToyMDApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6MTkzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLnJld3JpdGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyMSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTggbW9yZVxuXG5jb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5GYXVsdDogSW1tdXRhYmxlRXJyb3JEZWZpbml0aW9ue2Jhc2U9Rk9SQklEREVOLCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9BQ0NFU1NfREVOSUVEOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LnJld3JpdGUoUmV3cml0ZU9iamVjdC5qYXZhOjIwMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YToxOTMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5SZXdyaXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXdyaXRlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IucmV3cml0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTIxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOCBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QucmV3cml0ZShSZXdyaXRlT2JqZWN0LmphdmE6MjAwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuUmV3cml0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmV3cml0ZU9iamVjdC5qYXZhOjE5Mylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLlJld3JpdGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJld3JpdGVPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5yZXdyaXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE4IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwMywibWVzc2FnZSI6ImludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuIn19" } }, { "ID": "6620f07aff04b6fd", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "127" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "742" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:17 GMT" ], "Etag": [ "CP/B0t7x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpyWMaddvNz0IWnQ6KIl-tv6fJZCvrqTlGuaoHvKqXhxb3O1EKUIEirKSVcaedFZyxtjLhPD7Nj6qf1CRGWG1VnVigo5Wf3sYFDuuLvctxVpoHT0rY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9jb21wb3NlLzE1NTY4MzU5MTc0MDY0NjMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb21wb3NlIiwibmFtZSI6ImNvbXBvc2UiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxNzQwNjQ2MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxNy40MDZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTcuNDA2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE3LjQwNloiLCJzaXplIjoiMTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29tcG9zZT9nZW5lcmF0aW9uPTE1NTY4MzU5MTc0MDY0NjMmYWx0PW1lZGlhIiwiY3JjMzJjIjoiL1JDT2dnPT0iLCJjb21wb25lbnRDb3VudCI6MiwiZXRhZyI6IkNQL0IwdDd4L2VFQ0VBRT0ifQ==" } }, { "ID": "7f88847ad9c49799", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "127" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "742" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:18 GMT" ], "Etag": [ "CKav+N7x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Urtn69BB0ytbCZpuCbus4w__tiLeBpqeNzD2gKl5KN2LgP9ZJOIjudGKpDOJRhyW_WQjVOCJBC1CSB_AgE0MdPzVDAKWt13VfQ8aKe3pMWh4y1kOlI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9jb21wb3NlLzE1NTY4MzU5MTgwMjY2NjIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb21wb3NlIiwibmFtZSI6ImNvbXBvc2UiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxODAyNjY2MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxOC4wMjZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTguMDI2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE4LjAyNloiLCJzaXplIjoiMTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29tcG9zZT9nZW5lcmF0aW9uPTE1NTY4MzU5MTgwMjY2NjImYWx0PW1lZGlhIiwiY3JjMzJjIjoiL1JDT2dnPT0iLCJjb21wb25lbnRDb3VudCI6MiwiZXRhZyI6IkNLYXYrTjd4L2VFQ0VBRT0ifQ==" } }, { "ID": "a21f3ddca57ed424", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "127" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12267" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:18 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrE9jrLJ0W1PUHWT3ldYhVsL9nNhAeFPU2K8g2rCMimty07QlN95esxj7dBAySQ-nzvK17L3WA7vjmxjCpeQADa2bztj6ke8NZjb8fuWkQHsnnzKXA" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6MTk5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmNvbXBvc2UoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "08fda3fa173e6e11", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "127" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "742" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:19 GMT" ], "Etag": [ "CKy2sd/x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqfGXVJ2-MQaZWJ-JS6runpSycA3GDKIXYHDGf3VBOXnADbUzL2YhZVmlQcW_95jXY0eMkK4Z5tSRk3cxGP_84T_1t3YDYQS2p37ZouBk7GfX-4xxw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9jb21wb3NlLzE1NTY4MzU5MTg5NjE0NTIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9jb21wb3NlIiwibmFtZSI6ImNvbXBvc2UiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxODk2MTQ1MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxOC45NjFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTguOTYxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE4Ljk2MVoiLCJzaXplIjoiMTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vY29tcG9zZT9nZW5lcmF0aW9uPTE1NTY4MzU5MTg5NjE0NTImYWx0PW1lZGlhIiwiY3JjMzJjIjoiL1JDT2dnPT0iLCJjb21wb25lbnRDb3VudCI6MiwiZXRhZyI6IkNLeTJzZC94L2VFQ0VBRT0ifQ==" } }, { "ID": "0c9e19bd4ec37de2", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose/compose?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "127" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6ImZvbyJ9LHsibmFtZSI6ImNvcHkifV19Cg==" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13123" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:19 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqGREJ2AZDcrZiJzPX5ltwlB28vRYhZ_xv4LMIO3La2IgFWk4wd5IVrqBs3z2epgtg7wkPpZm4qPH9zTzSIsXNxdLLHcNMMYr2azidefxtJVgXqgDY" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuQ29tcG9zZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoQ29tcG9zZU9iamVjdC5qYXZhOjE5OSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YTo0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5jb21wb3NlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YToxOTkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuY29tcG9zZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkNvbXBvc2VPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKENvbXBvc2VPYmplY3QuamF2YToxOTkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5Db21wb3NlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChDb21wb3NlT2JqZWN0LmphdmE6NDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuY29tcG9zZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "84daee26f7d989ce", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3112" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:19 GMT" ], "Etag": [ "CLmF4d/x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoLuw-z5wwTKy-X92_i7pyTrimolUNRUGrElhep6rUH_mmpgu_Vxp-1ncr8x8XNXHLs8NFRW5S7WVUsaDRRTrC5KBPea4EoFLANK8MFY0FpTkXr7_g" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkxOTc0MTYyNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkxOTc0MTYyNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToxOS43NDFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MTkuNzQxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjE5Ljc0MVoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkxOTc0MTYyNSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkxOTc0MTYyNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE5NzQxNjI1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMbUY0ZC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkxOTc0MTYyNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTk3NDE2MjUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTG1GNGQveC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MTk3NDE2MjUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTE5NzQxNjI1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMbUY0ZC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkxOTc0MTYyNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MTk3NDE2MjUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTG1GNGQveC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNMbUY0ZC94L2VFQ0VBRT0ifQ==" } }, { "ID": "8457a5701f4ced08", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:20 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpKF1M6PpAT354ON3809wMCor-B9KITRuEV34MQczP3OD4Co0sJYtNSub2FUzA8qanTDrtANRK0RuxPTz314o3HQro2HLOoyKZBow5CZ4sfsunKHv0" ] }, "Body": "" } }, { "ID": "1c2ba8a7670e2218", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3112" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:20 GMT" ], "Etag": [ "CP+SgODx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoq9hgjjwBbSH1zXN2UlNtWO31Qf5uk4ijjGCQlETB9_5H_CouvU3q4tyHAKEbIBlaW1_mNk3Fsp6LgXqsPPKvFzs3-WHeADAgc2-GpD-0inoYUHMs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDI1MTI2MyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkyMDI1MTI2MyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyMC4yNTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MjAuMjUwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjIwLjI1MFoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkyMDI1MTI2MyZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDI1MTI2My9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIwMjUxMjYzIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQK1NnT0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDI1MTI2My9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjAyNTEyNjMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUCtTZ09EeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MjAyNTEyNjMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIwMjUxMjYzIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQK1NnT0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDI1MTI2My91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjAyNTEyNjMiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUCtTZ09EeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNQK1NnT0R4L2VFQ0VBRT0ifQ==" } }, { "ID": "7e6d2f97bd881584", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:20 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UohQH2nTuRg_FtGhlfr9zC26C6lKFA-aZTf4GbiV5kWZCJ9E4YLHfIUKLpCLIgEfX9TAvi4oPNWfEBpbY-orlescLxrxYcB1U5fLmzzHQR2R0teR-s" ] }, "Body": "" } }, { "ID": "48e189abff98ea93", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3112" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:21 GMT" ], "Etag": [ "CM3Aq+Dx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq_NscG9s3iq-8NZq8vQhzdc9FJMaAfq_0GborrX84b8gG2zpbUNtEVnrjFjLyOXqBeJwthPgPUPcsGbIcD597LaPlxt-VNaetM2BLtMtYry8pPeQ8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDk2MTYxMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkyMDk2MTYxMyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyMC45NjFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MjAuOTYxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjIwLjk2MVoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkyMDk2MTYxMyZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDk2MTYxMy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIwOTYxNjEzIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNM0FxK0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDk2MTYxMy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjA5NjE2MTMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTTNBcStEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MjA5NjE2MTMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIwOTYxNjEzIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNM0FxK0R4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMDk2MTYxMy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjA5NjE2MTMiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTTNBcStEeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNNM0FxK0R4L2VFQ0VBRT0ifQ==" } }, { "ID": "02d6922c26c06cbd", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 400, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "12243" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:21 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:21 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrmjSJHhErkbzi8feJ_-8XOMqsIzGrEe6frQzWXQ7dPl0D8MW1mMHClKdwb2zBOTvpx7mXQWy2STZYSqx2o7O1Tr2DB1RZfwCZ3xp1jgw3NCICi7Xw" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkJ1Y2tldCBpcyByZXF1ZXN0ZXIgcGF5cyBidWNrZXQgYnV0IG5vIHVzZXIgcHJvamVjdCBwcm92aWRlZC4iLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX01JU1NJTkc6IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjg4KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YToyNSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5kZWxldGUoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjExMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQnVja2V0IGlzIFJlcXVlc3RlciBQYXlzIGJ1Y2tldCBidXQgbm8gYmlsbGluZyBwcm9qZWN0IGlkIHByb3ZpZGVkIGZvciBub24tb3duZXIuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVJFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1iYWRSZXF1ZXN0LCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5SRVFVSVJFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9QnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMH0gQnVja2V0IGlzIHJlcXVlc3RlciBwYXlzIGJ1Y2tldCBidXQgbm8gdXNlciBwcm9qZWN0IHByb3ZpZGVkLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlVTRVJfUFJPSkVDVF9NSVNTSU5HOiBCdWNrZXQgaXMgUmVxdWVzdGVyIFBheXMgYnVja2V0IGJ1dCBubyBiaWxsaW5nIHByb2plY3QgaWQgcHJvdmlkZWQgZm9yIG5vbi1vd25lci5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEJ1Y2tldCBpcyBSZXF1ZXN0ZXIgUGF5cyBidWNrZXQgYnV0IG5vIGJpbGxpbmcgcHJvamVjdCBpZCBwcm92aWRlZCBmb3Igbm9uLW93bmVyLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDAsIm1lc3NhZ2UiOiJCdWNrZXQgaXMgcmVxdWVzdGVyIHBheXMgYnVja2V0IGJ1dCBubyB1c2VyIHByb2plY3QgcHJvdmlkZWQuIn19" } }, { "ID": "3fee93fca0ef933c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3112" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:21 GMT" ], "Etag": [ "CLfH1eDx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqLO91a0iSaTsK7EA2iN621UX-atvJ-8m8BeqeR8_o_CQLB8Pco5FMXznwQY7DZ8u0GPd1BvLE98s5S7T1Z6yL66OKL0CFFUntLBqNAKlji2Dcme6g" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMTY1MDYxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkyMTY1MDYxNSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyMS42NTBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MjEuNjUwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjIxLjY1MFoiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkyMTY1MDYxNSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMTY1MDYxNS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIxNjUwNjE1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMZkgxZUR4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMTY1MDYxNS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjE2NTA2MTUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTGZIMWVEeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MjE2NTA2MTUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIxNjUwNjE1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMZkgxZUR4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMTY1MDYxNS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjE2NTA2MTUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTGZIMWVEeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNMZkgxZUR4L2VFQ0VBRT0ifQ==" } }, { "ID": "5c26cf93373a296a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026userProject=gcloud-golang-firestore-tests", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:22 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Urx3fvI3sQc5JiIazK1OQw5W12poVdjRyBKxIBM6N98jEJli9F0O33KVHHcHaP-QybHub31QmLNngZpzcVKJq33DSaVMW2Vpi5BUaVAAUL2jMoyOxs" ] }, "Body": "" } }, { "ID": "f8b5020ef71e4047", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJuYW1lIjoiZm9vIn0K", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3112" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:22 GMT" ], "Etag": [ "CIungeHx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq8QEz45d-uPa7qZ6Nl_SMqw2iepQXoM4aAkTx4YCqArXnSKI1UO3ZhJ5-_PDg3Uq6PPa2JDBTbxckiZCRMQvf0Cv6E_8Cwk3jKXGkneWFJYSeMAts" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMjM2NzM3MSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2ZvbyIsIm5hbWUiOiJmb28iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkyMjM2NzM3MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyMi4zNjZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MjIuMzY2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjIyLjM2NloiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vP2dlbmVyYXRpb249MTU1NjgzNTkyMjM2NzM3MSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMjM2NzM3MS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvby9mb28vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIyMzY3MzcxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJdW5nZUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMjM2NzM3MS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjIzNjczNzEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSXVuZ2VIeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDMvZm9vLzE1NTY4MzU5MjIzNjczNzEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9vL2Zvby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMyIsIm9iamVjdCI6ImZvbyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTIyMzY3MzcxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJdW5nZUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMy9mb28vMTU1NjgzNTkyMjM2NzM3MS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzL28vZm9vL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAzIiwib2JqZWN0IjoiZm9vIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MjIzNjczNzEiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSXVuZ2VIeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im1uRzdUQT09IiwiZXRhZyI6IkNJdW5nZUh4L2VFQ0VBRT0ifQ==" } }, { "ID": "7cfadd8c1e7c0bd8", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false\u0026userProject=veener-jba", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13099" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:22 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:22 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpjVnPaklKmbO8qV2lapwEIAwPjvf4HSJs3kNHHO_xZH4bV65pVPLKCb2qjMPCYSwEKRZzH6NpYjm6WlxsBdJnfBvpyRpIR017q9iJDyBcVPNUoDn8" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUZPUkJJRERFTiwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpVU0VSX1BST0pFQ1RfQUNDRVNTX0RFTklFRDogaW50ZWdyYXRpb25AZ2Nsb3VkLWdvbGFuZy1maXJlc3RvcmUtdGVzdHMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20gZG9lcyBub3QgaGF2ZSBzZXJ2aWNldXNhZ2Uuc2VydmljZXMudXNlIGFjY2VzcyB0byBwcm9qZWN0IDY0MjA4MDkxODEwMS5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUZPUkJJRERFTiwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPWludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1pbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6VVNFUl9QUk9KRUNUX0FDQ0VTU19ERU5JRUQ6IGludGVncmF0aW9uQGdjbG91ZC1nb2xhbmctZmlyZXN0b3JlLXRlc3RzLmlhbS5nc2VydmljZWFjY291bnQuY29tIGRvZXMgbm90IGhhdmUgc2VydmljZXVzYWdlLnNlcnZpY2VzLnVzZSBhY2Nlc3MgdG8gcHJvamVjdCA2NDIwODA5MTgxMDEuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MDMsIm1lc3NhZ2UiOiJpbnRlZ3JhdGlvbkBnY2xvdWQtZ29sYW5nLWZpcmVzdG9yZS10ZXN0cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSBkb2VzIG5vdCBoYXZlIHNlcnZpY2V1c2FnZS5zZXJ2aWNlcy51c2UgYWNjZXNzIHRvIHByb2plY3QgNjQyMDgwOTE4MTAxLiJ9fQ==" } }, { "ID": "b1381b9995cf35f5", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/foo?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:23 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrD1hmfKK3yAwFXKqIwvCsEVMb_e7MWysJc7zbyVjZ_sbD9P41lzc0gYSef9yl8CRa6B0RtPq14V5MBSdy6C0i_cAkgANDN1da3O5QKELvACU11moU" ] }, "Body": "" } }, { "ID": "5e06ccad06bbd110", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/copy?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:23 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur2FRcf4QGZH2KhkP3kATb9eOy4S9lgrA3NQXYqhc1KBZDbcZN5NHF4MB6WiTxOraNE0HhkW3SOg8sp1gS4kAcWRZ2G0EGWmLgL6RUcwr3a2O-WY10" ] }, "Body": "" } }, { "ID": "b637ccaa36faa55b", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003/o/compose?alt=json\u0026prettyPrint=false\u0026userProject=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:23 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqGzSAdUK8pPs53JjaSJVQJObMJRsfQ5FIpSL0D4tNfft68cfE8Xb5fjSsAQG_PfmKZyX1Ind-s6dW6FgwREeHzu_OnEeOwCOaT8EZi2N4vNeWLvac" ] }, "Body": "" } }, { "ID": "15055c361faad5c1", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0003?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:24 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqwmXVRTmXX3P5iId4-EjuA1oviIQD-Vbdr7M5rgd7d5IxNvmPVkZz_zFyMBNoHd_DzXnPMN5R7grAe1yDdOzbyafIBwRcFsLh4r0a7ghp4LkNSLZk" ] }, "Body": "" } }, { "ID": "307f8a44d4ce6e9f", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "32" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:24 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:24 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpaHmcEJBKGI7CtW9fK8-j5Z-oRk_dTwMS40wVaoNH1PN7k6x6d_9aD3w3ce6WGZJF5OYxkdoifp6L2vVz5lIGjzcmmIZ4Wxp1vktBOv8hLa417Mp4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNub3RpZmljYXRpb25zIn0=" } }, { "ID": "f8df88961018be68", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "121" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJwYXlsb2FkX2Zvcm1hdCI6Ik5PTkUiLCJ0b3BpYyI6Ii8vcHVic3ViLmdvb2dsZWFwaXMuY29tL3Byb2plY3RzL2Rla2xlcmstc2FuZGJveC90b3BpY3MvZ28tc3RvcmFnZS1ub3RpZmljYXRpb24tdGVzdCJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "297" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:24 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqWiAA6LvnU4rExe2rVTwwFd51SI93o_d2tOj9OY1jk_qe1Yd1eiTXIa2eNecJQsmgwuFr4BUQoWy8ndutrCqGucmVIRL0jA6-i-vaGGVRF8uEe0AM" ] }, "Body": "eyJpZCI6IjExIiwidG9waWMiOiIvL3B1YnN1Yi5nb29nbGVhcGlzLmNvbS9wcm9qZWN0cy9kZWtsZXJrLXNhbmRib3gvdG9waWNzL2dvLXN0b3JhZ2Utbm90aWZpY2F0aW9uLXRlc3QiLCJwYXlsb2FkX2Zvcm1hdCI6Ik5PTkUiLCJldGFnIjoiMTEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm90aWZpY2F0aW9uQ29uZmlncy8xMSIsImtpbmQiOiJzdG9yYWdlI25vdGlmaWNhdGlvbiJ9" } }, { "ID": "45f44fa6c3668273", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "340" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:25 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:25 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoFWgB9V-ilyDIBP7KEF3SY7uTg-rikYE1ooEgWYkiXb2cW6oOwwtH1W7oe24WU2A9oyJIGOSskz3_icHqmMn7CfPoZQ-Lu5QdtZzv_5062_-UzAt0" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNub3RpZmljYXRpb25zIiwiaXRlbXMiOlt7ImlkIjoiMTEiLCJ0b3BpYyI6Ii8vcHVic3ViLmdvb2dsZWFwaXMuY29tL3Byb2plY3RzL2Rla2xlcmstc2FuZGJveC90b3BpY3MvZ28tc3RvcmFnZS1ub3RpZmljYXRpb24tdGVzdCIsInBheWxvYWRfZm9ybWF0IjoiTk9ORSIsImV0YWciOiIxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub3RpZmljYXRpb25Db25maWdzLzExIiwia2luZCI6InN0b3JhZ2Ujbm90aWZpY2F0aW9uIn1dfQ==" } }, { "ID": "08c2546e2c262ee7", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs/11?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:25 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoTmXr5TZZPRnABz_XbbZpjwU3iPz2e802RkcmNFr3sLzUx205tdmAb6vVWMNlYMUGZ5tGoddlqQ_oPnz0Xdvpz8CiD2eDLMDyrMbxVFjc3BinwBo0" ] }, "Body": "" } }, { "ID": "efc8b67f9c2f4b40", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/notificationConfigs?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "32" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:25 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:25 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UraMBYT56qFvKLe_OPJfpJRhTy2qSpQyRjP6CScOnnijgaQ88eQtVahktX_Vsvy-G7J11d7GNT64FnpqZrewu1sUmuNNLiEtmkqVFILdNcWed6i1w4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNub3RpZmljYXRpb25zIn0=" } }, { "ID": "6dd92f9ce3b15a57", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Length": [ "7903" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 02 May 2019 22:25:25 GMT" ], "Etag": [ "\"7a5fd4743bd647485f88496fadb05c51\"" ], "Expires": [ "Thu, 02 May 2019 23:25:25 GMT" ], "Last-Modified": [ "Tue, 04 Oct 2016 16:42:07 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1475599327662000" ], "X-Goog-Hash": [ "crc32c=PWBt8g==", "md5=el/UdDvWR0hfiElvrbBcUQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "7903" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpedRCcxIOhXCWdipyV2E0R3z00CUlOK6rPlof1gpKuQbLeJmvMoPFn28o8zqmmeVJ5rbX41bB6Hp116-_ISgEXl4Htmc1VS0Aq41lJQiN_mIvozbY" ] }, "Body": "R1JPVVAgPSBMMV9NRVRBREFUQV9GSUxFCiAgR1JPVVAgPSBNRVRBREFUQV9GSUxFX0lORk8KICAgIE9SSUdJTiA9ICJJbWFnZSBjb3VydGVzeSBvZiB0aGUgVS5TLiBHZW9sb2dpY2FsIFN1cnZleSIKICAgIFJFUVVFU1RfSUQgPSAiMDcwMTYwOTE5MTA1MV8wMDAwNCIKICAgIExBTkRTQVRfU0NFTkVfSUQgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwIgogICAgRklMRV9EQVRFID0gMjAxNi0wOS0yMFQwMzoxMzowMloKICAgIFNUQVRJT05fSUQgPSAiTEdOIgogICAgUFJPQ0VTU0lOR19TT0ZUV0FSRV9WRVJTSU9OID0gIkxQR1NfMi42LjIiCiAgRU5EX0dST1VQID0gTUVUQURBVEFfRklMRV9JTkZPCiAgR1JPVVAgPSBQUk9EVUNUX01FVEFEQVRBCiAgICBEQVRBX1RZUEUgPSAiTDFUIgogICAgRUxFVkFUSU9OX1NPVVJDRSA9ICJHTFMyMDAwIgogICAgT1VUUFVUX0ZPUk1BVCA9ICJHRU9USUZGIgogICAgU1BBQ0VDUkFGVF9JRCA9ICJMQU5EU0FUXzgiCiAgICBTRU5TT1JfSUQgPSAiT0xJX1RJUlMiCiAgICBXUlNfUEFUSCA9IDQ0CiAgICBXUlNfUk9XID0gMzQKICAgIE5BRElSX09GRk5BRElSID0gIk5BRElSIgogICAgVEFSR0VUX1dSU19QQVRIID0gNDQKICAgIFRBUkdFVF9XUlNfUk9XID0gMzQKICAgIERBVEVfQUNRVUlSRUQgPSAyMDE2LTA5LTE1CiAgICBTQ0VORV9DRU5URVJfVElNRSA9ICIxODo0NjoxOC42ODY3MzgwWiIKICAgIENPUk5FUl9VTF9MQVRfUFJPRFVDVCA9IDM4LjUyODE5CiAgICBDT1JORVJfVUxfTE9OX1BST0RVQ1QgPSAtMTIzLjQwODQzCiAgICBDT1JORVJfVVJfTEFUX1BST0RVQ1QgPSAzOC41MDc2NQogICAgQ09STkVSX1VSX0xPTl9QUk9EVUNUID0gLTEyMC43NjkzMwogICAgQ09STkVSX0xMX0xBVF9QUk9EVUNUID0gMzYuNDE2MzMKICAgIENPUk5FUl9MTF9MT05fUFJPRFVDVCA9IC0xMjMuMzk3MDkKICAgIENPUk5FUl9MUl9MQVRfUFJPRFVDVCA9IDM2LjM5NzI5CiAgICBDT1JORVJfTFJfTE9OX1BST0RVQ1QgPSAtMTIwLjgzMTE3CiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA0NjQ0MDAuMDAwCiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MjY0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWF9QUk9EVUNUID0gNjk0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWV9QUk9EVUNUID0gNDI2NDUwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDQ2NDQwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQwMzAyMDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA2OTQ1MDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MDMwMjAwLjAwMAogICAgUEFOQ0hST01BVElDX0xJTkVTID0gMTU2MjEKICAgIFBBTkNIUk9NQVRJQ19TQU1QTEVTID0gMTUzNDEKICAgIFJFRkxFQ1RJVkVfTElORVMgPSA3ODExCiAgICBSRUZMRUNUSVZFX1NBTVBMRVMgPSA3NjcxCiAgICBUSEVSTUFMX0xJTkVTID0gNzgxMQogICAgVEhFUk1BTF9TQU1QTEVTID0gNzY3MQogICAgRklMRV9OQU1FX0JBTkRfMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjMuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjQuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjYuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjcuVElGIgogICAgRklMRV9OQU1FX0JBTkRfOCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGIgogICAgRklMRV9OQU1FX0JBTkRfOSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMTAgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiCiAgICBGSUxFX05BTUVfQkFORF8xMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRiIKICAgIEZJTEVfTkFNRV9CQU5EX1FVQUxJVFkgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0JRQS5USUYiCiAgICBNRVRBREFUQV9GSUxFX05BTUUgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX01UTC50eHQiCiAgICBCUEZfTkFNRV9PTEkgPSAiTE84QlBGMjAxNjA5MTUxODMwNTdfMjAxNjA5MTUyMDA5NTAuMDEiCiAgICBCUEZfTkFNRV9USVJTID0gIkxUOEJQRjIwMTYwOTAyMDg0MTIyXzIwMTYwOTE3MDc0MDI3LjAyIgogICAgQ1BGX05BTUUgPSAiTDhDUEYyMDE2MDcwMV8yMDE2MDkzMC4wMiIKICAgIFJMVVRfRklMRV9OQU1FID0gIkw4UkxVVDIwMTUwMzAzXzIwNDMxMjMxdjExLmg1IgogIEVORF9HUk9VUCA9IFBST0RVQ1RfTUVUQURBVEEKICBHUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICAgIENMT1VEX0NPVkVSID0gMjkuNTYKICAgIENMT1VEX0NPVkVSX0xBTkQgPSAzLjMzCiAgICBJTUFHRV9RVUFMSVRZX09MSSA9IDkKICAgIElNQUdFX1FVQUxJVFlfVElSUyA9IDkKICAgIFRJUlNfU1NNX01PREVMID0gIkZJTkFMIgogICAgVElSU19TU01fUE9TSVRJT05fU1RBVFVTID0gIkVTVElNQVRFRCIKICAgIFJPTExfQU5HTEUgPSAtMC4wMDEKICAgIFNVTl9BWklNVVRIID0gMTQ4LjQ4MDQ5Mzk2CiAgICBTVU5fRUxFVkFUSU9OID0gNTAuOTM3NjgzOTkKICAgIEVBUlRIX1NVTl9ESVNUQU5DRSA9IDEuMDA1Mzc1MgogICAgR1JPVU5EX0NPTlRST0xfUE9JTlRTX1ZFUlNJT04gPSA0CiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfTU9ERUwgPSA1NDgKICAgIEdFT01FVFJJQ19STVNFX01PREVMID0gNS44NTcKICAgIEdFT01FVFJJQ19STVNFX01PREVMX1kgPSAzLjg0MQogICAgR0VPTUVUUklDX1JNU0VfTU9ERUxfWCA9IDQuNDIyCiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfVkVSSUZZID0gMjI4CiAgICBHRU9NRVRSSUNfUk1TRV9WRVJJRlkgPSAzLjM4MgogIEVORF9HUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICBHUk9VUCA9IE1JTl9NQVhfUkFESUFOQ0UKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xID0gNzUxLjk1NzA5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMSA9IC02Mi4wOTY4NgogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzIgPSA3NzAuMDEzMTgKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8yID0gLTYzLjU4Nzk0CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDcwOS41NjA2MQogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzMgPSAtNTguNTk1NzUKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF80ID0gNTk4LjM0MTQ5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNCA9IC00OS40MTEyMwogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzUgPSAzNjYuMTU1MTUKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF81ID0gLTMwLjIzNzIxCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDkxLjA1OTQ2CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC03LjUxOTcyCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNyA9IDMwLjY5MTkxCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNyA9IC0yLjUzNDU1CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfOCA9IDY3Ny4xNTc4NAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzggPSAtNTUuOTE5OTIKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF85ID0gMTQzLjEwMTczCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0xMS44MTczOQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzEwID0gMjIuMDAxODAKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xMCA9IDAuMTAwMzMKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xMSA9IDIyLjAwMTgwCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMTEgPSAwLjEwMDMzCiAgRU5EX0dST1VQID0gTUlOX01BWF9SQURJQU5DRQogIEdST1VQID0gTUlOX01BWF9SRUZMRUNUQU5DRQogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzEgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzEgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF8yID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF8yID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfMyA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzQgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzQgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF81ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF81ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzcgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzcgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF84ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF84ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfOSA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0wLjA5OTk4MAogIEVORF9HUk9VUCA9IE1JTl9NQVhfUkVGTEVDVEFOQ0UKICBHUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8xID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzIgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzIgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMyA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMyA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF80ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF80ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzUgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzUgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfNiA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfNiA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF83ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF83ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzggPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzggPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfOSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfOSA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xMCA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMTAgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMTEgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzExID0gMQogIEVORF9HUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICBHUk9VUCA9IFJBRElPTUVUUklDX1JFU0NBTElORwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEgPSAxLjI0MjJFLTAyCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMiA9IDEuMjcyMEUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF8zID0gMS4xNzIxRS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzQgPSA5Ljg4NDJFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNSA9IDYuMDQ4N0UtMDMKICAgIFJBRElBTkNFX01VTFRfQkFORF82ID0gMS41MDQyRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzcgPSA1LjA3MDFFLTA0CiAgICBSQURJQU5DRV9NVUxUX0JBTkRfOCA9IDEuMTE4NkUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF85ID0gMi4zNjQwRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEwID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzExID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfQUREX0JBTkRfMSA9IC02Mi4xMDkyOAogICAgUkFESUFOQ0VfQUREX0JBTkRfMiA9IC02My42MDA2NgogICAgUkFESUFOQ0VfQUREX0JBTkRfMyA9IC01OC42MDc0NwogICAgUkFESUFOQ0VfQUREX0JBTkRfNCA9IC00OS40MjExMgogICAgUkFESUFOQ0VfQUREX0JBTkRfNSA9IC0zMC4yNDMyNgogICAgUkFESUFOQ0VfQUREX0JBTkRfNiA9IC03LjUyMTIyCiAgICBSQURJQU5DRV9BRERfQkFORF83ID0gLTIuNTM1MDUKICAgIFJBRElBTkNFX0FERF9CQU5EXzggPSAtNTUuOTMxMTAKICAgIFJBRElBTkNFX0FERF9CQU5EXzkgPSAtMTEuODE5NzUKICAgIFJBRElBTkNFX0FERF9CQU5EXzEwID0gMC4xMDAwMAogICAgUkFESUFOQ0VfQUREX0JBTkRfMTEgPSAwLjEwMDAwCiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfMSA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF8yID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzMgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNCA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF81ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzYgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNyA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF84ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzkgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8xID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8yID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8zID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF80ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF81ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF82ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF83ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF84ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF85ID0gLTAuMTAwMDAwCiAgRU5EX0dST1VQID0gUkFESU9NRVRSSUNfUkVTQ0FMSU5HCiAgR1JPVVAgPSBUSVJTX1RIRVJNQUxfQ09OU1RBTlRTCiAgICBLMV9DT05TVEFOVF9CQU5EXzEwID0gNzc0Ljg4NTMKICAgIEsxX0NPTlNUQU5UX0JBTkRfMTEgPSA0ODAuODg4MwogICAgSzJfQ09OU1RBTlRfQkFORF8xMCA9IDEzMjEuMDc4OQogICAgSzJfQ09OU1RBTlRfQkFORF8xMSA9IDEyMDEuMTQ0MgogIEVORF9HUk9VUCA9IFRJUlNfVEhFUk1BTF9DT05TVEFOVFMKICBHUk9VUCA9IFBST0pFQ1RJT05fUEFSQU1FVEVSUwogICAgTUFQX1BST0pFQ1RJT04gPSAiVVRNIgogICAgREFUVU0gPSAiV0dTODQiCiAgICBFTExJUFNPSUQgPSAiV0dTODQiCiAgICBVVE1fWk9ORSA9IDEwCiAgICBHUklEX0NFTExfU0laRV9QQU5DSFJPTUFUSUMgPSAxNS4wMAogICAgR1JJRF9DRUxMX1NJWkVfUkVGTEVDVElWRSA9IDMwLjAwCiAgICBHUklEX0NFTExfU0laRV9USEVSTUFMID0gMzAuMDAKICAgIE9SSUVOVEFUSU9OID0gIk5PUlRIX1VQIgogICAgUkVTQU1QTElOR19PUFRJT04gPSAiQ1VCSUNfQ09OVk9MVVRJT04iCiAgRU5EX0dST1VQID0gUFJPSkVDVElPTl9QQVJBTUVURVJTCkVORF9HUk9VUCA9IEwxX01FVEFEQVRBX0ZJTEUKRU5ECg==" } }, { "ID": "914cb60452456134", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/gcp-public-data-landsat/o?alt=json\u0026delimiter=\u0026pageToken=\u0026prefix=LC08%2FPRE%2F044%2F034%2FLC80440342016259LGN00%2F\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "12632" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:26 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:26 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpLE4EijIrGqoHRLrCqmprZtxBU2JtHLLsZ-nIakblnuZX8s6FZA1SEaczyybdjB32loN1-gVCf83PFM4x06S24ATKp9-xRgQ9QNC9fwVH_ec4e9JQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxLlRJRi8xNDc1NTk5MTQ0NTc5MDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxLlRJRiIsIm5hbWUiOiJMQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEuVElGIiwiYnVja2V0IjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQiLCJnZW5lcmF0aW9uIjoiMTQ3NTU5OTE0NDU3OTAwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE2LTEwLTA0VDE2OjM5OjA0LjU0NVoiLCJ1cGRhdGVkIjoiMjAxNi0xMC0wNFQxNjozOTowNC41NDVaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6Mzk6MDQuNTQ1WiIsInNpemUiOiI3NDcyMTczNiIsIm1kNUhhc2giOiI4MzVMNkI1ZnJCMHpDQjZzMjJyMlN3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxLlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkxNDQ1NzkwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoiOTM0QnJnPT0iLCJldGFnIjoiQ0xqZjM1Ykx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEwLlRJRi8xNDc1NTk5MzEwMDQyMDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiLCJuYW1lIjoiTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MzEwMDQyMDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDE6NTAuMDAyWiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQxOjUwLjAwMloiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MTo1MC4wMDJaIiwic2l6ZSI6IjU4NjgxMjI4IiwibWQ1SGFzaCI6IkJXNjIzeEhnMTVJaFYyNG1ickwrQXc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEwLlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkzMTAwNDIwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoieHpWMmZnPT0iLCJldGFnIjoiQ0pEbjB1WEx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRi8xNDc1NTk5MzE5MTg4MDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMS5USUYiLCJuYW1lIjoiTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMS5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MzE5MTg4MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDE6NTkuMTQ5WiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQxOjU5LjE0OVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MTo1OS4xNDlaIiwic2l6ZSI6IjU2Nzk2NDM5IiwibWQ1SGFzaCI6IkZPeGl5eEpYcUFmbFJUOGxGblNkT2c9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkzMTkxODgwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoicC9IRlZ3PT0iLCJldGFnIjoiQ0tDRWdlckx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGLzE0NzU1OTkxNjEyMjQwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGIiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CMi5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MTYxMjI0MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6Mzk6MjEuMTYwWiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjM5OjIxLjE2MFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjozOToyMS4xNjBaIiwic2l6ZSI6Ijc3MTQ5NzcxIiwibWQ1SGFzaCI6Ik1QMjJ6ak9vMk5zMGlZNE1UUEpSd0E9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGP2dlbmVyYXRpb249MTQ3NTU5OTE2MTIyNDAwMCZhbHQ9bWVkaWEiLCJjcmMzMmMiOiJySThZUmc9PSIsImV0YWciOiJDTURXMTU3THdjOENFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0L0xDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CMy5USUYvMTQ3NTU5OTE3ODQzNTAwMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMy5USUYiLCJuYW1lIjoiTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IzLlRJRiIsImJ1Y2tldCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0IiwiZ2VuZXJhdGlvbiI6IjE0NzU1OTkxNzg0MzUwMDAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInRpbWVDcmVhdGVkIjoiMjAxNi0xMC0wNFQxNjozOTozOC4zNzZaIiwidXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6Mzk6MzguMzc2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjM5OjM4LjM3NloiLCJzaXplIjoiODAyOTM2ODciLCJtZDVIYXNoIjoidlFNaUdlRHVCZzZjcjNYc2ZJRWpvUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMy5USUY/Z2VuZXJhdGlvbj0xNDc1NTk5MTc4NDM1MDAwJmFsdD1tZWRpYSIsImNyYzMyYyI6InVaQnJuQT09IiwiZXRhZyI6IkNMaVQ4cWJMd2M4Q0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I0LlRJRi8xNDc1NTk5MTk0MjY4MDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I0LlRJRiIsIm5hbWUiOiJMQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjQuVElGIiwiYnVja2V0IjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQiLCJnZW5lcmF0aW9uIjoiMTQ3NTU5OTE5NDI2ODAwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE2LTEwLTA0VDE2OjM5OjU0LjIxMVoiLCJ1cGRhdGVkIjoiMjAxNi0xMC0wNFQxNjozOTo1NC4yMTFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6Mzk6NTQuMjExWiIsInNpemUiOiI4NDQ5NDM3NSIsIm1kNUhhc2giOiJGV2VWQTAxWk8wK21BK0VSRmN6dWhBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I0LlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkxOTQyNjgwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoiV2VzNW9RPT0iLCJldGFnIjoiQ09EQ3VLN0x3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGLzE0NzU1OTkyMDI5NzkwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGIiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CNS5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MjAyOTc5MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDA6MDIuOTM3WiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQwOjAyLjkzN1oiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MDowMi45MzdaIiwic2l6ZSI6Ijg5MzE4NDY3IiwibWQ1SGFzaCI6InA0b3lLSEFHbzVLeTNLZzFUSzFaUXc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGP2dlbmVyYXRpb249MTQ3NTU5OTIwMjk3OTAwMCZhbHQ9bWVkaWEiLCJjcmMzMmMiOiJwVFl1dXc9PSIsImV0YWciOiJDTGlaekxMTHdjOENFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0L0xDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CNi5USUYvMTQ3NTU5OTIzMzQ4MTAwMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNi5USUYiLCJuYW1lIjoiTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I2LlRJRiIsImJ1Y2tldCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0IiwiZ2VuZXJhdGlvbiI6IjE0NzU1OTkyMzM0ODEwMDAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInRpbWVDcmVhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MDozMy4zNDlaIiwidXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDA6MzMuMzQ5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQwOjMzLjM0OVoiLCJzaXplIjoiODk0NjU3NjciLCJtZDVIYXNoIjoiMlo3MkdVT0t0bGd6VDlWUlNHWVhqQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNi5USUY/Z2VuZXJhdGlvbj0xNDc1NTk5MjMzNDgxMDAwJmFsdD1tZWRpYSIsImNyYzMyYyI6IklOWEhiUT09IiwiZXRhZyI6IkNLanlrY0hMd2M4Q0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I3LlRJRi8xNDc1NTk5MjQxMDU1MDAwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I3LlRJRiIsIm5hbWUiOiJMQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjcuVElGIiwiYnVja2V0IjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQiLCJnZW5lcmF0aW9uIjoiMTQ3NTU5OTI0MTA1NTAwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQwOjQxLjAyMVoiLCJ1cGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MDo0MS4wMjFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDA6NDEuMDIxWiIsInNpemUiOiI4NjQ2MjYxNCIsIm1kNUhhc2giOiI4Z1BOUTdRWm9GMkNOWlo5RW1ybG9nPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I3LlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkyNDEwNTUwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoidXdDRCtBPT0iLCJldGFnIjoiQ0ppVzRNVEx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGLzE0NzU1OTkyODEzMzgwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGIiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9COC5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MjgxMzM4MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDE6MjEuMzAwWiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQxOjIxLjMwMFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MToyMS4zMDBaIiwic2l6ZSI6IjMxODg4Nzc3NCIsIm1kNUhhc2giOiJ5Nzk1THJVekJ3azJ0TDZQTTAxY0VBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0I4LlRJRj9nZW5lcmF0aW9uPTE0NzU1OTkyODEzMzgwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoiWjMrWmhRPT0iLCJldGFnIjoiQ0pEdCt0Zkx3YzhDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdC9MQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGLzE0NzU1OTkyOTE0MjUwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGIiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9COS5USUYiLCJidWNrZXQiOiJnY3AtcHVibGljLWRhdGEtbGFuZHNhdCIsImdlbmVyYXRpb24iOiIxNDc1NTk5MjkxNDI1MDAwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDE6MzEuMzYxWiIsInVwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQxOjMxLjM2MVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MTozMS4zNjFaIiwic2l6ZSI6IjQ0MzA4MjA1IiwibWQ1SGFzaCI6IjVCNDFFMkRCYlk1MnBZUFVHVmg5NWc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGP2dlbmVyYXRpb249MTQ3NTU5OTI5MTQyNTAwMCZhbHQ9bWVkaWEiLCJjcmMzMmMiOiJhME9EUXc9PSIsImV0YWciOiJDT2pCNHR6THdjOENFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0L0xDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9CUUEuVElGLzE0NzU1OTkzMjcyMjIwMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQlFBLlRJRiIsIm5hbWUiOiJMQzA4L1BSRS8wNDQvMDM0L0xDODA0NDAzNDIwMTYyNTlMR04wMC9MQzgwNDQwMzQyMDE2MjU5TEdOMDBfQlFBLlRJRiIsImJ1Y2tldCI6ImdjcC1wdWJsaWMtZGF0YS1sYW5kc2F0IiwiZ2VuZXJhdGlvbiI6IjE0NzU1OTkzMjcyMjIwMDAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsInRpbWVDcmVhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MjowNy4xNTlaIiwidXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDI6MDcuMTU5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQyOjA3LjE1OVoiLCJzaXplIjoiMzM1NDcxOSIsIm1kNUhhc2giOiJ6cWlndmw1RW52bWkvR0xjOHlINTFBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvby9MQzA4JTJGUFJFJTJGMDQ0JTJGMDM0JTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwJTJGTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0JRQS5USUY/Z2VuZXJhdGlvbj0xNDc1NTk5MzI3MjIyMDAwJmFsdD1tZWRpYSIsImNyYzMyYyI6IldPQmdLQT09IiwiZXRhZyI6IkNQQ3g2KzNMd2M4Q0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQvTEMwOC9QUkUvMDQ0LzAzNC9MQzgwNDQwMzQyMDE2MjU5TEdOMDAvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX01UTC50eHQvMTQ3NTU5OTMyNzY2MjAwMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2djcC1wdWJsaWMtZGF0YS1sYW5kc2F0L28vTEMwOCUyRlBSRSUyRjA0NCUyRjAzNCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMCUyRkxDODA0NDAzNDIwMTYyNTlMR04wMF9NVEwudHh0IiwibmFtZSI6IkxDMDgvUFJFLzA0NC8wMzQvTEM4MDQ0MDM0MjAxNjI1OUxHTjAwL0xDODA0NDAzNDIwMTYyNTlMR04wMF9NVEwudHh0IiwiYnVja2V0IjoiZ2NwLXB1YmxpYy1kYXRhLWxhbmRzYXQiLCJnZW5lcmF0aW9uIjoiMTQ3NTU5OTMyNzY2MjAwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE2LTEwLTA0VDE2OjQyOjA3LjYxOFoiLCJ1cGRhdGVkIjoiMjAxNi0xMC0wNFQxNjo0MjowNy42MThaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTYtMTAtMDRUMTY6NDI6MDcuNjE4WiIsInNpemUiOiI3OTAzIiwibWQ1SGFzaCI6ImVsL1VkRHZXUjBoZmlFbHZyYkJjVVE9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nY3AtcHVibGljLWRhdGEtbGFuZHNhdC9vL0xDMDglMkZQUkUlMkYwNDQlMkYwMzQlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDAlMkZMQzgwNDQwMzQyMDE2MjU5TEdOMDBfTVRMLnR4dD9nZW5lcmF0aW9uPTE0NzU1OTkzMjc2NjIwMDAmYWx0PW1lZGlhIiwiY3JjMzJjIjoiUFdCdDhnPT0iLCJldGFnIjoiQ0xDZmh1N0x3YzhDRUFFPSJ9XX0=" } }, { "ID": "3f3f45cd2b718e17", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/noauth", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "247" ], "Content-Type": [ "application/xml; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:26 GMT" ], "Expires": [ "Thu, 02 May 2019 22:25:26 GMT" ], "Server": [ "UploadServer" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqsZlmkTyf2_fqITeaIiM8s2MLUvz5qFiP_rzA4Mf6Q9LMxsiQeP-GBRwHON_XvnG2qef3XL1EzgTLA_GxtLKZRjdzOBndJPf9XbJa9KjJCIPlducQ" ] }, "Body": "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48RXJyb3I+PENvZGU+QWNjZXNzRGVuaWVkPC9Db2RlPjxNZXNzYWdlPkFjY2VzcyBkZW5pZWQuPC9NZXNzYWdlPjxEZXRhaWxzPkFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuZ2V0IGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLjwvRGV0YWlscz48L0Vycm9yPg==" } }, { "ID": "110cdd2daefc6162", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoibm9hdXRoIn0K", "Yg==" ] }, "Response": { "StatusCode": 401, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "30405" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:26 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "Www-Authenticate": [ "Bearer realm=\"https://accounts.google.com/\"" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrGgfg36ZmqdKbc0NqBivwXULVnF2NuBAD31rJqzC5Rj9xgHFbRnwxJCbdxCuUdlAhGW_-H88mBadNGmqch0fmAyAd80HPANBkUmIgkolsL4HK7XAU" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6InJlcXVpcmVkIiwibWVzc2FnZSI6IkFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLiIsImxvY2F0aW9uVHlwZSI6ImhlYWRlciIsImxvY2F0aW9uIjoiQXV0aG9yaXphdGlvbiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1MT0dJTl9SRVFVSVJFRCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9Y29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPUxPR0lOX1JFUVVJUkVELCBjYXRlZ29yeT1VU0VSX0VSUk9SLCBjYXVzZT1udWxsLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPXVuYXV0aG9yaXplZCwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uUkVRVUlSRUQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPVJFUVVJUkVELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5hdXRoZW50aWNhdGVkX3VzZXIsIG1lc3NhZ2U9QW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguLCB1bm5hbWVkQXJndW1lbnRzPVtdfSwgbG9jYXRpb249aGVhZGVycy5BdXRob3JpemF0aW9uLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLiwgcmVhc29uPXJlcXVpcmVkLCBycGNDb2RlPTQwMX0gQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBkZWJ1Z0luZm89Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXtXV1ctQXV0aGVudGljYXRlPVtCZWFyZXIgcmVhbG09XCJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vXCJdfSwgaHR0cFN0YXR1cz11bmF1dGhvcml6ZWQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLlJFUVVJUkVELCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuYXV0aGVudGljYXRlZF91c2VyLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWhlYWRlcnMuQXV0aG9yaXphdGlvbiwgbWVzc2FnZT1Bbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC4sIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDF9IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuYXV0aC5BdXRoZW50aWNhdG9ySW50ZXJjZXB0b3IuYWRkQ2hhbGxlbmdlSGVhZGVyKEF1dGhlbnRpY2F0b3JJbnRlcmNlcHRvci5qYXZhOjI2OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmF1dGguQXV0aGVudGljYXRvckludGVyY2VwdG9yLnByb2Nlc3NFcnJvclJlc3BvbnNlKEF1dGhlbnRpY2F0b3JJbnRlcmNlcHRvci5qYXZhOjIzNilcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmF1dGguR2FpYU1pbnRJbnRlcmNlcHRvci5wcm9jZXNzRXJyb3JSZXNwb25zZShHYWlhTWludEludGVyY2VwdG9yLmphdmE6NzY4KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuQXJvdW5kSW50ZXJjZXB0b3JXcmFwcGVyLnByb2Nlc3NFcnJvclJlc3BvbnNlKEFyb3VuZEludGVyY2VwdG9yV3JhcHBlci5qYXZhOjI4KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc3RhdHMuU3RhdHNCb290c3RyYXAkSW50ZXJjZXB0b3JTdGF0c1JlY29yZGVyLnByb2Nlc3NFcnJvclJlc3BvbnNlKFN0YXRzQm9vdHN0cmFwLmphdmE6MzE1KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24uaGFuZGxlRXJyb3JSZXNwb25zZShJbnRlcmNlcHRpb25zLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24uYWNjZXNzJDIwMChJbnRlcmNlcHRpb25zLmphdmE6MTAzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5pbnRlcmNlcHQuSW50ZXJjZXB0aW9ucyRBcm91bmRJbnRlcmNlcHRpb24kMS5jYWxsKEludGVyY2VwdGlvbnMuamF2YToxNDQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLmludGVyY2VwdC5JbnRlcmNlcHRpb25zJEFyb3VuZEludGVyY2VwdGlvbiQxLmNhbGwoSW50ZXJjZXB0aW9ucy5qYXZhOjEzNylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldEV4Y2VwdGlvbihBYnN0cmFjdEZ1dHVyZS5qYXZhOjc1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2OClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1MT0dJTl9SRVFVSVJFRCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjQ0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmluc2VydChPYmplY3RzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz11bmF1dGhvcml6ZWQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLlJFUVVJUkVELCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuSW5zZXJ0T2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRPYmplY3QuamF2YTo0NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uT2JqZWN0c0RlbGVnYXRvci5pbnNlcnQoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBBbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1SRVFVSVJFRCwgZXJyb3JQcm90b0RvbWFpbj1nZGF0YS5Db3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkuYXV0aGVudGljYXRlZF91c2VyLCBtZXNzYWdlPUFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWhlYWRlcnMuQXV0aG9yaXphdGlvbiwgbWVzc2FnZT1Bbm9ueW1vdXMgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3RvcmFnZS5vYmplY3RzLmNyZWF0ZSBhY2Nlc3MgdG8gZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL25vYXV0aC4sIHJlYXNvbj1yZXF1aXJlZCwgcnBjQ29kZT00MDF9IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLjogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IEFub255bW91cyBjYWxsZXIgZG9lcyBub3QgaGF2ZSBzdG9yYWdlLm9iamVjdHMuY3JlYXRlIGFjY2VzcyB0byBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvbm9hdXRoLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5JbnNlcnRPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydE9iamVjdC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkluc2VydE9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0T2JqZWN0LmphdmE6NDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuaW5zZXJ0KE9iamVjdHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0Li4uIDIwIG1vcmVcbiJ9XSwiY29kZSI6NDAxLCJtZXNzYWdlIjoiQW5vbnltb3VzIGNhbGxlciBkb2VzIG5vdCBoYXZlIHN0b3JhZ2Uub2JqZWN0cy5jcmVhdGUgYWNjZXNzIHRvIGdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9ub2F1dGguIn19" } }, { "ID": "848c7013eb1665b1", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Length": [ "7903" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 02 May 2019 22:25:27 GMT" ], "Etag": [ "\"7a5fd4743bd647485f88496fadb05c51\"" ], "Expires": [ "Thu, 02 May 2019 23:25:27 GMT" ], "Last-Modified": [ "Tue, 04 Oct 2016 16:42:07 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1475599327662000" ], "X-Goog-Hash": [ "crc32c=PWBt8g==", "md5=el/UdDvWR0hfiElvrbBcUQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "7903" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqbrgn51bDFbwZ1c2_BxCHhog7If9w6ooKAtb2YCerQcObpiFJZqT3-Jn7zTXEEPVuysmxKw4PmvEOmkbCAJVkmbEVZm6z877JKFhrXTrkWqWYooq8" ] }, "Body": "R1JPVVAgPSBMMV9NRVRBREFUQV9GSUxFCiAgR1JPVVAgPSBNRVRBREFUQV9GSUxFX0lORk8KICAgIE9SSUdJTiA9ICJJbWFnZSBjb3VydGVzeSBvZiB0aGUgVS5TLiBHZW9sb2dpY2FsIFN1cnZleSIKICAgIFJFUVVFU1RfSUQgPSAiMDcwMTYwOTE5MTA1MV8wMDAwNCIKICAgIExBTkRTQVRfU0NFTkVfSUQgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwIgogICAgRklMRV9EQVRFID0gMjAxNi0wOS0yMFQwMzoxMzowMloKICAgIFNUQVRJT05fSUQgPSAiTEdOIgogICAgUFJPQ0VTU0lOR19TT0ZUV0FSRV9WRVJTSU9OID0gIkxQR1NfMi42LjIiCiAgRU5EX0dST1VQID0gTUVUQURBVEFfRklMRV9JTkZPCiAgR1JPVVAgPSBQUk9EVUNUX01FVEFEQVRBCiAgICBEQVRBX1RZUEUgPSAiTDFUIgogICAgRUxFVkFUSU9OX1NPVVJDRSA9ICJHTFMyMDAwIgogICAgT1VUUFVUX0ZPUk1BVCA9ICJHRU9USUZGIgogICAgU1BBQ0VDUkFGVF9JRCA9ICJMQU5EU0FUXzgiCiAgICBTRU5TT1JfSUQgPSAiT0xJX1RJUlMiCiAgICBXUlNfUEFUSCA9IDQ0CiAgICBXUlNfUk9XID0gMzQKICAgIE5BRElSX09GRk5BRElSID0gIk5BRElSIgogICAgVEFSR0VUX1dSU19QQVRIID0gNDQKICAgIFRBUkdFVF9XUlNfUk9XID0gMzQKICAgIERBVEVfQUNRVUlSRUQgPSAyMDE2LTA5LTE1CiAgICBTQ0VORV9DRU5URVJfVElNRSA9ICIxODo0NjoxOC42ODY3MzgwWiIKICAgIENPUk5FUl9VTF9MQVRfUFJPRFVDVCA9IDM4LjUyODE5CiAgICBDT1JORVJfVUxfTE9OX1BST0RVQ1QgPSAtMTIzLjQwODQzCiAgICBDT1JORVJfVVJfTEFUX1BST0RVQ1QgPSAzOC41MDc2NQogICAgQ09STkVSX1VSX0xPTl9QUk9EVUNUID0gLTEyMC43NjkzMwogICAgQ09STkVSX0xMX0xBVF9QUk9EVUNUID0gMzYuNDE2MzMKICAgIENPUk5FUl9MTF9MT05fUFJPRFVDVCA9IC0xMjMuMzk3MDkKICAgIENPUk5FUl9MUl9MQVRfUFJPRFVDVCA9IDM2LjM5NzI5CiAgICBDT1JORVJfTFJfTE9OX1BST0RVQ1QgPSAtMTIwLjgzMTE3CiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA0NjQ0MDAuMDAwCiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MjY0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWF9QUk9EVUNUID0gNjk0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWV9QUk9EVUNUID0gNDI2NDUwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDQ2NDQwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQwMzAyMDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA2OTQ1MDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MDMwMjAwLjAwMAogICAgUEFOQ0hST01BVElDX0xJTkVTID0gMTU2MjEKICAgIFBBTkNIUk9NQVRJQ19TQU1QTEVTID0gMTUzNDEKICAgIFJFRkxFQ1RJVkVfTElORVMgPSA3ODExCiAgICBSRUZMRUNUSVZFX1NBTVBMRVMgPSA3NjcxCiAgICBUSEVSTUFMX0xJTkVTID0gNzgxMQogICAgVEhFUk1BTF9TQU1QTEVTID0gNzY3MQogICAgRklMRV9OQU1FX0JBTkRfMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjMuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjQuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjYuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjcuVElGIgogICAgRklMRV9OQU1FX0JBTkRfOCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGIgogICAgRklMRV9OQU1FX0JBTkRfOSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMTAgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiCiAgICBGSUxFX05BTUVfQkFORF8xMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRiIKICAgIEZJTEVfTkFNRV9CQU5EX1FVQUxJVFkgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0JRQS5USUYiCiAgICBNRVRBREFUQV9GSUxFX05BTUUgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX01UTC50eHQiCiAgICBCUEZfTkFNRV9PTEkgPSAiTE84QlBGMjAxNjA5MTUxODMwNTdfMjAxNjA5MTUyMDA5NTAuMDEiCiAgICBCUEZfTkFNRV9USVJTID0gIkxUOEJQRjIwMTYwOTAyMDg0MTIyXzIwMTYwOTE3MDc0MDI3LjAyIgogICAgQ1BGX05BTUUgPSAiTDhDUEYyMDE2MDcwMV8yMDE2MDkzMC4wMiIKICAgIFJMVVRfRklMRV9OQU1FID0gIkw4UkxVVDIwMTUwMzAzXzIwNDMxMjMxdjExLmg1IgogIEVORF9HUk9VUCA9IFBST0RVQ1RfTUVUQURBVEEKICBHUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICAgIENMT1VEX0NPVkVSID0gMjkuNTYKICAgIENMT1VEX0NPVkVSX0xBTkQgPSAzLjMzCiAgICBJTUFHRV9RVUFMSVRZX09MSSA9IDkKICAgIElNQUdFX1FVQUxJVFlfVElSUyA9IDkKICAgIFRJUlNfU1NNX01PREVMID0gIkZJTkFMIgogICAgVElSU19TU01fUE9TSVRJT05fU1RBVFVTID0gIkVTVElNQVRFRCIKICAgIFJPTExfQU5HTEUgPSAtMC4wMDEKICAgIFNVTl9BWklNVVRIID0gMTQ4LjQ4MDQ5Mzk2CiAgICBTVU5fRUxFVkFUSU9OID0gNTAuOTM3NjgzOTkKICAgIEVBUlRIX1NVTl9ESVNUQU5DRSA9IDEuMDA1Mzc1MgogICAgR1JPVU5EX0NPTlRST0xfUE9JTlRTX1ZFUlNJT04gPSA0CiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfTU9ERUwgPSA1NDgKICAgIEdFT01FVFJJQ19STVNFX01PREVMID0gNS44NTcKICAgIEdFT01FVFJJQ19STVNFX01PREVMX1kgPSAzLjg0MQogICAgR0VPTUVUUklDX1JNU0VfTU9ERUxfWCA9IDQuNDIyCiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfVkVSSUZZID0gMjI4CiAgICBHRU9NRVRSSUNfUk1TRV9WRVJJRlkgPSAzLjM4MgogIEVORF9HUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICBHUk9VUCA9IE1JTl9NQVhfUkFESUFOQ0UKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xID0gNzUxLjk1NzA5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMSA9IC02Mi4wOTY4NgogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzIgPSA3NzAuMDEzMTgKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8yID0gLTYzLjU4Nzk0CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDcwOS41NjA2MQogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzMgPSAtNTguNTk1NzUKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF80ID0gNTk4LjM0MTQ5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNCA9IC00OS40MTEyMwogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzUgPSAzNjYuMTU1MTUKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF81ID0gLTMwLjIzNzIxCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDkxLjA1OTQ2CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC03LjUxOTcyCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNyA9IDMwLjY5MTkxCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNyA9IC0yLjUzNDU1CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfOCA9IDY3Ny4xNTc4NAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzggPSAtNTUuOTE5OTIKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF85ID0gMTQzLjEwMTczCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0xMS44MTczOQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzEwID0gMjIuMDAxODAKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xMCA9IDAuMTAwMzMKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xMSA9IDIyLjAwMTgwCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMTEgPSAwLjEwMDMzCiAgRU5EX0dST1VQID0gTUlOX01BWF9SQURJQU5DRQogIEdST1VQID0gTUlOX01BWF9SRUZMRUNUQU5DRQogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzEgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzEgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF8yID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF8yID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfMyA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzQgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzQgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF81ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF81ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzcgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzcgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF84ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF84ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfOSA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0wLjA5OTk4MAogIEVORF9HUk9VUCA9IE1JTl9NQVhfUkVGTEVDVEFOQ0UKICBHUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8xID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzIgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzIgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMyA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMyA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF80ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF80ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzUgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzUgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfNiA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfNiA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF83ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF83ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzggPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzggPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfOSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfOSA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xMCA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMTAgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMTEgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzExID0gMQogIEVORF9HUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICBHUk9VUCA9IFJBRElPTUVUUklDX1JFU0NBTElORwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEgPSAxLjI0MjJFLTAyCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMiA9IDEuMjcyMEUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF8zID0gMS4xNzIxRS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzQgPSA5Ljg4NDJFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNSA9IDYuMDQ4N0UtMDMKICAgIFJBRElBTkNFX01VTFRfQkFORF82ID0gMS41MDQyRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzcgPSA1LjA3MDFFLTA0CiAgICBSQURJQU5DRV9NVUxUX0JBTkRfOCA9IDEuMTE4NkUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF85ID0gMi4zNjQwRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEwID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzExID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfQUREX0JBTkRfMSA9IC02Mi4xMDkyOAogICAgUkFESUFOQ0VfQUREX0JBTkRfMiA9IC02My42MDA2NgogICAgUkFESUFOQ0VfQUREX0JBTkRfMyA9IC01OC42MDc0NwogICAgUkFESUFOQ0VfQUREX0JBTkRfNCA9IC00OS40MjExMgogICAgUkFESUFOQ0VfQUREX0JBTkRfNSA9IC0zMC4yNDMyNgogICAgUkFESUFOQ0VfQUREX0JBTkRfNiA9IC03LjUyMTIyCiAgICBSQURJQU5DRV9BRERfQkFORF83ID0gLTIuNTM1MDUKICAgIFJBRElBTkNFX0FERF9CQU5EXzggPSAtNTUuOTMxMTAKICAgIFJBRElBTkNFX0FERF9CQU5EXzkgPSAtMTEuODE5NzUKICAgIFJBRElBTkNFX0FERF9CQU5EXzEwID0gMC4xMDAwMAogICAgUkFESUFOQ0VfQUREX0JBTkRfMTEgPSAwLjEwMDAwCiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfMSA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF8yID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzMgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNCA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF81ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzYgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNyA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF84ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzkgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8xID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8yID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8zID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF80ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF81ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF82ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF83ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF84ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF85ID0gLTAuMTAwMDAwCiAgRU5EX0dST1VQID0gUkFESU9NRVRSSUNfUkVTQ0FMSU5HCiAgR1JPVVAgPSBUSVJTX1RIRVJNQUxfQ09OU1RBTlRTCiAgICBLMV9DT05TVEFOVF9CQU5EXzEwID0gNzc0Ljg4NTMKICAgIEsxX0NPTlNUQU5UX0JBTkRfMTEgPSA0ODAuODg4MwogICAgSzJfQ09OU1RBTlRfQkFORF8xMCA9IDEzMjEuMDc4OQogICAgSzJfQ09OU1RBTlRfQkFORF8xMSA9IDEyMDEuMTQ0MgogIEVORF9HUk9VUCA9IFRJUlNfVEhFUk1BTF9DT05TVEFOVFMKICBHUk9VUCA9IFBST0pFQ1RJT05fUEFSQU1FVEVSUwogICAgTUFQX1BST0pFQ1RJT04gPSAiVVRNIgogICAgREFUVU0gPSAiV0dTODQiCiAgICBFTExJUFNPSUQgPSAiV0dTODQiCiAgICBVVE1fWk9ORSA9IDEwCiAgICBHUklEX0NFTExfU0laRV9QQU5DSFJPTUFUSUMgPSAxNS4wMAogICAgR1JJRF9DRUxMX1NJWkVfUkVGTEVDVElWRSA9IDMwLjAwCiAgICBHUklEX0NFTExfU0laRV9USEVSTUFMID0gMzAuMDAKICAgIE9SSUVOVEFUSU9OID0gIk5PUlRIX1VQIgogICAgUkVTQU1QTElOR19PUFRJT04gPSAiQ1VCSUNfQ09OVk9MVVRJT04iCiAgRU5EX0dST1VQID0gUFJPSkVDVElPTl9QQVJBTUVURVJTCkVORF9HUk9VUCA9IEwxX01FVEFEQVRBX0ZJTEUKRU5ECg==" } }, { "ID": "a5f818071a0f22da", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Length": [ "7903" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 02 May 2019 22:25:27 GMT" ], "Etag": [ "\"7a5fd4743bd647485f88496fadb05c51\"" ], "Expires": [ "Thu, 02 May 2019 23:25:27 GMT" ], "Last-Modified": [ "Tue, 04 Oct 2016 16:42:07 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1475599327662000" ], "X-Goog-Hash": [ "crc32c=PWBt8g==", "md5=el/UdDvWR0hfiElvrbBcUQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "7903" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrozB-0-kEtkjITLFZA2uQpw77J_Zc6GErrYrIyxkPTWeUHJNBRLw4JXhyIEFG8szc7bhqblQVKoKYiZ4myOcfL5zIM9KYGIbCyAP9e4sEEdx2pBe0" ] }, "Body": "R1JPVVAgPSBMMV9NRVRBREFUQV9GSUxFCiAgR1JPVVAgPSBNRVRBREFUQV9GSUxFX0lORk8KICAgIE9SSUdJTiA9ICJJbWFnZSBjb3VydGVzeSBvZiB0aGUgVS5TLiBHZW9sb2dpY2FsIFN1cnZleSIKICAgIFJFUVVFU1RfSUQgPSAiMDcwMTYwOTE5MTA1MV8wMDAwNCIKICAgIExBTkRTQVRfU0NFTkVfSUQgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwIgogICAgRklMRV9EQVRFID0gMjAxNi0wOS0yMFQwMzoxMzowMloKICAgIFNUQVRJT05fSUQgPSAiTEdOIgogICAgUFJPQ0VTU0lOR19TT0ZUV0FSRV9WRVJTSU9OID0gIkxQR1NfMi42LjIiCiAgRU5EX0dST1VQID0gTUVUQURBVEFfRklMRV9JTkZPCiAgR1JPVVAgPSBQUk9EVUNUX01FVEFEQVRBCiAgICBEQVRBX1RZUEUgPSAiTDFUIgogICAgRUxFVkFUSU9OX1NPVVJDRSA9ICJHTFMyMDAwIgogICAgT1VUUFVUX0ZPUk1BVCA9ICJHRU9USUZGIgogICAgU1BBQ0VDUkFGVF9JRCA9ICJMQU5EU0FUXzgiCiAgICBTRU5TT1JfSUQgPSAiT0xJX1RJUlMiCiAgICBXUlNfUEFUSCA9IDQ0CiAgICBXUlNfUk9XID0gMzQKICAgIE5BRElSX09GRk5BRElSID0gIk5BRElSIgogICAgVEFSR0VUX1dSU19QQVRIID0gNDQKICAgIFRBUkdFVF9XUlNfUk9XID0gMzQKICAgIERBVEVfQUNRVUlSRUQgPSAyMDE2LTA5LTE1CiAgICBTQ0VORV9DRU5URVJfVElNRSA9ICIxODo0NjoxOC42ODY3MzgwWiIKICAgIENPUk5FUl9VTF9MQVRfUFJPRFVDVCA9IDM4LjUyODE5CiAgICBDT1JORVJfVUxfTE9OX1BST0RVQ1QgPSAtMTIzLjQwODQzCiAgICBDT1JORVJfVVJfTEFUX1BST0RVQ1QgPSAzOC41MDc2NQogICAgQ09STkVSX1VSX0xPTl9QUk9EVUNUID0gLTEyMC43NjkzMwogICAgQ09STkVSX0xMX0xBVF9QUk9EVUNUID0gMzYuNDE2MzMKICAgIENPUk5FUl9MTF9MT05fUFJPRFVDVCA9IC0xMjMuMzk3MDkKICAgIENPUk5FUl9MUl9MQVRfUFJPRFVDVCA9IDM2LjM5NzI5CiAgICBDT1JORVJfTFJfTE9OX1BST0RVQ1QgPSAtMTIwLjgzMTE3CiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA0NjQ0MDAuMDAwCiAgICBDT1JORVJfVUxfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MjY0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWF9QUk9EVUNUID0gNjk0NTAwLjAwMAogICAgQ09STkVSX1VSX1BST0pFQ1RJT05fWV9QUk9EVUNUID0gNDI2NDUwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDQ2NDQwMC4wMDAKICAgIENPUk5FUl9MTF9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQwMzAyMDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA2OTQ1MDAuMDAwCiAgICBDT1JORVJfTFJfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MDMwMjAwLjAwMAogICAgUEFOQ0hST01BVElDX0xJTkVTID0gMTU2MjEKICAgIFBBTkNIUk9NQVRJQ19TQU1QTEVTID0gMTUzNDEKICAgIFJFRkxFQ1RJVkVfTElORVMgPSA3ODExCiAgICBSRUZMRUNUSVZFX1NBTVBMRVMgPSA3NjcxCiAgICBUSEVSTUFMX0xJTkVTID0gNzgxMQogICAgVEhFUk1BTF9TQU1QTEVTID0gNzY3MQogICAgRklMRV9OQU1FX0JBTkRfMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjIuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjMuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjQuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjUuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNiA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjYuVElGIgogICAgRklMRV9OQU1FX0JBTkRfNyA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjcuVElGIgogICAgRklMRV9OQU1FX0JBTkRfOCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjguVElGIgogICAgRklMRV9OQU1FX0JBTkRfOSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjkuVElGIgogICAgRklMRV9OQU1FX0JBTkRfMTAgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0IxMC5USUYiCiAgICBGSUxFX05BTUVfQkFORF8xMSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjExLlRJRiIKICAgIEZJTEVfTkFNRV9CQU5EX1FVQUxJVFkgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX0JRQS5USUYiCiAgICBNRVRBREFUQV9GSUxFX05BTUUgPSAiTEM4MDQ0MDM0MjAxNjI1OUxHTjAwX01UTC50eHQiCiAgICBCUEZfTkFNRV9PTEkgPSAiTE84QlBGMjAxNjA5MTUxODMwNTdfMjAxNjA5MTUyMDA5NTAuMDEiCiAgICBCUEZfTkFNRV9USVJTID0gIkxUOEJQRjIwMTYwOTAyMDg0MTIyXzIwMTYwOTE3MDc0MDI3LjAyIgogICAgQ1BGX05BTUUgPSAiTDhDUEYyMDE2MDcwMV8yMDE2MDkzMC4wMiIKICAgIFJMVVRfRklMRV9OQU1FID0gIkw4UkxVVDIwMTUwMzAzXzIwNDMxMjMxdjExLmg1IgogIEVORF9HUk9VUCA9IFBST0RVQ1RfTUVUQURBVEEKICBHUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICAgIENMT1VEX0NPVkVSID0gMjkuNTYKICAgIENMT1VEX0NPVkVSX0xBTkQgPSAzLjMzCiAgICBJTUFHRV9RVUFMSVRZX09MSSA9IDkKICAgIElNQUdFX1FVQUxJVFlfVElSUyA9IDkKICAgIFRJUlNfU1NNX01PREVMID0gIkZJTkFMIgogICAgVElSU19TU01fUE9TSVRJT05fU1RBVFVTID0gIkVTVElNQVRFRCIKICAgIFJPTExfQU5HTEUgPSAtMC4wMDEKICAgIFNVTl9BWklNVVRIID0gMTQ4LjQ4MDQ5Mzk2CiAgICBTVU5fRUxFVkFUSU9OID0gNTAuOTM3NjgzOTkKICAgIEVBUlRIX1NVTl9ESVNUQU5DRSA9IDEuMDA1Mzc1MgogICAgR1JPVU5EX0NPTlRST0xfUE9JTlRTX1ZFUlNJT04gPSA0CiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfTU9ERUwgPSA1NDgKICAgIEdFT01FVFJJQ19STVNFX01PREVMID0gNS44NTcKICAgIEdFT01FVFJJQ19STVNFX01PREVMX1kgPSAzLjg0MQogICAgR0VPTUVUUklDX1JNU0VfTU9ERUxfWCA9IDQuNDIyCiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfVkVSSUZZID0gMjI4CiAgICBHRU9NRVRSSUNfUk1TRV9WRVJJRlkgPSAzLjM4MgogIEVORF9HUk9VUCA9IElNQUdFX0FUVFJJQlVURVMKICBHUk9VUCA9IE1JTl9NQVhfUkFESUFOQ0UKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xID0gNzUxLjk1NzA5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMSA9IC02Mi4wOTY4NgogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzIgPSA3NzAuMDEzMTgKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8yID0gLTYzLjU4Nzk0CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDcwOS41NjA2MQogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzMgPSAtNTguNTk1NzUKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF80ID0gNTk4LjM0MTQ5CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNCA9IC00OS40MTEyMwogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzUgPSAzNjYuMTU1MTUKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF81ID0gLTMwLjIzNzIxCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDkxLjA1OTQ2CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC03LjUxOTcyCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNyA9IDMwLjY5MTkxCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfNyA9IC0yLjUzNDU1CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfOCA9IDY3Ny4xNTc4NAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzggPSAtNTUuOTE5OTIKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF85ID0gMTQzLjEwMTczCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0xMS44MTczOQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzEwID0gMjIuMDAxODAKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xMCA9IDAuMTAwMzMKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8xMSA9IDIyLjAwMTgwCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMTEgPSAwLjEwMDMzCiAgRU5EX0dST1VQID0gTUlOX01BWF9SQURJQU5DRQogIEdST1VQID0gTUlOX01BWF9SRUZMRUNUQU5DRQogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzEgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzEgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF8yID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF8yID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfMyA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfMyA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzQgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzQgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF81ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF81ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNiA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNiA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzcgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzcgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF84ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF84ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfOSA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfOSA9IC0wLjA5OTk4MAogIEVORF9HUk9VUCA9IE1JTl9NQVhfUkVGTEVDVEFOQ0UKICBHUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8xID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzIgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzIgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMyA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMyA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF80ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF80ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzUgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzUgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfNiA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfNiA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF83ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF83ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzggPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzggPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfOSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfOSA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xMCA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMTAgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMTEgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzExID0gMQogIEVORF9HUk9VUCA9IE1JTl9NQVhfUElYRUxfVkFMVUUKICBHUk9VUCA9IFJBRElPTUVUUklDX1JFU0NBTElORwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEgPSAxLjI0MjJFLTAyCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMiA9IDEuMjcyMEUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF8zID0gMS4xNzIxRS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzQgPSA5Ljg4NDJFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNSA9IDYuMDQ4N0UtMDMKICAgIFJBRElBTkNFX01VTFRfQkFORF82ID0gMS41MDQyRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzcgPSA1LjA3MDFFLTA0CiAgICBSQURJQU5DRV9NVUxUX0JBTkRfOCA9IDEuMTE4NkUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF85ID0gMi4zNjQwRS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzEwID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzExID0gMy4zNDIwRS0wNAogICAgUkFESUFOQ0VfQUREX0JBTkRfMSA9IC02Mi4xMDkyOAogICAgUkFESUFOQ0VfQUREX0JBTkRfMiA9IC02My42MDA2NgogICAgUkFESUFOQ0VfQUREX0JBTkRfMyA9IC01OC42MDc0NwogICAgUkFESUFOQ0VfQUREX0JBTkRfNCA9IC00OS40MjExMgogICAgUkFESUFOQ0VfQUREX0JBTkRfNSA9IC0zMC4yNDMyNgogICAgUkFESUFOQ0VfQUREX0JBTkRfNiA9IC03LjUyMTIyCiAgICBSQURJQU5DRV9BRERfQkFORF83ID0gLTIuNTM1MDUKICAgIFJBRElBTkNFX0FERF9CQU5EXzggPSAtNTUuOTMxMTAKICAgIFJBRElBTkNFX0FERF9CQU5EXzkgPSAtMTEuODE5NzUKICAgIFJBRElBTkNFX0FERF9CQU5EXzEwID0gMC4xMDAwMAogICAgUkFESUFOQ0VfQUREX0JBTkRfMTEgPSAwLjEwMDAwCiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfMSA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF8yID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzMgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNCA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF81ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzYgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNyA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF84ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzkgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8xID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8yID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF8zID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF80ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF81ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF82ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF83ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF84ID0gLTAuMTAwMDAwCiAgICBSRUZMRUNUQU5DRV9BRERfQkFORF85ID0gLTAuMTAwMDAwCiAgRU5EX0dST1VQID0gUkFESU9NRVRSSUNfUkVTQ0FMSU5HCiAgR1JPVVAgPSBUSVJTX1RIRVJNQUxfQ09OU1RBTlRTCiAgICBLMV9DT05TVEFOVF9CQU5EXzEwID0gNzc0Ljg4NTMKICAgIEsxX0NPTlNUQU5UX0JBTkRfMTEgPSA0ODAuODg4MwogICAgSzJfQ09OU1RBTlRfQkFORF8xMCA9IDEzMjEuMDc4OQogICAgSzJfQ09OU1RBTlRfQkFORF8xMSA9IDEyMDEuMTQ0MgogIEVORF9HUk9VUCA9IFRJUlNfVEhFUk1BTF9DT05TVEFOVFMKICBHUk9VUCA9IFBST0pFQ1RJT05fUEFSQU1FVEVSUwogICAgTUFQX1BST0pFQ1RJT04gPSAiVVRNIgogICAgREFUVU0gPSAiV0dTODQiCiAgICBFTExJUFNPSUQgPSAiV0dTODQiCiAgICBVVE1fWk9ORSA9IDEwCiAgICBHUklEX0NFTExfU0laRV9QQU5DSFJPTUFUSUMgPSAxNS4wMAogICAgR1JJRF9DRUxMX1NJWkVfUkVGTEVDVElWRSA9IDMwLjAwCiAgICBHUklEX0NFTExfU0laRV9USEVSTUFMID0gMzAuMDAKICAgIE9SSUVOVEFUSU9OID0gIk5PUlRIX1VQIgogICAgUkVTQU1QTElOR19PUFRJT04gPSAiQ1VCSUNfQ09OVk9MVVRJT04iCiAgRU5EX0dST1VQID0gUFJPSkVDVElPTl9QQVJBTUVURVJTCkVORF9HUk9VUCA9IEwxX01FVEFEQVRBX0ZJTEUKRU5ECg==" } }, { "ID": "55eeb942e5603431", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt", "Header": { "Range": [ "bytes=1-" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Length": [ "7902" ], "Content-Range": [ "bytes 1-7902/7903" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 02 May 2019 22:25:27 GMT" ], "Etag": [ "\"7a5fd4743bd647485f88496fadb05c51\"" ], "Expires": [ "Thu, 02 May 2019 23:25:27 GMT" ], "Last-Modified": [ "Tue, 04 Oct 2016 16:42:07 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1475599327662000" ], "X-Goog-Hash": [ "crc32c=PWBt8g==", "md5=el/UdDvWR0hfiElvrbBcUQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "7903" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqlAytrsQn43Os8JxSOx4C8v9ApqqtqwEE7kZ-voKAcmcYe32lG7ANHxzNrwkqN8bbLLohoAHd88brZDVaC3U6Q01dhBBoeDFnlkCzHKUJjA8ZWrgM" ] }, "Body": "Uk9VUCA9IEwxX01FVEFEQVRBX0ZJTEUKICBHUk9VUCA9IE1FVEFEQVRBX0ZJTEVfSU5GTwogICAgT1JJR0lOID0gIkltYWdlIGNvdXJ0ZXN5IG9mIHRoZSBVLlMuIEdlb2xvZ2ljYWwgU3VydmV5IgogICAgUkVRVUVTVF9JRCA9ICIwNzAxNjA5MTkxMDUxXzAwMDA0IgogICAgTEFORFNBVF9TQ0VORV9JRCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDAiCiAgICBGSUxFX0RBVEUgPSAyMDE2LTA5LTIwVDAzOjEzOjAyWgogICAgU1RBVElPTl9JRCA9ICJMR04iCiAgICBQUk9DRVNTSU5HX1NPRlRXQVJFX1ZFUlNJT04gPSAiTFBHU18yLjYuMiIKICBFTkRfR1JPVVAgPSBNRVRBREFUQV9GSUxFX0lORk8KICBHUk9VUCA9IFBST0RVQ1RfTUVUQURBVEEKICAgIERBVEFfVFlQRSA9ICJMMVQiCiAgICBFTEVWQVRJT05fU09VUkNFID0gIkdMUzIwMDAiCiAgICBPVVRQVVRfRk9STUFUID0gIkdFT1RJRkYiCiAgICBTUEFDRUNSQUZUX0lEID0gIkxBTkRTQVRfOCIKICAgIFNFTlNPUl9JRCA9ICJPTElfVElSUyIKICAgIFdSU19QQVRIID0gNDQKICAgIFdSU19ST1cgPSAzNAogICAgTkFESVJfT0ZGTkFESVIgPSAiTkFESVIiCiAgICBUQVJHRVRfV1JTX1BBVEggPSA0NAogICAgVEFSR0VUX1dSU19ST1cgPSAzNAogICAgREFURV9BQ1FVSVJFRCA9IDIwMTYtMDktMTUKICAgIFNDRU5FX0NFTlRFUl9USU1FID0gIjE4OjQ2OjE4LjY4NjczODBaIgogICAgQ09STkVSX1VMX0xBVF9QUk9EVUNUID0gMzguNTI4MTkKICAgIENPUk5FUl9VTF9MT05fUFJPRFVDVCA9IC0xMjMuNDA4NDMKICAgIENPUk5FUl9VUl9MQVRfUFJPRFVDVCA9IDM4LjUwNzY1CiAgICBDT1JORVJfVVJfTE9OX1BST0RVQ1QgPSAtMTIwLjc2OTMzCiAgICBDT1JORVJfTExfTEFUX1BST0RVQ1QgPSAzNi40MTYzMwogICAgQ09STkVSX0xMX0xPTl9QUk9EVUNUID0gLTEyMy4zOTcwOQogICAgQ09STkVSX0xSX0xBVF9QUk9EVUNUID0gMzYuMzk3MjkKICAgIENPUk5FUl9MUl9MT05fUFJPRFVDVCA9IC0xMjAuODMxMTcKICAgIENPUk5FUl9VTF9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDQ2NDQwMC4wMDAKICAgIENPUk5FUl9VTF9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQyNjQ1MDAuMDAwCiAgICBDT1JORVJfVVJfUFJPSkVDVElPTl9YX1BST0RVQ1QgPSA2OTQ1MDAuMDAwCiAgICBDT1JORVJfVVJfUFJPSkVDVElPTl9ZX1BST0RVQ1QgPSA0MjY0NTAwLjAwMAogICAgQ09STkVSX0xMX1BST0pFQ1RJT05fWF9QUk9EVUNUID0gNDY0NDAwLjAwMAogICAgQ09STkVSX0xMX1BST0pFQ1RJT05fWV9QUk9EVUNUID0gNDAzMDIwMC4wMDAKICAgIENPUk5FUl9MUl9QUk9KRUNUSU9OX1hfUFJPRFVDVCA9IDY5NDUwMC4wMDAKICAgIENPUk5FUl9MUl9QUk9KRUNUSU9OX1lfUFJPRFVDVCA9IDQwMzAyMDAuMDAwCiAgICBQQU5DSFJPTUFUSUNfTElORVMgPSAxNTYyMQogICAgUEFOQ0hST01BVElDX1NBTVBMRVMgPSAxNTM0MQogICAgUkVGTEVDVElWRV9MSU5FUyA9IDc4MTEKICAgIFJFRkxFQ1RJVkVfU0FNUExFUyA9IDc2NzEKICAgIFRIRVJNQUxfTElORVMgPSA3ODExCiAgICBUSEVSTUFMX1NBTVBMRVMgPSA3NjcxCiAgICBGSUxFX05BTUVfQkFORF8xID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMS5USUYiCiAgICBGSUxFX05BTUVfQkFORF8yID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMi5USUYiCiAgICBGSUxFX05BTUVfQkFORF8zID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMy5USUYiCiAgICBGSUxFX05BTUVfQkFORF80ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNC5USUYiCiAgICBGSUxFX05BTUVfQkFORF81ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNS5USUYiCiAgICBGSUxFX05BTUVfQkFORF82ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNi5USUYiCiAgICBGSUxFX05BTUVfQkFORF83ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CNy5USUYiCiAgICBGSUxFX05BTUVfQkFORF84ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9COC5USUYiCiAgICBGSUxFX05BTUVfQkFORF85ID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9COS5USUYiCiAgICBGSUxFX05BTUVfQkFORF8xMCA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQjEwLlRJRiIKICAgIEZJTEVfTkFNRV9CQU5EXzExID0gIkxDODA0NDAzNDIwMTYyNTlMR04wMF9CMTEuVElGIgogICAgRklMRV9OQU1FX0JBTkRfUVVBTElUWSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfQlFBLlRJRiIKICAgIE1FVEFEQVRBX0ZJTEVfTkFNRSA9ICJMQzgwNDQwMzQyMDE2MjU5TEdOMDBfTVRMLnR4dCIKICAgIEJQRl9OQU1FX09MSSA9ICJMTzhCUEYyMDE2MDkxNTE4MzA1N18yMDE2MDkxNTIwMDk1MC4wMSIKICAgIEJQRl9OQU1FX1RJUlMgPSAiTFQ4QlBGMjAxNjA5MDIwODQxMjJfMjAxNjA5MTcwNzQwMjcuMDIiCiAgICBDUEZfTkFNRSA9ICJMOENQRjIwMTYwNzAxXzIwMTYwOTMwLjAyIgogICAgUkxVVF9GSUxFX05BTUUgPSAiTDhSTFVUMjAxNTAzMDNfMjA0MzEyMzF2MTEuaDUiCiAgRU5EX0dST1VQID0gUFJPRFVDVF9NRVRBREFUQQogIEdST1VQID0gSU1BR0VfQVRUUklCVVRFUwogICAgQ0xPVURfQ09WRVIgPSAyOS41NgogICAgQ0xPVURfQ09WRVJfTEFORCA9IDMuMzMKICAgIElNQUdFX1FVQUxJVFlfT0xJID0gOQogICAgSU1BR0VfUVVBTElUWV9USVJTID0gOQogICAgVElSU19TU01fTU9ERUwgPSAiRklOQUwiCiAgICBUSVJTX1NTTV9QT1NJVElPTl9TVEFUVVMgPSAiRVNUSU1BVEVEIgogICAgUk9MTF9BTkdMRSA9IC0wLjAwMQogICAgU1VOX0FaSU1VVEggPSAxNDguNDgwNDkzOTYKICAgIFNVTl9FTEVWQVRJT04gPSA1MC45Mzc2ODM5OQogICAgRUFSVEhfU1VOX0RJU1RBTkNFID0gMS4wMDUzNzUyCiAgICBHUk9VTkRfQ09OVFJPTF9QT0lOVFNfVkVSU0lPTiA9IDQKICAgIEdST1VORF9DT05UUk9MX1BPSU5UU19NT0RFTCA9IDU0OAogICAgR0VPTUVUUklDX1JNU0VfTU9ERUwgPSA1Ljg1NwogICAgR0VPTUVUUklDX1JNU0VfTU9ERUxfWSA9IDMuODQxCiAgICBHRU9NRVRSSUNfUk1TRV9NT0RFTF9YID0gNC40MjIKICAgIEdST1VORF9DT05UUk9MX1BPSU5UU19WRVJJRlkgPSAyMjgKICAgIEdFT01FVFJJQ19STVNFX1ZFUklGWSA9IDMuMzgyCiAgRU5EX0dST1VQID0gSU1BR0VfQVRUUklCVVRFUwogIEdST1VQID0gTUlOX01BWF9SQURJQU5DRQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzEgPSA3NTEuOTU3MDkKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xID0gLTYyLjA5Njg2CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMiA9IDc3MC4wMTMxOAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzIgPSAtNjMuNTg3OTQKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF8zID0gNzA5LjU2MDYxCiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfMyA9IC01OC41OTU3NQogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzQgPSA1OTguMzQxNDkKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF80ID0gLTQ5LjQxMTIzCiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfNSA9IDM2Ni4xNTUxNQogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzUgPSAtMzAuMjM3MjEKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF82ID0gOTEuMDU5NDYKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF82ID0gLTcuNTE5NzIKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF83ID0gMzAuNjkxOTEKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF83ID0gLTIuNTM0NTUKICAgIFJBRElBTkNFX01BWElNVU1fQkFORF84ID0gNjc3LjE1Nzg0CiAgICBSQURJQU5DRV9NSU5JTVVNX0JBTkRfOCA9IC01NS45MTk5MgogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzkgPSAxNDMuMTAxNzMKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF85ID0gLTExLjgxNzM5CiAgICBSQURJQU5DRV9NQVhJTVVNX0JBTkRfMTAgPSAyMi4wMDE4MAogICAgUkFESUFOQ0VfTUlOSU1VTV9CQU5EXzEwID0gMC4xMDAzMwogICAgUkFESUFOQ0VfTUFYSU1VTV9CQU5EXzExID0gMjIuMDAxODAKICAgIFJBRElBTkNFX01JTklNVU1fQkFORF8xMSA9IDAuMTAwMzMKICBFTkRfR1JPVVAgPSBNSU5fTUFYX1JBRElBTkNFCiAgR1JPVVAgPSBNSU5fTUFYX1JFRkxFQ1RBTkNFCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfMSA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfMSA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzIgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzIgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF8zID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF8zID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNCA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNCA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzUgPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzUgPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF82ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF82ID0gLTAuMDk5OTgwCiAgICBSRUZMRUNUQU5DRV9NQVhJTVVNX0JBTkRfNyA9IDEuMjEwNzAwCiAgICBSRUZMRUNUQU5DRV9NSU5JTVVNX0JBTkRfNyA9IC0wLjA5OTk4MAogICAgUkVGTEVDVEFOQ0VfTUFYSU1VTV9CQU5EXzggPSAxLjIxMDcwMAogICAgUkVGTEVDVEFOQ0VfTUlOSU1VTV9CQU5EXzggPSAtMC4wOTk5ODAKICAgIFJFRkxFQ1RBTkNFX01BWElNVU1fQkFORF85ID0gMS4yMTA3MDAKICAgIFJFRkxFQ1RBTkNFX01JTklNVU1fQkFORF85ID0gLTAuMDk5OTgwCiAgRU5EX0dST1VQID0gTUlOX01BWF9SRUZMRUNUQU5DRQogIEdST1VQID0gTUlOX01BWF9QSVhFTF9WQUxVRQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzEgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzEgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfMiA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMiA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8zID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8zID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzQgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzQgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfNSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfNSA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF82ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF82ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzcgPSA2NTUzNQogICAgUVVBTlRJWkVfQ0FMX01JTl9CQU5EXzcgPSAxCiAgICBRVUFOVElaRV9DQUxfTUFYX0JBTkRfOCA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfOCA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF85ID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF85ID0gMQogICAgUVVBTlRJWkVfQ0FMX01BWF9CQU5EXzEwID0gNjU1MzUKICAgIFFVQU5USVpFX0NBTF9NSU5fQkFORF8xMCA9IDEKICAgIFFVQU5USVpFX0NBTF9NQVhfQkFORF8xMSA9IDY1NTM1CiAgICBRVUFOVElaRV9DQUxfTUlOX0JBTkRfMTEgPSAxCiAgRU5EX0dST1VQID0gTUlOX01BWF9QSVhFTF9WQUxVRQogIEdST1VQID0gUkFESU9NRVRSSUNfUkVTQ0FMSU5HCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMSA9IDEuMjQyMkUtMDIKICAgIFJBRElBTkNFX01VTFRfQkFORF8yID0gMS4yNzIwRS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzMgPSAxLjE3MjFFLTAyCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNCA9IDkuODg0MkUtMDMKICAgIFJBRElBTkNFX01VTFRfQkFORF81ID0gNi4wNDg3RS0wMwogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzYgPSAxLjUwNDJFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfNyA9IDUuMDcwMUUtMDQKICAgIFJBRElBTkNFX01VTFRfQkFORF84ID0gMS4xMTg2RS0wMgogICAgUkFESUFOQ0VfTVVMVF9CQU5EXzkgPSAyLjM2NDBFLTAzCiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMTAgPSAzLjM0MjBFLTA0CiAgICBSQURJQU5DRV9NVUxUX0JBTkRfMTEgPSAzLjM0MjBFLTA0CiAgICBSQURJQU5DRV9BRERfQkFORF8xID0gLTYyLjEwOTI4CiAgICBSQURJQU5DRV9BRERfQkFORF8yID0gLTYzLjYwMDY2CiAgICBSQURJQU5DRV9BRERfQkFORF8zID0gLTU4LjYwNzQ3CiAgICBSQURJQU5DRV9BRERfQkFORF80ID0gLTQ5LjQyMTEyCiAgICBSQURJQU5DRV9BRERfQkFORF81ID0gLTMwLjI0MzI2CiAgICBSQURJQU5DRV9BRERfQkFORF82ID0gLTcuNTIxMjIKICAgIFJBRElBTkNFX0FERF9CQU5EXzcgPSAtMi41MzUwNQogICAgUkFESUFOQ0VfQUREX0JBTkRfOCA9IC01NS45MzExMAogICAgUkFESUFOQ0VfQUREX0JBTkRfOSA9IC0xMS44MTk3NQogICAgUkFESUFOQ0VfQUREX0JBTkRfMTAgPSAwLjEwMDAwCiAgICBSQURJQU5DRV9BRERfQkFORF8xMSA9IDAuMTAwMDAKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF8xID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzIgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfMyA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF80ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzUgPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfNiA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX01VTFRfQkFORF83ID0gMi4wMDAwRS0wNQogICAgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EXzggPSAyLjAwMDBFLTA1CiAgICBSRUZMRUNUQU5DRV9NVUxUX0JBTkRfOSA9IDIuMDAwMEUtMDUKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzEgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzIgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzMgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzQgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzUgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzYgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzcgPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzggPSAtMC4xMDAwMDAKICAgIFJFRkxFQ1RBTkNFX0FERF9CQU5EXzkgPSAtMC4xMDAwMDAKICBFTkRfR1JPVVAgPSBSQURJT01FVFJJQ19SRVNDQUxJTkcKICBHUk9VUCA9IFRJUlNfVEhFUk1BTF9DT05TVEFOVFMKICAgIEsxX0NPTlNUQU5UX0JBTkRfMTAgPSA3NzQuODg1MwogICAgSzFfQ09OU1RBTlRfQkFORF8xMSA9IDQ4MC44ODgzCiAgICBLMl9DT05TVEFOVF9CQU5EXzEwID0gMTMyMS4wNzg5CiAgICBLMl9DT05TVEFOVF9CQU5EXzExID0gMTIwMS4xNDQyCiAgRU5EX0dST1VQID0gVElSU19USEVSTUFMX0NPTlNUQU5UUwogIEdST1VQID0gUFJPSkVDVElPTl9QQVJBTUVURVJTCiAgICBNQVBfUFJPSkVDVElPTiA9ICJVVE0iCiAgICBEQVRVTSA9ICJXR1M4NCIKICAgIEVMTElQU09JRCA9ICJXR1M4NCIKICAgIFVUTV9aT05FID0gMTAKICAgIEdSSURfQ0VMTF9TSVpFX1BBTkNIUk9NQVRJQyA9IDE1LjAwCiAgICBHUklEX0NFTExfU0laRV9SRUZMRUNUSVZFID0gMzAuMDAKICAgIEdSSURfQ0VMTF9TSVpFX1RIRVJNQUwgPSAzMC4wMAogICAgT1JJRU5UQVRJT04gPSAiTk9SVEhfVVAiCiAgICBSRVNBTVBMSU5HX09QVElPTiA9ICJDVUJJQ19DT05WT0xVVElPTiIKICBFTkRfR1JPVVAgPSBQUk9KRUNUSU9OX1BBUkFNRVRFUlMKRU5EX0dST1VQID0gTDFfTUVUQURBVEFfRklMRQpFTkQK" } }, { "ID": "320dc27adc377057", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/gcp-public-data-landsat/LC08/PRE/044/034/LC80440342016259LGN00/LC80440342016259LGN00_MTL.txt", "Header": { "Range": [ "bytes=0-17" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Length": [ "18" ], "Content-Range": [ "bytes 0-17/7903" ], "Content-Type": [ "application/octet-stream" ], "Date": [ "Thu, 02 May 2019 22:25:27 GMT" ], "Etag": [ "\"7a5fd4743bd647485f88496fadb05c51\"" ], "Expires": [ "Thu, 02 May 2019 23:25:27 GMT" ], "Last-Modified": [ "Tue, 04 Oct 2016 16:42:07 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1475599327662000" ], "X-Goog-Hash": [ "crc32c=PWBt8g==", "md5=el/UdDvWR0hfiElvrbBcUQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "7903" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UovperPufphUvaf55r54Wd-USAbL2ZQVTseICyulStqI633iJcFBLryyqecsHQcoU2cXp4MsKgB8uQu979IXcnv-aGNm6viDydIrqmPqA7SmPElPGI" ] }, "Body": "R1JPVVAgPSBMMV9NRVRBREFU" } }, { "ID": "a20a4e3b35dfd271", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage-library-test-bucket/gzipped-text.txt", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Encoding": [ "gzip" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:25:27 GMT" ], "Etag": [ "\"c6117833aa4d1510d09ef69144d56790\"" ], "Expires": [ "Thu, 02 May 2019 23:25:27 GMT" ], "Last-Modified": [ "Tue, 14 Nov 2017 13:07:32 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Accept-Encoding" ], "X-Goog-Generation": [ "1510664852486988" ], "X-Goog-Hash": [ "crc32c=T1s5RQ==", "md5=xhF4M6pNFRDQnvaRRNVnkA==" ], "X-Goog-Metageneration": [ "2" ], "X-Goog-Storage-Class": [ "MULTI_REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "gzip" ], "X-Goog-Stored-Content-Length": [ "31" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq7491k1eCc7fe_JApsP1zDcSyo759KmHvh-9YHm9ekpOGaG8v1bZNPjaMEkikJSDYt_LkVMHrb9HTDx9vvDGy3Zm1kPrlxS4933Sw-Wdh35lDomi4" ] }, "Body": "H4sIAAAAAAAAC8tIzcnJVyjPL8pJAQCFEUoNCwAAAA==" } }, { "ID": "d1941f2e08f3bc52", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage-library-test-bucket/gzipped-text.txt", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Encoding": [ "gzip" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:25:27 GMT" ], "Etag": [ "\"c6117833aa4d1510d09ef69144d56790\"" ], "Expires": [ "Thu, 02 May 2019 23:25:27 GMT" ], "Last-Modified": [ "Tue, 14 Nov 2017 13:07:32 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Accept-Encoding" ], "X-Goog-Generation": [ "1510664852486988" ], "X-Goog-Hash": [ "crc32c=T1s5RQ==", "md5=xhF4M6pNFRDQnvaRRNVnkA==" ], "X-Goog-Metageneration": [ "2" ], "X-Goog-Storage-Class": [ "MULTI_REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "gzip" ], "X-Goog-Stored-Content-Length": [ "31" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoYIJ-m0VbRdjw7ZGI_0TiIfj6fcuhJkomWPdQGApFxH2_LnekHIdv7igEpJAM3a-zrTOzR20bzvc-JBunTe_-f_Hsyxz_VPxJNrQY7PSrQ3OMfEhQ" ] }, "Body": "H4sIAAAAAAAAC8tIzcnJVyjPL8pJAQCFEUoNCwAAAA==" } }, { "ID": "2451a87df39e1241", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage-library-test-bucket/gzipped-text.txt", "Header": { "Range": [ "bytes=1-8" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:25:27 GMT" ], "Etag": [ "W/\"c6117833aa4d1510d09ef69144d56790\"" ], "Expires": [ "Thu, 02 May 2019 23:25:27 GMT" ], "Last-Modified": [ "Tue, 14 Nov 2017 13:07:32 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Accept-Encoding" ], "Warning": [ "214 UploadServer gunzipped" ], "X-Goog-Generation": [ "1510664852486988" ], "X-Goog-Hash": [ "crc32c=T1s5RQ==", "md5=xhF4M6pNFRDQnvaRRNVnkA==" ], "X-Goog-Metageneration": [ "2" ], "X-Goog-Storage-Class": [ "MULTI_REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "gzip" ], "X-Goog-Stored-Content-Length": [ "31" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Response-Body-Transformations": [ "gunzipped" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoNfvi75DBdUL5KpenQbqbsYr5A8YSQp2lGAPIhe4FlijJP95WctTUrdrLIyq3riprP50HzntCuw7zh5ycZfqbJBkFbibeIwEp5bVDj7yVpJbqctiI" ] }, "Body": "aGVsbG8gd29ybGQ=" } }, { "ID": "f0e47a86731e8924", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage-library-test-bucket/gzipped-text.txt", "Header": { "Accept-Encoding": [ "gzip" ], "Range": [ "bytes=1-8" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 206, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Encoding": [ "gzip" ], "Content-Range": [ "bytes 1-8/31" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:25:27 GMT" ], "Etag": [ "\"c6117833aa4d1510d09ef69144d56790\"" ], "Expires": [ "Thu, 02 May 2019 23:25:27 GMT" ], "Last-Modified": [ "Tue, 14 Nov 2017 13:07:32 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Accept-Encoding" ], "X-Goog-Generation": [ "1510664852486988" ], "X-Goog-Hash": [ "crc32c=T1s5RQ==", "md5=xhF4M6pNFRDQnvaRRNVnkA==" ], "X-Goog-Metageneration": [ "2" ], "X-Goog-Storage-Class": [ "MULTI_REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "gzip" ], "X-Goog-Stored-Content-Length": [ "31" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Upzmwe6UNntf6SxdYLZTz0aZiFJ7UANU6y7I2YKJbADGSVoCRe63OoxcC4uh-9n2JEnkvQgq0dwCHCbQ3qmYG4cWFEovG_fIMKFx6O11iPQUhLmeFw" ] }, "Body": "iwgAAAAAAAA=" } }, { "ID": "2a14c414736e344d", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "168" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJjb3JzIjpbeyJtYXhBZ2VTZWNvbmRzIjozNjAwLCJtZXRob2QiOlsiUE9TVCJdLCJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXX1dLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0In0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "593" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:28 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrgiftU7BDllYqI1jhKj6RbZME3LoakRb653ThaSSD_kzX1O5odabBcDFfG-oswR6YOcDZTW174qxbUaa2G1EvajUt_wJAD3ViGgoMwT_YjoTvObkc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI4LjAwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyOC4wMDlaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJjb3JzIjpbeyJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sIm1ldGhvZCI6WyJQT1NUIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "b03cb69547c1a6de", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0004?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "99" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJjb3JzIjpbeyJtYXhBZ2VTZWNvbmRzIjozNjAwLCJtZXRob2QiOlsiR0VUIl0sIm9yaWdpbiI6WyIqIl0sInJlc3BvbnNlSGVhZGVyIjpbInNvbWUtaGVhZGVyIl19XX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2528" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:28 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Urw36CL-_RvF58GoVX1bJlTZ1YUUdWXJKQDIac7eTOYj5s65KYFsk2ndonwA5ro_9nGPfo4qRIYyt7J1Xxb01TiJUQPRXzH-z9T_S5UQE6fxOssN0g" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI4LjAwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyOC43MjRaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImNvcnMiOlt7Im9yaWdpbiI6WyIqIl0sIm1ldGhvZCI6WyJHRVQiXSwicmVzcG9uc2VIZWFkZXIiOlsic29tZS1oZWFkZXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=" } }, { "ID": "735da673f622341d", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0004?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2528" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:29 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:25:29 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Urb-FeCpjdYOEj6HdkFXRMfVXffmMB8xjLqLwPvjgs3FghXs7r94UrXEpX0rW_CgEpjG6v6iHCWCkwxib31kFkLPMZMMZxHTy66dPT2AdBDsIE8Y8k" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI4LjAwOVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyOC43MjRaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImNvcnMiOlt7Im9yaWdpbiI6WyIqIl0sIm1ldGhvZCI6WyJHRVQiXSwicmVzcG9uc2VIZWFkZXIiOlsic29tZS1oZWFkZXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=" } }, { "ID": "97ce23a7211781ed", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "168" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJjb3JzIjpbeyJtYXhBZ2VTZWNvbmRzIjozNjAwLCJtZXRob2QiOlsiUE9TVCJdLCJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXX1dLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1In0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "593" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:30 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrqrjU-mu7dGgY6-CuNd9AwgGuKtQ_O589el9eyWSAb54cDYnQN74dl8HxRVzIUayStgIinEuuux2afAlvkUGm9lhrefX8nugBXNL2lGluNcfQKfRo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI5LjcyNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyOS43MjRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJjb3JzIjpbeyJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sIm1ldGhvZCI6WyJQT1NUIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "a8f5b1c42d7a3c5f", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0005?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "12" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJjb3JzIjpbXX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:30 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpZ4q-BeojZ4WgF5ZHNzJG7sIvdOxmprH5GqoQ3DM-QllSzHWOwAfhVdJZH7WmVK5Dfs1TQH-pKgneNLb_9uYM-rDFb_5Hh9vs89o4pOPT9ob9ezTE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI5LjcyNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMC42MjhaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "cab9472f01ed4bd5", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0005?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:31 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:25:31 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo0__TFFuzUsEi6Eck0G1lblGy_1abmyPHERWBavjN2GHncyWWnKQ6yYaFDpDVQ-kfBS15M6H9NoxXUDS0hZ9VX8S9hK4rUGAAFWXznHjOntSK5ldY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjI5LjcyNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMC42MjhaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "7a196e6b35872d48", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "168" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJjb3JzIjpbeyJtYXhBZ2VTZWNvbmRzIjozNjAwLCJtZXRob2QiOlsiUE9TVCJdLCJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXX1dLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2In0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "593" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:31 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpJhdZl7X4YXxzKdcr7SJ3C6Xadtlo0ixoS8DNO1jaDHs5MeGKu9nx2pHWPpnUWd13HZ8inxG0pMh3un84TucDfyLu4Z-5Gp7Ka3HBfPnt_w_VTiuE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMxLjQwN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMS40MDdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJjb3JzIjpbeyJvcmlnaW4iOlsic29tZS1vcmlnaW4uY29tIl0sIm1ldGhvZCI6WyJQT1NUIl0sInJlc3BvbnNlSGVhZGVyIjpbImZvby1iYXIiXSwibWF4QWdlU2Vjb25kcyI6MzYwMH1dLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "24b6a3b712ccab17", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0006?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2539" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:31 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqe_Q9NPVf3WTO_It8-A42wh0FD3KyF4kopi6posCEX6l28cnowG8O7WSYwETklwvpp0Uk1fCXiVmgwqLlWCSc3ez-nYllKp5m_UVtxup1E1UNadGg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMxLjQwN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMS40MDdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImNvcnMiOlt7Im9yaWdpbiI6WyJzb21lLW9yaWdpbi5jb20iXSwibWV0aG9kIjpbIlBPU1QiXSwicmVzcG9uc2VIZWFkZXIiOlsiZm9vLWJhciJdLCJtYXhBZ2VTZWNvbmRzIjozNjAwfV0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "ebed90fad884e1cd", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0006?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2539" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:32 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:25:32 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrjLjhrtR5T2TdsRM6X3HPy_6vnZjhUfpjytCivwknDLKhiMkND-f1qeZ4te6AnGrv_qtnGI4OGajQJaydHJvQZGWpnBQN9VOXHqYjSBTCxnNbcbC4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMxLjQwN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMS40MDdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImNvcnMiOlt7Im9yaWdpbiI6WyJzb21lLW9yaWdpbi5jb20iXSwibWV0aG9kIjpbIlBPU1QiXSwicmVzcG9uc2VIZWFkZXIiOlsiZm9vLWJhciJdLCJtYXhBZ2VTZWNvbmRzIjozNjAwfV0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "31ee7f558375c66a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0006?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:32 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up70C3kZ6tTqgyRHbTyjXA5pLWMohouKPHCPhexU8UuWw0cAmLxjHcwaa2xBT-Soq-CLyVxoWeEkxFMhRqqK87xaM38Q2hSjGkeXEhmhoZ3iy5s6D8" ] }, "Body": "" } }, { "ID": "72458186a1839a5a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0005?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:32 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpsiYUGF50kaeS-bMsAR51mlDVCwH9HwmqU1hCFSwzrMDgCmGF46ZuQGfqWx4SJprlBWIxaNwT_EQMKQrTQARvFyee5ZOJq21xZUsVEc1iBW0KkiVk" ] }, "Body": "" } }, { "ID": "20fcdf5cb9502a64", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0004?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:33 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up8ALydoTkq1rLUaKiwrh6YEhczTwI3VX8iKuCNoqr6N2BSBvtxD2Qc9De99Svk_4EX82rynlWctsS2F9Ffr4WuDby30_W1Fl7TMWFZGWfo5Wc_nfI" ] }, "Body": "" } }, { "ID": "ace99589753f3389", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "60" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3In0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "485" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:33 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UotVHCMZG4hcbTx20gUPBV1LsUxIAVuDym9d21c2In0VVLzBxOM_DAULuLEd9LTMmpNg6A7yW4yqEsnRlHhAaMbpe7MwAWbadF2gJJ2M7uGdA-rcLQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMy43MDVaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "466aeae01d2d2933", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:34 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:25:34 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoVuGt1j5ranQuT0nS5bzOIcVM5M42RwIHcF2mKK_H1ctJEqC_djWDMm00OBFXY4yxsTFdQ1ZYjWVnFq8GhUAWUsvsj4_B9Ur8MzJQcbAzG9vHgIjs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozMy43MDVaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "34d8505e483be050", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "31" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZWZhdWx0RXZlbnRCYXNlZEhvbGQiOnRydWV9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2460" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:34 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo5A5V7O5JcpElASqEqUZ_UiEjPa-39PCu3SwJk8EE9cHfyeVL5DWQkAss8k9iRx7YjD4ZC7WnzE_ENz95PuKdccjgzeC2GLFAUzA-sR2iEf-lNil4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNC42MzJaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImRlZmF1bHRFdmVudEJhc2VkSG9sZCI6dHJ1ZSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9" } }, { "ID": "728568d994e275c7", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2460" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:34 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:25:34 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrOVH8W8OREkTrF0UKlK3dOp_AAbRF7Rsx16Zbjdl5caBObFjXETVORm7o-d-YYcPIjcrx1mKcQwxHCIXpdE5P6baH6WeY3Wc3JVF7UcQnKna-a_U4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNC42MzJaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImRlZmF1bHRFdmVudEJhc2VkSG9sZCI6dHJ1ZSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9" } }, { "ID": "b7230d8a6b23fd8b", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "35" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9fQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2493" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:35 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uouwpmid1Y6D0uXWBb_WrmlZVHKYnw0RGbreddchrmPzQUE1H_DeclZnbl6Yb2346L4YNt44ZeZWEM2u46h7Zx45lw9rUFxZDQIvlXRn4vT6fW4WQQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNS4zMzNaIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBTT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImRlZmF1bHRFdmVudEJhc2VkSG9sZCI6dHJ1ZSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FNPSJ9" } }, { "ID": "ec9da9e78b750503", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2493" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:35 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Thu, 02 May 2019 22:25:35 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq25oUSnJMHsIEARHohSGtkz5vw7RCXuQupRBliEjCXMeivgUIK0y9C3U4yWEJ-_182SvGUQLvo5rXxymcoyahwAEhfe21FJU_M2IijdiWsSv83eow" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjMzLjcwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNS4zMzNaIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBTT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsImRlZmF1bHRFdmVudEJhc2VkSG9sZCI6dHJ1ZSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJiaWxsaW5nIjp7InJlcXVlc3RlclBheXMiOnRydWV9LCJldGFnIjoiQ0FNPSJ9" } }, { "ID": "ad49d37f07d631a5", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0007?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:36 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq02fbr_iko_zBCbJljbMwyW7mOaz1cqR6AWHm2ac3m9BcqrUXNkmRqxk0R2rZW6SAUC_KzbOze-1wUGY2E0g6wbYLUqcb8IOdqN2-ROvYO49uxzjE" ] }, "Body": "" } }, { "ID": "7b04c14c4e323488", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "60" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4In0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "485" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:36 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrJrrmhbKyKRTvA3_mNqzRsaaMOAAlvn8UMwBiOR77-6X6m5InqoXMb4qoollPzgpcFOmchQ54jFNic0xJf-tiGu0tlrzSdbjh5Hzw8Rl3RnJy_jPw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM2LjUwMVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNi41MDFaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "ae3e9c648aaff158", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJuYW1lIjoic29tZS1vYmoifQo=", "X7Xb+/Xtxt2fLTn7y+yBvw==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:37 GMT" ], "Etag": [ "CJbmhujx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrJv7oOcHCzf9atnIPo70j3xSldrZtXTb5CmV1iuM4mMPU4hiBgpDqCAdUDI3i9hlR2qRie9qT30AJNshzO5CSsuzoTQ88W255VO8VVumaCSZ0KXZs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNy4xMzdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiZExyZG9WZ2p4bEFBR05hWVgxQm1idz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTkzNzEzNzQzMCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmJtaHVqeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvc29tZS1vYmovMTU1NjgzNTkzNzEzNzQzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmJtaHVqeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ik01ZUcvQT09IiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifQ==" } }, { "ID": "e7a12fdbeb636933", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:37 GMT" ], "Etag": [ "CJbmhujx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo-mQ6Bnw1qbAyHbMdumiv5YlTBrFQbHo-9tXn02VufGPTp3_Q8nXXp9VIcdRmzH2CJbhaVLu5fUFYZ6VKgcitBwcE-dCwxWrzaljgyT6zmM7x01ls" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNy4xMzdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiZExyZG9WZ2p4bEFBR05hWVgxQm1idz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTkzNzEzNzQzMCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmJtaHVqeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvc29tZS1vYmovMTU1NjgzNTkzNzEzNzQzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmJtaHVqeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ik01ZUcvQT09IiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBRT0ifQ==" } }, { "ID": "142eb6c42bc6f90e", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "84" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJldmVudEJhc2VkSG9sZCI6dHJ1ZX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3215" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:37 GMT" ], "Etag": [ "CJbmhujx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrBTG1gAXfMDmjm_clsDlv04E6VRtZUsUKnaVr4bC3AIRXILH2f0UebFf1_SmXPSf6Go8sw7TXti9yO112PAG5QNin3LwaSjRuFDSH_unnMZJwRceM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNy4xMzdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuODI1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiZExyZG9WZ2p4bEFBR05hWVgxQm1idz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTkzNzEzNzQzMCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmJtaHVqeC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvc29tZS1vYmovMTU1NjgzNTkzNzEzNzQzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmJtaHVqeC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ik01ZUcvQT09IiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0iLCJldmVudEJhc2VkSG9sZCI6dHJ1ZX0=" } }, { "ID": "12487e4f20538041", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3215" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:38 GMT" ], "Etag": [ "CJbmhujx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqxyG_OCKjwh7TR9zL9nbOGPP1ttxni9cP68b18nTZ7wZ8WqVE0MAGh1XFphNYZEYr-2kdgNgmqQrOvFiNbg6hJi-RfjCWYg0KHPLKfzyWc-gejszc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozNy4xMzdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuODI1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiZExyZG9WZ2p4bEFBR05hWVgxQm1idz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTkzNzEzNzQzMCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSmJtaHVqeC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvc29tZS1vYmovMTU1NjgzNTkzNzEzNzQzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTM3MTM3NDMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSmJtaHVqeC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ik01ZUcvQT09IiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBST0iLCJldmVudEJhc2VkSG9sZCI6dHJ1ZX0=" } }, { "ID": "e3a625bb7418cea9", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "82" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJjb250ZW50VHlwZSI6ImZvbyJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:38 GMT" ], "Etag": [ "CJbmhujx/eECEAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoVf0XeyD5sC9KvHEILX2e7x7VyJ9d9xoyrP3NqGFlsMgvK3zgeOEOXDvSpftUSy4opndA74-LNRkmAi8Q_6wc91iC8OWV7X3VR8kENWwclNK30V_U" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozOC40MjBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJkTHJkb1ZnanhsQUFHTmFZWDFCbWJ3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTM3MTM3NDMwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiTTVlRy9BPT0iLCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSIsImV2ZW50QmFzZWRIb2xkIjp0cnVlfQ==" } }, { "ID": "2290ac6bb34b705b", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:38 GMT" ], "Etag": [ "CJbmhujx/eECEAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoKagfJuJDLVLgIcrGtlV_UXlXLSqfEFj2-knllMBWWLktTv22ZfKoeSo8lY6gSfE1LKlvn87WiyJv75QWpcWdXzvablAMBOAZ_XMe-1D8dKZ5ipHs" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozOC40MjBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJkTHJkb1ZnanhsQUFHTmFZWDFCbWJ3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTM3MTM3NDMwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiTTVlRy9BPT0iLCJldGFnIjoiQ0pibWh1angvZUVDRUFNPSIsImV2ZW50QmFzZWRIb2xkIjp0cnVlfQ==" } }, { "ID": "572d50dc9b5ce8a4", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "85" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJldmVudEJhc2VkSG9sZCI6ZmFsc2V9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3194" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:39 GMT" ], "Etag": [ "CJbmhujx/eECEAQ=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrWVb2L8OGfosYWTjk_F-zmyNwltYI93f2tqyP4EkOx7hIRpsSG2iGDFXB7SP7DKn-teczhb9tiBKRM7rYG5vcJ5jVinideFoX44khld5BhtRaQsUc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsIm1ldGFnZW5lcmF0aW9uIjoiNCIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjM3LjEzN1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTozOC45MTlaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6MzcuMTM3WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJkTHJkb1ZnanhsQUFHTmFZWDFCbWJ3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTM3MTM3NDMwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9zb21lLW9iai8xNTU2ODM1OTM3MTM3NDMwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDgvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5MzcxMzc0MzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0pibWh1angvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4L3NvbWUtb2JqLzE1NTY4MzU5MzcxMzc0MzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA4Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTkzNzEzNzQzMCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKYm1odWp4L2VFQ0VBUT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiTTVlRy9BPT0iLCJldGFnIjoiQ0pibWh1angvZUVDRUFRPSIsImV2ZW50QmFzZWRIb2xkIjpmYWxzZX0=" } }, { "ID": "bda340f0117c1fb4", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008/o/some-obj?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:39 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UotG32AgmOwDD_bLLd_W64JCOZQ2-UgeY_cOZwomlkWb6Vx5JSE54tdsuCPvawuyJ8eNuCf8EM0qXlIjtAyg6QQiuN9t72vHrQLsrSs6WtJBDGZziU" ] }, "Body": "" } }, { "ID": "9a0b7379af024a3a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0008?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:39 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur7S22mcdvPtDq_Z9iUbo4v0ApOQXNFgXFNZuacd8yZUq2FhZKco01Z2T4vJSv8s1yZkGXzoUrAuUKnCBx0vZuE-MDGnmTF_YxhQoXobyvAyktswdE" ] }, "Body": "" } }, { "ID": "affb380cf86f173c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "60" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5In0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "485" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:40 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrF4q2mbuFoVeV9q22libc-FjfB1eDXSMYhNGZNU6sbaMWEKdc-8eXu1gtMLC7Ia9bSRU0oxgpIRR9516KZRcg7o_VGdrU1lliVPuSY9rYa4OsJymE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjA4MVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC4wODFaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "88123486ecd710ed", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJuYW1lIjoic29tZS1vYmoifQo=", "cGCusp668ZMwY59j94Srfg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:41 GMT" ], "Etag": [ "CNC/3Onx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrixhGvSHn6UzWmshHjh8Ny2NE4LW-gcPPW4dCm9dZTDfBwtENYMJra88jZlphQFcyabnQwTegZW9_6bL8KYNOsyYQYgdtEDvFFMQeJ9B_IXQbrsgI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC42MzhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiUjhVSExIMG84ZjFlTVhVRHRyMTZLZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTk0MDYzODY3MiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTkMvM09ueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvc29tZS1vYmovMTU1NjgzNTk0MDYzODY3Mi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTkMvM09ueC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjB6R3NGUT09IiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifQ==" } }, { "ID": "042e51e8b073dc93", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:41 GMT" ], "Etag": [ "CNC/3Onx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqTH44ERv_v2A5OmhnLVBFOkQ_bPdeDI-MNir5xjrZt1ybrczlk9GwseHZ-kt566XrMnuYGTaCkr4ImF__dpbt98CqMpmYkiJaR1vKcI1DC7o3Dbl8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC42MzhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiUjhVSExIMG84ZjFlTVhVRHRyMTZLZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTk0MDYzODY3MiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTkMvM09ueC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvc29tZS1vYmovMTU1NjgzNTk0MDYzODY3Mi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTkMvM09ueC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjB6R3NGUT09IiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBRT0ifQ==" } }, { "ID": "ed898d656784527a", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "83" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJ0ZW1wb3JhcnlIb2xkIjp0cnVlfQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3214" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:41 GMT" ], "Etag": [ "CNC/3Onx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Urh-jh9w3q8AC6TmG1NF_6JgV-Js74mV6EkB4ccrlZ1ZCQ9TlA4AhJ-J6rkqtJ9fKiy4YjT_l-TN6dQhnCwZvTUqoaJC-W-z6QQZywuQ1uX9a90PhU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC42MzhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDEuNTE5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiUjhVSExIMG84ZjFlTVhVRHRyMTZLZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTk0MDYzODY3MiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTkMvM09ueC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvc29tZS1vYmovMTU1NjgzNTk0MDYzODY3Mi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTkMvM09ueC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjB6R3NGUT09IiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0iLCJ0ZW1wb3JhcnlIb2xkIjp0cnVlfQ==" } }, { "ID": "9ddea19a0c44c449", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3214" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:41 GMT" ], "Etag": [ "CNC/3Onx/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoZVnUhVRVPu1unMjxNHQzZrlqTsVtPMZHc_YPTkvy18AAD3d_TOg9qTNAEv5NXUC5n0XF1sPedifaWR19a5w7dCMltRYfuJUfGxaMzyrvpqKbGjx4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0MC42MzhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDEuNTE5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiUjhVSExIMG84ZjFlTVhVRHRyMTZLZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqP2dlbmVyYXRpb249MTU1NjgzNTk0MDYzODY3MiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTkMvM09ueC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvc29tZS1vYmovMTU1NjgzNTk0MDYzODY3Mi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJvYmplY3QiOiJzb21lLW9iaiIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTQwNjM4NjcyIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTkMvM09ueC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjB6R3NGUT09IiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBST0iLCJ0ZW1wb3JhcnlIb2xkIjp0cnVlfQ==" } }, { "ID": "9b6c4955472bdb51", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "82" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJjb250ZW50VHlwZSI6ImZvbyJ9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3192" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:42 GMT" ], "Etag": [ "CNC/3Onx/eECEAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoybPBMseeVzkBPlzTObhT-eKnJ9TbsC15btCmXKMDvqgD5Uz4JclrgL9lBqMq09UjP8GL2_3zCDkfA0gJ8SHCDZbHEi1XYcuAUT7hmXazBL3IIMqc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Mi4xMjNaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJSOFVITEgwbzhmMWVNWFVEdHIxNktnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQwNjM4NjcyJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiMHpHc0ZRPT0iLCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSIsInRlbXBvcmFyeUhvbGQiOnRydWV9" } }, { "ID": "0227238a512229dc", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3192" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:42 GMT" ], "Etag": [ "CNC/3Onx/eECEAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up6PS1r6NaUKQ9158DD3cKWHqyParXLdcW8k7sToMskeTU6BjpajWENp3qNHqLMFvX9NrK78TIw31h_ANYkltj3vAQoYq2RG5C6ZB2LCvUIch96SMo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiMyIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Mi4xMjNaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJSOFVITEgwbzhmMWVNWFVEdHIxNktnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQwNjM4NjcyJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiMHpHc0ZRPT0iLCJldGFnIjoiQ05DLzNPbngvZUVDRUFNPSIsInRlbXBvcmFyeUhvbGQiOnRydWV9" } }, { "ID": "7a81946424736215", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "84" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJ0ZW1wb3JhcnlIb2xkIjpmYWxzZX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3193" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:42 GMT" ], "Etag": [ "CNC/3Onx/eECEAQ=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo1klBHpEl6qb-hfnVYr2KJLmo_3_1fgqlMYMBpBt23b-U9pF7bPcNEiJaMtrGEhZPQb9-QnqHiU8qPfmpNpSdy9KR41FwZm-89gyu3EtE5gq3J9-0" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsIm1ldGFnZW5lcmF0aW9uIjoiNCIsImNvbnRlbnRUeXBlIjoiZm9vIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQwLjYzOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Mi43MjFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDAuNjM4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJSOFVITEgwbzhmMWVNWFVEdHIxNktnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQwNjM4NjcyJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNOQy8zT254L2VFQ0VBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9zb21lLW9iai8xNTU2ODM1OTQwNjM4NjcyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDkvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOSIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDA2Mzg2NzIiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ05DLzNPbngvZUVDRUFRPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5L3NvbWUtb2JqLzE1NTY4MzU5NDA2Mzg2NzIvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwOS9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDA5Iiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0MDYzODY3MiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNOQy8zT254L2VFQ0VBUT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiMHpHc0ZRPT0iLCJldGFnIjoiQ05DLzNPbngvZUVDRUFRPSIsInRlbXBvcmFyeUhvbGQiOmZhbHNlfQ==" } }, { "ID": "7865e37b40b9ec66", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009/o/some-obj?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:43 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo2nfd81k4cBaY8ZFRGIu8G6DHyGUVAdIJCB65E8ZqqO9ADJIV4K22sQaOA8fqGL3jyi3tIszjBVsXHOFrCgca1vLXSpA1-3s2cn-MVhTKpzZ5tzY4" ] }, "Body": "" } }, { "ID": "fd9104ab049c0173", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0009?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:43 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqMqIYvjYuUxhnSLyoY-p5BYUiuZIX7cs418asOvABObfrQc8eXZpo-V4LSZVWWgt4CNoviMvFwcdC9sCTKCZU1H-9Ifcuf8lptTMZpiWMJjZfD-DY" ] }, "Body": "" } }, { "ID": "e735515a80a67931", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "105" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjM2MDAifX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "573" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:44 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqxx-CzGd9qn-QCqeE_iYOkeO93A0IpWx1voocTxhTrdkkBJonYBIWXeaEq3g-LNThw7j85IKVotWyBNZlHzqYSgBchb0DeXXetMqS8WBkY603Sa60" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQzLjgwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0My44MDRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiMzYwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI1OjQzLjgwNFoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9" } }, { "ID": "94bfaea89e1f47c2", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0010/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJuYW1lIjoic29tZS1vYmoifQo=", "29UJUEl2/QvM9FnDBFnPRA==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3245" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:44 GMT" ], "Etag": [ "CPXIv+vx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqLSIzBtq8Qn_3f51_hlfoIkcpamafGwB3U8er3K_mzANwxXyscBHWZhaxb2-3M2wOT6GZER6-zLAtdeeSNtSlUMHkHX77gocrZGYj103HA-AGjVSM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9zb21lLW9iai8xNTU2ODM1OTQ0MzU5MDI5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ0LjM1OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0NC4zNThaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDQuMzU4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJQYzFTWFEyUUk3MGxNNlZIN1F0NUFnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQ0MzU5MDI5JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDQzNTkwMjkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQWEl2K3Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9zb21lLW9iai8xNTU2ODM1OTQ0MzU5MDI5L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDQzNTkwMjkiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQWEl2K3Z4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoidUpwZFdRPT0iLCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSIsInJldGVudGlvbkV4cGlyYXRpb25UaW1lIjoiMjAxOS0wNS0wMlQyMzoyNTo0NC4zNThaIn0=" } }, { "ID": "7db6d4640ce21307", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0010/o/some-obj?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3245" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:44 GMT" ], "Etag": [ "CPXIv+vx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoUK3qzYL0xUcMKfWD6mmDZqRfnd8q7O14gBrKng7OYalNXZR3ZegpD1VyqjzW6bgQqFvLrtFjWXwPoJ4E78_nThYByR2n3Hm33ms2fvCdaRSOy1Qc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9zb21lLW9iai8xNTU2ODM1OTQ0MzU5MDI5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmoiLCJuYW1lIjoic29tZS1vYmoiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ0LjM1OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0NC4zNThaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NDQuMzU4WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJQYzFTWFEyUUk3MGxNNlZIN1F0NUFnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmo/Z2VuZXJhdGlvbj0xNTU2ODM1OTQ0MzU5MDI5JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL28vc29tZS1vYmovYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDQzNTkwMjkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9vL3NvbWUtb2JqL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQWEl2K3Z4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9zb21lLW9iai8xNTU2ODM1OTQ0MzU5MDI5L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvby9zb21lLW9iai9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsIm9iamVjdCI6InNvbWUtb2JqIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NDQzNTkwMjkiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3NvbWUtb2JqLzE1NTY4MzU5NDQzNTkwMjkvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9vL3NvbWUtb2JqL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwib2JqZWN0Ijoic29tZS1vYmoiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk0NDM1OTAyOSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQWEl2K3Z4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoidUpwZFdRPT0iLCJldGFnIjoiQ1BYSXYrdngvZUVDRUFFPSIsInJldGVudGlvbkV4cGlyYXRpb25UaW1lIjoiMjAxOS0wNS0wMlQyMzoyNTo0NC4zNThaIn0=" } }, { "ID": "cec800ec28205dab", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0010?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "25" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJyZXRlbnRpb25Qb2xpY3kiOm51bGx9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:45 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqAm9jtf7nMSv2Bbn_pFGaLCmlq2CtqUdGeEOyYrkllqiADBk9_xsJS3BufmzfGIdARRHN7jVwbeHKev2CHMyzWoGA8UxNGNIldPCC4oZ1dMPARKHk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQzLjgwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0NS4yMjZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "c787f6d5b23123a3", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0010/o/some-obj?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:45 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrgP5ghUeBxvXks4XlillwzLwfwyRGxt5y-FImGHSwZ-Meht6M0-keE0YTUG2Qy5hH5i1gpWPyGHXweFDyrk8a3QbDPnG5shDEoxzNOlMEsX6V8-4I" ] }, "Body": "" } }, { "ID": "144726e64e401a23", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0010?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:45 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpxuxvNJ3APW11H4y-qweAzn3ChIZ0eRjSetoSHkGwVvO7nMR17h5Hbj8I8zgOGjR7HPA201lDCw47ejD6kj1wCz3ZTIrUz-r-qjdm0vGGszQYFidQ" ] }, "Body": "" } }, { "ID": "eebfbd37f51a5cc6", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "103" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "571" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:46 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uox0foiLUu9KuEF-KVU8lIN_yUKAJsYEuwVqgSXvzFRGmzJtSZvFeNvMDS8W0aQ7c8YoI89qS_MxU8zBSBqcljYpIZe1NPIvkEFEG5K22RJkAuwmh8" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ2LjE3M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ni4xNzNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ni4xNzNaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "c7ddc04b5d29113a", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0011?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "47" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiMzYwMCJ9fQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2519" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:46 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpD4zsQLTflaR7g-z0FszOHvw5oXvxqdiyjlAnMwMcBcUEjidrpIGgpvmrz1EWi2AyWkdDCSY0l8ItQxYnWwSZt24jOxXBlzq-gCNrCCE6j0fJVGKw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ2LjE3M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ni44NjNaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiIzNjAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjU6NDYuMTczWiJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=" } }, { "ID": "e08a38dca4dda51f", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0011?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2519" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:47 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:25:47 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrsphQdkHT0ctCFLyPV1JRkq7cyQ7w1tvYmAWv-6tYsuThaMN-vkUJoTNz2gPKGy6jV0yqdbXaAlRlD_5n6GiQa-ULOyKLi-C0q8y25lfk7L6zROE4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ2LjE3M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ni44NjNaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDExL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiIzNjAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjU6NDYuMTczWiJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=" } }, { "ID": "fe586a68284be237", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "103" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "571" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:47 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpAjkPxULicnoY5wPnfrg-D7yzTbTzTZcUShEN8JSsqVMN758lI4DlkvFibNK9URhYVBH0xclTheAOO_CEDoVb5egvcF-WJqJ3SDisU2YPaZsohRro" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ3LjU2NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ny41NjVaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo0Ny41NjVaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "732c3421adfb99d8", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0012?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "47" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiMzYwMCJ9fQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2519" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:48 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UohfaTh8JFEjT7TTMwV7NkrcAsgkdpDyovvbjHJLNbXalzOWX3_HwhowBimaqZXhkuvBx1D38zsUZ5dEzigoyoXRJtgHfy7ClUrshBL_yMfPkZ4JE4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ3LjU2NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OC4yNzBaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiIzNjAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjU6NDcuNTY1WiJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=" } }, { "ID": "aebe46d0a31a6e95", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0012?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2519" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:48 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:25:48 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uop7c4AxllIcwFmLfqhIIaGP3Q9uHfmQoAm9LttwjQIvzHiJvu4fg_Q3UfNP8YbDuP97jLsG78JbCK68eSQv8ZHPp8kpzfdJcvOER0cs75wQ9gC7NA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ3LjU2NVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OC4yNzBaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiIzNjAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjU6NDcuNTY1WiJ9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=" } }, { "ID": "bea48b3667650bdd", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "103" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "571" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:49 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo1p1nEuvoUAqYHYa8wuU6qF64gN2JPCxLqqFEUiKXLgo9rwPH_btm63155v5hbuS6sow8cYEvsXVJthsJ1Zn8qfb05USodp1EvTTrt_m1rpJnIxdo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ5LjAxNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OS4wMTRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo0OS4wMTRaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "a951cae4048b1267", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0013?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "25" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJyZXRlbnRpb25Qb2xpY3kiOm51bGx9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:49 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpZAHhwxqSSY5MYFK1fdLLirRH41rc7W2YWSnn4CQZkbdR_98fRYjddtqZVfpEizqsZ1BNa5A7ENxQz7BwQSamASc8XAC5gyZp_pwi-Yu8l0XLSCpU" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ5LjAxNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OS42MjdaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "e7f0506408261db3", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0013?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:49 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:25:49 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UotOOFJlGACBcheGxpS8qxLlGsDT0xOhT_Cg1M_6DxUI16IiOu-YHaPvwzxilOKOrTvL8kRzcVUiNuFeS6rQExTmdK70I1IOH2d2BLOrMm1L5Int1g" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjQ5LjAxNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo0OS42MjdaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDEzL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTMvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxMyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "b2c4589e9b9b5ad2", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "103" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12201" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:50 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UoFdLKiYfqS-J3PXjvHGxpXtJwVnUB7Li8XrR-DTYkmyed-ZlUmUcmZFgGyIayuACtUWVYBcRbhYOKvgkfl8srE0OdJbc15OHWBttYqenraJ0MdXj8" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19" } }, { "ID": "836baafb4e98da80", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "103" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12201" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:51 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UpNuySlLo4SanUdFJK3SGoCidNgWEW4mUuFDGMLLSzY-UUA3TJtN5_FLoLq7et7d1YSUDlOoGZY4a_GdewGQtsUwGdbHLz-bopObpzPy160Wm3UMpg" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19" } }, { "ID": "281ffb73e66efd1f", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "103" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12201" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:52 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uo8PK9JysFiApLjDSbbo9GloKqKjLO8vr85RWGkeC_Q0iEQf7zu2mwQVeiuJ81pfdJCUja0HrhNG13sczI2XoflqlsWNFvdxHGjCBrvDObr-s6Y32U" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19" } }, { "ID": "515ecb8616d48a7f", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "103" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "571" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:55 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqF93J_Bpwg-_yefVpKWteSyWBSx9FqNm8MP5eZKqVfvDWpSF6EPZsISss7hNOkKMM5OuV8stlJIW2UAkzsSgkYOHx5fCwOwylbtqAyb8OlYJCHz6Q" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU1LjIwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1NS4yMDRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo1NS4yMDRaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "771e55d617425f26", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0014?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "25" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJyZXRlbnRpb25Qb2xpY3kiOm51bGx9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:55 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up6Slob_akPo2UWNmzCe-LD4cb-9DVTq_FPlNxA7mKVF6fBFks6gFnZ83BSajEU2qD8g14Y-pX20kbfoKf8XGR9pIW2xXH_oHCxsjspHZ2ARGePTMA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU1LjIwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1NS44MjVaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "9526aab2be8b214c", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0014?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:56 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:25:56 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UopNhdzHbHv4sXyk0r1owz7bkkPQwYIGbb3gRingbq7vgESKltWLIr9PDDIUNREfumEvZDfpxMineWYNzZ0qdOaI1QNYqXjnuxO6sCUDjBYEhr76uk" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU1LjIwNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1NS44MjVaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE0L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTQvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "0aabff8aa1cc1e9c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "103" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjYwIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "571" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:56 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpTj6zYv1NMHDI_ktA1d-p7HKq4YnJMxxI9nXubPfCMyIspOgya8HYibmvOMFwLtCPagnzRHe0HbmTCSqJpYMay0xYZstGSE_IUWRqI9lUhzq0Iqe4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1Ni4zNzRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiNjAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo1Ni4zNzRaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "05147b5b5fdd7882", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0015?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2517" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:56 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoshhz3RuOTlNgZ3gOLis_dSFBsqr7khyJCdWUD8BGk0_j-AHxA5etttVHuHTrUcDksF4LdtfJLhlVrAJe9PrGiYZ-Wy57j6tb7L6vc0qHoTvolIRg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1Ni4zNzRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI2MCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9" } }, { "ID": "7de8d497e7e1a76c", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0015?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2517" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:57 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:25:57 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up3mjbvLxwRDDhjg8GTGBNcJM7EraDydPsmD77oQcyYYGVlQnUqg0NQbezf4KQOoOHoEnC9jMR052e0olW3qi9KdAi4-qJEiKGI1rGivb5hnJnmU5o" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1Ni4zNzRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE1L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI2MCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI1OjU2LjM3NFoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9" } }, { "ID": "3876040740117531", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0015?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:57 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqGdmh-XzrU5d5VwRugwWr452hENxpWf1sEtNCDaGksLJ1taCgnEjL_0oAlELqirqyXLlw-frE8LYo1V37Pk1G3qvWGk9E1iSZV7uECOjsdE3JagK8" ] }, "Body": "" } }, { "ID": "39fb456e528c7081", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0014?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:57 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqKcAQsTdqHfiXj71c5kivJTwCNhY6xUQpZtaxywsmr1kNG5_MdJBsOvuLVbDSHKRIsG9tDxk_9Gz-7zaqP_pqke1aqKOFg9NeCU4ZqfjD0SBy0Q5Q" ] }, "Body": "" } }, { "ID": "3fdacef865a6fc39", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0013?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:58 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur0PIkQTUvOl8-6tC08mwiS3nBPydo1OYUeD6Q46ZrU6VkmpRwxc9MikGqJlsejuGZkyY_aaxUVKYGREjOF363tfkbII3of6pGFuQ8rINOf8uFV5ts" ] }, "Body": "" } }, { "ID": "2da48fa864dd9efe", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0012?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:58 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoWkbW_2n8KvRkdk7Lh_5eOVBjW6JvoW0i9LNQUHM-Df2H1QIbUYIwFnUGLt-bPfFa46Ur-v8Q76mU24KpjW7WIC_HVq4Q5H96pRYk7I6ggUsckTs0" ] }, "Body": "" } }, { "ID": "3ef26f9548e0aec4", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0011?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:25:59 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqZfOfnhYy6nk2TxHz3h1eMu_0KlczCaOb-xcAIBRoRgxk7Q67BqsT5fvb-vAky2phYzQWNHLTk-0T8V2tpPY4Hg23Ub9evuo6_YEndEVdiBRhTcFI" ] }, "Body": "" } }, { "ID": "8f3abbeca307cc5a", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "106" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "574" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:25:59 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqdSQK1TuFGAgs143LV6RLNjzfrsAl5vt-Jb_RQ4dcVGDzK8I29sKKrPmcY0rLIJuVIQar3mdRGhNLhqXp2xCKli28TFq4rtsIgiA4DxCtdVbajIhY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU5LjM2NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1OS4zNjRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNTo1OS4zNjRaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "bb92a1c4ecd9e884", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0016/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoic29tZS1vYmplY3QifQo=", "aGVsbG8gd29ybGQ=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3315" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:00 GMT" ], "Etag": [ "COup9/Lx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrRoCa6t1nTWVUrdfIXfyxZBI6PKBkzO24svoJRDEYMEsduIrzBpdDiX8mIUWSxcL8-pSRZgcDvy9_iHKpoVbiUNt4QhlG7zosGpa3WOk--YlBxjeM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdC8xNTU2ODM1OTU5OTUyNjE5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L28vc29tZS1vYmplY3QiLCJuYW1lIjoic29tZS1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk1OTk1MjYxOSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNTo1OS45NTJaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjU6NTkuOTUyWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU5Ljk1MloiLCJzaXplIjoiMTEiLCJtZDVIYXNoIjoiWHJZN3UrQWU3dENUeXlLN2oxck53dz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9vL3NvbWUtb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTk1OTk1MjYxOSZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdC8xNTU2ODM1OTU5OTUyNjE5L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9vL3NvbWUtb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTU5OTUyNjE5IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPdXA5L0x4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdC8xNTU2ODM1OTU5OTUyNjE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvby9zb21lLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NTk5NTI2MTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3VwOS9MeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvc29tZS1vYmplY3QvMTU1NjgzNTk1OTk1MjYxOS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L28vc29tZS1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTU5OTUyNjE5IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPdXA5L0x4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdC8xNTU2ODM1OTU5OTUyNjE5L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvby9zb21lLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NTk5NTI2MTkiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3VwOS9MeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6InlaUmxxZz09IiwiZXRhZyI6IkNPdXA5L0x4L2VFQ0VBRT0iLCJyZXRlbnRpb25FeHBpcmF0aW9uVGltZSI6IjIwMTktMDUtMDNUMjM6MjU6NTkuOTUyWiJ9" } }, { "ID": "8f2ac73db961f1d6", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0016/o/some-object?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "13884" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:00 GMT" ], "Expires": [ "Thu, 02 May 2019 22:26:00 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uok63dRFSkGv0Fum7yPhHf_AtYTWceX5_zkck648-jhWkyym1ezg2Og-LqKJ6nnZCW_gPZuU01OkZErKAQbL7mvQroCq8nEtNTEAosMxk9fJRKpYlc" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDAiLCJkZWJ1Z0luZm8iOiJjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVURU5USU9OX1BPTElDWV9OT1RfTUVUOiBPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE9iamVjdCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3NvbWUtb2JqZWN0JyBpcyBzdWJqZWN0IHRvIGJ1Y2tldCdzIHJldGVudGlvbiBwb2xpY3kgYW5kIGNhbm5vdCBiZSBkZWxldGVkLCBvdmVyd3JpdHRlbiBvciBhcmNoaXZlZCB1bnRpbCAyMDE5LTA1LTAzVDE2OjI1OjU5Ljk1MjIwODQyOC0wNzowMFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1GT1JCSURERU4sIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UkVURU5USU9OX1BPTElDWV9OT1RfTUVUOiBPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLm9iamVjdHMuRGVsZXRlT2JqZWN0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChEZWxldGVPYmplY3QuamF2YTo4OClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6MjUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLk9iamVjdHNEZWxlZ2F0b3IuZGVsZXRlKE9iamVjdHNEZWxlZ2F0b3IuamF2YToxMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE9iamVjdCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3NvbWUtb2JqZWN0JyBpcyBzdWJqZWN0IHRvIGJ1Y2tldCdzIHJldGVudGlvbiBwb2xpY3kgYW5kIGNhbm5vdCBiZSBkZWxldGVkLCBvdmVyd3JpdHRlbiBvciBhcmNoaXZlZCB1bnRpbCAyMDE5LTA1LTAzVDE2OjI1OjU5Ljk1MjIwODQyOC0wNzowMFxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1mb3JiaWRkZW4sIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkZPUkJJRERFTiwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlJFVEVOVElPTl9QT0xJQ1lfTk9UX01FVDogT2JqZWN0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvc29tZS1vYmplY3QnIGlzIHN1YmplY3QgdG8gYnVja2V0J3MgcmV0ZW50aW9uIHBvbGljeSBhbmQgY2Fubm90IGJlIGRlbGV0ZWQsIG92ZXJ3cml0dGVuIG9yIGFyY2hpdmVkIHVudGlsIDIwMTktMDUtMDNUMTY6MjU6NTkuOTUyMjA4NDI4LTA3OjAwXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1GT1JCSURERU4sIGVycm9yUHJvdG9Eb21haW49Z2RhdGEuQ29yZUVycm9yRG9tYWluLCBmaWx0ZXJlZE1lc3NhZ2U9bnVsbCwgbG9jYXRpb249bnVsbCwgbWVzc2FnZT1PYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDAsIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1udWxsLCBtZXNzYWdlPU9iamVjdCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3NvbWUtb2JqZWN0JyBpcyBzdWJqZWN0IHRvIGJ1Y2tldCdzIHJldGVudGlvbiBwb2xpY3kgYW5kIGNhbm5vdCBiZSBkZWxldGVkLCBvdmVyd3JpdHRlbiBvciBhcmNoaXZlZCB1bnRpbCAyMDE5LTA1LTAzVDE2OjI1OjU5Ljk1MjIwODQyOC0wNzowMCwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IE9iamVjdCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3NvbWUtb2JqZWN0JyBpcyBzdWJqZWN0IHRvIGJ1Y2tldCdzIHJldGVudGlvbiBwb2xpY3kgYW5kIGNhbm5vdCBiZSBkZWxldGVkLCBvdmVyd3JpdHRlbiBvciBhcmNoaXZlZCB1bnRpbCAyMDE5LTA1LTAzVDE2OjI1OjU5Ljk1MjIwODQyOC0wNzowMDogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlJFVEVOVElPTl9QT0xJQ1lfTk9UX01FVDogT2JqZWN0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvc29tZS1vYmplY3QnIGlzIHN1YmplY3QgdG8gYnVja2V0J3MgcmV0ZW50aW9uIHBvbGljeSBhbmQgY2Fubm90IGJlIGRlbGV0ZWQsIG92ZXJ3cml0dGVuIG9yIGFyY2hpdmVkIHVudGlsIDIwMTktMDUtMDNUMTY6MjU6NTkuOTUyMjA4NDI4LTA3OjAwXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkRlbGV0ZU9iamVjdC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoRGVsZXRlT2JqZWN0LmphdmE6ODgpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMub2JqZWN0cy5EZWxldGVPYmplY3QuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKERlbGV0ZU9iamVjdC5qYXZhOjI1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmRlbGV0ZShPYmplY3RzRGVsZWdhdG9yLmphdmE6MTEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBPYmplY3QgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9zb21lLW9iamVjdCcgaXMgc3ViamVjdCB0byBidWNrZXQncyByZXRlbnRpb24gcG9saWN5IGFuZCBjYW5ub3QgYmUgZGVsZXRlZCwgb3ZlcndyaXR0ZW4gb3IgYXJjaGl2ZWQgdW50aWwgMjAxOS0wNS0wM1QxNjoyNTo1OS45NTIyMDg0MjgtMDc6MDBcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAzLCJtZXNzYWdlIjoiT2JqZWN0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvc29tZS1vYmplY3QnIGlzIHN1YmplY3QgdG8gYnVja2V0J3MgcmV0ZW50aW9uIHBvbGljeSBhbmQgY2Fubm90IGJlIGRlbGV0ZWQsIG92ZXJ3cml0dGVuIG9yIGFyY2hpdmVkIHVudGlsIDIwMTktMDUtMDNUMTY6MjU6NTkuOTUyMjA4NDI4LTA3OjAwIn19" } }, { "ID": "5a7a0988789dfb17", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0016?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "25" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJyZXRlbnRpb25Qb2xpY3kiOm51bGx9Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:00 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrZIBPbBTYIUYYaBFrcXzNnp7uuC8DoPry45bX57PyfL7aM5a83NLxYnvWsXD62w3LrRVksNhJbrLnSL5e8ZS6b0Cto8ufh-V00gNrGI-CaTc4achc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI1OjU5LjM2NFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMC43NTZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "8410bda61aa0b6fd", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0016/o/some-object?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:01 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo2MOVFr2ZwvkwYm32qtqndRBhJnBc28nVBEBowKjIIxpOxiYcSef4wtz9sLTJ23PbXr1F8L_TfGwyShv5j1eTsQ-91OXU8Q8JEZtui9VVyK96j2D4" ] }, "Body": "" } }, { "ID": "7b024f33e16d850f", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0016?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:01 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpDkcsqcqPLSySgf13o9jWNafbKdVjSRqGNu3ZedvF7TlL9TBswdMMpcl0zQOHtvXWIrhrcZODr7RjRhHuvS8gJdMbnYeQDHrBCbiH6x9WrnaZ5uIQ" ] }, "Body": "" } }, { "ID": "33b0efc1b91cfb42", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "106" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "574" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:02 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpItvsNld0b1FGsjQgaVCDxW22UEra8vRGfkWtbDS7R2kMbHRPr0I6iPjzaQBOaa9-xUJxGO-JV6RhMlWwH2NY-FXY2-0lrkZiAzIL-tdFwkCwlF-Q" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "632b9a0387d9cff1", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0017?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2520" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:02 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:26:02 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpEVtrO8ed8TEHdpzyw857ZykloGKTT56atylmGnu682Y0VxI_T6SWN0JLFupJ_2Cu80ntiZttFSCBqwqFGfxVrRqsNnf0KBDyzqOH8eI-BaWPBXvE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9" } }, { "ID": "a32a5924f876577b", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0017/lockRetentionPolicy?alt=json\u0026ifMetagenerationMatch=1\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "639" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:03 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpsYL8RxAKClLw1KRdSSIORQHYKKf_HMml2vtwDOFrh0kTYDzhGEgX2RJAPQKOP2-70q7ZZ2VfkkGz12tmTiRgSuwB2dM3xxZxZucASROVeoit9Shg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMy41NDRaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIiwiZWZmZWN0aXZlVGltZSI6IjIwMTktMDUtMDJUMjI6MjY6MDEuOTA4WiIsImlzTG9ja2VkIjp0cnVlfSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9" } }, { "ID": "718775f2f8320cfd", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0017?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2536" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:03 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:26:03 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UprHupyIuGJCYeUCPKigfkARZRkCc2Jz051KFrXK7YS0FbdKxNe3r20jon1ejkooHsAtcXQOi1tDV41Ob9dJ3Zoyj7stDImJ0eQriMO0WLLQ__-V54" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMy41NDRaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI2OjAxLjkwOFoiLCJpc0xvY2tlZCI6dHJ1ZX0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBST0ifQ==" } }, { "ID": "2f4b1104fa94954b", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0017?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "47" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiMzYwMCJ9fQo=" ] }, "Response": { "StatusCode": 403, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "13774" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:04 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrafLpm39Fg6hBYYi9lSEizIWUdMduEDQykOeT9Bch6uf9BNQUO9sOAnWpTklSpNac1yW_kSNj-JR8LMmVLirC2kqG2DcQdE-Hg5dtVBkVZ4Xhjlc8" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImZvcmJpZGRlbiIsIm1lc3NhZ2UiOiJDYW5ub3QgcmVkdWNlIHJldGVudGlvbiBkdXJhdGlvbiBvZiBhIGxvY2tlZCBSZXRlbnRpb24gUG9saWN5IGZvciBidWNrZXQgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNycuIiwiZGVidWdJbmZvIjoiY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkFDQ0VTU19ERU5JRUQ6IENhbm5vdCByZWR1Y2UgcmV0ZW50aW9uIGR1cmF0aW9uIG9mIGEgbG9ja2VkIFJldGVudGlvbiBQb2xpY3kgZm9yIGJ1Y2tldCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3Jy5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuVXBkYXRlQW5kUGF0Y2hCdWNrZXQudXBkYXRlQnVja2V0KFVwZGF0ZUFuZFBhdGNoQnVja2V0LmphdmE6MTE5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuUGF0Y2hCdWNrZXQucGF0Y2hCdWNrZXQoUGF0Y2hCdWNrZXQuamF2YToxOTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5QYXRjaEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUGF0Y2hCdWNrZXQuamF2YToxNDEpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5QYXRjaEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUGF0Y2hCdWNrZXQuamF2YTo0Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci51cGRhdGUoQnVja2V0c0RlbGVnYXRvci5qYXZhOjEwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxOSBtb3JlXG5cbmNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkZhdWx0OiBJbW11dGFibGVFcnJvckRlZmluaXRpb257YmFzZT1GT1JCSURERU4sIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQ2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5VcGRhdGVBbmRQYXRjaEJ1Y2tldC51cGRhdGVCdWNrZXQoVXBkYXRlQW5kUGF0Y2hCdWNrZXQuamF2YToxMTkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5QYXRjaEJ1Y2tldC5wYXRjaEJ1Y2tldChQYXRjaEJ1Y2tldC5qYXZhOjE5Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChQYXRjaEJ1Y2tldC5qYXZhOjE0MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChQYXRjaEJ1Y2tldC5qYXZhOjQ2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLnVwZGF0ZShCdWNrZXRzRGVsZWdhdG9yLmphdmE6MTAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDYW5ub3QgcmVkdWNlIHJldGVudGlvbiBkdXJhdGlvbiBvZiBhIGxvY2tlZCBSZXRlbnRpb24gUG9saWN5IGZvciBidWNrZXQgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNycuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE5IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPWZvcmJpZGRlbiwgaW50ZXJuYWxSZWFzb249UmVhc29ue2FyZ3VtZW50cz17fSwgY2F1c2U9bnVsbCwgY29kZT1nZGF0YS5Db3JlRXJyb3JEb21haW4uRk9SQklEREVOLCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6QUNDRVNTX0RFTklFRDogQ2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLlxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5VcGRhdGVBbmRQYXRjaEJ1Y2tldC51cGRhdGVCdWNrZXQoVXBkYXRlQW5kUGF0Y2hCdWNrZXQuamF2YToxMTkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5QYXRjaEJ1Y2tldC5wYXRjaEJ1Y2tldChQYXRjaEJ1Y2tldC5qYXZhOjE5Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChQYXRjaEJ1Y2tldC5qYXZhOjE0MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChQYXRjaEJ1Y2tldC5qYXZhOjQ2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLnVwZGF0ZShCdWNrZXRzRGVsZWdhdG9yLmphdmE6MTAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDYW5ub3QgcmVkdWNlIHJldGVudGlvbiBkdXJhdGlvbiBvZiBhIGxvY2tlZCBSZXRlbnRpb24gUG9saWN5IGZvciBidWNrZXQgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNycuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE5IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Rk9SQklEREVOLCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9Q2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9Q2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLiwgcmVhc29uPWZvcmJpZGRlbiwgcnBjQ29kZT00MDN9IENhbm5vdCByZWR1Y2UgcmV0ZW50aW9uIGR1cmF0aW9uIG9mIGEgbG9ja2VkIFJldGVudGlvbiBQb2xpY3kgZm9yIGJ1Y2tldCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3Jy46IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpBQ0NFU1NfREVOSUVEOiBDYW5ub3QgcmVkdWNlIHJldGVudGlvbiBkdXJhdGlvbiBvZiBhIGxvY2tlZCBSZXRlbnRpb24gUG9saWN5IGZvciBidWNrZXQgJ2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNycuXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlVwZGF0ZUFuZFBhdGNoQnVja2V0LnVwZGF0ZUJ1Y2tldChVcGRhdGVBbmRQYXRjaEJ1Y2tldC5qYXZhOjExOSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLlBhdGNoQnVja2V0LnBhdGNoQnVja2V0KFBhdGNoQnVja2V0LmphdmE6MTk2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuUGF0Y2hCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFBhdGNoQnVja2V0LmphdmE6MTQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuUGF0Y2hCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFBhdGNoQnVja2V0LmphdmE6NDYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IudXBkYXRlKEJ1Y2tldHNEZWxlZ2F0b3IuamF2YToxMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENhbm5vdCByZWR1Y2UgcmV0ZW50aW9uIGR1cmF0aW9uIG9mIGEgbG9ja2VkIFJldGVudGlvbiBQb2xpY3kgZm9yIGJ1Y2tldCAnZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3Jy5cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTkgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDAzLCJtZXNzYWdlIjoiQ2Fubm90IHJlZHVjZSByZXRlbnRpb24gZHVyYXRpb24gb2YgYSBsb2NrZWQgUmV0ZW50aW9uIFBvbGljeSBmb3IgYnVja2V0ICdnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcnLiJ9fQ==" } }, { "ID": "a8964565736a4805", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "106" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12201" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:04 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrNbiNCNtu8DhS-gNXfoe4R9DFKEVzknZ0g6YoI0JdvwH6P199oVJ2oaJwh9WXMte6frhDr_vJo1_PlxLhezMnUTJzMYZgPlPWdU1QN9imk3hXgawE" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19" } }, { "ID": "49648eb4e4e2ddda", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "106" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12201" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:05 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UplUHmGCg4wOKtpKVz2KH0cn-th8s-KXQR62bOkAF1pV1zIZJvsoI_tURcFttkyHks8g05Hln5fT4Ej_O-Lx6JCTovYYwhhHIK7AAcialHMj5fPHk4" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19" } }, { "ID": "42cf12714cf13289", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "106" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12201" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:07 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UrcjWbo0pc_i_GQTU2WE6YR0XhWYMGRPJutu1MQXo6XbRKJAYhzNK4p2-_gCqZ6BvNGncUP1UZNoTrXsFFGt1RRTRR3DS9XNiws0gt9YQdp_I8dqqM" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19" } }, { "ID": "4f0fdb3eb607f33b", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "106" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==" ] }, "Response": { "StatusCode": 429, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12201" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:11 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Up0EsbUXQesAgz95sFt6OzWRDj5WAXqEpYaqHgGvCClYnBGvjX8eQmor80UQOCIDzT6v9ZAtOPVhFIqkJG6rV0-CDXiLAnr4gwDrPkqgezvm8PQTaY" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6InVzYWdlTGltaXRzIiwicmVhc29uIjoicmF0ZUxpbWl0RXhjZWVkZWQiLCJtZXNzYWdlIjoiVGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVRPT19NQU5ZX1JFUVVFU1RTLCBjYXRlZ29yeT1RVU9UQV9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpQUk9KRUNUX0JVQ0tFVF9PUF9SQVRFX1RPT19ISUdIOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6MTg0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YTo0Milcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5pbnNlcnQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjk1KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBDcmVhdGluZyBidWNrZXRzIHRvbyBxdWlja2x5LCBwbGVhc2Ugc2xvdyBkb3duXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPXVzYWdlTGltaXRzLCBleHRlbmRlZEhlbHA9bnVsbCwgaHR0cEhlYWRlcnM9e30sIGh0dHBTdGF0dXM9dG9vTWFueVJlcXVlc3RzLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWNsb3VkLmJpZ3N0b3JlLmFwaS5CaWdzdG9yZUVycm9yRG9tYWluLkNMSUVOVF9RVU9UQV9FWENFRURFRCwgY3JlYXRlZEJ5QmFja2VuZD10cnVlLCBkZWJ1Z01lc3NhZ2U9Y29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OlBST0pFQ1RfQlVDS0VUX09QX1JBVEVfVE9PX0hJR0g6IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuSW5zZXJ0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChJbnNlcnRCdWNrZXQuamF2YToxODQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjQyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmluc2VydChCdWNrZXRzRGVsZWdhdG9yLmphdmE6OTUpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IENyZWF0aW5nIGJ1Y2tldHMgdG9vIHF1aWNrbHksIHBsZWFzZSBzbG93IGRvd25cblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuLCBlcnJvclByb3RvQ29kZT1DTElFTlRfUVVPVEFfRVhDRUVERUQsIGVycm9yUHJvdG9Eb21haW49Y2xvdWQuYmlnc3RvcmUuYXBpLkJpZ3N0b3JlRXJyb3JEb21haW4sIGZpbHRlcmVkTWVzc2FnZT1udWxsLCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2UuYnVja2V0Lm5hbWUsIG1lc3NhZ2U9VGhlIHByb2plY3QgZXhjZWVkZWQgdGhlIHJhdGUgbGltaXQgZm9yIGNyZWF0aW5nIGFuZCBkZWxldGluZyBidWNrZXRzLiwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZS5idWNrZXQubmFtZSwgbWVzc2FnZT1UaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuLCByZWFzb249cmF0ZUxpbWl0RXhjZWVkZWQsIHJwY0NvZGU9NDI5fSBUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuOiBjb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6UFJPSkVDVF9CVUNLRVRfT1BfUkFURV9UT09fSElHSDogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50b1JwYzNFeGNlcHRpb24oQmlnc3RvcmVFeGNlcHRpb24uamF2YToxNDcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5JbnNlcnRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEluc2VydEJ1Y2tldC5qYXZhOjE4NClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkluc2VydEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoSW5zZXJ0QnVja2V0LmphdmE6NDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IuaW5zZXJ0KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YTo5NSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uUnBjUmVjZWl2ZXIubGFtYmRhJHByb2Nlc3NSZXF1ZXN0QXN5bmMkNChScGNSZWNlaXZlci5qYXZhOjIwMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5pc29sYXRpb24uQXN5bmNFeGVjdXRvci5sYW1iZGEkc3VibWl0JDAoQXN5bmNFeGVjdXRvci5qYXZhOjI1Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KENvbnRleHRSdW5uYWJsZS5qYXZhOjUwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZSQxLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozOSlcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo3Milcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KEdlbmVyaWNDb250ZXh0Q2FsbGJhY2suamF2YTo2NClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM1KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDkpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvciRXb3JrZXIucnVuKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjYyNClcblx0YXQgamF2YS5sYW5nLlRocmVhZC5ydW4oVGhyZWFkLmphdmE6NzQ4KVxuQ2F1c2VkIGJ5OiBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbjogQ3JlYXRpbmcgYnVja2V0cyB0b28gcXVpY2tseSwgcGxlYXNlIHNsb3cgZG93blxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG5cblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRXJyb3JDb2xsZWN0b3IudG9GYXVsdChFcnJvckNvbGxlY3Rvci5qYXZhOjU0KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUVycm9yQ29udmVydGVyLnRvRmF1bHQoUm9zeUVycm9yQ29udmVydGVyLmphdmE6NjcpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyNTkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5SGFuZGxlciQyLmNhbGwoUm9zeUhhbmRsZXIuamF2YToyMzkpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5EaXJlY3RFeGVjdXRvci5leGVjdXRlKERpcmVjdEV4ZWN1dG9yLmphdmE6MzApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5leGVjdXRlTGlzdGVuZXIoQWJzdHJhY3RGdXR1cmUuamF2YToxMTQzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuY29tcGxldGUoQWJzdHJhY3RGdXR1cmUuamF2YTo5NjMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5zZXQoQWJzdHJhY3RGdXR1cmUuamF2YTo3MzEpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLnV0aWwuQ2FsbGFibGVGdXR1cmUucnVuKENhbGxhYmxlRnV0dXJlLmphdmE6NjIpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci50aHJlYWQuVGhyZWFkVHJhY2tlcnMkVGhyZWFkVHJhY2tpbmdSdW5uYWJsZS5ydW4oVGhyZWFkVHJhY2tlcnMuamF2YToxMjYpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuSW5Db250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjQ1Mylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnNlcnZlci5Db21tb25Nb2R1bGUkQ29udGV4dENhcnJ5aW5nRXhlY3V0b3JTZXJ2aWNlJDEucnVuSW5Db250ZXh0KENvbW1vbk1vZHVsZS5qYXZhOjgwMilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZSQxLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NjApXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoVHJhY2VDb250ZXh0LmphdmE6MzE5KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0KFRyYWNlQ29udGV4dC5qYXZhOjMxMSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDU3KVxuXHRhdCBjb20uZ29vZ2xlLmdzZS5pbnRlcm5hbC5EaXNwYXRjaFF1ZXVlSW1wbCRXb3JrZXJUaHJlYWQucnVuKERpc3BhdGNoUXVldWVJbXBsLmphdmE6NDAzKVxuIn1dLCJjb2RlIjo0MjksIm1lc3NhZ2UiOiJUaGUgcHJvamVjdCBleGNlZWRlZCB0aGUgcmF0ZSBsaW1pdCBmb3IgY3JlYXRpbmcgYW5kIGRlbGV0aW5nIGJ1Y2tldHMuIn19" } }, { "ID": "a5a8b8af13be21cf", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "106" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwicmV0ZW50aW9uUG9saWN5Ijp7InJldGVudGlvblBlcmlvZCI6IjkwMDAwIn19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "574" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:15 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpF7Lqxvm1dNC6q_v81ZB1Ui9c2ZLJ3GXLX6Y6UNZN1nbkF78c0J3NwXavHF1cMFZ5oP8ufCnmCLg9vQHM6tfs2ih8YxQSfE4D3AxGsvBaGNP3VUMo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE1LjA5N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNS4wOTdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNjoxNS4wOTdaIn0sInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "e1dbaeed8c6d1ffb", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0018/lockRetentionPolicy?alt=json\u0026ifMetagenerationMatch=0\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "0" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 412, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Content-Length": [ "12155" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:16 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Ur4dRXLSTXYf9VXr3eOCMfuLBwDLvNQMXwIYjwEuSFQO_p-SxZQXQJ7I_VA0T5Hn8gnnEZIqLV3vLCnurXr0cyHDEMpCdxWOiIiqsXlgkbcLKf78to" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6ImNvbmRpdGlvbk5vdE1ldCIsIm1lc3NhZ2UiOiJQcmVjb25kaXRpb24gRmFpbGVkIiwibG9jYXRpb25UeXBlIjoiaGVhZGVyIiwibG9jYXRpb24iOiJJZi1NYXRjaCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogZXhwZWN0ZWQgQnVja2V0TWV0YWRhdGEubWV0YWRhdGFfZ2VuZXJhdGlvbjogMCBhY3R1YWw6IDFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuTG9ja1JldGVudGlvblBvbGljeS5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTG9ja1JldGVudGlvblBvbGljeS5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkxvY2tSZXRlbnRpb25Qb2xpY3kuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExvY2tSZXRlbnRpb25Qb2xpY3kuamF2YTo1Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5sb2NrUmV0ZW50aW9uUG9saWN5KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGV4cGVjdGVkIEJ1Y2tldE1ldGFkYXRhLm1ldGFkYXRhX2dlbmVyYXRpb246IDAgYWN0dWFsOiAxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPVBSRUNPTkRJVElPTl9GQUlMRUQsIGNhdGVnb3J5PVVTRVJfRVJST1IsIGNhdXNlPW51bGwsIGRlYnVnSW5mbz1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5DT1JSRUNUX01FVEFfR0VORVJBVElPTl9TUEVDSUZJRUQ6IGV4cGVjdGVkIEJ1Y2tldE1ldGFkYXRhLm1ldGFkYXRhX2dlbmVyYXRpb246IDAgYWN0dWFsOiAxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkxvY2tSZXRlbnRpb25Qb2xpY3kuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExvY2tSZXRlbnRpb25Qb2xpY3kuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5Mb2NrUmV0ZW50aW9uUG9saWN5LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMb2NrUmV0ZW50aW9uUG9saWN5LmphdmE6NTcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IubG9ja1JldGVudGlvblBvbGljeShCdWNrZXRzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBleHBlY3RlZCBCdWNrZXRNZXRhZGF0YS5tZXRhZGF0YV9nZW5lcmF0aW9uOiAwIGFjdHVhbDogMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGRvbWFpbj1nbG9iYWwsIGV4dGVuZGVkSGVscD1udWxsLCBodHRwSGVhZGVycz17fSwgaHR0cFN0YXR1cz1wcmVjb25kaXRpb25GYWlsZWQsIGludGVybmFsUmVhc29uPVJlYXNvbnthcmd1bWVudHM9e30sIGNhdXNlPW51bGwsIGNvZGU9Z2RhdGEuQ29yZUVycm9yRG9tYWluLkNPTkRJVElPTl9OT1RfTUVULCBjcmVhdGVkQnlCYWNrZW5kPXRydWUsIGRlYnVnTWVzc2FnZT1jb20uZ29vZ2xlLm5ldC5ycGMzLlJwY0V4Y2VwdGlvbjogY2xvdWQuYmlnc3RvcmUuUmVzcG9uc2VDb2RlLkVycm9yQ29kZTo6SU5DT1JSRUNUX01FVEFfR0VORVJBVElPTl9TUEVDSUZJRUQ6IGV4cGVjdGVkIEJ1Y2tldE1ldGFkYXRhLm1ldGFkYXRhX2dlbmVyYXRpb246IDAgYWN0dWFsOiAxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkxvY2tSZXRlbnRpb25Qb2xpY3kuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExvY2tSZXRlbnRpb25Qb2xpY3kuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5Mb2NrUmV0ZW50aW9uUG9saWN5LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMb2NrUmV0ZW50aW9uUG9saWN5LmphdmE6NTcpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChSZXF1ZXN0SGFuZGxlci5qYXZhOjMxMClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlKFJlcXVlc3RIYW5kbGVyLmphdmE6MjU2KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLkJ1Y2tldHNEZWxlZ2F0b3IubG9ja1JldGVudGlvblBvbGljeShCdWNrZXRzRGVsZWdhdG9yLmphdmE6MTA5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBleHBlY3RlZCBCdWNrZXRNZXRhZGF0YS5tZXRhZGF0YV9nZW5lcmF0aW9uOiAwIGFjdHVhbDogMVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMTIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93UnBjM09uRXJyb3IoQmlnc3RvcmVFeGNlcHRpb24uamF2YTozMjApXG5cdC4uLiAxNyBtb3JlXG4sIGVycm9yUHJvdG9Db2RlPUNPTkRJVElPTl9OT1RfTUVULCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPW51bGwsIG1lc3NhZ2U9bnVsbCwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWhlYWRlcnMuSWYtTWF0Y2gsIG1lc3NhZ2U9UHJlY29uZGl0aW9uIEZhaWxlZCwgcmVhc29uPWNvbmRpdGlvbk5vdE1ldCwgcnBjQ29kZT00MTJ9IFByZWNvbmRpdGlvbiBGYWlsZWQ6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpJTkNPUlJFQ1RfTUVUQV9HRU5FUkFUSU9OX1NQRUNJRklFRDogZXhwZWN0ZWQgQnVja2V0TWV0YWRhdGEubWV0YWRhdGFfZ2VuZXJhdGlvbjogMCBhY3R1YWw6IDFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuTG9ja1JldGVudGlvblBvbGljeS5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoTG9ja1JldGVudGlvblBvbGljeS5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkxvY2tSZXRlbnRpb25Qb2xpY3kuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKExvY2tSZXRlbnRpb25Qb2xpY3kuamF2YTo1Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5sb2NrUmV0ZW50aW9uUG9saWN5KEJ1Y2tldHNEZWxlZ2F0b3IuamF2YToxMDkpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IGV4cGVjdGVkIEJ1Y2tldE1ldGFkYXRhLm1ldGFkYXRhX2dlbmVyYXRpb246IDAgYWN0dWFsOiAxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQxMiwibWVzc2FnZSI6IlByZWNvbmRpdGlvbiBGYWlsZWQifX0=" } }, { "ID": "814dffcceacb3bd8", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026kmsKeyName=projects%2Fdeklerk-sandbox%2Flocations%2Fglobal%2FkeyRings%2Fgo-integration-test%2FcryptoKeys%2Fkey1\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoia21zIn0K", "bXkgc2VjcmV0" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3234" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:17 GMT" ], "Etag": [ "CMGB+Prx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Upis-8CwJYvr7glFAMnec_3T3YDojfTz3O_uICK5tQQmfJF2_rFtNnbqopcxBL5L3aKyoYe4zOLoqN4_MFFrhYKDm6Tmrl3rytuh0ymlCV15VZKyrQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2ttcyIsIm5hbWUiOiJrbXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3Njc0MTA1NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNi43NDBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTYuNzQwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE2Ljc0MFoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zP2dlbmVyYXRpb249MTU1NjgzNTk3Njc0MTA1NyZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9rbXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc2NzQxMDU3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzY3NDEwNTciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTUdCK1ByeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEva21zLzE1NTY4MzU5NzY3NDEwNTcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2ttcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc2NzQxMDU3IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzY3NDEwNTciLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTUdCK1ByeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlVJNzg1QT09IiwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0iLCJrbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEvY3J5cHRvS2V5VmVyc2lvbnMvMSJ9" } }, { "ID": "9b05110f2b59351b", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/kms", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "9" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 02 May 2019 22:26:17 GMT" ], "Etag": [ "\"-CMGB+Prx/eECEAE=\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:26:16 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Encryption-Kms-Key-Name": [ "projects/deklerk-sandbox/locations/global/keyRings/go-integration-test/cryptoKeys/key1/cryptoKeyVersions/1" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:26:16 GMT" ], "X-Goog-Generation": [ "1556835976741057" ], "X-Goog-Hash": [ "crc32c=UI785A==", "md5=AAPQS46TrnMYnqiKAbagtQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "9" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpZ6aSiGPoeZKANPoMPgXhL1QD5nbILvzv8v3sOMId95Y65wOPssqesNA1MXzp86JA4Qa5gAMxxx5cnY4z3-tCUnvsKoIHn3NXOK2U6ZSRLzYNeQeU" ] }, "Body": "bXkgc2VjcmV0" } }, { "ID": "011b81453e7060ac", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/kms?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3234" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:17 GMT" ], "Etag": [ "CMGB+Prx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uq5t8aexqBqqxnLJFK9mWmGdVrFfd3gaCGOKfGJMO1phB3ATnxt67-cLVpELRy1gNnjNOK7-zMzWCR6yV1v5PQcv3lccINA--Q92RoECpvBON-QKtc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2ttcyIsIm5hbWUiOiJrbXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3Njc0MTA1NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNi43NDBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTYuNzQwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE2Ljc0MFoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zP2dlbmVyYXRpb249MTU1NjgzNTk3Njc0MTA1NyZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9rbXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc2NzQxMDU3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzY3NDEwNTciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTUdCK1ByeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEva21zLzE1NTY4MzU5NzY3NDEwNTcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2ttcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc2NzQxMDU3IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9rbXMvMTU1NjgzNTk3Njc0MTA1Ny91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28va21zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzY3NDEwNTciLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTUdCK1ByeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlVJNzg1QT09IiwiZXRhZyI6IkNNR0IrUHJ4L2VFQ0VBRT0iLCJrbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEvY3J5cHRvS2V5VmVyc2lvbnMvMSJ9" } }, { "ID": "0dbd0a37c735be56", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/kms?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:17 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur_RD6un7NLXQpzwRBFEfZdp982qhfEzyvw8f_P1Lx1wKv8sUid99lQ7Nba5Rs73IJfv3qHXjQfUDHjWclvCAcS91nMboiexn-FwiMrUuKqCQ_d__4" ] }, "Body": "" } }, { "ID": "1b81fc72e201f2a2", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Encryption-Algorithm": [ "AES256" ], "X-Goog-Encryption-Key": [ "CLEARED" ], "X-Goog-Encryption-Key-Sha256": [ "Io4lnOPU+EThO0X0nq7mNEXB1rWxZsBI4L37pBmyfDc=" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoiY3NlayJ9Cg==", "bXkgc2VjcmV0" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3262" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:17 GMT" ], "Etag": [ "CKCxsfvx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqRTb3RtqG1gIL-ENbVZC8nWKRHapQP78uVzv4yyL2t7N8cA5jEBWa014iJALicWO06KthvAMPLctgZCJ2UvPqo72IO4_LheEfTr13-_h43M-roUyc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jc2VrLzE1NTY4MzU5Nzc2ODEwNTYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jc2VrIiwibmFtZSI6ImNzZWsiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3NzY4MTA1NiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNy42ODBaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTcuNjgwWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE3LjY4MFoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3Nlaz9nZW5lcmF0aW9uPTE1NTY4MzU5Nzc2ODEwNTYmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3Nlay8xNTU2ODM1OTc3NjgxMDU2L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NzZWsvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNzZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3NzY4MTA1NiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDS0N4c2Z2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3Nlay8xNTU2ODM1OTc3NjgxMDU2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jc2VrL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3NlayIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc3NjgxMDU2IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0tDeHNmdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NzZWsvMTU1NjgzNTk3NzY4MTA1Ni9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3Nlay9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNzZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3NzY4MTA1NiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDS0N4c2Z2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3Nlay8xNTU2ODM1OTc3NjgxMDU2L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jc2VrL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3NlayIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc3NjgxMDU2IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0tDeHNmdngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJVSTc4NUE9PSIsImV0YWciOiJDS0N4c2Z2eC9lRUNFQUU9IiwiY3VzdG9tZXJFbmNyeXB0aW9uIjp7ImVuY3J5cHRpb25BbGdvcml0aG0iOiJBRVMyNTYiLCJrZXlTaGEyNTYiOiJJbzRsbk9QVStFVGhPMFgwbnE3bU5FWEIxcld4WnNCSTRMMzdwQm15ZkRjPSJ9fQ==" } }, { "ID": "6da27052d0dabd22", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/csek/rewriteTo/b/go-integration-test-20190502-80633403432013-0001/o/cmek?alt=json\u0026destinationKmsKeyName=projects%2Fdeklerk-sandbox%2Flocations%2Fglobal%2FkeyRings%2Fgo-integration-test%2FcryptoKeys%2Fkey1\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ], "X-Goog-Copy-Source-Encryption-Algorithm": [ "AES256" ], "X-Goog-Copy-Source-Encryption-Key": [ "CLEARED" ], "X-Goog-Copy-Source-Encryption-Key-Sha256": [ "Io4lnOPU+EThO0X0nq7mNEXB1rWxZsBI4L37pBmyfDc=" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3372" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:18 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpKmOV156VWN4edUkrNip1urAj8WTpDcgGTS520rVGilFT71KrZLZQxUMKloxtxKx5R6V9pUvIqYym68P8lQ8RSc5rEE_D1KlH-NyPgybiPERbxYZ4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiOSIsIm9iamVjdFNpemUiOiI5IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY21lay8xNTU2ODM1OTc4MTI2NDc3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21layIsIm5hbWUiOiJjbWVrIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzgxMjY0NzciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTguMTI2WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE4LjEyNloiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOC4xMjZaIiwic2l6ZSI6IjkiLCJtZDVIYXNoIjoiQUFQUVM0NlRybk1ZbnFpS0FiYWd0UT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NtZWs/Z2VuZXJhdGlvbj0xNTU2ODM1OTc4MTI2NDc3JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NtZWsvMTU1NjgzNTk3ODEyNjQ3Ny9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jbWVrL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjbWVrIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzgxMjY0NzciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NtZWsvMTU1NjgzNTk3ODEyNjQ3Ny9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21lay9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNtZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNJM0p6UHZ4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jbWVrLzE1NTY4MzU5NzgxMjY0NzcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NtZWsvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjbWVrIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5NzgxMjY0NzciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NtZWsvMTU1NjgzNTk3ODEyNjQ3Ny91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21lay9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNtZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNJM0p6UHZ4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiVUk3ODVBPT0iLCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSIsImttc0tleU5hbWUiOiJwcm9qZWN0cy9kZWtsZXJrLXNhbmRib3gvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9nby1pbnRlZ3JhdGlvbi10ZXN0L2NyeXB0b0tleXMva2V5MS9jcnlwdG9LZXlWZXJzaW9ucy8xIn19" } }, { "ID": "6ff8a4be1ed6bda3", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/cmek", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "9" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:26:18 GMT" ], "Etag": [ "\"-CI3JzPvx/eECEAE=\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:26:18 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Encryption-Kms-Key-Name": [ "projects/deklerk-sandbox/locations/global/keyRings/go-integration-test/cryptoKeys/key1/cryptoKeyVersions/1" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:26:18 GMT" ], "X-Goog-Generation": [ "1556835978126477" ], "X-Goog-Hash": [ "crc32c=UI785A==", "md5=AAPQS46TrnMYnqiKAbagtQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "9" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqDR7RHLf_CQraIBM5Z3vCUxSJndE0E6FBOLFBqmYvMntnrQyVIfxwuTE6BtHL4b8oQszU6rIycc72JMUjiGRM_XoGdjsk-WhsbBmL_3c3x5H1s4bs" ] }, "Body": "bXkgc2VjcmV0" } }, { "ID": "51f1995364e644ed", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/cmek?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3271" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:18 GMT" ], "Etag": [ "CI3JzPvx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpM1hbkOXC-oSxvoqjP8s2MpxREJEpzVp2TTYj-6B8467MLYSA-yrWs9UoGwRGQUCJTR76e-qAmQnbzGsFGT31Kc3qjevb8SM0MynLHL9GhOMkm72w" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jbWVrLzE1NTY4MzU5NzgxMjY0NzciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jbWVrIiwibmFtZSI6ImNtZWsiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOC4xMjZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTguMTI2WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE4LjEyNloiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21laz9nZW5lcmF0aW9uPTE1NTY4MzU5NzgxMjY0NzcmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY21lay8xNTU2ODM1OTc4MTI2NDc3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NtZWsvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNtZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDSTNKelB2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY21lay8xNTU2ODM1OTc4MTI2NDc3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jbWVrL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY21layIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc4MTI2NDc3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NtZWsvMTU1NjgzNTk3ODEyNjQ3Ny9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY21lay9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNtZWsiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3ODEyNjQ3NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDSTNKelB2eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY21lay8xNTU2ODM1OTc4MTI2NDc3L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jbWVrL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY21layIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc4MTI2NDc3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0kzSnpQdngvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJVSTc4NUE9PSIsImV0YWciOiJDSTNKelB2eC9lRUNFQUU9Iiwia21zS2V5TmFtZSI6InByb2plY3RzL2Rla2xlcmstc2FuZGJveC9sb2NhdGlvbnMvZ2xvYmFsL2tleVJpbmdzL2dvLWludGVncmF0aW9uLXRlc3QvY3J5cHRvS2V5cy9rZXkxL2NyeXB0b0tleVZlcnNpb25zLzEifQ==" } }, { "ID": "8972a840dc3d95a5", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/csek?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:18 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoTmNCzrFh_7cFaryet35nLbKqM6dyo7nvsyZApHIj6fLKcMDb9ZA-_TRNjGOLNFjjoD0IZ1YOz9P-ftNchBFkjWDTaFzBjbHmryCc9JInU3wd_DLw" ] }, "Body": "" } }, { "ID": "1e28b278fe3e0a66", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/cmek?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:18 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqrX5OILXadm6r5e8fLyuLEhQncM5jrmmDaOesSqraquvQbXXKhTqNJ63RYU3qj90M3FLjwnAOz8oOBTQQDOq2sRqUkbpBbJzYj82Rp3Rd9VLpNns0" ] }, "Body": "" } }, { "ID": "d1ac5d123ee4bae6", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "200" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEifSwibG9jYXRpb24iOiJVUyIsIm5hbWUiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "609" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:19 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpbajYTiCBBelYuwcqOs7_O-SyJbcV6WGwYhC4JCMmeImLlFLb93JyaiYrSp-201iYZTIdQ2VViFR_Emxe2Z7b4jV_G-0o2xzkqnkSnz0-Qcw_q0Wc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOS4wNjdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImVuY3J5cHRpb24iOnsiZGVmYXVsdEttc0tleU5hbWUiOiJwcm9qZWN0cy9kZWtsZXJrLXNhbmRib3gvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9nby1pbnRlZ3JhdGlvbi10ZXN0L2NyeXB0b0tleXMva2V5MSJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9" } }, { "ID": "d035cdb991d0fabb", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2555" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:19 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:26:19 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoi5SKd4TdRXg-INW-U3pKcPA2ioBWIc2zdC5W3J4efS9iZ0EKFNqprjQ-NGEK_3wSDGezk4Al3Dd4JovGxXSnH73rIw22S_R__XRrpTQmYpTiNFGQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOS4wNjdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEifSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "672cb2bcc1ed4ee2", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0019/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJuYW1lIjoia21zIn0K", "bXkgc2VjcmV0" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3234" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:20 GMT" ], "Etag": [ "CLHMt/zx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Upyst1aH69iaN9J4055oX7H2yReN5TADIX11Vul8KakNuYZbJ7yXm1GBdvCDVB-IPTvbhzELJWgfurnIHxGpzKJszLO70n58xMnVbSLsHX1J3W02Lw" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9vL2ttcyIsIm5hbWUiOiJrbXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3OTg3OTk4NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOS44NzlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTkuODc5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5Ljg3OVoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zP2dlbmVyYXRpb249MTU1NjgzNTk3OTg3OTk4NSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvby9rbXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc5ODc5OTg1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5Iiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5Nzk4Nzk5ODUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTEhNdC96eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkva21zLzE1NTY4MzU5Nzk4Nzk5ODUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9vL2ttcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc5ODc5OTg1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5Iiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5Nzk4Nzk5ODUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTEhNdC96eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlVJNzg1QT09IiwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0iLCJrbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEvY3J5cHRvS2V5VmVyc2lvbnMvMSJ9" } }, { "ID": "c037ecafa6249395", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0019/kms", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "9" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 02 May 2019 22:26:20 GMT" ], "Etag": [ "\"-CLHMt/zx/eECEAE=\"" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:26:19 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "X-Goog-Encryption-Kms-Key-Name": [ "projects/deklerk-sandbox/locations/global/keyRings/go-integration-test/cryptoKeys/key1/cryptoKeyVersions/1" ], "X-Goog-Generation": [ "1556835979879985" ], "X-Goog-Hash": [ "crc32c=UI785A==", "md5=AAPQS46TrnMYnqiKAbagtQ==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "9" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrrQOFSgCkxAaKVPAQhz0ohMN6irPryraHLjWDEQgV3dNEwc5cxqcDDRChzx6_HR1Z_NPlm3vmjFCJcNK-2rAz-tmvVS8w36Q5U9Lc2wAGUgL_joX4" ] }, "Body": "bXkgc2VjcmV0" } }, { "ID": "fc3eda648104f042", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019/o/kms?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3234" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:20 GMT" ], "Etag": [ "CLHMt/zx/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqHPSbutJRXX-6i05QnH_4UizrPft0fsGc3_ISDNmXQ4C3RPbEAnNfS1Ren0j3k2z8zxk9AV1WZQCWiKG9D5A8gZAZESFxbSZyjbBH8jkLEsEX54NQ" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9vL2ttcyIsIm5hbWUiOiJrbXMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk3OTg3OTk4NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxOS44NzlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MTkuODc5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5Ljg3OVoiLCJzaXplIjoiOSIsIm1kNUhhc2giOiJBQVBRUzQ2VHJuTVlucWlLQWJhZ3RRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zP2dlbmVyYXRpb249MTU1NjgzNTk3OTg3OTk4NSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvby9rbXMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc5ODc5OTg1IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5Iiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5Nzk4Nzk5ODUiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTEhNdC96eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkva21zLzE1NTY4MzU5Nzk4Nzk5ODUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9vL2ttcy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsIm9iamVjdCI6ImttcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTc5ODc5OTg1IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9rbXMvMTU1NjgzNTk3OTg3OTk4NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L28va21zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5Iiwib2JqZWN0Ijoia21zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5Nzk4Nzk5ODUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTEhNdC96eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlVJNzg1QT09IiwiZXRhZyI6IkNMSE10L3p4L2VFQ0VBRT0iLCJrbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTEvY3J5cHRvS2V5VmVyc2lvbnMvMSJ9" } }, { "ID": "13283bc1ba20f019", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019/o/kms?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:20 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo2b3OtHWqpsRWxurpcGgrEtM10ZDdsrIa2z0nFsO-P4G3RAGYMTVMR0MCtwLDePrKyhfnsK-d9T5AIcRpeaIe8Z40Qm7gkZP4Fdi9jXd6ceYe5Iwc" ] }, "Body": "" } }, { "ID": "ca2255586aa4aeab", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "126" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTIifX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2555" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:21 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur05CMGbsLFprbwWYFSeE3I5dKFdFUzO--ImyAzkLt6ueNGpMDviyX6c1S4F6t1bqXTSnyQXXQzgugu8JoecrL3-1eJOPsqnN-OBMubntJCblkyWqE" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMS4zMzZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTIifSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=" } }, { "ID": "e1c336910a43425f", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2555" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:21 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Thu, 02 May 2019 22:26:21 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Urcwbg5Z9C0rFvSTWYj4FxF27ooV0028Cm-yme-BrfmvK0dWsRkfRQEMWylWwokcmM2kIvLKEiucJlvDLHvnbJPB_HjH3zF2Lm8xCwV_9gPN42QDeo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMS4zMzZaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBST0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJlbmNyeXB0aW9uIjp7ImRlZmF1bHRLbXNLZXlOYW1lIjoicHJvamVjdHMvZGVrbGVyay1zYW5kYm94L2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3MvZ28taW50ZWdyYXRpb24tdGVzdC9jcnlwdG9LZXlzL2tleTIifSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0=" } }, { "ID": "581a002b653f595d", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "20" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJlbmNyeXB0aW9uIjpudWxsfQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:22 GMT" ], "Etag": [ "CAM=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Upv2LawTqc_eDVGR_hv2jSCyEA77H33uMkPevVxUUDKj1u4a9IWOH2f1oMXpU52-49Jg17SUSoJUJai1Ueff3ahN58GC9FCxwJt5v5xOHI3SytFjpo" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE5LjA2N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMi4xMjRaIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FNPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE5L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTkvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQU09In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQU09In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBTT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBTT0ifQ==" } }, { "ID": "a0db97c641f3f17c", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0019?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:22 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo15eoN1OrQFM6eqxJcuNFl7Wfr6x_VvJ0ENBlhhC_Hedf5al2OplGnNslWnRQT9RVs92RVLevZ_F_ohutgnNsUbK1PVsR04UnQ_A6ea3C0ZLy8FkI" ] }, "Body": "" } }, { "ID": "ca84fc3a71a55ea8", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026predefinedAcl=authenticatedRead\u0026predefinedDefaultObjectAcl=publicRead\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "60" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIn0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1468" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:23 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrnCCRKNh19fdBAL3pyCzbtLnG7z20pSwSZKl9uTerD6o6-B5mB79mqZRIbXNcUmcpTdpxTreKjvsHK3Y9EKq_5fkzBPInDj8YkjbGViIpd1ldSots" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjIzLjEwNloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMy4xMDZaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FsbEF1dGhlbnRpY2F0ZWRVc2VycyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9hY2wvYWxsQXV0aGVudGljYXRlZFVzZXJzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwiZW50aXR5IjoiYWxsQXV0aGVudGljYXRlZFVzZXJzIiwicm9sZSI6IlJFQURFUiIsImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiYWxsVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "ed54d82686b4d390", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "1468" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:23 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:26:23 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpXJh1_aAMuDVjYxLZJdwqAt7OwZdmTkc0_5wf_LshhNm_So0q87o7gJ31T58vp1b0_CucSecAyyyOLUbYTDrWDDTZGMkZBpfx1iBArjRtBcud1IgI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjIzLjEwNloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyMy4xMDZaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FsbEF1dGhlbnRpY2F0ZWRVc2VycyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9hY2wvYWxsQXV0aGVudGljYXRlZFVzZXJzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwiZW50aXR5IjoiYWxsQXV0aGVudGljYXRlZFVzZXJzIiwicm9sZSI6IlJFQURFUiIsImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoiYWxsVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "224aee5425ffb86e", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020?alt=json\u0026predefinedAcl=private\u0026predefinedDefaultObjectAcl=authenticatedRead\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "33" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJhY2wiOltdLCJkZWZhdWx0T2JqZWN0QWNsIjpbXX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1113" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:24 GMT" ], "Etag": [ "CAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoknWPZdEFnvKZGCGO_Z26ZaKeXNdBzc6k6qqlbGdQXVEtPvLPR2oYtKCXsqDgFBjMw4wfWVXwDfmcc5u5kBAxshpuzKGgCp8UOxv-i_Rml56mzrOI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjIzLjEwNloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNC40MjVaIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6ImFsbEF1dGhlbnRpY2F0ZWRVc2VycyIsInJvbGUiOiJSRUFERVIiLCJldGFnIjoiQ0FJPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FJPSJ9" } }, { "ID": "b6a80796e20baf03", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o?alt=json\u0026predefinedAcl=authenticatedRead\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJuYW1lIjoicHJpdmF0ZSJ9Cg==", "aGVsbG8=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1995" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:25 GMT" ], "Etag": [ "CNDq5v7x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqMfGdFW2xElqOJcP4q5XeDjVehJr4FmjcFPij-Y31f_168_Jgb6zibcWxCOJzrV1aUYYTXZW9DMX-BcvfJi6YXoBCPpN23EhrGQyY7tHSb0SVurGY" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9wcml2YXRlLzE1NTY4MzU5ODQ4NDgyMDgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlIiwibmFtZSI6InByaXZhdGUiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4NDg0ODIwOCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNC44NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjQuODQ3WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI0Ljg0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL28vcHJpdmF0ZT9nZW5lcmF0aW9uPTE1NTY4MzU5ODQ4NDgyMDgmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJpdmF0ZS8xNTU2ODM1OTg0ODQ4MjA4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwib2JqZWN0IjoicHJpdmF0ZSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg0ODQ4MjA4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ05EcTV2N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL3ByaXZhdGUvMTU1NjgzNTk4NDg0ODIwOC9hbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlL2FjbC9hbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJvYmplY3QiOiJwcml2YXRlIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODQ4NDgyMDgiLCJlbnRpdHkiOiJhbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNORHE1djd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ05EcTV2N3gvZUVDRUFFPSJ9" } }, { "ID": "4812f1e0e907256e", "Request": { "Method": "PATCH", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/private?alt=json\u0026predefinedAcl=private\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "62" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAifQo=" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1529" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:25 GMT" ], "Etag": [ "CNDq5v7x/eECEAI=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqTjsMMIlet4CWUmGoB3TuGzhTHXlDwuUe1SAQO8H2vmbTo2QYYV_WozfDO2NyZpsA9LCtgwwthwxeEeEG182WQTTe3xLWnsVjqPZx-iho8JAgI66U" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9wcml2YXRlLzE1NTY4MzU5ODQ4NDgyMDgiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlIiwibmFtZSI6InByaXZhdGUiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4NDg0ODIwOCIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNC44NDdaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjUuNDIzWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI0Ljg0N1oiLCJzaXplIjoiNSIsIm1kNUhhc2giOiJYVUZBS3J4TEtuYTVjWjJSRUJmRmtnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL28vcHJpdmF0ZT9nZW5lcmF0aW9uPTE1NTY4MzU5ODQ4NDgyMDgmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvcHJpdmF0ZS8xNTU2ODM1OTg0ODQ4MjA4L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9wcml2YXRlL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwib2JqZWN0IjoicHJpdmF0ZSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg0ODQ4MjA4IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ05EcTV2N3gvZUVDRUFJPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJtbkc3VEE9PSIsImV0YWciOiJDTkRxNXY3eC9lRUNFQUk9In0=" } }, { "ID": "969763dc18755620", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/private/rewriteTo/b/go-integration-test-20190502-80633403432013-0020/o/dst?alt=json\u0026destinationPredefinedAcl=publicRead\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "3" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "e30K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "2017" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:25 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoNk9xKdyuh-I4RkIXqQxMF4A82DZ9b2HYZOdVK7ELOsnMYBqOmrqsY5hzZJsLXMZCZ6zOSzCeefQZuTgYHwyd-jAttJ4QoA1lDk0HTwZqigIfpjCc" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNyZXdyaXRlUmVzcG9uc2UiLCJ0b3RhbEJ5dGVzUmV3cml0dGVuIjoiNSIsIm9iamVjdFNpemUiOiI1IiwiZG9uZSI6dHJ1ZSwicmVzb3VyY2UiOnsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvZHN0LzE1NTY4MzU5ODU4NTAyNjkiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9kc3QiLCJuYW1lIjoiZHN0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODU4NTAyNjkiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjUuODQ5WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI1Ljg0OVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNS44NDlaIiwic2l6ZSI6IjUiLCJtZDVIYXNoIjoiWFVGQUtyeExLbmE1Y1oyUkVCZkZrZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9vL2RzdD9nZW5lcmF0aW9uPTE1NTY4MzU5ODU4NTAyNjkmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvZHN0LzE1NTY4MzU5ODU4NTAyNjkvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9vL2RzdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsIm9iamVjdCI6ImRzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg1ODUwMjY5IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0ozL28vL3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2RzdC8xNTU2ODM1OTg1ODUwMjY5L2FsbFVzZXJzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL28vZHN0L2FjbC9hbGxVc2VycyIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMCIsIm9iamVjdCI6ImRzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg1ODUwMjY5IiwiZW50aXR5IjoiYWxsVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNKMy9vLy94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoibW5HN1RBPT0iLCJldGFnIjoiQ0ozL28vL3gvZUVDRUFFPSJ9fQ==" } }, { "ID": "8db7e2a6b620e794", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/comp/compose?alt=json\u0026destinationPredefinedAcl=authenticatedRead\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "130" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJkZXN0aW5hdGlvbiI6eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAifSwic291cmNlT2JqZWN0cyI6W3sibmFtZSI6InByaXZhdGUifSx7Im5hbWUiOiJkc3QifV19Cg==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "1906" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:26 GMT" ], "Etag": [ "CJGwwP/x/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpqjCYxNFNTu3V1H_kV5WJxkbEYE9I3H5fYjfGMPO7n6C9NJstYZGcIh6xVA5RAxMCwP1PdzXITgTI1m2vm5xP5nhzLVRHKhder2qzYFGsAooH-kG0" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMC9jb21wLzE1NTY4MzU5ODYzMTUyODEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9jb21wIiwibmFtZSI6ImNvbXAiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4NjMxNTI4MSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyNi4zMTRaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjYuMzE0WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI2LjMxNFoiLCJzaXplIjoiMTAiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL28vY29tcD9nZW5lcmF0aW9uPTE1NTY4MzU5ODYzMTUyODEmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvY29tcC8xNTU2ODM1OTg2MzE1MjgxL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9jb21wL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwIiwib2JqZWN0IjoiY29tcCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg2MzE1MjgxIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0pHd3dQL3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIwL2NvbXAvMTU1NjgzNTk4NjMxNTI4MS9hbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAvby9jb21wL2FjbC9hbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjAiLCJvYmplY3QiOiJjb21wIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODYzMTUyODEiLCJlbnRpdHkiOiJhbGxBdXRoZW50aWNhdGVkVXNlcnMiLCJyb2xlIjoiUkVBREVSIiwiZXRhZyI6IkNKR3d3UC94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiL1JDT2dnPT0iLCJjb21wb25lbnRDb3VudCI6MiwiZXRhZyI6IkNKR3d3UC94L2VFQ0VBRT0ifQ==" } }, { "ID": "72a0ce58c513f6d5", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/comp?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:26 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpWOQtHF0cKNME8sTEm9vbS9KKKLLK9afxka1b6TTVGxDjCQ4qAdnA9zshsfVFVKK5hNS10aABAQog_gjYCZTXbbsF4bQNBM0i4R7bK2r7saocPtFo" ] }, "Body": "" } }, { "ID": "111b5a296b726631", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/dst?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:26 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqPsYXABoYOnGueMXiIvH9AntIPEf4xc6i18Nnr_XEYBxy-3LSK9klIcNyfSB7we4lgbctsiYA2e2WWBJlfqk1GnK6YA2fj-e3IiPbKwBwTSLjr1Jk" ] }, "Body": "" } }, { "ID": "27e4065cd2000d43", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020/o/private?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:27 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpMPK_b_vcRkSIj1t37L47as9idfpbrNWqzirdNBLwoaGDMPlbjatMzjLThnYRNwk9CqTNQ5H8eoKFbunpe5TMktUo_FHyI7rryoUhbCpkbytRrTeM" ] }, "Body": "" } }, { "ID": "cccb109f5fba2a3a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0020?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:27 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoVAiJOaePqfycNhiwbkPOptOqgpe9Tvo0jo1aW2nviozj4-QcjTtnGGyhcdrZ8QTxT-KHPo-saYS9ESC_6osYhChJOCi8b9nXtuqH0BqlvywXs9FE" ] }, "Body": "" } }, { "ID": "cfab6af30981f62b", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/projects/deklerk-sandbox/serviceAccount?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "116" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:28 GMT" ], "Expires": [ "Thu, 02 May 2019 22:26:28 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrDBTBzZwm7GH6Jklv6hzuaZaO3JdgliJk8zLZkVNDqwDO7tYP-c06rzrTj03llkWuV_l1k9w2tbUcGG2Rtv-1MdozY6pktTutDMLfyhyHe1DaEIys" ] }, "Body": "eyJlbWFpbF9hZGRyZXNzIjoic2VydmljZS00OTYxNjk2MDE3MTRAZ3MtcHJvamVjdC1hY2NvdW50cy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImtpbmQiOiJzdG9yYWdlI3NlcnZpY2VBY2NvdW50In0=" } }, { "ID": "677e783b9aea8c15", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW4iLCJuYW1lIjoic29tZS1vYmplY3QifQo=", "vcVTjdWWssp9XFk0D3Nk5w==" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3262" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:28 GMT" ], "Etag": [ "CPryt4Dy/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrdWRt6oMzDM98VpA0VDmWRuNvox2ZBw6ZpjbyOFDKCFKgJ92jsLkF8v4M4UUxaTUVpmr8iElUTld7Q2g5_MZSbRatDE2zVgaY-769Ppq7Nx6f0HAg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QiLCJuYW1lIjoic29tZS1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4ODI3MzUzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyOC4yNzNaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjguMjczWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI4LjI3M1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidEhhY2ZTS2ZCeUMrLytjbEc3cStqdz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTk4ODI3MzUzMCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUHJ5dDREeS9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc29tZS1vYmplY3QvMTU1NjgzNTk4ODI3MzUzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUHJ5dDREeS9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlNtMWdLdz09IiwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifQ==" } }, { "ID": "ff3c05fe02cd38ac", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/some-object", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=60" ], "Content-Length": [ "16" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:26:28 GMT" ], "Etag": [ "\"b4769c7d229f0720beffe7251bbabe8f\"" ], "Expires": [ "Thu, 02 May 2019 22:27:28 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:26:28 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:26:28 GMT" ], "X-Goog-Generation": [ "1556835988273530" ], "X-Goog-Hash": [ "crc32c=Sm1gKw==", "md5=tHacfSKfByC+/+clG7q+jw==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "16" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqn6PsKCJsyZAhI_JtSOcVKs7SWuqYsoprQTUagoZXqu1CHWyBc1TzWfUyF9iv5VBS4iZPP5qz0Lf3b51p8O36Sud2-QS2zDg9FKhtm1uBFKLpcTOs" ] }, "Body": "vcVTjdWWssp9XFk0D3Nk5w==" } }, { "ID": "d1c7cc7c0e1d2829", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/some-object?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3262" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:28 GMT" ], "Etag": [ "CPryt4Dy/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqluzdkA1sUAJQJZodwWmM7SP7tNoX2JJjDiqHTy3XtjEqiVDNpI0whWTFJJH4caozRYjJPjTb6_ywm82dnAiYEo-YCknhlvkWexfTq1BM9MRWwQeg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QiLCJuYW1lIjoic29tZS1vYmplY3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4ODI3MzUzMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyOC4yNzNaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjguMjczWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI4LjI3M1oiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoidEhhY2ZTS2ZCeUMrLytjbEc3cStqdz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTk4ODI3MzUzMCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUHJ5dDREeS9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc29tZS1vYmplY3QvMTU1NjgzNTk4ODI3MzUzMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJzb21lLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUHJ5dDREeS9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlNtMWdLdz09IiwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifQ==" } }, { "ID": "951f74cbe6b30b67", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2571" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:28 GMT" ], "Etag": [ "CA0=" ], "Expires": [ "Thu, 02 May 2019 22:26:28 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoMRpk7F0qXPvUV4uNPdV7VhfUO2Mm-qPBbx3VV92y1wRyElPF1kbRNEGJ1KqbIW5w2XozD7IzjxBx4KevqcPxZr0_E1iU1_NASedJ4lZj4EFoP9UI" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyNS41MjdaIiwibWV0YWdlbmVyYXRpb24iOiIxMyIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0EwPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQTA9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0EwPSJ9" } }, { "ID": "aadc7916a3fc24ad", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0021?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11805" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Expires": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2UqhoAeZtt8ffiWaPr6J0LEaVR3vjerqtJ7gMM9BObOkz_6MtctDuS_s8-DZRxtTZsGfMDtekIKG2v8p2_sb3MxvTgeLhgO4vqvJNIszTaMjjyQcEdY" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPU5PVF9GT1VORCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPW5vdEZvdW5kLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5OT1RfRk9VTkQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5idWNrZXRzLkdldEJ1Y2tldC5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoR2V0QnVja2V0LmphdmE6MTA0KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YTozMylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5mcmFtZXdvcmsuUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKFJlcXVlc3RIYW5kbGVyLmphdmE6MzEwKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGUoUmVxdWVzdEhhbmRsZXIuamF2YToyNTYpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uQnVja2V0c0RlbGVnYXRvci5nZXQoQnVja2V0c0RlbGVnYXRvci5qYXZhOjgzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5yZXNvdXJjZV9pZC5uYW1lLCBtZXNzYWdlPW51bGwsIHVubmFtZWRBcmd1bWVudHM9W119LCBsb2NhdGlvbj1lbnRpdHkucmVzb3VyY2VfaWQubmFtZSwgbWVzc2FnZT1Ob3QgRm91bmQsIHJlYXNvbj1ub3RGb3VuZCwgcnBjQ29kZT00MDR9IE5vdCBGb3VuZDogY29tLmdvb2dsZS5uZXQucnBjMy5ScGNFeGNlcHRpb246IGNsb3VkLmJpZ3N0b3JlLlJlc3BvbnNlQ29kZS5FcnJvckNvZGU6OkJVQ0tFVF9OT1RfRk9VTkQ6IE5vIHN1Y2ggYnVja2V0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udG9ScGMzRXhjZXB0aW9uKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MTQ3KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmhhbmRsZXJzLmJ1Y2tldHMuR2V0QnVja2V0LmhhbmRsZVJlcXVlc3RSZWNlaXZlZChHZXRCdWNrZXQuamF2YToxMDQpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uaGFuZGxlcnMuYnVja2V0cy5HZXRCdWNrZXQuaGFuZGxlUmVxdWVzdFJlY2VpdmVkKEdldEJ1Y2tldC5qYXZhOjMzKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5CdWNrZXRzRGVsZWdhdG9yLmdldChCdWNrZXRzRGVsZWdhdG9yLmphdmE6ODMpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLlJwY1JlY2VpdmVyLmxhbWJkYSRwcm9jZXNzUmVxdWVzdEFzeW5jJDQoUnBjUmVjZWl2ZXIuamF2YToyMDIpXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuaXNvbGF0aW9uLkFzeW5jRXhlY3V0b3IubGFtYmRhJHN1Ym1pdCQwKEFzeW5jRXhlY3V0b3IuamF2YToyNTMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChDb250ZXh0UnVubmFibGUuamF2YTo1MClcblx0YXQgY29tLmdvb2dsZS5jb21tb24uY29udGV4dC5Db250ZXh0UnVubmFibGUkMS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzkpXG5cdGF0IGlvLmdycGMuQ29udGV4dC5ydW4oQ29udGV4dC5qYXZhOjU2NSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkN1cnJlbnRDb250ZXh0LnJ1bkluQ29udGV4dChDdXJyZW50Q29udGV4dC5qYXZhOjIwNClcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLkdlbmVyaWNDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NzIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChHZW5lcmljQ29udGV4dENhbGxiYWNrLmphdmE6NjQpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlLnJ1bihDb250ZXh0UnVubmFibGUuamF2YTozNSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcihUaHJlYWRQb29sRXhlY3V0b3IuamF2YToxMTQ5KVxuXHRhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IkV29ya2VyLnJ1bihUaHJlYWRQb29sRXhlY3V0b3IuamF2YTo2MjQpXG5cdGF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0OClcbkNhdXNlZCBieTogY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb246IE5vIHN1Y2ggYnVja2V0OiBnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjFcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzEyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmNvbW1vbi5CaWdzdG9yZUV4Y2VwdGlvbi50aHJvd1JwYzNPbkVycm9yKEJpZ3N0b3JlRXhjZXB0aW9uLmphdmE6MzIwKVxuXHQuLi4gMTcgbW9yZVxuXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5jb3JlLkVycm9yQ29sbGVjdG9yLnRvRmF1bHQoRXJyb3JDb2xsZWN0b3IuamF2YTo1NClcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lFcnJvckNvbnZlcnRlci50b0ZhdWx0KFJvc3lFcnJvckNvbnZlcnRlci5qYXZhOjY3KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjU5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIucmVzdC5hZGFwdGVyLnJvc3kuUm9zeUhhbmRsZXIkMi5jYWxsKFJvc3lIYW5kbGVyLmphdmE6MjM5KVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRGlyZWN0RXhlY3V0b3IuZXhlY3V0ZShEaXJlY3RFeGVjdXRvci5qYXZhOjMwKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuZXhlY3V0ZUxpc3RlbmVyKEFic3RyYWN0RnV0dXJlLmphdmE6MTE0Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmNvbXBsZXRlKEFic3RyYWN0RnV0dXJlLmphdmE6OTYzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUuc2V0KEFic3RyYWN0RnV0dXJlLmphdmE6NzMxKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS51dGlsLkNhbGxhYmxlRnV0dXJlLnJ1bihDYWxsYWJsZUZ1dHVyZS5qYXZhOjYyKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIudGhyZWFkLlRocmVhZFRyYWNrZXJzJFRocmVhZFRyYWNraW5nUnVubmFibGUucnVuKFRocmVhZFRyYWNrZXJzLmphdmE6MTI2KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bkluQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTo0NTMpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5zZXJ2ZXIuQ29tbW9uTW9kdWxlJENvbnRleHRDYXJyeWluZ0V4ZWN1dG9yU2VydmljZSQxLnJ1bkluQ29udGV4dChDb21tb25Nb2R1bGUuamF2YTo4MDIpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUkMS5ydW4oVHJhY2VDb250ZXh0LmphdmE6NDYwKVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHROb1VucmVmKFRyYWNlQ29udGV4dC5qYXZhOjMxOSlcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRBYnN0cmFjdFRyYWNlQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dChUcmFjZUNvbnRleHQuamF2YTozMTEpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkVHJhY2VDb250ZXh0UnVubmFibGUucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ1Nylcblx0YXQgY29tLmdvb2dsZS5nc2UuaW50ZXJuYWwuRGlzcGF0Y2hRdWV1ZUltcGwkV29ya2VyVGhyZWFkLnJ1bihEaXNwYXRjaFF1ZXVlSW1wbC5qYXZhOjQwMylcbiJ9XSwiY29kZSI6NDA0LCJtZXNzYWdlIjoiTm90IEZvdW5kIn19" } }, { "ID": "03b45b7eac939177", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage-library-test-bucket/Caf%C3%A9", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Etag": [ "\"ade43306cb39336d630e101af5fb51b4\"" ], "Expires": [ "Thu, 02 May 2019 23:26:29 GMT" ], "Last-Modified": [ "Fri, 24 Mar 2017 20:04:38 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1490385878535828" ], "X-Goog-Hash": [ "crc32c=fN3yZg==", "md5=reQzBss5M21jDhAa9ftRtA==" ], "X-Goog-Metageneration": [ "2" ], "X-Goog-Storage-Class": [ "MULTI_REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "20" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpFU2KyS5OA-bAy_MovHXHg5zJZ2kznc6tgTTrSjilrNHiw0NimPHZApcRXOS_ejrSSy8nIn02xipxUWxvHM3ru5IYhJRTeBZxhlq6_XQVsATkvink" ] }, "Body": "Tm9ybWFsaXphdGlvbiBGb3JtIEM=" } }, { "ID": "725883eeccd4b42c", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/upload/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026prettyPrint=false\u0026projection=full\u0026uploadType=multipart", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "multipart/related", "BodyParts": [ "eyJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJuYW1lIjoiemVybyJ9Cg==", "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "3128" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Etag": [ "CKyp9oDy/eECEAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_single_post_uploads" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UruPh9tBADr1LSQWFlj1C4tjlS6uwlcy_MVRYaTGD4e_qEUlq0iXJx6ns3JHbH7I9olH7aSJpDW6VQcV5EdLwjQMecgA7qKhxzLoYFW4BZdEXbUrro" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLzE1NTY4MzU5ODkyOTYzMDAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvIiwibmFtZSI6Inplcm8iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4OTI5NjMwMCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyOS4yOTVaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjkuMjk1WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI5LjI5NVoiLCJzaXplIjoiMCIsIm1kNUhhc2giOiIxQjJNMlk4QXNnVHBnQW1ZN1BoQ2ZnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVybz9nZW5lcmF0aW9uPTE1NTY4MzU5ODkyOTYzMDAmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby8xNTU2ODM1OTg5Mjk2MzAwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8vYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4OTI5NjMwMCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDS3lwOW9EeS9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby8xNTU2ODM1OTg5Mjk2MzAwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiemVybyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg5Mjk2MzAwIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0t5cDlvRHkvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3plcm8vMTU1NjgzNTk4OTI5NjMwMC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4OTI5NjMwMCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDS3lwOW9EeS9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby8xNTU2ODM1OTg5Mjk2MzAwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiemVybyIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg5Mjk2MzAwIiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ0t5cDlvRHkvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJBQUFBQUE9PSIsImV0YWciOiJDS3lwOW9EeS9lRUNFQUU9In0=" } }, { "ID": "036f06773f6d6306", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0021/o?alt=json\u0026delimiter=\u0026pageToken=\u0026prefix=\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 404, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "11821" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Expires": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "agent_rejected" ], "X-Guploader-Upload-Result": [ "agent_rejected" ], "X-Guploader-Uploadid": [ "AEnB2Uqs9uKpqdPwYRv420tAk0KmBT6DS2POPsIj39ROT-r3ymrd2SB-oOJEXuaHGOfih1ckOqp-YrvHHAh7l7A-6rwlFjoBSb4qCtWzXGPjekN0pUBIok8" ] }, "Body": "eyJlcnJvciI6eyJlcnJvcnMiOlt7ImRvbWFpbiI6Imdsb2JhbCIsInJlYXNvbiI6Im5vdEZvdW5kIiwibWVzc2FnZSI6Ik5vdCBGb3VuZCIsImRlYnVnSW5mbyI6ImNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjE3MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmxpc3QoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUuRmF1bHQ6IEltbXV0YWJsZUVycm9yRGVmaW5pdGlvbntiYXNlPU5PVF9GT1VORCwgY2F0ZWdvcnk9VVNFUl9FUlJPUiwgY2F1c2U9bnVsbCwgZGVidWdJbmZvPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjE3MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmxpc3QoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZG9tYWluPWdsb2JhbCwgZXh0ZW5kZWRIZWxwPW51bGwsIGh0dHBIZWFkZXJzPXt9LCBodHRwU3RhdHVzPW5vdEZvdW5kLCBpbnRlcm5hbFJlYXNvbj1SZWFzb257YXJndW1lbnRzPXt9LCBjYXVzZT1udWxsLCBjb2RlPWdkYXRhLkNvcmVFcnJvckRvbWFpbi5OT1RfRk9VTkQsIGNyZWF0ZWRCeUJhY2tlbmQ9dHJ1ZSwgZGVidWdNZXNzYWdlPWNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjE3MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmxpc3QoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcbiwgZXJyb3JQcm90b0NvZGU9Tk9UX0ZPVU5ELCBlcnJvclByb3RvRG9tYWluPWdkYXRhLkNvcmVFcnJvckRvbWFpbiwgZmlsdGVyZWRNZXNzYWdlPW51bGwsIGxvY2F0aW9uPWVudGl0eS5idWNrZXQsIG1lc3NhZ2U9bnVsbCwgdW5uYW1lZEFyZ3VtZW50cz1bXX0sIGxvY2F0aW9uPWVudGl0eS5idWNrZXQsIG1lc3NhZ2U9Tm90IEZvdW5kLCByZWFzb249bm90Rm91bmQsIHJwY0NvZGU9NDA0fSBOb3QgRm91bmQ6IGNvbS5nb29nbGUubmV0LnJwYzMuUnBjRXhjZXB0aW9uOiBjbG91ZC5iaWdzdG9yZS5SZXNwb25zZUNvZGUuRXJyb3JDb2RlOjpCVUNLRVRfTk9UX0ZPVU5EOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRvUnBjM0V4Y2VwdGlvbihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjE0Nylcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjE3MSlcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5oYW5kbGVycy5vYmplY3RzLkxpc3RPYmplY3RzLmhhbmRsZVJlcXVlc3RSZWNlaXZlZChMaXN0T2JqZWN0cy5qYXZhOjQxKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmFwaS5qc29uLmZyYW1ld29yay5SZXF1ZXN0SGFuZGxlci5oYW5kbGVSZXF1ZXN0UmVjZWl2ZWQoUmVxdWVzdEhhbmRsZXIuamF2YTozMTApXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuYXBpLmpzb24uZnJhbWV3b3JrLlJlcXVlc3RIYW5kbGVyLmhhbmRsZShSZXF1ZXN0SGFuZGxlci5qYXZhOjI1Nilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5hcGkuanNvbi5PYmplY3RzRGVsZWdhdG9yLmxpc3QoT2JqZWN0c0RlbGVnYXRvci5qYXZhOjg5KVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5ScGNSZWNlaXZlci5sYW1iZGEkcHJvY2Vzc1JlcXVlc3RBc3luYyQ0KFJwY1JlY2VpdmVyLmphdmE6MjAyKVxuXHRhdCBjb20uZ29vZ2xlLmNsb3VkLmJpZ3N0b3JlLmlzb2xhdGlvbi5Bc3luY0V4ZWN1dG9yLmxhbWJkYSRzdWJtaXQkMChBc3luY0V4ZWN1dG9yLmphdmE6MjUzKVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoQ29udGV4dFJ1bm5hYmxlLmphdmE6NTApXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLmNvbnRleHQuQ29udGV4dFJ1bm5hYmxlJDEucnVuKENvbnRleHRSdW5uYWJsZS5qYXZhOjM5KVxuXHRhdCBpby5ncnBjLkNvbnRleHQucnVuKENvbnRleHQuamF2YTo1NjUpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5DdXJyZW50Q29udGV4dC5ydW5JbkNvbnRleHQoQ3VycmVudENvbnRleHQuamF2YToyMDQpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5HZW5lcmljQ29udGV4dENhbGxiYWNrLnJ1bkluSW5oZXJpdGVkQ29udGV4dE5vVW5yZWYoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjcyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuR2VuZXJpY0NvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoR2VuZXJpY0NvbnRleHRDYWxsYmFjay5qYXZhOjY0KVxuXHRhdCBjb20uZ29vZ2xlLmNvbW1vbi5jb250ZXh0LkNvbnRleHRSdW5uYWJsZS5ydW4oQ29udGV4dFJ1bm5hYmxlLmphdmE6MzUpXG5cdGF0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvci5ydW5Xb3JrZXIoVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6MTE0OSlcblx0YXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjI0KVxuXHRhdCBqYXZhLmxhbmcuVGhyZWFkLnJ1bihUaHJlYWQuamF2YTo3NDgpXG5DYXVzZWQgYnk6IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uOiBObyBzdWNoIGJ1Y2tldDogZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIxXG5cdGF0IGNvbS5nb29nbGUuY2xvdWQuYmlnc3RvcmUuY29tbW9uLkJpZ3N0b3JlRXhjZXB0aW9uLnRocm93T25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMxMilcblx0YXQgY29tLmdvb2dsZS5jbG91ZC5iaWdzdG9yZS5jb21tb24uQmlnc3RvcmVFeGNlcHRpb24udGhyb3dScGMzT25FcnJvcihCaWdzdG9yZUV4Y2VwdGlvbi5qYXZhOjMyMClcblx0Li4uIDE3IG1vcmVcblxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuY29yZS5FcnJvckNvbGxlY3Rvci50b0ZhdWx0KEVycm9yQ29sbGVjdG9yLmphdmE6NTQpXG5cdGF0IGNvbS5nb29nbGUuYXBpLnNlcnZlci5yZXN0LmFkYXB0ZXIucm9zeS5Sb3N5RXJyb3JDb252ZXJ0ZXIudG9GYXVsdChSb3N5RXJyb3JDb252ZXJ0ZXIuamF2YTo2Nylcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjI1OSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnJlc3QuYWRhcHRlci5yb3N5LlJvc3lIYW5kbGVyJDIuY2FsbChSb3N5SGFuZGxlci5qYXZhOjIzOSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkRpcmVjdEV4ZWN1dG9yLmV4ZWN1dGUoRGlyZWN0RXhlY3V0b3IuamF2YTozMClcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLmV4ZWN1dGVMaXN0ZW5lcihBYnN0cmFjdEZ1dHVyZS5qYXZhOjExNDMpXG5cdGF0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZS5jb21wbGV0ZShBYnN0cmFjdEZ1dHVyZS5qYXZhOjk2Mylcblx0YXQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlLnNldChBYnN0cmFjdEZ1dHVyZS5qYXZhOjczMSlcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLmNvcmUudXRpbC5DYWxsYWJsZUZ1dHVyZS5ydW4oQ2FsbGFibGVGdXR1cmUuamF2YTo2Milcblx0YXQgY29tLmdvb2dsZS5hcGkuc2VydmVyLnRocmVhZC5UaHJlYWRUcmFja2VycyRUaHJlYWRUcmFja2luZ1J1bm5hYmxlLnJ1bihUaHJlYWRUcmFja2Vycy5qYXZhOjEyNilcblx0YXQgY29tLmdvb2dsZS50cmFjaW5nLlRyYWNlQ29udGV4dCRUcmFjZUNvbnRleHRSdW5uYWJsZS5ydW5JbkNvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6NDUzKVxuXHRhdCBjb20uZ29vZ2xlLmFwaS5zZXJ2ZXIuc2VydmVyLkNvbW1vbk1vZHVsZSRDb250ZXh0Q2FycnlpbmdFeGVjdXRvclNlcnZpY2UkMS5ydW5JbkNvbnRleHQoQ29tbW9uTW9kdWxlLmphdmE6ODAyKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlJDEucnVuKFRyYWNlQ29udGV4dC5qYXZhOjQ2MClcblx0YXQgaW8uZ3JwYy5Db250ZXh0LnJ1bihDb250ZXh0LmphdmE6NTY1KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuQ3VycmVudENvbnRleHQucnVuSW5Db250ZXh0KEN1cnJlbnRDb250ZXh0LmphdmE6MjA0KVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JEFic3RyYWN0VHJhY2VDb250ZXh0Q2FsbGJhY2sucnVuSW5Jbmhlcml0ZWRDb250ZXh0Tm9VbnJlZihUcmFjZUNvbnRleHQuamF2YTozMTkpXG5cdGF0IGNvbS5nb29nbGUudHJhY2luZy5UcmFjZUNvbnRleHQkQWJzdHJhY3RUcmFjZUNvbnRleHRDYWxsYmFjay5ydW5JbkluaGVyaXRlZENvbnRleHQoVHJhY2VDb250ZXh0LmphdmE6MzExKVxuXHRhdCBjb20uZ29vZ2xlLnRyYWNpbmcuVHJhY2VDb250ZXh0JFRyYWNlQ29udGV4dFJ1bm5hYmxlLnJ1bihUcmFjZUNvbnRleHQuamF2YTo0NTcpXG5cdGF0IGNvbS5nb29nbGUuZ3NlLmludGVybmFsLkRpc3BhdGNoUXVldWVJbXBsJFdvcmtlclRocmVhZC5ydW4oRGlzcGF0Y2hRdWV1ZUltcGwuamF2YTo0MDMpXG4ifV0sImNvZGUiOjQwNCwibWVzc2FnZSI6Ik5vdCBGb3VuZCJ9fQ==" } }, { "ID": "6b9dc540a02ed56f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/storage-library-test-bucket/Cafe%CC%81", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "public, max-age=3600" ], "Content-Length": [ "20" ], "Content-Type": [ "text/plain" ], "Date": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Etag": [ "\"df597679bac7c6150429ad80a1a05680\"" ], "Expires": [ "Thu, 02 May 2019 23:26:29 GMT" ], "Last-Modified": [ "Fri, 24 Mar 2017 20:04:37 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Generation": [ "1490385877705600" ], "X-Goog-Hash": [ "crc32c=qBeWjQ==", "md5=31l2ebrHxhUEKa2AoaBWgA==" ], "X-Goog-Metageneration": [ "2" ], "X-Goog-Storage-Class": [ "MULTI_REGIONAL" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "20" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrK69XFh4eDvl0RvSevMYIwMVs-nlDelMhoacS-4faSvuEateXMEqzdMvHClWdzkyqcEk7IQ1N0JMcv5uEPt6V98chYK-p9otm8puF4Uf846EBUEmg" ] }, "Body": "Tm9ybWFsaXphdGlvbiBGb3JtIEQ=" } }, { "ID": "09f71762da168c2f", "Request": { "Method": "GET", "URL": "https://storage.googleapis.com/go-integration-test-20190502-80633403432013-0001/zero", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "Go-http-client/1.1" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Accept-Ranges": [ "bytes" ], "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0" ], "Content-Length": [ "0" ], "Content-Type": [ "text/plain; charset=utf-8" ], "Date": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Etag": [ "\"d41d8cd98f00b204e9800998ecf8427e\"" ], "Expires": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Last-Modified": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Server": [ "UploadServer" ], "X-Goog-Expiration": [ "Sat, 01 Jun 2019 22:26:29 GMT" ], "X-Goog-Generation": [ "1556835989296300" ], "X-Goog-Hash": [ "crc32c=AAAAAA==", "md5=1B2M2Y8AsgTpgAmY7PhCfg==" ], "X-Goog-Metageneration": [ "1" ], "X-Goog-Storage-Class": [ "STANDARD" ], "X-Goog-Stored-Content-Encoding": [ "identity" ], "X-Goog-Stored-Content-Length": [ "0" ], "X-Guploader-Customer": [ "cloud-storage" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrL3cJhuZXF-arxiYeo4MSf1to_dAoiyMisikOum5rqnrSnFa0OZ25Sl8hUU7lcIeW6P3-dwXK6qv0yHGFYMFnUB0VYpI9BRT16gMo8ikQ_L3gBmew" ] }, "Body": "" } }, { "ID": "681729281517b9c0", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/zero?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:29 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrKCNWRWyBsgMgWxsrSjXZMKW22GWVttfUWHw_UNSF7X7hnnz4h-cD7vFzaLO7OVWvnuMyW9qpJAA4eJaERT9hSjGfv41XVw_9ouvBOeIK9ykq-DrE" ] }, "Body": "" } }, { "ID": "39261fa7e6e9aede", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "60" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIn0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "485" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:33 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpEt-jSVBZqHHBwfNkeP4NXxMdC1ISsFp2E_M6JiSw9rDj2gTnmTZhrvOn-bo_f9Lx_HMxMDgsXfO0ftWqvUjGwdmHAYNnYK5JSJozLfuosPNxv_S4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjMzLjU1N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjozMy41NTdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0=" } }, { "ID": "3e70965b0aa1111b", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0022?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2431" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:34 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:26:34 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrB-4r560VjwZdR64GS_7_mZDefc-iM5ma_H8KjYfrdNXt-IlkgvzShsy7iNLseN6coOnkJwWT5tLbP54_M7nMUjord_jmpb1i19SBRA_3RQ_64yys" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjMzLjU1N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjozMy41NTdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "b80f9a99661cd572", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0022?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:34 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur4ItFRDN2_vB0_Ej095pAE061aywdVAoU_00t3fazm21R5ZLxUHpQL4ifTJ58218EkOeDBSWNaOaWuuzTnTM0DhXTe4l2X3pytOdfcZdIeyLV1rWA" ] }, "Body": "" } }, { "ID": "979ffb3f3450c3d5", "Request": { "Method": "POST", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026prettyPrint=false\u0026project=deklerk-sandbox", "Header": { "Accept-Encoding": [ "gzip" ], "Content-Length": [ "543" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "application/json", "BodyParts": [ "eyJsYWJlbHMiOnsiZW1wdHkiOiIiLCJsMSI6InYxIn0sImxpZmVjeWNsZSI6eyJydWxlIjpbeyJhY3Rpb24iOnsic3RvcmFnZUNsYXNzIjoiTkVBUkxJTkUiLCJ0eXBlIjoiU2V0U3RvcmFnZUNsYXNzIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjEwLCJjcmVhdGVkQmVmb3JlIjoiMjAxNy0wMS0wMSIsImlzTGl2ZSI6ZmFsc2UsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTVVMVElfUkVHSU9OQUwiLCJTVEFOREFSRCJdLCJudW1OZXdlclZlcnNpb25zIjozfX0seyJhY3Rpb24iOnsidHlwZSI6IkRlbGV0ZSJ9LCJjb25kaXRpb24iOnsiYWdlIjozMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOnRydWUsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTkVBUkxJTkUiXSwibnVtTmV3ZXJWZXJzaW9ucyI6MTB9fV19LCJsb2NhdGlvbiI6IlVTIiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIiwidmVyc2lvbmluZyI6eyJlbmFibGVkIjp0cnVlfX0K" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "926" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:34 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqM_YYHcsYolLFJJwWhO9AUYmnc3Vp3J6C5AydYOy-0RVAmBxObG8QpwZOsn28vDVllo_OZ1-4bASi_RGi4wdply2CPhzUOCVjP11XNzVYZ4_EiFb4" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjM0LjU2M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjozNC41NjNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOnRydWV9LCJsaWZlY3ljbGUiOnsicnVsZSI6W3siYWN0aW9uIjp7InR5cGUiOiJTZXRTdG9yYWdlQ2xhc3MiLCJzdG9yYWdlQ2xhc3MiOiJORUFSTElORSJ9LCJjb25kaXRpb24iOnsiYWdlIjoxMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOmZhbHNlLCJtYXRjaGVzU3RvcmFnZUNsYXNzIjpbIk1VTFRJX1JFR0lPTkFMIiwiU1RBTkRBUkQiXSwibnVtTmV3ZXJWZXJzaW9ucyI6M319LHsiYWN0aW9uIjp7InR5cGUiOiJEZWxldGUifSwiY29uZGl0aW9uIjp7ImFnZSI6MzAsImNyZWF0ZWRCZWZvcmUiOiIyMDE3LTAxLTAxIiwiaXNMaXZlIjp0cnVlLCJtYXRjaGVzU3RvcmFnZUNsYXNzIjpbIk5FQVJMSU5FIl0sIm51bU5ld2VyVmVyc2lvbnMiOjEwfX1dfSwibGFiZWxzIjp7ImwxIjoidjEiLCJlbXB0eSI6IiJ9LCJzdG9yYWdlQ2xhc3MiOiJORUFSTElORSIsImV0YWciOiJDQUU9In0=" } }, { "ID": "4931edd6fbd7e278", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0022?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2872" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:34 GMT" ], "Etag": [ "CAE=" ], "Expires": [ "Thu, 02 May 2019 22:26:34 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpxOq-rTQ-0CFxAKezuPpbibtEmD_yASKzhW5dOiUdwVORx6a7_e1dmDnNCdamDPwLsBOpLueQD8iDbwlracb2uxGwwZ6yz92QD-t-JSKM-jSNp2xA" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjM0LjU2M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjozNC41NjNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDIyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMjIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAyMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInZlcnNpb25pbmciOnsiZW5hYmxlZCI6dHJ1ZX0sImxpZmVjeWNsZSI6eyJydWxlIjpbeyJhY3Rpb24iOnsidHlwZSI6IlNldFN0b3JhZ2VDbGFzcyIsInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjEwLCJjcmVhdGVkQmVmb3JlIjoiMjAxNy0wMS0wMSIsImlzTGl2ZSI6ZmFsc2UsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTVVMVElfUkVHSU9OQUwiLCJTVEFOREFSRCJdLCJudW1OZXdlclZlcnNpb25zIjozfX0seyJhY3Rpb24iOnsidHlwZSI6IkRlbGV0ZSJ9LCJjb25kaXRpb24iOnsiYWdlIjozMCwiY3JlYXRlZEJlZm9yZSI6IjIwMTctMDEtMDEiLCJpc0xpdmUiOnRydWUsIm1hdGNoZXNTdG9yYWdlQ2xhc3MiOlsiTkVBUkxJTkUiXSwibnVtTmV3ZXJWZXJzaW9ucyI6MTB9fV19LCJsYWJlbHMiOnsibDEiOiJ2MSIsImVtcHR5IjoiIn0sInN0b3JhZ2VDbGFzcyI6Ik5FQVJMSU5FIiwiZXRhZyI6IkNBRT0ifQ==" } }, { "ID": "12c06b5419a1fa81", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0022?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:35 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uoc24sLEBwU00YKpSYT4V6iJu3WxME2LgbyRWaYj4kX8s6Gjatzl0AWcCwPRhj_Bq0BOoUhKQzS8L0GJlhHC36eyEWEIs2rk2BcUyo0aE3U8XbuHuM" ] }, "Body": "" } }, { "ID": "bf24dffbe6cb8609", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "2571" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:35 GMT" ], "Etag": [ "CA0=" ], "Expires": [ "Thu, 02 May 2019 22:26:35 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqVkn03LSqmt8RiOPdW3JO4dpsS9vRp7VK8Qc0HwhmS3L9KDOgmyZIqLnvAwuAyvoIz1VsbqeoLwMMtz9pCIX216P4K3OpEs-x_bf_VSwMiFehgZiM" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIzOjU0LjYxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNToyNS41MjdaIiwibWV0YWdlbmVyYXRpb24iOiIxMyIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0EwPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQTA9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0EwPSJ9" } }, { "ID": "2e41eac5e693f3e1", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o?alt=json\u0026delimiter=\u0026pageToken=\u0026prefix=\u0026prettyPrint=false\u0026projection=full\u0026versions=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "64746" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:35 GMT" ], "Expires": [ "Thu, 02 May 2019 22:26:35 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqgGJECa6hRJfdjE3ErHERxS3HPU_SALrzjf-HIDuv4lfxMvOwrkF2pfY2jUJ3b8TcIjWcnaa85Rs4LBucKffiSWfFXcfLZMF0EuiVRj9oH6Kp4tOg" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNvYmplY3RzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDEvMTU1NjgzNTg2NDI0ODE3MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEiLCJuYW1lIjoiYWNsMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwibWV0YWdlbmVyYXRpb24iOiIyIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjQuMjQ3WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI1LjYyOVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyNC4yNDdaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6IjBFOXRGTnBaajAvV0tPSjZmVjlwYXc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxP2dlbmVyYXRpb249MTU1NjgzNTg2NDI0ODE3MCZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDT3IrcGNYeC9lRUNFQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMS8xNTU2ODM1ODY0MjQ4MTcwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0MjQ4MTcwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wxLzE1NTY4MzU4NjQyNDgxNzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQyNDgxNzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3IrcGNYeC9lRUNFQUk9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkZpRG1WZz09IiwiZXRhZyI6IkNPcitwY1h4L2VFQ0VBST0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDIvMTU1NjgzNTg2NDczNzk0NiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDIiLCJuYW1lIjoiYWNsMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0NzM3OTQ2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjQuNzM3WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjI0LjczN1oiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyNC43MzdaIiwic2l6ZSI6IjE2IiwibWQ1SGFzaCI6ImM5K08vcmcyNEhURkJjK2V0V2plZmc9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyP2dlbmVyYXRpb249MTU1NjgzNTg2NDczNzk0NiZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0NzM3OTQ2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2FjbDIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJhY2wyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjQ3Mzc5NDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSnJ4dzhYeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYWNsMi8xNTU2ODM1ODY0NzM3OTQ2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiYWNsMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODY0NzM3OTQ2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9hY2wyLzE1NTY4MzU4NjQ3Mzc5NDYvZG9tYWluLWdvb2dsZS5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9hY2wyL2FjbC9kb21haW4tZ29vZ2xlLmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsImVudGl0eSI6ImRvbWFpbi1nb29nbGUuY29tIiwicm9sZSI6IlJFQURFUiIsImRvbWFpbiI6Imdvb2dsZS5jb20iLCJldGFnIjoiQ0pyeHc4WHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2FjbDIvMTU1NjgzNTg2NDczNzk0Ni91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYWNsMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImFjbDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2NDczNzk0NiIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKcnh3OFh4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQXROUnRBPT0iLCJldGFnIjoiQ0pyeHc4WHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0SW5Db3B5QXR0cnMvMTU1NjgzNTg4MzY2Mzg1NiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzIiwibmFtZSI6ImJ1Y2tldEluQ29weUF0dHJzIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDMuNjYzWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQzLjY2M1oiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0My42NjNaIiwic2l6ZSI6IjMiLCJtZDVIYXNoIjoickwwWTIwekMrRnp0NzJWUHpNU2syQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzP2dlbmVyYXRpb249MTU1NjgzNTg4MzY2Mzg1NiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2J1Y2tldEluQ29weUF0dHJzL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJidWNrZXRJbkNvcHlBdHRycyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgzNjYzODU2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRJbkNvcHlBdHRycy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldEluQ29weUF0dHJzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUENEeDg3eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvYnVja2V0SW5Db3B5QXR0cnMvMTU1NjgzNTg4MzY2Mzg1Ni9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vYnVja2V0SW5Db3B5QXR0cnMvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJidWNrZXRJbkNvcHlBdHRycyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgzNjYzODU2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9idWNrZXRJbkNvcHlBdHRycy8xNTU2ODM1ODgzNjYzODU2L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9idWNrZXRJbkNvcHlBdHRycy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImJ1Y2tldEluQ29weUF0dHJzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODM2NjM4NTYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUENEeDg3eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Ino4U3VIUT09IiwiZXRhZyI6IkNQQ0R4ODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NoZWNrc3VtLW9iamVjdC8xNTU2ODM1ODU1OTYyMjQxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0IiwibmFtZSI6ImNoZWNrc3VtLW9iamVjdCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE1Ljk2MVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNS45NjFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTUuOTYxWiIsInNpemUiOiIxMCIsIm1kNUhhc2giOiIvRjREalRpbGNESUlWRUhuL25BUXNBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTg1NTk2MjI0MSZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jaGVja3N1bS1vYmplY3QvMTU1NjgzNTg1NTk2MjI0MS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jaGVja3N1bS1vYmplY3QvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNoZWNrc3VtLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJR2hyTUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jaGVja3N1bS1vYmplY3QvMTU1NjgzNTg1NTk2MjI0MS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY2hlY2tzdW0tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTU5NjIyNDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSUdock1IeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY2hlY2tzdW0tb2JqZWN0LzE1NTY4MzU4NTU5NjIyNDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NoZWNrc3VtLW9iamVjdC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNoZWNrc3VtLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU1OTYyMjQxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJR2hyTUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jaGVja3N1bS1vYmplY3QvMTU1NjgzNTg1NTk2MjI0MS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY2hlY2tzdW0tb2JqZWN0L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY2hlY2tzdW0tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTU5NjIyNDEiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSUdock1IeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlZzdTBnQT09IiwiZXRhZyI6IkNJR2hyTUh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMS8xNTU2ODM1ODU4OTYyOTU3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQxIiwibmFtZSI6ImNvbXBvc2VkMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU4OTYyOTU3IiwibWV0YWdlbmVyYXRpb24iOiIxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE4Ljk2MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxOC45NjJaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTguOTYyWiIsInNpemUiOiI0OCIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDE/Z2VuZXJhdGlvbj0xNTU2ODM1ODU4OTYyOTU3JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMS8xNTU2ODM1ODU4OTYyOTU3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29tcG9zZWQxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTg5NjI5NTciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0kyMDQ4THgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMS8xNTU2ODM1ODU4OTYyOTU3L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb21wb3NlZDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1ODk2Mjk1NyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNJMjA0OEx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb21wb3NlZDEvMTU1NjgzNTg1ODk2Mjk1Ny9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29tcG9zZWQxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTg5NjI5NTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0kyMDQ4THgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMS8xNTU2ODM1ODU4OTYyOTU3L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb21wb3NlZDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1ODk2Mjk1NyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNJMjA0OEx4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiQWJXQnlRPT0iLCJjb21wb25lbnRDb3VudCI6MywiZXRhZyI6IkNJMjA0OEx4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMi8xNTU2ODM1ODU5NTY0Nzk5Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQyIiwibmFtZSI6ImNvbXBvc2VkMiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU5NTY0Nzk5IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L2pzb24iLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTkuNTY0WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE5LjU2NFoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxOS41NjRaIiwic2l6ZSI6IjQ4IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMj9nZW5lcmF0aW9uPTE1NTY4MzU4NTk1NjQ3OTkmYWx0PW1lZGlhIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29tcG9zZWQyLzE1NTY4MzU4NTk1NjQ3OTkvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29tcG9zZWQyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb21wb3NlZDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1OTU2NDc5OSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDUCtSaU1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29tcG9zZWQyLzE1NTY4MzU4NTk1NjQ3OTkvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbXBvc2VkMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU5NTY0Nzk5IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ1ArUmlNUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2NvbXBvc2VkMi8xNTU2ODM1ODU5NTY0Nzk5L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb21wb3NlZDIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb21wb3NlZDIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg1OTU2NDc5OSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDUCtSaU1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29tcG9zZWQyLzE1NTY4MzU4NTk1NjQ3OTkvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbXBvc2VkMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImNvbXBvc2VkMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU5NTY0Nzk5IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ1ArUmlNUHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJBYldCeVE9PSIsImNvbXBvbmVudENvdW50IjozLCJldGFnIjoiQ1ArUmlNUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODc0MzUyMjA3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudCIsIm5hbWUiOiJjb250ZW50IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6ImltYWdlL2pwZWciLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzQuMzUxWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM0LjM1MVoiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNC4zNTFaIiwic2l6ZSI6IjU0IiwibWQ1SGFzaCI6Ik44cDgvczlGd2RBQW5sdnIvbEVBalE9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50P2dlbmVyYXRpb249MTU1NjgzNTg3NDM1MjIwNyZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY29udGVudC9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc0MzUyMjA3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTS9ZanNyeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY29udGVudC8xNTU2ODM1ODc0MzUyMjA3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jb250ZW50L2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY29udGVudCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc0MzUyMjA3IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jb250ZW50LzE1NTY4MzU4NzQzNTIyMDcvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2NvbnRlbnQvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjb250ZW50IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzQzNTIyMDciLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTS9ZanNyeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkdvVWJzUT09IiwiZXRhZyI6IkNNL1lqc3J4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24iLCJuYW1lIjoiY3VzdG9tZXItZW5jcnlwdGlvbiIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc1MDU4NjgwIiwibWV0YWdlbmVyYXRpb24iOiIzIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM1LjA1OFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozNi4yMjVaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzUuMDU4WiIsInNpemUiOiIxMSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uP2dlbmVyYXRpb249MTU1NjgzNTg3NTA1ODY4MCZhbHQ9bWVkaWEiLCJjb250ZW50TGFuZ3VhZ2UiOiJlbiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBTT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLzE1NTY4MzU4NzUwNTg2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24vYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NzUwNTg2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1BqbnVjcngvZUVDRUFNPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24vMTU1NjgzNTg3NTA1ODY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24iLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3NTA1ODY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBTT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiZXRhZyI6IkNQam51Y3J4L2VFQ0VBTT0iLCJjdXN0b21lckVuY3J5cHRpb24iOnsiZW5jcnlwdGlvbkFsZ29yaXRobSI6IkFFUzI1NiIsImtleVNoYTI1NiI6IkgrTG1uWGhSb2VJNlRNVzVic1Y2SHlVazZweUdjMklNYnFZYkFYQmNwczA9In19LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIiLCJuYW1lIjoiY3VzdG9tZXItZW5jcnlwdGlvbi0yIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODA3MTc1MDYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDAuNzE3WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQwLjcxN1oiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0MC43MTdaIiwic2l6ZSI6IjExIiwibWQ1SGFzaCI6Inh3V05GYTBWZFhQbWxBd3JsY0FKY2c9PSIsIm1lZGlhTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTI/Z2VuZXJhdGlvbj0xNTU2ODM1ODgwNzE3NTA2JmFsdD1tZWRpYSIsImNvbnRlbnRMYW5ndWFnZSI6ImVuIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0yL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MDcxNzUwNiIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgwNzE3NTA2IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ01LWms4M3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2N1c3RvbWVyLWVuY3J5cHRpb24tMi8xNTU2ODM1ODgwNzE3NTA2L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJjdXN0b21lci1lbmNyeXB0aW9uLTIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4MDcxNzUwNiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0yLzE1NTY4MzU4ODA3MTc1MDYvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgwNzE3NTA2IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ01LWms4M3gvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJyME5Hcmc9PSIsImV0YWciOiJDTUtaazgzeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMyIsIm5hbWUiOiJjdXN0b21lci1lbmNyeXB0aW9uLTMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg3OTg1OTQ0MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDozOS44NTlaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MzkuODU5WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjM5Ljg1OVoiLCJzaXplIjoiMjIiLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0zP2dlbmVyYXRpb249MTU1NjgzNTg3OTg1OTQ0MCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9jdXN0b21lci1lbmNyeXB0aW9uLTMvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc5ODU5NDQwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNQRHAzc3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0zL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Nzk4NTk0NDAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDUERwM3N6eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvY3VzdG9tZXItZW5jcnlwdGlvbi0zLzE1NTY4MzU4Nzk4NTk0NDAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2N1c3RvbWVyLWVuY3J5cHRpb24tMy9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6ImN1c3RvbWVyLWVuY3J5cHRpb24tMyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODc5ODU5NDQwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNQRHAzc3p4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9jdXN0b21lci1lbmNyeXB0aW9uLTMvMTU1NjgzNTg3OTg1OTQ0MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vY3VzdG9tZXItZW5jcnlwdGlvbi0zL2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0IjoiY3VzdG9tZXItZW5jcnlwdGlvbi0zIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4Nzk4NTk0NDAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDUERwM3N6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNvbXBvbmVudENvdW50IjoyLCJldGFnIjoiQ1BEcDNzengvZUVDRUFFPSIsImN1c3RvbWVyRW5jcnlwdGlvbiI6eyJlbmNyeXB0aW9uQWxnb3JpdGhtIjoiQUVTMjU2Iiwia2V5U2hhMjU2IjoiSCtMbW5YaFJvZUk2VE1XNWJzVjZIeVVrNnB5R2MySU1icVliQVhCY3BzMD0ifX0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9nemlwLXRlc3QvMTU1NjgzNTg2MDI1MTg2NyIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdCIsIm5hbWUiOiJnemlwLXRlc3QiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoiYXBwbGljYXRpb24veC1nemlwIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjIwLjI1MVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyMC4yNTFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjAuMjUxWiIsInNpemUiOiIyNyIsIm1kNUhhc2giOiJPdEN3K2FSUklScUtHRkFFT2F4K3F3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ3ppcC10ZXN0P2dlbmVyYXRpb249MTU1NjgzNTg2MDI1MTg2NyZhbHQ9bWVkaWEiLCJjb250ZW50RW5jb2RpbmciOiJnemlwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vZ3ppcC10ZXN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJnemlwLXRlc3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imd6aXAtdGVzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYwMjUxODY3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ051SnNzUHgvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2d6aXAtdGVzdC8xNTU2ODM1ODYwMjUxODY3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9nemlwLXRlc3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJnemlwLXRlc3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg2MDI1MTg2NyIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvZ3ppcC10ZXN0LzE1NTY4MzU4NjAyNTE4NjcvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2d6aXAtdGVzdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imd6aXAtdGVzdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYwMjUxODY3IiwiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInJvbGUiOiJPV05FUiIsImVtYWlsIjoiYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJldGFnIjoiQ051SnNzUHgvZUVDRUFFPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiI5RGh3QkE9PSIsImV0YWciOiJDTnVKc3NQeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODUwNTE2ODAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xIiwibmFtZSI6Imhhc2hlc09uVXBsb2FkLTEiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0NS4wNTFaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDUuMDUxWiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQ1LjA1MVoiLCJzaXplIjoiMjciLCJtZDVIYXNoIjoib2ZaakdsY1hQSmlHT0FmS0ZiSmwxUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTE/Z2VuZXJhdGlvbj0xNTU2ODM1ODg1MDUxNjgwJmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9oYXNoZXNPblVwbG9hZC0xL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODUwNTE2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNLRGVtOC94L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9oYXNoZXNPblVwbG9hZC0xLzE1NTY4MzU4ODUwNTE2ODAvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL2hhc2hlc09uVXBsb2FkLTEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJoYXNoZXNPblVwbG9hZC0xIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODUwNTE2ODAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL2hhc2hlc09uVXBsb2FkLTEvMTU1NjgzNTg4NTA1MTY4MC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vaGFzaGVzT25VcGxvYWQtMS9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Imhhc2hlc09uVXBsb2FkLTEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4NTA1MTY4MCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNLRGVtOC94L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiY0grQSt3PT0iLCJldGFnIjoiQ0tEZW04L3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqL3dpdGgvc2xhc2hlcy8xNTU2ODM1ODQ1NTExMDE4Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMiLCJuYW1lIjoib2JqL3dpdGgvc2xhc2hlcyIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjUxMFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS41MTBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuNTEwWiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJ1ZXovaEo2d0FyZURRbmNjRFVkeGZnPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXM/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ1NTExMDE4JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmolMkZ3aXRoJTJGc2xhc2hlcy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmovd2l0aC9zbGFzaGVzLzE1NTY4MzU4NDU1MTEwMTgvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iaiUyRndpdGglMkZzbGFzaGVzL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoib2JqL3dpdGgvc2xhc2hlcyIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ1NTExMDE4IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ09xdXJyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iai93aXRoL3NsYXNoZXMvMTU1NjgzNTg0NTUxMTAxOC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqJTJGd2l0aCUyRnNsYXNoZXMvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmovd2l0aC9zbGFzaGVzIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDU1MTEwMTgiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDT3F1cnJ6eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6Im9lbytGQT09IiwiZXRhZyI6IkNPcXVycnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajEvMTU1NjgzNTg0NDY0NzIyNSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEiLCJuYW1lIjoib2JqMSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODQ0NjQ3MjI1IiwibWV0YWdlbmVyYXRpb24iOiI0IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA0LjY0NloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNy4xMjFaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDQuNjQ2WiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJTbmEvVVd2N21jWkkyM29FNXRVYWJRPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMT9nZW5lcmF0aW9uPTE1NTY4MzU4NDQ2NDcyMjUmYWx0PW1lZGlhIiwiY2FjaGVDb250cm9sIjoicHVibGljLCBtYXgtYWdlPTYwIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L2RvbWFpbi1nb29nbGUuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvZG9tYWluLWdvb2dsZS5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJkb21haW4tZ29vZ2xlLmNvbSIsInJvbGUiOiJSRUFERVIiLCJkb21haW4iOiJnb29nbGUuY29tIiwiZXRhZyI6IkNMblMrYnZ4L2VFQ0VBUT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoxLzE1NTY4MzU4NDQ2NDcyMjUvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajEvYWNsL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQVE9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvb2JqMS8xNTU2ODM1ODQ0NjQ3MjI1L2FsbFVzZXJzIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMS9hY2wvYWxsVXNlcnMiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDQ2NDcyMjUiLCJlbnRpdHkiOiJhbGxVc2VycyIsInJvbGUiOiJSRUFERVIiLCJldGFnIjoiQ0xuUytidngvZUVDRUFRPSJ9XSwib3duZXIiOnsiZW50aXR5IjoidXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSJ9LCJjcmMzMmMiOiJDVDZkVEE9PSIsImV0YWciOiJDTG5TK2J2eC9lRUNFQVE9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3QiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyIiwibmFtZSI6Im9iajIiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImNvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDowNS4wNDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MDUuMDQ4WiIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwidGltZVN0b3JhZ2VDbGFzc1VwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjA1LjA0OFoiLCJzaXplIjoiMTYiLCJtZDVIYXNoIjoiQ0Mxd2x3ck1PSXEwZHZNa015bFVoZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajI/Z2VuZXJhdGlvbj0xNTU2ODM1ODQ1MDQ5MjQ1JmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9vYmoyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vYmoyLzE1NTY4MzU4NDUwNDkyNDUvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL29iajIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJvYmoyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NDUwNDkyNDUiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL29iajIvMTU1NjgzNTg0NTA0OTI0NS91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vb2JqMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Im9iajIiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg0NTA0OTI0NSIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKMlhrcnp4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoialY1QVZRPT0iLCJldGFnIjoiQ0oyWGtyengvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYy8xNTU2ODM1ODgyNzYwNjA3Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYyIsIm5hbWUiOiJwb3NjIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDIuNzYwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQyLjc2MFoiLCJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0Mi43NjBaIiwic2l6ZSI6IjMiLCJtZDVIYXNoIjoickwwWTIwekMrRnp0NzJWUHpNU2syQT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2M/Z2VuZXJhdGlvbj0xNTU2ODM1ODgyNzYwNjA3JmFsdD1tZWRpYSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4Mjc2MDYwNyIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNKL3pqODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjLzE1NTY4MzU4ODI3NjA2MDcvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODI3NjA2MDciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3Bvc2MvMTU1NjgzNTg4Mjc2MDYwNy91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYy9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTg4Mjc2MDYwNyIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNKL3pqODd4L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiejhTdUhRPT0iLCJldGFnIjoiQ0ovemo4N3gvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYzIvMTU1NjgzNTg4MzE1Mjc3MCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyIiwibmFtZSI6InBvc2MyIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6NDMuMTUyWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjQzLjE1MloiLCJzdG9yYWdlQ2xhc3MiOiJNVUxUSV9SRUdJT05BTCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDo0My4xNTJaIiwic2l6ZSI6IjMiLCJtZDVIYXNoIjoiOVdHcTl1OEw4VTFDQ0x0R3BNeXpyUT09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyP2dlbmVyYXRpb249MTU1NjgzNTg4MzE1Mjc3MCZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3Bvc2MyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgzMTUyNzcwIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjMi9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDSUxycDg3eC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvcG9zYzIvMTU1NjgzNTg4MzE1Mjc3MC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vcG9zYzIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJwb3NjMiIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODgzMTUyNzcwIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9wb3NjMi8xNTU2ODM1ODgzMTUyNzcwL3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9wb3NjMi9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InBvc2MyIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4ODMxNTI3NzAiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDSUxycDg3eC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IjE3cUFCUT09IiwiZXRhZyI6IkNJTHJwODd4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NpZ25lZFVSTC8xNTU2ODM1ODYxMTQxMjA2Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJMIiwibmFtZSI6InNpZ25lZFVSTCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjIxLjE0MFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoyMS4xNDBaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MjEuMTQwWiIsInNpemUiOiIyOSIsIm1kNUhhc2giOiJKeXh2Z3dtOW4yTXNyR1RNUGJNZVlBPT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJMP2dlbmVyYXRpb249MTU1NjgzNTg2MTE0MTIwNiZhbHQ9bWVkaWEiLCJjYWNoZUNvbnRyb2wiOiJwdWJsaWMsIG1heC1hZ2U9NjAiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zaWduZWRVUkwvMTU1NjgzNTg2MTE0MTIwNi9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zaWduZWRVUkwvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNpZ25lZFVSTCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNOYXQ2TVB4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zaWduZWRVUkwvMTU1NjgzNTg2MTE0MTIwNi9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJML2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoic2lnbmVkVVJMIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjExNDEyMDYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvc2lnbmVkVVJMLzE1NTY4MzU4NjExNDEyMDYvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NpZ25lZFVSTC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNpZ25lZFVSTCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODYxMTQxMjA2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNOYXQ2TVB4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zaWduZWRVUkwvMTU1NjgzNTg2MTE0MTIwNi91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc2lnbmVkVVJML2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoic2lnbmVkVVJMIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NjExNDEyMDYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTmF0Nk1QeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IlpUcUFMdz09IiwiZXRhZyI6IkNOYXQ2TVB4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NvbWUtb2JqZWN0LzE1NTY4MzU5ODgyNzM1MzAiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdCIsIm5hbWUiOiJzb21lLW9iamVjdCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsImdlbmVyYXRpb24iOiIxNTU2ODM1OTg4MjczNTMwIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiY29udGVudFR5cGUiOiJ0ZXh0L3BsYWluIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjI4LjI3M1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoyOC4yNzNaIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJ0aW1lU3RvcmFnZUNsYXNzVXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MjguMjczWiIsInNpemUiOiIxNiIsIm1kNUhhc2giOiJ0SGFjZlNLZkJ5QysvK2NsRzdxK2p3PT0iLCJtZWRpYUxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3Q/Z2VuZXJhdGlvbj0xNTU2ODM1OTg4MjczNTMwJmFsdD1tZWRpYSIsImNhY2hlQ29udHJvbCI6InB1YmxpYywgbWF4LWFnZT02MCIsImFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NvbWUtb2JqZWN0LzE1NTY4MzU5ODgyNzM1MzAvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vc29tZS1vYmplY3QvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ1ByeXQ0RHkvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NvbWUtb2JqZWN0LzE1NTY4MzU5ODgyNzM1MzAvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoic29tZS1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4ODI3MzUzMCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9zb21lLW9iamVjdC8xNTU2ODM1OTg4MjczNTMwL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby9zb21lLW9iamVjdC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6InNvbWUtb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU5ODgyNzM1MzAiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ1ByeXQ0RHkvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL3NvbWUtb2JqZWN0LzE1NTY4MzU5ODgyNzM1MzAvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3NvbWUtb2JqZWN0L2FjbC91c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwib2JqZWN0Ijoic29tZS1vYmplY3QiLCJnZW5lcmF0aW9uIjoiMTU1NjgzNTk4ODI3MzUzMCIsImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJyb2xlIjoiT1dORVIiLCJlbWFpbCI6ImFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiZXRhZyI6IkNQcnl0NER5L2VFQ0VBRT0ifV0sIm93bmVyIjp7ImVudGl0eSI6InVzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20ifSwiY3JjMzJjIjoiU20xZ0t3PT0iLCJldGFnIjoiQ1ByeXQ0RHkvZUVDRUFFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby1vYmplY3QvMTU1NjgzNTg1NjUzNzAxNiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0IiwibmFtZSI6Inplcm8tb2JqZWN0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxIiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJjb250ZW50VHlwZSI6InRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MjQ6MTYuNTM2WiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI0OjE2LjUzNloiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsInRpbWVTdG9yYWdlQ2xhc3NVcGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNDoxNi41MzZaIiwic2l6ZSI6IjAiLCJtZDVIYXNoIjoiMUIyTTJZOEFzZ1RwZ0FtWTdQaENmZz09IiwibWVkaWFMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQvc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0P2dlbmVyYXRpb249MTU1NjgzNTg1NjUzNzAxNiZhbHQ9bWVkaWEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS9vL3plcm8tb2JqZWN0L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJ6ZXJvLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU2NTM3MDE2IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvLW9iamVjdC9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDTGlyejhIeC9lRUNFQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvemVyby1vYmplY3QvMTU1NjgzNTg1NjUzNzAxNi9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDAxL28vemVyby1vYmplY3QvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEiLCJvYmplY3QiOiJ6ZXJvLW9iamVjdCIsImdlbmVyYXRpb24iOiIxNTU2ODM1ODU2NTM3MDE2IiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMS96ZXJvLW9iamVjdC8xNTU2ODM1ODU2NTM3MDE2L3VzZXItYW5vdGhlci10aGluZ0BkZWtsZXJrLXNhbmRib3guaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMDEvby96ZXJvLW9iamVjdC9hY2wvdXNlci1hbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAwMSIsIm9iamVjdCI6Inplcm8tb2JqZWN0IiwiZ2VuZXJhdGlvbiI6IjE1NTY4MzU4NTY1MzcwMTYiLCJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwicm9sZSI6Ik9XTkVSIiwiZW1haWwiOiJhbm90aGVyLXRoaW5nQGRla2xlcmstc2FuZGJveC5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsImV0YWciOiJDTGlyejhIeC9lRUNFQUU9In1dLCJvd25lciI6eyJlbnRpdHkiOiJ1c2VyLWFub3RoZXItdGhpbmdAZGVrbGVyay1zYW5kYm94LmlhbS5nc2VydmljZWFjY291bnQuY29tIn0sImNyYzMyYyI6IkFBQUFBQT09IiwiZXRhZyI6IkNMaXJ6OEh4L2VFQ0VBRT0ifV19" } }, { "ID": "744cbe6970c9623b", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/acl1?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:35 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpfI-4jHQ7K_XJuo8cMIfOvPLKerfuQA1KlRDBi4Fq11Uc9i--oKNuFL_MbH0CCxK8PeI4r4fmZILF9hdSGAMMpMmyX0w67j7t84C4tRDx2LnbzG4I" ] }, "Body": "" } }, { "ID": "a2bea52380600211", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/acl2?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:35 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrzTcVhZWJuBZITVX_K6haiVlOGb5fEYRdiiH8ODa4XsVSPl4FCDs7zPpKMTfoZA1veIMd4ccdcj8rUqWDMcRfDU5l4cOGvNhGZV-h9S2AVJfl6GdE" ] }, "Body": "" } }, { "ID": "e187777c49170a6d", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/bucketInCopyAttrs?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:36 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UouPwITheFghtKlzs2vxoAGnEm_V7OZZnYkk_0pLhV8g5YN6TPRS2n1h0iAtzkuFXYtjovp3ifqt_351LO6-CobCar6VgRnJ-_EQ9WgOWhIC9DzYTs" ] }, "Body": "" } }, { "ID": "653fa745ed683364", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/checksum-object?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:36 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UoBLZLK-ePmvYxO2ByvMQ1dXb_4-5yhOR-1nYkxjkINZf5fY9ptO2H4RfRtbIrRQ-QQNZHqZGgCOGJakKLkNgVI2_ExobQLkJ-JaJ-ViDWL9GZCEgU" ] }, "Body": "" } }, { "ID": "91230665f80c46f7", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/composed1?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:36 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Upasg8dCwbL7dWntUy3O1t_wWVeDNNT3YCz1uVNL8QUNh4z75y0p9OfL57wFX4CUv3NV06Oi9f7a85m42BzgDZl-kqmv4com_INYmRYjKbwrTdFB8A" ] }, "Body": "" } }, { "ID": "dc68e1f94de4fa2a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/composed2?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:36 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqXdUtFVSSFIrK72haTC8pKLogl9pB4lDLpARc8oDKdNt1yfbHj4VAQH0M_Doqj1mLY2LVmThFxvG_1mvtVBm-N4x_J-c5Izq46lZh_xx3wOQEYZKQ" ] }, "Body": "" } }, { "ID": "db5b5c31ef8e503e", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/content?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:36 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Ur2nVuDhUpL1-5n7rzvboeHuOBlvh-59eoy59Y5ZIyvUy6FXYj2eCphVTBFkaIPXK7XIS6DJXkPzZABjiFi4hMA7Ewdgp860sYu44qguzhTfOymXYY" ] }, "Body": "" } }, { "ID": "f44103066254972d", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:36 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqul73HMDr4p6XCqdfKz99RILwd68VT50DnynneOl5m5E_a7ky2mbMA8mdM6xyAWCQtiJm8dCxvIuKYtjLavA8JUlkGIqqCLGfLbB2EvWahd55Fw_A" ] }, "Body": "" } }, { "ID": "99aa9c86d4998414", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-2?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:36 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uqfk5JfeEeFo80cy1Y-OxXgzSIbt_x7qDWML2yJopIrt9DsPmRq4cDVFqg6sUFStj6aMrjxP7iu_tbwZzS_3BtnwqfPrJZvHllZ7tdeFTXLmto742o" ] }, "Body": "" } }, { "ID": "24bd829460fb4df6", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/customer-encryption-3?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:37 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UprF0LO3CObAApP8iwUO6IvC-Yh-5whtr0F_mMzaj0rltEl4C-AZjNuBMGuQUue-v9oBqb-nQU2ykIenSZ3UYnK4XVV7moFIS43VyP7pByYqsHPkMo" ] }, "Body": "" } }, { "ID": "acdf7531eddfd72c", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/gzip-test?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:37 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqAEWwZD_lXrdbrjMg-PYbmLP1-zSzjESAs-osetXJrFTueJ6ufxVfA3xkMG5KjtEz-68YryfKl9gAGsgfseX6H5COwltvyW6pJSdxDdA-dTV_S8eU" ] }, "Body": "" } }, { "ID": "8facd7ede0dc71a6", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/hashesOnUpload-1?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:37 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrInkaBVPO1ip6mFSpF0Nihd1wYE9HNfIz8HfFsZkiEVG1mX7eKMItsbmNwWMehWZ0qaKAf081imDi7DmKqs6mEy7vyTokMNXVUp5LrFoQ-yDfVRuc" ] }, "Body": "" } }, { "ID": "6affac5f0a8dea5a", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj%2Fwith%2Fslashes?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:37 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqhbUYzZ-vUqGcyfzGFaQrr89Q05cXGCB0EbWA2Dy8dmQxB3uWJ7_FUwi6Ish-VMpOrZv78bT9qAHd5Tr5b3s8bTCX6QR9HlelvxkKdyrUv2G8QQuY" ] }, "Body": "" } }, { "ID": "8258a6e1b5dc73aa", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj1?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:37 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Upola6CIBa9ONjl53PxMpFGQkHvYEau96KG2mgCmUDWDhxZKCw0T58QQRx8OIJW5sisH_acrPcg2o-LLdJgOxCtlVSw-t6wGisVL2-TSopEuezgmu4" ] }, "Body": "" } }, { "ID": "12186a37ecd09333", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/obj2?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:37 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UpFxLaOTSsPe7hDbzBznGCoZvAUmeNgWBwS45X2j3rpLlk8_MIFFuCa-aBpAM83d23ixudKpklnhiqCcrQQotCUZhkrMLpWLHBJdmcM0d5rCKL6opY" ] }, "Body": "" } }, { "ID": "e7a92beca78e4ec6", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/posc?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:37 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrpITV4ogt1-_eCsp0KFz7tVeM2A4FzSevs8Q0BPZ36nEPrP9aAaB4nfWASzLZgi2hNM1l9eFkf5UbYYWDT5J-nQFCapVNcm_4Nr43yd94Ce95SVps" ] }, "Body": "" } }, { "ID": "5bb0506f3ca9135d", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/posc2?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:38 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqFBt86Wz7Oqelsb0pPpIskBYdMYLR3XuBmD2F5DwyXt84Q1AUyL0Q94YtqTJP1yzgohHCkJWSGibqUARgP8Ilv9v4lVipsdfjSdFHgIjFJ1H-vuU4" ] }, "Body": "" } }, { "ID": "3ea05ac204d7a112", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/signedURL?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:38 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Up2mLLaTTO-0iqVf4m8WXPEsP-mHlaS6hz_gavjGI5yzU0jCjBNDRw1gj6Wa_cQIBzfjytwP2XYhBIJeAglwa6Uqv87WhzeqgGXt4u820FuZKVgY-w" ] }, "Body": "" } }, { "ID": "bed8580dc40e850e", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/some-object?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:38 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UodR7nshMeihBskPB6loBZoNDRFEUxojhFCKhQ0NpiEMRHY0ZHU8ncI4Sr7FHUmIDXyK8xVg_I7Qt5ESrqnGmRzW0h1eM8OGfEM-3weHyzMqN-VMik" ] }, "Body": "" } }, { "ID": "57489f1d9de0ddb8", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001/o/zero-object?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:38 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UqxQ_NSeD-rrAbZXERIaDr3_1wDC_RZ4MyuFZnOhdDqLkn4qub7rAIamqSQKDD8-jbn0c3XmxvowTghxhq4tZaxxHTmYJtB_FPvJxRZtCt3Leugx4g" ] }, "Body": "" } }, { "ID": "006b3176688c0ac8", "Request": { "Method": "DELETE", "URL": "https://www.googleapis.com/storage/v1/b/go-integration-test-20190502-80633403432013-0001?alt=json\u0026prettyPrint=false", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 204, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "no-cache, no-store, max-age=0, must-revalidate" ], "Content-Length": [ "0" ], "Content-Type": [ "application/json" ], "Date": [ "Thu, 02 May 2019 22:26:38 GMT" ], "Expires": [ "Mon, 01 Jan 1990 00:00:00 GMT" ], "Pragma": [ "no-cache" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2Uo4l8LfaJI78MH37sa7nOmY2A8EB4paZccrewnIFFud-pwGLeVf067ZiRaBAOAPsPYlaxxtsr6gtECA6UY0xiUBHPTLFOe4VNnNQpniNWYJEfZ1-I8" ] }, "Body": "" } }, { "ID": "a853ce25e734dbfd", "Request": { "Method": "GET", "URL": "https://www.googleapis.com/storage/v1/b?alt=json\u0026pageToken=\u0026prefix=go-integration-test\u0026prettyPrint=false\u0026project=deklerk-sandbox\u0026projection=full", "Header": { "Accept-Encoding": [ "gzip" ], "User-Agent": [ "google-api-go-client/0.5" ] }, "MediaType": "", "BodyParts": [ "" ] }, "Response": { "StatusCode": 200, "Proto": "HTTP/1.1", "ProtoMajor": 1, "ProtoMinor": 1, "Header": { "Alt-Svc": [ "quic=\":443\"; ma=2592000; v=\"46,44,43,39\"" ], "Cache-Control": [ "private, max-age=0, must-revalidate, no-transform" ], "Content-Length": [ "47300" ], "Content-Type": [ "application/json; charset=UTF-8" ], "Date": [ "Thu, 02 May 2019 22:26:39 GMT" ], "Expires": [ "Thu, 02 May 2019 22:26:39 GMT" ], "Server": [ "UploadServer" ], "Vary": [ "Origin", "X-Origin" ], "X-Guploader-Customer": [ "apiary_cloudstorage_metadata" ], "X-Guploader-Request-Result": [ "success" ], "X-Guploader-Upload-Result": [ "success" ], "X-Guploader-Uploadid": [ "AEnB2UrnXhEY-kWgvl-XqP1kXnVDpQphHD9znE-EyBBlFT-kHZtXEsAW5QG5PuzlaJPfQUwZqnTHP0wxu6YDbRCgDMB31UR760_lfEiX88PtVKIdTgCWm5A" ] }, "Body": "eyJraW5kIjoic3RvcmFnZSNidWNrZXRzIiwiaXRlbXMiOlt7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjU5NzcwNTEzMzE0Ni0wMDAxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjU5NzcwNTEzMzE0Ni0wMDAxIiwicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsIm5hbWUiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NTk3NzA1MTMzMTQ2LTAwMDEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMTg6Mjk6NTguNjAxWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDE4OjI5OjU4LjYwMVoiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NTk3NzA1MTMzMTQ2LTAwMDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NTk3NzA1MTMzMTQ2LTAwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY1OTc3MDUxMzMxNDYtMDAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjU5NzcwNTEzMzE0Ni0wMDAxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjU5NzcwNTEzMzE0Ni0wMDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjExNTA2OTA3NjAyLTAwMDEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjExNTA2OTA3NjAyLTAwMDEiLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MTE1MDY5MDc2MDItMDAwMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQxODozMDoxMi4yNjRaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMTg6MzA6MTIuMjY0WiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MTE1MDY5MDc2MDItMDAwMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MTE1MDY5MDc2MDItMDAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYxMTUwNjkwNzYwMi0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjExNTA2OTA3NjAyLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjExNTA2OTA3NjAyLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MzM5NjU0MjA4MTgtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MzM5NjU0MjA4MTgtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYzMzk2NTQyMDgxOC0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDE4OjMwOjM0LjY2MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQxODozMDozNC42NjJaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYzMzk2NTQyMDgxOC0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi02NjYzMzk2NTQyMDgxOC0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTY2NjMzOTY1NDIwODE4LTAwMDEvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MzM5NjU0MjA4MTgtMDAwMS9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNjY2MzM5NjU0MjA4MTgtMDAwMSIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03ODI5NDExMzUxNDUxOS0wMDAxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03ODI5NDExMzUxNDUxOS0wMDAxIiwicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsIm5hbWUiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc4Mjk0MTEzNTE0NTE5LTAwMDEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjE6NDQ6NTQuOTYwWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIxOjQ0OjU0Ljk2MFoiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc4Mjk0MTEzNTE0NTE5LTAwMDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc4Mjk0MTEzNTE0NTE5LTAwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzgyOTQxMTM1MTQ1MTktMDAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03ODI5NDExMzUxNDUxOS0wMDAxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03ODI5NDExMzUxNDUxOS0wMDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTciLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxNyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjowNTozNC4zNzVaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MDU6MzYuMzQxWiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxNy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTcvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjowNTozNC4zNzVaIiwiaXNMb2NrZWQiOnRydWV9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjA1OjM3LjczM1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjowNTozNy43MzNaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE4L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTM4NTEzMzM4MjgyNS0wMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5Mzg1MTMzMzgyODI1LTAwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxOC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzkzODUxMzMzODI4MjUtMDAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjA1OjM3LjczM1oifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTExNTk1OTI0OTAzLTAwMDEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTExNTk1OTI0OTAzLTAwMDEiLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5MTE1OTU5MjQ5MDMtMDAwMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoxMTo1Mi4zNThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MTE6NTIuMzU4WiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5MTE1OTU5MjQ5MDMtMDAwMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5MTE1OTU5MjQ5MDMtMDAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkxMTU5NTkyNDkwMy0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTExNTk1OTI0OTAzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTExNTk1OTI0OTAzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjEyOjA5LjcwNloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoxMzo0MS42MzRaIiwibWV0YWdlbmVyYXRpb24iOiIxMyIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0EwPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQTA9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7ImwxIjoidjIiLCJuZXciOiJuZXcifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTciLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxNyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoxNDoxNy40ODZaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MTQ6MTguOTA1WiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxNy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTcvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoxNDoxNy40ODZaIiwiaXNMb2NrZWQiOnRydWV9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjE0OjIwLjEwNVoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoxNDoyMC4xMDVaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE4L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi03OTkyODcyNzk4MjM5My0wMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTc5OTI4NzI3OTgyMzkzLTAwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxOC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItNzk5Mjg3Mjc5ODIzOTMtMDAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjE0OjIwLjEwNVoifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDEiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDEiLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMSIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoxODo0Ny4zOThaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MTg6NDcuMzk4WiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMS9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMS9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMiIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMiIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAyIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjE4OjQ4LjExNFoiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoxODo0OC4xMTRaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAyL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMyNjU4OTQwMzQ0Ni0wMDAyL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzI2NTg5NDAzNDQ2LTAwMDIvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMi9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMjY1ODk0MDM0NDYtMDAwMiIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInN0b3JhZ2VDbGFzcyI6IlNUQU5EQVJEIiwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAxIiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAxIiwicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsIm5hbWUiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDEiLCJ0aW1lQ3JlYXRlZCI6IjIwMTktMDUtMDJUMjI6MTg6NTQuNzAxWiIsInVwZGF0ZWQiOiIyMDE5LTA1LTAyVDIyOjE4OjU0LjcwMVoiLCJtZXRhZ2VuZXJhdGlvbiI6IjEiLCJhY2wiOlt7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMS9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDEvYWNsL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMSIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDEvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMS9hY2wvcHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMSIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMS9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAxL2FjbC9wcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAxIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImRlZmF1bHRPYmplY3RBY2wiOlt7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6ImVkaXRvcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiaWFtQ29uZmlndXJhdGlvbiI6eyJidWNrZXRQb2xpY3lPbmx5Ijp7ImVuYWJsZWQiOmZhbHNlfX0sIm93bmVyIjp7ImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCJ9LCJsb2NhdGlvbiI6IlVTIiwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDIiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDIiLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMiIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoxODo1NS4yOTNaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MTg6NTUuMjkzWiIsIm1ldGFnZW5lcmF0aW9uIjoiMSIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyL3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMi9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODAzMzM5NTUzMDM1MzktMDAwMi9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyL2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDMzMzk1NTMwMzUzOS0wMDAyL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDIvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwMzMzOTU1MzAzNTM5LTAwMDIiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FFPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAwMSIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAwMSIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDAxIiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIwOjQ2Ljg5N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMjowNy40MjlaIiwibWV0YWdlbmVyYXRpb24iOiIxMyIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDAxL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDAxL2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDAxL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMDEiLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0EwPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQTA9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQTA9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJ2ZXJzaW9uaW5nIjp7ImVuYWJsZWQiOmZhbHNlfSwibGlmZWN5Y2xlIjp7InJ1bGUiOlt7ImFjdGlvbiI6eyJ0eXBlIjoiRGVsZXRlIn0sImNvbmRpdGlvbiI6eyJhZ2UiOjMwfX1dfSwibGFiZWxzIjp7Im5ldyI6Im5ldyIsImwxIjoidjIifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0EwPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTciLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxNyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMjo1MC40MjhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjI6NTEuOTM1WiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxNy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTcvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyMjo1MC40MjhaIiwiaXNMb2NrZWQiOnRydWV9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjIyOjUyLjk2MloiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyMjo1Mi45NjJaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE4L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDQ0NTgzMDQzMDgwOC0wMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNDQ1ODMwNDMwODA4LTAwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxOC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA0NDU4MzA0MzA4MDgtMDAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjIyOjUyLjk2MloifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0IiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwibmFtZSI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNyIsInRpbWVDcmVhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIiwidXBkYXRlZCI6IjIwMTktMDUtMDJUMjI6MjY6MDMuNTQ0WiIsIm1ldGFnZW5lcmF0aW9uIjoiMiIsImFjbCI6W3sia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L3Byb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNy9hY2wvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBST0ifSx7ImtpbmQiOiJzdG9yYWdlI2J1Y2tldEFjY2Vzc0NvbnRyb2wiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxNy9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L2FjbC9wcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0IiwiYnVja2V0IjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3IiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE3L3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTcvYWNsL3Byb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTciLCJlbnRpdHkiOiJwcm9qZWN0LXZpZXdlcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6IlJFQURFUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoidmlld2VycyJ9LCJldGFnIjoiQ0FJPSJ9XSwiZGVmYXVsdE9iamVjdEFjbCI6W3sia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtb3duZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoib3duZXJzIn0sImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1lZGl0b3JzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJPV05FUiIsInByb2plY3RUZWFtIjp7InByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJ0ZWFtIjoiZWRpdG9ycyJ9LCJldGFnIjoiQ0FJPSJ9LHsia2luZCI6InN0b3JhZ2Ujb2JqZWN0QWNjZXNzQ29udHJvbCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUk9In1dLCJpYW1Db25maWd1cmF0aW9uIjp7ImJ1Y2tldFBvbGljeU9ubHkiOnsiZW5hYmxlZCI6ZmFsc2V9fSwib3duZXIiOnsiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0In0sImxvY2F0aW9uIjoiVVMiLCJyZXRlbnRpb25Qb2xpY3kiOnsicmV0ZW50aW9uUGVyaW9kIjoiOTAwMDAiLCJlZmZlY3RpdmVUaW1lIjoiMjAxOS0wNS0wMlQyMjoyNjowMS45MDhaIiwiaXNMb2NrZWQiOnRydWV9LCJzdG9yYWdlQ2xhc3MiOiJTVEFOREFSRCIsImV0YWciOiJDQUk9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXQiLCJpZCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsInByb2plY3ROdW1iZXIiOiI0OTYxNjk2MDE3MTQiLCJuYW1lIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4IiwidGltZUNyZWF0ZWQiOiIyMDE5LTA1LTAyVDIyOjI2OjE1LjA5N1oiLCJ1cGRhdGVkIjoiMjAxOS0wNS0wMlQyMjoyNjoxNS4wOTdaIiwibWV0YWdlbmVyYXRpb24iOiIxIiwiYWNsIjpbeyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgvcHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwic2VsZkxpbmsiOiJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9zdG9yYWdlL3YxL2IvZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4L2FjbC9wcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiT1dORVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6Im93bmVycyJ9LCJldGFnIjoiQ0FFPSJ9LHsia2luZCI6InN0b3JhZ2UjYnVja2V0QWNjZXNzQ29udHJvbCIsImlkIjoiZ28taW50ZWdyYXRpb24tdGVzdC0yMDE5MDUwMi04MDYzMzQwMzQzMjAxMy0wMDE4L3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJzZWxmTGluayI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3N0b3JhZ2UvdjEvYi9nby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgvYWNsL3Byb2plY3QtZWRpdG9ycy00OTYxNjk2MDE3MTQiLCJidWNrZXQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNidWNrZXRBY2Nlc3NDb250cm9sIiwiaWQiOiJnby1pbnRlZ3JhdGlvbi10ZXN0LTIwMTkwNTAyLTgwNjMzNDAzNDMyMDEzLTAwMTgvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInNlbGZMaW5rIjoiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vc3RvcmFnZS92MS9iL2dvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOC9hY2wvcHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsImJ1Y2tldCI6ImdvLWludGVncmF0aW9uLXRlc3QtMjAxOTA1MDItODA2MzM0MDM0MzIwMTMtMDAxOCIsImVudGl0eSI6InByb2plY3Qtdmlld2Vycy00OTYxNjk2MDE3MTQiLCJyb2xlIjoiUkVBREVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJ2aWV3ZXJzIn0sImV0YWciOiJDQUU9In1dLCJkZWZhdWx0T2JqZWN0QWNsIjpbeyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC1vd25lcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJvd25lcnMifSwiZXRhZyI6IkNBRT0ifSx7ImtpbmQiOiJzdG9yYWdlI29iamVjdEFjY2Vzc0NvbnRyb2wiLCJlbnRpdHkiOiJwcm9qZWN0LWVkaXRvcnMtNDk2MTY5NjAxNzE0Iiwicm9sZSI6Ik9XTkVSIiwicHJvamVjdFRlYW0iOnsicHJvamVjdE51bWJlciI6IjQ5NjE2OTYwMTcxNCIsInRlYW0iOiJlZGl0b3JzIn0sImV0YWciOiJDQUU9In0seyJraW5kIjoic3RvcmFnZSNvYmplY3RBY2Nlc3NDb250cm9sIiwiZW50aXR5IjoicHJvamVjdC12aWV3ZXJzLTQ5NjE2OTYwMTcxNCIsInJvbGUiOiJSRUFERVIiLCJwcm9qZWN0VGVhbSI6eyJwcm9qZWN0TnVtYmVyIjoiNDk2MTY5NjAxNzE0IiwidGVhbSI6InZpZXdlcnMifSwiZXRhZyI6IkNBRT0ifV0sImlhbUNvbmZpZ3VyYXRpb24iOnsiYnVja2V0UG9saWN5T25seSI6eyJlbmFibGVkIjpmYWxzZX19LCJvd25lciI6eyJlbnRpdHkiOiJwcm9qZWN0LW93bmVycy00OTYxNjk2MDE3MTQifSwibG9jYXRpb24iOiJVUyIsInJldGVudGlvblBvbGljeSI6eyJyZXRlbnRpb25QZXJpb2QiOiI5MDAwMCIsImVmZmVjdGl2ZVRpbWUiOiIyMDE5LTA1LTAyVDIyOjI2OjE1LjA5N1oifSwic3RvcmFnZUNsYXNzIjoiU1RBTkRBUkQiLCJldGFnIjoiQ0FFPSJ9XX0=" } } ] } ================================================ FILE: vendor/cloud.google.com/go/storage/trace.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "fmt" "os" internalTrace "cloud.google.com/go/internal/trace" "cloud.google.com/go/storage/internal" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" otelcodes "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" ) const ( storageOtelTracingDevVar = "GO_STORAGE_DEV_OTEL_TRACING" defaultTracerName = "cloud.google.com/go/storage" gcpClientRepo = "googleapis/google-cloud-go" gcpClientArtifact = "cloud.google.com/go/storage" ) // isOTelTracingDevEnabled checks the development flag until experimental feature is launched. // TODO: Remove development flag upon experimental launch. func isOTelTracingDevEnabled() bool { return os.Getenv(storageOtelTracingDevVar) == "true" } func tracer() trace.Tracer { return otel.Tracer(defaultTracerName, trace.WithInstrumentationVersion(internal.Version)) } // startSpan creates a span and a context.Context containing the newly-created span. // If the context.Context provided in `ctx` contains a span then the newly-created // span will be a child of that span, otherwise it will be a root span. func startSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { name = appendPackageName(name) // TODO: Remove internalTrace upon experimental launch. if !isOTelTracingDevEnabled() { ctx = internalTrace.StartSpan(ctx, name) return ctx, nil } opts = append(opts, getCommonTraceOptions()...) ctx, span := tracer().Start(ctx, name, opts...) return ctx, span } // endSpan retrieves the current span from ctx and completes the span. // If an error occurs, the error is recorded as an exception span event for this span, // and the span status is set in the form of a code and a description. func endSpan(ctx context.Context, err error) { // TODO: Remove internalTrace upon experimental launch. if !isOTelTracingDevEnabled() { internalTrace.EndSpan(ctx, err) } else { span := trace.SpanFromContext(ctx) if err != nil { span.SetStatus(otelcodes.Error, err.Error()) span.RecordError(err) } span.End() } } // getCommonTraceOptions makes a SpanStartOption with common attributes. func getCommonTraceOptions() []trace.SpanStartOption { opts := []trace.SpanStartOption{ trace.WithAttributes(getCommonAttributes()...), } return opts } // getCommonAttributes includes the common attributes used for Cloud Trace adoption tracking. func getCommonAttributes() []attribute.KeyValue { return []attribute.KeyValue{ attribute.String("gcp.client.version", internal.Version), attribute.String("gcp.client.repo", gcpClientRepo), attribute.String("gcp.client.artifact", gcpClientArtifact), } } func appendPackageName(spanName string) string { return fmt.Sprintf("%s.%s", gcpClientArtifact, spanName) } ================================================ FILE: vendor/cloud.google.com/go/storage/writer.go ================================================ // Copyright 2014 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package storage import ( "context" "errors" "fmt" "io" "sync" "time" "unicode/utf8" "cloud.google.com/go/internal/trace" ) // A Writer writes a Cloud Storage object. type Writer struct { // ObjectAttrs are optional attributes to set on the object. Any attributes // must be initialized before the first Write call. Nil or zero-valued // attributes are ignored. ObjectAttrs // SendCRC32C specifies whether to transmit a CRC32C field. It should be set // to true in addition to setting the Writer's CRC32C field, because zero // is a valid CRC and normally a zero would not be transmitted. // If a CRC32C is sent, and the data written does not match the checksum, // the write will be rejected. // // Note: SendCRC32C must be set to true BEFORE the first call to // Writer.Write() in order to send the checksum. If it is set after that // point, the checksum will be ignored. SendCRC32C bool // ChunkSize controls the maximum number of bytes of the object that the // Writer will attempt to send to the server in a single request. Objects // smaller than the size will be sent in a single request, while larger // objects will be split over multiple requests. The value will be rounded up // to the nearest multiple of 256K. The default ChunkSize is 16MiB. // // Each Writer will internally allocate a buffer of size ChunkSize. This is // used to buffer input data and allow for the input to be sent again if a // request must be retried. // // If you upload small objects (< 16MiB), you should set ChunkSize // to a value slightly larger than the objects' sizes to avoid memory bloat. // This is especially important if you are uploading many small objects // concurrently. See // https://cloud.google.com/storage/docs/json_api/v1/how-tos/upload#size // for more information about performance trade-offs related to ChunkSize. // // If ChunkSize is set to zero, chunking will be disabled and the object will // be uploaded in a single request without the use of a buffer. This will // further reduce memory used during uploads, but will also prevent the writer // from retrying in case of a transient error from the server or resuming an // upload that fails midway through, since the buffer is required in order to // retry the failed request. // // ChunkSize must be set before the first Write call. ChunkSize int // ChunkRetryDeadline sets a per-chunk retry deadline for multi-chunk // resumable uploads. // // For uploads of larger files, the Writer will attempt to retry if the // request to upload a particular chunk fails with a transient error. // If a single chunk has been attempting to upload for longer than this // deadline and the request fails, it will no longer be retried, and the // error will be returned to the caller. This is only applicable for files // which are large enough to require a multi-chunk resumable upload. The // default value is 32s. Users may want to pick a longer deadline if they // are using larger values for ChunkSize or if they expect to have a slow or // unreliable internet connection. // // To set a deadline on the entire upload, use context timeout or // cancellation. ChunkRetryDeadline time.Duration // ChunkTransferTimeout sets a per-chunk request timeout for resumable uploads. // // For resumable uploads, the Writer will terminate the request and attempt // a retry if the request to upload a particular chunk stalls for longer than // this duration. Retries may continue until the ChunkRetryDeadline is reached. // // ChunkTransferTimeout is not applicable to uploads made using a gRPC client. // // The default value is no timeout. ChunkTransferTimeout time.Duration // ForceEmptyContentType is an optional parameter that is used to disable // auto-detection of Content-Type. By default, if a blank Content-Type // is provided, then gax.DetermineContentType is called to sniff the type. ForceEmptyContentType bool // Append is a parameter to indicate whether the writer should use appendable // object semantics for the new object generation. Appendable objects are // visible on the first Write() call, and can be appended to until they are // finalized. If Writer.FinalizeOnClose is set to true, the object is finalized // when Writer.Close() is called; otherwise, the object is left unfinalized // and can be appended to later. // // Defaults to false unless the experiemental WithZonalBucketAPIs option was // set. // // Append is only supported for gRPC. This feature is in preview and is not // yet available for general use. Append bool // FinalizeOnClose indicates whether the Writer should finalize an object when // closing the write stream. This only applies to Writers where Append is // true, since append semantics allow a prefix of the object to be durable and // readable. By default, objects written with Append semantics will not be // finalized, which means they can be appended to later. If Append is set // to false, this parameter will be ignored; non-appendable objects will // always be finalized when Writer.Close returns without error. // // This feature is in preview and is not yet available for general use. FinalizeOnClose bool // ProgressFunc can be used to monitor the progress of a large write // operation. If ProgressFunc is not nil and writing requires multiple // calls to the underlying service (see // https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload), // then ProgressFunc will be invoked after each call with the number of bytes of // content copied so far. // // ProgressFunc should return quickly without blocking. ProgressFunc func(int64) ctx context.Context o *ObjectHandle opened bool closed bool pw *io.PipeWriter donec chan struct{} // closed after err and obj are set. obj *ObjectAttrs mu sync.Mutex err error flush func() (int64, error) takeoverOffset int64 // offset from which the writer started appending to the object. } // Write appends to w. It implements the io.Writer interface. // // Since writes happen asynchronously, Write may return a nil // error even though the write failed (or will fail). Always // use the error returned from Writer.Close to determine if // the upload was successful. // // Writes will be retried on transient errors from the server, unless // Writer.ChunkSize has been set to zero. func (w *Writer) Write(p []byte) (n int, err error) { w.mu.Lock() werr := w.err w.mu.Unlock() if werr != nil { return 0, werr } if !w.opened { if err := w.openWriter(); err != nil { return 0, err } } n, err = w.pw.Write(p) if err != nil { w.mu.Lock() werr := w.err w.mu.Unlock() // Preserve existing functionality that when context is canceled, Write will return // context.Canceled instead of "io: read/write on closed pipe". This hides the // pipe implementation detail from users and makes Write seem as though it's an RPC. if errors.Is(werr, context.Canceled) || errors.Is(werr, context.DeadlineExceeded) { return n, werr } } return n, err } // Flush syncs all bytes currently in the Writer's buffer to Cloud Storage. // It returns the offset of bytes that have been currently synced to // Cloud Storage and an error. // // If Flush is never called, Writer will sync data automatically every // [Writer.ChunkSize] bytes and on [Writer.Close]. // // [Writer.ProgressFunc] will be called on Flush if present. // // Do not call Flush concurrently with Write or Close. A single Writer is not // safe for unsynchronized use across threads. // // Note that calling Flush very early (before 512 bytes) may interfere with // automatic content sniffing in the Writer. // // Flush is supported only on gRPC clients where [Writer.Append] is set // to true. This feature is in preview and is not yet available for general use. func (w *Writer) Flush() (int64, error) { // Return error if Append is not true. if !w.Append { return 0, errors.New("storage: Flush not supported unless client uses gRPC and Append is set to true") } if w.closed { return 0, errors.New("storage: Flush called on closed Writer") } // Return error if already in error state. w.mu.Lock() werr := w.err w.mu.Unlock() if werr != nil { return 0, werr } // If Flush called before any bytes written, it should start the upload // at zero bytes. This will make the object visible with zero length data. if !w.opened { err := w.openWriter() if err != nil { return 0, err } w.progress(0) } return w.flush() } // Close completes the write operation and flushes any buffered data. // If Close doesn't return an error, metadata about the written object // can be retrieved by calling Attrs. func (w *Writer) Close() error { if !w.opened { if err := w.openWriter(); err != nil { return err } } // Closing either the read or write causes the entire pipe to close. if err := w.pw.Close(); err != nil { return err } <-w.donec w.closed = true w.mu.Lock() defer w.mu.Unlock() trace.EndSpan(w.ctx, w.err) return w.err } func (w *Writer) openWriter() (err error) { if err := w.validateWriteAttrs(); err != nil { return err } if w.o.gen != defaultGen && !w.Append { return fmt.Errorf("storage: generation supported on Writer for appendable objects only, got %v", w.o.gen) } isIdempotent := w.o.conds != nil && (w.o.conds.GenerationMatch >= 0 || w.o.conds.DoesNotExist) opts := makeStorageOpts(isIdempotent, w.o.retry, w.o.userProject) params := &openWriterParams{ ctx: w.ctx, chunkSize: w.ChunkSize, chunkRetryDeadline: w.ChunkRetryDeadline, chunkTransferTimeout: w.ChunkTransferTimeout, bucket: w.o.bucket, attrs: &w.ObjectAttrs, conds: w.o.conds, appendGen: w.o.gen, encryptionKey: w.o.encryptionKey, sendCRC32C: w.SendCRC32C, append: w.Append, finalizeOnClose: w.FinalizeOnClose, donec: w.donec, setError: w.error, progress: w.progress, setObj: func(o *ObjectAttrs) { w.obj = o }, setFlush: func(f func() (int64, error)) { w.flush = f }, setSize: func(n int64) { if w.obj != nil { w.obj.Size = n } }, setPipeWriter: func(pw *io.PipeWriter) { w.pw = pw }, setTakeoverOffset: func(n int64) { w.takeoverOffset = n }, forceEmptyContentType: w.ForceEmptyContentType, } if err := w.ctx.Err(); err != nil { return err // short-circuit } w.pw, err = w.o.c.tc.OpenWriter(params, opts...) if err != nil { return err } w.opened = true go w.monitorCancel() return nil } // monitorCancel is intended to be used as a background goroutine. It monitors the // context, and when it observes that the context has been canceled, it manually // closes things that do not take a context. func (w *Writer) monitorCancel() { select { case <-w.ctx.Done(): w.mu.Lock() werr := w.ctx.Err() w.err = werr w.mu.Unlock() // Closing either the read or write causes the entire pipe to close. w.CloseWithError(werr) case <-w.donec: } } // CloseWithError aborts the write operation with the provided error. // CloseWithError always returns nil. // // Deprecated: cancel the context passed to NewWriter instead. func (w *Writer) CloseWithError(err error) error { if !w.opened { return nil } return w.pw.CloseWithError(err) } // Attrs returns metadata about a successfully-written object. // It's only valid to call it after Close returns nil. func (w *Writer) Attrs() *ObjectAttrs { return w.obj } func (w *Writer) validateWriteAttrs() error { attrs := w.ObjectAttrs // Check the developer didn't change the object Name (this is unfortunate, but // we don't want to store an object under the wrong name). if attrs.Name != w.o.object { return fmt.Errorf("storage: Writer.Name %q does not match object name %q", attrs.Name, w.o.object) } if !utf8.ValidString(attrs.Name) { return fmt.Errorf("storage: object name %q is not valid UTF-8", attrs.Name) } if attrs.KMSKeyName != "" && w.o.encryptionKey != nil { return errors.New("storage: cannot use KMSKeyName with a customer-supplied encryption key") } if w.ChunkSize < 0 { return errors.New("storage: Writer.ChunkSize must be non-negative") } return nil } // progress is a convenience wrapper that reports write progress to the Writer // ProgressFunc if it is set. func (w *Writer) progress(p int64) { if w.ProgressFunc != nil { w.ProgressFunc(p) } } // error acquires the Writer's lock, sets the Writer's err to the given error, // then relinquishes the lock. func (w *Writer) error(err error) { w.mu.Lock() w.err = err w.mu.Unlock() } ================================================ FILE: vendor/dario.cat/mergo/.deepsource.toml ================================================ version = 1 test_patterns = [ "*_test.go" ] [[analyzers]] name = "go" enabled = true [analyzers.meta] import_path = "dario.cat/mergo" ================================================ FILE: vendor/dario.cat/mergo/.gitignore ================================================ #### joe made this: http://goel.io/joe #### go #### # Binaries for programs and plugins *.exe *.dll *.so *.dylib # Test binary, build with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Golang/Intellij .idea # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 .glide/ #### vim #### # Swap [._]*.s[a-v][a-z] [._]*.sw[a-p] [._]s[a-v][a-z] [._]sw[a-p] # Session Session.vim # Temporary .netrwhist *~ # Auto-generated tag files tags ================================================ FILE: vendor/dario.cat/mergo/.travis.yml ================================================ language: go arch: - amd64 - ppc64le install: - go get -t - go get golang.org/x/tools/cmd/cover - go get github.com/mattn/goveralls script: - go test -race -v ./... after_script: - $HOME/gopath/bin/goveralls -service=travis-ci -repotoken $COVERALLS_TOKEN ================================================ FILE: vendor/dario.cat/mergo/CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at i@dario.im. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ ================================================ FILE: vendor/dario.cat/mergo/CONTRIBUTING.md ================================================ # Contributing to mergo First off, thanks for taking the time to contribute! ❤️ All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉 > And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about: > - Star the project > - Tweet about it > - Refer this project in your project's readme > - Mention the project at local meetups and tell your friends/colleagues ## Table of Contents - [Code of Conduct](#code-of-conduct) - [I Have a Question](#i-have-a-question) - [I Want To Contribute](#i-want-to-contribute) - [Reporting Bugs](#reporting-bugs) - [Suggesting Enhancements](#suggesting-enhancements) ## Code of Conduct This project and everyone participating in it is governed by the [mergo Code of Conduct](https://github.com/imdario/mergoblob/master/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to <>. ## I Have a Question > If you want to ask a question, we assume that you have read the available [Documentation](https://pkg.go.dev/github.com/imdario/mergo). Before you ask a question, it is best to search for existing [Issues](https://github.com/imdario/mergo/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first. If you then still feel the need to ask a question and need clarification, we recommend the following: - Open an [Issue](https://github.com/imdario/mergo/issues/new). - Provide as much context as you can about what you're running into. - Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant. We will then take care of the issue as soon as possible. ## I Want To Contribute > ### Legal Notice > When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license. ### Reporting Bugs #### Before Submitting a Bug Report A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible. - Make sure that you are using the latest version. - Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](). If you are looking for support, you might want to check [this section](#i-have-a-question)). - To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/imdario/mergoissues?q=label%3Abug). - Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue. - Collect information about the bug: - Stack trace (Traceback) - OS, Platform and Version (Windows, Linux, macOS, x86, ARM) - Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant. - Possibly your input and the output - Can you reliably reproduce the issue? And can you also reproduce it with older versions? #### How Do I Submit a Good Bug Report? > You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to . We use GitHub issues to track bugs and errors. If you run into an issue with the project: - Open an [Issue](https://github.com/imdario/mergo/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.) - Explain the behavior you would expect and the actual behavior. - Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case. - Provide the information you collected in the previous section. Once it's filed: - The project team will label the issue accordingly. - A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced. - If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be implemented by someone. ### Suggesting Enhancements This section guides you through submitting an enhancement suggestion for mergo, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions. #### Before Submitting an Enhancement - Make sure that you are using the latest version. - Read the [documentation]() carefully and find out if the functionality is already covered, maybe by an individual configuration. - Perform a [search](https://github.com/imdario/mergo/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. - Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library. #### How Do I Submit a Good Enhancement Suggestion? Enhancement suggestions are tracked as [GitHub issues](https://github.com/imdario/mergo/issues). - Use a **clear and descriptive title** for the issue to identify the suggestion. - Provide a **step-by-step description of the suggested enhancement** in as many details as possible. - **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you. - You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. - **Explain why this enhancement would be useful** to most mergo users. You may also want to point out the other projects that solved it better and which could serve as inspiration. ## Attribution This guide is based on the **contributing-gen**. [Make your own](https://github.com/bttger/contributing-gen)! ================================================ FILE: vendor/dario.cat/mergo/FUNDING.json ================================================ { "drips": { "ethereum": { "ownedBy": "0x6160020e7102237aC41bdb156e94401692D76930" } } } ================================================ FILE: vendor/dario.cat/mergo/LICENSE ================================================ Copyright (c) 2013 Dario Castañé. All rights reserved. Copyright (c) 2012 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS 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 OWNER 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. ================================================ FILE: vendor/dario.cat/mergo/README.md ================================================ # Mergo [![GitHub release][5]][6] [![GoCard][7]][8] [![Test status][1]][2] [![OpenSSF Scorecard][21]][22] [![OpenSSF Best Practices][19]][20] [![Coverage status][9]][10] [![Sourcegraph][11]][12] [![FOSSA status][13]][14] [![GoDoc][3]][4] [![Become my sponsor][15]][16] [![Tidelift][17]][18] [1]: https://github.com/imdario/mergo/workflows/tests/badge.svg?branch=master [2]: https://github.com/imdario/mergo/actions/workflows/tests.yml [3]: https://godoc.org/github.com/imdario/mergo?status.svg [4]: https://godoc.org/github.com/imdario/mergo [5]: https://img.shields.io/github/release/imdario/mergo.svg [6]: https://github.com/imdario/mergo/releases [7]: https://goreportcard.com/badge/imdario/mergo [8]: https://goreportcard.com/report/github.com/imdario/mergo [9]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master [10]: https://coveralls.io/github/imdario/mergo?branch=master [11]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg [12]: https://sourcegraph.com/github.com/imdario/mergo?badge [13]: https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield [14]: https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield [15]: https://img.shields.io/github/sponsors/imdario [16]: https://github.com/sponsors/imdario [17]: https://tidelift.com/badges/package/go/github.com%2Fimdario%2Fmergo [18]: https://tidelift.com/subscription/pkg/go-github.com-imdario-mergo [19]: https://bestpractices.coreinfrastructure.org/projects/7177/badge [20]: https://bestpractices.coreinfrastructure.org/projects/7177 [21]: https://api.securityscorecards.dev/projects/github.com/imdario/mergo/badge [22]: https://api.securityscorecards.dev/projects/github.com/imdario/mergo A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. ## Status Mergo is stable and frozen, ready for production. Check a short list of the projects using at large scale it [here](https://github.com/imdario/mergo#mergo-in-the-wild). No new features are accepted. They will be considered for a future v2 that improves the implementation and fixes bugs for corner cases. ### Important notes #### 1.0.0 In [1.0.0](//github.com/imdario/mergo/releases/tag/1.0.0) Mergo moves to a vanity URL `dario.cat/mergo`. No more v1 versions will be released. If the vanity URL is causing issues in your project due to a dependency pulling Mergo - it isn't a direct dependency in your project - it is recommended to use [replace](https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive) to pin the version to the last one with the old import URL: ``` replace github.com/imdario/mergo => github.com/imdario/mergo v0.3.16 ``` #### 0.3.9 Please keep in mind that a problematic PR broke [0.3.9](//github.com/imdario/mergo/releases/tag/0.3.9). I reverted it in [0.3.10](//github.com/imdario/mergo/releases/tag/0.3.10), and I consider it stable but not bug-free. Also, this version adds support for go modules. Keep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2), Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). I added an optional/variadic argument so that it won't break the existing code. If you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with ```go get -u dario.cat/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0). ### Donations If Mergo is useful to you, consider buying me a coffee, a beer, or making a monthly donation to allow me to keep building great free software. :heart_eyes: Donate using Liberapay Become my sponsor ### Mergo in the wild Mergo is used by [thousands](https://deps.dev/go/dario.cat%2Fmergo/v1.0.0/dependents) [of](https://deps.dev/go/github.com%2Fimdario%2Fmergo/v0.3.16/dependents) [projects](https://deps.dev/go/github.com%2Fimdario%2Fmergo/v0.3.12), including: * [containerd/containerd](https://github.com/containerd/containerd) * [datadog/datadog-agent](https://github.com/datadog/datadog-agent) * [docker/cli/](https://github.com/docker/cli/) * [goreleaser/goreleaser](https://github.com/goreleaser/goreleaser) * [go-micro/go-micro](https://github.com/go-micro/go-micro) * [grafana/loki](https://github.com/grafana/loki) * [masterminds/sprig](github.com/Masterminds/sprig) * [moby/moby](https://github.com/moby/moby) * [slackhq/nebula](https://github.com/slackhq/nebula) * [volcano-sh/volcano](https://github.com/volcano-sh/volcano) ## Install go get dario.cat/mergo // use in your .go code import ( "dario.cat/mergo" ) ## Usage You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are zero values](https://golang.org/ref/spec#The_zero_value) too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). ```go if err := mergo.Merge(&dst, src); err != nil { // ... } ``` Also, you can merge overwriting values using the transformer `WithOverride`. ```go if err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil { // ... } ``` If you need to override pointers, so the source pointer's value is assigned to the destination's pointer, you must use `WithoutDereference`: ```go package main import ( "fmt" "dario.cat/mergo" ) type Foo struct { A *string B int64 } func main() { first := "first" second := "second" src := Foo{ A: &first, B: 2, } dest := Foo{ A: &second, B: 1, } mergo.Merge(&dest, src, mergo.WithOverride, mergo.WithoutDereference) } ``` Additionally, you can map a `map[string]interface{}` to a struct (and otherwise, from struct to map), following the same restrictions as in `Merge()`. Keys are capitalized to find each corresponding exported field. ```go if err := mergo.Map(&dst, srcMap); err != nil { // ... } ``` Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as `map[string]interface{}`. They will be just assigned as values. Here is a nice example: ```go package main import ( "fmt" "dario.cat/mergo" ) type Foo struct { A string B int64 } func main() { src := Foo{ A: "one", B: 2, } dest := Foo{ A: "two", } mergo.Merge(&dest, src) fmt.Println(dest) // Will print // {two 2} } ``` ### Transformers Transformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, `time.Time` is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero `time.Time`? ```go package main import ( "fmt" "dario.cat/mergo" "reflect" "time" ) type timeTransformer struct { } func (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { if typ == reflect.TypeOf(time.Time{}) { return func(dst, src reflect.Value) error { if dst.CanSet() { isZero := dst.MethodByName("IsZero") result := isZero.Call([]reflect.Value{}) if result[0].Bool() { dst.Set(src) } } return nil } } return nil } type Snapshot struct { Time time.Time // ... } func main() { src := Snapshot{time.Now()} dest := Snapshot{} mergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{})) fmt.Println(dest) // Will print // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } } ``` ## Contact me If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): [@im_dario](https://twitter.com/im_dario) ## About Written by [Dario Castañé](http://dario.im). ## License [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE). [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_large) ================================================ FILE: vendor/dario.cat/mergo/SECURITY.md ================================================ # Security Policy ## Supported Versions | Version | Supported | | ------- | ------------------ | | 1.x.x | :white_check_mark: | | < 1.0 | :x: | ## Security contact information To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. ================================================ FILE: vendor/dario.cat/mergo/doc.go ================================================ // Copyright 2013 Dario Castañé. All rights reserved. // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. /* A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). # Status It is ready for production use. It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc. # Important notes 1.0.0 In 1.0.0 Mergo moves to a vanity URL `dario.cat/mergo`. 0.3.9 Please keep in mind that a problematic PR broke 0.3.9. We reverted it in 0.3.10. We consider 0.3.10 as stable but not bug-free. . Also, this version adds suppot for go modules. Keep in mind that in 0.3.2, Mergo changed Merge() and Map() signatures to support transformers. We added an optional/variadic argument so that it won't break the existing code. If you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with go get -u dario.cat/mergo. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0). # Install Do your usual installation procedure: go get dario.cat/mergo // use in your .go code import ( "dario.cat/mergo" ) # Usage You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as they are zero values too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). if err := mergo.Merge(&dst, src); err != nil { // ... } Also, you can merge overwriting values using the transformer WithOverride. if err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil { // ... } Additionally, you can map a map[string]interface{} to a struct (and otherwise, from struct to map), following the same restrictions as in Merge(). Keys are capitalized to find each corresponding exported field. if err := mergo.Map(&dst, srcMap); err != nil { // ... } Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as map[string]interface{}. They will be just assigned as values. Here is a nice example: package main import ( "fmt" "dario.cat/mergo" ) type Foo struct { A string B int64 } func main() { src := Foo{ A: "one", B: 2, } dest := Foo{ A: "two", } mergo.Merge(&dest, src) fmt.Println(dest) // Will print // {two 2} } # Transformers Transformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, time.Time is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero time.Time? package main import ( "fmt" "dario.cat/mergo" "reflect" "time" ) type timeTransformer struct { } func (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { if typ == reflect.TypeOf(time.Time{}) { return func(dst, src reflect.Value) error { if dst.CanSet() { isZero := dst.MethodByName("IsZero") result := isZero.Call([]reflect.Value{}) if result[0].Bool() { dst.Set(src) } } return nil } } return nil } type Snapshot struct { Time time.Time // ... } func main() { src := Snapshot{time.Now()} dest := Snapshot{} mergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{})) fmt.Println(dest) // Will print // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } } # Contact me If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): https://twitter.com/im_dario # About Written by Dario Castañé: https://da.rio.hn # License BSD 3-Clause license, as Go language. */ package mergo ================================================ FILE: vendor/dario.cat/mergo/map.go ================================================ // Copyright 2014 Dario Castañé. All rights reserved. // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Based on src/pkg/reflect/deepequal.go from official // golang's stdlib. package mergo import ( "fmt" "reflect" "unicode" "unicode/utf8" ) func changeInitialCase(s string, mapper func(rune) rune) string { if s == "" { return s } r, n := utf8.DecodeRuneInString(s) return string(mapper(r)) + s[n:] } func isExported(field reflect.StructField) bool { r, _ := utf8.DecodeRuneInString(field.Name) return r >= 'A' && r <= 'Z' } // Traverses recursively both values, assigning src's fields values to dst. // The map argument tracks comparisons that have already been seen, which allows // short circuiting on recursive types. func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { overwrite := config.Overwrite if dst.CanAddr() { addr := dst.UnsafeAddr() h := 17 * addr seen := visited[h] typ := dst.Type() for p := seen; p != nil; p = p.next { if p.ptr == addr && p.typ == typ { return nil } } // Remember, remember... visited[h] = &visit{typ, seen, addr} } zeroValue := reflect.Value{} switch dst.Kind() { case reflect.Map: dstMap := dst.Interface().(map[string]interface{}) for i, n := 0, src.NumField(); i < n; i++ { srcType := src.Type() field := srcType.Field(i) if !isExported(field) { continue } fieldName := field.Name fieldName = changeInitialCase(fieldName, unicode.ToLower) if _, ok := dstMap[fieldName]; !ok || (!isEmptyValue(reflect.ValueOf(src.Field(i).Interface()), !config.ShouldNotDereference) && overwrite) || config.overwriteWithEmptyValue { dstMap[fieldName] = src.Field(i).Interface() } } case reflect.Ptr: if dst.IsNil() { v := reflect.New(dst.Type().Elem()) dst.Set(v) } dst = dst.Elem() fallthrough case reflect.Struct: srcMap := src.Interface().(map[string]interface{}) for key := range srcMap { config.overwriteWithEmptyValue = true srcValue := srcMap[key] fieldName := changeInitialCase(key, unicode.ToUpper) dstElement := dst.FieldByName(fieldName) if dstElement == zeroValue { // We discard it because the field doesn't exist. continue } srcElement := reflect.ValueOf(srcValue) dstKind := dstElement.Kind() srcKind := srcElement.Kind() if srcKind == reflect.Ptr && dstKind != reflect.Ptr { srcElement = srcElement.Elem() srcKind = reflect.TypeOf(srcElement.Interface()).Kind() } else if dstKind == reflect.Ptr { // Can this work? I guess it can't. if srcKind != reflect.Ptr && srcElement.CanAddr() { srcPtr := srcElement.Addr() srcElement = reflect.ValueOf(srcPtr) srcKind = reflect.Ptr } } if !srcElement.IsValid() { continue } if srcKind == dstKind { if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { return } } else if dstKind == reflect.Interface && dstElement.Kind() == reflect.Interface { if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { return } } else if srcKind == reflect.Map { if err = deepMap(dstElement, srcElement, visited, depth+1, config); err != nil { return } } else { return fmt.Errorf("type mismatch on %s field: found %v, expected %v", fieldName, srcKind, dstKind) } } } return } // Map sets fields' values in dst from src. // src can be a map with string keys or a struct. dst must be the opposite: // if src is a map, dst must be a valid pointer to struct. If src is a struct, // dst must be map[string]interface{}. // It won't merge unexported (private) fields and will do recursively // any exported field. // If dst is a map, keys will be src fields' names in lower camel case. // Missing key in src that doesn't match a field in dst will be skipped. This // doesn't apply if dst is a map. // This is separated method from Merge because it is cleaner and it keeps sane // semantics: merging equal types, mapping different (restricted) types. func Map(dst, src interface{}, opts ...func(*Config)) error { return _map(dst, src, opts...) } // MapWithOverwrite will do the same as Map except that non-empty dst attributes will be overridden by // non-empty src attribute values. // Deprecated: Use Map(…) with WithOverride func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { return _map(dst, src, append(opts, WithOverride)...) } func _map(dst, src interface{}, opts ...func(*Config)) error { if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { return ErrNonPointerArgument } var ( vDst, vSrc reflect.Value err error ) config := &Config{} for _, opt := range opts { opt(config) } if vDst, vSrc, err = resolveValues(dst, src); err != nil { return err } // To be friction-less, we redirect equal-type arguments // to deepMerge. Only because arguments can be anything. if vSrc.Kind() == vDst.Kind() { return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) } switch vSrc.Kind() { case reflect.Struct: if vDst.Kind() != reflect.Map { return ErrExpectedMapAsDestination } case reflect.Map: if vDst.Kind() != reflect.Struct { return ErrExpectedStructAsDestination } default: return ErrNotSupported } return deepMap(vDst, vSrc, make(map[uintptr]*visit), 0, config) } ================================================ FILE: vendor/dario.cat/mergo/merge.go ================================================ // Copyright 2013 Dario Castañé. All rights reserved. // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Based on src/pkg/reflect/deepequal.go from official // golang's stdlib. package mergo import ( "fmt" "reflect" ) func hasMergeableFields(dst reflect.Value) (exported bool) { for i, n := 0, dst.NumField(); i < n; i++ { field := dst.Type().Field(i) if field.Anonymous && dst.Field(i).Kind() == reflect.Struct { exported = exported || hasMergeableFields(dst.Field(i)) } else if isExportedComponent(&field) { exported = exported || len(field.PkgPath) == 0 } } return } func isExportedComponent(field *reflect.StructField) bool { pkgPath := field.PkgPath if len(pkgPath) > 0 { return false } c := field.Name[0] if 'a' <= c && c <= 'z' || c == '_' { return false } return true } type Config struct { Transformers Transformers Overwrite bool ShouldNotDereference bool AppendSlice bool TypeCheck bool overwriteWithEmptyValue bool overwriteSliceWithEmptyValue bool sliceDeepCopy bool debug bool } type Transformers interface { Transformer(reflect.Type) func(dst, src reflect.Value) error } // Traverses recursively both values, assigning src's fields values to dst. // The map argument tracks comparisons that have already been seen, which allows // short circuiting on recursive types. func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { overwrite := config.Overwrite typeCheck := config.TypeCheck overwriteWithEmptySrc := config.overwriteWithEmptyValue overwriteSliceWithEmptySrc := config.overwriteSliceWithEmptyValue sliceDeepCopy := config.sliceDeepCopy if !src.IsValid() { return } if dst.CanAddr() { addr := dst.UnsafeAddr() h := 17 * addr seen := visited[h] typ := dst.Type() for p := seen; p != nil; p = p.next { if p.ptr == addr && p.typ == typ { return nil } } // Remember, remember... visited[h] = &visit{typ, seen, addr} } if config.Transformers != nil && !isReflectNil(dst) && dst.IsValid() { if fn := config.Transformers.Transformer(dst.Type()); fn != nil { err = fn(dst, src) return } } switch dst.Kind() { case reflect.Struct: if hasMergeableFields(dst) { for i, n := 0, dst.NumField(); i < n; i++ { if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil { return } } } else { if dst.CanSet() && (isReflectNil(dst) || overwrite) && (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc) { dst.Set(src) } } case reflect.Map: if dst.IsNil() && !src.IsNil() { if dst.CanSet() { dst.Set(reflect.MakeMap(dst.Type())) } else { dst = src return } } if src.Kind() != reflect.Map { if overwrite && dst.CanSet() { dst.Set(src) } return } for _, key := range src.MapKeys() { srcElement := src.MapIndex(key) if !srcElement.IsValid() { continue } dstElement := dst.MapIndex(key) switch srcElement.Kind() { case reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice: if srcElement.IsNil() { if overwrite { dst.SetMapIndex(key, srcElement) } continue } fallthrough default: if !srcElement.CanInterface() { continue } switch reflect.TypeOf(srcElement.Interface()).Kind() { case reflect.Struct: fallthrough case reflect.Ptr: fallthrough case reflect.Map: srcMapElm := srcElement dstMapElm := dstElement if srcMapElm.CanInterface() { srcMapElm = reflect.ValueOf(srcMapElm.Interface()) if dstMapElm.IsValid() { dstMapElm = reflect.ValueOf(dstMapElm.Interface()) } } if err = deepMerge(dstMapElm, srcMapElm, visited, depth+1, config); err != nil { return } case reflect.Slice: srcSlice := reflect.ValueOf(srcElement.Interface()) var dstSlice reflect.Value if !dstElement.IsValid() || dstElement.IsNil() { dstSlice = reflect.MakeSlice(srcSlice.Type(), 0, srcSlice.Len()) } else { dstSlice = reflect.ValueOf(dstElement.Interface()) } if (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) && !config.AppendSlice && !sliceDeepCopy { if typeCheck && srcSlice.Type() != dstSlice.Type() { return fmt.Errorf("cannot override two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) } dstSlice = srcSlice } else if config.AppendSlice { if srcSlice.Type() != dstSlice.Type() { return fmt.Errorf("cannot append two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) } dstSlice = reflect.AppendSlice(dstSlice, srcSlice) } else if sliceDeepCopy { i := 0 for ; i < srcSlice.Len() && i < dstSlice.Len(); i++ { srcElement := srcSlice.Index(i) dstElement := dstSlice.Index(i) if srcElement.CanInterface() { srcElement = reflect.ValueOf(srcElement.Interface()) } if dstElement.CanInterface() { dstElement = reflect.ValueOf(dstElement.Interface()) } if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { return } } } dst.SetMapIndex(key, dstSlice) } } if dstElement.IsValid() && !isEmptyValue(dstElement, !config.ShouldNotDereference) { if reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice { continue } if reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map && reflect.TypeOf(dstElement.Interface()).Kind() == reflect.Map { continue } } if srcElement.IsValid() && ((srcElement.Kind() != reflect.Ptr && overwrite) || !dstElement.IsValid() || isEmptyValue(dstElement, !config.ShouldNotDereference)) { if dst.IsNil() { dst.Set(reflect.MakeMap(dst.Type())) } dst.SetMapIndex(key, srcElement) } } // Ensure that all keys in dst are deleted if they are not in src. if overwriteWithEmptySrc { for _, key := range dst.MapKeys() { srcElement := src.MapIndex(key) if !srcElement.IsValid() { dst.SetMapIndex(key, reflect.Value{}) } } } case reflect.Slice: if !dst.CanSet() { break } if (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) && !config.AppendSlice && !sliceDeepCopy { dst.Set(src) } else if config.AppendSlice { if src.Type() != dst.Type() { return fmt.Errorf("cannot append two slice with different type (%s, %s)", src.Type(), dst.Type()) } dst.Set(reflect.AppendSlice(dst, src)) } else if sliceDeepCopy { for i := 0; i < src.Len() && i < dst.Len(); i++ { srcElement := src.Index(i) dstElement := dst.Index(i) if srcElement.CanInterface() { srcElement = reflect.ValueOf(srcElement.Interface()) } if dstElement.CanInterface() { dstElement = reflect.ValueOf(dstElement.Interface()) } if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { return } } } case reflect.Ptr: fallthrough case reflect.Interface: if isReflectNil(src) { if overwriteWithEmptySrc && dst.CanSet() && src.Type().AssignableTo(dst.Type()) { dst.Set(src) } break } if src.Kind() != reflect.Interface { if dst.IsNil() || (src.Kind() != reflect.Ptr && overwrite) { if dst.CanSet() && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) { dst.Set(src) } } else if src.Kind() == reflect.Ptr { if !config.ShouldNotDereference { if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { return } } else if src.Elem().Kind() != reflect.Struct { if overwriteWithEmptySrc || (overwrite && !src.IsNil()) || dst.IsNil() { dst.Set(src) } } } else if dst.Elem().Type() == src.Type() { if err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { return } } else { return ErrDifferentArgumentsTypes } break } if dst.IsNil() || overwrite { if dst.CanSet() && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) { dst.Set(src) } break } if dst.Elem().Kind() == src.Elem().Kind() { if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { return } break } default: mustSet := (isEmptyValue(dst, !config.ShouldNotDereference) || overwrite) && (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc) if mustSet { if dst.CanSet() { dst.Set(src) } else { dst = src } } } return } // Merge will fill any empty for value type attributes on the dst struct using corresponding // src attributes if they themselves are not empty. dst and src must be valid same-type structs // and dst must be a pointer to struct. // It won't merge unexported (private) fields and will do recursively any exported field. func Merge(dst, src interface{}, opts ...func(*Config)) error { return merge(dst, src, opts...) } // MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overridden by // non-empty src attribute values. // Deprecated: use Merge(…) with WithOverride func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { return merge(dst, src, append(opts, WithOverride)...) } // WithTransformers adds transformers to merge, allowing to customize the merging of some types. func WithTransformers(transformers Transformers) func(*Config) { return func(config *Config) { config.Transformers = transformers } } // WithOverride will make merge override non-empty dst attributes with non-empty src attributes values. func WithOverride(config *Config) { config.Overwrite = true } // WithOverwriteWithEmptyValue will make merge override non empty dst attributes with empty src attributes values. func WithOverwriteWithEmptyValue(config *Config) { config.Overwrite = true config.overwriteWithEmptyValue = true } // WithOverrideEmptySlice will make merge override empty dst slice with empty src slice. func WithOverrideEmptySlice(config *Config) { config.overwriteSliceWithEmptyValue = true } // WithoutDereference prevents dereferencing pointers when evaluating whether they are empty // (i.e. a non-nil pointer is never considered empty). func WithoutDereference(config *Config) { config.ShouldNotDereference = true } // WithAppendSlice will make merge append slices instead of overwriting it. func WithAppendSlice(config *Config) { config.AppendSlice = true } // WithTypeCheck will make merge check types while overwriting it (must be used with WithOverride). func WithTypeCheck(config *Config) { config.TypeCheck = true } // WithSliceDeepCopy will merge slice element one by one with Overwrite flag. func WithSliceDeepCopy(config *Config) { config.sliceDeepCopy = true config.Overwrite = true } func merge(dst, src interface{}, opts ...func(*Config)) error { if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { return ErrNonPointerArgument } var ( vDst, vSrc reflect.Value err error ) config := &Config{} for _, opt := range opts { opt(config) } if vDst, vSrc, err = resolveValues(dst, src); err != nil { return err } if vDst.Type() != vSrc.Type() { return ErrDifferentArgumentsTypes } return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) } // IsReflectNil is the reflect value provided nil func isReflectNil(v reflect.Value) bool { k := v.Kind() switch k { case reflect.Interface, reflect.Slice, reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr: // Both interface and slice are nil if first word is 0. // Both are always bigger than a word; assume flagIndir. return v.IsNil() default: return false } } ================================================ FILE: vendor/dario.cat/mergo/mergo.go ================================================ // Copyright 2013 Dario Castañé. All rights reserved. // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Based on src/pkg/reflect/deepequal.go from official // golang's stdlib. package mergo import ( "errors" "reflect" ) // Errors reported by Mergo when it finds invalid arguments. var ( ErrNilArguments = errors.New("src and dst must not be nil") ErrDifferentArgumentsTypes = errors.New("src and dst must be of same type") ErrNotSupported = errors.New("only structs, maps, and slices are supported") ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") ErrNonPointerArgument = errors.New("dst must be a pointer") ) // During deepMerge, must keep track of checks that are // in progress. The comparison algorithm assumes that all // checks in progress are true when it reencounters them. // Visited are stored in a map indexed by 17 * a1 + a2; type visit struct { typ reflect.Type next *visit ptr uintptr } // From src/pkg/encoding/json/encode.go. func isEmptyValue(v reflect.Value, shouldDereference bool) bool { switch v.Kind() { case reflect.Array, reflect.Map, reflect.Slice, reflect.String: return v.Len() == 0 case reflect.Bool: return !v.Bool() case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return v.Int() == 0 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return v.Uint() == 0 case reflect.Float32, reflect.Float64: return v.Float() == 0 case reflect.Interface, reflect.Ptr: if v.IsNil() { return true } if shouldDereference { return isEmptyValue(v.Elem(), shouldDereference) } return false case reflect.Func: return v.IsNil() case reflect.Invalid: return true } return false } func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { if dst == nil || src == nil { err = ErrNilArguments return } vDst = reflect.ValueOf(dst).Elem() if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map && vDst.Kind() != reflect.Slice { err = ErrNotSupported return } vSrc = reflect.ValueOf(src) // We check if vSrc is a pointer to dereference it. if vSrc.Kind() == reflect.Ptr { vSrc = vSrc.Elem() } return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/LICENSE.txt ================================================ The MIT License (MIT) Copyright (c) Microsoft Corporation. Permission 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE 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. ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/NOTICE.txt ================================================ NOTICES AND INFORMATION Do Not Translate or Localize This software incorporates material from third parties. Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, or you may send a check or money order for US $5.00, including the product name, the open source component name, and version number, to: Source Code Compliance Team Microsoft Corporation One Microsoft Way Redmond, WA 98052 USA Notwithstanding any other terms, you may reverse engineer this software to the extent required to debug changes to any libraries licensed under the GNU Lesser General Public License. ------------------------------------------------------------------------------ Azure SDK for Go uses third-party libraries or other resources that may be distributed under licenses different than the Azure SDK for Go software. In the event that we accidentally failed to list a required notice, please bring it to our attention. Post an issue or email us: azgosdkhelp@microsoft.com The attached notices are provided for information only. ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md ================================================ # Release History ## 1.18.0 (2025-04-03) ### Features Added * Added `AccessToken.RefreshOn` and updated `BearerTokenPolicy` to consider nonzero values of it when deciding whether to request a new token ## 1.17.1 (2025-03-20) ### Other Changes * Upgraded to Go 1.23 * Upgraded dependencies ## 1.17.0 (2025-01-07) ### Features Added * Added field `OperationLocationResultPath` to `runtime.NewPollerOptions[T]` for LROs that use the `Operation-Location` pattern. * Support `encoding.TextMarshaler` and `encoding.TextUnmarshaler` interfaces in `arm.ResourceID`. ## 1.16.0 (2024-10-17) ### Features Added * Added field `Kind` to `runtime.StartSpanOptions` to allow a kind to be set when starting a span. ### Bugs Fixed * `BearerTokenPolicy` now rewinds request bodies before retrying ## 1.15.0 (2024-10-14) ### Features Added * `BearerTokenPolicy` handles CAE claims challenges ### Bugs Fixed * Omit the `ResponseError.RawResponse` field from JSON marshaling so instances can be marshaled. * Fixed an integer overflow in the retry policy. ### Other Changes * Update dependencies. ## 1.14.0 (2024-08-07) ### Features Added * Added field `Attributes` to `runtime.StartSpanOptions` to simplify creating spans with attributes. ### Other Changes * Include the HTTP verb and URL in `log.EventRetryPolicy` log entries so it's clear which operation is being retried. ## 1.13.0 (2024-07-16) ### Features Added - Added runtime.NewRequestFromRequest(), allowing for a policy.Request to be created from an existing *http.Request. ## 1.12.0 (2024-06-06) ### Features Added * Added field `StatusCodes` to `runtime.FetcherForNextLinkOptions` allowing for additional HTTP status codes indicating success. * Added func `NewUUID` to the `runtime` package for generating UUIDs. ### Bugs Fixed * Fixed an issue that prevented pollers using the `Operation-Location` strategy from unmarshaling the final result in some cases. ### Other Changes * Updated dependencies. ## 1.11.1 (2024-04-02) ### Bugs Fixed * Pollers that use the `Location` header won't consider `http.StatusRequestTimeout` a terminal failure. * `runtime.Poller[T].Result` won't consider non-terminal error responses as terminal. ## 1.11.0 (2024-04-01) ### Features Added * Added `StatusCodes` to `arm/policy.RegistrationOptions` to allow supporting non-standard HTTP status codes during registration. * Added field `InsecureAllowCredentialWithHTTP` to `azcore.ClientOptions` and dependent authentication pipeline policies. * Added type `MultipartContent` to the `streaming` package to support multipart/form payloads with custom Content-Type and file name. ### Bugs Fixed * `runtime.SetMultipartFormData` won't try to stringify `[]byte` values. * Pollers that use the `Location` header won't consider `http.StatusTooManyRequests` a terminal failure. ### Other Changes * Update dependencies. ## 1.10.0 (2024-02-29) ### Features Added * Added logging event `log.EventResponseError` that will contain the contents of `ResponseError.Error()` whenever an `azcore.ResponseError` is created. * Added `runtime.NewResponseErrorWithErrorCode` for creating an `azcore.ResponseError` with a caller-supplied error code. * Added type `MatchConditions` for use in conditional requests. ### Bugs Fixed * Fixed a potential race condition between `NullValue` and `IsNullValue`. * `runtime.EncodeQueryParams` will escape semicolons before calling `url.ParseQuery`. ### Other Changes * Update dependencies. ## 1.9.2 (2024-02-06) ### Bugs Fixed * `runtime.MarshalAsByteArray` and `runtime.MarshalAsJSON` will preserve the preexisting value of the `Content-Type` header. ### Other Changes * Update to latest version of `internal`. ## 1.9.1 (2023-12-11) ### Bugs Fixed * The `retry-after-ms` and `x-ms-retry-after-ms` headers weren't being checked during retries. ### Other Changes * Update dependencies. ## 1.9.0 (2023-11-06) ### Breaking Changes > These changes affect only code written against previous beta versions of `v1.7.0` and `v1.8.0` * The function `NewTokenCredential` has been removed from the `fake` package. Use a literal `&fake.TokenCredential{}` instead. * The field `TracingNamespace` in `runtime.PipelineOptions` has been replaced by `TracingOptions`. ### Bugs Fixed * Fixed an issue that could cause some allowed HTTP header values to not show up in logs. * Include error text instead of error type in traces when the transport returns an error. * Fixed an issue that could cause an HTTP/2 request to hang when the TCP connection becomes unresponsive. * Block key and SAS authentication for non TLS protected endpoints. * Passing a `nil` credential value will no longer cause a panic. Instead, the authentication is skipped. * Calling `Error` on a zero-value `azcore.ResponseError` will no longer panic. * Fixed an issue in `fake.PagerResponder[T]` that would cause a trailing error to be omitted when iterating over pages. * Context values created by `azcore` will no longer flow across disjoint HTTP requests. ### Other Changes * Skip generating trace info for no-op tracers. * The `clientName` paramater in client constructors has been renamed to `moduleName`. ## 1.9.0-beta.1 (2023-10-05) ### Other Changes * The beta features for tracing and fakes have been reinstated. ## 1.8.0 (2023-10-05) ### Features Added * This includes the following features from `v1.8.0-beta.N` releases. * Claims and CAE for authentication. * New `messaging` package. * Various helpers in the `runtime` package. * Deprecation of `runtime.With*` funcs and their replacements in the `policy` package. * Added types `KeyCredential` and `SASCredential` to the `azcore` package. * Includes their respective constructor functions. * Added types `KeyCredentialPolicy` and `SASCredentialPolicy` to the `azcore/runtime` package. * Includes their respective constructor functions and options types. ### Breaking Changes > These changes affect only code written against beta versions of `v1.8.0` * The beta features for tracing and fakes have been omitted for this release. ### Bugs Fixed * Fixed an issue that could cause some ARM RPs to not be automatically registered. * Block bearer token authentication for non TLS protected endpoints. ### Other Changes * Updated dependencies. ## 1.8.0-beta.3 (2023-09-07) ### Features Added * Added function `FetcherForNextLink` and `FetcherForNextLinkOptions` to the `runtime` package to centralize creation of `Pager[T].Fetcher` from a next link URL. ### Bugs Fixed * Suppress creating spans for nested SDK API calls. The HTTP span will be a child of the outer API span. ### Other Changes * The following functions in the `runtime` package are now exposed from the `policy` package, and the `runtime` versions have been deprecated. * `WithCaptureResponse` * `WithHTTPHeader` * `WithRetryOptions` ## 1.7.2 (2023-09-06) ### Bugs Fixed * Fix default HTTP transport to work in WASM modules. ## 1.8.0-beta.2 (2023-08-14) ### Features Added * Added function `SanitizePagerPollerPath` to the `server` package to centralize sanitization and formalize the contract. * Added `TokenRequestOptions.EnableCAE` to indicate whether to request a CAE token. ### Breaking Changes > This change affects only code written against beta version `v1.8.0-beta.1`. * `messaging.CloudEvent` deserializes JSON objects as `[]byte`, instead of `json.RawMessage`. See the documentation for CloudEvent.Data for more information. > This change affects only code written against beta versions `v1.7.0-beta.2` and `v1.8.0-beta.1`. * Removed parameter from method `Span.End()` and its type `tracing.SpanEndOptions`. This API GA'ed in `v1.2.0` so we cannot change it. ### Bugs Fixed * Propagate any query parameters when constructing a fake poller and/or injecting next links. ## 1.7.1 (2023-08-14) ## Bugs Fixed * Enable TLS renegotiation in the default transport policy. ## 1.8.0-beta.1 (2023-07-12) ### Features Added - `messaging/CloudEvent` allows you to serialize/deserialize CloudEvents, as described in the CloudEvents 1.0 specification: [link](https://github.com/cloudevents/spec) ### Other Changes * The beta features for CAE, tracing, and fakes have been reinstated. ## 1.7.0 (2023-07-12) ### Features Added * Added method `WithClientName()` to type `azcore.Client` to support shallow cloning of a client with a new name used for tracing. ### Breaking Changes > These changes affect only code written against beta versions v1.7.0-beta.1 or v1.7.0-beta.2 * The beta features for CAE, tracing, and fakes have been omitted for this release. ## 1.7.0-beta.2 (2023-06-06) ### Breaking Changes > These changes affect only code written against beta version v1.7.0-beta.1 * Method `SpanFromContext()` on type `tracing.Tracer` had the `bool` return value removed. * This includes the field `SpanFromContext` in supporting type `tracing.TracerOptions`. * Method `AddError()` has been removed from type `tracing.Span`. * Method `Span.End()` now requires an argument of type `*tracing.SpanEndOptions`. ## 1.6.1 (2023-06-06) ### Bugs Fixed * Fixed an issue in `azcore.NewClient()` and `arm.NewClient()` that could cause an incorrect module name to be used in telemetry. ### Other Changes * This version contains all bug fixes from `v1.7.0-beta.1` ## 1.7.0-beta.1 (2023-05-24) ### Features Added * Restored CAE support for ARM clients. * Added supporting features to enable distributed tracing. * Added func `runtime.StartSpan()` for use by SDKs to start spans. * Added method `WithContext()` to `runtime.Request` to support shallow cloning with a new context. * Added field `TracingNamespace` to `runtime.PipelineOptions`. * Added field `Tracer` to `runtime.NewPollerOptions` and `runtime.NewPollerFromResumeTokenOptions` types. * Added field `SpanFromContext` to `tracing.TracerOptions`. * Added methods `Enabled()`, `SetAttributes()`, and `SpanFromContext()` to `tracing.Tracer`. * Added supporting pipeline policies to include HTTP spans when creating clients. * Added package `fake` to support generated fakes packages in SDKs. * The package contains public surface area exposed by fake servers and supporting APIs intended only for use by the fake server implementations. * Added an internal fake poller implementation. ### Bugs Fixed * Retry policy always clones the underlying `*http.Request` before invoking the next policy. * Added some non-standard error codes to the list of error codes for unregistered resource providers. ## 1.6.0 (2023-05-04) ### Features Added * Added support for ARM cross-tenant authentication. Set the `AuxiliaryTenants` field of `arm.ClientOptions` to enable. * Added `TenantID` field to `policy.TokenRequestOptions`. ## 1.5.0 (2023-04-06) ### Features Added * Added `ShouldRetry` to `policy.RetryOptions` for finer-grained control over when to retry. ### Breaking Changes > These changes affect only code written against a beta version such as v1.5.0-beta.1 > These features will return in v1.6.0-beta.1. * Removed `TokenRequestOptions.Claims` and `.TenantID` * Removed ARM client support for CAE and cross-tenant auth. ### Bugs Fixed * Added non-conformant LRO terminal states `Cancelled` and `Completed`. ### Other Changes * Updated to latest `internal` module. ## 1.5.0-beta.1 (2023-03-02) ### Features Added * This release includes the features added in v1.4.0-beta.1 ## 1.4.0 (2023-03-02) > This release doesn't include features added in v1.4.0-beta.1. They will return in v1.5.0-beta.1. ### Features Added * Add `Clone()` method for `arm/policy.ClientOptions`. ### Bugs Fixed * ARM's RP registration policy will no longer swallow unrecognized errors. * Fixed an issue in `runtime.NewPollerFromResumeToken()` when resuming a `Poller` with a custom `PollingHandler`. * Fixed wrong policy copy in `arm/runtime.NewPipeline()`. ## 1.4.0-beta.1 (2023-02-02) ### Features Added * Added support for ARM cross-tenant authentication. Set the `AuxiliaryTenants` field of `arm.ClientOptions` to enable. * Added `Claims` and `TenantID` fields to `policy.TokenRequestOptions`. * ARM bearer token policy handles CAE challenges. ## 1.3.1 (2023-02-02) ### Other Changes * Update dependencies to latest versions. ## 1.3.0 (2023-01-06) ### Features Added * Added `BearerTokenOptions.AuthorizationHandler` to enable extending `runtime.BearerTokenPolicy` with custom authorization logic * Added `Client` types and matching constructors to the `azcore` and `arm` packages. These represent a basic client for HTTP and ARM respectively. ### Other Changes * Updated `internal` module to latest version. * `policy/Request.SetBody()` allows replacing a request's body with an empty one ## 1.2.0 (2022-11-04) ### Features Added * Added `ClientOptions.APIVersion` field, which overrides the default version a client requests of the service, if the client supports this (all ARM clients do). * Added package `tracing` that contains the building blocks for distributed tracing. * Added field `TracingProvider` to type `policy.ClientOptions` that will be used to set the per-client tracing implementation. ### Bugs Fixed * Fixed an issue in `runtime.SetMultipartFormData` to properly handle slices of `io.ReadSeekCloser`. * Fixed the MaxRetryDelay default to be 60s. * Failure to poll the state of an LRO will now return an `*azcore.ResponseError` for poller types that require this behavior. * Fixed a bug in `runtime.NewPipeline` that would cause pipeline-specified allowed headers and query parameters to be lost. ### Other Changes * Retain contents of read-only fields when sending requests. ## 1.1.4 (2022-10-06) ### Bugs Fixed * Don't retry a request if the `Retry-After` delay is greater than the configured `RetryOptions.MaxRetryDelay`. * `runtime.JoinPaths`: do not unconditionally add a forward slash before the query string ### Other Changes * Removed logging URL from retry policy as it's redundant. * Retry policy logs when it exits due to a non-retriable status code. ## 1.1.3 (2022-09-01) ### Bugs Fixed * Adjusted the initial retry delay to 800ms per the Azure SDK guidelines. ## 1.1.2 (2022-08-09) ### Other Changes * Fixed various doc bugs. ## 1.1.1 (2022-06-30) ### Bugs Fixed * Avoid polling when a RELO LRO synchronously terminates. ## 1.1.0 (2022-06-03) ### Other Changes * The one-second floor for `Frequency` when calling `PollUntilDone()` has been removed when running tests. ## 1.0.0 (2022-05-12) ### Features Added * Added interface `runtime.PollingHandler` to support custom poller implementations. * Added field `PollingHandler` of this type to `runtime.NewPollerOptions[T]` and `runtime.NewPollerFromResumeTokenOptions[T]`. ### Breaking Changes * Renamed `cloud.Configuration.LoginEndpoint` to `.ActiveDirectoryAuthorityHost` * Renamed `cloud.AzurePublicCloud` to `cloud.AzurePublic` * Removed `AuxiliaryTenants` field from `arm/ClientOptions` and `arm/policy/BearerTokenOptions` * Removed `TokenRequestOptions.TenantID` * `Poller[T].PollUntilDone()` now takes an `options *PollUntilDoneOptions` param instead of `freq time.Duration` * Removed `arm/runtime.Poller[T]`, `arm/runtime.NewPoller[T]()` and `arm/runtime.NewPollerFromResumeToken[T]()` * Removed `arm/runtime.FinalStateVia` and related `const` values * Renamed `runtime.PageProcessor` to `runtime.PagingHandler` * The `arm/runtime.ProviderRepsonse` and `arm/runtime.Provider` types are no longer exported. * Renamed `NewRequestIdPolicy()` to `NewRequestIDPolicy()` * `TokenCredential.GetToken` now returns `AccessToken` by value. ### Bugs Fixed * When per-try timeouts are enabled, only cancel the context after the body has been read and closed. * The `Operation-Location` poller now properly handles `final-state-via` values. * Improvements in `runtime.Poller[T]` * `Poll()` shouldn't cache errors, allowing for additional retries when in a non-terminal state. * `Result()` will cache the terminal result or error but not transient errors, allowing for additional retries. ### Other Changes * Updated to latest `internal` module and absorbed breaking changes. * Use `temporal.Resource` and deleted copy. * The internal poller implementation has been refactored. * The implementation in `internal/pollers/poller.go` has been merged into `runtime/poller.go` with some slight modification. * The internal poller types had their methods updated to conform to the `runtime.PollingHandler` interface. * The creation of resume tokens has been refactored so that implementers of `runtime.PollingHandler` don't need to know about it. * `NewPipeline()` places policies from `ClientOptions` after policies from `PipelineOptions` * Default User-Agent headers no longer include `azcore` version information ## 0.23.1 (2022-04-14) ### Bugs Fixed * Include XML header when marshalling XML content. * Handle XML namespaces when searching for error code. * Handle `odata.error` when searching for error code. ## 0.23.0 (2022-04-04) ### Features Added * Added `runtime.Pager[T any]` and `runtime.Poller[T any]` supporting types for central, generic, implementations. * Added `cloud` package with a new API for cloud configuration * Added `FinalStateVia` field to `runtime.NewPollerOptions[T any]` type. ### Breaking Changes * Removed the `Poller` type-alias to the internal poller implementation. * Added `Ptr[T any]` and `SliceOfPtrs[T any]` in the `to` package and removed all non-generic implementations. * `NullValue` and `IsNullValue` now take a generic type parameter instead of an interface func parameter. * Replaced `arm.Endpoint` with `cloud` API * Removed the `endpoint` parameter from `NewRPRegistrationPolicy()` * `arm/runtime.NewPipeline()` and `.NewRPRegistrationPolicy()` now return an `error` * Refactored `NewPoller` and `NewPollerFromResumeToken` funcs in `arm/runtime` and `runtime` packages. * Removed the `pollerID` parameter as it's no longer required. * Created optional parameter structs and moved optional parameters into them. * Changed `FinalStateVia` field to a `const` type. ### Other Changes * Converted expiring resource and dependent types to use generics. ## 0.22.0 (2022-03-03) ### Features Added * Added header `WWW-Authenticate` to the default allow-list of headers for logging. * Added a pipeline policy that enables the retrieval of HTTP responses from API calls. * Added `runtime.WithCaptureResponse` to enable the policy at the API level (off by default). ### Breaking Changes * Moved `WithHTTPHeader` and `WithRetryOptions` from the `policy` package to the `runtime` package. ## 0.21.1 (2022-02-04) ### Bugs Fixed * Restore response body after reading in `Poller.FinalResponse()`. (#16911) * Fixed bug in `NullValue` that could lead to incorrect comparisons for empty maps/slices (#16969) ### Other Changes * `BearerTokenPolicy` is more resilient to transient authentication failures. (#16789) ## 0.21.0 (2022-01-11) ### Features Added * Added `AllowedHeaders` and `AllowedQueryParams` to `policy.LogOptions` to control which headers and query parameters are written to the logger. * Added `azcore.ResponseError` type which is returned from APIs when a non-success HTTP status code is received. ### Breaking Changes * Moved `[]policy.Policy` parameters of `arm/runtime.NewPipeline` and `runtime.NewPipeline` into a new struct, `runtime.PipelineOptions` * Renamed `arm/ClientOptions.Host` to `.Endpoint` * Moved `Request.SkipBodyDownload` method to function `runtime.SkipBodyDownload` * Removed `azcore.HTTPResponse` interface type * `arm.NewPoller()` and `runtime.NewPoller()` no longer require an `eu` parameter * `runtime.NewResponseError()` no longer requires an `error` parameter ## 0.20.0 (2021-10-22) ### Breaking Changes * Removed `arm.Connection` * Removed `azcore.Credential` and `.NewAnonymousCredential()` * `NewRPRegistrationPolicy` now requires an `azcore.TokenCredential` * `runtime.NewPipeline` has a new signature that simplifies implementing custom authentication * `arm/runtime.RegistrationOptions` embeds `policy.ClientOptions` * Contents in the `log` package have been slightly renamed. * Removed `AuthenticationOptions` in favor of `policy.BearerTokenOptions` * Changed parameters for `NewBearerTokenPolicy()` * Moved policy config options out of `arm/runtime` and into `arm/policy` ### Features Added * Updating Documentation * Added string typdef `arm.Endpoint` to provide a hint toward expected ARM client endpoints * `azcore.ClientOptions` contains common pipeline configuration settings * Added support for multi-tenant authorization in `arm/runtime` * Require one second minimum when calling `PollUntilDone()` ### Bug Fixes * Fixed a potential panic when creating the default Transporter. * Close LRO initial response body when creating a poller. * Fixed a panic when recursively cloning structs that contain time.Time. ## 0.19.0 (2021-08-25) ### Breaking Changes * Split content out of `azcore` into various packages. The intent is to separate content based on its usage (common, uncommon, SDK authors). * `azcore` has all core functionality. * `log` contains facilities for configuring in-box logging. * `policy` is used for configuring pipeline options and creating custom pipeline policies. * `runtime` contains various helpers used by SDK authors and generated content. * `streaming` has helpers for streaming IO operations. * `NewTelemetryPolicy()` now requires module and version parameters and the `Value` option has been removed. * As a result, the `Request.Telemetry()` method has been removed. * The telemetry policy now includes the SDK prefix `azsdk-go-` so callers no longer need to provide it. * The `*http.Request` in `runtime.Request` is no longer anonymously embedded. Use the `Raw()` method to access it. * The `UserAgent` and `Version` constants have been made internal, `Module` and `Version` respectively. ### Bug Fixes * Fixed an issue in the retry policy where the request body could be overwritten after a rewind. ### Other Changes * Moved modules `armcore` and `to` content into `arm` and `to` packages respectively. * The `Pipeline()` method on `armcore.Connection` has been replaced by `NewPipeline()` in `arm.Connection`. It takes module and version parameters used by the telemetry policy. * Poller logic has been consolidated across ARM and core implementations. * This required some changes to the internal interfaces for core pollers. * The core poller types have been improved, including more logging and test coverage. ## 0.18.1 (2021-08-20) ### Features Added * Adds an `ETag` type for comparing etags and handling etags on requests * Simplifies the `requestBodyProgess` and `responseBodyProgress` into a single `progress` object ### Bugs Fixed * `JoinPaths` will preserve query parameters encoded in the `root` url. ### Other Changes * Bumps dependency on `internal` module to the latest version (v0.7.0) ## 0.18.0 (2021-07-29) ### Features Added * Replaces methods from Logger type with two package methods for interacting with the logging functionality. * `azcore.SetClassifications` replaces `azcore.Logger().SetClassifications` * `azcore.SetListener` replaces `azcore.Logger().SetListener` ### Breaking Changes * Removes `Logger` type from `azcore` ## 0.17.0 (2021-07-27) ### Features Added * Adding TenantID to TokenRequestOptions (https://github.com/Azure/azure-sdk-for-go/pull/14879) * Adding AuxiliaryTenants to AuthenticationOptions (https://github.com/Azure/azure-sdk-for-go/pull/15123) ### Breaking Changes * Rename `AnonymousCredential` to `NewAnonymousCredential` (https://github.com/Azure/azure-sdk-for-go/pull/15104) * rename `AuthenticationPolicyOptions` to `AuthenticationOptions` (https://github.com/Azure/azure-sdk-for-go/pull/15103) * Make Header constants private (https://github.com/Azure/azure-sdk-for-go/pull/15038) ## 0.16.2 (2021-05-26) ### Features Added * Improved support for byte arrays [#14715](https://github.com/Azure/azure-sdk-for-go/pull/14715) ## 0.16.1 (2021-05-19) ### Features Added * Add license.txt to azcore module [#14682](https://github.com/Azure/azure-sdk-for-go/pull/14682) ## 0.16.0 (2021-05-07) ### Features Added * Remove extra `*` in UnmarshalAsByteArray() [#14642](https://github.com/Azure/azure-sdk-for-go/pull/14642) ## 0.15.1 (2021-05-06) ### Features Added * Cache the original request body on Request [#14634](https://github.com/Azure/azure-sdk-for-go/pull/14634) ## 0.15.0 (2021-05-05) ### Features Added * Add support for null map and slice * Export `Response.Payload` method ### Breaking Changes * remove `Response.UnmarshalError` as it's no longer required ## 0.14.5 (2021-04-23) ### Features Added * Add `UnmarshalError()` on `azcore.Response` ## 0.14.4 (2021-04-22) ### Features Added * Support for basic LRO polling * Added type `LROPoller` and supporting types for basic polling on long running operations. * rename poller param and added doc comment ### Bugs Fixed * Fixed content type detection bug in logging. ## 0.14.3 (2021-03-29) ### Features Added * Add support for multi-part form data * Added method `WriteMultipartFormData()` to Request. ## 0.14.2 (2021-03-17) ### Features Added * Add support for encoding JSON null values * Adds `NullValue()` and `IsNullValue()` functions for setting and detecting sentinel values used for encoding a JSON null. * Documentation fixes ### Bugs Fixed * Fixed improper error wrapping ## 0.14.1 (2021-02-08) ### Features Added * Add `Pager` and `Poller` interfaces to azcore ## 0.14.0 (2021-01-12) ### Features Added * Accept zero-value options for default values * Specify zero-value options structs to accept default values. * Remove `DefaultXxxOptions()` methods. * Do not silently change TryTimeout on negative values * make per-try timeout opt-in ## 0.13.4 (2020-11-20) ### Features Added * Include telemetry string in User Agent ## 0.13.3 (2020-11-20) ### Features Added * Updating response body handling on `azcore.Response` ## 0.13.2 (2020-11-13) ### Features Added * Remove implementation of stateless policies as first-class functions. ## 0.13.1 (2020-11-05) ### Features Added * Add `Telemetry()` method to `azcore.Request()` ## 0.13.0 (2020-10-14) ### Features Added * Rename `log` to `logger` to avoid name collision with the log package. * Documentation improvements * Simplified `DefaultHTTPClientTransport()` implementation ## 0.12.1 (2020-10-13) ### Features Added * Update `internal` module dependence to `v0.5.0` ## 0.12.0 (2020-10-08) ### Features Added * Removed storage specific content * Removed internal content to prevent API clutter * Refactored various policy options to conform with our options pattern ## 0.11.0 (2020-09-22) ### Features Added * Removed `LogError` and `LogSlowResponse`. * Renamed `options` in `RequestLogOptions`. * Updated `NewRequestLogPolicy()` to follow standard pattern for options. * Refactored `requestLogPolicy.Do()` per above changes. * Cleaned up/added logging in retry policy. * Export `NewResponseError()` * Fix `RequestLogOptions` comment ## 0.10.1 (2020-09-17) ### Features Added * Add default console logger * Default console logger writes to stderr. To enable it, set env var `AZURE_SDK_GO_LOGGING` to the value 'all'. * Added `Logger.Writef()` to reduce the need for `ShouldLog()` checks. * Add `LogLongRunningOperation` ## 0.10.0 (2020-09-10) ### Features Added * The `request` and `transport` interfaces have been refactored to align with the patterns in the standard library. * `NewRequest()` now uses `http.NewRequestWithContext()` and performs additional validation, it also requires a context parameter. * The `Policy` and `Transport` interfaces have had their context parameter removed as the context is associated with the underlying `http.Request`. * `Pipeline.Do()` will validate the HTTP request before sending it through the pipeline, avoiding retries on a malformed request. * The `Retrier` interface has been replaced with the `NonRetriableError` interface, and the retry policy updated to test for this. * `Request.SetBody()` now requires a content type parameter for setting the request's MIME type. * moved path concatenation into `JoinPaths()` func ## 0.9.6 (2020-08-18) ### Features Added * Improvements to body download policy * Always download the response body for error responses, i.e. HTTP status codes >= 400. * Simplify variable declarations ## 0.9.5 (2020-08-11) ### Features Added * Set the Content-Length header in `Request.SetBody` ## 0.9.4 (2020-08-03) ### Features Added * Fix cancellation of per try timeout * Per try timeout is used to ensure that an HTTP operation doesn't take too long, e.g. that a GET on some URL doesn't take an inordinant amount of time. * Once the HTTP request returns, the per try timeout should be cancelled, not when the response has been read to completion. * Do not drain response body if there are no more retries * Do not retry non-idempotent operations when body download fails ## 0.9.3 (2020-07-28) ### Features Added * Add support for custom HTTP request headers * Inserts an internal policy into the pipeline that can extract HTTP header values from the caller's context, adding them to the request. * Use `azcore.WithHTTPHeader` to add HTTP headers to a context. * Remove method specific to Go 1.14 ## 0.9.2 (2020-07-28) ### Features Added * Omit read-only content from request payloads * If any field in a payload's object graph contains `azure:"ro"`, make a clone of the object graph, omitting all fields with this annotation. * Verify no fields were dropped * Handle embedded struct types * Added test for cloning by value * Add messages to failures ## 0.9.1 (2020-07-22) ### Features Added * Updated dependency on internal module to fix race condition. ## 0.9.0 (2020-07-09) ### Features Added * Add `HTTPResponse` interface to be used by callers to access the raw HTTP response from an error in the event of an API call failure. * Updated `sdk/internal` dependency to latest version. * Rename package alias ## 0.8.2 (2020-06-29) ### Features Added * Added missing documentation comments ### Bugs Fixed * Fixed a bug in body download policy. ## 0.8.1 (2020-06-26) ### Features Added * Miscellaneous clean-up reported by linters ## 0.8.0 (2020-06-01) ### Features Added * Differentiate between standard and URL encoding. ## 0.7.1 (2020-05-27) ### Features Added * Add support for for base64 encoding and decoding of payloads. ## 0.7.0 (2020-05-12) ### Features Added * Change `RetryAfter()` to a function. ## 0.6.0 (2020-04-29) ### Features Added * Updating `RetryAfter` to only return the detaion in the RetryAfter header ## 0.5.0 (2020-03-23) ### Features Added * Export `TransportFunc` ### Breaking Changes * Removed `IterationDone` ## 0.4.1 (2020-02-25) ### Features Added * Ensure per-try timeout is properly cancelled * Explicitly call cancel the per-try timeout when the response body has been read/closed by the body download policy. * When the response body is returned to the caller for reading/closing, wrap it in a `responseBodyReader` that will cancel the timeout when the body is closed. * `Logger.Should()` will return false if no listener is set. ## 0.4.0 (2020-02-18) ### Features Added * Enable custom `RetryOptions` to be specified per API call * Added `WithRetryOptions()` that adds a custom `RetryOptions` to the provided context, allowing custom settings per API call. * Remove 429 from the list of default HTTP status codes for retry. * Change StatusCodesForRetry to a slice so consumers can append to it. * Added support for retry-after in HTTP-date format. * Cleaned up some comments specific to storage. * Remove `Request.SetQueryParam()` * Renamed `MaxTries` to `MaxRetries` ## 0.3.0 (2020-01-16) ### Features Added * Added `DefaultRetryOptions` to create initialized default options. ### Breaking Changes * Removed `Response.CheckStatusCode()` ## 0.2.0 (2020-01-15) ### Features Added * Add support for marshalling and unmarshalling JSON * Removed `Response.Payload` field * Exit early when unmarsahlling if there is no payload ## 0.1.0 (2020-01-10) ### Features Added * Initial release ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/LICENSE.txt ================================================ MIT License Copyright (c) Microsoft Corporation. Permission 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE 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 ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/README.md ================================================ # Azure Core Client Module for Go [![PkgGoDev](https://pkg.go.dev/badge/github.com/Azure/azure-sdk-for-go/sdk/azcore)](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore) [![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/go%20-%20azcore%20-%20ci?branchName=main)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=1843&branchName=main) [![Code Coverage](https://img.shields.io/azure-devops/coverage/azure-sdk/public/1843/main)](https://img.shields.io/azure-devops/coverage/azure-sdk/public/1843/main) The `azcore` module provides a set of common interfaces and types for Go SDK client modules. These modules follow the [Azure SDK Design Guidelines for Go](https://azure.github.io/azure-sdk/golang_introduction.html). ## Getting started This project uses [Go modules](https://github.com/golang/go/wiki/Modules) for versioning and dependency management. Typically, you will not need to explicitly install `azcore` as it will be installed as a client module dependency. To add the latest version to your `go.mod` file, execute the following command. ```bash go get github.com/Azure/azure-sdk-for-go/sdk/azcore ``` General documentation and examples can be found on [pkg.go.dev](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore). ## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit [https://cla.microsoft.com](https://cla.microsoft.com). When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information, see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/ci.yml ================================================ # NOTE: Please refer to https://aka.ms/azsdk/engsys/ci-yaml before editing this file. trigger: branches: include: - main - feature/* - hotfix/* - release/* paths: include: - sdk/azcore/ - eng/ pr: branches: include: - main - feature/* - hotfix/* - release/* paths: include: - sdk/azcore/ - eng/ extends: template: /eng/pipelines/templates/jobs/archetype-sdk-client.yml parameters: ServiceDirectory: azcore ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud/cloud.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package cloud var ( // AzureChina contains configuration for Azure China. AzureChina = Configuration{ ActiveDirectoryAuthorityHost: "https://login.chinacloudapi.cn/", Services: map[ServiceName]ServiceConfiguration{}, } // AzureGovernment contains configuration for Azure Government. AzureGovernment = Configuration{ ActiveDirectoryAuthorityHost: "https://login.microsoftonline.us/", Services: map[ServiceName]ServiceConfiguration{}, } // AzurePublic contains configuration for Azure Public Cloud. AzurePublic = Configuration{ ActiveDirectoryAuthorityHost: "https://login.microsoftonline.com/", Services: map[ServiceName]ServiceConfiguration{}, } ) // ServiceName identifies a cloud service. type ServiceName string // ResourceManager is a global constant identifying Azure Resource Manager. const ResourceManager ServiceName = "resourceManager" // ServiceConfiguration configures a specific cloud service such as Azure Resource Manager. type ServiceConfiguration struct { // Audience is the audience the client will request for its access tokens. Audience string // Endpoint is the service's base URL. Endpoint string } // Configuration configures a cloud. type Configuration struct { // ActiveDirectoryAuthorityHost is the base URL of the cloud's Azure Active Directory. ActiveDirectoryAuthorityHost string // Services contains configuration for the cloud's services. Services map[ServiceName]ServiceConfiguration } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud/doc.go ================================================ //go:build go1.16 // +build go1.16 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. /* Package cloud implements a configuration API for applications deployed to sovereign or private Azure clouds. Azure SDK client configuration defaults are appropriate for Azure Public Cloud (sometimes referred to as "Azure Commercial" or simply "Microsoft Azure"). This package enables applications deployed to other Azure Clouds to configure clients appropriately. This package contains predefined configuration for well-known sovereign clouds such as Azure Government and Azure China. Azure SDK clients accept this configuration via the Cloud field of azcore.ClientOptions. For example, configuring a credential and ARM client for Azure Government: opts := azcore.ClientOptions{Cloud: cloud.AzureGovernment} cred, err := azidentity.NewDefaultAzureCredential( &azidentity.DefaultAzureCredentialOptions{ClientOptions: opts}, ) handle(err) client, err := armsubscription.NewClient( cred, &arm.ClientOptions{ClientOptions: opts}, ) handle(err) Applications deployed to a private cloud such as Azure Stack create a Configuration object with appropriate values: c := cloud.Configuration{ ActiveDirectoryAuthorityHost: "https://...", Services: map[cloud.ServiceName]cloud.ServiceConfiguration{ cloud.ResourceManager: { Audience: "...", Endpoint: "https://...", }, }, } opts := azcore.ClientOptions{Cloud: c} cred, err := azidentity.NewDefaultAzureCredential( &azidentity.DefaultAzureCredentialOptions{ClientOptions: opts}, ) handle(err) client, err := armsubscription.NewClient( cred, &arm.ClientOptions{ClientOptions: opts}, ) handle(err) */ package cloud ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/core.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package azcore import ( "reflect" "sync" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing" ) // AccessToken represents an Azure service bearer access token with expiry information. type AccessToken = exported.AccessToken // TokenCredential represents a credential capable of providing an OAuth token. type TokenCredential = exported.TokenCredential // KeyCredential contains an authentication key used to authenticate to an Azure service. type KeyCredential = exported.KeyCredential // NewKeyCredential creates a new instance of [KeyCredential] with the specified values. // - key is the authentication key func NewKeyCredential(key string) *KeyCredential { return exported.NewKeyCredential(key) } // SASCredential contains a shared access signature used to authenticate to an Azure service. type SASCredential = exported.SASCredential // NewSASCredential creates a new instance of [SASCredential] with the specified values. // - sas is the shared access signature func NewSASCredential(sas string) *SASCredential { return exported.NewSASCredential(sas) } // holds sentinel values used to send nulls var nullables map[reflect.Type]any = map[reflect.Type]any{} var nullablesMu sync.RWMutex // NullValue is used to send an explicit 'null' within a request. // This is typically used in JSON-MERGE-PATCH operations to delete a value. func NullValue[T any]() T { t := shared.TypeOfT[T]() nullablesMu.RLock() v, found := nullables[t] nullablesMu.RUnlock() if found { // return the sentinel object return v.(T) } // promote to exclusive lock and check again (double-checked locking pattern) nullablesMu.Lock() defer nullablesMu.Unlock() v, found = nullables[t] if !found { var o reflect.Value if k := t.Kind(); k == reflect.Map { o = reflect.MakeMap(t) } else if k == reflect.Slice { // empty slices appear to all point to the same data block // which causes comparisons to become ambiguous. so we create // a slice with len/cap of one which ensures a unique address. o = reflect.MakeSlice(t, 1, 1) } else { o = reflect.New(t.Elem()) } v = o.Interface() nullables[t] = v } // return the sentinel object return v.(T) } // IsNullValue returns true if the field contains a null sentinel value. // This is used by custom marshallers to properly encode a null value. func IsNullValue[T any](v T) bool { // see if our map has a sentinel object for this *T t := reflect.TypeOf(v) nullablesMu.RLock() defer nullablesMu.RUnlock() if o, found := nullables[t]; found { o1 := reflect.ValueOf(o) v1 := reflect.ValueOf(v) // we found it; return true if v points to the sentinel object. // NOTE: maps and slices can only be compared to nil, else you get // a runtime panic. so we compare addresses instead. return o1.Pointer() == v1.Pointer() } // no sentinel object for this *t return false } // ClientOptions contains optional settings for a client's pipeline. // Instances can be shared across calls to SDK client constructors when uniform configuration is desired. // Zero-value fields will have their specified default values applied during use. type ClientOptions = policy.ClientOptions // Client is a basic HTTP client. It consists of a pipeline and tracing provider. type Client struct { pl runtime.Pipeline tr tracing.Tracer // cached on the client to support shallow copying with new values tp tracing.Provider modVer string namespace string } // NewClient creates a new Client instance with the provided values. // - moduleName - the fully qualified name of the module where the client is defined; used by the telemetry policy and tracing provider. // - moduleVersion - the semantic version of the module; used by the telemetry policy and tracing provider. // - plOpts - pipeline configuration options; can be the zero-value // - options - optional client configurations; pass nil to accept the default values func NewClient(moduleName, moduleVersion string, plOpts runtime.PipelineOptions, options *ClientOptions) (*Client, error) { if options == nil { options = &ClientOptions{} } if !options.Telemetry.Disabled { if err := shared.ValidateModVer(moduleVersion); err != nil { return nil, err } } pl := runtime.NewPipeline(moduleName, moduleVersion, plOpts, options) tr := options.TracingProvider.NewTracer(moduleName, moduleVersion) if tr.Enabled() && plOpts.Tracing.Namespace != "" { tr.SetAttributes(tracing.Attribute{Key: shared.TracingNamespaceAttrName, Value: plOpts.Tracing.Namespace}) } return &Client{ pl: pl, tr: tr, tp: options.TracingProvider, modVer: moduleVersion, namespace: plOpts.Tracing.Namespace, }, nil } // Pipeline returns the pipeline for this client. func (c *Client) Pipeline() runtime.Pipeline { return c.pl } // Tracer returns the tracer for this client. func (c *Client) Tracer() tracing.Tracer { return c.tr } // WithClientName returns a shallow copy of the Client with its tracing client name changed to clientName. // Note that the values for module name and version will be preserved from the source Client. // - clientName - the fully qualified name of the client ("package.Client"); this is used by the tracing provider when creating spans func (c *Client) WithClientName(clientName string) *Client { tr := c.tp.NewTracer(clientName, c.modVer) if tr.Enabled() && c.namespace != "" { tr.SetAttributes(tracing.Attribute{Key: shared.TracingNamespaceAttrName, Value: c.namespace}) } return &Client{pl: c.pl, tr: tr, tp: c.tp, modVer: c.modVer, namespace: c.namespace} } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright 2017 Microsoft Corporation. All rights reserved. // Use of this source code is governed by an MIT // license that can be found in the LICENSE file. /* Package azcore implements an HTTP request/response middleware pipeline used by Azure SDK clients. The middleware consists of three components. - One or more Policy instances. - A Transporter instance. - A Pipeline instance that combines the Policy and Transporter instances. # Implementing the Policy Interface A Policy can be implemented in two ways; as a first-class function for a stateless Policy, or as a method on a type for a stateful Policy. Note that HTTP requests made via the same pipeline share the same Policy instances, so if a Policy mutates its state it MUST be properly synchronized to avoid race conditions. A Policy's Do method is called when an HTTP request wants to be sent over the network. The Do method can perform any operation(s) it desires. For example, it can log the outgoing request, mutate the URL, headers, and/or query parameters, inject a failure, etc. Once the Policy has successfully completed its request work, it must call the Next() method on the *policy.Request instance in order to pass the request to the next Policy in the chain. When an HTTP response comes back, the Policy then gets a chance to process the response/error. The Policy instance can log the response, retry the operation if it failed due to a transient error or timeout, unmarshal the response body, etc. Once the Policy has successfully completed its response work, it must return the *http.Response and error instances to its caller. Template for implementing a stateless Policy: type policyFunc func(*policy.Request) (*http.Response, error) // Do implements the Policy interface on policyFunc. func (pf policyFunc) Do(req *policy.Request) (*http.Response, error) { return pf(req) } func NewMyStatelessPolicy() policy.Policy { return policyFunc(func(req *policy.Request) (*http.Response, error) { // TODO: mutate/process Request here // forward Request to next Policy & get Response/error resp, err := req.Next() // TODO: mutate/process Response/error here // return Response/error to previous Policy return resp, err }) } Template for implementing a stateful Policy: type MyStatefulPolicy struct { // TODO: add configuration/setting fields here } // TODO: add initialization args to NewMyStatefulPolicy() func NewMyStatefulPolicy() policy.Policy { return &MyStatefulPolicy{ // TODO: initialize configuration/setting fields here } } func (p *MyStatefulPolicy) Do(req *policy.Request) (resp *http.Response, err error) { // TODO: mutate/process Request here // forward Request to next Policy & get Response/error resp, err := req.Next() // TODO: mutate/process Response/error here // return Response/error to previous Policy return resp, err } # Implementing the Transporter Interface The Transporter interface is responsible for sending the HTTP request and returning the corresponding HTTP response or error. The Transporter is invoked by the last Policy in the chain. The default Transporter implementation uses a shared http.Client from the standard library. The same stateful/stateless rules for Policy implementations apply to Transporter implementations. # Using Policy and Transporter Instances Via a Pipeline To use the Policy and Transporter instances, an application passes them to the runtime.NewPipeline function. func NewPipeline(transport Transporter, policies ...Policy) Pipeline The specified Policy instances form a chain and are invoked in the order provided to NewPipeline followed by the Transporter. Once the Pipeline has been created, create a runtime.Request instance and pass it to Pipeline's Do method. func NewRequest(ctx context.Context, httpMethod string, endpoint string) (*Request, error) func (p Pipeline) Do(req *Request) (*http.Request, error) The Pipeline.Do method sends the specified Request through the chain of Policy and Transporter instances. The response/error is then sent through the same chain of Policy instances in reverse order. For example, assuming there are Policy types PolicyA, PolicyB, and PolicyC along with TransportA. pipeline := NewPipeline(TransportA, PolicyA, PolicyB, PolicyC) The flow of Request and Response looks like the following: policy.Request -> PolicyA -> PolicyB -> PolicyC -> TransportA -----+ | HTTP(S) endpoint | caller <--------- PolicyA <- PolicyB <- PolicyC <- http.Response-+ # Creating a Request Instance The Request instance passed to Pipeline's Do method is a wrapper around an *http.Request. It also contains some internal state and provides various convenience methods. You create a Request instance by calling the runtime.NewRequest function: func NewRequest(ctx context.Context, httpMethod string, endpoint string) (*Request, error) If the Request should contain a body, call the SetBody method. func (req *Request) SetBody(body ReadSeekCloser, contentType string) error A seekable stream is required so that upon retry, the retry Policy instance can seek the stream back to the beginning before retrying the network request and re-uploading the body. # Sending an Explicit Null Operations like JSON-MERGE-PATCH send a JSON null to indicate a value should be deleted. { "delete-me": null } This requirement conflicts with the SDK's default marshalling that specifies "omitempty" as a means to resolve the ambiguity between a field to be excluded and its zero-value. type Widget struct { Name *string `json:",omitempty"` Count *int `json:",omitempty"` } In the above example, Name and Count are defined as pointer-to-type to disambiguate between a missing value (nil) and a zero-value (0) which might have semantic differences. In a PATCH operation, any fields left as nil are to have their values preserved. When updating a Widget's count, one simply specifies the new value for Count, leaving Name nil. To fulfill the requirement for sending a JSON null, the NullValue() function can be used. w := Widget{ Count: azcore.NullValue[*int](), } This sends an explict "null" for Count, indicating that any current value for Count should be deleted. # Processing the Response When the HTTP response is received, the *http.Response is returned directly. Each Policy instance can inspect/mutate the *http.Response. # Built-in Logging To enable logging, set environment variable AZURE_SDK_GO_LOGGING to "all" before executing your program. By default the logger writes to stderr. This can be customized by calling log.SetListener, providing a callback that writes to the desired location. Any custom logging implementation MUST provide its own synchronization to handle concurrent invocations. See the docs for the log package for further details. # Pageable Operations Pageable operations return potentially large data sets spread over multiple GET requests. The result of each GET is a "page" of data consisting of a slice of items. Pageable operations can be identified by their New*Pager naming convention and return type of *runtime.Pager[T]. func (c *WidgetClient) NewListWidgetsPager(o *Options) *runtime.Pager[PageResponse] The call to WidgetClient.NewListWidgetsPager() returns an instance of *runtime.Pager[T] for fetching pages and determining if there are more pages to fetch. No IO calls are made until the NextPage() method is invoked. pager := widgetClient.NewListWidgetsPager(nil) for pager.More() { page, err := pager.NextPage(context.TODO()) // handle err for _, widget := range page.Values { // process widget } } # Long-Running Operations Long-running operations (LROs) are operations consisting of an initial request to start the operation followed by polling to determine when the operation has reached a terminal state. An LRO's terminal state is one of the following values. - Succeeded - the LRO completed successfully - Failed - the LRO failed to complete - Canceled - the LRO was canceled LROs can be identified by their Begin* prefix and their return type of *runtime.Poller[T]. func (c *WidgetClient) BeginCreateOrUpdate(ctx context.Context, w Widget, o *Options) (*runtime.Poller[Response], error) When a call to WidgetClient.BeginCreateOrUpdate() returns a nil error, it means that the LRO has started. It does _not_ mean that the widget has been created or updated (or failed to be created/updated). The *runtime.Poller[T] provides APIs for determining the state of the LRO. To wait for the LRO to complete, call the PollUntilDone() method. poller, err := widgetClient.BeginCreateOrUpdate(context.TODO(), Widget{}, nil) // handle err result, err := poller.PollUntilDone(context.TODO(), nil) // handle err // use result The call to PollUntilDone() will block the current goroutine until the LRO has reached a terminal state or the context is canceled/timed out. Note that LROs can take anywhere from several seconds to several minutes. The duration is operation-dependent. Due to this variant behavior, pollers do _not_ have a preconfigured time-out. Use a context with the appropriate cancellation mechanism as required. # Resume Tokens Pollers provide the ability to serialize their state into a "resume token" which can be used by another process to recreate the poller. This is achieved via the runtime.Poller[T].ResumeToken() method. token, err := poller.ResumeToken() // handle error Note that a token can only be obtained for a poller that's in a non-terminal state. Also note that any subsequent calls to poller.Poll() might change the poller's state. In this case, a new token should be created. After the token has been obtained, it can be used to recreate an instance of the originating poller. poller, err := widgetClient.BeginCreateOrUpdate(nil, Widget{}, &Options{ ResumeToken: token, }) When resuming a poller, no IO is performed, and zero-value arguments can be used for everything but the Options.ResumeToken. Resume tokens are unique per service client and operation. Attempting to resume a poller for LRO BeginB() with a token from LRO BeginA() will result in an error. # Fakes The fake package contains types used for constructing in-memory fake servers used in unit tests. This allows writing tests to cover various success/error conditions without the need for connecting to a live service. Please see https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/samples/fakes for details and examples on how to use fakes. */ package azcore ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/errors.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package azcore import "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" // ResponseError is returned when a request is made to a service and // the service returns a non-success HTTP status code. // Use errors.As() to access this type in the error chain. // // When marshaling instances, the RawResponse field will be omitted. // However, the contents returned by Error() will be preserved. type ResponseError = exported.ResponseError ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/etag.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package azcore import ( "strings" ) // ETag is a property used for optimistic concurrency during updates // ETag is a validator based on https://tools.ietf.org/html/rfc7232#section-2.3.2 // An ETag can be empty (""). type ETag string // ETagAny is an ETag that represents everything, the value is "*" const ETagAny ETag = "*" // Equals does a strong comparison of two ETags. Equals returns true when both // ETags are not weak and the values of the underlying strings are equal. func (e ETag) Equals(other ETag) bool { return !e.IsWeak() && !other.IsWeak() && e == other } // WeakEquals does a weak comparison of two ETags. Two ETags are equivalent if their opaque-tags match // character-by-character, regardless of either or both being tagged as "weak". func (e ETag) WeakEquals(other ETag) bool { getStart := func(e1 ETag) int { if e1.IsWeak() { return 2 } return 0 } aStart := getStart(e) bStart := getStart(other) aVal := e[aStart:] bVal := other[bStart:] return aVal == bVal } // IsWeak specifies whether the ETag is strong or weak. func (e ETag) IsWeak() bool { return len(e) >= 4 && strings.HasPrefix(string(e), "W/\"") && strings.HasSuffix(string(e), "\"") } // MatchConditions specifies HTTP options for conditional requests. type MatchConditions struct { // Optionally limit requests to resources that have a matching ETag. IfMatch *ETag // Optionally limit requests to resources that do not match the ETag. IfNoneMatch *ETag } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package exported import ( "context" "encoding/base64" "fmt" "io" "net/http" "sync/atomic" "time" ) type nopCloser struct { io.ReadSeeker } func (n nopCloser) Close() error { return nil } // NopCloser returns a ReadSeekCloser with a no-op close method wrapping the provided io.ReadSeeker. // Exported as streaming.NopCloser(). func NopCloser(rs io.ReadSeeker) io.ReadSeekCloser { return nopCloser{rs} } // HasStatusCode returns true if the Response's status code is one of the specified values. // Exported as runtime.HasStatusCode(). func HasStatusCode(resp *http.Response, statusCodes ...int) bool { if resp == nil { return false } for _, sc := range statusCodes { if resp.StatusCode == sc { return true } } return false } // AccessToken represents an Azure service bearer access token with expiry information. // Exported as azcore.AccessToken. type AccessToken struct { // Token is the access token Token string // ExpiresOn indicates when the token expires ExpiresOn time.Time // RefreshOn is a suggested time to refresh the token. // Clients should ignore this value when it's zero. RefreshOn time.Time } // TokenRequestOptions contain specific parameter that may be used by credentials types when attempting to get a token. // Exported as policy.TokenRequestOptions. type TokenRequestOptions struct { // Claims are any additional claims required for the token to satisfy a conditional access policy, such as a // service may return in a claims challenge following an authorization failure. If a service returned the // claims value base64 encoded, it must be decoded before setting this field. Claims string // EnableCAE indicates whether to enable Continuous Access Evaluation (CAE) for the requested token. When true, // azidentity credentials request CAE tokens for resource APIs supporting CAE. Clients are responsible for // handling CAE challenges. If a client that doesn't handle CAE challenges receives a CAE token, it may end up // in a loop retrying an API call with a token that has been revoked due to CAE. EnableCAE bool // Scopes contains the list of permission scopes required for the token. Scopes []string // TenantID identifies the tenant from which to request the token. azidentity credentials authenticate in // their configured default tenants when this field isn't set. TenantID string } // TokenCredential represents a credential capable of providing an OAuth token. // Exported as azcore.TokenCredential. type TokenCredential interface { // GetToken requests an access token for the specified set of scopes. GetToken(ctx context.Context, options TokenRequestOptions) (AccessToken, error) } // DecodeByteArray will base-64 decode the provided string into v. // Exported as runtime.DecodeByteArray() func DecodeByteArray(s string, v *[]byte, format Base64Encoding) error { if len(s) == 0 { return nil } payload := string(s) if payload[0] == '"' { // remove surrounding quotes payload = payload[1 : len(payload)-1] } switch format { case Base64StdFormat: decoded, err := base64.StdEncoding.DecodeString(payload) if err == nil { *v = decoded return nil } return err case Base64URLFormat: // use raw encoding as URL format should not contain any '=' characters decoded, err := base64.RawURLEncoding.DecodeString(payload) if err == nil { *v = decoded return nil } return err default: return fmt.Errorf("unrecognized byte array format: %d", format) } } // KeyCredential contains an authentication key used to authenticate to an Azure service. // Exported as azcore.KeyCredential. type KeyCredential struct { cred *keyCredential } // NewKeyCredential creates a new instance of [KeyCredential] with the specified values. // - key is the authentication key func NewKeyCredential(key string) *KeyCredential { return &KeyCredential{cred: newKeyCredential(key)} } // Update replaces the existing key with the specified value. func (k *KeyCredential) Update(key string) { k.cred.Update(key) } // SASCredential contains a shared access signature used to authenticate to an Azure service. // Exported as azcore.SASCredential. type SASCredential struct { cred *keyCredential } // NewSASCredential creates a new instance of [SASCredential] with the specified values. // - sas is the shared access signature func NewSASCredential(sas string) *SASCredential { return &SASCredential{cred: newKeyCredential(sas)} } // Update replaces the existing shared access signature with the specified value. func (k *SASCredential) Update(sas string) { k.cred.Update(sas) } // KeyCredentialGet returns the key for cred. func KeyCredentialGet(cred *KeyCredential) string { return cred.cred.Get() } // SASCredentialGet returns the shared access sig for cred. func SASCredentialGet(cred *SASCredential) string { return cred.cred.Get() } type keyCredential struct { key atomic.Value // string } func newKeyCredential(key string) *keyCredential { keyCred := keyCredential{} keyCred.key.Store(key) return &keyCred } func (k *keyCredential) Get() string { return k.key.Load().(string) } func (k *keyCredential) Update(key string) { k.key.Store(key) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/pipeline.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package exported import ( "errors" "net/http" ) // Policy represents an extensibility point for the Pipeline that can mutate the specified // Request and react to the received Response. // Exported as policy.Policy. type Policy interface { // Do applies the policy to the specified Request. When implementing a Policy, mutate the // request before calling req.Next() to move on to the next policy, and respond to the result // before returning to the caller. Do(req *Request) (*http.Response, error) } // Pipeline represents a primitive for sending HTTP requests and receiving responses. // Its behavior can be extended by specifying policies during construction. // Exported as runtime.Pipeline. type Pipeline struct { policies []Policy } // Transporter represents an HTTP pipeline transport used to send HTTP requests and receive responses. // Exported as policy.Transporter. type Transporter interface { // Do sends the HTTP request and returns the HTTP response or error. Do(req *http.Request) (*http.Response, error) } // used to adapt a TransportPolicy to a Policy type transportPolicy struct { trans Transporter } func (tp transportPolicy) Do(req *Request) (*http.Response, error) { if tp.trans == nil { return nil, errors.New("missing transporter") } resp, err := tp.trans.Do(req.Raw()) if err != nil { return nil, err } else if resp == nil { // there was no response and no error (rare but can happen) // this ensures the retry policy will retry the request return nil, errors.New("received nil response") } return resp, nil } // NewPipeline creates a new Pipeline object from the specified Policies. // Not directly exported, but used as part of runtime.NewPipeline(). func NewPipeline(transport Transporter, policies ...Policy) Pipeline { // transport policy must always be the last in the slice policies = append(policies, transportPolicy{trans: transport}) return Pipeline{ policies: policies, } } // Do is called for each and every HTTP request. It passes the request through all // the Policy objects (which can transform the Request's URL/query parameters/headers) // and ultimately sends the transformed HTTP request over the network. func (p Pipeline) Do(req *Request) (*http.Response, error) { if req == nil { return nil, errors.New("request cannot be nil") } req.policies = p.policies return req.Next() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/request.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package exported import ( "bytes" "context" "encoding/base64" "errors" "fmt" "io" "net/http" "reflect" "strconv" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" ) // Base64Encoding is usesd to specify which base-64 encoder/decoder to use when // encoding/decoding a slice of bytes to/from a string. // Exported as runtime.Base64Encoding type Base64Encoding int const ( // Base64StdFormat uses base64.StdEncoding for encoding and decoding payloads. Base64StdFormat Base64Encoding = 0 // Base64URLFormat uses base64.RawURLEncoding for encoding and decoding payloads. Base64URLFormat Base64Encoding = 1 ) // EncodeByteArray will base-64 encode the byte slice v. // Exported as runtime.EncodeByteArray() func EncodeByteArray(v []byte, format Base64Encoding) string { if format == Base64URLFormat { return base64.RawURLEncoding.EncodeToString(v) } return base64.StdEncoding.EncodeToString(v) } // Request is an abstraction over the creation of an HTTP request as it passes through the pipeline. // Don't use this type directly, use NewRequest() instead. // Exported as policy.Request. type Request struct { req *http.Request body io.ReadSeekCloser policies []Policy values opValues } type opValues map[reflect.Type]any // Set adds/changes a value func (ov opValues) set(value any) { ov[reflect.TypeOf(value)] = value } // Get looks for a value set by SetValue first func (ov opValues) get(value any) bool { v, ok := ov[reflect.ValueOf(value).Elem().Type()] if ok { reflect.ValueOf(value).Elem().Set(reflect.ValueOf(v)) } return ok } // NewRequestFromRequest creates a new policy.Request with an existing *http.Request // Exported as runtime.NewRequestFromRequest(). func NewRequestFromRequest(req *http.Request) (*Request, error) { policyReq := &Request{req: req} if req.Body != nil { // we can avoid a body copy here if the underlying stream is already a // ReadSeekCloser. readSeekCloser, isReadSeekCloser := req.Body.(io.ReadSeekCloser) if !isReadSeekCloser { // since this is an already populated http.Request we want to copy // over its body, if it has one. bodyBytes, err := io.ReadAll(req.Body) if err != nil { return nil, err } if err := req.Body.Close(); err != nil { return nil, err } readSeekCloser = NopCloser(bytes.NewReader(bodyBytes)) } // SetBody also takes care of updating the http.Request's body // as well, so they should stay in-sync from this point. if err := policyReq.SetBody(readSeekCloser, req.Header.Get("Content-Type")); err != nil { return nil, err } } return policyReq, nil } // NewRequest creates a new Request with the specified input. // Exported as runtime.NewRequest(). func NewRequest(ctx context.Context, httpMethod string, endpoint string) (*Request, error) { req, err := http.NewRequestWithContext(ctx, httpMethod, endpoint, nil) if err != nil { return nil, err } if req.URL.Host == "" { return nil, errors.New("no Host in request URL") } if !(req.URL.Scheme == "http" || req.URL.Scheme == "https") { return nil, fmt.Errorf("unsupported protocol scheme %s", req.URL.Scheme) } return &Request{req: req}, nil } // Body returns the original body specified when the Request was created. func (req *Request) Body() io.ReadSeekCloser { return req.body } // Raw returns the underlying HTTP request. func (req *Request) Raw() *http.Request { return req.req } // Next calls the next policy in the pipeline. // If there are no more policies, nil and an error are returned. // This method is intended to be called from pipeline policies. // To send a request through a pipeline call Pipeline.Do(). func (req *Request) Next() (*http.Response, error) { if len(req.policies) == 0 { return nil, errors.New("no more policies") } nextPolicy := req.policies[0] nextReq := *req nextReq.policies = nextReq.policies[1:] return nextPolicy.Do(&nextReq) } // SetOperationValue adds/changes a mutable key/value associated with a single operation. func (req *Request) SetOperationValue(value any) { if req.values == nil { req.values = opValues{} } req.values.set(value) } // OperationValue looks for a value set by SetOperationValue(). func (req *Request) OperationValue(value any) bool { if req.values == nil { return false } return req.values.get(value) } // SetBody sets the specified ReadSeekCloser as the HTTP request body, and sets Content-Type and Content-Length // accordingly. If the ReadSeekCloser is nil or empty, Content-Length won't be set. If contentType is "", // Content-Type won't be set, and if it was set, will be deleted. // Use streaming.NopCloser to turn an io.ReadSeeker into an io.ReadSeekCloser. func (req *Request) SetBody(body io.ReadSeekCloser, contentType string) error { // clobber the existing Content-Type to preserve behavior return SetBody(req, body, contentType, true) } // RewindBody seeks the request's Body stream back to the beginning so it can be resent when retrying an operation. func (req *Request) RewindBody() error { if req.body != nil { // Reset the stream back to the beginning and restore the body _, err := req.body.Seek(0, io.SeekStart) req.req.Body = req.body return err } return nil } // Close closes the request body. func (req *Request) Close() error { if req.body == nil { return nil } return req.body.Close() } // Clone returns a deep copy of the request with its context changed to ctx. func (req *Request) Clone(ctx context.Context) *Request { r2 := *req r2.req = req.req.Clone(ctx) return &r2 } // WithContext returns a shallow copy of the request with its context changed to ctx. func (req *Request) WithContext(ctx context.Context) *Request { r2 := new(Request) *r2 = *req r2.req = r2.req.WithContext(ctx) return r2 } // not exported but dependent on Request // PolicyFunc is a type that implements the Policy interface. // Use this type when implementing a stateless policy as a first-class function. type PolicyFunc func(*Request) (*http.Response, error) // Do implements the Policy interface on policyFunc. func (pf PolicyFunc) Do(req *Request) (*http.Response, error) { return pf(req) } // SetBody sets the specified ReadSeekCloser as the HTTP request body, and sets Content-Type and Content-Length accordingly. // - req is the request to modify // - body is the request body; if nil or empty, Content-Length won't be set // - contentType is the value for the Content-Type header; if empty, Content-Type will be deleted // - clobberContentType when true, will overwrite the existing value of Content-Type with contentType func SetBody(req *Request, body io.ReadSeekCloser, contentType string, clobberContentType bool) error { var err error var size int64 if body != nil { size, err = body.Seek(0, io.SeekEnd) // Seek to the end to get the stream's size if err != nil { return err } } if size == 0 { // treat an empty stream the same as a nil one: assign req a nil body body = nil // RFC 9110 specifies a client shouldn't set Content-Length on a request containing no content // (Del is a no-op when the header has no value) req.req.Header.Del(shared.HeaderContentLength) } else { _, err = body.Seek(0, io.SeekStart) if err != nil { return err } req.req.Header.Set(shared.HeaderContentLength, strconv.FormatInt(size, 10)) req.Raw().GetBody = func() (io.ReadCloser, error) { _, err := body.Seek(0, io.SeekStart) // Seek back to the beginning of the stream return body, err } } // keep a copy of the body argument. this is to handle cases // where req.Body is replaced, e.g. httputil.DumpRequest and friends. req.body = body req.req.Body = body req.req.ContentLength = size if contentType == "" { // Del is a no-op when the header has no value req.req.Header.Del(shared.HeaderContentType) } else if req.req.Header.Get(shared.HeaderContentType) == "" || clobberContentType { req.req.Header.Set(shared.HeaderContentType, contentType) } return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/response_error.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package exported import ( "bytes" "encoding/json" "fmt" "net/http" "regexp" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/internal/exported" ) // NewResponseError creates a new *ResponseError from the provided HTTP response. // Exported as runtime.NewResponseError(). func NewResponseError(resp *http.Response) error { // prefer the error code in the response header if ec := resp.Header.Get(shared.HeaderXMSErrorCode); ec != "" { return NewResponseErrorWithErrorCode(resp, ec) } // if we didn't get x-ms-error-code, check in the response body body, err := exported.Payload(resp, nil) if err != nil { // since we're not returning the ResponseError in this // case we also don't want to write it to the log. return err } var errorCode string if len(body) > 0 { if fromJSON := extractErrorCodeJSON(body); fromJSON != "" { errorCode = fromJSON } else if fromXML := extractErrorCodeXML(body); fromXML != "" { errorCode = fromXML } } return NewResponseErrorWithErrorCode(resp, errorCode) } // NewResponseErrorWithErrorCode creates an *azcore.ResponseError from the provided HTTP response and errorCode. // Exported as runtime.NewResponseErrorWithErrorCode(). func NewResponseErrorWithErrorCode(resp *http.Response, errorCode string) error { respErr := &ResponseError{ ErrorCode: errorCode, StatusCode: resp.StatusCode, RawResponse: resp, } log.Write(log.EventResponseError, respErr.Error()) return respErr } func extractErrorCodeJSON(body []byte) string { var rawObj map[string]any if err := json.Unmarshal(body, &rawObj); err != nil { // not a JSON object return "" } // check if this is a wrapped error, i.e. { "error": { ... } } // if so then unwrap it if wrapped, ok := rawObj["error"]; ok { unwrapped, ok := wrapped.(map[string]any) if !ok { return "" } rawObj = unwrapped } else if wrapped, ok := rawObj["odata.error"]; ok { // check if this a wrapped odata error, i.e. { "odata.error": { ... } } unwrapped, ok := wrapped.(map[string]any) if !ok { return "" } rawObj = unwrapped } // now check for the error code code, ok := rawObj["code"] if !ok { return "" } codeStr, ok := code.(string) if !ok { return "" } return codeStr } func extractErrorCodeXML(body []byte) string { // regular expression is much easier than dealing with the XML parser rx := regexp.MustCompile(`<(?:\w+:)?[c|C]ode>\s*(\w+)\s*<\/(?:\w+:)?[c|C]ode>`) res := rx.FindStringSubmatch(string(body)) if len(res) != 2 { return "" } // first submatch is the entire thing, second one is the captured error code return res[1] } // ResponseError is returned when a request is made to a service and // the service returns a non-success HTTP status code. // Use errors.As() to access this type in the error chain. // Exported as azcore.ResponseError. type ResponseError struct { // ErrorCode is the error code returned by the resource provider if available. ErrorCode string // StatusCode is the HTTP status code as defined in https://pkg.go.dev/net/http#pkg-constants. StatusCode int // RawResponse is the underlying HTTP response. RawResponse *http.Response `json:"-"` errMsg string } // Error implements the error interface for type ResponseError. // Note that the message contents are not contractual and can change over time. func (e *ResponseError) Error() string { if e.errMsg != "" { return e.errMsg } const separator = "--------------------------------------------------------------------------------" // write the request method and URL with response status code msg := &bytes.Buffer{} if e.RawResponse != nil { if e.RawResponse.Request != nil { fmt.Fprintf(msg, "%s %s://%s%s\n", e.RawResponse.Request.Method, e.RawResponse.Request.URL.Scheme, e.RawResponse.Request.URL.Host, e.RawResponse.Request.URL.Path) } else { fmt.Fprintln(msg, "Request information not available") } fmt.Fprintln(msg, separator) fmt.Fprintf(msg, "RESPONSE %d: %s\n", e.RawResponse.StatusCode, e.RawResponse.Status) } else { fmt.Fprintln(msg, "Missing RawResponse") fmt.Fprintln(msg, separator) } if e.ErrorCode != "" { fmt.Fprintf(msg, "ERROR CODE: %s\n", e.ErrorCode) } else { fmt.Fprintln(msg, "ERROR CODE UNAVAILABLE") } if e.RawResponse != nil { fmt.Fprintln(msg, separator) body, err := exported.Payload(e.RawResponse, nil) if err != nil { // this really shouldn't fail at this point as the response // body is already cached (it was read in NewResponseError) fmt.Fprintf(msg, "Error reading response body: %v", err) } else if len(body) > 0 { if err := json.Indent(msg, body, "", " "); err != nil { // failed to pretty-print so just dump it verbatim fmt.Fprint(msg, string(body)) } // the standard library doesn't have a pretty-printer for XML fmt.Fprintln(msg) } else { fmt.Fprintln(msg, "Response contained no body") } } fmt.Fprintln(msg, separator) e.errMsg = msg.String() return e.errMsg } // internal type used for marshaling/unmarshaling type responseError struct { ErrorCode string `json:"errorCode"` StatusCode int `json:"statusCode"` ErrorMessage string `json:"errorMessage"` } func (e ResponseError) MarshalJSON() ([]byte, error) { return json.Marshal(responseError{ ErrorCode: e.ErrorCode, StatusCode: e.StatusCode, ErrorMessage: e.Error(), }) } func (e *ResponseError) UnmarshalJSON(data []byte) error { re := responseError{} if err := json.Unmarshal(data, &re); err != nil { return err } e.ErrorCode = re.ErrorCode e.StatusCode = re.StatusCode e.errMsg = re.ErrorMessage return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log/log.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // This is an internal helper package to combine the complete logging APIs. package log import ( azlog "github.com/Azure/azure-sdk-for-go/sdk/azcore/log" "github.com/Azure/azure-sdk-for-go/sdk/internal/log" ) type Event = log.Event const ( EventRequest = azlog.EventRequest EventResponse = azlog.EventResponse EventResponseError = azlog.EventResponseError EventRetryPolicy = azlog.EventRetryPolicy EventLRO = azlog.EventLRO ) // Write invokes the underlying listener with the specified event and message. // If the event shouldn't be logged or there is no listener then Write does nothing. func Write(cls log.Event, msg string) { log.Write(cls, msg) } // Writef invokes the underlying listener with the specified event and formatted message. // If the event shouldn't be logged or there is no listener then Writef does nothing. func Writef(cls log.Event, format string, a ...any) { log.Writef(cls, format, a...) } // SetListener will set the Logger to write to the specified listener. func SetListener(lst func(Event, string)) { log.SetListener(lst) } // Should returns true if the specified log event should be written to the log. // By default all log events will be logged. Call SetEvents() to limit // the log events for logging. // If no listener has been set this will return false. // Calling this method is useful when the message to log is computationally expensive // and you want to avoid the overhead if its log event is not enabled. func Should(cls log.Event) bool { return log.Should(cls) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/async/async.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package async import ( "context" "errors" "fmt" "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" ) // see https://github.com/Azure/azure-resource-manager-rpc/blob/master/v1.0/async-api-reference.md // Applicable returns true if the LRO is using Azure-AsyncOperation. func Applicable(resp *http.Response) bool { return resp.Header.Get(shared.HeaderAzureAsync) != "" } // CanResume returns true if the token can rehydrate this poller type. func CanResume(token map[string]any) bool { _, ok := token["asyncURL"] return ok } // Poller is an LRO poller that uses the Azure-AsyncOperation pattern. type Poller[T any] struct { pl exported.Pipeline resp *http.Response // The URL from Azure-AsyncOperation header. AsyncURL string `json:"asyncURL"` // The URL from Location header. LocURL string `json:"locURL"` // The URL from the initial LRO request. OrigURL string `json:"origURL"` // The HTTP method from the initial LRO request. Method string `json:"method"` // The value of final-state-via from swagger, can be the empty string. FinalState pollers.FinalStateVia `json:"finalState"` // The LRO's current state. CurState string `json:"state"` } // New creates a new Poller from the provided initial response and final-state type. // Pass nil for response to create an empty Poller for rehydration. func New[T any](pl exported.Pipeline, resp *http.Response, finalState pollers.FinalStateVia) (*Poller[T], error) { if resp == nil { log.Write(log.EventLRO, "Resuming Azure-AsyncOperation poller.") return &Poller[T]{pl: pl}, nil } log.Write(log.EventLRO, "Using Azure-AsyncOperation poller.") asyncURL := resp.Header.Get(shared.HeaderAzureAsync) if asyncURL == "" { return nil, errors.New("response is missing Azure-AsyncOperation header") } if !poller.IsValidURL(asyncURL) { return nil, fmt.Errorf("invalid polling URL %s", asyncURL) } // check for provisioning state. if the operation is a RELO // and terminates synchronously this will prevent extra polling. // it's ok if there's no provisioning state. state, _ := poller.GetProvisioningState(resp) if state == "" { state = poller.StatusInProgress } p := &Poller[T]{ pl: pl, resp: resp, AsyncURL: asyncURL, LocURL: resp.Header.Get(shared.HeaderLocation), OrigURL: resp.Request.URL.String(), Method: resp.Request.Method, FinalState: finalState, CurState: state, } return p, nil } // Done returns true if the LRO is in a terminal state. func (p *Poller[T]) Done() bool { return poller.IsTerminalState(p.CurState) } // Poll retrieves the current state of the LRO. func (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) { err := pollers.PollHelper(ctx, p.AsyncURL, p.pl, func(resp *http.Response) (string, error) { if !poller.StatusCodeValid(resp) { p.resp = resp return "", exported.NewResponseError(resp) } state, err := poller.GetStatus(resp) if err != nil { return "", err } else if state == "" { return "", errors.New("the response did not contain a status") } p.resp = resp p.CurState = state return p.CurState, nil }) if err != nil { return nil, err } return p.resp, nil } func (p *Poller[T]) Result(ctx context.Context, out *T) error { if p.resp.StatusCode == http.StatusNoContent { return nil } else if poller.Failed(p.CurState) { return exported.NewResponseError(p.resp) } var req *exported.Request var err error if p.Method == http.MethodPatch || p.Method == http.MethodPut { // for PATCH and PUT, the final GET is on the original resource URL req, err = exported.NewRequest(ctx, http.MethodGet, p.OrigURL) } else if p.Method == http.MethodPost { if p.FinalState == pollers.FinalStateViaAzureAsyncOp { // no final GET required } else if p.FinalState == pollers.FinalStateViaOriginalURI { req, err = exported.NewRequest(ctx, http.MethodGet, p.OrigURL) } else if p.LocURL != "" { // ideally FinalState would be set to "location" but it isn't always. // must check last due to more permissive condition. req, err = exported.NewRequest(ctx, http.MethodGet, p.LocURL) } } if err != nil { return err } // if a final GET request has been created, execute it if req != nil { resp, err := p.pl.Do(req) if err != nil { return err } p.resp = resp } return pollers.ResultHelper(p.resp, poller.Failed(p.CurState), "", out) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/body/body.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package body import ( "context" "errors" "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers" "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" ) // Kind is the identifier of this type in a resume token. const kind = "body" // Applicable returns true if the LRO is using no headers, just provisioning state. // This is only applicable to PATCH and PUT methods and assumes no polling headers. func Applicable(resp *http.Response) bool { // we can't check for absense of headers due to some misbehaving services // like redis that return a Location header but don't actually use that protocol return resp.Request.Method == http.MethodPatch || resp.Request.Method == http.MethodPut } // CanResume returns true if the token can rehydrate this poller type. func CanResume(token map[string]any) bool { t, ok := token["type"] if !ok { return false } tt, ok := t.(string) if !ok { return false } return tt == kind } // Poller is an LRO poller that uses the Body pattern. type Poller[T any] struct { pl exported.Pipeline resp *http.Response // The poller's type, used for resume token processing. Type string `json:"type"` // The URL for polling. PollURL string `json:"pollURL"` // The LRO's current state. CurState string `json:"state"` } // New creates a new Poller from the provided initial response. // Pass nil for response to create an empty Poller for rehydration. func New[T any](pl exported.Pipeline, resp *http.Response) (*Poller[T], error) { if resp == nil { log.Write(log.EventLRO, "Resuming Body poller.") return &Poller[T]{pl: pl}, nil } log.Write(log.EventLRO, "Using Body poller.") p := &Poller[T]{ pl: pl, resp: resp, Type: kind, PollURL: resp.Request.URL.String(), } // default initial state to InProgress. depending on the HTTP // status code and provisioning state, we might change the value. curState := poller.StatusInProgress provState, err := poller.GetProvisioningState(resp) if err != nil && !errors.Is(err, poller.ErrNoBody) { return nil, err } if resp.StatusCode == http.StatusCreated && provState != "" { // absense of provisioning state is ok for a 201, means the operation is in progress curState = provState } else if resp.StatusCode == http.StatusOK { if provState != "" { curState = provState } else if provState == "" { // for a 200, absense of provisioning state indicates success curState = poller.StatusSucceeded } } else if resp.StatusCode == http.StatusNoContent { curState = poller.StatusSucceeded } p.CurState = curState return p, nil } func (p *Poller[T]) Done() bool { return poller.IsTerminalState(p.CurState) } func (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) { err := pollers.PollHelper(ctx, p.PollURL, p.pl, func(resp *http.Response) (string, error) { if !poller.StatusCodeValid(resp) { p.resp = resp return "", exported.NewResponseError(resp) } if resp.StatusCode == http.StatusNoContent { p.resp = resp p.CurState = poller.StatusSucceeded return p.CurState, nil } state, err := poller.GetProvisioningState(resp) if errors.Is(err, poller.ErrNoBody) { // a missing response body in non-204 case is an error return "", err } else if state == "" { // a response body without provisioning state is considered terminal success state = poller.StatusSucceeded } else if err != nil { return "", err } p.resp = resp p.CurState = state return p.CurState, nil }) if err != nil { return nil, err } return p.resp, nil } func (p *Poller[T]) Result(ctx context.Context, out *T) error { return pollers.ResultHelper(p.resp, poller.Failed(p.CurState), "", out) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake/fake.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package fake import ( "context" "errors" "fmt" "net/http" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" ) // Applicable returns true if the LRO is a fake. func Applicable(resp *http.Response) bool { return resp.Header.Get(shared.HeaderFakePollerStatus) != "" } // CanResume returns true if the token can rehydrate this poller type. func CanResume(token map[string]any) bool { _, ok := token["fakeURL"] return ok } // Poller is an LRO poller that uses the Core-Fake-Poller pattern. type Poller[T any] struct { pl exported.Pipeline resp *http.Response // The API name from CtxAPINameKey APIName string `json:"apiName"` // The URL from Core-Fake-Poller header. FakeURL string `json:"fakeURL"` // The LRO's current state. FakeStatus string `json:"status"` } // lroStatusURLSuffix is the URL path suffix for a faked LRO. const lroStatusURLSuffix = "/get/fake/status" // New creates a new Poller from the provided initial response. // Pass nil for response to create an empty Poller for rehydration. func New[T any](pl exported.Pipeline, resp *http.Response) (*Poller[T], error) { if resp == nil { log.Write(log.EventLRO, "Resuming Core-Fake-Poller poller.") return &Poller[T]{pl: pl}, nil } log.Write(log.EventLRO, "Using Core-Fake-Poller poller.") fakeStatus := resp.Header.Get(shared.HeaderFakePollerStatus) if fakeStatus == "" { return nil, errors.New("response is missing Fake-Poller-Status header") } ctxVal := resp.Request.Context().Value(shared.CtxAPINameKey{}) if ctxVal == nil { return nil, errors.New("missing value for CtxAPINameKey") } apiName, ok := ctxVal.(string) if !ok { return nil, fmt.Errorf("expected string for CtxAPINameKey, the type was %T", ctxVal) } qp := "" if resp.Request.URL.RawQuery != "" { qp = "?" + resp.Request.URL.RawQuery } p := &Poller[T]{ pl: pl, resp: resp, APIName: apiName, // NOTE: any changes to this path format MUST be reflected in SanitizePollerPath() FakeURL: fmt.Sprintf("%s://%s%s%s%s", resp.Request.URL.Scheme, resp.Request.URL.Host, resp.Request.URL.Path, lroStatusURLSuffix, qp), FakeStatus: fakeStatus, } return p, nil } // Done returns true if the LRO is in a terminal state. func (p *Poller[T]) Done() bool { return poller.IsTerminalState(p.FakeStatus) } // Poll retrieves the current state of the LRO. func (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) { ctx = context.WithValue(ctx, shared.CtxAPINameKey{}, p.APIName) err := pollers.PollHelper(ctx, p.FakeURL, p.pl, func(resp *http.Response) (string, error) { if !poller.StatusCodeValid(resp) { p.resp = resp return "", exported.NewResponseError(resp) } fakeStatus := resp.Header.Get(shared.HeaderFakePollerStatus) if fakeStatus == "" { return "", errors.New("response is missing Fake-Poller-Status header") } p.resp = resp p.FakeStatus = fakeStatus return p.FakeStatus, nil }) if err != nil { return nil, err } return p.resp, nil } func (p *Poller[T]) Result(ctx context.Context, out *T) error { if p.resp.StatusCode == http.StatusNoContent { return nil } else if poller.Failed(p.FakeStatus) { return exported.NewResponseError(p.resp) } return pollers.ResultHelper(p.resp, poller.Failed(p.FakeStatus), "", out) } // SanitizePollerPath removes any fake-appended suffix from a URL's path. func SanitizePollerPath(path string) string { return strings.TrimSuffix(path, lroStatusURLSuffix) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/loc/loc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package loc import ( "context" "errors" "fmt" "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" ) // Kind is the identifier of this type in a resume token. const kind = "loc" // Applicable returns true if the LRO is using Location. func Applicable(resp *http.Response) bool { return resp.Header.Get(shared.HeaderLocation) != "" } // CanResume returns true if the token can rehydrate this poller type. func CanResume(token map[string]any) bool { t, ok := token["type"] if !ok { return false } tt, ok := t.(string) if !ok { return false } return tt == kind } // Poller is an LRO poller that uses the Location pattern. type Poller[T any] struct { pl exported.Pipeline resp *http.Response Type string `json:"type"` PollURL string `json:"pollURL"` CurState string `json:"state"` } // New creates a new Poller from the provided initial response. // Pass nil for response to create an empty Poller for rehydration. func New[T any](pl exported.Pipeline, resp *http.Response) (*Poller[T], error) { if resp == nil { log.Write(log.EventLRO, "Resuming Location poller.") return &Poller[T]{pl: pl}, nil } log.Write(log.EventLRO, "Using Location poller.") locURL := resp.Header.Get(shared.HeaderLocation) if locURL == "" { return nil, errors.New("response is missing Location header") } if !poller.IsValidURL(locURL) { return nil, fmt.Errorf("invalid polling URL %s", locURL) } // check for provisioning state. if the operation is a RELO // and terminates synchronously this will prevent extra polling. // it's ok if there's no provisioning state. state, _ := poller.GetProvisioningState(resp) if state == "" { state = poller.StatusInProgress } return &Poller[T]{ pl: pl, resp: resp, Type: kind, PollURL: locURL, CurState: state, }, nil } func (p *Poller[T]) Done() bool { return poller.IsTerminalState(p.CurState) } func (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) { err := pollers.PollHelper(ctx, p.PollURL, p.pl, func(resp *http.Response) (string, error) { // location polling can return an updated polling URL if h := resp.Header.Get(shared.HeaderLocation); h != "" { p.PollURL = h } // if provisioning state is available, use that. this is only // for some ARM LRO scenarios (e.g. DELETE with a Location header) // so if it's missing then use HTTP status code. provState, _ := poller.GetProvisioningState(resp) p.resp = resp if provState != "" { p.CurState = provState } else if resp.StatusCode == http.StatusAccepted { p.CurState = poller.StatusInProgress } else if resp.StatusCode > 199 && resp.StatusCode < 300 { // any 2xx other than a 202 indicates success p.CurState = poller.StatusSucceeded } else if pollers.IsNonTerminalHTTPStatusCode(resp) { // the request timed out or is being throttled. // DO NOT include this as a terminal failure. preserve // the existing state and return the response. } else { p.CurState = poller.StatusFailed } return p.CurState, nil }) if err != nil { return nil, err } return p.resp, nil } func (p *Poller[T]) Result(ctx context.Context, out *T) error { return pollers.ResultHelper(p.resp, poller.Failed(p.CurState), "", out) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/op/op.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package op import ( "context" "errors" "fmt" "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" ) // Applicable returns true if the LRO is using Operation-Location. func Applicable(resp *http.Response) bool { return resp.Header.Get(shared.HeaderOperationLocation) != "" } // CanResume returns true if the token can rehydrate this poller type. func CanResume(token map[string]any) bool { _, ok := token["oplocURL"] return ok } // Poller is an LRO poller that uses the Operation-Location pattern. type Poller[T any] struct { pl exported.Pipeline resp *http.Response OpLocURL string `json:"oplocURL"` LocURL string `json:"locURL"` OrigURL string `json:"origURL"` Method string `json:"method"` FinalState pollers.FinalStateVia `json:"finalState"` ResultPath string `json:"resultPath"` CurState string `json:"state"` } // New creates a new Poller from the provided initial response. // Pass nil for response to create an empty Poller for rehydration. func New[T any](pl exported.Pipeline, resp *http.Response, finalState pollers.FinalStateVia, resultPath string) (*Poller[T], error) { if resp == nil { log.Write(log.EventLRO, "Resuming Operation-Location poller.") return &Poller[T]{pl: pl}, nil } log.Write(log.EventLRO, "Using Operation-Location poller.") opURL := resp.Header.Get(shared.HeaderOperationLocation) if opURL == "" { return nil, errors.New("response is missing Operation-Location header") } if !poller.IsValidURL(opURL) { return nil, fmt.Errorf("invalid Operation-Location URL %s", opURL) } locURL := resp.Header.Get(shared.HeaderLocation) // Location header is optional if locURL != "" && !poller.IsValidURL(locURL) { return nil, fmt.Errorf("invalid Location URL %s", locURL) } // default initial state to InProgress. if the // service sent us a status then use that instead. curState := poller.StatusInProgress status, err := poller.GetStatus(resp) if err != nil && !errors.Is(err, poller.ErrNoBody) { return nil, err } if status != "" { curState = status } return &Poller[T]{ pl: pl, resp: resp, OpLocURL: opURL, LocURL: locURL, OrigURL: resp.Request.URL.String(), Method: resp.Request.Method, FinalState: finalState, ResultPath: resultPath, CurState: curState, }, nil } func (p *Poller[T]) Done() bool { return poller.IsTerminalState(p.CurState) } func (p *Poller[T]) Poll(ctx context.Context) (*http.Response, error) { err := pollers.PollHelper(ctx, p.OpLocURL, p.pl, func(resp *http.Response) (string, error) { if !poller.StatusCodeValid(resp) { p.resp = resp return "", exported.NewResponseError(resp) } state, err := poller.GetStatus(resp) if err != nil { return "", err } else if state == "" { return "", errors.New("the response did not contain a status") } p.resp = resp p.CurState = state return p.CurState, nil }) if err != nil { return nil, err } return p.resp, nil } func (p *Poller[T]) Result(ctx context.Context, out *T) error { var req *exported.Request var err error if p.FinalState == pollers.FinalStateViaLocation && p.LocURL != "" { req, err = exported.NewRequest(ctx, http.MethodGet, p.LocURL) } else if rl, rlErr := poller.GetResourceLocation(p.resp); rlErr != nil && !errors.Is(rlErr, poller.ErrNoBody) { return rlErr } else if rl != "" { req, err = exported.NewRequest(ctx, http.MethodGet, rl) } else if p.Method == http.MethodPatch || p.Method == http.MethodPut { req, err = exported.NewRequest(ctx, http.MethodGet, p.OrigURL) } else if p.Method == http.MethodPost && p.LocURL != "" { req, err = exported.NewRequest(ctx, http.MethodGet, p.LocURL) } if err != nil { return err } // if a final GET request has been created, execute it if req != nil { // no JSON path when making a final GET request p.ResultPath = "" resp, err := p.pl.Do(req) if err != nil { return err } p.resp = resp } return pollers.ResultHelper(p.resp, poller.Failed(p.CurState), p.ResultPath, out) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/poller.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package pollers // FinalStateVia is the enumerated type for the possible final-state-via values. type FinalStateVia string const ( // FinalStateViaAzureAsyncOp indicates the final payload comes from the Azure-AsyncOperation URL. FinalStateViaAzureAsyncOp FinalStateVia = "azure-async-operation" // FinalStateViaLocation indicates the final payload comes from the Location URL. FinalStateViaLocation FinalStateVia = "location" // FinalStateViaOriginalURI indicates the final payload comes from the original URL. FinalStateViaOriginalURI FinalStateVia = "original-uri" // FinalStateViaOpLocation indicates the final payload comes from the Operation-Location URL. FinalStateViaOpLocation FinalStateVia = "operation-location" ) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/util.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package pollers import ( "context" "encoding/json" "errors" "fmt" "net/http" "reflect" azexported "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" ) // getTokenTypeName creates a type name from the type parameter T. func getTokenTypeName[T any]() (string, error) { tt := shared.TypeOfT[T]() var n string if tt.Kind() == reflect.Pointer { n = "*" tt = tt.Elem() } n += tt.Name() if n == "" { return "", errors.New("nameless types are not allowed") } return n, nil } type resumeTokenWrapper[T any] struct { Type string `json:"type"` Token T `json:"token"` } // NewResumeToken creates a resume token from the specified type. // An error is returned if the generic type has no name (e.g. struct{}). func NewResumeToken[TResult, TSource any](from TSource) (string, error) { n, err := getTokenTypeName[TResult]() if err != nil { return "", err } b, err := json.Marshal(resumeTokenWrapper[TSource]{ Type: n, Token: from, }) if err != nil { return "", err } return string(b), nil } // ExtractToken returns the poller-specific token information from the provided token value. func ExtractToken(token string) ([]byte, error) { raw := map[string]json.RawMessage{} if err := json.Unmarshal([]byte(token), &raw); err != nil { return nil, err } // this is dependent on the type resumeTokenWrapper[T] tk, ok := raw["token"] if !ok { return nil, errors.New("missing token value") } return tk, nil } // IsTokenValid returns an error if the specified token isn't applicable for generic type T. func IsTokenValid[T any](token string) error { raw := map[string]any{} if err := json.Unmarshal([]byte(token), &raw); err != nil { return err } t, ok := raw["type"] if !ok { return errors.New("missing type value") } tt, ok := t.(string) if !ok { return fmt.Errorf("invalid type format %T", t) } n, err := getTokenTypeName[T]() if err != nil { return err } if tt != n { return fmt.Errorf("cannot resume from this poller token. token is for type %s, not %s", tt, n) } return nil } // used if the operation synchronously completed type NopPoller[T any] struct { resp *http.Response result T } // NewNopPoller creates a NopPoller from the provided response. // It unmarshals the response body into an instance of T. func NewNopPoller[T any](resp *http.Response) (*NopPoller[T], error) { np := &NopPoller[T]{resp: resp} if resp.StatusCode == http.StatusNoContent { return np, nil } payload, err := exported.Payload(resp, nil) if err != nil { return nil, err } if len(payload) == 0 { return np, nil } if err = json.Unmarshal(payload, &np.result); err != nil { return nil, err } return np, nil } func (*NopPoller[T]) Done() bool { return true } func (p *NopPoller[T]) Poll(context.Context) (*http.Response, error) { return p.resp, nil } func (p *NopPoller[T]) Result(ctx context.Context, out *T) error { *out = p.result return nil } // PollHelper creates and executes the request, calling update() with the response. // If the request fails, the update func is not called. // The update func returns the state of the operation for logging purposes or an error // if it fails to extract the required state from the response. func PollHelper(ctx context.Context, endpoint string, pl azexported.Pipeline, update func(resp *http.Response) (string, error)) error { req, err := azexported.NewRequest(ctx, http.MethodGet, endpoint) if err != nil { return err } resp, err := pl.Do(req) if err != nil { return err } state, err := update(resp) if err != nil { return err } log.Writef(log.EventLRO, "State %s", state) return nil } // ResultHelper processes the response as success or failure. // In the success case, it unmarshals the payload into either a new instance of T or out. // In the failure case, it creates an *azcore.Response error from the response. func ResultHelper[T any](resp *http.Response, failed bool, jsonPath string, out *T) error { // short-circuit the simple success case with no response body to unmarshal if resp.StatusCode == http.StatusNoContent { return nil } defer resp.Body.Close() if !poller.StatusCodeValid(resp) || failed { // the LRO failed. unmarshall the error and update state return azexported.NewResponseError(resp) } // success case payload, err := exported.Payload(resp, nil) if err != nil { return err } if jsonPath != "" && len(payload) > 0 { // extract the payload from the specified JSON path. // do this before the zero-length check in case there // is no payload. jsonBody := map[string]json.RawMessage{} if err = json.Unmarshal(payload, &jsonBody); err != nil { return err } payload = jsonBody[jsonPath] } if len(payload) == 0 { return nil } if err = json.Unmarshal(payload, out); err != nil { return err } return nil } // IsNonTerminalHTTPStatusCode returns true if the HTTP status code should be // considered non-terminal thus eligible for retry. func IsNonTerminalHTTPStatusCode(resp *http.Response) bool { return exported.HasStatusCode(resp, http.StatusRequestTimeout, // 408 http.StatusTooManyRequests, // 429 http.StatusInternalServerError, // 500 http.StatusBadGateway, // 502 http.StatusServiceUnavailable, // 503 http.StatusGatewayTimeout, // 504 ) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package shared const ( ContentTypeAppJSON = "application/json" ContentTypeAppXML = "application/xml" ContentTypeTextPlain = "text/plain" ) const ( HeaderAuthorization = "Authorization" HeaderAuxiliaryAuthorization = "x-ms-authorization-auxiliary" HeaderAzureAsync = "Azure-AsyncOperation" HeaderContentLength = "Content-Length" HeaderContentType = "Content-Type" HeaderFakePollerStatus = "Fake-Poller-Status" HeaderLocation = "Location" HeaderOperationLocation = "Operation-Location" HeaderRetryAfter = "Retry-After" HeaderRetryAfterMS = "Retry-After-Ms" HeaderUserAgent = "User-Agent" HeaderWWWAuthenticate = "WWW-Authenticate" HeaderXMSClientRequestID = "x-ms-client-request-id" HeaderXMSRequestID = "x-ms-request-id" HeaderXMSErrorCode = "x-ms-error-code" HeaderXMSRetryAfterMS = "x-ms-retry-after-ms" ) const BearerTokenPrefix = "Bearer " const TracingNamespaceAttrName = "az.namespace" const ( // Module is the name of the calling module used in telemetry data. Module = "azcore" // Version is the semantic version (see http://semver.org) of this module. Version = "v1.18.0" ) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/shared.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package shared import ( "context" "fmt" "net/http" "reflect" "regexp" "strconv" "time" ) // NOTE: when adding a new context key type, it likely needs to be // added to the deny-list of key types in ContextWithDeniedValues // CtxWithHTTPHeaderKey is used as a context key for adding/retrieving http.Header. type CtxWithHTTPHeaderKey struct{} // CtxWithRetryOptionsKey is used as a context key for adding/retrieving RetryOptions. type CtxWithRetryOptionsKey struct{} // CtxWithCaptureResponse is used as a context key for retrieving the raw response. type CtxWithCaptureResponse struct{} // CtxWithTracingTracer is used as a context key for adding/retrieving tracing.Tracer. type CtxWithTracingTracer struct{} // CtxAPINameKey is used as a context key for adding/retrieving the API name. type CtxAPINameKey struct{} // Delay waits for the duration to elapse or the context to be cancelled. func Delay(ctx context.Context, delay time.Duration) error { select { case <-time.After(delay): return nil case <-ctx.Done(): return ctx.Err() } } // RetryAfter returns non-zero if the response contains one of the headers with a "retry after" value. // Headers are checked in the following order: retry-after-ms, x-ms-retry-after-ms, retry-after func RetryAfter(resp *http.Response) time.Duration { if resp == nil { return 0 } type retryData struct { header string units time.Duration // custom is used when the regular algorithm failed and is optional. // the returned duration is used verbatim (units is not applied). custom func(string) time.Duration } nop := func(string) time.Duration { return 0 } // the headers are listed in order of preference retries := []retryData{ { header: HeaderRetryAfterMS, units: time.Millisecond, custom: nop, }, { header: HeaderXMSRetryAfterMS, units: time.Millisecond, custom: nop, }, { header: HeaderRetryAfter, units: time.Second, // retry-after values are expressed in either number of // seconds or an HTTP-date indicating when to try again custom: func(ra string) time.Duration { t, err := time.Parse(time.RFC1123, ra) if err != nil { return 0 } return time.Until(t) }, }, } for _, retry := range retries { v := resp.Header.Get(retry.header) if v == "" { continue } if retryAfter, _ := strconv.Atoi(v); retryAfter > 0 { return time.Duration(retryAfter) * retry.units } else if d := retry.custom(v); d > 0 { return d } } return 0 } // TypeOfT returns the type of the generic type param. func TypeOfT[T any]() reflect.Type { // you can't, at present, obtain the type of // a type parameter, so this is the trick return reflect.TypeOf((*T)(nil)).Elem() } // TransportFunc is a helper to use a first-class func to satisfy the Transporter interface. type TransportFunc func(*http.Request) (*http.Response, error) // Do implements the Transporter interface for the TransportFunc type. func (pf TransportFunc) Do(req *http.Request) (*http.Response, error) { return pf(req) } // ValidateModVer verifies that moduleVersion is a valid semver 2.0 string. func ValidateModVer(moduleVersion string) error { modVerRegx := regexp.MustCompile(`^v\d+\.\d+\.\d+(?:-[a-zA-Z0-9_.-]+)?$`) if !modVerRegx.MatchString(moduleVersion) { return fmt.Errorf("malformed moduleVersion param value %s", moduleVersion) } return nil } // ContextWithDeniedValues wraps an existing [context.Context], denying access to certain context values. // Pipeline policies that create new requests to be sent down their own pipeline MUST wrap the caller's // context with an instance of this type. This is to prevent context values from flowing across disjoint // requests which can have unintended side-effects. type ContextWithDeniedValues struct { context.Context } // Value implements part of the [context.Context] interface. // It acts as a deny-list for certain context keys. func (c *ContextWithDeniedValues) Value(key any) any { switch key.(type) { case CtxAPINameKey, CtxWithCaptureResponse, CtxWithHTTPHeaderKey, CtxWithRetryOptionsKey, CtxWithTracingTracer: return nil default: return c.Context.Value(key) } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/log/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright 2017 Microsoft Corporation. All rights reserved. // Use of this source code is governed by an MIT // license that can be found in the LICENSE file. // Package log contains functionality for configuring logging behavior. // Default logging to stderr can be enabled by setting environment variable AZURE_SDK_GO_LOGGING to "all". package log ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/log/log.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Package log provides functionality for configuring logging facilities. package log import ( "github.com/Azure/azure-sdk-for-go/sdk/internal/log" ) // Event is used to group entries. Each group can be toggled on or off. type Event = log.Event const ( // EventRequest entries contain information about HTTP requests. // This includes information like the URL, query parameters, and headers. EventRequest Event = "Request" // EventResponse entries contain information about HTTP responses. // This includes information like the HTTP status code, headers, and request URL. EventResponse Event = "Response" // EventResponseError entries contain information about HTTP responses that returned // an *azcore.ResponseError (i.e. responses with a non 2xx HTTP status code). // This includes the contents of ResponseError.Error(). EventResponseError Event = "ResponseError" // EventRetryPolicy entries contain information specific to the retry policy in use. EventRetryPolicy Event = "Retry" // EventLRO entries contain information specific to long-running operations. // This includes information like polling location, operation state, and sleep intervals. EventLRO Event = "LongRunningOperation" ) // SetEvents is used to control which events are written to // the log. By default all log events are writen. // NOTE: this is not goroutine safe and should be called before using SDK clients. func SetEvents(cls ...Event) { log.SetEvents(cls...) } // SetListener will set the Logger to write to the specified Listener. // NOTE: this is not goroutine safe and should be called before using SDK clients. func SetListener(lst func(Event, string)) { log.SetListener(lst) } // for testing purposes func resetEvents() { log.TestResetEvents() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright 2017 Microsoft Corporation. All rights reserved. // Use of this source code is governed by an MIT // license that can be found in the LICENSE file. // Package policy contains the definitions needed for configuring in-box pipeline policies // and creating custom policies. package policy ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy/policy.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package policy import ( "context" "net/http" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing" ) // Policy represents an extensibility point for the Pipeline that can mutate the specified // Request and react to the received Response. type Policy = exported.Policy // Transporter represents an HTTP pipeline transport used to send HTTP requests and receive responses. type Transporter = exported.Transporter // Request is an abstraction over the creation of an HTTP request as it passes through the pipeline. // Don't use this type directly, use runtime.NewRequest() instead. type Request = exported.Request // ClientOptions contains optional settings for a client's pipeline. // Instances can be shared across calls to SDK client constructors when uniform configuration is desired. // Zero-value fields will have their specified default values applied during use. type ClientOptions struct { // APIVersion overrides the default version requested of the service. // Set with caution as this package version has not been tested with arbitrary service versions. APIVersion string // Cloud specifies a cloud for the client. The default is Azure Public Cloud. Cloud cloud.Configuration // InsecureAllowCredentialWithHTTP enables authenticated requests over HTTP. // By default, authenticated requests to an HTTP endpoint are rejected by the client. // WARNING: setting this to true will allow sending the credential in clear text. Use with caution. InsecureAllowCredentialWithHTTP bool // Logging configures the built-in logging policy. Logging LogOptions // Retry configures the built-in retry policy. Retry RetryOptions // Telemetry configures the built-in telemetry policy. Telemetry TelemetryOptions // TracingProvider configures the tracing provider. // It defaults to a no-op tracer. TracingProvider tracing.Provider // Transport sets the transport for HTTP requests. Transport Transporter // PerCallPolicies contains custom policies to inject into the pipeline. // Each policy is executed once per request. PerCallPolicies []Policy // PerRetryPolicies contains custom policies to inject into the pipeline. // Each policy is executed once per request, and for each retry of that request. PerRetryPolicies []Policy } // LogOptions configures the logging policy's behavior. type LogOptions struct { // IncludeBody indicates if request and response bodies should be included in logging. // The default value is false. // NOTE: enabling this can lead to disclosure of sensitive information, use with care. IncludeBody bool // AllowedHeaders is the slice of headers to log with their values intact. // All headers not in the slice will have their values REDACTED. // Applies to request and response headers. AllowedHeaders []string // AllowedQueryParams is the slice of query parameters to log with their values intact. // All query parameters not in the slice will have their values REDACTED. AllowedQueryParams []string } // RetryOptions configures the retry policy's behavior. // Zero-value fields will have their specified default values applied during use. // This allows for modification of a subset of fields. type RetryOptions struct { // MaxRetries specifies the maximum number of attempts a failed operation will be retried // before producing an error. // The default value is three. A value less than zero means one try and no retries. MaxRetries int32 // TryTimeout indicates the maximum time allowed for any single try of an HTTP request. // This is disabled by default. Specify a value greater than zero to enable. // NOTE: Setting this to a small value might cause premature HTTP request time-outs. TryTimeout time.Duration // RetryDelay specifies the initial amount of delay to use before retrying an operation. // The value is used only if the HTTP response does not contain a Retry-After header. // The delay increases exponentially with each retry up to the maximum specified by MaxRetryDelay. // The default value is four seconds. A value less than zero means no delay between retries. RetryDelay time.Duration // MaxRetryDelay specifies the maximum delay allowed before retrying an operation. // Typically the value is greater than or equal to the value specified in RetryDelay. // The default Value is 60 seconds. A value less than zero means there is no cap. MaxRetryDelay time.Duration // StatusCodes specifies the HTTP status codes that indicate the operation should be retried. // A nil slice will use the following values. // http.StatusRequestTimeout 408 // http.StatusTooManyRequests 429 // http.StatusInternalServerError 500 // http.StatusBadGateway 502 // http.StatusServiceUnavailable 503 // http.StatusGatewayTimeout 504 // Specifying values will replace the default values. // Specifying an empty slice will disable retries for HTTP status codes. StatusCodes []int // ShouldRetry evaluates if the retry policy should retry the request. // When specified, the function overrides comparison against the list of // HTTP status codes and error checking within the retry policy. Context // and NonRetriable errors remain evaluated before calling ShouldRetry. // The *http.Response and error parameters are mutually exclusive, i.e. // if one is nil, the other is not nil. // A return value of true means the retry policy should retry. ShouldRetry func(*http.Response, error) bool } // TelemetryOptions configures the telemetry policy's behavior. type TelemetryOptions struct { // ApplicationID is an application-specific identification string to add to the User-Agent. // It has a maximum length of 24 characters and must not contain any spaces. ApplicationID string // Disabled will prevent the addition of any telemetry data to the User-Agent. Disabled bool } // TokenRequestOptions contain specific parameter that may be used by credentials types when attempting to get a token. type TokenRequestOptions = exported.TokenRequestOptions // BearerTokenOptions configures the bearer token policy's behavior. type BearerTokenOptions struct { // AuthorizationHandler allows SDK developers to run client-specific logic when BearerTokenPolicy must authorize a request. // When this field isn't set, the policy follows its default behavior of authorizing every request with a bearer token from // its given credential. AuthorizationHandler AuthorizationHandler // InsecureAllowCredentialWithHTTP enables authenticated requests over HTTP. // By default, authenticated requests to an HTTP endpoint are rejected by the client. // WARNING: setting this to true will allow sending the bearer token in clear text. Use with caution. InsecureAllowCredentialWithHTTP bool } // AuthorizationHandler allows SDK developers to insert custom logic that runs when BearerTokenPolicy must authorize a request. type AuthorizationHandler struct { // OnRequest provides TokenRequestOptions the policy can use to acquire a token for a request. The policy calls OnRequest // whenever it needs a token and may call it multiple times for the same request. Its func parameter authorizes the request // with a token from the policy's credential. Implementations that need to perform I/O should use the Request's context, // available from Request.Raw().Context(). When OnRequest returns an error, the policy propagates that error and doesn't send // the request. When OnRequest is nil, the policy follows its default behavior, which is to authorize the request with a token // from its credential according to its configuration. OnRequest func(*Request, func(TokenRequestOptions) error) error // OnChallenge allows clients to implement custom HTTP authentication challenge handling. BearerTokenPolicy calls it upon // receiving a 401 response containing multiple Bearer challenges or a challenge BearerTokenPolicy itself can't handle. // OnChallenge is responsible for parsing challenge(s) (the Response's WWW-Authenticate header) and reauthorizing the // Request accordingly. Its func argument authorizes the Request with a token from the policy's credential using the given // TokenRequestOptions. OnChallenge should honor the Request's context, available from Request.Raw().Context(). When // OnChallenge returns nil, the policy will send the Request again. OnChallenge func(*Request, *http.Response, func(TokenRequestOptions) error) error } // WithCaptureResponse applies the HTTP response retrieval annotation to the parent context. // The resp parameter will contain the HTTP response after the request has completed. func WithCaptureResponse(parent context.Context, resp **http.Response) context.Context { return context.WithValue(parent, shared.CtxWithCaptureResponse{}, resp) } // WithHTTPHeader adds the specified http.Header to the parent context. // Use this to specify custom HTTP headers at the API-call level. // Any overlapping headers will have their values replaced with the values specified here. func WithHTTPHeader(parent context.Context, header http.Header) context.Context { return context.WithValue(parent, shared.CtxWithHTTPHeaderKey{}, header) } // WithRetryOptions adds the specified RetryOptions to the parent context. // Use this to specify custom RetryOptions at the API-call level. func WithRetryOptions(parent context.Context, options RetryOptions) context.Context { return context.WithValue(parent, shared.CtxWithRetryOptionsKey{}, options) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright 2017 Microsoft Corporation. All rights reserved. // Use of this source code is governed by an MIT // license that can be found in the LICENSE file. // Package runtime contains various facilities for creating requests and handling responses. // The content is intended for SDK authors. package runtime ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/errors.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" ) // NewResponseError creates an *azcore.ResponseError from the provided HTTP response. // Call this when a service request returns a non-successful status code. // The error code will be extracted from the *http.Response, either from the x-ms-error-code // header (preferred) or attempted to be parsed from the response body. func NewResponseError(resp *http.Response) error { return exported.NewResponseError(resp) } // NewResponseErrorWithErrorCode creates an *azcore.ResponseError from the provided HTTP response and errorCode. // Use this variant when the error code is in a non-standard location. func NewResponseErrorWithErrorCode(resp *http.Response, errorCode string) error { return exported.NewResponseErrorWithErrorCode(resp, errorCode) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "context" "encoding/json" "errors" "fmt" "net/http" "reflect" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing" ) // PagingHandler contains the required data for constructing a Pager. type PagingHandler[T any] struct { // More returns a boolean indicating if there are more pages to fetch. // It uses the provided page to make the determination. More func(T) bool // Fetcher fetches the first and subsequent pages. Fetcher func(context.Context, *T) (T, error) // Tracer contains the Tracer from the client that's creating the Pager. Tracer tracing.Tracer } // Pager provides operations for iterating over paged responses. // Methods on this type are not safe for concurrent use. type Pager[T any] struct { current *T handler PagingHandler[T] tracer tracing.Tracer firstPage bool } // NewPager creates an instance of Pager using the specified PagingHandler. // Pass a non-nil T for firstPage if the first page has already been retrieved. func NewPager[T any](handler PagingHandler[T]) *Pager[T] { return &Pager[T]{ handler: handler, tracer: handler.Tracer, firstPage: true, } } // More returns true if there are more pages to retrieve. func (p *Pager[T]) More() bool { if p.current != nil { return p.handler.More(*p.current) } return true } // NextPage advances the pager to the next page. func (p *Pager[T]) NextPage(ctx context.Context) (T, error) { if p.current != nil { if p.firstPage { // we get here if it's an LRO-pager, we already have the first page p.firstPage = false return *p.current, nil } else if !p.handler.More(*p.current) { return *new(T), errors.New("no more pages") } } else { // non-LRO case, first page p.firstPage = false } var err error ctx, endSpan := StartSpan(ctx, fmt.Sprintf("%s.NextPage", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil) defer func() { endSpan(err) }() resp, err := p.handler.Fetcher(ctx, p.current) if err != nil { return *new(T), err } p.current = &resp return *p.current, nil } // UnmarshalJSON implements the json.Unmarshaler interface for Pager[T]. func (p *Pager[T]) UnmarshalJSON(data []byte) error { return json.Unmarshal(data, &p.current) } // FetcherForNextLinkOptions contains the optional values for [FetcherForNextLink]. type FetcherForNextLinkOptions struct { // NextReq is the func to be called when requesting subsequent pages. // Used for paged operations that have a custom next link operation. NextReq func(context.Context, string) (*policy.Request, error) // StatusCodes contains additional HTTP status codes indicating success. // The default value is http.StatusOK. StatusCodes []int } // FetcherForNextLink is a helper containing boilerplate code to simplify creating a PagingHandler[T].Fetcher from a next link URL. // - ctx is the [context.Context] controlling the lifetime of the HTTP operation // - pl is the [Pipeline] used to dispatch the HTTP request // - nextLink is the URL used to fetch the next page. the empty string indicates the first page is to be requested // - firstReq is the func to be called when creating the request for the first page // - options contains any optional parameters, pass nil to accept the default values func FetcherForNextLink(ctx context.Context, pl Pipeline, nextLink string, firstReq func(context.Context) (*policy.Request, error), options *FetcherForNextLinkOptions) (*http.Response, error) { var req *policy.Request var err error if options == nil { options = &FetcherForNextLinkOptions{} } if nextLink == "" { req, err = firstReq(ctx) } else if nextLink, err = EncodeQueryParams(nextLink); err == nil { if options.NextReq != nil { req, err = options.NextReq(ctx, nextLink) } else { req, err = NewRequest(ctx, http.MethodGet, nextLink) } } if err != nil { return nil, err } resp, err := pl.Do(req) if err != nil { return nil, err } successCodes := []int{http.StatusOK} successCodes = append(successCodes, options.StatusCodes...) if !HasStatusCode(resp, successCodes...) { return nil, NewResponseError(resp) } return resp, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pipeline.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" ) // PipelineOptions contains Pipeline options for SDK developers type PipelineOptions struct { // AllowedHeaders is the slice of headers to log with their values intact. // All headers not in the slice will have their values REDACTED. // Applies to request and response headers. AllowedHeaders []string // AllowedQueryParameters is the slice of query parameters to log with their values intact. // All query parameters not in the slice will have their values REDACTED. AllowedQueryParameters []string // APIVersion overrides the default version requested of the service. // Set with caution as this package version has not been tested with arbitrary service versions. APIVersion APIVersionOptions // PerCall contains custom policies to inject into the pipeline. // Each policy is executed once per request. PerCall []policy.Policy // PerRetry contains custom policies to inject into the pipeline. // Each policy is executed once per request, and for each retry of that request. PerRetry []policy.Policy // Tracing contains options used to configure distributed tracing. Tracing TracingOptions } // TracingOptions contains tracing options for SDK developers. type TracingOptions struct { // Namespace contains the value to use for the az.namespace span attribute. Namespace string } // Pipeline represents a primitive for sending HTTP requests and receiving responses. // Its behavior can be extended by specifying policies during construction. type Pipeline = exported.Pipeline // NewPipeline creates a pipeline from connection options, with any additional policies as specified. // Policies from ClientOptions are placed after policies from PipelineOptions. // The module and version parameters are used by the telemetry policy, when enabled. func NewPipeline(module, version string, plOpts PipelineOptions, options *policy.ClientOptions) Pipeline { cp := policy.ClientOptions{} if options != nil { cp = *options } if len(plOpts.AllowedHeaders) > 0 { headers := make([]string, len(plOpts.AllowedHeaders)+len(cp.Logging.AllowedHeaders)) copy(headers, plOpts.AllowedHeaders) headers = append(headers, cp.Logging.AllowedHeaders...) cp.Logging.AllowedHeaders = headers } if len(plOpts.AllowedQueryParameters) > 0 { qp := make([]string, len(plOpts.AllowedQueryParameters)+len(cp.Logging.AllowedQueryParams)) copy(qp, plOpts.AllowedQueryParameters) qp = append(qp, cp.Logging.AllowedQueryParams...) cp.Logging.AllowedQueryParams = qp } // we put the includeResponsePolicy at the very beginning so that the raw response // is populated with the final response (some policies might mutate the response) policies := []policy.Policy{exported.PolicyFunc(includeResponsePolicy)} if cp.APIVersion != "" { policies = append(policies, newAPIVersionPolicy(cp.APIVersion, &plOpts.APIVersion)) } if !cp.Telemetry.Disabled { policies = append(policies, NewTelemetryPolicy(module, version, &cp.Telemetry)) } policies = append(policies, plOpts.PerCall...) policies = append(policies, cp.PerCallPolicies...) policies = append(policies, NewRetryPolicy(&cp.Retry)) policies = append(policies, plOpts.PerRetry...) policies = append(policies, cp.PerRetryPolicies...) policies = append(policies, exported.PolicyFunc(httpHeaderPolicy)) policies = append(policies, newHTTPTracePolicy(cp.Logging.AllowedQueryParams)) policies = append(policies, NewLogPolicy(&cp.Logging)) policies = append(policies, exported.PolicyFunc(bodyDownloadPolicy)) transport := cp.Transport if transport == nil { transport = defaultHTTPClient } return exported.NewPipeline(transport, policies...) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_api_version.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "errors" "fmt" "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" ) // APIVersionOptions contains options for API versions type APIVersionOptions struct { // Location indicates where to set the version on a request, for example in a header or query param Location APIVersionLocation // Name is the name of the header or query parameter, for example "api-version" Name string } // APIVersionLocation indicates which part of a request identifies the service version type APIVersionLocation int const ( // APIVersionLocationQueryParam indicates a query parameter APIVersionLocationQueryParam = 0 // APIVersionLocationHeader indicates a header APIVersionLocationHeader = 1 ) // newAPIVersionPolicy constructs an APIVersionPolicy. If version is "", Do will be a no-op. If version // isn't empty and opts.Name is empty, Do will return an error. func newAPIVersionPolicy(version string, opts *APIVersionOptions) *apiVersionPolicy { if opts == nil { opts = &APIVersionOptions{} } return &apiVersionPolicy{location: opts.Location, name: opts.Name, version: version} } // apiVersionPolicy enables users to set the API version of every request a client sends. type apiVersionPolicy struct { // location indicates whether "name" refers to a query parameter or header. location APIVersionLocation // name of the query param or header whose value should be overridden; provided by the client. name string // version is the value (provided by the user) that replaces the default version value. version string } // Do sets the request's API version, if the policy is configured to do so, replacing any prior value. func (a *apiVersionPolicy) Do(req *policy.Request) (*http.Response, error) { if a.version != "" { if a.name == "" { // user set ClientOptions.APIVersion but the client ctor didn't set PipelineOptions.APIVersionOptions return nil, errors.New("this client doesn't support overriding its API version") } switch a.location { case APIVersionLocationHeader: req.Raw().Header.Set(a.name, a.version) case APIVersionLocationQueryParam: q := req.Raw().URL.Query() q.Set(a.name, a.version) req.Raw().URL.RawQuery = q.Encode() default: return nil, fmt.Errorf("unknown APIVersionLocation %d", a.location) } } return req.Next() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_bearer_token.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "encoding/base64" "errors" "net/http" "regexp" "strings" "sync" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo" "github.com/Azure/azure-sdk-for-go/sdk/internal/temporal" ) // BearerTokenPolicy authorizes requests with bearer tokens acquired from a TokenCredential. // It handles [Continuous Access Evaluation] (CAE) challenges. Clients needing to handle // additional authentication challenges, or needing more control over authorization, should // provide a [policy.AuthorizationHandler] in [policy.BearerTokenOptions]. // // [Continuous Access Evaluation]: https://learn.microsoft.com/entra/identity/conditional-access/concept-continuous-access-evaluation type BearerTokenPolicy struct { // mainResource is the resource to be retreived using the tenant specified in the credential mainResource *temporal.Resource[exported.AccessToken, acquiringResourceState] // the following fields are read-only authzHandler policy.AuthorizationHandler cred exported.TokenCredential scopes []string allowHTTP bool } type acquiringResourceState struct { req *policy.Request p *BearerTokenPolicy tro policy.TokenRequestOptions } // acquire acquires or updates the resource; only one // thread/goroutine at a time ever calls this function func acquire(state acquiringResourceState) (newResource exported.AccessToken, newExpiration time.Time, err error) { tk, err := state.p.cred.GetToken(&shared.ContextWithDeniedValues{Context: state.req.Raw().Context()}, state.tro) if err != nil { return exported.AccessToken{}, time.Time{}, err } return tk, tk.ExpiresOn, nil } // shouldRefresh determines whether the token should be refreshed. It's a variable so tests can replace it. var shouldRefresh = func(tk exported.AccessToken, _ acquiringResourceState) bool { if tk.RefreshOn.IsZero() { return tk.ExpiresOn.Add(-5 * time.Minute).Before(time.Now()) } // no offset in this case because the authority suggested a refresh window--between RefreshOn and ExpiresOn return tk.RefreshOn.Before(time.Now()) } // NewBearerTokenPolicy creates a policy object that authorizes requests with bearer tokens. // cred: an azcore.TokenCredential implementation such as a credential object from azidentity // scopes: the list of permission scopes required for the token. // opts: optional settings. Pass nil to accept default values; this is the same as passing a zero-value options. func NewBearerTokenPolicy(cred exported.TokenCredential, scopes []string, opts *policy.BearerTokenOptions) *BearerTokenPolicy { if opts == nil { opts = &policy.BearerTokenOptions{} } ah := opts.AuthorizationHandler if ah.OnRequest == nil { // Set a default OnRequest that simply requests a token with the given scopes. OnChallenge // doesn't get a default so the policy can use a nil check to determine whether the caller // provided an implementation. ah.OnRequest = func(_ *policy.Request, authNZ func(policy.TokenRequestOptions) error) error { // authNZ sets EnableCAE: true in all cases, no need to duplicate that here return authNZ(policy.TokenRequestOptions{Scopes: scopes}) } } mr := temporal.NewResourceWithOptions(acquire, temporal.ResourceOptions[exported.AccessToken, acquiringResourceState]{ ShouldRefresh: shouldRefresh, }) return &BearerTokenPolicy{ authzHandler: ah, cred: cred, scopes: scopes, mainResource: mr, allowHTTP: opts.InsecureAllowCredentialWithHTTP, } } // authenticateAndAuthorize returns a function which authorizes req with a token from the policy's credential func (b *BearerTokenPolicy) authenticateAndAuthorize(req *policy.Request) func(policy.TokenRequestOptions) error { return func(tro policy.TokenRequestOptions) error { tro.EnableCAE = true as := acquiringResourceState{p: b, req: req, tro: tro} tk, err := b.mainResource.Get(as) if err != nil { return err } req.Raw().Header.Set(shared.HeaderAuthorization, shared.BearerTokenPrefix+tk.Token) return nil } } // Do authorizes a request with a bearer token func (b *BearerTokenPolicy) Do(req *policy.Request) (*http.Response, error) { // skip adding the authorization header if no TokenCredential was provided. // this prevents a panic that might be hard to diagnose and allows testing // against http endpoints that don't require authentication. if b.cred == nil { return req.Next() } if err := checkHTTPSForAuth(req, b.allowHTTP); err != nil { return nil, err } err := b.authzHandler.OnRequest(req, b.authenticateAndAuthorize(req)) if err != nil { return nil, errorinfo.NonRetriableError(err) } res, err := req.Next() if err != nil { return nil, err } res, err = b.handleChallenge(req, res, false) return res, err } // handleChallenge handles authentication challenges either directly (for CAE challenges) or by calling // the AuthorizationHandler. It's a no-op when the response doesn't include an authentication challenge. // It will recurse at most once, to handle a CAE challenge following a non-CAE challenge handled by the // AuthorizationHandler. func (b *BearerTokenPolicy) handleChallenge(req *policy.Request, res *http.Response, recursed bool) (*http.Response, error) { var err error if res.StatusCode == http.StatusUnauthorized { b.mainResource.Expire() if res.Header.Get(shared.HeaderWWWAuthenticate) != "" { caeChallenge, parseErr := parseCAEChallenge(res) if parseErr != nil { return res, parseErr } switch { case caeChallenge != nil: authNZ := func(tro policy.TokenRequestOptions) error { // Take the TokenRequestOptions provided by OnRequest and add the challenge claims. The value // will be empty at time of writing because CAE is the only feature involving claims. If in // the future some client needs to specify unrelated claims, this function may need to merge // them with the challenge claims. tro.Claims = caeChallenge.params["claims"] return b.authenticateAndAuthorize(req)(tro) } if err = b.authzHandler.OnRequest(req, authNZ); err == nil { if err = req.RewindBody(); err == nil { res, err = req.Next() } } case b.authzHandler.OnChallenge != nil && !recursed: if err = b.authzHandler.OnChallenge(req, res, b.authenticateAndAuthorize(req)); err == nil { if err = req.RewindBody(); err == nil { if res, err = req.Next(); err == nil { res, err = b.handleChallenge(req, res, true) } } } else { // don't retry challenge handling errors err = errorinfo.NonRetriableError(err) } default: // return the response to the pipeline } } } return res, err } func checkHTTPSForAuth(req *policy.Request, allowHTTP bool) error { if strings.ToLower(req.Raw().URL.Scheme) != "https" && !allowHTTP { return errorinfo.NonRetriableError(errors.New("authenticated requests are not permitted for non TLS protected (https) endpoints")) } return nil } // parseCAEChallenge returns a *authChallenge representing Response's CAE challenge (nil when Response has none). // If Response includes a CAE challenge having invalid claims, it returns a NonRetriableError. func parseCAEChallenge(res *http.Response) (*authChallenge, error) { var ( caeChallenge *authChallenge err error ) for _, c := range parseChallenges(res) { if c.scheme == "Bearer" { if claims := c.params["claims"]; claims != "" && c.params["error"] == "insufficient_claims" { if b, de := base64.StdEncoding.DecodeString(claims); de == nil { c.params["claims"] = string(b) caeChallenge = &c } else { // don't include the decoding error because it's something // unhelpful like "illegal base64 data at input byte 42" err = errorinfo.NonRetriableError(errors.New("authentication challenge contains invalid claims: " + claims)) } break } } } return caeChallenge, err } var ( challenge, challengeParams *regexp.Regexp once = &sync.Once{} ) type authChallenge struct { scheme string params map[string]string } // parseChallenges assumes authentication challenges have quoted parameter values func parseChallenges(res *http.Response) []authChallenge { once.Do(func() { // matches challenges having quoted parameters, capturing scheme and parameters challenge = regexp.MustCompile(`(?:(\w+) ((?:\w+="[^"]*",?\s*)+))`) // captures parameter names and values in a match of the above expression challengeParams = regexp.MustCompile(`(\w+)="([^"]*)"`) }) parsed := []authChallenge{} // WWW-Authenticate can have multiple values, each containing multiple challenges for _, h := range res.Header.Values(shared.HeaderWWWAuthenticate) { for _, sm := range challenge.FindAllStringSubmatch(h, -1) { // sm is [challenge, scheme, params] (see regexp documentation on submatches) c := authChallenge{ params: make(map[string]string), scheme: sm[1], } for _, sm := range challengeParams.FindAllStringSubmatch(sm[2], -1) { // sm is [key="value", key, value] (see regexp documentation on submatches) c.params[sm[1]] = sm[2] } parsed = append(parsed, c) } } return parsed } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_body_download.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "fmt" "net/http" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo" ) // bodyDownloadPolicy creates a policy object that downloads the response's body to a []byte. func bodyDownloadPolicy(req *policy.Request) (*http.Response, error) { resp, err := req.Next() if err != nil { return resp, err } var opValues bodyDownloadPolicyOpValues // don't skip downloading error response bodies if req.OperationValue(&opValues); opValues.Skip && resp.StatusCode < 400 { return resp, err } // Either bodyDownloadPolicyOpValues was not specified (so skip is false) // or it was specified and skip is false: don't skip downloading the body _, err = Payload(resp) if err != nil { return resp, newBodyDownloadError(err, req) } return resp, err } // bodyDownloadPolicyOpValues is the struct containing the per-operation values type bodyDownloadPolicyOpValues struct { Skip bool } type bodyDownloadError struct { err error } func newBodyDownloadError(err error, req *policy.Request) error { // on failure, only retry the request for idempotent operations. // we currently identify them as DELETE, GET, and PUT requests. if m := strings.ToUpper(req.Raw().Method); m == http.MethodDelete || m == http.MethodGet || m == http.MethodPut { // error is safe for retry return err } // wrap error to avoid retries return &bodyDownloadError{ err: err, } } func (b *bodyDownloadError) Error() string { return fmt.Sprintf("body download policy: %s", b.err.Error()) } func (b *bodyDownloadError) NonRetriable() { // marker method } func (b *bodyDownloadError) Unwrap() error { return b.err } var _ errorinfo.NonRetriable = (*bodyDownloadError)(nil) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_header.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "context" "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" ) // newHTTPHeaderPolicy creates a policy object that adds custom HTTP headers to a request func httpHeaderPolicy(req *policy.Request) (*http.Response, error) { // check if any custom HTTP headers have been specified if header := req.Raw().Context().Value(shared.CtxWithHTTPHeaderKey{}); header != nil { for k, v := range header.(http.Header) { // use Set to replace any existing value // it also canonicalizes the header key req.Raw().Header.Set(k, v[0]) // add any remaining values for i := 1; i < len(v); i++ { req.Raw().Header.Add(k, v[i]) } } } return req.Next() } // WithHTTPHeader adds the specified http.Header to the parent context. // Use this to specify custom HTTP headers at the API-call level. // Any overlapping headers will have their values replaced with the values specified here. // Deprecated: use [policy.WithHTTPHeader] instead. func WithHTTPHeader(parent context.Context, header http.Header) context.Context { return policy.WithHTTPHeader(parent, header) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_http_trace.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "context" "errors" "fmt" "net/http" "net/url" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing" ) const ( attrHTTPMethod = "http.method" attrHTTPURL = "http.url" attrHTTPUserAgent = "http.user_agent" attrHTTPStatusCode = "http.status_code" attrAZClientReqID = "az.client_request_id" attrAZServiceReqID = "az.service_request_id" attrNetPeerName = "net.peer.name" ) // newHTTPTracePolicy creates a new instance of the httpTracePolicy. // - allowedQueryParams contains the user-specified query parameters that don't need to be redacted from the trace func newHTTPTracePolicy(allowedQueryParams []string) exported.Policy { return &httpTracePolicy{allowedQP: getAllowedQueryParams(allowedQueryParams)} } // httpTracePolicy is a policy that creates a trace for the HTTP request and its response type httpTracePolicy struct { allowedQP map[string]struct{} } // Do implements the pipeline.Policy interfaces for the httpTracePolicy type. func (h *httpTracePolicy) Do(req *policy.Request) (resp *http.Response, err error) { rawTracer := req.Raw().Context().Value(shared.CtxWithTracingTracer{}) if tracer, ok := rawTracer.(tracing.Tracer); ok && tracer.Enabled() { attributes := []tracing.Attribute{ {Key: attrHTTPMethod, Value: req.Raw().Method}, {Key: attrHTTPURL, Value: getSanitizedURL(*req.Raw().URL, h.allowedQP)}, {Key: attrNetPeerName, Value: req.Raw().URL.Host}, } if ua := req.Raw().Header.Get(shared.HeaderUserAgent); ua != "" { attributes = append(attributes, tracing.Attribute{Key: attrHTTPUserAgent, Value: ua}) } if reqID := req.Raw().Header.Get(shared.HeaderXMSClientRequestID); reqID != "" { attributes = append(attributes, tracing.Attribute{Key: attrAZClientReqID, Value: reqID}) } ctx := req.Raw().Context() ctx, span := tracer.Start(ctx, "HTTP "+req.Raw().Method, &tracing.SpanOptions{ Kind: tracing.SpanKindClient, Attributes: attributes, }) defer func() { if resp != nil { span.SetAttributes(tracing.Attribute{Key: attrHTTPStatusCode, Value: resp.StatusCode}) if resp.StatusCode > 399 { span.SetStatus(tracing.SpanStatusError, resp.Status) } if reqID := resp.Header.Get(shared.HeaderXMSRequestID); reqID != "" { span.SetAttributes(tracing.Attribute{Key: attrAZServiceReqID, Value: reqID}) } } else if err != nil { var urlErr *url.Error if errors.As(err, &urlErr) { // calling *url.Error.Error() will include the unsanitized URL // which we don't want. in addition, we already have the HTTP verb // and sanitized URL in the trace so we aren't losing any info err = urlErr.Err } span.SetStatus(tracing.SpanStatusError, err.Error()) } span.End() }() req = req.WithContext(ctx) } resp, err = req.Next() return } // StartSpanOptions contains the optional values for StartSpan. type StartSpanOptions struct { // Kind indicates the kind of Span. Kind tracing.SpanKind // Attributes contains key-value pairs of attributes for the span. Attributes []tracing.Attribute } // StartSpan starts a new tracing span. // You must call the returned func to terminate the span. Pass the applicable error // if the span will exit with an error condition. // - ctx is the parent context of the newly created context // - name is the name of the span. this is typically the fully qualified name of an API ("Client.Method") // - tracer is the client's Tracer for creating spans // - options contains optional values. pass nil to accept any default values func StartSpan(ctx context.Context, name string, tracer tracing.Tracer, options *StartSpanOptions) (context.Context, func(error)) { if !tracer.Enabled() { return ctx, func(err error) {} } // we MUST propagate the active tracer before returning so that the trace policy can access it ctx = context.WithValue(ctx, shared.CtxWithTracingTracer{}, tracer) if activeSpan := ctx.Value(ctxActiveSpan{}); activeSpan != nil { // per the design guidelines, if a SDK method Foo() calls SDK method Bar(), // then the span for Bar() must be suppressed. however, if Bar() makes a REST // call, then Bar's HTTP span must be a child of Foo's span. // however, there is an exception to this rule. if the SDK method Foo() is a // messaging producer/consumer, and it takes a callback that's a SDK method // Bar(), then the span for Bar() must _not_ be suppressed. if kind := activeSpan.(tracing.SpanKind); kind == tracing.SpanKindClient || kind == tracing.SpanKindInternal { return ctx, func(err error) {} } } if options == nil { options = &StartSpanOptions{} } if options.Kind == 0 { options.Kind = tracing.SpanKindInternal } ctx, span := tracer.Start(ctx, name, &tracing.SpanOptions{ Kind: options.Kind, Attributes: options.Attributes, }) ctx = context.WithValue(ctx, ctxActiveSpan{}, options.Kind) return ctx, func(err error) { if err != nil { errType := strings.Replace(fmt.Sprintf("%T", err), "*exported.", "*azcore.", 1) span.SetStatus(tracing.SpanStatusError, fmt.Sprintf("%s:\n%s", errType, err.Error())) } span.End() } } // ctxActiveSpan is used as a context key for indicating a SDK client span is in progress. type ctxActiveSpan struct{} ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_include_response.go ================================================ //go:build go1.16 // +build go1.16 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "context" "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" ) // includeResponsePolicy creates a policy that retrieves the raw HTTP response upon request func includeResponsePolicy(req *policy.Request) (*http.Response, error) { resp, err := req.Next() if resp == nil { return resp, err } if httpOutRaw := req.Raw().Context().Value(shared.CtxWithCaptureResponse{}); httpOutRaw != nil { httpOut := httpOutRaw.(**http.Response) *httpOut = resp } return resp, err } // WithCaptureResponse applies the HTTP response retrieval annotation to the parent context. // The resp parameter will contain the HTTP response after the request has completed. // Deprecated: use [policy.WithCaptureResponse] instead. func WithCaptureResponse(parent context.Context, resp **http.Response) context.Context { return policy.WithCaptureResponse(parent, resp) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_key_credential.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" ) // KeyCredentialPolicy authorizes requests with a [azcore.KeyCredential]. type KeyCredentialPolicy struct { cred *exported.KeyCredential header string prefix string allowHTTP bool } // KeyCredentialPolicyOptions contains the optional values configuring [KeyCredentialPolicy]. type KeyCredentialPolicyOptions struct { // InsecureAllowCredentialWithHTTP enables authenticated requests over HTTP. // By default, authenticated requests to an HTTP endpoint are rejected by the client. // WARNING: setting this to true will allow sending the authentication key in clear text. Use with caution. InsecureAllowCredentialWithHTTP bool // Prefix is used if the key requires a prefix before it's inserted into the HTTP request. Prefix string } // NewKeyCredentialPolicy creates a new instance of [KeyCredentialPolicy]. // - cred is the [azcore.KeyCredential] used to authenticate with the service // - header is the name of the HTTP request header in which the key is placed // - options contains optional configuration, pass nil to accept the default values func NewKeyCredentialPolicy(cred *exported.KeyCredential, header string, options *KeyCredentialPolicyOptions) *KeyCredentialPolicy { if options == nil { options = &KeyCredentialPolicyOptions{} } return &KeyCredentialPolicy{ cred: cred, header: header, prefix: options.Prefix, allowHTTP: options.InsecureAllowCredentialWithHTTP, } } // Do implementes the Do method on the [policy.Polilcy] interface. func (k *KeyCredentialPolicy) Do(req *policy.Request) (*http.Response, error) { // skip adding the authorization header if no KeyCredential was provided. // this prevents a panic that might be hard to diagnose and allows testing // against http endpoints that don't require authentication. if k.cred != nil { if err := checkHTTPSForAuth(req, k.allowHTTP); err != nil { return nil, err } val := exported.KeyCredentialGet(k.cred) if k.prefix != "" { val = k.prefix + val } req.Raw().Header.Add(k.header, val) } return req.Next() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_logging.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "bytes" "fmt" "io" "net/http" "net/url" "sort" "strings" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/internal/diag" ) type logPolicy struct { includeBody bool allowedHeaders map[string]struct{} allowedQP map[string]struct{} } // NewLogPolicy creates a request/response logging policy object configured using the specified options. // Pass nil to accept the default values; this is the same as passing a zero-value options. func NewLogPolicy(o *policy.LogOptions) policy.Policy { if o == nil { o = &policy.LogOptions{} } // construct default hash set of allowed headers allowedHeaders := map[string]struct{}{ "accept": {}, "cache-control": {}, "connection": {}, "content-length": {}, "content-type": {}, "date": {}, "etag": {}, "expires": {}, "if-match": {}, "if-modified-since": {}, "if-none-match": {}, "if-unmodified-since": {}, "last-modified": {}, "ms-cv": {}, "pragma": {}, "request-id": {}, "retry-after": {}, "server": {}, "traceparent": {}, "transfer-encoding": {}, "user-agent": {}, "www-authenticate": {}, "x-ms-request-id": {}, "x-ms-client-request-id": {}, "x-ms-return-client-request-id": {}, } // add any caller-specified allowed headers to the set for _, ah := range o.AllowedHeaders { allowedHeaders[strings.ToLower(ah)] = struct{}{} } // now do the same thing for query params allowedQP := getAllowedQueryParams(o.AllowedQueryParams) return &logPolicy{ includeBody: o.IncludeBody, allowedHeaders: allowedHeaders, allowedQP: allowedQP, } } // getAllowedQueryParams merges the default set of allowed query parameters // with a custom set (usually comes from client options). func getAllowedQueryParams(customAllowedQP []string) map[string]struct{} { allowedQP := map[string]struct{}{ "api-version": {}, } for _, qp := range customAllowedQP { allowedQP[strings.ToLower(qp)] = struct{}{} } return allowedQP } // logPolicyOpValues is the struct containing the per-operation values type logPolicyOpValues struct { try int32 start time.Time } func (p *logPolicy) Do(req *policy.Request) (*http.Response, error) { // Get the per-operation values. These are saved in the Message's map so that they persist across each retry calling into this policy object. var opValues logPolicyOpValues if req.OperationValue(&opValues); opValues.start.IsZero() { opValues.start = time.Now() // If this is the 1st try, record this operation's start time } opValues.try++ // The first try is #1 (not #0) req.SetOperationValue(opValues) // Log the outgoing request as informational if log.Should(log.EventRequest) { b := &bytes.Buffer{} fmt.Fprintf(b, "==> OUTGOING REQUEST (Try=%d)\n", opValues.try) p.writeRequestWithResponse(b, req, nil, nil) var err error if p.includeBody { err = writeReqBody(req, b) } log.Write(log.EventRequest, b.String()) if err != nil { return nil, err } } // Set the time for this particular retry operation and then Do the operation. tryStart := time.Now() response, err := req.Next() // Make the request tryEnd := time.Now() tryDuration := tryEnd.Sub(tryStart) opDuration := tryEnd.Sub(opValues.start) if log.Should(log.EventResponse) { // We're going to log this; build the string to log b := &bytes.Buffer{} fmt.Fprintf(b, "==> REQUEST/RESPONSE (Try=%d/%v, OpTime=%v) -- ", opValues.try, tryDuration, opDuration) if err != nil { // This HTTP request did not get a response from the service fmt.Fprint(b, "REQUEST ERROR\n") } else { fmt.Fprint(b, "RESPONSE RECEIVED\n") } p.writeRequestWithResponse(b, req, response, err) if err != nil { // skip frames runtime.Callers() and runtime.StackTrace() b.WriteString(diag.StackTrace(2, 32)) } else if p.includeBody { err = writeRespBody(response, b) } log.Write(log.EventResponse, b.String()) } return response, err } const redactedValue = "REDACTED" // getSanitizedURL returns a sanitized string for the provided url.URL func getSanitizedURL(u url.URL, allowedQueryParams map[string]struct{}) string { // redact applicable query params qp := u.Query() for k := range qp { if _, ok := allowedQueryParams[strings.ToLower(k)]; !ok { qp.Set(k, redactedValue) } } u.RawQuery = qp.Encode() return u.String() } // writeRequestWithResponse appends a formatted HTTP request into a Buffer. If request and/or err are // not nil, then these are also written into the Buffer. func (p *logPolicy) writeRequestWithResponse(b *bytes.Buffer, req *policy.Request, resp *http.Response, err error) { // Write the request into the buffer. fmt.Fprint(b, " "+req.Raw().Method+" "+getSanitizedURL(*req.Raw().URL, p.allowedQP)+"\n") p.writeHeader(b, req.Raw().Header) if resp != nil { fmt.Fprintln(b, " --------------------------------------------------------------------------------") fmt.Fprint(b, " RESPONSE Status: "+resp.Status+"\n") p.writeHeader(b, resp.Header) } if err != nil { fmt.Fprintln(b, " --------------------------------------------------------------------------------") fmt.Fprint(b, " ERROR:\n"+err.Error()+"\n") } } // formatHeaders appends an HTTP request's or response's header into a Buffer. func (p *logPolicy) writeHeader(b *bytes.Buffer, header http.Header) { if len(header) == 0 { b.WriteString(" (no headers)\n") return } keys := make([]string, 0, len(header)) // Alphabetize the headers for k := range header { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { // don't use Get() as it will canonicalize k which might cause a mismatch value := header[k][0] // redact all header values not in the allow-list if _, ok := p.allowedHeaders[strings.ToLower(k)]; !ok { value = redactedValue } fmt.Fprintf(b, " %s: %+v\n", k, value) } } // returns true if the request/response body should be logged. // this is determined by looking at the content-type header value. func shouldLogBody(b *bytes.Buffer, contentType string) bool { contentType = strings.ToLower(contentType) if strings.HasPrefix(contentType, "text") || strings.Contains(contentType, "json") || strings.Contains(contentType, "xml") { return true } fmt.Fprintf(b, " Skip logging body for %s\n", contentType) return false } // writes to a buffer, used for logging purposes func writeReqBody(req *policy.Request, b *bytes.Buffer) error { if req.Raw().Body == nil { fmt.Fprint(b, " Request contained no body\n") return nil } if ct := req.Raw().Header.Get(shared.HeaderContentType); !shouldLogBody(b, ct) { return nil } body, err := io.ReadAll(req.Raw().Body) if err != nil { fmt.Fprintf(b, " Failed to read request body: %s\n", err.Error()) return err } if err := req.RewindBody(); err != nil { return err } logBody(b, body) return nil } // writes to a buffer, used for logging purposes func writeRespBody(resp *http.Response, b *bytes.Buffer) error { ct := resp.Header.Get(shared.HeaderContentType) if ct == "" { fmt.Fprint(b, " Response contained no body\n") return nil } else if !shouldLogBody(b, ct) { return nil } body, err := Payload(resp) if err != nil { fmt.Fprintf(b, " Failed to read response body: %s\n", err.Error()) return err } if len(body) > 0 { logBody(b, body) } else { fmt.Fprint(b, " Response contained no body\n") } return nil } func logBody(b *bytes.Buffer, body []byte) { fmt.Fprintln(b, " --------------------------------------------------------------------------------") fmt.Fprintln(b, string(body)) fmt.Fprintln(b, " --------------------------------------------------------------------------------") } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_request_id.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/internal/uuid" ) type requestIDPolicy struct{} // NewRequestIDPolicy returns a policy that add the x-ms-client-request-id header func NewRequestIDPolicy() policy.Policy { return &requestIDPolicy{} } func (r *requestIDPolicy) Do(req *policy.Request) (*http.Response, error) { if req.Raw().Header.Get(shared.HeaderXMSClientRequestID) == "" { id, err := uuid.New() if err != nil { return nil, err } req.Raw().Header.Set(shared.HeaderXMSClientRequestID, id.String()) } return req.Next() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_retry.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "context" "errors" "io" "math" "math/rand" "net/http" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo" "github.com/Azure/azure-sdk-for-go/sdk/internal/exported" ) const ( defaultMaxRetries = 3 ) func setDefaults(o *policy.RetryOptions) { if o.MaxRetries == 0 { o.MaxRetries = defaultMaxRetries } else if o.MaxRetries < 0 { o.MaxRetries = 0 } // SDK guidelines specify the default MaxRetryDelay is 60 seconds if o.MaxRetryDelay == 0 { o.MaxRetryDelay = 60 * time.Second } else if o.MaxRetryDelay < 0 { // not really an unlimited cap, but sufficiently large enough to be considered as such o.MaxRetryDelay = math.MaxInt64 } if o.RetryDelay == 0 { o.RetryDelay = 800 * time.Millisecond } else if o.RetryDelay < 0 { o.RetryDelay = 0 } if o.StatusCodes == nil { // NOTE: if you change this list, you MUST update the docs in policy/policy.go o.StatusCodes = []int{ http.StatusRequestTimeout, // 408 http.StatusTooManyRequests, // 429 http.StatusInternalServerError, // 500 http.StatusBadGateway, // 502 http.StatusServiceUnavailable, // 503 http.StatusGatewayTimeout, // 504 } } } func calcDelay(o policy.RetryOptions, try int32) time.Duration { // try is >=1; never 0 // avoid overflow when shifting left factor := time.Duration(math.MaxInt64) if try < 63 { factor = time.Duration(int64(1< float64(math.MaxInt64) { // the jitter pushed us over MaxInt64, so just use MaxInt64 delay = time.Duration(math.MaxInt64) } else { delay = time.Duration(delayFloat) } if delay > o.MaxRetryDelay { // MaxRetryDelay is backfilled with non-negative value delay = o.MaxRetryDelay } return delay } // NewRetryPolicy creates a policy object configured using the specified options. // Pass nil to accept the default values; this is the same as passing a zero-value options. func NewRetryPolicy(o *policy.RetryOptions) policy.Policy { if o == nil { o = &policy.RetryOptions{} } p := &retryPolicy{options: *o} return p } type retryPolicy struct { options policy.RetryOptions } func (p *retryPolicy) Do(req *policy.Request) (resp *http.Response, err error) { options := p.options // check if the retry options have been overridden for this call if override := req.Raw().Context().Value(shared.CtxWithRetryOptionsKey{}); override != nil { options = override.(policy.RetryOptions) } setDefaults(&options) // Exponential retry algorithm: ((2 ^ attempt) - 1) * delay * random(0.8, 1.2) // When to retry: connection failure or temporary/timeout. var rwbody *retryableRequestBody if req.Body() != nil { // wrap the body so we control when it's actually closed. // do this outside the for loop so defers don't accumulate. rwbody = &retryableRequestBody{body: req.Body()} defer rwbody.realClose() } try := int32(1) for { resp = nil // reset // unfortunately we don't have access to the custom allow-list of query params, so we'll redact everything but the default allowed QPs log.Writef(log.EventRetryPolicy, "=====> Try=%d for %s %s", try, req.Raw().Method, getSanitizedURL(*req.Raw().URL, getAllowedQueryParams(nil))) // For each try, seek to the beginning of the Body stream. We do this even for the 1st try because // the stream may not be at offset 0 when we first get it and we want the same behavior for the // 1st try as for additional tries. err = req.RewindBody() if err != nil { return } // RewindBody() restores Raw().Body to its original state, so set our rewindable after if rwbody != nil { req.Raw().Body = rwbody } if options.TryTimeout == 0 { clone := req.Clone(req.Raw().Context()) resp, err = clone.Next() } else { // Set the per-try time for this particular retry operation and then Do the operation. tryCtx, tryCancel := context.WithTimeout(req.Raw().Context(), options.TryTimeout) clone := req.Clone(tryCtx) resp, err = clone.Next() // Make the request // if the body was already downloaded or there was an error it's safe to cancel the context now if err != nil { tryCancel() } else if exported.PayloadDownloaded(resp) { tryCancel() } else { // must cancel the context after the body has been read and closed resp.Body = &contextCancelReadCloser{cf: tryCancel, body: resp.Body} } } if err == nil { log.Writef(log.EventRetryPolicy, "response %d", resp.StatusCode) } else { log.Writef(log.EventRetryPolicy, "error %v", err) } if ctxErr := req.Raw().Context().Err(); ctxErr != nil { // don't retry if the parent context has been cancelled or its deadline exceeded err = ctxErr log.Writef(log.EventRetryPolicy, "abort due to %v", err) return } // check if the error is not retriable var nre errorinfo.NonRetriable if errors.As(err, &nre) { // the error says it's not retriable so don't retry log.Writef(log.EventRetryPolicy, "non-retriable error %T", nre) return } if options.ShouldRetry != nil { // a non-nil ShouldRetry overrides our HTTP status code check if !options.ShouldRetry(resp, err) { // predicate says we shouldn't retry log.Write(log.EventRetryPolicy, "exit due to ShouldRetry") return } } else if err == nil && !HasStatusCode(resp, options.StatusCodes...) { // if there is no error and the response code isn't in the list of retry codes then we're done. log.Write(log.EventRetryPolicy, "exit due to non-retriable status code") return } if try == options.MaxRetries+1 { // max number of tries has been reached, don't sleep again log.Writef(log.EventRetryPolicy, "MaxRetries %d exceeded", options.MaxRetries) return } // use the delay from retry-after if available delay := shared.RetryAfter(resp) if delay <= 0 { delay = calcDelay(options, try) } else if delay > options.MaxRetryDelay { // the retry-after delay exceeds the the cap so don't retry log.Writef(log.EventRetryPolicy, "Retry-After delay %s exceeds MaxRetryDelay of %s", delay, options.MaxRetryDelay) return } // drain before retrying so nothing is leaked Drain(resp) log.Writef(log.EventRetryPolicy, "End Try #%d, Delay=%v", try, delay) select { case <-time.After(delay): try++ case <-req.Raw().Context().Done(): err = req.Raw().Context().Err() log.Writef(log.EventRetryPolicy, "abort due to %v", err) return } } } // WithRetryOptions adds the specified RetryOptions to the parent context. // Use this to specify custom RetryOptions at the API-call level. // Deprecated: use [policy.WithRetryOptions] instead. func WithRetryOptions(parent context.Context, options policy.RetryOptions) context.Context { return policy.WithRetryOptions(parent, options) } // ********** The following type/methods implement the retryableRequestBody (a ReadSeekCloser) // This struct is used when sending a body to the network type retryableRequestBody struct { body io.ReadSeeker // Seeking is required to support retries } // Read reads a block of data from an inner stream and reports progress func (b *retryableRequestBody) Read(p []byte) (n int, err error) { return b.body.Read(p) } func (b *retryableRequestBody) Seek(offset int64, whence int) (offsetFromStart int64, err error) { return b.body.Seek(offset, whence) } func (b *retryableRequestBody) Close() error { // We don't want the underlying transport to close the request body on transient failures so this is a nop. // The retry policy closes the request body upon success. return nil } func (b *retryableRequestBody) realClose() error { if c, ok := b.body.(io.Closer); ok { return c.Close() } return nil } // ********** The following type/methods implement the contextCancelReadCloser // contextCancelReadCloser combines an io.ReadCloser with a cancel func. // it ensures the cancel func is invoked once the body has been read and closed. type contextCancelReadCloser struct { cf context.CancelFunc body io.ReadCloser } func (rc *contextCancelReadCloser) Read(p []byte) (n int, err error) { return rc.body.Read(p) } func (rc *contextCancelReadCloser) Close() error { err := rc.body.Close() rc.cf() return err } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_sas_credential.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "net/http" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" ) // SASCredentialPolicy authorizes requests with a [azcore.SASCredential]. type SASCredentialPolicy struct { cred *exported.SASCredential header string allowHTTP bool } // SASCredentialPolicyOptions contains the optional values configuring [SASCredentialPolicy]. type SASCredentialPolicyOptions struct { // InsecureAllowCredentialWithHTTP enables authenticated requests over HTTP. // By default, authenticated requests to an HTTP endpoint are rejected by the client. // WARNING: setting this to true will allow sending the authentication key in clear text. Use with caution. InsecureAllowCredentialWithHTTP bool } // NewSASCredentialPolicy creates a new instance of [SASCredentialPolicy]. // - cred is the [azcore.SASCredential] used to authenticate with the service // - header is the name of the HTTP request header in which the shared access signature is placed // - options contains optional configuration, pass nil to accept the default values func NewSASCredentialPolicy(cred *exported.SASCredential, header string, options *SASCredentialPolicyOptions) *SASCredentialPolicy { if options == nil { options = &SASCredentialPolicyOptions{} } return &SASCredentialPolicy{ cred: cred, header: header, allowHTTP: options.InsecureAllowCredentialWithHTTP, } } // Do implementes the Do method on the [policy.Polilcy] interface. func (k *SASCredentialPolicy) Do(req *policy.Request) (*http.Response, error) { // skip adding the authorization header if no SASCredential was provided. // this prevents a panic that might be hard to diagnose and allows testing // against http endpoints that don't require authentication. if k.cred != nil { if err := checkHTTPSForAuth(req, k.allowHTTP); err != nil { return nil, err } req.Raw().Header.Add(k.header, exported.SASCredentialGet(k.cred)) } return req.Next() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/policy_telemetry.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "bytes" "fmt" "net/http" "os" "runtime" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" ) type telemetryPolicy struct { telemetryValue string } // NewTelemetryPolicy creates a telemetry policy object that adds telemetry information to outgoing HTTP requests. // The format is [ ]azsdk-go-/ . // Pass nil to accept the default values; this is the same as passing a zero-value options. func NewTelemetryPolicy(mod, ver string, o *policy.TelemetryOptions) policy.Policy { if o == nil { o = &policy.TelemetryOptions{} } tp := telemetryPolicy{} if o.Disabled { return &tp } b := &bytes.Buffer{} // normalize ApplicationID if o.ApplicationID != "" { o.ApplicationID = strings.ReplaceAll(o.ApplicationID, " ", "/") if len(o.ApplicationID) > 24 { o.ApplicationID = o.ApplicationID[:24] } b.WriteString(o.ApplicationID) b.WriteRune(' ') } // mod might be the fully qualified name. in that case, we just want the package name if i := strings.LastIndex(mod, "/"); i > -1 { mod = mod[i+1:] } b.WriteString(formatTelemetry(mod, ver)) b.WriteRune(' ') b.WriteString(platformInfo) tp.telemetryValue = b.String() return &tp } func formatTelemetry(comp, ver string) string { return fmt.Sprintf("azsdk-go-%s/%s", comp, ver) } func (p telemetryPolicy) Do(req *policy.Request) (*http.Response, error) { if p.telemetryValue == "" { return req.Next() } // preserve the existing User-Agent string if ua := req.Raw().Header.Get(shared.HeaderUserAgent); ua != "" { p.telemetryValue = fmt.Sprintf("%s %s", p.telemetryValue, ua) } req.Raw().Header.Set(shared.HeaderUserAgent, p.telemetryValue) return req.Next() } // NOTE: the ONLY function that should write to this variable is this func var platformInfo = func() string { operatingSystem := runtime.GOOS // Default OS string switch operatingSystem { case "windows": operatingSystem = os.Getenv("OS") // Get more specific OS information case "linux": // accept default OS info case "freebsd": // accept default OS info } return fmt.Sprintf("(%s; %s)", runtime.Version(), operatingSystem) }() ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/poller.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "context" "encoding/json" "errors" "flag" "fmt" "net/http" "reflect" "strings" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/async" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/body" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/fake" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/loc" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/pollers/op" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing" "github.com/Azure/azure-sdk-for-go/sdk/internal/poller" ) // FinalStateVia is the enumerated type for the possible final-state-via values. type FinalStateVia = pollers.FinalStateVia const ( // FinalStateViaAzureAsyncOp indicates the final payload comes from the Azure-AsyncOperation URL. FinalStateViaAzureAsyncOp = pollers.FinalStateViaAzureAsyncOp // FinalStateViaLocation indicates the final payload comes from the Location URL. FinalStateViaLocation = pollers.FinalStateViaLocation // FinalStateViaOriginalURI indicates the final payload comes from the original URL. FinalStateViaOriginalURI = pollers.FinalStateViaOriginalURI // FinalStateViaOpLocation indicates the final payload comes from the Operation-Location URL. FinalStateViaOpLocation = pollers.FinalStateViaOpLocation ) // NewPollerOptions contains the optional parameters for NewPoller. type NewPollerOptions[T any] struct { // FinalStateVia contains the final-state-via value for the LRO. // NOTE: used only for Azure-AsyncOperation and Operation-Location LROs. FinalStateVia FinalStateVia // OperationLocationResultPath contains the JSON path to the result's // payload when it's included with the terminal success response. // NOTE: only used for Operation-Location LROs. OperationLocationResultPath string // Response contains a preconstructed response type. // The final payload will be unmarshaled into it and returned. Response *T // Handler[T] contains a custom polling implementation. Handler PollingHandler[T] // Tracer contains the Tracer from the client that's creating the Poller. Tracer tracing.Tracer } // NewPoller creates a Poller based on the provided initial response. func NewPoller[T any](resp *http.Response, pl exported.Pipeline, options *NewPollerOptions[T]) (*Poller[T], error) { if options == nil { options = &NewPollerOptions[T]{} } result := options.Response if result == nil { result = new(T) } if options.Handler != nil { return &Poller[T]{ op: options.Handler, resp: resp, result: result, tracer: options.Tracer, }, nil } defer resp.Body.Close() // this is a back-stop in case the swagger is incorrect (i.e. missing one or more status codes for success). // ideally the codegen should return an error if the initial response failed and not even create a poller. if !poller.StatusCodeValid(resp) { return nil, errors.New("the operation failed or was cancelled") } // determine the polling method var opr PollingHandler[T] var err error if fake.Applicable(resp) { opr, err = fake.New[T](pl, resp) } else if async.Applicable(resp) { // async poller must be checked first as it can also have a location header opr, err = async.New[T](pl, resp, options.FinalStateVia) } else if op.Applicable(resp) { // op poller must be checked before loc as it can also have a location header opr, err = op.New[T](pl, resp, options.FinalStateVia, options.OperationLocationResultPath) } else if loc.Applicable(resp) { opr, err = loc.New[T](pl, resp) } else if body.Applicable(resp) { // must test body poller last as it's a subset of the other pollers. // TODO: this is ambiguous for PATCH/PUT if it returns a 200 with no polling headers (sync completion) opr, err = body.New[T](pl, resp) } else if m := resp.Request.Method; resp.StatusCode == http.StatusAccepted && (m == http.MethodDelete || m == http.MethodPost) { // if we get here it means we have a 202 with no polling headers. // for DELETE and POST this is a hard error per ARM RPC spec. return nil, errors.New("response is missing polling URL") } else { opr, err = pollers.NewNopPoller[T](resp) } if err != nil { return nil, err } return &Poller[T]{ op: opr, resp: resp, result: result, tracer: options.Tracer, }, nil } // NewPollerFromResumeTokenOptions contains the optional parameters for NewPollerFromResumeToken. type NewPollerFromResumeTokenOptions[T any] struct { // Response contains a preconstructed response type. // The final payload will be unmarshaled into it and returned. Response *T // Handler[T] contains a custom polling implementation. Handler PollingHandler[T] // Tracer contains the Tracer from the client that's creating the Poller. Tracer tracing.Tracer } // NewPollerFromResumeToken creates a Poller from a resume token string. func NewPollerFromResumeToken[T any](token string, pl exported.Pipeline, options *NewPollerFromResumeTokenOptions[T]) (*Poller[T], error) { if options == nil { options = &NewPollerFromResumeTokenOptions[T]{} } result := options.Response if result == nil { result = new(T) } if err := pollers.IsTokenValid[T](token); err != nil { return nil, err } raw, err := pollers.ExtractToken(token) if err != nil { return nil, err } var asJSON map[string]any if err := json.Unmarshal(raw, &asJSON); err != nil { return nil, err } opr := options.Handler // now rehydrate the poller based on the encoded poller type if fake.CanResume(asJSON) { opr, _ = fake.New[T](pl, nil) } else if opr != nil { log.Writef(log.EventLRO, "Resuming custom poller %T.", opr) } else if async.CanResume(asJSON) { opr, _ = async.New[T](pl, nil, "") } else if body.CanResume(asJSON) { opr, _ = body.New[T](pl, nil) } else if loc.CanResume(asJSON) { opr, _ = loc.New[T](pl, nil) } else if op.CanResume(asJSON) { opr, _ = op.New[T](pl, nil, "", "") } else { return nil, fmt.Errorf("unhandled poller token %s", string(raw)) } if err := json.Unmarshal(raw, &opr); err != nil { return nil, err } return &Poller[T]{ op: opr, result: result, tracer: options.Tracer, }, nil } // PollingHandler[T] abstracts the differences among poller implementations. type PollingHandler[T any] interface { // Done returns true if the LRO has reached a terminal state. Done() bool // Poll fetches the latest state of the LRO. Poll(context.Context) (*http.Response, error) // Result is called once the LRO has reached a terminal state. It populates the out parameter // with the result of the operation. Result(ctx context.Context, out *T) error } // Poller encapsulates a long-running operation, providing polling facilities until the operation reaches a terminal state. // Methods on this type are not safe for concurrent use. type Poller[T any] struct { op PollingHandler[T] resp *http.Response err error result *T tracer tracing.Tracer done bool } // PollUntilDoneOptions contains the optional values for the Poller[T].PollUntilDone() method. type PollUntilDoneOptions struct { // Frequency is the time to wait between polling intervals in absence of a Retry-After header. Allowed minimum is one second. // Pass zero to accept the default value (30s). Frequency time.Duration } // PollUntilDone will poll the service endpoint until a terminal state is reached, an error is received, or the context expires. // It internally uses Poll(), Done(), and Result() in its polling loop, sleeping for the specified duration between intervals. // options: pass nil to accept the default values. // NOTE: the default polling frequency is 30 seconds which works well for most operations. However, some operations might // benefit from a shorter or longer duration. func (p *Poller[T]) PollUntilDone(ctx context.Context, options *PollUntilDoneOptions) (res T, err error) { if options == nil { options = &PollUntilDoneOptions{} } cp := *options if cp.Frequency == 0 { cp.Frequency = 30 * time.Second } ctx, endSpan := StartSpan(ctx, fmt.Sprintf("%s.PollUntilDone", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil) defer func() { endSpan(err) }() // skip the floor check when executing tests so they don't take so long if isTest := flag.Lookup("test.v"); isTest == nil && cp.Frequency < time.Second { err = errors.New("polling frequency minimum is one second") return } start := time.Now() logPollUntilDoneExit := func(v any) { log.Writef(log.EventLRO, "END PollUntilDone() for %T: %v, total time: %s", p.op, v, time.Since(start)) } log.Writef(log.EventLRO, "BEGIN PollUntilDone() for %T", p.op) if p.resp != nil { // initial check for a retry-after header existing on the initial response if retryAfter := shared.RetryAfter(p.resp); retryAfter > 0 { log.Writef(log.EventLRO, "initial Retry-After delay for %s", retryAfter.String()) if err = shared.Delay(ctx, retryAfter); err != nil { logPollUntilDoneExit(err) return } } } // begin polling the endpoint until a terminal state is reached for { var resp *http.Response resp, err = p.Poll(ctx) if err != nil { logPollUntilDoneExit(err) return } if p.Done() { logPollUntilDoneExit("succeeded") res, err = p.Result(ctx) return } d := cp.Frequency if retryAfter := shared.RetryAfter(resp); retryAfter > 0 { log.Writef(log.EventLRO, "Retry-After delay for %s", retryAfter.String()) d = retryAfter } else { log.Writef(log.EventLRO, "delay for %s", d.String()) } if err = shared.Delay(ctx, d); err != nil { logPollUntilDoneExit(err) return } } } // Poll fetches the latest state of the LRO. It returns an HTTP response or error. // If Poll succeeds, the poller's state is updated and the HTTP response is returned. // If Poll fails, the poller's state is unmodified and the error is returned. // Calling Poll on an LRO that has reached a terminal state will return the last HTTP response. func (p *Poller[T]) Poll(ctx context.Context) (resp *http.Response, err error) { if p.Done() { // the LRO has reached a terminal state, don't poll again resp = p.resp return } ctx, endSpan := StartSpan(ctx, fmt.Sprintf("%s.Poll", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil) defer func() { endSpan(err) }() resp, err = p.op.Poll(ctx) if err != nil { return } p.resp = resp return } // Done returns true if the LRO has reached a terminal state. // Once a terminal state is reached, call Result(). func (p *Poller[T]) Done() bool { return p.op.Done() } // Result returns the result of the LRO and is meant to be used in conjunction with Poll and Done. // If the LRO completed successfully, a populated instance of T is returned. // If the LRO failed or was canceled, an *azcore.ResponseError error is returned. // Calling this on an LRO in a non-terminal state will return an error. func (p *Poller[T]) Result(ctx context.Context) (res T, err error) { if !p.Done() { err = errors.New("poller is in a non-terminal state") return } if p.done { // the result has already been retrieved, return the cached value if p.err != nil { err = p.err return } res = *p.result return } ctx, endSpan := StartSpan(ctx, fmt.Sprintf("%s.Result", shortenTypeName(reflect.TypeOf(*p).Name())), p.tracer, nil) defer func() { endSpan(err) }() err = p.op.Result(ctx, p.result) var respErr *exported.ResponseError if errors.As(err, &respErr) { if pollers.IsNonTerminalHTTPStatusCode(respErr.RawResponse) { // the request failed in a non-terminal way. // don't cache the error or mark the Poller as done return } // the LRO failed. record the error p.err = err } else if err != nil { // the call to Result failed, don't cache anything in this case return } p.done = true if p.err != nil { err = p.err return } res = *p.result return } // ResumeToken returns a value representing the poller that can be used to resume // the LRO at a later time. ResumeTokens are unique per service operation. // The token's format should be considered opaque and is subject to change. // Calling this on an LRO in a terminal state will return an error. func (p *Poller[T]) ResumeToken() (string, error) { if p.Done() { return "", errors.New("poller is in a terminal state") } tk, err := pollers.NewResumeToken[T](p.op) if err != nil { return "", err } return tk, err } // extracts the type name from the string returned from reflect.Value.Name() func shortenTypeName(s string) string { // the value is formatted as follows // Poller[module/Package.Type].Method // we want to shorten the generic type parameter string to Type // anything we don't recognize will be left as-is begin := strings.Index(s, "[") end := strings.Index(s, "]") if begin == -1 || end == -1 { return s } typeName := s[begin+1 : end] if i := strings.LastIndex(typeName, "."); i > -1 { typeName = typeName[i+1:] } return s[:begin+1] + typeName + s[end:] } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/request.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "bytes" "context" "encoding/json" "encoding/xml" "errors" "fmt" "io" "mime/multipart" "net/http" "net/textproto" "net/url" "path" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming" "github.com/Azure/azure-sdk-for-go/sdk/internal/uuid" ) // Base64Encoding is usesd to specify which base-64 encoder/decoder to use when // encoding/decoding a slice of bytes to/from a string. type Base64Encoding = exported.Base64Encoding const ( // Base64StdFormat uses base64.StdEncoding for encoding and decoding payloads. Base64StdFormat Base64Encoding = exported.Base64StdFormat // Base64URLFormat uses base64.RawURLEncoding for encoding and decoding payloads. Base64URLFormat Base64Encoding = exported.Base64URLFormat ) // NewRequest creates a new policy.Request with the specified input. // The endpoint MUST be properly encoded before calling this function. func NewRequest(ctx context.Context, httpMethod string, endpoint string) (*policy.Request, error) { return exported.NewRequest(ctx, httpMethod, endpoint) } // NewRequestFromRequest creates a new policy.Request with an existing *http.Request func NewRequestFromRequest(req *http.Request) (*policy.Request, error) { return exported.NewRequestFromRequest(req) } // EncodeQueryParams will parse and encode any query parameters in the specified URL. // Any semicolons will automatically be escaped. func EncodeQueryParams(u string) (string, error) { before, after, found := strings.Cut(u, "?") if !found { return u, nil } // starting in Go 1.17, url.ParseQuery will reject semicolons in query params. // so, we must escape them first. note that this assumes that semicolons aren't // being used as query param separators which is per the current RFC. // for more info: // https://github.com/golang/go/issues/25192 // https://github.com/golang/go/issues/50034 qp, err := url.ParseQuery(strings.ReplaceAll(after, ";", "%3B")) if err != nil { return "", err } return before + "?" + qp.Encode(), nil } // JoinPaths concatenates multiple URL path segments into one path, // inserting path separation characters as required. JoinPaths will preserve // query parameters in the root path func JoinPaths(root string, paths ...string) string { if len(paths) == 0 { return root } qps := "" if strings.Contains(root, "?") { splitPath := strings.Split(root, "?") root, qps = splitPath[0], splitPath[1] } p := path.Join(paths...) // path.Join will remove any trailing slashes. // if one was provided, preserve it. if strings.HasSuffix(paths[len(paths)-1], "/") && !strings.HasSuffix(p, "/") { p += "/" } if qps != "" { p = p + "?" + qps } if strings.HasSuffix(root, "/") && strings.HasPrefix(p, "/") { root = root[:len(root)-1] } else if !strings.HasSuffix(root, "/") && !strings.HasPrefix(p, "/") { p = "/" + p } return root + p } // EncodeByteArray will base-64 encode the byte slice v. func EncodeByteArray(v []byte, format Base64Encoding) string { return exported.EncodeByteArray(v, format) } // MarshalAsByteArray will base-64 encode the byte slice v, then calls SetBody. // The encoded value is treated as a JSON string. func MarshalAsByteArray(req *policy.Request, v []byte, format Base64Encoding) error { // send as a JSON string encode := fmt.Sprintf("\"%s\"", EncodeByteArray(v, format)) // tsp generated code can set Content-Type so we must prefer that return exported.SetBody(req, exported.NopCloser(strings.NewReader(encode)), shared.ContentTypeAppJSON, false) } // MarshalAsJSON calls json.Marshal() to get the JSON encoding of v then calls SetBody. func MarshalAsJSON(req *policy.Request, v any) error { b, err := json.Marshal(v) if err != nil { return fmt.Errorf("error marshalling type %T: %s", v, err) } // tsp generated code can set Content-Type so we must prefer that return exported.SetBody(req, exported.NopCloser(bytes.NewReader(b)), shared.ContentTypeAppJSON, false) } // MarshalAsXML calls xml.Marshal() to get the XML encoding of v then calls SetBody. func MarshalAsXML(req *policy.Request, v any) error { b, err := xml.Marshal(v) if err != nil { return fmt.Errorf("error marshalling type %T: %s", v, err) } // inclue the XML header as some services require it b = []byte(xml.Header + string(b)) return req.SetBody(exported.NopCloser(bytes.NewReader(b)), shared.ContentTypeAppXML) } // SetMultipartFormData writes the specified keys/values as multi-part form fields with the specified value. // File content must be specified as an [io.ReadSeekCloser] or [streaming.MultipartContent]. // Byte slices will be treated as JSON. All other values are treated as string values. func SetMultipartFormData(req *policy.Request, formData map[string]any) error { body := bytes.Buffer{} writer := multipart.NewWriter(&body) writeContent := func(fieldname, filename string, src io.Reader) error { fd, err := writer.CreateFormFile(fieldname, filename) if err != nil { return err } // copy the data to the form file if _, err = io.Copy(fd, src); err != nil { return err } return nil } quoteEscaper := strings.NewReplacer("\\", "\\\\", `"`, "\\\"") writeMultipartContent := func(fieldname string, mpc streaming.MultipartContent) error { if mpc.Body == nil { return errors.New("streaming.MultipartContent.Body cannot be nil") } // use fieldname for the file name when unspecified filename := fieldname if mpc.ContentType == "" && mpc.Filename == "" { return writeContent(fieldname, filename, mpc.Body) } if mpc.Filename != "" { filename = mpc.Filename } // this is pretty much copied from multipart.Writer.CreateFormFile // but lets us set the caller provided Content-Type and filename h := make(textproto.MIMEHeader) h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="%s"; filename="%s"`, quoteEscaper.Replace(fieldname), quoteEscaper.Replace(filename))) contentType := "application/octet-stream" if mpc.ContentType != "" { contentType = mpc.ContentType } h.Set("Content-Type", contentType) fd, err := writer.CreatePart(h) if err != nil { return err } // copy the data to the form file if _, err = io.Copy(fd, mpc.Body); err != nil { return err } return nil } // the same as multipart.Writer.WriteField but lets us specify the Content-Type writeField := func(fieldname, contentType string, value string) error { h := make(textproto.MIMEHeader) h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="%s"`, quoteEscaper.Replace(fieldname))) h.Set("Content-Type", contentType) fd, err := writer.CreatePart(h) if err != nil { return err } if _, err = fd.Write([]byte(value)); err != nil { return err } return nil } for k, v := range formData { if rsc, ok := v.(io.ReadSeekCloser); ok { if err := writeContent(k, k, rsc); err != nil { return err } continue } else if rscs, ok := v.([]io.ReadSeekCloser); ok { for _, rsc := range rscs { if err := writeContent(k, k, rsc); err != nil { return err } } continue } else if mpc, ok := v.(streaming.MultipartContent); ok { if err := writeMultipartContent(k, mpc); err != nil { return err } continue } else if mpcs, ok := v.([]streaming.MultipartContent); ok { for _, mpc := range mpcs { if err := writeMultipartContent(k, mpc); err != nil { return err } } continue } var content string contentType := shared.ContentTypeTextPlain switch tt := v.(type) { case []byte: // JSON, don't quote it content = string(tt) contentType = shared.ContentTypeAppJSON case string: content = tt default: // ensure the value is in string format content = fmt.Sprintf("%v", v) } if err := writeField(k, contentType, content); err != nil { return err } } if err := writer.Close(); err != nil { return err } return req.SetBody(exported.NopCloser(bytes.NewReader(body.Bytes())), writer.FormDataContentType()) } // SkipBodyDownload will disable automatic downloading of the response body. func SkipBodyDownload(req *policy.Request) { req.SetOperationValue(bodyDownloadPolicyOpValues{Skip: true}) } // CtxAPINameKey is used as a context key for adding/retrieving the API name. type CtxAPINameKey = shared.CtxAPINameKey // NewUUID returns a new UUID using the RFC4122 algorithm. func NewUUID() (string, error) { u, err := uuid.New() if err != nil { return "", err } return u.String(), nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/response.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "bytes" "encoding/json" "encoding/xml" "fmt" "io" "net/http" azexported "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/internal/exported" ) // Payload reads and returns the response body or an error. // On a successful read, the response body is cached. // Subsequent reads will access the cached value. func Payload(resp *http.Response) ([]byte, error) { return exported.Payload(resp, nil) } // HasStatusCode returns true if the Response's status code is one of the specified values. func HasStatusCode(resp *http.Response, statusCodes ...int) bool { return exported.HasStatusCode(resp, statusCodes...) } // UnmarshalAsByteArray will base-64 decode the received payload and place the result into the value pointed to by v. func UnmarshalAsByteArray(resp *http.Response, v *[]byte, format Base64Encoding) error { p, err := Payload(resp) if err != nil { return err } return DecodeByteArray(string(p), v, format) } // UnmarshalAsJSON calls json.Unmarshal() to unmarshal the received payload into the value pointed to by v. func UnmarshalAsJSON(resp *http.Response, v any) error { payload, err := Payload(resp) if err != nil { return err } // TODO: verify early exit is correct if len(payload) == 0 { return nil } err = removeBOM(resp) if err != nil { return err } err = json.Unmarshal(payload, v) if err != nil { err = fmt.Errorf("unmarshalling type %T: %s", v, err) } return err } // UnmarshalAsXML calls xml.Unmarshal() to unmarshal the received payload into the value pointed to by v. func UnmarshalAsXML(resp *http.Response, v any) error { payload, err := Payload(resp) if err != nil { return err } // TODO: verify early exit is correct if len(payload) == 0 { return nil } err = removeBOM(resp) if err != nil { return err } err = xml.Unmarshal(payload, v) if err != nil { err = fmt.Errorf("unmarshalling type %T: %s", v, err) } return err } // Drain reads the response body to completion then closes it. The bytes read are discarded. func Drain(resp *http.Response) { if resp != nil && resp.Body != nil { _, _ = io.Copy(io.Discard, resp.Body) resp.Body.Close() } } // removeBOM removes any byte-order mark prefix from the payload if present. func removeBOM(resp *http.Response) error { _, err := exported.Payload(resp, &exported.PayloadOptions{ BytesModifier: func(b []byte) []byte { // UTF8 return bytes.TrimPrefix(b, []byte("\xef\xbb\xbf")) }, }) if err != nil { return err } return nil } // DecodeByteArray will base-64 decode the provided string into v. func DecodeByteArray(s string, v *[]byte, format Base64Encoding) error { return azexported.DecodeByteArray(s, v, format) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_dialer_other.go ================================================ //go:build !wasm // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "context" "net" ) func defaultTransportDialContext(dialer *net.Dialer) func(context.Context, string, string) (net.Conn, error) { return dialer.DialContext } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_dialer_wasm.go ================================================ //go:build (js && wasm) || wasip1 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "context" "net" ) func defaultTransportDialContext(dialer *net.Dialer) func(context.Context, string, string) (net.Conn, error) { return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/transport_default_http_client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package runtime import ( "crypto/tls" "net" "net/http" "time" "golang.org/x/net/http2" ) var defaultHTTPClient *http.Client func init() { defaultTransport := &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: defaultTransportDialContext(&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }), ForceAttemptHTTP2: true, MaxIdleConns: 100, MaxIdleConnsPerHost: 10, IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 10 * time.Second, ExpectContinueTimeout: 1 * time.Second, TLSClientConfig: &tls.Config{ MinVersion: tls.VersionTLS12, Renegotiation: tls.RenegotiateFreelyAsClient, }, } // TODO: evaluate removing this once https://github.com/golang/go/issues/59690 has been fixed if http2Transport, err := http2.ConfigureTransports(defaultTransport); err == nil { // if the connection has been idle for 10 seconds, send a ping frame for a health check http2Transport.ReadIdleTimeout = 10 * time.Second // if there's no response to the ping within the timeout, the connection will be closed http2Transport.PingTimeout = 5 * time.Second } defaultHTTPClient = &http.Client{ Transport: defaultTransport, } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright 2017 Microsoft Corporation. All rights reserved. // Use of this source code is governed by an MIT // license that can be found in the LICENSE file. // Package streaming contains helpers for streaming IO operations and progress reporting. package streaming ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming/progress.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package streaming import ( "io" "github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported" ) type progress struct { rc io.ReadCloser rsc io.ReadSeekCloser pr func(bytesTransferred int64) offset int64 } // NopCloser returns a ReadSeekCloser with a no-op close method wrapping the provided io.ReadSeeker. // In addition to adding a Close method to an io.ReadSeeker, this can also be used to wrap an // io.ReadSeekCloser with a no-op Close method to allow explicit control of when the io.ReedSeekCloser // has its underlying stream closed. func NopCloser(rs io.ReadSeeker) io.ReadSeekCloser { return exported.NopCloser(rs) } // NewRequestProgress adds progress reporting to an HTTP request's body stream. func NewRequestProgress(body io.ReadSeekCloser, pr func(bytesTransferred int64)) io.ReadSeekCloser { return &progress{ rc: body, rsc: body, pr: pr, offset: 0, } } // NewResponseProgress adds progress reporting to an HTTP response's body stream. func NewResponseProgress(body io.ReadCloser, pr func(bytesTransferred int64)) io.ReadCloser { return &progress{ rc: body, rsc: nil, pr: pr, offset: 0, } } // Read reads a block of data from an inner stream and reports progress func (p *progress) Read(b []byte) (n int, err error) { n, err = p.rc.Read(b) if err != nil && err != io.EOF { return } p.offset += int64(n) // Invokes the user's callback method to report progress p.pr(p.offset) return } // Seek only expects a zero or from beginning. func (p *progress) Seek(offset int64, whence int) (int64, error) { // This should only ever be called with offset = 0 and whence = io.SeekStart n, err := p.rsc.Seek(offset, whence) if err == nil { p.offset = int64(n) } return n, err } // requestBodyProgress supports Close but the underlying stream may not; if it does, Close will close it. func (p *progress) Close() error { return p.rc.Close() } // MultipartContent contains streaming content used in multipart/form payloads. type MultipartContent struct { // Body contains the required content body. Body io.ReadSeekCloser // ContentType optionally specifies the HTTP Content-Type for this Body. // The default value is application/octet-stream. ContentType string // Filename optionally specifies the filename for this Body. // The default value is the field name for the multipart/form section. Filename string } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/to/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright 2017 Microsoft Corporation. All rights reserved. // Use of this source code is governed by an MIT // license that can be found in the LICENSE file. // Package to contains various type-conversion helper functions. package to ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/to/to.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package to // Ptr returns a pointer to the provided value. func Ptr[T any](v T) *T { return &v } // SliceOfPtrs returns a slice of *T from the specified values. func SliceOfPtrs[T any](vv ...T) []*T { slc := make([]*T, len(vv)) for i := range vv { slc[i] = Ptr(vv[i]) } return slc } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package tracing // SpanKind represents the role of a Span inside a Trace. Often, this defines how a Span will be processed and visualized by various backends. type SpanKind int const ( // SpanKindInternal indicates the span represents an internal operation within an application. SpanKindInternal SpanKind = 1 // SpanKindServer indicates the span covers server-side handling of a request. SpanKindServer SpanKind = 2 // SpanKindClient indicates the span describes a request to a remote service. SpanKindClient SpanKind = 3 // SpanKindProducer indicates the span was created by a messaging producer. SpanKindProducer SpanKind = 4 // SpanKindConsumer indicates the span was created by a messaging consumer. SpanKindConsumer SpanKind = 5 ) // SpanStatus represents the status of a span. type SpanStatus int const ( // SpanStatusUnset is the default status code. SpanStatusUnset SpanStatus = 0 // SpanStatusError indicates the operation contains an error. SpanStatusError SpanStatus = 1 // SpanStatusOK indicates the operation completed successfully. SpanStatusOK SpanStatus = 2 ) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/tracing/tracing.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Package tracing contains the definitions needed to support distributed tracing. package tracing import ( "context" ) // ProviderOptions contains the optional values when creating a Provider. type ProviderOptions struct { // for future expansion } // NewProvider creates a new Provider with the specified values. // - newTracerFn is the underlying implementation for creating Tracer instances // - options contains optional values; pass nil to accept the default value func NewProvider(newTracerFn func(name, version string) Tracer, options *ProviderOptions) Provider { return Provider{ newTracerFn: newTracerFn, } } // Provider is the factory that creates Tracer instances. // It defaults to a no-op provider. type Provider struct { newTracerFn func(name, version string) Tracer } // NewTracer creates a new Tracer for the specified module name and version. // - module - the fully qualified name of the module // - version - the version of the module func (p Provider) NewTracer(module, version string) (tracer Tracer) { if p.newTracerFn != nil { tracer = p.newTracerFn(module, version) } return } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // TracerOptions contains the optional values when creating a Tracer. type TracerOptions struct { // SpanFromContext contains the implementation for the Tracer.SpanFromContext method. SpanFromContext func(context.Context) Span } // NewTracer creates a Tracer with the specified values. // - newSpanFn is the underlying implementation for creating Span instances // - options contains optional values; pass nil to accept the default value func NewTracer(newSpanFn func(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span), options *TracerOptions) Tracer { if options == nil { options = &TracerOptions{} } return Tracer{ newSpanFn: newSpanFn, spanFromContextFn: options.SpanFromContext, } } // Tracer is the factory that creates Span instances. type Tracer struct { attrs []Attribute newSpanFn func(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span) spanFromContextFn func(ctx context.Context) Span } // Start creates a new span and a context.Context that contains it. // - ctx is the parent context for this span. If it contains a Span, the newly created span will be a child of that span, else it will be a root span // - spanName identifies the span within a trace, it's typically the fully qualified API name // - options contains optional values for the span, pass nil to accept any defaults func (t Tracer) Start(ctx context.Context, spanName string, options *SpanOptions) (context.Context, Span) { if t.newSpanFn != nil { opts := SpanOptions{} if options != nil { opts = *options } opts.Attributes = append(opts.Attributes, t.attrs...) return t.newSpanFn(ctx, spanName, &opts) } return ctx, Span{} } // SetAttributes sets attrs to be applied to each Span. If a key from attrs // already exists for an attribute of the Span it will be overwritten with // the value contained in attrs. func (t *Tracer) SetAttributes(attrs ...Attribute) { t.attrs = append(t.attrs, attrs...) } // Enabled returns true if this Tracer is capable of creating Spans. func (t Tracer) Enabled() bool { return t.newSpanFn != nil } // SpanFromContext returns the Span associated with the current context. // If the provided context has no Span, false is returned. func (t Tracer) SpanFromContext(ctx context.Context) Span { if t.spanFromContextFn != nil { return t.spanFromContextFn(ctx) } return Span{} } // SpanOptions contains optional settings for creating a span. type SpanOptions struct { // Kind indicates the kind of Span. Kind SpanKind // Attributes contains key-value pairs of attributes for the span. Attributes []Attribute } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // SpanImpl abstracts the underlying implementation for Span, // allowing it to work with various tracing implementations. // Any zero-values will have their default, no-op behavior. type SpanImpl struct { // End contains the implementation for the Span.End method. End func() // SetAttributes contains the implementation for the Span.SetAttributes method. SetAttributes func(...Attribute) // AddEvent contains the implementation for the Span.AddEvent method. AddEvent func(string, ...Attribute) // SetStatus contains the implementation for the Span.SetStatus method. SetStatus func(SpanStatus, string) } // NewSpan creates a Span with the specified implementation. func NewSpan(impl SpanImpl) Span { return Span{ impl: impl, } } // Span is a single unit of a trace. A trace can contain multiple spans. // A zero-value Span provides a no-op implementation. type Span struct { impl SpanImpl } // End terminates the span and MUST be called before the span leaves scope. // Any further updates to the span will be ignored after End is called. func (s Span) End() { if s.impl.End != nil { s.impl.End() } } // SetAttributes sets the specified attributes on the Span. // Any existing attributes with the same keys will have their values overwritten. func (s Span) SetAttributes(attrs ...Attribute) { if s.impl.SetAttributes != nil { s.impl.SetAttributes(attrs...) } } // AddEvent adds a named event with an optional set of attributes to the span. func (s Span) AddEvent(name string, attrs ...Attribute) { if s.impl.AddEvent != nil { s.impl.AddEvent(name, attrs...) } } // SetStatus sets the status on the span along with a description. func (s Span) SetStatus(code SpanStatus, desc string) { if s.impl.SetStatus != nil { s.impl.SetStatus(code, desc) } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // Attribute is a key-value pair. type Attribute struct { // Key is the name of the attribute. Key string // Value is the attribute's value. // Types that are natively supported include int64, float64, int, bool, string. // Any other type will be formatted per rules of fmt.Sprintf("%v"). Value any } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/LICENSE.txt ================================================ MIT License Copyright (c) Microsoft Corporation. Permission 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE 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 ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/diag/diag.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package diag import ( "fmt" "runtime" "strings" ) // Caller returns the file and line number of a frame on the caller's stack. // If the funtion fails an empty string is returned. // skipFrames - the number of frames to skip when determining the caller. // Passing a value of 0 will return the immediate caller of this function. func Caller(skipFrames int) string { if pc, file, line, ok := runtime.Caller(skipFrames + 1); ok { // the skipFrames + 1 is to skip ourselves frame := runtime.FuncForPC(pc) return fmt.Sprintf("%s()\n\t%s:%d", frame.Name(), file, line) } return "" } // StackTrace returns a formatted stack trace string. // If the funtion fails an empty string is returned. // skipFrames - the number of stack frames to skip before composing the trace string. // totalFrames - the maximum number of stack frames to include in the trace string. func StackTrace(skipFrames, totalFrames int) string { pcCallers := make([]uintptr, totalFrames) if frames := runtime.Callers(skipFrames, pcCallers); frames == 0 { return "" } frames := runtime.CallersFrames(pcCallers) sb := strings.Builder{} for { frame, more := frames.Next() sb.WriteString(frame.Function) sb.WriteString("()\n\t") sb.WriteString(frame.File) sb.WriteRune(':') sb.WriteString(fmt.Sprintf("%d\n", frame.Line)) if !more { break } } return sb.String() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/diag/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package diag ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package errorinfo ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/errorinfo/errorinfo.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package errorinfo // NonRetriable represents a non-transient error. This works in // conjunction with the retry policy, indicating that the error condition // is idempotent, so no retries will be attempted. // Use errors.As() to access this interface in the error chain. type NonRetriable interface { error NonRetriable() } // NonRetriableError marks the specified error as non-retriable. // This function takes an error as input and returns a new error that is marked as non-retriable. func NonRetriableError(err error) error { return &nonRetriableError{err} } // nonRetriableError is a struct that embeds the error interface. // It is used to represent errors that should not be retried. type nonRetriableError struct { error } // Error method for nonRetriableError struct. // It returns the error message of the embedded error. func (p *nonRetriableError) Error() string { return p.error.Error() } // NonRetriable is a marker method for nonRetriableError struct. // Non-functional and indicates that the error is non-retriable. func (*nonRetriableError) NonRetriable() { // marker method } // Unwrap method for nonRetriableError struct. // It returns the original error that was marked as non-retriable. func (p *nonRetriableError) Unwrap() error { return p.error } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/exported/exported.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package exported import ( "errors" "io" "net/http" ) // HasStatusCode returns true if the Response's status code is one of the specified values. // Exported as runtime.HasStatusCode(). func HasStatusCode(resp *http.Response, statusCodes ...int) bool { if resp == nil { return false } for _, sc := range statusCodes { if resp.StatusCode == sc { return true } } return false } // PayloadOptions contains the optional values for the Payload func. // NOT exported but used by azcore. type PayloadOptions struct { // BytesModifier receives the downloaded byte slice and returns an updated byte slice. // Use this to modify the downloaded bytes in a payload (e.g. removing a BOM). BytesModifier func([]byte) []byte } // Payload reads and returns the response body or an error. // On a successful read, the response body is cached. // Subsequent reads will access the cached value. // Exported as runtime.Payload() WITHOUT the opts parameter. func Payload(resp *http.Response, opts *PayloadOptions) ([]byte, error) { if resp.Body == nil { // this shouldn't happen in real-world scenarios as a // response with no body should set it to http.NoBody return nil, nil } modifyBytes := func(b []byte) []byte { return b } if opts != nil && opts.BytesModifier != nil { modifyBytes = opts.BytesModifier } // r.Body won't be a nopClosingBytesReader if downloading was skipped if buf, ok := resp.Body.(*nopClosingBytesReader); ok { bytesBody := modifyBytes(buf.Bytes()) buf.Set(bytesBody) return bytesBody, nil } bytesBody, err := io.ReadAll(resp.Body) resp.Body.Close() if err != nil { return nil, err } bytesBody = modifyBytes(bytesBody) resp.Body = &nopClosingBytesReader{s: bytesBody} return bytesBody, nil } // PayloadDownloaded returns true if the response body has already been downloaded. // This implies that the Payload() func above has been previously called. // NOT exported but used by azcore. func PayloadDownloaded(resp *http.Response) bool { _, ok := resp.Body.(*nopClosingBytesReader) return ok } // nopClosingBytesReader is an io.ReadSeekCloser around a byte slice. // It also provides direct access to the byte slice to avoid rereading. type nopClosingBytesReader struct { s []byte i int64 } // Bytes returns the underlying byte slice. func (r *nopClosingBytesReader) Bytes() []byte { return r.s } // Close implements the io.Closer interface. func (*nopClosingBytesReader) Close() error { return nil } // Read implements the io.Reader interface. func (r *nopClosingBytesReader) Read(b []byte) (n int, err error) { if r.i >= int64(len(r.s)) { return 0, io.EOF } n = copy(b, r.s[r.i:]) r.i += int64(n) return } // Set replaces the existing byte slice with the specified byte slice and resets the reader. func (r *nopClosingBytesReader) Set(b []byte) { r.s = b r.i = 0 } // Seek implements the io.Seeker interface. func (r *nopClosingBytesReader) Seek(offset int64, whence int) (int64, error) { var i int64 switch whence { case io.SeekStart: i = offset case io.SeekCurrent: i = r.i + offset case io.SeekEnd: i = int64(len(r.s)) + offset default: return 0, errors.New("nopClosingBytesReader: invalid whence") } if i < 0 { return 0, errors.New("nopClosingBytesReader: negative position") } r.i = i return i, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/log/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package log ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/log/log.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package log import ( "fmt" "os" "time" ) /////////////////////////////////////////////////////////////////////////////////////////////////// // NOTE: The following are exported as public surface area from azcore. DO NOT MODIFY /////////////////////////////////////////////////////////////////////////////////////////////////// // Event is used to group entries. Each group can be toggled on or off. type Event string // SetEvents is used to control which events are written to // the log. By default all log events are writen. func SetEvents(cls ...Event) { log.cls = cls } // SetListener will set the Logger to write to the specified listener. func SetListener(lst func(Event, string)) { log.lst = lst } /////////////////////////////////////////////////////////////////////////////////////////////////// // END PUBLIC SURFACE AREA /////////////////////////////////////////////////////////////////////////////////////////////////// // Should returns true if the specified log event should be written to the log. // By default all log events will be logged. Call SetEvents() to limit // the log events for logging. // If no listener has been set this will return false. // Calling this method is useful when the message to log is computationally expensive // and you want to avoid the overhead if its log event is not enabled. func Should(cls Event) bool { if log.lst == nil { return false } if len(log.cls) == 0 { return true } for _, c := range log.cls { if c == cls { return true } } return false } // Write invokes the underlying listener with the specified event and message. // If the event shouldn't be logged or there is no listener then Write does nothing. func Write(cls Event, message string) { if !Should(cls) { return } log.lst(cls, message) } // Writef invokes the underlying listener with the specified event and formatted message. // If the event shouldn't be logged or there is no listener then Writef does nothing. func Writef(cls Event, format string, a ...interface{}) { if !Should(cls) { return } log.lst(cls, fmt.Sprintf(format, a...)) } // TestResetEvents is used for TESTING PURPOSES ONLY. func TestResetEvents() { log.cls = nil } // logger controls which events to log and writing to the underlying log. type logger struct { cls []Event lst func(Event, string) } // the process-wide logger var log logger func init() { initLogging() } // split out for testing purposes func initLogging() { if cls := os.Getenv("AZURE_SDK_GO_LOGGING"); cls == "all" { // cls could be enhanced to support a comma-delimited list of log events log.lst = func(cls Event, msg string) { // simple console logger, it writes to stderr in the following format: // [time-stamp] Event: message fmt.Fprintf(os.Stderr, "[%s] %s: %s\n", time.Now().Format(time.StampMicro), cls, msg) } } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/poller/util.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package poller import ( "encoding/json" "errors" "fmt" "net/http" "net/url" "strings" "github.com/Azure/azure-sdk-for-go/sdk/internal/exported" ) // the well-known set of LRO status/provisioning state values. const ( StatusSucceeded = "Succeeded" StatusCanceled = "Canceled" StatusFailed = "Failed" StatusInProgress = "InProgress" ) // these are non-conformant states that we've seen in the wild. // we support them for back-compat. const ( StatusCancelled = "Cancelled" StatusCompleted = "Completed" ) // IsTerminalState returns true if the LRO's state is terminal. func IsTerminalState(s string) bool { return Failed(s) || Succeeded(s) } // Failed returns true if the LRO's state is terminal failure. func Failed(s string) bool { return strings.EqualFold(s, StatusFailed) || strings.EqualFold(s, StatusCanceled) || strings.EqualFold(s, StatusCancelled) } // Succeeded returns true if the LRO's state is terminal success. func Succeeded(s string) bool { return strings.EqualFold(s, StatusSucceeded) || strings.EqualFold(s, StatusCompleted) } // returns true if the LRO response contains a valid HTTP status code func StatusCodeValid(resp *http.Response) bool { return exported.HasStatusCode(resp, http.StatusOK, http.StatusAccepted, http.StatusCreated, http.StatusNoContent) } // IsValidURL verifies that the URL is valid and absolute. func IsValidURL(s string) bool { u, err := url.Parse(s) return err == nil && u.IsAbs() } // ErrNoBody is returned if the response didn't contain a body. var ErrNoBody = errors.New("the response did not contain a body") // GetJSON reads the response body into a raw JSON object. // It returns ErrNoBody if there was no content. func GetJSON(resp *http.Response) (map[string]any, error) { body, err := exported.Payload(resp, nil) if err != nil { return nil, err } if len(body) == 0 { return nil, ErrNoBody } // unmarshall the body to get the value var jsonBody map[string]any if err = json.Unmarshal(body, &jsonBody); err != nil { return nil, err } return jsonBody, nil } // provisioningState returns the provisioning state from the response or the empty string. func provisioningState(jsonBody map[string]any) string { jsonProps, ok := jsonBody["properties"] if !ok { return "" } props, ok := jsonProps.(map[string]any) if !ok { return "" } rawPs, ok := props["provisioningState"] if !ok { return "" } ps, ok := rawPs.(string) if !ok { return "" } return ps } // status returns the status from the response or the empty string. func status(jsonBody map[string]any) string { rawStatus, ok := jsonBody["status"] if !ok { return "" } status, ok := rawStatus.(string) if !ok { return "" } return status } // GetStatus returns the LRO's status from the response body. // Typically used for Azure-AsyncOperation flows. // If there is no status in the response body the empty string is returned. func GetStatus(resp *http.Response) (string, error) { jsonBody, err := GetJSON(resp) if err != nil { return "", err } return status(jsonBody), nil } // GetProvisioningState returns the LRO's state from the response body. // If there is no state in the response body the empty string is returned. func GetProvisioningState(resp *http.Response) (string, error) { jsonBody, err := GetJSON(resp) if err != nil { return "", err } return provisioningState(jsonBody), nil } // GetResourceLocation returns the LRO's resourceLocation value from the response body. // Typically used for Operation-Location flows. // If there is no resourceLocation in the response body the empty string is returned. func GetResourceLocation(resp *http.Response) (string, error) { jsonBody, err := GetJSON(resp) if err != nil { return "", err } v, ok := jsonBody["resourceLocation"] if !ok { // it might be ok if the field doesn't exist, the caller must make that determination return "", nil } vv, ok := v.(string) if !ok { return "", fmt.Errorf("the resourceLocation value %v was not in string format", v) } return vv, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/temporal/resource.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package temporal import ( "sync" "time" ) // backoff sets a minimum wait time between eager update attempts. It's a variable so tests can manipulate it. var backoff = func(now, lastAttempt time.Time) bool { return lastAttempt.Add(30 * time.Second).After(now) } // AcquireResource abstracts a method for refreshing a temporal resource. type AcquireResource[TResource, TState any] func(state TState) (newResource TResource, newExpiration time.Time, err error) // ShouldRefresh abstracts a method for indicating whether a resource should be refreshed before expiration. type ShouldRefresh[TResource, TState any] func(TResource, TState) bool // Resource is a temporal resource (usually a credential) that requires periodic refreshing. type Resource[TResource, TState any] struct { // cond is used to synchronize access to the shared resource embodied by the remaining fields cond *sync.Cond // acquiring indicates that some thread/goroutine is in the process of acquiring/updating the resource acquiring bool // resource contains the value of the shared resource resource TResource // expiration indicates when the shared resource expires; it is 0 if the resource was never acquired expiration time.Time // lastAttempt indicates when a thread/goroutine last attempted to acquire/update the resource lastAttempt time.Time // shouldRefresh indicates whether the resource should be refreshed before expiration shouldRefresh ShouldRefresh[TResource, TState] // acquireResource is the callback function that actually acquires the resource acquireResource AcquireResource[TResource, TState] } // NewResource creates a new Resource that uses the specified AcquireResource for refreshing. func NewResource[TResource, TState any](ar AcquireResource[TResource, TState]) *Resource[TResource, TState] { r := &Resource[TResource, TState]{acquireResource: ar, cond: sync.NewCond(&sync.Mutex{})} r.shouldRefresh = r.expiringSoon return r } // ResourceOptions contains optional configuration for Resource type ResourceOptions[TResource, TState any] struct { // ShouldRefresh indicates whether [Resource.Get] should acquire an updated resource despite // the currently held resource not having expired. [Resource.Get] ignores all errors from // refresh attempts triggered by ShouldRefresh returning true, and doesn't call ShouldRefresh // when the resource has expired (it unconditionally updates expired resources). When // ShouldRefresh is nil, [Resource.Get] refreshes the resource if it will expire within 5 // minutes. ShouldRefresh ShouldRefresh[TResource, TState] } // NewResourceWithOptions creates a new Resource that uses the specified AcquireResource for refreshing. func NewResourceWithOptions[TResource, TState any](ar AcquireResource[TResource, TState], opts ResourceOptions[TResource, TState]) *Resource[TResource, TState] { r := NewResource(ar) if opts.ShouldRefresh != nil { r.shouldRefresh = opts.ShouldRefresh } return r } // Get returns the underlying resource. // If the resource is fresh, no refresh is performed. func (er *Resource[TResource, TState]) Get(state TState) (TResource, error) { now, acquire, expired := time.Now(), false, false // acquire exclusive lock er.cond.L.Lock() resource := er.resource for { expired = er.expiration.IsZero() || er.expiration.Before(now) if expired { // The resource was never acquired or has expired if !er.acquiring { // If another thread/goroutine is not acquiring/updating the resource, this thread/goroutine will do it er.acquiring, acquire = true, true break } // Getting here means that this thread/goroutine will wait for the updated resource } else if er.shouldRefresh(resource, state) { if !(er.acquiring || backoff(now, er.lastAttempt)) { // If another thread/goroutine is not acquiring/renewing the resource, and none has attempted // to do so within the last 30 seconds, this thread/goroutine will do it er.acquiring, acquire = true, true break } // This thread/goroutine will use the existing resource value while another updates it resource = er.resource break } else { // The resource is not close to expiring, this thread/goroutine should use its current value resource = er.resource break } // If we get here, wait for the new resource value to be acquired/updated er.cond.Wait() } er.cond.L.Unlock() // Release the lock so no threads/goroutines are blocked var err error if acquire { // This thread/goroutine has been selected to acquire/update the resource var expiration time.Time var newValue TResource er.lastAttempt = now newValue, expiration, err = er.acquireResource(state) // Atomically, update the shared resource's new value & expiration. er.cond.L.Lock() if err == nil { // Update resource & expiration, return the new value resource = newValue er.resource, er.expiration = resource, expiration } else if !expired { // An eager update failed. Discard the error and return the current--still valid--resource value err = nil } er.acquiring = false // Indicate that no thread/goroutine is currently acquiring the resource // Wake up any waiting threads/goroutines since there is a resource they can ALL use er.cond.L.Unlock() er.cond.Broadcast() } return resource, err // Return the resource this thread/goroutine can use } // Expire marks the resource as expired, ensuring it's refreshed on the next call to Get(). func (er *Resource[TResource, TState]) Expire() { er.cond.L.Lock() defer er.cond.L.Unlock() // Reset the expiration as if we never got this resource to begin with er.expiration = time.Time{} } func (er *Resource[TResource, TState]) expiringSoon(TResource, TState) bool { // call time.Now() instead of using Get's value so ShouldRefresh doesn't need a time.Time parameter return er.expiration.Add(-5 * time.Minute).Before(time.Now()) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/uuid/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package uuid ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/internal/uuid/uuid.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package uuid import ( "crypto/rand" "errors" "fmt" "strconv" ) // The UUID reserved variants. const ( reservedRFC4122 byte = 0x40 ) // A UUID representation compliant with specification in RFC4122 document. type UUID [16]byte // New returns a new UUID using the RFC4122 algorithm. func New() (UUID, error) { u := UUID{} // Set all bits to pseudo-random values. // NOTE: this takes a process-wide lock _, err := rand.Read(u[:]) if err != nil { return u, err } u[8] = (u[8] | reservedRFC4122) & 0x7F // u.setVariant(ReservedRFC4122) var version byte = 4 u[6] = (u[6] & 0xF) | (version << 4) // u.setVersion(4) return u, nil } // String returns the UUID in "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" format. func (u UUID) String() string { return fmt.Sprintf("%x-%x-%x-%x-%x", u[0:4], u[4:6], u[6:8], u[8:10], u[10:]) } // Parse parses a string formatted as "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" // or "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" into a UUID. func Parse(s string) (UUID, error) { var uuid UUID // ensure format switch len(s) { case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx case 38: // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} s = s[1:37] default: return uuid, errors.New("invalid UUID format") } if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { return uuid, errors.New("invalid UUID format") } // parse chunks for i, x := range [16]int{ 0, 2, 4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 28, 30, 32, 34} { b, err := strconv.ParseUint(s[x:x+2], 16, 8) if err != nil { return uuid, fmt.Errorf("invalid UUID format: %s", err) } uuid[i] = byte(b) } return uuid, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/CHANGELOG.md ================================================ # Release History ## 1.6.1 (2025-04-16) ### Bugs Fixed * Fixed return value of DownloadBuffer when the HTTPRange count given is greater than the data length. Fixes [#23884](https://github.com/Azure/azure-sdk-for-go/issues/23884) ### Other Changes * Updated `azidentity` version to `1.9.0` * Updated `azcore` version to `1.18.0` ## 1.6.1-beta.1 (2025-02-12) ### Features Added * Upgraded service version to `2025-05-05`. ## 1.6.0 (2025-01-23) ### Features Added * Upgraded service version to `2025-01-05`. ## 1.6.0-beta.1 (2025-01-13) ### Features Added * Added permissions & resourcetype parameters in listblob response. * Added BlobProperties field in BlobPrefix definition in listblob response. ### Bugs Fixed * Fix FilterBlob API if Query contains a space character. Fixes [#23546](https://github.com/Azure/azure-sdk-for-go/issues/23546) ## 1.5.0 (2024-11-13) ### Features Added * Fix compareHeaders custom sorting algorithm for String To Sign. ## 1.5.0-beta.1 (2024-10-22) ### Other Changes * Updated `azcore` version to `1.16.0` * Updated `azidentity` version to `1.8.0` ## 1.4.1 (2024-09-18) ### Features Added * Added crc64 response header to Put Blob. * Upgraded service version to `2024-08-04`. ## 1.4.1-beta.1 (2024-08-27) ### Features Added * Upgraded service version to `2024-08-04`. ### Other Changes * Updated `azcore` version to `1.14.0` ## 1.4.0 (2024-07-18) ### Other Changes * GetProperties() was called twice in DownloadFile method. Enhanced to call it only once, reducing latency. * Updated `azcore` version to `1.13.0` ## 1.4.0-beta.1 (2024-06-14) ### Features Added * Updated service version to `2024-05-04`. ### Other Changes * Updated `azidentity` version to `1.6.0` * Updated `azcore` version to `1.12.0` ## 1.3.2 (2024-04-09) ### Bugs Fixed * Fixed an issue where GetSASURL() was providing HTTPS SAS, instead of the default http+https SAS. Fixes [#22448](https://github.com/Azure/azure-sdk-for-go/issues/22448) ### Other Changes * Integrate `InsecureAllowCredentialWithHTTP` client options. * Update dependencies. ## 1.3.1 (2024-02-28) ### Bugs Fixed * Re-enabled `SharedKeyCredential` authentication mode for non TLS protected endpoints. * Use random write in `DownloadFile` method. Fixes [#22426](https://github.com/Azure/azure-sdk-for-go/issues/22426). ## 1.3.0 (2024-02-12) ### Bugs Fixed * Fix concurrency issue while Downloading File. Fixes [#22156](https://github.com/Azure/azure-sdk-for-go/issues/22156). * Fix panic when nil options bag is passed to NewGetPageRangesPager. Fixes [22356](https://github.com/Azure/azure-sdk-for-go/issues/22356). * Fix file offset update after Download file. Fixes [#22297](https://github.com/Azure/azure-sdk-for-go/issues/22297). ### Other Changes * Updated the version of `azcore` to `1.9.2` ## 1.3.0-beta.1 (2024-01-09) ### Features Added * Updated service version to `2023-11-03`. * Added support for Audience when OAuth is used. ### Bugs Fixed * Block `SharedKeyCredential` authentication mode for non TLS protected endpoints. Fixes [#21841](https://github.com/Azure/azure-sdk-for-go/issues/21841). ## 1.2.1 (2023-12-13) ### Features Added * Exposed GetSASURL from specialized clients ### Bugs Fixed * Fixed case in Blob Batch API when blob path has / in it. Fixes [#21649](https://github.com/Azure/azure-sdk-for-go/issues/21649). * Fixed SharedKeyMissingError when using client.BlobClient().GetSASURL() method * Fixed an issue that would cause metadata keys with empty values to be omitted when enumerating blobs. * Fixed an issue where passing empty map to set blob tags API was causing panic. Fixes [#21869](https://github.com/Azure/azure-sdk-for-go/issues/21869). * Fixed an issue where downloaded file has incorrect size when not a multiple of block size. Fixes [#21995](https://github.com/Azure/azure-sdk-for-go/issues/21995). * Fixed case where `io.ErrUnexpectedEOF` was treated as expected error in `UploadStream`. Fixes [#21837](https://github.com/Azure/azure-sdk-for-go/issues/21837). ### Other Changes * Updated the version of `azcore` to `1.9.1` and `azidentity` to `1.4.0`. ## 1.2.0 (2023-10-11) ### Bugs Fixed * Fixed null pointer exception when `SetImmutabilityPolicyOptions` is passed as `nil`. ## 1.2.0-beta.1 (2023-09-18) ### Features Added * Added support for service version 2020-12-06, 2021-02-12, 2021-04-10, 2021-06-08, 2021-08-06 , 2021-10-04, 2021-12-02, 2022-11-02, 2023-01-03, 2023-05-03, and 2023-08-03 * Added support for [Cold Tier](https://learn.microsoft.com/azure/storage/blobs/access-tiers-overview?tabs=azure-portal). * Added `CopySourceTag` option for `UploadBlobFromURLOptions` * Added [FilterBlobs by Tags](https://learn.microsoft.com/rest/api/storageservices/find-blobs-by-tags-container) API for container client. * Added `System` option to `ListContainersInclude` to allow listing of system containers (i.e, $web). * Updated the SAS Version to `2021-12-02` and added `Encryption Scope` to Account SAS, Service SAS, and User Delegation SAS * Added `ArchiveStatusRehydratePendingToCold` value to `ArchiveStatus` enum. * Content length limit for `AppendBlob.AppendBlock()` and `AppendBlob.AppendBlockFromURL()` raised from 4 MB to 100 MB. ### Bugs Fixed * Fixed issue where some requests fail with mismatch in string to sign. * Fixed service SAS creation where expiry time or permissions can be omitted when stored access policy is used. Fixes [#21229](https://github.com/Azure/azure-sdk-for-go/issues/21229). ### Other Changes * Updating version of azcore to 1.6.0. ## 1.1.0 (2023-07-13) ### Features Added * Added [Blob Batch API](https://learn.microsoft.com/rest/api/storageservices/blob-batch). * Added support for bearer challenge for identity based managed disks. * Added support for GetAccountInfo to container and blob level clients. * Added [UploadBlobFromURL API](https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url). * Added support for CopySourceAuthorization to appendblob.AppendBlockFromURL * Added support for tag permission in Container SAS. ### Bugs Fixed * Fixed time formatting for the conditional request headers. Fixes [#20475](https://github.com/Azure/azure-sdk-for-go/issues/20475). * Fixed an issue where passing a blob tags map of length 0 would result in the x-ms-tags header to be sent to the service with an empty string as value. * Fixed block size and number of blocks calculation in `UploadBuffer` and `UploadFile`. Fixes [#20735](https://github.com/Azure/azure-sdk-for-go/issues/20735). ### Other Changes * Add `dragonfly` to the list of build constraints for `blockblob`. * Updating version of azcore to 1.6.0 and azidentity to 1.3.0 ## 1.1.0-beta.1 (2023-05-09) ### Features Added * Added [Blob Batch API](https://learn.microsoft.com/rest/api/storageservices/blob-batch). * Added support for bearer challenge for identity based managed disks. * Added support for GetAccountInfo to container and blob level clients. * Added [UploadBlobFromURL API](https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url). * Added support for CopySourceAuthorization to appendblob.AppendBlockFromURL * Added support for tag permission in Container SAS. ### Bugs Fixed * Fixed time formatting for the conditional request headers. Fixes [#20475](https://github.com/Azure/azure-sdk-for-go/issues/20475). * Fixed an issue where passing a blob tags map of length 0 would result in the x-ms-tags header to be sent to the service with an empty string as value. ## 1.0.0 (2023-02-07) ### Features Added * Add support to log calculated block size and count during uploads * Added MissingSharedKeyCredential error type for cleaner UX. Related to [#19864](https://github.com/Azure/azure-sdk-for-go/issues/19864). ### Breaking Changes * Changed API signatures to map correctly to Azure Storage REST APIs, These changes impact: * `blob.GetSASURL()` * `blockblob.StageBlockFromURL()` * `container.SetAccessPolicy()` * `container.GetSASURL()` * `service.GetSASURL()` * `service.FilterBlobs()` * `lease.AcquireLease()` (blobs and containers) * `lease.ChangeLease()` (blobs and containers) * Type name changes: * `CpkInfo` -> `CPKInfo` * `CpkScopeInfo` -> `CPKScopeInfo` * `RuleId` -> `RuleID` * `PolicyId` -> `PolicyID` * `CorsRule` -> `CORSRule` * Remove `AccountServices` it is now hardcoded to blobs ### Bugs Fixed * Fixed encoding issues seen in FilterBlobs. Fixes [#17421](https://github.com/Azure/azure-sdk-for-go/issues/17421). * Fixing inconsistency seen with Metadata and ORS response. Fixes [#19688](https://github.com/Azure/azure-sdk-for-go/issues/19688). * Fixed endless loop during pagination issue [#19773](https://github.com/Azure/azure-sdk-for-go/pull/19773). ### Other Changes * Exported some missing types in the `blob`, `container` and `service` packages. Fixes [#19775](https://github.com/Azure/azure-sdk-for-go/issues/19775). * SAS changes [#19781](https://github.com/Azure/azure-sdk-for-go/pull/19781): * AccountSASPermissions: SetImmutabilityPolicy support * ContainerSASPermissions: Move support * Validations to ensure correct sas perm ordering ## 0.6.1 (2022-12-09) ### Bugs Fixed * Fix compilation error on Darwin. ## 0.6.0 (2022-12-08) ### Features Added * Added BlobDeleteType to DeleteOptions to allow access to ['Permanent'](https://learn.microsoft.com/rest/api/storageservices/delete-blob#permanent-delete) DeleteType. * Added [Set Blob Expiry API](https://learn.microsoft.com/rest/api/storageservices/set-blob-expiry). * Added method `ServiceClient()` to the `azblob.Client` type, allowing access to the underlying service client. * Added support for object level immutability policy with versioning (Version Level WORM). * Added the custom CRC64 polynomial used by storage for transactional hashes, and implemented automatic hashing for transactions. ### Breaking Changes * Corrected the name for `saoid` and `suoid` SAS parameters in `BlobSignatureValues` struct as per [this](https://learn.microsoft.com/rest/api/storageservices/create-user-delegation-sas#construct-a-user-delegation-sas) * Updated type of `BlockSize` from int to int64 in `UploadStreamOptions` * CRC64 transactional hashes are now supplied with a `uint64` rather than a `[]byte` to conform with Golang's `hash/crc64` package * Field `XMSContentCRC64` has been renamed to `ContentCRC64` * The `Lease*` constant types and values in the `blob` and `container` packages have been moved to the `lease` package and their names fixed up to avoid stuttering. * Fields `TransactionalContentCRC64` and `TransactionalContentMD5` have been replaced by `TransactionalValidation`. * Fields `SourceContentCRC64` and `SourceContentMD5` have been replaced by `SourceContentValidation`. * Field `TransactionalContentMD5` has been removed from type `AppendBlockFromURLOptions`. ### Bugs Fixed * Corrected signing of User Delegation SAS. Fixes [#19372](https://github.com/Azure/azure-sdk-for-go/issues/19372) and [#19454](https://github.com/Azure/azure-sdk-for-go/issues/19454) * Added formatting of start and expiry time in [SetAccessPolicy](https://learn.microsoft.com/rest/api/storageservices/set-container-acl#request-body). Fixes [#18712](https://github.com/Azure/azure-sdk-for-go/issues/18712) * Uploading block blobs larger than 256MB can fail in some cases with error `net/http: HTTP/1.x transport connection broken`. * Blob name parameters are URL-encoded before constructing the complete blob URL. ### Other Changes * Added some missing public surface area in the `container` and `service` packages. * The `UploadStream()` methods now use anonymous memory mapped files for buffers in order to reduce heap allocations/fragmentation. * The anonymous memory mapped files are typically backed by the page/swap file, multiple files are not actually created. ## 0.5.1 (2022-10-11) ### Bugs Fixed * `GetSASURL()`: for container and blob clients, don't add a forward slash before the query string * Fixed issue [#19249](https://github.com/Azure/azure-sdk-for-go/issues/19249) by increasing service version to '2020-02-10'. ### Other Changes * Improved docs for client constructors. * Updating azcore version to 1.1.4 ## 0.5.0 (2022-09-29) ### Breaking Changes * Complete architectural change for better user experience. Please view the [README](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob#readme) ### Features Added * Added [UserDelegationCredential](https://learn.microsoft.com/rest/api/storageservices/create-user-delegation-sas) which resolves [#18976](https://github.com/Azure/azure-sdk-for-go/issues/18976), [#16916](https://github.com/Azure/azure-sdk-for-go/issues/16916), [#18977](https://github.com/Azure/azure-sdk-for-go/issues/18977) * Added [Restore Container API](https://learn.microsoft.com/rest/api/storageservices/restore-container). ### Bugs Fixed * Fixed issue [#18767](https://github.com/Azure/azure-sdk-for-go/issues/18767) * Fix deadlock when error writes are slow [#16937](https://github.com/Azure/azure-sdk-for-go/pull/16937) ## 0.4.1 (2022-05-12) ### Other Changes * Updated to latest `azcore` and `internal` modules ## 0.4.0 (2022-04-19) ### Breaking Changes * Fixed Issue #17150 : Renaming/refactoring high level methods. * Fixed Issue #16972 : Constructors should return clients by reference. * Renaming the options bags to match the naming convention same as that of response. The behaviour of options bags remains the same. ### Bugs Fixed * Fixed Issue #17515 : SetTags options bag missing leaseID. * Fixed Issue #17423 : Drop "Type" suffix from `GeoReplicationStatusType`. * Fixed Issue #17335 : Nil pointer exception when passing nil options bag in `ListBlobsFlat` API call. * Fixed Issue #17188 : `BlobURLParts` not supporting VersionID * Fixed Issue #17152 , Issue #17131 , Issue #17061 : `UploadStreamToBlockBlob` / `UploadStreamToBlockBlob` methods ignoring the options bag. * Fixed Issue #16920 : Fixing error handling example. * Fixed Issue #16786 : Refactoring of autorest code generation definition and adding necessary transformations. * Fixed Issue #16679 : Response parsing issue in List blobs API. ## 0.3.0 (2022-02-09) ### Breaking Changes * Updated to latest `azcore`. Public surface area is unchanged. * [#16978](https://github.com/Azure/azure-sdk-for-go/pull/16978): The `DownloadResponse.Body` parameter is now `*RetryReaderOptions`. ### Bugs Fixed * Fixed Issue #16193 : `azblob.GetSASToken` wrong signed resource. * Fixed Issue #16223 : `HttpRange` does not expose its fields. * Fixed Issue #16254 : Issue passing reader to upload `BlockBlobClient` * Fixed Issue #16295 : Problem with listing blobs by using of `ListBlobsHierarchy()` * Fixed Issue #16542 : Empty `StorageError` in the Azurite environment * Fixed Issue #16679 : Unable to access Metadata when listing blobs * Fixed Issue #16816 : `ContainerClient.GetSASToken` doesn't allow list permission. * Fixed Issue #16988 : Too many arguments in call to `runtime.NewResponseError` ## 0.2.0 (2021-11-03) ### Breaking Changes * Clients now have one constructor per authentication method ## 0.1.0 (2021-09-13) ### Features Added * This is the initial preview release of the `azblob` library ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/LICENSE.txt ================================================ MIT License Copyright (c) Microsoft Corporation. All rights reserved. Permission 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE 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 ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/README.md ================================================ # Azure Blob Storage module for Go [![PkgGoDev](https://pkg.go.dev/badge/github.com/Azure/azure-sdk-for-go/sdk/azblob)](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob) [![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/go%20-%20azdatalake%20-%20ci?branchName=main)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=2854&branchName=main) [![Code Coverage](https://img.shields.io/azure-devops/coverage/azure-sdk/public/2854/main)](https://img.shields.io/azure-devops/coverage/azure-sdk/public/2854/main) > Service Version: 2023-11-03 Azure Blob Storage is Microsoft's object storage solution for the cloud. Blob Storage is optimized for storing massive amounts of unstructured data - data that does not adhere to a particular data model or definition, such as text or binary data. For more information, see [Introduction to Azure Blob Storage](https://learn.microsoft.com/azure/storage/blobs/storage-blobs-introduction). Use the Azure Blob Storage client module `github.com/Azure/azure-sdk-for-go/sdk/storage/azblob` to: * Authenticate clients with Azure Blob Storage * Manipulate containers and blobs in an Azure storage account Key links: [Source code][source] | [API reference documentation][docs] | [REST API documentation][rest_docs] | [Product documentation][product_docs] | [Samples][go_samples] ## Getting started ### Prerequisites - [Supported](https://aka.ms/azsdk/go/supported-versions) version of Go - [Install Go](https://go.dev/doc/install) - Azure subscription - [Create a free account](https://azure.microsoft.com/free/) - Azure storage account - To create a storage account, use tools including the [Azure portal][storage_account_create_portal], [Azure PowerShell][storage_account_create_ps], or the [Azure CLI][storage_account_create_cli]. Here's an example using the Azure CLI: ```bash az storage account create --name MyStorageAccount --resource-group MyResourceGroup --location westus --sku Standard_LRS ``` ### Install the package Install the Azure Blob Storage client module for Go with [go get][goget]: ```bash go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob ``` If you plan to authenticate with Azure Active Directory (recommended), also install the [azidentity][azidentity] module. ```bash go get github.com/Azure/azure-sdk-for-go/sdk/azidentity ``` ### Authenticate the client To interact with the Azure Blob Storage service, you'll need to create an instance of the `azblob.Client` type. The [azidentity][azidentity] module makes it easy to add Azure Active Directory support for authenticating Azure SDK clients with their corresponding Azure services. ```go // create a credential for authenticating with Azure Active Directory cred, err := azidentity.NewDefaultAzureCredential(nil) // TODO: handle err // create an azblob.Client for the specified storage account that uses the above credential client, err := azblob.NewClient("https://MYSTORAGEACCOUNT.blob.core.windows.net/", cred, nil) // TODO: handle err ``` Learn more about enabling Azure Active Directory for authentication with Azure Storage: * [Authorize access to blobs using Azure Active Directory][storage_ad] Other options for authentication include connection strings, shared key, shared access signatures (SAS), and anonymous public access. Use the appropriate client constructor function for the authentication mechanism you wish to use. For examples, see: * [Blob samples][samples] ## Key concepts Blob Storage is designed for: - Serving images or documents directly to a browser. - Storing files for distributed access. - Streaming video and audio. - Writing to log files. - Storing data for backup and restore, disaster recovery, and archiving. - Storing data for analysis by an on-premises or Azure-hosted service. Blob Storage offers three types of resources: - The _storage account_ - One or more _containers_ in a storage account - One or more _blobs_ in a container Instances of the `azblob.Client` type provide methods for manipulating containers and blobs within a storage account. The storage account is specified when the `azblob.Client` is constructed. ### Specialized clients The Azure Blob Storage client module for Go also provides specialized clients in various subpackages. Use these clients when you need to interact with a specific kind of blob. Learn more about [block blobs, append blobs, and page blobs](https://learn.microsoft.com/rest/api/storageservices/understanding-block-blobs--append-blobs--and-page-blobs). - [appendblob][append_blob] - [blockblob][block_blob] - [pageblob][page_blob] The [blob][blob] package contains APIs common to all blob types. This includes APIs for deleting and undeleting a blob, setting metadata, and more. The [lease][lease] package contains clients for managing leases on blobs and containers. See the [REST API reference](https://learn.microsoft.com/rest/api/storageservices/lease-blob#remarks) for general information on leases. The [container][container] package contains APIs specific to containers. This includes APIs for setting access policies or properties, and more. The [service][service] package contains APIs specific to the Blob service. This includes APIs for manipulating containers, retrieving account information, and more. The [sas][sas] package contains utilities to aid in the creation and manipulation of shared access signature (SAS) tokens. See the package's documentation for more information. ### Goroutine safety We guarantee that all client instance methods are goroutine-safe and independent of each other (see [guideline](https://azure.github.io/azure-sdk/golang_introduction.html#thread-safety)). This ensures that the recommendation to reuse client instances is always safe, even across goroutines. ### Blob metadata Blob metadata name-value pairs are valid HTTP headers and should adhere to all restrictions governing HTTP headers. Metadata names must be valid HTTP header names, may contain only ASCII characters, and should be treated as case-insensitive. Base64-encode or URL-encode metadata values containing non-ASCII characters. ### Additional concepts [Client options](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore/policy#ClientOptions) | [Accessing the response](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime#WithCaptureResponse) | [Handling failures](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore#ResponseError) | [Logging](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore/log) ## Examples ### Upload a blob ```go const ( account = "https://MYSTORAGEACCOUNT.blob.core.windows.net/" containerName = "sample-container" blobName = "sample-blob" sampleFile = "path/to/sample/file" ) // authenticate with Azure Active Directory cred, err := azidentity.NewDefaultAzureCredential(nil) // TODO: handle error // create a client for the specified storage account client, err := azblob.NewClient(account, cred, nil) // TODO: handle error // open the file for reading file, err := os.OpenFile(sampleFile, os.O_RDONLY, 0) // TODO: handle error defer file.Close() // upload the file to the specified container with the specified blob name _, err = client.UploadFile(context.TODO(), containerName, blobName, file, nil) // TODO: handle error ``` ### Download a blob ```go // this example accesses a public blob via anonymous access, so no credentials are required client, err := azblob.NewClientWithNoCredential("https://azurestoragesamples.blob.core.windows.net/", nil) // TODO: handle error // create or open a local file where we can download the blob file, err := os.Create("cloud.jpg") // TODO: handle error defer file.Close() // download the blob _, err = client.DownloadFile(context.TODO(), "samples", "cloud.jpg", file, nil) // TODO: handle error ``` ### Enumerate blobs ```go const ( account = "https://MYSTORAGEACCOUNT.blob.core.windows.net/" containerName = "sample-container" ) // authenticate with Azure Active Directory cred, err := azidentity.NewDefaultAzureCredential(nil) // TODO: handle error // create a client for the specified storage account client, err := azblob.NewClient(account, cred, nil) // TODO: handle error // blob listings are returned across multiple pages pager := client.NewListBlobsFlatPager(containerName, nil) // continue fetching pages until no more remain for pager.More() { // advance to the next page page, err := pager.NextPage(context.TODO()) // TODO: handle error // print the blob names for this page for _, blob := range page.Segment.BlobItems { fmt.Println(*blob.Name) } } ``` ## Troubleshooting All Blob service operations will return an [*azcore.ResponseError][azcore_response_error] on failure with a populated `ErrorCode` field. Many of these errors are recoverable. The [bloberror][blob_error] package provides the possible Storage error codes along with helper facilities for error handling. ```go const ( connectionString = "" containerName = "sample-container" ) // create a client with the provided connection string client, err := azblob.NewClientFromConnectionString(connectionString, nil) // TODO: handle error // try to delete the container, avoiding any potential race conditions with an in-progress or completed deletion _, err = client.DeleteContainer(context.TODO(), containerName, nil) if bloberror.HasCode(err, bloberror.ContainerBeingDeleted, bloberror.ContainerNotFound) { // ignore any errors if the container is being deleted or already has been deleted } else if err != nil { // TODO: some other error } ``` ## Next steps Get started with our [Blob samples][samples]. They contain complete examples of the above snippets and more. ## Contributing See the [Storage CONTRIBUTING.md][storage_contrib] for details on building, testing, and contributing to this library. This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit [cla.microsoft.com][cla]. This project has adopted the [Microsoft Open Source Code of Conduct][coc]. For more information see the [Code of Conduct FAQ][coc_faq] or contact [opencode@microsoft.com][coc_contact] with any additional questions or comments. [source]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob [docs]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob#section_documentation [rest_docs]: https://learn.microsoft.com/rest/api/storageservices/blob-service-rest-api [product_docs]: https://learn.microsoft.com/azure/storage/blobs/storage-blobs-overview [godevdl]: https://go.dev/dl/ [goget]: https://pkg.go.dev/cmd/go#hdr-Add_dependencies_to_current_module_and_install_them [go_samples]: https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main [storage_account_docs]: https://learn.microsoft.com/azure/storage/common/storage-account-overview [storage_account_create_ps]: https://learn.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-powershell [storage_account_create_cli]: https://learn.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-cli [storage_account_create_portal]: https://learn.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-portal [azure_cli]: https://learn.microsoft.com/cli/azure [azure_sub]: https://azure.microsoft.com/free/ [azidentity]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity [storage_ad]: https://learn.microsoft.com/azure/storage/common/storage-auth-aad [azcore_response_error]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore#ResponseError [samples]: https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/storage/azblob/examples_test.go [append_blob]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/appendblob/client.go [blob]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/blob/client.go [blob_error]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/bloberror/error_codes.go [block_blob]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/blockblob/client.go [container]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/container/client.go [lease]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/lease [page_blob]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/pageblob/client.go [sas]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/sas [service]: https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob/service/client.go [storage_contrib]: https://github.com/Azure/azure-sdk-for-go/blob/main/CONTRIBUTING.md [cla]: https://cla.microsoft.com [coc]: https://opensource.microsoft.com/codeofconduct/ [coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/ [coc_contact]: mailto:opencode@microsoft.com ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/appendblob/client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package appendblob import ( "context" "errors" "io" "os" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" ) // ClientOptions contains the optional parameters when creating a Client. type ClientOptions base.ClientOptions // Client represents a client to an Azure Storage append blob; type Client base.CompositeClient[generated.BlobClient, generated.AppendBlobClient] // NewClient creates an instance of Client with the specified values. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt // - cred - an Azure AD credential, typically obtained via the azidentity module // - options - client options; pass nil to accept the default values func NewClient(blobURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) { audience := base.GetAudience((*base.ClientOptions)(options)) conOptions := shared.GetClientOptions(options) authPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewAppendBlobClient(blobURL, azClient, nil)), nil } // NewClientWithNoCredential creates an instance of Client with the specified values. // This is used to anonymously access a blob or with a shared access signature (SAS) token. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt? // - options - client options; pass nil to accept the default values func NewClientWithNoCredential(blobURL string, options *ClientOptions) (*Client, error) { conOptions := shared.GetClientOptions(options) azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewAppendBlobClient(blobURL, azClient, nil)), nil } // NewClientWithSharedKeyCredential creates an instance of Client with the specified values. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt // - cred - a SharedKeyCredential created with the matching blob's storage account and access key // - options - client options; pass nil to accept the default values func NewClientWithSharedKeyCredential(blobURL string, cred *blob.SharedKeyCredential, options *ClientOptions) (*Client, error) { authPolicy := exported.NewSharedKeyCredPolicy(cred) conOptions := shared.GetClientOptions(options) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewAppendBlobClient(blobURL, azClient, cred)), nil } // NewClientFromConnectionString creates an instance of Client with the specified values. // - connectionString - a connection string for the desired storage account // - containerName - the name of the container within the storage account // - blobName - the name of the blob within the container // - options - client options; pass nil to accept the default values func NewClientFromConnectionString(connectionString, containerName, blobName string, options *ClientOptions) (*Client, error) { parsed, err := shared.ParseConnectionString(connectionString) if err != nil { return nil, err } parsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName, blobName) if parsed.AccountKey != "" && parsed.AccountName != "" { credential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey) if err != nil { return nil, err } return NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options) } return NewClientWithNoCredential(parsed.ServiceURL, options) } // BlobClient returns the embedded blob client for this AppendBlob client. func (ab *Client) BlobClient() *blob.Client { innerBlob, _ := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.AppendBlobClient])(ab)) return (*blob.Client)(innerBlob) } func (ab *Client) sharedKey() *blob.SharedKeyCredential { return base.SharedKeyComposite((*base.CompositeClient[generated.BlobClient, generated.AppendBlobClient])(ab)) } func (ab *Client) generated() *generated.AppendBlobClient { _, appendBlob := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.AppendBlobClient])(ab)) return appendBlob } func (ab *Client) innerBlobGenerated() *generated.BlobClient { b := ab.BlobClient() return base.InnerClient((*base.Client[generated.BlobClient])(b)) } // URL returns the URL endpoint used by the Client object. func (ab *Client) URL() string { return ab.generated().Endpoint() } // WithSnapshot creates a new AppendBlobURL object identical to the source but with the specified snapshot timestamp. // Pass "" to remove the snapshot returning a URL to the base blob. func (ab *Client) WithSnapshot(snapshot string) (*Client, error) { p, err := blob.ParseURL(ab.URL()) if err != nil { return nil, err } p.Snapshot = snapshot return (*Client)(base.NewAppendBlobClient(p.String(), ab.generated().InternalClient(), ab.sharedKey())), nil } // WithVersionID creates a new AppendBlobURL object identical to the source but with the specified version id. // Pass "" to remove the versionID returning a URL to the base blob. func (ab *Client) WithVersionID(versionID string) (*Client, error) { p, err := blob.ParseURL(ab.URL()) if err != nil { return nil, err } p.VersionID = versionID return (*Client)(base.NewAppendBlobClient(p.String(), ab.generated().InternalClient(), ab.sharedKey())), nil } // Create creates a 0-size append blob. Call AppendBlock to append data to an append blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. func (ab *Client) Create(ctx context.Context, o *CreateOptions) (CreateResponse, error) { opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions := o.format() resp, err := ab.generated().Create(ctx, 0, opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) return resp, err } // AppendBlock writes a stream to a new block of data to the end of the existing append blob. // This method panics if the stream is not at position 0. // Note that the http client closes the body stream after the request is sent to the service. // For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block. func (ab *Client) AppendBlock(ctx context.Context, body io.ReadSeekCloser, o *AppendBlockOptions) (AppendBlockResponse, error) { count, err := shared.ValidateSeekableStreamAt0AndGetCount(body) if err != nil { return AppendBlockResponse{}, nil } appendOptions, appendPositionAccessConditions, cpkInfo, cpkScope, modifiedAccessConditions, leaseAccessConditions := o.format() if o != nil && o.TransactionalValidation != nil { body, err = o.TransactionalValidation.Apply(body, appendOptions) if err != nil { return AppendBlockResponse{}, nil } } resp, err := ab.generated().AppendBlock(ctx, count, body, appendOptions, leaseAccessConditions, appendPositionAccessConditions, cpkInfo, cpkScope, modifiedAccessConditions) return resp, err } // AppendBlockFromURL copies a new block of data from source URL to the end of the existing append blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block-from-url. func (ab *Client) AppendBlockFromURL(ctx context.Context, source string, o *AppendBlockFromURLOptions) (AppendBlockFromURLResponse, error) { appendBlockFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, appendPositionAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions := o.format() // content length should be 0 on * from URL. always. It's a 400 if it isn't. resp, err := ab.generated().AppendBlockFromURL(ctx, source, 0, appendBlockFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, appendPositionAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) return resp, err } // Seal - The purpose of Append Blob Seal is to allow users and applications to seal append blobs, marking them as read only. // https://docs.microsoft.com/en-us/rest/api/storageservices/append-blob-seal func (ab *Client) Seal(ctx context.Context, o *SealOptions) (SealResponse, error) { leaseAccessConditions, modifiedAccessConditions, positionAccessConditions := o.format() resp, err := ab.generated().Seal(ctx, nil, leaseAccessConditions, modifiedAccessConditions, positionAccessConditions) return resp, err } // Delete marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection. // Note that deleting a blob also deletes all its snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob. func (ab *Client) Delete(ctx context.Context, o *blob.DeleteOptions) (blob.DeleteResponse, error) { return ab.BlobClient().Delete(ctx, o) } // Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob. func (ab *Client) Undelete(ctx context.Context, o *blob.UndeleteOptions) (blob.UndeleteResponse, error) { return ab.BlobClient().Undelete(ctx, o) } // SetImmutabilityPolicy operation enables users to set the immutability policy on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (ab *Client) SetImmutabilityPolicy(ctx context.Context, expiryTime time.Time, options *blob.SetImmutabilityPolicyOptions) (blob.SetImmutabilityPolicyResponse, error) { return ab.BlobClient().SetImmutabilityPolicy(ctx, expiryTime, options) } // DeleteImmutabilityPolicy operation enables users to delete the immutability policy on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (ab *Client) DeleteImmutabilityPolicy(ctx context.Context, options *blob.DeleteImmutabilityPolicyOptions) (blob.DeleteImmutabilityPolicyResponse, error) { return ab.BlobClient().DeleteImmutabilityPolicy(ctx, options) } // SetLegalHold operation enables users to set legal hold on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (ab *Client) SetLegalHold(ctx context.Context, legalHold bool, options *blob.SetLegalHoldOptions) (blob.SetLegalHoldResponse, error) { return ab.BlobClient().SetLegalHold(ctx, legalHold, options) } // SetTier // Deprecated: SetTier only works for page blob in premium storage account and block blob in blob storage account. func (ab *Client) SetTier(ctx context.Context, tier blob.AccessTier, o *blob.SetTierOptions) (blob.SetTierResponse, error) { return blob.SetTierResponse{}, errors.New("operation will not work on this blob type. SetTier only works for page blob in premium storage account and block blob in blob storage account") } // SetExpiry operation sets an expiry time on an existing blob. This operation is only allowed on Hierarchical Namespace enabled accounts. // For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-expiry func (ab *Client) SetExpiry(ctx context.Context, expiryType ExpiryType, o *SetExpiryOptions) (SetExpiryResponse, error) { if expiryType == nil { expiryType = ExpiryTypeNever{} } et, opts := expiryType.Format(o) resp, err := ab.innerBlobGenerated().SetExpiry(ctx, et, opts) return resp, err } // GetProperties returns the blob's properties. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties. func (ab *Client) GetProperties(ctx context.Context, o *blob.GetPropertiesOptions) (blob.GetPropertiesResponse, error) { return ab.BlobClient().GetProperties(ctx, o) } // GetAccountInfo provides account level information // For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures. func (ab *Client) GetAccountInfo(ctx context.Context, o *blob.GetAccountInfoOptions) (blob.GetAccountInfoResponse, error) { return ab.BlobClient().GetAccountInfo(ctx, o) } // SetHTTPHeaders changes a blob's HTTP headers. // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. func (ab *Client) SetHTTPHeaders(ctx context.Context, httpHeaders blob.HTTPHeaders, o *blob.SetHTTPHeadersOptions) (blob.SetHTTPHeadersResponse, error) { return ab.BlobClient().SetHTTPHeaders(ctx, httpHeaders, o) } // SetMetadata changes a blob's metadata. // https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata. func (ab *Client) SetMetadata(ctx context.Context, metadata map[string]*string, o *blob.SetMetadataOptions) (blob.SetMetadataResponse, error) { return ab.BlobClient().SetMetadata(ctx, metadata, o) } // CreateSnapshot creates a read-only snapshot of a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob. func (ab *Client) CreateSnapshot(ctx context.Context, o *blob.CreateSnapshotOptions) (blob.CreateSnapshotResponse, error) { return ab.BlobClient().CreateSnapshot(ctx, o) } // StartCopyFromURL copies the data at the source URL to a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob. func (ab *Client) StartCopyFromURL(ctx context.Context, copySource string, o *blob.StartCopyFromURLOptions) (blob.StartCopyFromURLResponse, error) { return ab.BlobClient().StartCopyFromURL(ctx, copySource, o) } // AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob. func (ab *Client) AbortCopyFromURL(ctx context.Context, copyID string, o *blob.AbortCopyFromURLOptions) (blob.AbortCopyFromURLResponse, error) { return ab.BlobClient().AbortCopyFromURL(ctx, copyID, o) } // SetTags operation enables users to set tags on a blob or specific blob version, but not snapshot. // Each call to this operation replaces all existing tags attached to the blob. // To remove all tags from the blob, call this operation with no tags set. // https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tags func (ab *Client) SetTags(ctx context.Context, tags map[string]string, o *blob.SetTagsOptions) (blob.SetTagsResponse, error) { return ab.BlobClient().SetTags(ctx, tags, o) } // GetTags operation enables users to get tags on a blob or specific blob version, or snapshot. // https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-tags func (ab *Client) GetTags(ctx context.Context, o *blob.GetTagsOptions) (blob.GetTagsResponse, error) { return ab.BlobClient().GetTags(ctx, o) } // CopyFromURL // Deprecated: CopyFromURL works only with block blob func (ab *Client) CopyFromURL(ctx context.Context, copySource string, o *blob.CopyFromURLOptions) (blob.CopyFromURLResponse, error) { return blob.CopyFromURLResponse{}, errors.New("operation will not work on this blob type. CopyFromURL works only with block blob") } // GetSASURL is a convenience method for generating a SAS token for the currently pointed at append blob. // It can only be used if the credential supplied during creation was a SharedKeyCredential. func (ab *Client) GetSASURL(permissions sas.BlobPermissions, expiry time.Time, o *blob.GetSASURLOptions) (string, error) { return ab.BlobClient().GetSASURL(permissions, expiry, o) } // Concurrent Download Functions ----------------------------------------------------------------------------------------- // DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob. func (ab *Client) DownloadStream(ctx context.Context, o *blob.DownloadStreamOptions) (blob.DownloadStreamResponse, error) { return ab.BlobClient().DownloadStream(ctx, o) } // DownloadBuffer downloads an Azure blob to a buffer with parallel. func (ab *Client) DownloadBuffer(ctx context.Context, buffer []byte, o *blob.DownloadBufferOptions) (int64, error) { return ab.BlobClient().DownloadBuffer(ctx, shared.NewBytesWriter(buffer), o) } // DownloadFile downloads an Azure blob to a local file. // The file would be truncated if the size doesn't match. func (ab *Client) DownloadFile(ctx context.Context, file *os.File, o *blob.DownloadFileOptions) (int64, error) { return ab.BlobClient().DownloadFile(ctx, file, o) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/appendblob/models.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package appendblob import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) // Type Declarations --------------------------------------------------------------------- // AppendPositionAccessConditions contains a group of parameters for the Client.AppendBlock method. type AppendPositionAccessConditions = generated.AppendPositionAccessConditions // Request Model Declaration ------------------------------------------------------------------------------------------- // CreateOptions provides set of configurations for Create Append Blob operation type CreateOptions struct { // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *blob.ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool AccessConditions *blob.AccessConditions HTTPHeaders *blob.HTTPHeaders CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo // Optional. Used to set blob tags in various blob operations. Tags map[string]string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs // are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source // blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. // See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata map[string]*string } func (o *CreateOptions) format() (*generated.AppendBlobClientCreateOptions, *generated.BlobHTTPHeaders, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil } options := generated.AppendBlobClientCreateOptions{ BlobTagsString: shared.SerializeBlobTagsToStrPtr(o.Tags), Metadata: o.Metadata, ImmutabilityPolicyExpiry: o.ImmutabilityPolicyExpiry, ImmutabilityPolicyMode: o.ImmutabilityPolicyMode, LegalHold: o.LegalHold, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &options, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // AppendBlockOptions contains the optional parameters for the Client.AppendBlock method. type AppendBlockOptions struct { // TransactionalValidation specifies the transfer validation type to use. // The default is nil (no transfer validation). TransactionalValidation blob.TransferValidationType AppendPositionAccessConditions *AppendPositionAccessConditions CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo AccessConditions *blob.AccessConditions } func (o *AppendBlockOptions) format() (*generated.AppendBlobClientAppendBlockOptions, *generated.AppendPositionAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &generated.AppendBlobClientAppendBlockOptions{}, o.AppendPositionAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions, leaseAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // AppendBlockFromURLOptions contains the optional parameters for the Client.AppendBlockFromURL method. type AppendBlockFromURLOptions struct { // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // SourceContentValidation contains the validation mechanism used on the range of bytes read from the source. SourceContentValidation blob.SourceContentValidationType AppendPositionAccessConditions *AppendPositionAccessConditions CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo SourceModifiedAccessConditions *blob.SourceModifiedAccessConditions AccessConditions *blob.AccessConditions // Range specifies a range of bytes. The default value is all bytes. Range blob.HTTPRange } func (o *AppendBlockFromURLOptions) format() (*generated.AppendBlobClientAppendBlockFromURLOptions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.LeaseAccessConditions, *generated.AppendPositionAccessConditions, *generated.ModifiedAccessConditions, *generated.SourceModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil, nil } options := &generated.AppendBlobClientAppendBlockFromURLOptions{ SourceRange: exported.FormatHTTPRange(o.Range), CopySourceAuthorization: o.CopySourceAuthorization, } if o.SourceContentValidation != nil { o.SourceContentValidation.Apply(options) } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return options, o.CPKInfo, o.CPKScopeInfo, leaseAccessConditions, o.AppendPositionAccessConditions, modifiedAccessConditions, o.SourceModifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // SealOptions provides set of configurations for SealAppendBlob operation type SealOptions struct { AccessConditions *blob.AccessConditions AppendPositionAccessConditions *AppendPositionAccessConditions } func (o *SealOptions) format() (*generated.LeaseAccessConditions, *generated.ModifiedAccessConditions, *generated.AppendPositionAccessConditions) { if o == nil { return nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return leaseAccessConditions, modifiedAccessConditions, o.AppendPositionAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // ExpiryType defines values for ExpiryType type ExpiryType = exported.ExpiryType // ExpiryTypeAbsolute defines the absolute time for the blob expiry type ExpiryTypeAbsolute = exported.ExpiryTypeAbsolute // ExpiryTypeRelativeToNow defines the duration relative to now for the blob expiry type ExpiryTypeRelativeToNow = exported.ExpiryTypeRelativeToNow // ExpiryTypeRelativeToCreation defines the duration relative to creation for the blob expiry type ExpiryTypeRelativeToCreation = exported.ExpiryTypeRelativeToCreation // ExpiryTypeNever defines that the blob will be set to never expire type ExpiryTypeNever = exported.ExpiryTypeNever // SetExpiryOptions contains the optional parameters for the Client.SetExpiry method. type SetExpiryOptions = exported.SetExpiryOptions ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/appendblob/responses.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package appendblob import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // CreateResponse contains the response from method Client.Create. type CreateResponse = generated.AppendBlobClientCreateResponse // AppendBlockResponse contains the response from method Client.AppendBlock. type AppendBlockResponse = generated.AppendBlobClientAppendBlockResponse // AppendBlockFromURLResponse contains the response from method Client.AppendBlockFromURL. type AppendBlockFromURLResponse = generated.AppendBlobClientAppendBlockFromURLResponse // SealResponse contains the response from method Client.Seal. type SealResponse = generated.AppendBlobClientSealResponse // SetExpiryResponse contains the response from method Client.SetExpiry. type SetExpiryResponse = generated.BlobClientSetExpiryResponse ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/assets.json ================================================ { "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", "Tag": "go/storage/azblob_db9a368fe4" } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blob import ( "context" "io" "os" "sync" "sync/atomic" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" ) // ClientOptions contains the optional parameters when creating a Client. type ClientOptions base.ClientOptions // Client represents a URL to an Azure Storage blob; the blob may be a block blob, append blob, or page blob. type Client base.Client[generated.BlobClient] // NewClient creates an instance of Client with the specified values. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt // - cred - an Azure AD credential, typically obtained via the azidentity module // - options - client options; pass nil to accept the default values func NewClient(blobURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) { audience := base.GetAudience((*base.ClientOptions)(options)) conOptions := shared.GetClientOptions(options) authPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewBlobClient(blobURL, azClient, &cred, (*base.ClientOptions)(conOptions))), nil } // NewClientWithNoCredential creates an instance of Client with the specified values. // This is used to anonymously access a blob or with a shared access signature (SAS) token. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt? // - options - client options; pass nil to accept the default values func NewClientWithNoCredential(blobURL string, options *ClientOptions) (*Client, error) { conOptions := shared.GetClientOptions(options) azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewBlobClient(blobURL, azClient, nil, (*base.ClientOptions)(conOptions))), nil } // NewClientWithSharedKeyCredential creates an instance of Client with the specified values. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt // - cred - a SharedKeyCredential created with the matching blob's storage account and access key // - options - client options; pass nil to accept the default values func NewClientWithSharedKeyCredential(blobURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error) { authPolicy := exported.NewSharedKeyCredPolicy(cred) conOptions := shared.GetClientOptions(options) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewBlobClient(blobURL, azClient, cred, (*base.ClientOptions)(conOptions))), nil } // NewClientFromConnectionString creates an instance of Client with the specified values. // - connectionString - a connection string for the desired storage account // - containerName - the name of the container within the storage account // - blobName - the name of the blob within the container // - options - client options; pass nil to accept the default values func NewClientFromConnectionString(connectionString, containerName, blobName string, options *ClientOptions) (*Client, error) { parsed, err := shared.ParseConnectionString(connectionString) if err != nil { return nil, err } parsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName, blobName) if parsed.AccountKey != "" && parsed.AccountName != "" { credential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey) if err != nil { return nil, err } return NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options) } return NewClientWithNoCredential(parsed.ServiceURL, options) } func (b *Client) generated() *generated.BlobClient { return base.InnerClient((*base.Client[generated.BlobClient])(b)) } func (b *Client) sharedKey() *SharedKeyCredential { return base.SharedKey((*base.Client[generated.BlobClient])(b)) } func (b *Client) credential() any { return base.Credential((*base.Client[generated.BlobClient])(b)) } func (b *Client) getClientOptions() *base.ClientOptions { return base.GetClientOptions((*base.Client[generated.BlobClient])(b)) } // URL returns the URL endpoint used by the Client object. func (b *Client) URL() string { return b.generated().Endpoint() } // WithSnapshot creates a new Client object identical to the source but with the specified snapshot timestamp. // Pass "" to remove the snapshot returning a URL to the base blob. func (b *Client) WithSnapshot(snapshot string) (*Client, error) { p, err := ParseURL(b.URL()) if err != nil { return nil, err } p.Snapshot = snapshot return (*Client)(base.NewBlobClient(p.String(), b.generated().InternalClient(), b.credential(), b.getClientOptions())), nil } // WithVersionID creates a new AppendBlobURL object identical to the source but with the specified version id. // Pass "" to remove the versionID returning a URL to the base blob. func (b *Client) WithVersionID(versionID string) (*Client, error) { p, err := ParseURL(b.URL()) if err != nil { return nil, err } p.VersionID = versionID return (*Client)(base.NewBlobClient(p.String(), b.generated().InternalClient(), b.credential(), b.getClientOptions())), nil } // Delete marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection. // Note that deleting a blob also deletes all its snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob. func (b *Client) Delete(ctx context.Context, o *DeleteOptions) (DeleteResponse, error) { deleteOptions, leaseInfo, accessConditions := o.format() resp, err := b.generated().Delete(ctx, deleteOptions, leaseInfo, accessConditions) return resp, err } // Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob. func (b *Client) Undelete(ctx context.Context, o *UndeleteOptions) (UndeleteResponse, error) { undeleteOptions := o.format() resp, err := b.generated().Undelete(ctx, undeleteOptions) return resp, err } // SetTier operation sets the tier on a blob. The operation is allowed on a page // blob in a premium storage account and on a block blob in a blob storage account (locally // redundant storage only). A premium page blob's tier determines the allowed size, IOPs, and // bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation // does not update the blob's ETag. // For detailed information about block blob level tiers see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers. func (b *Client) SetTier(ctx context.Context, tier AccessTier, o *SetTierOptions) (SetTierResponse, error) { opts, leaseAccessConditions, modifiedAccessConditions := o.format() resp, err := b.generated().SetTier(ctx, tier, opts, leaseAccessConditions, modifiedAccessConditions) return resp, err } // GetProperties returns the blob's properties. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties. func (b *Client) GetProperties(ctx context.Context, options *GetPropertiesOptions) (GetPropertiesResponse, error) { opts, leaseAccessConditions, cpkInfo, modifiedAccessConditions := options.format() resp, err := b.generated().GetProperties(ctx, opts, leaseAccessConditions, cpkInfo, modifiedAccessConditions) return resp, err } // SetHTTPHeaders changes a blob's HTTP headers. // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. func (b *Client) SetHTTPHeaders(ctx context.Context, httpHeaders HTTPHeaders, o *SetHTTPHeadersOptions) (SetHTTPHeadersResponse, error) { opts, leaseAccessConditions, modifiedAccessConditions := o.format() resp, err := b.generated().SetHTTPHeaders(ctx, opts, &httpHeaders, leaseAccessConditions, modifiedAccessConditions) return resp, err } // SetMetadata changes a blob's metadata. // https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata. func (b *Client) SetMetadata(ctx context.Context, metadata map[string]*string, o *SetMetadataOptions) (SetMetadataResponse, error) { basics := generated.BlobClientSetMetadataOptions{Metadata: metadata} leaseAccessConditions, cpkInfo, cpkScope, modifiedAccessConditions := o.format() resp, err := b.generated().SetMetadata(ctx, &basics, leaseAccessConditions, cpkInfo, cpkScope, modifiedAccessConditions) return resp, err } // CreateSnapshot creates a read-only snapshot of a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob. func (b *Client) CreateSnapshot(ctx context.Context, options *CreateSnapshotOptions) (CreateSnapshotResponse, error) { // CreateSnapshot does NOT panic if the user tries to create a snapshot using a URL that already has a snapshot query parameter // because checking this would be a performance hit for a VERY unusual path, and we don't think the common case should suffer this // performance hit. opts, cpkInfo, cpkScope, modifiedAccessConditions, leaseAccessConditions := options.format() resp, err := b.generated().CreateSnapshot(ctx, opts, cpkInfo, cpkScope, modifiedAccessConditions, leaseAccessConditions) return resp, err } // StartCopyFromURL copies the data at the source URL to a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob. func (b *Client) StartCopyFromURL(ctx context.Context, copySource string, options *StartCopyFromURLOptions) (StartCopyFromURLResponse, error) { opts, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions := options.format() resp, err := b.generated().StartCopyFromURL(ctx, copySource, opts, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions) return resp, err } // AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob. func (b *Client) AbortCopyFromURL(ctx context.Context, copyID string, options *AbortCopyFromURLOptions) (AbortCopyFromURLResponse, error) { opts, leaseAccessConditions := options.format() resp, err := b.generated().AbortCopyFromURL(ctx, copyID, opts, leaseAccessConditions) return resp, err } // SetTags operation enables users to set tags on a blob or specific blob version, but not snapshot. // Each call to this operation replaces all existing tags attached to the blob. // To remove all tags from the blob, call this operation with no tags set. // https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tags func (b *Client) SetTags(ctx context.Context, tags map[string]string, options *SetTagsOptions) (SetTagsResponse, error) { serializedTags := shared.SerializeBlobTags(tags) blobSetTagsOptions, modifiedAccessConditions, leaseAccessConditions := options.format() resp, err := b.generated().SetTags(ctx, *serializedTags, blobSetTagsOptions, modifiedAccessConditions, leaseAccessConditions) return resp, err } // GetTags operation enables users to get tags on a blob or specific blob version, or snapshot. // https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-tags func (b *Client) GetTags(ctx context.Context, options *GetTagsOptions) (GetTagsResponse, error) { blobGetTagsOptions, modifiedAccessConditions, leaseAccessConditions := options.format() resp, err := b.generated().GetTags(ctx, blobGetTagsOptions, modifiedAccessConditions, leaseAccessConditions) return resp, err } // SetImmutabilityPolicy operation enables users to set the immutability policy on a blob. Mode defaults to "Unlocked". // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (b *Client) SetImmutabilityPolicy(ctx context.Context, expiryTime time.Time, options *SetImmutabilityPolicyOptions) (SetImmutabilityPolicyResponse, error) { blobSetImmutabilityPolicyOptions, modifiedAccessConditions := options.format() blobSetImmutabilityPolicyOptions.ImmutabilityPolicyExpiry = &expiryTime resp, err := b.generated().SetImmutabilityPolicy(ctx, blobSetImmutabilityPolicyOptions, modifiedAccessConditions) return resp, err } // DeleteImmutabilityPolicy operation enables users to delete the immutability policy on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (b *Client) DeleteImmutabilityPolicy(ctx context.Context, options *DeleteImmutabilityPolicyOptions) (DeleteImmutabilityPolicyResponse, error) { deleteImmutabilityOptions := options.format() resp, err := b.generated().DeleteImmutabilityPolicy(ctx, deleteImmutabilityOptions) return resp, err } // SetLegalHold operation enables users to set legal hold on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (b *Client) SetLegalHold(ctx context.Context, legalHold bool, options *SetLegalHoldOptions) (SetLegalHoldResponse, error) { setLegalHoldOptions := options.format() resp, err := b.generated().SetLegalHold(ctx, legalHold, setLegalHoldOptions) return resp, err } // CopyFromURL synchronously copies the data at the source URL to a block blob, with sizes up to 256 MB. // For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url. func (b *Client) CopyFromURL(ctx context.Context, copySource string, options *CopyFromURLOptions) (CopyFromURLResponse, error) { copyOptions, smac, mac, lac, cpkScopeInfo := options.format() resp, err := b.generated().CopyFromURL(ctx, copySource, copyOptions, smac, mac, lac, cpkScopeInfo) return resp, err } // GetAccountInfo provides account level information // For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures. func (b *Client) GetAccountInfo(ctx context.Context, o *GetAccountInfoOptions) (GetAccountInfoResponse, error) { getAccountInfoOptions := o.format() resp, err := b.generated().GetAccountInfo(ctx, getAccountInfoOptions) return resp, err } // GetSASURL is a convenience method for generating a SAS token for the currently pointed at blob. // It can only be used if the credential supplied during creation was a SharedKeyCredential. func (b *Client) GetSASURL(permissions sas.BlobPermissions, expiry time.Time, o *GetSASURLOptions) (string, error) { if b.sharedKey() == nil { return "", bloberror.MissingSharedKeyCredential } urlParts, err := ParseURL(b.URL()) if err != nil { return "", err } t, err := time.Parse(SnapshotTimeFormat, urlParts.Snapshot) if err != nil { t = time.Time{} } st := o.format() qps, err := sas.BlobSignatureValues{ ContainerName: urlParts.ContainerName, BlobName: urlParts.BlobName, SnapshotTime: t, Version: sas.Version, Permissions: permissions.String(), StartTime: st, ExpiryTime: expiry.UTC(), }.SignWithSharedKey(b.sharedKey()) if err != nil { return "", err } endpoint := b.URL() + "?" + qps.Encode() return endpoint, nil } // Concurrent Download Functions ----------------------------------------------------------------------------------------- // downloadBuffer downloads an Azure blob to a WriterAt in parallel. func (b *Client) downloadBuffer(ctx context.Context, writer io.WriterAt, o downloadOptions) (int64, error) { if o.BlockSize == 0 { o.BlockSize = DefaultDownloadBlockSize } dataDownloaded := int64(0) computeReadLength := true count := o.Range.Count if count == CountToEnd { // If size not specified, calculate it // If we don't have the length at all, get it gr, err := b.GetProperties(ctx, o.getBlobPropertiesOptions()) if err != nil { return 0, err } count = *gr.ContentLength - o.Range.Offset dataDownloaded = count computeReadLength = false } if count <= 0 { // The file is empty, there is nothing to download. return 0, nil } // Prepare and do parallel download. progress := int64(0) progressLock := &sync.Mutex{} err := shared.DoBatchTransfer(ctx, &shared.BatchTransferOptions{ OperationName: "downloadBlobToWriterAt", TransferSize: count, ChunkSize: o.BlockSize, NumChunks: uint64(((count - 1) / o.BlockSize) + 1), Concurrency: o.Concurrency, Operation: func(ctx context.Context, chunkStart int64, count int64) error { downloadBlobOptions := o.getDownloadBlobOptions(HTTPRange{ Offset: chunkStart + o.Range.Offset, Count: count, }, nil) dr, err := b.DownloadStream(ctx, downloadBlobOptions) if err != nil { return err } var body io.ReadCloser = dr.NewRetryReader(ctx, &o.RetryReaderOptionsPerBlock) if o.Progress != nil { rangeProgress := int64(0) body = streaming.NewResponseProgress( body, func(bytesTransferred int64) { diff := bytesTransferred - rangeProgress rangeProgress = bytesTransferred progressLock.Lock() progress += diff o.Progress(progress) progressLock.Unlock() }) } _, err = io.Copy(shared.NewSectionWriter(writer, chunkStart, count), body) if err != nil { return err } if computeReadLength { atomic.AddInt64(&dataDownloaded, *dr.ContentLength) } err = body.Close() return err }, }) if err != nil { return 0, err } return dataDownloaded, nil } // DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob. func (b *Client) DownloadStream(ctx context.Context, o *DownloadStreamOptions) (DownloadStreamResponse, error) { downloadOptions, leaseAccessConditions, cpkInfo, modifiedAccessConditions := o.format() if o == nil { o = &DownloadStreamOptions{} } dr, err := b.generated().Download(ctx, downloadOptions, leaseAccessConditions, cpkInfo, modifiedAccessConditions) if err != nil { return DownloadStreamResponse{}, err } return DownloadStreamResponse{ client: b, DownloadResponse: dr, getInfo: httpGetterInfo{Range: o.Range, ETag: dr.ETag}, ObjectReplicationRules: deserializeORSPolicies(dr.ObjectReplicationRules), cpkInfo: o.CPKInfo, cpkScope: o.CPKScopeInfo, }, err } // DownloadBuffer downloads an Azure blob to a buffer with parallel. func (b *Client) DownloadBuffer(ctx context.Context, buffer []byte, o *DownloadBufferOptions) (int64, error) { if o == nil { o = &DownloadBufferOptions{} } return b.downloadBuffer(ctx, shared.NewBytesWriter(buffer), (downloadOptions)(*o)) } // DownloadFile downloads an Azure blob to a local file. // The file would be truncated if the size doesn't match. func (b *Client) DownloadFile(ctx context.Context, file *os.File, o *DownloadFileOptions) (int64, error) { if o == nil { o = &DownloadFileOptions{} } do := (*downloadOptions)(o) // 1. Calculate the size of the destination file var size int64 count := do.Range.Count if count == CountToEnd { // Try to get Azure blob's size getBlobPropertiesOptions := do.getBlobPropertiesOptions() props, err := b.GetProperties(ctx, getBlobPropertiesOptions) if err != nil { return 0, err } size = *props.ContentLength - do.Range.Offset do.Range.Count = size } else { size = count } // 2. Compare and try to resize local file's size if it doesn't match Azure blob's size. stat, err := file.Stat() if err != nil { return 0, err } if stat.Size() != size { if err = file.Truncate(size); err != nil { return 0, err } } if size > 0 { return b.downloadBuffer(ctx, file, *do) } else { // if the blob's size is 0, there is no need in downloading it return 0, nil } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blob import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) const ( CountToEnd = 0 SnapshotTimeFormat = exported.SnapshotTimeFormat // DefaultDownloadBlockSize is default block size DefaultDownloadBlockSize = int64(4 * 1024 * 1024) // 4MB // DefaultConcurrency is the default number of blocks downloaded or uploaded in parallel DefaultConcurrency = shared.DefaultConcurrency ) // BlobType defines values for BlobType type BlobType = generated.BlobType const ( BlobTypeBlockBlob BlobType = generated.BlobTypeBlockBlob BlobTypePageBlob BlobType = generated.BlobTypePageBlob BlobTypeAppendBlob BlobType = generated.BlobTypeAppendBlob ) // PossibleBlobTypeValues returns the possible values for the BlobType const type. func PossibleBlobTypeValues() []BlobType { return generated.PossibleBlobTypeValues() } // DeleteSnapshotsOptionType defines values for DeleteSnapshotsOptionType type DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionType const ( DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionTypeOnly DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeOnly ) // PossibleDeleteSnapshotsOptionTypeValues returns the possible values for the DeleteSnapshotsOptionType const type. func PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType { return generated.PossibleDeleteSnapshotsOptionTypeValues() } // AccessTier defines values for Blob Access Tier. type AccessTier = generated.AccessTier const ( AccessTierArchive AccessTier = generated.AccessTierArchive AccessTierCool AccessTier = generated.AccessTierCool AccessTierCold AccessTier = generated.AccessTierCold AccessTierHot AccessTier = generated.AccessTierHot AccessTierP10 AccessTier = generated.AccessTierP10 AccessTierP15 AccessTier = generated.AccessTierP15 AccessTierP20 AccessTier = generated.AccessTierP20 AccessTierP30 AccessTier = generated.AccessTierP30 AccessTierP4 AccessTier = generated.AccessTierP4 AccessTierP40 AccessTier = generated.AccessTierP40 AccessTierP50 AccessTier = generated.AccessTierP50 AccessTierP6 AccessTier = generated.AccessTierP6 AccessTierP60 AccessTier = generated.AccessTierP60 AccessTierP70 AccessTier = generated.AccessTierP70 AccessTierP80 AccessTier = generated.AccessTierP80 AccessTierPremium AccessTier = generated.AccessTierPremium ) // PossibleAccessTierValues returns the possible values for the AccessTier const type. func PossibleAccessTierValues() []AccessTier { return generated.PossibleAccessTierValues() } // RehydratePriority - If an object is in rehydrate pending state then this header is returned with priority of rehydrate. // Valid values are High and Standard. type RehydratePriority = generated.RehydratePriority const ( RehydratePriorityHigh RehydratePriority = generated.RehydratePriorityHigh RehydratePriorityStandard RehydratePriority = generated.RehydratePriorityStandard ) // PossibleRehydratePriorityValues returns the possible values for the RehydratePriority const type. func PossibleRehydratePriorityValues() []RehydratePriority { return generated.PossibleRehydratePriorityValues() } // ImmutabilityPolicyMode defines values for ImmutabilityPolicyMode type ImmutabilityPolicyMode = generated.ImmutabilityPolicyMode const ( ImmutabilityPolicyModeMutable ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeMutable ImmutabilityPolicyModeUnlocked ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeUnlocked ImmutabilityPolicyModeLocked ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeLocked ) // PossibleImmutabilityPolicyModeValues returns the possible values for the ImmutabilityPolicyMode const type. func PossibleImmutabilityPolicyModeValues() []ImmutabilityPolicyMode { return generated.PossibleImmutabilityPolicyModeValues() } // ImmutabilityPolicySetting returns the possible values for the ImmutabilityPolicySetting const type. type ImmutabilityPolicySetting = generated.ImmutabilityPolicySetting const ( ImmutabilityPolicySettingUnlocked ImmutabilityPolicySetting = generated.ImmutabilityPolicySettingUnlocked ImmutabilityPolicySettingLocked ImmutabilityPolicySetting = generated.ImmutabilityPolicySettingLocked ) // PossibleImmutabilityPolicySettingValues returns the possible values for the ImmutabilityPolicySetting const type. func PossibleImmutabilityPolicySettingValues() []ImmutabilityPolicySetting { return generated.PossibleImmutabilityPolicySettingValues() } // CopyStatusType defines values for CopyStatusType type CopyStatusType = generated.CopyStatusType const ( CopyStatusTypePending CopyStatusType = generated.CopyStatusTypePending CopyStatusTypeSuccess CopyStatusType = generated.CopyStatusTypeSuccess CopyStatusTypeAborted CopyStatusType = generated.CopyStatusTypeAborted CopyStatusTypeFailed CopyStatusType = generated.CopyStatusTypeFailed ) // PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type. func PossibleCopyStatusTypeValues() []CopyStatusType { return generated.PossibleCopyStatusTypeValues() } // EncryptionAlgorithmType defines values for EncryptionAlgorithmType. type EncryptionAlgorithmType = generated.EncryptionAlgorithmType const ( EncryptionAlgorithmTypeNone EncryptionAlgorithmType = generated.EncryptionAlgorithmTypeNone EncryptionAlgorithmTypeAES256 EncryptionAlgorithmType = generated.EncryptionAlgorithmTypeAES256 ) // PossibleEncryptionAlgorithmTypeValues returns the possible values for the EncryptionAlgorithmType const type. func PossibleEncryptionAlgorithmTypeValues() []EncryptionAlgorithmType { return generated.PossibleEncryptionAlgorithmTypeValues() } // ArchiveStatus defines values for ArchiveStatus. type ArchiveStatus = generated.ArchiveStatus const ( ArchiveStatusRehydratePendingToCool ArchiveStatus = generated.ArchiveStatusRehydratePendingToCool ArchiveStatusRehydratePendingToHot ArchiveStatus = generated.ArchiveStatusRehydratePendingToHot ArchiveStatusRehydratePendingToCold ArchiveStatus = generated.ArchiveStatusRehydratePendingToCold ) // PossibleArchiveStatusValues returns the possible values for the ArchiveStatus const type. func PossibleArchiveStatusValues() []ArchiveStatus { return generated.PossibleArchiveStatusValues() } // DeleteType defines values for DeleteType. type DeleteType = generated.DeleteType const ( DeleteTypeNone DeleteType = generated.DeleteTypeNone DeleteTypePermanent DeleteType = generated.DeleteTypePermanent ) // PossibleDeleteTypeValues returns the possible values for the DeleteType const type. func PossibleDeleteTypeValues() []DeleteType { return generated.PossibleDeleteTypeValues() } // QueryFormatType - The quick query format type. type QueryFormatType = generated.QueryFormatType const ( QueryFormatTypeDelimited QueryFormatType = generated.QueryFormatTypeDelimited QueryFormatTypeJSON QueryFormatType = generated.QueryFormatTypeJSON QueryFormatTypeArrow QueryFormatType = generated.QueryFormatTypeArrow QueryFormatTypeParquet QueryFormatType = generated.QueryFormatTypeParquet ) // PossibleQueryFormatTypeValues returns the possible values for the QueryFormatType const type. func PossibleQueryFormatTypeValues() []QueryFormatType { return generated.PossibleQueryFormatTypeValues() } // TransferValidationType abstracts the various mechanisms used to verify a transfer. type TransferValidationType = exported.TransferValidationType // TransferValidationTypeCRC64 is a TransferValidationType used to provide a precomputed CRC64. type TransferValidationTypeCRC64 = exported.TransferValidationTypeCRC64 // TransferValidationTypeComputeCRC64 is a TransferValidationType that indicates a CRC64 should be computed during transfer. func TransferValidationTypeComputeCRC64() TransferValidationType { return exported.TransferValidationTypeComputeCRC64() } // TransferValidationTypeMD5 is a TransferValidationType used to provide a precomputed MD5. type TransferValidationTypeMD5 = exported.TransferValidationTypeMD5 // SourceContentValidationType abstracts the various mechanisms used to validate source content. // This interface is not publicly implementable. type SourceContentValidationType interface { Apply(generated.SourceContentSetter) notPubliclyImplementable() } // SourceContentValidationTypeCRC64 is a SourceContentValidationType used to provide a precomputed CRC64. type SourceContentValidationTypeCRC64 []byte // Apply implements the SourceContentValidationType interface for type SourceContentValidationTypeCRC64. func (s SourceContentValidationTypeCRC64) Apply(src generated.SourceContentSetter) { src.SetSourceContentCRC64(s) } func (SourceContentValidationTypeCRC64) notPubliclyImplementable() {} var _ SourceContentValidationType = (SourceContentValidationTypeCRC64)(nil) // SourceContentValidationTypeMD5 is a SourceContentValidationType used to provide a precomputed MD5. type SourceContentValidationTypeMD5 []byte // Apply implements the SourceContentValidationType interface for type SourceContentValidationTypeMD5. func (s SourceContentValidationTypeMD5) Apply(src generated.SourceContentSetter) { src.SetSourceContentMD5(s) } func (SourceContentValidationTypeMD5) notPubliclyImplementable() {} var _ SourceContentValidationType = (SourceContentValidationTypeMD5)(nil) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/models.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blob import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) // SharedKeyCredential contains an account's name and its primary or secondary key. type SharedKeyCredential = exported.SharedKeyCredential // NewSharedKeyCredential creates an immutable SharedKeyCredential containing the // storage account's name and either its primary or secondary key. func NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) { return exported.NewSharedKeyCredential(accountName, accountKey) } // Type Declarations --------------------------------------------------------------------- // AccessConditions identifies blob-specific access conditions which you optionally set. type AccessConditions = exported.BlobAccessConditions // LeaseAccessConditions contains optional parameters to access leased entity. type LeaseAccessConditions = exported.LeaseAccessConditions // ModifiedAccessConditions contains a group of parameters for specifying access conditions. type ModifiedAccessConditions = exported.ModifiedAccessConditions // CPKInfo contains a group of parameters for client provided encryption key. type CPKInfo = generated.CPKInfo // CPKScopeInfo contains a group of parameters for client provided encryption scope. type CPKScopeInfo = generated.CPKScopeInfo // HTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method. type HTTPHeaders = generated.BlobHTTPHeaders // SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL method. type SourceModifiedAccessConditions = generated.SourceModifiedAccessConditions // Tags represent map of blob index tags type Tags = generated.BlobTag // HTTPRange defines a range of bytes within an HTTP resource, starting at offset and // ending at offset+count. A zero-value HTTPRange indicates the entire resource. An HTTPRange // which has an offset and zero value count indicates from the offset to the resource's end. type HTTPRange = exported.HTTPRange // Request Model Declaration ------------------------------------------------------------------------------------------- // DownloadStreamOptions contains the optional parameters for the Client.Download method. type DownloadStreamOptions struct { // When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the // range is less than or equal to 4 MB in size. RangeGetContentMD5 *bool // Range specifies a range of bytes. The default value is all bytes. Range HTTPRange AccessConditions *AccessConditions CPKInfo *CPKInfo CPKScopeInfo *CPKScopeInfo } func (o *DownloadStreamOptions) format() (*generated.BlobClientDownloadOptions, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil } basics := generated.BlobClientDownloadOptions{ RangeGetContentMD5: o.RangeGetContentMD5, Range: exported.FormatHTTPRange(o.Range), } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &basics, leaseAccessConditions, o.CPKInfo, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // downloadOptions contains common options used by the DownloadBuffer and DownloadFile functions. type downloadOptions struct { // Range specifies a range of bytes. The default value is all bytes. Range HTTPRange // BlockSize specifies the block size to use for each parallel download; the default size is DefaultDownloadBlockSize. BlockSize int64 // Progress is a function that is invoked periodically as bytes are received. Progress func(bytesTransferred int64) // BlobAccessConditions indicates the access conditions used when making HTTP GET requests against the blob. AccessConditions *AccessConditions // ClientProvidedKeyOptions indicates the client provided key by name and/or by value to encrypt/decrypt data. CPKInfo *CPKInfo CPKScopeInfo *CPKScopeInfo // Concurrency indicates the maximum number of blocks to download in parallel (0=default). Concurrency uint16 // RetryReaderOptionsPerBlock is used when downloading each block. RetryReaderOptionsPerBlock RetryReaderOptions } func (o *downloadOptions) getBlobPropertiesOptions() *GetPropertiesOptions { if o == nil { return nil } return &GetPropertiesOptions{ AccessConditions: o.AccessConditions, CPKInfo: o.CPKInfo, } } func (o *downloadOptions) getDownloadBlobOptions(rnge HTTPRange, rangeGetContentMD5 *bool) *DownloadStreamOptions { if o == nil { return nil } return &DownloadStreamOptions{ AccessConditions: o.AccessConditions, CPKInfo: o.CPKInfo, CPKScopeInfo: o.CPKScopeInfo, Range: rnge, RangeGetContentMD5: rangeGetContentMD5, } } // DownloadBufferOptions contains the optional parameters for the DownloadBuffer method. type DownloadBufferOptions struct { // Range specifies a range of bytes. The default value is all bytes. Range HTTPRange // BlockSize specifies the block size to use for each parallel download; the default size is DefaultDownloadBlockSize. BlockSize int64 // Progress is a function that is invoked periodically as bytes are received. Progress func(bytesTransferred int64) // BlobAccessConditions indicates the access conditions used when making HTTP GET requests against the blob. AccessConditions *AccessConditions // CPKInfo contains a group of parameters for client provided encryption key. CPKInfo *CPKInfo // CPKScopeInfo contains a group of parameters for client provided encryption scope. CPKScopeInfo *CPKScopeInfo // Concurrency indicates the maximum number of blocks to download in parallel (0=default). Concurrency uint16 // RetryReaderOptionsPerBlock is used when downloading each block. RetryReaderOptionsPerBlock RetryReaderOptions } // DownloadFileOptions contains the optional parameters for the DownloadFile method. type DownloadFileOptions struct { // Range specifies a range of bytes. The default value is all bytes. Range HTTPRange // BlockSize specifies the block size to use for each parallel download; the default size is DefaultDownloadBlockSize. BlockSize int64 // Progress is a function that is invoked periodically as bytes are received. Progress func(bytesTransferred int64) // BlobAccessConditions indicates the access conditions used when making HTTP GET requests against the blob. AccessConditions *AccessConditions // ClientProvidedKeyOptions indicates the client provided key by name and/or by value to encrypt/decrypt data. CPKInfo *CPKInfo CPKScopeInfo *CPKScopeInfo // Concurrency indicates the maximum number of blocks to download in parallel. The default value is 5. Concurrency uint16 // RetryReaderOptionsPerBlock is used when downloading each block. RetryReaderOptionsPerBlock RetryReaderOptions } // --------------------------------------------------------------------------------------------------------------------- // DeleteOptions contains the optional parameters for the Client.Delete method. type DeleteOptions struct { // Required if the blob has associated snapshots. Specify one of the following two options: include: Delete the base blob // and all of its snapshots. only: Delete only the blob's snapshots and not the blob itself. DeleteSnapshots *DeleteSnapshotsOptionType AccessConditions *AccessConditions // Setting DeleteType to DeleteTypePermanent will permanently delete soft-delete snapshot and/or version blobs. // WARNING: This is a dangerous operation and should not be used unless you know the implications. Please proceed // with caution. // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob BlobDeleteType *DeleteType } func (o *DeleteOptions) format() (*generated.BlobClientDeleteOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } basics := generated.BlobClientDeleteOptions{ DeleteSnapshots: o.DeleteSnapshots, DeleteType: o.BlobDeleteType, // None by default } if o.AccessConditions == nil { return &basics, nil, nil } return &basics, o.AccessConditions.LeaseAccessConditions, o.AccessConditions.ModifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // UndeleteOptions contains the optional parameters for the Client.Undelete method. type UndeleteOptions struct { // placeholder for future options } func (o *UndeleteOptions) format() *generated.BlobClientUndeleteOptions { return nil } // --------------------------------------------------------------------------------------------------------------------- // SetTierOptions contains the optional parameters for the Client.SetTier method. type SetTierOptions struct { // Optional: Indicates the priority with which to rehydrate an archived blob. RehydratePriority *RehydratePriority AccessConditions *AccessConditions } func (o *SetTierOptions) format() (*generated.BlobClientSetTierOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &generated.BlobClientSetTierOptions{RehydratePriority: o.RehydratePriority}, leaseAccessConditions, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // GetPropertiesOptions contains the optional parameters for the Client.GetProperties method type GetPropertiesOptions struct { AccessConditions *AccessConditions CPKInfo *CPKInfo } func (o *GetPropertiesOptions) format() (*generated.BlobClientGetPropertiesOptions, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return nil, leaseAccessConditions, o.CPKInfo, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // SetHTTPHeadersOptions contains the optional parameters for the Client.SetHTTPHeaders method. type SetHTTPHeadersOptions struct { AccessConditions *AccessConditions } func (o *SetHTTPHeadersOptions) format() (*generated.BlobClientSetHTTPHeadersOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return nil, leaseAccessConditions, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // SetMetadataOptions provides set of configurations for Set Metadata on blob operation type SetMetadataOptions struct { AccessConditions *AccessConditions CPKInfo *CPKInfo CPKScopeInfo *CPKScopeInfo } func (o *SetMetadataOptions) format() (*generated.LeaseAccessConditions, *CPKInfo, *CPKScopeInfo, *ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // CreateSnapshotOptions contains the optional parameters for the Client.CreateSnapshot method. type CreateSnapshotOptions struct { Metadata map[string]*string AccessConditions *AccessConditions CPKInfo *CPKInfo CPKScopeInfo *CPKScopeInfo } func (o *CreateSnapshotOptions) format() (*generated.BlobClientCreateSnapshotOptions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions) { if o == nil { return nil, nil, nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &generated.BlobClientCreateSnapshotOptions{ Metadata: o.Metadata, }, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions, leaseAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // StartCopyFromURLOptions contains the optional parameters for the Client.StartCopyFromURL method. type StartCopyFromURLOptions struct { // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool // Optional. Used to set blob tags in various blob operations. BlobTags map[string]string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs // are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source // blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. // See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata map[string]*string // Optional: Indicates the priority with which to rehydrate an archived blob. RehydratePriority *RehydratePriority // Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer. SealBlob *bool // Optional. Indicates the tier to be set on the blob. Tier *AccessTier SourceModifiedAccessConditions *SourceModifiedAccessConditions AccessConditions *AccessConditions } func (o *StartCopyFromURLOptions) format() (*generated.BlobClientStartCopyFromURLOptions, *generated.SourceModifiedAccessConditions, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions) { if o == nil { return nil, nil, nil, nil } basics := generated.BlobClientStartCopyFromURLOptions{ BlobTagsString: shared.SerializeBlobTagsToStrPtr(o.BlobTags), Metadata: o.Metadata, RehydratePriority: o.RehydratePriority, SealBlob: o.SealBlob, Tier: o.Tier, ImmutabilityPolicyExpiry: o.ImmutabilityPolicyExpiry, ImmutabilityPolicyMode: o.ImmutabilityPolicyMode, LegalHold: o.LegalHold, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &basics, o.SourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // AbortCopyFromURLOptions contains the optional parameters for the Client.AbortCopyFromURL method. type AbortCopyFromURLOptions struct { LeaseAccessConditions *LeaseAccessConditions } func (o *AbortCopyFromURLOptions) format() (*generated.BlobClientAbortCopyFromURLOptions, *generated.LeaseAccessConditions) { if o == nil { return nil, nil } return nil, o.LeaseAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // SetTagsOptions contains the optional parameters for the Client.SetTags method. type SetTagsOptions struct { // The version id parameter is an opaque DateTime value that, when present, // specifies the version of the blob to operate on. It's for service version 2019-10-10 and newer. VersionID *string // Optional header, Specifies the transactional crc64 for the body, to be validated by the service. TransactionalContentCRC64 []byte // Optional header, Specifies the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte AccessConditions *AccessConditions } func (o *SetTagsOptions) format() (*generated.BlobClientSetTagsOptions, *ModifiedAccessConditions, *generated.LeaseAccessConditions) { if o == nil { return nil, nil, nil } options := &generated.BlobClientSetTagsOptions{ TransactionalContentMD5: o.TransactionalContentMD5, TransactionalContentCRC64: o.TransactionalContentCRC64, VersionID: o.VersionID, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return options, modifiedAccessConditions, leaseAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // GetTagsOptions contains the optional parameters for the Client.GetTags method. type GetTagsOptions struct { // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. Snapshot *string // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string BlobAccessConditions *AccessConditions } func (o *GetTagsOptions) format() (*generated.BlobClientGetTagsOptions, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions) { if o == nil { return nil, nil, nil } options := &generated.BlobClientGetTagsOptions{ Snapshot: o.Snapshot, VersionID: o.VersionID, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.BlobAccessConditions) return options, modifiedAccessConditions, leaseAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // SetImmutabilityPolicyOptions contains the parameter for Client.SetImmutabilityPolicy type SetImmutabilityPolicyOptions struct { // Specifies the immutability policy mode to set on the blob. Possible values to set include: "Locked", "Unlocked". // "Mutable" can only be returned by service, don't set to "Mutable". If mode is not set - it will default to Unlocked. Mode *ImmutabilityPolicySetting ModifiedAccessConditions *ModifiedAccessConditions } func (o *SetImmutabilityPolicyOptions) format() (*generated.BlobClientSetImmutabilityPolicyOptions, *ModifiedAccessConditions) { if o == nil { return &generated.BlobClientSetImmutabilityPolicyOptions{}, nil } ac := &exported.BlobAccessConditions{ ModifiedAccessConditions: o.ModifiedAccessConditions, } _, modifiedAccessConditions := exported.FormatBlobAccessConditions(ac) options := &generated.BlobClientSetImmutabilityPolicyOptions{ ImmutabilityPolicyMode: o.Mode, } return options, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // DeleteImmutabilityPolicyOptions contains the optional parameters for the Client.DeleteImmutabilityPolicy method. type DeleteImmutabilityPolicyOptions struct { // placeholder for future options } func (o *DeleteImmutabilityPolicyOptions) format() *generated.BlobClientDeleteImmutabilityPolicyOptions { return nil } // --------------------------------------------------------------------------------------------------------------------- // SetLegalHoldOptions contains the optional parameters for the Client.SetLegalHold method. type SetLegalHoldOptions struct { // placeholder for future options } func (o *SetLegalHoldOptions) format() *generated.BlobClientSetLegalHoldOptions { return nil } // --------------------------------------------------------------------------------------------------------------------- // GetSASURLOptions contains the optional parameters for the Client.GetSASURL method. type GetSASURLOptions struct { StartTime *time.Time } func (o *GetSASURLOptions) format() time.Time { if o == nil { return time.Time{} } var st time.Time if o.StartTime != nil { st = o.StartTime.UTC() } else { st = time.Time{} } return st } // --------------------------------------------------------------------------------------------------------------------- // CopyFromURLOptions contains the optional parameters for the Client.CopyFromURL method. type CopyFromURLOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTags map[string]string // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Specify the md5 calculated for the range of bytes that must be read from the copy source. SourceContentMD5 []byte // Optional. Indicates the tier to be set on the blob. Tier *AccessTier SourceModifiedAccessConditions *SourceModifiedAccessConditions BlobAccessConditions *AccessConditions CPKScopeInfo *CPKScopeInfo } func (o *CopyFromURLOptions) format() (*generated.BlobClientCopyFromURLOptions, *generated.SourceModifiedAccessConditions, *generated.ModifiedAccessConditions, *generated.LeaseAccessConditions, *generated.CPKScopeInfo) { if o == nil { return nil, nil, nil, nil, nil } options := &generated.BlobClientCopyFromURLOptions{ BlobTagsString: shared.SerializeBlobTagsToStrPtr(o.BlobTags), CopySourceAuthorization: o.CopySourceAuthorization, ImmutabilityPolicyExpiry: o.ImmutabilityPolicyExpiry, ImmutabilityPolicyMode: o.ImmutabilityPolicyMode, LegalHold: o.LegalHold, Metadata: o.Metadata, SourceContentMD5: o.SourceContentMD5, Tier: o.Tier, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.BlobAccessConditions) return options, o.SourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions, o.CPKScopeInfo } // --------------------------------------------------------------------------------------------------------------------- // GetAccountInfoOptions provides set of options for Client.GetAccountInfo type GetAccountInfoOptions struct { // placeholder for future options } func (o *GetAccountInfoOptions) format() *generated.BlobClientGetAccountInfoOptions { return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/responses.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blob import ( "context" "io" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // DownloadResponse contains the response from method BlobClient.Download. type DownloadResponse = generated.BlobClientDownloadResponse // DownloadStreamResponse contains the response from the DownloadStream method. // To read from the stream, read from the Body field, or call the NewRetryReader method. type DownloadStreamResponse struct { DownloadResponse ObjectReplicationRules []ObjectReplicationPolicy client *Client getInfo httpGetterInfo cpkInfo *CPKInfo cpkScope *CPKScopeInfo } // NewRetryReader constructs new RetryReader stream for reading data. If a connection fails while // reading, it will make additional requests to reestablish a connection and continue reading. // Pass nil for options to accept the default options. // Callers of this method should not access the DownloadStreamResponse.Body field. func (r *DownloadStreamResponse) NewRetryReader(ctx context.Context, options *RetryReaderOptions) *RetryReader { if options == nil { options = &RetryReaderOptions{} } return newRetryReader(ctx, r.Body, r.getInfo, func(ctx context.Context, getInfo httpGetterInfo) (io.ReadCloser, error) { accessConditions := &AccessConditions{ ModifiedAccessConditions: &ModifiedAccessConditions{IfMatch: getInfo.ETag}, } options := DownloadStreamOptions{ Range: getInfo.Range, AccessConditions: accessConditions, CPKInfo: r.cpkInfo, CPKScopeInfo: r.cpkScope, } resp, err := r.client.DownloadStream(ctx, &options) if err != nil { return nil, err } return resp.Body, err }, *options) } // DeleteResponse contains the response from method BlobClient.Delete. type DeleteResponse = generated.BlobClientDeleteResponse // UndeleteResponse contains the response from method BlobClient.Undelete. type UndeleteResponse = generated.BlobClientUndeleteResponse // SetTierResponse contains the response from method BlobClient.SetTier. type SetTierResponse = generated.BlobClientSetTierResponse // GetPropertiesResponse contains the response from method BlobClient.GetProperties. type GetPropertiesResponse = generated.BlobClientGetPropertiesResponse // SetHTTPHeadersResponse contains the response from method BlobClient.SetHTTPHeaders. type SetHTTPHeadersResponse = generated.BlobClientSetHTTPHeadersResponse // SetMetadataResponse contains the response from method BlobClient.SetMetadata. type SetMetadataResponse = generated.BlobClientSetMetadataResponse // CreateSnapshotResponse contains the response from method BlobClient.CreateSnapshot. type CreateSnapshotResponse = generated.BlobClientCreateSnapshotResponse // StartCopyFromURLResponse contains the response from method BlobClient.StartCopyFromURL. type StartCopyFromURLResponse = generated.BlobClientStartCopyFromURLResponse // AbortCopyFromURLResponse contains the response from method BlobClient.AbortCopyFromURL. type AbortCopyFromURLResponse = generated.BlobClientAbortCopyFromURLResponse // SetTagsResponse contains the response from method BlobClient.SetTags. type SetTagsResponse = generated.BlobClientSetTagsResponse // GetTagsResponse contains the response from method BlobClient.GetTags. type GetTagsResponse = generated.BlobClientGetTagsResponse // SetImmutabilityPolicyResponse contains the response from method BlobClient.SetImmutabilityPolicy. type SetImmutabilityPolicyResponse = generated.BlobClientSetImmutabilityPolicyResponse // DeleteImmutabilityPolicyResponse contains the response from method BlobClient.DeleteImmutabilityPolicyResponse. type DeleteImmutabilityPolicyResponse = generated.BlobClientDeleteImmutabilityPolicyResponse // SetLegalHoldResponse contains the response from method BlobClient.SetLegalHold. type SetLegalHoldResponse = generated.BlobClientSetLegalHoldResponse // CopyFromURLResponse contains the response from method BlobClient.CopyFromURL. type CopyFromURLResponse = generated.BlobClientCopyFromURLResponse // GetAccountInfoResponse contains the response from method BlobClient.GetAccountInfo. type GetAccountInfoResponse = generated.BlobClientGetAccountInfoResponse // AcquireLeaseResponse contains the response from method BlobClient.AcquireLease. type AcquireLeaseResponse = generated.BlobClientAcquireLeaseResponse // BreakLeaseResponse contains the response from method BlobClient.BreakLease. type BreakLeaseResponse = generated.BlobClientBreakLeaseResponse // ChangeLeaseResponse contains the response from method BlobClient.ChangeLease. type ChangeLeaseResponse = generated.BlobClientChangeLeaseResponse // ReleaseLeaseResponse contains the response from method BlobClient.ReleaseLease. type ReleaseLeaseResponse = generated.BlobClientReleaseLeaseResponse // RenewLeaseResponse contains the response from method BlobClient.RenewLease. type RenewLeaseResponse = generated.BlobClientRenewLeaseResponse ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/retry_reader.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blob import ( "context" "io" "net" "strings" "sync" "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) // HTTPGetter is a function type that refers to a method that performs an HTTP GET operation. type httpGetter func(ctx context.Context, i httpGetterInfo) (io.ReadCloser, error) // HTTPGetterInfo is passed to an HTTPGetter function passing it parameters // that should be used to make an HTTP GET request. type httpGetterInfo struct { Range HTTPRange // ETag specifies the resource's etag that should be used when creating // the HTTP GET request's If-Match header ETag *azcore.ETag } // RetryReaderOptions configures the retry reader's behavior. // Zero-value fields will have their specified default values applied during use. // This allows for modification of a subset of fields. type RetryReaderOptions struct { // MaxRetries specifies the maximum number of attempts a failed read will be retried // before producing an error. // The default value is three. MaxRetries int32 // OnFailedRead, when non-nil, is called after any failure to read. Expected usage is diagnostic logging. OnFailedRead func(failureCount int32, lastError error, rnge HTTPRange, willRetry bool) // EarlyCloseAsError can be set to true to prevent retries after "read on closed response body". By default, // retryReader has the following special behaviour: closing the response body before it is all read is treated as a // retryable error. This is to allow callers to force a retry by closing the body from another goroutine (e.g. if the = // read is too slow, caller may want to force a retry in the hope that the retry will be quicker). If // TreatEarlyCloseAsError is true, then retryReader's special behaviour is suppressed, and "read on closed body" is instead // treated as a fatal (non-retryable) error. // Note that setting TreatEarlyCloseAsError only guarantees that Closing will produce a fatal error if the Close happens // from the same "thread" (goroutine) as Read. Concurrent Close calls from other goroutines may instead produce network errors // which will be retried. // The default value is false. EarlyCloseAsError bool doInjectError bool doInjectErrorRound int32 injectedError error } // RetryReader attempts to read from response, and if there is a retry-able network error // returned during reading, it will retry according to retry reader option through executing // user defined action with provided data to get a new response, and continue the overall reading process // through reading from the new response. // RetryReader implements the io.ReadCloser interface. type RetryReader struct { ctx context.Context info httpGetterInfo retryReaderOptions RetryReaderOptions getter httpGetter countWasBounded bool // we support Close-ing during Reads (from other goroutines), so we protect the shared state, which is response responseMu *sync.Mutex response io.ReadCloser } // newRetryReader creates a retry reader. func newRetryReader(ctx context.Context, initialResponse io.ReadCloser, info httpGetterInfo, getter httpGetter, o RetryReaderOptions) *RetryReader { if o.MaxRetries < 1 { o.MaxRetries = 3 } return &RetryReader{ ctx: ctx, getter: getter, info: info, countWasBounded: info.Range.Count != CountToEnd, response: initialResponse, responseMu: &sync.Mutex{}, retryReaderOptions: o, } } // setResponse function func (s *RetryReader) setResponse(r io.ReadCloser) { s.responseMu.Lock() defer s.responseMu.Unlock() s.response = r } // Read from retry reader func (s *RetryReader) Read(p []byte) (n int, err error) { for try := int32(0); ; try++ { if s.countWasBounded && s.info.Range.Count == CountToEnd { // User specified an original count and the remaining bytes are 0, return 0, EOF return 0, io.EOF } s.responseMu.Lock() resp := s.response s.responseMu.Unlock() if resp == nil { // We don't have a response stream to read from, try to get one. newResponse, err := s.getter(s.ctx, s.info) if err != nil { return 0, err } // Successful GET; this is the network stream we'll read from. s.setResponse(newResponse) resp = newResponse } n, err := resp.Read(p) // Read from the stream (this will return non-nil err if forceRetry is called, from another goroutine, while it is running) // Injection mechanism for testing. if s.retryReaderOptions.doInjectError && try == s.retryReaderOptions.doInjectErrorRound { if s.retryReaderOptions.injectedError != nil { err = s.retryReaderOptions.injectedError } else { err = &net.DNSError{IsTemporary: true} } } // We successfully read data or end EOF. if err == nil || err == io.EOF { s.info.Range.Offset += int64(n) // Increments the start offset in case we need to make a new HTTP request in the future if s.info.Range.Count != CountToEnd { s.info.Range.Count -= int64(n) // Decrement the count in case we need to make a new HTTP request in the future } return n, err // Return the return to the caller } _ = s.Close() s.setResponse(nil) // Our stream is no longer good // Check the retry count and error code, and decide whether to retry. retriesExhausted := try >= s.retryReaderOptions.MaxRetries _, isNetError := err.(net.Error) isUnexpectedEOF := err == io.ErrUnexpectedEOF willRetry := (isNetError || isUnexpectedEOF || s.wasRetryableEarlyClose(err)) && !retriesExhausted // Notify, for logging purposes, of any failures if s.retryReaderOptions.OnFailedRead != nil { failureCount := try + 1 // because try is zero-based s.retryReaderOptions.OnFailedRead(failureCount, err, s.info.Range, willRetry) } if willRetry { continue // Loop around and try to get and read from new stream. } return n, err // Not retryable, or retries exhausted, so just return } } // By default, we allow early Closing, from another concurrent goroutine, to be used to force a retry // Is this safe, to close early from another goroutine? Early close ultimately ends up calling // net.Conn.Close, and that is documented as "Any blocked Read or Write operations will be unblocked and return errors" // which is exactly the behaviour we want. // NOTE: that if caller has forced an early Close from a separate goroutine (separate from the Read) // then there are two different types of error that may happen - either the one we check for here, // or a net.Error (due to closure of connection). Which one happens depends on timing. We only need this routine // to check for one, since the other is a net.Error, which our main Read retry loop is already handing. func (s *RetryReader) wasRetryableEarlyClose(err error) bool { if s.retryReaderOptions.EarlyCloseAsError { return false // user wants all early closes to be errors, and so not retryable } // unfortunately, http.errReadOnClosedResBody is private, so the best we can do here is to check for its text return strings.HasSuffix(err.Error(), ReadOnClosedBodyMessage) } // ReadOnClosedBodyMessage of retry reader const ReadOnClosedBodyMessage = "read on closed response body" // Close retry reader func (s *RetryReader) Close() error { s.responseMu.Lock() defer s.responseMu.Unlock() if s.response != nil { return s.response.Close() } return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob/utils.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blob import ( "strings" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" ) // ObjectReplicationRules struct type ObjectReplicationRules struct { RuleID string Status string } // ObjectReplicationPolicy are deserialized attributes. type ObjectReplicationPolicy struct { PolicyID *string Rules *[]ObjectReplicationRules } // deserializeORSPolicies is utility function to deserialize ORS Policies. func deserializeORSPolicies(policies map[string]*string) (objectReplicationPolicies []ObjectReplicationPolicy) { if policies == nil { return nil } // For source blobs (blobs that have policy ids and rule ids applied to them), // the header will be formatted as "x-ms-or-_: {Complete, Failed}". // The value of this header is the status of the replication. orPolicyStatusHeader := make(map[string]*string) for key, value := range policies { if strings.Contains(key, "or-") && key != "x-ms-or-policy-id" { orPolicyStatusHeader[key] = value } } parsedResult := make(map[string][]ObjectReplicationRules) for key, value := range orPolicyStatusHeader { policyAndRuleIDs := strings.Split(strings.Split(key, "or-")[1], "_") policyId, ruleId := policyAndRuleIDs[0], policyAndRuleIDs[1] parsedResult[policyId] = append(parsedResult[policyId], ObjectReplicationRules{RuleID: ruleId, Status: *value}) } for policyId, rules := range parsedResult { objectReplicationPolicies = append(objectReplicationPolicies, ObjectReplicationPolicy{ PolicyID: &policyId, Rules: &rules, }) } return } // ParseHTTPHeaders parses GetPropertiesResponse and returns HTTPHeaders. func ParseHTTPHeaders(resp GetPropertiesResponse) HTTPHeaders { return HTTPHeaders{ BlobContentType: resp.ContentType, BlobContentEncoding: resp.ContentEncoding, BlobContentLanguage: resp.ContentLanguage, BlobContentDisposition: resp.ContentDisposition, BlobCacheControl: resp.CacheControl, BlobContentMD5: resp.ContentMD5, } } // URLParts object represents the components that make up an Azure Storage Container/Blob URL. // NOTE: Changing any SAS-related field requires computing a new SAS signature. type URLParts = sas.URLParts // ParseURL parses a URL initializing URLParts' fields including any SAS-related & snapshot query parameters. Any other // query parameters remain in the UnparsedParams field. This method overwrites all fields in the URLParts object. func ParseURL(u string) (URLParts, error) { return sas.ParseURL(u) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror/error_codes.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package bloberror import ( "errors" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // HasCode returns true if the provided error is an *azcore.ResponseError // with its ErrorCode field equal to one of the specified Codes. func HasCode(err error, codes ...Code) bool { var respErr *azcore.ResponseError if !errors.As(err, &respErr) { return false } for _, code := range codes { if respErr.ErrorCode == string(code) { return true } } return false } // Code - Error codes returned by the service type Code = generated.StorageErrorCode const ( AccountAlreadyExists Code = "AccountAlreadyExists" AccountBeingCreated Code = "AccountBeingCreated" AccountIsDisabled Code = "AccountIsDisabled" AppendPositionConditionNotMet Code = "AppendPositionConditionNotMet" AuthenticationFailed Code = "AuthenticationFailed" AuthorizationFailure Code = "AuthorizationFailure" AuthorizationPermissionMismatch Code = "AuthorizationPermissionMismatch" AuthorizationProtocolMismatch Code = "AuthorizationProtocolMismatch" AuthorizationResourceTypeMismatch Code = "AuthorizationResourceTypeMismatch" AuthorizationServiceMismatch Code = "AuthorizationServiceMismatch" AuthorizationSourceIPMismatch Code = "AuthorizationSourceIPMismatch" BlobAlreadyExists Code = "BlobAlreadyExists" BlobArchived Code = "BlobArchived" BlobBeingRehydrated Code = "BlobBeingRehydrated" BlobImmutableDueToPolicy Code = "BlobImmutableDueToPolicy" BlobNotArchived Code = "BlobNotArchived" BlobNotFound Code = "BlobNotFound" BlobOverwritten Code = "BlobOverwritten" BlobTierInadequateForContentLength Code = "BlobTierInadequateForContentLength" BlobUsesCustomerSpecifiedEncryption Code = "BlobUsesCustomerSpecifiedEncryption" BlockCountExceedsLimit Code = "BlockCountExceedsLimit" BlockListTooLong Code = "BlockListTooLong" CannotChangeToLowerTier Code = "CannotChangeToLowerTier" CannotVerifyCopySource Code = "CannotVerifyCopySource" ConditionHeadersNotSupported Code = "ConditionHeadersNotSupported" ConditionNotMet Code = "ConditionNotMet" ContainerAlreadyExists Code = "ContainerAlreadyExists" ContainerBeingDeleted Code = "ContainerBeingDeleted" ContainerDisabled Code = "ContainerDisabled" ContainerNotFound Code = "ContainerNotFound" ContentLengthLargerThanTierLimit Code = "ContentLengthLargerThanTierLimit" CopyAcrossAccountsNotSupported Code = "CopyAcrossAccountsNotSupported" CopyIDMismatch Code = "CopyIdMismatch" EmptyMetadataKey Code = "EmptyMetadataKey" FeatureVersionMismatch Code = "FeatureVersionMismatch" ImmutabilityPolicyDeleteOnLockedPolicy Code = "ImmutabilityPolicyDeleteOnLockedPolicy" IncrementalCopyBlobMismatch Code = "IncrementalCopyBlobMismatch" IncrementalCopyOfEralierVersionSnapshotNotAllowed Code = "IncrementalCopyOfEralierVersionSnapshotNotAllowed" IncrementalCopySourceMustBeSnapshot Code = "IncrementalCopySourceMustBeSnapshot" InfiniteLeaseDurationRequired Code = "InfiniteLeaseDurationRequired" InsufficientAccountPermissions Code = "InsufficientAccountPermissions" InternalError Code = "InternalError" InvalidAuthenticationInfo Code = "InvalidAuthenticationInfo" InvalidBlobOrBlock Code = "InvalidBlobOrBlock" InvalidBlobTier Code = "InvalidBlobTier" InvalidBlobType Code = "InvalidBlobType" InvalidBlockID Code = "InvalidBlockId" InvalidBlockList Code = "InvalidBlockList" InvalidHTTPVerb Code = "InvalidHttpVerb" InvalidHeaderValue Code = "InvalidHeaderValue" InvalidInput Code = "InvalidInput" InvalidMD5 Code = "InvalidMd5" InvalidMetadata Code = "InvalidMetadata" InvalidOperation Code = "InvalidOperation" InvalidPageRange Code = "InvalidPageRange" InvalidQueryParameterValue Code = "InvalidQueryParameterValue" InvalidRange Code = "InvalidRange" InvalidResourceName Code = "InvalidResourceName" InvalidSourceBlobType Code = "InvalidSourceBlobType" InvalidSourceBlobURL Code = "InvalidSourceBlobUrl" InvalidURI Code = "InvalidUri" InvalidVersionForPageBlobOperation Code = "InvalidVersionForPageBlobOperation" InvalidXMLDocument Code = "InvalidXmlDocument" InvalidXMLNodeValue Code = "InvalidXmlNodeValue" LeaseAlreadyBroken Code = "LeaseAlreadyBroken" LeaseAlreadyPresent Code = "LeaseAlreadyPresent" LeaseIDMismatchWithBlobOperation Code = "LeaseIdMismatchWithBlobOperation" LeaseIDMismatchWithContainerOperation Code = "LeaseIdMismatchWithContainerOperation" LeaseIDMismatchWithLeaseOperation Code = "LeaseIdMismatchWithLeaseOperation" LeaseIDMissing Code = "LeaseIdMissing" LeaseIsBreakingAndCannotBeAcquired Code = "LeaseIsBreakingAndCannotBeAcquired" LeaseIsBreakingAndCannotBeChanged Code = "LeaseIsBreakingAndCannotBeChanged" LeaseIsBrokenAndCannotBeRenewed Code = "LeaseIsBrokenAndCannotBeRenewed" LeaseLost Code = "LeaseLost" LeaseNotPresentWithBlobOperation Code = "LeaseNotPresentWithBlobOperation" LeaseNotPresentWithContainerOperation Code = "LeaseNotPresentWithContainerOperation" LeaseNotPresentWithLeaseOperation Code = "LeaseNotPresentWithLeaseOperation" MD5Mismatch Code = "Md5Mismatch" CRC64Mismatch Code = "Crc64Mismatch" MaxBlobSizeConditionNotMet Code = "MaxBlobSizeConditionNotMet" MetadataTooLarge Code = "MetadataTooLarge" MissingContentLengthHeader Code = "MissingContentLengthHeader" MissingRequiredHeader Code = "MissingRequiredHeader" MissingRequiredQueryParameter Code = "MissingRequiredQueryParameter" MissingRequiredXMLNode Code = "MissingRequiredXmlNode" MultipleConditionHeadersNotSupported Code = "MultipleConditionHeadersNotSupported" NoAuthenticationInformation Code = "NoAuthenticationInformation" NoPendingCopyOperation Code = "NoPendingCopyOperation" OperationNotAllowedOnIncrementalCopyBlob Code = "OperationNotAllowedOnIncrementalCopyBlob" OperationNotAllowedOnRootBlob Code = "OperationNotAllowedOnRootBlob" OperationTimedOut Code = "OperationTimedOut" OutOfRangeInput Code = "OutOfRangeInput" OutOfRangeQueryParameterValue Code = "OutOfRangeQueryParameterValue" PendingCopyOperation Code = "PendingCopyOperation" PreviousSnapshotCannotBeNewer Code = "PreviousSnapshotCannotBeNewer" PreviousSnapshotNotFound Code = "PreviousSnapshotNotFound" PreviousSnapshotOperationNotSupported Code = "PreviousSnapshotOperationNotSupported" RequestBodyTooLarge Code = "RequestBodyTooLarge" RequestURLFailedToParse Code = "RequestUrlFailedToParse" ResourceAlreadyExists Code = "ResourceAlreadyExists" ResourceNotFound Code = "ResourceNotFound" ResourceTypeMismatch Code = "ResourceTypeMismatch" SequenceNumberConditionNotMet Code = "SequenceNumberConditionNotMet" SequenceNumberIncrementTooLarge Code = "SequenceNumberIncrementTooLarge" ServerBusy Code = "ServerBusy" SnapshotCountExceeded Code = "SnapshotCountExceeded" SnapshotOperationRateExceeded Code = "SnapshotOperationRateExceeded" SnapshotsPresent Code = "SnapshotsPresent" SourceConditionNotMet Code = "SourceConditionNotMet" SystemInUse Code = "SystemInUse" TargetConditionNotMet Code = "TargetConditionNotMet" UnauthorizedBlobOverwrite Code = "UnauthorizedBlobOverwrite" UnsupportedHTTPVerb Code = "UnsupportedHttpVerb" UnsupportedHeader Code = "UnsupportedHeader" UnsupportedQueryParameter Code = "UnsupportedQueryParameter" UnsupportedXMLNode Code = "UnsupportedXmlNode" ) var ( // MissingSharedKeyCredential - Error is returned when SAS URL is being created without SharedKeyCredential. MissingSharedKeyCredential = errors.New("SAS can only be signed with a SharedKeyCredential") UnsupportedChecksum = errors.New("for multi-part uploads, user generated checksums cannot be validated") ) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/chunkwriting.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blockblob import ( "bytes" "context" "encoding/base64" "encoding/binary" "errors" "io" "sync" "sync/atomic" "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming" "github.com/Azure/azure-sdk-for-go/sdk/internal/uuid" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) // blockWriter provides methods to upload blocks that represent a file to a server and commit them. // This allows us to provide a local implementation that fakes the server for hermetic testing. type blockWriter interface { StageBlock(context.Context, string, io.ReadSeekCloser, *StageBlockOptions) (StageBlockResponse, error) Upload(context.Context, io.ReadSeekCloser, *UploadOptions) (UploadResponse, error) CommitBlockList(context.Context, []string, *CommitBlockListOptions) (CommitBlockListResponse, error) } // copyFromReader copies a source io.Reader to blob storage using concurrent uploads. func copyFromReader[T ~[]byte](ctx context.Context, src io.Reader, dst blockWriter, options UploadStreamOptions, getBufferManager func(maxBuffers int, bufferSize int64) shared.BufferManager[T]) (CommitBlockListResponse, error) { options.setDefaults() wg := sync.WaitGroup{} // Used to know when all outgoing blocks have finished processing errCh := make(chan error, 1) // contains the first error encountered during processing buffers := getBufferManager(options.Concurrency, options.BlockSize) defer buffers.Free() // this controls the lifetime of the uploading goroutines. // if an error is encountered, cancel() is called which will terminate all uploads. // NOTE: the ordering is important here. cancel MUST execute before // cleaning up the buffers so that any uploading goroutines exit first, // releasing their buffers back to the pool for cleanup. ctx, cancel := context.WithCancel(ctx) defer cancel() // all blocks have IDs that start with a random UUID blockIDPrefix, err := uuid.New() if err != nil { return CommitBlockListResponse{}, err } tracker := blockTracker{ blockIDPrefix: blockIDPrefix, options: options, } // This goroutine grabs a buffer, reads from the stream into the buffer, // then creates a goroutine to upload/stage the block. for blockNum := uint32(0); true; blockNum++ { var buffer T select { case buffer = <-buffers.Acquire(): // got a buffer default: // no buffer available; allocate a new buffer if possible if _, err := buffers.Grow(); err != nil { return CommitBlockListResponse{}, err } // either grab the newly allocated buffer or wait for one to become available buffer = <-buffers.Acquire() } var n int n, err = shared.ReadAtLeast(src, buffer, len(buffer)) if n > 0 { // some data was read, upload it wg.Add(1) // We're posting a buffer to be sent // NOTE: we must pass blockNum as an arg to our goroutine else // it's captured by reference and can change underneath us! go func(blockNum uint32) { // Upload the outgoing block, matching the number of bytes read err := tracker.uploadBlock(ctx, dst, blockNum, buffer[:n]) if err != nil { select { case errCh <- err: // error was set default: // some other error is already set } cancel() } buffers.Release(buffer) // The goroutine reading from the stream can reuse this buffer now // signal that the block has been staged. // we MUST do this after attempting to write to errCh // to avoid it racing with the reading goroutine. wg.Done() }(blockNum) } else { // nothing was read so the buffer is empty, send it back for reuse/clean-up. buffers.Release(buffer) } if err != nil { // The reader is done, no more outgoing buffers if errors.Is(err, io.EOF) { // these are expected errors, we don't surface those err = nil } else { // some other error happened, terminate any outstanding uploads cancel() } break } } wg.Wait() // Wait for all outgoing blocks to complete if err != nil { // there was an error reading from src, favor this error over any error during staging return CommitBlockListResponse{}, err } select { case err = <-errCh: // there was an error during staging return CommitBlockListResponse{}, err default: // no error was encountered } // If no error, after all blocks uploaded, commit them to the blob & return the result return tracker.commitBlocks(ctx, dst) } // used to manage the uploading and committing of blocks type blockTracker struct { blockIDPrefix uuid.UUID // UUID used with all blockIDs maxBlockNum uint32 // defaults to 0 firstBlock []byte // Used only if maxBlockNum is 0 options UploadStreamOptions } func (bt *blockTracker) uploadBlock(ctx context.Context, to blockWriter, num uint32, buffer []byte) error { if num == 0 { bt.firstBlock = buffer // If whole payload fits in 1 block, don't stage it; End will upload it with 1 I/O operation // If the payload is exactly the same size as the buffer, there may be more content coming in. if len(buffer) < int(bt.options.BlockSize) { return nil } } else { // Else, upload a staged block... atomicMorphUint32(&bt.maxBlockNum, func(startVal uint32) (val uint32, morphResult uint32) { // Atomically remember (in t.numBlocks) the maximum block num we've ever seen if startVal < num { return num, 0 } return startVal, 0 }) } blockID := newUUIDBlockID(bt.blockIDPrefix).WithBlockNumber(num).ToBase64() _, err := to.StageBlock(ctx, blockID, streaming.NopCloser(bytes.NewReader(buffer)), bt.options.getStageBlockOptions()) return err } func (bt *blockTracker) commitBlocks(ctx context.Context, to blockWriter) (CommitBlockListResponse, error) { // If the first block had the exact same size as the buffer // we would have staged it as a block thinking that there might be more data coming if bt.maxBlockNum == 0 && len(bt.firstBlock) < int(bt.options.BlockSize) { // If whole payload fits in 1 block (block #0), upload it with 1 I/O operation up, err := to.Upload(ctx, streaming.NopCloser(bytes.NewReader(bt.firstBlock)), bt.options.getUploadOptions()) if err != nil { return CommitBlockListResponse{}, err } // convert UploadResponse to CommitBlockListResponse return CommitBlockListResponse{ ClientRequestID: up.ClientRequestID, ContentMD5: up.ContentMD5, Date: up.Date, ETag: up.ETag, EncryptionKeySHA256: up.EncryptionKeySHA256, EncryptionScope: up.EncryptionScope, IsServerEncrypted: up.IsServerEncrypted, LastModified: up.LastModified, RequestID: up.RequestID, Version: up.Version, VersionID: up.VersionID, //ContentCRC64: up.ContentCRC64, doesn't exist on UploadResponse }, nil } // Multiple blocks staged, commit them all now blockID := newUUIDBlockID(bt.blockIDPrefix) blockIDs := make([]string, bt.maxBlockNum+1) for bn := uint32(0); bn < bt.maxBlockNum+1; bn++ { blockIDs[bn] = blockID.WithBlockNumber(bn).ToBase64() } return to.CommitBlockList(ctx, blockIDs, bt.options.getCommitBlockListOptions()) } // AtomicMorpherUint32 identifies a method passed to and invoked by the AtomicMorph function. // The AtomicMorpher callback is passed a startValue and based on this value it returns // what the new value should be and the result that AtomicMorph should return to its caller. type atomicMorpherUint32 func(startVal uint32) (val uint32, morphResult uint32) // AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. func atomicMorphUint32(target *uint32, morpher atomicMorpherUint32) uint32 { for { currentVal := atomic.LoadUint32(target) desiredVal, morphResult := morpher(currentVal) if atomic.CompareAndSwapUint32(target, currentVal, desiredVal) { return morphResult } } } type blockID [64]byte func (blockID blockID) ToBase64() string { return base64.StdEncoding.EncodeToString(blockID[:]) } type uuidBlockID blockID func newUUIDBlockID(u uuid.UUID) uuidBlockID { ubi := uuidBlockID{} // Create a new uuidBlockID copy(ubi[:len(u)], u[:]) // Copy the specified UUID into it // Block number defaults to 0 return ubi } func (ubi uuidBlockID) WithBlockNumber(blockNumber uint32) uuidBlockID { binary.BigEndian.PutUint32(ubi[len(uuid.UUID{}):], blockNumber) // Put block number after UUID return ubi // Return the passed-in copy } func (ubi uuidBlockID) ToBase64() string { return blockID(ubi).ToBase64() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blockblob import ( "bytes" "context" "encoding/base64" "errors" "io" "math" "os" "reflect" "sync" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/internal/uuid" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" ) // ClientOptions contains the optional parameters when creating a Client. type ClientOptions base.ClientOptions // Client defines a set of operations applicable to block blobs. type Client base.CompositeClient[generated.BlobClient, generated.BlockBlobClient] // NewClient creates an instance of Client with the specified values. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt // - cred - an Azure AD credential, typically obtained via the azidentity module // - options - client options; pass nil to accept the default values func NewClient(blobURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) { audience := base.GetAudience((*base.ClientOptions)(options)) conOptions := shared.GetClientOptions(options) authPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewBlockBlobClient(blobURL, azClient, nil)), nil } // NewClientWithNoCredential creates an instance of Client with the specified values. // This is used to anonymously access a blob or with a shared access signature (SAS) token. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt? // - options - client options; pass nil to accept the default values func NewClientWithNoCredential(blobURL string, options *ClientOptions) (*Client, error) { conOptions := shared.GetClientOptions(options) azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewBlockBlobClient(blobURL, azClient, nil)), nil } // NewClientWithSharedKeyCredential creates an instance of Client with the specified values. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt // - cred - a SharedKeyCredential created with the matching blob's storage account and access key // - options - client options; pass nil to accept the default values func NewClientWithSharedKeyCredential(blobURL string, cred *blob.SharedKeyCredential, options *ClientOptions) (*Client, error) { authPolicy := exported.NewSharedKeyCredPolicy(cred) conOptions := shared.GetClientOptions(options) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewBlockBlobClient(blobURL, azClient, cred)), nil } // NewClientFromConnectionString creates an instance of Client with the specified values. // - connectionString - a connection string for the desired storage account // - containerName - the name of the container within the storage account // - blobName - the name of the blob within the container // - options - client options; pass nil to accept the default values func NewClientFromConnectionString(connectionString, containerName, blobName string, options *ClientOptions) (*Client, error) { parsed, err := shared.ParseConnectionString(connectionString) if err != nil { return nil, err } parsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName, blobName) if parsed.AccountKey != "" && parsed.AccountName != "" { credential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey) if err != nil { return nil, err } return NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options) } return NewClientWithNoCredential(parsed.ServiceURL, options) } func (bb *Client) sharedKey() *blob.SharedKeyCredential { return base.SharedKeyComposite((*base.CompositeClient[generated.BlobClient, generated.BlockBlobClient])(bb)) } func (bb *Client) generated() *generated.BlockBlobClient { _, blockBlob := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.BlockBlobClient])(bb)) return blockBlob } func (bb *Client) innerBlobGenerated() *generated.BlobClient { b := bb.BlobClient() return base.InnerClient((*base.Client[generated.BlobClient])(b)) } // URL returns the URL endpoint used by the Client object. func (bb *Client) URL() string { return bb.generated().Endpoint() } // BlobClient returns the embedded blob client for this BlockBlob client. func (bb *Client) BlobClient() *blob.Client { blobClient, _ := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.BlockBlobClient])(bb)) return (*blob.Client)(blobClient) } // WithSnapshot creates a new Client object identical to the source but with the specified snapshot timestamp. // Pass "" to remove the snapshot returning a URL to the base blob. func (bb *Client) WithSnapshot(snapshot string) (*Client, error) { p, err := blob.ParseURL(bb.URL()) if err != nil { return nil, err } p.Snapshot = snapshot return (*Client)(base.NewBlockBlobClient(p.String(), bb.generated().Internal(), bb.sharedKey())), nil } // WithVersionID creates a new AppendBlobURL object identical to the source but with the specified version id. // Pass "" to remove the versionID returning a URL to the base blob. func (bb *Client) WithVersionID(versionID string) (*Client, error) { p, err := blob.ParseURL(bb.URL()) if err != nil { return nil, err } p.VersionID = versionID return (*Client)(base.NewBlockBlobClient(p.String(), bb.generated().Internal(), bb.sharedKey())), nil } // Upload creates a new block blob or overwrites an existing block blob. // Updating an existing block blob overwrites any existing metadata on the blob. Partial updates are not // supported with Upload; the content of the existing blob is overwritten with the new content. To // perform a partial update of a block blob, use StageBlock and CommitBlockList. // This method panics if the stream is not at position 0. // Note that the http client closes the body stream after the request is sent to the service. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. func (bb *Client) Upload(ctx context.Context, body io.ReadSeekCloser, options *UploadOptions) (UploadResponse, error) { count, err := shared.ValidateSeekableStreamAt0AndGetCount(body) if err != nil { return UploadResponse{}, err } opts, httpHeaders, leaseInfo, cpkV, cpkN, accessConditions := options.format() if options != nil && options.TransactionalValidation != nil { body, err = options.TransactionalValidation.Apply(body, opts) if err != nil { return UploadResponse{}, err } } resp, err := bb.generated().Upload(ctx, count, body, opts, httpHeaders, leaseInfo, cpkV, cpkN, accessConditions) return resp, err } // UploadBlobFromURL - The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read from // a given URL. Partial updates are not supported with Put Blob from URL; the content of an existing blob is overwritten // with the content of the new blob. To perform partial updates to a block blob’s contents using a source URL, use the Put // Block from URL API in conjunction with Put Block List. // For more information, see https://learn.microsoft.com/rest/api/storageservices/put-blob-from-url func (bb *Client) UploadBlobFromURL(ctx context.Context, copySource string, options *UploadBlobFromURLOptions) (UploadBlobFromURLResponse, error) { opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions := options.format() resp, err := bb.generated().PutBlobFromURL(ctx, int64(0), copySource, opts, httpHeaders, leaseAccessConditions, cpkInfo, cpkSourceInfo, modifiedAccessConditions, sourceModifiedConditions) return resp, err } // StageBlock uploads the specified block to the block blob's "staging area" to be later committed by a call to CommitBlockList. // Note that the http client closes the body stream after the request is sent to the service. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block. func (bb *Client) StageBlock(ctx context.Context, base64BlockID string, body io.ReadSeekCloser, options *StageBlockOptions) (StageBlockResponse, error) { count, err := shared.ValidateSeekableStreamAt0AndGetCount(body) if err != nil { return StageBlockResponse{}, err } opts, leaseAccessConditions, cpkInfo, cpkScopeInfo := options.format() if options != nil && options.TransactionalValidation != nil { body, err = options.TransactionalValidation.Apply(body, opts) if err != nil { return StageBlockResponse{}, nil } } resp, err := bb.generated().StageBlock(ctx, base64BlockID, count, body, opts, leaseAccessConditions, cpkInfo, cpkScopeInfo) return resp, err } // StageBlockFromURL copies the specified block from a source URL to the block blob's "staging area" to be later committed by a call to CommitBlockList. // If count is CountToEnd (0), then data is read from specified offset to the end. // For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/put-block-from-url. func (bb *Client) StageBlockFromURL(ctx context.Context, base64BlockID string, sourceURL string, options *StageBlockFromURLOptions) (StageBlockFromURLResponse, error) { stageBlockFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sourceModifiedAccessConditions := options.format() resp, err := bb.generated().StageBlockFromURL(ctx, base64BlockID, 0, sourceURL, stageBlockFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sourceModifiedAccessConditions) return resp, err } // CommitBlockList writes a blob by specifying the list of block IDs that make up the blob. // In order to be written as part of a blob, a block must have been successfully written // to the server in a prior PutBlock operation. You can call PutBlockList to update a blob // by uploading only those blocks that have changed, then committing the new and existing // blocks together. Any blocks not specified in the block list and permanently deleted. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block-list. func (bb *Client) CommitBlockList(ctx context.Context, base64BlockIDs []string, options *CommitBlockListOptions) (CommitBlockListResponse, error) { // this is a code smell in the generated code blockIds := make([]*string, len(base64BlockIDs)) for k, v := range base64BlockIDs { blockIds[k] = to.Ptr(v) } blockLookupList := generated.BlockLookupList{Latest: blockIds} var commitOptions *generated.BlockBlobClientCommitBlockListOptions var headers *generated.BlobHTTPHeaders var leaseAccess *blob.LeaseAccessConditions var cpkInfo *generated.CPKInfo var cpkScope *generated.CPKScopeInfo var modifiedAccess *generated.ModifiedAccessConditions if options != nil { commitOptions = &generated.BlockBlobClientCommitBlockListOptions{ BlobTagsString: shared.SerializeBlobTagsToStrPtr(options.Tags), Metadata: options.Metadata, RequestID: options.RequestID, Tier: options.Tier, Timeout: options.Timeout, TransactionalContentCRC64: options.TransactionalContentCRC64, TransactionalContentMD5: options.TransactionalContentMD5, LegalHold: options.LegalHold, ImmutabilityPolicyMode: options.ImmutabilityPolicyMode, ImmutabilityPolicyExpiry: options.ImmutabilityPolicyExpiryTime, } // If user attempts to pass in their own checksum, errors out. if options.TransactionalContentMD5 != nil || options.TransactionalContentCRC64 != nil { return CommitBlockListResponse{}, bloberror.UnsupportedChecksum } headers = options.HTTPHeaders leaseAccess, modifiedAccess = exported.FormatBlobAccessConditions(options.AccessConditions) cpkInfo = options.CPKInfo cpkScope = options.CPKScopeInfo } resp, err := bb.generated().CommitBlockList(ctx, blockLookupList, commitOptions, headers, leaseAccess, cpkInfo, cpkScope, modifiedAccess) return resp, err } // GetBlockList returns the list of blocks that have been uploaded as part of a block blob using the specified block list filter. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-block-list. func (bb *Client) GetBlockList(ctx context.Context, listType BlockListType, options *GetBlockListOptions) (GetBlockListResponse, error) { o, lac, mac := options.format() resp, err := bb.generated().GetBlockList(ctx, listType, o, lac, mac) return resp, err } // Redeclared APIs ----- Copy over to Append blob and Page blob as well. // Delete marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection. // Note that deleting a blob also deletes all its snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob. func (bb *Client) Delete(ctx context.Context, o *blob.DeleteOptions) (blob.DeleteResponse, error) { return bb.BlobClient().Delete(ctx, o) } // Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob. func (bb *Client) Undelete(ctx context.Context, o *blob.UndeleteOptions) (blob.UndeleteResponse, error) { return bb.BlobClient().Undelete(ctx, o) } // SetImmutabilityPolicy operation enables users to set the immutability policy on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (bb *Client) SetImmutabilityPolicy(ctx context.Context, expiryTime time.Time, options *blob.SetImmutabilityPolicyOptions) (blob.SetImmutabilityPolicyResponse, error) { return bb.BlobClient().SetImmutabilityPolicy(ctx, expiryTime, options) } // DeleteImmutabilityPolicy operation enables users to delete the immutability policy on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (bb *Client) DeleteImmutabilityPolicy(ctx context.Context, options *blob.DeleteImmutabilityPolicyOptions) (blob.DeleteImmutabilityPolicyResponse, error) { return bb.BlobClient().DeleteImmutabilityPolicy(ctx, options) } // SetLegalHold operation enables users to set legal hold on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (bb *Client) SetLegalHold(ctx context.Context, legalHold bool, options *blob.SetLegalHoldOptions) (blob.SetLegalHoldResponse, error) { return bb.BlobClient().SetLegalHold(ctx, legalHold, options) } // SetTier operation sets the tier on a blob. The operation is allowed on a page // blob in a premium storage account and on a block blob in a blob storage account (locally // redundant storage only). A premium page blob's tier determines the allowed size, IOPs, and // bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation // does not update the blob's ETag. // For detailed information about block blob level tiering see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers. func (bb *Client) SetTier(ctx context.Context, tier blob.AccessTier, o *blob.SetTierOptions) (blob.SetTierResponse, error) { return bb.BlobClient().SetTier(ctx, tier, o) } // SetExpiry operation sets an expiry time on an existing blob. This operation is only allowed on Hierarchical Namespace enabled accounts. // For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/set-blob-expiry func (bb *Client) SetExpiry(ctx context.Context, expiryType ExpiryType, o *SetExpiryOptions) (SetExpiryResponse, error) { if expiryType == nil { expiryType = ExpiryTypeNever{} } et, opts := expiryType.Format(o) resp, err := bb.innerBlobGenerated().SetExpiry(ctx, et, opts) return resp, err } // GetProperties returns the blob's properties. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties. func (bb *Client) GetProperties(ctx context.Context, o *blob.GetPropertiesOptions) (blob.GetPropertiesResponse, error) { return bb.BlobClient().GetProperties(ctx, o) } // GetAccountInfo provides account level information // For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures. func (bb *Client) GetAccountInfo(ctx context.Context, o *blob.GetAccountInfoOptions) (blob.GetAccountInfoResponse, error) { return bb.BlobClient().GetAccountInfo(ctx, o) } // SetHTTPHeaders changes a blob's HTTP headers. // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. func (bb *Client) SetHTTPHeaders(ctx context.Context, httpHeaders blob.HTTPHeaders, o *blob.SetHTTPHeadersOptions) (blob.SetHTTPHeadersResponse, error) { return bb.BlobClient().SetHTTPHeaders(ctx, httpHeaders, o) } // SetMetadata changes a blob's metadata. // https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata. func (bb *Client) SetMetadata(ctx context.Context, metadata map[string]*string, o *blob.SetMetadataOptions) (blob.SetMetadataResponse, error) { return bb.BlobClient().SetMetadata(ctx, metadata, o) } // CreateSnapshot creates a read-only snapshot of a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob. func (bb *Client) CreateSnapshot(ctx context.Context, o *blob.CreateSnapshotOptions) (blob.CreateSnapshotResponse, error) { return bb.BlobClient().CreateSnapshot(ctx, o) } // StartCopyFromURL copies the data at the source URL to a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob. func (bb *Client) StartCopyFromURL(ctx context.Context, copySource string, o *blob.StartCopyFromURLOptions) (blob.StartCopyFromURLResponse, error) { return bb.BlobClient().StartCopyFromURL(ctx, copySource, o) } // AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob. func (bb *Client) AbortCopyFromURL(ctx context.Context, copyID string, o *blob.AbortCopyFromURLOptions) (blob.AbortCopyFromURLResponse, error) { return bb.BlobClient().AbortCopyFromURL(ctx, copyID, o) } // SetTags operation enables users to set tags on a blob or specific blob version, but not snapshot. // Each call to this operation replaces all existing tags attached to the blob. // To remove all tags from the blob, call this operation with no tags set. // https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tags func (bb *Client) SetTags(ctx context.Context, tags map[string]string, o *blob.SetTagsOptions) (blob.SetTagsResponse, error) { return bb.BlobClient().SetTags(ctx, tags, o) } // GetTags operation enables users to get tags on a blob or specific blob version, or snapshot. // https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-tags func (bb *Client) GetTags(ctx context.Context, o *blob.GetTagsOptions) (blob.GetTagsResponse, error) { return bb.BlobClient().GetTags(ctx, o) } // CopyFromURL synchronously copies the data at the source URL to a block blob, with sizes up to 256 MB. // For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url. func (bb *Client) CopyFromURL(ctx context.Context, copySource string, o *blob.CopyFromURLOptions) (blob.CopyFromURLResponse, error) { return bb.BlobClient().CopyFromURL(ctx, copySource, o) } // GetSASURL is a convenience method for generating a SAS token for the currently pointed at block blob. // It can only be used if the credential supplied during creation was a SharedKeyCredential. func (bb *Client) GetSASURL(permissions sas.BlobPermissions, expiry time.Time, o *blob.GetSASURLOptions) (string, error) { return bb.BlobClient().GetSASURL(permissions, expiry, o) } // Concurrent Upload Functions ----------------------------------------------------------------------------------------- // uploadFromReader uploads a buffer in blocks to a block blob. func (bb *Client) uploadFromReader(ctx context.Context, reader io.ReaderAt, actualSize int64, o *uploadFromReaderOptions) (uploadFromReaderResponse, error) { if o.BlockSize == 0 { // If bufferSize > (MaxStageBlockBytes * MaxBlocks), then error if actualSize > MaxStageBlockBytes*MaxBlocks { return uploadFromReaderResponse{}, errors.New("buffer is too large to upload to a block blob") } // If bufferSize <= MaxUploadBlobBytes, then Upload should be used with just 1 I/O request if actualSize <= MaxUploadBlobBytes { o.BlockSize = MaxUploadBlobBytes // Default if unspecified } else { o.BlockSize = int64(math.Ceil(float64(actualSize) / MaxBlocks)) // ceil(buffer / max blocks) = block size to use all 50,000 blocks if o.BlockSize < blob.DefaultDownloadBlockSize { // If the block size is smaller than 4MB, round up to 4MB o.BlockSize = blob.DefaultDownloadBlockSize } // StageBlock will be called with blockSize blocks and a Concurrency of (BufferSize / BlockSize). } } if actualSize <= MaxUploadBlobBytes { // If the size can fit in 1 Upload call, do it this way var body io.ReadSeeker = io.NewSectionReader(reader, 0, actualSize) if o.Progress != nil { body = streaming.NewRequestProgress(shared.NopCloser(body), o.Progress) } uploadBlockBlobOptions := o.getUploadBlockBlobOptions() resp, err := bb.Upload(ctx, shared.NopCloser(body), uploadBlockBlobOptions) return toUploadReaderAtResponseFromUploadResponse(resp), err } var numBlocks = uint16(((actualSize - 1) / o.BlockSize) + 1) if numBlocks > MaxBlocks { // prevent any math bugs from attempting to upload too many blocks which will always fail return uploadFromReaderResponse{}, errors.New("block limit exceeded") } if log.Should(exported.EventUpload) { urlparts, err := blob.ParseURL(bb.generated().Endpoint()) if err == nil { log.Writef(exported.EventUpload, "blob name %s actual size %v block-size %v block-count %v", urlparts.BlobName, actualSize, o.BlockSize, numBlocks) } } blockIDList := make([]string, numBlocks) // Base-64 encoded block IDs progress := int64(0) progressLock := &sync.Mutex{} err := shared.DoBatchTransfer(ctx, &shared.BatchTransferOptions{ OperationName: "uploadFromReader", TransferSize: actualSize, ChunkSize: o.BlockSize, NumChunks: uint64(((actualSize - 1) / o.BlockSize) + 1), Concurrency: o.Concurrency, Operation: func(ctx context.Context, offset int64, chunkSize int64) error { // This function is called once per block. // It is passed this block's offset within the buffer and its count of bytes // Prepare to read the proper block/section of the buffer if chunkSize < o.BlockSize { // this is the last block. its actual size might be less // than the calculated size due to rounding up of the payload // size to fit in a whole number of blocks. chunkSize = (actualSize - offset) } var body io.ReadSeeker = io.NewSectionReader(reader, offset, chunkSize) blockNum := offset / o.BlockSize if o.Progress != nil { blockProgress := int64(0) body = streaming.NewRequestProgress(shared.NopCloser(body), func(bytesTransferred int64) { diff := bytesTransferred - blockProgress blockProgress = bytesTransferred progressLock.Lock() // 1 goroutine at a time gets progress report progress += diff o.Progress(progress) progressLock.Unlock() }) } // Block IDs are unique values to avoid issue if 2+ clients are uploading blocks // at the same time causing PutBlockList to get a mix of blocks from all the clients. generatedUuid, err := uuid.New() if err != nil { return err } blockIDList[blockNum] = base64.StdEncoding.EncodeToString([]byte(generatedUuid.String())) stageBlockOptions := o.getStageBlockOptions() _, err = bb.StageBlock(ctx, blockIDList[blockNum], shared.NopCloser(body), stageBlockOptions) return err }, }) if err != nil { return uploadFromReaderResponse{}, err } // All put blocks were successful, call Put Block List to finalize the blob commitBlockListOptions := o.getCommitBlockListOptions() resp, err := bb.CommitBlockList(ctx, blockIDList, commitBlockListOptions) return toUploadReaderAtResponseFromCommitBlockListResponse(resp), err } // UploadBuffer uploads a buffer in blocks to a block blob. func (bb *Client) UploadBuffer(ctx context.Context, buffer []byte, o *UploadBufferOptions) (UploadBufferResponse, error) { uploadOptions := uploadFromReaderOptions{} if o != nil { uploadOptions = *o } // If user attempts to pass in their own checksum, errors out. if uploadOptions.TransactionalValidation != nil && reflect.TypeOf(uploadOptions.TransactionalValidation).Kind() != reflect.Func { return UploadBufferResponse{}, bloberror.UnsupportedChecksum } return bb.uploadFromReader(ctx, bytes.NewReader(buffer), int64(len(buffer)), &uploadOptions) } // UploadFile uploads a file in blocks to a block blob. func (bb *Client) UploadFile(ctx context.Context, file *os.File, o *UploadFileOptions) (UploadFileResponse, error) { stat, err := file.Stat() if err != nil { return uploadFromReaderResponse{}, err } uploadOptions := uploadFromReaderOptions{} if o != nil { uploadOptions = *o } // If user attempts to pass in their own checksum, errors out. if uploadOptions.TransactionalValidation != nil && reflect.TypeOf(uploadOptions.TransactionalValidation).Kind() != reflect.Func { return UploadFileResponse{}, bloberror.UnsupportedChecksum } return bb.uploadFromReader(ctx, file, stat.Size(), &uploadOptions) } // UploadStream copies the file held in io.Reader to the Blob at blockBlobClient. // A Context deadline or cancellation will cause this to error. func (bb *Client) UploadStream(ctx context.Context, body io.Reader, o *UploadStreamOptions) (UploadStreamResponse, error) { if o == nil { o = &UploadStreamOptions{} } // If user attempts to pass in their own checksum, errors out. if o.TransactionalValidation != nil && reflect.TypeOf(o.TransactionalValidation).Kind() != reflect.Func { return UploadStreamResponse{}, bloberror.UnsupportedChecksum } result, err := copyFromReader(ctx, body, bb, *o, shared.NewMMBPool) if err != nil { return CommitBlockListResponse{}, err } return result, nil } // Concurrent Download Functions ----------------------------------------------------------------------------------------- // DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob. func (bb *Client) DownloadStream(ctx context.Context, o *blob.DownloadStreamOptions) (blob.DownloadStreamResponse, error) { return bb.BlobClient().DownloadStream(ctx, o) } // DownloadBuffer downloads an Azure blob to a buffer with parallel. func (bb *Client) DownloadBuffer(ctx context.Context, buffer []byte, o *blob.DownloadBufferOptions) (int64, error) { return bb.BlobClient().DownloadBuffer(ctx, shared.NewBytesWriter(buffer), o) } // DownloadFile downloads an Azure blob to a local file. // The file would be truncated if the size doesn't match. func (bb *Client) DownloadFile(ctx context.Context, file *os.File, o *blob.DownloadFileOptions) (int64, error) { return bb.BlobClient().DownloadFile(ctx, file, o) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blockblob import "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" const ( // CountToEnd specifies the end of the file. CountToEnd = 0 _1MiB = 1024 * 1024 // MaxUploadBlobBytes indicates the maximum number of bytes that can be sent in a call to Upload. MaxUploadBlobBytes = 256 * 1024 * 1024 // 256MB // MaxStageBlockBytes indicates the maximum number of bytes that can be sent in a call to StageBlock. MaxStageBlockBytes = 4000 * 1024 * 1024 // 4GB // MaxBlocks indicates the maximum number of blocks allowed in a block blob. MaxBlocks = 50000 ) // BlockListType defines values for BlockListType type BlockListType = generated.BlockListType const ( BlockListTypeCommitted BlockListType = generated.BlockListTypeCommitted BlockListTypeUncommitted BlockListType = generated.BlockListTypeUncommitted BlockListTypeAll BlockListType = generated.BlockListTypeAll ) // PossibleBlockListTypeValues returns the possible values for the BlockListType const type. func PossibleBlockListTypeValues() []BlockListType { return generated.PossibleBlockListTypeValues() } // BlobCopySourceTags - can be 'COPY' or 'REPLACE' type BlobCopySourceTags = generated.BlobCopySourceTags const ( BlobCopySourceTagsCopy = generated.BlobCopySourceTagsCOPY BlobCopySourceTagsReplace = generated.BlobCopySourceTagsREPLACE ) // PossibleBlobCopySourceTagsValues returns the possible values for the BlobCopySourceTags const type. func PossibleBlobCopySourceTagsValues() []BlobCopySourceTags { return generated.PossibleBlobCopySourceTagsValues() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/models.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blockblob import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) // Type Declarations --------------------------------------------------------------------- // Block - Represents a single block in a block blob. It describes the block's ID and size. type Block = generated.Block // BlockList - can be uncommitted or committed blocks (committed/uncommitted) type BlockList = generated.BlockList // Request Model Declaration ------------------------------------------------------------------------------------------- // UploadOptions contains the optional parameters for the Client.Upload method. type UploadOptions struct { // Optional. Used to set blob tags in various blob operations. Tags map[string]string // Optional. Specifies a user-defined name-value pair associated with the blob. Metadata map[string]*string // Optional. Indicates the tier to be set on the blob. Tier *blob.AccessTier // TransactionalValidation specifies the transfer validation type to use. // The default is nil (no transfer validation). TransactionalValidation blob.TransferValidationType HTTPHeaders *blob.HTTPHeaders CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo AccessConditions *blob.AccessConditions LegalHold *bool ImmutabilityPolicyMode *blob.ImmutabilityPolicySetting ImmutabilityPolicyExpiryTime *time.Time // Deprecated: TransactionalContentMD5 can be set by using TransactionalValidation instead TransactionalContentMD5 []byte } func (o *UploadOptions) format() (*generated.BlockBlobClientUploadOptions, *generated.BlobHTTPHeaders, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil } basics := generated.BlockBlobClientUploadOptions{ BlobTagsString: shared.SerializeBlobTagsToStrPtr(o.Tags), Metadata: o.Metadata, Tier: o.Tier, TransactionalContentMD5: o.TransactionalContentMD5, LegalHold: o.LegalHold, ImmutabilityPolicyMode: o.ImmutabilityPolicyMode, ImmutabilityPolicyExpiry: o.ImmutabilityPolicyExpiryTime, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &basics, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // UploadBlobFromURLOptions contains the optional parameters for the Client.UploadBlobFromURL method. type UploadBlobFromURLOptions struct { // Optional. Used to set blob tags in various blob operations. Tags map[string]string // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // Optional, default is true. Indicates if properties from the source blob should be copied. CopySourceBlobProperties *bool // Optional, default 'replace'. Indicates if source tags should be copied or replaced with the tags specified by x-ms-tags. CopySourceTags *BlobCopySourceTags // Optional. Specifies a user-defined name-value pair associated with the blob. Metadata map[string]*string // Optional. Specifies the md5 calculated for the range of bytes that must be read from the copy source. SourceContentMD5 []byte // Optional. Indicates the tier to be set on the blob. Tier *blob.AccessTier // Additional optional headers HTTPHeaders *blob.HTTPHeaders AccessConditions *blob.AccessConditions CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo SourceModifiedAccessConditions *blob.SourceModifiedAccessConditions } func (o *UploadBlobFromURLOptions) format() (*generated.BlockBlobClientPutBlobFromURLOptions, *generated.BlobHTTPHeaders, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions, *generated.SourceModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil, nil } options := generated.BlockBlobClientPutBlobFromURLOptions{ BlobTagsString: shared.SerializeBlobTagsToStrPtr(o.Tags), CopySourceAuthorization: o.CopySourceAuthorization, CopySourceBlobProperties: o.CopySourceBlobProperties, CopySourceTags: o.CopySourceTags, Metadata: o.Metadata, SourceContentMD5: o.SourceContentMD5, Tier: o.Tier, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &options, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions, o.SourceModifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // StageBlockOptions contains the optional parameters for the Client.StageBlock method. type StageBlockOptions struct { CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo LeaseAccessConditions *blob.LeaseAccessConditions // TransactionalValidation specifies the transfer validation type to use. // The default is nil (no transfer validation). TransactionalValidation blob.TransferValidationType } // StageBlockOptions contains the optional parameters for the Client.StageBlock method. func (o *StageBlockOptions) format() (*generated.BlockBlobClientStageBlockOptions, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo) { if o == nil { return nil, nil, nil, nil } return &generated.BlockBlobClientStageBlockOptions{}, o.LeaseAccessConditions, o.CPKInfo, o.CPKScopeInfo } // --------------------------------------------------------------------------------------------------------------------- // StageBlockFromURLOptions contains the optional parameters for the Client.StageBlockFromURL method. type StageBlockFromURLOptions struct { // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string LeaseAccessConditions *blob.LeaseAccessConditions SourceModifiedAccessConditions *blob.SourceModifiedAccessConditions // SourceContentValidation contains the validation mechanism used on the range of bytes read from the source. SourceContentValidation blob.SourceContentValidationType // Range specifies a range of bytes. The default value is all bytes. Range blob.HTTPRange CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo } func (o *StageBlockFromURLOptions) format() (*generated.BlockBlobClientStageBlockFromURLOptions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.LeaseAccessConditions, *generated.SourceModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil } options := &generated.BlockBlobClientStageBlockFromURLOptions{ CopySourceAuthorization: o.CopySourceAuthorization, SourceRange: exported.FormatHTTPRange(o.Range), } if o.SourceContentValidation != nil { o.SourceContentValidation.Apply(options) } return options, o.CPKInfo, o.CPKScopeInfo, o.LeaseAccessConditions, o.SourceModifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // CommitBlockListOptions contains the optional parameters for Client.CommitBlockList method. type CommitBlockListOptions struct { Tags map[string]string Metadata map[string]*string RequestID *string Tier *blob.AccessTier Timeout *int32 HTTPHeaders *blob.HTTPHeaders CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo AccessConditions *blob.AccessConditions LegalHold *bool ImmutabilityPolicyMode *blob.ImmutabilityPolicySetting ImmutabilityPolicyExpiryTime *time.Time // Deprecated: TransactionalContentCRC64 cannot be generated TransactionalContentCRC64 []byte // Deprecated: TransactionalContentMD5 cannot be generated TransactionalContentMD5 []byte } // --------------------------------------------------------------------------------------------------------------------- // GetBlockListOptions contains the optional parameters for the Client.GetBlockList method. type GetBlockListOptions struct { Snapshot *string AccessConditions *blob.AccessConditions } func (o *GetBlockListOptions) format() (*generated.BlockBlobClientGetBlockListOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &generated.BlockBlobClientGetBlockListOptions{Snapshot: o.Snapshot}, leaseAccessConditions, modifiedAccessConditions } // ------------------------------------------------------------ // uploadFromReaderOptions identifies options used by the UploadBuffer and UploadFile functions. type uploadFromReaderOptions struct { // BlockSize specifies the block size to use; the default (and maximum size) is MaxStageBlockBytes. BlockSize int64 // Progress is a function that is invoked periodically as bytes are sent to the BlockBlobClient. // Note that the progress reporting is not always increasing; it can go down when retrying a request. Progress func(bytesTransferred int64) // HTTPHeaders indicates the HTTP headers to be associated with the blob. HTTPHeaders *blob.HTTPHeaders // Metadata indicates the metadata to be associated with the blob when PutBlockList is called. Metadata map[string]*string // AccessConditions indicates the access conditions for the block blob. AccessConditions *blob.AccessConditions // AccessTier indicates the tier of blob AccessTier *blob.AccessTier // BlobTags Tags map[string]string // ClientProvidedKeyOptions indicates the client provided key by name and/or by value to encrypt/decrypt data. CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo // Concurrency indicates the maximum number of blocks to upload in parallel (0=default) Concurrency uint16 TransactionalValidation blob.TransferValidationType // Deprecated: TransactionalContentCRC64 cannot be generated at block level TransactionalContentCRC64 uint64 // Deprecated: TransactionalContentMD5 cannot be generated at block level TransactionalContentMD5 []byte } // UploadBufferOptions provides set of configurations for UploadBuffer operation. type UploadBufferOptions = uploadFromReaderOptions // UploadFileOptions provides set of configurations for UploadFile operation. type UploadFileOptions = uploadFromReaderOptions func (o *uploadFromReaderOptions) getStageBlockOptions() *StageBlockOptions { leaseAccessConditions, _ := exported.FormatBlobAccessConditions(o.AccessConditions) return &StageBlockOptions{ CPKInfo: o.CPKInfo, CPKScopeInfo: o.CPKScopeInfo, LeaseAccessConditions: leaseAccessConditions, TransactionalValidation: o.TransactionalValidation, } } func (o *uploadFromReaderOptions) getUploadBlockBlobOptions() *UploadOptions { return &UploadOptions{ Tags: o.Tags, Metadata: o.Metadata, Tier: o.AccessTier, HTTPHeaders: o.HTTPHeaders, AccessConditions: o.AccessConditions, CPKInfo: o.CPKInfo, CPKScopeInfo: o.CPKScopeInfo, } } func (o *uploadFromReaderOptions) getCommitBlockListOptions() *CommitBlockListOptions { return &CommitBlockListOptions{ Tags: o.Tags, Metadata: o.Metadata, Tier: o.AccessTier, HTTPHeaders: o.HTTPHeaders, CPKInfo: o.CPKInfo, CPKScopeInfo: o.CPKScopeInfo, } } // --------------------------------------------------------------------------------------------------------------------- // UploadStreamOptions provides set of configurations for UploadStream operation. type UploadStreamOptions struct { // BlockSize defines the size of the buffer used during upload. The default and minimum value is 1 MiB. BlockSize int64 // Concurrency defines the max number of concurrent uploads to be performed to upload the file. // Each concurrent upload will create a buffer of size BlockSize. The default value is one. Concurrency int TransactionalValidation blob.TransferValidationType HTTPHeaders *blob.HTTPHeaders Metadata map[string]*string AccessConditions *blob.AccessConditions AccessTier *blob.AccessTier Tags map[string]string CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo } func (u *UploadStreamOptions) setDefaults() { if u.Concurrency == 0 { u.Concurrency = 1 } if u.BlockSize < _1MiB { u.BlockSize = _1MiB } } func (u *UploadStreamOptions) getStageBlockOptions() *StageBlockOptions { if u == nil { return nil } leaseAccessConditions, _ := exported.FormatBlobAccessConditions(u.AccessConditions) return &StageBlockOptions{ TransactionalValidation: u.TransactionalValidation, CPKInfo: u.CPKInfo, CPKScopeInfo: u.CPKScopeInfo, LeaseAccessConditions: leaseAccessConditions, } } func (u *UploadStreamOptions) getCommitBlockListOptions() *CommitBlockListOptions { if u == nil { return nil } return &CommitBlockListOptions{ Tags: u.Tags, Metadata: u.Metadata, Tier: u.AccessTier, HTTPHeaders: u.HTTPHeaders, CPKInfo: u.CPKInfo, CPKScopeInfo: u.CPKScopeInfo, AccessConditions: u.AccessConditions, } } func (u *UploadStreamOptions) getUploadOptions() *UploadOptions { if u == nil { return nil } return &UploadOptions{ Tags: u.Tags, Metadata: u.Metadata, Tier: u.AccessTier, HTTPHeaders: u.HTTPHeaders, CPKInfo: u.CPKInfo, CPKScopeInfo: u.CPKScopeInfo, AccessConditions: u.AccessConditions, } } // --------------------------------------------------------------------------------------------------------------------- // ExpiryType defines values for ExpiryType. type ExpiryType = exported.ExpiryType // ExpiryTypeAbsolute defines the absolute time for the blob expiry. type ExpiryTypeAbsolute = exported.ExpiryTypeAbsolute // ExpiryTypeRelativeToNow defines the duration relative to now for the blob expiry. type ExpiryTypeRelativeToNow = exported.ExpiryTypeRelativeToNow // ExpiryTypeRelativeToCreation defines the duration relative to creation for the blob expiry. type ExpiryTypeRelativeToCreation = exported.ExpiryTypeRelativeToCreation // ExpiryTypeNever defines that the blob will be set to never expire. type ExpiryTypeNever = exported.ExpiryTypeNever // SetExpiryOptions contains the optional parameters for the Client.SetExpiry method. type SetExpiryOptions = exported.SetExpiryOptions ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob/responses.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package blockblob import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // UploadResponse contains the response from method Client.Upload. type UploadResponse = generated.BlockBlobClientUploadResponse // UploadBlobFromURLResponse contains the response from the method Client.UploadBlobFromURL type UploadBlobFromURLResponse = generated.BlockBlobClientPutBlobFromURLResponse // StageBlockResponse contains the response from method Client.StageBlock. type StageBlockResponse = generated.BlockBlobClientStageBlockResponse // CommitBlockListResponse contains the response from method Client.CommitBlockList. type CommitBlockListResponse = generated.BlockBlobClientCommitBlockListResponse // StageBlockFromURLResponse contains the response from method Client.StageBlockFromURL. type StageBlockFromURLResponse = generated.BlockBlobClientStageBlockFromURLResponse // GetBlockListResponse contains the response from method Client.GetBlockList. type GetBlockListResponse = generated.BlockBlobClientGetBlockListResponse // uploadFromReaderResponse contains the response from method Client.UploadBuffer/Client.UploadFile. type uploadFromReaderResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. // Will be a part of response only if uploading data >= internal.MaxUploadBlobBytes (= 256 * 1024 * 1024 // 256MB) ContentCRC64 []byte } func toUploadReaderAtResponseFromUploadResponse(resp UploadResponse) uploadFromReaderResponse { return uploadFromReaderResponse{ ClientRequestID: resp.ClientRequestID, ContentMD5: resp.ContentMD5, Date: resp.Date, ETag: resp.ETag, EncryptionKeySHA256: resp.EncryptionKeySHA256, EncryptionScope: resp.EncryptionScope, IsServerEncrypted: resp.IsServerEncrypted, LastModified: resp.LastModified, RequestID: resp.RequestID, Version: resp.Version, VersionID: resp.VersionID, } } func toUploadReaderAtResponseFromCommitBlockListResponse(resp CommitBlockListResponse) uploadFromReaderResponse { return uploadFromReaderResponse{ ClientRequestID: resp.ClientRequestID, ContentMD5: resp.ContentMD5, Date: resp.Date, ETag: resp.ETag, EncryptionKeySHA256: resp.EncryptionKeySHA256, EncryptionScope: resp.EncryptionScope, IsServerEncrypted: resp.IsServerEncrypted, LastModified: resp.LastModified, RequestID: resp.RequestID, Version: resp.Version, VersionID: resp.VersionID, ContentCRC64: resp.ContentCRC64, } } // UploadFileResponse contains the response from method Client.UploadBuffer/Client.UploadFile. type UploadFileResponse = uploadFromReaderResponse // UploadBufferResponse contains the response from method Client.UploadBuffer/Client.UploadFile. type UploadBufferResponse = uploadFromReaderResponse // UploadStreamResponse contains the response from method Client.CommitBlockList. type UploadStreamResponse = CommitBlockListResponse // SetExpiryResponse contains the response from method Client.SetExpiry. type SetExpiryResponse = generated.BlobClientSetExpiryResponse ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/ci.yml ================================================ trigger: branches: include: - main - feature/* - hotfix/* - release/* paths: include: - sdk/storage/azblob pr: branches: include: - main - feature/* - hotfix/* - release/* paths: include: - sdk/storage/azblob extends: template: /eng/pipelines/templates/jobs/archetype-sdk-client.yml parameters: ServiceDirectory: 'storage/azblob' RunLiveTests: true UsePipelineProxy: false EnvVars: AZURE_CLIENT_ID: $(AZBLOB_CLIENT_ID) AZURE_TENANT_ID: $(AZBLOB_TENANT_ID) AZURE_CLIENT_SECRET: $(AZBLOB_CLIENT_SECRET) AZURE_SUBSCRIPTION_ID: $(AZBLOB_SUBSCRIPTION_ID) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package azblob import ( "context" "io" "os" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service" ) // ClientOptions contains the optional parameters when creating a Client. type ClientOptions base.ClientOptions // Client represents a URL to an Azure Storage blob; the blob may be a block blob, append blob, or page blob. type Client struct { svc *service.Client } // NewClient creates an instance of Client with the specified values. // - serviceURL - the URL of the storage account e.g. https://.blob.core.windows.net/ // - cred - an Azure AD credential, typically obtained via the azidentity module // - options - client options; pass nil to accept the default values func NewClient(serviceURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) { svcClient, err := service.NewClient(serviceURL, cred, (*service.ClientOptions)(options)) if err != nil { return nil, err } return &Client{ svc: svcClient, }, nil } // NewClientWithNoCredential creates an instance of Client with the specified values. // This is used to anonymously access a storage account or with a shared access signature (SAS) token. // - serviceURL - the URL of the storage account e.g. https://.blob.core.windows.net/? // - options - client options; pass nil to accept the default values func NewClientWithNoCredential(serviceURL string, options *ClientOptions) (*Client, error) { svcClient, err := service.NewClientWithNoCredential(serviceURL, (*service.ClientOptions)(options)) if err != nil { return nil, err } return &Client{ svc: svcClient, }, nil } // NewClientWithSharedKeyCredential creates an instance of Client with the specified values. // - serviceURL - the URL of the storage account e.g. https://.blob.core.windows.net/ // - cred - a SharedKeyCredential created with the matching storage account and access key // - options - client options; pass nil to accept the default values func NewClientWithSharedKeyCredential(serviceURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error) { svcClient, err := service.NewClientWithSharedKeyCredential(serviceURL, cred, (*service.ClientOptions)(options)) if err != nil { return nil, err } return &Client{ svc: svcClient, }, nil } // NewClientFromConnectionString creates an instance of Client with the specified values. // - connectionString - a connection string for the desired storage account // - options - client options; pass nil to accept the default values func NewClientFromConnectionString(connectionString string, options *ClientOptions) (*Client, error) { svcClient, err := service.NewClientFromConnectionString(connectionString, (*service.ClientOptions)(options)) if err != nil { return nil, err } return &Client{ svc: svcClient, }, nil } // URL returns the URL endpoint used by the BlobClient object. func (c *Client) URL() string { return c.svc.URL() } // ServiceClient returns the embedded service client for this client. func (c *Client) ServiceClient() *service.Client { return c.svc } // CreateContainer is a lifecycle method to creates a new container under the specified account. // If the container with the same name already exists, a ContainerAlreadyExists Error will be raised. // This method returns a client with which to interact with the newly created container. func (c *Client) CreateContainer(ctx context.Context, containerName string, o *CreateContainerOptions) (CreateContainerResponse, error) { return c.svc.CreateContainer(ctx, containerName, o) } // DeleteContainer is a lifecycle method that marks the specified container for deletion. // The container and any blobs contained within it are later deleted during garbage collection. // If the container is not found, a ResourceNotFoundError will be raised. func (c *Client) DeleteContainer(ctx context.Context, containerName string, o *DeleteContainerOptions) (DeleteContainerResponse, error) { return c.svc.DeleteContainer(ctx, containerName, o) } // DeleteBlob marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection. // Note that deleting a blob also deletes all its snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob. func (c *Client) DeleteBlob(ctx context.Context, containerName string, blobName string, o *DeleteBlobOptions) (DeleteBlobResponse, error) { return c.svc.NewContainerClient(containerName).NewBlobClient(blobName).Delete(ctx, o) } // NewListBlobsFlatPager returns a pager for blobs starting from the specified Marker. Use an empty // Marker to start enumeration from the beginning. Blob names are returned in lexicographic order. // For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs. func (c *Client) NewListBlobsFlatPager(containerName string, o *ListBlobsFlatOptions) *runtime.Pager[ListBlobsFlatResponse] { return c.svc.NewContainerClient(containerName).NewListBlobsFlatPager(o) } // NewListContainersPager operation returns a pager of the containers under the specified account. // Use an empty Marker to start enumeration from the beginning. Container names are returned in lexicographic order. // For more information, see https://docs.microsoft.com/rest/api/storageservices/list-containers2. func (c *Client) NewListContainersPager(o *ListContainersOptions) *runtime.Pager[ListContainersResponse] { return c.svc.NewListContainersPager(o) } // UploadBuffer uploads a buffer in blocks to a block blob. func (c *Client) UploadBuffer(ctx context.Context, containerName string, blobName string, buffer []byte, o *UploadBufferOptions) (UploadBufferResponse, error) { return c.svc.NewContainerClient(containerName).NewBlockBlobClient(blobName).UploadBuffer(ctx, buffer, o) } // UploadFile uploads a file in blocks to a block blob. func (c *Client) UploadFile(ctx context.Context, containerName string, blobName string, file *os.File, o *UploadFileOptions) (UploadFileResponse, error) { return c.svc.NewContainerClient(containerName).NewBlockBlobClient(blobName).UploadFile(ctx, file, o) } // UploadStream copies the file held in io.Reader to the Blob at blockBlobClient. // A Context deadline or cancellation will cause this to error. func (c *Client) UploadStream(ctx context.Context, containerName string, blobName string, body io.Reader, o *UploadStreamOptions) (UploadStreamResponse, error) { return c.svc.NewContainerClient(containerName).NewBlockBlobClient(blobName).UploadStream(ctx, body, o) } // DownloadBuffer downloads an Azure blob to a buffer with parallel. func (c *Client) DownloadBuffer(ctx context.Context, containerName string, blobName string, buffer []byte, o *DownloadBufferOptions) (int64, error) { return c.svc.NewContainerClient(containerName).NewBlobClient(blobName).DownloadBuffer(ctx, shared.NewBytesWriter(buffer), o) } // DownloadFile downloads an Azure blob to a local file. // The file would be truncated if the size doesn't match. func (c *Client) DownloadFile(ctx context.Context, containerName string, blobName string, file *os.File, o *DownloadFileOptions) (int64, error) { return c.svc.NewContainerClient(containerName).NewBlobClient(blobName).DownloadFile(ctx, file, o) } // DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob. func (c *Client) DownloadStream(ctx context.Context, containerName string, blobName string, o *DownloadStreamOptions) (DownloadStreamResponse, error) { o = shared.CopyOptions(o) return c.svc.NewContainerClient(containerName).NewBlobClient(blobName).DownloadStream(ctx, o) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/common.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package azblob import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" ) // SharedKeyCredential contains an account's name and its primary or secondary key. type SharedKeyCredential = exported.SharedKeyCredential // NewSharedKeyCredential creates an immutable SharedKeyCredential containing the // storage account's name and either its primary or secondary key. func NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) { return exported.NewSharedKeyCredential(accountName, accountKey) } // URLParts object represents the components that make up an Azure Storage Container/Blob URL. // NOTE: Changing any SAS-related field requires computing a new SAS signature. type URLParts = sas.URLParts // ParseURL parses a URL initializing URLParts' fields including any SAS-related & snapshot query parameters. Any other // query parameters remain in the UnparsedParams field. This method overwrites all fields in the URLParts object. func ParseURL(u string) (URLParts, error) { return sas.ParseURL(u) } // HTTPRange defines a range of bytes within an HTTP resource, starting at offset and // ending at offset+count. A zero-value HTTPRange indicates the entire resource. An HTTPRange // which has an offset and zero value count indicates from the offset to the resource's end. type HTTPRange = exported.HTTPRange ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package azblob import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // PublicAccessType defines values for AccessType - private (default) or blob or container. type PublicAccessType = generated.PublicAccessType const ( PublicAccessTypeBlob PublicAccessType = generated.PublicAccessTypeBlob PublicAccessTypeContainer PublicAccessType = generated.PublicAccessTypeContainer ) // PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type. func PossiblePublicAccessTypeValues() []PublicAccessType { return generated.PossiblePublicAccessTypeValues() } // DeleteSnapshotsOptionType defines values for DeleteSnapshotsOptionType. type DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionType const ( DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionTypeOnly DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeOnly ) // PossibleDeleteSnapshotsOptionTypeValues returns the possible values for the DeleteSnapshotsOptionType const type. func PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType { return generated.PossibleDeleteSnapshotsOptionTypeValues() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/batch_builder.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package container import ( "context" "fmt" "net/url" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" ) // BatchBuilder is used for creating the batch operations list. It contains the list of either delete or set tier sub-requests. // NOTE: All sub-requests in the batch must be of the same type, either delete or set tier. type BatchBuilder struct { endpoint string authPolicy policy.Policy subRequests []*policy.Request operationType *exported.BlobBatchOperationType } func (bb *BatchBuilder) checkOperationType(operationType exported.BlobBatchOperationType) error { if bb.operationType == nil { bb.operationType = &operationType return nil } if *bb.operationType != operationType { return fmt.Errorf("BlobBatch only supports one operation type per batch and is already being used for %s operations", *bb.operationType) } return nil } // Delete operation is used to add delete sub-request to the batch builder. func (bb *BatchBuilder) Delete(blobName string, options *BatchDeleteOptions) error { err := bb.checkOperationType(exported.BatchDeleteOperationType) if err != nil { return err } blobName = url.PathEscape(blobName) blobURL := runtime.JoinPaths(bb.endpoint, blobName) blobClient, err := blob.NewClientWithNoCredential(blobURL, nil) if err != nil { return err } deleteOptions, leaseInfo, accessConditions := options.format() req, err := getGeneratedBlobClient(blobClient).DeleteCreateRequest(context.TODO(), deleteOptions, leaseInfo, accessConditions) if err != nil { return err } // remove x-ms-version header exported.UpdateSubRequestHeaders(req) bb.subRequests = append(bb.subRequests, req) return nil } // SetTier operation is used to add set tier sub-request to the batch builder. func (bb *BatchBuilder) SetTier(blobName string, accessTier blob.AccessTier, options *BatchSetTierOptions) error { err := bb.checkOperationType(exported.BatchSetTierOperationType) if err != nil { return err } blobName = url.PathEscape(blobName) blobURL := runtime.JoinPaths(bb.endpoint, blobName) blobClient, err := blob.NewClientWithNoCredential(blobURL, nil) if err != nil { return err } setTierOptions, leaseInfo, accessConditions := options.format() req, err := getGeneratedBlobClient(blobClient).SetTierCreateRequest(context.TODO(), accessTier, setTierOptions, leaseInfo, accessConditions) if err != nil { return err } // remove x-ms-version header exported.UpdateSubRequestHeaders(req) bb.subRequests = append(bb.subRequests, req) return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package container import ( "bytes" "context" "errors" "fmt" "net/http" "net/url" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/appendblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" ) // ClientOptions contains the optional parameters when creating a Client. type ClientOptions base.ClientOptions // Client represents a URL to the Azure Storage container allowing you to manipulate its blobs. type Client base.Client[generated.ContainerClient] // NewClient creates an instance of Client with the specified values. // - containerURL - the URL of the container e.g. https://.blob.core.windows.net/container // - cred - an Azure AD credential, typically obtained via the azidentity module // - options - client options; pass nil to accept the default values func NewClient(containerURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) { audience := base.GetAudience((*base.ClientOptions)(options)) conOptions := shared.GetClientOptions(options) authPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewContainerClient(containerURL, azClient, &cred, (*base.ClientOptions)(conOptions))), nil } // NewClientWithNoCredential creates an instance of Client with the specified values. // This is used to anonymously access a container or with a shared access signature (SAS) token. // - containerURL - the URL of the container e.g. https://.blob.core.windows.net/container? // - options - client options; pass nil to accept the default values func NewClientWithNoCredential(containerURL string, options *ClientOptions) (*Client, error) { conOptions := shared.GetClientOptions(options) azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewContainerClient(containerURL, azClient, nil, (*base.ClientOptions)(conOptions))), nil } // NewClientWithSharedKeyCredential creates an instance of Client with the specified values. // - containerURL - the URL of the container e.g. https://.blob.core.windows.net/container // - cred - a SharedKeyCredential created with the matching container's storage account and access key // - options - client options; pass nil to accept the default values func NewClientWithSharedKeyCredential(containerURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error) { authPolicy := exported.NewSharedKeyCredPolicy(cred) conOptions := shared.GetClientOptions(options) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewContainerClient(containerURL, azClient, cred, (*base.ClientOptions)(conOptions))), nil } // NewClientFromConnectionString creates an instance of Client with the specified values. // - connectionString - a connection string for the desired storage account // - containerName - the name of the container within the storage account // - options - client options; pass nil to accept the default values func NewClientFromConnectionString(connectionString string, containerName string, options *ClientOptions) (*Client, error) { parsed, err := shared.ParseConnectionString(connectionString) if err != nil { return nil, err } parsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName) if parsed.AccountKey != "" && parsed.AccountName != "" { credential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey) if err != nil { return nil, err } return NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options) } return NewClientWithNoCredential(parsed.ServiceURL, options) } func (c *Client) generated() *generated.ContainerClient { return base.InnerClient((*base.Client[generated.ContainerClient])(c)) } func (c *Client) sharedKey() *SharedKeyCredential { return base.SharedKey((*base.Client[generated.ContainerClient])(c)) } func (c *Client) credential() any { return base.Credential((*base.Client[generated.ContainerClient])(c)) } // helper method to return the generated.BlobClient which is used for creating the sub-requests func getGeneratedBlobClient(b *blob.Client) *generated.BlobClient { return base.InnerClient((*base.Client[generated.BlobClient])(b)) } func (c *Client) getClientOptions() *base.ClientOptions { return base.GetClientOptions((*base.Client[generated.ContainerClient])(c)) } // URL returns the URL endpoint used by the Client object. func (c *Client) URL() string { return c.generated().Endpoint() } // NewBlobClient creates a new blob.Client object by concatenating blobName to the end of // Client's URL. The blob name will be URL-encoded. // The new blob.Client uses the same request policy pipeline as this Client. func (c *Client) NewBlobClient(blobName string) *blob.Client { blobName = url.PathEscape(blobName) blobURL := runtime.JoinPaths(c.URL(), blobName) return (*blob.Client)(base.NewBlobClient(blobURL, c.generated().InternalClient().WithClientName(exported.ModuleName), c.credential(), c.getClientOptions())) } // NewAppendBlobClient creates a new appendblob.Client object by concatenating blobName to the end of // this Client's URL. The blob name will be URL-encoded. // The new appendblob.Client uses the same request policy pipeline as this Client. func (c *Client) NewAppendBlobClient(blobName string) *appendblob.Client { blobName = url.PathEscape(blobName) blobURL := runtime.JoinPaths(c.URL(), blobName) return (*appendblob.Client)(base.NewAppendBlobClient(blobURL, c.generated().InternalClient().WithClientName(exported.ModuleName), c.sharedKey())) } // NewBlockBlobClient creates a new blockblob.Client object by concatenating blobName to the end of // this Client's URL. The blob name will be URL-encoded. // The new blockblob.Client uses the same request policy pipeline as this Client. func (c *Client) NewBlockBlobClient(blobName string) *blockblob.Client { blobName = url.PathEscape(blobName) blobURL := runtime.JoinPaths(c.URL(), blobName) return (*blockblob.Client)(base.NewBlockBlobClient(blobURL, c.generated().InternalClient().WithClientName(exported.ModuleName), c.sharedKey())) } // NewPageBlobClient creates a new pageblob.Client object by concatenating blobName to the end of // this Client's URL. The blob name will be URL-encoded. // The new pageblob.Client uses the same request policy pipeline as this Client. func (c *Client) NewPageBlobClient(blobName string) *pageblob.Client { blobName = url.PathEscape(blobName) blobURL := runtime.JoinPaths(c.URL(), blobName) return (*pageblob.Client)(base.NewPageBlobClient(blobURL, c.generated().InternalClient().WithClientName(exported.ModuleName), c.sharedKey())) } // Create creates a new container within a storage account. If a container with the same name already exists, the operation fails. // For more information, see https://docs.microsoft.com/rest/api/storageservices/create-container. func (c *Client) Create(ctx context.Context, options *CreateOptions) (CreateResponse, error) { var opts *generated.ContainerClientCreateOptions var cpkScopes *generated.ContainerCPKScopeInfo if options != nil { opts = &generated.ContainerClientCreateOptions{ Access: options.Access, Metadata: options.Metadata, } cpkScopes = options.CPKScopeInfo } resp, err := c.generated().Create(ctx, opts, cpkScopes) return resp, err } // Delete marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection. // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-container. func (c *Client) Delete(ctx context.Context, options *DeleteOptions) (DeleteResponse, error) { opts, leaseAccessConditions, modifiedAccessConditions := options.format() resp, err := c.generated().Delete(ctx, opts, leaseAccessConditions, modifiedAccessConditions) return resp, err } // Restore operation restore the contents and properties of a soft deleted container to a specified container. // For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/restore-container. func (c *Client) Restore(ctx context.Context, deletedContainerVersion string, options *RestoreOptions) (RestoreResponse, error) { urlParts, err := blob.ParseURL(c.URL()) if err != nil { return RestoreResponse{}, err } opts := &generated.ContainerClientRestoreOptions{ DeletedContainerName: &urlParts.ContainerName, DeletedContainerVersion: &deletedContainerVersion, } resp, err := c.generated().Restore(ctx, opts) return resp, err } // GetProperties returns the container's properties. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-metadata. func (c *Client) GetProperties(ctx context.Context, o *GetPropertiesOptions) (GetPropertiesResponse, error) { // NOTE: GetMetadata actually calls GetProperties internally because GetProperties returns the metadata AND the properties. // This allows us to not expose a GetMetadata method at all simplifying the API. // The optionals are nil, like they were in track 1.5 opts, leaseAccessConditions := o.format() resp, err := c.generated().GetProperties(ctx, opts, leaseAccessConditions) return resp, err } // SetMetadata sets the container's metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-metadata. func (c *Client) SetMetadata(ctx context.Context, o *SetMetadataOptions) (SetMetadataResponse, error) { metadataOptions, lac, mac := o.format() resp, err := c.generated().SetMetadata(ctx, metadataOptions, lac, mac) return resp, err } // GetAccessPolicy returns the container's access policy. The access policy indicates whether container's blobs may be accessed publicly. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-acl. func (c *Client) GetAccessPolicy(ctx context.Context, o *GetAccessPolicyOptions) (GetAccessPolicyResponse, error) { options, ac := o.format() resp, err := c.generated().GetAccessPolicy(ctx, options, ac) return resp, err } // SetAccessPolicy sets the container's permissions. The access policy indicates whether blobs in a container may be accessed publicly. // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-acl. func (c *Client) SetAccessPolicy(ctx context.Context, o *SetAccessPolicyOptions) (SetAccessPolicyResponse, error) { accessPolicy, mac, lac, acl, err := o.format() if err != nil { return SetAccessPolicyResponse{}, err } resp, err := c.generated().SetAccessPolicy(ctx, acl, accessPolicy, mac, lac) return resp, err } // GetAccountInfo provides account level information // For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures. func (c *Client) GetAccountInfo(ctx context.Context, o *GetAccountInfoOptions) (GetAccountInfoResponse, error) { getAccountInfoOptions := o.format() resp, err := c.generated().GetAccountInfo(ctx, getAccountInfoOptions) return resp, err } // NewListBlobsFlatPager returns a pager for blobs starting from the specified Marker. Use an empty // Marker to start enumeration from the beginning. Blob names are returned in lexicographic order. // For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs. func (c *Client) NewListBlobsFlatPager(o *ListBlobsFlatOptions) *runtime.Pager[ListBlobsFlatResponse] { listOptions := generated.ContainerClientListBlobFlatSegmentOptions{} if o != nil { listOptions.Include = o.Include.format() listOptions.Marker = o.Marker listOptions.Maxresults = o.MaxResults listOptions.Prefix = o.Prefix } return runtime.NewPager(runtime.PagingHandler[ListBlobsFlatResponse]{ More: func(page ListBlobsFlatResponse) bool { return page.NextMarker != nil && len(*page.NextMarker) > 0 }, Fetcher: func(ctx context.Context, page *ListBlobsFlatResponse) (ListBlobsFlatResponse, error) { var req *policy.Request var err error if page == nil { req, err = c.generated().ListBlobFlatSegmentCreateRequest(ctx, &listOptions) } else { listOptions.Marker = page.NextMarker req, err = c.generated().ListBlobFlatSegmentCreateRequest(ctx, &listOptions) } if err != nil { return ListBlobsFlatResponse{}, err } resp, err := c.generated().InternalClient().Pipeline().Do(req) if err != nil { return ListBlobsFlatResponse{}, err } if !runtime.HasStatusCode(resp, http.StatusOK) { // TOOD: storage error? return ListBlobsFlatResponse{}, runtime.NewResponseError(resp) } return c.generated().ListBlobFlatSegmentHandleResponse(resp) }, }) } // NewListBlobsHierarchyPager returns a channel of blobs starting from the specified Marker. Use an empty // Marker to start enumeration from the beginning. Blob names are returned in lexicographic order. // After getting a segment, process it, and then call ListBlobsHierarchicalSegment again (passing the // previously-returned Marker) to get the next segment. // For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs. func (c *Client) NewListBlobsHierarchyPager(delimiter string, o *ListBlobsHierarchyOptions) *runtime.Pager[ListBlobsHierarchyResponse] { listOptions := o.format() return runtime.NewPager(runtime.PagingHandler[ListBlobsHierarchyResponse]{ More: func(page ListBlobsHierarchyResponse) bool { return page.NextMarker != nil && len(*page.NextMarker) > 0 }, Fetcher: func(ctx context.Context, page *ListBlobsHierarchyResponse) (ListBlobsHierarchyResponse, error) { var req *policy.Request var err error if page == nil { req, err = c.generated().ListBlobHierarchySegmentCreateRequest(ctx, delimiter, &listOptions) } else { listOptions.Marker = page.NextMarker req, err = c.generated().ListBlobHierarchySegmentCreateRequest(ctx, delimiter, &listOptions) } if err != nil { return ListBlobsHierarchyResponse{}, err } resp, err := c.generated().InternalClient().Pipeline().Do(req) if err != nil { return ListBlobsHierarchyResponse{}, err } if !runtime.HasStatusCode(resp, http.StatusOK) { return ListBlobsHierarchyResponse{}, runtime.NewResponseError(resp) } return c.generated().ListBlobHierarchySegmentHandleResponse(resp) }, }) } // GetSASURL is a convenience method for generating a SAS token for the currently pointed at container. // It can only be used if the credential supplied during creation was a SharedKeyCredential. func (c *Client) GetSASURL(permissions sas.ContainerPermissions, expiry time.Time, o *GetSASURLOptions) (string, error) { if c.sharedKey() == nil { return "", bloberror.MissingSharedKeyCredential } st := o.format() urlParts, err := blob.ParseURL(c.URL()) if err != nil { return "", err } // Containers do not have snapshots, nor versions. qps, err := sas.BlobSignatureValues{ Version: sas.Version, ContainerName: urlParts.ContainerName, Permissions: permissions.String(), StartTime: st, ExpiryTime: expiry.UTC(), }.SignWithSharedKey(c.sharedKey()) if err != nil { return "", err } endpoint := c.URL() + "?" + qps.Encode() return endpoint, nil } // NewBatchBuilder creates an instance of BatchBuilder using the same auth policy as the client. // BatchBuilder is used to build the batch consisting of either delete or set tier sub-requests. // All sub-requests in the batch must be of the same type, either delete or set tier. func (c *Client) NewBatchBuilder() (*BatchBuilder, error) { var authPolicy policy.Policy switch cred := c.credential().(type) { case *azcore.TokenCredential: conOptions := c.getClientOptions() authPolicy = shared.NewStorageChallengePolicy(*cred, base.GetAudience(conOptions), conOptions.InsecureAllowCredentialWithHTTP) case *SharedKeyCredential: authPolicy = exported.NewSharedKeyCredPolicy(cred) case nil: // for authentication using SAS authPolicy = nil default: return nil, fmt.Errorf("unrecognised authentication type %T", cred) } return &BatchBuilder{ endpoint: c.URL(), authPolicy: authPolicy, }, nil } // SubmitBatch operation allows multiple API calls to be embedded into a single HTTP request. // It builds the request body using the BatchBuilder object passed. // BatchBuilder contains the list of operations to be submitted. It supports up to 256 sub-requests in a single batch. // For more information, see https://docs.microsoft.com/rest/api/storageservices/blob-batch. func (c *Client) SubmitBatch(ctx context.Context, bb *BatchBuilder, options *SubmitBatchOptions) (SubmitBatchResponse, error) { if bb == nil || len(bb.subRequests) == 0 { return SubmitBatchResponse{}, errors.New("batch builder is empty") } // create the request body batchReq, batchID, err := exported.CreateBatchRequest(&exported.BlobBatchBuilder{ AuthPolicy: bb.authPolicy, SubRequests: bb.subRequests, }) if err != nil { return SubmitBatchResponse{}, err } reader := bytes.NewReader(batchReq) rsc := streaming.NopCloser(reader) multipartContentType := "multipart/mixed; boundary=" + batchID resp, err := c.generated().SubmitBatch(ctx, int64(len(batchReq)), multipartContentType, rsc, options.format()) if err != nil { return SubmitBatchResponse{}, err } batchResponses, err := exported.ParseBlobBatchResponse(resp.Body, resp.ContentType, bb.subRequests) if err != nil { return SubmitBatchResponse{}, err } return SubmitBatchResponse{ Responses: batchResponses, ContentType: resp.ContentType, RequestID: resp.RequestID, Version: resp.Version, }, nil } // FilterBlobs operation finds all blobs in the container whose tags match a given search expression. // https://docs.microsoft.com/en-us/rest/api/storageservices/find-blobs-by-tags-container // eg. "dog='germanshepherd' and penguin='emperorpenguin'" func (c *Client) FilterBlobs(ctx context.Context, where string, o *FilterBlobsOptions) (FilterBlobsResponse, error) { containerClientFilterBlobsOptions := o.format() resp, err := c.generated().FilterBlobs(ctx, where, containerClientFilterBlobsOptions) return resp, err } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package container import "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" // AccessTier defines values for blob access tiers. type AccessTier = generated.AccessTier const ( AccessTierArchive AccessTier = generated.AccessTierArchive AccessTierCool AccessTier = generated.AccessTierCool AccessTierHot AccessTier = generated.AccessTierHot AccessTierP10 AccessTier = generated.AccessTierP10 AccessTierP15 AccessTier = generated.AccessTierP15 AccessTierP20 AccessTier = generated.AccessTierP20 AccessTierP30 AccessTier = generated.AccessTierP30 AccessTierP4 AccessTier = generated.AccessTierP4 AccessTierP40 AccessTier = generated.AccessTierP40 AccessTierP50 AccessTier = generated.AccessTierP50 AccessTierP6 AccessTier = generated.AccessTierP6 AccessTierP60 AccessTier = generated.AccessTierP60 AccessTierP70 AccessTier = generated.AccessTierP70 AccessTierP80 AccessTier = generated.AccessTierP80 AccessTierPremium AccessTier = generated.AccessTierPremium ) // PossibleAccessTierValues returns the possible values for the AccessTier const type. func PossibleAccessTierValues() []AccessTier { return generated.PossibleAccessTierValues() } // PublicAccessType defines values for AccessType - private (default) or blob or container. type PublicAccessType = generated.PublicAccessType const ( PublicAccessTypeBlob PublicAccessType = generated.PublicAccessTypeBlob PublicAccessTypeContainer PublicAccessType = generated.PublicAccessTypeContainer ) // PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type. func PossiblePublicAccessTypeValues() []PublicAccessType { return generated.PossiblePublicAccessTypeValues() } // SKUName defines values for SkuName - LRS, GRS, RAGRS, ZRS, Premium LRS. type SKUName = generated.SKUName const ( SKUNameStandardLRS SKUName = generated.SKUNameStandardLRS SKUNameStandardGRS SKUName = generated.SKUNameStandardGRS SKUNameStandardRAGRS SKUName = generated.SKUNameStandardRAGRS SKUNameStandardZRS SKUName = generated.SKUNameStandardZRS SKUNamePremiumLRS SKUName = generated.SKUNamePremiumLRS ) // PossibleSKUNameValues returns the possible values for the SKUName const type. func PossibleSKUNameValues() []SKUName { return generated.PossibleSKUNameValues() } // AccountKind defines values for AccountKind type AccountKind = generated.AccountKind const ( AccountKindStorage AccountKind = generated.AccountKindStorage AccountKindBlobStorage AccountKind = generated.AccountKindBlobStorage AccountKindStorageV2 AccountKind = generated.AccountKindStorageV2 AccountKindFileStorage AccountKind = generated.AccountKindFileStorage AccountKindBlockBlobStorage AccountKind = generated.AccountKindBlockBlobStorage ) // PossibleAccountKindValues returns the possible values for the AccountKind const type. func PossibleAccountKindValues() []AccountKind { return generated.PossibleAccountKindValues() } // BlobType defines values for BlobType type BlobType = generated.BlobType const ( BlobTypeBlockBlob BlobType = generated.BlobTypeBlockBlob BlobTypePageBlob BlobType = generated.BlobTypePageBlob BlobTypeAppendBlob BlobType = generated.BlobTypeAppendBlob ) // PossibleBlobTypeValues returns the possible values for the BlobType const type. func PossibleBlobTypeValues() []BlobType { return generated.PossibleBlobTypeValues() } // ArchiveStatus defines values for ArchiveStatus type ArchiveStatus = generated.ArchiveStatus const ( ArchiveStatusRehydratePendingToCool ArchiveStatus = generated.ArchiveStatusRehydratePendingToCool ArchiveStatusRehydratePendingToHot ArchiveStatus = generated.ArchiveStatusRehydratePendingToHot ) // PossibleArchiveStatusValues returns the possible values for the ArchiveStatus const type. func PossibleArchiveStatusValues() []ArchiveStatus { return generated.PossibleArchiveStatusValues() } // CopyStatusType defines values for CopyStatusType type CopyStatusType = generated.CopyStatusType const ( CopyStatusTypePending CopyStatusType = generated.CopyStatusTypePending CopyStatusTypeSuccess CopyStatusType = generated.CopyStatusTypeSuccess CopyStatusTypeAborted CopyStatusType = generated.CopyStatusTypeAborted CopyStatusTypeFailed CopyStatusType = generated.CopyStatusTypeFailed ) // PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type. func PossibleCopyStatusTypeValues() []CopyStatusType { return generated.PossibleCopyStatusTypeValues() } // ImmutabilityPolicyMode defines values for ImmutabilityPolicyMode type ImmutabilityPolicyMode = generated.ImmutabilityPolicyMode const ( ImmutabilityPolicyModeMutable ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeMutable ImmutabilityPolicyModeUnlocked ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeUnlocked ImmutabilityPolicyModeLocked ImmutabilityPolicyMode = generated.ImmutabilityPolicyModeLocked ) // PossibleImmutabilityPolicyModeValues returns the possible values for the ImmutabilityPolicyMode const type. func PossibleImmutabilityPolicyModeValues() []ImmutabilityPolicyMode { return generated.PossibleImmutabilityPolicyModeValues() } // RehydratePriority - If an object is in rehydrate pending state then this header is returned with priority of rehydrate. // Valid values are High and Standard. type RehydratePriority = generated.RehydratePriority const ( RehydratePriorityHigh RehydratePriority = generated.RehydratePriorityHigh RehydratePriorityStandard RehydratePriority = generated.RehydratePriorityStandard ) // PossibleRehydratePriorityValues returns the possible values for the RehydratePriority const type. func PossibleRehydratePriorityValues() []RehydratePriority { return generated.PossibleRehydratePriorityValues() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/models.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package container import ( "reflect" "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // SharedKeyCredential contains an account's name and its primary or secondary key. type SharedKeyCredential = exported.SharedKeyCredential // NewSharedKeyCredential creates an immutable SharedKeyCredential containing the // storage account's name and either its primary or secondary key. func NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) { return exported.NewSharedKeyCredential(accountName, accountKey) } // Request Model Declaration ------------------------------------------------------------------------------------------- // CPKScopeInfo contains a group of parameters for the ContainerClient.Create method. type CPKScopeInfo = generated.ContainerCPKScopeInfo // BlobFlatListSegment - List of BlobItem. type BlobFlatListSegment = generated.BlobFlatListSegment // BlobHierarchyListSegment - List of BlobItem and BlobPrefix. type BlobHierarchyListSegment = generated.BlobHierarchyListSegment // BlobProperties - Properties of a blob. type BlobProperties = generated.BlobProperties // BlobItem - An Azure Storage blob. type BlobItem = generated.BlobItem // BlobTags - Blob tags. type BlobTags = generated.BlobTags // BlobPrefix is a blob's prefix when hierarchically listing blobs. type BlobPrefix = generated.BlobPrefix // BlobTag - a key/value pair on a blob. type BlobTag = generated.BlobTag // AccessConditions identifies container-specific access conditions which you optionally set. type AccessConditions = exported.ContainerAccessConditions // LeaseAccessConditions contains optional parameters to access leased entity. type LeaseAccessConditions = exported.LeaseAccessConditions // ModifiedAccessConditions contains a group of parameters for specifying access conditions. type ModifiedAccessConditions = exported.ModifiedAccessConditions // AccessPolicy - An Access policy. type AccessPolicy = generated.AccessPolicy // AccessPolicyPermission type simplifies creating the permissions string for a container's access policy. // Initialize an instance of this type and then call its String method to set AccessPolicy's Permission field. type AccessPolicyPermission = exported.AccessPolicyPermission // SignedIdentifier - signed identifier. type SignedIdentifier = generated.SignedIdentifier // Request Model Declaration ------------------------------------------------------------------------------------------- // CreateOptions contains the optional parameters for the Client.Create method. type CreateOptions struct { // Specifies whether data in the container may be accessed publicly and the level of access. Access *PublicAccessType // Optional. Specifies a user-defined name-value pair associated with the blob. Metadata map[string]*string // Optional. Specifies the encryption scope settings to set on the container. CPKScopeInfo *CPKScopeInfo } // --------------------------------------------------------------------------------------------------------------------- // DeleteOptions contains the optional parameters for the Client.Delete method. type DeleteOptions struct { AccessConditions *AccessConditions } func (o *DeleteOptions) format() (*generated.ContainerClientDeleteOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatContainerAccessConditions(o.AccessConditions) return nil, leaseAccessConditions, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // RestoreOptions contains the optional parameters for the Client.Restore method. type RestoreOptions struct { // placeholder for future options } // --------------------------------------------------------------------------------------------------------------------- // GetPropertiesOptions contains the optional parameters for the ContainerClient.GetProperties method. type GetPropertiesOptions struct { LeaseAccessConditions *LeaseAccessConditions } // ContainerClientGetPropertiesOptions contains the optional parameters for the ContainerClient.GetProperties method. func (o *GetPropertiesOptions) format() (*generated.ContainerClientGetPropertiesOptions, *generated.LeaseAccessConditions) { if o == nil { return nil, nil } return nil, o.LeaseAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // ListBlobsInclude indicates what additional information the service should return with each blob. type ListBlobsInclude struct { Copy, Metadata, Snapshots, UncommittedBlobs, Deleted, Tags, Versions, LegalHold, ImmutabilityPolicy, DeletedWithVersions, Permissions bool } func (l ListBlobsInclude) format() []generated.ListBlobsIncludeItem { if reflect.ValueOf(l).IsZero() { return nil } include := []generated.ListBlobsIncludeItem{} if l.Copy { include = append(include, generated.ListBlobsIncludeItemCopy) } if l.Deleted { include = append(include, generated.ListBlobsIncludeItemDeleted) } if l.DeletedWithVersions { include = append(include, generated.ListBlobsIncludeItemDeletedwithversions) } if l.ImmutabilityPolicy { include = append(include, generated.ListBlobsIncludeItemImmutabilitypolicy) } if l.LegalHold { include = append(include, generated.ListBlobsIncludeItemLegalhold) } if l.Metadata { include = append(include, generated.ListBlobsIncludeItemMetadata) } if l.Snapshots { include = append(include, generated.ListBlobsIncludeItemSnapshots) } if l.Tags { include = append(include, generated.ListBlobsIncludeItemTags) } if l.UncommittedBlobs { include = append(include, generated.ListBlobsIncludeItemUncommittedblobs) } if l.Versions { include = append(include, generated.ListBlobsIncludeItemVersions) } if l.Permissions { include = append(include, generated.ListBlobsIncludeItemPermissions) } return include } // ListBlobsFlatOptions contains the optional parameters for the ContainerClient.ListBlobFlatSegment method. type ListBlobsFlatOptions struct { // Include this parameter to specify one or more datasets to include in the response. Include ListBlobsInclude // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify MaxResults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by MaxResults, or than the default of 5000. MaxResults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string } // --------------------------------------------------------------------------------------------------------------------- // ListBlobsHierarchyOptions provides set of configurations for Client.NewListBlobsHierarchyPager type ListBlobsHierarchyOptions struct { // Include this parameter to specify one or more datasets to include in the response. Include ListBlobsInclude // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify MaxResults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by MaxResults, or than the default of 5000. MaxResults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string } // ContainerClientListBlobHierarchySegmentOptions contains the optional parameters for the ContainerClient.ListBlobHierarchySegment method. func (o *ListBlobsHierarchyOptions) format() generated.ContainerClientListBlobHierarchySegmentOptions { if o == nil { return generated.ContainerClientListBlobHierarchySegmentOptions{} } return generated.ContainerClientListBlobHierarchySegmentOptions{ Include: o.Include.format(), Marker: o.Marker, Maxresults: o.MaxResults, Prefix: o.Prefix, } } // --------------------------------------------------------------------------------------------------------------------- // GetSASURLOptions contains the optional parameters for the Client.GetSASURL method. type GetSASURLOptions struct { StartTime *time.Time } func (o *GetSASURLOptions) format() time.Time { if o == nil { return time.Time{} } var st time.Time if o.StartTime != nil { st = o.StartTime.UTC() } else { st = time.Time{} } return st } // --------------------------------------------------------------------------------------------------------------------- // SetMetadataOptions contains the optional parameters for the Client.SetMetadata method. type SetMetadataOptions struct { Metadata map[string]*string LeaseAccessConditions *LeaseAccessConditions ModifiedAccessConditions *ModifiedAccessConditions } func (o *SetMetadataOptions) format() (*generated.ContainerClientSetMetadataOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } return &generated.ContainerClientSetMetadataOptions{Metadata: o.Metadata}, o.LeaseAccessConditions, o.ModifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // GetAccessPolicyOptions contains the optional parameters for the Client.GetAccessPolicy method. type GetAccessPolicyOptions struct { LeaseAccessConditions *LeaseAccessConditions } func (o *GetAccessPolicyOptions) format() (*generated.ContainerClientGetAccessPolicyOptions, *LeaseAccessConditions) { if o == nil { return nil, nil } return nil, o.LeaseAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // SetAccessPolicyOptions provides set of configurations for ContainerClient.SetAccessPolicy operation. type SetAccessPolicyOptions struct { // Specifies whether data in the container may be accessed publicly and the level of access. // If this header is not included in the request, container data is private to the account owner. Access *PublicAccessType AccessConditions *AccessConditions ContainerACL []*SignedIdentifier } func (o *SetAccessPolicyOptions) format() (*generated.ContainerClientSetAccessPolicyOptions, *LeaseAccessConditions, *ModifiedAccessConditions, []*SignedIdentifier, error) { if o == nil { return nil, nil, nil, nil, nil } if o.ContainerACL != nil { for _, c := range o.ContainerACL { err := formatTime(c) if err != nil { return nil, nil, nil, nil, err } } } lac, mac := exported.FormatContainerAccessConditions(o.AccessConditions) return &generated.ContainerClientSetAccessPolicyOptions{ Access: o.Access, }, lac, mac, o.ContainerACL, nil } func formatTime(c *SignedIdentifier) error { if c.AccessPolicy == nil { return nil } if c.AccessPolicy.Start != nil { st, err := time.Parse(time.RFC3339, c.AccessPolicy.Start.UTC().Format(time.RFC3339)) if err != nil { return err } c.AccessPolicy.Start = &st } if c.AccessPolicy.Expiry != nil { et, err := time.Parse(time.RFC3339, c.AccessPolicy.Expiry.UTC().Format(time.RFC3339)) if err != nil { return err } c.AccessPolicy.Expiry = &et } return nil } // --------------------------------------------------------------------------------------------------------------------- // GetAccountInfoOptions provides set of options for Client.GetAccountInfo type GetAccountInfoOptions struct { // placeholder for future options } func (o *GetAccountInfoOptions) format() *generated.ContainerClientGetAccountInfoOptions { return nil } // --------------------------------------------------------------------------------------------------------------------- // BatchDeleteOptions contains the optional parameters for the BatchBuilder.Delete method. type BatchDeleteOptions struct { blob.DeleteOptions VersionID *string Snapshot *string } func (o *BatchDeleteOptions) format() (*generated.BlobClientDeleteOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } basics := generated.BlobClientDeleteOptions{ DeleteSnapshots: o.DeleteSnapshots, DeleteType: o.BlobDeleteType, // None by default Snapshot: o.Snapshot, VersionID: o.VersionID, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &basics, leaseAccessConditions, modifiedAccessConditions } // BatchSetTierOptions contains the optional parameters for the BatchBuilder.SetTier method. type BatchSetTierOptions struct { blob.SetTierOptions VersionID *string Snapshot *string } func (o *BatchSetTierOptions) format() (*generated.BlobClientSetTierOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } basics := generated.BlobClientSetTierOptions{ RehydratePriority: o.RehydratePriority, Snapshot: o.Snapshot, VersionID: o.VersionID, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &basics, leaseAccessConditions, modifiedAccessConditions } // SubmitBatchOptions contains the optional parameters for the Client.SubmitBatch method. type SubmitBatchOptions struct { // placeholder for future options } func (o *SubmitBatchOptions) format() *generated.ContainerClientSubmitBatchOptions { return nil } // --------------------------------------------------------------------------------------------------------------------- // FilterBlobsOptions provides set of options for Client.FilterBlobs. type FilterBlobsOptions struct { // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. MaxResults *int32 } func (o *FilterBlobsOptions) format() *generated.ContainerClientFilterBlobsOptions { if o == nil { return nil } return &generated.ContainerClientFilterBlobsOptions{ Marker: o.Marker, Maxresults: o.MaxResults, } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container/responses.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package container import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // CreateResponse contains the response from method Client.Create. type CreateResponse = generated.ContainerClientCreateResponse // DeleteResponse contains the response from method Client.Delete. type DeleteResponse = generated.ContainerClientDeleteResponse // RestoreResponse contains the response from method Client.Restore. type RestoreResponse = generated.ContainerClientRestoreResponse // GetPropertiesResponse contains the response from method Client.GetProperties. type GetPropertiesResponse = generated.ContainerClientGetPropertiesResponse // ListBlobsFlatResponse contains the response from method Client.ListBlobFlatSegment. type ListBlobsFlatResponse = generated.ContainerClientListBlobFlatSegmentResponse // ListBlobsFlatSegmentResponse - An enumeration of blobs type ListBlobsFlatSegmentResponse = generated.ListBlobsFlatSegmentResponse // ListBlobsHierarchyResponse contains the response from method Client.ListBlobHierarchySegment. type ListBlobsHierarchyResponse = generated.ContainerClientListBlobHierarchySegmentResponse // ListBlobsHierarchySegmentResponse - An enumeration of blobs type ListBlobsHierarchySegmentResponse = generated.ListBlobsHierarchySegmentResponse // SetMetadataResponse contains the response from method Client.SetMetadata. type SetMetadataResponse = generated.ContainerClientSetMetadataResponse // GetAccessPolicyResponse contains the response from method Client.GetAccessPolicy. type GetAccessPolicyResponse = generated.ContainerClientGetAccessPolicyResponse // SetAccessPolicyResponse contains the response from method Client.SetAccessPolicy. type SetAccessPolicyResponse = generated.ContainerClientSetAccessPolicyResponse // GetAccountInfoResponse contains the response from method Client.GetAccountInfo. type GetAccountInfoResponse = generated.ContainerClientGetAccountInfoResponse // SubmitBatchResponse contains the response from method Client.SubmitBatch. type SubmitBatchResponse struct { // Responses contains the responses of the sub-requests in the batch Responses []*BatchResponseItem // ContentType contains the information returned from the Content-Type header response. ContentType *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BatchResponseItem contains the response for the individual sub-requests. type BatchResponseItem = exported.BatchResponseItem // FilterBlobsResponse contains the response from method Client.FilterBlobs. type FilterBlobsResponse = generated.ContainerClientFilterBlobsResponse ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/doc.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. /* Package azblob can access an Azure Blob Storage. The azblob package is capable of :- - Creating, deleting, and querying containers in an account - Creating, deleting, and querying blobs in a container - Creating Shared Access Signature for authentication Types of Resources The azblob package allows you to interact with three types of resources :- * Azure storage accounts. * Containers within those storage accounts. * Blobs (block blobs/ page blobs/ append blobs) within those containers. The Azure Blob Storage (azblob) client library for Go allows you to interact with each of these components through the use of a dedicated client object. To create a client object, you will need the account's blob service endpoint URL and a credential that allows you to access the account. Types of Credentials The clients support different forms of authentication. The azblob library supports any of the `azcore.TokenCredential` interfaces, authorization via a Connection String, or authorization with a Shared Access Signature token. Using a Shared Key To use an account shared key (aka account key or access key), provide the key as a string. This can be found in your storage account in the Azure Portal under the "Access Keys" section. Use the key as the credential parameter to authenticate the client: accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME") if !ok { panic("AZURE_STORAGE_ACCOUNT_NAME could not be found") } accountKey, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_KEY") if !ok { panic("AZURE_STORAGE_ACCOUNT_KEY could not be found") } serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName) cred, err := azblob.NewSharedKeyCredential(accountName, accountKey) handle(err) serviceClient, err := azblob.NewClientWithSharedKeyCredential(serviceURL, cred, nil) handle(err) fmt.Println(serviceClient.URL()) Using a Connection String Depending on your use case and authorization method, you may prefer to initialize a client instance with a connection string instead of providing the account URL and credential separately. To do this, pass the connection string to the service client's `NewClientFromConnectionString` method. The connection string can be found in your storage account in the Azure Portal under the "Access Keys" section. connStr := "DefaultEndpointsProtocol=https;AccountName=;AccountKey=;EndpointSuffix=core.windows.net" serviceClient, err := azblob.NewClientFromConnectionString(connStr, nil) handle(err) Using a Shared Access Signature (SAS) Token To use a shared access signature (SAS) token, provide the token at the end of your service URL. You can generate a SAS token from the Azure Portal under Shared Access Signature or use the ServiceClient.GetSASToken() functions. accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME") if !ok { panic("AZURE_STORAGE_ACCOUNT_NAME could not be found") } accountKey, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_KEY") if !ok { panic("AZURE_STORAGE_ACCOUNT_KEY could not be found") } serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName) cred, err := azblob.NewSharedKeyCredential(accountName, accountKey) handle(err) serviceClient, err := azblob.NewClientWithSharedKeyCredential(serviceURL, cred, nil) handle(err) fmt.Println(serviceClient.URL()) // Alternatively, you can create SAS on the fly resources := sas.AccountResourceTypes{Service: true} permission := sas.AccountPermissions{Read: true} start := time.Now() expiry := start.AddDate(0, 0, 1) serviceURLWithSAS, err := serviceClient.ServiceClient().GetSASURL(resources, permission, expiry, &service.GetSASURLOptions{StartTime: &start}) handle(err) serviceClientWithSAS, err := azblob.NewClientWithNoCredential(serviceURLWithSAS, nil) handle(err) fmt.Println(serviceClientWithSAS.URL()) Types of Clients There are three different clients provided to interact with the various components of the Blob Service: 1. **`ServiceClient`** * Get and set account settings. * Query, create, and delete containers within the account. 2. **`ContainerClient`** * Get and set container access settings, properties, and metadata. * Create, delete, and query blobs within the container. * `ContainerLeaseClient` to support container lease management. 3. **`BlobClient`** * `AppendBlobClient`, `BlockBlobClient`, and `PageBlobClient` * Get and set blob properties. * Perform CRUD operations on a given blob. * `BlobLeaseClient` to support blob lease management. Examples // Your account name and key can be obtained from the Azure Portal. accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME") if !ok { panic("AZURE_STORAGE_ACCOUNT_NAME could not be found") } accountKey, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_KEY") if !ok { panic("AZURE_STORAGE_ACCOUNT_KEY could not be found") } cred, err := azblob.NewSharedKeyCredential(accountName, accountKey) handle(err) // The service URL for blob endpoints is usually in the form: http(s)://.blob.core.windows.net/ serviceClient, err := azblob.NewClientWithSharedKeyCredential(fmt.Sprintf("https://%s.blob.core.windows.net/", accountName), cred, nil) handle(err) // ===== 1. Create a container ===== // First, create a container client, and use the Create method to create a new container in your account containerClient := serviceClient.ServiceClient().NewContainerClient("testcontainer") handle(err) // All APIs have an options' bag struct as a parameter. // The options' bag struct allows you to specify optional parameters such as metadata, public access types, etc. // If you want to use the default options, pass in nil. _, err = containerClient.Create(context.TODO(), nil) handle(err) // ===== 2. Upload and Download a block blob ===== uploadData := "Hello world!" // Create a new blockBlobClient from the containerClient blockBlobClient := containerClient.NewBlockBlobClient("HelloWorld.txt") handle(err) // Upload data to the block blob blockBlobUploadOptions := blockblob.UploadOptions{ Metadata: map[string]*string{"Foo": to.Ptr("Bar")}, Tags: map[string]string{"Year": "2022"}, } _, err = blockBlobClient.Upload(context.TODO(), streaming.NopCloser(strings.NewReader(uploadData)), &blockBlobUploadOptions) handle(err) // Download the blob's contents and ensure that the download worked properly blobDownloadResponse, err := blockBlobClient.DownloadStream(context.TODO(), nil) handle(err) // Use the bytes.Buffer object to read the downloaded data. // RetryReaderOptions has a lot of in-depth tuning abilities, but for the sake of simplicity, we'll omit those here. reader := blobDownloadResponse.Body(nil) downloadData, err := io.ReadAll(reader) handle(err) if string(downloadData) != uploadData { handle(errors.New("uploaded data should be same as downloaded data")) } if err = reader.Close(); err != nil { handle(err) return } // ===== 3. List blobs ===== // List methods returns a pager object which can be used to iterate over the results of a paging operation. // To iterate over a page use the NextPage(context.Context) to fetch the next page of results. // PageResponse() can be used to iterate over the results of the specific page. // Always check the Err() method after paging to see if an error was returned by the pager. A pager will return either an error or the page of results. pager := containerClient.NewListBlobsFlatPager(nil) for pager.More() { resp, err := pager.NextPage(context.TODO()) handle(err) for _, v := range resp.Segment.BlobItems { fmt.Println(*v.Name) } } // Delete the blob. _, err = blockBlobClient.Delete(context.TODO(), nil) handle(err) // Delete the container. _, err = containerClient.Delete(context.TODO(), nil) handle(err) */ package azblob ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base/clients.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package base import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "strings" ) // ClientOptions contains the optional parameters when creating a Client. type ClientOptions struct { azcore.ClientOptions // Audience to use when requesting tokens for Azure Active Directory authentication. // Only has an effect when credential is of type TokenCredential. The value could be // https://storage.azure.com/ (default) or https://.blob.core.windows.net. Audience string } type Client[T any] struct { inner *T credential any options *ClientOptions } func InnerClient[T any](client *Client[T]) *T { return client.inner } func SharedKey[T any](client *Client[T]) *exported.SharedKeyCredential { switch cred := client.credential.(type) { case *exported.SharedKeyCredential: return cred default: return nil } } func Credential[T any](client *Client[T]) any { return client.credential } func GetClientOptions[T any](client *Client[T]) *ClientOptions { return client.options } func GetAudience(clOpts *ClientOptions) string { if clOpts == nil || len(strings.TrimSpace(clOpts.Audience)) == 0 { return shared.TokenScope } else { return strings.TrimRight(clOpts.Audience, "/") + "/.default" } } func NewClient[T any](inner *T) *Client[T] { return &Client[T]{inner: inner} } func NewServiceClient(containerURL string, azClient *azcore.Client, credential any, options *ClientOptions) *Client[generated.ServiceClient] { return &Client[generated.ServiceClient]{ inner: generated.NewServiceClient(containerURL, azClient), credential: credential, options: options, } } func NewContainerClient(containerURL string, azClient *azcore.Client, credential any, options *ClientOptions) *Client[generated.ContainerClient] { return &Client[generated.ContainerClient]{ inner: generated.NewContainerClient(containerURL, azClient), credential: credential, options: options, } } func NewBlobClient(blobURL string, azClient *azcore.Client, credential any, options *ClientOptions) *Client[generated.BlobClient] { return &Client[generated.BlobClient]{ inner: generated.NewBlobClient(blobURL, azClient), credential: credential, options: options, } } type CompositeClient[T, U any] struct { innerT *T innerU *U sharedKey *exported.SharedKeyCredential } func InnerClients[T, U any](client *CompositeClient[T, U]) (*Client[T], *U) { return &Client[T]{ inner: client.innerT, credential: client.sharedKey, }, client.innerU } func NewAppendBlobClient(blobURL string, azClient *azcore.Client, sharedKey *exported.SharedKeyCredential) *CompositeClient[generated.BlobClient, generated.AppendBlobClient] { return &CompositeClient[generated.BlobClient, generated.AppendBlobClient]{ innerT: generated.NewBlobClient(blobURL, azClient), innerU: generated.NewAppendBlobClient(blobURL, azClient), sharedKey: sharedKey, } } func NewBlockBlobClient(blobURL string, azClient *azcore.Client, sharedKey *exported.SharedKeyCredential) *CompositeClient[generated.BlobClient, generated.BlockBlobClient] { return &CompositeClient[generated.BlobClient, generated.BlockBlobClient]{ innerT: generated.NewBlobClient(blobURL, azClient), innerU: generated.NewBlockBlobClient(blobURL, azClient), sharedKey: sharedKey, } } func NewPageBlobClient(blobURL string, azClient *azcore.Client, sharedKey *exported.SharedKeyCredential) *CompositeClient[generated.BlobClient, generated.PageBlobClient] { return &CompositeClient[generated.BlobClient, generated.PageBlobClient]{ innerT: generated.NewBlobClient(blobURL, azClient), innerU: generated.NewPageBlobClient(blobURL, azClient), sharedKey: sharedKey, } } func SharedKeyComposite[T, U any](client *CompositeClient[T, U]) *exported.SharedKeyCredential { return client.sharedKey } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/access_conditions.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported import "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" const SnapshotTimeFormat = "2006-01-02T15:04:05.0000000Z07:00" // ContainerAccessConditions identifies container-specific access conditions which you optionally set. type ContainerAccessConditions struct { ModifiedAccessConditions *ModifiedAccessConditions LeaseAccessConditions *LeaseAccessConditions } func FormatContainerAccessConditions(b *ContainerAccessConditions) (*LeaseAccessConditions, *ModifiedAccessConditions) { if b == nil { return nil, nil } return b.LeaseAccessConditions, b.ModifiedAccessConditions } // BlobAccessConditions identifies blob-specific access conditions which you optionally set. type BlobAccessConditions struct { LeaseAccessConditions *LeaseAccessConditions ModifiedAccessConditions *ModifiedAccessConditions } func FormatBlobAccessConditions(b *BlobAccessConditions) (*LeaseAccessConditions, *ModifiedAccessConditions) { if b == nil { return nil, nil } return b.LeaseAccessConditions, b.ModifiedAccessConditions } // LeaseAccessConditions contains optional parameters to access leased entity. type LeaseAccessConditions = generated.LeaseAccessConditions // ModifiedAccessConditions contains a group of parameters for specifying access conditions. type ModifiedAccessConditions = generated.ModifiedAccessConditions ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/access_policy.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported import ( "bytes" "fmt" ) // AccessPolicyPermission type simplifies creating the permissions string for a container's access policy. // Initialize an instance of this type and then call its String method to set AccessPolicy's Permission field. type AccessPolicyPermission struct { Read, Add, Create, Write, Delete, List bool } // String produces the access policy permission string for an Azure Storage container. // Call this method to set AccessPolicy's Permission field. func (p *AccessPolicyPermission) String() string { var b bytes.Buffer if p.Read { b.WriteRune('r') } if p.Add { b.WriteRune('a') } if p.Create { b.WriteRune('c') } if p.Write { b.WriteRune('w') } if p.Delete { b.WriteRune('d') } if p.List { b.WriteRune('l') } return b.String() } // Parse initializes the AccessPolicyPermission's fields from a string. func (p *AccessPolicyPermission) Parse(s string) error { *p = AccessPolicyPermission{} // Clear the flags for _, r := range s { switch r { case 'r': p.Read = true case 'a': p.Add = true case 'c': p.Create = true case 'w': p.Write = true case 'd': p.Delete = true case 'l': p.List = true default: return fmt.Errorf("invalid permission: '%v'", r) } } return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/blob_batch.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported import ( "bufio" "bytes" "errors" "fmt" "io" "mime" "mime/multipart" "net/http" "net/textproto" "strconv" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/internal/uuid" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) const ( batchIdPrefix = "batch_" httpVersion = "HTTP/1.1" httpNewline = "\r\n" ) // createBatchID is used for creating a new batch id which is used as batch boundary in the request body func createBatchID() (string, error) { batchID, err := uuid.New() if err != nil { return "", err } return batchIdPrefix + batchID.String(), nil } // buildSubRequest is used for building the sub-request. Example: // DELETE /container0/blob0 HTTP/1.1 // x-ms-date: Thu, 14 Jun 2018 16:46:54 GMT // Authorization: SharedKey account: // Content-Length: 0 func buildSubRequest(req *policy.Request) []byte { var batchSubRequest strings.Builder blobPath := req.Raw().URL.EscapedPath() if len(req.Raw().URL.RawQuery) > 0 { blobPath += "?" + req.Raw().URL.RawQuery } batchSubRequest.WriteString(fmt.Sprintf("%s %s %s%s", req.Raw().Method, blobPath, httpVersion, httpNewline)) for k, v := range req.Raw().Header { if strings.EqualFold(k, shared.HeaderXmsVersion) { continue } if len(v) > 0 { batchSubRequest.WriteString(fmt.Sprintf("%v: %v%v", k, v[0], httpNewline)) } } batchSubRequest.WriteString(httpNewline) return []byte(batchSubRequest.String()) } // CreateBatchRequest creates a new batch request using the sub-requests present in the BlobBatchBuilder. // // Example of a sub-request in the batch request body: // // --batch_357de4f7-6d0b-4e02-8cd2-6361411a9525 // Content-Type: application/http // Content-Transfer-Encoding: binary // Content-ID: 0 // // DELETE /container0/blob0 HTTP/1.1 // x-ms-date: Thu, 14 Jun 2018 16:46:54 GMT // Authorization: SharedKey account: // Content-Length: 0 func CreateBatchRequest(bb *BlobBatchBuilder) ([]byte, string, error) { batchID, err := createBatchID() if err != nil { return nil, "", err } // Create a new multipart buffer reqBody := &bytes.Buffer{} writer := multipart.NewWriter(reqBody) // Set the boundary err = writer.SetBoundary(batchID) if err != nil { return nil, "", err } partHeaders := make(textproto.MIMEHeader) partHeaders["Content-Type"] = []string{"application/http"} partHeaders["Content-Transfer-Encoding"] = []string{"binary"} var partWriter io.Writer for i, req := range bb.SubRequests { if bb.AuthPolicy != nil { _, err := bb.AuthPolicy.Do(req) if err != nil && !strings.EqualFold(err.Error(), "no more policies") { if log.Should(EventSubmitBatch) { log.Writef(EventSubmitBatch, "failed to authorize sub-request for %v.\nError: %v", req.Raw().URL.Path, err.Error()) } return nil, "", err } } partHeaders["Content-ID"] = []string{fmt.Sprintf("%v", i)} partWriter, err = writer.CreatePart(partHeaders) if err != nil { return nil, "", err } _, err = partWriter.Write(buildSubRequest(req)) if err != nil { return nil, "", err } } // Close the multipart writer err = writer.Close() if err != nil { return nil, "", err } return reqBody.Bytes(), batchID, nil } // UpdateSubRequestHeaders updates the sub-request headers. // Removes x-ms-version header. func UpdateSubRequestHeaders(req *policy.Request) { // remove x-ms-version header from the request header for k := range req.Raw().Header { if strings.EqualFold(k, shared.HeaderXmsVersion) { delete(req.Raw().Header, k) } } } // BatchResponseItem contains the response for the individual sub-requests. type BatchResponseItem struct { ContentID *int ContainerName *string BlobName *string RequestID *string Version *string Error error // nil error indicates that the batch sub-request operation is successful } func getResponseBoundary(contentType *string) (string, error) { if contentType == nil { return "", fmt.Errorf("Content-Type returned in SubmitBatch response is nil") } _, params, err := mime.ParseMediaType(*contentType) if err != nil { return "", err } if val, ok := params["boundary"]; ok { return val, nil } else { return "", fmt.Errorf("batch boundary not present in Content-Type header of the SubmitBatch response.\nContent-Type: %v", *contentType) } } func getContentID(part *multipart.Part) (*int, error) { contentID := part.Header.Get("Content-ID") if contentID == "" { return nil, nil } val, err := strconv.Atoi(strings.TrimSpace(contentID)) if err != nil { return nil, err } return &val, nil } func getResponseHeader(key string, resp *http.Response) *string { val := resp.Header.Get(key) if val == "" { return nil } return &val } // ParseBlobBatchResponse is used for parsing the batch response body into individual sub-responses for each item in the batch. func ParseBlobBatchResponse(respBody io.ReadCloser, contentType *string, subRequests []*policy.Request) ([]*BatchResponseItem, error) { boundary, err := getResponseBoundary(contentType) if err != nil { return nil, err } respReader := multipart.NewReader(respBody, boundary) var responses []*BatchResponseItem for { part, err := respReader.NextPart() if errors.Is(err, io.EOF) { break } else if err != nil { return nil, err } batchSubResponse := &BatchResponseItem{} batchSubResponse.ContentID, err = getContentID(part) if err != nil { return nil, err } if batchSubResponse.ContentID != nil { path := strings.Trim(subRequests[*batchSubResponse.ContentID].Raw().URL.Path, "/") p := strings.Split(path, "/") batchSubResponse.ContainerName = to.Ptr(p[0]) batchSubResponse.BlobName = to.Ptr(strings.Join(p[1:], "/")) } respBytes, err := io.ReadAll(part) if err != nil { return nil, err } respBytes = append(respBytes, byte('\n')) buf := bytes.NewBuffer(respBytes) resp, err := http.ReadResponse(bufio.NewReader(buf), nil) // sub-response parsing error if err != nil { return nil, err } batchSubResponse.RequestID = getResponseHeader(shared.HeaderXmsRequestID, resp) batchSubResponse.Version = getResponseHeader(shared.HeaderXmsVersion, resp) // sub-response failure if resp.StatusCode < 200 || resp.StatusCode >= 300 { if len(responses) == 0 && batchSubResponse.ContentID == nil { // this case can happen when the parent request fails. // For example, batch request having more than 256 sub-requests. return nil, fmt.Errorf("%v", string(respBytes)) } resp.Request = subRequests[*batchSubResponse.ContentID].Raw() batchSubResponse.Error = runtime.NewResponseError(resp) } responses = append(responses, batchSubResponse) } if len(responses) != len(subRequests) { return nil, fmt.Errorf("expected %v responses, got %v for the batch ID: %v", len(subRequests), len(responses), boundary) } return responses, nil } // not exported but used for batch request creation // BlobBatchBuilder is used for creating the blob batch request type BlobBatchBuilder struct { AuthPolicy policy.Policy SubRequests []*policy.Request } // BlobBatchOperationType defines the operation of the blob batch sub-requests. type BlobBatchOperationType string const ( BatchDeleteOperationType BlobBatchOperationType = "delete" BatchSetTierOperationType BlobBatchOperationType = "set tier" ) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/exported.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported import ( "fmt" "strconv" ) // HTTPRange defines a range of bytes within an HTTP resource, starting at offset and // ending at offset+count. A zero-value HTTPRange indicates the entire resource. An HTTPRange // which has an offset and zero value count indicates from the offset to the resource's end. type HTTPRange struct { Offset int64 Count int64 } // FormatHTTPRange converts an HTTPRange to its string format. func FormatHTTPRange(r HTTPRange) *string { if r.Offset == 0 && r.Count == 0 { return nil // No specified range } endOffset := "" // if count == CountToEnd (0) if r.Count > 0 { endOffset = strconv.FormatInt((r.Offset+r.Count)-1, 10) } dataRange := fmt.Sprintf("bytes=%v-%s", r.Offset, endOffset) return &dataRange } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/log_events.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported import ( "github.com/Azure/azure-sdk-for-go/sdk/internal/log" ) // NOTE: these are publicly exported via type-aliasing in azblob/log.go const ( // EventUpload is used when we compute number of blocks to upload and size of each block. EventUpload log.Event = "azblob.Upload" // EventSubmitBatch is used for logging events related to submit blob batch operation. EventSubmitBatch log.Event = "azblob.SubmitBatch" ) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/set_expiry.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported import ( "net/http" "strconv" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // ExpiryType defines values for ExpiryType type ExpiryType interface { Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) notPubliclyImplementable() } // ExpiryTypeAbsolute defines the absolute time for the blob expiry type ExpiryTypeAbsolute time.Time // ExpiryTypeRelativeToNow defines the duration relative to now for the blob expiry type ExpiryTypeRelativeToNow time.Duration // ExpiryTypeRelativeToCreation defines the duration relative to creation for the blob expiry type ExpiryTypeRelativeToCreation time.Duration // ExpiryTypeNever defines that the blob will be set to never expire type ExpiryTypeNever struct { // empty struct since NeverExpire expiry type does not require expiry time } // SetExpiryOptions contains the optional parameters for the Client.SetExpiry method. type SetExpiryOptions struct { // placeholder for future options } func (e ExpiryTypeAbsolute) Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) { return generated.ExpiryOptionsAbsolute, &generated.BlobClientSetExpiryOptions{ ExpiresOn: to.Ptr(time.Time(e).UTC().Format(http.TimeFormat)), } } func (e ExpiryTypeAbsolute) notPubliclyImplementable() {} func (e ExpiryTypeRelativeToNow) Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) { return generated.ExpiryOptionsRelativeToNow, &generated.BlobClientSetExpiryOptions{ ExpiresOn: to.Ptr(strconv.FormatInt(time.Duration(e).Milliseconds(), 10)), } } func (e ExpiryTypeRelativeToNow) notPubliclyImplementable() {} func (e ExpiryTypeRelativeToCreation) Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) { return generated.ExpiryOptionsRelativeToCreation, &generated.BlobClientSetExpiryOptions{ ExpiresOn: to.Ptr(strconv.FormatInt(time.Duration(e).Milliseconds(), 10)), } } func (e ExpiryTypeRelativeToCreation) notPubliclyImplementable() {} func (e ExpiryTypeNever) Format(o *SetExpiryOptions) (generated.ExpiryOptions, *generated.BlobClientSetExpiryOptions) { return generated.ExpiryOptionsNeverExpire, nil } func (e ExpiryTypeNever) notPubliclyImplementable() {} ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/shared_key_credential.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported import ( "bytes" "crypto/hmac" "crypto/sha256" "encoding/base64" "fmt" "net/http" "net/url" "sort" "strings" "sync/atomic" "time" azlog "github.com/Azure/azure-sdk-for-go/sdk/azcore/log" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/internal/log" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) // NewSharedKeyCredential creates an immutable SharedKeyCredential containing the // storage account's name and either its primary or secondary key. func NewSharedKeyCredential(accountName string, accountKey string) (*SharedKeyCredential, error) { c := SharedKeyCredential{accountName: accountName} if err := c.SetAccountKey(accountKey); err != nil { return nil, err } return &c, nil } // SharedKeyCredential contains an account's name and its primary or secondary key. type SharedKeyCredential struct { // Only the NewSharedKeyCredential method should set these; all other methods should treat them as read-only accountName string accountKey atomic.Value // []byte } // AccountName returns the Storage account's name. func (c *SharedKeyCredential) AccountName() string { return c.accountName } // SetAccountKey replaces the existing account key with the specified account key. func (c *SharedKeyCredential) SetAccountKey(accountKey string) error { _bytes, err := base64.StdEncoding.DecodeString(accountKey) if err != nil { return fmt.Errorf("decode account key: %w", err) } c.accountKey.Store(_bytes) return nil } // ComputeHMACSHA256 generates a hash signature for an HTTP request or for a SAS. func (c *SharedKeyCredential) computeHMACSHA256(message string) (string, error) { h := hmac.New(sha256.New, c.accountKey.Load().([]byte)) _, err := h.Write([]byte(message)) return base64.StdEncoding.EncodeToString(h.Sum(nil)), err } func (c *SharedKeyCredential) buildStringToSign(req *http.Request) (string, error) { // https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services headers := req.Header contentLength := getHeader(shared.HeaderContentLength, headers) if contentLength == "0" { contentLength = "" } canonicalizedResource, err := c.buildCanonicalizedResource(req.URL) if err != nil { return "", err } stringToSign := strings.Join([]string{ req.Method, getHeader(shared.HeaderContentEncoding, headers), getHeader(shared.HeaderContentLanguage, headers), contentLength, getHeader(shared.HeaderContentMD5, headers), getHeader(shared.HeaderContentType, headers), "", // Empty date because x-ms-date is expected (as per web page above) getHeader(shared.HeaderIfModifiedSince, headers), getHeader(shared.HeaderIfMatch, headers), getHeader(shared.HeaderIfNoneMatch, headers), getHeader(shared.HeaderIfUnmodifiedSince, headers), getHeader(shared.HeaderRange, headers), c.buildCanonicalizedHeader(headers), canonicalizedResource, }, "\n") return stringToSign, nil } func getHeader(key string, headers map[string][]string) string { if headers == nil { return "" } if v, ok := headers[key]; ok { if len(v) > 0 { return v[0] } } return "" } func getWeightTables() [][]int { tableLv0 := [...]int{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x71c, 0x0, 0x71f, 0x721, 0x723, 0x725, 0x0, 0x0, 0x0, 0x72d, 0x803, 0x0, 0x0, 0x733, 0x0, 0xd03, 0xd1a, 0xd1c, 0xd1e, 0xd20, 0xd22, 0xd24, 0xd26, 0xd28, 0xd2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70, 0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x0, 0x0, 0x743, 0x744, 0x748, 0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70, 0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x74c, 0x0, 0x750, 0x0, } tableLv2 := [...]int{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8012, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8212, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, } tables := [][]int{tableLv0[:], tableLv2[:]} return tables } // NewHeaderStringComparer performs a multi-level, weight-based comparison of two strings func compareHeaders(lhs, rhs string, tables [][]int) int { currLevel, i, j := 0, 0, 0 n := len(tables) lhsLen := len(lhs) rhsLen := len(rhs) for currLevel < n { if currLevel == (n-1) && i != j { if i > j { return -1 } if i < j { return 1 } return 0 } var w1, w2 int // Check bounds before accessing lhs[i] if i < lhsLen { w1 = tables[currLevel][lhs[i]] } else { w1 = 0x1 } // Check bounds before accessing rhs[j] if j < rhsLen { w2 = tables[currLevel][rhs[j]] } else { w2 = 0x1 } if w1 == 0x1 && w2 == 0x1 { i = 0 j = 0 currLevel++ } else if w1 == w2 { i++ j++ } else if w1 == 0 { i++ } else if w2 == 0 { j++ } else { if w1 < w2 { return -1 } if w1 > w2 { return 1 } return 0 } } return 0 } func (c *SharedKeyCredential) buildCanonicalizedHeader(headers http.Header) string { cm := map[string][]string{} for k, v := range headers { headerName := strings.TrimSpace(strings.ToLower(k)) if strings.HasPrefix(headerName, "x-ms-") { cm[headerName] = v // NOTE: the value must not have any whitespace around it. } } if len(cm) == 0 { return "" } keys := make([]string, 0, len(cm)) for key := range cm { keys = append(keys, key) } tables := getWeightTables() // Sort the keys using the custom comparator sort.Slice(keys, func(i, j int) bool { return compareHeaders(keys[i], keys[j], tables) < 0 }) ch := bytes.NewBufferString("") for i, key := range keys { if i > 0 { ch.WriteRune('\n') } ch.WriteString(key) ch.WriteRune(':') ch.WriteString(strings.Join(cm[key], ",")) } return ch.String() } func (c *SharedKeyCredential) buildCanonicalizedResource(u *url.URL) (string, error) { // https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services cr := bytes.NewBufferString("/") cr.WriteString(c.accountName) if len(u.Path) > 0 { // Any portion of the CanonicalizedResource string that is derived from // the resource's URI should be encoded exactly as it is in the URI. // -- https://msdn.microsoft.com/en-gb/library/azure/dd179428.aspx cr.WriteString(u.EscapedPath()) } else { // a slash is required to indicate the root path cr.WriteString("/") } // params is a map[string][]string; param name is key; params values is []string params, err := url.ParseQuery(u.RawQuery) // Returns URL decoded values if err != nil { return "", fmt.Errorf("failed to parse query params: %w", err) } if len(params) > 0 { // There is at least 1 query parameter var paramNames []string // We use this to sort the parameter key names for paramName := range params { paramNames = append(paramNames, paramName) // paramNames must be lowercase } sort.Strings(paramNames) for _, paramName := range paramNames { paramValues := params[paramName] sort.Strings(paramValues) // Join the sorted key values separated by ',' // Then prepend "keyName:"; then add this string to the buffer cr.WriteString("\n" + strings.ToLower(paramName) + ":" + strings.Join(paramValues, ",")) } } return cr.String(), nil } // ComputeHMACSHA256 is a helper for computing the signed string outside of this package. func ComputeHMACSHA256(cred *SharedKeyCredential, message string) (string, error) { return cred.computeHMACSHA256(message) } // the following content isn't actually exported but must live // next to SharedKeyCredential as it uses its unexported methods type SharedKeyCredPolicy struct { cred *SharedKeyCredential } func NewSharedKeyCredPolicy(cred *SharedKeyCredential) *SharedKeyCredPolicy { return &SharedKeyCredPolicy{cred: cred} } func (s *SharedKeyCredPolicy) Do(req *policy.Request) (*http.Response, error) { // skip adding the authorization header if no SharedKeyCredential was provided. // this prevents a panic that might be hard to diagnose and allows testing // against http endpoints that don't require authentication. if s.cred == nil { return req.Next() } if d := getHeader(shared.HeaderXmsDate, req.Raw().Header); d == "" { req.Raw().Header.Set(shared.HeaderXmsDate, time.Now().UTC().Format(http.TimeFormat)) } stringToSign, err := s.cred.buildStringToSign(req.Raw()) if err != nil { return nil, err } signature, err := s.cred.computeHMACSHA256(stringToSign) if err != nil { return nil, err } authHeader := strings.Join([]string{"SharedKey ", s.cred.AccountName(), ":", signature}, "") req.Raw().Header.Set(shared.HeaderAuthorization, authHeader) response, err := req.Next() if err != nil && response != nil && response.StatusCode == http.StatusForbidden { // Service failed to authenticate request, log it log.Write(azlog.EventResponse, "===== HTTP Forbidden status, String-to-Sign:\n"+stringToSign+"\n===============================\n") } return response, err } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/transfer_validation_option.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported import ( "bytes" "encoding/binary" "hash/crc64" "io" "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) // TransferValidationType abstracts the various mechanisms used to verify a transfer. type TransferValidationType interface { Apply(io.ReadSeekCloser, generated.TransactionalContentSetter) (io.ReadSeekCloser, error) notPubliclyImplementable() } // TransferValidationTypeCRC64 is a TransferValidationType used to provide a precomputed CRC64. type TransferValidationTypeCRC64 uint64 func (c TransferValidationTypeCRC64) Apply(rsc io.ReadSeekCloser, cfg generated.TransactionalContentSetter) (io.ReadSeekCloser, error) { buf := make([]byte, 8) binary.LittleEndian.PutUint64(buf, uint64(c)) cfg.SetCRC64(buf) return rsc, nil } func (TransferValidationTypeCRC64) notPubliclyImplementable() {} // TransferValidationTypeComputeCRC64 is a TransferValidationType that indicates a CRC64 should be computed during transfer. func TransferValidationTypeComputeCRC64() TransferValidationType { return transferValidationTypeFn(func(rsc io.ReadSeekCloser, cfg generated.TransactionalContentSetter) (io.ReadSeekCloser, error) { buf, err := io.ReadAll(rsc) if err != nil { return nil, err } crc := crc64.Checksum(buf, shared.CRC64Table) return TransferValidationTypeCRC64(crc).Apply(streaming.NopCloser(bytes.NewReader(buf)), cfg) }) } // TransferValidationTypeMD5 is a TransferValidationType used to provide a precomputed MD5. type TransferValidationTypeMD5 []byte func (c TransferValidationTypeMD5) Apply(rsc io.ReadSeekCloser, cfg generated.TransactionalContentSetter) (io.ReadSeekCloser, error) { cfg.SetMD5(c) return rsc, nil } func (TransferValidationTypeMD5) notPubliclyImplementable() {} type transferValidationTypeFn func(io.ReadSeekCloser, generated.TransactionalContentSetter) (io.ReadSeekCloser, error) func (t transferValidationTypeFn) Apply(rsc io.ReadSeekCloser, cfg generated.TransactionalContentSetter) (io.ReadSeekCloser, error) { return t(rsc, cfg) } func (transferValidationTypeFn) notPubliclyImplementable() {} ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/user_delegation_credential.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package exported import ( "crypto/hmac" "crypto/sha256" "encoding/base64" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // NewUserDelegationCredential creates a new UserDelegationCredential using a Storage account's Name and a user delegation Key from it func NewUserDelegationCredential(accountName string, udk UserDelegationKey) *UserDelegationCredential { return &UserDelegationCredential{ accountName: accountName, userDelegationKey: udk, } } // UserDelegationKey contains UserDelegationKey. type UserDelegationKey = generated.UserDelegationKey // UserDelegationCredential contains an account's name and its user delegation key. type UserDelegationCredential struct { accountName string userDelegationKey UserDelegationKey } // getAccountName returns the Storage account's Name func (f *UserDelegationCredential) getAccountName() string { return f.accountName } // GetAccountName is a helper method for accessing the user delegation key parameters outside this package. func GetAccountName(udc *UserDelegationCredential) string { return udc.getAccountName() } // computeHMACSHA256 generates a hash signature for an HTTP request or for a SAS. func (f *UserDelegationCredential) computeHMACSHA256(message string) (string, error) { bytes, _ := base64.StdEncoding.DecodeString(*f.userDelegationKey.Value) h := hmac.New(sha256.New, bytes) _, err := h.Write([]byte(message)) return base64.StdEncoding.EncodeToString(h.Sum(nil)), err } // ComputeUDCHMACSHA256 is a helper method for computing the signed string outside this package. func ComputeUDCHMACSHA256(udc *UserDelegationCredential, message string) (string, error) { return udc.computeHMACSHA256(message) } // getUDKParams returns UserDelegationKey func (f *UserDelegationCredential) getUDKParams() *UserDelegationKey { return &f.userDelegationKey } // GetUDKParams is a helper method for accessing the user delegation key parameters outside this package. func GetUDKParams(udc *UserDelegationCredential) *UserDelegationKey { return udc.getUDKParams() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported/version.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package exported const ( ModuleName = "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" ModuleVersion = "v1.6.1" ) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/appendblob_client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) func (client *AppendBlobClient) Endpoint() string { return client.endpoint } func (client *AppendBlobClient) InternalClient() *azcore.Client { return client.internal } // NewAppendBlobClient creates a new instance of AppendBlobClient with the specified values. // - endpoint - The URL of the service account, container, or blob that is the target of the desired operation. // - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider. func NewAppendBlobClient(endpoint string, azClient *azcore.Client) *AppendBlobClient { client := &AppendBlobClient{ internal: azClient, endpoint: endpoint, } return client } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/autorest.md ================================================ # Code Generation - Azure Blob SDK for Golang ### Settings ```yaml go: true clear-output-folder: false version: "^3.0.0" license-header: MICROSOFT_MIT_NO_VERSION input-file: "https://raw.githubusercontent.com/Azure/azure-rest-api-specs/ae95eb6a4701d844bada7d1c4f5ecf4a7444e5b8/specification/storage/data-plane/Microsoft.BlobStorage/stable/2025-01-05/blob.json" credential-scope: "https://storage.azure.com/.default" output-folder: ../generated file-prefix: "zz_" openapi-type: "data-plane" verbose: true security: AzureKey modelerfour: group-parameters: false seal-single-value-enum-by-default: true lenient-model-deduplication: true export-clients: true use: "@autorest/go@4.0.0-preview.65" ``` ### Add a Properties field to the BlobPrefix definition ```yaml directive: - from: swagger-document where: $.definitions transform: > $.BlobPrefix.properties["Properties"] = { "type": "object", "$ref": "#/definitions/BlobPropertiesInternal" }; ``` ### Add Owner,Group,Permissions,Acl,ResourceType in ListBlob Response ``` yaml directive: - from: swagger-document where: $.definitions transform: > $.BlobPropertiesInternal.properties["Owner"] = { "type" : "string", }; $.BlobPropertiesInternal.properties["Group"] = { "type" : "string", }; $.BlobPropertiesInternal.properties["Permissions"] = { "type" : "string", }; $.BlobPropertiesInternal.properties["Acl"] = { "type" : "string", }; $.BlobPropertiesInternal.properties["ResourceType"] = { "type" : "string", }; ``` ### Add permissions in ListBlobsInclude ``` yaml directive: - from: swagger-document where: $.parameters.ListBlobsInclude transform: > $.items.enum.push("permissions"); ``` ### Updating service version to 2025-05-05 ```yaml directive: - from: - zz_appendblob_client.go - zz_blob_client.go - zz_blockblob_client.go - zz_container_client.go - zz_pageblob_client.go - zz_service_client.go where: $ transform: >- return $. replaceAll(`[]string{"2025-01-05"}`, `[]string{ServiceVersion}`); ``` ### Fix CRC Response Header in PutBlob response ``` yaml directive: - from: swagger-document where: $["x-ms-paths"]["/{containerName}/{blob}?BlockBlob"].put.responses["201"].headers transform: > $["x-ms-content-crc64"] = { "x-ms-client-name": "ContentCRC64", "type": "string", "format": "byte", "description": "Returned for a block blob so that the client can check the integrity of message content." }; ``` ### Undo breaking change with BlobName ``` yaml directive: - from: zz_models.go where: $ transform: >- return $. replace(/Name\s+\*BlobName/g, `Name *string`); ``` ### Removing UnmarshalXML for BlobItems to create customer UnmarshalXML function ```yaml directive: - from: swagger-document where: $.definitions transform: > $.BlobItemInternal["x-ms-go-omit-serde-methods"] = true; ``` ### Remove pager methods and export various generated methods in container client ``` yaml directive: - from: zz_container_client.go where: $ transform: >- return $. replace(/func \(client \*ContainerClient\) NewListBlobFlatSegmentPager\(.+\/\/ listBlobFlatSegmentCreateRequest creates the ListBlobFlatSegment request/s, `//\n// listBlobFlatSegmentCreateRequest creates the ListBlobFlatSegment request`). replace(/\(client \*ContainerClient\) listBlobFlatSegmentCreateRequest\(/, `(client *ContainerClient) ListBlobFlatSegmentCreateRequest(`). replace(/\(client \*ContainerClient\) listBlobFlatSegmentHandleResponse\(/, `(client *ContainerClient) ListBlobFlatSegmentHandleResponse(`); ``` ### Remove pager methods and export various generated methods in service client ``` yaml directive: - from: zz_service_client.go where: $ transform: >- return $. replace(/func \(client \*ServiceClient\) NewListContainersSegmentPager\(.+\/\/ listContainersSegmentCreateRequest creates the ListContainersSegment request/s, `//\n// listContainersSegmentCreateRequest creates the ListContainersSegment request`). replace(/\(client \*ServiceClient\) listContainersSegmentCreateRequest\(/, `(client *ServiceClient) ListContainersSegmentCreateRequest(`). replace(/\(client \*ServiceClient\) listContainersSegmentHandleResponse\(/, `(client *ServiceClient) ListContainersSegmentHandleResponse(`); ``` ### Fix BlobMetadata. ``` yaml directive: - from: swagger-document where: $.definitions transform: > delete $.BlobMetadata["properties"]; ``` ### Don't include container name or blob in path - we have direct URIs. ``` yaml directive: - from: swagger-document where: $["x-ms-paths"] transform: > for (const property in $) { if (property.includes('/{containerName}/{blob}')) { $[property]["parameters"] = $[property]["parameters"].filter(function(param) { return (typeof param['$ref'] === "undefined") || (false == param['$ref'].endsWith("#/parameters/ContainerName") && false == param['$ref'].endsWith("#/parameters/Blob"))}); } else if (property.includes('/{containerName}')) { $[property]["parameters"] = $[property]["parameters"].filter(function(param) { return (typeof param['$ref'] === "undefined") || (false == param['$ref'].endsWith("#/parameters/ContainerName"))}); } } ``` ### Remove DataLake stuff. ``` yaml directive: - from: swagger-document where: $["x-ms-paths"] transform: > for (const property in $) { if (property.includes('filesystem')) { delete $[property]; } } ``` ### Remove DataLakeStorageError ``` yaml directive: - from: swagger-document where: $.definitions transform: > delete $.DataLakeStorageError; ``` ### Fix 304s ``` yaml directive: - from: swagger-document where: $["x-ms-paths"]["/{containerName}/{blob}"] transform: > $.get.responses["304"] = { "description": "The condition specified using HTTP conditional header(s) is not met.", "x-az-response-name": "ConditionNotMetError", "headers": { "x-ms-error-code": { "x-ms-client-name": "ErrorCode", "type": "string" } } }; ``` ### Fix GeoReplication ``` yaml directive: - from: swagger-document where: $.definitions transform: > delete $.GeoReplication.properties.Status["x-ms-enum"]; $.GeoReplication.properties.Status["x-ms-enum"] = { "name": "BlobGeoReplicationStatus", "modelAsString": false }; ``` ### Fix RehydratePriority ``` yaml directive: - from: swagger-document where: $.definitions transform: > delete $.RehydratePriority["x-ms-enum"]; $.RehydratePriority["x-ms-enum"] = { "name": "RehydratePriority", "modelAsString": false }; ``` ### Fix BlobDeleteType ``` yaml directive: - from: swagger-document where: $.parameters transform: > delete $.BlobDeleteType.enum; $.BlobDeleteType.enum = [ "None", "Permanent" ]; ``` ### Fix EncryptionAlgorithm ``` yaml directive: - from: swagger-document where: $.parameters transform: > delete $.EncryptionAlgorithm.enum; $.EncryptionAlgorithm.enum = [ "None", "AES256" ]; ``` ### Fix XML string "ObjectReplicationMetadata" to "OrMetadata" ``` yaml directive: - from: swagger-document where: $.definitions transform: > $.BlobItemInternal.properties["OrMetadata"] = $.BlobItemInternal.properties["ObjectReplicationMetadata"]; delete $.BlobItemInternal.properties["ObjectReplicationMetadata"]; ``` # Export various createRequest/HandleResponse methods ``` yaml directive: - from: zz_container_client.go where: $ transform: >- return $. replace(/listBlobHierarchySegmentCreateRequest/g, function(_, s) { return `ListBlobHierarchySegmentCreateRequest` }). replace(/listBlobHierarchySegmentHandleResponse/g, function(_, s) { return `ListBlobHierarchySegmentHandleResponse` }); - from: zz_pageblob_client.go where: $ transform: >- return $. replace(/getPageRanges(Diff)?CreateRequest/g, function(_, s) { if (s === undefined) { s = '' }; return `GetPageRanges${s}CreateRequest` }). replace(/getPageRanges(Diff)?HandleResponse/g, function(_, s) { if (s === undefined) { s = '' }; return `GetPageRanges${s}HandleResponse` }); ``` ### Clean up some const type names so they don't stutter ``` yaml directive: - from: swagger-document where: $.parameters['BlobDeleteType'] transform: > $["x-ms-enum"].name = "DeleteType"; $["x-ms-client-name"] = "DeleteType"; - from: swagger-document where: $.parameters['BlobExpiryOptions'] transform: > $["x-ms-enum"].name = "ExpiryOptions"; $["x-ms-client-name"].name = "ExpiryOptions"; - from: swagger-document where: $["x-ms-paths"][*].*.responses[*].headers["x-ms-immutability-policy-mode"] transform: > $["x-ms-client-name"].name = "ImmutabilityPolicyMode"; $.enum = [ "Mutable", "Unlocked", "Locked"]; $["x-ms-enum"] = { "name": "ImmutabilityPolicyMode", "modelAsString": false }; - from: swagger-document where: $.parameters['ImmutabilityPolicyMode'] transform: > $["x-ms-enum"].name = "ImmutabilityPolicySetting"; $["x-ms-client-name"].name = "ImmutabilityPolicySetting"; - from: swagger-document where: $.definitions['BlobPropertiesInternal'] transform: > $.properties.ImmutabilityPolicyMode["x-ms-enum"].name = "ImmutabilityPolicyMode"; ``` ### use azcore.ETag ``` yaml directive: - from: - zz_models.go - zz_options.go where: $ transform: >- return $. replace(/import "time"/, `import (\n\t"time"\n\t"github.com/Azure/azure-sdk-for-go/sdk/azcore"\n)`). replace(/Etag\s+\*string/g, `ETag *azcore.ETag`). replace(/IfMatch\s+\*string/g, `IfMatch *azcore.ETag`). replace(/IfNoneMatch\s+\*string/g, `IfNoneMatch *azcore.ETag`). replace(/SourceIfMatch\s+\*string/g, `SourceIfMatch *azcore.ETag`). replace(/SourceIfNoneMatch\s+\*string/g, `SourceIfNoneMatch *azcore.ETag`); - from: zz_responses.go where: $ transform: >- return $. replace(/"time"/, `"time"\n\t"github.com/Azure/azure-sdk-for-go/sdk/azcore"`). replace(/ETag\s+\*string/g, `ETag *azcore.ETag`); - from: - zz_appendblob_client.go - zz_blob_client.go - zz_blockblob_client.go - zz_container_client.go - zz_pageblob_client.go where: $ transform: >- return $. replace(/"github\.com\/Azure\/azure\-sdk\-for\-go\/sdk\/azcore\/policy"/, `"github.com/Azure/azure-sdk-for-go/sdk/azcore"\n\t"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"`). replace(/result\.ETag\s+=\s+&val/g, `result.ETag = (*azcore.ETag)(&val)`). replace(/\*modifiedAccessConditions.IfMatch/g, `string(*modifiedAccessConditions.IfMatch)`). replace(/\*modifiedAccessConditions.IfNoneMatch/g, `string(*modifiedAccessConditions.IfNoneMatch)`). replace(/\*sourceModifiedAccessConditions.SourceIfMatch/g, `string(*sourceModifiedAccessConditions.SourceIfMatch)`). replace(/\*sourceModifiedAccessConditions.SourceIfNoneMatch/g, `string(*sourceModifiedAccessConditions.SourceIfNoneMatch)`); ``` ### Unsure why this casing changed, but fixing it ``` yaml directive: - from: zz_models.go where: $ transform: >- return $. replace(/SignedOid\s+\*string/g, `SignedOID *string`). replace(/SignedTid\s+\*string/g, `SignedTID *string`); ``` ### Fixing Typo with StorageErrorCodeIncrementalCopyOfEarlierVersionSnapshotNotAllowed ``` yaml directive: - from: zz_constants.go where: $ transform: >- return $. replace(/IncrementalCopyOfEralierVersionSnapshotNotAllowed/g, "IncrementalCopyOfEarlierVersionSnapshotNotAllowed"); ``` ### Fix up x-ms-content-crc64 header response name ``` yaml directive: - from: swagger-document where: $.x-ms-paths.*.*.responses.*.headers.x-ms-content-crc64 transform: > $["x-ms-client-name"] = "ContentCRC64" ``` ``` yaml directive: - rename-model: from: BlobItemInternal to: BlobItem - rename-model: from: BlobPropertiesInternal to: BlobProperties ``` ### Updating encoding URL, Golang adds '+' which disrupts encoding with service ``` yaml directive: - from: - zz_service_client.go - zz_container_client.go where: $ transform: >- return $. replace(/req.Raw\(\).URL.RawQuery \= reqQP.Encode\(\)/g, `req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1)`); ``` ### Change `where` parameter in blob filtering to be required ``` yaml directive: - from: swagger-document where: $.parameters.FilterBlobsWhere transform: > $.required = true; ``` ### Change `Duration` parameter in leases to be required ``` yaml directive: - from: swagger-document where: $.parameters.LeaseDuration transform: > $.required = true; ``` ### Change CPK acronym to be all caps ``` yaml directive: - from: source-file-go where: $ transform: >- return $. replace(/Cpk/g, "CPK"); ``` ### Change CORS acronym to be all caps ``` yaml directive: - from: source-file-go where: $ transform: >- return $. replace(/Cors/g, "CORS"); ``` ### Change cors xml to be correct ``` yaml directive: - from: source-file-go where: $ transform: >- return $. replace(/xml:"CORS>CORSRule"/g, "xml:\"Cors>CorsRule\""); ``` ### Fix Content-Type header in submit batch request ``` yaml directive: - from: - zz_container_client.go - zz_service_client.go where: $ transform: >- return $. replace (/req.SetBody\(body\,\s+\"application\/xml\"\)/g, `req.SetBody(body, multipartContentType)`); ``` ### Fix response status code check in submit batch request ``` yaml directive: - from: zz_service_client.go where: $ transform: >- return $. replace(/if\s+!runtime\.HasStatusCode\(httpResp,\s+http\.StatusOK\)\s+\{\s+err\s+=\s+runtime\.NewResponseError\(httpResp\)\s+return ServiceClientSubmitBatchResponse\{\}\,\s+err\s+}/g, `if !runtime.HasStatusCode(httpResp, http.StatusAccepted) {\n\t\terr = runtime.NewResponseError(httpResp)\n\t\treturn ServiceClientSubmitBatchResponse{}, err\n\t}`); ``` ### Convert time to GMT for If-Modified-Since and If-Unmodified-Since request headers ``` yaml directive: - from: - zz_container_client.go - zz_blob_client.go - zz_appendblob_client.go - zz_blockblob_client.go - zz_pageblob_client.go where: $ transform: >- return $. replace (/req\.Raw\(\)\.Header\[\"If-Modified-Since\"\]\s+=\s+\[\]string\{modifiedAccessConditions\.IfModifiedSince\.Format\(time\.RFC1123\)\}/g, `req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)}`). replace (/req\.Raw\(\)\.Header\[\"If-Unmodified-Since\"\]\s+=\s+\[\]string\{modifiedAccessConditions\.IfUnmodifiedSince\.Format\(time\.RFC1123\)\}/g, `req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)}`). replace (/req\.Raw\(\)\.Header\[\"x-ms-source-if-modified-since\"\]\s+=\s+\[\]string\{sourceModifiedAccessConditions\.SourceIfModifiedSince\.Format\(time\.RFC1123\)\}/g, `req.Raw().Header["x-ms-source-if-modified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)}`). replace (/req\.Raw\(\)\.Header\[\"x-ms-source-if-unmodified-since\"\]\s+=\s+\[\]string\{sourceModifiedAccessConditions\.SourceIfUnmodifiedSince\.Format\(time\.RFC1123\)\}/g, `req.Raw().Header["x-ms-source-if-unmodified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)}`). replace (/req\.Raw\(\)\.Header\[\"x-ms-immutability-policy-until-date\"\]\s+=\s+\[\]string\{options\.ImmutabilityPolicyExpiry\.Format\(time\.RFC1123\)\}/g, `req.Raw().Header["x-ms-immutability-policy-until-date"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)}`); ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/blob_client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package generated import ( "context" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "time" ) // used to convert times from UTC to GMT before sending across the wire var gmt = time.FixedZone("GMT", 0) func (client *BlobClient) Endpoint() string { return client.endpoint } func (client *BlobClient) InternalClient() *azcore.Client { return client.internal } func (client *BlobClient) DeleteCreateRequest(ctx context.Context, options *BlobClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { return client.deleteCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions) } func (client *BlobClient) SetTierCreateRequest(ctx context.Context, tier AccessTier, options *BlobClientSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { return client.setTierCreateRequest(ctx, tier, options, leaseAccessConditions, modifiedAccessConditions) } // NewBlobClient creates a new instance of BlobClient with the specified values. // - endpoint - The URL of the service account, container, or blob that is the target of the desired operation. // - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider. func NewBlobClient(endpoint string, azClient *azcore.Client) *BlobClient { client := &BlobClient{ internal: azClient, endpoint: endpoint, } return client } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/block_blob_client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) func (client *BlockBlobClient) Endpoint() string { return client.endpoint } func (client *BlockBlobClient) Internal() *azcore.Client { return client.internal } // NewBlockBlobClient creates a new instance of BlockBlobClient with the specified values. // - endpoint - The URL of the service account, container, or blob that is the target of the desired operation. // - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider. func NewBlockBlobClient(endpoint string, azClient *azcore.Client) *BlockBlobClient { client := &BlockBlobClient{ internal: azClient, endpoint: endpoint, } return client } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/build.go ================================================ //go:build go1.18 // +build go1.18 //go:generate autorest ./autorest.md //go:generate gofmt -w . // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package generated ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package generated const ServiceVersion = "2025-05-05" ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/container_client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package generated import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) func (client *ContainerClient) Endpoint() string { return client.endpoint } func (client *ContainerClient) InternalClient() *azcore.Client { return client.internal } // NewContainerClient creates a new instance of ContainerClient with the specified values. // - endpoint - The URL of the service account, container, or blob that is the target of the desired operation. // - pl - the pipeline used for sending requests and handling responses. func NewContainerClient(endpoint string, azClient *azcore.Client) *ContainerClient { client := &ContainerClient{ internal: azClient, endpoint: endpoint, } return client } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/models.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package generated import ( "encoding/xml" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "net/url" ) type TransactionalContentSetter interface { SetCRC64([]byte) SetMD5([]byte) } func (a *AppendBlobClientAppendBlockOptions) SetCRC64(v []byte) { a.TransactionalContentCRC64 = v } func (a *AppendBlobClientAppendBlockOptions) SetMD5(v []byte) { a.TransactionalContentMD5 = v } func (b *BlockBlobClientStageBlockOptions) SetCRC64(v []byte) { b.TransactionalContentCRC64 = v } func (b *BlockBlobClientStageBlockOptions) SetMD5(v []byte) { b.TransactionalContentMD5 = v } func (p *PageBlobClientUploadPagesOptions) SetCRC64(v []byte) { p.TransactionalContentCRC64 = v } func (p *PageBlobClientUploadPagesOptions) SetMD5(v []byte) { p.TransactionalContentMD5 = v } func (b *BlockBlobClientUploadOptions) SetCRC64(v []byte) { b.TransactionalContentCRC64 = v } func (b *BlockBlobClientUploadOptions) SetMD5(v []byte) { b.TransactionalContentMD5 = v } type SourceContentSetter interface { SetSourceContentCRC64(v []byte) SetSourceContentMD5(v []byte) } func (a *AppendBlobClientAppendBlockFromURLOptions) SetSourceContentCRC64(v []byte) { a.SourceContentcrc64 = v } func (a *AppendBlobClientAppendBlockFromURLOptions) SetSourceContentMD5(v []byte) { a.SourceContentMD5 = v } func (b *BlockBlobClientStageBlockFromURLOptions) SetSourceContentCRC64(v []byte) { b.SourceContentcrc64 = v } func (b *BlockBlobClientStageBlockFromURLOptions) SetSourceContentMD5(v []byte) { b.SourceContentMD5 = v } func (p *PageBlobClientUploadPagesFromURLOptions) SetSourceContentCRC64(v []byte) { p.SourceContentcrc64 = v } func (p *PageBlobClientUploadPagesFromURLOptions) SetSourceContentMD5(v []byte) { p.SourceContentMD5 = v } // Custom UnmarshalXML functions for types that need special handling. // UnmarshalXML implements the xml.Unmarshaller interface for type BlobPrefix. func (b *BlobPrefix) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error { type alias BlobPrefix aux := &struct { *alias BlobName *BlobName `xml:"Name"` }{ alias: (*alias)(b), } if err := dec.DecodeElement(aux, &start); err != nil { return err } if aux.BlobName != nil { if aux.BlobName.Encoded != nil && *aux.BlobName.Encoded { name, err := url.QueryUnescape(*aux.BlobName.Content) // name, err := base64.StdEncoding.DecodeString(*aux.BlobName.Content) if err != nil { return err } b.Name = to.Ptr(string(name)) } else { b.Name = aux.BlobName.Content } } return nil } // UnmarshalXML implements the xml.Unmarshaller interface for type BlobItem. func (b *BlobItem) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error { type alias BlobItem aux := &struct { *alias BlobName *BlobName `xml:"Name"` Metadata additionalProperties `xml:"Metadata"` OrMetadata additionalProperties `xml:"OrMetadata"` }{ alias: (*alias)(b), } if err := dec.DecodeElement(aux, &start); err != nil { return err } b.Metadata = (map[string]*string)(aux.Metadata) b.OrMetadata = (map[string]*string)(aux.OrMetadata) if aux.BlobName != nil { if aux.BlobName.Encoded != nil && *aux.BlobName.Encoded { name, err := url.QueryUnescape(*aux.BlobName.Content) // name, err := base64.StdEncoding.DecodeString(*aux.BlobName.Content) if err != nil { return err } b.Name = to.Ptr(string(name)) } else { b.Name = aux.BlobName.Content } } return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/pageblob_client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package generated import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) func (client *PageBlobClient) Endpoint() string { return client.endpoint } func (client *PageBlobClient) InternalClient() *azcore.Client { return client.internal } // NewPageBlobClient creates a new instance of PageBlobClient with the specified values. // - endpoint - The URL of the service account, container, or blob that is the target of the desired operation. // - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider. func NewPageBlobClient(endpoint string, azClient *azcore.Client) *PageBlobClient { client := &PageBlobClient{ internal: azClient, endpoint: endpoint, } return client } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/service_client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package generated import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" ) func (client *ServiceClient) Endpoint() string { return client.endpoint } func (client *ServiceClient) InternalClient() *azcore.Client { return client.internal } // NewServiceClient creates a new instance of ServiceClient with the specified values. // - endpoint - The URL of the service account, container, or blob that is the target of the desired operation. // - azClient - azcore.Client is a basic HTTP client. It consists of a pipeline and tracing provider. func NewServiceClient(endpoint string, azClient *azcore.Client) *ServiceClient { client := &ServiceClient{ internal: azClient, endpoint: endpoint, } return client } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_appendblob_client.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "context" "encoding/base64" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "io" "net/http" "strconv" "time" ) // AppendBlobClient contains the methods for the AppendBlob group. // Don't use this type directly, use a constructor function instead. type AppendBlobClient struct { internal *azcore.Client endpoint string } // AppendBlock - The Append Block operation commits a new block of data to the end of an existing append blob. The Append // Block operation is permitted only if the blob was created with x-ms-blob-type set to // AppendBlob. Append Block is supported only on version 2015-02-21 version or later. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - body - Initial data // - options - AppendBlobClientAppendBlockOptions contains the optional parameters for the AppendBlobClient.AppendBlock method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - AppendPositionAccessConditions - AppendPositionAccessConditions contains a group of parameters for the AppendBlobClient.AppendBlock // method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *AppendBlobClient) AppendBlock(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *AppendBlobClientAppendBlockOptions, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (AppendBlobClientAppendBlockResponse, error) { var err error req, err := client.appendBlockCreateRequest(ctx, contentLength, body, options, leaseAccessConditions, appendPositionAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return AppendBlobClientAppendBlockResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return AppendBlobClientAppendBlockResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return AppendBlobClientAppendBlockResponse{}, err } resp, err := client.appendBlockHandleResponse(httpResp) return resp, err } // appendBlockCreateRequest creates the AppendBlock request. func (client *AppendBlobClient) appendBlockCreateRequest(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *AppendBlobClientAppendBlockOptions, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "appendblock") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if options != nil && options.TransactionalContentMD5 != nil { req.Raw().Header["Content-MD5"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if appendPositionAccessConditions != nil && appendPositionAccessConditions.AppendPosition != nil { req.Raw().Header["x-ms-blob-condition-appendpos"] = []string{strconv.FormatInt(*appendPositionAccessConditions.AppendPosition, 10)} } if appendPositionAccessConditions != nil && appendPositionAccessConditions.MaxSize != nil { req.Raw().Header["x-ms-blob-condition-maxsize"] = []string{strconv.FormatInt(*appendPositionAccessConditions.MaxSize, 10)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.TransactionalContentCRC64 != nil { req.Raw().Header["x-ms-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.StructuredBodyType != nil { req.Raw().Header["x-ms-structured-body"] = []string{*options.StructuredBodyType} } if options != nil && options.StructuredContentLength != nil { req.Raw().Header["x-ms-structured-content-length"] = []string{strconv.FormatInt(*options.StructuredContentLength, 10)} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := req.SetBody(body, "application/octet-stream"); err != nil { return nil, err } return req, nil } // appendBlockHandleResponse handles the AppendBlock response. func (client *AppendBlobClient) appendBlockHandleResponse(resp *http.Response) (AppendBlobClientAppendBlockResponse, error) { result := AppendBlobClientAppendBlockResponse{} if val := resp.Header.Get("x-ms-blob-append-offset"); val != "" { result.BlobAppendOffset = &val } if val := resp.Header.Get("x-ms-blob-committed-block-count"); val != "" { blobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32) blobCommittedBlockCount := int32(blobCommittedBlockCount32) if err != nil { return AppendBlobClientAppendBlockResponse{}, err } result.BlobCommittedBlockCount = &blobCommittedBlockCount } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobClientAppendBlockResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobClientAppendBlockResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return AppendBlobClientAppendBlockResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return AppendBlobClientAppendBlockResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return AppendBlobClientAppendBlockResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-structured-body"); val != "" { result.StructuredBodyType = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // AppendBlockFromURL - The Append Block operation commits a new block of data to the end of an existing append blob where // the contents are read from a source url. The Append Block operation is permitted only if the blob was // created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version 2015-02-21 version or later. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - sourceURL - Specify a URL to the copy source. // - contentLength - The length of the request. // - options - AppendBlobClientAppendBlockFromURLOptions contains the optional parameters for the AppendBlobClient.AppendBlockFromURL // method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - AppendPositionAccessConditions - AppendPositionAccessConditions contains a group of parameters for the AppendBlobClient.AppendBlock // method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL // method. func (client *AppendBlobClient) AppendBlockFromURL(ctx context.Context, sourceURL string, contentLength int64, options *AppendBlobClientAppendBlockFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (AppendBlobClientAppendBlockFromURLResponse, error) { var err error req, err := client.appendBlockFromURLCreateRequest(ctx, sourceURL, contentLength, options, cpkInfo, cpkScopeInfo, leaseAccessConditions, appendPositionAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) if err != nil { return AppendBlobClientAppendBlockFromURLResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return AppendBlobClientAppendBlockFromURLResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return AppendBlobClientAppendBlockFromURLResponse{}, err } resp, err := client.appendBlockFromURLHandleResponse(httpResp) return resp, err } // appendBlockFromURLCreateRequest creates the AppendBlockFromURL request. func (client *AppendBlobClient) appendBlockFromURLCreateRequest(ctx context.Context, sourceURL string, contentLength int64, options *AppendBlobClientAppendBlockFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "appendblock") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if options != nil && options.TransactionalContentMD5 != nil { req.Raw().Header["Content-MD5"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if appendPositionAccessConditions != nil && appendPositionAccessConditions.AppendPosition != nil { req.Raw().Header["x-ms-blob-condition-appendpos"] = []string{strconv.FormatInt(*appendPositionAccessConditions.AppendPosition, 10)} } if appendPositionAccessConditions != nil && appendPositionAccessConditions.MaxSize != nil { req.Raw().Header["x-ms-blob-condition-maxsize"] = []string{strconv.FormatInt(*appendPositionAccessConditions.MaxSize, 10)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-copy-source"] = []string{sourceURL} if options != nil && options.CopySourceAuthorization != nil { req.Raw().Header["x-ms-copy-source-authorization"] = []string{*options.CopySourceAuthorization} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.SourceContentcrc64 != nil { req.Raw().Header["x-ms-source-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentcrc64)} } if options != nil && options.SourceContentMD5 != nil { req.Raw().Header["x-ms-source-content-md5"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil { req.Raw().Header["x-ms-source-if-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Raw().Header["x-ms-source-if-modified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil { req.Raw().Header["x-ms-source-if-none-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil { req.Raw().Header["x-ms-source-if-unmodified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.SourceRange != nil { req.Raw().Header["x-ms-source-range"] = []string{*options.SourceRange} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // appendBlockFromURLHandleResponse handles the AppendBlockFromURL response. func (client *AppendBlobClient) appendBlockFromURLHandleResponse(resp *http.Response) (AppendBlobClientAppendBlockFromURLResponse, error) { result := AppendBlobClientAppendBlockFromURLResponse{} if val := resp.Header.Get("x-ms-blob-append-offset"); val != "" { result.BlobAppendOffset = &val } if val := resp.Header.Get("x-ms-blob-committed-block-count"); val != "" { blobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32) blobCommittedBlockCount := int32(blobCommittedBlockCount32) if err != nil { return AppendBlobClientAppendBlockFromURLResponse{}, err } result.BlobCommittedBlockCount = &blobCommittedBlockCount } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobClientAppendBlockFromURLResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobClientAppendBlockFromURLResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return AppendBlobClientAppendBlockFromURLResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return AppendBlobClientAppendBlockFromURLResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return AppendBlobClientAppendBlockFromURLResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // Create - The Create Append Blob operation creates a new append blob. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - options - AppendBlobClientCreateOptions contains the optional parameters for the AppendBlobClient.Create method. // - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *AppendBlobClient) Create(ctx context.Context, contentLength int64, options *AppendBlobClientCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (AppendBlobClientCreateResponse, error) { var err error req, err := client.createCreateRequest(ctx, contentLength, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return AppendBlobClientCreateResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return AppendBlobClientCreateResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return AppendBlobClientCreateResponse{}, err } resp, err := client.createHandleResponse(httpResp) return resp, err } // createCreateRequest creates the Create request. func (client *AppendBlobClient) createCreateRequest(ctx context.Context, contentLength int64, options *AppendBlobClientCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { req.Raw().Header["x-ms-blob-cache-control"] = []string{*blobHTTPHeaders.BlobCacheControl} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { req.Raw().Header["x-ms-blob-content-disposition"] = []string{*blobHTTPHeaders.BlobContentDisposition} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { req.Raw().Header["x-ms-blob-content-encoding"] = []string{*blobHTTPHeaders.BlobContentEncoding} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { req.Raw().Header["x-ms-blob-content-language"] = []string{*blobHTTPHeaders.BlobContentLanguage} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { req.Raw().Header["x-ms-blob-content-md5"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { req.Raw().Header["x-ms-blob-content-type"] = []string{*blobHTTPHeaders.BlobContentType} } req.Raw().Header["x-ms-blob-type"] = []string{"AppendBlob"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if options != nil && options.ImmutabilityPolicyMode != nil { req.Raw().Header["x-ms-immutability-policy-mode"] = []string{string(*options.ImmutabilityPolicyMode)} } if options != nil && options.ImmutabilityPolicyExpiry != nil { req.Raw().Header["x-ms-immutability-policy-until-date"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.LegalHold != nil { req.Raw().Header["x-ms-legal-hold"] = []string{strconv.FormatBool(*options.LegalHold)} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } if options != nil && options.BlobTagsString != nil { req.Raw().Header["x-ms-tags"] = []string{*options.BlobTagsString} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // createHandleResponse handles the Create response. func (client *AppendBlobClient) createHandleResponse(resp *http.Response) (AppendBlobClientCreateResponse, error) { result := AppendBlobClientCreateResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return AppendBlobClientCreateResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return AppendBlobClientCreateResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return AppendBlobClientCreateResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return AppendBlobClientCreateResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // Seal - The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version 2019-12-12 version // or later. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - AppendBlobClientSealOptions contains the optional parameters for the AppendBlobClient.Seal method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - AppendPositionAccessConditions - AppendPositionAccessConditions contains a group of parameters for the AppendBlobClient.AppendBlock // method. func (client *AppendBlobClient) Seal(ctx context.Context, options *AppendBlobClientSealOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions) (AppendBlobClientSealResponse, error) { var err error req, err := client.sealCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions, appendPositionAccessConditions) if err != nil { return AppendBlobClientSealResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return AppendBlobClientSealResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return AppendBlobClientSealResponse{}, err } resp, err := client.sealHandleResponse(httpResp) return resp, err } // sealCreateRequest creates the Seal request. func (client *AppendBlobClient) sealCreateRequest(ctx context.Context, options *AppendBlobClientSealOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, appendPositionAccessConditions *AppendPositionAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "seal") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if appendPositionAccessConditions != nil && appendPositionAccessConditions.AppendPosition != nil { req.Raw().Header["x-ms-blob-condition-appendpos"] = []string{strconv.FormatInt(*appendPositionAccessConditions.AppendPosition, 10)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // sealHandleResponse handles the Seal response. func (client *AppendBlobClient) sealHandleResponse(resp *http.Response) (AppendBlobClientSealResponse, error) { result := AppendBlobClientSealResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return AppendBlobClientSealResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-blob-sealed"); val != "" { isSealed, err := strconv.ParseBool(val) if err != nil { return AppendBlobClientSealResponse{}, err } result.IsSealed = &isSealed } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return AppendBlobClientSealResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_blob_client.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "context" "encoding/base64" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "net/http" "strconv" "strings" "time" ) // BlobClient contains the methods for the Blob group. // Don't use this type directly, use a constructor function instead. type BlobClient struct { internal *azcore.Client endpoint string } // AbortCopyFromURL - The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination // blob with zero length and full metadata. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - copyID - The copy identifier provided in the x-ms-copy-id header of the original Copy Blob operation. // - options - BlobClientAbortCopyFromURLOptions contains the optional parameters for the BlobClient.AbortCopyFromURL method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. func (client *BlobClient) AbortCopyFromURL(ctx context.Context, copyID string, options *BlobClientAbortCopyFromURLOptions, leaseAccessConditions *LeaseAccessConditions) (BlobClientAbortCopyFromURLResponse, error) { var err error req, err := client.abortCopyFromURLCreateRequest(ctx, copyID, options, leaseAccessConditions) if err != nil { return BlobClientAbortCopyFromURLResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientAbortCopyFromURLResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusNoContent) { err = runtime.NewResponseError(httpResp) return BlobClientAbortCopyFromURLResponse{}, err } resp, err := client.abortCopyFromURLHandleResponse(httpResp) return resp, err } // abortCopyFromURLCreateRequest creates the AbortCopyFromURL request. func (client *BlobClient) abortCopyFromURLCreateRequest(ctx context.Context, copyID string, options *BlobClientAbortCopyFromURLOptions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "copy") reqQP.Set("copyid", copyID) if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-copy-action"] = []string{"abort"} if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // abortCopyFromURLHandleResponse handles the AbortCopyFromURL response. func (client *BlobClient) abortCopyFromURLHandleResponse(resp *http.Response) (BlobClientAbortCopyFromURLResponse, error) { result := BlobClientAbortCopyFromURLResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientAbortCopyFromURLResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // AcquireLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - duration - Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite // lease can be between 15 and 60 seconds. A lease duration cannot be changed using // renew or change. // - options - BlobClientAcquireLeaseOptions contains the optional parameters for the BlobClient.AcquireLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) AcquireLease(ctx context.Context, duration int32, options *BlobClientAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientAcquireLeaseResponse, error) { var err error req, err := client.acquireLeaseCreateRequest(ctx, duration, options, modifiedAccessConditions) if err != nil { return BlobClientAcquireLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientAcquireLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return BlobClientAcquireLeaseResponse{}, err } resp, err := client.acquireLeaseHandleResponse(httpResp) return resp, err } // acquireLeaseCreateRequest creates the AcquireLease request. func (client *BlobClient) acquireLeaseCreateRequest(ctx context.Context, duration int32, options *BlobClientAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } req.Raw().Header["x-ms-lease-action"] = []string{"acquire"} req.Raw().Header["x-ms-lease-duration"] = []string{strconv.FormatInt(int64(duration), 10)} if options != nil && options.ProposedLeaseID != nil { req.Raw().Header["x-ms-proposed-lease-id"] = []string{*options.ProposedLeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // acquireLeaseHandleResponse handles the AcquireLease response. func (client *BlobClient) acquireLeaseHandleResponse(resp *http.Response) (BlobClientAcquireLeaseResponse, error) { result := BlobClientAcquireLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientAcquireLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientAcquireLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-id"); val != "" { result.LeaseID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // BreakLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientBreakLeaseOptions contains the optional parameters for the BlobClient.BreakLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) BreakLease(ctx context.Context, options *BlobClientBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientBreakLeaseResponse, error) { var err error req, err := client.breakLeaseCreateRequest(ctx, options, modifiedAccessConditions) if err != nil { return BlobClientBreakLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientBreakLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return BlobClientBreakLeaseResponse{}, err } resp, err := client.breakLeaseHandleResponse(httpResp) return resp, err } // breakLeaseCreateRequest creates the BreakLease request. func (client *BlobClient) breakLeaseCreateRequest(ctx context.Context, options *BlobClientBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } req.Raw().Header["x-ms-lease-action"] = []string{"break"} if options != nil && options.BreakPeriod != nil { req.Raw().Header["x-ms-lease-break-period"] = []string{strconv.FormatInt(int64(*options.BreakPeriod), 10)} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // breakLeaseHandleResponse handles the BreakLease response. func (client *BlobClient) breakLeaseHandleResponse(resp *http.Response) (BlobClientBreakLeaseResponse, error) { result := BlobClientBreakLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientBreakLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientBreakLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-time"); val != "" { leaseTime32, err := strconv.ParseInt(val, 10, 32) leaseTime := int32(leaseTime32) if err != nil { return BlobClientBreakLeaseResponse{}, err } result.LeaseTime = &leaseTime } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // ChangeLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - leaseID - Specifies the current lease ID on the resource. // - proposedLeaseID - Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed // lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID // string formats. // - options - BlobClientChangeLeaseOptions contains the optional parameters for the BlobClient.ChangeLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, options *BlobClientChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientChangeLeaseResponse, error) { var err error req, err := client.changeLeaseCreateRequest(ctx, leaseID, proposedLeaseID, options, modifiedAccessConditions) if err != nil { return BlobClientChangeLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientChangeLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientChangeLeaseResponse{}, err } resp, err := client.changeLeaseHandleResponse(httpResp) return resp, err } // changeLeaseCreateRequest creates the ChangeLease request. func (client *BlobClient) changeLeaseCreateRequest(ctx context.Context, leaseID string, proposedLeaseID string, options *BlobClientChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } req.Raw().Header["x-ms-lease-action"] = []string{"change"} req.Raw().Header["x-ms-lease-id"] = []string{leaseID} req.Raw().Header["x-ms-proposed-lease-id"] = []string{proposedLeaseID} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // changeLeaseHandleResponse handles the ChangeLease response. func (client *BlobClient) changeLeaseHandleResponse(resp *http.Response) (BlobClientChangeLeaseResponse, error) { result := BlobClientChangeLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientChangeLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientChangeLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-id"); val != "" { result.LeaseID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // CopyFromURL - The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return a response // until the copy is complete. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - copySource - Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies // a page blob snapshot. The value should be URL-encoded as it would appear in a request // URI. The source blob must either be public or must be authenticated via a shared access signature. // - options - BlobClientCopyFromURLOptions contains the optional parameters for the BlobClient.CopyFromURL method. // - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL // method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. func (client *BlobClient) CopyFromURL(ctx context.Context, copySource string, options *BlobClientCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions, cpkScopeInfo *CPKScopeInfo) (BlobClientCopyFromURLResponse, error) { var err error req, err := client.copyFromURLCreateRequest(ctx, copySource, options, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions, cpkScopeInfo) if err != nil { return BlobClientCopyFromURLResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientCopyFromURLResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return BlobClientCopyFromURLResponse{}, err } resp, err := client.copyFromURLHandleResponse(httpResp) return resp, err } // copyFromURLCreateRequest creates the CopyFromURL request. func (client *BlobClient) copyFromURLCreateRequest(ctx context.Context, copySource string, options *BlobClientCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions, cpkScopeInfo *CPKScopeInfo) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.Tier != nil { req.Raw().Header["x-ms-access-tier"] = []string{string(*options.Tier)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-copy-source"] = []string{copySource} if options != nil && options.CopySourceAuthorization != nil { req.Raw().Header["x-ms-copy-source-authorization"] = []string{*options.CopySourceAuthorization} } if options != nil && options.CopySourceTags != nil { req.Raw().Header["x-ms-copy-source-tag-option"] = []string{string(*options.CopySourceTags)} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if options != nil && options.ImmutabilityPolicyMode != nil { req.Raw().Header["x-ms-immutability-policy-mode"] = []string{string(*options.ImmutabilityPolicyMode)} } if options != nil && options.ImmutabilityPolicyExpiry != nil { req.Raw().Header["x-ms-immutability-policy-until-date"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.LegalHold != nil { req.Raw().Header["x-ms-legal-hold"] = []string{strconv.FormatBool(*options.LegalHold)} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } req.Raw().Header["x-ms-requires-sync"] = []string{"true"} if options != nil && options.SourceContentMD5 != nil { req.Raw().Header["x-ms-source-content-md5"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil { req.Raw().Header["x-ms-source-if-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Raw().Header["x-ms-source-if-modified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil { req.Raw().Header["x-ms-source-if-none-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil { req.Raw().Header["x-ms-source-if-unmodified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.BlobTagsString != nil { req.Raw().Header["x-ms-tags"] = []string{*options.BlobTagsString} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // copyFromURLHandleResponse handles the CopyFromURL response. func (client *BlobClient) copyFromURLHandleResponse(resp *http.Response) (BlobClientCopyFromURLResponse, error) { result := BlobClientCopyFromURLResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientCopyFromURLResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientCopyFromURLResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("x-ms-copy-id"); val != "" { result.CopyID = &val } if val := resp.Header.Get("x-ms-copy-status"); val != "" { result.CopyStatus = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientCopyFromURLResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientCopyFromURLResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // CreateSnapshot - The Create Snapshot operation creates a read-only snapshot of a blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientCreateSnapshotOptions contains the optional parameters for the BlobClient.CreateSnapshot method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. func (client *BlobClient) CreateSnapshot(ctx context.Context, options *BlobClientCreateSnapshotOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobClientCreateSnapshotResponse, error) { var err error req, err := client.createSnapshotCreateRequest(ctx, options, cpkInfo, cpkScopeInfo, modifiedAccessConditions, leaseAccessConditions) if err != nil { return BlobClientCreateSnapshotResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientCreateSnapshotResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return BlobClientCreateSnapshotResponse{}, err } resp, err := client.createSnapshotHandleResponse(httpResp) return resp, err } // createSnapshotCreateRequest creates the CreateSnapshot request. func (client *BlobClient) createSnapshotCreateRequest(ctx context.Context, options *BlobClientCreateSnapshotOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "snapshot") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // createSnapshotHandleResponse handles the CreateSnapshot response. func (client *BlobClient) createSnapshotHandleResponse(resp *http.Response) (BlobClientCreateSnapshotResponse, error) { result := BlobClientCreateSnapshotResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientCreateSnapshotResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlobClientCreateSnapshotResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientCreateSnapshotResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-snapshot"); val != "" { result.Snapshot = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // Delete - If the storage account's soft delete feature is disabled then, when a blob is deleted, it is permanently removed // from the storage account. If the storage account's soft delete feature is enabled, // then, when a blob is deleted, it is marked for deletion and becomes inaccessible immediately. However, the blob service // retains the blob or snapshot for the number of days specified by the // DeleteRetentionPolicy section of Storage service properties [Set-Blob-Service-Properties.md]. After the specified number // of days has passed, the blob's data is permanently removed from the storage // account. Note that you continue to be charged for the soft-deleted blob's storage until it is permanently removed. Use // the List Blobs API and specify the "include=deleted" query parameter to discover // which blobs and snapshots have been soft deleted. You can then use the Undelete Blob API to restore a soft-deleted blob. // All other operations on a soft-deleted blob or snapshot causes the service to // return an HTTP status code of 404 (ResourceNotFound). // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientDeleteOptions contains the optional parameters for the BlobClient.Delete method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) Delete(ctx context.Context, options *BlobClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientDeleteResponse, error) { var err error req, err := client.deleteCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlobClientDeleteResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientDeleteResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return BlobClientDeleteResponse{}, err } resp, err := client.deleteHandleResponse(httpResp) return resp, err } // deleteCreateRequest creates the Delete request. func (client *BlobClient) deleteCreateRequest(ctx context.Context, options *BlobClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodDelete, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.DeleteType != nil { reqQP.Set("deletetype", string(*options.DeleteType)) } if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.DeleteSnapshots != nil { req.Raw().Header["x-ms-delete-snapshots"] = []string{string(*options.DeleteSnapshots)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // deleteHandleResponse handles the Delete response. func (client *BlobClient) deleteHandleResponse(resp *http.Response) (BlobClientDeleteResponse, error) { result := BlobClientDeleteResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientDeleteResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // DeleteImmutabilityPolicy - The Delete Immutability Policy operation deletes the immutability policy on the blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientDeleteImmutabilityPolicyOptions contains the optional parameters for the BlobClient.DeleteImmutabilityPolicy // method. func (client *BlobClient) DeleteImmutabilityPolicy(ctx context.Context, options *BlobClientDeleteImmutabilityPolicyOptions) (BlobClientDeleteImmutabilityPolicyResponse, error) { var err error req, err := client.deleteImmutabilityPolicyCreateRequest(ctx, options) if err != nil { return BlobClientDeleteImmutabilityPolicyResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientDeleteImmutabilityPolicyResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientDeleteImmutabilityPolicyResponse{}, err } resp, err := client.deleteImmutabilityPolicyHandleResponse(httpResp) return resp, err } // deleteImmutabilityPolicyCreateRequest creates the DeleteImmutabilityPolicy request. func (client *BlobClient) deleteImmutabilityPolicyCreateRequest(ctx context.Context, options *BlobClientDeleteImmutabilityPolicyOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodDelete, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "immutabilityPolicies") if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // deleteImmutabilityPolicyHandleResponse handles the DeleteImmutabilityPolicy response. func (client *BlobClient) deleteImmutabilityPolicyHandleResponse(resp *http.Response) (BlobClientDeleteImmutabilityPolicyResponse, error) { result := BlobClientDeleteImmutabilityPolicyResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientDeleteImmutabilityPolicyResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // Download - The Download operation reads or downloads a blob from the system, including its metadata and properties. You // can also call Download to read a snapshot. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientDownloadOptions contains the optional parameters for the BlobClient.Download method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) Download(ctx context.Context, options *BlobClientDownloadOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientDownloadResponse, error) { var err error req, err := client.downloadCreateRequest(ctx, options, leaseAccessConditions, cpkInfo, modifiedAccessConditions) if err != nil { return BlobClientDownloadResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientDownloadResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK, http.StatusPartialContent, http.StatusNotModified) { err = runtime.NewResponseError(httpResp) return BlobClientDownloadResponse{}, err } resp, err := client.downloadHandleResponse(httpResp) return resp, err } // downloadCreateRequest creates the Download request. func (client *BlobClient) downloadCreateRequest(ctx context.Context, options *BlobClientDownloadOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() runtime.SkipBodyDownload(req) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.Range != nil { req.Raw().Header["x-ms-range"] = []string{*options.Range} } if options != nil && options.RangeGetContentCRC64 != nil { req.Raw().Header["x-ms-range-get-content-crc64"] = []string{strconv.FormatBool(*options.RangeGetContentCRC64)} } if options != nil && options.RangeGetContentMD5 != nil { req.Raw().Header["x-ms-range-get-content-md5"] = []string{strconv.FormatBool(*options.RangeGetContentMD5)} } if options != nil && options.StructuredBodyType != nil { req.Raw().Header["x-ms-structured-body"] = []string{*options.StructuredBodyType} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // downloadHandleResponse handles the Download response. func (client *BlobClient) downloadHandleResponse(resp *http.Response) (BlobClientDownloadResponse, error) { result := BlobClientDownloadResponse{Body: resp.Body} if val := resp.Header.Get("Accept-Ranges"); val != "" { result.AcceptRanges = &val } if val := resp.Header.Get("x-ms-blob-committed-block-count"); val != "" { blobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32) blobCommittedBlockCount := int32(blobCommittedBlockCount32) if err != nil { return BlobClientDownloadResponse{}, err } result.BlobCommittedBlockCount = &blobCommittedBlockCount } if val := resp.Header.Get("x-ms-blob-content-md5"); val != "" { blobContentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientDownloadResponse{}, err } result.BlobContentMD5 = blobContentMD5 } if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientDownloadResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-blob-type"); val != "" { result.BlobType = (*BlobType)(&val) } if val := resp.Header.Get("Cache-Control"); val != "" { result.CacheControl = &val } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientDownloadResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-Disposition"); val != "" { result.ContentDisposition = &val } if val := resp.Header.Get("Content-Encoding"); val != "" { result.ContentEncoding = &val } if val := resp.Header.Get("Content-Language"); val != "" { result.ContentLanguage = &val } if val := resp.Header.Get("Content-Length"); val != "" { contentLength, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientDownloadResponse{}, err } result.ContentLength = &contentLength } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientDownloadResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Content-Range"); val != "" { result.ContentRange = &val } if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } if val := resp.Header.Get("x-ms-copy-completion-time"); val != "" { copyCompletionTime, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientDownloadResponse{}, err } result.CopyCompletionTime = ©CompletionTime } if val := resp.Header.Get("x-ms-copy-id"); val != "" { result.CopyID = &val } if val := resp.Header.Get("x-ms-copy-progress"); val != "" { result.CopyProgress = &val } if val := resp.Header.Get("x-ms-copy-source"); val != "" { result.CopySource = &val } if val := resp.Header.Get("x-ms-copy-status"); val != "" { result.CopyStatus = (*CopyStatusType)(&val) } if val := resp.Header.Get("x-ms-copy-status-description"); val != "" { result.CopyStatusDescription = &val } if val := resp.Header.Get("x-ms-creation-time"); val != "" { creationTime, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientDownloadResponse{}, err } result.CreationTime = &creationTime } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientDownloadResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-error-code"); val != "" { result.ErrorCode = &val } if val := resp.Header.Get("x-ms-immutability-policy-until-date"); val != "" { immutabilityPolicyExpiresOn, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientDownloadResponse{}, err } result.ImmutabilityPolicyExpiresOn = &immutabilityPolicyExpiresOn } if val := resp.Header.Get("x-ms-immutability-policy-mode"); val != "" { result.ImmutabilityPolicyMode = (*ImmutabilityPolicyMode)(&val) } if val := resp.Header.Get("x-ms-is-current-version"); val != "" { isCurrentVersion, err := strconv.ParseBool(val) if err != nil { return BlobClientDownloadResponse{}, err } result.IsCurrentVersion = &isCurrentVersion } if val := resp.Header.Get("x-ms-blob-sealed"); val != "" { isSealed, err := strconv.ParseBool(val) if err != nil { return BlobClientDownloadResponse{}, err } result.IsSealed = &isSealed } if val := resp.Header.Get("x-ms-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlobClientDownloadResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("x-ms-last-access-time"); val != "" { lastAccessed, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientDownloadResponse{}, err } result.LastAccessed = &lastAccessed } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientDownloadResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-duration"); val != "" { result.LeaseDuration = (*LeaseDurationType)(&val) } if val := resp.Header.Get("x-ms-lease-state"); val != "" { result.LeaseState = (*LeaseStateType)(&val) } if val := resp.Header.Get("x-ms-lease-status"); val != "" { result.LeaseStatus = (*LeaseStatusType)(&val) } if val := resp.Header.Get("x-ms-legal-hold"); val != "" { legalHold, err := strconv.ParseBool(val) if err != nil { return BlobClientDownloadResponse{}, err } result.LegalHold = &legalHold } for hh := range resp.Header { if len(hh) > len("x-ms-meta-") && strings.EqualFold(hh[:len("x-ms-meta-")], "x-ms-meta-") { if result.Metadata == nil { result.Metadata = map[string]*string{} } result.Metadata[hh[len("x-ms-meta-"):]] = to.Ptr(resp.Header.Get(hh)) } } if val := resp.Header.Get("x-ms-or-policy-id"); val != "" { result.ObjectReplicationPolicyID = &val } for hh := range resp.Header { if len(hh) > len("x-ms-or-") && strings.EqualFold(hh[:len("x-ms-or-")], "x-ms-or-") { if result.ObjectReplicationRules == nil { result.ObjectReplicationRules = map[string]*string{} } result.ObjectReplicationRules[hh[len("x-ms-or-"):]] = to.Ptr(resp.Header.Get(hh)) } } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-structured-body"); val != "" { result.StructuredBodyType = &val } if val := resp.Header.Get("x-ms-structured-content-length"); val != "" { structuredContentLength, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientDownloadResponse{}, err } result.StructuredContentLength = &structuredContentLength } if val := resp.Header.Get("x-ms-tag-count"); val != "" { tagCount, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientDownloadResponse{}, err } result.TagCount = &tagCount } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // GetAccountInfo - Returns the sku name and account kind // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientGetAccountInfoOptions contains the optional parameters for the BlobClient.GetAccountInfo method. func (client *BlobClient) GetAccountInfo(ctx context.Context, options *BlobClientGetAccountInfoOptions) (BlobClientGetAccountInfoResponse, error) { var err error req, err := client.getAccountInfoCreateRequest(ctx, options) if err != nil { return BlobClientGetAccountInfoResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientGetAccountInfoResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientGetAccountInfoResponse{}, err } resp, err := client.getAccountInfoHandleResponse(httpResp) return resp, err } // getAccountInfoCreateRequest creates the GetAccountInfo request. func (client *BlobClient) getAccountInfoCreateRequest(ctx context.Context, options *BlobClientGetAccountInfoOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "properties") reqQP.Set("restype", "account") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getAccountInfoHandleResponse handles the GetAccountInfo response. func (client *BlobClient) getAccountInfoHandleResponse(resp *http.Response) (BlobClientGetAccountInfoResponse, error) { result := BlobClientGetAccountInfoResponse{} if val := resp.Header.Get("x-ms-account-kind"); val != "" { result.AccountKind = (*AccountKind)(&val) } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetAccountInfoResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-is-hns-enabled"); val != "" { isHierarchicalNamespaceEnabled, err := strconv.ParseBool(val) if err != nil { return BlobClientGetAccountInfoResponse{}, err } result.IsHierarchicalNamespaceEnabled = &isHierarchicalNamespaceEnabled } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-sku-name"); val != "" { result.SKUName = (*SKUName)(&val) } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // GetProperties - The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system properties // for the blob. It does not return the content of the blob. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientGetPropertiesOptions contains the optional parameters for the BlobClient.GetProperties method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) GetProperties(ctx context.Context, options *BlobClientGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientGetPropertiesResponse, error) { var err error req, err := client.getPropertiesCreateRequest(ctx, options, leaseAccessConditions, cpkInfo, modifiedAccessConditions) if err != nil { return BlobClientGetPropertiesResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientGetPropertiesResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientGetPropertiesResponse{}, err } resp, err := client.getPropertiesHandleResponse(httpResp) return resp, err } // getPropertiesCreateRequest creates the GetProperties request. func (client *BlobClient) getPropertiesCreateRequest(ctx context.Context, options *BlobClientGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodHead, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getPropertiesHandleResponse handles the GetProperties response. func (client *BlobClient) getPropertiesHandleResponse(resp *http.Response) (BlobClientGetPropertiesResponse, error) { result := BlobClientGetPropertiesResponse{} if val := resp.Header.Get("Accept-Ranges"); val != "" { result.AcceptRanges = &val } if val := resp.Header.Get("x-ms-access-tier"); val != "" { result.AccessTier = &val } if val := resp.Header.Get("x-ms-access-tier-change-time"); val != "" { accessTierChangeTime, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.AccessTierChangeTime = &accessTierChangeTime } if val := resp.Header.Get("x-ms-access-tier-inferred"); val != "" { accessTierInferred, err := strconv.ParseBool(val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.AccessTierInferred = &accessTierInferred } if val := resp.Header.Get("x-ms-archive-status"); val != "" { result.ArchiveStatus = &val } if val := resp.Header.Get("x-ms-blob-committed-block-count"); val != "" { blobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32) blobCommittedBlockCount := int32(blobCommittedBlockCount32) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.BlobCommittedBlockCount = &blobCommittedBlockCount } if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-blob-type"); val != "" { result.BlobType = (*BlobType)(&val) } if val := resp.Header.Get("Cache-Control"); val != "" { result.CacheControl = &val } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Content-Disposition"); val != "" { result.ContentDisposition = &val } if val := resp.Header.Get("Content-Encoding"); val != "" { result.ContentEncoding = &val } if val := resp.Header.Get("Content-Language"); val != "" { result.ContentLanguage = &val } if val := resp.Header.Get("Content-Length"); val != "" { contentLength, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.ContentLength = &contentLength } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } if val := resp.Header.Get("x-ms-copy-completion-time"); val != "" { copyCompletionTime, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.CopyCompletionTime = ©CompletionTime } if val := resp.Header.Get("x-ms-copy-id"); val != "" { result.CopyID = &val } if val := resp.Header.Get("x-ms-copy-progress"); val != "" { result.CopyProgress = &val } if val := resp.Header.Get("x-ms-copy-source"); val != "" { result.CopySource = &val } if val := resp.Header.Get("x-ms-copy-status"); val != "" { result.CopyStatus = (*CopyStatusType)(&val) } if val := resp.Header.Get("x-ms-copy-status-description"); val != "" { result.CopyStatusDescription = &val } if val := resp.Header.Get("x-ms-creation-time"); val != "" { creationTime, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.CreationTime = &creationTime } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-copy-destination-snapshot"); val != "" { result.DestinationSnapshot = &val } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-expiry-time"); val != "" { expiresOn, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.ExpiresOn = &expiresOn } if val := resp.Header.Get("x-ms-immutability-policy-until-date"); val != "" { immutabilityPolicyExpiresOn, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.ImmutabilityPolicyExpiresOn = &immutabilityPolicyExpiresOn } if val := resp.Header.Get("x-ms-immutability-policy-mode"); val != "" { result.ImmutabilityPolicyMode = (*ImmutabilityPolicyMode)(&val) } if val := resp.Header.Get("x-ms-is-current-version"); val != "" { isCurrentVersion, err := strconv.ParseBool(val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.IsCurrentVersion = &isCurrentVersion } if val := resp.Header.Get("x-ms-incremental-copy"); val != "" { isIncrementalCopy, err := strconv.ParseBool(val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.IsIncrementalCopy = &isIncrementalCopy } if val := resp.Header.Get("x-ms-blob-sealed"); val != "" { isSealed, err := strconv.ParseBool(val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.IsSealed = &isSealed } if val := resp.Header.Get("x-ms-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("x-ms-last-access-time"); val != "" { lastAccessed, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.LastAccessed = &lastAccessed } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-duration"); val != "" { result.LeaseDuration = (*LeaseDurationType)(&val) } if val := resp.Header.Get("x-ms-lease-state"); val != "" { result.LeaseState = (*LeaseStateType)(&val) } if val := resp.Header.Get("x-ms-lease-status"); val != "" { result.LeaseStatus = (*LeaseStatusType)(&val) } if val := resp.Header.Get("x-ms-legal-hold"); val != "" { legalHold, err := strconv.ParseBool(val) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.LegalHold = &legalHold } for hh := range resp.Header { if len(hh) > len("x-ms-meta-") && strings.EqualFold(hh[:len("x-ms-meta-")], "x-ms-meta-") { if result.Metadata == nil { result.Metadata = map[string]*string{} } result.Metadata[hh[len("x-ms-meta-"):]] = to.Ptr(resp.Header.Get(hh)) } } if val := resp.Header.Get("x-ms-or-policy-id"); val != "" { result.ObjectReplicationPolicyID = &val } for hh := range resp.Header { if len(hh) > len("x-ms-or-") && strings.EqualFold(hh[:len("x-ms-or-")], "x-ms-or-") { if result.ObjectReplicationRules == nil { result.ObjectReplicationRules = map[string]*string{} } result.ObjectReplicationRules[hh[len("x-ms-or-"):]] = to.Ptr(resp.Header.Get(hh)) } } if val := resp.Header.Get("x-ms-rehydrate-priority"); val != "" { result.RehydratePriority = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-tag-count"); val != "" { tagCount, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientGetPropertiesResponse{}, err } result.TagCount = &tagCount } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // GetTags - The Get Tags operation enables users to get the tags associated with a blob. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientGetTagsOptions contains the optional parameters for the BlobClient.GetTags method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. func (client *BlobClient) GetTags(ctx context.Context, options *BlobClientGetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobClientGetTagsResponse, error) { var err error req, err := client.getTagsCreateRequest(ctx, options, modifiedAccessConditions, leaseAccessConditions) if err != nil { return BlobClientGetTagsResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientGetTagsResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientGetTagsResponse{}, err } resp, err := client.getTagsHandleResponse(httpResp) return resp, err } // getTagsCreateRequest creates the GetTags request. func (client *BlobClient) getTagsCreateRequest(ctx context.Context, options *BlobClientGetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "tags") if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getTagsHandleResponse handles the GetTags response. func (client *BlobClient) getTagsHandleResponse(resp *http.Response) (BlobClientGetTagsResponse, error) { result := BlobClientGetTagsResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientGetTagsResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.BlobTags); err != nil { return BlobClientGetTagsResponse{}, err } return result, nil } // Query - The Query operation enables users to select/project on blob data by providing simple query expressions. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientQueryOptions contains the optional parameters for the BlobClient.Query method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) Query(ctx context.Context, options *BlobClientQueryOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientQueryResponse, error) { var err error req, err := client.queryCreateRequest(ctx, options, leaseAccessConditions, cpkInfo, modifiedAccessConditions) if err != nil { return BlobClientQueryResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientQueryResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK, http.StatusPartialContent) { err = runtime.NewResponseError(httpResp) return BlobClientQueryResponse{}, err } resp, err := client.queryHandleResponse(httpResp) return resp, err } // queryCreateRequest creates the Query request. func (client *BlobClient) queryCreateRequest(ctx context.Context, options *BlobClientQueryOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPost, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "query") if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() runtime.SkipBodyDownload(req) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if options != nil && options.QueryRequest != nil { if err := runtime.MarshalAsXML(req, *options.QueryRequest); err != nil { return nil, err } return req, nil } return req, nil } // queryHandleResponse handles the Query response. func (client *BlobClient) queryHandleResponse(resp *http.Response) (BlobClientQueryResponse, error) { result := BlobClientQueryResponse{Body: resp.Body} if val := resp.Header.Get("Accept-Ranges"); val != "" { result.AcceptRanges = &val } if val := resp.Header.Get("x-ms-blob-committed-block-count"); val != "" { blobCommittedBlockCount32, err := strconv.ParseInt(val, 10, 32) blobCommittedBlockCount := int32(blobCommittedBlockCount32) if err != nil { return BlobClientQueryResponse{}, err } result.BlobCommittedBlockCount = &blobCommittedBlockCount } if val := resp.Header.Get("x-ms-blob-content-md5"); val != "" { blobContentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientQueryResponse{}, err } result.BlobContentMD5 = blobContentMD5 } if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientQueryResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-blob-type"); val != "" { result.BlobType = (*BlobType)(&val) } if val := resp.Header.Get("Cache-Control"); val != "" { result.CacheControl = &val } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientQueryResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-Disposition"); val != "" { result.ContentDisposition = &val } if val := resp.Header.Get("Content-Encoding"); val != "" { result.ContentEncoding = &val } if val := resp.Header.Get("Content-Language"); val != "" { result.ContentLanguage = &val } if val := resp.Header.Get("Content-Length"); val != "" { contentLength, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientQueryResponse{}, err } result.ContentLength = &contentLength } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlobClientQueryResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Content-Range"); val != "" { result.ContentRange = &val } if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } if val := resp.Header.Get("x-ms-copy-completion-time"); val != "" { copyCompletionTime, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientQueryResponse{}, err } result.CopyCompletionTime = ©CompletionTime } if val := resp.Header.Get("x-ms-copy-id"); val != "" { result.CopyID = &val } if val := resp.Header.Get("x-ms-copy-progress"); val != "" { result.CopyProgress = &val } if val := resp.Header.Get("x-ms-copy-source"); val != "" { result.CopySource = &val } if val := resp.Header.Get("x-ms-copy-status"); val != "" { result.CopyStatus = (*CopyStatusType)(&val) } if val := resp.Header.Get("x-ms-copy-status-description"); val != "" { result.CopyStatusDescription = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientQueryResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlobClientQueryResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientQueryResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-duration"); val != "" { result.LeaseDuration = (*LeaseDurationType)(&val) } if val := resp.Header.Get("x-ms-lease-state"); val != "" { result.LeaseState = (*LeaseStateType)(&val) } if val := resp.Header.Get("x-ms-lease-status"); val != "" { result.LeaseStatus = (*LeaseStatusType)(&val) } for hh := range resp.Header { if len(hh) > len("x-ms-meta-") && strings.EqualFold(hh[:len("x-ms-meta-")], "x-ms-meta-") { if result.Metadata == nil { result.Metadata = map[string]*string{} } result.Metadata[hh[len("x-ms-meta-"):]] = to.Ptr(resp.Header.Get(hh)) } } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // ReleaseLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - leaseID - Specifies the current lease ID on the resource. // - options - BlobClientReleaseLeaseOptions contains the optional parameters for the BlobClient.ReleaseLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) ReleaseLease(ctx context.Context, leaseID string, options *BlobClientReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientReleaseLeaseResponse, error) { var err error req, err := client.releaseLeaseCreateRequest(ctx, leaseID, options, modifiedAccessConditions) if err != nil { return BlobClientReleaseLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientReleaseLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientReleaseLeaseResponse{}, err } resp, err := client.releaseLeaseHandleResponse(httpResp) return resp, err } // releaseLeaseCreateRequest creates the ReleaseLease request. func (client *BlobClient) releaseLeaseCreateRequest(ctx context.Context, leaseID string, options *BlobClientReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } req.Raw().Header["x-ms-lease-action"] = []string{"release"} req.Raw().Header["x-ms-lease-id"] = []string{leaseID} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // releaseLeaseHandleResponse handles the ReleaseLease response. func (client *BlobClient) releaseLeaseHandleResponse(resp *http.Response) (BlobClientReleaseLeaseResponse, error) { result := BlobClientReleaseLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientReleaseLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientReleaseLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // RenewLease - [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete operations // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - leaseID - Specifies the current lease ID on the resource. // - options - BlobClientRenewLeaseOptions contains the optional parameters for the BlobClient.RenewLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) RenewLease(ctx context.Context, leaseID string, options *BlobClientRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientRenewLeaseResponse, error) { var err error req, err := client.renewLeaseCreateRequest(ctx, leaseID, options, modifiedAccessConditions) if err != nil { return BlobClientRenewLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientRenewLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientRenewLeaseResponse{}, err } resp, err := client.renewLeaseHandleResponse(httpResp) return resp, err } // renewLeaseCreateRequest creates the RenewLease request. func (client *BlobClient) renewLeaseCreateRequest(ctx context.Context, leaseID string, options *BlobClientRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } req.Raw().Header["x-ms-lease-action"] = []string{"renew"} req.Raw().Header["x-ms-lease-id"] = []string{leaseID} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // renewLeaseHandleResponse handles the RenewLease response. func (client *BlobClient) renewLeaseHandleResponse(resp *http.Response) (BlobClientRenewLeaseResponse, error) { result := BlobClientRenewLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientRenewLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientRenewLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-id"); val != "" { result.LeaseID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SetExpiry - Sets the time a blob will expire and be deleted. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - expiryOptions - Required. Indicates mode of the expiry time // - options - BlobClientSetExpiryOptions contains the optional parameters for the BlobClient.SetExpiry method. func (client *BlobClient) SetExpiry(ctx context.Context, expiryOptions ExpiryOptions, options *BlobClientSetExpiryOptions) (BlobClientSetExpiryResponse, error) { var err error req, err := client.setExpiryCreateRequest(ctx, expiryOptions, options) if err != nil { return BlobClientSetExpiryResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientSetExpiryResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientSetExpiryResponse{}, err } resp, err := client.setExpiryHandleResponse(httpResp) return resp, err } // setExpiryCreateRequest creates the SetExpiry request. func (client *BlobClient) setExpiryCreateRequest(ctx context.Context, expiryOptions ExpiryOptions, options *BlobClientSetExpiryOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "expiry") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-expiry-option"] = []string{string(expiryOptions)} if options != nil && options.ExpiresOn != nil { req.Raw().Header["x-ms-expiry-time"] = []string{*options.ExpiresOn} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // setExpiryHandleResponse handles the SetExpiry response. func (client *BlobClient) setExpiryHandleResponse(resp *http.Response) (BlobClientSetExpiryResponse, error) { result := BlobClientSetExpiryResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetExpiryResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetExpiryResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SetHTTPHeaders - The Set HTTP Headers operation sets system properties on the blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientSetHTTPHeadersOptions contains the optional parameters for the BlobClient.SetHTTPHeaders method. // - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) SetHTTPHeaders(ctx context.Context, options *BlobClientSetHTTPHeadersOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientSetHTTPHeadersResponse, error) { var err error req, err := client.setHTTPHeadersCreateRequest(ctx, options, blobHTTPHeaders, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlobClientSetHTTPHeadersResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientSetHTTPHeadersResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientSetHTTPHeadersResponse{}, err } resp, err := client.setHTTPHeadersHandleResponse(httpResp) return resp, err } // setHTTPHeadersCreateRequest creates the SetHTTPHeaders request. func (client *BlobClient) setHTTPHeadersCreateRequest(ctx context.Context, options *BlobClientSetHTTPHeadersOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "properties") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { req.Raw().Header["x-ms-blob-cache-control"] = []string{*blobHTTPHeaders.BlobCacheControl} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { req.Raw().Header["x-ms-blob-content-disposition"] = []string{*blobHTTPHeaders.BlobContentDisposition} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { req.Raw().Header["x-ms-blob-content-encoding"] = []string{*blobHTTPHeaders.BlobContentEncoding} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { req.Raw().Header["x-ms-blob-content-language"] = []string{*blobHTTPHeaders.BlobContentLanguage} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { req.Raw().Header["x-ms-blob-content-md5"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { req.Raw().Header["x-ms-blob-content-type"] = []string{*blobHTTPHeaders.BlobContentType} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // setHTTPHeadersHandleResponse handles the SetHTTPHeaders response. func (client *BlobClient) setHTTPHeadersHandleResponse(resp *http.Response) (BlobClientSetHTTPHeadersResponse, error) { result := BlobClientSetHTTPHeadersResponse{} if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlobClientSetHTTPHeadersResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetHTTPHeadersResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetHTTPHeadersResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SetImmutabilityPolicy - The Set Immutability Policy operation sets the immutability policy on the blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientSetImmutabilityPolicyOptions contains the optional parameters for the BlobClient.SetImmutabilityPolicy // method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) SetImmutabilityPolicy(ctx context.Context, options *BlobClientSetImmutabilityPolicyOptions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientSetImmutabilityPolicyResponse, error) { var err error req, err := client.setImmutabilityPolicyCreateRequest(ctx, options, modifiedAccessConditions) if err != nil { return BlobClientSetImmutabilityPolicyResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientSetImmutabilityPolicyResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientSetImmutabilityPolicyResponse{}, err } resp, err := client.setImmutabilityPolicyHandleResponse(httpResp) return resp, err } // setImmutabilityPolicyCreateRequest creates the SetImmutabilityPolicy request. func (client *BlobClient) setImmutabilityPolicyCreateRequest(ctx context.Context, options *BlobClientSetImmutabilityPolicyOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "immutabilityPolicies") if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.ImmutabilityPolicyMode != nil { req.Raw().Header["x-ms-immutability-policy-mode"] = []string{string(*options.ImmutabilityPolicyMode)} } if options != nil && options.ImmutabilityPolicyExpiry != nil { req.Raw().Header["x-ms-immutability-policy-until-date"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // setImmutabilityPolicyHandleResponse handles the SetImmutabilityPolicy response. func (client *BlobClient) setImmutabilityPolicyHandleResponse(resp *http.Response) (BlobClientSetImmutabilityPolicyResponse, error) { result := BlobClientSetImmutabilityPolicyResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetImmutabilityPolicyResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-immutability-policy-until-date"); val != "" { immutabilityPolicyExpiry, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetImmutabilityPolicyResponse{}, err } result.ImmutabilityPolicyExpiry = &immutabilityPolicyExpiry } if val := resp.Header.Get("x-ms-immutability-policy-mode"); val != "" { result.ImmutabilityPolicyMode = (*ImmutabilityPolicyMode)(&val) } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SetLegalHold - The Set Legal Hold operation sets a legal hold on the blob. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - legalHold - Specified if a legal hold should be set on the blob. // - options - BlobClientSetLegalHoldOptions contains the optional parameters for the BlobClient.SetLegalHold method. func (client *BlobClient) SetLegalHold(ctx context.Context, legalHold bool, options *BlobClientSetLegalHoldOptions) (BlobClientSetLegalHoldResponse, error) { var err error req, err := client.setLegalHoldCreateRequest(ctx, legalHold, options) if err != nil { return BlobClientSetLegalHoldResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientSetLegalHoldResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientSetLegalHoldResponse{}, err } resp, err := client.setLegalHoldHandleResponse(httpResp) return resp, err } // setLegalHoldCreateRequest creates the SetLegalHold request. func (client *BlobClient) setLegalHoldCreateRequest(ctx context.Context, legalHold bool, options *BlobClientSetLegalHoldOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "legalhold") if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-legal-hold"] = []string{strconv.FormatBool(legalHold)} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // setLegalHoldHandleResponse handles the SetLegalHold response. func (client *BlobClient) setLegalHoldHandleResponse(resp *http.Response) (BlobClientSetLegalHoldResponse, error) { result := BlobClientSetLegalHoldResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetLegalHoldResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-legal-hold"); val != "" { legalHold, err := strconv.ParseBool(val) if err != nil { return BlobClientSetLegalHoldResponse{}, err } result.LegalHold = &legalHold } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SetMetadata - The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more name-value // pairs // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientSetMetadataOptions contains the optional parameters for the BlobClient.SetMetadata method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) SetMetadata(ctx context.Context, options *BlobClientSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientSetMetadataResponse, error) { var err error req, err := client.setMetadataCreateRequest(ctx, options, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return BlobClientSetMetadataResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientSetMetadataResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientSetMetadataResponse{}, err } resp, err := client.setMetadataHandleResponse(httpResp) return resp, err } // setMetadataCreateRequest creates the SetMetadata request. func (client *BlobClient) setMetadataCreateRequest(ctx context.Context, options *BlobClientSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "metadata") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // setMetadataHandleResponse handles the SetMetadata response. func (client *BlobClient) setMetadataHandleResponse(resp *http.Response) (BlobClientSetMetadataResponse, error) { result := BlobClientSetMetadataResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetMetadataResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlobClientSetMetadataResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetMetadataResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // SetTags - The Set Tags operation enables users to set tags on a blob. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - tags - Blob tags // - options - BlobClientSetTagsOptions contains the optional parameters for the BlobClient.SetTags method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. func (client *BlobClient) SetTags(ctx context.Context, tags BlobTags, options *BlobClientSetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobClientSetTagsResponse, error) { var err error req, err := client.setTagsCreateRequest(ctx, tags, options, modifiedAccessConditions, leaseAccessConditions) if err != nil { return BlobClientSetTagsResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientSetTagsResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusNoContent) { err = runtime.NewResponseError(httpResp) return BlobClientSetTagsResponse{}, err } resp, err := client.setTagsHandleResponse(httpResp) return resp, err } // setTagsCreateRequest creates the SetTags request. func (client *BlobClient) setTagsCreateRequest(ctx context.Context, tags BlobTags, options *BlobClientSetTagsOptions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "tags") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.TransactionalContentMD5 != nil { req.Raw().Header["Content-MD5"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.TransactionalContentCRC64 != nil { req.Raw().Header["x-ms-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := runtime.MarshalAsXML(req, tags); err != nil { return nil, err } return req, nil } // setTagsHandleResponse handles the SetTags response. func (client *BlobClient) setTagsHandleResponse(resp *http.Response) (BlobClientSetTagsResponse, error) { result := BlobClientSetTagsResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientSetTagsResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SetTier - The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium storage // account and on a block blob in a blob storage account (locally redundant storage only). A // premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive // storage type. This operation does not update the blob's ETag. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - tier - Indicates the tier to be set on the blob. // - options - BlobClientSetTierOptions contains the optional parameters for the BlobClient.SetTier method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlobClient) SetTier(ctx context.Context, tier AccessTier, options *BlobClientSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlobClientSetTierResponse, error) { var err error req, err := client.setTierCreateRequest(ctx, tier, options, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlobClientSetTierResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientSetTierResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return BlobClientSetTierResponse{}, err } resp, err := client.setTierHandleResponse(httpResp) return resp, err } // setTierCreateRequest creates the SetTier request. func (client *BlobClient) setTierCreateRequest(ctx context.Context, tier AccessTier, options *BlobClientSetTierOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "tier") if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } if options != nil && options.VersionID != nil { reqQP.Set("versionid", *options.VersionID) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["x-ms-access-tier"] = []string{string(tier)} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.RehydratePriority != nil { req.Raw().Header["x-ms-rehydrate-priority"] = []string{string(*options.RehydratePriority)} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // setTierHandleResponse handles the SetTier response. func (client *BlobClient) setTierHandleResponse(resp *http.Response) (BlobClientSetTierResponse, error) { result := BlobClientSetTierResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // StartCopyFromURL - The Start Copy From URL operation copies a blob or an internet resource to a new blob. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - copySource - Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies // a page blob snapshot. The value should be URL-encoded as it would appear in a request // URI. The source blob must either be public or must be authenticated via a shared access signature. // - options - BlobClientStartCopyFromURLOptions contains the optional parameters for the BlobClient.StartCopyFromURL method. // - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL // method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. func (client *BlobClient) StartCopyFromURL(ctx context.Context, copySource string, options *BlobClientStartCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (BlobClientStartCopyFromURLResponse, error) { var err error req, err := client.startCopyFromURLCreateRequest(ctx, copySource, options, sourceModifiedAccessConditions, modifiedAccessConditions, leaseAccessConditions) if err != nil { return BlobClientStartCopyFromURLResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientStartCopyFromURLResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return BlobClientStartCopyFromURLResponse{}, err } resp, err := client.startCopyFromURLHandleResponse(httpResp) return resp, err } // startCopyFromURLCreateRequest creates the StartCopyFromURL request. func (client *BlobClient) startCopyFromURLCreateRequest(ctx context.Context, copySource string, options *BlobClientStartCopyFromURLOptions, sourceModifiedAccessConditions *SourceModifiedAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.Tier != nil { req.Raw().Header["x-ms-access-tier"] = []string{string(*options.Tier)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-copy-source"] = []string{copySource} if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if options != nil && options.ImmutabilityPolicyMode != nil { req.Raw().Header["x-ms-immutability-policy-mode"] = []string{string(*options.ImmutabilityPolicyMode)} } if options != nil && options.ImmutabilityPolicyExpiry != nil { req.Raw().Header["x-ms-immutability-policy-until-date"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.LegalHold != nil { req.Raw().Header["x-ms-legal-hold"] = []string{strconv.FormatBool(*options.LegalHold)} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } if options != nil && options.RehydratePriority != nil { req.Raw().Header["x-ms-rehydrate-priority"] = []string{string(*options.RehydratePriority)} } if options != nil && options.SealBlob != nil { req.Raw().Header["x-ms-seal-blob"] = []string{strconv.FormatBool(*options.SealBlob)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil { req.Raw().Header["x-ms-source-if-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Raw().Header["x-ms-source-if-modified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil { req.Raw().Header["x-ms-source-if-none-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfTags != nil { req.Raw().Header["x-ms-source-if-tags"] = []string{*sourceModifiedAccessConditions.SourceIfTags} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil { req.Raw().Header["x-ms-source-if-unmodified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.BlobTagsString != nil { req.Raw().Header["x-ms-tags"] = []string{*options.BlobTagsString} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // startCopyFromURLHandleResponse handles the StartCopyFromURL response. func (client *BlobClient) startCopyFromURLHandleResponse(resp *http.Response) (BlobClientStartCopyFromURLResponse, error) { result := BlobClientStartCopyFromURLResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-copy-id"); val != "" { result.CopyID = &val } if val := resp.Header.Get("x-ms-copy-status"); val != "" { result.CopyStatus = (*CopyStatusType)(&val) } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientStartCopyFromURLResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientStartCopyFromURLResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // Undelete - Undelete a blob that was previously soft deleted // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - BlobClientUndeleteOptions contains the optional parameters for the BlobClient.Undelete method. func (client *BlobClient) Undelete(ctx context.Context, options *BlobClientUndeleteOptions) (BlobClientUndeleteResponse, error) { var err error req, err := client.undeleteCreateRequest(ctx, options) if err != nil { return BlobClientUndeleteResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlobClientUndeleteResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlobClientUndeleteResponse{}, err } resp, err := client.undeleteHandleResponse(httpResp) return resp, err } // undeleteCreateRequest creates the Undelete request. func (client *BlobClient) undeleteCreateRequest(ctx context.Context, options *BlobClientUndeleteOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "undelete") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // undeleteHandleResponse handles the Undelete response. func (client *BlobClient) undeleteHandleResponse(resp *http.Response) (BlobClientUndeleteResponse, error) { result := BlobClientUndeleteResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlobClientUndeleteResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_blockblob_client.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "context" "encoding/base64" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "io" "net/http" "strconv" "time" ) // BlockBlobClient contains the methods for the BlockBlob group. // Don't use this type directly, use a constructor function instead. type BlockBlobClient struct { internal *azcore.Client endpoint string } // CommitBlockList - The Commit Block List operation writes a blob by specifying the list of block IDs that make up the blob. // In order to be written as part of a blob, a block must have been successfully written to the // server in a prior Put Block operation. You can call Put Block List to update a blob by uploading only those blocks that // have changed, then committing the new and existing blocks together. You can do // this by specifying whether to commit a block from the committed block list or from the uncommitted block list, or to commit // the most recently uploaded version of the block, whichever list it may // belong to. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - blocks - Blob Blocks. // - options - BlockBlobClientCommitBlockListOptions contains the optional parameters for the BlockBlobClient.CommitBlockList // method. // - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlockBlobClient) CommitBlockList(ctx context.Context, blocks BlockLookupList, options *BlockBlobClientCommitBlockListOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobClientCommitBlockListResponse, error) { var err error req, err := client.commitBlockListCreateRequest(ctx, blocks, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return BlockBlobClientCommitBlockListResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlockBlobClientCommitBlockListResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return BlockBlobClientCommitBlockListResponse{}, err } resp, err := client.commitBlockListHandleResponse(httpResp) return resp, err } // commitBlockListCreateRequest creates the CommitBlockList request. func (client *BlockBlobClient) commitBlockListCreateRequest(ctx context.Context, blocks BlockLookupList, options *BlockBlobClientCommitBlockListOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "blocklist") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.TransactionalContentMD5 != nil { req.Raw().Header["Content-MD5"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.Tier != nil { req.Raw().Header["x-ms-access-tier"] = []string{string(*options.Tier)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { req.Raw().Header["x-ms-blob-cache-control"] = []string{*blobHTTPHeaders.BlobCacheControl} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { req.Raw().Header["x-ms-blob-content-disposition"] = []string{*blobHTTPHeaders.BlobContentDisposition} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { req.Raw().Header["x-ms-blob-content-encoding"] = []string{*blobHTTPHeaders.BlobContentEncoding} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { req.Raw().Header["x-ms-blob-content-language"] = []string{*blobHTTPHeaders.BlobContentLanguage} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { req.Raw().Header["x-ms-blob-content-md5"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { req.Raw().Header["x-ms-blob-content-type"] = []string{*blobHTTPHeaders.BlobContentType} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.TransactionalContentCRC64 != nil { req.Raw().Header["x-ms-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if options != nil && options.ImmutabilityPolicyMode != nil { req.Raw().Header["x-ms-immutability-policy-mode"] = []string{string(*options.ImmutabilityPolicyMode)} } if options != nil && options.ImmutabilityPolicyExpiry != nil { req.Raw().Header["x-ms-immutability-policy-until-date"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.LegalHold != nil { req.Raw().Header["x-ms-legal-hold"] = []string{strconv.FormatBool(*options.LegalHold)} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } if options != nil && options.BlobTagsString != nil { req.Raw().Header["x-ms-tags"] = []string{*options.BlobTagsString} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := runtime.MarshalAsXML(req, blocks); err != nil { return nil, err } return req, nil } // commitBlockListHandleResponse handles the CommitBlockList response. func (client *BlockBlobClient) commitBlockListHandleResponse(resp *http.Response) (BlockBlobClientCommitBlockListResponse, error) { result := BlockBlobClientCommitBlockListResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientCommitBlockListResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientCommitBlockListResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientCommitBlockListResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlockBlobClientCommitBlockListResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientCommitBlockListResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // GetBlockList - The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - listType - Specifies whether to return the list of committed blocks, the list of uncommitted blocks, or both lists together. // - options - BlockBlobClientGetBlockListOptions contains the optional parameters for the BlockBlobClient.GetBlockList method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlockBlobClient) GetBlockList(ctx context.Context, listType BlockListType, options *BlockBlobClientGetBlockListOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobClientGetBlockListResponse, error) { var err error req, err := client.getBlockListCreateRequest(ctx, listType, options, leaseAccessConditions, modifiedAccessConditions) if err != nil { return BlockBlobClientGetBlockListResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlockBlobClientGetBlockListResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return BlockBlobClientGetBlockListResponse{}, err } resp, err := client.getBlockListHandleResponse(httpResp) return resp, err } // getBlockListCreateRequest creates the GetBlockList request. func (client *BlockBlobClient) getBlockListCreateRequest(ctx context.Context, listType BlockListType, options *BlockBlobClientGetBlockListOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("blocklisttype", string(listType)) reqQP.Set("comp", "blocklist") if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getBlockListHandleResponse handles the GetBlockList response. func (client *BlockBlobClient) getBlockListHandleResponse(resp *http.Response) (BlockBlobClientGetBlockListResponse, error) { result := BlockBlobClientGetBlockListResponse{} if val := resp.Header.Get("x-ms-blob-content-length"); val != "" { blobContentLength, err := strconv.ParseInt(val, 10, 64) if err != nil { return BlockBlobClientGetBlockListResponse{}, err } result.BlobContentLength = &blobContentLength } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientGetBlockListResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientGetBlockListResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.BlockList); err != nil { return BlockBlobClientGetBlockListResponse{}, err } return result, nil } // PutBlobFromURL - The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read from // a given URL. This API is supported beginning with the 2020-04-08 version. Partial updates are not // supported with Put Blob from URL; the content of an existing blob is overwritten with the content of the new blob. To perform // partial updates to a block blob’s contents using a source URL, use the Put // Block from URL API in conjunction with Put Block List. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - copySource - Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies // a page blob snapshot. The value should be URL-encoded as it would appear in a request // URI. The source blob must either be public or must be authenticated via a shared access signature. // - options - BlockBlobClientPutBlobFromURLOptions contains the optional parameters for the BlockBlobClient.PutBlobFromURL // method. // - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL // method. func (client *BlockBlobClient) PutBlobFromURL(ctx context.Context, contentLength int64, copySource string, options *BlockBlobClientPutBlobFromURLOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (BlockBlobClientPutBlobFromURLResponse, error) { var err error req, err := client.putBlobFromURLCreateRequest(ctx, contentLength, copySource, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions, sourceModifiedAccessConditions) if err != nil { return BlockBlobClientPutBlobFromURLResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlockBlobClientPutBlobFromURLResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return BlockBlobClientPutBlobFromURLResponse{}, err } resp, err := client.putBlobFromURLHandleResponse(httpResp) return resp, err } // putBlobFromURLCreateRequest creates the PutBlobFromURL request. func (client *BlockBlobClient) putBlobFromURLCreateRequest(ctx context.Context, contentLength int64, copySource string, options *BlockBlobClientPutBlobFromURLOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if options != nil && options.TransactionalContentMD5 != nil { req.Raw().Header["Content-MD5"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.Tier != nil { req.Raw().Header["x-ms-access-tier"] = []string{string(*options.Tier)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { req.Raw().Header["x-ms-blob-cache-control"] = []string{*blobHTTPHeaders.BlobCacheControl} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { req.Raw().Header["x-ms-blob-content-disposition"] = []string{*blobHTTPHeaders.BlobContentDisposition} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { req.Raw().Header["x-ms-blob-content-encoding"] = []string{*blobHTTPHeaders.BlobContentEncoding} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { req.Raw().Header["x-ms-blob-content-language"] = []string{*blobHTTPHeaders.BlobContentLanguage} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { req.Raw().Header["x-ms-blob-content-md5"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { req.Raw().Header["x-ms-blob-content-type"] = []string{*blobHTTPHeaders.BlobContentType} } req.Raw().Header["x-ms-blob-type"] = []string{"BlockBlob"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-copy-source"] = []string{copySource} if options != nil && options.CopySourceAuthorization != nil { req.Raw().Header["x-ms-copy-source-authorization"] = []string{*options.CopySourceAuthorization} } if options != nil && options.CopySourceBlobProperties != nil { req.Raw().Header["x-ms-copy-source-blob-properties"] = []string{strconv.FormatBool(*options.CopySourceBlobProperties)} } if options != nil && options.CopySourceTags != nil { req.Raw().Header["x-ms-copy-source-tag-option"] = []string{string(*options.CopySourceTags)} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } if options != nil && options.SourceContentMD5 != nil { req.Raw().Header["x-ms-source-content-md5"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil { req.Raw().Header["x-ms-source-if-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Raw().Header["x-ms-source-if-modified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil { req.Raw().Header["x-ms-source-if-none-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfTags != nil { req.Raw().Header["x-ms-source-if-tags"] = []string{*sourceModifiedAccessConditions.SourceIfTags} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil { req.Raw().Header["x-ms-source-if-unmodified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.BlobTagsString != nil { req.Raw().Header["x-ms-tags"] = []string{*options.BlobTagsString} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // putBlobFromURLHandleResponse handles the PutBlobFromURL response. func (client *BlockBlobClient) putBlobFromURLHandleResponse(resp *http.Response) (BlockBlobClientPutBlobFromURLResponse, error) { result := BlockBlobClientPutBlobFromURLResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientPutBlobFromURLResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientPutBlobFromURLResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlockBlobClientPutBlobFromURLResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientPutBlobFromURLResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // StageBlock - The Stage Block operation creates a new block to be committed as part of a blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - blockID - A valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or equal // to 64 bytes in size. For a given blob, the length of the value specified for the blockid // parameter must be the same size for each block. // - contentLength - The length of the request. // - body - Initial data // - options - BlockBlobClientStageBlockOptions contains the optional parameters for the BlockBlobClient.StageBlock method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. func (client *BlockBlobClient) StageBlock(ctx context.Context, blockID string, contentLength int64, body io.ReadSeekCloser, options *BlockBlobClientStageBlockOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo) (BlockBlobClientStageBlockResponse, error) { var err error req, err := client.stageBlockCreateRequest(ctx, blockID, contentLength, body, options, leaseAccessConditions, cpkInfo, cpkScopeInfo) if err != nil { return BlockBlobClientStageBlockResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlockBlobClientStageBlockResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return BlockBlobClientStageBlockResponse{}, err } resp, err := client.stageBlockHandleResponse(httpResp) return resp, err } // stageBlockCreateRequest creates the StageBlock request. func (client *BlockBlobClient) stageBlockCreateRequest(ctx context.Context, blockID string, contentLength int64, body io.ReadSeekCloser, options *BlockBlobClientStageBlockOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("blockid", blockID) reqQP.Set("comp", "block") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if options != nil && options.TransactionalContentMD5 != nil { req.Raw().Header["Content-MD5"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.TransactionalContentCRC64 != nil { req.Raw().Header["x-ms-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.StructuredBodyType != nil { req.Raw().Header["x-ms-structured-body"] = []string{*options.StructuredBodyType} } if options != nil && options.StructuredContentLength != nil { req.Raw().Header["x-ms-structured-content-length"] = []string{strconv.FormatInt(*options.StructuredContentLength, 10)} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := req.SetBody(body, "application/octet-stream"); err != nil { return nil, err } return req, nil } // stageBlockHandleResponse handles the StageBlock response. func (client *BlockBlobClient) stageBlockHandleResponse(resp *http.Response) (BlockBlobClientStageBlockResponse, error) { result := BlockBlobClientStageBlockResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientStageBlockResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientStageBlockResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientStageBlockResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlockBlobClientStageBlockResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-structured-body"); val != "" { result.StructuredBodyType = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // StageBlockFromURL - The Stage Block operation creates a new block to be committed as part of a blob where the contents // are read from a URL. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - blockID - A valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or equal // to 64 bytes in size. For a given blob, the length of the value specified for the blockid // parameter must be the same size for each block. // - contentLength - The length of the request. // - sourceURL - Specify a URL to the copy source. // - options - BlockBlobClientStageBlockFromURLOptions contains the optional parameters for the BlockBlobClient.StageBlockFromURL // method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL // method. func (client *BlockBlobClient) StageBlockFromURL(ctx context.Context, blockID string, contentLength int64, sourceURL string, options *BlockBlobClientStageBlockFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (BlockBlobClientStageBlockFromURLResponse, error) { var err error req, err := client.stageBlockFromURLCreateRequest(ctx, blockID, contentLength, sourceURL, options, cpkInfo, cpkScopeInfo, leaseAccessConditions, sourceModifiedAccessConditions) if err != nil { return BlockBlobClientStageBlockFromURLResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlockBlobClientStageBlockFromURLResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return BlockBlobClientStageBlockFromURLResponse{}, err } resp, err := client.stageBlockFromURLHandleResponse(httpResp) return resp, err } // stageBlockFromURLCreateRequest creates the StageBlockFromURL request. func (client *BlockBlobClient) stageBlockFromURLCreateRequest(ctx context.Context, blockID string, contentLength int64, sourceURL string, options *BlockBlobClientStageBlockFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("blockid", blockID) reqQP.Set("comp", "block") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-copy-source"] = []string{sourceURL} if options != nil && options.CopySourceAuthorization != nil { req.Raw().Header["x-ms-copy-source-authorization"] = []string{*options.CopySourceAuthorization} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.SourceContentcrc64 != nil { req.Raw().Header["x-ms-source-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentcrc64)} } if options != nil && options.SourceContentMD5 != nil { req.Raw().Header["x-ms-source-content-md5"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil { req.Raw().Header["x-ms-source-if-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Raw().Header["x-ms-source-if-modified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil { req.Raw().Header["x-ms-source-if-none-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil { req.Raw().Header["x-ms-source-if-unmodified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.SourceRange != nil { req.Raw().Header["x-ms-source-range"] = []string{*options.SourceRange} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // stageBlockFromURLHandleResponse handles the StageBlockFromURL response. func (client *BlockBlobClient) stageBlockFromURLHandleResponse(resp *http.Response) (BlockBlobClientStageBlockFromURLResponse, error) { result := BlockBlobClientStageBlockFromURLResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientStageBlockFromURLResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientStageBlockFromURLResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientStageBlockFromURLResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlockBlobClientStageBlockFromURLResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // Upload - The Upload Block Blob operation updates the content of an existing block blob. Updating an existing block blob // overwrites any existing metadata on the blob. Partial updates are not supported with Put // Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a partial update of // the content of a block blob, use the Put Block List operation. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - body - Initial data // - options - BlockBlobClientUploadOptions contains the optional parameters for the BlockBlobClient.Upload method. // - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *BlockBlobClient) Upload(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *BlockBlobClientUploadOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (BlockBlobClientUploadResponse, error) { var err error req, err := client.uploadCreateRequest(ctx, contentLength, body, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return BlockBlobClientUploadResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return BlockBlobClientUploadResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return BlockBlobClientUploadResponse{}, err } resp, err := client.uploadHandleResponse(httpResp) return resp, err } // uploadCreateRequest creates the Upload request. func (client *BlockBlobClient) uploadCreateRequest(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *BlockBlobClientUploadOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if options != nil && options.TransactionalContentMD5 != nil { req.Raw().Header["Content-MD5"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.Tier != nil { req.Raw().Header["x-ms-access-tier"] = []string{string(*options.Tier)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { req.Raw().Header["x-ms-blob-cache-control"] = []string{*blobHTTPHeaders.BlobCacheControl} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { req.Raw().Header["x-ms-blob-content-disposition"] = []string{*blobHTTPHeaders.BlobContentDisposition} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { req.Raw().Header["x-ms-blob-content-encoding"] = []string{*blobHTTPHeaders.BlobContentEncoding} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { req.Raw().Header["x-ms-blob-content-language"] = []string{*blobHTTPHeaders.BlobContentLanguage} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { req.Raw().Header["x-ms-blob-content-md5"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { req.Raw().Header["x-ms-blob-content-type"] = []string{*blobHTTPHeaders.BlobContentType} } req.Raw().Header["x-ms-blob-type"] = []string{"BlockBlob"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.TransactionalContentCRC64 != nil { req.Raw().Header["x-ms-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if options != nil && options.ImmutabilityPolicyMode != nil { req.Raw().Header["x-ms-immutability-policy-mode"] = []string{string(*options.ImmutabilityPolicyMode)} } if options != nil && options.ImmutabilityPolicyExpiry != nil { req.Raw().Header["x-ms-immutability-policy-until-date"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.LegalHold != nil { req.Raw().Header["x-ms-legal-hold"] = []string{strconv.FormatBool(*options.LegalHold)} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } if options != nil && options.StructuredBodyType != nil { req.Raw().Header["x-ms-structured-body"] = []string{*options.StructuredBodyType} } if options != nil && options.StructuredContentLength != nil { req.Raw().Header["x-ms-structured-content-length"] = []string{strconv.FormatInt(*options.StructuredContentLength, 10)} } if options != nil && options.BlobTagsString != nil { req.Raw().Header["x-ms-tags"] = []string{*options.BlobTagsString} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := req.SetBody(body, "application/octet-stream"); err != nil { return nil, err } return req, nil } // uploadHandleResponse handles the Upload response. func (client *BlockBlobClient) uploadHandleResponse(resp *http.Response) (BlockBlobClientUploadResponse, error) { result := BlockBlobClientUploadResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientUploadResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return BlockBlobClientUploadResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientUploadResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return BlockBlobClientUploadResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return BlockBlobClientUploadResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-structured-body"); val != "" { result.StructuredBodyType = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_constants.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated type AccessTier string const ( AccessTierArchive AccessTier = "Archive" AccessTierCold AccessTier = "Cold" AccessTierCool AccessTier = "Cool" AccessTierHot AccessTier = "Hot" AccessTierP10 AccessTier = "P10" AccessTierP15 AccessTier = "P15" AccessTierP20 AccessTier = "P20" AccessTierP30 AccessTier = "P30" AccessTierP4 AccessTier = "P4" AccessTierP40 AccessTier = "P40" AccessTierP50 AccessTier = "P50" AccessTierP6 AccessTier = "P6" AccessTierP60 AccessTier = "P60" AccessTierP70 AccessTier = "P70" AccessTierP80 AccessTier = "P80" AccessTierPremium AccessTier = "Premium" ) // PossibleAccessTierValues returns the possible values for the AccessTier const type. func PossibleAccessTierValues() []AccessTier { return []AccessTier{ AccessTierArchive, AccessTierCold, AccessTierCool, AccessTierHot, AccessTierP10, AccessTierP15, AccessTierP20, AccessTierP30, AccessTierP4, AccessTierP40, AccessTierP50, AccessTierP6, AccessTierP60, AccessTierP70, AccessTierP80, AccessTierPremium, } } type AccountKind string const ( AccountKindBlobStorage AccountKind = "BlobStorage" AccountKindBlockBlobStorage AccountKind = "BlockBlobStorage" AccountKindFileStorage AccountKind = "FileStorage" AccountKindStorage AccountKind = "Storage" AccountKindStorageV2 AccountKind = "StorageV2" ) // PossibleAccountKindValues returns the possible values for the AccountKind const type. func PossibleAccountKindValues() []AccountKind { return []AccountKind{ AccountKindBlobStorage, AccountKindBlockBlobStorage, AccountKindFileStorage, AccountKindStorage, AccountKindStorageV2, } } type ArchiveStatus string const ( ArchiveStatusRehydratePendingToCold ArchiveStatus = "rehydrate-pending-to-cold" ArchiveStatusRehydratePendingToCool ArchiveStatus = "rehydrate-pending-to-cool" ArchiveStatusRehydratePendingToHot ArchiveStatus = "rehydrate-pending-to-hot" ) // PossibleArchiveStatusValues returns the possible values for the ArchiveStatus const type. func PossibleArchiveStatusValues() []ArchiveStatus { return []ArchiveStatus{ ArchiveStatusRehydratePendingToCold, ArchiveStatusRehydratePendingToCool, ArchiveStatusRehydratePendingToHot, } } type BlobCopySourceTags string const ( BlobCopySourceTagsCOPY BlobCopySourceTags = "COPY" BlobCopySourceTagsREPLACE BlobCopySourceTags = "REPLACE" ) // PossibleBlobCopySourceTagsValues returns the possible values for the BlobCopySourceTags const type. func PossibleBlobCopySourceTagsValues() []BlobCopySourceTags { return []BlobCopySourceTags{ BlobCopySourceTagsCOPY, BlobCopySourceTagsREPLACE, } } // BlobGeoReplicationStatus - The status of the secondary location type BlobGeoReplicationStatus string const ( BlobGeoReplicationStatusBootstrap BlobGeoReplicationStatus = "bootstrap" BlobGeoReplicationStatusLive BlobGeoReplicationStatus = "live" BlobGeoReplicationStatusUnavailable BlobGeoReplicationStatus = "unavailable" ) // PossibleBlobGeoReplicationStatusValues returns the possible values for the BlobGeoReplicationStatus const type. func PossibleBlobGeoReplicationStatusValues() []BlobGeoReplicationStatus { return []BlobGeoReplicationStatus{ BlobGeoReplicationStatusBootstrap, BlobGeoReplicationStatusLive, BlobGeoReplicationStatusUnavailable, } } type BlobType string const ( BlobTypeAppendBlob BlobType = "AppendBlob" BlobTypeBlockBlob BlobType = "BlockBlob" BlobTypePageBlob BlobType = "PageBlob" ) // PossibleBlobTypeValues returns the possible values for the BlobType const type. func PossibleBlobTypeValues() []BlobType { return []BlobType{ BlobTypeAppendBlob, BlobTypeBlockBlob, BlobTypePageBlob, } } type BlockListType string const ( BlockListTypeAll BlockListType = "all" BlockListTypeCommitted BlockListType = "committed" BlockListTypeUncommitted BlockListType = "uncommitted" ) // PossibleBlockListTypeValues returns the possible values for the BlockListType const type. func PossibleBlockListTypeValues() []BlockListType { return []BlockListType{ BlockListTypeAll, BlockListTypeCommitted, BlockListTypeUncommitted, } } type CopyStatusType string const ( CopyStatusTypeAborted CopyStatusType = "aborted" CopyStatusTypeFailed CopyStatusType = "failed" CopyStatusTypePending CopyStatusType = "pending" CopyStatusTypeSuccess CopyStatusType = "success" ) // PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type. func PossibleCopyStatusTypeValues() []CopyStatusType { return []CopyStatusType{ CopyStatusTypeAborted, CopyStatusTypeFailed, CopyStatusTypePending, CopyStatusTypeSuccess, } } type DeleteSnapshotsOptionType string const ( DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = "include" DeleteSnapshotsOptionTypeOnly DeleteSnapshotsOptionType = "only" ) // PossibleDeleteSnapshotsOptionTypeValues returns the possible values for the DeleteSnapshotsOptionType const type. func PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType { return []DeleteSnapshotsOptionType{ DeleteSnapshotsOptionTypeInclude, DeleteSnapshotsOptionTypeOnly, } } type DeleteType string const ( DeleteTypeNone DeleteType = "None" DeleteTypePermanent DeleteType = "Permanent" ) // PossibleDeleteTypeValues returns the possible values for the DeleteType const type. func PossibleDeleteTypeValues() []DeleteType { return []DeleteType{ DeleteTypeNone, DeleteTypePermanent, } } type EncryptionAlgorithmType string const ( EncryptionAlgorithmTypeAES256 EncryptionAlgorithmType = "AES256" EncryptionAlgorithmTypeNone EncryptionAlgorithmType = "None" ) // PossibleEncryptionAlgorithmTypeValues returns the possible values for the EncryptionAlgorithmType const type. func PossibleEncryptionAlgorithmTypeValues() []EncryptionAlgorithmType { return []EncryptionAlgorithmType{ EncryptionAlgorithmTypeAES256, EncryptionAlgorithmTypeNone, } } type ExpiryOptions string const ( ExpiryOptionsAbsolute ExpiryOptions = "Absolute" ExpiryOptionsNeverExpire ExpiryOptions = "NeverExpire" ExpiryOptionsRelativeToCreation ExpiryOptions = "RelativeToCreation" ExpiryOptionsRelativeToNow ExpiryOptions = "RelativeToNow" ) // PossibleExpiryOptionsValues returns the possible values for the ExpiryOptions const type. func PossibleExpiryOptionsValues() []ExpiryOptions { return []ExpiryOptions{ ExpiryOptionsAbsolute, ExpiryOptionsNeverExpire, ExpiryOptionsRelativeToCreation, ExpiryOptionsRelativeToNow, } } type FilterBlobsIncludeItem string const ( FilterBlobsIncludeItemNone FilterBlobsIncludeItem = "none" FilterBlobsIncludeItemVersions FilterBlobsIncludeItem = "versions" ) // PossibleFilterBlobsIncludeItemValues returns the possible values for the FilterBlobsIncludeItem const type. func PossibleFilterBlobsIncludeItemValues() []FilterBlobsIncludeItem { return []FilterBlobsIncludeItem{ FilterBlobsIncludeItemNone, FilterBlobsIncludeItemVersions, } } type ImmutabilityPolicyMode string const ( ImmutabilityPolicyModeLocked ImmutabilityPolicyMode = "Locked" ImmutabilityPolicyModeMutable ImmutabilityPolicyMode = "Mutable" ImmutabilityPolicyModeUnlocked ImmutabilityPolicyMode = "Unlocked" ) // PossibleImmutabilityPolicyModeValues returns the possible values for the ImmutabilityPolicyMode const type. func PossibleImmutabilityPolicyModeValues() []ImmutabilityPolicyMode { return []ImmutabilityPolicyMode{ ImmutabilityPolicyModeLocked, ImmutabilityPolicyModeMutable, ImmutabilityPolicyModeUnlocked, } } type ImmutabilityPolicySetting string const ( ImmutabilityPolicySettingLocked ImmutabilityPolicySetting = "Locked" ImmutabilityPolicySettingUnlocked ImmutabilityPolicySetting = "Unlocked" ) // PossibleImmutabilityPolicySettingValues returns the possible values for the ImmutabilityPolicySetting const type. func PossibleImmutabilityPolicySettingValues() []ImmutabilityPolicySetting { return []ImmutabilityPolicySetting{ ImmutabilityPolicySettingLocked, ImmutabilityPolicySettingUnlocked, } } type LeaseDurationType string const ( LeaseDurationTypeFixed LeaseDurationType = "fixed" LeaseDurationTypeInfinite LeaseDurationType = "infinite" ) // PossibleLeaseDurationTypeValues returns the possible values for the LeaseDurationType const type. func PossibleLeaseDurationTypeValues() []LeaseDurationType { return []LeaseDurationType{ LeaseDurationTypeFixed, LeaseDurationTypeInfinite, } } type LeaseStateType string const ( LeaseStateTypeAvailable LeaseStateType = "available" LeaseStateTypeBreaking LeaseStateType = "breaking" LeaseStateTypeBroken LeaseStateType = "broken" LeaseStateTypeExpired LeaseStateType = "expired" LeaseStateTypeLeased LeaseStateType = "leased" ) // PossibleLeaseStateTypeValues returns the possible values for the LeaseStateType const type. func PossibleLeaseStateTypeValues() []LeaseStateType { return []LeaseStateType{ LeaseStateTypeAvailable, LeaseStateTypeBreaking, LeaseStateTypeBroken, LeaseStateTypeExpired, LeaseStateTypeLeased, } } type LeaseStatusType string const ( LeaseStatusTypeLocked LeaseStatusType = "locked" LeaseStatusTypeUnlocked LeaseStatusType = "unlocked" ) // PossibleLeaseStatusTypeValues returns the possible values for the LeaseStatusType const type. func PossibleLeaseStatusTypeValues() []LeaseStatusType { return []LeaseStatusType{ LeaseStatusTypeLocked, LeaseStatusTypeUnlocked, } } type ListBlobsIncludeItem string const ( ListBlobsIncludeItemCopy ListBlobsIncludeItem = "copy" ListBlobsIncludeItemDeleted ListBlobsIncludeItem = "deleted" ListBlobsIncludeItemDeletedwithversions ListBlobsIncludeItem = "deletedwithversions" ListBlobsIncludeItemImmutabilitypolicy ListBlobsIncludeItem = "immutabilitypolicy" ListBlobsIncludeItemLegalhold ListBlobsIncludeItem = "legalhold" ListBlobsIncludeItemMetadata ListBlobsIncludeItem = "metadata" ListBlobsIncludeItemPermissions ListBlobsIncludeItem = "permissions" ListBlobsIncludeItemSnapshots ListBlobsIncludeItem = "snapshots" ListBlobsIncludeItemTags ListBlobsIncludeItem = "tags" ListBlobsIncludeItemUncommittedblobs ListBlobsIncludeItem = "uncommittedblobs" ListBlobsIncludeItemVersions ListBlobsIncludeItem = "versions" ) // PossibleListBlobsIncludeItemValues returns the possible values for the ListBlobsIncludeItem const type. func PossibleListBlobsIncludeItemValues() []ListBlobsIncludeItem { return []ListBlobsIncludeItem{ ListBlobsIncludeItemCopy, ListBlobsIncludeItemDeleted, ListBlobsIncludeItemDeletedwithversions, ListBlobsIncludeItemImmutabilitypolicy, ListBlobsIncludeItemLegalhold, ListBlobsIncludeItemMetadata, ListBlobsIncludeItemPermissions, ListBlobsIncludeItemSnapshots, ListBlobsIncludeItemTags, ListBlobsIncludeItemUncommittedblobs, ListBlobsIncludeItemVersions, } } type ListContainersIncludeType string const ( ListContainersIncludeTypeDeleted ListContainersIncludeType = "deleted" ListContainersIncludeTypeMetadata ListContainersIncludeType = "metadata" ListContainersIncludeTypeSystem ListContainersIncludeType = "system" ) // PossibleListContainersIncludeTypeValues returns the possible values for the ListContainersIncludeType const type. func PossibleListContainersIncludeTypeValues() []ListContainersIncludeType { return []ListContainersIncludeType{ ListContainersIncludeTypeDeleted, ListContainersIncludeTypeMetadata, ListContainersIncludeTypeSystem, } } type PremiumPageBlobAccessTier string const ( PremiumPageBlobAccessTierP10 PremiumPageBlobAccessTier = "P10" PremiumPageBlobAccessTierP15 PremiumPageBlobAccessTier = "P15" PremiumPageBlobAccessTierP20 PremiumPageBlobAccessTier = "P20" PremiumPageBlobAccessTierP30 PremiumPageBlobAccessTier = "P30" PremiumPageBlobAccessTierP4 PremiumPageBlobAccessTier = "P4" PremiumPageBlobAccessTierP40 PremiumPageBlobAccessTier = "P40" PremiumPageBlobAccessTierP50 PremiumPageBlobAccessTier = "P50" PremiumPageBlobAccessTierP6 PremiumPageBlobAccessTier = "P6" PremiumPageBlobAccessTierP60 PremiumPageBlobAccessTier = "P60" PremiumPageBlobAccessTierP70 PremiumPageBlobAccessTier = "P70" PremiumPageBlobAccessTierP80 PremiumPageBlobAccessTier = "P80" ) // PossiblePremiumPageBlobAccessTierValues returns the possible values for the PremiumPageBlobAccessTier const type. func PossiblePremiumPageBlobAccessTierValues() []PremiumPageBlobAccessTier { return []PremiumPageBlobAccessTier{ PremiumPageBlobAccessTierP10, PremiumPageBlobAccessTierP15, PremiumPageBlobAccessTierP20, PremiumPageBlobAccessTierP30, PremiumPageBlobAccessTierP4, PremiumPageBlobAccessTierP40, PremiumPageBlobAccessTierP50, PremiumPageBlobAccessTierP6, PremiumPageBlobAccessTierP60, PremiumPageBlobAccessTierP70, PremiumPageBlobAccessTierP80, } } type PublicAccessType string const ( PublicAccessTypeBlob PublicAccessType = "blob" PublicAccessTypeContainer PublicAccessType = "container" ) // PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type. func PossiblePublicAccessTypeValues() []PublicAccessType { return []PublicAccessType{ PublicAccessTypeBlob, PublicAccessTypeContainer, } } // QueryFormatType - The quick query format type. type QueryFormatType string const ( QueryFormatTypeArrow QueryFormatType = "arrow" QueryFormatTypeDelimited QueryFormatType = "delimited" QueryFormatTypeJSON QueryFormatType = "json" QueryFormatTypeParquet QueryFormatType = "parquet" ) // PossibleQueryFormatTypeValues returns the possible values for the QueryFormatType const type. func PossibleQueryFormatTypeValues() []QueryFormatType { return []QueryFormatType{ QueryFormatTypeArrow, QueryFormatTypeDelimited, QueryFormatTypeJSON, QueryFormatTypeParquet, } } // RehydratePriority - If an object is in rehydrate pending state then this header is returned with priority of rehydrate. // Valid values are High and Standard. type RehydratePriority string const ( RehydratePriorityHigh RehydratePriority = "High" RehydratePriorityStandard RehydratePriority = "Standard" ) // PossibleRehydratePriorityValues returns the possible values for the RehydratePriority const type. func PossibleRehydratePriorityValues() []RehydratePriority { return []RehydratePriority{ RehydratePriorityHigh, RehydratePriorityStandard, } } type SKUName string const ( SKUNamePremiumLRS SKUName = "Premium_LRS" SKUNameStandardGRS SKUName = "Standard_GRS" SKUNameStandardLRS SKUName = "Standard_LRS" SKUNameStandardRAGRS SKUName = "Standard_RAGRS" SKUNameStandardZRS SKUName = "Standard_ZRS" ) // PossibleSKUNameValues returns the possible values for the SKUName const type. func PossibleSKUNameValues() []SKUName { return []SKUName{ SKUNamePremiumLRS, SKUNameStandardGRS, SKUNameStandardLRS, SKUNameStandardRAGRS, SKUNameStandardZRS, } } type SequenceNumberActionType string const ( SequenceNumberActionTypeIncrement SequenceNumberActionType = "increment" SequenceNumberActionTypeMax SequenceNumberActionType = "max" SequenceNumberActionTypeUpdate SequenceNumberActionType = "update" ) // PossibleSequenceNumberActionTypeValues returns the possible values for the SequenceNumberActionType const type. func PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType { return []SequenceNumberActionType{ SequenceNumberActionTypeIncrement, SequenceNumberActionTypeMax, SequenceNumberActionTypeUpdate, } } // StorageErrorCode - Error codes returned by the service type StorageErrorCode string const ( StorageErrorCodeAccountAlreadyExists StorageErrorCode = "AccountAlreadyExists" StorageErrorCodeAccountBeingCreated StorageErrorCode = "AccountBeingCreated" StorageErrorCodeAccountIsDisabled StorageErrorCode = "AccountIsDisabled" StorageErrorCodeAppendPositionConditionNotMet StorageErrorCode = "AppendPositionConditionNotMet" StorageErrorCodeAuthenticationFailed StorageErrorCode = "AuthenticationFailed" StorageErrorCodeAuthorizationFailure StorageErrorCode = "AuthorizationFailure" StorageErrorCodeAuthorizationPermissionMismatch StorageErrorCode = "AuthorizationPermissionMismatch" StorageErrorCodeAuthorizationProtocolMismatch StorageErrorCode = "AuthorizationProtocolMismatch" StorageErrorCodeAuthorizationResourceTypeMismatch StorageErrorCode = "AuthorizationResourceTypeMismatch" StorageErrorCodeAuthorizationServiceMismatch StorageErrorCode = "AuthorizationServiceMismatch" StorageErrorCodeAuthorizationSourceIPMismatch StorageErrorCode = "AuthorizationSourceIPMismatch" StorageErrorCodeBlobAccessTierNotSupportedForAccountType StorageErrorCode = "BlobAccessTierNotSupportedForAccountType" StorageErrorCodeBlobAlreadyExists StorageErrorCode = "BlobAlreadyExists" StorageErrorCodeBlobArchived StorageErrorCode = "BlobArchived" StorageErrorCodeBlobBeingRehydrated StorageErrorCode = "BlobBeingRehydrated" StorageErrorCodeBlobImmutableDueToPolicy StorageErrorCode = "BlobImmutableDueToPolicy" StorageErrorCodeBlobNotArchived StorageErrorCode = "BlobNotArchived" StorageErrorCodeBlobNotFound StorageErrorCode = "BlobNotFound" StorageErrorCodeBlobOverwritten StorageErrorCode = "BlobOverwritten" StorageErrorCodeBlobTierInadequateForContentLength StorageErrorCode = "BlobTierInadequateForContentLength" StorageErrorCodeBlobUsesCustomerSpecifiedEncryption StorageErrorCode = "BlobUsesCustomerSpecifiedEncryption" StorageErrorCodeBlockCountExceedsLimit StorageErrorCode = "BlockCountExceedsLimit" StorageErrorCodeBlockListTooLong StorageErrorCode = "BlockListTooLong" StorageErrorCodeCannotChangeToLowerTier StorageErrorCode = "CannotChangeToLowerTier" StorageErrorCodeCannotVerifyCopySource StorageErrorCode = "CannotVerifyCopySource" StorageErrorCodeConditionHeadersNotSupported StorageErrorCode = "ConditionHeadersNotSupported" StorageErrorCodeConditionNotMet StorageErrorCode = "ConditionNotMet" StorageErrorCodeContainerAlreadyExists StorageErrorCode = "ContainerAlreadyExists" StorageErrorCodeContainerBeingDeleted StorageErrorCode = "ContainerBeingDeleted" StorageErrorCodeContainerDisabled StorageErrorCode = "ContainerDisabled" StorageErrorCodeContainerNotFound StorageErrorCode = "ContainerNotFound" StorageErrorCodeContentLengthLargerThanTierLimit StorageErrorCode = "ContentLengthLargerThanTierLimit" StorageErrorCodeCopyAcrossAccountsNotSupported StorageErrorCode = "CopyAcrossAccountsNotSupported" StorageErrorCodeCopyIDMismatch StorageErrorCode = "CopyIdMismatch" StorageErrorCodeEmptyMetadataKey StorageErrorCode = "EmptyMetadataKey" StorageErrorCodeFeatureVersionMismatch StorageErrorCode = "FeatureVersionMismatch" StorageErrorCodeIncrementalCopyBlobMismatch StorageErrorCode = "IncrementalCopyBlobMismatch" StorageErrorCodeIncrementalCopyOfEarlierVersionSnapshotNotAllowed StorageErrorCode = "IncrementalCopyOfEarlierVersionSnapshotNotAllowed" StorageErrorCodeIncrementalCopySourceMustBeSnapshot StorageErrorCode = "IncrementalCopySourceMustBeSnapshot" StorageErrorCodeInfiniteLeaseDurationRequired StorageErrorCode = "InfiniteLeaseDurationRequired" StorageErrorCodeInsufficientAccountPermissions StorageErrorCode = "InsufficientAccountPermissions" StorageErrorCodeInternalError StorageErrorCode = "InternalError" StorageErrorCodeInvalidAuthenticationInfo StorageErrorCode = "InvalidAuthenticationInfo" StorageErrorCodeInvalidBlobOrBlock StorageErrorCode = "InvalidBlobOrBlock" StorageErrorCodeInvalidBlobTier StorageErrorCode = "InvalidBlobTier" StorageErrorCodeInvalidBlobType StorageErrorCode = "InvalidBlobType" StorageErrorCodeInvalidBlockID StorageErrorCode = "InvalidBlockId" StorageErrorCodeInvalidBlockList StorageErrorCode = "InvalidBlockList" StorageErrorCodeInvalidHTTPVerb StorageErrorCode = "InvalidHttpVerb" StorageErrorCodeInvalidHeaderValue StorageErrorCode = "InvalidHeaderValue" StorageErrorCodeInvalidInput StorageErrorCode = "InvalidInput" StorageErrorCodeInvalidMD5 StorageErrorCode = "InvalidMd5" StorageErrorCodeInvalidMetadata StorageErrorCode = "InvalidMetadata" StorageErrorCodeInvalidOperation StorageErrorCode = "InvalidOperation" StorageErrorCodeInvalidPageRange StorageErrorCode = "InvalidPageRange" StorageErrorCodeInvalidQueryParameterValue StorageErrorCode = "InvalidQueryParameterValue" StorageErrorCodeInvalidRange StorageErrorCode = "InvalidRange" StorageErrorCodeInvalidResourceName StorageErrorCode = "InvalidResourceName" StorageErrorCodeInvalidSourceBlobType StorageErrorCode = "InvalidSourceBlobType" StorageErrorCodeInvalidSourceBlobURL StorageErrorCode = "InvalidSourceBlobUrl" StorageErrorCodeInvalidURI StorageErrorCode = "InvalidUri" StorageErrorCodeInvalidVersionForPageBlobOperation StorageErrorCode = "InvalidVersionForPageBlobOperation" StorageErrorCodeInvalidXMLDocument StorageErrorCode = "InvalidXmlDocument" StorageErrorCodeInvalidXMLNodeValue StorageErrorCode = "InvalidXmlNodeValue" StorageErrorCodeLeaseAlreadyBroken StorageErrorCode = "LeaseAlreadyBroken" StorageErrorCodeLeaseAlreadyPresent StorageErrorCode = "LeaseAlreadyPresent" StorageErrorCodeLeaseIDMismatchWithBlobOperation StorageErrorCode = "LeaseIdMismatchWithBlobOperation" StorageErrorCodeLeaseIDMismatchWithContainerOperation StorageErrorCode = "LeaseIdMismatchWithContainerOperation" StorageErrorCodeLeaseIDMismatchWithLeaseOperation StorageErrorCode = "LeaseIdMismatchWithLeaseOperation" StorageErrorCodeLeaseIDMissing StorageErrorCode = "LeaseIdMissing" StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired StorageErrorCode = "LeaseIsBreakingAndCannotBeAcquired" StorageErrorCodeLeaseIsBreakingAndCannotBeChanged StorageErrorCode = "LeaseIsBreakingAndCannotBeChanged" StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed StorageErrorCode = "LeaseIsBrokenAndCannotBeRenewed" StorageErrorCodeLeaseLost StorageErrorCode = "LeaseLost" StorageErrorCodeLeaseNotPresentWithBlobOperation StorageErrorCode = "LeaseNotPresentWithBlobOperation" StorageErrorCodeLeaseNotPresentWithContainerOperation StorageErrorCode = "LeaseNotPresentWithContainerOperation" StorageErrorCodeLeaseNotPresentWithLeaseOperation StorageErrorCode = "LeaseNotPresentWithLeaseOperation" StorageErrorCodeMD5Mismatch StorageErrorCode = "Md5Mismatch" StorageErrorCodeMaxBlobSizeConditionNotMet StorageErrorCode = "MaxBlobSizeConditionNotMet" StorageErrorCodeMetadataTooLarge StorageErrorCode = "MetadataTooLarge" StorageErrorCodeMissingContentLengthHeader StorageErrorCode = "MissingContentLengthHeader" StorageErrorCodeMissingRequiredHeader StorageErrorCode = "MissingRequiredHeader" StorageErrorCodeMissingRequiredQueryParameter StorageErrorCode = "MissingRequiredQueryParameter" StorageErrorCodeMissingRequiredXMLNode StorageErrorCode = "MissingRequiredXmlNode" StorageErrorCodeMultipleConditionHeadersNotSupported StorageErrorCode = "MultipleConditionHeadersNotSupported" StorageErrorCodeNoAuthenticationInformation StorageErrorCode = "NoAuthenticationInformation" StorageErrorCodeNoPendingCopyOperation StorageErrorCode = "NoPendingCopyOperation" StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob StorageErrorCode = "OperationNotAllowedOnIncrementalCopyBlob" StorageErrorCodeOperationTimedOut StorageErrorCode = "OperationTimedOut" StorageErrorCodeOutOfRangeInput StorageErrorCode = "OutOfRangeInput" StorageErrorCodeOutOfRangeQueryParameterValue StorageErrorCode = "OutOfRangeQueryParameterValue" StorageErrorCodePendingCopyOperation StorageErrorCode = "PendingCopyOperation" StorageErrorCodePreviousSnapshotCannotBeNewer StorageErrorCode = "PreviousSnapshotCannotBeNewer" StorageErrorCodePreviousSnapshotNotFound StorageErrorCode = "PreviousSnapshotNotFound" StorageErrorCodePreviousSnapshotOperationNotSupported StorageErrorCode = "PreviousSnapshotOperationNotSupported" StorageErrorCodeRequestBodyTooLarge StorageErrorCode = "RequestBodyTooLarge" StorageErrorCodeRequestURLFailedToParse StorageErrorCode = "RequestUrlFailedToParse" StorageErrorCodeResourceAlreadyExists StorageErrorCode = "ResourceAlreadyExists" StorageErrorCodeResourceNotFound StorageErrorCode = "ResourceNotFound" StorageErrorCodeResourceTypeMismatch StorageErrorCode = "ResourceTypeMismatch" StorageErrorCodeSequenceNumberConditionNotMet StorageErrorCode = "SequenceNumberConditionNotMet" StorageErrorCodeSequenceNumberIncrementTooLarge StorageErrorCode = "SequenceNumberIncrementTooLarge" StorageErrorCodeServerBusy StorageErrorCode = "ServerBusy" StorageErrorCodeSnapshotCountExceeded StorageErrorCode = "SnapshotCountExceeded" StorageErrorCodeSnapshotOperationRateExceeded StorageErrorCode = "SnapshotOperationRateExceeded" StorageErrorCodeSnapshotsPresent StorageErrorCode = "SnapshotsPresent" StorageErrorCodeSourceConditionNotMet StorageErrorCode = "SourceConditionNotMet" StorageErrorCodeSystemInUse StorageErrorCode = "SystemInUse" StorageErrorCodeTargetConditionNotMet StorageErrorCode = "TargetConditionNotMet" StorageErrorCodeUnauthorizedBlobOverwrite StorageErrorCode = "UnauthorizedBlobOverwrite" StorageErrorCodeUnsupportedHTTPVerb StorageErrorCode = "UnsupportedHttpVerb" StorageErrorCodeUnsupportedHeader StorageErrorCode = "UnsupportedHeader" StorageErrorCodeUnsupportedQueryParameter StorageErrorCode = "UnsupportedQueryParameter" StorageErrorCodeUnsupportedXMLNode StorageErrorCode = "UnsupportedXmlNode" ) // PossibleStorageErrorCodeValues returns the possible values for the StorageErrorCode const type. func PossibleStorageErrorCodeValues() []StorageErrorCode { return []StorageErrorCode{ StorageErrorCodeAccountAlreadyExists, StorageErrorCodeAccountBeingCreated, StorageErrorCodeAccountIsDisabled, StorageErrorCodeAppendPositionConditionNotMet, StorageErrorCodeAuthenticationFailed, StorageErrorCodeAuthorizationFailure, StorageErrorCodeAuthorizationPermissionMismatch, StorageErrorCodeAuthorizationProtocolMismatch, StorageErrorCodeAuthorizationResourceTypeMismatch, StorageErrorCodeAuthorizationServiceMismatch, StorageErrorCodeAuthorizationSourceIPMismatch, StorageErrorCodeBlobAccessTierNotSupportedForAccountType, StorageErrorCodeBlobAlreadyExists, StorageErrorCodeBlobArchived, StorageErrorCodeBlobBeingRehydrated, StorageErrorCodeBlobImmutableDueToPolicy, StorageErrorCodeBlobNotArchived, StorageErrorCodeBlobNotFound, StorageErrorCodeBlobOverwritten, StorageErrorCodeBlobTierInadequateForContentLength, StorageErrorCodeBlobUsesCustomerSpecifiedEncryption, StorageErrorCodeBlockCountExceedsLimit, StorageErrorCodeBlockListTooLong, StorageErrorCodeCannotChangeToLowerTier, StorageErrorCodeCannotVerifyCopySource, StorageErrorCodeConditionHeadersNotSupported, StorageErrorCodeConditionNotMet, StorageErrorCodeContainerAlreadyExists, StorageErrorCodeContainerBeingDeleted, StorageErrorCodeContainerDisabled, StorageErrorCodeContainerNotFound, StorageErrorCodeContentLengthLargerThanTierLimit, StorageErrorCodeCopyAcrossAccountsNotSupported, StorageErrorCodeCopyIDMismatch, StorageErrorCodeEmptyMetadataKey, StorageErrorCodeFeatureVersionMismatch, StorageErrorCodeIncrementalCopyBlobMismatch, StorageErrorCodeIncrementalCopyOfEarlierVersionSnapshotNotAllowed, StorageErrorCodeIncrementalCopySourceMustBeSnapshot, StorageErrorCodeInfiniteLeaseDurationRequired, StorageErrorCodeInsufficientAccountPermissions, StorageErrorCodeInternalError, StorageErrorCodeInvalidAuthenticationInfo, StorageErrorCodeInvalidBlobOrBlock, StorageErrorCodeInvalidBlobTier, StorageErrorCodeInvalidBlobType, StorageErrorCodeInvalidBlockID, StorageErrorCodeInvalidBlockList, StorageErrorCodeInvalidHTTPVerb, StorageErrorCodeInvalidHeaderValue, StorageErrorCodeInvalidInput, StorageErrorCodeInvalidMD5, StorageErrorCodeInvalidMetadata, StorageErrorCodeInvalidOperation, StorageErrorCodeInvalidPageRange, StorageErrorCodeInvalidQueryParameterValue, StorageErrorCodeInvalidRange, StorageErrorCodeInvalidResourceName, StorageErrorCodeInvalidSourceBlobType, StorageErrorCodeInvalidSourceBlobURL, StorageErrorCodeInvalidURI, StorageErrorCodeInvalidVersionForPageBlobOperation, StorageErrorCodeInvalidXMLDocument, StorageErrorCodeInvalidXMLNodeValue, StorageErrorCodeLeaseAlreadyBroken, StorageErrorCodeLeaseAlreadyPresent, StorageErrorCodeLeaseIDMismatchWithBlobOperation, StorageErrorCodeLeaseIDMismatchWithContainerOperation, StorageErrorCodeLeaseIDMismatchWithLeaseOperation, StorageErrorCodeLeaseIDMissing, StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired, StorageErrorCodeLeaseIsBreakingAndCannotBeChanged, StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed, StorageErrorCodeLeaseLost, StorageErrorCodeLeaseNotPresentWithBlobOperation, StorageErrorCodeLeaseNotPresentWithContainerOperation, StorageErrorCodeLeaseNotPresentWithLeaseOperation, StorageErrorCodeMD5Mismatch, StorageErrorCodeMaxBlobSizeConditionNotMet, StorageErrorCodeMetadataTooLarge, StorageErrorCodeMissingContentLengthHeader, StorageErrorCodeMissingRequiredHeader, StorageErrorCodeMissingRequiredQueryParameter, StorageErrorCodeMissingRequiredXMLNode, StorageErrorCodeMultipleConditionHeadersNotSupported, StorageErrorCodeNoAuthenticationInformation, StorageErrorCodeNoPendingCopyOperation, StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob, StorageErrorCodeOperationTimedOut, StorageErrorCodeOutOfRangeInput, StorageErrorCodeOutOfRangeQueryParameterValue, StorageErrorCodePendingCopyOperation, StorageErrorCodePreviousSnapshotCannotBeNewer, StorageErrorCodePreviousSnapshotNotFound, StorageErrorCodePreviousSnapshotOperationNotSupported, StorageErrorCodeRequestBodyTooLarge, StorageErrorCodeRequestURLFailedToParse, StorageErrorCodeResourceAlreadyExists, StorageErrorCodeResourceNotFound, StorageErrorCodeResourceTypeMismatch, StorageErrorCodeSequenceNumberConditionNotMet, StorageErrorCodeSequenceNumberIncrementTooLarge, StorageErrorCodeServerBusy, StorageErrorCodeSnapshotCountExceeded, StorageErrorCodeSnapshotOperationRateExceeded, StorageErrorCodeSnapshotsPresent, StorageErrorCodeSourceConditionNotMet, StorageErrorCodeSystemInUse, StorageErrorCodeTargetConditionNotMet, StorageErrorCodeUnauthorizedBlobOverwrite, StorageErrorCodeUnsupportedHTTPVerb, StorageErrorCodeUnsupportedHeader, StorageErrorCodeUnsupportedQueryParameter, StorageErrorCodeUnsupportedXMLNode, } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_container_client.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "context" "encoding/xml" "fmt" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "io" "net/http" "strconv" "strings" "time" ) // ContainerClient contains the methods for the Container group. // Don't use this type directly, use a constructor function instead. type ContainerClient struct { internal *azcore.Client endpoint string } // AcquireLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 // to 60 seconds, or can be infinite // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - duration - Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite // lease can be between 15 and 60 seconds. A lease duration cannot be changed using // renew or change. // - options - ContainerClientAcquireLeaseOptions contains the optional parameters for the ContainerClient.AcquireLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *ContainerClient) AcquireLease(ctx context.Context, duration int32, options *ContainerClientAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientAcquireLeaseResponse, error) { var err error req, err := client.acquireLeaseCreateRequest(ctx, duration, options, modifiedAccessConditions) if err != nil { return ContainerClientAcquireLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientAcquireLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return ContainerClientAcquireLeaseResponse{}, err } resp, err := client.acquireLeaseHandleResponse(httpResp) return resp, err } // acquireLeaseCreateRequest creates the AcquireLease request. func (client *ContainerClient) acquireLeaseCreateRequest(ctx context.Context, duration int32, options *ContainerClientAcquireLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-lease-action"] = []string{"acquire"} req.Raw().Header["x-ms-lease-duration"] = []string{strconv.FormatInt(int64(duration), 10)} if options != nil && options.ProposedLeaseID != nil { req.Raw().Header["x-ms-proposed-lease-id"] = []string{*options.ProposedLeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // acquireLeaseHandleResponse handles the AcquireLease response. func (client *ContainerClient) acquireLeaseHandleResponse(resp *http.Response) (ContainerClientAcquireLeaseResponse, error) { result := ContainerClientAcquireLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientAcquireLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientAcquireLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-id"); val != "" { result.LeaseID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // BreakLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 // to 60 seconds, or can be infinite // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ContainerClientBreakLeaseOptions contains the optional parameters for the ContainerClient.BreakLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *ContainerClient) BreakLease(ctx context.Context, options *ContainerClientBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientBreakLeaseResponse, error) { var err error req, err := client.breakLeaseCreateRequest(ctx, options, modifiedAccessConditions) if err != nil { return ContainerClientBreakLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientBreakLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return ContainerClientBreakLeaseResponse{}, err } resp, err := client.breakLeaseHandleResponse(httpResp) return resp, err } // breakLeaseCreateRequest creates the BreakLease request. func (client *ContainerClient) breakLeaseCreateRequest(ctx context.Context, options *ContainerClientBreakLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-lease-action"] = []string{"break"} if options != nil && options.BreakPeriod != nil { req.Raw().Header["x-ms-lease-break-period"] = []string{strconv.FormatInt(int64(*options.BreakPeriod), 10)} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // breakLeaseHandleResponse handles the BreakLease response. func (client *ContainerClient) breakLeaseHandleResponse(resp *http.Response) (ContainerClientBreakLeaseResponse, error) { result := ContainerClientBreakLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientBreakLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientBreakLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-time"); val != "" { leaseTime32, err := strconv.ParseInt(val, 10, 32) leaseTime := int32(leaseTime32) if err != nil { return ContainerClientBreakLeaseResponse{}, err } result.LeaseTime = &leaseTime } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // ChangeLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 // to 60 seconds, or can be infinite // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - leaseID - Specifies the current lease ID on the resource. // - proposedLeaseID - Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed // lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID // string formats. // - options - ContainerClientChangeLeaseOptions contains the optional parameters for the ContainerClient.ChangeLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *ContainerClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, options *ContainerClientChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientChangeLeaseResponse, error) { var err error req, err := client.changeLeaseCreateRequest(ctx, leaseID, proposedLeaseID, options, modifiedAccessConditions) if err != nil { return ContainerClientChangeLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientChangeLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientChangeLeaseResponse{}, err } resp, err := client.changeLeaseHandleResponse(httpResp) return resp, err } // changeLeaseCreateRequest creates the ChangeLease request. func (client *ContainerClient) changeLeaseCreateRequest(ctx context.Context, leaseID string, proposedLeaseID string, options *ContainerClientChangeLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-lease-action"] = []string{"change"} req.Raw().Header["x-ms-lease-id"] = []string{leaseID} req.Raw().Header["x-ms-proposed-lease-id"] = []string{proposedLeaseID} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // changeLeaseHandleResponse handles the ChangeLease response. func (client *ContainerClient) changeLeaseHandleResponse(resp *http.Response) (ContainerClientChangeLeaseResponse, error) { result := ContainerClientChangeLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientChangeLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientChangeLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-id"); val != "" { result.LeaseID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // Create - creates a new container under the specified account. If the container with the same name already exists, the operation // fails // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ContainerClientCreateOptions contains the optional parameters for the ContainerClient.Create method. // - ContainerCPKScopeInfo - ContainerCPKScopeInfo contains a group of parameters for the ContainerClient.Create method. func (client *ContainerClient) Create(ctx context.Context, options *ContainerClientCreateOptions, containerCPKScopeInfo *ContainerCPKScopeInfo) (ContainerClientCreateResponse, error) { var err error req, err := client.createCreateRequest(ctx, options, containerCPKScopeInfo) if err != nil { return ContainerClientCreateResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientCreateResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return ContainerClientCreateResponse{}, err } resp, err := client.createHandleResponse(httpResp) return resp, err } // createCreateRequest creates the Create request. func (client *ContainerClient) createCreateRequest(ctx context.Context, options *ContainerClientCreateOptions, containerCPKScopeInfo *ContainerCPKScopeInfo) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.Access != nil { req.Raw().Header["x-ms-blob-public-access"] = []string{string(*options.Access)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if containerCPKScopeInfo != nil && containerCPKScopeInfo.DefaultEncryptionScope != nil { req.Raw().Header["x-ms-default-encryption-scope"] = []string{*containerCPKScopeInfo.DefaultEncryptionScope} } if containerCPKScopeInfo != nil && containerCPKScopeInfo.PreventEncryptionScopeOverride != nil { req.Raw().Header["x-ms-deny-encryption-scope-override"] = []string{strconv.FormatBool(*containerCPKScopeInfo.PreventEncryptionScopeOverride)} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // createHandleResponse handles the Create response. func (client *ContainerClient) createHandleResponse(resp *http.Response) (ContainerClientCreateResponse, error) { result := ContainerClientCreateResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientCreateResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientCreateResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // Delete - operation marks the specified container for deletion. The container and any blobs contained within it are later // deleted during garbage collection // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ContainerClientDeleteOptions contains the optional parameters for the ContainerClient.Delete method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *ContainerClient) Delete(ctx context.Context, options *ContainerClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientDeleteResponse, error) { var err error req, err := client.deleteCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions) if err != nil { return ContainerClientDeleteResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientDeleteResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return ContainerClientDeleteResponse{}, err } resp, err := client.deleteHandleResponse(httpResp) return resp, err } // deleteCreateRequest creates the Delete request. func (client *ContainerClient) deleteCreateRequest(ctx context.Context, options *ContainerClientDeleteOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodDelete, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // deleteHandleResponse handles the Delete response. func (client *ContainerClient) deleteHandleResponse(resp *http.Response) (ContainerClientDeleteResponse, error) { result := ContainerClientDeleteResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientDeleteResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // FilterBlobs - The Filter Blobs operation enables callers to list blobs in a container whose tags match a given search expression. // Filter blobs searches within the given container. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - where - Filters the results to return only to return only blobs whose tags match the specified expression. // - options - ContainerClientFilterBlobsOptions contains the optional parameters for the ContainerClient.FilterBlobs method. func (client *ContainerClient) FilterBlobs(ctx context.Context, where string, options *ContainerClientFilterBlobsOptions) (ContainerClientFilterBlobsResponse, error) { var err error req, err := client.filterBlobsCreateRequest(ctx, where, options) if err != nil { return ContainerClientFilterBlobsResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientFilterBlobsResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientFilterBlobsResponse{}, err } resp, err := client.filterBlobsHandleResponse(httpResp) return resp, err } // filterBlobsCreateRequest creates the FilterBlobs request. func (client *ContainerClient) filterBlobsCreateRequest(ctx context.Context, where string, options *ContainerClientFilterBlobsOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "blobs") if options != nil && options.Include != nil { reqQP.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), "[]")), ",")) } if options != nil && options.Marker != nil { reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } reqQP.Set("where", where) req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // filterBlobsHandleResponse handles the FilterBlobs response. func (client *ContainerClient) filterBlobsHandleResponse(resp *http.Response) (ContainerClientFilterBlobsResponse, error) { result := ContainerClientFilterBlobsResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientFilterBlobsResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.FilterBlobSegment); err != nil { return ContainerClientFilterBlobsResponse{}, err } return result, nil } // GetAccessPolicy - gets the permissions for the specified container. The permissions indicate whether container data may // be accessed publicly. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ContainerClientGetAccessPolicyOptions contains the optional parameters for the ContainerClient.GetAccessPolicy // method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. func (client *ContainerClient) GetAccessPolicy(ctx context.Context, options *ContainerClientGetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions) (ContainerClientGetAccessPolicyResponse, error) { var err error req, err := client.getAccessPolicyCreateRequest(ctx, options, leaseAccessConditions) if err != nil { return ContainerClientGetAccessPolicyResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientGetAccessPolicyResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientGetAccessPolicyResponse{}, err } resp, err := client.getAccessPolicyHandleResponse(httpResp) return resp, err } // getAccessPolicyCreateRequest creates the GetAccessPolicy request. func (client *ContainerClient) getAccessPolicyCreateRequest(ctx context.Context, options *ContainerClientGetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "acl") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getAccessPolicyHandleResponse handles the GetAccessPolicy response. func (client *ContainerClient) getAccessPolicyHandleResponse(resp *http.Response) (ContainerClientGetAccessPolicyResponse, error) { result := ContainerClientGetAccessPolicyResponse{} if val := resp.Header.Get("x-ms-blob-public-access"); val != "" { result.BlobPublicAccess = (*PublicAccessType)(&val) } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientGetAccessPolicyResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientGetAccessPolicyResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result); err != nil { return ContainerClientGetAccessPolicyResponse{}, err } return result, nil } // GetAccountInfo - Returns the sku name and account kind // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ContainerClientGetAccountInfoOptions contains the optional parameters for the ContainerClient.GetAccountInfo // method. func (client *ContainerClient) GetAccountInfo(ctx context.Context, options *ContainerClientGetAccountInfoOptions) (ContainerClientGetAccountInfoResponse, error) { var err error req, err := client.getAccountInfoCreateRequest(ctx, options) if err != nil { return ContainerClientGetAccountInfoResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientGetAccountInfoResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientGetAccountInfoResponse{}, err } resp, err := client.getAccountInfoHandleResponse(httpResp) return resp, err } // getAccountInfoCreateRequest creates the GetAccountInfo request. func (client *ContainerClient) getAccountInfoCreateRequest(ctx context.Context, options *ContainerClientGetAccountInfoOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "properties") reqQP.Set("restype", "account") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getAccountInfoHandleResponse handles the GetAccountInfo response. func (client *ContainerClient) getAccountInfoHandleResponse(resp *http.Response) (ContainerClientGetAccountInfoResponse, error) { result := ContainerClientGetAccountInfoResponse{} if val := resp.Header.Get("x-ms-account-kind"); val != "" { result.AccountKind = (*AccountKind)(&val) } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientGetAccountInfoResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-is-hns-enabled"); val != "" { isHierarchicalNamespaceEnabled, err := strconv.ParseBool(val) if err != nil { return ContainerClientGetAccountInfoResponse{}, err } result.IsHierarchicalNamespaceEnabled = &isHierarchicalNamespaceEnabled } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-sku-name"); val != "" { result.SKUName = (*SKUName)(&val) } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // GetProperties - returns all user-defined metadata and system properties for the specified container. The data returned // does not include the container's list of blobs // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ContainerClientGetPropertiesOptions contains the optional parameters for the ContainerClient.GetProperties method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. func (client *ContainerClient) GetProperties(ctx context.Context, options *ContainerClientGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions) (ContainerClientGetPropertiesResponse, error) { var err error req, err := client.getPropertiesCreateRequest(ctx, options, leaseAccessConditions) if err != nil { return ContainerClientGetPropertiesResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientGetPropertiesResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientGetPropertiesResponse{}, err } resp, err := client.getPropertiesHandleResponse(httpResp) return resp, err } // getPropertiesCreateRequest creates the GetProperties request. func (client *ContainerClient) getPropertiesCreateRequest(ctx context.Context, options *ContainerClientGetPropertiesOptions, leaseAccessConditions *LeaseAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getPropertiesHandleResponse handles the GetProperties response. func (client *ContainerClient) getPropertiesHandleResponse(resp *http.Response) (ContainerClientGetPropertiesResponse, error) { result := ContainerClientGetPropertiesResponse{} if val := resp.Header.Get("x-ms-blob-public-access"); val != "" { result.BlobPublicAccess = (*PublicAccessType)(&val) } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientGetPropertiesResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-default-encryption-scope"); val != "" { result.DefaultEncryptionScope = &val } if val := resp.Header.Get("x-ms-deny-encryption-scope-override"); val != "" { denyEncryptionScopeOverride, err := strconv.ParseBool(val) if err != nil { return ContainerClientGetPropertiesResponse{}, err } result.DenyEncryptionScopeOverride = &denyEncryptionScopeOverride } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-has-immutability-policy"); val != "" { hasImmutabilityPolicy, err := strconv.ParseBool(val) if err != nil { return ContainerClientGetPropertiesResponse{}, err } result.HasImmutabilityPolicy = &hasImmutabilityPolicy } if val := resp.Header.Get("x-ms-has-legal-hold"); val != "" { hasLegalHold, err := strconv.ParseBool(val) if err != nil { return ContainerClientGetPropertiesResponse{}, err } result.HasLegalHold = &hasLegalHold } if val := resp.Header.Get("x-ms-immutable-storage-with-versioning-enabled"); val != "" { isImmutableStorageWithVersioningEnabled, err := strconv.ParseBool(val) if err != nil { return ContainerClientGetPropertiesResponse{}, err } result.IsImmutableStorageWithVersioningEnabled = &isImmutableStorageWithVersioningEnabled } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientGetPropertiesResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-duration"); val != "" { result.LeaseDuration = (*LeaseDurationType)(&val) } if val := resp.Header.Get("x-ms-lease-state"); val != "" { result.LeaseState = (*LeaseStateType)(&val) } if val := resp.Header.Get("x-ms-lease-status"); val != "" { result.LeaseStatus = (*LeaseStatusType)(&val) } for hh := range resp.Header { if len(hh) > len("x-ms-meta-") && strings.EqualFold(hh[:len("x-ms-meta-")], "x-ms-meta-") { if result.Metadata == nil { result.Metadata = map[string]*string{} } result.Metadata[hh[len("x-ms-meta-"):]] = to.Ptr(resp.Header.Get(hh)) } } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // NewListBlobFlatSegmentPager - [Update] The List Blobs operation returns a list of the blobs under the specified container // // Generated from API version 2025-01-05 // - options - ContainerClientListBlobFlatSegmentOptions contains the optional parameters for the ContainerClient.NewListBlobFlatSegmentPager // method. // // listBlobFlatSegmentCreateRequest creates the ListBlobFlatSegment request. func (client *ContainerClient) ListBlobFlatSegmentCreateRequest(ctx context.Context, options *ContainerClientListBlobFlatSegmentOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "list") if options != nil && options.Include != nil { reqQP.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), "[]")), ",")) } if options != nil && options.Marker != nil { reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Prefix != nil { reqQP.Set("prefix", *options.Prefix) } reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // listBlobFlatSegmentHandleResponse handles the ListBlobFlatSegment response. func (client *ContainerClient) ListBlobFlatSegmentHandleResponse(resp *http.Response) (ContainerClientListBlobFlatSegmentResponse, error) { result := ContainerClientListBlobFlatSegmentResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientListBlobFlatSegmentResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.ListBlobsFlatSegmentResponse); err != nil { return ContainerClientListBlobFlatSegmentResponse{}, err } return result, nil } // NewListBlobHierarchySegmentPager - [Update] The List Blobs operation returns a list of the blobs under the specified container // // Generated from API version 2025-01-05 // - delimiter - When the request includes this parameter, the operation returns a BlobPrefix element in the response body that // acts as a placeholder for all blobs whose names begin with the same substring up to the // appearance of the delimiter character. The delimiter may be a single character or a string. // - options - ContainerClientListBlobHierarchySegmentOptions contains the optional parameters for the ContainerClient.NewListBlobHierarchySegmentPager // method. func (client *ContainerClient) NewListBlobHierarchySegmentPager(delimiter string, options *ContainerClientListBlobHierarchySegmentOptions) *runtime.Pager[ContainerClientListBlobHierarchySegmentResponse] { return runtime.NewPager(runtime.PagingHandler[ContainerClientListBlobHierarchySegmentResponse]{ More: func(page ContainerClientListBlobHierarchySegmentResponse) bool { return page.NextMarker != nil && len(*page.NextMarker) > 0 }, Fetcher: func(ctx context.Context, page *ContainerClientListBlobHierarchySegmentResponse) (ContainerClientListBlobHierarchySegmentResponse, error) { nextLink := "" if page != nil { nextLink = *page.NextMarker } resp, err := runtime.FetcherForNextLink(ctx, client.internal.Pipeline(), nextLink, func(ctx context.Context) (*policy.Request, error) { return client.ListBlobHierarchySegmentCreateRequest(ctx, delimiter, options) }, nil) if err != nil { return ContainerClientListBlobHierarchySegmentResponse{}, err } return client.ListBlobHierarchySegmentHandleResponse(resp) }, }) } // ListBlobHierarchySegmentCreateRequest creates the ListBlobHierarchySegment request. func (client *ContainerClient) ListBlobHierarchySegmentCreateRequest(ctx context.Context, delimiter string, options *ContainerClientListBlobHierarchySegmentOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "list") reqQP.Set("delimiter", delimiter) if options != nil && options.Include != nil { reqQP.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), "[]")), ",")) } if options != nil && options.Marker != nil { reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Prefix != nil { reqQP.Set("prefix", *options.Prefix) } reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // ListBlobHierarchySegmentHandleResponse handles the ListBlobHierarchySegment response. func (client *ContainerClient) ListBlobHierarchySegmentHandleResponse(resp *http.Response) (ContainerClientListBlobHierarchySegmentResponse, error) { result := ContainerClientListBlobHierarchySegmentResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientListBlobHierarchySegmentResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.ListBlobsHierarchySegmentResponse); err != nil { return ContainerClientListBlobHierarchySegmentResponse{}, err } return result, nil } // ReleaseLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 // to 60 seconds, or can be infinite // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - leaseID - Specifies the current lease ID on the resource. // - options - ContainerClientReleaseLeaseOptions contains the optional parameters for the ContainerClient.ReleaseLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *ContainerClient) ReleaseLease(ctx context.Context, leaseID string, options *ContainerClientReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientReleaseLeaseResponse, error) { var err error req, err := client.releaseLeaseCreateRequest(ctx, leaseID, options, modifiedAccessConditions) if err != nil { return ContainerClientReleaseLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientReleaseLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientReleaseLeaseResponse{}, err } resp, err := client.releaseLeaseHandleResponse(httpResp) return resp, err } // releaseLeaseCreateRequest creates the ReleaseLease request. func (client *ContainerClient) releaseLeaseCreateRequest(ctx context.Context, leaseID string, options *ContainerClientReleaseLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-lease-action"] = []string{"release"} req.Raw().Header["x-ms-lease-id"] = []string{leaseID} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // releaseLeaseHandleResponse handles the ReleaseLease response. func (client *ContainerClient) releaseLeaseHandleResponse(resp *http.Response) (ContainerClientReleaseLeaseResponse, error) { result := ContainerClientReleaseLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientReleaseLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientReleaseLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // Rename - Renames an existing container. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - sourceContainerName - Required. Specifies the name of the container to rename. // - options - ContainerClientRenameOptions contains the optional parameters for the ContainerClient.Rename method. func (client *ContainerClient) Rename(ctx context.Context, sourceContainerName string, options *ContainerClientRenameOptions) (ContainerClientRenameResponse, error) { var err error req, err := client.renameCreateRequest(ctx, sourceContainerName, options) if err != nil { return ContainerClientRenameResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientRenameResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientRenameResponse{}, err } resp, err := client.renameHandleResponse(httpResp) return resp, err } // renameCreateRequest creates the Rename request. func (client *ContainerClient) renameCreateRequest(ctx context.Context, sourceContainerName string, options *ContainerClientRenameOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "rename") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-source-container-name"] = []string{sourceContainerName} if options != nil && options.SourceLeaseID != nil { req.Raw().Header["x-ms-source-lease-id"] = []string{*options.SourceLeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // renameHandleResponse handles the Rename response. func (client *ContainerClient) renameHandleResponse(resp *http.Response) (ContainerClientRenameResponse, error) { result := ContainerClientRenameResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientRenameResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // RenewLease - [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 // to 60 seconds, or can be infinite // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - leaseID - Specifies the current lease ID on the resource. // - options - ContainerClientRenewLeaseOptions contains the optional parameters for the ContainerClient.RenewLease method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *ContainerClient) RenewLease(ctx context.Context, leaseID string, options *ContainerClientRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientRenewLeaseResponse, error) { var err error req, err := client.renewLeaseCreateRequest(ctx, leaseID, options, modifiedAccessConditions) if err != nil { return ContainerClientRenewLeaseResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientRenewLeaseResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientRenewLeaseResponse{}, err } resp, err := client.renewLeaseHandleResponse(httpResp) return resp, err } // renewLeaseCreateRequest creates the RenewLease request. func (client *ContainerClient) renewLeaseCreateRequest(ctx context.Context, leaseID string, options *ContainerClientRenewLeaseOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "lease") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-lease-action"] = []string{"renew"} req.Raw().Header["x-ms-lease-id"] = []string{leaseID} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // renewLeaseHandleResponse handles the RenewLease response. func (client *ContainerClient) renewLeaseHandleResponse(resp *http.Response) (ContainerClientRenewLeaseResponse, error) { result := ContainerClientRenewLeaseResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientRenewLeaseResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientRenewLeaseResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-lease-id"); val != "" { result.LeaseID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // Restore - Restores a previously-deleted container. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ContainerClientRestoreOptions contains the optional parameters for the ContainerClient.Restore method. func (client *ContainerClient) Restore(ctx context.Context, options *ContainerClientRestoreOptions) (ContainerClientRestoreResponse, error) { var err error req, err := client.restoreCreateRequest(ctx, options) if err != nil { return ContainerClientRestoreResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientRestoreResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return ContainerClientRestoreResponse{}, err } resp, err := client.restoreHandleResponse(httpResp) return resp, err } // restoreCreateRequest creates the Restore request. func (client *ContainerClient) restoreCreateRequest(ctx context.Context, options *ContainerClientRestoreOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "undelete") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.DeletedContainerName != nil { req.Raw().Header["x-ms-deleted-container-name"] = []string{*options.DeletedContainerName} } if options != nil && options.DeletedContainerVersion != nil { req.Raw().Header["x-ms-deleted-container-version"] = []string{*options.DeletedContainerVersion} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // restoreHandleResponse handles the Restore response. func (client *ContainerClient) restoreHandleResponse(resp *http.Response) (ContainerClientRestoreResponse, error) { result := ContainerClientRestoreResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientRestoreResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SetAccessPolicy - sets the permissions for the specified container. The permissions indicate whether blobs in a container // may be accessed publicly. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - containerACL - the acls for the container // - options - ContainerClientSetAccessPolicyOptions contains the optional parameters for the ContainerClient.SetAccessPolicy // method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *ContainerClient) SetAccessPolicy(ctx context.Context, containerACL []*SignedIdentifier, options *ContainerClientSetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientSetAccessPolicyResponse, error) { var err error req, err := client.setAccessPolicyCreateRequest(ctx, containerACL, options, leaseAccessConditions, modifiedAccessConditions) if err != nil { return ContainerClientSetAccessPolicyResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientSetAccessPolicyResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientSetAccessPolicyResponse{}, err } resp, err := client.setAccessPolicyHandleResponse(httpResp) return resp, err } // setAccessPolicyCreateRequest creates the SetAccessPolicy request. func (client *ContainerClient) setAccessPolicyCreateRequest(ctx context.Context, containerACL []*SignedIdentifier, options *ContainerClientSetAccessPolicyOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "acl") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.Access != nil { req.Raw().Header["x-ms-blob-public-access"] = []string{string(*options.Access)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} type wrapper struct { XMLName xml.Name `xml:"SignedIdentifiers"` ContainerACL *[]*SignedIdentifier `xml:"SignedIdentifier"` } if err := runtime.MarshalAsXML(req, wrapper{ContainerACL: &containerACL}); err != nil { return nil, err } return req, nil } // setAccessPolicyHandleResponse handles the SetAccessPolicy response. func (client *ContainerClient) setAccessPolicyHandleResponse(resp *http.Response) (ContainerClientSetAccessPolicyResponse, error) { result := ContainerClientSetAccessPolicyResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientSetAccessPolicyResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientSetAccessPolicyResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SetMetadata - operation sets one or more user-defined name-value pairs for the specified container. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ContainerClientSetMetadataOptions contains the optional parameters for the ContainerClient.SetMetadata method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *ContainerClient) SetMetadata(ctx context.Context, options *ContainerClientSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (ContainerClientSetMetadataResponse, error) { var err error req, err := client.setMetadataCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions) if err != nil { return ContainerClientSetMetadataResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientSetMetadataResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ContainerClientSetMetadataResponse{}, err } resp, err := client.setMetadataHandleResponse(httpResp) return resp, err } // setMetadataCreateRequest creates the SetMetadata request. func (client *ContainerClient) setMetadataCreateRequest(ctx context.Context, options *ContainerClientSetMetadataOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "metadata") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // setMetadataHandleResponse handles the SetMetadata response. func (client *ContainerClient) setMetadataHandleResponse(resp *http.Response) (ContainerClientSetMetadataResponse, error) { result := ContainerClientSetMetadataResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientSetMetadataResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return ContainerClientSetMetadataResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SubmitBatch - The Batch operation allows multiple API calls to be embedded into a single HTTP request. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - multipartContentType - Required. The value of this header must be multipart/mixed with a batch boundary. Example header // value: multipart/mixed; boundary=batch_ // - body - Initial data // - options - ContainerClientSubmitBatchOptions contains the optional parameters for the ContainerClient.SubmitBatch method. func (client *ContainerClient) SubmitBatch(ctx context.Context, contentLength int64, multipartContentType string, body io.ReadSeekCloser, options *ContainerClientSubmitBatchOptions) (ContainerClientSubmitBatchResponse, error) { var err error req, err := client.submitBatchCreateRequest(ctx, contentLength, multipartContentType, body, options) if err != nil { return ContainerClientSubmitBatchResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ContainerClientSubmitBatchResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return ContainerClientSubmitBatchResponse{}, err } resp, err := client.submitBatchHandleResponse(httpResp) return resp, err } // submitBatchCreateRequest creates the SubmitBatch request. func (client *ContainerClient) submitBatchCreateRequest(ctx context.Context, contentLength int64, multipartContentType string, body io.ReadSeekCloser, options *ContainerClientSubmitBatchOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPost, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "batch") reqQP.Set("restype", "container") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) runtime.SkipBodyDownload(req) req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} req.Raw().Header["Content-Type"] = []string{multipartContentType} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := req.SetBody(body, multipartContentType); err != nil { return nil, err } return req, nil } // submitBatchHandleResponse handles the SubmitBatch response. func (client *ContainerClient) submitBatchHandleResponse(resp *http.Response) (ContainerClientSubmitBatchResponse, error) { result := ContainerClientSubmitBatchResponse{Body: resp.Body} if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_models.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "time" ) // AccessPolicy - An Access policy type AccessPolicy struct { // the date-time the policy expires Expiry *time.Time `xml:"Expiry"` // the permissions for the acl policy Permission *string `xml:"Permission"` // the date-time the policy is active Start *time.Time `xml:"Start"` } // ArrowConfiguration - Groups the settings used for formatting the response if the response should be Arrow formatted. type ArrowConfiguration struct { // REQUIRED Schema []*ArrowField `xml:"Schema>Field"` } // ArrowField - Groups settings regarding specific field of an arrow schema type ArrowField struct { // REQUIRED Type *string `xml:"Type"` Name *string `xml:"Name"` Precision *int32 `xml:"Precision"` Scale *int32 `xml:"Scale"` } type BlobFlatListSegment struct { // REQUIRED BlobItems []*BlobItem `xml:"Blob"` } type BlobHierarchyListSegment struct { // REQUIRED BlobItems []*BlobItem `xml:"Blob"` BlobPrefixes []*BlobPrefix `xml:"BlobPrefix"` } // BlobItem - An Azure Storage blob type BlobItem struct { // REQUIRED Deleted *bool `xml:"Deleted"` // REQUIRED Name *string `xml:"Name"` // REQUIRED; Properties of a blob Properties *BlobProperties `xml:"Properties"` // REQUIRED Snapshot *string `xml:"Snapshot"` // Blob tags BlobTags *BlobTags `xml:"Tags"` HasVersionsOnly *bool `xml:"HasVersionsOnly"` IsCurrentVersion *bool `xml:"IsCurrentVersion"` // Dictionary of Metadata map[string]*string `xml:"Metadata"` // Dictionary of OrMetadata map[string]*string `xml:"OrMetadata"` VersionID *string `xml:"VersionId"` } type BlobName struct { // The name of the blob. Content *string `xml:",chardata"` // Indicates if the blob name is encoded. Encoded *bool `xml:"Encoded,attr"` } type BlobPrefix struct { // REQUIRED Name *string `xml:"Name"` // Properties of a blob Properties *BlobProperties `xml:"Properties"` } // BlobProperties - Properties of a blob type BlobProperties struct { // REQUIRED ETag *azcore.ETag `xml:"Etag"` // REQUIRED LastModified *time.Time `xml:"Last-Modified"` ACL *string `xml:"Acl"` AccessTier *AccessTier `xml:"AccessTier"` AccessTierChangeTime *time.Time `xml:"AccessTierChangeTime"` AccessTierInferred *bool `xml:"AccessTierInferred"` ArchiveStatus *ArchiveStatus `xml:"ArchiveStatus"` BlobSequenceNumber *int64 `xml:"x-ms-blob-sequence-number"` BlobType *BlobType `xml:"BlobType"` CacheControl *string `xml:"Cache-Control"` ContentDisposition *string `xml:"Content-Disposition"` ContentEncoding *string `xml:"Content-Encoding"` ContentLanguage *string `xml:"Content-Language"` // Size in bytes ContentLength *int64 `xml:"Content-Length"` ContentMD5 []byte `xml:"Content-MD5"` ContentType *string `xml:"Content-Type"` CopyCompletionTime *time.Time `xml:"CopyCompletionTime"` CopyID *string `xml:"CopyId"` CopyProgress *string `xml:"CopyProgress"` CopySource *string `xml:"CopySource"` CopyStatus *CopyStatusType `xml:"CopyStatus"` CopyStatusDescription *string `xml:"CopyStatusDescription"` CreationTime *time.Time `xml:"Creation-Time"` CustomerProvidedKeySHA256 *string `xml:"CustomerProvidedKeySha256"` DeletedTime *time.Time `xml:"DeletedTime"` DestinationSnapshot *string `xml:"DestinationSnapshot"` // The name of the encryption scope under which the blob is encrypted. EncryptionScope *string `xml:"EncryptionScope"` ExpiresOn *time.Time `xml:"Expiry-Time"` Group *string `xml:"Group"` ImmutabilityPolicyExpiresOn *time.Time `xml:"ImmutabilityPolicyUntilDate"` ImmutabilityPolicyMode *ImmutabilityPolicyMode `xml:"ImmutabilityPolicyMode"` IncrementalCopy *bool `xml:"IncrementalCopy"` IsSealed *bool `xml:"Sealed"` LastAccessedOn *time.Time `xml:"LastAccessTime"` LeaseDuration *LeaseDurationType `xml:"LeaseDuration"` LeaseState *LeaseStateType `xml:"LeaseState"` LeaseStatus *LeaseStatusType `xml:"LeaseStatus"` LegalHold *bool `xml:"LegalHold"` Owner *string `xml:"Owner"` Permissions *string `xml:"Permissions"` // If an object is in rehydrate pending state then this header is returned with priority of rehydrate. Valid values are High // and Standard. RehydratePriority *RehydratePriority `xml:"RehydratePriority"` RemainingRetentionDays *int32 `xml:"RemainingRetentionDays"` ResourceType *string `xml:"ResourceType"` ServerEncrypted *bool `xml:"ServerEncrypted"` TagCount *int32 `xml:"TagCount"` } type BlobTag struct { // REQUIRED Key *string `xml:"Key"` // REQUIRED Value *string `xml:"Value"` } // BlobTags - Blob tags type BlobTags struct { // REQUIRED BlobTagSet []*BlobTag `xml:"TagSet>Tag"` } // Block - Represents a single block in a block blob. It describes the block's ID and size. type Block struct { // REQUIRED; The base64 encoded block ID. Name *string `xml:"Name"` // REQUIRED; The block size in bytes. Size *int64 `xml:"Size"` } type BlockList struct { CommittedBlocks []*Block `xml:"CommittedBlocks>Block"` UncommittedBlocks []*Block `xml:"UncommittedBlocks>Block"` } type BlockLookupList struct { Committed []*string `xml:"Committed"` Latest []*string `xml:"Latest"` Uncommitted []*string `xml:"Uncommitted"` } type ClearRange struct { // REQUIRED End *int64 `xml:"End"` // REQUIRED Start *int64 `xml:"Start"` } // ContainerItem - An Azure Storage container type ContainerItem struct { // REQUIRED Name *string `xml:"Name"` // REQUIRED; Properties of a container Properties *ContainerProperties `xml:"Properties"` Deleted *bool `xml:"Deleted"` // Dictionary of Metadata map[string]*string `xml:"Metadata"` Version *string `xml:"Version"` } // ContainerProperties - Properties of a container type ContainerProperties struct { // REQUIRED ETag *azcore.ETag `xml:"Etag"` // REQUIRED LastModified *time.Time `xml:"Last-Modified"` DefaultEncryptionScope *string `xml:"DefaultEncryptionScope"` DeletedTime *time.Time `xml:"DeletedTime"` HasImmutabilityPolicy *bool `xml:"HasImmutabilityPolicy"` HasLegalHold *bool `xml:"HasLegalHold"` // Indicates if version level worm is enabled on this container. IsImmutableStorageWithVersioningEnabled *bool `xml:"ImmutableStorageWithVersioningEnabled"` LeaseDuration *LeaseDurationType `xml:"LeaseDuration"` LeaseState *LeaseStateType `xml:"LeaseState"` LeaseStatus *LeaseStatusType `xml:"LeaseStatus"` PreventEncryptionScopeOverride *bool `xml:"DenyEncryptionScopeOverride"` PublicAccess *PublicAccessType `xml:"PublicAccess"` RemainingRetentionDays *int32 `xml:"RemainingRetentionDays"` } // CORSRule - CORS is an HTTP feature that enables a web application running under one domain to access resources in another // domain. Web browsers implement a security restriction known as same-origin policy that // prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain (the origin // domain) to call APIs in another domain type CORSRule struct { // REQUIRED; the request headers that the origin domain may specify on the CORS request. AllowedHeaders *string `xml:"AllowedHeaders"` // REQUIRED; The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma separated) AllowedMethods *string `xml:"AllowedMethods"` // REQUIRED; The origin domains that are permitted to make a request against the storage service via CORS. The origin domain // is the domain from which the request originates. Note that the origin must be an exact // case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' // to allow all origin domains to make requests via CORS. AllowedOrigins *string `xml:"AllowedOrigins"` // REQUIRED; The response headers that may be sent in the response to the CORS request and exposed by the browser to the request // issuer ExposedHeaders *string `xml:"ExposedHeaders"` // REQUIRED; The maximum amount time that a browser should cache the preflight OPTIONS request. MaxAgeInSeconds *int32 `xml:"MaxAgeInSeconds"` } // DelimitedTextConfiguration - Groups the settings used for interpreting the blob data if the blob is delimited text formatted. type DelimitedTextConfiguration struct { // The string used to separate columns. ColumnSeparator *string `xml:"ColumnSeparator"` // The string used as an escape character. EscapeChar *string `xml:"EscapeChar"` // The string used to quote a specific field. FieldQuote *string `xml:"FieldQuote"` // Represents whether the data has headers. HeadersPresent *bool `xml:"HasHeaders"` // The string used to separate records. RecordSeparator *string `xml:"RecordSeparator"` } // FilterBlobItem - Blob info from a Filter Blobs API call type FilterBlobItem struct { // REQUIRED ContainerName *string `xml:"ContainerName"` // REQUIRED Name *string `xml:"Name"` IsCurrentVersion *bool `xml:"IsCurrentVersion"` // Blob tags Tags *BlobTags `xml:"Tags"` VersionID *string `xml:"VersionId"` } // FilterBlobSegment - The result of a Filter Blobs API call type FilterBlobSegment struct { // REQUIRED Blobs []*FilterBlobItem `xml:"Blobs>Blob"` // REQUIRED ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` // REQUIRED Where *string `xml:"Where"` NextMarker *string `xml:"NextMarker"` } // GeoReplication - Geo-Replication information for the Secondary Storage Service type GeoReplication struct { // REQUIRED; A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available // for read operations at the secondary. Primary writes after this point in time may or may // not be available for reads. LastSyncTime *time.Time `xml:"LastSyncTime"` // REQUIRED; The status of the secondary location Status *BlobGeoReplicationStatus `xml:"Status"` } // JSONTextConfiguration - json text configuration type JSONTextConfiguration struct { // The string used to separate records. RecordSeparator *string `xml:"RecordSeparator"` } // KeyInfo - Key information type KeyInfo struct { // REQUIRED; The date-time the key expires in ISO 8601 UTC time Expiry *string `xml:"Expiry"` // REQUIRED; The date-time the key is active in ISO 8601 UTC time Start *string `xml:"Start"` } // ListBlobsFlatSegmentResponse - An enumeration of blobs type ListBlobsFlatSegmentResponse struct { // REQUIRED ContainerName *string `xml:"ContainerName,attr"` // REQUIRED Segment *BlobFlatListSegment `xml:"Blobs"` // REQUIRED ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` Marker *string `xml:"Marker"` MaxResults *int32 `xml:"MaxResults"` NextMarker *string `xml:"NextMarker"` Prefix *string `xml:"Prefix"` } // ListBlobsHierarchySegmentResponse - An enumeration of blobs type ListBlobsHierarchySegmentResponse struct { // REQUIRED ContainerName *string `xml:"ContainerName,attr"` // REQUIRED Segment *BlobHierarchyListSegment `xml:"Blobs"` // REQUIRED ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` Delimiter *string `xml:"Delimiter"` Marker *string `xml:"Marker"` MaxResults *int32 `xml:"MaxResults"` NextMarker *string `xml:"NextMarker"` Prefix *string `xml:"Prefix"` } // ListContainersSegmentResponse - An enumeration of containers type ListContainersSegmentResponse struct { // REQUIRED ContainerItems []*ContainerItem `xml:"Containers>Container"` // REQUIRED ServiceEndpoint *string `xml:"ServiceEndpoint,attr"` Marker *string `xml:"Marker"` MaxResults *int32 `xml:"MaxResults"` NextMarker *string `xml:"NextMarker"` Prefix *string `xml:"Prefix"` } // Logging - Azure Analytics Logging settings. type Logging struct { // REQUIRED; Indicates whether all delete requests should be logged. Delete *bool `xml:"Delete"` // REQUIRED; Indicates whether all read requests should be logged. Read *bool `xml:"Read"` // REQUIRED; the retention policy which determines how long the associated data should persist RetentionPolicy *RetentionPolicy `xml:"RetentionPolicy"` // REQUIRED; The version of Storage Analytics to configure. Version *string `xml:"Version"` // REQUIRED; Indicates whether all write requests should be logged. Write *bool `xml:"Write"` } // Metrics - a summary of request statistics grouped by API in hour or minute aggregates for blobs type Metrics struct { // REQUIRED; Indicates whether metrics are enabled for the Blob service. Enabled *bool `xml:"Enabled"` // Indicates whether metrics should generate summary statistics for called API operations. IncludeAPIs *bool `xml:"IncludeAPIs"` // the retention policy which determines how long the associated data should persist RetentionPolicy *RetentionPolicy `xml:"RetentionPolicy"` // The version of Storage Analytics to configure. Version *string `xml:"Version"` } // PageList - the list of pages type PageList struct { ClearRange []*ClearRange `xml:"ClearRange"` NextMarker *string `xml:"NextMarker"` PageRange []*PageRange `xml:"PageRange"` } type PageRange struct { // REQUIRED End *int64 `xml:"End"` // REQUIRED Start *int64 `xml:"Start"` } type QueryFormat struct { // REQUIRED; The quick query format type. Type *QueryFormatType `xml:"Type"` // Groups the settings used for formatting the response if the response should be Arrow formatted. ArrowConfiguration *ArrowConfiguration `xml:"ArrowConfiguration"` // Groups the settings used for interpreting the blob data if the blob is delimited text formatted. DelimitedTextConfiguration *DelimitedTextConfiguration `xml:"DelimitedTextConfiguration"` // json text configuration JSONTextConfiguration *JSONTextConfiguration `xml:"JsonTextConfiguration"` // parquet configuration ParquetTextConfiguration any `xml:"ParquetTextConfiguration"` } // QueryRequest - Groups the set of query request settings. type QueryRequest struct { // REQUIRED; The query expression in SQL. The maximum size of the query expression is 256KiB. Expression *string `xml:"Expression"` // CONSTANT; Required. The type of the provided query expression. // Field has constant value "SQL", any specified value is ignored. QueryType *string `xml:"QueryType"` InputSerialization *QuerySerialization `xml:"InputSerialization"` OutputSerialization *QuerySerialization `xml:"OutputSerialization"` } type QuerySerialization struct { // REQUIRED Format *QueryFormat `xml:"Format"` } // RetentionPolicy - the retention policy which determines how long the associated data should persist type RetentionPolicy struct { // REQUIRED; Indicates whether a retention policy is enabled for the storage service Enabled *bool `xml:"Enabled"` // Indicates whether permanent delete is allowed on this storage account. AllowPermanentDelete *bool `xml:"AllowPermanentDelete"` // Indicates the number of days that metrics or logging or soft-deleted data should be retained. All data older than this // value will be deleted Days *int32 `xml:"Days"` } // SignedIdentifier - signed identifier type SignedIdentifier struct { // REQUIRED; An Access policy AccessPolicy *AccessPolicy `xml:"AccessPolicy"` // REQUIRED; a unique id ID *string `xml:"Id"` } // StaticWebsite - The properties that enable an account to host a static website type StaticWebsite struct { // REQUIRED; Indicates whether this account is hosting a static website Enabled *bool `xml:"Enabled"` // Absolute path of the default index page DefaultIndexDocumentPath *string `xml:"DefaultIndexDocumentPath"` // The absolute path of the custom 404 page ErrorDocument404Path *string `xml:"ErrorDocument404Path"` // The default name of the index page under each directory IndexDocument *string `xml:"IndexDocument"` } type StorageError struct { Message *string } // StorageServiceProperties - Storage Service Properties. type StorageServiceProperties struct { // The set of CORS rules. CORS []*CORSRule `xml:"Cors>CorsRule"` // The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible // values include version 2008-10-27 and all more recent versions DefaultServiceVersion *string `xml:"DefaultServiceVersion"` // the retention policy which determines how long the associated data should persist DeleteRetentionPolicy *RetentionPolicy `xml:"DeleteRetentionPolicy"` // a summary of request statistics grouped by API in hour or minute aggregates for blobs HourMetrics *Metrics `xml:"HourMetrics"` // Azure Analytics Logging settings. Logging *Logging `xml:"Logging"` // a summary of request statistics grouped by API in hour or minute aggregates for blobs MinuteMetrics *Metrics `xml:"MinuteMetrics"` // The properties that enable an account to host a static website StaticWebsite *StaticWebsite `xml:"StaticWebsite"` } // StorageServiceStats - Stats for the storage service. type StorageServiceStats struct { // Geo-Replication information for the Secondary Storage Service GeoReplication *GeoReplication `xml:"GeoReplication"` } // UserDelegationKey - A user delegation key type UserDelegationKey struct { // REQUIRED; The date-time the key expires SignedExpiry *time.Time `xml:"SignedExpiry"` // REQUIRED; The Azure Active Directory object ID in GUID format. SignedOID *string `xml:"SignedOid"` // REQUIRED; Abbreviation of the Azure Storage service that accepts the key SignedService *string `xml:"SignedService"` // REQUIRED; The date-time the key is active SignedStart *time.Time `xml:"SignedStart"` // REQUIRED; The Azure Active Directory tenant ID in GUID format SignedTID *string `xml:"SignedTid"` // REQUIRED; The service version that created the key SignedVersion *string `xml:"SignedVersion"` // REQUIRED; The key as a base64 string Value *string `xml:"Value"` } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_models_serde.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "encoding/json" "encoding/xml" "fmt" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "reflect" "time" ) // MarshalXML implements the xml.Marshaller interface for type AccessPolicy. func (a AccessPolicy) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias AccessPolicy aux := &struct { *alias Expiry *dateTimeRFC3339 `xml:"Expiry"` Start *dateTimeRFC3339 `xml:"Start"` }{ alias: (*alias)(&a), Expiry: (*dateTimeRFC3339)(a.Expiry), Start: (*dateTimeRFC3339)(a.Start), } return enc.EncodeElement(aux, start) } // UnmarshalXML implements the xml.Unmarshaller interface for type AccessPolicy. func (a *AccessPolicy) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error { type alias AccessPolicy aux := &struct { *alias Expiry *dateTimeRFC3339 `xml:"Expiry"` Start *dateTimeRFC3339 `xml:"Start"` }{ alias: (*alias)(a), } if err := dec.DecodeElement(aux, &start); err != nil { return err } if aux.Expiry != nil && !(*time.Time)(aux.Expiry).IsZero() { a.Expiry = (*time.Time)(aux.Expiry) } if aux.Start != nil && !(*time.Time)(aux.Start).IsZero() { a.Start = (*time.Time)(aux.Start) } return nil } // MarshalXML implements the xml.Marshaller interface for type ArrowConfiguration. func (a ArrowConfiguration) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias ArrowConfiguration aux := &struct { *alias Schema *[]*ArrowField `xml:"Schema>Field"` }{ alias: (*alias)(&a), } if a.Schema != nil { aux.Schema = &a.Schema } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type BlobFlatListSegment. func (b BlobFlatListSegment) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias BlobFlatListSegment aux := &struct { *alias BlobItems *[]*BlobItem `xml:"Blob"` }{ alias: (*alias)(&b), } if b.BlobItems != nil { aux.BlobItems = &b.BlobItems } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type BlobHierarchyListSegment. func (b BlobHierarchyListSegment) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias BlobHierarchyListSegment aux := &struct { *alias BlobItems *[]*BlobItem `xml:"Blob"` BlobPrefixes *[]*BlobPrefix `xml:"BlobPrefix"` }{ alias: (*alias)(&b), } if b.BlobItems != nil { aux.BlobItems = &b.BlobItems } if b.BlobPrefixes != nil { aux.BlobPrefixes = &b.BlobPrefixes } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type BlobProperties. func (b BlobProperties) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias BlobProperties aux := &struct { *alias AccessTierChangeTime *dateTimeRFC1123 `xml:"AccessTierChangeTime"` ContentMD5 *string `xml:"Content-MD5"` CopyCompletionTime *dateTimeRFC1123 `xml:"CopyCompletionTime"` CreationTime *dateTimeRFC1123 `xml:"Creation-Time"` DeletedTime *dateTimeRFC1123 `xml:"DeletedTime"` ExpiresOn *dateTimeRFC1123 `xml:"Expiry-Time"` ImmutabilityPolicyExpiresOn *dateTimeRFC1123 `xml:"ImmutabilityPolicyUntilDate"` LastAccessedOn *dateTimeRFC1123 `xml:"LastAccessTime"` LastModified *dateTimeRFC1123 `xml:"Last-Modified"` }{ alias: (*alias)(&b), AccessTierChangeTime: (*dateTimeRFC1123)(b.AccessTierChangeTime), CopyCompletionTime: (*dateTimeRFC1123)(b.CopyCompletionTime), CreationTime: (*dateTimeRFC1123)(b.CreationTime), DeletedTime: (*dateTimeRFC1123)(b.DeletedTime), ExpiresOn: (*dateTimeRFC1123)(b.ExpiresOn), ImmutabilityPolicyExpiresOn: (*dateTimeRFC1123)(b.ImmutabilityPolicyExpiresOn), LastAccessedOn: (*dateTimeRFC1123)(b.LastAccessedOn), LastModified: (*dateTimeRFC1123)(b.LastModified), } if b.ContentMD5 != nil { encodedContentMD5 := runtime.EncodeByteArray(b.ContentMD5, runtime.Base64StdFormat) aux.ContentMD5 = &encodedContentMD5 } return enc.EncodeElement(aux, start) } // UnmarshalXML implements the xml.Unmarshaller interface for type BlobProperties. func (b *BlobProperties) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error { type alias BlobProperties aux := &struct { *alias AccessTierChangeTime *dateTimeRFC1123 `xml:"AccessTierChangeTime"` ContentMD5 *string `xml:"Content-MD5"` CopyCompletionTime *dateTimeRFC1123 `xml:"CopyCompletionTime"` CreationTime *dateTimeRFC1123 `xml:"Creation-Time"` DeletedTime *dateTimeRFC1123 `xml:"DeletedTime"` ExpiresOn *dateTimeRFC1123 `xml:"Expiry-Time"` ImmutabilityPolicyExpiresOn *dateTimeRFC1123 `xml:"ImmutabilityPolicyUntilDate"` LastAccessedOn *dateTimeRFC1123 `xml:"LastAccessTime"` LastModified *dateTimeRFC1123 `xml:"Last-Modified"` }{ alias: (*alias)(b), } if err := dec.DecodeElement(aux, &start); err != nil { return err } if aux.AccessTierChangeTime != nil && !(*time.Time)(aux.AccessTierChangeTime).IsZero() { b.AccessTierChangeTime = (*time.Time)(aux.AccessTierChangeTime) } if aux.ContentMD5 != nil { if err := runtime.DecodeByteArray(*aux.ContentMD5, &b.ContentMD5, runtime.Base64StdFormat); err != nil { return err } } if aux.CopyCompletionTime != nil && !(*time.Time)(aux.CopyCompletionTime).IsZero() { b.CopyCompletionTime = (*time.Time)(aux.CopyCompletionTime) } if aux.CreationTime != nil && !(*time.Time)(aux.CreationTime).IsZero() { b.CreationTime = (*time.Time)(aux.CreationTime) } if aux.DeletedTime != nil && !(*time.Time)(aux.DeletedTime).IsZero() { b.DeletedTime = (*time.Time)(aux.DeletedTime) } if aux.ExpiresOn != nil && !(*time.Time)(aux.ExpiresOn).IsZero() { b.ExpiresOn = (*time.Time)(aux.ExpiresOn) } if aux.ImmutabilityPolicyExpiresOn != nil && !(*time.Time)(aux.ImmutabilityPolicyExpiresOn).IsZero() { b.ImmutabilityPolicyExpiresOn = (*time.Time)(aux.ImmutabilityPolicyExpiresOn) } if aux.LastAccessedOn != nil && !(*time.Time)(aux.LastAccessedOn).IsZero() { b.LastAccessedOn = (*time.Time)(aux.LastAccessedOn) } if aux.LastModified != nil && !(*time.Time)(aux.LastModified).IsZero() { b.LastModified = (*time.Time)(aux.LastModified) } return nil } // MarshalXML implements the xml.Marshaller interface for type BlobTags. func (b BlobTags) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { start.Name.Local = "Tags" type alias BlobTags aux := &struct { *alias BlobTagSet *[]*BlobTag `xml:"TagSet>Tag"` }{ alias: (*alias)(&b), } if b.BlobTagSet != nil { aux.BlobTagSet = &b.BlobTagSet } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type BlockList. func (b BlockList) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias BlockList aux := &struct { *alias CommittedBlocks *[]*Block `xml:"CommittedBlocks>Block"` UncommittedBlocks *[]*Block `xml:"UncommittedBlocks>Block"` }{ alias: (*alias)(&b), } if b.CommittedBlocks != nil { aux.CommittedBlocks = &b.CommittedBlocks } if b.UncommittedBlocks != nil { aux.UncommittedBlocks = &b.UncommittedBlocks } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type BlockLookupList. func (b BlockLookupList) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { start.Name.Local = "BlockList" type alias BlockLookupList aux := &struct { *alias Committed *[]*string `xml:"Committed"` Latest *[]*string `xml:"Latest"` Uncommitted *[]*string `xml:"Uncommitted"` }{ alias: (*alias)(&b), } if b.Committed != nil { aux.Committed = &b.Committed } if b.Latest != nil { aux.Latest = &b.Latest } if b.Uncommitted != nil { aux.Uncommitted = &b.Uncommitted } return enc.EncodeElement(aux, start) } // UnmarshalXML implements the xml.Unmarshaller interface for type ContainerItem. func (c *ContainerItem) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error { type alias ContainerItem aux := &struct { *alias Metadata additionalProperties `xml:"Metadata"` }{ alias: (*alias)(c), } if err := dec.DecodeElement(aux, &start); err != nil { return err } c.Metadata = (map[string]*string)(aux.Metadata) return nil } // MarshalXML implements the xml.Marshaller interface for type ContainerProperties. func (c ContainerProperties) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias ContainerProperties aux := &struct { *alias DeletedTime *dateTimeRFC1123 `xml:"DeletedTime"` LastModified *dateTimeRFC1123 `xml:"Last-Modified"` }{ alias: (*alias)(&c), DeletedTime: (*dateTimeRFC1123)(c.DeletedTime), LastModified: (*dateTimeRFC1123)(c.LastModified), } return enc.EncodeElement(aux, start) } // UnmarshalXML implements the xml.Unmarshaller interface for type ContainerProperties. func (c *ContainerProperties) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error { type alias ContainerProperties aux := &struct { *alias DeletedTime *dateTimeRFC1123 `xml:"DeletedTime"` LastModified *dateTimeRFC1123 `xml:"Last-Modified"` }{ alias: (*alias)(c), } if err := dec.DecodeElement(aux, &start); err != nil { return err } if aux.DeletedTime != nil && !(*time.Time)(aux.DeletedTime).IsZero() { c.DeletedTime = (*time.Time)(aux.DeletedTime) } if aux.LastModified != nil && !(*time.Time)(aux.LastModified).IsZero() { c.LastModified = (*time.Time)(aux.LastModified) } return nil } // MarshalXML implements the xml.Marshaller interface for type FilterBlobSegment. func (f FilterBlobSegment) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias FilterBlobSegment aux := &struct { *alias Blobs *[]*FilterBlobItem `xml:"Blobs>Blob"` }{ alias: (*alias)(&f), } if f.Blobs != nil { aux.Blobs = &f.Blobs } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type GeoReplication. func (g GeoReplication) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias GeoReplication aux := &struct { *alias LastSyncTime *dateTimeRFC1123 `xml:"LastSyncTime"` }{ alias: (*alias)(&g), LastSyncTime: (*dateTimeRFC1123)(g.LastSyncTime), } return enc.EncodeElement(aux, start) } // UnmarshalXML implements the xml.Unmarshaller interface for type GeoReplication. func (g *GeoReplication) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error { type alias GeoReplication aux := &struct { *alias LastSyncTime *dateTimeRFC1123 `xml:"LastSyncTime"` }{ alias: (*alias)(g), } if err := dec.DecodeElement(aux, &start); err != nil { return err } if aux.LastSyncTime != nil && !(*time.Time)(aux.LastSyncTime).IsZero() { g.LastSyncTime = (*time.Time)(aux.LastSyncTime) } return nil } // MarshalXML implements the xml.Marshaller interface for type ListContainersSegmentResponse. func (l ListContainersSegmentResponse) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias ListContainersSegmentResponse aux := &struct { *alias ContainerItems *[]*ContainerItem `xml:"Containers>Container"` }{ alias: (*alias)(&l), } if l.ContainerItems != nil { aux.ContainerItems = &l.ContainerItems } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type PageList. func (p PageList) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias PageList aux := &struct { *alias ClearRange *[]*ClearRange `xml:"ClearRange"` PageRange *[]*PageRange `xml:"PageRange"` }{ alias: (*alias)(&p), } if p.ClearRange != nil { aux.ClearRange = &p.ClearRange } if p.PageRange != nil { aux.PageRange = &p.PageRange } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type QueryRequest. func (q QueryRequest) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { start.Name.Local = "QueryRequest" type alias QueryRequest aux := &struct { *alias }{ alias: (*alias)(&q), } return enc.EncodeElement(aux, start) } // MarshalJSON implements the json.Marshaller interface for type StorageError. func (s StorageError) MarshalJSON() ([]byte, error) { objectMap := make(map[string]any) populate(objectMap, "Message", s.Message) return json.Marshal(objectMap) } // UnmarshalJSON implements the json.Unmarshaller interface for type StorageError. func (s *StorageError) UnmarshalJSON(data []byte) error { var rawMsg map[string]json.RawMessage if err := json.Unmarshal(data, &rawMsg); err != nil { return fmt.Errorf("unmarshalling type %T: %v", s, err) } for key, val := range rawMsg { var err error switch key { case "Message": err = unpopulate(val, "Message", &s.Message) delete(rawMsg, key) } if err != nil { return fmt.Errorf("unmarshalling type %T: %v", s, err) } } return nil } // MarshalXML implements the xml.Marshaller interface for type StorageServiceProperties. func (s StorageServiceProperties) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias StorageServiceProperties aux := &struct { *alias CORS *[]*CORSRule `xml:"Cors>CorsRule"` }{ alias: (*alias)(&s), } if s.CORS != nil { aux.CORS = &s.CORS } return enc.EncodeElement(aux, start) } // MarshalXML implements the xml.Marshaller interface for type UserDelegationKey. func (u UserDelegationKey) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { type alias UserDelegationKey aux := &struct { *alias SignedExpiry *dateTimeRFC3339 `xml:"SignedExpiry"` SignedStart *dateTimeRFC3339 `xml:"SignedStart"` }{ alias: (*alias)(&u), SignedExpiry: (*dateTimeRFC3339)(u.SignedExpiry), SignedStart: (*dateTimeRFC3339)(u.SignedStart), } return enc.EncodeElement(aux, start) } // UnmarshalXML implements the xml.Unmarshaller interface for type UserDelegationKey. func (u *UserDelegationKey) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error { type alias UserDelegationKey aux := &struct { *alias SignedExpiry *dateTimeRFC3339 `xml:"SignedExpiry"` SignedStart *dateTimeRFC3339 `xml:"SignedStart"` }{ alias: (*alias)(u), } if err := dec.DecodeElement(aux, &start); err != nil { return err } if aux.SignedExpiry != nil && !(*time.Time)(aux.SignedExpiry).IsZero() { u.SignedExpiry = (*time.Time)(aux.SignedExpiry) } if aux.SignedStart != nil && !(*time.Time)(aux.SignedStart).IsZero() { u.SignedStart = (*time.Time)(aux.SignedStart) } return nil } func populate(m map[string]any, k string, v any) { if v == nil { return } else if azcore.IsNullValue(v) { m[k] = nil } else if !reflect.ValueOf(v).IsNil() { m[k] = v } } func unpopulate(data json.RawMessage, fn string, v any) error { if data == nil || string(data) == "null" { return nil } if err := json.Unmarshal(data, v); err != nil { return fmt.Errorf("struct field %s: %v", fn, err) } return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_options.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "time" ) // AppendBlobClientAppendBlockFromURLOptions contains the optional parameters for the AppendBlobClient.AppendBlockFromURL // method. type AppendBlobClientAppendBlockFromURLOptions struct { // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. SourceContentMD5 []byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. SourceContentcrc64 []byte // Bytes of source data in the specified range. SourceRange *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // Specify the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte } // AppendBlobClientAppendBlockOptions contains the optional parameters for the AppendBlobClient.AppendBlock method. type AppendBlobClientAppendBlockOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Required if the request body is a structured message. Specifies the message schema version and properties. StructuredBodyType *string // Required if the request body is a structured message. Specifies the length of the blob/file content inside the message // body. Will always be smaller than Content-Length. StructuredContentLength *int64 // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. TransactionalContentCRC64 []byte // Specify the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte } // AppendBlobClientCreateOptions contains the optional parameters for the AppendBlobClient.Create method. type AppendBlobClientCreateOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // AppendBlobClientSealOptions contains the optional parameters for the AppendBlobClient.Seal method. type AppendBlobClientSealOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // AppendPositionAccessConditions contains a group of parameters for the AppendBlobClient.AppendBlock method. type AppendPositionAccessConditions struct { // Optional conditional header, used only for the Append Block operation. A number indicating the byte offset to compare. // Append Block will succeed only if the append position is equal to this number. If // it is not, the request will fail with the AppendPositionConditionNotMet error (HTTP status code 412 - Precondition Failed). AppendPosition *int64 // Optional conditional header. The max length in bytes permitted for the append blob. If the Append Block operation would // cause the blob to exceed that limit or if the blob size is already greater than // the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error (HTTP status code 412 - // Precondition Failed). MaxSize *int64 } // BlobClientAbortCopyFromURLOptions contains the optional parameters for the BlobClient.AbortCopyFromURL method. type BlobClientAbortCopyFromURLOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientAcquireLeaseOptions contains the optional parameters for the BlobClient.AcquireLease method. type BlobClientAcquireLeaseOptions struct { // Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is // not in the correct format. See Guid Constructor (String) for a list of valid GUID // string formats. ProposedLeaseID *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientBreakLeaseOptions contains the optional parameters for the BlobClient.BreakLease method. type BlobClientBreakLeaseOptions struct { // For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This // break period is only used if it is shorter than the time remaining on the // lease. If longer, the time remaining on the lease is used. A new lease will not be available before the break period has // expired, but the lease may be held for longer than the break period. If this // header does not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, // and an infinite lease breaks immediately. BreakPeriod *int32 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientChangeLeaseOptions contains the optional parameters for the BlobClient.ChangeLease method. type BlobClientChangeLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientCopyFromURLOptions contains the optional parameters for the BlobClient.CopyFromURL method. type BlobClientCopyFromURLOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // Optional, default 'replace'. Indicates if source tags should be copied or replaced with the tags specified by x-ms-tags. CopySourceTags *BlobCopySourceTags // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. SourceContentMD5 []byte // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientCreateSnapshotOptions contains the optional parameters for the BlobClient.CreateSnapshot method. type BlobClientCreateSnapshotOptions struct { // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientDeleteImmutabilityPolicyOptions contains the optional parameters for the BlobClient.DeleteImmutabilityPolicy // method. type BlobClientDeleteImmutabilityPolicyOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientDeleteOptions contains the optional parameters for the BlobClient.Delete method. type BlobClientDeleteOptions struct { // Required if the blob has associated snapshots. Specify one of the following two options: include: Delete the base blob // and all of its snapshots. only: Delete only the blob's snapshots and not the blob // itself DeleteSnapshots *DeleteSnapshotsOptionType // Optional. Only possible value is 'permanent', which specifies to permanently delete a blob if blob soft delete is enabled. DeleteType *DeleteType // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientDownloadOptions contains the optional parameters for the BlobClient.Download method. type BlobClientDownloadOptions struct { // Return only the bytes of the blob in the specified range. Range *string // When set to true and specified together with the Range, the service returns the CRC64 hash for the range, as long as the // range is less than or equal to 4 MB in size. RangeGetContentCRC64 *bool // When set to true and specified together with the Range, the service returns the MD5 hash for the range, as long as the // range is less than or equal to 4 MB in size. RangeGetContentMD5 *bool // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // Specifies the response content should be returned as a structured message and specifies the message schema version and // properties. StructuredBodyType *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientGetAccountInfoOptions contains the optional parameters for the BlobClient.GetAccountInfo method. type BlobClientGetAccountInfoOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientGetPropertiesOptions contains the optional parameters for the BlobClient.GetProperties method. type BlobClientGetPropertiesOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientGetTagsOptions contains the optional parameters for the BlobClient.GetTags method. type BlobClientGetTagsOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientQueryOptions contains the optional parameters for the BlobClient.Query method. type BlobClientQueryOptions struct { // the query request QueryRequest *QueryRequest // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientReleaseLeaseOptions contains the optional parameters for the BlobClient.ReleaseLease method. type BlobClientReleaseLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientRenewLeaseOptions contains the optional parameters for the BlobClient.RenewLease method. type BlobClientRenewLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientSetExpiryOptions contains the optional parameters for the BlobClient.SetExpiry method. type BlobClientSetExpiryOptions struct { // The time to set the blob to expiry ExpiresOn *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientSetHTTPHeadersOptions contains the optional parameters for the BlobClient.SetHTTPHeaders method. type BlobClientSetHTTPHeadersOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientSetImmutabilityPolicyOptions contains the optional parameters for the BlobClient.SetImmutabilityPolicy method. type BlobClientSetImmutabilityPolicyOptions struct { // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientSetLegalHoldOptions contains the optional parameters for the BlobClient.SetLegalHold method. type BlobClientSetLegalHoldOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientSetMetadataOptions contains the optional parameters for the BlobClient.SetMetadata method. type BlobClientSetMetadataOptions struct { // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientSetTagsOptions contains the optional parameters for the BlobClient.SetTags method. type BlobClientSetTagsOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. TransactionalContentCRC64 []byte // Specify the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientSetTierOptions contains the optional parameters for the BlobClient.SetTier method. type BlobClientSetTierOptions struct { // Optional: Indicates the priority with which to rehydrate an archived blob. RehydratePriority *RehydratePriority // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // The version id parameter is an opaque DateTime value that, when present, specifies the version of the blob to operate on. // It's for service version 2019-10-10 and newer. VersionID *string } // BlobClientStartCopyFromURLOptions contains the optional parameters for the BlobClient.StartCopyFromURL method. type BlobClientStartCopyFromURLOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Optional: Indicates the priority with which to rehydrate an archived blob. RehydratePriority *RehydratePriority // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer. SealBlob *bool // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobClientUndeleteOptions contains the optional parameters for the BlobClient.Undelete method. type BlobClientUndeleteOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method. type BlobHTTPHeaders struct { // Optional. Sets the blob's cache control. If specified, this property is stored with the blob and returned with a read request. BlobCacheControl *string // Optional. Sets the blob's Content-Disposition header. BlobContentDisposition *string // Optional. Sets the blob's content encoding. If specified, this property is stored with the blob and returned with a read // request. BlobContentEncoding *string // Optional. Set the blob's content language. If specified, this property is stored with the blob and returned with a read // request. BlobContentLanguage *string // Optional. An MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual blocks // were validated when each was uploaded. BlobContentMD5 []byte // Optional. Sets the blob's content type. If specified, this property is stored with the blob and returned with a read request. BlobContentType *string } // BlockBlobClientCommitBlockListOptions contains the optional parameters for the BlockBlobClient.CommitBlockList method. type BlockBlobClientCommitBlockListOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. TransactionalContentCRC64 []byte // Specify the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte } // BlockBlobClientGetBlockListOptions contains the optional parameters for the BlockBlobClient.GetBlockList method. type BlockBlobClientGetBlockListOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlockBlobClientPutBlobFromURLOptions contains the optional parameters for the BlockBlobClient.PutBlobFromURL method. type BlockBlobClientPutBlobFromURLOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // Optional, default is true. Indicates if properties from the source blob should be copied. CopySourceBlobProperties *bool // Optional, default 'replace'. Indicates if source tags should be copied or replaced with the tags specified by x-ms-tags. CopySourceTags *BlobCopySourceTags // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. SourceContentMD5 []byte // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // Specify the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte } // BlockBlobClientStageBlockFromURLOptions contains the optional parameters for the BlockBlobClient.StageBlockFromURL method. type BlockBlobClientStageBlockFromURLOptions struct { // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. SourceContentMD5 []byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. SourceContentcrc64 []byte // Bytes of source data in the specified range. SourceRange *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // BlockBlobClientStageBlockOptions contains the optional parameters for the BlockBlobClient.StageBlock method. type BlockBlobClientStageBlockOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Required if the request body is a structured message. Specifies the message schema version and properties. StructuredBodyType *string // Required if the request body is a structured message. Specifies the length of the blob/file content inside the message // body. Will always be smaller than Content-Length. StructuredContentLength *int64 // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. TransactionalContentCRC64 []byte // Specify the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte } // BlockBlobClientUploadOptions contains the optional parameters for the BlockBlobClient.Upload method. type BlockBlobClientUploadOptions struct { // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Required if the request body is a structured message. Specifies the message schema version and properties. StructuredBodyType *string // Required if the request body is a structured message. Specifies the length of the blob/file content inside the message // body. Will always be smaller than Content-Length. StructuredContentLength *int64 // Optional. Indicates the tier to be set on the blob. Tier *AccessTier // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. TransactionalContentCRC64 []byte // Specify the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte } // ContainerClientAcquireLeaseOptions contains the optional parameters for the ContainerClient.AcquireLease method. type ContainerClientAcquireLeaseOptions struct { // Proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the proposed lease ID is // not in the correct format. See Guid Constructor (String) for a list of valid GUID // string formats. ProposedLeaseID *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientBreakLeaseOptions contains the optional parameters for the ContainerClient.BreakLease method. type ContainerClientBreakLeaseOptions struct { // For a break operation, proposed duration the lease should continue before it is broken, in seconds, between 0 and 60. This // break period is only used if it is shorter than the time remaining on the // lease. If longer, the time remaining on the lease is used. A new lease will not be available before the break period has // expired, but the lease may be held for longer than the break period. If this // header does not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, // and an infinite lease breaks immediately. BreakPeriod *int32 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientChangeLeaseOptions contains the optional parameters for the ContainerClient.ChangeLease method. type ContainerClientChangeLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientCreateOptions contains the optional parameters for the ContainerClient.Create method. type ContainerClientCreateOptions struct { // Specifies whether data in the container may be accessed publicly and the level of access Access *PublicAccessType // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientDeleteOptions contains the optional parameters for the ContainerClient.Delete method. type ContainerClientDeleteOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientFilterBlobsOptions contains the optional parameters for the ContainerClient.FilterBlobs method. type ContainerClientFilterBlobsOptions struct { // Include this parameter to specify one or more datasets to include in the response. Include []FilterBlobsIncludeItem // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. Maxresults *int32 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientGetAccessPolicyOptions contains the optional parameters for the ContainerClient.GetAccessPolicy method. type ContainerClientGetAccessPolicyOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientGetAccountInfoOptions contains the optional parameters for the ContainerClient.GetAccountInfo method. type ContainerClientGetAccountInfoOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientGetPropertiesOptions contains the optional parameters for the ContainerClient.GetProperties method. type ContainerClientGetPropertiesOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientListBlobFlatSegmentOptions contains the optional parameters for the ContainerClient.NewListBlobFlatSegmentPager // method. type ContainerClientListBlobFlatSegmentOptions struct { // Include this parameter to specify one or more datasets to include in the response. Include []ListBlobsIncludeItem // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. Maxresults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientListBlobHierarchySegmentOptions contains the optional parameters for the ContainerClient.NewListBlobHierarchySegmentPager // method. type ContainerClientListBlobHierarchySegmentOptions struct { // Include this parameter to specify one or more datasets to include in the response. Include []ListBlobsIncludeItem // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. Maxresults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientReleaseLeaseOptions contains the optional parameters for the ContainerClient.ReleaseLease method. type ContainerClientReleaseLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientRenameOptions contains the optional parameters for the ContainerClient.Rename method. type ContainerClientRenameOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // A lease ID for the source path. If specified, the source path must have an active lease and the lease ID must match. SourceLeaseID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientRenewLeaseOptions contains the optional parameters for the ContainerClient.RenewLease method. type ContainerClientRenewLeaseOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientRestoreOptions contains the optional parameters for the ContainerClient.Restore method. type ContainerClientRestoreOptions struct { // Optional. Version 2019-12-12 and later. Specifies the name of the deleted container to restore. DeletedContainerName *string // Optional. Version 2019-12-12 and later. Specifies the version of the deleted container to restore. DeletedContainerVersion *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientSetAccessPolicyOptions contains the optional parameters for the ContainerClient.SetAccessPolicy method. type ContainerClientSetAccessPolicyOptions struct { // Specifies whether data in the container may be accessed publicly and the level of access Access *PublicAccessType // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientSetMetadataOptions contains the optional parameters for the ContainerClient.SetMetadata method. type ContainerClientSetMetadataOptions struct { // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerClientSubmitBatchOptions contains the optional parameters for the ContainerClient.SubmitBatch method. type ContainerClientSubmitBatchOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ContainerCPKScopeInfo contains a group of parameters for the ContainerClient.Create method. type ContainerCPKScopeInfo struct { // Optional. Version 2019-07-07 and later. Specifies the default encryption scope to set on the container and use for all // future writes. DefaultEncryptionScope *string // Optional. Version 2019-07-07 and newer. If true, prevents any request from specifying a different encryption scope than // the scope set on the container. PreventEncryptionScopeOverride *bool } // CPKInfo contains a group of parameters for the BlobClient.Download method. type CPKInfo struct { // The algorithm used to produce the encryption key hash. Currently, the only accepted value is "AES256". Must be provided // if the x-ms-encryption-key header is provided. EncryptionAlgorithm *EncryptionAlgorithmType // Optional. Specifies the encryption key to use to encrypt the data provided in the request. If not specified, encryption // is performed with the root account encryption key. For more information, see // Encryption at Rest for Azure Storage Services. EncryptionKey *string // The SHA-256 hash of the provided encryption key. Must be provided if the x-ms-encryption-key header is provided. EncryptionKeySHA256 *string } // CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. type CPKScopeInfo struct { // Optional. Version 2019-07-07 and later. Specifies the name of the encryption scope to use to encrypt the data provided // in the request. If not specified, encryption is performed with the default // account encryption scope. For more information, see Encryption at Rest for Azure Storage Services. EncryptionScope *string } // LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. type LeaseAccessConditions struct { // If specified, the operation only succeeds if the resource's lease is active and matches this ID. LeaseID *string } // ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. type ModifiedAccessConditions struct { // Specify an ETag value to operate only on blobs with a matching value. IfMatch *azcore.ETag // Specify this header value to operate only on a blob if it has been modified since the specified date/time. IfModifiedSince *time.Time // Specify an ETag value to operate only on blobs without a matching value. IfNoneMatch *azcore.ETag // Specify a SQL where clause on blob tags to operate only on blobs with a matching value. IfTags *string // Specify this header value to operate only on a blob if it has not been modified since the specified date/time. IfUnmodifiedSince *time.Time } // PageBlobClientClearPagesOptions contains the optional parameters for the PageBlobClient.ClearPages method. type PageBlobClientClearPagesOptions struct { // Return only the bytes of the blob in the specified range. Range *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // PageBlobClientCopyIncrementalOptions contains the optional parameters for the PageBlobClient.CopyIncremental method. type PageBlobClientCopyIncrementalOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // PageBlobClientCreateOptions contains the optional parameters for the PageBlobClient.Create method. type PageBlobClientCreateOptions struct { // Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of // the sequence number must be between 0 and 2^63 - 1. BlobSequenceNumber *int64 // Optional. Used to set blob tags in various blob operations. BlobTagsString *string // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *ImmutabilityPolicySetting // Specified if a legal hold should be set on the blob. LegalHold *bool // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination // blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata // is not copied from the source blob or file. Note that beginning with // version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, // Blobs, and Metadata for more information. Metadata map[string]*string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Optional. Indicates the tier to be set on the page blob. Tier *PremiumPageBlobAccessTier // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // PageBlobClientGetPageRangesDiffOptions contains the optional parameters for the PageBlobClient.NewGetPageRangesDiffPager // method. type PageBlobClientGetPageRangesDiffOptions struct { // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. Maxresults *int32 // Optional. This header is only supported in service versions 2019-04-19 and after and specifies the URL of a previous snapshot // of the target blob. The response will only contain pages that were changed // between the target blob and its previous snapshot. PrevSnapshotURL *string // Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that specifies that the response // will contain only pages that were changed between target blob and previous // snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot // specified by prevsnapshot is the older of the two. Note that incremental // snapshots are currently supported only for blobs created on or after January 1, 2016. Prevsnapshot *string // Return only the bytes of the blob in the specified range. Range *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // PageBlobClientGetPageRangesOptions contains the optional parameters for the PageBlobClient.NewGetPageRangesPager method. type PageBlobClientGetPageRangesOptions struct { // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. Maxresults *int32 // Return only the bytes of the blob in the specified range. Range *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // PageBlobClientResizeOptions contains the optional parameters for the PageBlobClient.Resize method. type PageBlobClientResizeOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // PageBlobClientUpdateSequenceNumberOptions contains the optional parameters for the PageBlobClient.UpdateSequenceNumber // method. type PageBlobClientUpdateSequenceNumberOptions struct { // Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of // the sequence number must be between 0 and 2^63 - 1. BlobSequenceNumber *int64 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // PageBlobClientUploadPagesFromURLOptions contains the optional parameters for the PageBlobClient.UploadPagesFromURL method. type PageBlobClientUploadPagesFromURLOptions struct { // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Specify the md5 calculated for the range of bytes that must be read from the copy source. SourceContentMD5 []byte // Specify the crc64 calculated for the range of bytes that must be read from the copy source. SourceContentcrc64 []byte // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // PageBlobClientUploadPagesOptions contains the optional parameters for the PageBlobClient.UploadPages method. type PageBlobClientUploadPagesOptions struct { // Return only the bytes of the blob in the specified range. Range *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // Required if the request body is a structured message. Specifies the message schema version and properties. StructuredBodyType *string // Required if the request body is a structured message. Specifies the length of the blob/file content inside the message // body. Will always be smaller than Content-Length. StructuredContentLength *int64 // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 // Specify the transactional crc64 for the body, to be validated by the service. TransactionalContentCRC64 []byte // Specify the transactional md5 for the body, to be validated by the service. TransactionalContentMD5 []byte } // SequenceNumberAccessConditions contains a group of parameters for the PageBlobClient.UploadPages method. type SequenceNumberAccessConditions struct { // Specify this header value to operate only on a blob if it has the specified sequence number. IfSequenceNumberEqualTo *int64 // Specify this header value to operate only on a blob if it has a sequence number less than the specified. IfSequenceNumberLessThan *int64 // Specify this header value to operate only on a blob if it has a sequence number less than or equal to the specified. IfSequenceNumberLessThanOrEqualTo *int64 } // ServiceClientFilterBlobsOptions contains the optional parameters for the ServiceClient.FilterBlobs method. type ServiceClientFilterBlobsOptions struct { // Include this parameter to specify one or more datasets to include in the response. Include []FilterBlobsIncludeItem // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. Maxresults *int32 // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ServiceClientGetAccountInfoOptions contains the optional parameters for the ServiceClient.GetAccountInfo method. type ServiceClientGetAccountInfoOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ServiceClientGetPropertiesOptions contains the optional parameters for the ServiceClient.GetProperties method. type ServiceClientGetPropertiesOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ServiceClientGetStatisticsOptions contains the optional parameters for the ServiceClient.GetStatistics method. type ServiceClientGetStatisticsOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ServiceClientGetUserDelegationKeyOptions contains the optional parameters for the ServiceClient.GetUserDelegationKey method. type ServiceClientGetUserDelegationKeyOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ServiceClientListContainersSegmentOptions contains the optional parameters for the ServiceClient.NewListContainersSegmentPager // method. type ServiceClientListContainersSegmentOptions struct { // Include this parameter to specify that the container's metadata be returned as part of the response body. Include []ListContainersIncludeType // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. Maxresults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ServiceClientSetPropertiesOptions contains the optional parameters for the ServiceClient.SetProperties method. type ServiceClientSetPropertiesOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // ServiceClientSubmitBatchOptions contains the optional parameters for the ServiceClient.SubmitBatch method. type ServiceClientSubmitBatchOptions struct { // Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage // analytics logging is enabled. RequestID *string // The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Blob Service Operations. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations] Timeout *int32 } // SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL method. type SourceModifiedAccessConditions struct { // Specify an ETag value to operate only on blobs with a matching value. SourceIfMatch *azcore.ETag // Specify this header value to operate only on a blob if it has been modified since the specified date/time. SourceIfModifiedSince *time.Time // Specify an ETag value to operate only on blobs without a matching value. SourceIfNoneMatch *azcore.ETag // Specify a SQL where clause on blob tags to operate only on blobs with a matching value. SourceIfTags *string // Specify this header value to operate only on a blob if it has not been modified since the specified date/time. SourceIfUnmodifiedSince *time.Time } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_pageblob_client.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "context" "encoding/base64" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "io" "net/http" "strconv" "time" ) // PageBlobClient contains the methods for the PageBlob group. // Don't use this type directly, use a constructor function instead. type PageBlobClient struct { internal *azcore.Client endpoint string } // ClearPages - The Clear Pages operation clears a set of pages from a page blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - options - PageBlobClientClearPagesOptions contains the optional parameters for the PageBlobClient.ClearPages method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - SequenceNumberAccessConditions - SequenceNumberAccessConditions contains a group of parameters for the PageBlobClient.UploadPages // method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *PageBlobClient) ClearPages(ctx context.Context, contentLength int64, options *PageBlobClientClearPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientClearPagesResponse, error) { var err error req, err := client.clearPagesCreateRequest(ctx, contentLength, options, leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions) if err != nil { return PageBlobClientClearPagesResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return PageBlobClientClearPagesResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return PageBlobClientClearPagesResponse{}, err } resp, err := client.clearPagesHandleResponse(httpResp) return resp, err } // clearPagesCreateRequest creates the ClearPages request. func (client *PageBlobClient) clearPagesCreateRequest(ctx context.Context, contentLength int64, options *PageBlobClientClearPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "page") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberEqualTo != nil { req.Raw().Header["x-ms-if-sequence-number-eq"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberEqualTo, 10)} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo != nil { req.Raw().Header["x-ms-if-sequence-number-le"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo, 10)} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThan != nil { req.Raw().Header["x-ms-if-sequence-number-lt"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThan, 10)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-page-write"] = []string{"clear"} if options != nil && options.Range != nil { req.Raw().Header["x-ms-range"] = []string{*options.Range} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // clearPagesHandleResponse handles the ClearPages response. func (client *PageBlobClient) clearPagesHandleResponse(resp *http.Response) (PageBlobClientClearPagesResponse, error) { result := PageBlobClientClearPagesResponse{} if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return PageBlobClientClearPagesResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClientClearPagesResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClientClearPagesResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientClearPagesResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientClearPagesResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // CopyIncremental - The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob. // The snapshot is copied such that only the differential changes between the previously copied // snapshot are transferred to the destination. The copied snapshots are complete copies of the original snapshot and can // be read or copied from as usual. This API is supported since REST version // 2016-05-31. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - copySource - Specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that specifies // a page blob snapshot. The value should be URL-encoded as it would appear in a request // URI. The source blob must either be public or must be authenticated via a shared access signature. // - options - PageBlobClientCopyIncrementalOptions contains the optional parameters for the PageBlobClient.CopyIncremental // method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *PageBlobClient) CopyIncremental(ctx context.Context, copySource string, options *PageBlobClientCopyIncrementalOptions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientCopyIncrementalResponse, error) { var err error req, err := client.copyIncrementalCreateRequest(ctx, copySource, options, modifiedAccessConditions) if err != nil { return PageBlobClientCopyIncrementalResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return PageBlobClientCopyIncrementalResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return PageBlobClientCopyIncrementalResponse{}, err } resp, err := client.copyIncrementalHandleResponse(httpResp) return resp, err } // copyIncrementalCreateRequest creates the CopyIncremental request. func (client *PageBlobClient) copyIncrementalCreateRequest(ctx context.Context, copySource string, options *PageBlobClientCopyIncrementalOptions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "incrementalcopy") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-copy-source"] = []string{copySource} if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // copyIncrementalHandleResponse handles the CopyIncremental response. func (client *PageBlobClient) copyIncrementalHandleResponse(resp *http.Response) (PageBlobClientCopyIncrementalResponse, error) { result := PageBlobClientCopyIncrementalResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-copy-id"); val != "" { result.CopyID = &val } if val := resp.Header.Get("x-ms-copy-status"); val != "" { result.CopyStatus = (*CopyStatusType)(&val) } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientCopyIncrementalResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientCopyIncrementalResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // Create - The Create operation creates a new page blob. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - blobContentLength - This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned // to a 512-byte boundary. // - options - PageBlobClientCreateOptions contains the optional parameters for the PageBlobClient.Create method. // - BlobHTTPHeaders - BlobHTTPHeaders contains a group of parameters for the BlobClient.SetHTTPHeaders method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *PageBlobClient) Create(ctx context.Context, contentLength int64, blobContentLength int64, options *PageBlobClientCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientCreateResponse, error) { var err error req, err := client.createCreateRequest(ctx, contentLength, blobContentLength, options, blobHTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return PageBlobClientCreateResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return PageBlobClientCreateResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return PageBlobClientCreateResponse{}, err } resp, err := client.createHandleResponse(httpResp) return resp, err } // createCreateRequest creates the Create request. func (client *PageBlobClient) createCreateRequest(ctx context.Context, contentLength int64, blobContentLength int64, options *PageBlobClientCreateOptions, blobHTTPHeaders *BlobHTTPHeaders, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.Tier != nil { req.Raw().Header["x-ms-access-tier"] = []string{string(*options.Tier)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobCacheControl != nil { req.Raw().Header["x-ms-blob-cache-control"] = []string{*blobHTTPHeaders.BlobCacheControl} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentDisposition != nil { req.Raw().Header["x-ms-blob-content-disposition"] = []string{*blobHTTPHeaders.BlobContentDisposition} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentEncoding != nil { req.Raw().Header["x-ms-blob-content-encoding"] = []string{*blobHTTPHeaders.BlobContentEncoding} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentLanguage != nil { req.Raw().Header["x-ms-blob-content-language"] = []string{*blobHTTPHeaders.BlobContentLanguage} } req.Raw().Header["x-ms-blob-content-length"] = []string{strconv.FormatInt(blobContentLength, 10)} if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentMD5 != nil { req.Raw().Header["x-ms-blob-content-md5"] = []string{base64.StdEncoding.EncodeToString(blobHTTPHeaders.BlobContentMD5)} } if blobHTTPHeaders != nil && blobHTTPHeaders.BlobContentType != nil { req.Raw().Header["x-ms-blob-content-type"] = []string{*blobHTTPHeaders.BlobContentType} } if options != nil && options.BlobSequenceNumber != nil { req.Raw().Header["x-ms-blob-sequence-number"] = []string{strconv.FormatInt(*options.BlobSequenceNumber, 10)} } req.Raw().Header["x-ms-blob-type"] = []string{"PageBlob"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if options != nil && options.ImmutabilityPolicyMode != nil { req.Raw().Header["x-ms-immutability-policy-mode"] = []string{string(*options.ImmutabilityPolicyMode)} } if options != nil && options.ImmutabilityPolicyExpiry != nil { req.Raw().Header["x-ms-immutability-policy-until-date"] = []string{(*options.ImmutabilityPolicyExpiry).In(gmt).Format(time.RFC1123)} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.LegalHold != nil { req.Raw().Header["x-ms-legal-hold"] = []string{strconv.FormatBool(*options.LegalHold)} } if options != nil && options.Metadata != nil { for k, v := range options.Metadata { if v != nil { req.Raw().Header["x-ms-meta-"+k] = []string{*v} } } } if options != nil && options.BlobTagsString != nil { req.Raw().Header["x-ms-tags"] = []string{*options.BlobTagsString} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // createHandleResponse handles the Create response. func (client *PageBlobClient) createHandleResponse(resp *http.Response) (PageBlobClientCreateResponse, error) { result := PageBlobClientCreateResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClientCreateResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientCreateResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return PageBlobClientCreateResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientCreateResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if val := resp.Header.Get("x-ms-version-id"); val != "" { result.VersionID = &val } return result, nil } // NewGetPageRangesPager - The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot // of a page blob // // Generated from API version 2025-01-05 // - options - PageBlobClientGetPageRangesOptions contains the optional parameters for the PageBlobClient.NewGetPageRangesPager // method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *PageBlobClient) NewGetPageRangesPager(options *PageBlobClientGetPageRangesOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) *runtime.Pager[PageBlobClientGetPageRangesResponse] { return runtime.NewPager(runtime.PagingHandler[PageBlobClientGetPageRangesResponse]{ More: func(page PageBlobClientGetPageRangesResponse) bool { return page.NextMarker != nil && len(*page.NextMarker) > 0 }, Fetcher: func(ctx context.Context, page *PageBlobClientGetPageRangesResponse) (PageBlobClientGetPageRangesResponse, error) { nextLink := "" if page != nil { nextLink = *page.NextMarker } resp, err := runtime.FetcherForNextLink(ctx, client.internal.Pipeline(), nextLink, func(ctx context.Context) (*policy.Request, error) { return client.GetPageRangesCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions) }, nil) if err != nil { return PageBlobClientGetPageRangesResponse{}, err } return client.GetPageRangesHandleResponse(resp) }, }) } // GetPageRangesCreateRequest creates the GetPageRanges request. func (client *PageBlobClient) GetPageRangesCreateRequest(ctx context.Context, options *PageBlobClientGetPageRangesOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "pagelist") if options != nil && options.Marker != nil { reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.Range != nil { req.Raw().Header["x-ms-range"] = []string{*options.Range} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // GetPageRangesHandleResponse handles the GetPageRanges response. func (client *PageBlobClient) GetPageRangesHandleResponse(resp *http.Response) (PageBlobClientGetPageRangesResponse, error) { result := PageBlobClientGetPageRangesResponse{} if val := resp.Header.Get("x-ms-blob-content-length"); val != "" { blobContentLength, err := strconv.ParseInt(val, 10, 64) if err != nil { return PageBlobClientGetPageRangesResponse{}, err } result.BlobContentLength = &blobContentLength } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientGetPageRangesResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientGetPageRangesResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.PageList); err != nil { return PageBlobClientGetPageRangesResponse{}, err } return result, nil } // NewGetPageRangesDiffPager - The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that // were changed between target blob and previous snapshot. // // Generated from API version 2025-01-05 // - options - PageBlobClientGetPageRangesDiffOptions contains the optional parameters for the PageBlobClient.NewGetPageRangesDiffPager // method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *PageBlobClient) NewGetPageRangesDiffPager(options *PageBlobClientGetPageRangesDiffOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) *runtime.Pager[PageBlobClientGetPageRangesDiffResponse] { return runtime.NewPager(runtime.PagingHandler[PageBlobClientGetPageRangesDiffResponse]{ More: func(page PageBlobClientGetPageRangesDiffResponse) bool { return page.NextMarker != nil && len(*page.NextMarker) > 0 }, Fetcher: func(ctx context.Context, page *PageBlobClientGetPageRangesDiffResponse) (PageBlobClientGetPageRangesDiffResponse, error) { nextLink := "" if page != nil { nextLink = *page.NextMarker } resp, err := runtime.FetcherForNextLink(ctx, client.internal.Pipeline(), nextLink, func(ctx context.Context) (*policy.Request, error) { return client.GetPageRangesDiffCreateRequest(ctx, options, leaseAccessConditions, modifiedAccessConditions) }, nil) if err != nil { return PageBlobClientGetPageRangesDiffResponse{}, err } return client.GetPageRangesDiffHandleResponse(resp) }, }) } // GetPageRangesDiffCreateRequest creates the GetPageRangesDiff request. func (client *PageBlobClient) GetPageRangesDiffCreateRequest(ctx context.Context, options *PageBlobClientGetPageRangesDiffOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "pagelist") if options != nil && options.Marker != nil { reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Prevsnapshot != nil { reqQP.Set("prevsnapshot", *options.Prevsnapshot) } if options != nil && options.Snapshot != nil { reqQP.Set("snapshot", *options.Snapshot) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } if options != nil && options.PrevSnapshotURL != nil { req.Raw().Header["x-ms-previous-snapshot-url"] = []string{*options.PrevSnapshotURL} } if options != nil && options.Range != nil { req.Raw().Header["x-ms-range"] = []string{*options.Range} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // GetPageRangesDiffHandleResponse handles the GetPageRangesDiff response. func (client *PageBlobClient) GetPageRangesDiffHandleResponse(resp *http.Response) (PageBlobClientGetPageRangesDiffResponse, error) { result := PageBlobClientGetPageRangesDiffResponse{} if val := resp.Header.Get("x-ms-blob-content-length"); val != "" { blobContentLength, err := strconv.ParseInt(val, 10, 64) if err != nil { return PageBlobClientGetPageRangesDiffResponse{}, err } result.BlobContentLength = &blobContentLength } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientGetPageRangesDiffResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientGetPageRangesDiffResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.PageList); err != nil { return PageBlobClientGetPageRangesDiffResponse{}, err } return result, nil } // Resize - Resize the Blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - blobContentLength - This header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned // to a 512-byte boundary. // - options - PageBlobClientResizeOptions contains the optional parameters for the PageBlobClient.Resize method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *PageBlobClient) Resize(ctx context.Context, blobContentLength int64, options *PageBlobClientResizeOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientResizeResponse, error) { var err error req, err := client.resizeCreateRequest(ctx, blobContentLength, options, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) if err != nil { return PageBlobClientResizeResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return PageBlobClientResizeResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return PageBlobClientResizeResponse{}, err } resp, err := client.resizeHandleResponse(httpResp) return resp, err } // resizeCreateRequest creates the Resize request. func (client *PageBlobClient) resizeCreateRequest(ctx context.Context, blobContentLength int64, options *PageBlobClientResizeOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "properties") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } req.Raw().Header["x-ms-blob-content-length"] = []string{strconv.FormatInt(blobContentLength, 10)} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // resizeHandleResponse handles the Resize response. func (client *PageBlobClient) resizeHandleResponse(resp *http.Response) (PageBlobClientResizeResponse, error) { result := PageBlobClientResizeResponse{} if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return PageBlobClientResizeResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientResizeResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientResizeResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // UpdateSequenceNumber - Update the sequence number of the blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - sequenceNumberAction - Required if the x-ms-blob-sequence-number header is set for the request. This property applies to // page blobs only. This property indicates how the service should modify the blob's sequence number // - options - PageBlobClientUpdateSequenceNumberOptions contains the optional parameters for the PageBlobClient.UpdateSequenceNumber // method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *PageBlobClient) UpdateSequenceNumber(ctx context.Context, sequenceNumberAction SequenceNumberActionType, options *PageBlobClientUpdateSequenceNumberOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientUpdateSequenceNumberResponse, error) { var err error req, err := client.updateSequenceNumberCreateRequest(ctx, sequenceNumberAction, options, leaseAccessConditions, modifiedAccessConditions) if err != nil { return PageBlobClientUpdateSequenceNumberResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return PageBlobClientUpdateSequenceNumberResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return PageBlobClientUpdateSequenceNumberResponse{}, err } resp, err := client.updateSequenceNumberHandleResponse(httpResp) return resp, err } // updateSequenceNumberCreateRequest creates the UpdateSequenceNumber request. func (client *PageBlobClient) updateSequenceNumberCreateRequest(ctx context.Context, sequenceNumberAction SequenceNumberActionType, options *PageBlobClientUpdateSequenceNumberOptions, leaseAccessConditions *LeaseAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "properties") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.BlobSequenceNumber != nil { req.Raw().Header["x-ms-blob-sequence-number"] = []string{strconv.FormatInt(*options.BlobSequenceNumber, 10)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-sequence-number-action"] = []string{string(sequenceNumberAction)} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // updateSequenceNumberHandleResponse handles the UpdateSequenceNumber response. func (client *PageBlobClient) updateSequenceNumberHandleResponse(resp *http.Response) (PageBlobClientUpdateSequenceNumberResponse, error) { result := PageBlobClientUpdateSequenceNumberResponse{} if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return PageBlobClientUpdateSequenceNumberResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientUpdateSequenceNumberResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientUpdateSequenceNumberResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // UploadPages - The Upload Pages operation writes a range of pages to a page blob // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - body - Initial data // - options - PageBlobClientUploadPagesOptions contains the optional parameters for the PageBlobClient.UploadPages method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - SequenceNumberAccessConditions - SequenceNumberAccessConditions contains a group of parameters for the PageBlobClient.UploadPages // method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. func (client *PageBlobClient) UploadPages(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *PageBlobClientUploadPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (PageBlobClientUploadPagesResponse, error) { var err error req, err := client.uploadPagesCreateRequest(ctx, contentLength, body, options, leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions) if err != nil { return PageBlobClientUploadPagesResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return PageBlobClientUploadPagesResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return PageBlobClientUploadPagesResponse{}, err } resp, err := client.uploadPagesHandleResponse(httpResp) return resp, err } // uploadPagesCreateRequest creates the UploadPages request. func (client *PageBlobClient) uploadPagesCreateRequest(ctx context.Context, contentLength int64, body io.ReadSeekCloser, options *PageBlobClientUploadPagesOptions, leaseAccessConditions *LeaseAccessConditions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "page") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if options != nil && options.TransactionalContentMD5 != nil { req.Raw().Header["Content-MD5"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentMD5)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } if options != nil && options.TransactionalContentCRC64 != nil { req.Raw().Header["x-ms-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.TransactionalContentCRC64)} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberEqualTo != nil { req.Raw().Header["x-ms-if-sequence-number-eq"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberEqualTo, 10)} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo != nil { req.Raw().Header["x-ms-if-sequence-number-le"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo, 10)} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThan != nil { req.Raw().Header["x-ms-if-sequence-number-lt"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThan, 10)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-page-write"] = []string{"update"} if options != nil && options.Range != nil { req.Raw().Header["x-ms-range"] = []string{*options.Range} } if options != nil && options.StructuredBodyType != nil { req.Raw().Header["x-ms-structured-body"] = []string{*options.StructuredBodyType} } if options != nil && options.StructuredContentLength != nil { req.Raw().Header["x-ms-structured-content-length"] = []string{strconv.FormatInt(*options.StructuredContentLength, 10)} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := req.SetBody(body, "application/octet-stream"); err != nil { return nil, err } return req, nil } // uploadPagesHandleResponse handles the UploadPages response. func (client *PageBlobClient) uploadPagesHandleResponse(resp *http.Response) (PageBlobClientUploadPagesResponse, error) { result := PageBlobClientUploadPagesResponse{} if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return PageBlobClientUploadPagesResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClientUploadPagesResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClientUploadPagesResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientUploadPagesResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return PageBlobClientUploadPagesResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientUploadPagesResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-structured-body"); val != "" { result.StructuredBodyType = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // UploadPagesFromURL - The Upload Pages operation writes a range of pages to a page blob where the contents are read from // a URL // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - sourceURL - Specify a URL to the copy source. // - sourceRange - Bytes of source data in the specified range. The length of this range should match the ContentLength header // and x-ms-range/Range destination range header. // - contentLength - The length of the request. // - rangeParam - The range of bytes to which the source range would be written. The range should be 512 aligned and range-end // is required. // - options - PageBlobClientUploadPagesFromURLOptions contains the optional parameters for the PageBlobClient.UploadPagesFromURL // method. // - CPKInfo - CPKInfo contains a group of parameters for the BlobClient.Download method. // - CPKScopeInfo - CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. // - LeaseAccessConditions - LeaseAccessConditions contains a group of parameters for the ContainerClient.GetProperties method. // - SequenceNumberAccessConditions - SequenceNumberAccessConditions contains a group of parameters for the PageBlobClient.UploadPages // method. // - ModifiedAccessConditions - ModifiedAccessConditions contains a group of parameters for the ContainerClient.Delete method. // - SourceModifiedAccessConditions - SourceModifiedAccessConditions contains a group of parameters for the BlobClient.StartCopyFromURL // method. func (client *PageBlobClient) UploadPagesFromURL(ctx context.Context, sourceURL string, sourceRange string, contentLength int64, rangeParam string, options *PageBlobClientUploadPagesFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (PageBlobClientUploadPagesFromURLResponse, error) { var err error req, err := client.uploadPagesFromURLCreateRequest(ctx, sourceURL, sourceRange, contentLength, rangeParam, options, cpkInfo, cpkScopeInfo, leaseAccessConditions, sequenceNumberAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) if err != nil { return PageBlobClientUploadPagesFromURLResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return PageBlobClientUploadPagesFromURLResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusCreated) { err = runtime.NewResponseError(httpResp) return PageBlobClientUploadPagesFromURLResponse{}, err } resp, err := client.uploadPagesFromURLHandleResponse(httpResp) return resp, err } // uploadPagesFromURLCreateRequest creates the UploadPagesFromURL request. func (client *PageBlobClient) uploadPagesFromURLCreateRequest(ctx context.Context, sourceURL string, sourceRange string, contentLength int64, rangeParam string, options *PageBlobClientUploadPagesFromURLOptions, cpkInfo *CPKInfo, cpkScopeInfo *CPKScopeInfo, leaseAccessConditions *LeaseAccessConditions, sequenceNumberAccessConditions *SequenceNumberAccessConditions, modifiedAccessConditions *ModifiedAccessConditions, sourceModifiedAccessConditions *SourceModifiedAccessConditions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "page") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = reqQP.Encode() req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} if modifiedAccessConditions != nil && modifiedAccessConditions.IfMatch != nil { req.Raw().Header["If-Match"] = []string{string(*modifiedAccessConditions.IfMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfModifiedSince != nil { req.Raw().Header["If-Modified-Since"] = []string{(*modifiedAccessConditions.IfModifiedSince).In(gmt).Format(time.RFC1123)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfNoneMatch != nil { req.Raw().Header["If-None-Match"] = []string{string(*modifiedAccessConditions.IfNoneMatch)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfUnmodifiedSince != nil { req.Raw().Header["If-Unmodified-Since"] = []string{(*modifiedAccessConditions.IfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-copy-source"] = []string{sourceURL} if options != nil && options.CopySourceAuthorization != nil { req.Raw().Header["x-ms-copy-source-authorization"] = []string{*options.CopySourceAuthorization} } if cpkInfo != nil && cpkInfo.EncryptionAlgorithm != nil { req.Raw().Header["x-ms-encryption-algorithm"] = []string{string(*cpkInfo.EncryptionAlgorithm)} } if cpkInfo != nil && cpkInfo.EncryptionKey != nil { req.Raw().Header["x-ms-encryption-key"] = []string{*cpkInfo.EncryptionKey} } if cpkInfo != nil && cpkInfo.EncryptionKeySHA256 != nil { req.Raw().Header["x-ms-encryption-key-sha256"] = []string{*cpkInfo.EncryptionKeySHA256} } if cpkScopeInfo != nil && cpkScopeInfo.EncryptionScope != nil { req.Raw().Header["x-ms-encryption-scope"] = []string{*cpkScopeInfo.EncryptionScope} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberEqualTo != nil { req.Raw().Header["x-ms-if-sequence-number-eq"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberEqualTo, 10)} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo != nil { req.Raw().Header["x-ms-if-sequence-number-le"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThanOrEqualTo, 10)} } if sequenceNumberAccessConditions != nil && sequenceNumberAccessConditions.IfSequenceNumberLessThan != nil { req.Raw().Header["x-ms-if-sequence-number-lt"] = []string{strconv.FormatInt(*sequenceNumberAccessConditions.IfSequenceNumberLessThan, 10)} } if modifiedAccessConditions != nil && modifiedAccessConditions.IfTags != nil { req.Raw().Header["x-ms-if-tags"] = []string{*modifiedAccessConditions.IfTags} } if leaseAccessConditions != nil && leaseAccessConditions.LeaseID != nil { req.Raw().Header["x-ms-lease-id"] = []string{*leaseAccessConditions.LeaseID} } req.Raw().Header["x-ms-page-write"] = []string{"update"} req.Raw().Header["x-ms-range"] = []string{rangeParam} if options != nil && options.SourceContentcrc64 != nil { req.Raw().Header["x-ms-source-content-crc64"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentcrc64)} } if options != nil && options.SourceContentMD5 != nil { req.Raw().Header["x-ms-source-content-md5"] = []string{base64.StdEncoding.EncodeToString(options.SourceContentMD5)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfMatch != nil { req.Raw().Header["x-ms-source-if-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfModifiedSince != nil { req.Raw().Header["x-ms-source-if-modified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfModifiedSince).In(gmt).Format(time.RFC1123)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfNoneMatch != nil { req.Raw().Header["x-ms-source-if-none-match"] = []string{string(*sourceModifiedAccessConditions.SourceIfNoneMatch)} } if sourceModifiedAccessConditions != nil && sourceModifiedAccessConditions.SourceIfUnmodifiedSince != nil { req.Raw().Header["x-ms-source-if-unmodified-since"] = []string{(*sourceModifiedAccessConditions.SourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)} } req.Raw().Header["x-ms-source-range"] = []string{sourceRange} req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // uploadPagesFromURLHandleResponse handles the UploadPagesFromURL response. func (client *PageBlobClient) uploadPagesFromURLHandleResponse(resp *http.Response) (PageBlobClientUploadPagesFromURLResponse, error) { result := PageBlobClientUploadPagesFromURLResponse{} if val := resp.Header.Get("x-ms-blob-sequence-number"); val != "" { blobSequenceNumber, err := strconv.ParseInt(val, 10, 64) if err != nil { return PageBlobClientUploadPagesFromURLResponse{}, err } result.BlobSequenceNumber = &blobSequenceNumber } if val := resp.Header.Get("x-ms-content-crc64"); val != "" { contentCRC64, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClientUploadPagesFromURLResponse{}, err } result.ContentCRC64 = contentCRC64 } if val := resp.Header.Get("Content-MD5"); val != "" { contentMD5, err := base64.StdEncoding.DecodeString(val) if err != nil { return PageBlobClientUploadPagesFromURLResponse{}, err } result.ContentMD5 = contentMD5 } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientUploadPagesFromURLResponse{}, err } result.Date = &date } if val := resp.Header.Get("ETag"); val != "" { result.ETag = (*azcore.ETag)(&val) } if val := resp.Header.Get("x-ms-encryption-key-sha256"); val != "" { result.EncryptionKeySHA256 = &val } if val := resp.Header.Get("x-ms-encryption-scope"); val != "" { result.EncryptionScope = &val } if val := resp.Header.Get("x-ms-request-server-encrypted"); val != "" { isServerEncrypted, err := strconv.ParseBool(val) if err != nil { return PageBlobClientUploadPagesFromURLResponse{}, err } result.IsServerEncrypted = &isServerEncrypted } if val := resp.Header.Get("Last-Modified"); val != "" { lastModified, err := time.Parse(time.RFC1123, val) if err != nil { return PageBlobClientUploadPagesFromURLResponse{}, err } result.LastModified = &lastModified } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_responses.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "io" "time" ) // AppendBlobClientAppendBlockFromURLResponse contains the response from method AppendBlobClient.AppendBlockFromURL. type AppendBlobClientAppendBlockFromURLResponse struct { // BlobAppendOffset contains the information returned from the x-ms-blob-append-offset header response. BlobAppendOffset *string // BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response. BlobCommittedBlockCount *int32 // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // AppendBlobClientAppendBlockResponse contains the response from method AppendBlobClient.AppendBlock. type AppendBlobClientAppendBlockResponse struct { // BlobAppendOffset contains the information returned from the x-ms-blob-append-offset header response. BlobAppendOffset *string // BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response. BlobCommittedBlockCount *int32 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // StructuredBodyType contains the information returned from the x-ms-structured-body header response. StructuredBodyType *string // Version contains the information returned from the x-ms-version header response. Version *string } // AppendBlobClientCreateResponse contains the response from method AppendBlobClient.Create. type AppendBlobClientCreateResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // AppendBlobClientSealResponse contains the response from method AppendBlobClient.Seal. type AppendBlobClientSealResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // IsSealed contains the information returned from the x-ms-blob-sealed header response. IsSealed *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientAbortCopyFromURLResponse contains the response from method BlobClient.AbortCopyFromURL. type BlobClientAbortCopyFromURLResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientAcquireLeaseResponse contains the response from method BlobClient.AcquireLease. type BlobClientAcquireLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseID contains the information returned from the x-ms-lease-id header response. LeaseID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientBreakLeaseResponse contains the response from method BlobClient.BreakLease. type BlobClientBreakLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseTime contains the information returned from the x-ms-lease-time header response. LeaseTime *int32 // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientChangeLeaseResponse contains the response from method BlobClient.ChangeLease. type BlobClientChangeLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseID contains the information returned from the x-ms-lease-id header response. LeaseID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientCopyFromURLResponse contains the response from method BlobClient.CopyFromURL. type BlobClientCopyFromURLResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // CopyID contains the information returned from the x-ms-copy-id header response. CopyID *string // CopyStatus contains the information returned from the x-ms-copy-status header response. CopyStatus *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // BlobClientCreateSnapshotResponse contains the response from method BlobClient.CreateSnapshot. type BlobClientCreateSnapshotResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Snapshot contains the information returned from the x-ms-snapshot header response. Snapshot *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // BlobClientDeleteImmutabilityPolicyResponse contains the response from method BlobClient.DeleteImmutabilityPolicy. type BlobClientDeleteImmutabilityPolicyResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientDeleteResponse contains the response from method BlobClient.Delete. type BlobClientDeleteResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientDownloadResponse contains the response from method BlobClient.Download. type BlobClientDownloadResponse struct { // AcceptRanges contains the information returned from the Accept-Ranges header response. AcceptRanges *string // BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response. BlobCommittedBlockCount *int32 // BlobContentMD5 contains the information returned from the x-ms-blob-content-md5 header response. BlobContentMD5 []byte // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // BlobType contains the information returned from the x-ms-blob-type header response. BlobType *BlobType // Body contains the streaming response. Body io.ReadCloser // CacheControl contains the information returned from the Cache-Control header response. CacheControl *string // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentDisposition contains the information returned from the Content-Disposition header response. ContentDisposition *string // ContentEncoding contains the information returned from the Content-Encoding header response. ContentEncoding *string // ContentLanguage contains the information returned from the Content-Language header response. ContentLanguage *string // ContentLength contains the information returned from the Content-Length header response. ContentLength *int64 // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // ContentRange contains the information returned from the Content-Range header response. ContentRange *string // ContentType contains the information returned from the Content-Type header response. ContentType *string // CopyCompletionTime contains the information returned from the x-ms-copy-completion-time header response. CopyCompletionTime *time.Time // CopyID contains the information returned from the x-ms-copy-id header response. CopyID *string // CopyProgress contains the information returned from the x-ms-copy-progress header response. CopyProgress *string // CopySource contains the information returned from the x-ms-copy-source header response. CopySource *string // CopyStatus contains the information returned from the x-ms-copy-status header response. CopyStatus *CopyStatusType // CopyStatusDescription contains the information returned from the x-ms-copy-status-description header response. CopyStatusDescription *string // CreationTime contains the information returned from the x-ms-creation-time header response. CreationTime *time.Time // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // ErrorCode contains the information returned from the x-ms-error-code header response. ErrorCode *string // ImmutabilityPolicyExpiresOn contains the information returned from the x-ms-immutability-policy-until-date header response. ImmutabilityPolicyExpiresOn *time.Time // ImmutabilityPolicyMode contains the information returned from the x-ms-immutability-policy-mode header response. ImmutabilityPolicyMode *ImmutabilityPolicyMode // IsCurrentVersion contains the information returned from the x-ms-is-current-version header response. IsCurrentVersion *bool // IsSealed contains the information returned from the x-ms-blob-sealed header response. IsSealed *bool // IsServerEncrypted contains the information returned from the x-ms-server-encrypted header response. IsServerEncrypted *bool // LastAccessed contains the information returned from the x-ms-last-access-time header response. LastAccessed *time.Time // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseDuration contains the information returned from the x-ms-lease-duration header response. LeaseDuration *LeaseDurationType // LeaseState contains the information returned from the x-ms-lease-state header response. LeaseState *LeaseStateType // LeaseStatus contains the information returned from the x-ms-lease-status header response. LeaseStatus *LeaseStatusType // LegalHold contains the information returned from the x-ms-legal-hold header response. LegalHold *bool // Metadata contains the information returned from the x-ms-meta header response. Metadata map[string]*string // ObjectReplicationPolicyID contains the information returned from the x-ms-or-policy-id header response. ObjectReplicationPolicyID *string // ObjectReplicationRules contains the information returned from the x-ms-or header response. ObjectReplicationRules map[string]*string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // StructuredBodyType contains the information returned from the x-ms-structured-body header response. StructuredBodyType *string // StructuredContentLength contains the information returned from the x-ms-structured-content-length header response. StructuredContentLength *int64 // TagCount contains the information returned from the x-ms-tag-count header response. TagCount *int64 // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // BlobClientGetAccountInfoResponse contains the response from method BlobClient.GetAccountInfo. type BlobClientGetAccountInfoResponse struct { // AccountKind contains the information returned from the x-ms-account-kind header response. AccountKind *AccountKind // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // IsHierarchicalNamespaceEnabled contains the information returned from the x-ms-is-hns-enabled header response. IsHierarchicalNamespaceEnabled *bool // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // SKUName contains the information returned from the x-ms-sku-name header response. SKUName *SKUName // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientGetPropertiesResponse contains the response from method BlobClient.GetProperties. type BlobClientGetPropertiesResponse struct { // AcceptRanges contains the information returned from the Accept-Ranges header response. AcceptRanges *string // AccessTier contains the information returned from the x-ms-access-tier header response. AccessTier *string // AccessTierChangeTime contains the information returned from the x-ms-access-tier-change-time header response. AccessTierChangeTime *time.Time // AccessTierInferred contains the information returned from the x-ms-access-tier-inferred header response. AccessTierInferred *bool // ArchiveStatus contains the information returned from the x-ms-archive-status header response. ArchiveStatus *string // BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response. BlobCommittedBlockCount *int32 // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // BlobType contains the information returned from the x-ms-blob-type header response. BlobType *BlobType // CacheControl contains the information returned from the Cache-Control header response. CacheControl *string // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentDisposition contains the information returned from the Content-Disposition header response. ContentDisposition *string // ContentEncoding contains the information returned from the Content-Encoding header response. ContentEncoding *string // ContentLanguage contains the information returned from the Content-Language header response. ContentLanguage *string // ContentLength contains the information returned from the Content-Length header response. ContentLength *int64 // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // ContentType contains the information returned from the Content-Type header response. ContentType *string // CopyCompletionTime contains the information returned from the x-ms-copy-completion-time header response. CopyCompletionTime *time.Time // CopyID contains the information returned from the x-ms-copy-id header response. CopyID *string // CopyProgress contains the information returned from the x-ms-copy-progress header response. CopyProgress *string // CopySource contains the information returned from the x-ms-copy-source header response. CopySource *string // CopyStatus contains the information returned from the x-ms-copy-status header response. CopyStatus *CopyStatusType // CopyStatusDescription contains the information returned from the x-ms-copy-status-description header response. CopyStatusDescription *string // CreationTime contains the information returned from the x-ms-creation-time header response. CreationTime *time.Time // Date contains the information returned from the Date header response. Date *time.Time // DestinationSnapshot contains the information returned from the x-ms-copy-destination-snapshot header response. DestinationSnapshot *string // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // ExpiresOn contains the information returned from the x-ms-expiry-time header response. ExpiresOn *time.Time // ImmutabilityPolicyExpiresOn contains the information returned from the x-ms-immutability-policy-until-date header response. ImmutabilityPolicyExpiresOn *time.Time // ImmutabilityPolicyMode contains the information returned from the x-ms-immutability-policy-mode header response. ImmutabilityPolicyMode *ImmutabilityPolicyMode // IsCurrentVersion contains the information returned from the x-ms-is-current-version header response. IsCurrentVersion *bool // IsIncrementalCopy contains the information returned from the x-ms-incremental-copy header response. IsIncrementalCopy *bool // IsSealed contains the information returned from the x-ms-blob-sealed header response. IsSealed *bool // IsServerEncrypted contains the information returned from the x-ms-server-encrypted header response. IsServerEncrypted *bool // LastAccessed contains the information returned from the x-ms-last-access-time header response. LastAccessed *time.Time // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseDuration contains the information returned from the x-ms-lease-duration header response. LeaseDuration *LeaseDurationType // LeaseState contains the information returned from the x-ms-lease-state header response. LeaseState *LeaseStateType // LeaseStatus contains the information returned from the x-ms-lease-status header response. LeaseStatus *LeaseStatusType // LegalHold contains the information returned from the x-ms-legal-hold header response. LegalHold *bool // Metadata contains the information returned from the x-ms-meta header response. Metadata map[string]*string // ObjectReplicationPolicyID contains the information returned from the x-ms-or-policy-id header response. ObjectReplicationPolicyID *string // ObjectReplicationRules contains the information returned from the x-ms-or header response. ObjectReplicationRules map[string]*string // RehydratePriority contains the information returned from the x-ms-rehydrate-priority header response. RehydratePriority *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // TagCount contains the information returned from the x-ms-tag-count header response. TagCount *int64 // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // BlobClientGetTagsResponse contains the response from method BlobClient.GetTags. type BlobClientGetTagsResponse struct { // Blob tags BlobTags // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientQueryResponse contains the response from method BlobClient.Query. type BlobClientQueryResponse struct { // AcceptRanges contains the information returned from the Accept-Ranges header response. AcceptRanges *string // BlobCommittedBlockCount contains the information returned from the x-ms-blob-committed-block-count header response. BlobCommittedBlockCount *int32 // BlobContentMD5 contains the information returned from the x-ms-blob-content-md5 header response. BlobContentMD5 []byte // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // BlobType contains the information returned from the x-ms-blob-type header response. BlobType *BlobType // Body contains the streaming response. Body io.ReadCloser // CacheControl contains the information returned from the Cache-Control header response. CacheControl *string // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentDisposition contains the information returned from the Content-Disposition header response. ContentDisposition *string // ContentEncoding contains the information returned from the Content-Encoding header response. ContentEncoding *string // ContentLanguage contains the information returned from the Content-Language header response. ContentLanguage *string // ContentLength contains the information returned from the Content-Length header response. ContentLength *int64 // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // ContentRange contains the information returned from the Content-Range header response. ContentRange *string // ContentType contains the information returned from the Content-Type header response. ContentType *string // CopyCompletionTime contains the information returned from the x-ms-copy-completion-time header response. CopyCompletionTime *time.Time // CopyID contains the information returned from the x-ms-copy-id header response. CopyID *string // CopyProgress contains the information returned from the x-ms-copy-progress header response. CopyProgress *string // CopySource contains the information returned from the x-ms-copy-source header response. CopySource *string // CopyStatus contains the information returned from the x-ms-copy-status header response. CopyStatus *CopyStatusType // CopyStatusDescription contains the information returned from the x-ms-copy-status-description header response. CopyStatusDescription *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseDuration contains the information returned from the x-ms-lease-duration header response. LeaseDuration *LeaseDurationType // LeaseState contains the information returned from the x-ms-lease-state header response. LeaseState *LeaseStateType // LeaseStatus contains the information returned from the x-ms-lease-status header response. LeaseStatus *LeaseStatusType // Metadata contains the information returned from the x-ms-meta header response. Metadata map[string]*string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientReleaseLeaseResponse contains the response from method BlobClient.ReleaseLease. type BlobClientReleaseLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientRenewLeaseResponse contains the response from method BlobClient.RenewLease. type BlobClientRenewLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseID contains the information returned from the x-ms-lease-id header response. LeaseID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientSetExpiryResponse contains the response from method BlobClient.SetExpiry. type BlobClientSetExpiryResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientSetHTTPHeadersResponse contains the response from method BlobClient.SetHTTPHeaders. type BlobClientSetHTTPHeadersResponse struct { // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientSetImmutabilityPolicyResponse contains the response from method BlobClient.SetImmutabilityPolicy. type BlobClientSetImmutabilityPolicyResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ImmutabilityPolicyExpiry contains the information returned from the x-ms-immutability-policy-until-date header response. ImmutabilityPolicyExpiry *time.Time // ImmutabilityPolicyMode contains the information returned from the x-ms-immutability-policy-mode header response. ImmutabilityPolicyMode *ImmutabilityPolicyMode // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientSetLegalHoldResponse contains the response from method BlobClient.SetLegalHold. type BlobClientSetLegalHoldResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // LegalHold contains the information returned from the x-ms-legal-hold header response. LegalHold *bool // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientSetMetadataResponse contains the response from method BlobClient.SetMetadata. type BlobClientSetMetadataResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // BlobClientSetTagsResponse contains the response from method BlobClient.SetTags. type BlobClientSetTagsResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientSetTierResponse contains the response from method BlobClient.SetTier. type BlobClientSetTierResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlobClientStartCopyFromURLResponse contains the response from method BlobClient.StartCopyFromURL. type BlobClientStartCopyFromURLResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // CopyID contains the information returned from the x-ms-copy-id header response. CopyID *string // CopyStatus contains the information returned from the x-ms-copy-status header response. CopyStatus *CopyStatusType // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // BlobClientUndeleteResponse contains the response from method BlobClient.Undelete. type BlobClientUndeleteResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlockBlobClientCommitBlockListResponse contains the response from method BlockBlobClient.CommitBlockList. type BlockBlobClientCommitBlockListResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // BlockBlobClientGetBlockListResponse contains the response from method BlockBlobClient.GetBlockList. type BlockBlobClientGetBlockListResponse struct { BlockList // BlobContentLength contains the information returned from the x-ms-blob-content-length header response. BlobContentLength *int64 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentType contains the information returned from the Content-Type header response. ContentType *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlockBlobClientPutBlobFromURLResponse contains the response from method BlockBlobClient.PutBlobFromURL. type BlockBlobClientPutBlobFromURLResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // BlockBlobClientStageBlockFromURLResponse contains the response from method BlockBlobClient.StageBlockFromURL. type BlockBlobClientStageBlockFromURLResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlockBlobClientStageBlockResponse contains the response from method BlockBlobClient.StageBlock. type BlockBlobClientStageBlockResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // StructuredBodyType contains the information returned from the x-ms-structured-body header response. StructuredBodyType *string // Version contains the information returned from the x-ms-version header response. Version *string } // BlockBlobClientUploadResponse contains the response from method BlockBlobClient.Upload. type BlockBlobClientUploadResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // StructuredBodyType contains the information returned from the x-ms-structured-body header response. StructuredBodyType *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // ContainerClientAcquireLeaseResponse contains the response from method ContainerClient.AcquireLease. type ContainerClientAcquireLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseID contains the information returned from the x-ms-lease-id header response. LeaseID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientBreakLeaseResponse contains the response from method ContainerClient.BreakLease. type ContainerClientBreakLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseTime contains the information returned from the x-ms-lease-time header response. LeaseTime *int32 // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientChangeLeaseResponse contains the response from method ContainerClient.ChangeLease. type ContainerClientChangeLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseID contains the information returned from the x-ms-lease-id header response. LeaseID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientCreateResponse contains the response from method ContainerClient.Create. type ContainerClientCreateResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientDeleteResponse contains the response from method ContainerClient.Delete. type ContainerClientDeleteResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientFilterBlobsResponse contains the response from method ContainerClient.FilterBlobs. type ContainerClientFilterBlobsResponse struct { // The result of a Filter Blobs API call FilterBlobSegment // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientGetAccessPolicyResponse contains the response from method ContainerClient.GetAccessPolicy. type ContainerClientGetAccessPolicyResponse struct { // BlobPublicAccess contains the information returned from the x-ms-blob-public-access header response. BlobPublicAccess *PublicAccessType // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // a collection of signed identifiers SignedIdentifiers []*SignedIdentifier `xml:"SignedIdentifier"` // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientGetAccountInfoResponse contains the response from method ContainerClient.GetAccountInfo. type ContainerClientGetAccountInfoResponse struct { // AccountKind contains the information returned from the x-ms-account-kind header response. AccountKind *AccountKind // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // IsHierarchicalNamespaceEnabled contains the information returned from the x-ms-is-hns-enabled header response. IsHierarchicalNamespaceEnabled *bool // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // SKUName contains the information returned from the x-ms-sku-name header response. SKUName *SKUName // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientGetPropertiesResponse contains the response from method ContainerClient.GetProperties. type ContainerClientGetPropertiesResponse struct { // BlobPublicAccess contains the information returned from the x-ms-blob-public-access header response. BlobPublicAccess *PublicAccessType // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // DefaultEncryptionScope contains the information returned from the x-ms-default-encryption-scope header response. DefaultEncryptionScope *string // DenyEncryptionScopeOverride contains the information returned from the x-ms-deny-encryption-scope-override header response. DenyEncryptionScopeOverride *bool // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // HasImmutabilityPolicy contains the information returned from the x-ms-has-immutability-policy header response. HasImmutabilityPolicy *bool // HasLegalHold contains the information returned from the x-ms-has-legal-hold header response. HasLegalHold *bool // IsImmutableStorageWithVersioningEnabled contains the information returned from the x-ms-immutable-storage-with-versioning-enabled // header response. IsImmutableStorageWithVersioningEnabled *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseDuration contains the information returned from the x-ms-lease-duration header response. LeaseDuration *LeaseDurationType // LeaseState contains the information returned from the x-ms-lease-state header response. LeaseState *LeaseStateType // LeaseStatus contains the information returned from the x-ms-lease-status header response. LeaseStatus *LeaseStatusType // Metadata contains the information returned from the x-ms-meta header response. Metadata map[string]*string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientListBlobFlatSegmentResponse contains the response from method ContainerClient.NewListBlobFlatSegmentPager. type ContainerClientListBlobFlatSegmentResponse struct { // An enumeration of blobs ListBlobsFlatSegmentResponse // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentType contains the information returned from the Content-Type header response. ContentType *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientListBlobHierarchySegmentResponse contains the response from method ContainerClient.NewListBlobHierarchySegmentPager. type ContainerClientListBlobHierarchySegmentResponse struct { // An enumeration of blobs ListBlobsHierarchySegmentResponse // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentType contains the information returned from the Content-Type header response. ContentType *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientReleaseLeaseResponse contains the response from method ContainerClient.ReleaseLease. type ContainerClientReleaseLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientRenameResponse contains the response from method ContainerClient.Rename. type ContainerClientRenameResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientRenewLeaseResponse contains the response from method ContainerClient.RenewLease. type ContainerClientRenewLeaseResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // LeaseID contains the information returned from the x-ms-lease-id header response. LeaseID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientRestoreResponse contains the response from method ContainerClient.Restore. type ContainerClientRestoreResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientSetAccessPolicyResponse contains the response from method ContainerClient.SetAccessPolicy. type ContainerClientSetAccessPolicyResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientSetMetadataResponse contains the response from method ContainerClient.SetMetadata. type ContainerClientSetMetadataResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ContainerClientSubmitBatchResponse contains the response from method ContainerClient.SubmitBatch. type ContainerClientSubmitBatchResponse struct { // Body contains the streaming response. Body io.ReadCloser // ContentType contains the information returned from the Content-Type header response. ContentType *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // PageBlobClientClearPagesResponse contains the response from method PageBlobClient.ClearPages. type PageBlobClientClearPagesResponse struct { // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // PageBlobClientCopyIncrementalResponse contains the response from method PageBlobClient.CopyIncremental. type PageBlobClientCopyIncrementalResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // CopyID contains the information returned from the x-ms-copy-id header response. CopyID *string // CopyStatus contains the information returned from the x-ms-copy-status header response. CopyStatus *CopyStatusType // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // PageBlobClientCreateResponse contains the response from method PageBlobClient.Create. type PageBlobClientCreateResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string // VersionID contains the information returned from the x-ms-version-id header response. VersionID *string } // PageBlobClientGetPageRangesDiffResponse contains the response from method PageBlobClient.NewGetPageRangesDiffPager. type PageBlobClientGetPageRangesDiffResponse struct { // the list of pages PageList // BlobContentLength contains the information returned from the x-ms-blob-content-length header response. BlobContentLength *int64 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // PageBlobClientGetPageRangesResponse contains the response from method PageBlobClient.NewGetPageRangesPager. type PageBlobClientGetPageRangesResponse struct { // the list of pages PageList // BlobContentLength contains the information returned from the x-ms-blob-content-length header response. BlobContentLength *int64 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // PageBlobClientResizeResponse contains the response from method PageBlobClient.Resize. type PageBlobClientResizeResponse struct { // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // PageBlobClientUpdateSequenceNumberResponse contains the response from method PageBlobClient.UpdateSequenceNumber. type PageBlobClientUpdateSequenceNumberResponse struct { // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // PageBlobClientUploadPagesFromURLResponse contains the response from method PageBlobClient.UploadPagesFromURL. type PageBlobClientUploadPagesFromURLResponse struct { // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // PageBlobClientUploadPagesResponse contains the response from method PageBlobClient.UploadPages. type PageBlobClientUploadPagesResponse struct { // BlobSequenceNumber contains the information returned from the x-ms-blob-sequence-number header response. BlobSequenceNumber *int64 // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // ContentCRC64 contains the information returned from the x-ms-content-crc64 header response. ContentCRC64 []byte // ContentMD5 contains the information returned from the Content-MD5 header response. ContentMD5 []byte // Date contains the information returned from the Date header response. Date *time.Time // ETag contains the information returned from the ETag header response. ETag *azcore.ETag // EncryptionKeySHA256 contains the information returned from the x-ms-encryption-key-sha256 header response. EncryptionKeySHA256 *string // EncryptionScope contains the information returned from the x-ms-encryption-scope header response. EncryptionScope *string // IsServerEncrypted contains the information returned from the x-ms-request-server-encrypted header response. IsServerEncrypted *bool // LastModified contains the information returned from the Last-Modified header response. LastModified *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // StructuredBodyType contains the information returned from the x-ms-structured-body header response. StructuredBodyType *string // Version contains the information returned from the x-ms-version header response. Version *string } // ServiceClientFilterBlobsResponse contains the response from method ServiceClient.FilterBlobs. type ServiceClientFilterBlobsResponse struct { // The result of a Filter Blobs API call FilterBlobSegment // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ServiceClientGetAccountInfoResponse contains the response from method ServiceClient.GetAccountInfo. type ServiceClientGetAccountInfoResponse struct { // AccountKind contains the information returned from the x-ms-account-kind header response. AccountKind *AccountKind // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // IsHierarchicalNamespaceEnabled contains the information returned from the x-ms-is-hns-enabled header response. IsHierarchicalNamespaceEnabled *bool // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // SKUName contains the information returned from the x-ms-sku-name header response. SKUName *SKUName // Version contains the information returned from the x-ms-version header response. Version *string } // ServiceClientGetPropertiesResponse contains the response from method ServiceClient.GetProperties. type ServiceClientGetPropertiesResponse struct { // Storage Service Properties. StorageServiceProperties // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ServiceClientGetStatisticsResponse contains the response from method ServiceClient.GetStatistics. type ServiceClientGetStatisticsResponse struct { // Stats for the storage service. StorageServiceStats // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ServiceClientGetUserDelegationKeyResponse contains the response from method ServiceClient.GetUserDelegationKey. type ServiceClientGetUserDelegationKeyResponse struct { // A user delegation key UserDelegationKey // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // Date contains the information returned from the Date header response. Date *time.Time // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ServiceClientListContainersSegmentResponse contains the response from method ServiceClient.NewListContainersSegmentPager. type ServiceClientListContainersSegmentResponse struct { // An enumeration of containers ListContainersSegmentResponse // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ServiceClientSetPropertiesResponse contains the response from method ServiceClient.SetProperties. type ServiceClientSetPropertiesResponse struct { // ClientRequestID contains the information returned from the x-ms-client-request-id header response. ClientRequestID *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // ServiceClientSubmitBatchResponse contains the response from method ServiceClient.SubmitBatch. type ServiceClientSubmitBatchResponse struct { // Body contains the streaming response. Body io.ReadCloser // ContentType contains the information returned from the Content-Type header response. ContentType *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_service_client.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "context" "fmt" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "io" "net/http" "strconv" "strings" "time" ) // ServiceClient contains the methods for the Service group. // Don't use this type directly, use a constructor function instead. type ServiceClient struct { internal *azcore.Client endpoint string } // FilterBlobs - The Filter Blobs operation enables callers to list blobs across all containers whose tags match a given search // expression. Filter blobs searches across all containers within a storage account but can // be scoped within the expression to a single container. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - where - Filters the results to return only to return only blobs whose tags match the specified expression. // - options - ServiceClientFilterBlobsOptions contains the optional parameters for the ServiceClient.FilterBlobs method. func (client *ServiceClient) FilterBlobs(ctx context.Context, where string, options *ServiceClientFilterBlobsOptions) (ServiceClientFilterBlobsResponse, error) { var err error req, err := client.filterBlobsCreateRequest(ctx, where, options) if err != nil { return ServiceClientFilterBlobsResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ServiceClientFilterBlobsResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ServiceClientFilterBlobsResponse{}, err } resp, err := client.filterBlobsHandleResponse(httpResp) return resp, err } // filterBlobsCreateRequest creates the FilterBlobs request. func (client *ServiceClient) filterBlobsCreateRequest(ctx context.Context, where string, options *ServiceClientFilterBlobsOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "blobs") if options != nil && options.Include != nil { reqQP.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), "[]")), ",")) } if options != nil && options.Marker != nil { reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } reqQP.Set("where", where) req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // filterBlobsHandleResponse handles the FilterBlobs response. func (client *ServiceClient) filterBlobsHandleResponse(resp *http.Response) (ServiceClientFilterBlobsResponse, error) { result := ServiceClientFilterBlobsResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ServiceClientFilterBlobsResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.FilterBlobSegment); err != nil { return ServiceClientFilterBlobsResponse{}, err } return result, nil } // GetAccountInfo - Returns the sku name and account kind // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ServiceClientGetAccountInfoOptions contains the optional parameters for the ServiceClient.GetAccountInfo method. func (client *ServiceClient) GetAccountInfo(ctx context.Context, options *ServiceClientGetAccountInfoOptions) (ServiceClientGetAccountInfoResponse, error) { var err error req, err := client.getAccountInfoCreateRequest(ctx, options) if err != nil { return ServiceClientGetAccountInfoResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ServiceClientGetAccountInfoResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ServiceClientGetAccountInfoResponse{}, err } resp, err := client.getAccountInfoHandleResponse(httpResp) return resp, err } // getAccountInfoCreateRequest creates the GetAccountInfo request. func (client *ServiceClient) getAccountInfoCreateRequest(ctx context.Context, options *ServiceClientGetAccountInfoOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "properties") reqQP.Set("restype", "account") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getAccountInfoHandleResponse handles the GetAccountInfo response. func (client *ServiceClient) getAccountInfoHandleResponse(resp *http.Response) (ServiceClientGetAccountInfoResponse, error) { result := ServiceClientGetAccountInfoResponse{} if val := resp.Header.Get("x-ms-account-kind"); val != "" { result.AccountKind = (*AccountKind)(&val) } if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ServiceClientGetAccountInfoResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-is-hns-enabled"); val != "" { isHierarchicalNamespaceEnabled, err := strconv.ParseBool(val) if err != nil { return ServiceClientGetAccountInfoResponse{}, err } result.IsHierarchicalNamespaceEnabled = &isHierarchicalNamespaceEnabled } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-sku-name"); val != "" { result.SKUName = (*SKUName)(&val) } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // GetProperties - gets the properties of a storage account's Blob service, including properties for Storage Analytics and // CORS (Cross-Origin Resource Sharing) rules. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ServiceClientGetPropertiesOptions contains the optional parameters for the ServiceClient.GetProperties method. func (client *ServiceClient) GetProperties(ctx context.Context, options *ServiceClientGetPropertiesOptions) (ServiceClientGetPropertiesResponse, error) { var err error req, err := client.getPropertiesCreateRequest(ctx, options) if err != nil { return ServiceClientGetPropertiesResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ServiceClientGetPropertiesResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ServiceClientGetPropertiesResponse{}, err } resp, err := client.getPropertiesHandleResponse(httpResp) return resp, err } // getPropertiesCreateRequest creates the GetProperties request. func (client *ServiceClient) getPropertiesCreateRequest(ctx context.Context, options *ServiceClientGetPropertiesOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "properties") reqQP.Set("restype", "service") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getPropertiesHandleResponse handles the GetProperties response. func (client *ServiceClient) getPropertiesHandleResponse(resp *http.Response) (ServiceClientGetPropertiesResponse, error) { result := ServiceClientGetPropertiesResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.StorageServiceProperties); err != nil { return ServiceClientGetPropertiesResponse{}, err } return result, nil } // GetStatistics - Retrieves statistics related to replication for the Blob service. It is only available on the secondary // location endpoint when read-access geo-redundant replication is enabled for the storage account. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - options - ServiceClientGetStatisticsOptions contains the optional parameters for the ServiceClient.GetStatistics method. func (client *ServiceClient) GetStatistics(ctx context.Context, options *ServiceClientGetStatisticsOptions) (ServiceClientGetStatisticsResponse, error) { var err error req, err := client.getStatisticsCreateRequest(ctx, options) if err != nil { return ServiceClientGetStatisticsResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ServiceClientGetStatisticsResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ServiceClientGetStatisticsResponse{}, err } resp, err := client.getStatisticsHandleResponse(httpResp) return resp, err } // getStatisticsCreateRequest creates the GetStatistics request. func (client *ServiceClient) getStatisticsCreateRequest(ctx context.Context, options *ServiceClientGetStatisticsOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "stats") reqQP.Set("restype", "service") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // getStatisticsHandleResponse handles the GetStatistics response. func (client *ServiceClient) getStatisticsHandleResponse(resp *http.Response) (ServiceClientGetStatisticsResponse, error) { result := ServiceClientGetStatisticsResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ServiceClientGetStatisticsResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.StorageServiceStats); err != nil { return ServiceClientGetStatisticsResponse{}, err } return result, nil } // GetUserDelegationKey - Retrieves a user delegation key for the Blob service. This is only a valid operation when using // bearer token authentication. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - keyInfo - Key information // - options - ServiceClientGetUserDelegationKeyOptions contains the optional parameters for the ServiceClient.GetUserDelegationKey // method. func (client *ServiceClient) GetUserDelegationKey(ctx context.Context, keyInfo KeyInfo, options *ServiceClientGetUserDelegationKeyOptions) (ServiceClientGetUserDelegationKeyResponse, error) { var err error req, err := client.getUserDelegationKeyCreateRequest(ctx, keyInfo, options) if err != nil { return ServiceClientGetUserDelegationKeyResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ServiceClientGetUserDelegationKeyResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusOK) { err = runtime.NewResponseError(httpResp) return ServiceClientGetUserDelegationKeyResponse{}, err } resp, err := client.getUserDelegationKeyHandleResponse(httpResp) return resp, err } // getUserDelegationKeyCreateRequest creates the GetUserDelegationKey request. func (client *ServiceClient) getUserDelegationKeyCreateRequest(ctx context.Context, keyInfo KeyInfo, options *ServiceClientGetUserDelegationKeyOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPost, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "userdelegationkey") reqQP.Set("restype", "service") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := runtime.MarshalAsXML(req, keyInfo); err != nil { return nil, err } return req, nil } // getUserDelegationKeyHandleResponse handles the GetUserDelegationKey response. func (client *ServiceClient) getUserDelegationKeyHandleResponse(resp *http.Response) (ServiceClientGetUserDelegationKeyResponse, error) { result := ServiceClientGetUserDelegationKeyResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("Date"); val != "" { date, err := time.Parse(time.RFC1123, val) if err != nil { return ServiceClientGetUserDelegationKeyResponse{}, err } result.Date = &date } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.UserDelegationKey); err != nil { return ServiceClientGetUserDelegationKeyResponse{}, err } return result, nil } // NewListContainersSegmentPager - The List Containers Segment operation returns a list of the containers under the specified // account // // Generated from API version 2025-01-05 // - options - ServiceClientListContainersSegmentOptions contains the optional parameters for the ServiceClient.NewListContainersSegmentPager // method. // // listContainersSegmentCreateRequest creates the ListContainersSegment request. func (client *ServiceClient) ListContainersSegmentCreateRequest(ctx context.Context, options *ServiceClientListContainersSegmentOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodGet, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "list") if options != nil && options.Include != nil { reqQP.Set("include", strings.Join(strings.Fields(strings.Trim(fmt.Sprint(options.Include), "[]")), ",")) } if options != nil && options.Marker != nil { reqQP.Set("marker", *options.Marker) } if options != nil && options.Maxresults != nil { reqQP.Set("maxresults", strconv.FormatInt(int64(*options.Maxresults), 10)) } if options != nil && options.Prefix != nil { reqQP.Set("prefix", *options.Prefix) } if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} return req, nil } // listContainersSegmentHandleResponse handles the ListContainersSegment response. func (client *ServiceClient) ListContainersSegmentHandleResponse(resp *http.Response) (ServiceClientListContainersSegmentResponse, error) { result := ServiceClientListContainersSegmentResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } if err := runtime.UnmarshalAsXML(resp, &result.ListContainersSegmentResponse); err != nil { return ServiceClientListContainersSegmentResponse{}, err } return result, nil } // SetProperties - Sets properties for a storage account's Blob service endpoint, including properties for Storage Analytics // and CORS (Cross-Origin Resource Sharing) rules // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - storageServiceProperties - The StorageService properties. // - options - ServiceClientSetPropertiesOptions contains the optional parameters for the ServiceClient.SetProperties method. func (client *ServiceClient) SetProperties(ctx context.Context, storageServiceProperties StorageServiceProperties, options *ServiceClientSetPropertiesOptions) (ServiceClientSetPropertiesResponse, error) { var err error req, err := client.setPropertiesCreateRequest(ctx, storageServiceProperties, options) if err != nil { return ServiceClientSetPropertiesResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ServiceClientSetPropertiesResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return ServiceClientSetPropertiesResponse{}, err } resp, err := client.setPropertiesHandleResponse(httpResp) return resp, err } // setPropertiesCreateRequest creates the SetProperties request. func (client *ServiceClient) setPropertiesCreateRequest(ctx context.Context, storageServiceProperties StorageServiceProperties, options *ServiceClientSetPropertiesOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPut, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "properties") reqQP.Set("restype", "service") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) req.Raw().Header["Accept"] = []string{"application/xml"} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := runtime.MarshalAsXML(req, storageServiceProperties); err != nil { return nil, err } return req, nil } // setPropertiesHandleResponse handles the SetProperties response. func (client *ServiceClient) setPropertiesHandleResponse(resp *http.Response) (ServiceClientSetPropertiesResponse, error) { result := ServiceClientSetPropertiesResponse{} if val := resp.Header.Get("x-ms-client-request-id"); val != "" { result.ClientRequestID = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } // SubmitBatch - The Batch operation allows multiple API calls to be embedded into a single HTTP request. // If the operation fails it returns an *azcore.ResponseError type. // // Generated from API version 2025-01-05 // - contentLength - The length of the request. // - multipartContentType - Required. The value of this header must be multipart/mixed with a batch boundary. Example header // value: multipart/mixed; boundary=batch_ // - body - Initial data // - options - ServiceClientSubmitBatchOptions contains the optional parameters for the ServiceClient.SubmitBatch method. func (client *ServiceClient) SubmitBatch(ctx context.Context, contentLength int64, multipartContentType string, body io.ReadSeekCloser, options *ServiceClientSubmitBatchOptions) (ServiceClientSubmitBatchResponse, error) { var err error req, err := client.submitBatchCreateRequest(ctx, contentLength, multipartContentType, body, options) if err != nil { return ServiceClientSubmitBatchResponse{}, err } httpResp, err := client.internal.Pipeline().Do(req) if err != nil { return ServiceClientSubmitBatchResponse{}, err } if !runtime.HasStatusCode(httpResp, http.StatusAccepted) { err = runtime.NewResponseError(httpResp) return ServiceClientSubmitBatchResponse{}, err } resp, err := client.submitBatchHandleResponse(httpResp) return resp, err } // submitBatchCreateRequest creates the SubmitBatch request. func (client *ServiceClient) submitBatchCreateRequest(ctx context.Context, contentLength int64, multipartContentType string, body io.ReadSeekCloser, options *ServiceClientSubmitBatchOptions) (*policy.Request, error) { req, err := runtime.NewRequest(ctx, http.MethodPost, client.endpoint) if err != nil { return nil, err } reqQP := req.Raw().URL.Query() reqQP.Set("comp", "batch") if options != nil && options.Timeout != nil { reqQP.Set("timeout", strconv.FormatInt(int64(*options.Timeout), 10)) } req.Raw().URL.RawQuery = strings.Replace(reqQP.Encode(), "+", "%20", -1) runtime.SkipBodyDownload(req) req.Raw().Header["Accept"] = []string{"application/xml"} req.Raw().Header["Content-Length"] = []string{strconv.FormatInt(contentLength, 10)} req.Raw().Header["Content-Type"] = []string{multipartContentType} if options != nil && options.RequestID != nil { req.Raw().Header["x-ms-client-request-id"] = []string{*options.RequestID} } req.Raw().Header["x-ms-version"] = []string{ServiceVersion} if err := req.SetBody(body, multipartContentType); err != nil { return nil, err } return req, nil } // submitBatchHandleResponse handles the SubmitBatch response. func (client *ServiceClient) submitBatchHandleResponse(resp *http.Response) (ServiceClientSubmitBatchResponse, error) { result := ServiceClientSubmitBatchResponse{Body: resp.Body} if val := resp.Header.Get("Content-Type"); val != "" { result.ContentType = &val } if val := resp.Header.Get("x-ms-request-id"); val != "" { result.RequestID = &val } if val := resp.Header.Get("x-ms-version"); val != "" { result.Version = &val } return result, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_time_rfc1123.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "strings" "time" ) const ( dateTimeRFC1123JSON = `"` + time.RFC1123 + `"` ) type dateTimeRFC1123 time.Time func (t dateTimeRFC1123) MarshalJSON() ([]byte, error) { b := []byte(time.Time(t).Format(dateTimeRFC1123JSON)) return b, nil } func (t dateTimeRFC1123) MarshalText() ([]byte, error) { b := []byte(time.Time(t).Format(time.RFC1123)) return b, nil } func (t *dateTimeRFC1123) UnmarshalJSON(data []byte) error { p, err := time.Parse(dateTimeRFC1123JSON, strings.ToUpper(string(data))) *t = dateTimeRFC1123(p) return err } func (t *dateTimeRFC1123) UnmarshalText(data []byte) error { if len(data) == 0 { return nil } p, err := time.Parse(time.RFC1123, string(data)) *t = dateTimeRFC1123(p) return err } func (t dateTimeRFC1123) String() string { return time.Time(t).Format(time.RFC1123) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_time_rfc3339.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "regexp" "strings" "time" ) // Azure reports time in UTC but it doesn't include the 'Z' time zone suffix in some cases. var tzOffsetRegex = regexp.MustCompile(`(?:Z|z|\+|-)(?:\d+:\d+)*"*$`) const ( utcDateTime = "2006-01-02T15:04:05.999999999" utcDateTimeJSON = `"` + utcDateTime + `"` utcDateTimeNoT = "2006-01-02 15:04:05.999999999" utcDateTimeJSONNoT = `"` + utcDateTimeNoT + `"` dateTimeNoT = `2006-01-02 15:04:05.999999999Z07:00` dateTimeJSON = `"` + time.RFC3339Nano + `"` dateTimeJSONNoT = `"` + dateTimeNoT + `"` ) type dateTimeRFC3339 time.Time func (t dateTimeRFC3339) MarshalJSON() ([]byte, error) { tt := time.Time(t) return tt.MarshalJSON() } func (t dateTimeRFC3339) MarshalText() ([]byte, error) { tt := time.Time(t) return tt.MarshalText() } func (t *dateTimeRFC3339) UnmarshalJSON(data []byte) error { tzOffset := tzOffsetRegex.Match(data) hasT := strings.Contains(string(data), "T") || strings.Contains(string(data), "t") var layout string if tzOffset && hasT { layout = dateTimeJSON } else if tzOffset { layout = dateTimeJSONNoT } else if hasT { layout = utcDateTimeJSON } else { layout = utcDateTimeJSONNoT } return t.Parse(layout, string(data)) } func (t *dateTimeRFC3339) UnmarshalText(data []byte) error { if len(data) == 0 { return nil } tzOffset := tzOffsetRegex.Match(data) hasT := strings.Contains(string(data), "T") || strings.Contains(string(data), "t") var layout string if tzOffset && hasT { layout = time.RFC3339Nano } else if tzOffset { layout = dateTimeNoT } else if hasT { layout = utcDateTime } else { layout = utcDateTimeNoT } return t.Parse(layout, string(data)) } func (t *dateTimeRFC3339) Parse(layout, value string) error { p, err := time.Parse(layout, strings.ToUpper(value)) *t = dateTimeRFC3339(p) return err } func (t dateTimeRFC3339) String() string { return time.Time(t).Format(time.RFC3339Nano) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated/zz_xml_helper.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Code generated by Microsoft (R) AutoRest Code Generator. DO NOT EDIT. // Changes may cause incorrect behavior and will be lost if the code is regenerated. package generated import ( "encoding/xml" "errors" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "io" "strings" ) type additionalProperties map[string]*string // UnmarshalXML implements the xml.Unmarshaler interface for additionalProperties. func (ap *additionalProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { tokName := "" tokValue := "" for { t, err := d.Token() if errors.Is(err, io.EOF) { break } else if err != nil { return err } switch tt := t.(type) { case xml.StartElement: tokName = strings.ToLower(tt.Name.Local) tokValue = "" case xml.CharData: if tokName == "" { continue } tokValue = string(tt) case xml.EndElement: if tokName == "" { continue } if *ap == nil { *ap = additionalProperties{} } (*ap)[tokName] = to.Ptr(tokValue) tokName = "" } } return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/batch_transfer.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package shared import ( "context" "errors" ) const ( DefaultConcurrency = 5 ) // BatchTransferOptions identifies options used by doBatchTransfer. type BatchTransferOptions struct { TransferSize int64 ChunkSize int64 NumChunks uint64 Concurrency uint16 Operation func(ctx context.Context, offset int64, chunkSize int64) error OperationName string } // DoBatchTransfer helps to execute operations in a batch manner. // Can be used by users to customize batch works (for other scenarios that the SDK does not provide) func DoBatchTransfer(ctx context.Context, o *BatchTransferOptions) error { if o.ChunkSize == 0 { return errors.New("ChunkSize cannot be 0") } if o.Concurrency == 0 { o.Concurrency = DefaultConcurrency // default concurrency } // Prepare and do parallel operations. operationChannel := make(chan func() error, o.Concurrency) // Create the channel that release 'concurrency' goroutines concurrently operationResponseChannel := make(chan error, o.NumChunks) // Holds each response ctx, cancel := context.WithCancel(ctx) defer cancel() // Create the goroutines that process each operation (in parallel). for g := uint16(0); g < o.Concurrency; g++ { go func() { for f := range operationChannel { err := f() operationResponseChannel <- err } }() } // Add each chunk's operation to the channel. for chunkNum := uint64(0); chunkNum < o.NumChunks; chunkNum++ { curChunkSize := o.ChunkSize if chunkNum == o.NumChunks-1 { // Last chunk curChunkSize = o.TransferSize - (int64(chunkNum) * o.ChunkSize) // Remove size of all transferred chunks from total } offset := int64(chunkNum) * o.ChunkSize operationChannel <- func() error { return o.Operation(ctx, offset, curChunkSize) } } close(operationChannel) // Wait for the operations to complete. var firstErr error = nil for chunkNum := uint64(0); chunkNum < o.NumChunks; chunkNum++ { responseError := <-operationResponseChannel // record the first error (the original error which should cause the other chunks to fail with canceled context) if responseError != nil && firstErr == nil { cancel() // As soon as any operation fails, cancel all remaining operation calls firstErr = responseError } } return firstErr } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/buffer_manager.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package shared type BufferManager[T ~[]byte] interface { // Acquire returns the channel that contains the pool of buffers. Acquire() <-chan T // Release releases the buffer back to the pool for reuse/cleanup. Release(T) // Grow grows the number of buffers, up to the predefined max. // It returns the total number of buffers or an error. // No error is returned if the number of buffers has reached max. // This is called only from the reading goroutine. Grow() (int, error) // Free cleans up all buffers. Free() } // mmbPool implements the bufferManager interface. // it uses anonymous memory mapped files for buffers. // don't use this type directly, use newMMBPool() instead. type mmbPool struct { buffers chan Mmb count int max int size int64 } func NewMMBPool(maxBuffers int, bufferSize int64) BufferManager[Mmb] { return &mmbPool{ buffers: make(chan Mmb, maxBuffers), max: maxBuffers, size: bufferSize, } } func (pool *mmbPool) Acquire() <-chan Mmb { return pool.buffers } func (pool *mmbPool) Grow() (int, error) { if pool.count < pool.max { buffer, err := NewMMB(pool.size) if err != nil { return 0, err } pool.buffers <- buffer pool.count++ } return pool.count, nil } func (pool *mmbPool) Release(buffer Mmb) { pool.buffers <- buffer } func (pool *mmbPool) Free() { for i := 0; i < pool.count; i++ { buffer := <-pool.buffers buffer.Delete() } pool.count = 0 } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/bytes_writer.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package shared import ( "errors" ) type bytesWriter []byte func NewBytesWriter(b []byte) bytesWriter { return b } func (c bytesWriter) WriteAt(b []byte, off int64) (int, error) { if off >= int64(len(c)) || off < 0 { return 0, errors.New("offset value is out of range") } n := copy(c[int(off):], b) if n < len(b) { return n, errors.New("not enough space for all bytes") } return n, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/challenge_policy.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package shared import ( "errors" "net/http" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" ) type storageAuthorizer struct { scopes []string tenantID string } func NewStorageChallengePolicy(cred azcore.TokenCredential, audience string, allowHTTP bool) policy.Policy { s := storageAuthorizer{scopes: []string{audience}} return runtime.NewBearerTokenPolicy(cred, []string{audience}, &policy.BearerTokenOptions{ AuthorizationHandler: policy.AuthorizationHandler{ OnRequest: s.onRequest, OnChallenge: s.onChallenge, }, InsecureAllowCredentialWithHTTP: allowHTTP, }) } func (s *storageAuthorizer) onRequest(req *policy.Request, authNZ func(policy.TokenRequestOptions) error) error { return authNZ(policy.TokenRequestOptions{Scopes: s.scopes}) } func (s *storageAuthorizer) onChallenge(req *policy.Request, resp *http.Response, authNZ func(policy.TokenRequestOptions) error) error { // parse the challenge err := s.parseChallenge(resp) if err != nil { return err } // TODO: Set tenantID when policy.TokenRequestOptions supports it. https://github.com/Azure/azure-sdk-for-go/issues/19841 return authNZ(policy.TokenRequestOptions{Scopes: s.scopes}) } type challengePolicyError struct { err error } func (c *challengePolicyError) Error() string { return c.err.Error() } func (*challengePolicyError) NonRetriable() { // marker method } func (c *challengePolicyError) Unwrap() error { return c.err } // parses Tenant ID from auth challenge // https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/oauth2/authorize func parseTenant(url string) string { if url == "" { return "" } parts := strings.Split(url, "/") if len(parts) >= 3 { tenant := parts[3] tenant = strings.ReplaceAll(tenant, ",", "") return tenant } else { return "" } } func (s *storageAuthorizer) parseChallenge(resp *http.Response) error { authHeader := resp.Header.Get("WWW-Authenticate") if authHeader == "" { return &challengePolicyError{err: errors.New("response has no WWW-Authenticate header for challenge authentication")} } // Strip down to auth and resource // Format is "Bearer authorization_uri=\"\" resource_id=\"\"" authHeader = strings.ReplaceAll(authHeader, "Bearer ", "") parts := strings.Split(authHeader, " ") vals := map[string]string{} for _, part := range parts { subParts := strings.Split(part, "=") if len(subParts) == 2 { stripped := strings.ReplaceAll(subParts[1], "\"", "") stripped = strings.TrimSuffix(stripped, ",") vals[subParts[0]] = stripped } } s.tenantID = parseTenant(vals["authorization_uri"]) scope := vals["resource_id"] if scope == "" { return &challengePolicyError{err: errors.New("could not find a valid resource in the WWW-Authenticate header")} } if !strings.HasSuffix(scope, "/.default") { scope += "/.default" } s.scopes = []string{scope} return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/mmf_unix.go ================================================ //go:build go1.18 && (linux || darwin || dragonfly || freebsd || openbsd || netbsd || solaris || aix || zos) // +build go1.18 // +build linux darwin dragonfly freebsd openbsd netbsd solaris aix zos // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package shared import ( "fmt" "os" "syscall" ) // mmb is a memory mapped buffer type Mmb []byte // newMMB creates a new memory mapped buffer with the specified size func NewMMB(size int64) (Mmb, error) { prot, flags := syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_ANON|syscall.MAP_PRIVATE addr, err := syscall.Mmap(-1, 0, int(size), prot, flags) if err != nil { return nil, os.NewSyscallError("Mmap", err) } return Mmb(addr), nil } // delete cleans up the memory mapped buffer func (m *Mmb) Delete() { err := syscall.Munmap(*m) *m = nil if err != nil { // if we get here, there is likely memory corruption. // please open an issue https://github.com/Azure/azure-sdk-for-go/issues panic(fmt.Sprintf("Munmap error: %v", err)) } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/mmf_windows.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package shared import ( "fmt" "os" "reflect" "syscall" "unsafe" ) // Mmb is a memory mapped buffer type Mmb []byte // NewMMB creates a new memory mapped buffer with the specified size func NewMMB(size int64) (Mmb, error) { const InvalidHandleValue = ^uintptr(0) // -1 prot, access := uint32(syscall.PAGE_READWRITE), uint32(syscall.FILE_MAP_WRITE) hMMF, err := syscall.CreateFileMapping(syscall.Handle(InvalidHandleValue), nil, prot, uint32(size>>32), uint32(size&0xffffffff), nil) if err != nil { return nil, os.NewSyscallError("CreateFileMapping", err) } defer func() { _ = syscall.CloseHandle(hMMF) }() addr, err := syscall.MapViewOfFile(hMMF, access, 0, 0, uintptr(size)) if err != nil { return nil, os.NewSyscallError("MapViewOfFile", err) } m := Mmb{} h := (*reflect.SliceHeader)(unsafe.Pointer(&m)) h.Data = addr h.Len = int(size) h.Cap = h.Len return m, nil } // Delete cleans up the memory mapped buffer func (m *Mmb) Delete() { addr := uintptr(unsafe.Pointer(&(([]byte)(*m)[0]))) *m = Mmb{} err := syscall.UnmapViewOfFile(addr) if err != nil { // if we get here, there is likely memory corruption. // please open an issue https://github.com/Azure/azure-sdk-for-go/issues panic(fmt.Sprintf("UnmapViewOfFile error: %v", err)) } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/section_writer.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package shared import ( "errors" "io" ) type SectionWriter struct { Count int64 Offset int64 Position int64 WriterAt io.WriterAt } func NewSectionWriter(c io.WriterAt, off int64, count int64) *SectionWriter { return &SectionWriter{ Count: count, Offset: off, WriterAt: c, } } func (c *SectionWriter) Write(p []byte) (int, error) { remaining := c.Count - c.Position if remaining <= 0 { return 0, errors.New("end of section reached") } slice := p if int64(len(slice)) > remaining { slice = slice[:remaining] } n, err := c.WriterAt.WriteAt(slice, c.Offset+c.Position) c.Position += int64(n) if err != nil { return n, err } if len(p) > n { return n, errors.New("not enough space for all bytes") } return n, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared/shared.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package shared import ( "errors" "fmt" "hash/crc64" "io" "net" "net/url" "strconv" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/internal/uuid" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) const ( TokenScope = "https://storage.azure.com/.default" ) const ( HeaderAuthorization = "Authorization" HeaderXmsDate = "x-ms-date" HeaderContentLength = "Content-Length" HeaderContentEncoding = "Content-Encoding" HeaderContentLanguage = "Content-Language" HeaderContentType = "Content-Type" HeaderContentMD5 = "Content-MD5" HeaderIfModifiedSince = "If-Modified-Since" HeaderIfMatch = "If-Match" HeaderIfNoneMatch = "If-None-Match" HeaderIfUnmodifiedSince = "If-Unmodified-Since" HeaderRange = "Range" HeaderXmsVersion = "x-ms-version" HeaderXmsRequestID = "x-ms-request-id" ) const crc64Polynomial uint64 = 0x9A6C9329AC4BC9B5 var CRC64Table = crc64.MakeTable(crc64Polynomial) // CopyOptions returns a zero-value T if opts is nil. // If opts is not nil, a copy is made and its address returned. func CopyOptions[T any](opts *T) *T { if opts == nil { return new(T) } cp := *opts return &cp } var errConnectionString = errors.New("connection string is either blank or malformed. The expected connection string " + "should contain key value pairs separated by semicolons. For example 'DefaultEndpointsProtocol=https;AccountName=;" + "AccountKey=;EndpointSuffix=core.windows.net'") type ParsedConnectionString struct { ServiceURL string AccountName string AccountKey string } func ParseConnectionString(connectionString string) (ParsedConnectionString, error) { const ( defaultScheme = "https" defaultSuffix = "core.windows.net" ) connStrMap := make(map[string]string) connectionString = strings.TrimRight(connectionString, ";") splitString := strings.Split(connectionString, ";") if len(splitString) == 0 { return ParsedConnectionString{}, errConnectionString } for _, stringPart := range splitString { parts := strings.SplitN(stringPart, "=", 2) if len(parts) != 2 { return ParsedConnectionString{}, errConnectionString } connStrMap[parts[0]] = parts[1] } protocol, ok := connStrMap["DefaultEndpointsProtocol"] if !ok { protocol = defaultScheme } suffix, ok := connStrMap["EndpointSuffix"] if !ok { suffix = defaultSuffix } blobEndpoint, has_blobEndpoint := connStrMap["BlobEndpoint"] accountName, has_accountName := connStrMap["AccountName"] var serviceURL string if has_blobEndpoint { serviceURL = blobEndpoint } else if has_accountName { serviceURL = fmt.Sprintf("%v://%v.blob.%v", protocol, accountName, suffix) } else { return ParsedConnectionString{}, errors.New("connection string needs either AccountName or BlobEndpoint") } if !strings.HasSuffix(serviceURL, "/") { // add a trailing slash to be consistent with the portal serviceURL += "/" } accountKey, has_accountKey := connStrMap["AccountKey"] sharedAccessSignature, has_sharedAccessSignature := connStrMap["SharedAccessSignature"] if has_accountName && has_accountKey { return ParsedConnectionString{ ServiceURL: serviceURL, AccountName: accountName, AccountKey: accountKey, }, nil } else if has_sharedAccessSignature { return ParsedConnectionString{ ServiceURL: fmt.Sprintf("%v?%v", serviceURL, sharedAccessSignature), }, nil } else { return ParsedConnectionString{}, errors.New("connection string needs either AccountKey or SharedAccessSignature") } } // SerializeBlobTags converts tags to generated.BlobTags func SerializeBlobTags(tagsMap map[string]string) *generated.BlobTags { blobTagSet := make([]*generated.BlobTag, 0) for key, val := range tagsMap { newKey, newVal := key, val blobTagSet = append(blobTagSet, &generated.BlobTag{Key: &newKey, Value: &newVal}) } return &generated.BlobTags{BlobTagSet: blobTagSet} } func SerializeBlobTagsToStrPtr(tagsMap map[string]string) *string { if len(tagsMap) == 0 { return nil } tags := make([]string, 0) for key, val := range tagsMap { tags = append(tags, url.QueryEscape(key)+"="+url.QueryEscape(val)) } blobTagsString := strings.Join(tags, "&") return &blobTagsString } func ValidateSeekableStreamAt0AndGetCount(body io.ReadSeeker) (int64, error) { if body == nil { // nil body's are "logically" seekable to 0 and are 0 bytes long return 0, nil } err := validateSeekableStreamAt0(body) if err != nil { return 0, err } count, err := body.Seek(0, io.SeekEnd) if err != nil { return 0, errors.New("body stream must be seekable") } _, err = body.Seek(0, io.SeekStart) if err != nil { return 0, err } return count, nil } // return an error if body is not a valid seekable stream at 0 func validateSeekableStreamAt0(body io.ReadSeeker) error { if body == nil { // nil body's are "logically" seekable to 0 return nil } if pos, err := body.Seek(0, io.SeekCurrent); pos != 0 || err != nil { // Help detect programmer error if err != nil { return errors.New("body stream must be seekable") } return errors.New("body stream must be set to position 0") } return nil } func RangeToString(offset, count int64) string { return "bytes=" + strconv.FormatInt(offset, 10) + "-" + strconv.FormatInt(offset+count-1, 10) } type nopCloser struct { io.ReadSeeker } func (n nopCloser) Close() error { return nil } // NopCloser returns a ReadSeekCloser with a no-op close method wrapping the provided io.ReadSeeker. func NopCloser(rs io.ReadSeeker) io.ReadSeekCloser { return nopCloser{rs} } func GenerateLeaseID(leaseID *string) (*string, error) { if leaseID == nil { generatedUuid, err := uuid.New() if err != nil { return nil, err } leaseID = to.Ptr(generatedUuid.String()) } return leaseID, nil } func GetClientOptions[T any](o *T) *T { if o == nil { return new(T) } return o } // IsIPEndpointStyle checkes if URL's host is IP, in this case the storage account endpoint will be composed as: // http(s)://IP(:port)/storageaccount/container/... // As url's Host property, host could be both host or host:port func IsIPEndpointStyle(host string) bool { if host == "" { return false } if h, _, err := net.SplitHostPort(host); err == nil { host = h } // For IPv6, there could be case where SplitHostPort fails for cannot finding port. // In this case, eliminate the '[' and ']' in the URL. // For details about IPv6 URL, please refer to https://tools.ietf.org/html/rfc2732 if host[0] == '[' && host[len(host)-1] == ']' { host = host[1 : len(host)-1] } return net.ParseIP(host) != nil } // ReadAtLeast reads from r into buf until it has read at least min bytes. // It returns the number of bytes copied and an error. // The EOF error is returned if no bytes were read or // EOF happened after reading fewer than min bytes. // If min is greater than the length of buf, ReadAtLeast returns ErrShortBuffer. // On return, n >= min if and only if err == nil. // If r returns an error having read at least min bytes, the error is dropped. // This method is same as io.ReadAtLeast except that it does not // return io.ErrUnexpectedEOF when fewer than min bytes are read. func ReadAtLeast(r io.Reader, buf []byte, min int) (n int, err error) { if len(buf) < min { return 0, io.ErrShortBuffer } for n < min && err == nil { var nn int nn, err = r.Read(buf[n:]) n += nn } if n >= min { err = nil } return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/log.go ================================================ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package azblob import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" ) const ( // EventUpload is used for logging events related to upload operation. EventUpload = exported.EventUpload // EventSubmitBatch is used for logging events related to submit blob batch operation. EventSubmitBatch = exported.EventSubmitBatch ) ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/migrationguide.md ================================================ # Guide to migrate from `azure-storage-blob-go` to `azblob` This guide is intended to assist in the migration from the `azure-storage-blob-go` module, or previous betas of `azblob`, to the latest releases of the `azblob` module. ## Simplified API surface area The redesign of the `azblob` module separates clients into various sub-packages. In previous versions, the public surface area was "flat", so all clients and supporting types were in the `azblob` package. This made it difficult to navigate the public surface area. ## Clients In `azure-storage-blob-go` a client constructor always requires a `url.URL` and `Pipeline` parameters. In `azblob` a client constructor always requires a `string` URL, any specified credential type, and a `*ClientOptions` for optional values. You pass `nil` to accept default options. ```go // new code client, err := azblob.NewClient("", cred, nil) ``` ## Authentication In `azure-storage-blob-go` you created a `Pipeline` with the required credential type. This pipeline was then passed to the client constructor. In `azblob`, you pass the required credential directly to the client constructor. ```go // new code. cred is an AAD token credential created from the azidentity module client, err := azblob.NewClient("", cred, nil) ``` The `azure-storage-blob-go` module provided limited support for OAuth token authentication via `NewTokenCredential`. This been replaced by using Azure Identity credentials from [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#section-readme). Authentication with a shared key via `NewSharedKeyCredential` remains unchanged. In `azure-storage-blob-go` you created a `Pipeline` with `NewAnonymousCredential` to support anonymous or SAS authentication. In `azblob` you use the construtor `NewClientWithNoCredential()` instead. ```go // new code client, err := azblob.NewClientWithNoCredential("", nil) ``` ## Listing blobs/containers In `azure-storage-blob-go` you explicitly created a `Marker` type that was used to page over results ([example](https://pkg.go.dev/github.com/Azure/azure-storage-blob-go/azblob?utm_source=godoc#example-package)). In `azblob`, operations that return paginated values return a `*runtime.Pager[T]`. ```go // new code pager := client.NewListBlobsFlatPager("my-container", nil) for pager.More() { page, err := pager.NextPage(context.TODO()) // process results } ``` ## Configuring the HTTP pipeline In `azure-storage-blob-go` you explicitly created a HTTP pipeline with configuration before creating a client. This pipeline instance was then passed as an argument to the client constructor ([example](https://pkg.go.dev/github.com/Azure/azure-storage-blob-go/azblob?utm_source=godoc#example-NewPipeline)). In `azblob` a HTTP pipeline is created during client construction. The pipeline is configured through the `azcore.ClientOptions` type. ```go // new code client, err := azblob.NewClient(account, cred, &azblob.ClientOptions{ ClientOptions: azcore.ClientOptions{ // configure HTTP pipeline options here }, }) ``` ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/models.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package azblob import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service" ) // CreateContainerOptions contains the optional parameters for the ContainerClient.Create method. type CreateContainerOptions = service.CreateContainerOptions // DeleteContainerOptions contains the optional parameters for the container.Client.Delete method. type DeleteContainerOptions = service.DeleteContainerOptions // DeleteBlobOptions contains the optional parameters for the Client.Delete method. type DeleteBlobOptions = blob.DeleteOptions // DownloadStreamOptions contains the optional parameters for the Client.DownloadStream method. type DownloadStreamOptions = blob.DownloadStreamOptions // ListBlobsFlatOptions contains the optional parameters for the container.Client.ListBlobFlatSegment method. type ListBlobsFlatOptions = container.ListBlobsFlatOptions // ListBlobsInclude indicates what additional information the service should return with each blob. type ListBlobsInclude = container.ListBlobsInclude // ListContainersOptions contains the optional parameters for the container.Client.ListContainers operation type ListContainersOptions = service.ListContainersOptions // UploadBufferOptions provides set of configurations for UploadBuffer operation type UploadBufferOptions = blockblob.UploadBufferOptions // UploadFileOptions provides set of configurations for UploadFile operation type UploadFileOptions = blockblob.UploadFileOptions // UploadStreamOptions provides set of configurations for UploadStream operation type UploadStreamOptions = blockblob.UploadStreamOptions // DownloadBufferOptions identifies options used by the DownloadBuffer and DownloadFile functions. type DownloadBufferOptions = blob.DownloadBufferOptions // DownloadFileOptions identifies options used by the DownloadBuffer and DownloadFile functions. type DownloadFileOptions = blob.DownloadFileOptions // CPKInfo contains a group of parameters for client provided encryption key. type CPKInfo = blob.CPKInfo // CPKScopeInfo contains a group of parameters for the ContainerClient.Create method. type CPKScopeInfo = container.CPKScopeInfo // AccessConditions identifies blob-specific access conditions which you optionally set. type AccessConditions = exported.BlobAccessConditions // ListContainersInclude indicates what additional information the service should return with each container. type ListContainersInclude = service.ListContainersInclude // ObjectReplicationPolicy are deserialized attributes type ObjectReplicationPolicy = blob.ObjectReplicationPolicy // RetryReaderOptions contains properties which can help to decide when to do retry. type RetryReaderOptions = blob.RetryReaderOptions ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob/client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package pageblob import ( "context" "io" "net/http" "net/url" "os" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" ) // ClientOptions contains the optional parameters when creating a Client. type ClientOptions base.ClientOptions // Client represents a client to an Azure Storage page blob; type Client base.CompositeClient[generated.BlobClient, generated.PageBlobClient] // NewClient creates an instance of Client with the specified values. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt // - cred - an Azure AD credential, typically obtained via the azidentity module // - options - client options; pass nil to accept the default values func NewClient(blobURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) { audience := base.GetAudience((*base.ClientOptions)(options)) conOptions := shared.GetClientOptions(options) authPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewPageBlobClient(blobURL, azClient, nil)), nil } // NewClientWithNoCredential creates an instance of Client with the specified values. // This is used to anonymously access a blob or with a shared access signature (SAS) token. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt? // - options - client options; pass nil to accept the default values func NewClientWithNoCredential(blobURL string, options *ClientOptions) (*Client, error) { conOptions := shared.GetClientOptions(options) azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewPageBlobClient(blobURL, azClient, nil)), nil } // NewClientWithSharedKeyCredential creates an instance of Client with the specified values. // - blobURL - the URL of the blob e.g. https://.blob.core.windows.net/container/blob.txt // - cred - a SharedKeyCredential created with the matching blob's storage account and access key // - options - client options; pass nil to accept the default values func NewClientWithSharedKeyCredential(blobURL string, cred *blob.SharedKeyCredential, options *ClientOptions) (*Client, error) { authPolicy := exported.NewSharedKeyCredPolicy(cred) conOptions := shared.GetClientOptions(options) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewPageBlobClient(blobURL, azClient, cred)), nil } // NewClientFromConnectionString creates an instance of Client with the specified values. // - connectionString - a connection string for the desired storage account // - containerName - the name of the container within the storage account // - blobName - the name of the blob within the container // - options - client options; pass nil to accept the default values func NewClientFromConnectionString(connectionString, containerName, blobName string, options *ClientOptions) (*Client, error) { parsed, err := shared.ParseConnectionString(connectionString) if err != nil { return nil, err } parsed.ServiceURL = runtime.JoinPaths(parsed.ServiceURL, containerName, blobName) if parsed.AccountKey != "" && parsed.AccountName != "" { credential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey) if err != nil { return nil, err } return NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options) } return NewClientWithNoCredential(parsed.ServiceURL, options) } func (pb *Client) generated() *generated.PageBlobClient { _, pageBlob := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.PageBlobClient])(pb)) return pageBlob } // URL returns the URL endpoint used by the Client object. func (pb *Client) URL() string { return pb.generated().Endpoint() } // BlobClient returns the embedded blob client for this AppendBlob client. func (pb *Client) BlobClient() *blob.Client { innerBlob, _ := base.InnerClients((*base.CompositeClient[generated.BlobClient, generated.PageBlobClient])(pb)) return (*blob.Client)(innerBlob) } func (pb *Client) sharedKey() *blob.SharedKeyCredential { return base.SharedKeyComposite((*base.CompositeClient[generated.BlobClient, generated.PageBlobClient])(pb)) } // WithSnapshot creates a new PageBlobURL object identical to the source but with the specified snapshot timestamp. // Pass "" to remove the snapshot returning a URL to the base blob. func (pb *Client) WithSnapshot(snapshot string) (*Client, error) { p, err := blob.ParseURL(pb.URL()) if err != nil { return nil, err } p.Snapshot = snapshot return (*Client)(base.NewPageBlobClient(p.String(), pb.generated().InternalClient(), pb.sharedKey())), nil } // WithVersionID creates a new PageBlobURL object identical to the source but with the specified snapshot timestamp. // Pass "" to remove the version returning a URL to the base blob. func (pb *Client) WithVersionID(versionID string) (*Client, error) { p, err := blob.ParseURL(pb.URL()) if err != nil { return nil, err } p.VersionID = versionID return (*Client)(base.NewPageBlobClient(p.String(), pb.generated().InternalClient(), pb.sharedKey())), nil } // Create creates a page blob of the specified length. Call PutPage to upload data to a page blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. func (pb *Client) Create(ctx context.Context, size int64, o *CreateOptions) (CreateResponse, error) { createOptions, HTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions := o.format() resp, err := pb.generated().Create(ctx, 0, size, createOptions, HTTPHeaders, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) return resp, err } // UploadPages writes 1 or more pages to the page blob. The start offset and the stream size must be a multiple of 512 bytes. // This method panics if the stream is not at position 0. // Note that the http client closes the body stream after the request is sent to the service. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. func (pb *Client) UploadPages(ctx context.Context, body io.ReadSeekCloser, contentRange blob.HTTPRange, options *UploadPagesOptions) (UploadPagesResponse, error) { count, err := shared.ValidateSeekableStreamAt0AndGetCount(body) if err != nil { return UploadPagesResponse{}, err } uploadPagesOptions := &generated.PageBlobClientUploadPagesOptions{ Range: exported.FormatHTTPRange(contentRange), } leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions := options.format() if options != nil && options.TransactionalValidation != nil { body, err = options.TransactionalValidation.Apply(body, uploadPagesOptions) if err != nil { return UploadPagesResponse{}, nil } } resp, err := pb.generated().UploadPages(ctx, count, body, uploadPagesOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions) return resp, err } // UploadPagesFromURL copies 1 or more pages from a source URL to the page blob. // The sourceOffset specifies the start offset of source data to copy from. // The destOffset specifies the start offset of data in page blob will be written to. // The count must be a multiple of 512 bytes. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page-from-url. func (pb *Client) UploadPagesFromURL(ctx context.Context, source string, sourceOffset, destOffset, count int64, o *UploadPagesFromURLOptions) (UploadPagesFromURLResponse, error) { uploadPagesFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sequenceNumberAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions := o.format() resp, err := pb.generated().UploadPagesFromURL(ctx, source, shared.RangeToString(sourceOffset, count), 0, shared.RangeToString(destOffset, count), uploadPagesFromURLOptions, cpkInfo, cpkScopeInfo, leaseAccessConditions, sequenceNumberAccessConditions, modifiedAccessConditions, sourceModifiedAccessConditions) return resp, err } // ClearPages frees the specified pages from the page blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. func (pb *Client) ClearPages(ctx context.Context, rnge blob.HTTPRange, options *ClearPagesOptions) (ClearPagesResponse, error) { clearOptions := &generated.PageBlobClientClearPagesOptions{ Range: exported.FormatHTTPRange(rnge), } leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions := options.format() resp, err := pb.generated().ClearPages(ctx, 0, clearOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, sequenceNumberAccessConditions, modifiedAccessConditions) return resp, err } // NewGetPageRangesPager returns the list of valid page ranges for a page blob or snapshot of a page blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. func (pb *Client) NewGetPageRangesPager(o *GetPageRangesOptions) *runtime.Pager[GetPageRangesResponse] { opts, leaseAccessConditions, modifiedAccessConditions := o.format() return runtime.NewPager(runtime.PagingHandler[GetPageRangesResponse]{ More: func(page GetPageRangesResponse) bool { return page.NextMarker != nil && len(*page.NextMarker) > 0 }, Fetcher: func(ctx context.Context, page *GetPageRangesResponse) (GetPageRangesResponse, error) { var req *policy.Request var err error if page == nil { req, err = pb.generated().GetPageRangesCreateRequest(ctx, opts, leaseAccessConditions, modifiedAccessConditions) } else { opts.Marker = page.NextMarker req, err = pb.generated().GetPageRangesCreateRequest(ctx, opts, leaseAccessConditions, modifiedAccessConditions) } if err != nil { return GetPageRangesResponse{}, err } resp, err := pb.generated().InternalClient().Pipeline().Do(req) if err != nil { return GetPageRangesResponse{}, err } if !runtime.HasStatusCode(resp, http.StatusOK) { return GetPageRangesResponse{}, runtime.NewResponseError(resp) } return pb.generated().GetPageRangesHandleResponse(resp) }, }) } // NewGetPageRangesDiffPager gets the collection of page ranges that differ between a specified snapshot and this page blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. func (pb *Client) NewGetPageRangesDiffPager(o *GetPageRangesDiffOptions) *runtime.Pager[GetPageRangesDiffResponse] { opts, leaseAccessConditions, modifiedAccessConditions := o.format() return runtime.NewPager(runtime.PagingHandler[GetPageRangesDiffResponse]{ More: func(page GetPageRangesDiffResponse) bool { return page.NextMarker != nil && len(*page.NextMarker) > 0 }, Fetcher: func(ctx context.Context, page *GetPageRangesDiffResponse) (GetPageRangesDiffResponse, error) { var req *policy.Request var err error if page == nil { req, err = pb.generated().GetPageRangesDiffCreateRequest(ctx, opts, leaseAccessConditions, modifiedAccessConditions) } else { opts.Marker = page.NextMarker req, err = pb.generated().GetPageRangesDiffCreateRequest(ctx, opts, leaseAccessConditions, modifiedAccessConditions) } if err != nil { return GetPageRangesDiffResponse{}, err } resp, err := pb.generated().InternalClient().Pipeline().Do(req) if err != nil { return GetPageRangesDiffResponse{}, err } if !runtime.HasStatusCode(resp, http.StatusOK) { return GetPageRangesDiffResponse{}, runtime.NewResponseError(resp) } return pb.generated().GetPageRangesDiffHandleResponse(resp) }, }) } // Resize resizes the page blob to the specified size (which must be a multiple of 512). // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. func (pb *Client) Resize(ctx context.Context, size int64, options *ResizeOptions) (ResizeResponse, error) { resizeOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions := options.format() resp, err := pb.generated().Resize(ctx, size, resizeOptions, leaseAccessConditions, cpkInfo, cpkScopeInfo, modifiedAccessConditions) return resp, err } // UpdateSequenceNumber sets the page blob's sequence number. func (pb *Client) UpdateSequenceNumber(ctx context.Context, options *UpdateSequenceNumberOptions) (UpdateSequenceNumberResponse, error) { actionType, updateOptions, lac, mac := options.format() resp, err := pb.generated().UpdateSequenceNumber(ctx, *actionType, updateOptions, lac, mac) return resp, err } // StartCopyIncremental begins an operation to start an incremental copy from one-page blob's snapshot to this page blob. // The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination. // The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual. // For more information, see https://docs.microsoft.com/rest/api/storageservices/incremental-copy-blob and // https://docs.microsoft.com/en-us/azure/virtual-machines/windows/incremental-snapshots. func (pb *Client) StartCopyIncremental(ctx context.Context, copySource string, prevSnapshot string, options *CopyIncrementalOptions) (CopyIncrementalResponse, error) { copySourceURL, err := url.Parse(copySource) if err != nil { return CopyIncrementalResponse{}, err } queryParams := copySourceURL.Query() queryParams.Set("snapshot", prevSnapshot) copySourceURL.RawQuery = queryParams.Encode() pageBlobCopyIncrementalOptions, modifiedAccessConditions := options.format() resp, err := pb.generated().CopyIncremental(ctx, copySourceURL.String(), pageBlobCopyIncrementalOptions, modifiedAccessConditions) return resp, err } // Redeclared APIs // Delete marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection. // Note that deleting a blob also deletes all its snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob. func (pb *Client) Delete(ctx context.Context, o *blob.DeleteOptions) (blob.DeleteResponse, error) { return pb.BlobClient().Delete(ctx, o) } // Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots. // For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob. func (pb *Client) Undelete(ctx context.Context, o *blob.UndeleteOptions) (blob.UndeleteResponse, error) { return pb.BlobClient().Undelete(ctx, o) } // SetImmutabilityPolicy operation enables users to set the immutability policy on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (pb *Client) SetImmutabilityPolicy(ctx context.Context, expiryTime time.Time, options *blob.SetImmutabilityPolicyOptions) (blob.SetImmutabilityPolicyResponse, error) { return pb.BlobClient().SetImmutabilityPolicy(ctx, expiryTime, options) } // DeleteImmutabilityPolicy operation enables users to delete the immutability policy on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (pb *Client) DeleteImmutabilityPolicy(ctx context.Context, options *blob.DeleteImmutabilityPolicyOptions) (blob.DeleteImmutabilityPolicyResponse, error) { return pb.BlobClient().DeleteImmutabilityPolicy(ctx, options) } // SetLegalHold operation enables users to set legal hold on a blob. // https://learn.microsoft.com/en-us/azure/storage/blobs/immutable-storage-overview func (pb *Client) SetLegalHold(ctx context.Context, legalHold bool, options *blob.SetLegalHoldOptions) (blob.SetLegalHoldResponse, error) { return pb.BlobClient().SetLegalHold(ctx, legalHold, options) } // SetTier operation sets the tier on a blob. The operation is allowed on a page // blob in a premium storage account and on a block blob in a blob storage account (locally // redundant storage only). A premium page blob's tier determines the allowed size, IOPs, and // bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation // does not update the blob's ETag. // For detailed information about block blob level tier-ing see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers. func (pb *Client) SetTier(ctx context.Context, tier blob.AccessTier, o *blob.SetTierOptions) (blob.SetTierResponse, error) { return pb.BlobClient().SetTier(ctx, tier, o) } // GetProperties returns the blob's properties. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties. func (pb *Client) GetProperties(ctx context.Context, o *blob.GetPropertiesOptions) (blob.GetPropertiesResponse, error) { return pb.BlobClient().GetProperties(ctx, o) } // GetAccountInfo provides account level information // For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures. func (pb *Client) GetAccountInfo(ctx context.Context, o *blob.GetAccountInfoOptions) (blob.GetAccountInfoResponse, error) { return pb.BlobClient().GetAccountInfo(ctx, o) } // SetHTTPHeaders changes a blob's HTTP headers. // For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. func (pb *Client) SetHTTPHeaders(ctx context.Context, httpHeaders blob.HTTPHeaders, o *blob.SetHTTPHeadersOptions) (blob.SetHTTPHeadersResponse, error) { return pb.BlobClient().SetHTTPHeaders(ctx, httpHeaders, o) } // SetMetadata changes a blob's metadata. // https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata. func (pb *Client) SetMetadata(ctx context.Context, metadata map[string]*string, o *blob.SetMetadataOptions) (blob.SetMetadataResponse, error) { return pb.BlobClient().SetMetadata(ctx, metadata, o) } // CreateSnapshot creates a read-only snapshot of a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob. func (pb *Client) CreateSnapshot(ctx context.Context, o *blob.CreateSnapshotOptions) (blob.CreateSnapshotResponse, error) { return pb.BlobClient().CreateSnapshot(ctx, o) } // StartCopyFromURL copies the data at the source URL to a blob. // For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob. func (pb *Client) StartCopyFromURL(ctx context.Context, copySource string, o *blob.StartCopyFromURLOptions) (blob.StartCopyFromURLResponse, error) { return pb.BlobClient().StartCopyFromURL(ctx, copySource, o) } // AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob. func (pb *Client) AbortCopyFromURL(ctx context.Context, copyID string, o *blob.AbortCopyFromURLOptions) (blob.AbortCopyFromURLResponse, error) { return pb.BlobClient().AbortCopyFromURL(ctx, copyID, o) } // SetTags operation enables users to set tags on a blob or specific blob version, but not snapshot. // Each call to this operation replaces all existing tags attached to the blob. // To remove all tags from the blob, call this operation with no tags set. // https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-tags func (pb *Client) SetTags(ctx context.Context, tags map[string]string, o *blob.SetTagsOptions) (blob.SetTagsResponse, error) { return pb.BlobClient().SetTags(ctx, tags, o) } // GetTags operation enables users to get tags on a blob or specific blob version, or snapshot. // https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-tags func (pb *Client) GetTags(ctx context.Context, o *blob.GetTagsOptions) (blob.GetTagsResponse, error) { return pb.BlobClient().GetTags(ctx, o) } // CopyFromURL synchronously copies the data at the source URL to a block blob, with sizes up to 256 MB. // For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url. func (pb *Client) CopyFromURL(ctx context.Context, copySource string, o *blob.CopyFromURLOptions) (blob.CopyFromURLResponse, error) { return pb.BlobClient().CopyFromURL(ctx, copySource, o) } // GetSASURL is a convenience method for generating a SAS token for the currently pointed at Page blob. // It can only be used if the credential supplied during creation was a SharedKeyCredential. func (pb *Client) GetSASURL(permissions sas.BlobPermissions, expiry time.Time, o *blob.GetSASURLOptions) (string, error) { return pb.BlobClient().GetSASURL(permissions, expiry, o) } // Concurrent Download Functions ----------------------------------------------------------------------------------------- // DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata. // For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob. func (pb *Client) DownloadStream(ctx context.Context, o *blob.DownloadStreamOptions) (blob.DownloadStreamResponse, error) { return pb.BlobClient().DownloadStream(ctx, o) } // DownloadBuffer downloads an Azure blob to a buffer with parallel. func (pb *Client) DownloadBuffer(ctx context.Context, buffer []byte, o *blob.DownloadBufferOptions) (int64, error) { return pb.BlobClient().DownloadBuffer(ctx, shared.NewBytesWriter(buffer), o) } // DownloadFile downloads an Azure blob to a local file. // The file would be truncated if the size doesn't match. func (pb *Client) DownloadFile(ctx context.Context, file *os.File, o *blob.DownloadFileOptions) (int64, error) { return pb.BlobClient().DownloadFile(ctx, file, o) } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package pageblob import "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" const ( // PageBytes indicates the number of bytes in a page (512). PageBytes = 512 ) // CopyStatusType defines values for CopyStatusType type CopyStatusType = generated.CopyStatusType const ( CopyStatusTypePending CopyStatusType = generated.CopyStatusTypePending CopyStatusTypeSuccess CopyStatusType = generated.CopyStatusTypeSuccess CopyStatusTypeAborted CopyStatusType = generated.CopyStatusTypeAborted CopyStatusTypeFailed CopyStatusType = generated.CopyStatusTypeFailed ) // PossibleCopyStatusTypeValues returns the possible values for the CopyStatusType const type. func PossibleCopyStatusTypeValues() []CopyStatusType { return generated.PossibleCopyStatusTypeValues() } // PremiumPageBlobAccessTier defines values for Premium PageBlob's AccessTier. type PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTier const ( PremiumPageBlobAccessTierP10 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP10 PremiumPageBlobAccessTierP15 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP15 PremiumPageBlobAccessTierP20 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP20 PremiumPageBlobAccessTierP30 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP30 PremiumPageBlobAccessTierP4 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP4 PremiumPageBlobAccessTierP40 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP40 PremiumPageBlobAccessTierP50 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP50 PremiumPageBlobAccessTierP6 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP6 PremiumPageBlobAccessTierP60 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP60 PremiumPageBlobAccessTierP70 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP70 PremiumPageBlobAccessTierP80 PremiumPageBlobAccessTier = generated.PremiumPageBlobAccessTierP80 ) // PossiblePremiumPageBlobAccessTierValues returns the possible values for the PremiumPageBlobAccessTier const type. func PossiblePremiumPageBlobAccessTierValues() []PremiumPageBlobAccessTier { return generated.PossiblePremiumPageBlobAccessTierValues() } // SequenceNumberActionType defines values for SequenceNumberActionType. type SequenceNumberActionType = generated.SequenceNumberActionType const ( SequenceNumberActionTypeMax SequenceNumberActionType = generated.SequenceNumberActionTypeMax SequenceNumberActionTypeUpdate SequenceNumberActionType = generated.SequenceNumberActionTypeUpdate SequenceNumberActionTypeIncrement SequenceNumberActionType = generated.SequenceNumberActionTypeIncrement ) // PossibleSequenceNumberActionTypeValues returns the possible values for the SequenceNumberActionType const type. func PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType { return generated.PossibleSequenceNumberActionTypeValues() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob/models.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package pageblob import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // Type Declarations --------------------------------------------------------------------- // PageList - the list of pages. type PageList = generated.PageList // ClearRange defines a range of pages. type ClearRange = generated.ClearRange // PageRange defines a range of pages. type PageRange = generated.PageRange // SequenceNumberAccessConditions contains a group of parameters for the Client.UploadPages method. type SequenceNumberAccessConditions = generated.SequenceNumberAccessConditions // Request Model Declaration ------------------------------------------------------------------------------------------- // CreateOptions contains the optional parameters for the Client.Create method. type CreateOptions struct { // Set for page blobs only. The sequence number is a user-controlled value that you can use to track requests. The value of // the sequence number must be between 0 and 2^63 - 1. SequenceNumber *int64 // Optional. Used to set blob tags in various blob operations. Tags map[string]string // Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the // operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs // are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source // blob or file. Note that beginning with version 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. // See Naming and Referencing Containers, Blobs, and Metadata for more information. Metadata map[string]*string // Optional. Indicates the tier to be set on the page blob. Tier *PremiumPageBlobAccessTier HTTPHeaders *blob.HTTPHeaders CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo AccessConditions *blob.AccessConditions // Specifies the date time when the blobs immutability policy is set to expire. ImmutabilityPolicyExpiry *time.Time // Specifies the immutability policy mode to set on the blob. ImmutabilityPolicyMode *blob.ImmutabilityPolicyMode // Specified if a legal hold should be set on the blob. LegalHold *bool } func (o *CreateOptions) format() (*generated.PageBlobClientCreateOptions, *generated.BlobHTTPHeaders, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil } options := &generated.PageBlobClientCreateOptions{ BlobSequenceNumber: o.SequenceNumber, BlobTagsString: shared.SerializeBlobTagsToStrPtr(o.Tags), Metadata: o.Metadata, Tier: o.Tier, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return options, o.HTTPHeaders, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // UploadPagesOptions contains the optional parameters for the Client.UploadPages method. type UploadPagesOptions struct { // TransactionalValidation specifies the transfer validation type to use. // The default is nil (no transfer validation). TransactionalValidation blob.TransferValidationType CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo SequenceNumberAccessConditions *SequenceNumberAccessConditions AccessConditions *blob.AccessConditions } func (o *UploadPagesOptions) format() (*generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.SequenceNumberAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, o.SequenceNumberAccessConditions, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // UploadPagesFromURLOptions contains the optional parameters for the Client.UploadPagesFromURL method. type UploadPagesFromURLOptions struct { // Only Bearer type is supported. Credentials should be a valid OAuth access token to copy source. CopySourceAuthorization *string // SourceContentValidation contains the validation mechanism used on the range of bytes read from the source. SourceContentValidation blob.SourceContentValidationType CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo SequenceNumberAccessConditions *SequenceNumberAccessConditions SourceModifiedAccessConditions *blob.SourceModifiedAccessConditions AccessConditions *blob.AccessConditions } func (o *UploadPagesFromURLOptions) format() (*generated.PageBlobClientUploadPagesFromURLOptions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.LeaseAccessConditions, *generated.SequenceNumberAccessConditions, *generated.ModifiedAccessConditions, *generated.SourceModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil, nil, nil } options := &generated.PageBlobClientUploadPagesFromURLOptions{ CopySourceAuthorization: o.CopySourceAuthorization, } if o.SourceContentValidation != nil { o.SourceContentValidation.Apply(options) } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return options, o.CPKInfo, o.CPKScopeInfo, leaseAccessConditions, o.SequenceNumberAccessConditions, modifiedAccessConditions, o.SourceModifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // ClearPagesOptions contains the optional parameters for the Client.ClearPages operation type ClearPagesOptions struct { CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo SequenceNumberAccessConditions *SequenceNumberAccessConditions AccessConditions *blob.AccessConditions } func (o *ClearPagesOptions) format() (*generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.SequenceNumberAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, o.SequenceNumberAccessConditions, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // GetPageRangesOptions contains the optional parameters for the Client.NewGetPageRangesPager method. type GetPageRangesOptions struct { Marker *string // Specifies the maximum number of containers to return. If the request does not specify MaxResults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by MaxResults, or than the default of 5000. MaxResults *int32 // Optional. This header is only supported in service versions 2019-04-19 and after and specifies the URL of a previous snapshot // of the target blob. The response will only contain pages that were changed // between the target blob and its previous snapshot. PrevSnapshotURL *string // Optional in version 2015-07-08 and newer. The PrevSnapshot parameter is a DateTime value that specifies that the response // will contain only pages that were changed between target blob and previous // snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot // specified by PrevSnapshot is the older of the two. Note that incremental // snapshots are currently supported only for blobs created on or after January 1, 2016. PrevSnapshot *string // Range specifies a range of bytes. The default value is all bytes. Range blob.HTTPRange // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string AccessConditions *blob.AccessConditions } func (o *GetPageRangesOptions) format() (*generated.PageBlobClientGetPageRangesOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return &generated.PageBlobClientGetPageRangesOptions{}, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &generated.PageBlobClientGetPageRangesOptions{ Marker: o.Marker, Maxresults: o.MaxResults, Range: exported.FormatHTTPRange(o.Range), Snapshot: o.Snapshot, }, leaseAccessConditions, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // GetPageRangesDiffOptions contains the optional parameters for the Client.NewGetPageRangesDiffPager method. type GetPageRangesDiffOptions struct { // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify MaxResults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by MaxResults, or than the default of 5000. MaxResults *int32 // Optional. This header is only supported in service versions 2019-04-19 and after and specifies the URL of a previous snapshot // of the target blob. The response will only contain pages that were changed // between the target blob and its previous snapshot. PrevSnapshotURL *string // Optional in version 2015-07-08 and newer. The PrevSnapshot parameter is a DateTime value that specifies that the response // will contain only pages that were changed between target blob and previous // snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot // specified by PrevSnapshot is the older of the two. Note that incremental // snapshots are currently supported only for blobs created on or after January 1, 2016. PrevSnapshot *string // Range specifies a range of bytes. The default value is all bytes. Range blob.HTTPRange // The snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to retrieve. For more // information on working with blob snapshots, see Creating a Snapshot of a Blob. // [https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob] Snapshot *string AccessConditions *blob.AccessConditions } func (o *GetPageRangesDiffOptions) format() (*generated.PageBlobClientGetPageRangesDiffOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &generated.PageBlobClientGetPageRangesDiffOptions{ Marker: o.Marker, Maxresults: o.MaxResults, PrevSnapshotURL: o.PrevSnapshotURL, Prevsnapshot: o.PrevSnapshot, Range: exported.FormatHTTPRange(o.Range), Snapshot: o.Snapshot, }, leaseAccessConditions, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // ResizeOptions contains the optional parameters for the Client.Resize method. type ResizeOptions struct { CPKInfo *blob.CPKInfo CPKScopeInfo *blob.CPKScopeInfo AccessConditions *blob.AccessConditions } func (o *ResizeOptions) format() (*generated.PageBlobClientResizeOptions, *generated.LeaseAccessConditions, *generated.CPKInfo, *generated.CPKScopeInfo, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil, nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return nil, leaseAccessConditions, o.CPKInfo, o.CPKScopeInfo, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // UpdateSequenceNumberOptions contains the optional parameters for the Client.UpdateSequenceNumber method. type UpdateSequenceNumberOptions struct { ActionType *SequenceNumberActionType SequenceNumber *int64 AccessConditions *blob.AccessConditions } func (o *UpdateSequenceNumberOptions) format() (*generated.SequenceNumberActionType, *generated.PageBlobClientUpdateSequenceNumberOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil, nil } options := &generated.PageBlobClientUpdateSequenceNumberOptions{ BlobSequenceNumber: o.SequenceNumber, } if *o.ActionType == SequenceNumberActionTypeIncrement { options.BlobSequenceNumber = nil } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return o.ActionType, options, leaseAccessConditions, modifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- // CopyIncrementalOptions contains the optional parameters for the Client.StartCopyIncremental method. type CopyIncrementalOptions struct { ModifiedAccessConditions *blob.ModifiedAccessConditions } func (o *CopyIncrementalOptions) format() (*generated.PageBlobClientCopyIncrementalOptions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil } return nil, o.ModifiedAccessConditions } // --------------------------------------------------------------------------------------------------------------------- ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/pageblob/responses.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package pageblob import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // CreateResponse contains the response from method Client.Create. type CreateResponse = generated.PageBlobClientCreateResponse // UploadPagesResponse contains the response from method Client.UploadPages. type UploadPagesResponse = generated.PageBlobClientUploadPagesResponse // UploadPagesFromURLResponse contains the response from method Client.UploadPagesFromURL. type UploadPagesFromURLResponse = generated.PageBlobClientUploadPagesFromURLResponse // ClearPagesResponse contains the response from method Client.ClearPages. type ClearPagesResponse = generated.PageBlobClientClearPagesResponse // GetPageRangesResponse contains the response from method Client.NewGetPageRangesPager. type GetPageRangesResponse = generated.PageBlobClientGetPageRangesResponse // GetPageRangesDiffResponse contains the response from method Client.NewGetPageRangesDiffPager. type GetPageRangesDiffResponse = generated.PageBlobClientGetPageRangesDiffResponse // ResizeResponse contains the response from method Client.Resize. type ResizeResponse = generated.PageBlobClientResizeResponse // UpdateSequenceNumberResponse contains the response from method Client.UpdateSequenceNumber. type UpdateSequenceNumberResponse = generated.PageBlobClientUpdateSequenceNumberResponse // CopyIncrementalResponse contains the response from method Client.StartCopyIncremental. type CopyIncrementalResponse = generated.PageBlobClientCopyIncrementalResponse ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/responses.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package azblob import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service" ) // CreateContainerResponse contains the response from method container.Client.Create. type CreateContainerResponse = service.CreateContainerResponse // DeleteContainerResponse contains the response from method container.Client.Delete type DeleteContainerResponse = service.DeleteContainerResponse // DeleteBlobResponse contains the response from method blob.Client.Delete. type DeleteBlobResponse = blob.DeleteResponse // UploadResponse contains the response from method blockblob.Client.CommitBlockList. type UploadResponse = blockblob.CommitBlockListResponse // DownloadStreamResponse wraps AutoRest generated BlobDownloadResponse and helps to provide info for retry. type DownloadStreamResponse = blob.DownloadStreamResponse // ListBlobsFlatResponse contains the response from method container.Client.ListBlobFlatSegment. type ListBlobsFlatResponse = container.ListBlobsFlatResponse // ListContainersResponse contains the response from method service.Client.ListContainersSegment. type ListContainersResponse = service.ListContainersResponse // UploadBufferResponse contains the response from method Client.UploadBuffer/Client.UploadFile. type UploadBufferResponse = blockblob.UploadBufferResponse // UploadFileResponse contains the response from method Client.UploadBuffer/Client.UploadFile. type UploadFileResponse = blockblob.UploadFileResponse // UploadStreamResponse contains the response from method Client.CommitBlockList. type UploadStreamResponse = blockblob.CommitBlockListResponse // ListContainersSegmentResponse - An enumeration of containers type ListContainersSegmentResponse = generated.ListContainersSegmentResponse // ListBlobsFlatSegmentResponse - An enumeration of blobs type ListBlobsFlatSegmentResponse = generated.ListBlobsFlatSegmentResponse ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas/account.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package sas import ( "bytes" "errors" "fmt" "strings" "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" ) // SharedKeyCredential contains an account's name and its primary or secondary key. type SharedKeyCredential = exported.SharedKeyCredential // UserDelegationCredential contains an account's name and its user delegation key. type UserDelegationCredential = exported.UserDelegationCredential // AccountSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage account. // For more information, see https://docs.microsoft.com/rest/api/storageservices/constructing-an-account-sas type AccountSignatureValues struct { Version string `param:"sv"` // If not specified, this format to SASVersion Protocol Protocol `param:"spr"` // See the SASProtocol* constants StartTime time.Time `param:"st"` // Not specified if IsZero ExpiryTime time.Time `param:"se"` // Not specified if IsZero Permissions string `param:"sp"` // Create by initializing AccountPermissions and then call String() IPRange IPRange `param:"sip"` ResourceTypes string `param:"srt"` // Create by initializing AccountResourceTypes and then call String() EncryptionScope string `param:"ses"` } // SignWithSharedKey uses an account's shared key credential to sign this signature values to produce // the proper SAS query parameters. func (v AccountSignatureValues) SignWithSharedKey(sharedKeyCredential *SharedKeyCredential) (QueryParameters, error) { // https://docs.microsoft.com/en-us/rest/api/storageservices/Constructing-an-Account-SAS if v.ExpiryTime.IsZero() || v.Permissions == "" || v.ResourceTypes == "" { return QueryParameters{}, errors.New("account SAS is missing at least one of these: ExpiryTime, Permissions, Service, or ResourceType") } if v.Version == "" { v.Version = Version } perms, err := parseAccountPermissions(v.Permissions) if err != nil { return QueryParameters{}, err } v.Permissions = perms.String() resources, err := parseAccountResourceTypes(v.ResourceTypes) if err != nil { return QueryParameters{}, err } v.ResourceTypes = resources.String() startTime, expiryTime, _ := formatTimesForSigning(v.StartTime, v.ExpiryTime, time.Time{}) stringToSign := strings.Join([]string{ sharedKeyCredential.AccountName(), v.Permissions, "b", // blob service v.ResourceTypes, startTime, expiryTime, v.IPRange.String(), string(v.Protocol), v.Version, v.EncryptionScope, ""}, // That is right, the account SAS requires a terminating extra newline "\n") signature, err := exported.ComputeHMACSHA256(sharedKeyCredential, stringToSign) if err != nil { return QueryParameters{}, err } p := QueryParameters{ // Common SAS parameters version: v.Version, protocol: v.Protocol, startTime: v.StartTime, expiryTime: v.ExpiryTime, permissions: v.Permissions, ipRange: v.IPRange, encryptionScope: v.EncryptionScope, // Account-specific SAS parameters services: "b", // will always be "b" resourceTypes: v.ResourceTypes, // Calculated SAS signature signature: signature, } return p, nil } // AccountPermissions type simplifies creating the permissions string for an Azure Storage Account SAS. // Initialize an instance of this type and then call its String method to set AccountSignatureValues' Permissions field. type AccountPermissions struct { Read, Write, Delete, DeletePreviousVersion, PermanentDelete, List, Add, Create, Update, Process, FilterByTags, Tag, SetImmutabilityPolicy bool } // String produces the SAS permissions string for an Azure Storage account. // Call this method to set AccountSignatureValues' Permissions field. func (p *AccountPermissions) String() string { var buffer bytes.Buffer if p.Read { buffer.WriteRune('r') } if p.Write { buffer.WriteRune('w') } if p.Delete { buffer.WriteRune('d') } if p.DeletePreviousVersion { buffer.WriteRune('x') } if p.PermanentDelete { buffer.WriteRune('y') } if p.List { buffer.WriteRune('l') } if p.Add { buffer.WriteRune('a') } if p.Create { buffer.WriteRune('c') } if p.Update { buffer.WriteRune('u') } if p.Process { buffer.WriteRune('p') } if p.FilterByTags { buffer.WriteRune('f') } if p.Tag { buffer.WriteRune('t') } if p.SetImmutabilityPolicy { buffer.WriteRune('i') } return buffer.String() } // Parse initializes the AccountPermissions' fields from a string. func parseAccountPermissions(s string) (AccountPermissions, error) { p := AccountPermissions{} // Clear out the flags for _, r := range s { switch r { case 'r': p.Read = true case 'w': p.Write = true case 'd': p.Delete = true case 'x': p.DeletePreviousVersion = true case 'y': p.PermanentDelete = true case 'l': p.List = true case 'a': p.Add = true case 'c': p.Create = true case 'u': p.Update = true case 'p': p.Process = true case 't': p.Tag = true case 'f': p.FilterByTags = true case 'i': p.SetImmutabilityPolicy = true default: return AccountPermissions{}, fmt.Errorf("invalid permission character: '%v'", r) } } return p, nil } // AccountResourceTypes type simplifies creating the resource types string for an Azure Storage Account SAS. // Initialize an instance of this type and then call its String method to set AccountSignatureValues' ResourceTypes field. type AccountResourceTypes struct { Service, Container, Object bool } // String produces the SAS resource types string for an Azure Storage account. // Call this method to set AccountSignatureValues' ResourceTypes field. func (rt *AccountResourceTypes) String() string { var buffer bytes.Buffer if rt.Service { buffer.WriteRune('s') } if rt.Container { buffer.WriteRune('c') } if rt.Object { buffer.WriteRune('o') } return buffer.String() } // parseAccountResourceTypes initializes the AccountResourceTypes' fields from a string. func parseAccountResourceTypes(s string) (AccountResourceTypes, error) { rt := AccountResourceTypes{} for _, r := range s { switch r { case 's': rt.Service = true case 'c': rt.Container = true case 'o': rt.Object = true default: return AccountResourceTypes{}, fmt.Errorf("invalid resource type character: '%v'", r) } } return rt, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas/query_params.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package sas import ( "errors" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "net" "net/url" "strings" "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" ) // TimeFormat represents the format of a SAS start or expiry time. Use it when formatting/parsing a time.Time. const ( TimeFormat = "2006-01-02T15:04:05Z" // "2017-07-27T00:00:00Z" // ISO 8601 ) var ( // Version is the default version encoded in the SAS token. Version = generated.ServiceVersion ) // TimeFormats ISO 8601 format. // Please refer to https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas for more details. var timeFormats = []string{"2006-01-02T15:04:05.0000000Z", TimeFormat, "2006-01-02T15:04Z", "2006-01-02"} // Protocol indicates the http/https. type Protocol string const ( // ProtocolHTTPS can be specified for a SAS protocol. ProtocolHTTPS Protocol = "https" // ProtocolHTTPSandHTTP can be specified for a SAS protocol. ProtocolHTTPSandHTTP Protocol = "https,http" ) // FormatTimesForSigning converts a time.Time to a snapshotTimeFormat string suitable for a // Field's StartTime or ExpiryTime fields. Returns "" if value.IsZero(). func formatTimesForSigning(startTime, expiryTime, snapshotTime time.Time) (string, string, string) { ss := "" if !startTime.IsZero() { ss = formatTimeWithDefaultFormat(&startTime) } se := "" if !expiryTime.IsZero() { se = formatTimeWithDefaultFormat(&expiryTime) } sh := "" if !snapshotTime.IsZero() { sh = snapshotTime.Format(exported.SnapshotTimeFormat) } return ss, se, sh } // formatTimeWithDefaultFormat format time with ISO 8601 in "yyyy-MM-ddTHH:mm:ssZ". func formatTimeWithDefaultFormat(t *time.Time) string { return formatTime(t, TimeFormat) // By default, "yyyy-MM-ddTHH:mm:ssZ" is used } // formatTime format time with given format, use ISO 8601 in "yyyy-MM-ddTHH:mm:ssZ" by default. func formatTime(t *time.Time, format string) string { if format != "" { return t.Format(format) } return t.Format(TimeFormat) // By default, "yyyy-MM-ddTHH:mm:ssZ" is used } // ParseTime try to parse a SAS time string. func parseTime(val string) (t time.Time, timeFormat string, err error) { for _, sasTimeFormat := range timeFormats { t, err = time.Parse(sasTimeFormat, val) if err == nil { timeFormat = sasTimeFormat break } } if err != nil { err = errors.New("fail to parse time with IOS 8601 formats, please refer to https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas for more details") } return } // IPRange represents a SAS IP range's start IP and (optionally) end IP. type IPRange struct { Start net.IP // Not specified if length = 0 End net.IP // Not specified if length = 0 } // String returns a string representation of an IPRange. func (ipr *IPRange) String() string { if len(ipr.Start) == 0 { return "" } start := ipr.Start.String() if len(ipr.End) == 0 { return start } return start + "-" + ipr.End.String() } // https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas // QueryParameters object represents the components that make up an Azure Storage SAS' query parameters. // You parse a map of query parameters into its fields by calling NewQueryParameters(). You add the components // to a query parameter map by calling AddToValues(). // NOTE: Changing any field requires computing a new SAS signature using a XxxSASSignatureValues type. // This type defines the components used by all Azure Storage resources (Containers, Blobs, Files, & Queues). type QueryParameters struct { // All members are immutable or values so copies of this struct are goroutine-safe. version string `param:"sv"` services string `param:"ss"` resourceTypes string `param:"srt"` protocol Protocol `param:"spr"` startTime time.Time `param:"st"` expiryTime time.Time `param:"se"` snapshotTime time.Time `param:"snapshot"` ipRange IPRange `param:"sip"` identifier string `param:"si"` resource string `param:"sr"` permissions string `param:"sp"` signature string `param:"sig"` cacheControl string `param:"rscc"` contentDisposition string `param:"rscd"` contentEncoding string `param:"rsce"` contentLanguage string `param:"rscl"` contentType string `param:"rsct"` signedOID string `param:"skoid"` signedTID string `param:"sktid"` signedStart time.Time `param:"skt"` signedService string `param:"sks"` signedExpiry time.Time `param:"ske"` signedVersion string `param:"skv"` signedDirectoryDepth string `param:"sdd"` authorizedObjectID string `param:"saoid"` unauthorizedObjectID string `param:"suoid"` correlationID string `param:"scid"` encryptionScope string `param:"ses"` // private member used for startTime and expiryTime formatting. stTimeFormat string seTimeFormat string } // AuthorizedObjectID returns authorizedObjectID. func (p *QueryParameters) AuthorizedObjectID() string { return p.authorizedObjectID } // UnauthorizedObjectID returns unauthorizedObjectID. func (p *QueryParameters) UnauthorizedObjectID() string { return p.unauthorizedObjectID } // SignedCorrelationID returns signedCorrelationID. func (p *QueryParameters) SignedCorrelationID() string { return p.correlationID } // EncryptionScope returns encryptionScope func (p *QueryParameters) EncryptionScope() string { return p.encryptionScope } // SignedOID returns signedOID. func (p *QueryParameters) SignedOID() string { return p.signedOID } // SignedTID returns signedTID. func (p *QueryParameters) SignedTID() string { return p.signedTID } // SignedStart returns signedStart. func (p *QueryParameters) SignedStart() time.Time { return p.signedStart } // SignedExpiry returns signedExpiry. func (p *QueryParameters) SignedExpiry() time.Time { return p.signedExpiry } // SignedService returns signedService. func (p *QueryParameters) SignedService() string { return p.signedService } // SignedVersion returns signedVersion. func (p *QueryParameters) SignedVersion() string { return p.signedVersion } // SnapshotTime returns snapshotTime. func (p *QueryParameters) SnapshotTime() time.Time { return p.snapshotTime } // Version returns version. func (p *QueryParameters) Version() string { return p.version } // Services returns services. func (p *QueryParameters) Services() string { return p.services } // ResourceTypes returns resourceTypes. func (p *QueryParameters) ResourceTypes() string { return p.resourceTypes } // Protocol returns protocol. func (p *QueryParameters) Protocol() Protocol { return p.protocol } // StartTime returns startTime. func (p *QueryParameters) StartTime() time.Time { return p.startTime } // ExpiryTime returns expiryTime. func (p *QueryParameters) ExpiryTime() time.Time { return p.expiryTime } // IPRange returns ipRange. func (p *QueryParameters) IPRange() IPRange { return p.ipRange } // Identifier returns identifier. func (p *QueryParameters) Identifier() string { return p.identifier } // Resource returns resource. func (p *QueryParameters) Resource() string { return p.resource } // Permissions returns permissions. func (p *QueryParameters) Permissions() string { return p.permissions } // Signature returns signature. func (p *QueryParameters) Signature() string { return p.signature } // CacheControl returns cacheControl. func (p *QueryParameters) CacheControl() string { return p.cacheControl } // ContentDisposition returns contentDisposition. func (p *QueryParameters) ContentDisposition() string { return p.contentDisposition } // ContentEncoding returns contentEncoding. func (p *QueryParameters) ContentEncoding() string { return p.contentEncoding } // ContentLanguage returns contentLanguage. func (p *QueryParameters) ContentLanguage() string { return p.contentLanguage } // ContentType returns contentType. func (p *QueryParameters) ContentType() string { return p.contentType } // SignedDirectoryDepth returns signedDirectoryDepth. func (p *QueryParameters) SignedDirectoryDepth() string { return p.signedDirectoryDepth } // Encode encodes the SAS query parameters into URL encoded form sorted by key. func (p *QueryParameters) Encode() string { v := url.Values{} if p.version != "" { v.Add("sv", p.version) } if p.services != "" { v.Add("ss", p.services) } if p.resourceTypes != "" { v.Add("srt", p.resourceTypes) } if p.protocol != "" { v.Add("spr", string(p.protocol)) } if !p.startTime.IsZero() { v.Add("st", formatTime(&(p.startTime), p.stTimeFormat)) } if !p.expiryTime.IsZero() { v.Add("se", formatTime(&(p.expiryTime), p.seTimeFormat)) } if len(p.ipRange.Start) > 0 { v.Add("sip", p.ipRange.String()) } if p.identifier != "" { v.Add("si", p.identifier) } if p.resource != "" { v.Add("sr", p.resource) } if p.permissions != "" { v.Add("sp", p.permissions) } if p.signedOID != "" { v.Add("skoid", p.signedOID) v.Add("sktid", p.signedTID) v.Add("skt", p.signedStart.Format(TimeFormat)) v.Add("ske", p.signedExpiry.Format(TimeFormat)) v.Add("sks", p.signedService) v.Add("skv", p.signedVersion) } if p.signature != "" { v.Add("sig", p.signature) } if p.cacheControl != "" { v.Add("rscc", p.cacheControl) } if p.contentDisposition != "" { v.Add("rscd", p.contentDisposition) } if p.contentEncoding != "" { v.Add("rsce", p.contentEncoding) } if p.contentLanguage != "" { v.Add("rscl", p.contentLanguage) } if p.contentType != "" { v.Add("rsct", p.contentType) } if p.signedDirectoryDepth != "" { v.Add("sdd", p.signedDirectoryDepth) } if p.authorizedObjectID != "" { v.Add("saoid", p.authorizedObjectID) } if p.unauthorizedObjectID != "" { v.Add("suoid", p.unauthorizedObjectID) } if p.correlationID != "" { v.Add("scid", p.correlationID) } if p.encryptionScope != "" { v.Add("ses", p.encryptionScope) } return v.Encode() } // NewQueryParameters creates and initializes a QueryParameters object based on the // query parameter map's passed-in values. If deleteSASParametersFromValues is true, // all SAS-related query parameters are removed from the passed-in map. If // deleteSASParametersFromValues is false, the map passed-in map is unaltered. func NewQueryParameters(values url.Values, deleteSASParametersFromValues bool) QueryParameters { p := QueryParameters{} for k, v := range values { val := v[0] isSASKey := true switch strings.ToLower(k) { case "sv": p.version = val case "ss": p.services = val case "srt": p.resourceTypes = val case "spr": p.protocol = Protocol(val) case "snapshot": p.snapshotTime, _ = time.Parse(exported.SnapshotTimeFormat, val) case "st": p.startTime, p.stTimeFormat, _ = parseTime(val) case "se": p.expiryTime, p.seTimeFormat, _ = parseTime(val) case "sip": dashIndex := strings.Index(val, "-") if dashIndex == -1 { p.ipRange.Start = net.ParseIP(val) } else { p.ipRange.Start = net.ParseIP(val[:dashIndex]) p.ipRange.End = net.ParseIP(val[dashIndex+1:]) } case "si": p.identifier = val case "sr": p.resource = val case "sp": p.permissions = val case "sig": p.signature = val case "rscc": p.cacheControl = val case "rscd": p.contentDisposition = val case "rsce": p.contentEncoding = val case "rscl": p.contentLanguage = val case "rsct": p.contentType = val case "skoid": p.signedOID = val case "sktid": p.signedTID = val case "skt": p.signedStart, _ = time.Parse(TimeFormat, val) case "ske": p.signedExpiry, _ = time.Parse(TimeFormat, val) case "sks": p.signedService = val case "skv": p.signedVersion = val case "sdd": p.signedDirectoryDepth = val case "saoid": p.authorizedObjectID = val case "suoid": p.unauthorizedObjectID = val case "scid": p.correlationID = val case "ses": p.encryptionScope = val default: isSASKey = false // We didn't recognize the query parameter } if isSASKey && deleteSASParametersFromValues { delete(values, k) } } return p } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas/service.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. package sas import ( "bytes" "errors" "fmt" "strings" "time" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" ) // BlobSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage container or blob. // For more information on creating service sas, see https://docs.microsoft.com/rest/api/storageservices/constructing-a-service-sas // For more information on creating user delegation sas, see https://docs.microsoft.com/rest/api/storageservices/create-user-delegation-sas type BlobSignatureValues struct { Version string `param:"sv"` // If not specified, this defaults to Version Protocol Protocol `param:"spr"` // See the Protocol* constants StartTime time.Time `param:"st"` // Not specified if IsZero ExpiryTime time.Time `param:"se"` // Not specified if IsZero SnapshotTime time.Time Permissions string `param:"sp"` // Create by initializing ContainerPermissions or BlobPermissions and then call String() IPRange IPRange `param:"sip"` Identifier string `param:"si"` ContainerName string BlobName string // Use "" to create a Container SAS Directory string // Not nil for a directory SAS (ie sr=d) CacheControl string // rscc ContentDisposition string // rscd ContentEncoding string // rsce ContentLanguage string // rscl ContentType string // rsct BlobVersion string // sr=bv AuthorizedObjectID string // saoid UnauthorizedObjectID string // suoid CorrelationID string // scid EncryptionScope string `param:"ses"` } func getDirectoryDepth(path string) string { if path == "" { return "" } return fmt.Sprint(strings.Count(path, "/") + 1) } // SignWithSharedKey uses an account's SharedKeyCredential to sign this signature values to produce the proper SAS query parameters. func (v BlobSignatureValues) SignWithSharedKey(sharedKeyCredential *SharedKeyCredential) (QueryParameters, error) { if v.Identifier == "" && (v.ExpiryTime.IsZero() || v.Permissions == "") { return QueryParameters{}, errors.New("service SAS is missing at least one of these: ExpiryTime or Permissions") } // Parse the resource resource := "c" if !v.SnapshotTime.IsZero() { resource = "bs" } else if v.BlobVersion != "" { resource = "bv" } else if v.Directory != "" { resource = "d" v.BlobName = "" } else if v.BlobName == "" { // do nothing } else { resource = "b" } // make sure the permission characters are in the correct order if resource == "c" { perms, err := parseContainerPermissions(v.Permissions) if err != nil { return QueryParameters{}, err } v.Permissions = perms.String() } else { perms, err := parseBlobPermissions(v.Permissions) if err != nil { return QueryParameters{}, err } v.Permissions = perms.String() } if v.Version == "" { v.Version = Version } startTime, expiryTime, snapshotTime := formatTimesForSigning(v.StartTime, v.ExpiryTime, v.SnapshotTime) signedIdentifier := v.Identifier // String to sign: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx stringToSign := strings.Join([]string{ v.Permissions, startTime, expiryTime, getCanonicalName(sharedKeyCredential.AccountName(), v.ContainerName, v.BlobName, v.Directory), signedIdentifier, v.IPRange.String(), string(v.Protocol), v.Version, resource, snapshotTime, // signed timestamp v.EncryptionScope, v.CacheControl, // rscc v.ContentDisposition, // rscd v.ContentEncoding, // rsce v.ContentLanguage, // rscl v.ContentType}, // rsct "\n") signature, err := exported.ComputeHMACSHA256(sharedKeyCredential, stringToSign) if err != nil { return QueryParameters{}, err } p := QueryParameters{ // Common SAS parameters version: v.Version, protocol: v.Protocol, startTime: v.StartTime, expiryTime: v.ExpiryTime, permissions: v.Permissions, ipRange: v.IPRange, encryptionScope: v.EncryptionScope, // Container/Blob-specific SAS parameters resource: resource, identifier: v.Identifier, cacheControl: v.CacheControl, contentDisposition: v.ContentDisposition, contentEncoding: v.ContentEncoding, contentLanguage: v.ContentLanguage, contentType: v.ContentType, snapshotTime: v.SnapshotTime, signedDirectoryDepth: getDirectoryDepth(v.Directory), authorizedObjectID: v.AuthorizedObjectID, unauthorizedObjectID: v.UnauthorizedObjectID, correlationID: v.CorrelationID, // Calculated SAS signature signature: signature, } return p, nil } // SignWithUserDelegation uses an account's UserDelegationCredential to sign this signature values to produce the proper SAS query parameters. func (v BlobSignatureValues) SignWithUserDelegation(userDelegationCredential *UserDelegationCredential) (QueryParameters, error) { if userDelegationCredential == nil { return QueryParameters{}, fmt.Errorf("cannot sign SAS query without User Delegation Key") } if v.ExpiryTime.IsZero() || v.Permissions == "" { return QueryParameters{}, errors.New("user delegation SAS is missing at least one of these: ExpiryTime or Permissions") } // Parse the resource resource := "c" if !v.SnapshotTime.IsZero() { resource = "bs" } else if v.BlobVersion != "" { resource = "bv" } else if v.Directory != "" { resource = "d" v.BlobName = "" } else if v.BlobName == "" { // do nothing } else { resource = "b" } // make sure the permission characters are in the correct order if resource == "c" { perms, err := parseContainerPermissions(v.Permissions) if err != nil { return QueryParameters{}, err } v.Permissions = perms.String() } else { perms, err := parseBlobPermissions(v.Permissions) if err != nil { return QueryParameters{}, err } v.Permissions = perms.String() } if v.Version == "" { v.Version = Version } startTime, expiryTime, snapshotTime := formatTimesForSigning(v.StartTime, v.ExpiryTime, v.SnapshotTime) udk := exported.GetUDKParams(userDelegationCredential) udkStart, udkExpiry, _ := formatTimesForSigning(*udk.SignedStart, *udk.SignedExpiry, time.Time{}) stringToSign := strings.Join([]string{ v.Permissions, startTime, expiryTime, getCanonicalName(exported.GetAccountName(userDelegationCredential), v.ContainerName, v.BlobName, v.Directory), *udk.SignedOID, *udk.SignedTID, udkStart, udkExpiry, *udk.SignedService, *udk.SignedVersion, v.AuthorizedObjectID, v.UnauthorizedObjectID, v.CorrelationID, v.IPRange.String(), string(v.Protocol), v.Version, resource, snapshotTime, // signed timestamp v.EncryptionScope, v.CacheControl, // rscc v.ContentDisposition, // rscd v.ContentEncoding, // rsce v.ContentLanguage, // rscl v.ContentType}, // rsct "\n") signature, err := exported.ComputeUDCHMACSHA256(userDelegationCredential, stringToSign) if err != nil { return QueryParameters{}, err } p := QueryParameters{ // Common SAS parameters version: v.Version, protocol: v.Protocol, startTime: v.StartTime, expiryTime: v.ExpiryTime, permissions: v.Permissions, ipRange: v.IPRange, encryptionScope: v.EncryptionScope, // Container/Blob-specific SAS parameters resource: resource, identifier: v.Identifier, cacheControl: v.CacheControl, contentDisposition: v.ContentDisposition, contentEncoding: v.ContentEncoding, contentLanguage: v.ContentLanguage, contentType: v.ContentType, snapshotTime: v.SnapshotTime, signedDirectoryDepth: getDirectoryDepth(v.Directory), authorizedObjectID: v.AuthorizedObjectID, unauthorizedObjectID: v.UnauthorizedObjectID, correlationID: v.CorrelationID, // Calculated SAS signature signature: signature, } // User delegation SAS specific parameters p.signedOID = *udk.SignedOID p.signedTID = *udk.SignedTID p.signedStart = *udk.SignedStart p.signedExpiry = *udk.SignedExpiry p.signedService = *udk.SignedService p.signedVersion = *udk.SignedVersion return p, nil } // getCanonicalName computes the canonical name for a container or blob resource for SAS signing. func getCanonicalName(account string, containerName string, blobName string, directoryName string) string { // Container: "/blob/account/containername" // Blob: "/blob/account/containername/blobname" elements := []string{"/blob/", account, "/", containerName} if blobName != "" { elements = append(elements, "/", strings.ReplaceAll(blobName, "\\", "/")) } else if directoryName != "" { elements = append(elements, "/", directoryName) } return strings.Join(elements, "") } // ContainerPermissions type simplifies creating the permissions string for an Azure Storage container SAS. // Initialize an instance of this type and then call its String method to set BlobSignatureValues' Permissions field. // All permissions descriptions can be found here: https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas#permissions-for-a-directory-container-or-blob type ContainerPermissions struct { Read, Add, Create, Write, Delete, DeletePreviousVersion, List, Tag, FilterByTags, Move, SetImmutabilityPolicy bool Execute, ModifyOwnership, ModifyPermissions bool // Meant for hierarchical namespace accounts } // String produces the SAS permissions string for an Azure Storage container. // Call this method to set BlobSignatureValues' Permissions field. func (p *ContainerPermissions) String() string { var b bytes.Buffer if p.Read { b.WriteRune('r') } if p.Add { b.WriteRune('a') } if p.Create { b.WriteRune('c') } if p.Write { b.WriteRune('w') } if p.Delete { b.WriteRune('d') } if p.DeletePreviousVersion { b.WriteRune('x') } if p.List { b.WriteRune('l') } if p.Tag { b.WriteRune('t') } if p.FilterByTags { b.WriteRune('f') } if p.Move { b.WriteRune('m') } if p.Execute { b.WriteRune('e') } if p.ModifyOwnership { b.WriteRune('o') } if p.ModifyPermissions { b.WriteRune('p') } if p.SetImmutabilityPolicy { b.WriteRune('i') } return b.String() } // Parse initializes ContainerPermissions' fields from a string. func parseContainerPermissions(s string) (ContainerPermissions, error) { p := ContainerPermissions{} // Clear the flags for _, r := range s { switch r { case 'r': p.Read = true case 'a': p.Add = true case 'c': p.Create = true case 'w': p.Write = true case 'd': p.Delete = true case 'x': p.DeletePreviousVersion = true case 'l': p.List = true case 't': p.Tag = true case 'f': p.FilterByTags = true case 'm': p.Move = true case 'e': p.Execute = true case 'o': p.ModifyOwnership = true case 'p': p.ModifyPermissions = true case 'i': p.SetImmutabilityPolicy = true default: return ContainerPermissions{}, fmt.Errorf("invalid permission: '%v'", r) } } return p, nil } // BlobPermissions type simplifies creating the permissions string for an Azure Storage blob SAS. // Initialize an instance of this type and then call its String method to set BlobSignatureValues' Permissions field. type BlobPermissions struct { Read, Add, Create, Write, Delete, DeletePreviousVersion, PermanentDelete, List, Tag, Move, Execute, Ownership, Permissions, SetImmutabilityPolicy bool } // String produces the SAS permissions string for an Azure Storage blob. // Call this method to set BlobSignatureValues' Permissions field. func (p *BlobPermissions) String() string { var b bytes.Buffer if p.Read { b.WriteRune('r') } if p.Add { b.WriteRune('a') } if p.Create { b.WriteRune('c') } if p.Write { b.WriteRune('w') } if p.Delete { b.WriteRune('d') } if p.DeletePreviousVersion { b.WriteRune('x') } if p.PermanentDelete { b.WriteRune('y') } if p.List { b.WriteRune('l') } if p.Tag { b.WriteRune('t') } if p.Move { b.WriteRune('m') } if p.Execute { b.WriteRune('e') } if p.Ownership { b.WriteRune('o') } if p.Permissions { b.WriteRune('p') } if p.SetImmutabilityPolicy { b.WriteRune('i') } return b.String() } // Parse initializes BlobPermissions' fields from a string. func parseBlobPermissions(s string) (BlobPermissions, error) { p := BlobPermissions{} // Clear the flags for _, r := range s { switch r { case 'r': p.Read = true case 'a': p.Add = true case 'c': p.Create = true case 'w': p.Write = true case 'd': p.Delete = true case 'x': p.DeletePreviousVersion = true case 'y': p.PermanentDelete = true case 'l': p.List = true case 't': p.Tag = true case 'm': p.Move = true case 'e': p.Execute = true case 'o': p.Ownership = true case 'p': p.Permissions = true case 'i': p.SetImmutabilityPolicy = true default: return BlobPermissions{}, fmt.Errorf("invalid permission: '%v'", r) } } return p, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas/url_parts.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package sas import ( "net/url" "strings" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" ) const ( snapshot = "snapshot" versionId = "versionid" ) // IPEndpointStyleInfo is used for IP endpoint style URL when working with Azure storage emulator. // Ex: "https://10.132.141.33/accountname/containername" type IPEndpointStyleInfo struct { AccountName string // "" if not using IP endpoint style } // URLParts object represents the components that make up an Azure Storage Container/Blob URL. // NOTE: Changing any SAS-related field requires computing a new SAS signature. type URLParts struct { Scheme string // Ex: "https://" Host string // Ex: "account.blob.core.windows.net", "10.132.141.33", "10.132.141.33:80" IPEndpointStyleInfo IPEndpointStyleInfo ContainerName string // "" if no container BlobName string // "" if no blob Snapshot string // "" if not a snapshot SAS QueryParameters UnparsedParams string VersionID string // "" if not versioning enabled } // ParseURL parses a URL initializing URLParts' fields including any SAS-related & snapshot query parameters. // Any other query parameters remain in the UnparsedParams field. func ParseURL(u string) (URLParts, error) { uri, err := url.Parse(u) if err != nil { return URLParts{}, err } up := URLParts{ Scheme: uri.Scheme, Host: uri.Host, } // Find the container & blob names (if any) if uri.Path != "" { path := uri.Path if path[0] == '/' { path = path[1:] // If path starts with a slash, remove it } if shared.IsIPEndpointStyle(up.Host) { if accountEndIndex := strings.Index(path, "/"); accountEndIndex == -1 { // Slash not found; path has account name & no container name or blob up.IPEndpointStyleInfo.AccountName = path path = "" // No ContainerName present in the URL so path should be empty } else { up.IPEndpointStyleInfo.AccountName = path[:accountEndIndex] // The account name is the part between the slashes path = path[accountEndIndex+1:] // path refers to portion after the account name now (container & blob names) } } containerEndIndex := strings.Index(path, "/") // Find the next slash (if it exists) if containerEndIndex == -1 { // Slash not found; path has container name & no blob name up.ContainerName = path } else { up.ContainerName = path[:containerEndIndex] // The container name is the part between the slashes up.BlobName = path[containerEndIndex+1:] // The blob name is after the container slash } } // Convert the query parameters to a case-sensitive map & trim whitespace paramsMap := uri.Query() up.Snapshot = "" // Assume no snapshot if snapshotStr, ok := caseInsensitiveValues(paramsMap).Get(snapshot); ok { up.Snapshot = snapshotStr[0] // If we recognized the query parameter, remove it from the map delete(paramsMap, snapshot) } up.VersionID = "" // Assume no versionID if versionIDs, ok := caseInsensitiveValues(paramsMap).Get(versionId); ok { up.VersionID = versionIDs[0] // If we recognized the query parameter, remove it from the map delete(paramsMap, versionId) // delete "versionid" from paramsMap delete(paramsMap, "versionId") // delete "versionId" from paramsMap } up.SAS = NewQueryParameters(paramsMap, true) up.UnparsedParams = paramsMap.Encode() return up, nil } // String returns a URL object whose fields are initialized from the URLParts fields. The URL's RawQuery // field contains the SAS, snapshot, and unparsed query parameters. func (up URLParts) String() string { path := "" if shared.IsIPEndpointStyle(up.Host) && up.IPEndpointStyleInfo.AccountName != "" { path += "/" + up.IPEndpointStyleInfo.AccountName } // Concatenate container & blob names (if they exist) if up.ContainerName != "" { path += "/" + up.ContainerName if up.BlobName != "" { path += "/" + up.BlobName } } rawQuery := up.UnparsedParams // If no snapshot is initially provided, fill it in from the SAS query properties to help the user if up.Snapshot == "" && !up.SAS.SnapshotTime().IsZero() { up.Snapshot = up.SAS.SnapshotTime().Format(exported.SnapshotTimeFormat) } // Concatenate blob version id query parameter (if it exists) if up.VersionID != "" { if len(rawQuery) > 0 { rawQuery += "&" } rawQuery += versionId + "=" + up.VersionID } // Concatenate blob snapshot query parameter (if it exists) if up.Snapshot != "" { if len(rawQuery) > 0 { rawQuery += "&" } rawQuery += snapshot + "=" + up.Snapshot } sas := up.SAS.Encode() if sas != "" { if len(rawQuery) > 0 { rawQuery += "&" } rawQuery += sas } u := url.URL{ Scheme: up.Scheme, Host: up.Host, Path: path, RawQuery: rawQuery, } return u.String() } type caseInsensitiveValues url.Values // map[string][]string func (values caseInsensitiveValues) Get(key string) ([]string, bool) { key = strings.ToLower(key) for k, v := range values { if strings.ToLower(k) == key { return v, true } } return []string{}, false } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/batch_builder.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package service import ( "context" "fmt" "net/url" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" ) // BatchBuilder is used for creating the batch operations list. It contains the list of either delete or set tier sub-requests. // NOTE: All sub-requests in the batch must be of the same type, either delete or set tier. type BatchBuilder struct { endpoint string authPolicy policy.Policy subRequests []*policy.Request operationType *exported.BlobBatchOperationType } func (bb *BatchBuilder) checkOperationType(operationType exported.BlobBatchOperationType) error { if bb.operationType == nil { bb.operationType = &operationType return nil } if *bb.operationType != operationType { return fmt.Errorf("BlobBatch only supports one operation type per batch and is already being used for %s operations", *bb.operationType) } return nil } // Delete operation is used to add delete sub-request to the batch builder. func (bb *BatchBuilder) Delete(containerName string, blobName string, options *BatchDeleteOptions) error { err := bb.checkOperationType(exported.BatchDeleteOperationType) if err != nil { return err } blobName = url.PathEscape(blobName) blobURL := runtime.JoinPaths(bb.endpoint, containerName, blobName) blobClient, err := blob.NewClientWithNoCredential(blobURL, nil) if err != nil { return err } deleteOptions, leaseInfo, accessConditions := options.format() req, err := getGeneratedBlobClient(blobClient).DeleteCreateRequest(context.TODO(), deleteOptions, leaseInfo, accessConditions) if err != nil { return err } // remove x-ms-version header exported.UpdateSubRequestHeaders(req) bb.subRequests = append(bb.subRequests, req) return nil } // SetTier operation is used to add set tier sub-request to the batch builder. func (bb *BatchBuilder) SetTier(containerName string, blobName string, accessTier blob.AccessTier, options *BatchSetTierOptions) error { err := bb.checkOperationType(exported.BatchSetTierOperationType) if err != nil { return err } blobName = url.PathEscape(blobName) blobURL := runtime.JoinPaths(bb.endpoint, containerName, blobName) blobClient, err := blob.NewClientWithNoCredential(blobURL, nil) if err != nil { return err } setTierOptions, leaseInfo, accessConditions := options.format() req, err := getGeneratedBlobClient(blobClient).SetTierCreateRequest(context.TODO(), accessTier, setTierOptions, leaseInfo, accessConditions) if err != nil { return err } // remove x-ms-version header exported.UpdateSubRequestHeaders(req) bb.subRequests = append(bb.subRequests, req) return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/client.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package service import ( "bytes" "context" "errors" "fmt" "net/http" "strings" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/base" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/shared" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/sas" ) // ClientOptions contains the optional parameters when creating a Client. type ClientOptions base.ClientOptions // Client represents a URL to the Azure Blob Storage service allowing you to manipulate blob containers. type Client base.Client[generated.ServiceClient] // NewClient creates an instance of Client with the specified values. // - serviceURL - the URL of the storage account e.g. https://.blob.core.windows.net/ // - cred - an Azure AD credential, typically obtained via the azidentity module // - options - client options; pass nil to accept the default values func NewClient(serviceURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error) { audience := base.GetAudience((*base.ClientOptions)(options)) conOptions := shared.GetClientOptions(options) authPolicy := shared.NewStorageChallengePolicy(cred, audience, conOptions.InsecureAllowCredentialWithHTTP) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewServiceClient(serviceURL, azClient, &cred, (*base.ClientOptions)(conOptions))), nil } // NewClientWithNoCredential creates an instance of Client with the specified values. // This is used to anonymously access a storage account or with a shared access signature (SAS) token. // - serviceURL - the URL of the storage account e.g. https://.blob.core.windows.net/? // - options - client options; pass nil to accept the default values func NewClientWithNoCredential(serviceURL string, options *ClientOptions) (*Client, error) { conOptions := shared.GetClientOptions(options) azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, runtime.PipelineOptions{}, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewServiceClient(serviceURL, azClient, nil, (*base.ClientOptions)(conOptions))), nil } // NewClientWithSharedKeyCredential creates an instance of Client with the specified values. // - serviceURL - the URL of the storage account e.g. https://.blob.core.windows.net/ // - cred - a SharedKeyCredential created with the matching storage account and access key // - options - client options; pass nil to accept the default values func NewClientWithSharedKeyCredential(serviceURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error) { authPolicy := exported.NewSharedKeyCredPolicy(cred) conOptions := shared.GetClientOptions(options) plOpts := runtime.PipelineOptions{PerRetry: []policy.Policy{authPolicy}} azClient, err := azcore.NewClient(exported.ModuleName, exported.ModuleVersion, plOpts, &conOptions.ClientOptions) if err != nil { return nil, err } return (*Client)(base.NewServiceClient(serviceURL, azClient, cred, (*base.ClientOptions)(conOptions))), nil } // NewClientFromConnectionString creates an instance of Client with the specified values. // - connectionString - a connection string for the desired storage account // - options - client options; pass nil to accept the default values func NewClientFromConnectionString(connectionString string, options *ClientOptions) (*Client, error) { parsed, err := shared.ParseConnectionString(connectionString) if err != nil { return nil, err } if parsed.AccountKey != "" && parsed.AccountName != "" { credential, err := exported.NewSharedKeyCredential(parsed.AccountName, parsed.AccountKey) if err != nil { return nil, err } return NewClientWithSharedKeyCredential(parsed.ServiceURL, credential, options) } return NewClientWithNoCredential(parsed.ServiceURL, options) } // GetUserDelegationCredential obtains a UserDelegationKey object using the base ServiceURL object. // OAuth is required for this call, as well as any role that can delegate access to the storage account. func (s *Client) GetUserDelegationCredential(ctx context.Context, info KeyInfo, o *GetUserDelegationCredentialOptions) (*UserDelegationCredential, error) { url, err := blob.ParseURL(s.URL()) if err != nil { return nil, err } getUserDelegationKeyOptions := o.format() udk, err := s.generated().GetUserDelegationKey(ctx, info, getUserDelegationKeyOptions) if err != nil { return nil, err } return exported.NewUserDelegationCredential(strings.Split(url.Host, ".")[0], udk.UserDelegationKey), nil } func (s *Client) generated() *generated.ServiceClient { return base.InnerClient((*base.Client[generated.ServiceClient])(s)) } func (s *Client) sharedKey() *SharedKeyCredential { return base.SharedKey((*base.Client[generated.ServiceClient])(s)) } func (s *Client) credential() any { return base.Credential((*base.Client[generated.ServiceClient])(s)) } // helper method to return the generated.BlobClient which is used for creating the sub-requests func getGeneratedBlobClient(b *blob.Client) *generated.BlobClient { return base.InnerClient((*base.Client[generated.BlobClient])(b)) } func (s *Client) getClientOptions() *base.ClientOptions { return base.GetClientOptions((*base.Client[generated.ServiceClient])(s)) } // URL returns the URL endpoint used by the Client object. func (s *Client) URL() string { return s.generated().Endpoint() } // NewContainerClient creates a new container.Client object by concatenating containerName to the end of // this Client's URL. The new container.Client uses the same request policy pipeline as the Client. func (s *Client) NewContainerClient(containerName string) *container.Client { containerURL := runtime.JoinPaths(s.generated().Endpoint(), containerName) return (*container.Client)(base.NewContainerClient(containerURL, s.generated().InternalClient().WithClientName(exported.ModuleName), s.credential(), s.getClientOptions())) } // CreateContainer is a lifecycle method to creates a new container under the specified account. // If the container with the same name already exists, a ResourceExistsError will be raised. // This method returns a client with which to interact with the newly created container. func (s *Client) CreateContainer(ctx context.Context, containerName string, options *CreateContainerOptions) (CreateContainerResponse, error) { containerClient := s.NewContainerClient(containerName) containerCreateResp, err := containerClient.Create(ctx, options) return containerCreateResp, err } // DeleteContainer is a lifecycle method that marks the specified container for deletion. // The container and any blobs contained within it are later deleted during garbage collection. // If the container is not found, a ResourceNotFoundError will be raised. func (s *Client) DeleteContainer(ctx context.Context, containerName string, options *DeleteContainerOptions) (DeleteContainerResponse, error) { containerClient := s.NewContainerClient(containerName) containerDeleteResp, err := containerClient.Delete(ctx, options) return containerDeleteResp, err } // RestoreContainer restores soft-deleted container // Operation will only be successful if used within the specified number of days set in the delete retention policy func (s *Client) RestoreContainer(ctx context.Context, deletedContainerName string, deletedContainerVersion string, options *RestoreContainerOptions) (RestoreContainerResponse, error) { containerClient := s.NewContainerClient(deletedContainerName) containerRestoreResp, err := containerClient.Restore(ctx, deletedContainerVersion, options) return containerRestoreResp, err } // GetAccountInfo provides account level information // For more information, see https://learn.microsoft.com/en-us/rest/api/storageservices/get-account-information?tabs=shared-access-signatures. func (s *Client) GetAccountInfo(ctx context.Context, o *GetAccountInfoOptions) (GetAccountInfoResponse, error) { getAccountInfoOptions := o.format() resp, err := s.generated().GetAccountInfo(ctx, getAccountInfoOptions) return resp, err } // NewListContainersPager operation returns a pager of the containers under the specified account. // Use an empty Marker to start enumeration from the beginning. Container names are returned in lexicographic order. // For more information, see https://docs.microsoft.com/rest/api/storageservices/list-containers2. func (s *Client) NewListContainersPager(o *ListContainersOptions) *runtime.Pager[ListContainersResponse] { listOptions := generated.ServiceClientListContainersSegmentOptions{} if o != nil { if o.Include.Deleted { listOptions.Include = append(listOptions.Include, generated.ListContainersIncludeTypeDeleted) } if o.Include.Metadata { listOptions.Include = append(listOptions.Include, generated.ListContainersIncludeTypeMetadata) } if o.Include.System { listOptions.Include = append(listOptions.Include, generated.ListContainersIncludeTypeSystem) } listOptions.Marker = o.Marker listOptions.Maxresults = o.MaxResults listOptions.Prefix = o.Prefix } return runtime.NewPager(runtime.PagingHandler[ListContainersResponse]{ More: func(page ListContainersResponse) bool { return page.NextMarker != nil && len(*page.NextMarker) > 0 }, Fetcher: func(ctx context.Context, page *ListContainersResponse) (ListContainersResponse, error) { var req *policy.Request var err error if page == nil { req, err = s.generated().ListContainersSegmentCreateRequest(ctx, &listOptions) } else { listOptions.Marker = page.NextMarker req, err = s.generated().ListContainersSegmentCreateRequest(ctx, &listOptions) } if err != nil { return ListContainersResponse{}, err } resp, err := s.generated().InternalClient().Pipeline().Do(req) if err != nil { return ListContainersResponse{}, err } if !runtime.HasStatusCode(resp, http.StatusOK) { return ListContainersResponse{}, runtime.NewResponseError(resp) } return s.generated().ListContainersSegmentHandleResponse(resp) }, }) } // GetProperties - gets the properties of a storage account's Blob service, including properties for Storage Analytics // and CORS (Cross-Origin Resource Sharing) rules. func (s *Client) GetProperties(ctx context.Context, o *GetPropertiesOptions) (GetPropertiesResponse, error) { getPropertiesOptions := o.format() resp, err := s.generated().GetProperties(ctx, getPropertiesOptions) return resp, err } // SetProperties Sets the properties of a storage account's Blob service, including Azure Storage Analytics. // If an element (e.g. analytics_logging) is left as None, the existing settings on the service for that functionality are preserved. func (s *Client) SetProperties(ctx context.Context, o *SetPropertiesOptions) (SetPropertiesResponse, error) { properties, setPropertiesOptions := o.format() resp, err := s.generated().SetProperties(ctx, properties, setPropertiesOptions) return resp, err } // GetStatistics Retrieves statistics related to replication for the Blob service. // It is only available when read-access geo-redundant replication is enabled for the storage account. // With geo-redundant replication, Azure Storage maintains your data durable // in two locations. In both locations, Azure Storage constantly maintains // multiple healthy replicas of your data. The location where you read, // create, update, or delete data is the primary storage account location. // The primary location exists in the region you choose at the time you // create an account via the Azure Management Azure classic portal, for // example, North Central US. The location to which your data is replicated // is the secondary location. The secondary location is automatically // determined based on the location of the primary; it is in a second data // center that resides in the same region as the primary location. Read-only // access is available from the secondary location, if read-access geo-redundant // replication is enabled for your storage account. func (s *Client) GetStatistics(ctx context.Context, o *GetStatisticsOptions) (GetStatisticsResponse, error) { getStatisticsOptions := o.format() resp, err := s.generated().GetStatistics(ctx, getStatisticsOptions) return resp, err } // GetSASURL is a convenience method for generating a SAS token for the currently pointed at account. // It can only be used if the credential supplied during creation was a SharedKeyCredential. func (s *Client) GetSASURL(resources sas.AccountResourceTypes, permissions sas.AccountPermissions, expiry time.Time, o *GetSASURLOptions) (string, error) { if s.sharedKey() == nil { return "", bloberror.MissingSharedKeyCredential } st := o.format() qps, err := sas.AccountSignatureValues{ Version: sas.Version, Permissions: permissions.String(), ResourceTypes: resources.String(), StartTime: st, ExpiryTime: expiry.UTC(), }.SignWithSharedKey(s.sharedKey()) if err != nil { return "", err } endpoint := s.URL() if !strings.HasSuffix(endpoint, "/") { // add a trailing slash to be consistent with the portal endpoint += "/" } endpoint += "?" + qps.Encode() return endpoint, nil } // FilterBlobs operation finds all blobs in the storage account whose tags match a given search expression. // Filter blobs searches across all containers within a storage account but can be scoped within the expression to a single container. // https://docs.microsoft.com/en-us/rest/api/storageservices/find-blobs-by-tags // eg. "dog='germanshepherd' and penguin='emperorpenguin'" // To specify a container, eg. "@container=’containerName’ and Name = ‘C’" func (s *Client) FilterBlobs(ctx context.Context, where string, o *FilterBlobsOptions) (FilterBlobsResponse, error) { serviceFilterBlobsOptions := o.format() resp, err := s.generated().FilterBlobs(ctx, where, serviceFilterBlobsOptions) return resp, err } // NewBatchBuilder creates an instance of BatchBuilder using the same auth policy as the client. // BatchBuilder is used to build the batch consisting of either delete or set tier sub-requests. // All sub-requests in the batch must be of the same type, either delete or set tier. // NOTE: Service level Blob Batch operation is supported only when the Client was created using SharedKeyCredential and Account SAS. func (s *Client) NewBatchBuilder() (*BatchBuilder, error) { var authPolicy policy.Policy switch cred := s.credential().(type) { case *azcore.TokenCredential: conOptions := s.getClientOptions() authPolicy = shared.NewStorageChallengePolicy(*cred, base.GetAudience(conOptions), conOptions.InsecureAllowCredentialWithHTTP) case *SharedKeyCredential: authPolicy = exported.NewSharedKeyCredPolicy(cred) case nil: // for authentication using SAS authPolicy = nil default: return nil, fmt.Errorf("unrecognised authentication type %T", cred) } return &BatchBuilder{ endpoint: s.URL(), authPolicy: authPolicy, }, nil } // SubmitBatch operation allows multiple API calls to be embedded into a single HTTP request. // It builds the request body using the BatchBuilder object passed. // BatchBuilder contains the list of operations to be submitted. It supports up to 256 sub-requests in a single batch. // For more information, see https://docs.microsoft.com/rest/api/storageservices/blob-batch. func (s *Client) SubmitBatch(ctx context.Context, bb *BatchBuilder, options *SubmitBatchOptions) (SubmitBatchResponse, error) { if bb == nil || len(bb.subRequests) == 0 { return SubmitBatchResponse{}, errors.New("batch builder is empty") } // create the request body batchReq, batchID, err := exported.CreateBatchRequest(&exported.BlobBatchBuilder{ AuthPolicy: bb.authPolicy, SubRequests: bb.subRequests, }) if err != nil { return SubmitBatchResponse{}, err } reader := bytes.NewReader(batchReq) rsc := streaming.NopCloser(reader) multipartContentType := "multipart/mixed; boundary=" + batchID resp, err := s.generated().SubmitBatch(ctx, int64(len(batchReq)), multipartContentType, rsc, options.format()) if err != nil { return SubmitBatchResponse{}, err } batchResponses, err := exported.ParseBlobBatchResponse(resp.Body, resp.ContentType, bb.subRequests) if err != nil { return SubmitBatchResponse{}, err } return SubmitBatchResponse{ Responses: batchResponses, ContentType: resp.ContentType, RequestID: resp.RequestID, Version: resp.Version, }, nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/constants.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package service import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) const ( // ContainerNameRoot is the special Azure Storage name used to identify a storage account's root container. ContainerNameRoot = "$root" // ContainerNameLogs is the special Azure Storage name used to identify a storage account's logs container. ContainerNameLogs = "$logs" ) // SKUName defines values for SkuName - LRS, GRS, RAGRS, ZRS, Premium LRS type SKUName = generated.SKUName const ( SKUNameStandardLRS SKUName = generated.SKUNameStandardLRS SKUNameStandardGRS SKUName = generated.SKUNameStandardGRS SKUNameStandardRAGRS SKUName = generated.SKUNameStandardRAGRS SKUNameStandardZRS SKUName = generated.SKUNameStandardZRS SKUNamePremiumLRS SKUName = generated.SKUNamePremiumLRS ) // PossibleSKUNameValues returns the possible values for the SKUName const type. func PossibleSKUNameValues() []SKUName { return generated.PossibleSKUNameValues() } // ListContainersIncludeType defines values for ListContainersIncludeType type ListContainersIncludeType = generated.ListContainersIncludeType const ( ListContainersIncludeTypeMetadata ListContainersIncludeType = generated.ListContainersIncludeTypeMetadata ListContainersIncludeTypeDeleted ListContainersIncludeType = generated.ListContainersIncludeTypeDeleted ListContainersIncludeTypeSystem ListContainersIncludeType = generated.ListContainersIncludeTypeSystem ) // PossibleListContainersIncludeTypeValues returns the possible values for the ListContainersIncludeType const type. func PossibleListContainersIncludeTypeValues() []ListContainersIncludeType { return generated.PossibleListContainersIncludeTypeValues() } // AccountKind defines values for AccountKind type AccountKind = generated.AccountKind const ( AccountKindStorage AccountKind = generated.AccountKindStorage AccountKindBlobStorage AccountKind = generated.AccountKindBlobStorage AccountKindStorageV2 AccountKind = generated.AccountKindStorageV2 AccountKindFileStorage AccountKind = generated.AccountKindFileStorage AccountKindBlockBlobStorage AccountKind = generated.AccountKindBlockBlobStorage ) // PossibleAccountKindValues returns the possible values for the AccountKind const type. func PossibleAccountKindValues() []AccountKind { return generated.PossibleAccountKindValues() } // BlobGeoReplicationStatus - The status of the secondary location type BlobGeoReplicationStatus = generated.BlobGeoReplicationStatus const ( BlobGeoReplicationStatusLive BlobGeoReplicationStatus = generated.BlobGeoReplicationStatusLive BlobGeoReplicationStatusBootstrap BlobGeoReplicationStatus = generated.BlobGeoReplicationStatusBootstrap BlobGeoReplicationStatusUnavailable BlobGeoReplicationStatus = generated.BlobGeoReplicationStatusUnavailable ) // PossibleBlobGeoReplicationStatusValues returns the possible values for the BlobGeoReplicationStatus const type. func PossibleBlobGeoReplicationStatusValues() []BlobGeoReplicationStatus { return generated.PossibleBlobGeoReplicationStatusValues() } // PublicAccessType defines values for AccessType - private (default) or blob or container type PublicAccessType = generated.PublicAccessType const ( PublicAccessTypeBlob PublicAccessType = generated.PublicAccessTypeBlob PublicAccessTypeContainer PublicAccessType = generated.PublicAccessTypeContainer ) // PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type. func PossiblePublicAccessTypeValues() []PublicAccessType { return generated.PossiblePublicAccessTypeValues() } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/models.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package service import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" "time" ) // SharedKeyCredential contains an account's name and its primary or secondary key. type SharedKeyCredential = exported.SharedKeyCredential // NewSharedKeyCredential creates an immutable SharedKeyCredential containing the // storage account's name and either its primary or secondary key. func NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error) { return exported.NewSharedKeyCredential(accountName, accountKey) } // UserDelegationCredential contains an account's name and its user delegation key. type UserDelegationCredential = exported.UserDelegationCredential // UserDelegationKey contains UserDelegationKey. type UserDelegationKey = generated.UserDelegationKey // KeyInfo contains KeyInfo struct. type KeyInfo = generated.KeyInfo // GetUserDelegationCredentialOptions contains optional parameters for Service.GetUserDelegationKey method. type GetUserDelegationCredentialOptions struct { // placeholder for future options } func (o *GetUserDelegationCredentialOptions) format() *generated.ServiceClientGetUserDelegationKeyOptions { return nil } // AccessConditions identifies container-specific access conditions which you optionally set. type AccessConditions = exported.ContainerAccessConditions // BlobTag - a key/value pair on a blob type BlobTag = generated.BlobTag // ContainerItem - An Azure Storage container returned from method Client.ListContainersSegment. type ContainerItem = generated.ContainerItem // ContainerProperties - Properties of a container type ContainerProperties = generated.ContainerProperties // CPKInfo contains a group of parameters for the BlobClient.Download method. type CPKInfo = generated.CPKInfo // CPKScopeInfo contains a group of parameters for the BlobClient.SetMetadata method. type CPKScopeInfo = generated.CPKScopeInfo // CreateContainerOptions contains the optional parameters for the container.Client.Create method. type CreateContainerOptions = container.CreateOptions // DeleteContainerOptions contains the optional parameters for the container.Client.Delete method. type DeleteContainerOptions = container.DeleteOptions // RestoreContainerOptions contains the optional parameters for the container.Client.Restore method. type RestoreContainerOptions = container.RestoreOptions // CORSRule - CORS is an HTTP feature that enables a web application running under one domain to access resources in another // domain. Web browsers implement a security restriction known as same-origin policy that // prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain (the origin // domain) to call APIs in another domain. type CORSRule = generated.CORSRule // FilterBlobSegment - The result of a Filter Blobs API call. type FilterBlobSegment = generated.FilterBlobSegment // BlobTags - Blob tags type BlobTags = generated.BlobTags // FilterBlobItem - Blob info returned from method Client.FilterBlobs. type FilterBlobItem = generated.FilterBlobItem // GeoReplication - Geo-Replication information for the Secondary Storage Service. type GeoReplication = generated.GeoReplication // RetentionPolicy - the retention policy which determines how long the associated data should persist. type RetentionPolicy = generated.RetentionPolicy // Metrics - a summary of request statistics grouped by API in hour or minute aggregates for blobs. type Metrics = generated.Metrics // Logging - Azure Analytics Logging settings. type Logging = generated.Logging // StaticWebsite - The properties that enable an account to host a static website. type StaticWebsite = generated.StaticWebsite // StorageServiceProperties - Storage Service Properties. type StorageServiceProperties = generated.StorageServiceProperties // StorageServiceStats - Stats for the storage service. type StorageServiceStats = generated.StorageServiceStats // --------------------------------------------------------------------------------------------------------------------- // GetAccountInfoOptions provides set of options for Client.GetAccountInfo type GetAccountInfoOptions struct { // placeholder for future options } func (o *GetAccountInfoOptions) format() *generated.ServiceClientGetAccountInfoOptions { return nil } // --------------------------------------------------------------------------------------------------------------------- // GetPropertiesOptions contains the optional parameters for the Client.GetProperties method. type GetPropertiesOptions struct { // placeholder for future options } func (o *GetPropertiesOptions) format() *generated.ServiceClientGetPropertiesOptions { return nil } // --------------------------------------------------------------------------------------------------------------------- // ListContainersOptions provides set of configurations for ListContainers operation. type ListContainersOptions struct { Include ListContainersInclude // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing operation did not return all containers // remaining to be listed with the current page. The NextMarker value can be used as the value for the marker parameter in // a subsequent call to request the next page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify max results, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the listing operation crosses a partition boundary, // then the service will return a continuation token for retrieving the remainder of the results. For this reason, it is possible // that the service will return fewer results than specified by max results, or than the default of 5000. MaxResults *int32 // Filters the results to return only containers whose name begins with the specified prefix. Prefix *string } // ListContainersInclude indicates what additional information the service should return with each container. type ListContainersInclude struct { // Tells the service whether to return metadata for each container. Metadata bool // Tells the service whether to return soft-deleted containers. Deleted bool // Tells the service whether to return system containers. System bool } // --------------------------------------------------------------------------------------------------------------------- // SetPropertiesOptions provides set of options for Client.SetProperties type SetPropertiesOptions struct { // The set of CORS rules. CORS []*CORSRule // The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible // values include version 2008-10-27 and all more recent versions. DefaultServiceVersion *string // the retention policy which determines how long the associated data should persist. DeleteRetentionPolicy *RetentionPolicy // a summary of request statistics grouped by API in hour or minute aggregates for blobs // If version is not set - we default to "1.0" HourMetrics *Metrics // Azure Analytics Logging settings. // If version is not set - we default to "1.0" Logging *Logging // a summary of request statistics grouped by API in hour or minute aggregates for blobs // If version is not set - we default to "1.0" MinuteMetrics *Metrics // The properties that enable an account to host a static website. StaticWebsite *StaticWebsite } func (o *SetPropertiesOptions) format() (generated.StorageServiceProperties, *generated.ServiceClientSetPropertiesOptions) { if o == nil { return generated.StorageServiceProperties{}, nil } defaultVersion := to.Ptr[string]("1.0") defaultAge := to.Ptr[int32](0) emptyStr := to.Ptr[string]("") if o.CORS != nil { for i := 0; i < len(o.CORS); i++ { if o.CORS[i].AllowedHeaders == nil { o.CORS[i].AllowedHeaders = emptyStr } if o.CORS[i].ExposedHeaders == nil { o.CORS[i].ExposedHeaders = emptyStr } if o.CORS[i].MaxAgeInSeconds == nil { o.CORS[i].MaxAgeInSeconds = defaultAge } } } if o.HourMetrics != nil { if o.HourMetrics.Version == nil { o.HourMetrics.Version = defaultVersion } } if o.Logging != nil { if o.Logging.Version == nil { o.Logging.Version = defaultVersion } } if o.MinuteMetrics != nil { if o.MinuteMetrics.Version == nil { o.MinuteMetrics.Version = defaultVersion } } return generated.StorageServiceProperties{ CORS: o.CORS, DefaultServiceVersion: o.DefaultServiceVersion, DeleteRetentionPolicy: o.DeleteRetentionPolicy, HourMetrics: o.HourMetrics, Logging: o.Logging, MinuteMetrics: o.MinuteMetrics, StaticWebsite: o.StaticWebsite, }, nil } // --------------------------------------------------------------------------------------------------------------------- // GetSASURLOptions contains the optional parameters for the Client.GetSASURL method. type GetSASURLOptions struct { StartTime *time.Time } func (o *GetSASURLOptions) format() time.Time { if o == nil { return time.Time{} } var st time.Time if o.StartTime != nil { st = o.StartTime.UTC() } else { st = time.Time{} } return st } // --------------------------------------------------------------------------------------------------------------------- // GetStatisticsOptions provides set of options for Client.GetStatistics type GetStatisticsOptions struct { // placeholder for future options } func (o *GetStatisticsOptions) format() *generated.ServiceClientGetStatisticsOptions { return nil } // --------------------------------------------------------------------------------------------------------------------- // FilterBlobsOptions provides set of options for Client.FindBlobsByTags. type FilterBlobsOptions struct { // A string value that identifies the portion of the list of containers to be returned with the next listing operation. The // operation returns the NextMarker value within the response body if the listing // operation did not return all containers remaining to be listed with the current page. The NextMarker value can be used // as the value for the marker parameter in a subsequent call to request the next // page of list items. The marker value is opaque to the client. Marker *string // Specifies the maximum number of containers to return. If the request does not specify maxresults, or specifies a value // greater than 5000, the server will return up to 5000 items. Note that if the // listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder // of the results. For this reason, it is possible that the service will // return fewer results than specified by maxresults, or than the default of 5000. MaxResults *int32 } func (o *FilterBlobsOptions) format() *generated.ServiceClientFilterBlobsOptions { if o == nil { return nil } return &generated.ServiceClientFilterBlobsOptions{ Marker: o.Marker, Maxresults: o.MaxResults, } } // --------------------------------------------------------------------------------------------------------------------- // BatchDeleteOptions contains the optional parameters for the BatchBuilder.Delete method. type BatchDeleteOptions struct { blob.DeleteOptions VersionID *string Snapshot *string } func (o *BatchDeleteOptions) format() (*generated.BlobClientDeleteOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } basics := generated.BlobClientDeleteOptions{ DeleteSnapshots: o.DeleteSnapshots, DeleteType: o.BlobDeleteType, // None by default Snapshot: o.Snapshot, VersionID: o.VersionID, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &basics, leaseAccessConditions, modifiedAccessConditions } // BatchSetTierOptions contains the optional parameters for the BatchBuilder.SetTier method. type BatchSetTierOptions struct { blob.SetTierOptions VersionID *string Snapshot *string } func (o *BatchSetTierOptions) format() (*generated.BlobClientSetTierOptions, *generated.LeaseAccessConditions, *generated.ModifiedAccessConditions) { if o == nil { return nil, nil, nil } basics := generated.BlobClientSetTierOptions{ RehydratePriority: o.RehydratePriority, Snapshot: o.Snapshot, VersionID: o.VersionID, } leaseAccessConditions, modifiedAccessConditions := exported.FormatBlobAccessConditions(o.AccessConditions) return &basics, leaseAccessConditions, modifiedAccessConditions } // SubmitBatchOptions contains the optional parameters for the Client.SubmitBatch method. type SubmitBatchOptions struct { // placeholder for future options } func (o *SubmitBatchOptions) format() *generated.ServiceClientSubmitBatchOptions { return nil } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/service/responses.go ================================================ //go:build go1.18 // +build go1.18 // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. package service import ( "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/exported" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal/generated" ) // CreateContainerResponse contains the response from method container.Client.Create. type CreateContainerResponse = generated.ContainerClientCreateResponse // DeleteContainerResponse contains the response from method container.Client.Delete type DeleteContainerResponse = generated.ContainerClientDeleteResponse // RestoreContainerResponse contains the response from method container.Client.Restore type RestoreContainerResponse = generated.ContainerClientRestoreResponse // GetAccountInfoResponse contains the response from method Client.GetAccountInfo. type GetAccountInfoResponse = generated.ServiceClientGetAccountInfoResponse // ListContainersResponse contains the response from method Client.ListContainersSegment. type ListContainersResponse = generated.ServiceClientListContainersSegmentResponse // ListContainersSegmentResponse - An enumeration of containers type ListContainersSegmentResponse = generated.ListContainersSegmentResponse // GetPropertiesResponse contains the response from method Client.GetProperties. type GetPropertiesResponse = generated.ServiceClientGetPropertiesResponse // SetPropertiesResponse contains the response from method Client.SetProperties. type SetPropertiesResponse = generated.ServiceClientSetPropertiesResponse // GetStatisticsResponse contains the response from method Client.GetStatistics. type GetStatisticsResponse = generated.ServiceClientGetStatisticsResponse // FilterBlobsResponse contains the response from method Client.FilterBlobs. type FilterBlobsResponse = generated.ServiceClientFilterBlobsResponse // GetUserDelegationKeyResponse contains the response from method ServiceClient.GetUserDelegationKey. type GetUserDelegationKeyResponse = generated.ServiceClientGetUserDelegationKeyResponse // SubmitBatchResponse contains the response from method Client.SubmitBatch. type SubmitBatchResponse struct { // Responses contains the responses of the sub-requests in the batch Responses []*BatchResponseItem // ContentType contains the information returned from the Content-Type header response. ContentType *string // RequestID contains the information returned from the x-ms-request-id header response. RequestID *string // Version contains the information returned from the x-ms-version header response. Version *string } // BatchResponseItem contains the response for the individual sub-requests. type BatchResponseItem = exported.BatchResponseItem ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/test-resources.json ================================================ { "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "baseName": { "type": "String" }, "tenantId": { "type": "string", "defaultValue": "72f988bf-86f1-41af-91ab-2d7cd011db47", "metadata": { "description": "The tenant ID to which the application and resources belong." } }, "testApplicationOid": { "type": "string", "metadata": { "description": "The principal to assign the role to. This is application object id." } } }, "variables": { "mgmtApiVersion": "2022-09-01", "authorizationApiVersion": "2018-09-01-preview", "blobDataContributorRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/ba92f5b4-2d11-453d-a403-e96b0029c9fe')]", "contributorRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c')]", "blobDataOwnerRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/b7e6dc6d-f1e8-4753-8033-0f276bb0955b')]", "primaryAccountName": "[concat(parameters('baseName'), 'prim')]", "immutableAccountName": "[concat(parameters('baseName'), 'imm')]", "primaryEncryptionScopeName": "encryptionScope", "primaryEncryptionScope": "[concat(parameters('baseName'), 'prim', concat('/', variables('primaryEncryptionScopeName')))]", "secondaryAccountName": "[concat(parameters('baseName'), 'sec')]", "premiumAccountName": "[concat(parameters('baseName'), 'prem')]", "dataLakeAccountName": "[concat(parameters('baseName'), 'dtlk')]", "softDeleteAccountName": "[concat(parameters('baseName'), 'sftdl')]", "premiumFileAccountName": "[concat(parameters('baseName'), 'pfile')]", "webjobsPrimaryAccountName": "[concat(parameters('baseName'), 'wjprim')]", "webjobsSecondaryAccountName": "[concat(parameters('baseName'), 'wjsec')]", "location": "[resourceGroup().location]", "resourceGroupName": "[resourceGroup().name]", "subscriptionId": "[subscription().subscriptionId]", "encryption": { "services": { "file": { "enabled": true }, "blob": { "enabled": true } }, "keySource": "Microsoft.Storage" }, "networkAcls": { "bypass": "AzureServices", "virtualNetworkRules": [], "ipRules": [], "defaultAction": "Allow" } }, "resources": [ { "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "[variables('authorizationApiVersion')]", "name": "[guid(concat('dataContributorRoleId', resourceGroup().id))]", "properties": { "roleDefinitionId": "[variables('blobDataContributorRoleId')]", "principalId": "[parameters('testApplicationOid')]" } }, { "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "[variables('authorizationApiVersion')]", "name": "[guid(concat('contributorRoleId', resourceGroup().id))]", "properties": { "roleDefinitionId": "[variables('contributorRoleId')]", "principalId": "[parameters('testApplicationOid')]" } }, { "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "[variables('authorizationApiVersion')]", "name": "[guid(concat('blobDataOwnerRoleId', resourceGroup().id))]", "properties": { "roleDefinitionId": "[variables('blobDataOwnerRoleId')]", "principalId": "[parameters('testApplicationOid')]" } }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('primaryAccountName')]", "location": "[variables('location')]", "sku": { "name": "Standard_RAGRS", "tier": "Standard" }, "kind": "StorageV2", "properties": { "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot" } }, { "type": "Microsoft.Storage/storageAccounts/blobServices", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[concat(variables('primaryAccountName'), '/default')]", "properties": { "isVersioningEnabled": true, "lastAccessTimeTrackingPolicy": { "enable": true, "name": "AccessTimeTracking", "trackingGranularityInDays": 1, "blobType": [ "blockBlob" ] } }, "dependsOn": [ "[variables('primaryAccountName')]" ] }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('immutableAccountName')]", "location": "[variables('location')]", "sku": { "name": "Standard_RAGRS", "tier": "Standard" }, "kind": "StorageV2", "properties": { "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot", "immutableStorageWithVersioning": { "enabled": true } } }, { "type": "Microsoft.Storage/storageAccounts/blobServices", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[concat(variables('immutableAccountName'), '/default')]", "properties": { "isVersioningEnabled": true, "lastAccessTimeTrackingPolicy": { "enable": true, "name": "AccessTimeTracking", "trackingGranularityInDays": 1, "blobType": [ "blockBlob" ] } }, "dependsOn": [ "[variables('immutableAccountName')]" ] }, { "type": "Microsoft.Storage/storageAccounts/encryptionScopes", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('primaryEncryptionScope')]", "properties": { "source": "Microsoft.Storage", "state": "Enabled" }, "dependsOn": [ "[variables('primaryAccountName')]" ] }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('secondaryAccountName')]", "location": "[variables('location')]", "sku": { "name": "Standard_RAGRS", "tier": "Standard" }, "kind": "StorageV2", "properties": { "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot" } }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('premiumAccountName')]", "location": "[variables('location')]", "sku": { "name": "Premium_LRS", "tier": "Premium" }, "kind": "StorageV2", "properties": { "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot" } }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('dataLakeAccountName')]", "location": "[variables('location')]", "sku": { "name": "Standard_RAGRS", "tier": "Standard" }, "kind": "StorageV2", "properties": { "isHnsEnabled": true, "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot" } }, { "type": "Microsoft.Storage/storageAccounts/blobServices", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[concat(variables('dataLakeAccountName'), '/default')]", "properties": { "containerDeleteRetentionPolicy": { "enabled": true, "days": 1 } }, "dependsOn": [ "[variables('dataLakeAccountName')]" ] }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('softDeleteAccountName')]", "location": "[variables('location')]", "sku": { "name": "Standard_RAGRS", "tier": "Standard" }, "kind": "StorageV2", "properties": { "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot" } }, { "type": "Microsoft.Storage/storageAccounts/blobServices", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[concat(variables('softDeleteAccountName'), '/default')]", "properties": { "isVersioningEnabled": true, "deleteRetentionPolicy": { "allowPermanentDelete": true, "enabled": true, "days": 1 }, "containerDeleteRetentionPolicy": { "enabled": true, "days": 1 } }, "dependsOn": [ "[variables('softDeleteAccountName')]" ] }, { "type": "Microsoft.Storage/storageAccounts/fileServices", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[concat(variables('softDeleteAccountName'), '/default')]", "properties": { "shareDeleteRetentionPolicy": { "enabled": true, "days": 1 } }, "dependsOn": [ "[variables('softDeleteAccountName')]" ] }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('premiumFileAccountName')]", "location": "[variables('location')]", "sku": { "name": "Premium_LRS", "tier": "Premium" }, "kind": "FileStorage", "properties": { "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot" } }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('webjobsPrimaryAccountName')]", "location": "[variables('location')]", "sku": { "name": "Standard_RAGRS", "tier": "Standard" }, "kind": "StorageV2", "properties": { "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot" } }, { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "[variables('mgmtApiVersion')]", "name": "[variables('webjobsSecondaryAccountName')]", "location": "[variables('location')]", "sku": { "name": "Standard_RAGRS", "tier": "Standard" }, "kind": "StorageV2", "properties": { "networkAcls": "[variables('networkAcls')]", "supportsHttpsTrafficOnly": true, "encryption": "[variables('encryption')]", "accessTier": "Hot" } } ], "functions": [ { "namespace": "url", "members": { "serviceEndpointSuffix": { "parameters": [ { "name": "endpoint", "type": "string" } ], "output": { "type": "string", "value": "[substring(parameters('endpoint'), add(indexOf(parameters('endpoint'), '.'),1), sub(length(parameters('endpoint')), add(indexOf(parameters('endpoint'), '.'),2)))]" } } } }, { "namespace": "connectionString", "members": { "create": { "parameters": [ { "name": "accountName", "type": "string" }, { "name": "accountKey", "type": "string" }, { "name": "blobEndpoint", "type": "string" }, { "name": "queueEndpoint", "type": "string" }, { "name": "fileEndpoint", "type": "string" }, { "name": "tableEndpoint", "type": "string" } ], "output": { "type": "string", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', parameters('accountName'), ';AccountKey=', parameters('accountKey'), ';BlobEndpoint=', parameters('blobEndpoint'), ';QueueEndpoint=', parameters('queueEndpoint'), ';FileEndpoint=', parameters('fileEndpoint'), ';TableEndpoint=', parameters('tableEndpoint'))]" } } } } ], "outputs": { "AZURE_STORAGE_ACCOUNT_NAME": { "type": "string", "value": "[variables('primaryAccountName')]" }, "AZURE_STORAGE_ACCOUNT_KEY": { "type": "string", "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).keys[0].value]" }, "PRIMARY_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]" }, "PRIMARY_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]" }, "PRIMARY_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]" }, "PRIMARY_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('primaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]" }, "SECONDARY_AZURE_STORAGE_ACCOUNT_NAME": { "type": "string", "value": "[variables('secondaryAccountName')]" }, "SECONDARY_AZURE_STORAGE_ACCOUNT_KEY": { "type": "string", "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).keys[0].value]" }, "SECONDARY_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]" }, "SECONDARY_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]" }, "SECONDARY_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]" }, "SECONDARY_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]" }, "BLOB_STORAGE_ACCOUNT_NAME": { "type": "string", "value": "[variables('secondaryAccountName')]" }, "BLOB_STORAGE_ACCOUNT_KEY": { "type": "string", "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('secondaryAccountName')), variables('mgmtApiVersion')).keys[0].value]" }, "PREMIUM_AZURE_STORAGE_ACCOUNT_NAME": { "type": "string", "value": "[variables('premiumAccountName')]" }, "PREMIUM_AZURE_STORAGE_ACCOUNT_KEY": { "type": "string", "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('premiumAccountName')), variables('mgmtApiVersion')).keys[0].value]" }, "PREMIUM_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('premiumAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]" }, "DATALAKE_AZURE_STORAGE_ACCOUNT_NAME": { "type": "string", "value": "[variables('dataLakeAccountName')]" }, "DATALAKE_AZURE_STORAGE_ACCOUNT_KEY": { "type": "string", "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).keys[0].value]" }, "DATALAKE_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]" }, "DATALAKE_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]" }, "DATALAKE_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]" }, "DATALAKE_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('dataLakeAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]" }, "IMMUTABLE_AZURE_STORAGE_ACCOUNT_NAME": { "type": "string", "value": "[variables('immutableAccountName')]" }, "IMMUTABLE_AZURE_STORAGE_ACCOUNT_KEY": { "type": "string", "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).keys[0].value]" }, "IMMUTABLE_AZURE_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]" }, "IMMUTABLE_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]" }, "IMMUTABLE_AZURE_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]" }, "IMMUTABLE_AZURE_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('immutableAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]" }, "SOFT_DELETE_AZURE_STORAGE_ACCOUNT_NAME": { "type": "string", "value": "[variables('softDeleteAccountName')]" }, "SOFT_DELETE_AZURE_STORAGE_ACCOUNT_KEY": { "type": "string", "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).keys[0].value]" }, "SOFT_DELETE_AZURE_STORAGE_ACCOUNT_BLOB_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob)]" }, "SOFT_DELETE_AZURE_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]" }, "SOFT_DELETE_AZURE_STORAGE_ACCOUNT_QUEUE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue)]" }, "SOFT_DELETE_AZURE_STORAGE_ACCOUNT_TABLE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('softDeleteAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]" }, "PREMIUM_FILE_STORAGE_ACCOUNT_NAME": { "type": "string", "value": "[variables('premiumFileAccountName')]" }, "PREMIUM_FILE_STORAGE_ACCOUNT_KEY": { "type": "string", "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('premiumFileAccountName')), variables('mgmtApiVersion')).keys[0].value]" }, "PREMIUM_FILE_STORAGE_ACCOUNT_FILE_ENDPOINT_SUFFIX": { "type": "string", "value": "[url.serviceEndpointSuffix(reference(resourceId('Microsoft.Storage/storageAccounts', variables('premiumFileAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file)]" }, "AZUREWEBJOBSSTORAGE": { "type": "string", "value": "[connectionString.create(variables('webjobsPrimaryAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).keys[0].value, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsPrimaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]" }, "AZUREWEBJOBSSECONDARYSTORAGE": { "type": "string", "value": "[connectionString.create(variables('webjobsSecondaryAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).keys[0].value, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.blob, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.queue, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.file, reference(resourceId('Microsoft.Storage/storageAccounts', variables('webjobsSecondaryAccountName')), variables('mgmtApiVersion')).primaryEndpoints.table)]" }, "RESOURCE_GROUP_NAME": { "type": "string", "value": "[variables('resourceGroupName')]" }, "SUBSCRIPTION_ID": { "type": "string", "value": "[variables('subscriptionId')]" }, "LOCATION": { "type": "string", "value": "[variables('location')]" }, "AZURE_STORAGE_ENCRYPTION_SCOPE": { "type": "string", "value": "[variables('primaryEncryptionScopeName')]" } } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/CHANGELOG.md ================================================ # Change History ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/accesstokens.go ================================================ package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "context" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/go-autorest/tracing" "net/http" ) // AccessTokensClient is the metadata API definition for the Azure Container Registry runtime type AccessTokensClient struct { BaseClient } // NewAccessTokensClient creates an instance of the AccessTokensClient client. func NewAccessTokensClient(loginURI string) AccessTokensClient { return AccessTokensClient{New(loginURI)} } // Get exchange ACR Refresh token for an ACR Access Token // Parameters: // service - indicates the name of your Azure container registry. // scope - which is expected to be a valid scope, and can be specified more than once for multiple scope // requests. You obtained this from the Www-Authenticate response header from the challenge. // refreshToken - must be a valid ACR refresh token func (client AccessTokensClient) Get(ctx context.Context, service string, scope string, refreshToken string) (result AccessToken, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/AccessTokensClient.Get") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetPreparer(ctx, service, scope, refreshToken) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.AccessTokensClient", "Get", nil, "Failure preparing request") return } resp, err := client.GetSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.AccessTokensClient", "Get", resp, "Failure sending request") return } result, err = client.GetResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.AccessTokensClient", "Get", resp, "Failure responding to request") return } return } // GetPreparer prepares the Get request. func (client AccessTokensClient) GetPreparer(ctx context.Context, service string, scope string, refreshToken string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } formDataParameters := map[string]interface{}{ "grant_type": "refresh_token", "refresh_token": refreshToken, "scope": scope, "service": service, } preparer := autorest.CreatePreparer( autorest.AsPost(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPath("/oauth2/token"), autorest.WithFormData(autorest.MapToValues(formDataParameters))) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetSender sends the Get request. The method will close the // http.Response Body if it receives an error. func (client AccessTokensClient) GetSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetResponder handles the response to the Get request. The method always // closes the http.Response Body. func (client AccessTokensClient) GetResponder(resp *http.Response) (result AccessToken, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // GetFromLogin exchange Username, Password and Scope an ACR Access Token // Parameters: // service - indicates the name of your Azure container registry. // scope - expected to be a valid scope, and can be specified more than once for multiple scope requests. You // can obtain this from the Www-Authenticate response header from the challenge. func (client AccessTokensClient) GetFromLogin(ctx context.Context, service string, scope string) (result AccessToken, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/AccessTokensClient.GetFromLogin") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetFromLoginPreparer(ctx, service, scope) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.AccessTokensClient", "GetFromLogin", nil, "Failure preparing request") return } resp, err := client.GetFromLoginSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.AccessTokensClient", "GetFromLogin", resp, "Failure sending request") return } result, err = client.GetFromLoginResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.AccessTokensClient", "GetFromLogin", resp, "Failure responding to request") return } return } // GetFromLoginPreparer prepares the GetFromLogin request. func (client AccessTokensClient) GetFromLoginPreparer(ctx context.Context, service string, scope string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } queryParameters := map[string]interface{}{ "scope": autorest.Encode("query", scope), "service": autorest.Encode("query", service), } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPath("/oauth2/token"), autorest.WithQueryParameters(queryParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetFromLoginSender sends the GetFromLogin request. The method will close the // http.Response Body if it receives an error. func (client AccessTokensClient) GetFromLoginSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetFromLoginResponder handles the response to the GetFromLogin request. The method always // closes the http.Response Body. func (client AccessTokensClient) GetFromLoginResponder(resp *http.Response) (result AccessToken, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/blob.go ================================================ package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "context" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/go-autorest/tracing" "io" "net/http" ) // BlobClient is the metadata API definition for the Azure Container Registry runtime type BlobClient struct { BaseClient } // NewBlobClient creates an instance of the BlobClient client. func NewBlobClient(loginURI string) BlobClient { return BlobClient{New(loginURI)} } // CancelUpload cancel outstanding upload processes, releasing associated resources. If this is not called, the // unfinished uploads will eventually timeout. // Parameters: // location - link acquired from upload start or previous chunk. Note, do not include initial / (must do // substring(1) ) func (client BlobClient) CancelUpload(ctx context.Context, location string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.CancelUpload") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.CancelUploadPreparer(ctx, location) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "CancelUpload", nil, "Failure preparing request") return } resp, err := client.CancelUploadSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "CancelUpload", resp, "Failure sending request") return } result, err = client.CancelUploadResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "CancelUpload", resp, "Failure responding to request") return } return } // CancelUploadPreparer prepares the CancelUpload request. func (client BlobClient) CancelUploadPreparer(ctx context.Context, location string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "nextBlobUuidLink": location, } preparer := autorest.CreatePreparer( autorest.AsDelete(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/{nextBlobUuidLink}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // CancelUploadSender sends the CancelUpload request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) CancelUploadSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // CancelUploadResponder handles the response to the CancelUpload request. The method always // closes the http.Response Body. func (client BlobClient) CancelUploadResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusNoContent), autorest.ByClosing()) result.Response = resp return } // Check same as GET, except only the headers are returned. // Parameters: // name - name of the image (including the namespace) // digest - digest of a BLOB func (client BlobClient) Check(ctx context.Context, name string, digest string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.Check") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.CheckPreparer(ctx, name, digest) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Check", nil, "Failure preparing request") return } resp, err := client.CheckSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Check", resp, "Failure sending request") return } result, err = client.CheckResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Check", resp, "Failure responding to request") return } return } // CheckPreparer prepares the Check request. func (client BlobClient) CheckPreparer(ctx context.Context, name string, digest string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "digest": autorest.Encode("path", digest), "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsHead(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/blobs/{digest}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // CheckSender sends the Check request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) CheckSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // CheckResponder handles the response to the Check request. The method always // closes the http.Response Body. func (client BlobClient) CheckResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusTemporaryRedirect), autorest.ByClosing()) result.Response = resp return } // CheckChunk same as GET, except only the headers are returned. // Parameters: // name - name of the image (including the namespace) // digest - digest of a BLOB // rangeParameter - format : bytes=-, HTTP Range header specifying blob chunk. func (client BlobClient) CheckChunk(ctx context.Context, name string, digest string, rangeParameter string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.CheckChunk") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.CheckChunkPreparer(ctx, name, digest, rangeParameter) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "CheckChunk", nil, "Failure preparing request") return } resp, err := client.CheckChunkSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "CheckChunk", resp, "Failure sending request") return } result, err = client.CheckChunkResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "CheckChunk", resp, "Failure responding to request") return } return } // CheckChunkPreparer prepares the CheckChunk request. func (client BlobClient) CheckChunkPreparer(ctx context.Context, name string, digest string, rangeParameter string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "digest": autorest.Encode("path", digest), "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsHead(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/blobs/{digest}", pathParameters), autorest.WithHeader("Range", autorest.String(rangeParameter))) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // CheckChunkSender sends the CheckChunk request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) CheckChunkSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // CheckChunkResponder handles the response to the CheckChunk request. The method always // closes the http.Response Body. func (client BlobClient) CheckChunkResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) result.Response = resp return } // Delete removes an already uploaded blob. // Parameters: // name - name of the image (including the namespace) // digest - digest of a BLOB func (client BlobClient) Delete(ctx context.Context, name string, digest string) (result ReadCloser, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.Delete") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.DeletePreparer(ctx, name, digest) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Delete", nil, "Failure preparing request") return } resp, err := client.DeleteSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Delete", resp, "Failure sending request") return } result, err = client.DeleteResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Delete", resp, "Failure responding to request") return } return } // DeletePreparer prepares the Delete request. func (client BlobClient) DeletePreparer(ctx context.Context, name string, digest string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "digest": autorest.Encode("path", digest), "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsDelete(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/blobs/{digest}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // DeleteSender sends the Delete request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) DeleteSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // DeleteResponder handles the response to the Delete request. The method always // closes the http.Response Body. func (client BlobClient) DeleteResponder(resp *http.Response) (result ReadCloser, err error) { result.Value = &resp.Body err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted)) result.Response = autorest.Response{Response: resp} return } // EndUpload complete the upload, providing all the data in the body, if necessary. A request without a body will just // complete the upload with previously uploaded content. // Parameters: // digest - digest of a BLOB // location - link acquired from upload start or previous chunk. Note, do not include initial / (must do // substring(1) ) // value - optional raw data of blob func (client BlobClient) EndUpload(ctx context.Context, digest string, location string, value io.ReadCloser) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.EndUpload") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.EndUploadPreparer(ctx, digest, location, value) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "EndUpload", nil, "Failure preparing request") return } resp, err := client.EndUploadSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "EndUpload", resp, "Failure sending request") return } result, err = client.EndUploadResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "EndUpload", resp, "Failure responding to request") return } return } // EndUploadPreparer prepares the EndUpload request. func (client BlobClient) EndUploadPreparer(ctx context.Context, digest string, location string, value io.ReadCloser) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "nextBlobUuidLink": location, } queryParameters := map[string]interface{}{ "digest": autorest.Encode("query", digest), } preparer := autorest.CreatePreparer( autorest.AsContentType("application/octet-stream"), autorest.AsPut(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/{nextBlobUuidLink}", pathParameters), autorest.WithQueryParameters(queryParameters)) if value != nil { preparer = autorest.DecoratePreparer(preparer, autorest.WithFile(value)) } return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // EndUploadSender sends the EndUpload request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) EndUploadSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // EndUploadResponder handles the response to the EndUpload request. The method always // closes the http.Response Body. func (client BlobClient) EndUploadResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated), autorest.ByClosing()) result.Response = resp return } // Get retrieve the blob from the registry identified by digest. // Parameters: // name - name of the image (including the namespace) // digest - digest of a BLOB func (client BlobClient) Get(ctx context.Context, name string, digest string) (result ReadCloser, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.Get") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetPreparer(ctx, name, digest) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Get", nil, "Failure preparing request") return } resp, err := client.GetSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Get", resp, "Failure sending request") return } result, err = client.GetResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Get", resp, "Failure responding to request") return } return } // GetPreparer prepares the Get request. func (client BlobClient) GetPreparer(ctx context.Context, name string, digest string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "digest": autorest.Encode("path", digest), "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/blobs/{digest}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetSender sends the Get request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) GetSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetResponder handles the response to the Get request. The method always // closes the http.Response Body. func (client BlobClient) GetResponder(resp *http.Response) (result ReadCloser, err error) { result.Value = &resp.Body err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusTemporaryRedirect)) result.Response = autorest.Response{Response: resp} return } // GetChunk retrieve the blob from the registry identified by `digest`. This endpoint may also support RFC7233 // compliant range requests. Support can be detected by issuing a HEAD request. If the header `Accept-Range: bytes` is // returned, range requests can be used to fetch partial content. // Parameters: // name - name of the image (including the namespace) // digest - digest of a BLOB // rangeParameter - format : bytes=-, HTTP Range header specifying blob chunk. func (client BlobClient) GetChunk(ctx context.Context, name string, digest string, rangeParameter string) (result ReadCloser, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.GetChunk") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetChunkPreparer(ctx, name, digest, rangeParameter) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "GetChunk", nil, "Failure preparing request") return } resp, err := client.GetChunkSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "GetChunk", resp, "Failure sending request") return } result, err = client.GetChunkResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "GetChunk", resp, "Failure responding to request") return } return } // GetChunkPreparer prepares the GetChunk request. func (client BlobClient) GetChunkPreparer(ctx context.Context, name string, digest string, rangeParameter string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "digest": autorest.Encode("path", digest), "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/blobs/{digest}", pathParameters), autorest.WithHeader("Range", autorest.String(rangeParameter))) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetChunkSender sends the GetChunk request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) GetChunkSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetChunkResponder handles the response to the GetChunk request. The method always // closes the http.Response Body. func (client BlobClient) GetChunkResponder(resp *http.Response) (result ReadCloser, err error) { result.Value = &resp.Body err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusPartialContent)) result.Response = autorest.Response{Response: resp} return } // GetStatus retrieve status of upload identified by uuid. The primary purpose of this endpoint is to resolve the // current status of a resumable upload. // Parameters: // location - link acquired from upload start or previous chunk. Note, do not include initial / (must do // substring(1) ) func (client BlobClient) GetStatus(ctx context.Context, location string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.GetStatus") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetStatusPreparer(ctx, location) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "GetStatus", nil, "Failure preparing request") return } resp, err := client.GetStatusSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "GetStatus", resp, "Failure sending request") return } result, err = client.GetStatusResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "GetStatus", resp, "Failure responding to request") return } return } // GetStatusPreparer prepares the GetStatus request. func (client BlobClient) GetStatusPreparer(ctx context.Context, location string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "nextBlobUuidLink": location, } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/{nextBlobUuidLink}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetStatusSender sends the GetStatus request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) GetStatusSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetStatusResponder handles the response to the GetStatus request. The method always // closes the http.Response Body. func (client BlobClient) GetStatusResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusNoContent), autorest.ByClosing()) result.Response = resp return } // Mount mount a blob identified by the `mount` parameter from another repository. // Parameters: // name - name of the image (including the namespace) // from - name of the source repository. // mount - digest of blob to mount from the source repository. func (client BlobClient) Mount(ctx context.Context, name string, from string, mount string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.Mount") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.MountPreparer(ctx, name, from, mount) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Mount", nil, "Failure preparing request") return } resp, err := client.MountSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Mount", resp, "Failure sending request") return } result, err = client.MountResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Mount", resp, "Failure responding to request") return } return } // MountPreparer prepares the Mount request. func (client BlobClient) MountPreparer(ctx context.Context, name string, from string, mount string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), } queryParameters := map[string]interface{}{ "from": autorest.Encode("query", from), "mount": autorest.Encode("query", mount), } preparer := autorest.CreatePreparer( autorest.AsPost(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/blobs/uploads/", pathParameters), autorest.WithQueryParameters(queryParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // MountSender sends the Mount request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) MountSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // MountResponder handles the response to the Mount request. The method always // closes the http.Response Body. func (client BlobClient) MountResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated), autorest.ByClosing()) result.Response = resp return } // StartUpload initiate a resumable blob upload with an empty request body. // Parameters: // name - name of the image (including the namespace) func (client BlobClient) StartUpload(ctx context.Context, name string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.StartUpload") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.StartUploadPreparer(ctx, name) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "StartUpload", nil, "Failure preparing request") return } resp, err := client.StartUploadSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "StartUpload", resp, "Failure sending request") return } result, err = client.StartUploadResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "StartUpload", resp, "Failure responding to request") return } return } // StartUploadPreparer prepares the StartUpload request. func (client BlobClient) StartUploadPreparer(ctx context.Context, name string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsPost(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/blobs/uploads/", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // StartUploadSender sends the StartUpload request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) StartUploadSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // StartUploadResponder handles the response to the StartUpload request. The method always // closes the http.Response Body. func (client BlobClient) StartUploadResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted), autorest.ByClosing()) result.Response = resp return } // Upload upload a stream of data without completing the upload. // Parameters: // value - raw data of blob // location - link acquired from upload start or previous chunk. Note, do not include initial / (must do // substring(1) ) func (client BlobClient) Upload(ctx context.Context, value io.ReadCloser, location string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/BlobClient.Upload") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.UploadPreparer(ctx, value, location) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Upload", nil, "Failure preparing request") return } resp, err := client.UploadSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Upload", resp, "Failure sending request") return } result, err = client.UploadResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.BlobClient", "Upload", resp, "Failure responding to request") return } return } // UploadPreparer prepares the Upload request. func (client BlobClient) UploadPreparer(ctx context.Context, value io.ReadCloser, location string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "nextBlobUuidLink": location, } preparer := autorest.CreatePreparer( autorest.AsContentType("application/octet-stream"), autorest.AsPatch(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/{nextBlobUuidLink}", pathParameters), autorest.WithFile(value)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // UploadSender sends the Upload request. The method will close the // http.Response Body if it receives an error. func (client BlobClient) UploadSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // UploadResponder handles the response to the Upload request. The method always // closes the http.Response Body. func (client BlobClient) UploadResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted), autorest.ByClosing()) result.Response = resp return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/client.go ================================================ // Package containerregistry implements the Azure ARM Containerregistry service API version 2019-08-15-preview. // // Metadata API definition for the Azure Container Registry runtime package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "github.com/Azure/go-autorest/autorest" ) // BaseClient is the base client for Containerregistry. type BaseClient struct { autorest.Client LoginURI string } // New creates an instance of the BaseClient client. func New(loginURI string) BaseClient { return NewWithoutDefaults(loginURI) } // NewWithoutDefaults creates an instance of the BaseClient client. func NewWithoutDefaults(loginURI string) BaseClient { return BaseClient{ Client: autorest.NewClientWithUserAgent(UserAgent()), LoginURI: loginURI, } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/dataplane_meta.json ================================================ { "commit": "3c764635e7d442b3e74caf593029fcd440b3ef82", "readme": "/_/azure-rest-api-specs/specification/containerregistry/data-plane/readme.md", "tag": "package-2019-08", "use": "@microsoft.azure/autorest.go@2.1.183", "repository_url": "https://github.com/Azure/azure-rest-api-specs.git", "autorest_command": "autorest --use=@microsoft.azure/autorest.go@2.1.183 --tag=package-2019-08 --go-sdk-folder=/_/azure-sdk-for-go --go --verbose --use-onever --version=2.0.4421 --go.license-header=MICROSOFT_MIT_NO_VERSION /_/azure-rest-api-specs/specification/containerregistry/data-plane/readme.md", "additional_properties": { "additional_options": "--go --verbose --use-onever --version=2.0.4421 --go.license-header=MICROSOFT_MIT_NO_VERSION" } } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/manifests.go ================================================ package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "context" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/go-autorest/tracing" "net/http" ) // ManifestsClient is the metadata API definition for the Azure Container Registry runtime type ManifestsClient struct { BaseClient } // NewManifestsClient creates an instance of the ManifestsClient client. func NewManifestsClient(loginURI string) ManifestsClient { return ManifestsClient{New(loginURI)} } // Create put the manifest identified by `name` and `reference` where `reference` can be a tag or digest. // Parameters: // name - name of the image (including the namespace) // reference - a tag or a digest, pointing to a specific image // payload - manifest body, can take v1 or v2 values depending on accept header func (client ManifestsClient) Create(ctx context.Context, name string, reference string, payload Manifest) (result SetObject, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/ManifestsClient.Create") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.CreatePreparer(ctx, name, reference, payload) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Create", nil, "Failure preparing request") return } resp, err := client.CreateSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Create", resp, "Failure sending request") return } result, err = client.CreateResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Create", resp, "Failure responding to request") return } return } // CreatePreparer prepares the Create request. func (client ManifestsClient) CreatePreparer(ctx context.Context, name string, reference string, payload Manifest) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), "reference": autorest.Encode("path", reference), } preparer := autorest.CreatePreparer( autorest.AsContentType("application/vnd.docker.distribution.manifest.v2+json"), autorest.AsPut(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/manifests/{reference}", pathParameters), autorest.WithJSON(payload)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // CreateSender sends the Create request. The method will close the // http.Response Body if it receives an error. func (client ManifestsClient) CreateSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // CreateResponder handles the response to the Create request. The method always // closes the http.Response Body. func (client ManifestsClient) CreateResponder(resp *http.Response) (result SetObject, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusCreated), autorest.ByUnmarshallingJSON(&result.Value), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // Delete delete the manifest identified by `name` and `reference`. Note that a manifest can _only_ be deleted by // `digest`. // Parameters: // name - name of the image (including the namespace) // reference - a tag or a digest, pointing to a specific image func (client ManifestsClient) Delete(ctx context.Context, name string, reference string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/ManifestsClient.Delete") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.DeletePreparer(ctx, name, reference) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Delete", nil, "Failure preparing request") return } resp, err := client.DeleteSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Delete", resp, "Failure sending request") return } result, err = client.DeleteResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Delete", resp, "Failure responding to request") return } return } // DeletePreparer prepares the Delete request. func (client ManifestsClient) DeletePreparer(ctx context.Context, name string, reference string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), "reference": autorest.Encode("path", reference), } preparer := autorest.CreatePreparer( autorest.AsDelete(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/manifests/{reference}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // DeleteSender sends the Delete request. The method will close the // http.Response Body if it receives an error. func (client ManifestsClient) DeleteSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // DeleteResponder handles the response to the Delete request. The method always // closes the http.Response Body. func (client ManifestsClient) DeleteResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted), autorest.ByClosing()) result.Response = resp return } // Get get the manifest identified by `name` and `reference` where `reference` can be a tag or digest. // Parameters: // name - name of the image (including the namespace) // reference - a tag or a digest, pointing to a specific image // accept - accept header string delimited by comma. For example, // application/vnd.docker.distribution.manifest.v2+json func (client ManifestsClient) Get(ctx context.Context, name string, reference string, accept string) (result ManifestWrapper, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/ManifestsClient.Get") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetPreparer(ctx, name, reference, accept) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Get", nil, "Failure preparing request") return } resp, err := client.GetSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Get", resp, "Failure sending request") return } result, err = client.GetResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "Get", resp, "Failure responding to request") return } return } // GetPreparer prepares the Get request. func (client ManifestsClient) GetPreparer(ctx context.Context, name string, reference string, accept string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), "reference": autorest.Encode("path", reference), } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/v2/{name}/manifests/{reference}", pathParameters)) if len(accept) > 0 { preparer = autorest.DecoratePreparer(preparer, autorest.WithHeader("accept", autorest.String(accept))) } return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetSender sends the Get request. The method will close the // http.Response Body if it receives an error. func (client ManifestsClient) GetSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetResponder handles the response to the Get request. The method always // closes the http.Response Body. func (client ManifestsClient) GetResponder(resp *http.Response) (result ManifestWrapper, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // GetAttributes get manifest attributes // Parameters: // name - name of the image (including the namespace) // reference - a tag or a digest, pointing to a specific image func (client ManifestsClient) GetAttributes(ctx context.Context, name string, reference string) (result ManifestAttributes, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/ManifestsClient.GetAttributes") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetAttributesPreparer(ctx, name, reference) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "GetAttributes", nil, "Failure preparing request") return } resp, err := client.GetAttributesSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "GetAttributes", resp, "Failure sending request") return } result, err = client.GetAttributesResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "GetAttributes", resp, "Failure responding to request") return } return } // GetAttributesPreparer prepares the GetAttributes request. func (client ManifestsClient) GetAttributesPreparer(ctx context.Context, name string, reference string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), "reference": autorest.Encode("path", reference), } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}/_manifests/{reference}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetAttributesSender sends the GetAttributes request. The method will close the // http.Response Body if it receives an error. func (client ManifestsClient) GetAttributesSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetAttributesResponder handles the response to the GetAttributes request. The method always // closes the http.Response Body. func (client ManifestsClient) GetAttributesResponder(resp *http.Response) (result ManifestAttributes, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // GetList list manifests of a repository // Parameters: // name - name of the image (including the namespace) // last - query parameter for the last item in previous query. Result set will include values lexically after // last. // n - query parameter for max number of items // orderby - orderby query parameter func (client ManifestsClient) GetList(ctx context.Context, name string, last string, n *int32, orderby string) (result AcrManifests, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/ManifestsClient.GetList") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetListPreparer(ctx, name, last, n, orderby) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "GetList", nil, "Failure preparing request") return } resp, err := client.GetListSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "GetList", resp, "Failure sending request") return } result, err = client.GetListResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "GetList", resp, "Failure responding to request") return } return } // GetListPreparer prepares the GetList request. func (client ManifestsClient) GetListPreparer(ctx context.Context, name string, last string, n *int32, orderby string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), } queryParameters := map[string]interface{}{} if len(last) > 0 { queryParameters["last"] = autorest.Encode("query", last) } if n != nil { queryParameters["n"] = autorest.Encode("query", *n) } if len(orderby) > 0 { queryParameters["orderby"] = autorest.Encode("query", orderby) } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}/_manifests", pathParameters), autorest.WithQueryParameters(queryParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetListSender sends the GetList request. The method will close the // http.Response Body if it receives an error. func (client ManifestsClient) GetListSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetListResponder handles the response to the GetList request. The method always // closes the http.Response Body. func (client ManifestsClient) GetListResponder(resp *http.Response) (result AcrManifests, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // UpdateAttributes update attributes of a manifest // Parameters: // name - name of the image (including the namespace) // reference - a tag or a digest, pointing to a specific image // value - repository attribute value func (client ManifestsClient) UpdateAttributes(ctx context.Context, name string, reference string, value *ChangeableAttributes) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/ManifestsClient.UpdateAttributes") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.UpdateAttributesPreparer(ctx, name, reference, value) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "UpdateAttributes", nil, "Failure preparing request") return } resp, err := client.UpdateAttributesSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "UpdateAttributes", resp, "Failure sending request") return } result, err = client.UpdateAttributesResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.ManifestsClient", "UpdateAttributes", resp, "Failure responding to request") return } return } // UpdateAttributesPreparer prepares the UpdateAttributes request. func (client ManifestsClient) UpdateAttributesPreparer(ctx context.Context, name string, reference string, value *ChangeableAttributes) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), "reference": autorest.Encode("path", reference), } preparer := autorest.CreatePreparer( autorest.AsContentType("application/json; charset=utf-8"), autorest.AsPatch(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}/_manifests/{reference}", pathParameters)) if value != nil { preparer = autorest.DecoratePreparer(preparer, autorest.WithJSON(value)) } return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // UpdateAttributesSender sends the UpdateAttributes request. The method will close the // http.Response Body if it receives an error. func (client ManifestsClient) UpdateAttributesSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // UpdateAttributesResponder handles the response to the UpdateAttributes request. The method always // closes the http.Response Body. func (client ManifestsClient) UpdateAttributesResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) result.Response = resp return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/models.go ================================================ package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "encoding/json" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/date" "io" ) // The package's fully qualified name. const fqdn = "github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry" // AccessToken ... type AccessToken struct { autorest.Response `json:"-"` // AccessToken - The access token for performing authenticated requests AccessToken *string `json:"access_token,omitempty"` } // AcrErrorInfo error information type AcrErrorInfo struct { // Code - Error code Code *string `json:"code,omitempty"` // Message - Error message Message *string `json:"message,omitempty"` // Detail - Error details Detail interface{} `json:"detail,omitempty"` } // AcrErrors acr error response describing why the operation failed type AcrErrors struct { // Errors - Array of detailed error Errors *[]AcrErrorInfo `json:"errors,omitempty"` } // AcrManifests manifest attributes type AcrManifests struct { autorest.Response `json:"-"` // Registry - Registry name Registry *string `json:"registry,omitempty"` // ImageName - Image name ImageName *string `json:"imageName,omitempty"` // ManifestsAttributes - List of manifests ManifestsAttributes *[]ManifestAttributesBase `json:"manifests,omitempty"` } // Annotations additional information provided through arbitrary metadata. type Annotations struct { // AdditionalProperties - Unmatched properties from the message are deserialized this collection AdditionalProperties map[string]interface{} `json:""` // Created - Date and time on which the image was built (string, date-time as defined by https://tools.ietf.org/html/rfc3339#section-5.6) Created *date.Time `json:"org.opencontainers.image.created,omitempty"` // Authors - Contact details of the people or organization responsible for the image. Authors *string `json:"org.opencontainers.image.authors,omitempty"` // URL - URL to find more information on the image. URL *string `json:"org.opencontainers.image.url,omitempty"` // Documentation - URL to get documentation on the image. Documentation *string `json:"org.opencontainers.image.documentation,omitempty"` // Source - URL to get source code for building the image. Source *string `json:"org.opencontainers.image.source,omitempty"` // Version - Version of the packaged software. The version MAY match a label or tag in the source code repository, may also be Semantic versioning-compatible Version *string `json:"org.opencontainers.image.version,omitempty"` // Revision - Source control revision identifier for the packaged software. Revision *string `json:"org.opencontainers.image.revision,omitempty"` // Vendor - Name of the distributing entity, organization or individual. Vendor *string `json:"org.opencontainers.image.vendor,omitempty"` // Licenses - License(s) under which contained software is distributed as an SPDX License Expression. Licenses *string `json:"org.opencontainers.image.licenses,omitempty"` // Name - Name of the reference for a target. Name *string `json:"org.opencontainers.image.ref.name,omitempty"` // Title - Human-readable title of the image Title *string `json:"org.opencontainers.image.title,omitempty"` // Description - Human-readable description of the software packaged in the image Description *string `json:"org.opencontainers.image.description,omitempty"` } // MarshalJSON is the custom marshaler for Annotations. func (a Annotations) MarshalJSON() ([]byte, error) { objectMap := make(map[string]interface{}) if a.Created != nil { objectMap["org.opencontainers.image.created"] = a.Created } if a.Authors != nil { objectMap["org.opencontainers.image.authors"] = a.Authors } if a.URL != nil { objectMap["org.opencontainers.image.url"] = a.URL } if a.Documentation != nil { objectMap["org.opencontainers.image.documentation"] = a.Documentation } if a.Source != nil { objectMap["org.opencontainers.image.source"] = a.Source } if a.Version != nil { objectMap["org.opencontainers.image.version"] = a.Version } if a.Revision != nil { objectMap["org.opencontainers.image.revision"] = a.Revision } if a.Vendor != nil { objectMap["org.opencontainers.image.vendor"] = a.Vendor } if a.Licenses != nil { objectMap["org.opencontainers.image.licenses"] = a.Licenses } if a.Name != nil { objectMap["org.opencontainers.image.ref.name"] = a.Name } if a.Title != nil { objectMap["org.opencontainers.image.title"] = a.Title } if a.Description != nil { objectMap["org.opencontainers.image.description"] = a.Description } for k, v := range a.AdditionalProperties { objectMap[k] = v } return json.Marshal(objectMap) } // UnmarshalJSON is the custom unmarshaler for Annotations struct. func (a *Annotations) UnmarshalJSON(body []byte) error { var m map[string]*json.RawMessage err := json.Unmarshal(body, &m) if err != nil { return err } for k, v := range m { switch k { default: if v != nil { var additionalProperties interface{} err = json.Unmarshal(*v, &additionalProperties) if err != nil { return err } if a.AdditionalProperties == nil { a.AdditionalProperties = make(map[string]interface{}) } a.AdditionalProperties[k] = additionalProperties } case "org.opencontainers.image.created": if v != nil { var created date.Time err = json.Unmarshal(*v, &created) if err != nil { return err } a.Created = &created } case "org.opencontainers.image.authors": if v != nil { var authors string err = json.Unmarshal(*v, &authors) if err != nil { return err } a.Authors = &authors } case "org.opencontainers.image.url": if v != nil { var URL string err = json.Unmarshal(*v, &URL) if err != nil { return err } a.URL = &URL } case "org.opencontainers.image.documentation": if v != nil { var documentation string err = json.Unmarshal(*v, &documentation) if err != nil { return err } a.Documentation = &documentation } case "org.opencontainers.image.source": if v != nil { var source string err = json.Unmarshal(*v, &source) if err != nil { return err } a.Source = &source } case "org.opencontainers.image.version": if v != nil { var version string err = json.Unmarshal(*v, &version) if err != nil { return err } a.Version = &version } case "org.opencontainers.image.revision": if v != nil { var revision string err = json.Unmarshal(*v, &revision) if err != nil { return err } a.Revision = &revision } case "org.opencontainers.image.vendor": if v != nil { var vendor string err = json.Unmarshal(*v, &vendor) if err != nil { return err } a.Vendor = &vendor } case "org.opencontainers.image.licenses": if v != nil { var licenses string err = json.Unmarshal(*v, &licenses) if err != nil { return err } a.Licenses = &licenses } case "org.opencontainers.image.ref.name": if v != nil { var name string err = json.Unmarshal(*v, &name) if err != nil { return err } a.Name = &name } case "org.opencontainers.image.title": if v != nil { var title string err = json.Unmarshal(*v, &title) if err != nil { return err } a.Title = &title } case "org.opencontainers.image.description": if v != nil { var description string err = json.Unmarshal(*v, &description) if err != nil { return err } a.Description = &description } } } return nil } // ChangeableAttributes ... type ChangeableAttributes struct { // DeleteEnabled - Delete enabled DeleteEnabled *bool `json:"deleteEnabled,omitempty"` // WriteEnabled - Write enabled WriteEnabled *bool `json:"writeEnabled,omitempty"` // ListEnabled - List enabled ListEnabled *bool `json:"listEnabled,omitempty"` // ReadEnabled - Read enabled ReadEnabled *bool `json:"readEnabled,omitempty"` } // DeletedRepository deleted repository type DeletedRepository struct { autorest.Response `json:"-"` // ManifestsDeleted - SHA of the deleted image ManifestsDeleted *[]string `json:"manifestsDeleted,omitempty"` // TagsDeleted - Tag of the deleted image TagsDeleted *[]string `json:"tagsDeleted,omitempty"` } // Descriptor docker V2 image layer descriptor including config and layers type Descriptor struct { // MediaType - Layer media type MediaType *string `json:"mediaType,omitempty"` // Size - Layer size Size *int64 `json:"size,omitempty"` // Digest - Layer digest Digest *string `json:"digest,omitempty"` // Urls - Specifies a list of URIs from which this object may be downloaded. Urls *[]string `json:"urls,omitempty"` Annotations *Annotations `json:"annotations,omitempty"` } // FsLayer image layer information type FsLayer struct { // BlobSum - SHA of an image layer BlobSum *string `json:"blobSum,omitempty"` } // History a list of unstructured historical data for v1 compatibility type History struct { // V1Compatibility - The raw v1 compatibility information V1Compatibility *string `json:"v1Compatibility,omitempty"` } // ImageSignature signature of a signed manifest type ImageSignature struct { // Header - A JSON web signature Header *JWK `json:"header,omitempty"` // Signature - A signature for the image manifest, signed by a libtrust private key Signature *string `json:"signature,omitempty"` // Protected - The signed protected header Protected *string `json:"protected,omitempty"` } // JWK a JSON web signature type JWK struct { Jwk *JWKHeader `json:"jwk,omitempty"` // Alg - The algorithm used to sign or encrypt the JWT Alg *string `json:"alg,omitempty"` } // JWKHeader JSON web key parameter type JWKHeader struct { // Crv - crv value Crv *string `json:"crv,omitempty"` // Kid - kid value Kid *string `json:"kid,omitempty"` // Kty - kty value Kty *string `json:"kty,omitempty"` // X - x value X *string `json:"x,omitempty"` // Y - y value Y *string `json:"y,omitempty"` } // Manifest returns the requested manifest file type Manifest struct { // SchemaVersion - Schema version SchemaVersion *int32 `json:"schemaVersion,omitempty"` } // ManifestAttributes manifest attributes details type ManifestAttributes struct { autorest.Response `json:"-"` // Registry - Registry name Registry *string `json:"registry,omitempty"` // ImageName - Image name ImageName *string `json:"imageName,omitempty"` // Attributes - Manifest attributes Attributes *ManifestAttributesBase `json:"manifest,omitempty"` } // ManifestAttributesBase manifest details type ManifestAttributesBase struct { // Digest - Manifest Digest *string `json:"digest,omitempty"` // ImageSize - Image size ImageSize *int64 `json:"imageSize,omitempty"` // CreatedTime - Created time CreatedTime *string `json:"createdTime,omitempty"` // LastUpdateTime - Last update time LastUpdateTime *string `json:"lastUpdateTime,omitempty"` // Architecture - CPU architecture Architecture *string `json:"architecture,omitempty"` // Os - Operating system Os *string `json:"os,omitempty"` // MediaType - Media type MediaType *string `json:"mediaType,omitempty"` // ConfigMediaType - Config blob media type ConfigMediaType *string `json:"configMediaType,omitempty"` // Tags - List of tags Tags *[]string `json:"tags,omitempty"` // ChangeableAttributes - Changeable attributes ChangeableAttributes *ChangeableAttributes `json:"changeableAttributes,omitempty"` } // ManifestAttributesManifest list of manifest attributes type ManifestAttributesManifest struct { // References - List of manifest attributes details References *[]ManifestAttributesManifestReferences `json:"references,omitempty"` // QuarantineTag - Quarantine tag name QuarantineTag *string `json:"quarantineTag,omitempty"` } // ManifestAttributesManifestReferences manifest attributes details type ManifestAttributesManifestReferences struct { // Digest - Manifest digest Digest *string `json:"digest,omitempty"` // Architecture - CPU architecture Architecture *string `json:"architecture,omitempty"` // Os - Operating system Os *string `json:"os,omitempty"` } // ManifestChangeableAttributes changeable attributes type ManifestChangeableAttributes struct { // DeleteEnabled - Delete enabled DeleteEnabled *bool `json:"deleteEnabled,omitempty"` // WriteEnabled - Write enabled WriteEnabled *bool `json:"writeEnabled,omitempty"` // ListEnabled - List enabled ListEnabled *bool `json:"listEnabled,omitempty"` // ReadEnabled - Read enabled ReadEnabled *bool `json:"readEnabled,omitempty"` // QuarantineState - Quarantine state QuarantineState *string `json:"quarantineState,omitempty"` // QuarantineDetails - Quarantine details QuarantineDetails *string `json:"quarantineDetails,omitempty"` } // ManifestList returns the requested Docker multi-arch-manifest file type ManifestList struct { // MediaType - Media type for this Manifest MediaType *string `json:"mediaType,omitempty"` // Manifests - List of V2 image layer information Manifests *[]ManifestListAttributes `json:"manifests,omitempty"` // SchemaVersion - Schema version SchemaVersion *int32 `json:"schemaVersion,omitempty"` } // ManifestListAttributes ... type ManifestListAttributes struct { // MediaType - The MIME type of the referenced object. This will generally be application/vnd.docker.image.manifest.v2+json, but it could also be application/vnd.docker.image.manifest.v1+json MediaType *string `json:"mediaType,omitempty"` // Size - The size in bytes of the object Size *int64 `json:"size,omitempty"` // Digest - The digest of the content, as defined by the Registry V2 HTTP API Specification Digest *string `json:"digest,omitempty"` Platform *Platform `json:"platform,omitempty"` } // ManifestWrapper returns the requested manifest file type ManifestWrapper struct { autorest.Response `json:"-"` // MediaType - Media type for this Manifest MediaType *string `json:"mediaType,omitempty"` // Manifests - (ManifestList, OCIIndex) List of V2 image layer information Manifests *[]ManifestListAttributes `json:"manifests,omitempty"` // Config - (V2, OCI) Image config descriptor Config *Descriptor `json:"config,omitempty"` // Layers - (V2, OCI) List of V2 image layer information Layers *[]Descriptor `json:"layers,omitempty"` // Annotations - (OCI, OCIIndex) Additional metadata Annotations *Annotations `json:"annotations,omitempty"` // Architecture - (V1) CPU architecture Architecture *string `json:"architecture,omitempty"` // Name - (V1) Image name Name *string `json:"name,omitempty"` // Tag - (V1) Image tag Tag *string `json:"tag,omitempty"` // FsLayers - (V1) List of layer information FsLayers *[]FsLayer `json:"fsLayers,omitempty"` // History - (V1) Image history History *[]History `json:"history,omitempty"` // Signatures - (V1) Image signature Signatures *[]ImageSignature `json:"signatures,omitempty"` // SchemaVersion - Schema version SchemaVersion *int32 `json:"schemaVersion,omitempty"` } // OCIIndex returns the requested OCI index file type OCIIndex struct { // Manifests - List of OCI image layer information Manifests *[]ManifestListAttributes `json:"manifests,omitempty"` Annotations *Annotations `json:"annotations,omitempty"` // SchemaVersion - Schema version SchemaVersion *int32 `json:"schemaVersion,omitempty"` } // OCIManifest returns the requested OCI Manifest file type OCIManifest struct { // Config - V2 image config descriptor Config *Descriptor `json:"config,omitempty"` // Layers - List of V2 image layer information Layers *[]Descriptor `json:"layers,omitempty"` Annotations *Annotations `json:"annotations,omitempty"` // SchemaVersion - Schema version SchemaVersion *int32 `json:"schemaVersion,omitempty"` } // Platform the platform object describes the platform which the image in the manifest runs on. A full list // of valid operating system and architecture values are listed in the Go language documentation for $GOOS // and $GOARCH type Platform struct { // Architecture - Specifies the CPU architecture, for example amd64 or ppc64le. Architecture *string `json:"architecture,omitempty"` // Os - The os field specifies the operating system, for example linux or windows. Os *string `json:"os,omitempty"` // OsVersion - The optional os.version field specifies the operating system version, for example 10.0.10586. OsVersion *string `json:"os.version,omitempty"` // OsFeatures - The optional os.features field specifies an array of strings, each listing a required OS feature (for example on Windows win32k OsFeatures *[]string `json:"os.features,omitempty"` // Variant - The optional variant field specifies a variant of the CPU, for example armv6l to specify a particular CPU variant of the ARM CPU. Variant *string `json:"variant,omitempty"` // Features - The optional features field specifies an array of strings, each listing a required CPU feature (for example sse4 or aes Features *[]string `json:"features,omitempty"` } // ReadCloser ... type ReadCloser struct { autorest.Response `json:"-"` Value *io.ReadCloser `json:"value,omitempty"` } // RefreshToken ... type RefreshToken struct { autorest.Response `json:"-"` // RefreshToken - The refresh token to be used for generating access tokens RefreshToken *string `json:"refresh_token,omitempty"` } // Repositories list of repositories type Repositories struct { autorest.Response `json:"-"` // Names - Repository names Names *[]string `json:"repositories,omitempty"` } // RepositoryAttributes repository attributes type RepositoryAttributes struct { autorest.Response `json:"-"` // Registry - Registry name Registry *string `json:"registry,omitempty"` // ImageName - Image name ImageName *string `json:"imageName,omitempty"` // CreatedTime - Image created time CreatedTime *string `json:"createdTime,omitempty"` // LastUpdateTime - Image last update time LastUpdateTime *string `json:"lastUpdateTime,omitempty"` // ManifestCount - Number of the manifests ManifestCount *int32 `json:"manifestCount,omitempty"` // TagCount - Number of the tags TagCount *int32 `json:"tagCount,omitempty"` // ChangeableAttributes - Changeable attributes ChangeableAttributes *ChangeableAttributes `json:"changeableAttributes,omitempty"` } // RepositoryTags result of the request to list tags of the image type RepositoryTags struct { // Name - Name of the image Name *string `json:"name,omitempty"` // Tags - List of tags Tags *[]string `json:"tags,omitempty"` } // SetObject ... type SetObject struct { autorest.Response `json:"-"` Value interface{} `json:"value,omitempty"` } // TagAttributes tag attributes type TagAttributes struct { autorest.Response `json:"-"` // Registry - Registry name Registry *string `json:"registry,omitempty"` // ImageName - Image name ImageName *string `json:"imageName,omitempty"` // Attributes - List of tag attribute details Attributes *TagAttributesBase `json:"tag,omitempty"` } // TagAttributesBase tag attribute details type TagAttributesBase struct { // Name - Tag name Name *string `json:"name,omitempty"` // Digest - Tag digest Digest *string `json:"digest,omitempty"` // CreatedTime - Tag created time CreatedTime *string `json:"createdTime,omitempty"` // LastUpdateTime - Tag last update time LastUpdateTime *string `json:"lastUpdateTime,omitempty"` // Signed - Is signed Signed *bool `json:"signed,omitempty"` // ChangeableAttributes - Changeable attributes ChangeableAttributes *ChangeableAttributes `json:"changeableAttributes,omitempty"` } // TagAttributesTag tag type TagAttributesTag struct { // SignatureRecord - SignatureRecord value SignatureRecord *string `json:"signatureRecord,omitempty"` } // TagList list of tag details type TagList struct { autorest.Response `json:"-"` // Registry - Registry name Registry *string `json:"registry,omitempty"` // ImageName - Image name ImageName *string `json:"imageName,omitempty"` // Tags - List of tag attribute details Tags *[]TagAttributesBase `json:"tags,omitempty"` } // V1Manifest returns the requested V1 manifest file type V1Manifest struct { // Architecture - CPU architecture Architecture *string `json:"architecture,omitempty"` // Name - Image name Name *string `json:"name,omitempty"` // Tag - Image tag Tag *string `json:"tag,omitempty"` // FsLayers - List of layer information FsLayers *[]FsLayer `json:"fsLayers,omitempty"` // History - Image history History *[]History `json:"history,omitempty"` // Signatures - Image signature Signatures *[]ImageSignature `json:"signatures,omitempty"` // SchemaVersion - Schema version SchemaVersion *int32 `json:"schemaVersion,omitempty"` } // V2Manifest returns the requested Docker V2 Manifest file type V2Manifest struct { // MediaType - Media type for this Manifest MediaType *string `json:"mediaType,omitempty"` // Config - V2 image config descriptor Config *Descriptor `json:"config,omitempty"` // Layers - List of V2 image layer information Layers *[]Descriptor `json:"layers,omitempty"` // SchemaVersion - Schema version SchemaVersion *int32 `json:"schemaVersion,omitempty"` } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/refreshtokens.go ================================================ package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "context" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/go-autorest/tracing" "net/http" ) // RefreshTokensClient is the metadata API definition for the Azure Container Registry runtime type RefreshTokensClient struct { BaseClient } // NewRefreshTokensClient creates an instance of the RefreshTokensClient client. func NewRefreshTokensClient(loginURI string) RefreshTokensClient { return RefreshTokensClient{New(loginURI)} } // GetFromExchange exchange AAD tokens for an ACR refresh Token // Parameters: // grantType - can take a value of access_token_refresh_token, or access_token, or refresh_token // service - indicates the name of your Azure container registry. // tenant - AAD tenant associated to the AAD credentials. // refreshToken - AAD refresh token, mandatory when grant_type is access_token_refresh_token or refresh_token // accessToken - AAD access token, mandatory when grant_type is access_token_refresh_token or access_token. func (client RefreshTokensClient) GetFromExchange(ctx context.Context, grantType string, service string, tenant string, refreshToken string, accessToken string) (result RefreshToken, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/RefreshTokensClient.GetFromExchange") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetFromExchangePreparer(ctx, grantType, service, tenant, refreshToken, accessToken) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RefreshTokensClient", "GetFromExchange", nil, "Failure preparing request") return } resp, err := client.GetFromExchangeSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.RefreshTokensClient", "GetFromExchange", resp, "Failure sending request") return } result, err = client.GetFromExchangeResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RefreshTokensClient", "GetFromExchange", resp, "Failure responding to request") return } return } // GetFromExchangePreparer prepares the GetFromExchange request. func (client RefreshTokensClient) GetFromExchangePreparer(ctx context.Context, grantType string, service string, tenant string, refreshToken string, accessToken string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } formDataParameters := map[string]interface{}{ "grant_type": grantType, "service": service, } if len(tenant) > 0 { formDataParameters["tenant"] = tenant } if len(refreshToken) > 0 { formDataParameters["refresh_token"] = refreshToken } if len(accessToken) > 0 { formDataParameters["access_token"] = accessToken } preparer := autorest.CreatePreparer( autorest.AsPost(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPath("/oauth2/exchange"), autorest.WithFormData(autorest.MapToValues(formDataParameters))) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetFromExchangeSender sends the GetFromExchange request. The method will close the // http.Response Body if it receives an error. func (client RefreshTokensClient) GetFromExchangeSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetFromExchangeResponder handles the response to the GetFromExchange request. The method always // closes the http.Response Body. func (client RefreshTokensClient) GetFromExchangeResponder(resp *http.Response) (result RefreshToken, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/repository.go ================================================ package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "context" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/go-autorest/tracing" "net/http" ) // RepositoryClient is the metadata API definition for the Azure Container Registry runtime type RepositoryClient struct { BaseClient } // NewRepositoryClient creates an instance of the RepositoryClient client. func NewRepositoryClient(loginURI string) RepositoryClient { return RepositoryClient{New(loginURI)} } // Delete delete the repository identified by `name` // Parameters: // name - name of the image (including the namespace) func (client RepositoryClient) Delete(ctx context.Context, name string) (result DeletedRepository, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/RepositoryClient.Delete") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.DeletePreparer(ctx, name) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "Delete", nil, "Failure preparing request") return } resp, err := client.DeleteSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "Delete", resp, "Failure sending request") return } result, err = client.DeleteResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "Delete", resp, "Failure responding to request") return } return } // DeletePreparer prepares the Delete request. func (client RepositoryClient) DeletePreparer(ctx context.Context, name string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsDelete(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // DeleteSender sends the Delete request. The method will close the // http.Response Body if it receives an error. func (client RepositoryClient) DeleteSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // DeleteResponder handles the response to the Delete request. The method always // closes the http.Response Body. func (client RepositoryClient) DeleteResponder(resp *http.Response) (result DeletedRepository, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // GetAttributes get repository attributes // Parameters: // name - name of the image (including the namespace) func (client RepositoryClient) GetAttributes(ctx context.Context, name string) (result RepositoryAttributes, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/RepositoryClient.GetAttributes") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetAttributesPreparer(ctx, name) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "GetAttributes", nil, "Failure preparing request") return } resp, err := client.GetAttributesSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "GetAttributes", resp, "Failure sending request") return } result, err = client.GetAttributesResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "GetAttributes", resp, "Failure responding to request") return } return } // GetAttributesPreparer prepares the GetAttributes request. func (client RepositoryClient) GetAttributesPreparer(ctx context.Context, name string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetAttributesSender sends the GetAttributes request. The method will close the // http.Response Body if it receives an error. func (client RepositoryClient) GetAttributesSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetAttributesResponder handles the response to the GetAttributes request. The method always // closes the http.Response Body. func (client RepositoryClient) GetAttributesResponder(resp *http.Response) (result RepositoryAttributes, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // GetList list repositories // Parameters: // last - query parameter for the last item in previous query. Result set will include values lexically after // last. // n - query parameter for max number of items func (client RepositoryClient) GetList(ctx context.Context, last string, n *int32) (result Repositories, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/RepositoryClient.GetList") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetListPreparer(ctx, last, n) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "GetList", nil, "Failure preparing request") return } resp, err := client.GetListSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "GetList", resp, "Failure sending request") return } result, err = client.GetListResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "GetList", resp, "Failure responding to request") return } return } // GetListPreparer prepares the GetList request. func (client RepositoryClient) GetListPreparer(ctx context.Context, last string, n *int32) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } queryParameters := map[string]interface{}{} if len(last) > 0 { queryParameters["last"] = autorest.Encode("query", last) } if n != nil { queryParameters["n"] = autorest.Encode("query", *n) } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPath("/acr/v1/_catalog"), autorest.WithQueryParameters(queryParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetListSender sends the GetList request. The method will close the // http.Response Body if it receives an error. func (client RepositoryClient) GetListSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetListResponder handles the response to the GetList request. The method always // closes the http.Response Body. func (client RepositoryClient) GetListResponder(resp *http.Response) (result Repositories, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // UpdateAttributes update the attribute identified by `name` where `reference` is the name of the repository. // Parameters: // name - name of the image (including the namespace) // value - repository attribute value func (client RepositoryClient) UpdateAttributes(ctx context.Context, name string, value *ChangeableAttributes) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/RepositoryClient.UpdateAttributes") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.UpdateAttributesPreparer(ctx, name, value) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "UpdateAttributes", nil, "Failure preparing request") return } resp, err := client.UpdateAttributesSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "UpdateAttributes", resp, "Failure sending request") return } result, err = client.UpdateAttributesResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.RepositoryClient", "UpdateAttributes", resp, "Failure responding to request") return } return } // UpdateAttributesPreparer prepares the UpdateAttributes request. func (client RepositoryClient) UpdateAttributesPreparer(ctx context.Context, name string, value *ChangeableAttributes) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), } preparer := autorest.CreatePreparer( autorest.AsContentType("application/json; charset=utf-8"), autorest.AsPatch(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}", pathParameters)) if value != nil { preparer = autorest.DecoratePreparer(preparer, autorest.WithJSON(value)) } return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // UpdateAttributesSender sends the UpdateAttributes request. The method will close the // http.Response Body if it receives an error. func (client RepositoryClient) UpdateAttributesSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // UpdateAttributesResponder handles the response to the UpdateAttributes request. The method always // closes the http.Response Body. func (client RepositoryClient) UpdateAttributesResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) result.Response = resp return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/tag.go ================================================ package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "context" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/go-autorest/tracing" "net/http" ) // TagClient is the metadata API definition for the Azure Container Registry runtime type TagClient struct { BaseClient } // NewTagClient creates an instance of the TagClient client. func NewTagClient(loginURI string) TagClient { return TagClient{New(loginURI)} } // Delete delete tag // Parameters: // name - name of the image (including the namespace) // reference - tag name func (client TagClient) Delete(ctx context.Context, name string, reference string) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/TagClient.Delete") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.DeletePreparer(ctx, name, reference) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "Delete", nil, "Failure preparing request") return } resp, err := client.DeleteSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "Delete", resp, "Failure sending request") return } result, err = client.DeleteResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "Delete", resp, "Failure responding to request") return } return } // DeletePreparer prepares the Delete request. func (client TagClient) DeletePreparer(ctx context.Context, name string, reference string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), "reference": autorest.Encode("path", reference), } preparer := autorest.CreatePreparer( autorest.AsDelete(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}/_tags/{reference}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // DeleteSender sends the Delete request. The method will close the // http.Response Body if it receives an error. func (client TagClient) DeleteSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // DeleteResponder handles the response to the Delete request. The method always // closes the http.Response Body. func (client TagClient) DeleteResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted), autorest.ByClosing()) result.Response = resp return } // GetAttributes get tag attributes by tag // Parameters: // name - name of the image (including the namespace) // reference - tag name func (client TagClient) GetAttributes(ctx context.Context, name string, reference string) (result TagAttributes, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/TagClient.GetAttributes") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetAttributesPreparer(ctx, name, reference) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "GetAttributes", nil, "Failure preparing request") return } resp, err := client.GetAttributesSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "GetAttributes", resp, "Failure sending request") return } result, err = client.GetAttributesResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "GetAttributes", resp, "Failure responding to request") return } return } // GetAttributesPreparer prepares the GetAttributes request. func (client TagClient) GetAttributesPreparer(ctx context.Context, name string, reference string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), "reference": autorest.Encode("path", reference), } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}/_tags/{reference}", pathParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetAttributesSender sends the GetAttributes request. The method will close the // http.Response Body if it receives an error. func (client TagClient) GetAttributesSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetAttributesResponder handles the response to the GetAttributes request. The method always // closes the http.Response Body. func (client TagClient) GetAttributesResponder(resp *http.Response) (result TagAttributes, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // GetList list tags of a repository // Parameters: // name - name of the image (including the namespace) // last - query parameter for the last item in previous query. Result set will include values lexically after // last. // n - query parameter for max number of items // orderby - orderby query parameter // digest - filter by digest func (client TagClient) GetList(ctx context.Context, name string, last string, n *int32, orderby string, digest string) (result TagList, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/TagClient.GetList") defer func() { sc := -1 if result.Response.Response != nil { sc = result.Response.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.GetListPreparer(ctx, name, last, n, orderby, digest) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "GetList", nil, "Failure preparing request") return } resp, err := client.GetListSender(req) if err != nil { result.Response = autorest.Response{Response: resp} err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "GetList", resp, "Failure sending request") return } result, err = client.GetListResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "GetList", resp, "Failure responding to request") return } return } // GetListPreparer prepares the GetList request. func (client TagClient) GetListPreparer(ctx context.Context, name string, last string, n *int32, orderby string, digest string) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), } queryParameters := map[string]interface{}{} if len(last) > 0 { queryParameters["last"] = autorest.Encode("query", last) } if n != nil { queryParameters["n"] = autorest.Encode("query", *n) } if len(orderby) > 0 { queryParameters["orderby"] = autorest.Encode("query", orderby) } if len(digest) > 0 { queryParameters["digest"] = autorest.Encode("query", digest) } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}/_tags", pathParameters), autorest.WithQueryParameters(queryParameters)) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // GetListSender sends the GetList request. The method will close the // http.Response Body if it receives an error. func (client TagClient) GetListSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // GetListResponder handles the response to the GetList request. The method always // closes the http.Response Body. func (client TagClient) GetListResponder(resp *http.Response) (result TagList, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByUnmarshallingJSON(&result), autorest.ByClosing()) result.Response = autorest.Response{Response: resp} return } // UpdateAttributes update tag attributes // Parameters: // name - name of the image (including the namespace) // reference - tag name // value - repository attribute value func (client TagClient) UpdateAttributes(ctx context.Context, name string, reference string, value *ChangeableAttributes) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/TagClient.UpdateAttributes") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.UpdateAttributesPreparer(ctx, name, reference, value) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "UpdateAttributes", nil, "Failure preparing request") return } resp, err := client.UpdateAttributesSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "UpdateAttributes", resp, "Failure sending request") return } result, err = client.UpdateAttributesResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.TagClient", "UpdateAttributes", resp, "Failure responding to request") return } return } // UpdateAttributesPreparer prepares the UpdateAttributes request. func (client TagClient) UpdateAttributesPreparer(ctx context.Context, name string, reference string, value *ChangeableAttributes) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } pathParameters := map[string]interface{}{ "name": autorest.Encode("path", name), "reference": autorest.Encode("path", reference), } preparer := autorest.CreatePreparer( autorest.AsContentType("application/json; charset=utf-8"), autorest.AsPatch(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPathParameters("/acr/v1/{name}/_tags/{reference}", pathParameters)) if value != nil { preparer = autorest.DecoratePreparer(preparer, autorest.WithJSON(value)) } return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // UpdateAttributesSender sends the UpdateAttributes request. The method will close the // http.Response Body if it receives an error. func (client TagClient) UpdateAttributesSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // UpdateAttributesResponder handles the response to the UpdateAttributes request. The method always // closes the http.Response Body. func (client TagClient) UpdateAttributesResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) result.Response = resp return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/v2support.go ================================================ package containerregistry // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. import ( "context" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/azure" "github.com/Azure/go-autorest/tracing" "net/http" ) // V2SupportClient is the metadata API definition for the Azure Container Registry runtime type V2SupportClient struct { BaseClient } // NewV2SupportClient creates an instance of the V2SupportClient client. func NewV2SupportClient(loginURI string) V2SupportClient { return V2SupportClient{New(loginURI)} } // Check tells whether this Docker Registry instance supports Docker Registry HTTP API v2 func (client V2SupportClient) Check(ctx context.Context) (result autorest.Response, err error) { if tracing.IsEnabled() { ctx = tracing.StartSpan(ctx, fqdn+"/V2SupportClient.Check") defer func() { sc := -1 if result.Response != nil { sc = result.Response.StatusCode } tracing.EndSpan(ctx, sc, err) }() } req, err := client.CheckPreparer(ctx) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.V2SupportClient", "Check", nil, "Failure preparing request") return } resp, err := client.CheckSender(req) if err != nil { result.Response = resp err = autorest.NewErrorWithError(err, "containerregistry.V2SupportClient", "Check", resp, "Failure sending request") return } result, err = client.CheckResponder(resp) if err != nil { err = autorest.NewErrorWithError(err, "containerregistry.V2SupportClient", "Check", resp, "Failure responding to request") return } return } // CheckPreparer prepares the Check request. func (client V2SupportClient) CheckPreparer(ctx context.Context) (*http.Request, error) { urlParameters := map[string]interface{}{ "url": client.LoginURI, } preparer := autorest.CreatePreparer( autorest.AsGet(), autorest.WithCustomBaseURL("{url}", urlParameters), autorest.WithPath("/v2/")) return preparer.Prepare((&http.Request{}).WithContext(ctx)) } // CheckSender sends the Check request. The method will close the // http.Response Body if it receives an error. func (client V2SupportClient) CheckSender(req *http.Request) (*http.Response, error) { return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...)) } // CheckResponder handles the response to the Check request. The method always // closes the http.Response Body. func (client V2SupportClient) CheckResponder(resp *http.Response) (result autorest.Response, err error) { err = autorest.Respond( resp, azure.WithErrorUnlessStatusCode(http.StatusOK), autorest.ByClosing()) result.Response = resp return } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry/version.go ================================================ package containerregistry import "github.com/Azure/azure-sdk-for-go/version" // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // // Code generated by Microsoft (R) AutoRest Code Generator. // Changes may cause incorrect behavior and will be lost if the code is regenerated. // UserAgent returns the UserAgent string to use when sending http.Requests. func UserAgent() string { return "Azure-SDK-For-Go/" + Version() + " containerregistry/2019-08-15-preview" } // Version returns the semantic version (see http://semver.org) of the client. func Version() string { return version.Number } ================================================ FILE: vendor/github.com/Azure/azure-sdk-for-go/version/version.go ================================================ package version // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // Number contains the semantic version of this SDK. const Number = "v68.0.0" ================================================ FILE: vendor/github.com/Azure/go-ansiterm/LICENSE ================================================ The MIT License (MIT) Copyright (c) 2015 Microsoft Corporation Permission 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE 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. ================================================ FILE: vendor/github.com/Azure/go-ansiterm/README.md ================================================ # go-ansiterm This is a cross platform Ansi Terminal Emulation library. It reads a stream of Ansi characters and produces the appropriate function calls. The results of the function calls are platform dependent. For example the parser might receive "ESC, [, A" as a stream of three characters. This is the code for Cursor Up (http://www.vt100.net/docs/vt510-rm/CUU). The parser then calls the cursor up function (CUU()) on an event handler. The event handler determines what platform specific work must be done to cause the cursor to move up one position. The parser (parser.go) is a partial implementation of this state machine (http://vt100.net/emu/vt500_parser.png). There are also two event handler implementations, one for tests (test_event_handler.go) to validate that the expected events are being produced and called, the other is a Windows implementation (winterm/win_event_handler.go). See parser_test.go for examples exercising the state machine and generating appropriate function calls. ----- This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ================================================ FILE: vendor/github.com/Azure/go-ansiterm/SECURITY.md ================================================ ## Security Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. ## Reporting Security Issues **Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. ## Preferred Languages We prefer all communications to be in English. ## Policy Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). ================================================ FILE: vendor/github.com/Azure/go-ansiterm/constants.go ================================================ package ansiterm const LogEnv = "DEBUG_TERMINAL" // ANSI constants // References: // -- http://www.ecma-international.org/publications/standards/Ecma-048.htm // -- http://man7.org/linux/man-pages/man4/console_codes.4.html // -- http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html // -- http://en.wikipedia.org/wiki/ANSI_escape_code // -- http://vt100.net/emu/dec_ansi_parser // -- http://vt100.net/emu/vt500_parser.svg // -- http://invisible-island.net/xterm/ctlseqs/ctlseqs.html // -- http://www.inwap.com/pdp10/ansicode.txt const ( // ECMA-48 Set Graphics Rendition // Note: // -- Constants leading with an underscore (e.g., _ANSI_xxx) are unsupported or reserved // -- Fonts could possibly be supported via SetCurrentConsoleFontEx // -- Windows does not expose the per-window cursor (i.e., caret) blink times ANSI_SGR_RESET = 0 ANSI_SGR_BOLD = 1 ANSI_SGR_DIM = 2 _ANSI_SGR_ITALIC = 3 ANSI_SGR_UNDERLINE = 4 _ANSI_SGR_BLINKSLOW = 5 _ANSI_SGR_BLINKFAST = 6 ANSI_SGR_REVERSE = 7 _ANSI_SGR_INVISIBLE = 8 _ANSI_SGR_LINETHROUGH = 9 _ANSI_SGR_FONT_00 = 10 _ANSI_SGR_FONT_01 = 11 _ANSI_SGR_FONT_02 = 12 _ANSI_SGR_FONT_03 = 13 _ANSI_SGR_FONT_04 = 14 _ANSI_SGR_FONT_05 = 15 _ANSI_SGR_FONT_06 = 16 _ANSI_SGR_FONT_07 = 17 _ANSI_SGR_FONT_08 = 18 _ANSI_SGR_FONT_09 = 19 _ANSI_SGR_FONT_10 = 20 _ANSI_SGR_DOUBLEUNDERLINE = 21 ANSI_SGR_BOLD_DIM_OFF = 22 _ANSI_SGR_ITALIC_OFF = 23 ANSI_SGR_UNDERLINE_OFF = 24 _ANSI_SGR_BLINK_OFF = 25 _ANSI_SGR_RESERVED_00 = 26 ANSI_SGR_REVERSE_OFF = 27 _ANSI_SGR_INVISIBLE_OFF = 28 _ANSI_SGR_LINETHROUGH_OFF = 29 ANSI_SGR_FOREGROUND_BLACK = 30 ANSI_SGR_FOREGROUND_RED = 31 ANSI_SGR_FOREGROUND_GREEN = 32 ANSI_SGR_FOREGROUND_YELLOW = 33 ANSI_SGR_FOREGROUND_BLUE = 34 ANSI_SGR_FOREGROUND_MAGENTA = 35 ANSI_SGR_FOREGROUND_CYAN = 36 ANSI_SGR_FOREGROUND_WHITE = 37 _ANSI_SGR_RESERVED_01 = 38 ANSI_SGR_FOREGROUND_DEFAULT = 39 ANSI_SGR_BACKGROUND_BLACK = 40 ANSI_SGR_BACKGROUND_RED = 41 ANSI_SGR_BACKGROUND_GREEN = 42 ANSI_SGR_BACKGROUND_YELLOW = 43 ANSI_SGR_BACKGROUND_BLUE = 44 ANSI_SGR_BACKGROUND_MAGENTA = 45 ANSI_SGR_BACKGROUND_CYAN = 46 ANSI_SGR_BACKGROUND_WHITE = 47 _ANSI_SGR_RESERVED_02 = 48 ANSI_SGR_BACKGROUND_DEFAULT = 49 // 50 - 65: Unsupported ANSI_MAX_CMD_LENGTH = 4096 MAX_INPUT_EVENTS = 128 DEFAULT_WIDTH = 80 DEFAULT_HEIGHT = 24 ANSI_BEL = 0x07 ANSI_BACKSPACE = 0x08 ANSI_TAB = 0x09 ANSI_LINE_FEED = 0x0A ANSI_VERTICAL_TAB = 0x0B ANSI_FORM_FEED = 0x0C ANSI_CARRIAGE_RETURN = 0x0D ANSI_ESCAPE_PRIMARY = 0x1B ANSI_ESCAPE_SECONDARY = 0x5B ANSI_OSC_STRING_ENTRY = 0x5D ANSI_COMMAND_FIRST = 0x40 ANSI_COMMAND_LAST = 0x7E DCS_ENTRY = 0x90 CSI_ENTRY = 0x9B OSC_STRING = 0x9D ANSI_PARAMETER_SEP = ";" ANSI_CMD_G0 = '(' ANSI_CMD_G1 = ')' ANSI_CMD_G2 = '*' ANSI_CMD_G3 = '+' ANSI_CMD_DECPNM = '>' ANSI_CMD_DECPAM = '=' ANSI_CMD_OSC = ']' ANSI_CMD_STR_TERM = '\\' KEY_CONTROL_PARAM_2 = ";2" KEY_CONTROL_PARAM_3 = ";3" KEY_CONTROL_PARAM_4 = ";4" KEY_CONTROL_PARAM_5 = ";5" KEY_CONTROL_PARAM_6 = ";6" KEY_CONTROL_PARAM_7 = ";7" KEY_CONTROL_PARAM_8 = ";8" KEY_ESC_CSI = "\x1B[" KEY_ESC_N = "\x1BN" KEY_ESC_O = "\x1BO" FILL_CHARACTER = ' ' ) func getByteRange(start byte, end byte) []byte { bytes := make([]byte, 0, 32) for i := start; i <= end; i++ { bytes = append(bytes, byte(i)) } return bytes } var toGroundBytes = getToGroundBytes() var executors = getExecuteBytes() // SPACE 20+A0 hex Always and everywhere a blank space // Intermediate 20-2F hex !"#$%&'()*+,-./ var intermeds = getByteRange(0x20, 0x2F) // Parameters 30-3F hex 0123456789:;<=>? // CSI Parameters 30-39, 3B hex 0123456789; var csiParams = getByteRange(0x30, 0x3F) var csiCollectables = append(getByteRange(0x30, 0x39), getByteRange(0x3B, 0x3F)...) // Uppercase 40-5F hex @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ var upperCase = getByteRange(0x40, 0x5F) // Lowercase 60-7E hex `abcdefghijlkmnopqrstuvwxyz{|}~ var lowerCase = getByteRange(0x60, 0x7E) // Alphabetics 40-7E hex (all of upper and lower case) var alphabetics = append(upperCase, lowerCase...) var printables = getByteRange(0x20, 0x7F) var escapeIntermediateToGroundBytes = getByteRange(0x30, 0x7E) var escapeToGroundBytes = getEscapeToGroundBytes() // See http://www.vt100.net/emu/vt500_parser.png for description of the complex // byte ranges below func getEscapeToGroundBytes() []byte { escapeToGroundBytes := getByteRange(0x30, 0x4F) escapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x51, 0x57)...) escapeToGroundBytes = append(escapeToGroundBytes, 0x59) escapeToGroundBytes = append(escapeToGroundBytes, 0x5A) escapeToGroundBytes = append(escapeToGroundBytes, 0x5C) escapeToGroundBytes = append(escapeToGroundBytes, getByteRange(0x60, 0x7E)...) return escapeToGroundBytes } func getExecuteBytes() []byte { executeBytes := getByteRange(0x00, 0x17) executeBytes = append(executeBytes, 0x19) executeBytes = append(executeBytes, getByteRange(0x1C, 0x1F)...) return executeBytes } func getToGroundBytes() []byte { groundBytes := []byte{0x18} groundBytes = append(groundBytes, 0x1A) groundBytes = append(groundBytes, getByteRange(0x80, 0x8F)...) groundBytes = append(groundBytes, getByteRange(0x91, 0x97)...) groundBytes = append(groundBytes, 0x99) groundBytes = append(groundBytes, 0x9A) groundBytes = append(groundBytes, 0x9C) return groundBytes } // Delete 7F hex Always and everywhere ignored // C1 Control 80-9F hex 32 additional control characters // G1 Displayable A1-FE hex 94 additional displayable characters // Special A0+FF hex Same as SPACE and DELETE ================================================ FILE: vendor/github.com/Azure/go-ansiterm/context.go ================================================ package ansiterm type ansiContext struct { currentChar byte paramBuffer []byte interBuffer []byte } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/csi_entry_state.go ================================================ package ansiterm type csiEntryState struct { baseState } func (csiState csiEntryState) Handle(b byte) (s state, e error) { csiState.parser.logf("CsiEntry::Handle %#x", b) nextState, err := csiState.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err } switch { case sliceContains(alphabetics, b): return csiState.parser.ground, nil case sliceContains(csiCollectables, b): return csiState.parser.csiParam, nil case sliceContains(executors, b): return csiState, csiState.parser.execute() } return csiState, nil } func (csiState csiEntryState) Transition(s state) error { csiState.parser.logf("CsiEntry::Transition %s --> %s", csiState.Name(), s.Name()) csiState.baseState.Transition(s) switch s { case csiState.parser.ground: return csiState.parser.csiDispatch() case csiState.parser.csiParam: switch { case sliceContains(csiParams, csiState.parser.context.currentChar): csiState.parser.collectParam() case sliceContains(intermeds, csiState.parser.context.currentChar): csiState.parser.collectInter() } } return nil } func (csiState csiEntryState) Enter() error { csiState.parser.clear() return nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/csi_param_state.go ================================================ package ansiterm type csiParamState struct { baseState } func (csiState csiParamState) Handle(b byte) (s state, e error) { csiState.parser.logf("CsiParam::Handle %#x", b) nextState, err := csiState.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err } switch { case sliceContains(alphabetics, b): return csiState.parser.ground, nil case sliceContains(csiCollectables, b): csiState.parser.collectParam() return csiState, nil case sliceContains(executors, b): return csiState, csiState.parser.execute() } return csiState, nil } func (csiState csiParamState) Transition(s state) error { csiState.parser.logf("CsiParam::Transition %s --> %s", csiState.Name(), s.Name()) csiState.baseState.Transition(s) switch s { case csiState.parser.ground: return csiState.parser.csiDispatch() } return nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go ================================================ package ansiterm type escapeIntermediateState struct { baseState } func (escState escapeIntermediateState) Handle(b byte) (s state, e error) { escState.parser.logf("escapeIntermediateState::Handle %#x", b) nextState, err := escState.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err } switch { case sliceContains(intermeds, b): return escState, escState.parser.collectInter() case sliceContains(executors, b): return escState, escState.parser.execute() case sliceContains(escapeIntermediateToGroundBytes, b): return escState.parser.ground, nil } return escState, nil } func (escState escapeIntermediateState) Transition(s state) error { escState.parser.logf("escapeIntermediateState::Transition %s --> %s", escState.Name(), s.Name()) escState.baseState.Transition(s) switch s { case escState.parser.ground: return escState.parser.escDispatch() } return nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/escape_state.go ================================================ package ansiterm type escapeState struct { baseState } func (escState escapeState) Handle(b byte) (s state, e error) { escState.parser.logf("escapeState::Handle %#x", b) nextState, err := escState.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err } switch { case b == ANSI_ESCAPE_SECONDARY: return escState.parser.csiEntry, nil case b == ANSI_OSC_STRING_ENTRY: return escState.parser.oscString, nil case sliceContains(executors, b): return escState, escState.parser.execute() case sliceContains(escapeToGroundBytes, b): return escState.parser.ground, nil case sliceContains(intermeds, b): return escState.parser.escapeIntermediate, nil } return escState, nil } func (escState escapeState) Transition(s state) error { escState.parser.logf("Escape::Transition %s --> %s", escState.Name(), s.Name()) escState.baseState.Transition(s) switch s { case escState.parser.ground: return escState.parser.escDispatch() case escState.parser.escapeIntermediate: return escState.parser.collectInter() } return nil } func (escState escapeState) Enter() error { escState.parser.clear() return nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/event_handler.go ================================================ package ansiterm type AnsiEventHandler interface { // Print Print(b byte) error // Execute C0 commands Execute(b byte) error // CUrsor Up CUU(int) error // CUrsor Down CUD(int) error // CUrsor Forward CUF(int) error // CUrsor Backward CUB(int) error // Cursor to Next Line CNL(int) error // Cursor to Previous Line CPL(int) error // Cursor Horizontal position Absolute CHA(int) error // Vertical line Position Absolute VPA(int) error // CUrsor Position CUP(int, int) error // Horizontal and Vertical Position (depends on PUM) HVP(int, int) error // Text Cursor Enable Mode DECTCEM(bool) error // Origin Mode DECOM(bool) error // 132 Column Mode DECCOLM(bool) error // Erase in Display ED(int) error // Erase in Line EL(int) error // Insert Line IL(int) error // Delete Line DL(int) error // Insert Character ICH(int) error // Delete Character DCH(int) error // Set Graphics Rendition SGR([]int) error // Pan Down SU(int) error // Pan Up SD(int) error // Device Attributes DA([]string) error // Set Top and Bottom Margins DECSTBM(int, int) error // Index IND() error // Reverse Index RI() error // Flush updates from previous commands Flush() error } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/ground_state.go ================================================ package ansiterm type groundState struct { baseState } func (gs groundState) Handle(b byte) (s state, e error) { gs.parser.context.currentChar = b nextState, err := gs.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err } switch { case sliceContains(printables, b): return gs, gs.parser.print() case sliceContains(executors, b): return gs, gs.parser.execute() } return gs, nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/osc_string_state.go ================================================ package ansiterm type oscStringState struct { baseState } func (oscState oscStringState) Handle(b byte) (s state, e error) { oscState.parser.logf("OscString::Handle %#x", b) nextState, err := oscState.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err } // There are several control characters and sequences which can // terminate an OSC string. Most of them are handled by the baseState // handler. The ANSI_BEL character is a special case which behaves as a // terminator only for an OSC string. if b == ANSI_BEL { return oscState.parser.ground, nil } return oscState, nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/parser.go ================================================ package ansiterm import ( "errors" "log" "os" ) type AnsiParser struct { currState state eventHandler AnsiEventHandler context *ansiContext csiEntry state csiParam state dcsEntry state escape state escapeIntermediate state error state ground state oscString state stateMap []state logf func(string, ...interface{}) } type Option func(*AnsiParser) func WithLogf(f func(string, ...interface{})) Option { return func(ap *AnsiParser) { ap.logf = f } } func CreateParser(initialState string, evtHandler AnsiEventHandler, opts ...Option) *AnsiParser { ap := &AnsiParser{ eventHandler: evtHandler, context: &ansiContext{}, } for _, o := range opts { o(ap) } if isDebugEnv := os.Getenv(LogEnv); isDebugEnv == "1" { logFile, _ := os.Create("ansiParser.log") logger := log.New(logFile, "", log.LstdFlags) if ap.logf != nil { l := ap.logf ap.logf = func(s string, v ...interface{}) { l(s, v...) logger.Printf(s, v...) } } else { ap.logf = logger.Printf } } if ap.logf == nil { ap.logf = func(string, ...interface{}) {} } ap.csiEntry = csiEntryState{baseState{name: "CsiEntry", parser: ap}} ap.csiParam = csiParamState{baseState{name: "CsiParam", parser: ap}} ap.dcsEntry = dcsEntryState{baseState{name: "DcsEntry", parser: ap}} ap.escape = escapeState{baseState{name: "Escape", parser: ap}} ap.escapeIntermediate = escapeIntermediateState{baseState{name: "EscapeIntermediate", parser: ap}} ap.error = errorState{baseState{name: "Error", parser: ap}} ap.ground = groundState{baseState{name: "Ground", parser: ap}} ap.oscString = oscStringState{baseState{name: "OscString", parser: ap}} ap.stateMap = []state{ ap.csiEntry, ap.csiParam, ap.dcsEntry, ap.escape, ap.escapeIntermediate, ap.error, ap.ground, ap.oscString, } ap.currState = getState(initialState, ap.stateMap) ap.logf("CreateParser: parser %p", ap) return ap } func getState(name string, states []state) state { for _, el := range states { if el.Name() == name { return el } } return nil } func (ap *AnsiParser) Parse(bytes []byte) (int, error) { for i, b := range bytes { if err := ap.handle(b); err != nil { return i, err } } return len(bytes), ap.eventHandler.Flush() } func (ap *AnsiParser) handle(b byte) error { ap.context.currentChar = b newState, err := ap.currState.Handle(b) if err != nil { return err } if newState == nil { ap.logf("WARNING: newState is nil") return errors.New("New state of 'nil' is invalid.") } if newState != ap.currState { if err := ap.changeState(newState); err != nil { return err } } return nil } func (ap *AnsiParser) changeState(newState state) error { ap.logf("ChangeState %s --> %s", ap.currState.Name(), newState.Name()) // Exit old state if err := ap.currState.Exit(); err != nil { ap.logf("Exit state '%s' failed with : '%v'", ap.currState.Name(), err) return err } // Perform transition action if err := ap.currState.Transition(newState); err != nil { ap.logf("Transition from '%s' to '%s' failed with: '%v'", ap.currState.Name(), newState.Name, err) return err } // Enter new state if err := newState.Enter(); err != nil { ap.logf("Enter state '%s' failed with: '%v'", newState.Name(), err) return err } ap.currState = newState return nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go ================================================ package ansiterm import ( "strconv" ) func parseParams(bytes []byte) ([]string, error) { paramBuff := make([]byte, 0, 0) params := []string{} for _, v := range bytes { if v == ';' { if len(paramBuff) > 0 { // Completed parameter, append it to the list s := string(paramBuff) params = append(params, s) paramBuff = make([]byte, 0, 0) } } else { paramBuff = append(paramBuff, v) } } // Last parameter may not be terminated with ';' if len(paramBuff) > 0 { s := string(paramBuff) params = append(params, s) } return params, nil } func parseCmd(context ansiContext) (string, error) { return string(context.currentChar), nil } func getInt(params []string, dflt int) int { i := getInts(params, 1, dflt)[0] return i } func getInts(params []string, minCount int, dflt int) []int { ints := []int{} for _, v := range params { i, _ := strconv.Atoi(v) // Zero is mapped to the default value in VT100. if i == 0 { i = dflt } ints = append(ints, i) } if len(ints) < minCount { remaining := minCount - len(ints) for i := 0; i < remaining; i++ { ints = append(ints, dflt) } } return ints } func (ap *AnsiParser) modeDispatch(param string, set bool) error { switch param { case "?3": return ap.eventHandler.DECCOLM(set) case "?6": return ap.eventHandler.DECOM(set) case "?25": return ap.eventHandler.DECTCEM(set) } return nil } func (ap *AnsiParser) hDispatch(params []string) error { if len(params) == 1 { return ap.modeDispatch(params[0], true) } return nil } func (ap *AnsiParser) lDispatch(params []string) error { if len(params) == 1 { return ap.modeDispatch(params[0], false) } return nil } func getEraseParam(params []string) int { param := getInt(params, 0) if param < 0 || 3 < param { param = 0 } return param } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/parser_actions.go ================================================ package ansiterm func (ap *AnsiParser) collectParam() error { currChar := ap.context.currentChar ap.logf("collectParam %#x", currChar) ap.context.paramBuffer = append(ap.context.paramBuffer, currChar) return nil } func (ap *AnsiParser) collectInter() error { currChar := ap.context.currentChar ap.logf("collectInter %#x", currChar) ap.context.paramBuffer = append(ap.context.interBuffer, currChar) return nil } func (ap *AnsiParser) escDispatch() error { cmd, _ := parseCmd(*ap.context) intermeds := ap.context.interBuffer ap.logf("escDispatch currentChar: %#x", ap.context.currentChar) ap.logf("escDispatch: %v(%v)", cmd, intermeds) switch cmd { case "D": // IND return ap.eventHandler.IND() case "E": // NEL, equivalent to CRLF err := ap.eventHandler.Execute(ANSI_CARRIAGE_RETURN) if err == nil { err = ap.eventHandler.Execute(ANSI_LINE_FEED) } return err case "M": // RI return ap.eventHandler.RI() } return nil } func (ap *AnsiParser) csiDispatch() error { cmd, _ := parseCmd(*ap.context) params, _ := parseParams(ap.context.paramBuffer) ap.logf("Parsed params: %v with length: %d", params, len(params)) ap.logf("csiDispatch: %v(%v)", cmd, params) switch cmd { case "@": return ap.eventHandler.ICH(getInt(params, 1)) case "A": return ap.eventHandler.CUU(getInt(params, 1)) case "B": return ap.eventHandler.CUD(getInt(params, 1)) case "C": return ap.eventHandler.CUF(getInt(params, 1)) case "D": return ap.eventHandler.CUB(getInt(params, 1)) case "E": return ap.eventHandler.CNL(getInt(params, 1)) case "F": return ap.eventHandler.CPL(getInt(params, 1)) case "G": return ap.eventHandler.CHA(getInt(params, 1)) case "H": ints := getInts(params, 2, 1) x, y := ints[0], ints[1] return ap.eventHandler.CUP(x, y) case "J": param := getEraseParam(params) return ap.eventHandler.ED(param) case "K": param := getEraseParam(params) return ap.eventHandler.EL(param) case "L": return ap.eventHandler.IL(getInt(params, 1)) case "M": return ap.eventHandler.DL(getInt(params, 1)) case "P": return ap.eventHandler.DCH(getInt(params, 1)) case "S": return ap.eventHandler.SU(getInt(params, 1)) case "T": return ap.eventHandler.SD(getInt(params, 1)) case "c": return ap.eventHandler.DA(params) case "d": return ap.eventHandler.VPA(getInt(params, 1)) case "f": ints := getInts(params, 2, 1) x, y := ints[0], ints[1] return ap.eventHandler.HVP(x, y) case "h": return ap.hDispatch(params) case "l": return ap.lDispatch(params) case "m": return ap.eventHandler.SGR(getInts(params, 1, 0)) case "r": ints := getInts(params, 2, 1) top, bottom := ints[0], ints[1] return ap.eventHandler.DECSTBM(top, bottom) default: ap.logf("ERROR: Unsupported CSI command: '%s', with full context: %v", cmd, ap.context) return nil } } func (ap *AnsiParser) print() error { return ap.eventHandler.Print(ap.context.currentChar) } func (ap *AnsiParser) clear() error { ap.context = &ansiContext{} return nil } func (ap *AnsiParser) execute() error { return ap.eventHandler.Execute(ap.context.currentChar) } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/states.go ================================================ package ansiterm type stateID int type state interface { Enter() error Exit() error Handle(byte) (state, error) Name() string Transition(state) error } type baseState struct { name string parser *AnsiParser } func (base baseState) Enter() error { return nil } func (base baseState) Exit() error { return nil } func (base baseState) Handle(b byte) (s state, e error) { switch { case b == CSI_ENTRY: return base.parser.csiEntry, nil case b == DCS_ENTRY: return base.parser.dcsEntry, nil case b == ANSI_ESCAPE_PRIMARY: return base.parser.escape, nil case b == OSC_STRING: return base.parser.oscString, nil case sliceContains(toGroundBytes, b): return base.parser.ground, nil } return nil, nil } func (base baseState) Name() string { return base.name } func (base baseState) Transition(s state) error { if s == base.parser.ground { execBytes := []byte{0x18} execBytes = append(execBytes, 0x1A) execBytes = append(execBytes, getByteRange(0x80, 0x8F)...) execBytes = append(execBytes, getByteRange(0x91, 0x97)...) execBytes = append(execBytes, 0x99) execBytes = append(execBytes, 0x9A) if sliceContains(execBytes, base.parser.context.currentChar) { return base.parser.execute() } } return nil } type dcsEntryState struct { baseState } type errorState struct { baseState } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/utilities.go ================================================ package ansiterm import ( "strconv" ) func sliceContains(bytes []byte, b byte) bool { for _, v := range bytes { if v == b { return true } } return false } func convertBytesToInteger(bytes []byte) int { s := string(bytes) i, _ := strconv.Atoi(s) return i } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/winterm/ansi.go ================================================ // +build windows package winterm import ( "fmt" "os" "strconv" "strings" "syscall" "github.com/Azure/go-ansiterm" windows "golang.org/x/sys/windows" ) // Windows keyboard constants // See https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx. const ( VK_PRIOR = 0x21 // PAGE UP key VK_NEXT = 0x22 // PAGE DOWN key VK_END = 0x23 // END key VK_HOME = 0x24 // HOME key VK_LEFT = 0x25 // LEFT ARROW key VK_UP = 0x26 // UP ARROW key VK_RIGHT = 0x27 // RIGHT ARROW key VK_DOWN = 0x28 // DOWN ARROW key VK_SELECT = 0x29 // SELECT key VK_PRINT = 0x2A // PRINT key VK_EXECUTE = 0x2B // EXECUTE key VK_SNAPSHOT = 0x2C // PRINT SCREEN key VK_INSERT = 0x2D // INS key VK_DELETE = 0x2E // DEL key VK_HELP = 0x2F // HELP key VK_F1 = 0x70 // F1 key VK_F2 = 0x71 // F2 key VK_F3 = 0x72 // F3 key VK_F4 = 0x73 // F4 key VK_F5 = 0x74 // F5 key VK_F6 = 0x75 // F6 key VK_F7 = 0x76 // F7 key VK_F8 = 0x77 // F8 key VK_F9 = 0x78 // F9 key VK_F10 = 0x79 // F10 key VK_F11 = 0x7A // F11 key VK_F12 = 0x7B // F12 key RIGHT_ALT_PRESSED = 0x0001 LEFT_ALT_PRESSED = 0x0002 RIGHT_CTRL_PRESSED = 0x0004 LEFT_CTRL_PRESSED = 0x0008 SHIFT_PRESSED = 0x0010 NUMLOCK_ON = 0x0020 SCROLLLOCK_ON = 0x0040 CAPSLOCK_ON = 0x0080 ENHANCED_KEY = 0x0100 ) type ansiCommand struct { CommandBytes []byte Command string Parameters []string IsSpecial bool } func newAnsiCommand(command []byte) *ansiCommand { if isCharacterSelectionCmdChar(command[1]) { // Is Character Set Selection commands return &ansiCommand{ CommandBytes: command, Command: string(command), IsSpecial: true, } } // last char is command character lastCharIndex := len(command) - 1 ac := &ansiCommand{ CommandBytes: command, Command: string(command[lastCharIndex]), IsSpecial: false, } // more than a single escape if lastCharIndex != 0 { start := 1 // skip if double char escape sequence if command[0] == ansiterm.ANSI_ESCAPE_PRIMARY && command[1] == ansiterm.ANSI_ESCAPE_SECONDARY { start++ } // convert this to GetNextParam method ac.Parameters = strings.Split(string(command[start:lastCharIndex]), ansiterm.ANSI_PARAMETER_SEP) } return ac } func (ac *ansiCommand) paramAsSHORT(index int, defaultValue int16) int16 { if index < 0 || index >= len(ac.Parameters) { return defaultValue } param, err := strconv.ParseInt(ac.Parameters[index], 10, 16) if err != nil { return defaultValue } return int16(param) } func (ac *ansiCommand) String() string { return fmt.Sprintf("0x%v \"%v\" (\"%v\")", bytesToHex(ac.CommandBytes), ac.Command, strings.Join(ac.Parameters, "\",\"")) } // isAnsiCommandChar returns true if the passed byte falls within the range of ANSI commands. // See http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html. func isAnsiCommandChar(b byte) bool { switch { case ansiterm.ANSI_COMMAND_FIRST <= b && b <= ansiterm.ANSI_COMMAND_LAST && b != ansiterm.ANSI_ESCAPE_SECONDARY: return true case b == ansiterm.ANSI_CMD_G1 || b == ansiterm.ANSI_CMD_OSC || b == ansiterm.ANSI_CMD_DECPAM || b == ansiterm.ANSI_CMD_DECPNM: // non-CSI escape sequence terminator return true case b == ansiterm.ANSI_CMD_STR_TERM || b == ansiterm.ANSI_BEL: // String escape sequence terminator return true } return false } func isXtermOscSequence(command []byte, current byte) bool { return (len(command) >= 2 && command[0] == ansiterm.ANSI_ESCAPE_PRIMARY && command[1] == ansiterm.ANSI_CMD_OSC && current != ansiterm.ANSI_BEL) } func isCharacterSelectionCmdChar(b byte) bool { return (b == ansiterm.ANSI_CMD_G0 || b == ansiterm.ANSI_CMD_G1 || b == ansiterm.ANSI_CMD_G2 || b == ansiterm.ANSI_CMD_G3) } // bytesToHex converts a slice of bytes to a human-readable string. func bytesToHex(b []byte) string { hex := make([]string, len(b)) for i, ch := range b { hex[i] = fmt.Sprintf("%X", ch) } return strings.Join(hex, "") } // ensureInRange adjusts the passed value, if necessary, to ensure it is within // the passed min / max range. func ensureInRange(n int16, min int16, max int16) int16 { if n < min { return min } else if n > max { return max } else { return n } } func GetStdFile(nFile int) (*os.File, uintptr) { var file *os.File // syscall uses negative numbers // windows package uses very big uint32 // Keep these switches split so we don't have to convert ints too much. switch uint32(nFile) { case windows.STD_INPUT_HANDLE: file = os.Stdin case windows.STD_OUTPUT_HANDLE: file = os.Stdout case windows.STD_ERROR_HANDLE: file = os.Stderr default: switch nFile { case syscall.STD_INPUT_HANDLE: file = os.Stdin case syscall.STD_OUTPUT_HANDLE: file = os.Stdout case syscall.STD_ERROR_HANDLE: file = os.Stderr default: panic(fmt.Errorf("Invalid standard handle identifier: %v", nFile)) } } fd, err := syscall.GetStdHandle(nFile) if err != nil { panic(fmt.Errorf("Invalid standard handle identifier: %v -- %v", nFile, err)) } return file, uintptr(fd) } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/winterm/api.go ================================================ // +build windows package winterm import ( "fmt" "syscall" "unsafe" ) //=========================================================================================================== // IMPORTANT NOTE: // // The methods below make extensive use of the "unsafe" package to obtain the required pointers. // Beginning in Go 1.3, the garbage collector may release local variables (e.g., incoming arguments, stack // variables) the pointers reference *before* the API completes. // // As a result, in those cases, the code must hint that the variables remain in active by invoking the // dummy method "use" (see below). Newer versions of Go are planned to change the mechanism to no longer // require unsafe pointers. // // If you add or modify methods, ENSURE protection of local variables through the "use" builtin to inform // the garbage collector the variables remain in use if: // // -- The value is not a pointer (e.g., int32, struct) // -- The value is not referenced by the method after passing the pointer to Windows // // See http://golang.org/doc/go1.3. //=========================================================================================================== var ( kernel32DLL = syscall.NewLazyDLL("kernel32.dll") getConsoleCursorInfoProc = kernel32DLL.NewProc("GetConsoleCursorInfo") setConsoleCursorInfoProc = kernel32DLL.NewProc("SetConsoleCursorInfo") setConsoleCursorPositionProc = kernel32DLL.NewProc("SetConsoleCursorPosition") setConsoleModeProc = kernel32DLL.NewProc("SetConsoleMode") getConsoleScreenBufferInfoProc = kernel32DLL.NewProc("GetConsoleScreenBufferInfo") setConsoleScreenBufferSizeProc = kernel32DLL.NewProc("SetConsoleScreenBufferSize") scrollConsoleScreenBufferProc = kernel32DLL.NewProc("ScrollConsoleScreenBufferA") setConsoleTextAttributeProc = kernel32DLL.NewProc("SetConsoleTextAttribute") setConsoleWindowInfoProc = kernel32DLL.NewProc("SetConsoleWindowInfo") writeConsoleOutputProc = kernel32DLL.NewProc("WriteConsoleOutputW") readConsoleInputProc = kernel32DLL.NewProc("ReadConsoleInputW") waitForSingleObjectProc = kernel32DLL.NewProc("WaitForSingleObject") ) // Windows Console constants const ( // Console modes // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx. ENABLE_PROCESSED_INPUT = 0x0001 ENABLE_LINE_INPUT = 0x0002 ENABLE_ECHO_INPUT = 0x0004 ENABLE_WINDOW_INPUT = 0x0008 ENABLE_MOUSE_INPUT = 0x0010 ENABLE_INSERT_MODE = 0x0020 ENABLE_QUICK_EDIT_MODE = 0x0040 ENABLE_EXTENDED_FLAGS = 0x0080 ENABLE_AUTO_POSITION = 0x0100 ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200 ENABLE_PROCESSED_OUTPUT = 0x0001 ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002 ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 DISABLE_NEWLINE_AUTO_RETURN = 0x0008 ENABLE_LVB_GRID_WORLDWIDE = 0x0010 // Character attributes // Note: // -- The attributes are combined to produce various colors (e.g., Blue + Green will create Cyan). // Clearing all foreground or background colors results in black; setting all creates white. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes. FOREGROUND_BLUE uint16 = 0x0001 FOREGROUND_GREEN uint16 = 0x0002 FOREGROUND_RED uint16 = 0x0004 FOREGROUND_INTENSITY uint16 = 0x0008 FOREGROUND_MASK uint16 = 0x000F BACKGROUND_BLUE uint16 = 0x0010 BACKGROUND_GREEN uint16 = 0x0020 BACKGROUND_RED uint16 = 0x0040 BACKGROUND_INTENSITY uint16 = 0x0080 BACKGROUND_MASK uint16 = 0x00F0 COMMON_LVB_MASK uint16 = 0xFF00 COMMON_LVB_REVERSE_VIDEO uint16 = 0x4000 COMMON_LVB_UNDERSCORE uint16 = 0x8000 // Input event types // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683499(v=vs.85).aspx. KEY_EVENT = 0x0001 MOUSE_EVENT = 0x0002 WINDOW_BUFFER_SIZE_EVENT = 0x0004 MENU_EVENT = 0x0008 FOCUS_EVENT = 0x0010 // WaitForSingleObject return codes WAIT_ABANDONED = 0x00000080 WAIT_FAILED = 0xFFFFFFFF WAIT_SIGNALED = 0x0000000 WAIT_TIMEOUT = 0x00000102 // WaitForSingleObject wait duration WAIT_INFINITE = 0xFFFFFFFF WAIT_ONE_SECOND = 1000 WAIT_HALF_SECOND = 500 WAIT_QUARTER_SECOND = 250 ) // Windows API Console types // -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms682101(v=vs.85).aspx for Console specific types (e.g., COORD) // -- See https://msdn.microsoft.com/en-us/library/aa296569(v=vs.60).aspx for comments on alignment type ( CHAR_INFO struct { UnicodeChar uint16 Attributes uint16 } CONSOLE_CURSOR_INFO struct { Size uint32 Visible int32 } CONSOLE_SCREEN_BUFFER_INFO struct { Size COORD CursorPosition COORD Attributes uint16 Window SMALL_RECT MaximumWindowSize COORD } COORD struct { X int16 Y int16 } SMALL_RECT struct { Left int16 Top int16 Right int16 Bottom int16 } // INPUT_RECORD is a C/C++ union of which KEY_EVENT_RECORD is one case, it is also the largest // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683499(v=vs.85).aspx. INPUT_RECORD struct { EventType uint16 KeyEvent KEY_EVENT_RECORD } KEY_EVENT_RECORD struct { KeyDown int32 RepeatCount uint16 VirtualKeyCode uint16 VirtualScanCode uint16 UnicodeChar uint16 ControlKeyState uint32 } WINDOW_BUFFER_SIZE struct { Size COORD } ) // boolToBOOL converts a Go bool into a Windows int32. func boolToBOOL(f bool) int32 { if f { return int32(1) } else { return int32(0) } } // GetConsoleCursorInfo retrieves information about the size and visiblity of the console cursor. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683163(v=vs.85).aspx. func GetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INFO) error { r1, r2, err := getConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0) return checkError(r1, r2, err) } // SetConsoleCursorInfo sets the size and visiblity of the console cursor. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686019(v=vs.85).aspx. func SetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INFO) error { r1, r2, err := setConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0) return checkError(r1, r2, err) } // SetConsoleCursorPosition location of the console cursor. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686025(v=vs.85).aspx. func SetConsoleCursorPosition(handle uintptr, coord COORD) error { r1, r2, err := setConsoleCursorPositionProc.Call(handle, coordToPointer(coord)) use(coord) return checkError(r1, r2, err) } // GetConsoleMode gets the console mode for given file descriptor // See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx. func GetConsoleMode(handle uintptr) (mode uint32, err error) { err = syscall.GetConsoleMode(syscall.Handle(handle), &mode) return mode, err } // SetConsoleMode sets the console mode for given file descriptor // See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx. func SetConsoleMode(handle uintptr, mode uint32) error { r1, r2, err := setConsoleModeProc.Call(handle, uintptr(mode), 0) use(mode) return checkError(r1, r2, err) } // GetConsoleScreenBufferInfo retrieves information about the specified console screen buffer. // See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171(v=vs.85).aspx. func GetConsoleScreenBufferInfo(handle uintptr) (*CONSOLE_SCREEN_BUFFER_INFO, error) { info := CONSOLE_SCREEN_BUFFER_INFO{} err := checkError(getConsoleScreenBufferInfoProc.Call(handle, uintptr(unsafe.Pointer(&info)), 0)) if err != nil { return nil, err } return &info, nil } func ScrollConsoleScreenBuffer(handle uintptr, scrollRect SMALL_RECT, clipRect SMALL_RECT, destOrigin COORD, char CHAR_INFO) error { r1, r2, err := scrollConsoleScreenBufferProc.Call(handle, uintptr(unsafe.Pointer(&scrollRect)), uintptr(unsafe.Pointer(&clipRect)), coordToPointer(destOrigin), uintptr(unsafe.Pointer(&char))) use(scrollRect) use(clipRect) use(destOrigin) use(char) return checkError(r1, r2, err) } // SetConsoleScreenBufferSize sets the size of the console screen buffer. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686044(v=vs.85).aspx. func SetConsoleScreenBufferSize(handle uintptr, coord COORD) error { r1, r2, err := setConsoleScreenBufferSizeProc.Call(handle, coordToPointer(coord)) use(coord) return checkError(r1, r2, err) } // SetConsoleTextAttribute sets the attributes of characters written to the // console screen buffer by the WriteFile or WriteConsole function. // See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx. func SetConsoleTextAttribute(handle uintptr, attribute uint16) error { r1, r2, err := setConsoleTextAttributeProc.Call(handle, uintptr(attribute), 0) use(attribute) return checkError(r1, r2, err) } // SetConsoleWindowInfo sets the size and position of the console screen buffer's window. // Note that the size and location must be within and no larger than the backing console screen buffer. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686125(v=vs.85).aspx. func SetConsoleWindowInfo(handle uintptr, isAbsolute bool, rect SMALL_RECT) error { r1, r2, err := setConsoleWindowInfoProc.Call(handle, uintptr(boolToBOOL(isAbsolute)), uintptr(unsafe.Pointer(&rect))) use(isAbsolute) use(rect) return checkError(r1, r2, err) } // WriteConsoleOutput writes the CHAR_INFOs from the provided buffer to the active console buffer. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms687404(v=vs.85).aspx. func WriteConsoleOutput(handle uintptr, buffer []CHAR_INFO, bufferSize COORD, bufferCoord COORD, writeRegion *SMALL_RECT) error { r1, r2, err := writeConsoleOutputProc.Call(handle, uintptr(unsafe.Pointer(&buffer[0])), coordToPointer(bufferSize), coordToPointer(bufferCoord), uintptr(unsafe.Pointer(writeRegion))) use(buffer) use(bufferSize) use(bufferCoord) return checkError(r1, r2, err) } // ReadConsoleInput reads (and removes) data from the console input buffer. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx. func ReadConsoleInput(handle uintptr, buffer []INPUT_RECORD, count *uint32) error { r1, r2, err := readConsoleInputProc.Call(handle, uintptr(unsafe.Pointer(&buffer[0])), uintptr(len(buffer)), uintptr(unsafe.Pointer(count))) use(buffer) return checkError(r1, r2, err) } // WaitForSingleObject waits for the passed handle to be signaled. // It returns true if the handle was signaled; false otherwise. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx. func WaitForSingleObject(handle uintptr, msWait uint32) (bool, error) { r1, _, err := waitForSingleObjectProc.Call(handle, uintptr(uint32(msWait))) switch r1 { case WAIT_ABANDONED, WAIT_TIMEOUT: return false, nil case WAIT_SIGNALED: return true, nil } use(msWait) return false, err } // String helpers func (info CONSOLE_SCREEN_BUFFER_INFO) String() string { return fmt.Sprintf("Size(%v) Cursor(%v) Window(%v) Max(%v)", info.Size, info.CursorPosition, info.Window, info.MaximumWindowSize) } func (coord COORD) String() string { return fmt.Sprintf("%v,%v", coord.X, coord.Y) } func (rect SMALL_RECT) String() string { return fmt.Sprintf("(%v,%v),(%v,%v)", rect.Left, rect.Top, rect.Right, rect.Bottom) } // checkError evaluates the results of a Windows API call and returns the error if it failed. func checkError(r1, r2 uintptr, err error) error { // Windows APIs return non-zero to indicate success if r1 != 0 { return nil } // Return the error if provided, otherwise default to EINVAL if err != nil { return err } return syscall.EINVAL } // coordToPointer converts a COORD into a uintptr (by fooling the type system). func coordToPointer(c COORD) uintptr { // Note: This code assumes the two SHORTs are correctly laid out; the "cast" to uint32 is just to get a pointer to pass. return uintptr(*((*uint32)(unsafe.Pointer(&c)))) } // use is a no-op, but the compiler cannot see that it is. // Calling use(p) ensures that p is kept live until that point. func use(p interface{}) {} ================================================ FILE: vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go ================================================ // +build windows package winterm import "github.com/Azure/go-ansiterm" const ( FOREGROUND_COLOR_MASK = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE BACKGROUND_COLOR_MASK = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE ) // collectAnsiIntoWindowsAttributes modifies the passed Windows text mode flags to reflect the // request represented by the passed ANSI mode. func collectAnsiIntoWindowsAttributes(windowsMode uint16, inverted bool, baseMode uint16, ansiMode int16) (uint16, bool) { switch ansiMode { // Mode styles case ansiterm.ANSI_SGR_BOLD: windowsMode = windowsMode | FOREGROUND_INTENSITY case ansiterm.ANSI_SGR_DIM, ansiterm.ANSI_SGR_BOLD_DIM_OFF: windowsMode &^= FOREGROUND_INTENSITY case ansiterm.ANSI_SGR_UNDERLINE: windowsMode = windowsMode | COMMON_LVB_UNDERSCORE case ansiterm.ANSI_SGR_REVERSE: inverted = true case ansiterm.ANSI_SGR_REVERSE_OFF: inverted = false case ansiterm.ANSI_SGR_UNDERLINE_OFF: windowsMode &^= COMMON_LVB_UNDERSCORE // Foreground colors case ansiterm.ANSI_SGR_FOREGROUND_DEFAULT: windowsMode = (windowsMode &^ FOREGROUND_MASK) | (baseMode & FOREGROUND_MASK) case ansiterm.ANSI_SGR_FOREGROUND_BLACK: windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) case ansiterm.ANSI_SGR_FOREGROUND_RED: windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED case ansiterm.ANSI_SGR_FOREGROUND_GREEN: windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_GREEN case ansiterm.ANSI_SGR_FOREGROUND_YELLOW: windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_GREEN case ansiterm.ANSI_SGR_FOREGROUND_BLUE: windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_BLUE case ansiterm.ANSI_SGR_FOREGROUND_MAGENTA: windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_BLUE case ansiterm.ANSI_SGR_FOREGROUND_CYAN: windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_GREEN | FOREGROUND_BLUE case ansiterm.ANSI_SGR_FOREGROUND_WHITE: windowsMode = (windowsMode &^ FOREGROUND_COLOR_MASK) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE // Background colors case ansiterm.ANSI_SGR_BACKGROUND_DEFAULT: // Black with no intensity windowsMode = (windowsMode &^ BACKGROUND_MASK) | (baseMode & BACKGROUND_MASK) case ansiterm.ANSI_SGR_BACKGROUND_BLACK: windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) case ansiterm.ANSI_SGR_BACKGROUND_RED: windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED case ansiterm.ANSI_SGR_BACKGROUND_GREEN: windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_GREEN case ansiterm.ANSI_SGR_BACKGROUND_YELLOW: windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_GREEN case ansiterm.ANSI_SGR_BACKGROUND_BLUE: windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_BLUE case ansiterm.ANSI_SGR_BACKGROUND_MAGENTA: windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_BLUE case ansiterm.ANSI_SGR_BACKGROUND_CYAN: windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_GREEN | BACKGROUND_BLUE case ansiterm.ANSI_SGR_BACKGROUND_WHITE: windowsMode = (windowsMode &^ BACKGROUND_COLOR_MASK) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE } return windowsMode, inverted } // invertAttributes inverts the foreground and background colors of a Windows attributes value func invertAttributes(windowsMode uint16) uint16 { return (COMMON_LVB_MASK & windowsMode) | ((FOREGROUND_MASK & windowsMode) << 4) | ((BACKGROUND_MASK & windowsMode) >> 4) } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go ================================================ // +build windows package winterm const ( horizontal = iota vertical ) func (h *windowsAnsiEventHandler) getCursorWindow(info *CONSOLE_SCREEN_BUFFER_INFO) SMALL_RECT { if h.originMode { sr := h.effectiveSr(info.Window) return SMALL_RECT{ Top: sr.top, Bottom: sr.bottom, Left: 0, Right: info.Size.X - 1, } } else { return SMALL_RECT{ Top: info.Window.Top, Bottom: info.Window.Bottom, Left: 0, Right: info.Size.X - 1, } } } // setCursorPosition sets the cursor to the specified position, bounded to the screen size func (h *windowsAnsiEventHandler) setCursorPosition(position COORD, window SMALL_RECT) error { position.X = ensureInRange(position.X, window.Left, window.Right) position.Y = ensureInRange(position.Y, window.Top, window.Bottom) err := SetConsoleCursorPosition(h.fd, position) if err != nil { return err } h.logf("Cursor position set: (%d, %d)", position.X, position.Y) return err } func (h *windowsAnsiEventHandler) moveCursorVertical(param int) error { return h.moveCursor(vertical, param) } func (h *windowsAnsiEventHandler) moveCursorHorizontal(param int) error { return h.moveCursor(horizontal, param) } func (h *windowsAnsiEventHandler) moveCursor(moveMode int, param int) error { info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } position := info.CursorPosition switch moveMode { case horizontal: position.X += int16(param) case vertical: position.Y += int16(param) } if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil { return err } return nil } func (h *windowsAnsiEventHandler) moveCursorLine(param int) error { info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } position := info.CursorPosition position.X = 0 position.Y += int16(param) if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil { return err } return nil } func (h *windowsAnsiEventHandler) moveCursorColumn(param int) error { info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } position := info.CursorPosition position.X = int16(param) - 1 if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil { return err } return nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go ================================================ // +build windows package winterm import "github.com/Azure/go-ansiterm" func (h *windowsAnsiEventHandler) clearRange(attributes uint16, fromCoord COORD, toCoord COORD) error { // Ignore an invalid (negative area) request if toCoord.Y < fromCoord.Y { return nil } var err error var coordStart = COORD{} var coordEnd = COORD{} xCurrent, yCurrent := fromCoord.X, fromCoord.Y xEnd, yEnd := toCoord.X, toCoord.Y // Clear any partial initial line if xCurrent > 0 { coordStart.X, coordStart.Y = xCurrent, yCurrent coordEnd.X, coordEnd.Y = xEnd, yCurrent err = h.clearRect(attributes, coordStart, coordEnd) if err != nil { return err } xCurrent = 0 yCurrent += 1 } // Clear intervening rectangular section if yCurrent < yEnd { coordStart.X, coordStart.Y = xCurrent, yCurrent coordEnd.X, coordEnd.Y = xEnd, yEnd-1 err = h.clearRect(attributes, coordStart, coordEnd) if err != nil { return err } xCurrent = 0 yCurrent = yEnd } // Clear remaining partial ending line coordStart.X, coordStart.Y = xCurrent, yCurrent coordEnd.X, coordEnd.Y = xEnd, yEnd err = h.clearRect(attributes, coordStart, coordEnd) if err != nil { return err } return nil } func (h *windowsAnsiEventHandler) clearRect(attributes uint16, fromCoord COORD, toCoord COORD) error { region := SMALL_RECT{Top: fromCoord.Y, Left: fromCoord.X, Bottom: toCoord.Y, Right: toCoord.X} width := toCoord.X - fromCoord.X + 1 height := toCoord.Y - fromCoord.Y + 1 size := uint32(width) * uint32(height) if size <= 0 { return nil } buffer := make([]CHAR_INFO, size) char := CHAR_INFO{ansiterm.FILL_CHARACTER, attributes} for i := 0; i < int(size); i++ { buffer[i] = char } err := WriteConsoleOutput(h.fd, buffer, COORD{X: width, Y: height}, COORD{X: 0, Y: 0}, ®ion) if err != nil { return err } return nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go ================================================ // +build windows package winterm // effectiveSr gets the current effective scroll region in buffer coordinates func (h *windowsAnsiEventHandler) effectiveSr(window SMALL_RECT) scrollRegion { top := addInRange(window.Top, h.sr.top, window.Top, window.Bottom) bottom := addInRange(window.Top, h.sr.bottom, window.Top, window.Bottom) if top >= bottom { top = window.Top bottom = window.Bottom } return scrollRegion{top: top, bottom: bottom} } func (h *windowsAnsiEventHandler) scrollUp(param int) error { info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } sr := h.effectiveSr(info.Window) return h.scroll(param, sr, info) } func (h *windowsAnsiEventHandler) scrollDown(param int) error { return h.scrollUp(-param) } func (h *windowsAnsiEventHandler) deleteLines(param int) error { info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } start := info.CursorPosition.Y sr := h.effectiveSr(info.Window) // Lines cannot be inserted or deleted outside the scrolling region. if start >= sr.top && start <= sr.bottom { sr.top = start return h.scroll(param, sr, info) } else { return nil } } func (h *windowsAnsiEventHandler) insertLines(param int) error { return h.deleteLines(-param) } // scroll scrolls the provided scroll region by param lines. The scroll region is in buffer coordinates. func (h *windowsAnsiEventHandler) scroll(param int, sr scrollRegion, info *CONSOLE_SCREEN_BUFFER_INFO) error { h.logf("scroll: scrollTop: %d, scrollBottom: %d", sr.top, sr.bottom) h.logf("scroll: windowTop: %d, windowBottom: %d", info.Window.Top, info.Window.Bottom) // Copy from and clip to the scroll region (full buffer width) scrollRect := SMALL_RECT{ Top: sr.top, Bottom: sr.bottom, Left: 0, Right: info.Size.X - 1, } // Origin to which area should be copied destOrigin := COORD{ X: 0, Y: sr.top - int16(param), } char := CHAR_INFO{ UnicodeChar: ' ', Attributes: h.attributes, } if err := ScrollConsoleScreenBuffer(h.fd, scrollRect, scrollRect, destOrigin, char); err != nil { return err } return nil } func (h *windowsAnsiEventHandler) deleteCharacters(param int) error { info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } return h.scrollLine(param, info.CursorPosition, info) } func (h *windowsAnsiEventHandler) insertCharacters(param int) error { return h.deleteCharacters(-param) } // scrollLine scrolls a line horizontally starting at the provided position by a number of columns. func (h *windowsAnsiEventHandler) scrollLine(columns int, position COORD, info *CONSOLE_SCREEN_BUFFER_INFO) error { // Copy from and clip to the scroll region (full buffer width) scrollRect := SMALL_RECT{ Top: position.Y, Bottom: position.Y, Left: position.X, Right: info.Size.X - 1, } // Origin to which area should be copied destOrigin := COORD{ X: position.X - int16(columns), Y: position.Y, } char := CHAR_INFO{ UnicodeChar: ' ', Attributes: h.attributes, } if err := ScrollConsoleScreenBuffer(h.fd, scrollRect, scrollRect, destOrigin, char); err != nil { return err } return nil } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/winterm/utilities.go ================================================ // +build windows package winterm // AddInRange increments a value by the passed quantity while ensuring the values // always remain within the supplied min / max range. func addInRange(n int16, increment int16, min int16, max int16) int16 { return ensureInRange(n+increment, min, max) } ================================================ FILE: vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go ================================================ // +build windows package winterm import ( "bytes" "log" "os" "strconv" "github.com/Azure/go-ansiterm" ) type windowsAnsiEventHandler struct { fd uintptr file *os.File infoReset *CONSOLE_SCREEN_BUFFER_INFO sr scrollRegion buffer bytes.Buffer attributes uint16 inverted bool wrapNext bool drewMarginByte bool originMode bool marginByte byte curInfo *CONSOLE_SCREEN_BUFFER_INFO curPos COORD logf func(string, ...interface{}) } type Option func(*windowsAnsiEventHandler) func WithLogf(f func(string, ...interface{})) Option { return func(w *windowsAnsiEventHandler) { w.logf = f } } func CreateWinEventHandler(fd uintptr, file *os.File, opts ...Option) ansiterm.AnsiEventHandler { infoReset, err := GetConsoleScreenBufferInfo(fd) if err != nil { return nil } h := &windowsAnsiEventHandler{ fd: fd, file: file, infoReset: infoReset, attributes: infoReset.Attributes, } for _, o := range opts { o(h) } if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { logFile, _ := os.Create("winEventHandler.log") logger := log.New(logFile, "", log.LstdFlags) if h.logf != nil { l := h.logf h.logf = func(s string, v ...interface{}) { l(s, v...) logger.Printf(s, v...) } } else { h.logf = logger.Printf } } if h.logf == nil { h.logf = func(string, ...interface{}) {} } return h } type scrollRegion struct { top int16 bottom int16 } // simulateLF simulates a LF or CR+LF by scrolling if necessary to handle the // current cursor position and scroll region settings, in which case it returns // true. If no special handling is necessary, then it does nothing and returns // false. // // In the false case, the caller should ensure that a carriage return // and line feed are inserted or that the text is otherwise wrapped. func (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, error) { if h.wrapNext { if err := h.Flush(); err != nil { return false, err } h.clearWrap() } pos, info, err := h.getCurrentInfo() if err != nil { return false, err } sr := h.effectiveSr(info.Window) if pos.Y == sr.bottom { // Scrolling is necessary. Let Windows automatically scroll if the scrolling region // is the full window. if sr.top == info.Window.Top && sr.bottom == info.Window.Bottom { if includeCR { pos.X = 0 h.updatePos(pos) } return false, nil } // A custom scroll region is active. Scroll the window manually to simulate // the LF. if err := h.Flush(); err != nil { return false, err } h.logf("Simulating LF inside scroll region") if err := h.scrollUp(1); err != nil { return false, err } if includeCR { pos.X = 0 if err := SetConsoleCursorPosition(h.fd, pos); err != nil { return false, err } } return true, nil } else if pos.Y < info.Window.Bottom { // Let Windows handle the LF. pos.Y++ if includeCR { pos.X = 0 } h.updatePos(pos) return false, nil } else { // The cursor is at the bottom of the screen but outside the scroll // region. Skip the LF. h.logf("Simulating LF outside scroll region") if includeCR { if err := h.Flush(); err != nil { return false, err } pos.X = 0 if err := SetConsoleCursorPosition(h.fd, pos); err != nil { return false, err } } return true, nil } } // executeLF executes a LF without a CR. func (h *windowsAnsiEventHandler) executeLF() error { handled, err := h.simulateLF(false) if err != nil { return err } if !handled { // Windows LF will reset the cursor column position. Write the LF // and restore the cursor position. pos, _, err := h.getCurrentInfo() if err != nil { return err } h.buffer.WriteByte(ansiterm.ANSI_LINE_FEED) if pos.X != 0 { if err := h.Flush(); err != nil { return err } h.logf("Resetting cursor position for LF without CR") if err := SetConsoleCursorPosition(h.fd, pos); err != nil { return err } } } return nil } func (h *windowsAnsiEventHandler) Print(b byte) error { if h.wrapNext { h.buffer.WriteByte(h.marginByte) h.clearWrap() if _, err := h.simulateLF(true); err != nil { return err } } pos, info, err := h.getCurrentInfo() if err != nil { return err } if pos.X == info.Size.X-1 { h.wrapNext = true h.marginByte = b } else { pos.X++ h.updatePos(pos) h.buffer.WriteByte(b) } return nil } func (h *windowsAnsiEventHandler) Execute(b byte) error { switch b { case ansiterm.ANSI_TAB: h.logf("Execute(TAB)") // Move to the next tab stop, but preserve auto-wrap if already set. if !h.wrapNext { pos, info, err := h.getCurrentInfo() if err != nil { return err } pos.X = (pos.X + 8) - pos.X%8 if pos.X >= info.Size.X { pos.X = info.Size.X - 1 } if err := h.Flush(); err != nil { return err } if err := SetConsoleCursorPosition(h.fd, pos); err != nil { return err } } return nil case ansiterm.ANSI_BEL: h.buffer.WriteByte(ansiterm.ANSI_BEL) return nil case ansiterm.ANSI_BACKSPACE: if h.wrapNext { if err := h.Flush(); err != nil { return err } h.clearWrap() } pos, _, err := h.getCurrentInfo() if err != nil { return err } if pos.X > 0 { pos.X-- h.updatePos(pos) h.buffer.WriteByte(ansiterm.ANSI_BACKSPACE) } return nil case ansiterm.ANSI_VERTICAL_TAB, ansiterm.ANSI_FORM_FEED: // Treat as true LF. return h.executeLF() case ansiterm.ANSI_LINE_FEED: // Simulate a CR and LF for now since there is no way in go-ansiterm // to tell if the LF should include CR (and more things break when it's // missing than when it's incorrectly added). handled, err := h.simulateLF(true) if handled || err != nil { return err } return h.buffer.WriteByte(ansiterm.ANSI_LINE_FEED) case ansiterm.ANSI_CARRIAGE_RETURN: if h.wrapNext { if err := h.Flush(); err != nil { return err } h.clearWrap() } pos, _, err := h.getCurrentInfo() if err != nil { return err } if pos.X != 0 { pos.X = 0 h.updatePos(pos) h.buffer.WriteByte(ansiterm.ANSI_CARRIAGE_RETURN) } return nil default: return nil } } func (h *windowsAnsiEventHandler) CUU(param int) error { if err := h.Flush(); err != nil { return err } h.logf("CUU: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorVertical(-param) } func (h *windowsAnsiEventHandler) CUD(param int) error { if err := h.Flush(); err != nil { return err } h.logf("CUD: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorVertical(param) } func (h *windowsAnsiEventHandler) CUF(param int) error { if err := h.Flush(); err != nil { return err } h.logf("CUF: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorHorizontal(param) } func (h *windowsAnsiEventHandler) CUB(param int) error { if err := h.Flush(); err != nil { return err } h.logf("CUB: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorHorizontal(-param) } func (h *windowsAnsiEventHandler) CNL(param int) error { if err := h.Flush(); err != nil { return err } h.logf("CNL: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorLine(param) } func (h *windowsAnsiEventHandler) CPL(param int) error { if err := h.Flush(); err != nil { return err } h.logf("CPL: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorLine(-param) } func (h *windowsAnsiEventHandler) CHA(param int) error { if err := h.Flush(); err != nil { return err } h.logf("CHA: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorColumn(param) } func (h *windowsAnsiEventHandler) VPA(param int) error { if err := h.Flush(); err != nil { return err } h.logf("VPA: [[%d]]", param) h.clearWrap() info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } window := h.getCursorWindow(info) position := info.CursorPosition position.Y = window.Top + int16(param) - 1 return h.setCursorPosition(position, window) } func (h *windowsAnsiEventHandler) CUP(row int, col int) error { if err := h.Flush(); err != nil { return err } h.logf("CUP: [[%d %d]]", row, col) h.clearWrap() info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } window := h.getCursorWindow(info) position := COORD{window.Left + int16(col) - 1, window.Top + int16(row) - 1} return h.setCursorPosition(position, window) } func (h *windowsAnsiEventHandler) HVP(row int, col int) error { if err := h.Flush(); err != nil { return err } h.logf("HVP: [[%d %d]]", row, col) h.clearWrap() return h.CUP(row, col) } func (h *windowsAnsiEventHandler) DECTCEM(visible bool) error { if err := h.Flush(); err != nil { return err } h.logf("DECTCEM: [%v]", []string{strconv.FormatBool(visible)}) h.clearWrap() return nil } func (h *windowsAnsiEventHandler) DECOM(enable bool) error { if err := h.Flush(); err != nil { return err } h.logf("DECOM: [%v]", []string{strconv.FormatBool(enable)}) h.clearWrap() h.originMode = enable return h.CUP(1, 1) } func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error { if err := h.Flush(); err != nil { return err } h.logf("DECCOLM: [%v]", []string{strconv.FormatBool(use132)}) h.clearWrap() if err := h.ED(2); err != nil { return err } info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } targetWidth := int16(80) if use132 { targetWidth = 132 } if info.Size.X < targetWidth { if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil { h.logf("set buffer failed: %v", err) return err } } window := info.Window window.Left = 0 window.Right = targetWidth - 1 if err := SetConsoleWindowInfo(h.fd, true, window); err != nil { h.logf("set window failed: %v", err) return err } if info.Size.X > targetWidth { if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil { h.logf("set buffer failed: %v", err) return err } } return SetConsoleCursorPosition(h.fd, COORD{0, 0}) } func (h *windowsAnsiEventHandler) ED(param int) error { if err := h.Flush(); err != nil { return err } h.logf("ED: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() // [J -- Erases from the cursor to the end of the screen, including the cursor position. // [1J -- Erases from the beginning of the screen to the cursor, including the cursor position. // [2J -- Erases the complete display. The cursor does not move. // Notes: // -- Clearing the entire buffer, versus just the Window, works best for Windows Consoles info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } var start COORD var end COORD switch param { case 0: start = info.CursorPosition end = COORD{info.Size.X - 1, info.Size.Y - 1} case 1: start = COORD{0, 0} end = info.CursorPosition case 2: start = COORD{0, 0} end = COORD{info.Size.X - 1, info.Size.Y - 1} } err = h.clearRange(h.attributes, start, end) if err != nil { return err } // If the whole buffer was cleared, move the window to the top while preserving // the window-relative cursor position. if param == 2 { pos := info.CursorPosition window := info.Window pos.Y -= window.Top window.Bottom -= window.Top window.Top = 0 if err := SetConsoleCursorPosition(h.fd, pos); err != nil { return err } if err := SetConsoleWindowInfo(h.fd, true, window); err != nil { return err } } return nil } func (h *windowsAnsiEventHandler) EL(param int) error { if err := h.Flush(); err != nil { return err } h.logf("EL: [%v]", strconv.Itoa(param)) h.clearWrap() // [K -- Erases from the cursor to the end of the line, including the cursor position. // [1K -- Erases from the beginning of the line to the cursor, including the cursor position. // [2K -- Erases the complete line. info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } var start COORD var end COORD switch param { case 0: start = info.CursorPosition end = COORD{info.Size.X, info.CursorPosition.Y} case 1: start = COORD{0, info.CursorPosition.Y} end = info.CursorPosition case 2: start = COORD{0, info.CursorPosition.Y} end = COORD{info.Size.X, info.CursorPosition.Y} } err = h.clearRange(h.attributes, start, end) if err != nil { return err } return nil } func (h *windowsAnsiEventHandler) IL(param int) error { if err := h.Flush(); err != nil { return err } h.logf("IL: [%v]", strconv.Itoa(param)) h.clearWrap() return h.insertLines(param) } func (h *windowsAnsiEventHandler) DL(param int) error { if err := h.Flush(); err != nil { return err } h.logf("DL: [%v]", strconv.Itoa(param)) h.clearWrap() return h.deleteLines(param) } func (h *windowsAnsiEventHandler) ICH(param int) error { if err := h.Flush(); err != nil { return err } h.logf("ICH: [%v]", strconv.Itoa(param)) h.clearWrap() return h.insertCharacters(param) } func (h *windowsAnsiEventHandler) DCH(param int) error { if err := h.Flush(); err != nil { return err } h.logf("DCH: [%v]", strconv.Itoa(param)) h.clearWrap() return h.deleteCharacters(param) } func (h *windowsAnsiEventHandler) SGR(params []int) error { if err := h.Flush(); err != nil { return err } strings := []string{} for _, v := range params { strings = append(strings, strconv.Itoa(v)) } h.logf("SGR: [%v]", strings) if len(params) <= 0 { h.attributes = h.infoReset.Attributes h.inverted = false } else { for _, attr := range params { if attr == ansiterm.ANSI_SGR_RESET { h.attributes = h.infoReset.Attributes h.inverted = false continue } h.attributes, h.inverted = collectAnsiIntoWindowsAttributes(h.attributes, h.inverted, h.infoReset.Attributes, int16(attr)) } } attributes := h.attributes if h.inverted { attributes = invertAttributes(attributes) } err := SetConsoleTextAttribute(h.fd, attributes) if err != nil { return err } return nil } func (h *windowsAnsiEventHandler) SU(param int) error { if err := h.Flush(); err != nil { return err } h.logf("SU: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.scrollUp(param) } func (h *windowsAnsiEventHandler) SD(param int) error { if err := h.Flush(); err != nil { return err } h.logf("SD: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.scrollDown(param) } func (h *windowsAnsiEventHandler) DA(params []string) error { h.logf("DA: [%v]", params) // DA cannot be implemented because it must send data on the VT100 input stream, // which is not available to go-ansiterm. return nil } func (h *windowsAnsiEventHandler) DECSTBM(top int, bottom int) error { if err := h.Flush(); err != nil { return err } h.logf("DECSTBM: [%d, %d]", top, bottom) // Windows is 0 indexed, Linux is 1 indexed h.sr.top = int16(top - 1) h.sr.bottom = int16(bottom - 1) // This command also moves the cursor to the origin. h.clearWrap() return h.CUP(1, 1) } func (h *windowsAnsiEventHandler) RI() error { if err := h.Flush(); err != nil { return err } h.logf("RI: []") h.clearWrap() info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } sr := h.effectiveSr(info.Window) if info.CursorPosition.Y == sr.top { return h.scrollDown(1) } return h.moveCursorVertical(-1) } func (h *windowsAnsiEventHandler) IND() error { h.logf("IND: []") return h.executeLF() } func (h *windowsAnsiEventHandler) Flush() error { h.curInfo = nil if h.buffer.Len() > 0 { h.logf("Flush: [%s]", h.buffer.Bytes()) if _, err := h.buffer.WriteTo(h.file); err != nil { return err } } if h.wrapNext && !h.drewMarginByte { h.logf("Flush: drawing margin byte '%c'", h.marginByte) info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return err } charInfo := []CHAR_INFO{{UnicodeChar: uint16(h.marginByte), Attributes: info.Attributes}} size := COORD{1, 1} position := COORD{0, 0} region := SMALL_RECT{Left: info.CursorPosition.X, Top: info.CursorPosition.Y, Right: info.CursorPosition.X, Bottom: info.CursorPosition.Y} if err := WriteConsoleOutput(h.fd, charInfo, size, position, ®ion); err != nil { return err } h.drewMarginByte = true } return nil } // cacheConsoleInfo ensures that the current console screen information has been queried // since the last call to Flush(). It must be called before accessing h.curInfo or h.curPos. func (h *windowsAnsiEventHandler) getCurrentInfo() (COORD, *CONSOLE_SCREEN_BUFFER_INFO, error) { if h.curInfo == nil { info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { return COORD{}, nil, err } h.curInfo = info h.curPos = info.CursorPosition } return h.curPos, h.curInfo, nil } func (h *windowsAnsiEventHandler) updatePos(pos COORD) { if h.curInfo == nil { panic("failed to call getCurrentInfo before calling updatePos") } h.curPos = pos } // clearWrap clears the state where the cursor is in the margin // waiting for the next character before wrapping the line. This must // be done before most operations that act on the cursor. func (h *windowsAnsiEventHandler) clearWrap() { h.wrapNext = false h.drewMarginByte = false } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/README.md ================================================ # GCP Resource detection library This is a library intended to be used by Upstream OpenTelemetry resource detectors. It exists within this repository to allow for integration testing of the detection functions in real GCP environments. ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/app_engine.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcp import "context" const ( // See https://cloud.google.com/appengine/docs/flexible/python/migrating#modules // for the environment variables available in GAE environments. gaeServiceEnv = "GAE_SERVICE" gaeVersionEnv = "GAE_VERSION" gaeInstanceEnv = "GAE_INSTANCE" gaeEnv = "GAE_ENV" gaeStandard = "standard" ) func (d *Detector) onAppEngineStandard() bool { // See https://cloud.google.com/appengine/docs/standard/go111/runtime#environment_variables. env, found := d.os.LookupEnv(gaeEnv) return found && env == gaeStandard } func (d *Detector) onAppEngine() bool { _, found := d.os.LookupEnv(gaeServiceEnv) return found } // AppEngineServiceName returns the service name of the app engine service. func (d *Detector) AppEngineServiceName() (string, error) { if name, found := d.os.LookupEnv(gaeServiceEnv); found { return name, nil } return "", errEnvVarNotFound } // AppEngineServiceVersion returns the service version of the app engine service. func (d *Detector) AppEngineServiceVersion() (string, error) { if version, found := d.os.LookupEnv(gaeVersionEnv); found { return version, nil } return "", errEnvVarNotFound } // AppEngineServiceInstance returns the service instance of the app engine service. func (d *Detector) AppEngineServiceInstance() (string, error) { if instanceID, found := d.os.LookupEnv(gaeInstanceEnv); found { return instanceID, nil } return "", errEnvVarNotFound } // AppEngineFlexAvailabilityZoneAndRegion returns the zone and region in which this program is running. func (d *Detector) AppEngineFlexAvailabilityZoneAndRegion() (string, string, error) { // The GCE metadata server is available on App Engine Flex. return d.GCEAvailabilityZoneAndRegion() } // AppEngineStandardAvailabilityZone returns the zone the app engine service is running in. func (d *Detector) AppEngineStandardAvailabilityZone() (string, error) { return d.metadata.ZoneWithContext(context.TODO()) } // AppEngineStandardCloudRegion returns the region the app engine service is running in. func (d *Detector) AppEngineStandardCloudRegion() (string, error) { return d.FaaSCloudRegion() } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/bms.go ================================================ // Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcp const ( bmsProjectIDEnv = "BMS_PROJECT_ID" bmsRegionEnv = "BMS_REGION" bmsInstanceIDEnv = "BMS_INSTANCE_ID" ) // onBareMetalSolution checks if the code is running on a Google Cloud Bare Metal Solution (BMS) by verifying // the presence and non-empty values of BMS_PROJECT_ID, BMS_REGION, and BMS_INSTANCE_ID environment variables. // For more information on Google Cloud Bare Metal Solution, see: https://cloud.google.com/bare-metal/docs func (d *Detector) onBareMetalSolution() bool { projectID, projectIDExists := d.os.LookupEnv(bmsProjectIDEnv) region, regionExists := d.os.LookupEnv(bmsRegionEnv) instanceID, instanceIDExists := d.os.LookupEnv(bmsInstanceIDEnv) return projectIDExists && regionExists && instanceIDExists && projectID != "" && region != "" && instanceID != "" } // BareMetalSolutionInstanceID returns the instance ID from the BMS_INSTANCE_ID environment variable. func (d *Detector) BareMetalSolutionInstanceID() (string, error) { if instanceID, found := d.os.LookupEnv(bmsInstanceIDEnv); found { return instanceID, nil } return "", errEnvVarNotFound } // BareMetalSolutionCloudRegion returns the region from the BMS_REGION environment variable. func (d *Detector) BareMetalSolutionCloudRegion() (string, error) { if region, found := d.os.LookupEnv(bmsRegionEnv); found { return region, nil } return "", errEnvVarNotFound } // BareMetalSolutionProjectID returns the project ID from the BMS_PROJECT_ID environment variable. func (d *Detector) BareMetalSolutionProjectID() (string, error) { if project, found := d.os.LookupEnv(bmsProjectIDEnv); found { return project, nil } return "", errEnvVarNotFound } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/detector.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcp import ( "context" "errors" "os" "strings" "cloud.google.com/go/compute/metadata" ) var errEnvVarNotFound = errors.New("environment variable not found") // NewDetector returns a *Detector which can get detect the platform, // and fetch attributes of the platform on which it is running. func NewDetector() *Detector { return &Detector{metadata: metadata.NewClient(nil), os: realOSProvider{}} } type Platform int64 const ( UnknownPlatform Platform = iota GKE GCE CloudRun CloudRunJob CloudFunctions AppEngineStandard AppEngineFlex BareMetalSolution ) // CloudPlatform returns the platform on which this program is running. func (d *Detector) CloudPlatform() Platform { switch { case d.onBareMetalSolution(): return BareMetalSolution case d.onGKE(): return GKE case d.onCloudFunctions(): return CloudFunctions case d.onCloudRun(): return CloudRun case d.onCloudRunJob(): return CloudRunJob case d.onAppEngineStandard(): return AppEngineStandard case d.onAppEngine(): return AppEngineFlex case d.onGCE(): return GCE } return UnknownPlatform } // ProjectID returns the ID of the project in which this program is running. func (d *Detector) ProjectID() (string, error) { // N.B. d.metadata.ProjectIDWithContext(context.TODO()) is cached globally, so if we use it here it's untestable. s, err := d.metadata.GetWithContext(context.TODO(), "project/project-id") return strings.TrimSpace(s), err } // instanceID returns the ID of the project in which this program is running. func (d *Detector) instanceID() (string, error) { // N.B. d.metadata.InstanceIDWithContext(context.TODO()) is cached globally, so if we use it here it's untestable. s, err := d.metadata.GetWithContext(context.TODO(), "instance/id") return strings.TrimSpace(s), err } // Detector collects resource information for all GCP platforms. type Detector struct { metadata *metadata.Client os osProvider } // osProvider contains the subset of the os package functions used by. type osProvider interface { LookupEnv(string) (string, bool) } // realOSProvider uses the os package to lookup env vars. type realOSProvider struct{} func (realOSProvider) LookupEnv(env string) (string, bool) { return os.LookupEnv(env) } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/faas.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcp import ( "context" "strings" ) const ( // Cloud Functions env vars: // https://cloud.google.com/functions/docs/configuring/env-var#newer_runtimes // // Cloud Run env vars: // https://cloud.google.com/run/docs/container-contract#services-env-vars // // Cloud Run jobs env vars: // https://cloud.google.com/run/docs/container-contract#jobs-env-vars cloudFunctionsTargetEnv = "FUNCTION_TARGET" cloudRunConfigurationEnv = "K_CONFIGURATION" cloudRunJobsEnv = "CLOUD_RUN_JOB" faasServiceEnv = "K_SERVICE" faasRevisionEnv = "K_REVISION" cloudRunJobExecutionEnv = "CLOUD_RUN_EXECUTION" cloudRunJobTaskIndexEnv = "CLOUD_RUN_TASK_INDEX" regionMetadataAttr = "instance/region" ) func (d *Detector) onCloudFunctions() bool { _, found := d.os.LookupEnv(cloudFunctionsTargetEnv) return found } func (d *Detector) onCloudRun() bool { _, found := d.os.LookupEnv(cloudRunConfigurationEnv) return found } func (d *Detector) onCloudRunJob() bool { _, found := d.os.LookupEnv(cloudRunJobsEnv) return found } // FaaSName returns the name of the Cloud Run, Cloud Run jobs or Cloud Functions service. func (d *Detector) FaaSName() (string, error) { if name, found := d.os.LookupEnv(faasServiceEnv); found { return name, nil } if name, found := d.os.LookupEnv(cloudRunJobsEnv); found { return name, nil } return "", errEnvVarNotFound } // FaaSVersion returns the revision of the Cloud Run or Cloud Functions service. func (d *Detector) FaaSVersion() (string, error) { if version, found := d.os.LookupEnv(faasRevisionEnv); found { return version, nil } return "", errEnvVarNotFound } // CloudRunJobExecution returns the execution id of the Cloud Run jobs. func (d *Detector) CloudRunJobExecution() (string, error) { if eid, found := d.os.LookupEnv(cloudRunJobExecutionEnv); found { return eid, nil } return "", errEnvVarNotFound } // CloudRunJobTaskIndex returns the task index for the execution of the Cloud Run jobs. func (d *Detector) CloudRunJobTaskIndex() (string, error) { if tidx, found := d.os.LookupEnv(cloudRunJobTaskIndexEnv); found { return tidx, nil } return "", errEnvVarNotFound } // FaaSID returns the instance id of the Cloud Run or Cloud Function. func (d *Detector) FaaSID() (string, error) { return d.instanceID() } // FaaSCloudRegion detects region from the metadata server. // It is in the format /projects//regions/. // // https://cloud.google.com/run/docs/reference/container-contract#metadata-server func (d *Detector) FaaSCloudRegion() (string, error) { region, err := d.metadata.GetWithContext(context.TODO(), regionMetadataAttr) if err != nil { return "", err } return region[strings.LastIndex(region, "/")+1:], nil } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/gce.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcp import ( "context" "fmt" "regexp" "strings" "cloud.google.com/go/compute/metadata" ) // See the available GCE instance metadata: // https://cloud.google.com/compute/docs/metadata/predefined-metadata-keys#instance-metadata const machineTypeMetadataAttr = "instance/machine-type" // https://cloud.google.com/compute/docs/instance-groups/getting-info-about-migs#checking_if_a_vm_instance_is_part_of_a_mig const createdByInstanceAttr = "created-by" func (d *Detector) onGCE() bool { _, err := d.metadata.GetWithContext(context.TODO(), machineTypeMetadataAttr) return err == nil } // GCEHostType returns the machine type of the instance on which this program is running. func (d *Detector) GCEHostType() (string, error) { return d.metadata.GetWithContext(context.TODO(), machineTypeMetadataAttr) } // GCEHostID returns the instance ID of the instance on which this program is running. func (d *Detector) GCEHostID() (string, error) { return d.instanceID() } // GCEHostName returns the instance name of the instance on which this program is running. // Recommended to use GCEInstanceName() or GCEInstanceHostname() to more accurately reflect which // value is returned. func (d *Detector) GCEHostName() (string, error) { return d.metadata.InstanceNameWithContext(context.TODO()) } // GCEInstanceName returns the instance name of the instance on which this program is running. // This is the value visible in the Cloud Console UI, and the prefix for the default hostname // of the instance as defined by the default internal DNS name (see https://cloud.google.com/compute/docs/internal-dns#instance-fully-qualified-domain-names). func (d *Detector) GCEInstanceName() (string, error) { return d.metadata.InstanceNameWithContext(context.TODO()) } // GCEInstanceHostname returns the full value of the default or custom hostname of the instance // on which this program is running. See https://cloud.google.com/compute/docs/instances/custom-hostname-vm. func (d *Detector) GCEInstanceHostname() (string, error) { return d.metadata.HostnameWithContext(context.TODO()) } // GCEAvailabilityZoneAndRegion returns the zone and region in which this program is running. func (d *Detector) GCEAvailabilityZoneAndRegion() (string, string, error) { zone, err := d.metadata.ZoneWithContext(context.TODO()) if err != nil { return "", "", err } if zone == "" { return "", "", fmt.Errorf("no zone detected from GCE metadata server") } splitZone := strings.SplitN(zone, "-", 3) if len(splitZone) != 3 { return "", "", fmt.Errorf("zone was not in the expected format: country-region-zone. Got %v", zone) } return zone, strings.Join(splitZone[0:2], "-"), nil } type ManagedInstanceGroup struct { Name string Location string Type LocationType } var createdByMIGRE = regexp.MustCompile(`^projects/[^/]+/(zones|regions)/([^/]+)/instanceGroupManagers/([^/]+)$`) func (d *Detector) GCEManagedInstanceGroup() (ManagedInstanceGroup, error) { createdBy, err := d.metadata.InstanceAttributeValueWithContext(context.TODO(), createdByInstanceAttr) if _, ok := err.(metadata.NotDefinedError); ok { return ManagedInstanceGroup{}, nil } else if err != nil { return ManagedInstanceGroup{}, err } matches := createdByMIGRE.FindStringSubmatch(createdBy) if matches == nil { // The "created-by" key exists, but it doesn't describe a MIG. // Something else must have created this VM. return ManagedInstanceGroup{}, nil } mig := ManagedInstanceGroup{ Name: matches[3], Location: matches[2], } switch matches[1] { case "zones": mig.Type = Zone case "regions": mig.Type = Region } return mig, nil } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp/gke.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcp import ( "context" "fmt" "strings" ) const ( // If the kubernetes.default.svc service exists in the cluster, // then the KUBERNETES_SERVICE_HOST env var will be populated. // Use this as an indication that we are running on kubernetes. k8sServiceHostEnv = "KUBERNETES_SERVICE_HOST" // See the available GKE metadata: // https://cloud.google.com/kubernetes-engine/docs/concepts/workload-identity#instance_metadata clusterNameMetadataAttr = "cluster-name" clusterLocationMetadataAttr = "cluster-location" ) func (d *Detector) onGKE() bool { // Check if we are on k8s first _, found := d.os.LookupEnv(k8sServiceHostEnv) if !found { return false } // If we are on k8s, make sure that we are actually on GKE, and not a // different managed k8s platform. _, err := d.metadata.InstanceAttributeValueWithContext(context.TODO(), clusterLocationMetadataAttr) return err == nil } // GKEHostID returns the instance ID of the instance on which this program is running. func (d *Detector) GKEHostID() (string, error) { return d.GCEHostID() } // GKEClusterName returns the name if the GKE cluster in which this program is running. func (d *Detector) GKEClusterName() (string, error) { return d.metadata.InstanceAttributeValueWithContext(context.TODO(), clusterNameMetadataAttr) } type LocationType int64 const ( UndefinedLocation LocationType = iota Zone Region ) // GKEAvailabilityZoneOrRegion returns the location of the cluster and whether the cluster is zonal or regional. func (d *Detector) GKEAvailabilityZoneOrRegion() (string, LocationType, error) { clusterLocation, err := d.metadata.InstanceAttributeValueWithContext(context.TODO(), clusterLocationMetadataAttr) if err != nil { return "", UndefinedLocation, err } switch strings.Count(clusterLocation, "-") { case 1: return clusterLocation, Region, nil case 2: return clusterLocation, Zone, nil default: return "", UndefinedLocation, fmt.Errorf("unrecognized format for cluster location: %v", clusterLocation) } } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/README.md ================================================ # OpenTelemetry Google Cloud Monitoring Exporter [![Docs](https://godoc.org/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric?status.svg)](https://pkg.go.dev/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric) [![Apache License][license-image]][license-url] OpenTelemetry Google Cloud Monitoring Exporter allows the user to send collected metrics to Google Cloud. To get started with instrumentation in Google Cloud, see [Generate traces and metrics with Go](https://cloud.google.com/stackdriver/docs/instrumentation/setup/go). To learn more about instrumentation and observability, including opinionated recommendations for Google Cloud Observability, visit [Instrumentation and observability](https://cloud.google.com/stackdriver/docs/instrumentation/overview). [Google Cloud Monitoring](https://cloud.google.com/monitoring) provides visibility into the performance, uptime, and overall health of cloud-powered applications. It collects metrics, events, and metadata from Google Cloud, Amazon Web Services, hosted uptime probes, application instrumentation, and a variety of common application components including Cassandra, Nginx, Apache Web Server, Elasticsearch, and many others. Operations ingests that data and generates insights via dashboards, charts, and alerts. Cloud Monitoring alerting helps you collaborate by integrating with Slack, PagerDuty, and more. ## Setup Google Cloud Monitoring is a managed service provided by Google Cloud Platform. Google Cloud Monitoring requires to set up "Workspace" in advance. The guide to create a new Workspace is available on [the official document](https://cloud.google.com/monitoring/workspaces/create). ## Authentication The Google Cloud Monitoring exporter depends upon [`google.FindDefaultCredentials`](https://pkg.go.dev/golang.org/x/oauth2/google?tab=doc#FindDefaultCredentials), so the service account is automatically detected by default, but also the custom credential file (so called `service_account_key.json`) can be detected with specific conditions. Quoting from the document of `google.FindDefaultCredentials`: * A JSON file whose path is specified by the `GOOGLE_APPLICATION_CREDENTIALS` environment variable. * A JSON file in a location known to the gcloud command-line tool. On Windows, this is `%APPDATA%/gcloud/application_default_credentials.json`. On other systems, `$HOME/.config/gcloud/application_default_credentials.json`. When running code locally, you may need to specify a Google Project ID in addition to `GOOGLE_APPLICATION_CREDENTIALS`. This is best done using an environment variable (e.g. `GOOGLE_CLOUD_PROJECT`) and the `metric.WithProjectID` method, e.g.: ```golang projectID := os.Getenv("GOOGLE_CLOUD_PROJECT") opts := []mexporter.Option{ mexporter.WithProjectID(projectID), } ``` ## Useful links * For more information on OpenTelemetry, visit: https://opentelemetry.io/ * For more about OpenTelemetry Go, visit: https://github.com/open-telemetry/opentelemetry-go * Learn more about Google Cloud Monitoring at https://cloud.google.com/monitoring [license-url]: https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/main/LICENSE [license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/cloudmonitoring.go ================================================ // Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metric import ( "context" "errors" "fmt" sdkmetric "go.opentelemetry.io/otel/sdk/metric" monitoring "cloud.google.com/go/monitoring/apiv3/v2" "golang.org/x/oauth2/google" ) // New creates a new Exporter thats implements metric.Exporter. func New(opts ...Option) (sdkmetric.Exporter, error) { o := options{ context: context.Background(), resourceAttributeFilter: DefaultResourceAttributesFilter, } for _, opt := range opts { opt(&o) } if o.projectID == "" { creds, err := google.FindDefaultCredentials(o.context, monitoring.DefaultAuthScopes()...) if err != nil { return nil, fmt.Errorf("failed to find Google Cloud credentials: %v", err) } if creds.ProjectID == "" { return nil, errors.New("google cloud monitoring: no project found with application default credentials") } o.projectID = creds.ProjectID } return newMetricExporter(&o) } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/constants.go ================================================ // Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metric // TODO: remove this file when the constants are ready in the Go SDK // Mappings for the well-known OpenTelemetry resource label keys // to applicable Monitored Resource label keys. // A uniquely identifying name for the Kubernetes cluster. Kubernetes // does not have cluster names as an internal concept so this may be // set to any meaningful value within the environment. For example, // GKE clusters have a name which can be used for this label. const ( // Deprecated: use semconv.CloudProviderKey instead. CloudKeyProvider = "cloud.provider" // Deprecated: use semconv.CloudAccountIDKey instead. CloudKeyAccountID = "cloud.account.id" // Deprecated: use semconv.CloudRegionKey instead. CloudKeyRegion = "cloud.region" // Deprecated: use semconv.CloudAvailabilityZoneKey instead. CloudKeyZone = "cloud.availability_zone" // Deprecated: use semconv.ServiceNamespaceKey instead. ServiceKeyNamespace = "service.namespace" // Deprecated: use semconv.ServiceInstanceIDKey instead. ServiceKeyInstanceID = "service.instance.id" // Deprecated: use semconv.ServiceNameKey instead. ServiceKeyName = "service.name" // Deprecated: HostType is not needed. HostType = "host" // A uniquely identifying name for the host. // Deprecated: use semconv.HostNameKey instead. HostKeyName = "host.name" // A hostname as returned by the 'hostname' command on host machine. // Deprecated: HostKeyHostName is not needed. HostKeyHostName = "host.hostname" // Deprecated: use semconv.HostIDKey instead. HostKeyID = "host.id" // Deprecated: use semconv.HostTypeKey instead. HostKeyType = "host.type" // A uniquely identifying name for the Container. // Deprecated: use semconv.ContainerNameKey instead. ContainerKeyName = "container.name" // Deprecated: use semconv.ContainerImageNameKey instead. ContainerKeyImageName = "container.image.name" // Deprecated: use semconv.ContainerImageTagKey instead. ContainerKeyImageTag = "container.image.tag" // Cloud Providers // Deprecated: use semconv.CloudProviderAWS instead. CloudProviderAWS = "aws" // Deprecated: use semconv.CloudProviderGCP instead. CloudProviderGCP = "gcp" // Deprecated: use semconv.CloudProviderAzure instead. CloudProviderAZURE = "azure" // Deprecated: Use "k8s" instead. This should not be needed. K8S = "k8s" // Deprecated: use semconv.K8SClusterNameKey instead. K8SKeyClusterName = "k8s.cluster.name" // Deprecated: use semconv.K8SNamespaceNameKey instead. K8SKeyNamespaceName = "k8s.namespace.name" // Deprecated: use semconv.K8SPodNameKey instead. K8SKeyPodName = "k8s.pod.name" // Deprecated: use semconv.K8SDeploymentNameKey instead. K8SKeyDeploymentName = "k8s.deployment.name" // Monitored Resources types // Deprecated: Use "k8s_container" instead. K8SContainer = "k8s_container" // Deprecated: Use "k8s_node" instead. K8SNode = "k8s_node" // Deprecated: Use "k8s_pod" instead. K8SPod = "k8s_pod" // Deprecated: Use "k8s_cluster" instead. K8SCluster = "k8s_cluster" // Deprecated: Use "gce_instance" instead. GCEInstance = "gce_instance" // Deprecated: Use "aws_ec2_instance" instead. AWSEC2Instance = "aws_ec2_instance" // Deprecated: Use "generic_task" instead. GenericTask = "generic_task" ) ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/error.go ================================================ // Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metric import ( "errors" "fmt" ) var ( errBlankProjectID = errors.New("expecting a non-blank ProjectID") ) type errUnexpectedAggregationKind struct { kind string } func (e errUnexpectedAggregationKind) Error() string { return fmt.Sprintf("the metric kind is unexpected: %v", e.kind) } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/metric.go ================================================ // Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metric import ( "bytes" "context" "encoding/hex" "errors" "fmt" "math" "net/url" "reflect" "sort" "strings" "sync" "time" "unicode" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/instrumentation" "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/metricdata" "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/trace" monitoring "cloud.google.com/go/monitoring/apiv3/v2" "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb" "github.com/googleapis/gax-go/v2" "google.golang.org/api/option" "google.golang.org/genproto/googleapis/api/distribution" "google.golang.org/genproto/googleapis/api/label" googlemetricpb "google.golang.org/genproto/googleapis/api/metric" monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" "google.golang.org/grpc" "google.golang.org/grpc/encoding/gzip" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/types/known/anypb" "google.golang.org/protobuf/types/known/timestamppb" "github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping" ) const ( // The number of timeserieses to send to GCM in a single request. This // is a hard limit in the GCM API, so we never want to exceed 200. sendBatchSize = 200 cloudMonitoringMetricDescriptorNameFormat = "workload.googleapis.com/%s" platformMappingMonitoredResourceKey = "gcp.resource_type" ) // key is used to judge the uniqueness of the record descriptor. type key struct { name string libraryname string } func keyOf(metrics metricdata.Metrics, library instrumentation.Scope) key { return key{ name: metrics.Name, libraryname: library.Name, } } // metricExporter is the implementation of OpenTelemetry metric exporter for // Google Cloud Monitoring. type metricExporter struct { o *options shutdown chan struct{} // mdCache is the cache to hold MetricDescriptor to avoid creating duplicate MD. mdCache map[key]*googlemetricpb.MetricDescriptor client *monitoring.MetricClient mdLock sync.RWMutex shutdownOnce sync.Once } // ForceFlush does nothing, the exporter holds no state. func (e *metricExporter) ForceFlush(ctx context.Context) error { return ctx.Err() } // Shutdown shuts down the client connections. func (e *metricExporter) Shutdown(ctx context.Context) error { err := errShutdown e.shutdownOnce.Do(func() { close(e.shutdown) err = errors.Join(ctx.Err(), e.client.Close()) }) return err } // newMetricExporter returns an exporter that uploads OTel metric data to Google Cloud Monitoring. func newMetricExporter(o *options) (*metricExporter, error) { if strings.TrimSpace(o.projectID) == "" { return nil, errBlankProjectID } clientOpts := append([]option.ClientOption{option.WithGRPCDialOption(grpc.WithUserAgent(userAgent))}, o.monitoringClientOptions...) ctx := o.context if ctx == nil { ctx = context.Background() } client, err := monitoring.NewMetricClient(ctx, clientOpts...) if err != nil { return nil, err } if o.compression == "gzip" { client.CallOptions.GetMetricDescriptor = append(client.CallOptions.GetMetricDescriptor, gax.WithGRPCOptions(grpc.UseCompressor(gzip.Name))) client.CallOptions.CreateMetricDescriptor = append(client.CallOptions.CreateMetricDescriptor, gax.WithGRPCOptions(grpc.UseCompressor(gzip.Name))) client.CallOptions.CreateTimeSeries = append(client.CallOptions.CreateTimeSeries, gax.WithGRPCOptions(grpc.UseCompressor(gzip.Name))) client.CallOptions.CreateServiceTimeSeries = append(client.CallOptions.CreateServiceTimeSeries, gax.WithGRPCOptions(grpc.UseCompressor(gzip.Name))) } cache := map[key]*googlemetricpb.MetricDescriptor{} e := &metricExporter{ o: o, mdCache: cache, client: client, shutdown: make(chan struct{}), } return e, nil } var errShutdown = fmt.Errorf("exporter is shutdown") // Export exports OpenTelemetry Metrics to Google Cloud Monitoring. func (me *metricExporter) Export(ctx context.Context, rm *metricdata.ResourceMetrics) error { select { case <-me.shutdown: return errShutdown default: } if me.o.destinationProjectQuota { ctx = metadata.NewOutgoingContext(ctx, metadata.New(map[string]string{"x-goog-user-project": strings.TrimPrefix(me.o.projectID, "projects/")})) } return errors.Join( me.exportMetricDescriptor(ctx, rm), me.exportTimeSeries(ctx, rm), ) } // Temporality returns the Temporality to use for an instrument kind. func (me *metricExporter) Temporality(ik metric.InstrumentKind) metricdata.Temporality { return metric.DefaultTemporalitySelector(ik) } // Aggregation returns the Aggregation to use for an instrument kind. func (me *metricExporter) Aggregation(ik metric.InstrumentKind) metric.Aggregation { return metric.DefaultAggregationSelector(ik) } // exportMetricDescriptor create MetricDescriptor from the record // if the descriptor is not registered in Cloud Monitoring yet. func (me *metricExporter) exportMetricDescriptor(ctx context.Context, rm *metricdata.ResourceMetrics) error { // We only send metric descriptors if we're configured *and* we're not sending service timeseries. if me.o.disableCreateMetricDescriptors { return nil } me.mdLock.Lock() defer me.mdLock.Unlock() mds := make(map[key]*googlemetricpb.MetricDescriptor) extraLabels := me.extraLabelsFromResource(rm.Resource) for _, scope := range rm.ScopeMetrics { for _, metrics := range scope.Metrics { k := keyOf(metrics, scope.Scope) if _, ok := me.mdCache[k]; ok { continue } if _, localok := mds[k]; !localok { md := me.recordToMdpb(metrics, extraLabels) mds[k] = md } } } // TODO: This process is synchronous and blocks longer time if records in cps // have many different descriptors. In the cps.ForEach above, it should spawn // goroutines to send CreateMetricDescriptorRequest asynchronously in the case // the descriptor does not exist in global cache (me.mdCache). // See details in #26. var errs []error for kmd, md := range mds { err := me.createMetricDescriptorIfNeeded(ctx, md) if err == nil { me.mdCache[kmd] = md } errs = append(errs, err) } return errors.Join(errs...) } func (me *metricExporter) createMetricDescriptorIfNeeded(ctx context.Context, md *googlemetricpb.MetricDescriptor) error { mdReq := &monitoringpb.GetMetricDescriptorRequest{ Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", me.o.projectID, md.Type), } _, err := me.client.GetMetricDescriptor(ctx, mdReq) if err == nil { // If the metric descriptor already exists, skip the CreateMetricDescriptor call. // Metric descriptors cannot be updated without deleting them first, so there // isn't anything we can do here: // https://cloud.google.com/monitoring/custom-metrics/creating-metrics#md-modify return nil } req := &monitoringpb.CreateMetricDescriptorRequest{ Name: fmt.Sprintf("projects/%s", me.o.projectID), MetricDescriptor: md, } _, err = me.client.CreateMetricDescriptor(ctx, req) return err } // exportTimeSeries create TimeSeries from the records in cps. // res should be the common resource among all TimeSeries, such as instance id, application name and so on. func (me *metricExporter) exportTimeSeries(ctx context.Context, rm *metricdata.ResourceMetrics) error { tss, err := me.recordsToTspbs(rm) if len(tss) == 0 { return err } name := fmt.Sprintf("projects/%s", me.o.projectID) errs := []error{err} for i := 0; i < len(tss); i += sendBatchSize { j := i + sendBatchSize if j >= len(tss) { j = len(tss) } // TODO: When this exporter is rewritten, support writing to multiple // projects based on the "gcp.project.id" resource. req := &monitoringpb.CreateTimeSeriesRequest{ Name: name, TimeSeries: tss[i:j], } if me.o.createServiceTimeSeries { errs = append(errs, me.client.CreateServiceTimeSeries(ctx, req)) } else { errs = append(errs, me.client.CreateTimeSeries(ctx, req)) } } return errors.Join(errs...) } func (me *metricExporter) extraLabelsFromResource(res *resource.Resource) *attribute.Set { set, _ := attribute.NewSetWithFiltered(res.Attributes(), me.o.resourceAttributeFilter) return &set } // descToMetricType converts descriptor to MetricType proto type. // Basically this returns default value ("workload.googleapis.com/[metric type]"). func (me *metricExporter) descToMetricType(desc metricdata.Metrics) string { if formatter := me.o.metricDescriptorTypeFormatter; formatter != nil { return formatter(desc) } return fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, desc.Name) } // metricTypeToDisplayName takes a GCM metric type, like (workload.googleapis.com/MyCoolMetric) and returns the display name. func metricTypeToDisplayName(mURL string) string { // strip domain, keep path after domain. u, err := url.Parse(fmt.Sprintf("metrics://%s", mURL)) if err != nil || u.Path == "" { return mURL } return strings.TrimLeft(u.Path, "/") } // recordToMdpb extracts data and converts them to googlemetricpb.MetricDescriptor. func (me *metricExporter) recordToMdpb(metrics metricdata.Metrics, extraLabels *attribute.Set) *googlemetricpb.MetricDescriptor { name := metrics.Name typ := me.descToMetricType(metrics) kind, valueType := recordToMdpbKindType(metrics.Data) // Detailed explanations on MetricDescriptor proto is not documented on // generated Go packages. Refer to the original proto file. // https://github.com/googleapis/googleapis/blob/50af053/google/api/metric.proto#L33 return &googlemetricpb.MetricDescriptor{ Name: name, DisplayName: metricTypeToDisplayName(typ), Type: typ, MetricKind: kind, ValueType: valueType, Unit: string(metrics.Unit), Description: metrics.Description, Labels: labelDescriptors(metrics, extraLabels), } } func labelDescriptors(metrics metricdata.Metrics, extraLabels *attribute.Set) []*label.LabelDescriptor { labels := []*label.LabelDescriptor{} seenKeys := map[string]struct{}{} addAttributes := func(attr *attribute.Set) { iter := attr.Iter() for iter.Next() { kv := iter.Attribute() // Skip keys that have already been set if _, ok := seenKeys[normalizeLabelKey(string(kv.Key))]; ok { continue } labels = append(labels, &label.LabelDescriptor{ Key: normalizeLabelKey(string(kv.Key)), }) seenKeys[normalizeLabelKey(string(kv.Key))] = struct{}{} } } addAttributes(extraLabels) switch a := metrics.Data.(type) { case metricdata.Gauge[int64]: for _, pt := range a.DataPoints { addAttributes(&pt.Attributes) } case metricdata.Gauge[float64]: for _, pt := range a.DataPoints { addAttributes(&pt.Attributes) } case metricdata.Sum[int64]: for _, pt := range a.DataPoints { addAttributes(&pt.Attributes) } case metricdata.Sum[float64]: for _, pt := range a.DataPoints { addAttributes(&pt.Attributes) } case metricdata.Histogram[float64]: for _, pt := range a.DataPoints { addAttributes(&pt.Attributes) } case metricdata.Histogram[int64]: for _, pt := range a.DataPoints { addAttributes(&pt.Attributes) } } return labels } type attributes struct { attrs attribute.Set } func (attrs *attributes) GetString(key string) (string, bool) { value, ok := attrs.attrs.Value(attribute.Key(key)) return value.AsString(), ok } // resourceToMonitoredResourcepb converts resource in OTel to MonitoredResource // proto type for Cloud Monitoring. // // https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.monitoredResourceDescriptors func (me *metricExporter) resourceToMonitoredResourcepb(res *resource.Resource) *monitoredrespb.MonitoredResource { platformMrType, platformMappingRequested := res.Set().Value(platformMappingMonitoredResourceKey) // check if platform mapping is requested and possible if platformMappingRequested && platformMrType.AsString() == me.o.monitoredResourceDescription.mrType { // assemble attributes required to construct this MR attributeMap := make(map[string]string) for expectedLabel := range me.o.monitoredResourceDescription.mrLabels { value, found := res.Set().Value(attribute.Key(expectedLabel)) if found { attributeMap[expectedLabel] = value.AsString() } } return &monitoredrespb.MonitoredResource{ Type: platformMrType.AsString(), Labels: attributeMap, } } gmr := resourcemapping.ResourceAttributesToMonitoringMonitoredResource(&attributes{ attrs: attribute.NewSet(res.Attributes()...), }) newLabels := make(map[string]string, len(gmr.Labels)) for k, v := range gmr.Labels { newLabels[k] = sanitizeUTF8(v) } mr := &monitoredrespb.MonitoredResource{ Type: gmr.Type, Labels: newLabels, } return mr } // recordToMdpbKindType return the mapping from OTel's record descriptor to // Cloud Monitoring's MetricKind and ValueType. func recordToMdpbKindType(a metricdata.Aggregation) (googlemetricpb.MetricDescriptor_MetricKind, googlemetricpb.MetricDescriptor_ValueType) { switch agg := a.(type) { case metricdata.Gauge[int64]: return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64 case metricdata.Gauge[float64]: return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE case metricdata.Sum[int64]: if agg.IsMonotonic { return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_INT64 } return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64 case metricdata.Sum[float64]: if agg.IsMonotonic { return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DOUBLE } return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE case metricdata.Histogram[int64], metricdata.Histogram[float64]: return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DISTRIBUTION default: return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED } } // recordToMpb converts data from records to Metric proto type for Cloud Monitoring. func (me *metricExporter) recordToMpb(metrics metricdata.Metrics, attributes attribute.Set, library instrumentation.Scope, extraLabels *attribute.Set) *googlemetricpb.Metric { me.mdLock.RLock() defer me.mdLock.RUnlock() k := keyOf(metrics, library) md, ok := me.mdCache[k] if !ok { md = me.recordToMdpb(metrics, extraLabels) } labels := make(map[string]string) addAttributes := func(attr *attribute.Set) { iter := attr.Iter() for iter.Next() { kv := iter.Attribute() labels[normalizeLabelKey(string(kv.Key))] = sanitizeUTF8(kv.Value.Emit()) } } addAttributes(extraLabels) addAttributes(&attributes) return &googlemetricpb.Metric{ Type: md.Type, Labels: labels, } } // recordToTspb converts record to TimeSeries proto type with common resource. // ref. https://cloud.google.com/monitoring/api/ref_v3/rest/v3/TimeSeries func (me *metricExporter) recordToTspb(m metricdata.Metrics, mr *monitoredrespb.MonitoredResource, library instrumentation.Scope, extraLabels *attribute.Set) ([]*monitoringpb.TimeSeries, error) { var tss []*monitoringpb.TimeSeries var errs []error if m.Data == nil { return nil, nil } switch a := m.Data.(type) { case metricdata.Gauge[int64]: for _, point := range a.DataPoints { ts, err := gaugeToTimeSeries[int64](point, m, mr) if err != nil { errs = append(errs, err) continue } ts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels) tss = append(tss, ts) } case metricdata.Gauge[float64]: for _, point := range a.DataPoints { ts, err := gaugeToTimeSeries[float64](point, m, mr) if err != nil { errs = append(errs, err) continue } ts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels) tss = append(tss, ts) } case metricdata.Sum[int64]: for _, point := range a.DataPoints { var ts *monitoringpb.TimeSeries var err error if a.IsMonotonic { ts, err = sumToTimeSeries[int64](point, m, mr) } else { // Send non-monotonic sums as gauges ts, err = gaugeToTimeSeries[int64](point, m, mr) } if err != nil { errs = append(errs, err) continue } ts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels) tss = append(tss, ts) } case metricdata.Sum[float64]: for _, point := range a.DataPoints { var ts *monitoringpb.TimeSeries var err error if a.IsMonotonic { ts, err = sumToTimeSeries[float64](point, m, mr) } else { // Send non-monotonic sums as gauges ts, err = gaugeToTimeSeries[float64](point, m, mr) } if err != nil { errs = append(errs, err) continue } ts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels) tss = append(tss, ts) } case metricdata.Histogram[int64]: for _, point := range a.DataPoints { ts, err := histogramToTimeSeries(point, m, mr, me.o.enableSumOfSquaredDeviation, me.o.projectID) if err != nil { errs = append(errs, err) continue } ts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels) tss = append(tss, ts) } case metricdata.Histogram[float64]: for _, point := range a.DataPoints { ts, err := histogramToTimeSeries(point, m, mr, me.o.enableSumOfSquaredDeviation, me.o.projectID) if err != nil { errs = append(errs, err) continue } ts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels) tss = append(tss, ts) } case metricdata.ExponentialHistogram[int64]: for _, point := range a.DataPoints { ts, err := expHistogramToTimeSeries(point, m, mr, me.o.enableSumOfSquaredDeviation, me.o.projectID) if err != nil { errs = append(errs, err) continue } ts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels) tss = append(tss, ts) } case metricdata.ExponentialHistogram[float64]: for _, point := range a.DataPoints { ts, err := expHistogramToTimeSeries(point, m, mr, me.o.enableSumOfSquaredDeviation, me.o.projectID) if err != nil { errs = append(errs, err) continue } ts.Metric = me.recordToMpb(m, point.Attributes, library, extraLabels) tss = append(tss, ts) } default: errs = append(errs, errUnexpectedAggregationKind{kind: reflect.TypeOf(m.Data).String()}) } return tss, errors.Join(errs...) } func (me *metricExporter) recordsToTspbs(rm *metricdata.ResourceMetrics) ([]*monitoringpb.TimeSeries, error) { mr := me.resourceToMonitoredResourcepb(rm.Resource) extraLabels := me.extraLabelsFromResource(rm.Resource) var ( tss []*monitoringpb.TimeSeries errs []error ) for _, scope := range rm.ScopeMetrics { for _, metrics := range scope.Metrics { ts, err := me.recordToTspb(metrics, mr, scope.Scope, extraLabels) errs = append(errs, err) tss = append(tss, ts...) } } return tss, errors.Join(errs...) } func sanitizeUTF8(s string) string { return strings.ToValidUTF8(s, "�") } func gaugeToTimeSeries[N int64 | float64](point metricdata.DataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { value, valueType := numberDataPointToValue(point) timestamp := timestamppb.New(point.Time) if err := timestamp.CheckValid(); err != nil { return nil, err } return &monitoringpb.TimeSeries{ Resource: mr, Unit: string(metrics.Unit), MetricKind: googlemetricpb.MetricDescriptor_GAUGE, ValueType: valueType, Points: []*monitoringpb.Point{{ Interval: &monitoringpb.TimeInterval{ EndTime: timestamp, }, Value: value, }}, }, nil } func sumToTimeSeries[N int64 | float64](point metricdata.DataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { interval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time) if err != nil { return nil, err } value, valueType := numberDataPointToValue[N](point) return &monitoringpb.TimeSeries{ Resource: mr, Unit: string(metrics.Unit), MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, ValueType: valueType, Points: []*monitoringpb.Point{{ Interval: interval, Value: value, }}, }, nil } // TODO(@dashpole): Refactor to pass control-coupling lint check. // //nolint:revive func histogramToTimeSeries[N int64 | float64](point metricdata.HistogramDataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource, enableSOSD bool, projectID string) (*monitoringpb.TimeSeries, error) { interval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time) if err != nil { return nil, err } distributionValue := histToDistribution(point, projectID) if enableSOSD { setSumOfSquaredDeviation(point, distributionValue) } return &monitoringpb.TimeSeries{ Resource: mr, Unit: string(metrics.Unit), MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, ValueType: googlemetricpb.MetricDescriptor_DISTRIBUTION, Points: []*monitoringpb.Point{{ Interval: interval, Value: &monitoringpb.TypedValue{ Value: &monitoringpb.TypedValue_DistributionValue{ DistributionValue: distributionValue, }, }, }}, }, nil } func expHistogramToTimeSeries[N int64 | float64](point metricdata.ExponentialHistogramDataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource, enableSOSD bool, projectID string) (*monitoringpb.TimeSeries, error) { interval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time) if err != nil { return nil, err } distributionValue := expHistToDistribution(point, projectID) // TODO: Implement "setSumOfSquaredDeviationExpHist" for parameter "enableSOSD" functionality. return &monitoringpb.TimeSeries{ Resource: mr, Unit: string(metrics.Unit), MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, ValueType: googlemetricpb.MetricDescriptor_DISTRIBUTION, Points: []*monitoringpb.Point{{ Interval: interval, Value: &monitoringpb.TypedValue{ Value: &monitoringpb.TypedValue_DistributionValue{ DistributionValue: distributionValue, }, }, }}, }, nil } func toNonemptyTimeIntervalpb(start, end time.Time) (*monitoringpb.TimeInterval, error) { // The end time of a new interval must be at least a millisecond after the end time of the // previous interval, for all non-gauge types. // https://cloud.google.com/monitoring/api/ref_v3/rpc/google.monitoring.v3#timeinterval if end.Sub(start).Milliseconds() <= 1 { end = start.Add(time.Millisecond) } startpb := timestamppb.New(start) endpb := timestamppb.New(end) err := errors.Join( startpb.CheckValid(), endpb.CheckValid(), ) if err != nil { return nil, err } return &monitoringpb.TimeInterval{ StartTime: startpb, EndTime: endpb, }, nil } func histToDistribution[N int64 | float64](hist metricdata.HistogramDataPoint[N], projectID string) *distribution.Distribution { counts := make([]int64, len(hist.BucketCounts)) for i, v := range hist.BucketCounts { counts[i] = int64(v) } var mean float64 if !math.IsNaN(float64(hist.Sum)) && hist.Count > 0 { // Avoid divide-by-zero mean = float64(hist.Sum) / float64(hist.Count) } return &distribution.Distribution{ Count: int64(hist.Count), Mean: mean, BucketCounts: counts, BucketOptions: &distribution.Distribution_BucketOptions{ Options: &distribution.Distribution_BucketOptions_ExplicitBuckets{ ExplicitBuckets: &distribution.Distribution_BucketOptions_Explicit{ Bounds: hist.Bounds, }, }, }, Exemplars: toDistributionExemplar[N](hist.Exemplars, projectID), } } func expHistToDistribution[N int64 | float64](hist metricdata.ExponentialHistogramDataPoint[N], projectID string) *distribution.Distribution { // First calculate underflow bucket with all negatives + zeros. underflow := hist.ZeroCount negativeBuckets := hist.NegativeBucket.Counts for i := 0; i < len(negativeBuckets); i++ { underflow += negativeBuckets[i] } // Next, pull in remaining buckets. counts := make([]int64, len(hist.PositiveBucket.Counts)+2) bucketOptions := &distribution.Distribution_BucketOptions{} counts[0] = int64(underflow) positiveBuckets := hist.PositiveBucket.Counts for i := 0; i < len(positiveBuckets); i++ { counts[i+1] = int64(positiveBuckets[i]) } // Overflow bucket is always empty counts[len(counts)-1] = 0 if len(hist.PositiveBucket.Counts) == 0 { // We cannot send exponential distributions with no positive buckets, // instead we send a simple overflow/underflow histogram. bucketOptions.Options = &distribution.Distribution_BucketOptions_ExplicitBuckets{ ExplicitBuckets: &distribution.Distribution_BucketOptions_Explicit{ Bounds: []float64{0}, }, } } else { // Exponential histogram growth := math.Exp2(math.Exp2(-float64(hist.Scale))) scale := math.Pow(growth, float64(hist.PositiveBucket.Offset)) bucketOptions.Options = &distribution.Distribution_BucketOptions_ExponentialBuckets{ ExponentialBuckets: &distribution.Distribution_BucketOptions_Exponential{ GrowthFactor: growth, Scale: scale, NumFiniteBuckets: int32(len(counts) - 2), }, } } var mean float64 if !math.IsNaN(float64(hist.Sum)) && hist.Count > 0 { // Avoid divide-by-zero mean = float64(hist.Sum) / float64(hist.Count) } return &distribution.Distribution{ Count: int64(hist.Count), Mean: mean, BucketCounts: counts, BucketOptions: bucketOptions, Exemplars: toDistributionExemplar[N](hist.Exemplars, projectID), } } func toDistributionExemplar[N int64 | float64](Exemplars []metricdata.Exemplar[N], projectID string) []*distribution.Distribution_Exemplar { var exemplars []*distribution.Distribution_Exemplar for _, e := range Exemplars { attachments := []*anypb.Any{} if hasValidSpanContext(e) { sctx, err := anypb.New(&monitoringpb.SpanContext{ SpanName: fmt.Sprintf("projects/%s/traces/%s/spans/%s", projectID, hex.EncodeToString(e.TraceID[:]), hex.EncodeToString(e.SpanID[:])), }) if err == nil { attachments = append(attachments, sctx) } } if len(e.FilteredAttributes) > 0 { attr, err := anypb.New(&monitoringpb.DroppedLabels{ Label: attributesToLabels(e.FilteredAttributes), }) if err == nil { attachments = append(attachments, attr) } } exemplars = append(exemplars, &distribution.Distribution_Exemplar{ Value: float64(e.Value), Timestamp: timestamppb.New(e.Time), Attachments: attachments, }) } sort.Slice(exemplars, func(i, j int) bool { return exemplars[i].Value < exemplars[j].Value }) return exemplars } func attributesToLabels(attrs []attribute.KeyValue) map[string]string { labels := make(map[string]string, len(attrs)) for _, attr := range attrs { labels[normalizeLabelKey(string(attr.Key))] = sanitizeUTF8(attr.Value.Emit()) } return labels } var ( nilTraceID trace.TraceID nilSpanID trace.SpanID ) func hasValidSpanContext[N int64 | float64](e metricdata.Exemplar[N]) bool { return !bytes.Equal(e.TraceID[:], nilTraceID[:]) && !bytes.Equal(e.SpanID[:], nilSpanID[:]) } func setSumOfSquaredDeviation[N int64 | float64](hist metricdata.HistogramDataPoint[N], dist *distribution.Distribution) { var prevBound float64 // Calculate the sum of squared deviation. for i := 0; i < len(hist.Bounds); i++ { // Assume all points in the bucket occur at the middle of the bucket range middleOfBucket := (prevBound + hist.Bounds[i]) / 2 dist.SumOfSquaredDeviation += float64(dist.BucketCounts[i]) * (middleOfBucket - dist.Mean) * (middleOfBucket - dist.Mean) prevBound = hist.Bounds[i] } // The infinity bucket is an implicit +Inf bound after the list of explicit bounds. // Assume points in the infinity bucket are at the top of the previous bucket middleOfInfBucket := prevBound if len(dist.BucketCounts) > 0 { dist.SumOfSquaredDeviation += float64(dist.BucketCounts[len(dist.BucketCounts)-1]) * (middleOfInfBucket - dist.Mean) * (middleOfInfBucket - dist.Mean) } } func numberDataPointToValue[N int64 | float64]( point metricdata.DataPoint[N], ) (*monitoringpb.TypedValue, googlemetricpb.MetricDescriptor_ValueType) { switch v := any(point.Value).(type) { case int64: return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ Int64Value: v, }}, googlemetricpb.MetricDescriptor_INT64 case float64: return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DoubleValue{ DoubleValue: v, }}, googlemetricpb.MetricDescriptor_DOUBLE } // It is impossible to reach this statement return nil, googlemetricpb.MetricDescriptor_INT64 } // https://github.com/googleapis/googleapis/blob/c4c562f89acce603fb189679836712d08c7f8584/google/api/metric.proto#L149 // // > The label key name must follow: // > // > * Only upper and lower-case letters, digits and underscores (_) are // > allowed. // > * Label name must start with a letter or digit. // > * The maximum length of a label name is 100 characters. // // Note: this does not truncate if a label is too long. func normalizeLabelKey(s string) string { if len(s) == 0 { return s } s = strings.Map(sanitizeRune, s) if unicode.IsDigit(rune(s[0])) { s = "key_" + s } return s } // converts anything that is not a letter or digit to an underscore. func sanitizeRune(r rune) rune { if unicode.IsLetter(r) || unicode.IsDigit(r) { return r } // Everything else turns into an underscore return '_' } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/option.go ================================================ // Copyright 2020-2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metric import ( "context" "fmt" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric/metricdata" semconv "go.opentelemetry.io/otel/semconv/v1.24.0" apioption "google.golang.org/api/option" ) var userAgent = fmt.Sprintf("opentelemetry-go %s; google-cloud-metric-exporter %s", otel.Version(), Version()) // MonitoredResourceDescription is the struct which holds information required to map OTel resource to specific // Google Cloud MonitoredResource. type MonitoredResourceDescription struct { mrLabels map[string]struct{} mrType string } // Option is function type that is passed to the exporter initialization function. type Option func(*options) // options is the struct to hold options for metricExporter and its client instance. type options struct { // context allows you to provide a custom context for API calls. // // This context will be used several times: first, to create Cloud Monitoring // clients, and then every time a new batch of metrics needs to be uploaded. // // If unset, context.Background() will be used. context context.Context // metricDescriptorTypeFormatter is the custom formtter for the MetricDescriptor.Type. // By default, the format string is "workload.googleapis.com/[metric name]". metricDescriptorTypeFormatter func(metricdata.Metrics) string // resourceAttributeFilter determinies which resource attributes to // add to metrics as metric labels. By default, it adds service.name, // service.namespace, and service.instance.id. resourceAttributeFilter attribute.Filter // monitoredResourceDescription sets whether to attempt mapping the OTel Resource to a specific // Google Cloud Monitored Resource. When provided, the exporter attempts to map only to the provided // monitored resource type. monitoredResourceDescription MonitoredResourceDescription // projectID is the identifier of the Cloud Monitoring // project the user is uploading the stats data to. // If not set, this will default to your "Application Default Credentials". // For details see: https://developers.google.com/accounts/docs/application-default-credentials. // // It will be used in the project_id label of a Google Cloud Monitoring monitored // resource if the resource does not inherently belong to a specific // project, e.g. on-premise resource like k8s_container or generic_task. projectID string // compression enables gzip compression on gRPC calls. compression string // monitoringClientOptions are additional options to be passed // to the underlying Stackdriver Monitoring API client. // Optional. monitoringClientOptions []apioption.ClientOption // destinationProjectQuota sets whether the request should use quota from // the destination project for the request. destinationProjectQuota bool // disableCreateMetricDescriptors disables automatic MetricDescriptor creation disableCreateMetricDescriptors bool // enableSumOfSquaredDeviation enables calculation of an estimated sum of squared // deviation. It isn't correct, so we don't send it by default. enableSumOfSquaredDeviation bool // createServiceTimeSeries sets whether to create timeseries using `CreateServiceTimeSeries`. // Implicitly, this sets `disableCreateMetricDescriptors` to true. createServiceTimeSeries bool } // WithProjectID sets Google Cloud Platform project as projectID. // Without using this option, it automatically detects the project ID // from the default credential detection process. // Please find the detailed order of the default credential detection process on the doc: // https://godoc.org/golang.org/x/oauth2/google#FindDefaultCredentials func WithProjectID(id string) func(o *options) { return func(o *options) { o.projectID = id } } // WithDestinationProjectQuota enables per-request usage of the destination // project's quota. For example, when setting gcp.project.id on a metric. func WithDestinationProjectQuota() func(o *options) { return func(o *options) { o.destinationProjectQuota = true } } // WithMonitoringClientOptions add the options for Cloud Monitoring client instance. // Available options are defined in. func WithMonitoringClientOptions(opts ...apioption.ClientOption) func(o *options) { return func(o *options) { o.monitoringClientOptions = append(o.monitoringClientOptions, opts...) } } // WithMetricDescriptorTypeFormatter sets the custom formatter for MetricDescriptor. // Note that the format has to follow the convention defined in the official document. // The default is "workload.googleapis.com/[metric name]". // ref. https://cloud.google.com/monitoring/custom-metrics/creating-metrics#custom_metric_names func WithMetricDescriptorTypeFormatter(f func(metricdata.Metrics) string) func(o *options) { return func(o *options) { o.metricDescriptorTypeFormatter = f } } // WithFilteredResourceAttributes determinies which resource attributes to // add to metrics as metric labels. By default, it adds service.name, // service.namespace, and service.instance.id. This is recommended to avoid // writing duplicate timeseries against the same monitored resource. Use // WithFilteredResourceAttributes(NoAttributes()) to disable the addition of // resource attributes to metric labels. func WithFilteredResourceAttributes(filter attribute.Filter) func(o *options) { return func(o *options) { o.resourceAttributeFilter = filter } } // DefaultResourceAttributesFilter is the default filter applied to resource // attributes. func DefaultResourceAttributesFilter(kv attribute.KeyValue) bool { return (kv.Key == semconv.ServiceNameKey || kv.Key == semconv.ServiceNamespaceKey || kv.Key == semconv.ServiceInstanceIDKey) && len(kv.Value.AsString()) > 0 } // NoAttributes can be passed to WithFilteredResourceAttributes to disable // adding resource attributes as metric labels. func NoAttributes(attribute.KeyValue) bool { return false } // WithDisableCreateMetricDescriptors will disable the automatic creation of // MetricDescriptors when an unknown metric is set to be exported. func WithDisableCreateMetricDescriptors() func(o *options) { return func(o *options) { o.disableCreateMetricDescriptors = true } } // WithCompression sets the compression to use for gRPC requests. func WithCompression(c string) func(o *options) { return func(o *options) { o.compression = c } } // WithSumOfSquaredDeviation sets the SumOfSquaredDeviation field on histograms. // It is an estimate, and is not the actual sum of squared deviations. func WithSumOfSquaredDeviation() func(o *options) { return func(o *options) { o.enableSumOfSquaredDeviation = true } } // WithCreateServiceTimeSeries configures the exporter to use `CreateServiceTimeSeries` for creating timeseries. // If this is used, metric descriptors are not exported. func WithCreateServiceTimeSeries() func(o *options) { return func(o *options) { o.createServiceTimeSeries = true o.disableCreateMetricDescriptors = true } } // WithMonitoredResourceDescription configures the exporter to attempt to map the OpenTelemetry Resource to the provided // Google MonitoredResource. The provided mrLabels would be searched for in the OpenTelemetry Resource Attributes and if // found, would be included in the MonitoredResource labels. func WithMonitoredResourceDescription(mrType string, mrLabels []string) func(o *options) { return func(o *options) { mrLabelSet := make(map[string]struct{}) for _, label := range mrLabels { mrLabelSet[label] = struct{}{} } o.monitoredResourceDescription = MonitoredResourceDescription{ mrType: mrType, mrLabels: mrLabelSet, } } } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/version.go ================================================ // Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package metric // Version is the current release version of the OpenTelemetry // Operations Metric Exporter in use. func Version() string { return "0.51.0" } ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping/resourcemapping.go ================================================ // Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package resourcemapping import ( "strings" semconv "go.opentelemetry.io/otel/semconv/v1.24.0" monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" ) const ( ProjectIDAttributeKey = "gcp.project.id" awsAccount = "aws_account" awsEc2Instance = "aws_ec2_instance" clusterName = "cluster_name" containerName = "container_name" gceInstance = "gce_instance" genericNode = "generic_node" genericTask = "generic_task" instanceID = "instance_id" job = "job" k8sCluster = "k8s_cluster" k8sContainer = "k8s_container" k8sNode = "k8s_node" k8sPod = "k8s_pod" location = "location" namespace = "namespace" namespaceName = "namespace_name" nodeID = "node_id" nodeName = "node_name" podName = "pod_name" region = "region" taskID = "task_id" zone = "zone" gaeInstance = "gae_instance" gaeApp = "gae_app" gaeModuleID = "module_id" gaeVersionID = "version_id" cloudRunRevision = "cloud_run_revision" cloudFunction = "cloud_function" cloudFunctionName = "function_name" serviceName = "service_name" configurationName = "configuration_name" revisionName = "revision_name" bmsInstance = "baremetalsolution.googleapis.com/Instance" unknownServicePrefix = "unknown_service" ) var ( // monitoredResourceMappings contains mappings of GCM resource label keys onto mapping config from OTel // resource for a given monitored resource type. monitoredResourceMappings = map[string]map[string]struct { // If none of the otelKeys are present in the Resource, fallback to this literal value fallbackLiteral string // OTel resource keys to try and populate the resource label from. For entries with // multiple OTel resource keys, the keys' values will be coalesced in order until there // is a non-empty value. otelKeys []string }{ gceInstance: { zone: {otelKeys: []string{string(semconv.CloudAvailabilityZoneKey)}}, instanceID: {otelKeys: []string{string(semconv.HostIDKey)}}, }, k8sContainer: { location: {otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }}, clusterName: {otelKeys: []string{string(semconv.K8SClusterNameKey)}}, namespaceName: {otelKeys: []string{string(semconv.K8SNamespaceNameKey)}}, podName: {otelKeys: []string{string(semconv.K8SPodNameKey)}}, containerName: {otelKeys: []string{string(semconv.K8SContainerNameKey)}}, }, k8sPod: { location: {otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }}, clusterName: {otelKeys: []string{string(semconv.K8SClusterNameKey)}}, namespaceName: {otelKeys: []string{string(semconv.K8SNamespaceNameKey)}}, podName: {otelKeys: []string{string(semconv.K8SPodNameKey)}}, }, k8sNode: { location: {otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }}, clusterName: {otelKeys: []string{string(semconv.K8SClusterNameKey)}}, nodeName: {otelKeys: []string{string(semconv.K8SNodeNameKey)}}, }, k8sCluster: { location: {otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }}, clusterName: {otelKeys: []string{string(semconv.K8SClusterNameKey)}}, }, gaeInstance: { location: {otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }}, gaeModuleID: {otelKeys: []string{string(semconv.FaaSNameKey)}}, gaeVersionID: {otelKeys: []string{string(semconv.FaaSVersionKey)}}, instanceID: {otelKeys: []string{string(semconv.FaaSInstanceKey)}}, }, gaeApp: { location: {otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }}, gaeModuleID: {otelKeys: []string{string(semconv.FaaSNameKey)}}, gaeVersionID: {otelKeys: []string{string(semconv.FaaSVersionKey)}}, }, awsEc2Instance: { instanceID: {otelKeys: []string{string(semconv.HostIDKey)}}, region: { otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }, }, awsAccount: {otelKeys: []string{string(semconv.CloudAccountIDKey)}}, }, bmsInstance: { location: {otelKeys: []string{string(semconv.CloudRegionKey)}}, instanceID: {otelKeys: []string{string(semconv.HostIDKey)}}, }, genericTask: { location: { otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }, fallbackLiteral: "global", }, namespace: {otelKeys: []string{string(semconv.ServiceNamespaceKey)}}, job: {otelKeys: []string{string(semconv.ServiceNameKey), string(semconv.FaaSNameKey)}}, taskID: {otelKeys: []string{string(semconv.ServiceInstanceIDKey), string(semconv.FaaSInstanceKey)}}, }, genericNode: { location: { otelKeys: []string{ string(semconv.CloudAvailabilityZoneKey), string(semconv.CloudRegionKey), }, fallbackLiteral: "global", }, namespace: {otelKeys: []string{string(semconv.ServiceNamespaceKey)}}, nodeID: {otelKeys: []string{string(semconv.HostIDKey), string(semconv.HostNameKey)}}, }, } ) // ReadOnlyAttributes is an interface to abstract between pulling attributes from PData library or OTEL SDK. type ReadOnlyAttributes interface { GetString(string) (string, bool) } // ResourceAttributesToLoggingMonitoredResource converts from a set of OTEL resource attributes into a // GCP monitored resource type and label set for Cloud Logging. // E.g. // This may output `gce_instance` type with appropriate labels. func ResourceAttributesToLoggingMonitoredResource(attrs ReadOnlyAttributes) *monitoredrespb.MonitoredResource { cloudPlatform, _ := attrs.GetString(string(semconv.CloudPlatformKey)) switch cloudPlatform { case semconv.CloudPlatformGCPAppEngine.Value.AsString(): return createMonitoredResource(gaeApp, attrs) default: return commonResourceAttributesToMonitoredResource(cloudPlatform, attrs) } } // ResourceAttributesToMonitoringMonitoredResource converts from a set of OTEL resource attributes into a // GCP monitored resource type and label set for Cloud Monitoring // E.g. // This may output `gce_instance` type with appropriate labels. func ResourceAttributesToMonitoringMonitoredResource(attrs ReadOnlyAttributes) *monitoredrespb.MonitoredResource { cloudPlatform, _ := attrs.GetString(string(semconv.CloudPlatformKey)) switch cloudPlatform { case semconv.CloudPlatformGCPAppEngine.Value.AsString(): return createMonitoredResource(gaeInstance, attrs) default: return commonResourceAttributesToMonitoredResource(cloudPlatform, attrs) } } func commonResourceAttributesToMonitoredResource(cloudPlatform string, attrs ReadOnlyAttributes) *monitoredrespb.MonitoredResource { switch cloudPlatform { case semconv.CloudPlatformGCPComputeEngine.Value.AsString(): return createMonitoredResource(gceInstance, attrs) case semconv.CloudPlatformAWSEC2.Value.AsString(): return createMonitoredResource(awsEc2Instance, attrs) // TODO(alex-basinov): replace this string literal with semconv.CloudPlatformGCPBareMetalSolution // once https://github.com/open-telemetry/semantic-conventions/pull/64 makes its way // into the semconv module. case "gcp_bare_metal_solution": return createMonitoredResource(bmsInstance, attrs) default: // if k8s.cluster.name is set, pattern match for various k8s resources. // this will also match non-cloud k8s platforms like minikube. if _, ok := attrs.GetString(string(semconv.K8SClusterNameKey)); ok { // Try for most to least specific k8s_container, k8s_pod, etc if _, ok := attrs.GetString(string(semconv.K8SContainerNameKey)); ok { return createMonitoredResource(k8sContainer, attrs) } else if _, ok := attrs.GetString(string(semconv.K8SPodNameKey)); ok { return createMonitoredResource(k8sPod, attrs) } else if _, ok := attrs.GetString(string(semconv.K8SNodeNameKey)); ok { return createMonitoredResource(k8sNode, attrs) } return createMonitoredResource(k8sCluster, attrs) } // Fallback to generic_task _, hasServiceName := attrs.GetString(string(semconv.ServiceNameKey)) _, hasFaaSName := attrs.GetString(string(semconv.FaaSNameKey)) _, hasServiceInstanceID := attrs.GetString(string(semconv.ServiceInstanceIDKey)) _, hasFaaSInstance := attrs.GetString(string(semconv.FaaSInstanceKey)) if (hasServiceName && hasServiceInstanceID) || (hasFaaSInstance && hasFaaSName) { return createMonitoredResource(genericTask, attrs) } // Everything else fallback to generic_node return createMonitoredResource(genericNode, attrs) } } func createMonitoredResource( monitoredResourceType string, resourceAttrs ReadOnlyAttributes, ) *monitoredrespb.MonitoredResource { mappings := monitoredResourceMappings[monitoredResourceType] mrLabels := make(map[string]string, len(mappings)) for mrKey, mappingConfig := range mappings { mrValue := "" ok := false // Coalesce the possible keys in order for _, otelKey := range mappingConfig.otelKeys { mrValue, ok = resourceAttrs.GetString(otelKey) if mrValue != "" && !strings.HasPrefix(mrValue, unknownServicePrefix) { break } } if mrValue == "" && contains(mappingConfig.otelKeys, string(semconv.ServiceNameKey)) { // the service name started with unknown_service, and was ignored above mrValue, ok = resourceAttrs.GetString(string(semconv.ServiceNameKey)) } if !ok || mrValue == "" { mrValue = mappingConfig.fallbackLiteral } mrLabels[mrKey] = sanitizeUTF8(mrValue) } return &monitoredrespb.MonitoredResource{ Type: monitoredResourceType, Labels: mrLabels, } } func contains(list []string, element string) bool { for _, item := range list { if item == element { return true } } return false } func sanitizeUTF8(s string) string { return strings.ToValidUTF8(s, "�") } ================================================ FILE: vendor/github.com/Microsoft/go-winio/.gitattributes ================================================ * text=auto eol=lf ================================================ FILE: vendor/github.com/Microsoft/go-winio/.gitignore ================================================ .vscode/ *.exe # testing testdata # go workspaces go.work go.work.sum ================================================ FILE: vendor/github.com/Microsoft/go-winio/.golangci.yml ================================================ linters: enable: # style - containedctx # struct contains a context - dupl # duplicate code - errname # erorrs are named correctly - nolintlint # "//nolint" directives are properly explained - revive # golint replacement - unconvert # unnecessary conversions - wastedassign # bugs, performance, unused, etc ... - contextcheck # function uses a non-inherited context - errorlint # errors not wrapped for 1.13 - exhaustive # check exhaustiveness of enum switch statements - gofmt # files are gofmt'ed - gosec # security - nilerr # returns nil even with non-nil error - thelper # test helpers without t.Helper() - unparam # unused function params issues: exclude-dirs: - pkg/etw/sample exclude-rules: # err is very often shadowed in nested scopes - linters: - govet text: '^shadow: declaration of "err" shadows declaration' # ignore long lines for skip autogen directives - linters: - revive text: "^line-length-limit: " source: "^//(go:generate|sys) " #TODO: remove after upgrading to go1.18 # ignore comment spacing for nolint and sys directives - linters: - revive text: "^comment-spacings: no space between comment delimiter and comment text" source: "//(cspell:|nolint:|sys |todo)" # not on go 1.18 yet, so no any - linters: - revive text: "^use-any: since GO 1.18 'interface{}' can be replaced by 'any'" # allow unjustified ignores of error checks in defer statements - linters: - nolintlint text: "^directive `//nolint:errcheck` should provide explanation" source: '^\s*defer ' # allow unjustified ignores of error lints for io.EOF - linters: - nolintlint text: "^directive `//nolint:errorlint` should provide explanation" source: '[=|!]= io.EOF' linters-settings: exhaustive: default-signifies-exhaustive: true govet: enable-all: true disable: # struct order is often for Win32 compat # also, ignore pointer bytes/GC issues for now until performance becomes an issue - fieldalignment nolintlint: require-explanation: true require-specific: true revive: # revive is more configurable than static check, so likely the preferred alternative to static-check # (once the perf issue is solved: https://github.com/golangci/golangci-lint/issues/2997) enable-all-rules: true # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md rules: # rules with required arguments - name: argument-limit disabled: true - name: banned-characters disabled: true - name: cognitive-complexity disabled: true - name: cyclomatic disabled: true - name: file-header disabled: true - name: function-length disabled: true - name: function-result-limit disabled: true - name: max-public-structs disabled: true # geneally annoying rules - name: add-constant # complains about any and all strings and integers disabled: true - name: confusing-naming # we frequently use "Foo()" and "foo()" together disabled: true - name: flag-parameter # excessive, and a common idiom we use disabled: true - name: unhandled-error # warns over common fmt.Print* and io.Close; rely on errcheck instead disabled: true # general config - name: line-length-limit arguments: - 140 - name: var-naming arguments: - [] - - CID - CRI - CTRD - DACL - DLL - DOS - ETW - FSCTL - GCS - GMSA - HCS - HV - IO - LCOW - LDAP - LPAC - LTSC - MMIO - NT - OCI - PMEM - PWSH - RX - SACl - SID - SMB - TX - VHD - VHDX - VMID - VPCI - WCOW - WIM ================================================ FILE: vendor/github.com/Microsoft/go-winio/CODEOWNERS ================================================ * @microsoft/containerplat ================================================ FILE: vendor/github.com/Microsoft/go-winio/LICENSE ================================================ The MIT License (MIT) Copyright (c) 2015 Microsoft Permission 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE 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. ================================================ FILE: vendor/github.com/Microsoft/go-winio/README.md ================================================ # go-winio [![Build Status](https://github.com/microsoft/go-winio/actions/workflows/ci.yml/badge.svg)](https://github.com/microsoft/go-winio/actions/workflows/ci.yml) This repository contains utilities for efficiently performing Win32 IO operations in Go. Currently, this is focused on accessing named pipes and other file handles, and for using named pipes as a net transport. This code relies on IO completion ports to avoid blocking IO on system threads, allowing Go to reuse the thread to schedule another goroutine. This limits support to Windows Vista and newer operating systems. This is similar to the implementation of network sockets in Go's net package. Please see the LICENSE file for licensing information. ## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit [Microsoft CLA](https://cla.microsoft.com). When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. Additionally, the pull request pipeline requires the following steps to be performed before mergining. ### Code Sign-Off We require that contributors sign their commits using [`git commit --signoff`][git-commit-s] to certify they either authored the work themselves or otherwise have permission to use it in this project. A range of commits can be signed off using [`git rebase --signoff`][git-rebase-s]. Please see [the developer certificate](https://developercertificate.org) for more info, as well as to make sure that you can attest to the rules listed. Our CI uses the DCO Github app to ensure that all commits in a given PR are signed-off. ### Linting Code must pass a linting stage, which uses [`golangci-lint`][lint]. The linting settings are stored in [`.golangci.yaml`](./.golangci.yaml), and can be run automatically with VSCode by adding the following to your workspace or folder settings: ```json "go.lintTool": "golangci-lint", "go.lintOnSave": "package", ``` Additional editor [integrations options are also available][lint-ide]. Alternatively, `golangci-lint` can be [installed locally][lint-install] and run from the repo root: ```shell # use . or specify a path to only lint a package # to show all lint errors, use flags "--max-issues-per-linter=0 --max-same-issues=0" > golangci-lint run ./... ``` ### Go Generate The pipeline checks that auto-generated code, via `go generate`, are up to date. This can be done for the entire repo: ```shell > go generate ./... ``` ## Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ## Special Thanks Thanks to [natefinch][natefinch] for the inspiration for this library. See [npipe](https://github.com/natefinch/npipe) for another named pipe implementation. [lint]: https://golangci-lint.run/ [lint-ide]: https://golangci-lint.run/usage/integrations/#editor-integration [lint-install]: https://golangci-lint.run/usage/install/#local-installation [git-commit-s]: https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s [git-rebase-s]: https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---signoff [natefinch]: https://github.com/natefinch ================================================ FILE: vendor/github.com/Microsoft/go-winio/SECURITY.md ================================================ ## Security Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. ## Reporting Security Issues **Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. ## Preferred Languages We prefer all communications to be in English. ## Policy Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). ================================================ FILE: vendor/github.com/Microsoft/go-winio/backup.go ================================================ //go:build windows // +build windows package winio import ( "encoding/binary" "errors" "fmt" "io" "os" "runtime" "unicode/utf16" "github.com/Microsoft/go-winio/internal/fs" "golang.org/x/sys/windows" ) //sys backupRead(h windows.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead //sys backupWrite(h windows.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupWrite const ( BackupData = uint32(iota + 1) BackupEaData BackupSecurity BackupAlternateData BackupLink BackupPropertyData BackupObjectId //revive:disable-line:var-naming ID, not Id BackupReparseData BackupSparseBlock BackupTxfsData ) const ( StreamSparseAttributes = uint32(8) ) //nolint:revive // var-naming: ALL_CAPS const ( WRITE_DAC = windows.WRITE_DAC WRITE_OWNER = windows.WRITE_OWNER ACCESS_SYSTEM_SECURITY = windows.ACCESS_SYSTEM_SECURITY ) // BackupHeader represents a backup stream of a file. type BackupHeader struct { //revive:disable-next-line:var-naming ID, not Id Id uint32 // The backup stream ID Attributes uint32 // Stream attributes Size int64 // The size of the stream in bytes Name string // The name of the stream (for BackupAlternateData only). Offset int64 // The offset of the stream in the file (for BackupSparseBlock only). } type win32StreamID struct { StreamID uint32 Attributes uint32 Size uint64 NameSize uint32 } // BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series // of BackupHeader values. type BackupStreamReader struct { r io.Reader bytesLeft int64 } // NewBackupStreamReader produces a BackupStreamReader from any io.Reader. func NewBackupStreamReader(r io.Reader) *BackupStreamReader { return &BackupStreamReader{r, 0} } // Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if // it was not completely read. func (r *BackupStreamReader) Next() (*BackupHeader, error) { if r.bytesLeft > 0 { //nolint:nestif // todo: flatten this if s, ok := r.r.(io.Seeker); ok { // Make sure Seek on io.SeekCurrent sometimes succeeds // before trying the actual seek. if _, err := s.Seek(0, io.SeekCurrent); err == nil { if _, err = s.Seek(r.bytesLeft, io.SeekCurrent); err != nil { return nil, err } r.bytesLeft = 0 } } if _, err := io.Copy(io.Discard, r); err != nil { return nil, err } } var wsi win32StreamID if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil { return nil, err } hdr := &BackupHeader{ Id: wsi.StreamID, Attributes: wsi.Attributes, Size: int64(wsi.Size), } if wsi.NameSize != 0 { name := make([]uint16, int(wsi.NameSize/2)) if err := binary.Read(r.r, binary.LittleEndian, name); err != nil { return nil, err } hdr.Name = windows.UTF16ToString(name) } if wsi.StreamID == BackupSparseBlock { if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil { return nil, err } hdr.Size -= 8 } r.bytesLeft = hdr.Size return hdr, nil } // Read reads from the current backup stream. func (r *BackupStreamReader) Read(b []byte) (int, error) { if r.bytesLeft == 0 { return 0, io.EOF } if int64(len(b)) > r.bytesLeft { b = b[:r.bytesLeft] } n, err := r.r.Read(b) r.bytesLeft -= int64(n) if err == io.EOF { err = io.ErrUnexpectedEOF } else if r.bytesLeft == 0 && err == nil { err = io.EOF } return n, err } // BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API. type BackupStreamWriter struct { w io.Writer bytesLeft int64 } // NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer. func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter { return &BackupStreamWriter{w, 0} } // WriteHeader writes the next backup stream header and prepares for calls to Write(). func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error { if w.bytesLeft != 0 { return fmt.Errorf("missing %d bytes", w.bytesLeft) } name := utf16.Encode([]rune(hdr.Name)) wsi := win32StreamID{ StreamID: hdr.Id, Attributes: hdr.Attributes, Size: uint64(hdr.Size), NameSize: uint32(len(name) * 2), } if hdr.Id == BackupSparseBlock { // Include space for the int64 block offset wsi.Size += 8 } if err := binary.Write(w.w, binary.LittleEndian, &wsi); err != nil { return err } if len(name) != 0 { if err := binary.Write(w.w, binary.LittleEndian, name); err != nil { return err } } if hdr.Id == BackupSparseBlock { if err := binary.Write(w.w, binary.LittleEndian, hdr.Offset); err != nil { return err } } w.bytesLeft = hdr.Size return nil } // Write writes to the current backup stream. func (w *BackupStreamWriter) Write(b []byte) (int, error) { if w.bytesLeft < int64(len(b)) { return 0, fmt.Errorf("too many bytes by %d", int64(len(b))-w.bytesLeft) } n, err := w.w.Write(b) w.bytesLeft -= int64(n) return n, err } // BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API. type BackupFileReader struct { f *os.File includeSecurity bool ctx uintptr } // NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true, // Read will attempt to read the security descriptor of the file. func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader { r := &BackupFileReader{f, includeSecurity, 0} return r } // Read reads a backup stream from the file by calling the Win32 API BackupRead(). func (r *BackupFileReader) Read(b []byte) (int, error) { var bytesRead uint32 err := backupRead(windows.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx) if err != nil { return 0, &os.PathError{Op: "BackupRead", Path: r.f.Name(), Err: err} } runtime.KeepAlive(r.f) if bytesRead == 0 { return 0, io.EOF } return int(bytesRead), nil } // Close frees Win32 resources associated with the BackupFileReader. It does not close // the underlying file. func (r *BackupFileReader) Close() error { if r.ctx != 0 { _ = backupRead(windows.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx) runtime.KeepAlive(r.f) r.ctx = 0 } return nil } // BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API. type BackupFileWriter struct { f *os.File includeSecurity bool ctx uintptr } // NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true, // Write() will attempt to restore the security descriptor from the stream. func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter { w := &BackupFileWriter{f, includeSecurity, 0} return w } // Write restores a portion of the file using the provided backup stream. func (w *BackupFileWriter) Write(b []byte) (int, error) { var bytesWritten uint32 err := backupWrite(windows.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx) if err != nil { return 0, &os.PathError{Op: "BackupWrite", Path: w.f.Name(), Err: err} } runtime.KeepAlive(w.f) if int(bytesWritten) != len(b) { return int(bytesWritten), errors.New("not all bytes could be written") } return len(b), nil } // Close frees Win32 resources associated with the BackupFileWriter. It does not // close the underlying file. func (w *BackupFileWriter) Close() error { if w.ctx != 0 { _ = backupWrite(windows.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx) runtime.KeepAlive(w.f) w.ctx = 0 } return nil } // OpenForBackup opens a file or directory, potentially skipping access checks if the backup // or restore privileges have been acquired. // // If the file opened was a directory, it cannot be used with Readdir(). func OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error) { h, err := fs.CreateFile(path, fs.AccessMask(access), fs.FileShareMode(share), nil, fs.FileCreationDisposition(createmode), fs.FILE_FLAG_BACKUP_SEMANTICS|fs.FILE_FLAG_OPEN_REPARSE_POINT, 0, ) if err != nil { err = &os.PathError{Op: "open", Path: path, Err: err} return nil, err } return os.NewFile(uintptr(h), path), nil } ================================================ FILE: vendor/github.com/Microsoft/go-winio/backuptar/doc.go ================================================ // This file only exists to allow go get on non-Windows platforms. package backuptar ================================================ FILE: vendor/github.com/Microsoft/go-winio/backuptar/strconv.go ================================================ //go:build windows package backuptar import ( "archive/tar" "fmt" "strconv" "strings" "time" ) // Functions copied from https://github.com/golang/go/blob/master/src/archive/tar/strconv.go // as we need to manage the LIBARCHIVE.creationtime PAXRecord manually. // Idea taken from containerd which did the same thing. // parsePAXTime takes a string of the form %d.%d as described in the PAX // specification. Note that this implementation allows for negative timestamps, // which is allowed for by the PAX specification, but not always portable. func parsePAXTime(s string) (time.Time, error) { const maxNanoSecondDigits = 9 // Split string into seconds and sub-seconds parts. ss, sn := s, "" if pos := strings.IndexByte(s, '.'); pos >= 0 { ss, sn = s[:pos], s[pos+1:] } // Parse the seconds. secs, err := strconv.ParseInt(ss, 10, 64) if err != nil { return time.Time{}, tar.ErrHeader } if len(sn) == 0 { return time.Unix(secs, 0), nil // No sub-second values } // Parse the nanoseconds. if strings.Trim(sn, "0123456789") != "" { return time.Time{}, tar.ErrHeader } if len(sn) < maxNanoSecondDigits { sn += strings.Repeat("0", maxNanoSecondDigits-len(sn)) // Right pad } else { sn = sn[:maxNanoSecondDigits] // Right truncate } nsecs, _ := strconv.ParseInt(sn, 10, 64) // Must succeed if len(ss) > 0 && ss[0] == '-' { return time.Unix(secs, -1*nsecs), nil // Negative correction } return time.Unix(secs, nsecs), nil } // formatPAXTime converts ts into a time of the form %d.%d as described in the // PAX specification. This function is capable of negative timestamps. func formatPAXTime(ts time.Time) (s string) { secs, nsecs := ts.Unix(), ts.Nanosecond() if nsecs == 0 { return strconv.FormatInt(secs, 10) } // If seconds is negative, then perform correction. sign := "" if secs < 0 { sign = "-" // Remember sign secs = -(secs + 1) // Add a second to secs nsecs = -(nsecs - 1e9) // Take that second away from nsecs } return strings.TrimRight(fmt.Sprintf("%s%d.%09d", sign, secs, nsecs), "0") } ================================================ FILE: vendor/github.com/Microsoft/go-winio/backuptar/tar.go ================================================ //go:build windows // +build windows package backuptar import ( "archive/tar" "encoding/base64" "fmt" "io" "path/filepath" "strconv" "strings" "time" "github.com/Microsoft/go-winio" "golang.org/x/sys/windows" ) //nolint:deadcode,varcheck // keep unused constants for potential future use const ( cISUID = 0004000 // Set uid cISGID = 0002000 // Set gid cISVTX = 0001000 // Save text (sticky bit) cISDIR = 0040000 // Directory cISFIFO = 0010000 // FIFO cISREG = 0100000 // Regular file cISLNK = 0120000 // Symbolic link cISBLK = 0060000 // Block special file cISCHR = 0020000 // Character special file cISSOCK = 0140000 // Socket ) const ( hdrFileAttributes = "MSWINDOWS.fileattr" hdrSecurityDescriptor = "MSWINDOWS.sd" hdrRawSecurityDescriptor = "MSWINDOWS.rawsd" hdrMountPoint = "MSWINDOWS.mountpoint" hdrEaPrefix = "MSWINDOWS.xattr." hdrCreationTime = "LIBARCHIVE.creationtime" ) // zeroReader is an io.Reader that always returns 0s. type zeroReader struct{} func (zeroReader) Read(b []byte) (int, error) { for i := range b { b[i] = 0 } return len(b), nil } func copySparse(t *tar.Writer, br *winio.BackupStreamReader) error { curOffset := int64(0) for { bhdr, err := br.Next() if err == io.EOF { //nolint:errorlint err = io.ErrUnexpectedEOF } if err != nil { return err } if bhdr.Id != winio.BackupSparseBlock { return fmt.Errorf("unexpected stream %d", bhdr.Id) } // We can't seek backwards, since we have already written that data to the tar.Writer. if bhdr.Offset < curOffset { return fmt.Errorf("cannot seek back from %d to %d", curOffset, bhdr.Offset) } // archive/tar does not support writing sparse files // so just write zeroes to catch up to the current offset. if _, err = io.CopyN(t, zeroReader{}, bhdr.Offset-curOffset); err != nil { return fmt.Errorf("seek to offset %d: %w", bhdr.Offset, err) } if bhdr.Size == 0 { // A sparse block with size = 0 is used to mark the end of the sparse blocks. break } n, err := io.Copy(t, br) if err != nil { return err } if n != bhdr.Size { return fmt.Errorf("copied %d bytes instead of %d at offset %d", n, bhdr.Size, bhdr.Offset) } curOffset = bhdr.Offset + n } return nil } // BasicInfoHeader creates a tar header from basic file information. func BasicInfoHeader(name string, size int64, fileInfo *winio.FileBasicInfo) *tar.Header { hdr := &tar.Header{ Format: tar.FormatPAX, Name: filepath.ToSlash(name), Size: size, Typeflag: tar.TypeReg, ModTime: time.Unix(0, fileInfo.LastWriteTime.Nanoseconds()), ChangeTime: time.Unix(0, fileInfo.ChangeTime.Nanoseconds()), AccessTime: time.Unix(0, fileInfo.LastAccessTime.Nanoseconds()), PAXRecords: make(map[string]string), } hdr.PAXRecords[hdrFileAttributes] = fmt.Sprintf("%d", fileInfo.FileAttributes) hdr.PAXRecords[hdrCreationTime] = formatPAXTime(time.Unix(0, fileInfo.CreationTime.Nanoseconds())) if (fileInfo.FileAttributes & windows.FILE_ATTRIBUTE_DIRECTORY) != 0 { hdr.Mode |= cISDIR hdr.Size = 0 hdr.Typeflag = tar.TypeDir } return hdr } // SecurityDescriptorFromTarHeader reads the SDDL associated with the header of the current file // from the tar header and returns the security descriptor into a byte slice. func SecurityDescriptorFromTarHeader(hdr *tar.Header) ([]byte, error) { if sdraw, ok := hdr.PAXRecords[hdrRawSecurityDescriptor]; ok { sd, err := base64.StdEncoding.DecodeString(sdraw) if err != nil { // Not returning sd as-is in the error-case, as base64.DecodeString // may return partially decoded data (not nil or empty slice) in case // of a failure: https://github.com/golang/go/blob/go1.17.7/src/encoding/base64/base64.go#L382-L387 return nil, err } return sd, nil } // Maintaining old SDDL-based behavior for backward compatibility. All new // tar headers written by this library will have raw binary for the security // descriptor. if sddl, ok := hdr.PAXRecords[hdrSecurityDescriptor]; ok { return winio.SddlToSecurityDescriptor(sddl) } return nil, nil } // ExtendedAttributesFromTarHeader reads the EAs associated with the header of the // current file from the tar header and returns it as a byte slice. func ExtendedAttributesFromTarHeader(hdr *tar.Header) ([]byte, error) { var eas []winio.ExtendedAttribute //nolint:prealloc // len(eas) <= len(hdr.PAXRecords); prealloc is wasteful for k, v := range hdr.PAXRecords { if !strings.HasPrefix(k, hdrEaPrefix) { continue } data, err := base64.StdEncoding.DecodeString(v) if err != nil { return nil, err } eas = append(eas, winio.ExtendedAttribute{ Name: k[len(hdrEaPrefix):], Value: data, }) } var eaData []byte var err error if len(eas) != 0 { eaData, err = winio.EncodeExtendedAttributes(eas) if err != nil { return nil, err } } return eaData, nil } // EncodeReparsePointFromTarHeader reads the ReparsePoint structure from the tar header // and encodes it into a byte slice. The file for which this function is called must be a // symlink. func EncodeReparsePointFromTarHeader(hdr *tar.Header) []byte { _, isMountPoint := hdr.PAXRecords[hdrMountPoint] rp := winio.ReparsePoint{ Target: filepath.FromSlash(hdr.Linkname), IsMountPoint: isMountPoint, } return winio.EncodeReparsePoint(&rp) } // WriteTarFileFromBackupStream writes a file to a tar writer using data from a Win32 backup stream. // // This encodes Win32 metadata as tar pax vendor extensions starting with MSWINDOWS. // // The additional Win32 metadata is: // // - MSWINDOWS.fileattr: The Win32 file attributes, as a decimal value // - MSWINDOWS.rawsd: The Win32 security descriptor, in raw binary format // - MSWINDOWS.mountpoint: If present, this is a mount point and not a symlink, even though the type is '2' (symlink) func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size int64, fileInfo *winio.FileBasicInfo) error { name = filepath.ToSlash(name) hdr := BasicInfoHeader(name, size, fileInfo) // If r can be seeked, then this function is two-pass: pass 1 collects the // tar header data, and pass 2 copies the data stream. If r cannot be // seeked, then some header data (in particular EAs) will be silently lost. var ( restartPos int64 err error ) sr, readTwice := r.(io.Seeker) if readTwice { if restartPos, err = sr.Seek(0, io.SeekCurrent); err != nil { readTwice = false } } br := winio.NewBackupStreamReader(r) var dataHdr *winio.BackupHeader for dataHdr == nil { bhdr, err := br.Next() if err == io.EOF { //nolint:errorlint break } if err != nil { return err } switch bhdr.Id { case winio.BackupData: hdr.Mode |= cISREG if !readTwice { dataHdr = bhdr } case winio.BackupSecurity: sd, err := io.ReadAll(br) if err != nil { return err } hdr.PAXRecords[hdrRawSecurityDescriptor] = base64.StdEncoding.EncodeToString(sd) case winio.BackupReparseData: hdr.Mode |= cISLNK hdr.Typeflag = tar.TypeSymlink reparseBuffer, _ := io.ReadAll(br) rp, err := winio.DecodeReparsePoint(reparseBuffer) if err != nil { return err } if rp.IsMountPoint { hdr.PAXRecords[hdrMountPoint] = "1" } hdr.Linkname = rp.Target case winio.BackupEaData: eab, err := io.ReadAll(br) if err != nil { return err } eas, err := winio.DecodeExtendedAttributes(eab) if err != nil { return err } for _, ea := range eas { // Use base64 encoding for the binary value. Note that there // is no way to encode the EA's flags, since their use doesn't // make any sense for persisted EAs. hdr.PAXRecords[hdrEaPrefix+ea.Name] = base64.StdEncoding.EncodeToString(ea.Value) } case winio.BackupAlternateData, winio.BackupLink, winio.BackupPropertyData, winio.BackupObjectId, winio.BackupTxfsData: // ignore these streams default: return fmt.Errorf("%s: unknown stream ID %d", name, bhdr.Id) } } err = t.WriteHeader(hdr) if err != nil { return err } if readTwice { // Get back to the data stream. if _, err = sr.Seek(restartPos, io.SeekStart); err != nil { return err } for dataHdr == nil { bhdr, err := br.Next() if err == io.EOF { //nolint:errorlint break } if err != nil { return err } if bhdr.Id == winio.BackupData { dataHdr = bhdr } } } // The logic for copying file contents is fairly complicated due to the need for handling sparse files, // and the weird ways they are represented by BackupRead. A normal file will always either have a data stream // with size and content, or no data stream at all (if empty). However, for a sparse file, the content can also // be represented using a series of sparse block streams following the data stream. Additionally, the way sparse // files are handled by BackupRead has changed in the OS recently. The specifics of the representation are described // in the list at the bottom of this block comment. // // Sparse files can be represented in four different ways, based on the specifics of the file. // - Size = 0: // Previously: BackupRead yields no data stream and no sparse block streams. // Recently: BackupRead yields a data stream with size = 0. There are no following sparse block streams. // - Size > 0, no allocated ranges: // BackupRead yields a data stream with size = 0. Following is a single sparse block stream with // size = 0 and offset = . // - Size > 0, one allocated range: // BackupRead yields a data stream with size = containing the file contents. There are no // sparse block streams. This is the case if you take a normal file with contents and simply set the // sparse flag on it. // - Size > 0, multiple allocated ranges: // BackupRead yields a data stream with size = 0. Following are sparse block streams for each allocated // range of the file containing the range contents. Finally there is a sparse block stream with // size = 0 and offset = . if dataHdr != nil { //nolint:nestif // todo: reduce nesting complexity // A data stream was found. Copy the data. // We assume that we will either have a data stream size > 0 XOR have sparse block streams. if dataHdr.Size > 0 || (dataHdr.Attributes&winio.StreamSparseAttributes) == 0 { if size != dataHdr.Size { return fmt.Errorf("%s: mismatch between file size %d and header size %d", name, size, dataHdr.Size) } if _, err = io.Copy(t, br); err != nil { return fmt.Errorf("%s: copying contents from data stream: %w", name, err) } } else if size > 0 { // As of a recent OS change, BackupRead now returns a data stream for empty sparse files. // These files have no sparse block streams, so skip the copySparse call if file size = 0. if err = copySparse(t, br); err != nil { return fmt.Errorf("%s: copying contents from sparse block stream: %w", name, err) } } } // Look for streams after the data stream. The only ones we handle are alternate data streams. // Other streams may have metadata that could be serialized, but the tar header has already // been written. In practice, this means that we don't get EA or TXF metadata. for { bhdr, err := br.Next() if err == io.EOF { //nolint:errorlint break } if err != nil { return err } switch bhdr.Id { case winio.BackupAlternateData: if (bhdr.Attributes & winio.StreamSparseAttributes) != 0 { // Unsupported for now, since the size of the alternate stream is not present // in the backup stream until after the data has been read. return fmt.Errorf("%s: tar of sparse alternate data streams is unsupported", name) } altName := strings.TrimSuffix(bhdr.Name, ":$DATA") hdr = &tar.Header{ Format: hdr.Format, Name: name + altName, Mode: hdr.Mode, Typeflag: tar.TypeReg, Size: bhdr.Size, ModTime: hdr.ModTime, AccessTime: hdr.AccessTime, ChangeTime: hdr.ChangeTime, } err = t.WriteHeader(hdr) if err != nil { return err } _, err = io.Copy(t, br) if err != nil { return err } case winio.BackupEaData, winio.BackupLink, winio.BackupPropertyData, winio.BackupObjectId, winio.BackupTxfsData: // ignore these streams default: return fmt.Errorf("%s: unknown stream ID %d after data", name, bhdr.Id) } } return nil } // FileInfoFromHeader retrieves basic Win32 file information from a tar header, using the additional metadata written by // WriteTarFileFromBackupStream. func FileInfoFromHeader(hdr *tar.Header) (name string, size int64, fileInfo *winio.FileBasicInfo, err error) { name = hdr.Name if hdr.Typeflag == tar.TypeReg { size = hdr.Size } fileInfo = &winio.FileBasicInfo{ LastAccessTime: windows.NsecToFiletime(hdr.AccessTime.UnixNano()), LastWriteTime: windows.NsecToFiletime(hdr.ModTime.UnixNano()), ChangeTime: windows.NsecToFiletime(hdr.ChangeTime.UnixNano()), // Default to ModTime, we'll pull hdrCreationTime below if present CreationTime: windows.NsecToFiletime(hdr.ModTime.UnixNano()), } if attrStr, ok := hdr.PAXRecords[hdrFileAttributes]; ok { attr, err := strconv.ParseUint(attrStr, 10, 32) if err != nil { return "", 0, nil, err } fileInfo.FileAttributes = uint32(attr) } else { if hdr.Typeflag == tar.TypeDir { fileInfo.FileAttributes |= windows.FILE_ATTRIBUTE_DIRECTORY } } if creationTimeStr, ok := hdr.PAXRecords[hdrCreationTime]; ok { creationTime, err := parsePAXTime(creationTimeStr) if err != nil { return "", 0, nil, err } fileInfo.CreationTime = windows.NsecToFiletime(creationTime.UnixNano()) } return name, size, fileInfo, err } // WriteBackupStreamFromTarFile writes a Win32 backup stream from the current tar file. Since this function may process multiple // tar file entries in order to collect all the alternate data streams for the file, it returns the next // tar file that was not processed, or io.EOF is there are no more. func WriteBackupStreamFromTarFile(w io.Writer, t *tar.Reader, hdr *tar.Header) (*tar.Header, error) { bw := winio.NewBackupStreamWriter(w) sd, err := SecurityDescriptorFromTarHeader(hdr) if err != nil { return nil, err } if len(sd) != 0 { bhdr := winio.BackupHeader{ Id: winio.BackupSecurity, Size: int64(len(sd)), } err := bw.WriteHeader(&bhdr) if err != nil { return nil, err } _, err = bw.Write(sd) if err != nil { return nil, err } } eadata, err := ExtendedAttributesFromTarHeader(hdr) if err != nil { return nil, err } if len(eadata) != 0 { bhdr := winio.BackupHeader{ Id: winio.BackupEaData, Size: int64(len(eadata)), } err = bw.WriteHeader(&bhdr) if err != nil { return nil, err } _, err = bw.Write(eadata) if err != nil { return nil, err } } if hdr.Typeflag == tar.TypeSymlink { reparse := EncodeReparsePointFromTarHeader(hdr) bhdr := winio.BackupHeader{ Id: winio.BackupReparseData, Size: int64(len(reparse)), } err := bw.WriteHeader(&bhdr) if err != nil { return nil, err } _, err = bw.Write(reparse) if err != nil { return nil, err } } if hdr.Typeflag == tar.TypeReg { bhdr := winio.BackupHeader{ Id: winio.BackupData, Size: hdr.Size, } err := bw.WriteHeader(&bhdr) if err != nil { return nil, err } _, err = io.Copy(bw, t) if err != nil { return nil, err } } // Copy all the alternate data streams and return the next non-ADS header. for { ahdr, err := t.Next() if err != nil { return nil, err } if ahdr.Typeflag != tar.TypeReg || !strings.HasPrefix(ahdr.Name, hdr.Name+":") { return ahdr, nil } bhdr := winio.BackupHeader{ Id: winio.BackupAlternateData, Size: ahdr.Size, Name: ahdr.Name[len(hdr.Name):] + ":$DATA", } err = bw.WriteHeader(&bhdr) if err != nil { return nil, err } _, err = io.Copy(bw, t) if err != nil { return nil, err } } } ================================================ FILE: vendor/github.com/Microsoft/go-winio/doc.go ================================================ // This package provides utilities for efficiently performing Win32 IO operations in Go. // Currently, this package is provides support for genreal IO and management of // - named pipes // - files // - [Hyper-V sockets] // // This code is similar to Go's [net] package, and uses IO completion ports to avoid // blocking IO on system threads, allowing Go to reuse the thread to schedule other goroutines. // // This limits support to Windows Vista and newer operating systems. // // Additionally, this package provides support for: // - creating and managing GUIDs // - writing to [ETW] // - opening and manageing VHDs // - parsing [Windows Image files] // - auto-generating Win32 API code // // [Hyper-V sockets]: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service // [ETW]: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/event-tracing-for-windows--etw- // [Windows Image files]: https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/work-with-windows-images package winio ================================================ FILE: vendor/github.com/Microsoft/go-winio/ea.go ================================================ package winio import ( "bytes" "encoding/binary" "errors" ) type fileFullEaInformation struct { NextEntryOffset uint32 Flags uint8 NameLength uint8 ValueLength uint16 } var ( fileFullEaInformationSize = binary.Size(&fileFullEaInformation{}) errInvalidEaBuffer = errors.New("invalid extended attribute buffer") errEaNameTooLarge = errors.New("extended attribute name too large") errEaValueTooLarge = errors.New("extended attribute value too large") ) // ExtendedAttribute represents a single Windows EA. type ExtendedAttribute struct { Name string Value []byte Flags uint8 } func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) { var info fileFullEaInformation err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info) if err != nil { err = errInvalidEaBuffer return ea, nb, err } nameOffset := fileFullEaInformationSize nameLen := int(info.NameLength) valueOffset := nameOffset + int(info.NameLength) + 1 valueLen := int(info.ValueLength) nextOffset := int(info.NextEntryOffset) if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) { err = errInvalidEaBuffer return ea, nb, err } ea.Name = string(b[nameOffset : nameOffset+nameLen]) ea.Value = b[valueOffset : valueOffset+valueLen] ea.Flags = info.Flags if info.NextEntryOffset != 0 { nb = b[info.NextEntryOffset:] } return ea, nb, err } // DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION // buffer retrieved from BackupRead, ZwQueryEaFile, etc. func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) { for len(b) != 0 { ea, nb, err := parseEa(b) if err != nil { return nil, err } eas = append(eas, ea) b = nb } return eas, err } func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error { if int(uint8(len(ea.Name))) != len(ea.Name) { return errEaNameTooLarge } if int(uint16(len(ea.Value))) != len(ea.Value) { return errEaValueTooLarge } entrySize := uint32(fileFullEaInformationSize + len(ea.Name) + 1 + len(ea.Value)) withPadding := (entrySize + 3) &^ 3 nextOffset := uint32(0) if !last { nextOffset = withPadding } info := fileFullEaInformation{ NextEntryOffset: nextOffset, Flags: ea.Flags, NameLength: uint8(len(ea.Name)), ValueLength: uint16(len(ea.Value)), } err := binary.Write(buf, binary.LittleEndian, &info) if err != nil { return err } _, err = buf.Write([]byte(ea.Name)) if err != nil { return err } err = buf.WriteByte(0) if err != nil { return err } _, err = buf.Write(ea.Value) if err != nil { return err } _, err = buf.Write([]byte{0, 0, 0}[0 : withPadding-entrySize]) if err != nil { return err } return nil } // EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION // buffer for use with BackupWrite, ZwSetEaFile, etc. func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) { var buf bytes.Buffer for i := range eas { last := false if i == len(eas)-1 { last = true } err := writeEa(&buf, &eas[i], last) if err != nil { return nil, err } } return buf.Bytes(), nil } ================================================ FILE: vendor/github.com/Microsoft/go-winio/file.go ================================================ //go:build windows // +build windows package winio import ( "errors" "io" "runtime" "sync" "sync/atomic" "syscall" "time" "golang.org/x/sys/windows" ) //sys cancelIoEx(file windows.Handle, o *windows.Overlapped) (err error) = CancelIoEx //sys createIoCompletionPort(file windows.Handle, port windows.Handle, key uintptr, threadCount uint32) (newport windows.Handle, err error) = CreateIoCompletionPort //sys getQueuedCompletionStatus(port windows.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus //sys setFileCompletionNotificationModes(h windows.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes //sys wsaGetOverlappedResult(h windows.Handle, o *windows.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult var ( ErrFileClosed = errors.New("file has already been closed") ErrTimeout = &timeoutError{} ) type timeoutError struct{} func (*timeoutError) Error() string { return "i/o timeout" } func (*timeoutError) Timeout() bool { return true } func (*timeoutError) Temporary() bool { return true } type timeoutChan chan struct{} var ioInitOnce sync.Once var ioCompletionPort windows.Handle // ioResult contains the result of an asynchronous IO operation. type ioResult struct { bytes uint32 err error } // ioOperation represents an outstanding asynchronous Win32 IO. type ioOperation struct { o windows.Overlapped ch chan ioResult } func initIO() { h, err := createIoCompletionPort(windows.InvalidHandle, 0, 0, 0xffffffff) if err != nil { panic(err) } ioCompletionPort = h go ioCompletionProcessor(h) } // win32File implements Reader, Writer, and Closer on a Win32 handle without blocking in a syscall. // It takes ownership of this handle and will close it if it is garbage collected. type win32File struct { handle windows.Handle wg sync.WaitGroup wgLock sync.RWMutex closing atomic.Bool socket bool readDeadline deadlineHandler writeDeadline deadlineHandler } type deadlineHandler struct { setLock sync.Mutex channel timeoutChan channelLock sync.RWMutex timer *time.Timer timedout atomic.Bool } // makeWin32File makes a new win32File from an existing file handle. func makeWin32File(h windows.Handle) (*win32File, error) { f := &win32File{handle: h} ioInitOnce.Do(initIO) _, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff) if err != nil { return nil, err } err = setFileCompletionNotificationModes(h, windows.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS|windows.FILE_SKIP_SET_EVENT_ON_HANDLE) if err != nil { return nil, err } f.readDeadline.channel = make(timeoutChan) f.writeDeadline.channel = make(timeoutChan) return f, nil } // Deprecated: use NewOpenFile instead. func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) { return NewOpenFile(windows.Handle(h)) } func NewOpenFile(h windows.Handle) (io.ReadWriteCloser, error) { // If we return the result of makeWin32File directly, it can result in an // interface-wrapped nil, rather than a nil interface value. f, err := makeWin32File(h) if err != nil { return nil, err } return f, nil } // closeHandle closes the resources associated with a Win32 handle. func (f *win32File) closeHandle() { f.wgLock.Lock() // Atomically set that we are closing, releasing the resources only once. if !f.closing.Swap(true) { f.wgLock.Unlock() // cancel all IO and wait for it to complete _ = cancelIoEx(f.handle, nil) f.wg.Wait() // at this point, no new IO can start windows.Close(f.handle) f.handle = 0 } else { f.wgLock.Unlock() } } // Close closes a win32File. func (f *win32File) Close() error { f.closeHandle() return nil } // IsClosed checks if the file has been closed. func (f *win32File) IsClosed() bool { return f.closing.Load() } // prepareIO prepares for a new IO operation. // The caller must call f.wg.Done() when the IO is finished, prior to Close() returning. func (f *win32File) prepareIO() (*ioOperation, error) { f.wgLock.RLock() if f.closing.Load() { f.wgLock.RUnlock() return nil, ErrFileClosed } f.wg.Add(1) f.wgLock.RUnlock() c := &ioOperation{} c.ch = make(chan ioResult) return c, nil } // ioCompletionProcessor processes completed async IOs forever. func ioCompletionProcessor(h windows.Handle) { for { var bytes uint32 var key uintptr var op *ioOperation err := getQueuedCompletionStatus(h, &bytes, &key, &op, windows.INFINITE) if op == nil { panic(err) } op.ch <- ioResult{bytes, err} } } // todo: helsaawy - create an asyncIO version that takes a context // asyncIO processes the return value from ReadFile or WriteFile, blocking until // the operation has actually completed. func (f *win32File) asyncIO(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) { if err != windows.ERROR_IO_PENDING { //nolint:errorlint // err is Errno return int(bytes), err } if f.closing.Load() { _ = cancelIoEx(f.handle, &c.o) } var timeout timeoutChan if d != nil { d.channelLock.Lock() timeout = d.channel d.channelLock.Unlock() } var r ioResult select { case r = <-c.ch: err = r.err if err == windows.ERROR_OPERATION_ABORTED { //nolint:errorlint // err is Errno if f.closing.Load() { err = ErrFileClosed } } else if err != nil && f.socket { // err is from Win32. Query the overlapped structure to get the winsock error. var bytes, flags uint32 err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags) } case <-timeout: _ = cancelIoEx(f.handle, &c.o) r = <-c.ch err = r.err if err == windows.ERROR_OPERATION_ABORTED { //nolint:errorlint // err is Errno err = ErrTimeout } } // runtime.KeepAlive is needed, as c is passed via native // code to ioCompletionProcessor, c must remain alive // until the channel read is complete. // todo: (de)allocate *ioOperation via win32 heap functions, instead of needing to KeepAlive? runtime.KeepAlive(c) return int(r.bytes), err } // Read reads from a file handle. func (f *win32File) Read(b []byte) (int, error) { c, err := f.prepareIO() if err != nil { return 0, err } defer f.wg.Done() if f.readDeadline.timedout.Load() { return 0, ErrTimeout } var bytes uint32 err = windows.ReadFile(f.handle, b, &bytes, &c.o) n, err := f.asyncIO(c, &f.readDeadline, bytes, err) runtime.KeepAlive(b) // Handle EOF conditions. if err == nil && n == 0 && len(b) != 0 { return 0, io.EOF } else if err == windows.ERROR_BROKEN_PIPE { //nolint:errorlint // err is Errno return 0, io.EOF } return n, err } // Write writes to a file handle. func (f *win32File) Write(b []byte) (int, error) { c, err := f.prepareIO() if err != nil { return 0, err } defer f.wg.Done() if f.writeDeadline.timedout.Load() { return 0, ErrTimeout } var bytes uint32 err = windows.WriteFile(f.handle, b, &bytes, &c.o) n, err := f.asyncIO(c, &f.writeDeadline, bytes, err) runtime.KeepAlive(b) return n, err } func (f *win32File) SetReadDeadline(deadline time.Time) error { return f.readDeadline.set(deadline) } func (f *win32File) SetWriteDeadline(deadline time.Time) error { return f.writeDeadline.set(deadline) } func (f *win32File) Flush() error { return windows.FlushFileBuffers(f.handle) } func (f *win32File) Fd() uintptr { return uintptr(f.handle) } func (d *deadlineHandler) set(deadline time.Time) error { d.setLock.Lock() defer d.setLock.Unlock() if d.timer != nil { if !d.timer.Stop() { <-d.channel } d.timer = nil } d.timedout.Store(false) select { case <-d.channel: d.channelLock.Lock() d.channel = make(chan struct{}) d.channelLock.Unlock() default: } if deadline.IsZero() { return nil } timeoutIO := func() { d.timedout.Store(true) close(d.channel) } now := time.Now() duration := deadline.Sub(now) if deadline.After(now) { // Deadline is in the future, set a timer to wait d.timer = time.AfterFunc(duration, timeoutIO) } else { // Deadline is in the past. Cancel all pending IO now. timeoutIO() } return nil } ================================================ FILE: vendor/github.com/Microsoft/go-winio/fileinfo.go ================================================ //go:build windows // +build windows package winio import ( "os" "runtime" "unsafe" "golang.org/x/sys/windows" ) // FileBasicInfo contains file access time and file attributes information. type FileBasicInfo struct { CreationTime, LastAccessTime, LastWriteTime, ChangeTime windows.Filetime FileAttributes uint32 _ uint32 // padding } // alignedFileBasicInfo is a FileBasicInfo, but aligned to uint64 by containing // uint64 rather than windows.Filetime. Filetime contains two uint32s. uint64 // alignment is necessary to pass this as FILE_BASIC_INFO. type alignedFileBasicInfo struct { CreationTime, LastAccessTime, LastWriteTime, ChangeTime uint64 FileAttributes uint32 _ uint32 // padding } // GetFileBasicInfo retrieves times and attributes for a file. func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) { bi := &alignedFileBasicInfo{} if err := windows.GetFileInformationByHandleEx( windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi)), ); err != nil { return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} } runtime.KeepAlive(f) // Reinterpret the alignedFileBasicInfo as a FileBasicInfo so it matches the // public API of this module. The data may be unnecessarily aligned. return (*FileBasicInfo)(unsafe.Pointer(bi)), nil } // SetFileBasicInfo sets times and attributes for a file. func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error { // Create an alignedFileBasicInfo based on a FileBasicInfo. The copy is // suitable to pass to GetFileInformationByHandleEx. biAligned := *(*alignedFileBasicInfo)(unsafe.Pointer(bi)) if err := windows.SetFileInformationByHandle( windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(&biAligned)), uint32(unsafe.Sizeof(biAligned)), ); err != nil { return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err} } runtime.KeepAlive(f) return nil } // FileStandardInfo contains extended information for the file. // FILE_STANDARD_INFO in WinBase.h // https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_standard_info type FileStandardInfo struct { AllocationSize, EndOfFile int64 NumberOfLinks uint32 DeletePending, Directory bool } // GetFileStandardInfo retrieves ended information for the file. func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) { si := &FileStandardInfo{} if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileStandardInfo, (*byte)(unsafe.Pointer(si)), uint32(unsafe.Sizeof(*si))); err != nil { return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} } runtime.KeepAlive(f) return si, nil } // FileIDInfo contains the volume serial number and file ID for a file. This pair should be // unique on a system. type FileIDInfo struct { VolumeSerialNumber uint64 FileID [16]byte } // GetFileID retrieves the unique (volume, file ID) pair for a file. func GetFileID(f *os.File) (*FileIDInfo, error) { fileID := &FileIDInfo{} if err := windows.GetFileInformationByHandleEx( windows.Handle(f.Fd()), windows.FileIdInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID)), ); err != nil { return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} } runtime.KeepAlive(f) return fileID, nil } ================================================ FILE: vendor/github.com/Microsoft/go-winio/hvsock.go ================================================ //go:build windows // +build windows package winio import ( "context" "errors" "fmt" "io" "net" "os" "time" "unsafe" "golang.org/x/sys/windows" "github.com/Microsoft/go-winio/internal/socket" "github.com/Microsoft/go-winio/pkg/guid" ) const afHVSock = 34 // AF_HYPERV // Well known Service and VM IDs // https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service#vmid-wildcards // HvsockGUIDWildcard is the wildcard VmId for accepting connections from all partitions. func HvsockGUIDWildcard() guid.GUID { // 00000000-0000-0000-0000-000000000000 return guid.GUID{} } // HvsockGUIDBroadcast is the wildcard VmId for broadcasting sends to all partitions. func HvsockGUIDBroadcast() guid.GUID { // ffffffff-ffff-ffff-ffff-ffffffffffff return guid.GUID{ Data1: 0xffffffff, Data2: 0xffff, Data3: 0xffff, Data4: [8]uint8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, } } // HvsockGUIDLoopback is the Loopback VmId for accepting connections to the same partition as the connector. func HvsockGUIDLoopback() guid.GUID { // e0e16197-dd56-4a10-9195-5ee7a155a838 return guid.GUID{ Data1: 0xe0e16197, Data2: 0xdd56, Data3: 0x4a10, Data4: [8]uint8{0x91, 0x95, 0x5e, 0xe7, 0xa1, 0x55, 0xa8, 0x38}, } } // HvsockGUIDSiloHost is the address of a silo's host partition: // - The silo host of a hosted silo is the utility VM. // - The silo host of a silo on a physical host is the physical host. func HvsockGUIDSiloHost() guid.GUID { // 36bd0c5c-7276-4223-88ba-7d03b654c568 return guid.GUID{ Data1: 0x36bd0c5c, Data2: 0x7276, Data3: 0x4223, Data4: [8]byte{0x88, 0xba, 0x7d, 0x03, 0xb6, 0x54, 0xc5, 0x68}, } } // HvsockGUIDChildren is the wildcard VmId for accepting connections from the connector's child partitions. func HvsockGUIDChildren() guid.GUID { // 90db8b89-0d35-4f79-8ce9-49ea0ac8b7cd return guid.GUID{ Data1: 0x90db8b89, Data2: 0xd35, Data3: 0x4f79, Data4: [8]uint8{0x8c, 0xe9, 0x49, 0xea, 0xa, 0xc8, 0xb7, 0xcd}, } } // HvsockGUIDParent is the wildcard VmId for accepting connections from the connector's parent partition. // Listening on this VmId accepts connection from: // - Inside silos: silo host partition. // - Inside hosted silo: host of the VM. // - Inside VM: VM host. // - Physical host: Not supported. func HvsockGUIDParent() guid.GUID { // a42e7cda-d03f-480c-9cc2-a4de20abb878 return guid.GUID{ Data1: 0xa42e7cda, Data2: 0xd03f, Data3: 0x480c, Data4: [8]uint8{0x9c, 0xc2, 0xa4, 0xde, 0x20, 0xab, 0xb8, 0x78}, } } // hvsockVsockServiceTemplate is the Service GUID used for the VSOCK protocol. func hvsockVsockServiceTemplate() guid.GUID { // 00000000-facb-11e6-bd58-64006a7986d3 return guid.GUID{ Data2: 0xfacb, Data3: 0x11e6, Data4: [8]uint8{0xbd, 0x58, 0x64, 0x00, 0x6a, 0x79, 0x86, 0xd3}, } } // An HvsockAddr is an address for a AF_HYPERV socket. type HvsockAddr struct { VMID guid.GUID ServiceID guid.GUID } type rawHvsockAddr struct { Family uint16 _ uint16 VMID guid.GUID ServiceID guid.GUID } var _ socket.RawSockaddr = &rawHvsockAddr{} // Network returns the address's network name, "hvsock". func (*HvsockAddr) Network() string { return "hvsock" } func (addr *HvsockAddr) String() string { return fmt.Sprintf("%s:%s", &addr.VMID, &addr.ServiceID) } // VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port. func VsockServiceID(port uint32) guid.GUID { g := hvsockVsockServiceTemplate() // make a copy g.Data1 = port return g } func (addr *HvsockAddr) raw() rawHvsockAddr { return rawHvsockAddr{ Family: afHVSock, VMID: addr.VMID, ServiceID: addr.ServiceID, } } func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) { addr.VMID = raw.VMID addr.ServiceID = raw.ServiceID } // Sockaddr returns a pointer to and the size of this struct. // // Implements the [socket.RawSockaddr] interface, and allows use in // [socket.Bind] and [socket.ConnectEx]. func (r *rawHvsockAddr) Sockaddr() (unsafe.Pointer, int32, error) { return unsafe.Pointer(r), int32(unsafe.Sizeof(rawHvsockAddr{})), nil } // Sockaddr interface allows use with `sockets.Bind()` and `.ConnectEx()`. func (r *rawHvsockAddr) FromBytes(b []byte) error { n := int(unsafe.Sizeof(rawHvsockAddr{})) if len(b) < n { return fmt.Errorf("got %d, want %d: %w", len(b), n, socket.ErrBufferSize) } copy(unsafe.Slice((*byte)(unsafe.Pointer(r)), n), b[:n]) if r.Family != afHVSock { return fmt.Errorf("got %d, want %d: %w", r.Family, afHVSock, socket.ErrAddrFamily) } return nil } // HvsockListener is a socket listener for the AF_HYPERV address family. type HvsockListener struct { sock *win32File addr HvsockAddr } var _ net.Listener = &HvsockListener{} // HvsockConn is a connected socket of the AF_HYPERV address family. type HvsockConn struct { sock *win32File local, remote HvsockAddr } var _ net.Conn = &HvsockConn{} func newHVSocket() (*win32File, error) { fd, err := windows.Socket(afHVSock, windows.SOCK_STREAM, 1) if err != nil { return nil, os.NewSyscallError("socket", err) } f, err := makeWin32File(fd) if err != nil { windows.Close(fd) return nil, err } f.socket = true return f, nil } // ListenHvsock listens for connections on the specified hvsock address. func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) { l := &HvsockListener{addr: *addr} var sock *win32File sock, err = newHVSocket() if err != nil { return nil, l.opErr("listen", err) } defer func() { if err != nil { _ = sock.Close() } }() sa := addr.raw() err = socket.Bind(sock.handle, &sa) if err != nil { return nil, l.opErr("listen", os.NewSyscallError("socket", err)) } err = windows.Listen(sock.handle, 16) if err != nil { return nil, l.opErr("listen", os.NewSyscallError("listen", err)) } return &HvsockListener{sock: sock, addr: *addr}, nil } func (l *HvsockListener) opErr(op string, err error) error { return &net.OpError{Op: op, Net: "hvsock", Addr: &l.addr, Err: err} } // Addr returns the listener's network address. func (l *HvsockListener) Addr() net.Addr { return &l.addr } // Accept waits for the next connection and returns it. func (l *HvsockListener) Accept() (_ net.Conn, err error) { sock, err := newHVSocket() if err != nil { return nil, l.opErr("accept", err) } defer func() { if sock != nil { sock.Close() } }() c, err := l.sock.prepareIO() if err != nil { return nil, l.opErr("accept", err) } defer l.sock.wg.Done() // AcceptEx, per documentation, requires an extra 16 bytes per address. // // https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-acceptex const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{})) var addrbuf [addrlen * 2]byte var bytes uint32 err = windows.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0 /* rxdatalen */, addrlen, addrlen, &bytes, &c.o) if _, err = l.sock.asyncIO(c, nil, bytes, err); err != nil { return nil, l.opErr("accept", os.NewSyscallError("acceptex", err)) } conn := &HvsockConn{ sock: sock, } // The local address returned in the AcceptEx buffer is the same as the Listener socket's // address. However, the service GUID reported by GetSockName is different from the Listeners // socket, and is sometimes the same as the local address of the socket that dialed the // address, with the service GUID.Data1 incremented, but othertimes is different. // todo: does the local address matter? is the listener's address or the actual address appropriate? conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0]))) conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen]))) // initialize the accepted socket and update its properties with those of the listening socket if err = windows.Setsockopt(sock.handle, windows.SOL_SOCKET, windows.SO_UPDATE_ACCEPT_CONTEXT, (*byte)(unsafe.Pointer(&l.sock.handle)), int32(unsafe.Sizeof(l.sock.handle))); err != nil { return nil, conn.opErr("accept", os.NewSyscallError("setsockopt", err)) } sock = nil return conn, nil } // Close closes the listener, causing any pending Accept calls to fail. func (l *HvsockListener) Close() error { return l.sock.Close() } // HvsockDialer configures and dials a Hyper-V Socket (ie, [HvsockConn]). type HvsockDialer struct { // Deadline is the time the Dial operation must connect before erroring. Deadline time.Time // Retries is the number of additional connects to try if the connection times out, is refused, // or the host is unreachable Retries uint // RetryWait is the time to wait after a connection error to retry RetryWait time.Duration rt *time.Timer // redial wait timer } // Dial the Hyper-V socket at addr. // // See [HvsockDialer.Dial] for more information. func Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err error) { return (&HvsockDialer{}).Dial(ctx, addr) } // Dial attempts to connect to the Hyper-V socket at addr, and returns a connection if successful. // Will attempt (HvsockDialer).Retries if dialing fails, waiting (HvsockDialer).RetryWait between // retries. // // Dialing can be cancelled either by providing (HvsockDialer).Deadline, or cancelling ctx. func (d *HvsockDialer) Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err error) { op := "dial" // create the conn early to use opErr() conn = &HvsockConn{ remote: *addr, } if !d.Deadline.IsZero() { var cancel context.CancelFunc ctx, cancel = context.WithDeadline(ctx, d.Deadline) defer cancel() } // preemptive timeout/cancellation check if err = ctx.Err(); err != nil { return nil, conn.opErr(op, err) } sock, err := newHVSocket() if err != nil { return nil, conn.opErr(op, err) } defer func() { if sock != nil { sock.Close() } }() sa := addr.raw() err = socket.Bind(sock.handle, &sa) if err != nil { return nil, conn.opErr(op, os.NewSyscallError("bind", err)) } c, err := sock.prepareIO() if err != nil { return nil, conn.opErr(op, err) } defer sock.wg.Done() var bytes uint32 for i := uint(0); i <= d.Retries; i++ { err = socket.ConnectEx( sock.handle, &sa, nil, // sendBuf 0, // sendDataLen &bytes, (*windows.Overlapped)(unsafe.Pointer(&c.o))) _, err = sock.asyncIO(c, nil, bytes, err) if i < d.Retries && canRedial(err) { if err = d.redialWait(ctx); err == nil { continue } } break } if err != nil { return nil, conn.opErr(op, os.NewSyscallError("connectex", err)) } // update the connection properties, so shutdown can be used if err = windows.Setsockopt( sock.handle, windows.SOL_SOCKET, windows.SO_UPDATE_CONNECT_CONTEXT, nil, // optvalue 0, // optlen ); err != nil { return nil, conn.opErr(op, os.NewSyscallError("setsockopt", err)) } // get the local name var sal rawHvsockAddr err = socket.GetSockName(sock.handle, &sal) if err != nil { return nil, conn.opErr(op, os.NewSyscallError("getsockname", err)) } conn.local.fromRaw(&sal) // one last check for timeout, since asyncIO doesn't check the context if err = ctx.Err(); err != nil { return nil, conn.opErr(op, err) } conn.sock = sock sock = nil return conn, nil } // redialWait waits before attempting to redial, resetting the timer as appropriate. func (d *HvsockDialer) redialWait(ctx context.Context) (err error) { if d.RetryWait == 0 { return nil } if d.rt == nil { d.rt = time.NewTimer(d.RetryWait) } else { // should already be stopped and drained d.rt.Reset(d.RetryWait) } select { case <-ctx.Done(): case <-d.rt.C: return nil } // stop and drain the timer if !d.rt.Stop() { <-d.rt.C } return ctx.Err() } // assumes error is a plain, unwrapped windows.Errno provided by direct syscall. func canRedial(err error) bool { //nolint:errorlint // guaranteed to be an Errno switch err { case windows.WSAECONNREFUSED, windows.WSAENETUNREACH, windows.WSAETIMEDOUT, windows.ERROR_CONNECTION_REFUSED, windows.ERROR_CONNECTION_UNAVAIL: return true default: return false } } func (conn *HvsockConn) opErr(op string, err error) error { // translate from "file closed" to "socket closed" if errors.Is(err, ErrFileClosed) { err = socket.ErrSocketClosed } return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err} } func (conn *HvsockConn) Read(b []byte) (int, error) { c, err := conn.sock.prepareIO() if err != nil { return 0, conn.opErr("read", err) } defer conn.sock.wg.Done() buf := windows.WSABuf{Buf: &b[0], Len: uint32(len(b))} var flags, bytes uint32 err = windows.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil) n, err := conn.sock.asyncIO(c, &conn.sock.readDeadline, bytes, err) if err != nil { var eno windows.Errno if errors.As(err, &eno) { err = os.NewSyscallError("wsarecv", eno) } return 0, conn.opErr("read", err) } else if n == 0 { err = io.EOF } return n, err } func (conn *HvsockConn) Write(b []byte) (int, error) { t := 0 for len(b) != 0 { n, err := conn.write(b) if err != nil { return t + n, err } t += n b = b[n:] } return t, nil } func (conn *HvsockConn) write(b []byte) (int, error) { c, err := conn.sock.prepareIO() if err != nil { return 0, conn.opErr("write", err) } defer conn.sock.wg.Done() buf := windows.WSABuf{Buf: &b[0], Len: uint32(len(b))} var bytes uint32 err = windows.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil) n, err := conn.sock.asyncIO(c, &conn.sock.writeDeadline, bytes, err) if err != nil { var eno windows.Errno if errors.As(err, &eno) { err = os.NewSyscallError("wsasend", eno) } return 0, conn.opErr("write", err) } return n, err } // Close closes the socket connection, failing any pending read or write calls. func (conn *HvsockConn) Close() error { return conn.sock.Close() } func (conn *HvsockConn) IsClosed() bool { return conn.sock.IsClosed() } // shutdown disables sending or receiving on a socket. func (conn *HvsockConn) shutdown(how int) error { if conn.IsClosed() { return socket.ErrSocketClosed } err := windows.Shutdown(conn.sock.handle, how) if err != nil { // If the connection was closed, shutdowns fail with "not connected" if errors.Is(err, windows.WSAENOTCONN) || errors.Is(err, windows.WSAESHUTDOWN) { err = socket.ErrSocketClosed } return os.NewSyscallError("shutdown", err) } return nil } // CloseRead shuts down the read end of the socket, preventing future read operations. func (conn *HvsockConn) CloseRead() error { err := conn.shutdown(windows.SHUT_RD) if err != nil { return conn.opErr("closeread", err) } return nil } // CloseWrite shuts down the write end of the socket, preventing future write operations and // notifying the other endpoint that no more data will be written. func (conn *HvsockConn) CloseWrite() error { err := conn.shutdown(windows.SHUT_WR) if err != nil { return conn.opErr("closewrite", err) } return nil } // LocalAddr returns the local address of the connection. func (conn *HvsockConn) LocalAddr() net.Addr { return &conn.local } // RemoteAddr returns the remote address of the connection. func (conn *HvsockConn) RemoteAddr() net.Addr { return &conn.remote } // SetDeadline implements the net.Conn SetDeadline method. func (conn *HvsockConn) SetDeadline(t time.Time) error { // todo: implement `SetDeadline` for `win32File` if err := conn.SetReadDeadline(t); err != nil { return fmt.Errorf("set read deadline: %w", err) } if err := conn.SetWriteDeadline(t); err != nil { return fmt.Errorf("set write deadline: %w", err) } return nil } // SetReadDeadline implements the net.Conn SetReadDeadline method. func (conn *HvsockConn) SetReadDeadline(t time.Time) error { return conn.sock.SetReadDeadline(t) } // SetWriteDeadline implements the net.Conn SetWriteDeadline method. func (conn *HvsockConn) SetWriteDeadline(t time.Time) error { return conn.sock.SetWriteDeadline(t) } ================================================ FILE: vendor/github.com/Microsoft/go-winio/internal/fs/doc.go ================================================ // This package contains Win32 filesystem functionality. package fs ================================================ FILE: vendor/github.com/Microsoft/go-winio/internal/fs/fs.go ================================================ //go:build windows package fs import ( "golang.org/x/sys/windows" "github.com/Microsoft/go-winio/internal/stringbuffer" ) //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go fs.go // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew //sys CreateFile(name string, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) [failretval==windows.InvalidHandle] = CreateFileW const NullHandle windows.Handle = 0 // AccessMask defines standard, specific, and generic rights. // // Used with CreateFile and NtCreateFile (and co.). // // Bitmask: // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 // +---------------+---------------+-------------------------------+ // |G|G|G|G|Resvd|A| StandardRights| SpecificRights | // |R|W|E|A| |S| | | // +-+-------------+---------------+-------------------------------+ // // GR Generic Read // GW Generic Write // GE Generic Exectue // GA Generic All // Resvd Reserved // AS Access Security System // // https://learn.microsoft.com/en-us/windows/win32/secauthz/access-mask // // https://learn.microsoft.com/en-us/windows/win32/secauthz/generic-access-rights // // https://learn.microsoft.com/en-us/windows/win32/fileio/file-access-rights-constants type AccessMask = windows.ACCESS_MASK //nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. const ( // Not actually any. // // For CreateFile: "query certain metadata such as file, directory, or device attributes without accessing that file or device" // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#parameters FILE_ANY_ACCESS AccessMask = 0 GENERIC_READ AccessMask = 0x8000_0000 GENERIC_WRITE AccessMask = 0x4000_0000 GENERIC_EXECUTE AccessMask = 0x2000_0000 GENERIC_ALL AccessMask = 0x1000_0000 ACCESS_SYSTEM_SECURITY AccessMask = 0x0100_0000 // Specific Object Access // from ntioapi.h FILE_READ_DATA AccessMask = (0x0001) // file & pipe FILE_LIST_DIRECTORY AccessMask = (0x0001) // directory FILE_WRITE_DATA AccessMask = (0x0002) // file & pipe FILE_ADD_FILE AccessMask = (0x0002) // directory FILE_APPEND_DATA AccessMask = (0x0004) // file FILE_ADD_SUBDIRECTORY AccessMask = (0x0004) // directory FILE_CREATE_PIPE_INSTANCE AccessMask = (0x0004) // named pipe FILE_READ_EA AccessMask = (0x0008) // file & directory FILE_READ_PROPERTIES AccessMask = FILE_READ_EA FILE_WRITE_EA AccessMask = (0x0010) // file & directory FILE_WRITE_PROPERTIES AccessMask = FILE_WRITE_EA FILE_EXECUTE AccessMask = (0x0020) // file FILE_TRAVERSE AccessMask = (0x0020) // directory FILE_DELETE_CHILD AccessMask = (0x0040) // directory FILE_READ_ATTRIBUTES AccessMask = (0x0080) // all FILE_WRITE_ATTRIBUTES AccessMask = (0x0100) // all FILE_ALL_ACCESS AccessMask = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) FILE_GENERIC_READ AccessMask = (STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE) FILE_GENERIC_WRITE AccessMask = (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE) FILE_GENERIC_EXECUTE AccessMask = (STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE) SPECIFIC_RIGHTS_ALL AccessMask = 0x0000FFFF // Standard Access // from ntseapi.h DELETE AccessMask = 0x0001_0000 READ_CONTROL AccessMask = 0x0002_0000 WRITE_DAC AccessMask = 0x0004_0000 WRITE_OWNER AccessMask = 0x0008_0000 SYNCHRONIZE AccessMask = 0x0010_0000 STANDARD_RIGHTS_REQUIRED AccessMask = 0x000F_0000 STANDARD_RIGHTS_READ AccessMask = READ_CONTROL STANDARD_RIGHTS_WRITE AccessMask = READ_CONTROL STANDARD_RIGHTS_EXECUTE AccessMask = READ_CONTROL STANDARD_RIGHTS_ALL AccessMask = 0x001F_0000 ) type FileShareMode uint32 //nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. const ( FILE_SHARE_NONE FileShareMode = 0x00 FILE_SHARE_READ FileShareMode = 0x01 FILE_SHARE_WRITE FileShareMode = 0x02 FILE_SHARE_DELETE FileShareMode = 0x04 FILE_SHARE_VALID_FLAGS FileShareMode = 0x07 ) type FileCreationDisposition uint32 //nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. const ( // from winbase.h CREATE_NEW FileCreationDisposition = 0x01 CREATE_ALWAYS FileCreationDisposition = 0x02 OPEN_EXISTING FileCreationDisposition = 0x03 OPEN_ALWAYS FileCreationDisposition = 0x04 TRUNCATE_EXISTING FileCreationDisposition = 0x05 ) // Create disposition values for NtCreate* type NTFileCreationDisposition uint32 //nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. const ( // From ntioapi.h FILE_SUPERSEDE NTFileCreationDisposition = 0x00 FILE_OPEN NTFileCreationDisposition = 0x01 FILE_CREATE NTFileCreationDisposition = 0x02 FILE_OPEN_IF NTFileCreationDisposition = 0x03 FILE_OVERWRITE NTFileCreationDisposition = 0x04 FILE_OVERWRITE_IF NTFileCreationDisposition = 0x05 FILE_MAXIMUM_DISPOSITION NTFileCreationDisposition = 0x05 ) // CreateFile and co. take flags or attributes together as one parameter. // Define alias until we can use generics to allow both // // https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants type FileFlagOrAttribute uint32 //nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. const ( // from winnt.h FILE_FLAG_WRITE_THROUGH FileFlagOrAttribute = 0x8000_0000 FILE_FLAG_OVERLAPPED FileFlagOrAttribute = 0x4000_0000 FILE_FLAG_NO_BUFFERING FileFlagOrAttribute = 0x2000_0000 FILE_FLAG_RANDOM_ACCESS FileFlagOrAttribute = 0x1000_0000 FILE_FLAG_SEQUENTIAL_SCAN FileFlagOrAttribute = 0x0800_0000 FILE_FLAG_DELETE_ON_CLOSE FileFlagOrAttribute = 0x0400_0000 FILE_FLAG_BACKUP_SEMANTICS FileFlagOrAttribute = 0x0200_0000 FILE_FLAG_POSIX_SEMANTICS FileFlagOrAttribute = 0x0100_0000 FILE_FLAG_OPEN_REPARSE_POINT FileFlagOrAttribute = 0x0020_0000 FILE_FLAG_OPEN_NO_RECALL FileFlagOrAttribute = 0x0010_0000 FILE_FLAG_FIRST_PIPE_INSTANCE FileFlagOrAttribute = 0x0008_0000 ) // NtCreate* functions take a dedicated CreateOptions parameter. // // https://learn.microsoft.com/en-us/windows/win32/api/Winternl/nf-winternl-ntcreatefile // // https://learn.microsoft.com/en-us/windows/win32/devnotes/nt-create-named-pipe-file type NTCreateOptions uint32 //nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. const ( // From ntioapi.h FILE_DIRECTORY_FILE NTCreateOptions = 0x0000_0001 FILE_WRITE_THROUGH NTCreateOptions = 0x0000_0002 FILE_SEQUENTIAL_ONLY NTCreateOptions = 0x0000_0004 FILE_NO_INTERMEDIATE_BUFFERING NTCreateOptions = 0x0000_0008 FILE_SYNCHRONOUS_IO_ALERT NTCreateOptions = 0x0000_0010 FILE_SYNCHRONOUS_IO_NONALERT NTCreateOptions = 0x0000_0020 FILE_NON_DIRECTORY_FILE NTCreateOptions = 0x0000_0040 FILE_CREATE_TREE_CONNECTION NTCreateOptions = 0x0000_0080 FILE_COMPLETE_IF_OPLOCKED NTCreateOptions = 0x0000_0100 FILE_NO_EA_KNOWLEDGE NTCreateOptions = 0x0000_0200 FILE_DISABLE_TUNNELING NTCreateOptions = 0x0000_0400 FILE_RANDOM_ACCESS NTCreateOptions = 0x0000_0800 FILE_DELETE_ON_CLOSE NTCreateOptions = 0x0000_1000 FILE_OPEN_BY_FILE_ID NTCreateOptions = 0x0000_2000 FILE_OPEN_FOR_BACKUP_INTENT NTCreateOptions = 0x0000_4000 FILE_NO_COMPRESSION NTCreateOptions = 0x0000_8000 ) type FileSQSFlag = FileFlagOrAttribute //nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. const ( // from winbase.h SECURITY_ANONYMOUS FileSQSFlag = FileSQSFlag(SecurityAnonymous << 16) SECURITY_IDENTIFICATION FileSQSFlag = FileSQSFlag(SecurityIdentification << 16) SECURITY_IMPERSONATION FileSQSFlag = FileSQSFlag(SecurityImpersonation << 16) SECURITY_DELEGATION FileSQSFlag = FileSQSFlag(SecurityDelegation << 16) SECURITY_SQOS_PRESENT FileSQSFlag = 0x0010_0000 SECURITY_VALID_SQOS_FLAGS FileSQSFlag = 0x001F_0000 ) // GetFinalPathNameByHandle flags // // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew#parameters type GetFinalPathFlag uint32 //nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API. const ( GetFinalPathDefaultFlag GetFinalPathFlag = 0x0 FILE_NAME_NORMALIZED GetFinalPathFlag = 0x0 FILE_NAME_OPENED GetFinalPathFlag = 0x8 VOLUME_NAME_DOS GetFinalPathFlag = 0x0 VOLUME_NAME_GUID GetFinalPathFlag = 0x1 VOLUME_NAME_NT GetFinalPathFlag = 0x2 VOLUME_NAME_NONE GetFinalPathFlag = 0x4 ) // getFinalPathNameByHandle facilitates calling the Windows API GetFinalPathNameByHandle // with the given handle and flags. It transparently takes care of creating a buffer of the // correct size for the call. // // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew func GetFinalPathNameByHandle(h windows.Handle, flags GetFinalPathFlag) (string, error) { b := stringbuffer.NewWString() //TODO: can loop infinitely if Win32 keeps returning the same (or a larger) n? for { n, err := windows.GetFinalPathNameByHandle(h, b.Pointer(), b.Cap(), uint32(flags)) if err != nil { return "", err } // If the buffer wasn't large enough, n will be the total size needed (including null terminator). // Resize and try again. if n > b.Cap() { b.ResizeTo(n) continue } // If the buffer is large enough, n will be the size not including the null terminator. // Convert to a Go string and return. return b.String(), nil } } ================================================ FILE: vendor/github.com/Microsoft/go-winio/internal/fs/security.go ================================================ package fs // https://learn.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level type SecurityImpersonationLevel int32 // C default enums underlying type is `int`, which is Go `int32` // Impersonation levels const ( SecurityAnonymous SecurityImpersonationLevel = 0 SecurityIdentification SecurityImpersonationLevel = 1 SecurityImpersonation SecurityImpersonationLevel = 2 SecurityDelegation SecurityImpersonationLevel = 3 ) ================================================ FILE: vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package fs import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modkernel32 = windows.NewLazySystemDLL("kernel32.dll") procCreateFileW = modkernel32.NewProc("CreateFileW") ) func CreateFile(name string, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(name) if err != nil { return } return _CreateFile(_p0, access, mode, sa, createmode, attrs, templatefile) } func _CreateFile(name *uint16, access AccessMask, mode FileShareMode, sa *windows.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) { r0, _, e1 := syscall.SyscallN(procCreateFileW.Addr(), uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile)) handle = windows.Handle(r0) if handle == windows.InvalidHandle { err = errnoErr(e1) } return } ================================================ FILE: vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go ================================================ package socket import ( "unsafe" ) // RawSockaddr allows structs to be used with [Bind] and [ConnectEx]. The // struct must meet the Win32 sockaddr requirements specified here: // https://docs.microsoft.com/en-us/windows/win32/winsock/sockaddr-2 // // Specifically, the struct size must be least larger than an int16 (unsigned short) // for the address family. type RawSockaddr interface { // Sockaddr returns a pointer to the RawSockaddr and its struct size, allowing // for the RawSockaddr's data to be overwritten by syscalls (if necessary). // // It is the callers responsibility to validate that the values are valid; invalid // pointers or size can cause a panic. Sockaddr() (unsafe.Pointer, int32, error) } ================================================ FILE: vendor/github.com/Microsoft/go-winio/internal/socket/socket.go ================================================ //go:build windows package socket import ( "errors" "fmt" "net" "sync" "syscall" "unsafe" "github.com/Microsoft/go-winio/pkg/guid" "golang.org/x/sys/windows" ) //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go socket.go //sys getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) [failretval==socketError] = ws2_32.getsockname //sys getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) [failretval==socketError] = ws2_32.getpeername //sys bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind const socketError = uintptr(^uint32(0)) var ( // todo(helsaawy): create custom error types to store the desired vs actual size and addr family? ErrBufferSize = errors.New("buffer size") ErrAddrFamily = errors.New("address family") ErrInvalidPointer = errors.New("invalid pointer") ErrSocketClosed = fmt.Errorf("socket closed: %w", net.ErrClosed) ) // todo(helsaawy): replace these with generics, ie: GetSockName[S RawSockaddr](s windows.Handle) (S, error) // GetSockName writes the local address of socket s to the [RawSockaddr] rsa. // If rsa is not large enough, the [windows.WSAEFAULT] is returned. func GetSockName(s windows.Handle, rsa RawSockaddr) error { ptr, l, err := rsa.Sockaddr() if err != nil { return fmt.Errorf("could not retrieve socket pointer and size: %w", err) } // although getsockname returns WSAEFAULT if the buffer is too small, it does not set // &l to the correct size, so--apart from doubling the buffer repeatedly--there is no remedy return getsockname(s, ptr, &l) } // GetPeerName returns the remote address the socket is connected to. // // See [GetSockName] for more information. func GetPeerName(s windows.Handle, rsa RawSockaddr) error { ptr, l, err := rsa.Sockaddr() if err != nil { return fmt.Errorf("could not retrieve socket pointer and size: %w", err) } return getpeername(s, ptr, &l) } func Bind(s windows.Handle, rsa RawSockaddr) (err error) { ptr, l, err := rsa.Sockaddr() if err != nil { return fmt.Errorf("could not retrieve socket pointer and size: %w", err) } return bind(s, ptr, l) } // "golang.org/x/sys/windows".ConnectEx and .Bind only accept internal implementations of the // their sockaddr interface, so they cannot be used with HvsockAddr // Replicate functionality here from // https://cs.opensource.google/go/x/sys/+/master:windows/syscall_windows.go // The function pointers to `AcceptEx`, `ConnectEx` and `GetAcceptExSockaddrs` must be loaded at // runtime via a WSAIoctl call: // https://docs.microsoft.com/en-us/windows/win32/api/Mswsock/nc-mswsock-lpfn_connectex#remarks type runtimeFunc struct { id guid.GUID once sync.Once addr uintptr err error } func (f *runtimeFunc) Load() error { f.once.Do(func() { var s windows.Handle s, f.err = windows.Socket(windows.AF_INET, windows.SOCK_STREAM, windows.IPPROTO_TCP) if f.err != nil { return } defer windows.CloseHandle(s) //nolint:errcheck var n uint32 f.err = windows.WSAIoctl(s, windows.SIO_GET_EXTENSION_FUNCTION_POINTER, (*byte)(unsafe.Pointer(&f.id)), uint32(unsafe.Sizeof(f.id)), (*byte)(unsafe.Pointer(&f.addr)), uint32(unsafe.Sizeof(f.addr)), &n, nil, // overlapped 0, // completionRoutine ) }) return f.err } var ( // todo: add `AcceptEx` and `GetAcceptExSockaddrs` WSAID_CONNECTEX = guid.GUID{ //revive:disable-line:var-naming ALL_CAPS Data1: 0x25a207b9, Data2: 0xddf3, Data3: 0x4660, Data4: [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}, } connectExFunc = runtimeFunc{id: WSAID_CONNECTEX} ) func ConnectEx( fd windows.Handle, rsa RawSockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *windows.Overlapped, ) error { if err := connectExFunc.Load(); err != nil { return fmt.Errorf("failed to load ConnectEx function pointer: %w", err) } ptr, n, err := rsa.Sockaddr() if err != nil { return err } return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped) } // BOOL LpfnConnectex( // [in] SOCKET s, // [in] const sockaddr *name, // [in] int namelen, // [in, optional] PVOID lpSendBuffer, // [in] DWORD dwSendDataLength, // [out] LPDWORD lpdwBytesSent, // [in] LPOVERLAPPED lpOverlapped // ) func connectEx( s windows.Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *windows.Overlapped, ) (err error) { r1, _, e1 := syscall.SyscallN(connectExFunc.addr, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), ) if r1 == 0 { if e1 != 0 { err = error(e1) } else { err = syscall.EINVAL } } return err } ================================================ FILE: vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package socket import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modws2_32 = windows.NewLazySystemDLL("ws2_32.dll") procbind = modws2_32.NewProc("bind") procgetpeername = modws2_32.NewProc("getpeername") procgetsockname = modws2_32.NewProc("getsockname") ) func bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) { r1, _, e1 := syscall.SyscallN(procbind.Addr(), uintptr(s), uintptr(name), uintptr(namelen)) if r1 == socketError { err = errnoErr(e1) } return } func getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) { r1, _, e1 := syscall.SyscallN(procgetpeername.Addr(), uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen))) if r1 == socketError { err = errnoErr(e1) } return } func getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) { r1, _, e1 := syscall.SyscallN(procgetsockname.Addr(), uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen))) if r1 == socketError { err = errnoErr(e1) } return } ================================================ FILE: vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go ================================================ package stringbuffer import ( "sync" "unicode/utf16" ) // TODO: worth exporting and using in mkwinsyscall? // Uint16BufferSize is the buffer size in the pool, chosen somewhat arbitrarily to accommodate // large path strings: // MAX_PATH (260) + size of volume GUID prefix (49) + null terminator = 310. const MinWStringCap = 310 // use *[]uint16 since []uint16 creates an extra allocation where the slice header // is copied to heap and then referenced via pointer in the interface header that sync.Pool // stores. var pathPool = sync.Pool{ // if go1.18+ adds Pool[T], use that to store []uint16 directly New: func() interface{} { b := make([]uint16, MinWStringCap) return &b }, } func newBuffer() []uint16 { return *(pathPool.Get().(*[]uint16)) } // freeBuffer copies the slice header data, and puts a pointer to that in the pool. // This avoids taking a pointer to the slice header in WString, which can be set to nil. func freeBuffer(b []uint16) { pathPool.Put(&b) } // WString is a wide string buffer ([]uint16) meant for storing UTF-16 encoded strings // for interacting with Win32 APIs. // Sizes are specified as uint32 and not int. // // It is not thread safe. type WString struct { // type-def allows casting to []uint16 directly, use struct to prevent that and allow adding fields in the future. // raw buffer b []uint16 } // NewWString returns a [WString] allocated from a shared pool with an // initial capacity of at least [MinWStringCap]. // Since the buffer may have been previously used, its contents are not guaranteed to be empty. // // The buffer should be freed via [WString.Free] func NewWString() *WString { return &WString{ b: newBuffer(), } } func (b *WString) Free() { if b.empty() { return } freeBuffer(b.b) b.b = nil } // ResizeTo grows the buffer to at least c and returns the new capacity, freeing the // previous buffer back into pool. func (b *WString) ResizeTo(c uint32) uint32 { // already sufficient (or n is 0) if c <= b.Cap() { return b.Cap() } if c <= MinWStringCap { c = MinWStringCap } // allocate at-least double buffer size, as is done in [bytes.Buffer] and other places if c <= 2*b.Cap() { c = 2 * b.Cap() } b2 := make([]uint16, c) if !b.empty() { copy(b2, b.b) freeBuffer(b.b) } b.b = b2 return c } // Buffer returns the underlying []uint16 buffer. func (b *WString) Buffer() []uint16 { if b.empty() { return nil } return b.b } // Pointer returns a pointer to the first uint16 in the buffer. // If the [WString.Free] has already been called, the pointer will be nil. func (b *WString) Pointer() *uint16 { if b.empty() { return nil } return &b.b[0] } // String returns the returns the UTF-8 encoding of the UTF-16 string in the buffer. // // It assumes that the data is null-terminated. func (b *WString) String() string { // Using [windows.UTF16ToString] would require importing "golang.org/x/sys/windows" // and would make this code Windows-only, which makes no sense. // So copy UTF16ToString code into here. // If other windows-specific code is added, switch to [windows.UTF16ToString] s := b.b for i, v := range s { if v == 0 { s = s[:i] break } } return string(utf16.Decode(s)) } // Cap returns the underlying buffer capacity. func (b *WString) Cap() uint32 { if b.empty() { return 0 } return b.cap() } func (b *WString) cap() uint32 { return uint32(cap(b.b)) } func (b *WString) empty() bool { return b == nil || b.cap() == 0 } ================================================ FILE: vendor/github.com/Microsoft/go-winio/pipe.go ================================================ //go:build windows // +build windows package winio import ( "context" "errors" "fmt" "io" "net" "os" "runtime" "time" "unsafe" "golang.org/x/sys/windows" "github.com/Microsoft/go-winio/internal/fs" ) //sys connectNamedPipe(pipe windows.Handle, o *windows.Overlapped) (err error) = ConnectNamedPipe //sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *windows.SecurityAttributes) (handle windows.Handle, err error) [failretval==windows.InvalidHandle] = CreateNamedPipeW //sys disconnectNamedPipe(pipe windows.Handle) (err error) = DisconnectNamedPipe //sys getNamedPipeInfo(pipe windows.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo //sys getNamedPipeHandleState(pipe windows.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW //sys ntCreateNamedPipeFile(pipe *windows.Handle, access ntAccessMask, oa *objectAttributes, iosb *ioStatusBlock, share ntFileShareMode, disposition ntFileCreationDisposition, options ntFileOptions, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntStatus) = ntdll.NtCreateNamedPipeFile //sys rtlNtStatusToDosError(status ntStatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb //sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntStatus) = ntdll.RtlDosPathNameToNtPathName_U //sys rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) = ntdll.RtlDefaultNpAcl type PipeConn interface { net.Conn Disconnect() error Flush() error } // type aliases for mkwinsyscall code type ( ntAccessMask = fs.AccessMask ntFileShareMode = fs.FileShareMode ntFileCreationDisposition = fs.NTFileCreationDisposition ntFileOptions = fs.NTCreateOptions ) type ioStatusBlock struct { Status, Information uintptr } // typedef struct _OBJECT_ATTRIBUTES { // ULONG Length; // HANDLE RootDirectory; // PUNICODE_STRING ObjectName; // ULONG Attributes; // PVOID SecurityDescriptor; // PVOID SecurityQualityOfService; // } OBJECT_ATTRIBUTES; // // https://learn.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_object_attributes type objectAttributes struct { Length uintptr RootDirectory uintptr ObjectName *unicodeString Attributes uintptr SecurityDescriptor *securityDescriptor SecurityQoS uintptr } type unicodeString struct { Length uint16 MaximumLength uint16 Buffer uintptr } // typedef struct _SECURITY_DESCRIPTOR { // BYTE Revision; // BYTE Sbz1; // SECURITY_DESCRIPTOR_CONTROL Control; // PSID Owner; // PSID Group; // PACL Sacl; // PACL Dacl; // } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR; // // https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-security_descriptor type securityDescriptor struct { Revision byte Sbz1 byte Control uint16 Owner uintptr Group uintptr Sacl uintptr //revive:disable-line:var-naming SACL, not Sacl Dacl uintptr //revive:disable-line:var-naming DACL, not Dacl } type ntStatus int32 func (status ntStatus) Err() error { if status >= 0 { return nil } return rtlNtStatusToDosError(status) } var ( // ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed. ErrPipeListenerClosed = net.ErrClosed errPipeWriteClosed = errors.New("pipe has been closed for write") ) type win32Pipe struct { *win32File path string } var _ PipeConn = (*win32Pipe)(nil) type win32MessageBytePipe struct { win32Pipe writeClosed bool readEOF bool } type pipeAddress string func (f *win32Pipe) LocalAddr() net.Addr { return pipeAddress(f.path) } func (f *win32Pipe) RemoteAddr() net.Addr { return pipeAddress(f.path) } func (f *win32Pipe) SetDeadline(t time.Time) error { if err := f.SetReadDeadline(t); err != nil { return err } return f.SetWriteDeadline(t) } func (f *win32Pipe) Disconnect() error { return disconnectNamedPipe(f.win32File.handle) } // CloseWrite closes the write side of a message pipe in byte mode. func (f *win32MessageBytePipe) CloseWrite() error { if f.writeClosed { return errPipeWriteClosed } err := f.win32File.Flush() if err != nil { return err } _, err = f.win32File.Write(nil) if err != nil { return err } f.writeClosed = true return nil } // Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since // they are used to implement CloseWrite(). func (f *win32MessageBytePipe) Write(b []byte) (int, error) { if f.writeClosed { return 0, errPipeWriteClosed } if len(b) == 0 { return 0, nil } return f.win32File.Write(b) } // Read reads bytes from a message pipe in byte mode. A read of a zero-byte message on a message // mode pipe will return io.EOF, as will all subsequent reads. func (f *win32MessageBytePipe) Read(b []byte) (int, error) { if f.readEOF { return 0, io.EOF } n, err := f.win32File.Read(b) if err == io.EOF { //nolint:errorlint // If this was the result of a zero-byte read, then // it is possible that the read was due to a zero-size // message. Since we are simulating CloseWrite with a // zero-byte message, ensure that all future Read() calls // also return EOF. f.readEOF = true } else if err == windows.ERROR_MORE_DATA { //nolint:errorlint // err is Errno // ERROR_MORE_DATA indicates that the pipe's read mode is message mode // and the message still has more bytes. Treat this as a success, since // this package presents all named pipes as byte streams. err = nil } return n, err } func (pipeAddress) Network() string { return "pipe" } func (s pipeAddress) String() string { return string(s) } // tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout. func tryDialPipe(ctx context.Context, path *string, access fs.AccessMask, impLevel PipeImpLevel) (windows.Handle, error) { for { select { case <-ctx.Done(): return windows.Handle(0), ctx.Err() default: h, err := fs.CreateFile(*path, access, 0, // mode nil, // security attributes fs.OPEN_EXISTING, fs.FILE_FLAG_OVERLAPPED|fs.SECURITY_SQOS_PRESENT|fs.FileSQSFlag(impLevel), 0, // template file handle ) if err == nil { return h, nil } if err != windows.ERROR_PIPE_BUSY { //nolint:errorlint // err is Errno return h, &os.PathError{Err: err, Op: "open", Path: *path} } // Wait 10 msec and try again. This is a rather simplistic // view, as we always try each 10 milliseconds. time.Sleep(10 * time.Millisecond) } } } // DialPipe connects to a named pipe by path, timing out if the connection // takes longer than the specified duration. If timeout is nil, then we use // a default timeout of 2 seconds. (We do not use WaitNamedPipe.) func DialPipe(path string, timeout *time.Duration) (net.Conn, error) { var absTimeout time.Time if timeout != nil { absTimeout = time.Now().Add(*timeout) } else { absTimeout = time.Now().Add(2 * time.Second) } ctx, cancel := context.WithDeadline(context.Background(), absTimeout) defer cancel() conn, err := DialPipeContext(ctx, path) if errors.Is(err, context.DeadlineExceeded) { return nil, ErrTimeout } return conn, err } // DialPipeContext attempts to connect to a named pipe by `path` until `ctx` // cancellation or timeout. func DialPipeContext(ctx context.Context, path string) (net.Conn, error) { return DialPipeAccess(ctx, path, uint32(fs.GENERIC_READ|fs.GENERIC_WRITE)) } // PipeImpLevel is an enumeration of impersonation levels that may be set // when calling DialPipeAccessImpersonation. type PipeImpLevel uint32 const ( PipeImpLevelAnonymous = PipeImpLevel(fs.SECURITY_ANONYMOUS) PipeImpLevelIdentification = PipeImpLevel(fs.SECURITY_IDENTIFICATION) PipeImpLevelImpersonation = PipeImpLevel(fs.SECURITY_IMPERSONATION) PipeImpLevelDelegation = PipeImpLevel(fs.SECURITY_DELEGATION) ) // DialPipeAccess attempts to connect to a named pipe by `path` with `access` until `ctx` // cancellation or timeout. func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error) { return DialPipeAccessImpLevel(ctx, path, access, PipeImpLevelAnonymous) } // DialPipeAccessImpLevel attempts to connect to a named pipe by `path` with // `access` at `impLevel` until `ctx` cancellation or timeout. The other // DialPipe* implementations use PipeImpLevelAnonymous. func DialPipeAccessImpLevel(ctx context.Context, path string, access uint32, impLevel PipeImpLevel) (net.Conn, error) { var err error var h windows.Handle h, err = tryDialPipe(ctx, &path, fs.AccessMask(access), impLevel) if err != nil { return nil, err } var flags uint32 err = getNamedPipeInfo(h, &flags, nil, nil, nil) if err != nil { return nil, err } f, err := makeWin32File(h) if err != nil { windows.Close(h) return nil, err } // If the pipe is in message mode, return a message byte pipe, which // supports CloseWrite(). if flags&windows.PIPE_TYPE_MESSAGE != 0 { return &win32MessageBytePipe{ win32Pipe: win32Pipe{win32File: f, path: path}, }, nil } return &win32Pipe{win32File: f, path: path}, nil } type acceptResponse struct { f *win32File err error } type win32PipeListener struct { firstHandle windows.Handle path string config PipeConfig acceptCh chan (chan acceptResponse) closeCh chan int doneCh chan int } func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (windows.Handle, error) { path16, err := windows.UTF16FromString(path) if err != nil { return 0, &os.PathError{Op: "open", Path: path, Err: err} } var oa objectAttributes oa.Length = unsafe.Sizeof(oa) var ntPath unicodeString if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0, ).Err(); err != nil { return 0, &os.PathError{Op: "open", Path: path, Err: err} } defer windows.LocalFree(windows.Handle(ntPath.Buffer)) //nolint:errcheck oa.ObjectName = &ntPath oa.Attributes = windows.OBJ_CASE_INSENSITIVE // The security descriptor is only needed for the first pipe. if first { if sd != nil { //todo: does `sdb` need to be allocated on the heap, or can go allocate it? l := uint32(len(sd)) sdb, err := windows.LocalAlloc(0, l) if err != nil { return 0, fmt.Errorf("LocalAlloc for security descriptor with of length %d: %w", l, err) } defer windows.LocalFree(windows.Handle(sdb)) //nolint:errcheck copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd) oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb)) } else { // Construct the default named pipe security descriptor. var dacl uintptr if err := rtlDefaultNpAcl(&dacl).Err(); err != nil { return 0, fmt.Errorf("getting default named pipe ACL: %w", err) } defer windows.LocalFree(windows.Handle(dacl)) //nolint:errcheck sdb := &securityDescriptor{ Revision: 1, Control: windows.SE_DACL_PRESENT, Dacl: dacl, } oa.SecurityDescriptor = sdb } } typ := uint32(windows.FILE_PIPE_REJECT_REMOTE_CLIENTS) if c.MessageMode { typ |= windows.FILE_PIPE_MESSAGE_TYPE } disposition := fs.FILE_OPEN access := fs.GENERIC_READ | fs.GENERIC_WRITE | fs.SYNCHRONIZE if first { disposition = fs.FILE_CREATE // By not asking for read or write access, the named pipe file system // will put this pipe into an initially disconnected state, blocking // client connections until the next call with first == false. access = fs.SYNCHRONIZE } timeout := int64(-50 * 10000) // 50ms var ( h windows.Handle iosb ioStatusBlock ) err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, fs.FILE_SHARE_READ|fs.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err() if err != nil { return 0, &os.PathError{Op: "open", Path: path, Err: err} } runtime.KeepAlive(ntPath) return h, nil } func (l *win32PipeListener) makeServerPipe() (*win32File, error) { h, err := makeServerPipeHandle(l.path, nil, &l.config, false) if err != nil { return nil, err } f, err := makeWin32File(h) if err != nil { windows.Close(h) return nil, err } return f, nil } func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) { p, err := l.makeServerPipe() if err != nil { return nil, err } // Wait for the client to connect. ch := make(chan error) go func(p *win32File) { ch <- connectPipe(p) }(p) select { case err = <-ch: if err != nil { p.Close() p = nil } case <-l.closeCh: // Abort the connect request by closing the handle. p.Close() p = nil err = <-ch if err == nil || err == ErrFileClosed { //nolint:errorlint // err is Errno err = ErrPipeListenerClosed } } return p, err } func (l *win32PipeListener) listenerRoutine() { closed := false for !closed { select { case <-l.closeCh: closed = true case responseCh := <-l.acceptCh: var ( p *win32File err error ) for { p, err = l.makeConnectedServerPipe() // If the connection was immediately closed by the client, try // again. if err != windows.ERROR_NO_DATA { //nolint:errorlint // err is Errno break } } responseCh <- acceptResponse{p, err} closed = err == ErrPipeListenerClosed //nolint:errorlint // err is Errno } } windows.Close(l.firstHandle) l.firstHandle = 0 // Notify Close() and Accept() callers that the handle has been closed. close(l.doneCh) } // PipeConfig contain configuration for the pipe listener. type PipeConfig struct { // SecurityDescriptor contains a Windows security descriptor in SDDL format. SecurityDescriptor string // MessageMode determines whether the pipe is in byte or message mode. In either // case the pipe is read in byte mode by default. The only practical difference in // this implementation is that CloseWrite() is only supported for message mode pipes; // CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only // transferred to the reader (and returned as io.EOF in this implementation) // when the pipe is in message mode. MessageMode bool // InputBufferSize specifies the size of the input buffer, in bytes. InputBufferSize int32 // OutputBufferSize specifies the size of the output buffer, in bytes. OutputBufferSize int32 } // ListenPipe creates a listener on a Windows named pipe path, e.g. \\.\pipe\mypipe. // The pipe must not already exist. func ListenPipe(path string, c *PipeConfig) (net.Listener, error) { var ( sd []byte err error ) if c == nil { c = &PipeConfig{} } if c.SecurityDescriptor != "" { sd, err = SddlToSecurityDescriptor(c.SecurityDescriptor) if err != nil { return nil, err } } h, err := makeServerPipeHandle(path, sd, c, true) if err != nil { return nil, err } l := &win32PipeListener{ firstHandle: h, path: path, config: *c, acceptCh: make(chan (chan acceptResponse)), closeCh: make(chan int), doneCh: make(chan int), } go l.listenerRoutine() return l, nil } func connectPipe(p *win32File) error { c, err := p.prepareIO() if err != nil { return err } defer p.wg.Done() err = connectNamedPipe(p.handle, &c.o) _, err = p.asyncIO(c, nil, 0, err) if err != nil && err != windows.ERROR_PIPE_CONNECTED { //nolint:errorlint // err is Errno return err } return nil } func (l *win32PipeListener) Accept() (net.Conn, error) { ch := make(chan acceptResponse) select { case l.acceptCh <- ch: response := <-ch err := response.err if err != nil { return nil, err } if l.config.MessageMode { return &win32MessageBytePipe{ win32Pipe: win32Pipe{win32File: response.f, path: l.path}, }, nil } return &win32Pipe{win32File: response.f, path: l.path}, nil case <-l.doneCh: return nil, ErrPipeListenerClosed } } func (l *win32PipeListener) Close() error { select { case l.closeCh <- 1: <-l.doneCh case <-l.doneCh: } return nil } func (l *win32PipeListener) Addr() net.Addr { return pipeAddress(l.path) } ================================================ FILE: vendor/github.com/Microsoft/go-winio/pkg/bindfilter/bind_filter.go ================================================ //go:build windows // +build windows package bindfilter import ( "bytes" "encoding/binary" "errors" "fmt" "os" "path/filepath" "strings" "unsafe" "golang.org/x/sys/windows" ) //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./bind_filter.go //sys bfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath string, virtTargetPath string, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) = bindfltapi.BfSetupFilter? //sys bfRemoveMapping(jobHandle windows.Handle, virtRootPath string) (hr error) = bindfltapi.BfRemoveMapping? //sys bfGetMappings(flags uint32, jobHandle windows.Handle, virtRootPath *uint16, sid *windows.SID, bufferSize *uint32, outBuffer *byte) (hr error) = bindfltapi.BfGetMappings? // BfSetupFilter flags. See: // https://github.com/microsoft/BuildXL/blob/a6dce509f0d4f774255e5fbfb75fa6d5290ed163/Public/Src/Utilities/Native/Processes/Windows/NativeContainerUtilities.cs#L193-L240 // //nolint:revive // var-naming: ALL_CAPS const ( BINDFLT_FLAG_READ_ONLY_MAPPING uint32 = 0x00000001 // Tells bindflt to fail mapping with STATUS_INVALID_PARAMETER if a mapping produces // multiple targets. BINDFLT_FLAG_NO_MULTIPLE_TARGETS uint32 = 0x00000040 ) //nolint:revive // var-naming: ALL_CAPS const ( BINDFLT_GET_MAPPINGS_FLAG_VOLUME uint32 = 0x00000001 BINDFLT_GET_MAPPINGS_FLAG_SILO uint32 = 0x00000002 BINDFLT_GET_MAPPINGS_FLAG_USER uint32 = 0x00000004 ) // ApplyFileBinding creates a global mount of the source in root, with an optional // read only flag. // The bind filter allows us to create mounts of directories and volumes. By default it allows // us to mount multiple sources inside a single root, acting as an overlay. Files from the // second source will superscede the first source that was mounted. // This function disables this behavior and sets the BINDFLT_FLAG_NO_MULTIPLE_TARGETS flag // on the mount. func ApplyFileBinding(root, source string, readOnly bool) error { // The parent directory needs to exist for the bind to work. MkdirAll stats and // returns nil if the directory exists internally so we should be fine to mkdirall // every time. if err := os.MkdirAll(filepath.Dir(root), 0); err != nil { return err } if strings.Contains(source, "Volume{") && !strings.HasSuffix(source, "\\") { // Add trailing slash to volumes, otherwise we get an error when binding it to // a folder. source = source + "\\" } flags := BINDFLT_FLAG_NO_MULTIPLE_TARGETS if readOnly { flags |= BINDFLT_FLAG_READ_ONLY_MAPPING } // Set the job handle to 0 to create a global mount. if err := bfSetupFilter( 0, flags, root, source, nil, 0, ); err != nil { return fmt.Errorf("failed to bind target %q to root %q: %w", source, root, err) } return nil } // RemoveFileBinding removes a mount from the root path. func RemoveFileBinding(root string) error { if err := bfRemoveMapping(0, root); err != nil { return fmt.Errorf("removing file binding: %w", err) } return nil } // GetBindMappings returns a list of bind mappings that have their root on a // particular volume. The volumePath parameter can be any path that exists on // a volume. For example, if a number of mappings are created in C:\ProgramData\test, // to get a list of those mappings, the volumePath parameter would have to be set to // C:\ or the VOLUME_NAME_GUID notation of C:\ (\\?\Volume{GUID}\), or any child // path that exists. func GetBindMappings(volumePath string) ([]BindMapping, error) { rootPtr, err := windows.UTF16PtrFromString(volumePath) if err != nil { return nil, err } flags := BINDFLT_GET_MAPPINGS_FLAG_VOLUME // allocate a large buffer for results var outBuffSize uint32 = 256 * 1024 buf := make([]byte, outBuffSize) if err := bfGetMappings(flags, 0, rootPtr, nil, &outBuffSize, &buf[0]); err != nil { return nil, err } if outBuffSize < 12 { return nil, fmt.Errorf("invalid buffer returned") } result := buf[:outBuffSize] // The first 12 bytes are the three uint32 fields in getMappingsResponseHeader{} headerBuffer := result[:12] // The alternative to using unsafe and casting it to the above defined structures, is to manually // parse the fields. Not too terrible, but not sure it'd worth the trouble. header := *(*getMappingsResponseHeader)(unsafe.Pointer(&headerBuffer[0])) if header.MappingCount == 0 { // no mappings return []BindMapping{}, nil } mappingsBuffer := result[12 : int(unsafe.Sizeof(mappingEntry{}))*int(header.MappingCount)] // Get a pointer to the first mapping in the slice mappingsPointer := (*mappingEntry)(unsafe.Pointer(&mappingsBuffer[0])) // Get slice of mappings mappings := unsafe.Slice(mappingsPointer, header.MappingCount) mappingEntries := make([]BindMapping, header.MappingCount) for i := 0; i < int(header.MappingCount); i++ { bindMapping, err := getBindMappingFromBuffer(result, mappings[i]) if err != nil { return nil, fmt.Errorf("fetching bind mappings: %w", err) } mappingEntries[i] = bindMapping } return mappingEntries, nil } // mappingEntry holds information about where in the response buffer we can // find information about the virtual root (the mount point) and the targets (sources) // that get mounted, as well as the flags used to bind the targets to the virtual root. type mappingEntry struct { VirtRootLength uint32 VirtRootOffset uint32 Flags uint32 NumberOfTargets uint32 TargetEntriesOffset uint32 } type mappingTargetEntry struct { TargetRootLength uint32 TargetRootOffset uint32 } // getMappingsResponseHeader represents the first 12 bytes of the BfGetMappings() response. // It gives us the size of the buffer, the status of the call and the number of mappings. // A response type getMappingsResponseHeader struct { Size uint32 Status uint32 MappingCount uint32 } type BindMapping struct { MountPoint string Flags uint32 Targets []string } func decodeEntry(buffer []byte) (string, error) { name := make([]uint16, len(buffer)/2) err := binary.Read(bytes.NewReader(buffer), binary.LittleEndian, &name) if err != nil { return "", fmt.Errorf("decoding name: %w", err) } return windows.UTF16ToString(name), nil } func getTargetsFromBuffer(buffer []byte, offset, count int) ([]string, error) { if len(buffer) < offset+count*6 { return nil, fmt.Errorf("invalid buffer") } targets := make([]string, count) for i := 0; i < count; i++ { entryBuf := buffer[offset+i*8 : offset+i*8+8] tgt := *(*mappingTargetEntry)(unsafe.Pointer(&entryBuf[0])) if len(buffer) < int(tgt.TargetRootOffset)+int(tgt.TargetRootLength) { return nil, fmt.Errorf("invalid buffer") } decoded, err := decodeEntry(buffer[tgt.TargetRootOffset : tgt.TargetRootOffset+tgt.TargetRootLength]) if err != nil { return nil, fmt.Errorf("decoding name: %w", err) } decoded, err = getFinalPath(decoded) if err != nil { return nil, fmt.Errorf("fetching final path: %w", err) } targets[i] = decoded } return targets, nil } func getFinalPath(pth string) (string, error) { // BfGetMappings returns VOLUME_NAME_NT paths like \Device\HarddiskVolume2\ProgramData. // These can be accessed by prepending \\.\GLOBALROOT to the path. We use this to get the // DOS paths for these files. if strings.HasPrefix(pth, `\Device`) { pth = `\\.\GLOBALROOT` + pth } han, err := openPath(pth) if err != nil { return "", fmt.Errorf("fetching file handle: %w", err) } defer func() { _ = windows.CloseHandle(han) }() buf := make([]uint16, 100) var flags uint32 = 0x0 for { n, err := windows.GetFinalPathNameByHandle(han, &buf[0], uint32(len(buf)), flags) if err != nil { // if we mounted a volume that does not also have a drive letter assigned, attempting to // fetch the VOLUME_NAME_DOS will fail with os.ErrNotExist. Attempt to get the VOLUME_NAME_GUID. if errors.Is(err, os.ErrNotExist) && flags != 0x1 { flags = 0x1 continue } return "", fmt.Errorf("getting final path name: %w", err) } if n < uint32(len(buf)) { break } buf = make([]uint16, n) } finalPath := windows.UTF16ToString(buf) // We got VOLUME_NAME_DOS, we need to strip away some leading slashes. // Leave unchanged if we ended up requesting VOLUME_NAME_GUID if len(finalPath) > 4 && finalPath[:4] == `\\?\` && flags == 0x0 { finalPath = finalPath[4:] if len(finalPath) > 3 && finalPath[:3] == `UNC` { // return path like \\server\share\... finalPath = `\` + finalPath[3:] } } return finalPath, nil } func getBindMappingFromBuffer(buffer []byte, entry mappingEntry) (BindMapping, error) { if len(buffer) < int(entry.VirtRootOffset)+int(entry.VirtRootLength) { return BindMapping{}, fmt.Errorf("invalid buffer") } src, err := decodeEntry(buffer[entry.VirtRootOffset : entry.VirtRootOffset+entry.VirtRootLength]) if err != nil { return BindMapping{}, fmt.Errorf("decoding entry: %w", err) } targets, err := getTargetsFromBuffer(buffer, int(entry.TargetEntriesOffset), int(entry.NumberOfTargets)) if err != nil { return BindMapping{}, fmt.Errorf("fetching targets: %w", err) } src, err = getFinalPath(src) if err != nil { return BindMapping{}, fmt.Errorf("fetching final path: %w", err) } return BindMapping{ Flags: entry.Flags, Targets: targets, MountPoint: src, }, nil } func openPath(path string) (windows.Handle, error) { u16, err := windows.UTF16PtrFromString(path) if err != nil { return 0, err } h, err := windows.CreateFile( u16, 0, windows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE|windows.FILE_SHARE_DELETE, nil, windows.OPEN_EXISTING, windows.FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory handle. 0) if err != nil { return 0, &os.PathError{ Op: "CreateFile", Path: path, Err: err, } } return h, nil } ================================================ FILE: vendor/github.com/Microsoft/go-winio/pkg/bindfilter/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package bindfilter import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modbindfltapi = windows.NewLazySystemDLL("bindfltapi.dll") procBfGetMappings = modbindfltapi.NewProc("BfGetMappings") procBfRemoveMapping = modbindfltapi.NewProc("BfRemoveMapping") procBfSetupFilter = modbindfltapi.NewProc("BfSetupFilter") ) func bfGetMappings(flags uint32, jobHandle windows.Handle, virtRootPath *uint16, sid *windows.SID, bufferSize *uint32, outBuffer *byte) (hr error) { hr = procBfGetMappings.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procBfGetMappings.Addr(), uintptr(flags), uintptr(jobHandle), uintptr(unsafe.Pointer(virtRootPath)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(bufferSize)), uintptr(unsafe.Pointer(outBuffer))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func bfRemoveMapping(jobHandle windows.Handle, virtRootPath string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(virtRootPath) if hr != nil { return } return _bfRemoveMapping(jobHandle, _p0) } func _bfRemoveMapping(jobHandle windows.Handle, virtRootPath *uint16) (hr error) { hr = procBfRemoveMapping.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procBfRemoveMapping.Addr(), uintptr(jobHandle), uintptr(unsafe.Pointer(virtRootPath))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func bfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath string, virtTargetPath string, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(virtRootPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(virtTargetPath) if hr != nil { return } return _bfSetupFilter(jobHandle, flags, _p0, _p1, virtExceptions, virtExceptionPathCount) } func _bfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath *uint16, virtTargetPath *uint16, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) { hr = procBfSetupFilter.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procBfSetupFilter.Addr(), uintptr(jobHandle), uintptr(flags), uintptr(unsafe.Pointer(virtRootPath)), uintptr(unsafe.Pointer(virtTargetPath)), uintptr(unsafe.Pointer(virtExceptions)), uintptr(virtExceptionPathCount)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go ================================================ // Package guid provides a GUID type. The backing structure for a GUID is // identical to that used by the golang.org/x/sys/windows GUID type. // There are two main binary encodings used for a GUID, the big-endian encoding, // and the Windows (mixed-endian) encoding. See here for details: // https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding package guid import ( "crypto/rand" "crypto/sha1" //nolint:gosec // not used for secure application "encoding" "encoding/binary" "fmt" "strconv" ) //go:generate go run golang.org/x/tools/cmd/stringer -type=Variant -trimprefix=Variant -linecomment // Variant specifies which GUID variant (or "type") of the GUID. It determines // how the entirety of the rest of the GUID is interpreted. type Variant uint8 // The variants specified by RFC 4122 section 4.1.1. const ( // VariantUnknown specifies a GUID variant which does not conform to one of // the variant encodings specified in RFC 4122. VariantUnknown Variant = iota VariantNCS VariantRFC4122 // RFC 4122 VariantMicrosoft VariantFuture ) // Version specifies how the bits in the GUID were generated. For instance, a // version 4 GUID is randomly generated, and a version 5 is generated from the // hash of an input string. type Version uint8 func (v Version) String() string { return strconv.FormatUint(uint64(v), 10) } var _ = (encoding.TextMarshaler)(GUID{}) var _ = (encoding.TextUnmarshaler)(&GUID{}) // NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122. func NewV4() (GUID, error) { var b [16]byte if _, err := rand.Read(b[:]); err != nil { return GUID{}, err } g := FromArray(b) g.setVersion(4) // Version 4 means randomly generated. g.setVariant(VariantRFC4122) return g, nil } // NewV5 returns a new version 5 (generated from a string via SHA-1 hashing) // GUID, as defined by RFC 4122. The RFC is unclear on the encoding of the name, // and the sample code treats it as a series of bytes, so we do the same here. // // Some implementations, such as those found on Windows, treat the name as a // big-endian UTF16 stream of bytes. If that is desired, the string can be // encoded as such before being passed to this function. func NewV5(namespace GUID, name []byte) (GUID, error) { b := sha1.New() //nolint:gosec // not used for secure application namespaceBytes := namespace.ToArray() b.Write(namespaceBytes[:]) b.Write(name) a := [16]byte{} copy(a[:], b.Sum(nil)) g := FromArray(a) g.setVersion(5) // Version 5 means generated from a string. g.setVariant(VariantRFC4122) return g, nil } func fromArray(b [16]byte, order binary.ByteOrder) GUID { var g GUID g.Data1 = order.Uint32(b[0:4]) g.Data2 = order.Uint16(b[4:6]) g.Data3 = order.Uint16(b[6:8]) copy(g.Data4[:], b[8:16]) return g } func (g GUID) toArray(order binary.ByteOrder) [16]byte { b := [16]byte{} order.PutUint32(b[0:4], g.Data1) order.PutUint16(b[4:6], g.Data2) order.PutUint16(b[6:8], g.Data3) copy(b[8:16], g.Data4[:]) return b } // FromArray constructs a GUID from a big-endian encoding array of 16 bytes. func FromArray(b [16]byte) GUID { return fromArray(b, binary.BigEndian) } // ToArray returns an array of 16 bytes representing the GUID in big-endian // encoding. func (g GUID) ToArray() [16]byte { return g.toArray(binary.BigEndian) } // FromWindowsArray constructs a GUID from a Windows encoding array of bytes. func FromWindowsArray(b [16]byte) GUID { return fromArray(b, binary.LittleEndian) } // ToWindowsArray returns an array of 16 bytes representing the GUID in Windows // encoding. func (g GUID) ToWindowsArray() [16]byte { return g.toArray(binary.LittleEndian) } func (g GUID) String() string { return fmt.Sprintf( "%08x-%04x-%04x-%04x-%012x", g.Data1, g.Data2, g.Data3, g.Data4[:2], g.Data4[2:]) } // FromString parses a string containing a GUID and returns the GUID. The only // format currently supported is the `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` // format. func FromString(s string) (GUID, error) { if len(s) != 36 { return GUID{}, fmt.Errorf("invalid GUID %q", s) } if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { return GUID{}, fmt.Errorf("invalid GUID %q", s) } var g GUID data1, err := strconv.ParseUint(s[0:8], 16, 32) if err != nil { return GUID{}, fmt.Errorf("invalid GUID %q", s) } g.Data1 = uint32(data1) data2, err := strconv.ParseUint(s[9:13], 16, 16) if err != nil { return GUID{}, fmt.Errorf("invalid GUID %q", s) } g.Data2 = uint16(data2) data3, err := strconv.ParseUint(s[14:18], 16, 16) if err != nil { return GUID{}, fmt.Errorf("invalid GUID %q", s) } g.Data3 = uint16(data3) for i, x := range []int{19, 21, 24, 26, 28, 30, 32, 34} { v, err := strconv.ParseUint(s[x:x+2], 16, 8) if err != nil { return GUID{}, fmt.Errorf("invalid GUID %q", s) } g.Data4[i] = uint8(v) } return g, nil } func (g *GUID) setVariant(v Variant) { d := g.Data4[0] switch v { case VariantNCS: d = (d & 0x7f) case VariantRFC4122: d = (d & 0x3f) | 0x80 case VariantMicrosoft: d = (d & 0x1f) | 0xc0 case VariantFuture: d = (d & 0x0f) | 0xe0 case VariantUnknown: fallthrough default: panic(fmt.Sprintf("invalid variant: %d", v)) } g.Data4[0] = d } // Variant returns the GUID variant, as defined in RFC 4122. func (g GUID) Variant() Variant { b := g.Data4[0] if b&0x80 == 0 { return VariantNCS } else if b&0xc0 == 0x80 { return VariantRFC4122 } else if b&0xe0 == 0xc0 { return VariantMicrosoft } else if b&0xe0 == 0xe0 { return VariantFuture } return VariantUnknown } func (g *GUID) setVersion(v Version) { g.Data3 = (g.Data3 & 0x0fff) | (uint16(v) << 12) } // Version returns the GUID version, as defined in RFC 4122. func (g GUID) Version() Version { return Version((g.Data3 & 0xF000) >> 12) } // MarshalText returns the textual representation of the GUID. func (g GUID) MarshalText() ([]byte, error) { return []byte(g.String()), nil } // UnmarshalText takes the textual representation of a GUID, and unmarhals it // into this GUID. func (g *GUID) UnmarshalText(text []byte) error { g2, err := FromString(string(text)) if err != nil { return err } *g = g2 return nil } ================================================ FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go ================================================ //go:build !windows // +build !windows package guid // GUID represents a GUID/UUID. It has the same structure as // golang.org/x/sys/windows.GUID so that it can be used with functions expecting // that type. It is defined as its own type as that is only available to builds // targeted at `windows`. The representation matches that used by native Windows // code. type GUID struct { Data1 uint32 Data2 uint16 Data3 uint16 Data4 [8]byte } ================================================ FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go ================================================ //go:build windows // +build windows package guid import "golang.org/x/sys/windows" // GUID represents a GUID/UUID. It has the same structure as // golang.org/x/sys/windows.GUID so that it can be used with functions expecting // that type. It is defined as its own type so that stringification and // marshaling can be supported. The representation matches that used by native // Windows code. type GUID windows.GUID ================================================ FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go ================================================ // Code generated by "stringer -type=Variant -trimprefix=Variant -linecomment"; DO NOT EDIT. package guid import "strconv" func _() { // An "invalid array index" compiler error signifies that the constant values have changed. // Re-run the stringer command to generate them again. var x [1]struct{} _ = x[VariantUnknown-0] _ = x[VariantNCS-1] _ = x[VariantRFC4122-2] _ = x[VariantMicrosoft-3] _ = x[VariantFuture-4] } const _Variant_name = "UnknownNCSRFC 4122MicrosoftFuture" var _Variant_index = [...]uint8{0, 7, 10, 18, 27, 33} func (i Variant) String() string { if i >= Variant(len(_Variant_index)-1) { return "Variant(" + strconv.FormatInt(int64(i), 10) + ")" } return _Variant_name[_Variant_index[i]:_Variant_index[i+1]] } ================================================ FILE: vendor/github.com/Microsoft/go-winio/privilege.go ================================================ //go:build windows // +build windows package winio import ( "bytes" "encoding/binary" "fmt" "runtime" "sync" "unicode/utf16" "golang.org/x/sys/windows" ) //sys adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges //sys impersonateSelf(level uint32) (err error) = advapi32.ImpersonateSelf //sys revertToSelf() (err error) = advapi32.RevertToSelf //sys openThreadToken(thread windows.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) = advapi32.OpenThreadToken //sys getCurrentThread() (h windows.Handle) = GetCurrentThread //sys lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) = advapi32.LookupPrivilegeValueW //sys lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW //sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW const ( //revive:disable-next-line:var-naming ALL_CAPS SE_PRIVILEGE_ENABLED = windows.SE_PRIVILEGE_ENABLED //revive:disable-next-line:var-naming ALL_CAPS ERROR_NOT_ALL_ASSIGNED windows.Errno = windows.ERROR_NOT_ALL_ASSIGNED SeBackupPrivilege = "SeBackupPrivilege" SeRestorePrivilege = "SeRestorePrivilege" SeSecurityPrivilege = "SeSecurityPrivilege" ) var ( privNames = make(map[string]uint64) privNameMutex sync.Mutex ) // PrivilegeError represents an error enabling privileges. type PrivilegeError struct { privileges []uint64 } func (e *PrivilegeError) Error() string { s := "Could not enable privilege " if len(e.privileges) > 1 { s = "Could not enable privileges " } for i, p := range e.privileges { if i != 0 { s += ", " } s += `"` s += getPrivilegeName(p) s += `"` } return s } // RunWithPrivilege enables a single privilege for a function call. func RunWithPrivilege(name string, fn func() error) error { return RunWithPrivileges([]string{name}, fn) } // RunWithPrivileges enables privileges for a function call. func RunWithPrivileges(names []string, fn func() error) error { privileges, err := mapPrivileges(names) if err != nil { return err } runtime.LockOSThread() defer runtime.UnlockOSThread() token, err := newThreadToken() if err != nil { return err } defer releaseThreadToken(token) err = adjustPrivileges(token, privileges, SE_PRIVILEGE_ENABLED) if err != nil { return err } return fn() } func mapPrivileges(names []string) ([]uint64, error) { privileges := make([]uint64, 0, len(names)) privNameMutex.Lock() defer privNameMutex.Unlock() for _, name := range names { p, ok := privNames[name] if !ok { err := lookupPrivilegeValue("", name, &p) if err != nil { return nil, err } privNames[name] = p } privileges = append(privileges, p) } return privileges, nil } // EnableProcessPrivileges enables privileges globally for the process. func EnableProcessPrivileges(names []string) error { return enableDisableProcessPrivilege(names, SE_PRIVILEGE_ENABLED) } // DisableProcessPrivileges disables privileges globally for the process. func DisableProcessPrivileges(names []string) error { return enableDisableProcessPrivilege(names, 0) } func enableDisableProcessPrivilege(names []string, action uint32) error { privileges, err := mapPrivileges(names) if err != nil { return err } p := windows.CurrentProcess() var token windows.Token err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token) if err != nil { return err } defer token.Close() return adjustPrivileges(token, privileges, action) } func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error { var b bytes.Buffer _ = binary.Write(&b, binary.LittleEndian, uint32(len(privileges))) for _, p := range privileges { _ = binary.Write(&b, binary.LittleEndian, p) _ = binary.Write(&b, binary.LittleEndian, action) } prevState := make([]byte, b.Len()) reqSize := uint32(0) success, err := adjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(len(prevState)), &prevState[0], &reqSize) if !success { return err } if err == ERROR_NOT_ALL_ASSIGNED { //nolint:errorlint // err is Errno return &PrivilegeError{privileges} } return nil } func getPrivilegeName(luid uint64) string { var nameBuffer [256]uint16 bufSize := uint32(len(nameBuffer)) err := lookupPrivilegeName("", &luid, &nameBuffer[0], &bufSize) if err != nil { return fmt.Sprintf("", luid) } var displayNameBuffer [256]uint16 displayBufSize := uint32(len(displayNameBuffer)) var langID uint32 err = lookupPrivilegeDisplayName("", &nameBuffer[0], &displayNameBuffer[0], &displayBufSize, &langID) if err != nil { return fmt.Sprintf("", string(utf16.Decode(nameBuffer[:bufSize]))) } return string(utf16.Decode(displayNameBuffer[:displayBufSize])) } func newThreadToken() (windows.Token, error) { err := impersonateSelf(windows.SecurityImpersonation) if err != nil { return 0, err } var token windows.Token err = openThreadToken(getCurrentThread(), windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, false, &token) if err != nil { rerr := revertToSelf() if rerr != nil { panic(rerr) } return 0, err } return token, nil } func releaseThreadToken(h windows.Token) { err := revertToSelf() if err != nil { panic(err) } h.Close() } ================================================ FILE: vendor/github.com/Microsoft/go-winio/reparse.go ================================================ //go:build windows // +build windows package winio import ( "bytes" "encoding/binary" "fmt" "strings" "unicode/utf16" "unsafe" ) const ( reparseTagMountPoint = 0xA0000003 reparseTagSymlink = 0xA000000C ) type reparseDataBuffer struct { ReparseTag uint32 ReparseDataLength uint16 Reserved uint16 SubstituteNameOffset uint16 SubstituteNameLength uint16 PrintNameOffset uint16 PrintNameLength uint16 } // ReparsePoint describes a Win32 symlink or mount point. type ReparsePoint struct { Target string IsMountPoint bool } // UnsupportedReparsePointError is returned when trying to decode a non-symlink or // mount point reparse point. type UnsupportedReparsePointError struct { Tag uint32 } func (e *UnsupportedReparsePointError) Error() string { return fmt.Sprintf("unsupported reparse point %x", e.Tag) } // DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink // or a mount point. func DecodeReparsePoint(b []byte) (*ReparsePoint, error) { tag := binary.LittleEndian.Uint32(b[0:4]) return DecodeReparsePointData(tag, b[8:]) } func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) { isMountPoint := false switch tag { case reparseTagMountPoint: isMountPoint = true case reparseTagSymlink: default: return nil, &UnsupportedReparsePointError{tag} } nameOffset := 8 + binary.LittleEndian.Uint16(b[4:6]) if !isMountPoint { nameOffset += 4 } nameLength := binary.LittleEndian.Uint16(b[6:8]) name := make([]uint16, nameLength/2) err := binary.Read(bytes.NewReader(b[nameOffset:nameOffset+nameLength]), binary.LittleEndian, &name) if err != nil { return nil, err } return &ReparsePoint{string(utf16.Decode(name)), isMountPoint}, nil } func isDriveLetter(c byte) bool { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') } // EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or // mount point. func EncodeReparsePoint(rp *ReparsePoint) []byte { // Generate an NT path and determine if this is a relative path. var ntTarget string relative := false if strings.HasPrefix(rp.Target, `\\?\`) { ntTarget = `\??\` + rp.Target[4:] } else if strings.HasPrefix(rp.Target, `\\`) { ntTarget = `\??\UNC\` + rp.Target[2:] } else if len(rp.Target) >= 2 && isDriveLetter(rp.Target[0]) && rp.Target[1] == ':' { ntTarget = `\??\` + rp.Target } else { ntTarget = rp.Target relative = true } // The paths must be NUL-terminated even though they are counted strings. target16 := utf16.Encode([]rune(rp.Target + "\x00")) ntTarget16 := utf16.Encode([]rune(ntTarget + "\x00")) size := int(unsafe.Sizeof(reparseDataBuffer{})) - 8 size += len(ntTarget16)*2 + len(target16)*2 tag := uint32(reparseTagMountPoint) if !rp.IsMountPoint { tag = reparseTagSymlink size += 4 // Add room for symlink flags } data := reparseDataBuffer{ ReparseTag: tag, ReparseDataLength: uint16(size), SubstituteNameOffset: 0, SubstituteNameLength: uint16((len(ntTarget16) - 1) * 2), PrintNameOffset: uint16(len(ntTarget16) * 2), PrintNameLength: uint16((len(target16) - 1) * 2), } var b bytes.Buffer _ = binary.Write(&b, binary.LittleEndian, &data) if !rp.IsMountPoint { flags := uint32(0) if relative { flags |= 1 } _ = binary.Write(&b, binary.LittleEndian, flags) } _ = binary.Write(&b, binary.LittleEndian, ntTarget16) _ = binary.Write(&b, binary.LittleEndian, target16) return b.Bytes() } ================================================ FILE: vendor/github.com/Microsoft/go-winio/sd.go ================================================ //go:build windows // +build windows package winio import ( "errors" "fmt" "unsafe" "golang.org/x/sys/windows" ) //sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW //sys lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountSidW //sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW //sys convertStringSidToSid(str *uint16, sid **byte) (err error) = advapi32.ConvertStringSidToSidW type AccountLookupError struct { Name string Err error } func (e *AccountLookupError) Error() string { if e.Name == "" { return "lookup account: empty account name specified" } var s string switch { case errors.Is(e.Err, windows.ERROR_INVALID_SID): s = "the security ID structure is invalid" case errors.Is(e.Err, windows.ERROR_NONE_MAPPED): s = "not found" default: s = e.Err.Error() } return "lookup account " + e.Name + ": " + s } func (e *AccountLookupError) Unwrap() error { return e.Err } type SddlConversionError struct { Sddl string Err error } func (e *SddlConversionError) Error() string { return "convert " + e.Sddl + ": " + e.Err.Error() } func (e *SddlConversionError) Unwrap() error { return e.Err } // LookupSidByName looks up the SID of an account by name // //revive:disable-next-line:var-naming SID, not Sid func LookupSidByName(name string) (sid string, err error) { if name == "" { return "", &AccountLookupError{name, windows.ERROR_NONE_MAPPED} } var sidSize, sidNameUse, refDomainSize uint32 err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse) if err != nil && err != windows.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // err is Errno return "", &AccountLookupError{name, err} } sidBuffer := make([]byte, sidSize) refDomainBuffer := make([]uint16, refDomainSize) err = lookupAccountName(nil, name, &sidBuffer[0], &sidSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse) if err != nil { return "", &AccountLookupError{name, err} } var strBuffer *uint16 err = convertSidToStringSid(&sidBuffer[0], &strBuffer) if err != nil { return "", &AccountLookupError{name, err} } sid = windows.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:]) _, _ = windows.LocalFree(windows.Handle(unsafe.Pointer(strBuffer))) return sid, nil } // LookupNameBySid looks up the name of an account by SID // //revive:disable-next-line:var-naming SID, not Sid func LookupNameBySid(sid string) (name string, err error) { if sid == "" { return "", &AccountLookupError{sid, windows.ERROR_NONE_MAPPED} } sidBuffer, err := windows.UTF16PtrFromString(sid) if err != nil { return "", &AccountLookupError{sid, err} } var sidPtr *byte if err = convertStringSidToSid(sidBuffer, &sidPtr); err != nil { return "", &AccountLookupError{sid, err} } defer windows.LocalFree(windows.Handle(unsafe.Pointer(sidPtr))) //nolint:errcheck var nameSize, refDomainSize, sidNameUse uint32 err = lookupAccountSid(nil, sidPtr, nil, &nameSize, nil, &refDomainSize, &sidNameUse) if err != nil && err != windows.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // err is Errno return "", &AccountLookupError{sid, err} } nameBuffer := make([]uint16, nameSize) refDomainBuffer := make([]uint16, refDomainSize) err = lookupAccountSid(nil, sidPtr, &nameBuffer[0], &nameSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse) if err != nil { return "", &AccountLookupError{sid, err} } name = windows.UTF16ToString(nameBuffer) return name, nil } func SddlToSecurityDescriptor(sddl string) ([]byte, error) { sd, err := windows.SecurityDescriptorFromString(sddl) if err != nil { return nil, &SddlConversionError{Sddl: sddl, Err: err} } b := unsafe.Slice((*byte)(unsafe.Pointer(sd)), sd.Length()) return b, nil } func SecurityDescriptorToSddl(sd []byte) (string, error) { if l := int(unsafe.Sizeof(windows.SECURITY_DESCRIPTOR{})); len(sd) < l { return "", fmt.Errorf("SecurityDescriptor (%d) smaller than expected (%d): %w", len(sd), l, windows.ERROR_INCORRECT_SIZE) } s := (*windows.SECURITY_DESCRIPTOR)(unsafe.Pointer(&sd[0])) return s.String(), nil } ================================================ FILE: vendor/github.com/Microsoft/go-winio/syscall.go ================================================ //go:build windows package winio //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./*.go ================================================ FILE: vendor/github.com/Microsoft/go-winio/vhd/vhd.go ================================================ //go:build windows // +build windows package vhd import ( "fmt" "syscall" "github.com/Microsoft/go-winio/pkg/guid" "golang.org/x/sys/windows" ) //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zvhd_windows.go vhd.go //sys createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) = virtdisk.CreateVirtualDisk //sys openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) = virtdisk.OpenVirtualDisk //sys attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (win32err error) = virtdisk.AttachVirtualDisk //sys detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (win32err error) = virtdisk.DetachVirtualDisk //sys getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (win32err error) = virtdisk.GetVirtualDiskPhysicalPath type ( CreateVirtualDiskFlag uint32 VirtualDiskFlag uint32 AttachVirtualDiskFlag uint32 DetachVirtualDiskFlag uint32 VirtualDiskAccessMask uint32 ) type VirtualStorageType struct { DeviceID uint32 VendorID guid.GUID } type CreateVersion2 struct { UniqueID guid.GUID MaximumSize uint64 BlockSizeInBytes uint32 SectorSizeInBytes uint32 PhysicalSectorSizeInByte uint32 ParentPath *uint16 // string SourcePath *uint16 // string OpenFlags uint32 ParentVirtualStorageType VirtualStorageType SourceVirtualStorageType VirtualStorageType ResiliencyGUID guid.GUID } type CreateVirtualDiskParameters struct { Version uint32 // Must always be set to 2 Version2 CreateVersion2 } type OpenVersion2 struct { GetInfoOnly bool ReadOnly bool ResiliencyGUID guid.GUID } type OpenVirtualDiskParameters struct { Version uint32 // Must always be set to 2 Version2 OpenVersion2 } // The higher level `OpenVersion2` struct uses `bool`s to refer to `GetInfoOnly` and `ReadOnly` for ease of use. However, // the internal windows structure uses `BOOL`s aka int32s for these types. `openVersion2` is used for translating // `OpenVersion2` fields to the correct windows internal field types on the `Open____` methods. type openVersion2 struct { getInfoOnly int32 readOnly int32 resiliencyGUID guid.GUID } type openVirtualDiskParameters struct { version uint32 version2 openVersion2 } type AttachVersion2 struct { RestrictedOffset uint64 RestrictedLength uint64 } type AttachVirtualDiskParameters struct { Version uint32 Version2 AttachVersion2 } const ( //revive:disable-next-line:var-naming ALL_CAPS VIRTUAL_STORAGE_TYPE_DEVICE_VHDX = 0x3 // Access Mask for opening a VHD. VirtualDiskAccessNone VirtualDiskAccessMask = 0x00000000 VirtualDiskAccessAttachRO VirtualDiskAccessMask = 0x00010000 VirtualDiskAccessAttachRW VirtualDiskAccessMask = 0x00020000 VirtualDiskAccessDetach VirtualDiskAccessMask = 0x00040000 VirtualDiskAccessGetInfo VirtualDiskAccessMask = 0x00080000 VirtualDiskAccessCreate VirtualDiskAccessMask = 0x00100000 VirtualDiskAccessMetaOps VirtualDiskAccessMask = 0x00200000 VirtualDiskAccessRead VirtualDiskAccessMask = 0x000d0000 VirtualDiskAccessAll VirtualDiskAccessMask = 0x003f0000 VirtualDiskAccessWritable VirtualDiskAccessMask = 0x00320000 // Flags for creating a VHD. CreateVirtualDiskFlagNone CreateVirtualDiskFlag = 0x0 CreateVirtualDiskFlagFullPhysicalAllocation CreateVirtualDiskFlag = 0x1 CreateVirtualDiskFlagPreventWritesToSourceDisk CreateVirtualDiskFlag = 0x2 CreateVirtualDiskFlagDoNotCopyMetadataFromParent CreateVirtualDiskFlag = 0x4 CreateVirtualDiskFlagCreateBackingStorage CreateVirtualDiskFlag = 0x8 CreateVirtualDiskFlagUseChangeTrackingSourceLimit CreateVirtualDiskFlag = 0x10 CreateVirtualDiskFlagPreserveParentChangeTrackingState CreateVirtualDiskFlag = 0x20 CreateVirtualDiskFlagVhdSetUseOriginalBackingStorage CreateVirtualDiskFlag = 0x40 //revive:disable-line:var-naming VHD, not Vhd CreateVirtualDiskFlagSparseFile CreateVirtualDiskFlag = 0x80 CreateVirtualDiskFlagPmemCompatible CreateVirtualDiskFlag = 0x100 //revive:disable-line:var-naming PMEM, not Pmem CreateVirtualDiskFlagSupportCompressedVolumes CreateVirtualDiskFlag = 0x200 // Flags for opening a VHD. OpenVirtualDiskFlagNone VirtualDiskFlag = 0x00000000 OpenVirtualDiskFlagNoParents VirtualDiskFlag = 0x00000001 OpenVirtualDiskFlagBlankFile VirtualDiskFlag = 0x00000002 OpenVirtualDiskFlagBootDrive VirtualDiskFlag = 0x00000004 OpenVirtualDiskFlagCachedIO VirtualDiskFlag = 0x00000008 OpenVirtualDiskFlagCustomDiffChain VirtualDiskFlag = 0x00000010 OpenVirtualDiskFlagParentCachedIO VirtualDiskFlag = 0x00000020 OpenVirtualDiskFlagVhdsetFileOnly VirtualDiskFlag = 0x00000040 OpenVirtualDiskFlagIgnoreRelativeParentLocator VirtualDiskFlag = 0x00000080 OpenVirtualDiskFlagNoWriteHardening VirtualDiskFlag = 0x00000100 OpenVirtualDiskFlagSupportCompressedVolumes VirtualDiskFlag = 0x00000200 // Flags for attaching a VHD. AttachVirtualDiskFlagNone AttachVirtualDiskFlag = 0x00000000 AttachVirtualDiskFlagReadOnly AttachVirtualDiskFlag = 0x00000001 AttachVirtualDiskFlagNoDriveLetter AttachVirtualDiskFlag = 0x00000002 AttachVirtualDiskFlagPermanentLifetime AttachVirtualDiskFlag = 0x00000004 AttachVirtualDiskFlagNoLocalHost AttachVirtualDiskFlag = 0x00000008 AttachVirtualDiskFlagNoSecurityDescriptor AttachVirtualDiskFlag = 0x00000010 AttachVirtualDiskFlagBypassDefaultEncryptionPolicy AttachVirtualDiskFlag = 0x00000020 AttachVirtualDiskFlagNonPnp AttachVirtualDiskFlag = 0x00000040 AttachVirtualDiskFlagRestrictedRange AttachVirtualDiskFlag = 0x00000080 AttachVirtualDiskFlagSinglePartition AttachVirtualDiskFlag = 0x00000100 AttachVirtualDiskFlagRegisterVolume AttachVirtualDiskFlag = 0x00000200 // Flags for detaching a VHD. DetachVirtualDiskFlagNone DetachVirtualDiskFlag = 0x0 ) // CreateVhdx is a helper function to create a simple vhdx file at the given path using // default values. // //revive:disable-next-line:var-naming VHDX, not Vhdx func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error { params := CreateVirtualDiskParameters{ Version: 2, Version2: CreateVersion2{ MaximumSize: uint64(maxSizeInGb) * 1024 * 1024 * 1024, BlockSizeInBytes: blockSizeInMb * 1024 * 1024, }, } handle, err := CreateVirtualDisk(path, VirtualDiskAccessNone, CreateVirtualDiskFlagNone, ¶ms) if err != nil { return err } return syscall.CloseHandle(handle) } // DetachVirtualDisk detaches a virtual hard disk by handle. func DetachVirtualDisk(handle syscall.Handle) (err error) { if err := detachVirtualDisk(handle, 0, 0); err != nil { return fmt.Errorf("failed to detach virtual disk: %w", err) } return nil } // DetachVhd detaches a vhd found at `path`. // //revive:disable-next-line:var-naming VHD, not Vhd func DetachVhd(path string) error { handle, err := OpenVirtualDisk( path, VirtualDiskAccessNone, OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator, ) if err != nil { return err } defer syscall.CloseHandle(handle) //nolint:errcheck return DetachVirtualDisk(handle) } // AttachVirtualDisk attaches a virtual hard disk for use. func AttachVirtualDisk( handle syscall.Handle, attachVirtualDiskFlag AttachVirtualDiskFlag, parameters *AttachVirtualDiskParameters, ) (err error) { // Supports both version 1 and 2 of the attach parameters as version 2 wasn't present in RS5. if err := attachVirtualDisk( handle, nil, uint32(attachVirtualDiskFlag), 0, parameters, nil, ); err != nil { return fmt.Errorf("failed to attach virtual disk: %w", err) } return nil } // AttachVhd attaches a virtual hard disk at `path` for use. Attaches using version 2 // of the ATTACH_VIRTUAL_DISK_PARAMETERS. // //revive:disable-next-line:var-naming VHD, not Vhd func AttachVhd(path string) (err error) { handle, err := OpenVirtualDisk( path, VirtualDiskAccessNone, OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator, ) if err != nil { return err } defer syscall.CloseHandle(handle) //nolint:errcheck params := AttachVirtualDiskParameters{Version: 2} if err := AttachVirtualDisk( handle, AttachVirtualDiskFlagNone, ¶ms, ); err != nil { return fmt.Errorf("failed to attach virtual disk: %w", err) } return nil } // OpenVirtualDisk obtains a handle to a VHD opened with supplied access mask and flags. func OpenVirtualDisk( vhdPath string, virtualDiskAccessMask VirtualDiskAccessMask, openVirtualDiskFlags VirtualDiskFlag, ) (syscall.Handle, error) { parameters := OpenVirtualDiskParameters{Version: 2} handle, err := OpenVirtualDiskWithParameters( vhdPath, virtualDiskAccessMask, openVirtualDiskFlags, ¶meters, ) if err != nil { return 0, err } return handle, nil } // OpenVirtualDiskWithParameters obtains a handle to a VHD opened with supplied access mask, flags and parameters. func OpenVirtualDiskWithParameters( vhdPath string, virtualDiskAccessMask VirtualDiskAccessMask, openVirtualDiskFlags VirtualDiskFlag, parameters *OpenVirtualDiskParameters, ) (syscall.Handle, error) { var ( handle syscall.Handle defaultType VirtualStorageType getInfoOnly int32 readOnly int32 ) if parameters.Version != 2 { return handle, fmt.Errorf("only version 2 VHDs are supported, found version: %d", parameters.Version) } if parameters.Version2.GetInfoOnly { getInfoOnly = 1 } if parameters.Version2.ReadOnly { readOnly = 1 } params := &openVirtualDiskParameters{ version: parameters.Version, version2: openVersion2{ getInfoOnly, readOnly, parameters.Version2.ResiliencyGUID, }, } if err := openVirtualDisk( &defaultType, vhdPath, uint32(virtualDiskAccessMask), uint32(openVirtualDiskFlags), params, &handle, ); err != nil { return 0, fmt.Errorf("failed to open virtual disk: %w", err) } return handle, nil } // CreateVirtualDisk creates a virtual harddisk and returns a handle to the disk. func CreateVirtualDisk( path string, virtualDiskAccessMask VirtualDiskAccessMask, createVirtualDiskFlags CreateVirtualDiskFlag, parameters *CreateVirtualDiskParameters, ) (syscall.Handle, error) { var ( handle syscall.Handle defaultType VirtualStorageType ) if parameters.Version != 2 { return handle, fmt.Errorf("only version 2 VHDs are supported, found version: %d", parameters.Version) } if err := createVirtualDisk( &defaultType, path, uint32(virtualDiskAccessMask), nil, uint32(createVirtualDiskFlags), 0, parameters, nil, &handle, ); err != nil { return handle, fmt.Errorf("failed to create virtual disk: %w", err) } return handle, nil } // GetVirtualDiskPhysicalPath takes a handle to a virtual hard disk and returns the physical // path of the disk on the machine. This path is in the form \\.\PhysicalDriveX where X is an integer // that represents the particular enumeration of the physical disk on the caller's system. func GetVirtualDiskPhysicalPath(handle syscall.Handle) (_ string, err error) { var ( diskPathSizeInBytes uint32 = 256 * 2 // max path length 256 wide chars diskPhysicalPathBuf [256]uint16 ) if err := getVirtualDiskPhysicalPath( handle, &diskPathSizeInBytes, &diskPhysicalPathBuf[0], ); err != nil { return "", fmt.Errorf("failed to get disk physical path: %w", err) } return windows.UTF16ToString(diskPhysicalPathBuf[:]), nil } // CreateDiffVhd is a helper function to create a differencing virtual disk. // //revive:disable-next-line:var-naming VHD, not Vhd func CreateDiffVhd(diffVhdPath, baseVhdPath string, blockSizeInMB uint32) error { // Setting `ParentPath` is how to signal to create a differencing disk. createParams := &CreateVirtualDiskParameters{ Version: 2, Version2: CreateVersion2{ ParentPath: windows.StringToUTF16Ptr(baseVhdPath), BlockSizeInBytes: blockSizeInMB * 1024 * 1024, OpenFlags: uint32(OpenVirtualDiskFlagCachedIO), }, } vhdHandle, err := CreateVirtualDisk( diffVhdPath, VirtualDiskAccessNone, CreateVirtualDiskFlagNone, createParams, ) if err != nil { return fmt.Errorf("failed to create differencing vhd: %w", err) } if err := syscall.CloseHandle(vhdHandle); err != nil { return fmt.Errorf("failed to close differencing vhd handle: %w", err) } return nil } ================================================ FILE: vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package vhd import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modvirtdisk = windows.NewLazySystemDLL("virtdisk.dll") procAttachVirtualDisk = modvirtdisk.NewProc("AttachVirtualDisk") procCreateVirtualDisk = modvirtdisk.NewProc("CreateVirtualDisk") procDetachVirtualDisk = modvirtdisk.NewProc("DetachVirtualDisk") procGetVirtualDiskPhysicalPath = modvirtdisk.NewProc("GetVirtualDiskPhysicalPath") procOpenVirtualDisk = modvirtdisk.NewProc("OpenVirtualDisk") ) func attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (win32err error) { r0, _, _ := syscall.SyscallN(procAttachVirtualDisk.Addr(), uintptr(handle), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(attachVirtualDiskFlag), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(overlapped))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(path) if win32err != nil { return } return _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, createVirtualDiskFlags, providerSpecificFlags, parameters, overlapped, handle) } func _createVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) { r0, _, _ := syscall.SyscallN(procCreateVirtualDisk.Addr(), uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(createVirtualDiskFlags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(handle))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (win32err error) { r0, _, _ := syscall.SyscallN(procDetachVirtualDisk.Addr(), uintptr(handle), uintptr(detachVirtualDiskFlags), uintptr(providerSpecificFlags)) if r0 != 0 { win32err = syscall.Errno(r0) } return } func getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (win32err error) { r0, _, _ := syscall.SyscallN(procGetVirtualDiskPhysicalPath.Addr(), uintptr(handle), uintptr(unsafe.Pointer(diskPathSizeInBytes)), uintptr(unsafe.Pointer(buffer))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(path) if win32err != nil { return } return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, openVirtualDiskFlags, parameters, handle) } func _openVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) { r0, _, _ := syscall.SyscallN(procOpenVirtualDisk.Addr(), uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(openVirtualDiskFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle))) if r0 != 0 { win32err = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/Microsoft/go-winio/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package winio import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") modkernel32 = windows.NewLazySystemDLL("kernel32.dll") modntdll = windows.NewLazySystemDLL("ntdll.dll") modws2_32 = windows.NewLazySystemDLL("ws2_32.dll") procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW") procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW") procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW") procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW") procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") procRevertToSelf = modadvapi32.NewProc("RevertToSelf") procBackupRead = modkernel32.NewProc("BackupRead") procBackupWrite = modkernel32.NewProc("BackupWrite") procCancelIoEx = modkernel32.NewProc("CancelIoEx") procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") procDisconnectNamedPipe = modkernel32.NewProc("DisconnectNamedPipe") procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") procNtCreateNamedPipeFile = modntdll.NewProc("NtCreateNamedPipeFile") procRtlDefaultNpAcl = modntdll.NewProc("RtlDefaultNpAcl") procRtlDosPathNameToNtPathName_U = modntdll.NewProc("RtlDosPathNameToNtPathName_U") procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb") procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult") ) func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) { var _p0 uint32 if releaseAll { _p0 = 1 } r0, _, e1 := syscall.SyscallN(procAdjustTokenPrivileges.Addr(), uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize))) success = r0 != 0 if true { err = errnoErr(e1) } return } func convertSidToStringSid(sid *byte, str **uint16) (err error) { r1, _, e1 := syscall.SyscallN(procConvertSidToStringSidW.Addr(), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(str))) if r1 == 0 { err = errnoErr(e1) } return } func convertStringSidToSid(str *uint16, sid **byte) (err error) { r1, _, e1 := syscall.SyscallN(procConvertStringSidToSidW.Addr(), uintptr(unsafe.Pointer(str)), uintptr(unsafe.Pointer(sid))) if r1 == 0 { err = errnoErr(e1) } return } func impersonateSelf(level uint32) (err error) { r1, _, e1 := syscall.SyscallN(procImpersonateSelf.Addr(), uintptr(level)) if r1 == 0 { err = errnoErr(e1) } return } func lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(accountName) if err != nil { return } return _lookupAccountName(systemName, _p0, sid, sidSize, refDomain, refDomainSize, sidNameUse) } func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { r1, _, e1 := syscall.SyscallN(procLookupAccountNameW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse))) if r1 == 0 { err = errnoErr(e1) } return } func lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { r1, _, e1 := syscall.SyscallN(procLookupAccountSidW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse))) if r1 == 0 { err = errnoErr(e1) } return } func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(systemName) if err != nil { return } return _lookupPrivilegeDisplayName(_p0, name, buffer, size, languageId) } func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { r1, _, e1 := syscall.SyscallN(procLookupPrivilegeDisplayNameW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(languageId))) if r1 == 0 { err = errnoErr(e1) } return } func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(systemName) if err != nil { return } return _lookupPrivilegeName(_p0, luid, buffer, size) } func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint16, size *uint32) (err error) { r1, _, e1 := syscall.SyscallN(procLookupPrivilegeNameW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size))) if r1 == 0 { err = errnoErr(e1) } return } func lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(systemName) if err != nil { return } var _p1 *uint16 _p1, err = syscall.UTF16PtrFromString(name) if err != nil { return } return _lookupPrivilegeValue(_p0, _p1, luid) } func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint64) (err error) { r1, _, e1 := syscall.SyscallN(procLookupPrivilegeValueW.Addr(), uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid))) if r1 == 0 { err = errnoErr(e1) } return } func openThreadToken(thread windows.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) { var _p0 uint32 if openAsSelf { _p0 = 1 } r1, _, e1 := syscall.SyscallN(procOpenThreadToken.Addr(), uintptr(thread), uintptr(accessMask), uintptr(_p0), uintptr(unsafe.Pointer(token))) if r1 == 0 { err = errnoErr(e1) } return } func revertToSelf() (err error) { r1, _, e1 := syscall.SyscallN(procRevertToSelf.Addr()) if r1 == 0 { err = errnoErr(e1) } return } func backupRead(h windows.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { var _p0 *byte if len(b) > 0 { _p0 = &b[0] } var _p1 uint32 if abort { _p1 = 1 } var _p2 uint32 if processSecurity { _p2 = 1 } r1, _, e1 := syscall.SyscallN(procBackupRead.Addr(), uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesRead)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context))) if r1 == 0 { err = errnoErr(e1) } return } func backupWrite(h windows.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { var _p0 *byte if len(b) > 0 { _p0 = &b[0] } var _p1 uint32 if abort { _p1 = 1 } var _p2 uint32 if processSecurity { _p2 = 1 } r1, _, e1 := syscall.SyscallN(procBackupWrite.Addr(), uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesWritten)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context))) if r1 == 0 { err = errnoErr(e1) } return } func cancelIoEx(file windows.Handle, o *windows.Overlapped) (err error) { r1, _, e1 := syscall.SyscallN(procCancelIoEx.Addr(), uintptr(file), uintptr(unsafe.Pointer(o))) if r1 == 0 { err = errnoErr(e1) } return } func connectNamedPipe(pipe windows.Handle, o *windows.Overlapped) (err error) { r1, _, e1 := syscall.SyscallN(procConnectNamedPipe.Addr(), uintptr(pipe), uintptr(unsafe.Pointer(o))) if r1 == 0 { err = errnoErr(e1) } return } func createIoCompletionPort(file windows.Handle, port windows.Handle, key uintptr, threadCount uint32) (newport windows.Handle, err error) { r0, _, e1 := syscall.SyscallN(procCreateIoCompletionPort.Addr(), uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount)) newport = windows.Handle(r0) if newport == 0 { err = errnoErr(e1) } return } func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *windows.SecurityAttributes) (handle windows.Handle, err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(name) if err != nil { return } return _createNamedPipe(_p0, flags, pipeMode, maxInstances, outSize, inSize, defaultTimeout, sa) } func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *windows.SecurityAttributes) (handle windows.Handle, err error) { r0, _, e1 := syscall.SyscallN(procCreateNamedPipeW.Addr(), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(pipeMode), uintptr(maxInstances), uintptr(outSize), uintptr(inSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa))) handle = windows.Handle(r0) if handle == windows.InvalidHandle { err = errnoErr(e1) } return } func disconnectNamedPipe(pipe windows.Handle) (err error) { r1, _, e1 := syscall.SyscallN(procDisconnectNamedPipe.Addr(), uintptr(pipe)) if r1 == 0 { err = errnoErr(e1) } return } func getCurrentThread() (h windows.Handle) { r0, _, _ := syscall.SyscallN(procGetCurrentThread.Addr()) h = windows.Handle(r0) return } func getNamedPipeHandleState(pipe windows.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) { r1, _, e1 := syscall.SyscallN(procGetNamedPipeHandleStateW.Addr(), uintptr(pipe), uintptr(unsafe.Pointer(state)), uintptr(unsafe.Pointer(curInstances)), uintptr(unsafe.Pointer(maxCollectionCount)), uintptr(unsafe.Pointer(collectDataTimeout)), uintptr(unsafe.Pointer(userName)), uintptr(maxUserNameSize)) if r1 == 0 { err = errnoErr(e1) } return } func getNamedPipeInfo(pipe windows.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) { r1, _, e1 := syscall.SyscallN(procGetNamedPipeInfo.Addr(), uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances))) if r1 == 0 { err = errnoErr(e1) } return } func getQueuedCompletionStatus(port windows.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) { r1, _, e1 := syscall.SyscallN(procGetQueuedCompletionStatus.Addr(), uintptr(port), uintptr(unsafe.Pointer(bytes)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(o)), uintptr(timeout)) if r1 == 0 { err = errnoErr(e1) } return } func setFileCompletionNotificationModes(h windows.Handle, flags uint8) (err error) { r1, _, e1 := syscall.SyscallN(procSetFileCompletionNotificationModes.Addr(), uintptr(h), uintptr(flags)) if r1 == 0 { err = errnoErr(e1) } return } func ntCreateNamedPipeFile(pipe *windows.Handle, access ntAccessMask, oa *objectAttributes, iosb *ioStatusBlock, share ntFileShareMode, disposition ntFileCreationDisposition, options ntFileOptions, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntStatus) { r0, _, _ := syscall.SyscallN(procNtCreateNamedPipeFile.Addr(), uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout))) status = ntStatus(r0) return } func rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) { r0, _, _ := syscall.SyscallN(procRtlDefaultNpAcl.Addr(), uintptr(unsafe.Pointer(dacl))) status = ntStatus(r0) return } func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntStatus) { r0, _, _ := syscall.SyscallN(procRtlDosPathNameToNtPathName_U.Addr(), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved)) status = ntStatus(r0) return } func rtlNtStatusToDosError(status ntStatus) (winerr error) { r0, _, _ := syscall.SyscallN(procRtlNtStatusToDosErrorNoTeb.Addr(), uintptr(status)) if r0 != 0 { winerr = syscall.Errno(r0) } return } func wsaGetOverlappedResult(h windows.Handle, o *windows.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) { var _p0 uint32 if wait { _p0 = 1 } r1, _, e1 := syscall.SyscallN(procWSAGetOverlappedResult.Addr(), uintptr(h), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(bytes)), uintptr(_p0), uintptr(unsafe.Pointer(flags))) if r1 == 0 { err = errnoErr(e1) } return } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/.clang-format ================================================ Language: Cpp BasedOnStyle: Microsoft BreakBeforeBraces: Attach PointerAlignment: Left AllowShortFunctionsOnASingleLine: All # match Go style IndentCaseLabels: false # don't break comments over line limit (needed for CodeQL exceptions) ReflowComments: false InsertNewlineAtEOF: true KeepEmptyLines: AtEndOfFile: true ================================================ FILE: vendor/github.com/Microsoft/hcsshim/.gitattributes ================================================ * text=auto eol=lf vendor/** -text test/vendor/** -text ================================================ FILE: vendor/github.com/Microsoft/hcsshim/.gitignore ================================================ # Binaries for programs and plugins *.exe *.dll *.so *.dylib # Ignore vscode setting files .vscode/ .idea/ # Test binary, build with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 .glide/ # Ignore gcs bin directory service/bin/ service/pkg/ *.img *.vhd *.tar.gz *.tar # Make stuff .rootfs-done bin/* rootfs/* rootfs-conv/* *.o /build/ deps/* out/* # protobuf files # only files at root of the repo, otherwise this will cause issues with vendoring /protobuf/* # test results test/results # go workspace files go.work go.work.sum # keys and related artifacts *.pem *.cose ================================================ FILE: vendor/github.com/Microsoft/hcsshim/.golangci.yml ================================================ run: timeout: 8m tests: true build-tags: - admin - functional - integration linters: enable: # defaults: # - errcheck # - gosimple # - govet # - ineffassign # - staticcheck # - typecheck # - unused - errorlint # error wrapping (eg, not using `errors.Is`, using `%s` instead of `%w` in `fmt.Errorf`) - gofmt # whether code was gofmt-ed - govet # enabled by default, but just to be sure - nolintlint # ill-formed or insufficient nolint directives - stylecheck # golint replacement - thelper # test helpers without t.Helper() linters-settings: govet: enable-all: true disable: # struct order is often for Win32 compat # also, ignore pointer bytes/GC issues for now until performance becomes an issue - fieldalignment stylecheck: # https://staticcheck.io/docs/checks checks: ["all"] issues: exclude-dirs: # paths are relative to module root - cri-containerd/test-images exclude-rules: # err is very often shadowed in nested scopes - linters: - govet text: '^shadow: declaration of "err" shadows declaration' # path is relative to module root, which is ./test/ - path: cri-containerd linters: - stylecheck text: "^ST1003: should not use underscores in package names$" source: "^package cri_containerd$" # don't bother with propper error wrapping in test code - path: cri-containerd linters: - errorlint text: "non-wrapping format verb for fmt.Errorf" # This repo has a LOT of generated schema files, operating system bindings, and other # things that ST1003 from stylecheck won't like (screaming case Windows api constants for example). # There's also some structs that we *could* change the initialisms to be Go friendly # (Id -> ID) but they're exported and it would be a breaking change. # This makes it so that most new code, code that isn't supposed to be a pretty faithful # mapping to an OS call/constants, or non-generated code still checks if we're following idioms, # while ignoring the things that are just noise or would be more of a hassle than it'd be worth to change. - path: layer.go linters: - stylecheck text: "ST1003:" - path: hcsshim.go linters: - stylecheck text: "ST1003:" - path: cmd\\ncproxy\\nodenetsvc\\ linters: - stylecheck text: "ST1003:" - path: cmd\\ncproxy_mock\\ linters: - stylecheck text: "ST1003:" - path: internal\\hcs\\schema2\\ linters: - stylecheck - gofmt - path: internal\\wclayer\\ linters: - stylecheck text: "ST1003:" - path: hcn\\ linters: - stylecheck text: "ST1003:" - path: internal\\hcs\\schema1\\ linters: - stylecheck text: "ST1003:" - path: internal\\hns\\ linters: - stylecheck text: "ST1003:" - path: ext4\\internal\\compactext4\\ linters: - stylecheck text: "ST1003:" - path: ext4\\internal\\format\\ linters: - stylecheck text: "ST1003:" - path: internal\\guestrequest\\ linters: - stylecheck text: "ST1003:" - path: internal\\guest\\prot\\ linters: - stylecheck text: "ST1003:" - path: internal\\windevice\\ linters: - stylecheck text: "ST1003:" - path: internal\\winapi\\ linters: - stylecheck text: "ST1003:" - path: internal\\vmcompute\\ linters: - stylecheck text: "ST1003:" - path: internal\\regstate\\ linters: - stylecheck text: "ST1003:" - path: internal\\hcserror\\ linters: - stylecheck text: "ST1003:" # v0 APIs are deprecated, but still retained for backwards compatability - path: cmd\\ncproxy\\ linters: - staticcheck text: "^SA1019: .*(ncproxygrpc|nodenetsvc)[/]?v0" - path: internal\\tools\\networkagent linters: - staticcheck text: "^SA1019: .*nodenetsvc[/]?v0" - path: internal\\vhdx\\info linters: - stylecheck text: "ST1003:" ================================================ FILE: vendor/github.com/Microsoft/hcsshim/CODEOWNERS ================================================ * @microsoft/containerplat ================================================ FILE: vendor/github.com/Microsoft/hcsshim/LICENSE ================================================ The MIT License (MIT) Copyright (c) 2015 Microsoft Permission 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE 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. ================================================ FILE: vendor/github.com/Microsoft/hcsshim/Makefile ================================================ include Makefile.bootfiles GO:=go GO_FLAGS:=-ldflags "-s -w" # strip Go binaries CGO_ENABLED:=0 GOMODVENDOR:= KMOD:=0 CFLAGS:=-O2 -Wall LDFLAGS:=-static -s #strip C binaries LDLIBS:= PREPROCESSORFLAGS:= ifeq "$(KMOD)" "1" LDFLAGS:= -s LDLIBS:= -lkmod PREPROCESSORFLAGS:=-DMODULES=1 endif GO_FLAGS_EXTRA:= ifeq "$(GOMODVENDOR)" "1" GO_FLAGS_EXTRA += -mod=vendor endif GO_BUILD_TAGS:= ifneq ($(strip $(GO_BUILD_TAGS)),) GO_FLAGS_EXTRA += -tags="$(GO_BUILD_TAGS)" endif GO_BUILD:=CGO_ENABLED=$(CGO_ENABLED) $(GO) build $(GO_FLAGS) $(GO_FLAGS_EXTRA) SRCROOT=$(dir $(abspath $(firstword $(MAKEFILE_LIST)))) # additional directories to search for rule prerequisites and targets VPATH=$(SRCROOT) # The link aliases for gcstools GCS_TOOLS=\ generichook \ install-drivers test: cd $(SRCROOT) && $(GO) test -v ./internal/guest/... # This target includes utilities which may be useful for testing purposes. out/delta-dev.tar.gz: out/delta.tar.gz bin/internal/tools/snp-report rm -rf rootfs-dev mkdir rootfs-dev tar -xzf out/delta.tar.gz -C rootfs-dev cp bin/internal/tools/snp-report rootfs-dev/bin/ tar -zcf $@ -C rootfs-dev . rm -rf rootfs-dev out/delta-snp.tar.gz: out/delta.tar.gz bin/internal/tools/snp-report boot/startup_v2056.sh boot/startup_simple.sh boot/startup.sh rm -rf rootfs-snp mkdir rootfs-snp tar -xzf out/delta.tar.gz -C rootfs-snp cp boot/startup_v2056.sh rootfs-snp/startup_v2056.sh cp boot/startup_simple.sh rootfs-snp/startup_simple.sh cp boot/startup.sh rootfs-snp/startup.sh cp bin/internal/tools/snp-report rootfs-snp/bin/ chmod a+x rootfs-snp/startup_v2056.sh chmod a+x rootfs-snp/startup_simple.sh chmod a+x rootfs-snp/startup.sh tar -zcf $@ -C rootfs-snp . rm -rf rootfs-snp out/delta.tar.gz: bin/init bin/vsockexec bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths Makefile @mkdir -p out rm -rf rootfs mkdir -p rootfs/bin/ mkdir -p rootfs/info/ cp bin/init rootfs/ cp bin/vsockexec rootfs/bin/ cp bin/cmd/gcs rootfs/bin/ cp bin/cmd/gcstools rootfs/bin/ cp bin/cmd/hooks/wait-paths rootfs/bin/ for tool in $(GCS_TOOLS); do ln -s gcstools rootfs/bin/$$tool; done git -C $(SRCROOT) rev-parse HEAD > rootfs/info/gcs.commit && \ git -C $(SRCROOT) rev-parse --abbrev-ref HEAD > rootfs/info/gcs.branch && \ date --iso-8601=minute --utc > rootfs/info/tar.date $(if $(and $(realpath $(subst .tar,.testdata.json,$(BASE))), $(shell which jq)), \ jq -r '.IMAGE_NAME' $(subst .tar,.testdata.json,$(BASE)) 2>/dev/null > rootfs/info/image.name && \ jq -r '.DATETIME' $(subst .tar,.testdata.json,$(BASE)) 2>/dev/null > rootfs/info/build.date) tar -zcf $@ -C rootfs . rm -rf rootfs bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths bin/cmd/tar2ext4 bin/internal/tools/snp-report: @mkdir -p $(dir $@) GOOS=linux $(GO_BUILD) -o $@ $(SRCROOT)/$(@:bin/%=%) bin/vsockexec: vsockexec/vsockexec.o vsockexec/vsock.o @mkdir -p bin $(CC) $(LDFLAGS) -o $@ $^ bin/init: init/init.o vsockexec/vsock.o @mkdir -p bin $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) %.o: %.c @mkdir -p $(dir $@) $(CC) $(PREPROCESSORFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< ================================================ FILE: vendor/github.com/Microsoft/hcsshim/Makefile.bootfiles ================================================ BASE:=base.tar.gz DEV_BUILD:=0 DELTA_TARGET=out/delta.tar.gz ifeq "$(DEV_BUILD)" "1" DELTA_TARGET=out/delta-dev.tar.gz endif ifeq "$(SNP_BUILD)" "1" DELTA_TARGET=out/delta-snp.tar.gz endif SRCROOT=$(dir $(abspath $(firstword $(MAKEFILE_LIST)))) PATH_PREFIX:= # These have PATH_PREFIX prepended to obtain the full path in recipies e.g. $(PATH_PREFIX)/$(VMGS_TOOL) VMGS_TOOL:= IGVM_TOOL:= KERNEL_PATH:= TAR2EXT4_TOOL:=bin/cmd/tar2ext4 ROOTFS_DEVICE:=/dev/sda HASH_DEVICE:=/dev/sdb .PHONY: all always rootfs test snp simple .DEFAULT_GOAL := all all: out/initrd.img out/rootfs.tar.gz clean: find -name '*.o' -print0 | xargs -0 -r rm rm -rf bin rootfs out rootfs: out/rootfs.vhd snp: out/kernel.vmgs out/rootfs-verity.vhd out/v2056.vmgs out/v2056combined.vmgs simple: out/simple.vmgs snp %.vmgs: %.bin rm -f $@ # du -BM returns the size of the bin file in M, eg 7M. The sed command replaces the M with *1024*1024 and then bc does the math to convert to bytes $(PATH_PREFIX)/$(VMGS_TOOL) create --filepath $@ --filesize `du -BM $< | sed "s/M.*/*1024*1024/" | bc` $(PATH_PREFIX)/$(VMGS_TOOL) write --filepath $@ --datapath $< -i=8 # Simplest debug UVM used to test changes to the linux kernel. No dmverity protection. Boots an initramdisk rather than directly booting a vhd disk. out/simple.bin: out/initrd.img $(PATH_PREFIX)/$(KERNEL_PATH) boot/startup_simple.sh rm -f $@ python3 $(PATH_PREFIX)/$(IGVM_TOOL) \ -o $@ \ -kernel $(PATH_PREFIX)/$(KERNEL_PATH) \ -append "8250_core.nr_uarts=0 panic=-1 debug loglevel=7 rdinit=/startup_simple.sh" \ -rdinit out/initrd.img \ -vtl 0 # The boot performance is optimized by supplying rootfs as a SCSI attachment. In this case the kernel boots with # dm-verity to ensure the integrity. Similar to layer VHDs the verity Merkle tree is appended to ext4 filesystem. # It transpires that the /dev/sd* order is not deterministic wrt the scsi device order. Thus build a single userland # fs + merkle tree device and boot that. # # From https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/dm-init.html # # dm-mod.create=,,,,[,
+][;,,,,
[,
+]+] # # where: # ::= The device name. # ::= xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | "" # ::= The device minor number | "" # ::= "ro" | "rw" #
::= # ::= "verity" | "linear" | ... (see list below) # # From https://docs.kernel.org/admin-guide/device-mapper/verity.html # # # # # [<#opt_params> ] # # typical igvm tool line once all the macros are expanded # python3 /home/user/igvmfile.py -o out/v2056.bin -kernel /hose/user/bzImage -append "8250_core.nr_uarts=0 panic=-1 debug loglevel=9 ignore_loglevel dev.scsi.logging_level=9411 root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 196744 verity 1 /dev/sda /dev/sdb 4096 4096 24593 0 sha256 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba 1 ignore_corruption\" init=/startup_v2056.sh" -vtl 0 # # so a kernel command line of: # 8250_core.nr_uarts=0 panic=-1 debug loglevel=9 ignore_loglevel dev.scsi.logging_level=9411 root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 196744 verity 1 /dev/sda /dev/sdb 4096 4096 24593 0 sha256 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba 1 ignore_corruption\" init=/startup_v2056.sh # # and a dm-mod.create of: # dmverity,,,ro,0 196744 verity 1 /dev/sda /dev/sdb 4096 4096 24593 0 sha256 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba 1 ignore_corruption # # which breaks down to: # # name = "dmverity" # uuid = "" # minor = "" # flags = "ro" # table = 0 196744 verity "args" # start_sector = 0 # num_sectors = 196744 # target_type = verity # target_args = 1 /dev/sda /dev/sdb 4096 4096 24593 0 sha256 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba 1 ignore_corruption # args: # version 1 # dev /dev/sda # hash_dev /dev/sdb # data_block_size 4096 # hash_block_size 4096 # num_data_blocks 24593 # hash_start_block 0 # algorithm sha256 # digest 6d625a306aafdf73125a84388b7bfdd2c3a154bd8d698955f4adffc736bdfd66 # salt b9065c23231f0d8901cc3a68e1d3b8d624213e76d6f9f6d3ccbcb829f9c710ba # opt_params # count = 1 # ignore_corruption # # combined typical (not bigger count of sectors for the whole device) # dmverity,,,ro,0 199672 verity 1 /dev/sda /dev/sda 4096 4096 24959 24959 sha256 4aa6e79866ee946ddbd9cddd6554bc6449272942fcc65934326817785a3bd374 adc4956274489c936395bab046a2d476f21ef436e571ba53da2fdf3aee59bf0a # # A few notes: # - num_sectors is the size of the final (aka target) verity device, i.e. the size of our rootfs excluding the Merkle # tree. # - We don't add verity superblock, so the will be exactly at the end of ext4 filesystem and equal # to its size. In the case when verity superblock is present an extra block should be added to the offset value, # i.e. 24959 becomes 24960. # Debug build for use with uvmtester. UVM with dm-verity protected vhd disk mounted directly via the kernel command line. # Ignores corruption in dm-verity protected disk. (Use dmesg to see if dm-verity is ignoring data corruption.) out/v2056.bin: out/rootfs.vhd out/rootfs.hash.vhd $(PATH_PREFIX)/$(KERNEL_PATH) out/rootfs.hash.datasectors out/rootfs.hash.datablocksize out/rootfs.hash.hashblocksize out/rootfs.hash.datablocks out/rootfs.hash.rootdigest out/rootfs.hash.salt boot/startup_v2056.sh rm -f $@ python3 $(PATH_PREFIX)/$(IGVM_TOOL) \ -o $@ \ -kernel $(PATH_PREFIX)/$(KERNEL_PATH) \ -append "8250_core.nr_uarts=0 panic=-1 debug loglevel=9 root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(HASH_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt) 1 ignore_corruption\" init=/startup_v2056.sh" \ -vtl 0 out/v2056combined.bin: out/rootfs-verity.vhd $(PATH_PREFIX)/$(KERNEL_PATH) out/rootfs.hash.datablocksize out/rootfs.hash.hashblocksize out/rootfs.hash.datablocks out/rootfs.hash.rootdigest out/rootfs.hash.salt boot/startup_v2056.sh rm -f $@ echo root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(ROOTFS_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt) 1 ignore_corruption\" python3 $(PATH_PREFIX)/$(IGVM_TOOL) \ -o $@ \ -kernel $(PATH_PREFIX)/$(KERNEL_PATH) \ -append "8250_core.nr_uarts=0 panic=-1 debug loglevel=9 ignore_loglevel dev.scsi.logging_level=9411 root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(ROOTFS_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt) 1 ignore_corruption\" init=/startup_v2056.sh" \ -vtl 0 # Full UVM with dm-verity protected vhd disk mounted directly via the kernel command line. out/kernel.bin: out/rootfs-verity.vhd $(PATH_PREFIX)/$(KERNEL_PATH) out/rootfs.hash.datasectors out/rootfs.hash.datablocksize out/rootfs.hash.hashblocksize out/rootfs.hash.datablocks out/rootfs.hash.rootdigest out/rootfs.hash.salt boot/startup.sh rm -f $@ echo root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(ROOTFS_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt)\" python3 $(PATH_PREFIX)/$(IGVM_TOOL) \ -o $@ \ -kernel $(PATH_PREFIX)/$(KERNEL_PATH) \ -append "8250_core.nr_uarts=0 panic=-1 debug loglevel=7 root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(ROOTFS_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) $(shell cat out/rootfs.hash.datablocks) sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt)\" init=/startup.sh" \ -vtl 0 # Rule to make a vhd from a file. This is used to create the rootfs.hash.vhd from rootfs.hash. %.vhd: % $(TAR2EXT4_TOOL) $(TAR2EXT4_TOOL) -only-vhd -i $< -o $@ # Rule to make a vhd from an ext4 file. This is used to create the rootfs.vhd from rootfs.ext4. %.vhd: %.ext4 $(TAR2EXT4_TOOL) $(TAR2EXT4_TOOL) -only-vhd -i $< -o $@ %.hash %.hash.info %.hash.datablocks %.hash.rootdigest %hash.datablocksize %.hash.datasectors %.hash.hashblocksize: %.ext4 %.hash.salt veritysetup format --no-superblock --salt $(shell cat out/rootfs.hash.salt) $< $*.hash > $*.hash.info # Retrieve info required by dm-verity at boot time # Get the blocksize of rootfs cat $*.hash.info | awk '/^Root hash:/{ print $$3 }' > $*.hash.rootdigest cat $*.hash.info | awk '/^Salt:/{ print $$2 }' > $*.hash.salt cat $*.hash.info | awk '/^Data block size:/{ print $$4 }' > $*.hash.datablocksize cat $*.hash.info | awk '/^Hash block size:/{ print $$4 }' > $*.hash.hashblocksize cat $*.hash.info | awk '/^Data blocks:/{ print $$3 }' > $*.hash.datablocks echo $$(( $$(cat $*.hash.datablocks) * $$(cat $*.hash.datablocksize) / 512 )) > $*.hash.datasectors out/rootfs.hash.salt: hexdump -vn32 -e'8/4 "%08X" 1 "\n"' /dev/random > $@ out/rootfs.ext4: out/rootfs.tar.gz $(TAR2EXT4_TOOL) gzip -f -d ./out/rootfs.tar.gz $(TAR2EXT4_TOOL) -i ./out/rootfs.tar -o $@ out/rootfs-verity.ext4: out/rootfs.ext4 out/rootfs.hash cp out/rootfs.ext4 $@ cat out/rootfs.hash >> $@ out/rootfs.tar.gz: out/initrd.img rm -rf rootfs-conv mkdir rootfs-conv gunzip -c out/initrd.img | (cd rootfs-conv && cpio -imd) tar -zcf $@ -C rootfs-conv . rm -rf rootfs-conv out/initrd.img: $(BASE) $(DELTA_TARGET) $(SRCROOT)/hack/catcpio.sh $(SRCROOT)/hack/catcpio.sh "$(BASE)" $(DELTA_TARGET) > out/initrd.img.uncompressed gzip -c out/initrd.img.uncompressed > $@ rm out/initrd.img.uncompressed ================================================ FILE: vendor/github.com/Microsoft/hcsshim/Protobuild.toml ================================================ version = "2" generators = ["go", "go-grpc"] # Control protoc include paths. [includes] before = ["./protobuf"] # defaults are "/usr/local/include" and "/usr/include", which don't exist on Windows. # override defaults to supress errors about non-existant directories. after = [] # This section maps protobuf imports to Go packages. [packages] # github.com/containerd/cgroups protofiles still list their go path as "github.com/containerd/cgroups/cgroup1/stats" "github.com/containerd/cgroups/v3/cgroup1/stats/metrics.proto" = "github.com/containerd/cgroups/v3/cgroup1/stats" [[overrides]] prefixes = [ "github.com/Microsoft/hcsshim/internal/shimdiag", "github.com/Microsoft/hcsshim/internal/extendedtask", "github.com/Microsoft/hcsshim/internal/computeagent", "github.com/Microsoft/hcsshim/internal/ncproxyttrpc", "github.com/Microsoft/hcsshim/internal/vmservice", ] generators = ["go", "go-ttrpc"] ================================================ FILE: vendor/github.com/Microsoft/hcsshim/README.md ================================================ # hcsshim [![Build status](https://github.com/microsoft/hcsshim/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/microsoft/hcsshim/actions?query=branch%3Amaster) This package contains the Golang interface for using the Windows [Host Compute Service](https://techcommunity.microsoft.com/t5/containers/introducing-the-host-compute-service-hcs/ba-p/382332) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS), as well as code for the [guest agent](./internal/guest/README.md) (commonly referred to as the GCS or Guest Compute Service in the codebase) used to support running Linux Hyper-V containers. It is primarily used in the [Moby](https://github.com/moby/moby) and [Containerd](https://github.com/containerd/containerd) projects, but it can be freely used by other projects as well. ## Building While this repository can be used as a library of sorts to call the HCS apis, there are a couple binaries built out of the repository as well. The main ones being the Linux guest agent, and an implementation of the [runtime v2 containerd shim api](https://github.com/containerd/containerd/blob/master/runtime/v2/README.md). ### Linux Hyper-V Container Guest Agent To build the Linux guest agent itself all that's needed is to set your GOOS to "Linux" and build out of ./cmd/gcs. ```powershell C:\> $env:GOOS="linux" C:\> go build .\cmd\gcs\ ``` or on a Linux machine ```sh > go build ./cmd/gcs ``` If you want it to be packaged inside of a rootfs to boot with alongside all of the other tools then you'll need to provide a rootfs that it can be packaged inside of. An easy way is to export the rootfs of a container. ```sh docker pull busybox docker run --name base_image_container busybox docker export base_image_container | gzip > base.tar.gz BASE=./base.tar.gz make all ``` If the build is successful, in the `./out` folder you should see: ```sh > ls ./out/ delta.tar.gz initrd.img rootfs.tar.gz ``` ### Containerd Shim For info on the [Runtime V2 API](https://github.com/containerd/containerd/blob/main/core/runtime/v2/README.md). Contrary to the typical Linux architecture of shim -> runc, the runhcs shim is used both to launch and manage the lifetime of containers. ```powershell C:\> $env:GOOS="windows" C:\> go build .\cmd\containerd-shim-runhcs-v1 ``` Then place the binary in the same directory that Containerd is located at in your environment. A default Containerd configuration file can be generated by running: ```powershell .\containerd.exe config default | Out-File "C:\Program Files\containerd\config.toml" -Encoding ascii ``` This config file will already have the shim set as the default runtime for cri interactions. To trial using the shim out with ctr.exe: ```powershell C:\> ctr.exe run --runtime io.containerd.runhcs.v1 --rm mcr.microsoft.com/windows/nanoserver:2004 windows-test cmd /c "echo Hello World!" ``` ## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit [Microsoft CLA](https://cla.microsoft.com). When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. We require that contributors sign their commits to certify they either authored the work themselves or otherwise have permission to use it in this project. We also require that contributors sign their commits using using [`git commit --signoff`][git-commit-s] to certify they either authored the work themselves or otherwise have permission to use it in this project. A range of commits can be signed off using [`git rebase --signoff`][git-rebase-s]. Please see [the developer certificate](https://developercertificate.org) for more info, as well as to make sure that you can attest to the rules listed. Our CI uses the [DCO Github app](https://github.com/apps/dco) to ensure that all commits in a given PR are signed-off. ### Linting Code must pass a linting stage, which uses [`golangci-lint`][lint]. Since `./test` is a separate Go module, the linter is run from both the root and the `test` directories. Additionally, the linter is run with `GOOS` set to both `windows` and `linux`. The linting settings are stored in [`.golangci.yaml`](./.golangci.yaml), and can be run automatically with VSCode by adding the following to your workspace or folder settings: ```json "go.lintTool": "golangci-lint", "go.lintOnSave": "package", ``` Additional editor [integrations options are also available][lint-ide]. Alternatively, `golangci-lint` can be [installed][lint-install] and run locally: ```shell # use . or specify a path to only lint a package # to show all lint errors, use flags "--max-issues-per-linter=0 --max-same-issues=0" > golangci-lint run ``` To run across the entire repo for both `GOOS=windows` and `linux`: ```powershell > foreach ( $goos in ('windows', 'linux') ) { foreach ( $repo in ('.', 'test') ) { pwsh -Command "cd $repo && go env -w GOOS=$goos && golangci-lint.exe run --verbose" } } ``` ### Go Generate The pipeline checks that auto-generated code, via `go generate`, are up to date. Similar to the [linting stage](#linting), `go generate` is run in both the root and test Go modules. This can be done via: ```shell > go generate ./... > cd test && go generate ./... ``` ## Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ## Dependencies This project requires Golang 1.18 or newer to build. For system requirements to run this project, see the Microsoft docs on [Windows Container requirements](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/system-requirements). ## Reporting Security Issues Security issues and bugs should be reported privately, via email, to the Microsoft Security Response Center (MSRC) at [secure@microsoft.com](mailto:secure@microsoft.com). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Further information, including the [MSRC PGP](https://technet.microsoft.com/en-us/security/dn606155) key, can be found in the [Security TechCenter](https://technet.microsoft.com/en-us/security/default). For additional details, see [Report a Computer Security Vulnerability](https://technet.microsoft.com/en-us/security/ff852094.aspx) on Technet --------------- Copyright (c) 2018 Microsoft Corp. All rights reserved. [lint]: https://golangci-lint.run/ [lint-ide]: https://golangci-lint.run/usage/integrations/#editor-integration [lint-install]: https://golangci-lint.run/usage/install/#local-installation [git-commit-s]: https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s [git-rebase-s]: https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---signoff ================================================ FILE: vendor/github.com/Microsoft/hcsshim/SECURITY.md ================================================ ## Security Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. ## Reporting Security Issues **Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. ## Preferred Languages We prefer all communications to be in English. ## Policy Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). ================================================ FILE: vendor/github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options/doc.go ================================================ package options ================================================ FILE: vendor/github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options/runhcs.pb.go ================================================ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.35.2 // protoc v5.26.0 // source: github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options/runhcs.proto package options import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) type Options_DebugType int32 const ( Options_NPIPE Options_DebugType = 0 Options_FILE Options_DebugType = 1 Options_ETW Options_DebugType = 2 ) // Enum value maps for Options_DebugType. var ( Options_DebugType_name = map[int32]string{ 0: "NPIPE", 1: "FILE", 2: "ETW", } Options_DebugType_value = map[string]int32{ "NPIPE": 0, "FILE": 1, "ETW": 2, } ) func (x Options_DebugType) Enum() *Options_DebugType { p := new(Options_DebugType) *p = x return p } func (x Options_DebugType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Options_DebugType) Descriptor() protoreflect.EnumDescriptor { return file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes[0].Descriptor() } func (Options_DebugType) Type() protoreflect.EnumType { return &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes[0] } func (x Options_DebugType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Options_DebugType.Descriptor instead. func (Options_DebugType) EnumDescriptor() ([]byte, []int) { return file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP(), []int{0, 0} } type Options_SandboxIsolation int32 const ( Options_PROCESS Options_SandboxIsolation = 0 Options_HYPERVISOR Options_SandboxIsolation = 1 ) // Enum value maps for Options_SandboxIsolation. var ( Options_SandboxIsolation_name = map[int32]string{ 0: "PROCESS", 1: "HYPERVISOR", } Options_SandboxIsolation_value = map[string]int32{ "PROCESS": 0, "HYPERVISOR": 1, } ) func (x Options_SandboxIsolation) Enum() *Options_SandboxIsolation { p := new(Options_SandboxIsolation) *p = x return p } func (x Options_SandboxIsolation) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Options_SandboxIsolation) Descriptor() protoreflect.EnumDescriptor { return file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes[1].Descriptor() } func (Options_SandboxIsolation) Type() protoreflect.EnumType { return &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes[1] } func (x Options_SandboxIsolation) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Options_SandboxIsolation.Descriptor instead. func (Options_SandboxIsolation) EnumDescriptor() ([]byte, []int) { return file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP(), []int{0, 1} } // Options are the set of customizations that can be passed at Create time. type Options struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Enable debug tracing (sets the logrus log level to debug). This may be deprecated in the future, prefer // log_level as this will override debug if both of them are set. Debug bool `protobuf:"varint,1,opt,name=debug,proto3" json:"debug,omitempty"` // debug tracing output type DebugType Options_DebugType `protobuf:"varint,2,opt,name=debug_type,json=debugType,proto3,enum=containerd.runhcs.v1.Options_DebugType" json:"debug_type,omitempty"` // registry key root for storage of the runhcs container state RegistryRoot string `protobuf:"bytes,3,opt,name=registry_root,json=registryRoot,proto3" json:"registry_root,omitempty"` // sandbox_image is the image to use for the sandbox that matches the // sandbox_platform. SandboxImage string `protobuf:"bytes,4,opt,name=sandbox_image,json=sandboxImage,proto3" json:"sandbox_image,omitempty"` // sandbox_platform is a CRI setting that specifies the platform // architecture for all sandbox's in this runtime. Values are // 'windows/amd64' and 'linux/amd64'. SandboxPlatform string `protobuf:"bytes,5,opt,name=sandbox_platform,json=sandboxPlatform,proto3" json:"sandbox_platform,omitempty"` // sandbox_isolation is a CRI setting that specifies the isolation level of // the sandbox. For Windows runtime PROCESS and HYPERVISOR are valid. For // LCOW only HYPERVISOR is valid and default if omitted. SandboxIsolation Options_SandboxIsolation `protobuf:"varint,6,opt,name=sandbox_isolation,json=sandboxIsolation,proto3,enum=containerd.runhcs.v1.Options_SandboxIsolation" json:"sandbox_isolation,omitempty"` // boot_files_root_path is the path to the directory containing the LCOW // kernel and root FS files. BootFilesRootPath string `protobuf:"bytes,7,opt,name=boot_files_root_path,json=bootFilesRootPath,proto3" json:"boot_files_root_path,omitempty"` // vm_processor_count is the default number of processors to create for the // hypervisor isolated utility vm. // // The platform default if omitted is 2, unless the host only has a single // core in which case it is 1. VmProcessorCount int32 `protobuf:"varint,8,opt,name=vm_processor_count,json=vmProcessorCount,proto3" json:"vm_processor_count,omitempty"` // vm_memory_size_in_mb is the default amount of memory to assign to the // hypervisor isolated utility vm. // // The platform default is 1024MB if omitted. VmMemorySizeInMb int32 `protobuf:"varint,9,opt,name=vm_memory_size_in_mb,json=vmMemorySizeInMb,proto3" json:"vm_memory_size_in_mb,omitempty"` // GPUVHDPath is the path to the gpu vhd to add to the uvm // when a container requests a gpu GPUVHDPath string `protobuf:"bytes,10,opt,name=GPUVHDPath,proto3" json:"GPUVHDPath,omitempty"` // scale_cpu_limits_to_sandbox indicates that container CPU limits should // be adjusted to account for the difference in number of cores between the // host and UVM. ScaleCpuLimitsToSandbox bool `protobuf:"varint,11,opt,name=scale_cpu_limits_to_sandbox,json=scaleCpuLimitsToSandbox,proto3" json:"scale_cpu_limits_to_sandbox,omitempty"` // default_container_scratch_size_in_gb is the default scratch size (sandbox.vhdx) // to be used for containers. Every container will get a sandbox of `size_in_gb` assigned // instead of the default of 20GB. DefaultContainerScratchSizeInGb int32 `protobuf:"varint,12,opt,name=default_container_scratch_size_in_gb,json=defaultContainerScratchSizeInGb,proto3" json:"default_container_scratch_size_in_gb,omitempty"` // default_vm_scratch_size_in_gb is the default scratch size (sandbox.vhdx) // to be used for the UVM. This only applies to WCOW as LCOW doesn't mount a scratch // specifically for the UVM. DefaultVmScratchSizeInGb int32 `protobuf:"varint,13,opt,name=default_vm_scratch_size_in_gb,json=defaultVmScratchSizeInGb,proto3" json:"default_vm_scratch_size_in_gb,omitempty"` // share_scratch specifies if we'd like to reuse scratch space between multiple containers. // This currently only affects LCOW. The sandbox containers scratch space is re-used for all // subsequent containers launched in the pod. ShareScratch bool `protobuf:"varint,14,opt,name=share_scratch,json=shareScratch,proto3" json:"share_scratch,omitempty"` // NCProxyAddr is the address of the network configuration proxy service. If omitted // the network is setup locally. NCProxyAddr string `protobuf:"bytes,15,opt,name=NCProxyAddr,proto3" json:"NCProxyAddr,omitempty"` // log_level specifies the logrus log level for the shim. Supported values are a string representation of the // logrus log levels: "trace", "debug", "info", "warn", "error", "fatal", "panic". This setting will override // the `debug` field if both are specified, unless the level specified is also "debug", as these are equivalent. LogLevel string `protobuf:"bytes,16,opt,name=log_level,json=logLevel,proto3" json:"log_level,omitempty"` // io_retry_timeout_in_sec is the timeout in seconds for how long to try and reconnect to an upstream IO provider if a connection is lost. // The typical example is if Containerd has restarted but is expected to come back online. A 0 for this field is interpreted as an infinite // timeout. IoRetryTimeoutInSec int32 `protobuf:"varint,17,opt,name=io_retry_timeout_in_sec,json=ioRetryTimeoutInSec,proto3" json:"io_retry_timeout_in_sec,omitempty"` // default_container_annotations specifies a set of annotations that should be set for every workload container DefaultContainerAnnotations map[string]string `protobuf:"bytes,18,rep,name=default_container_annotations,json=defaultContainerAnnotations,proto3" json:"default_container_annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // no_inherit_host_timezone specifies to skip inheriting the hosts time zone for WCOW UVMs and instead default to // UTC. NoInheritHostTimezone bool `protobuf:"varint,19,opt,name=no_inherit_host_timezone,json=noInheritHostTimezone,proto3" json:"no_inherit_host_timezone,omitempty"` // scrub_logs enables removing environment variables and other potentially sensitive information from logs ScrubLogs bool `protobuf:"varint,20,opt,name=scrub_logs,json=scrubLogs,proto3" json:"scrub_logs,omitempty"` } func (x *Options) Reset() { *x = Options{} mi := &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *Options) String() string { return protoimpl.X.MessageStringOf(x) } func (*Options) ProtoMessage() {} func (x *Options) ProtoReflect() protoreflect.Message { mi := &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Options.ProtoReflect.Descriptor instead. func (*Options) Descriptor() ([]byte, []int) { return file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP(), []int{0} } func (x *Options) GetDebug() bool { if x != nil { return x.Debug } return false } func (x *Options) GetDebugType() Options_DebugType { if x != nil { return x.DebugType } return Options_NPIPE } func (x *Options) GetRegistryRoot() string { if x != nil { return x.RegistryRoot } return "" } func (x *Options) GetSandboxImage() string { if x != nil { return x.SandboxImage } return "" } func (x *Options) GetSandboxPlatform() string { if x != nil { return x.SandboxPlatform } return "" } func (x *Options) GetSandboxIsolation() Options_SandboxIsolation { if x != nil { return x.SandboxIsolation } return Options_PROCESS } func (x *Options) GetBootFilesRootPath() string { if x != nil { return x.BootFilesRootPath } return "" } func (x *Options) GetVmProcessorCount() int32 { if x != nil { return x.VmProcessorCount } return 0 } func (x *Options) GetVmMemorySizeInMb() int32 { if x != nil { return x.VmMemorySizeInMb } return 0 } func (x *Options) GetGPUVHDPath() string { if x != nil { return x.GPUVHDPath } return "" } func (x *Options) GetScaleCpuLimitsToSandbox() bool { if x != nil { return x.ScaleCpuLimitsToSandbox } return false } func (x *Options) GetDefaultContainerScratchSizeInGb() int32 { if x != nil { return x.DefaultContainerScratchSizeInGb } return 0 } func (x *Options) GetDefaultVmScratchSizeInGb() int32 { if x != nil { return x.DefaultVmScratchSizeInGb } return 0 } func (x *Options) GetShareScratch() bool { if x != nil { return x.ShareScratch } return false } func (x *Options) GetNCProxyAddr() string { if x != nil { return x.NCProxyAddr } return "" } func (x *Options) GetLogLevel() string { if x != nil { return x.LogLevel } return "" } func (x *Options) GetIoRetryTimeoutInSec() int32 { if x != nil { return x.IoRetryTimeoutInSec } return 0 } func (x *Options) GetDefaultContainerAnnotations() map[string]string { if x != nil { return x.DefaultContainerAnnotations } return nil } func (x *Options) GetNoInheritHostTimezone() bool { if x != nil { return x.NoInheritHostTimezone } return false } func (x *Options) GetScrubLogs() bool { if x != nil { return x.ScrubLogs } return false } // ProcessDetails contains additional information about a process. This is the additional // info returned in the Pids query. type ProcessDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields ImageName string `protobuf:"bytes,1,opt,name=image_name,json=imageName,proto3" json:"image_name,omitempty"` CreatedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` KernelTime_100Ns uint64 `protobuf:"varint,3,opt,name=kernel_time_100_ns,json=kernelTime100Ns,proto3" json:"kernel_time_100_ns,omitempty"` MemoryCommitBytes uint64 `protobuf:"varint,4,opt,name=memory_commit_bytes,json=memoryCommitBytes,proto3" json:"memory_commit_bytes,omitempty"` MemoryWorkingSetPrivateBytes uint64 `protobuf:"varint,5,opt,name=memory_working_set_private_bytes,json=memoryWorkingSetPrivateBytes,proto3" json:"memory_working_set_private_bytes,omitempty"` MemoryWorkingSetSharedBytes uint64 `protobuf:"varint,6,opt,name=memory_working_set_shared_bytes,json=memoryWorkingSetSharedBytes,proto3" json:"memory_working_set_shared_bytes,omitempty"` ProcessID uint32 `protobuf:"varint,7,opt,name=process_id,json=processId,proto3" json:"process_id,omitempty"` UserTime_100Ns uint64 `protobuf:"varint,8,opt,name=user_time_100_ns,json=userTime100Ns,proto3" json:"user_time_100_ns,omitempty"` ExecID string `protobuf:"bytes,9,opt,name=exec_id,json=execId,proto3" json:"exec_id,omitempty"` } func (x *ProcessDetails) Reset() { *x = ProcessDetails{} mi := &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } func (x *ProcessDetails) String() string { return protoimpl.X.MessageStringOf(x) } func (*ProcessDetails) ProtoMessage() {} func (x *ProcessDetails) ProtoReflect() protoreflect.Message { mi := &file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ProcessDetails.ProtoReflect.Descriptor instead. func (*ProcessDetails) Descriptor() ([]byte, []int) { return file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP(), []int{1} } func (x *ProcessDetails) GetImageName() string { if x != nil { return x.ImageName } return "" } func (x *ProcessDetails) GetCreatedAt() *timestamppb.Timestamp { if x != nil { return x.CreatedAt } return nil } func (x *ProcessDetails) GetKernelTime_100Ns() uint64 { if x != nil { return x.KernelTime_100Ns } return 0 } func (x *ProcessDetails) GetMemoryCommitBytes() uint64 { if x != nil { return x.MemoryCommitBytes } return 0 } func (x *ProcessDetails) GetMemoryWorkingSetPrivateBytes() uint64 { if x != nil { return x.MemoryWorkingSetPrivateBytes } return 0 } func (x *ProcessDetails) GetMemoryWorkingSetSharedBytes() uint64 { if x != nil { return x.MemoryWorkingSetSharedBytes } return 0 } func (x *ProcessDetails) GetProcessID() uint32 { if x != nil { return x.ProcessID } return 0 } func (x *ProcessDetails) GetUserTime_100Ns() uint64 { if x != nil { return x.UserTime_100Ns } return 0 } func (x *ProcessDetails) GetExecID() string { if x != nil { return x.ExecID } return "" } var File_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto protoreflect.FileDescriptor var file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDesc = []byte{ 0x0a, 0x4f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2f, 0x68, 0x63, 0x73, 0x73, 0x68, 0x69, 0x6d, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2d, 0x73, 0x68, 0x69, 0x6d, 0x2d, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2d, 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd9, 0x09, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x12, 0x46, 0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x64, 0x65, 0x62, 0x75, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x5b, 0x0a, 0x11, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x62, 0x6f, 0x6f, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x76, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x6d, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x14, 0x76, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x6d, 0x62, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x6d, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x4d, 0x62, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x50, 0x55, 0x56, 0x48, 0x44, 0x50, 0x61, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x47, 0x50, 0x55, 0x56, 0x48, 0x44, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x1b, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x54, 0x6f, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x12, 0x4d, 0x0a, 0x24, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x62, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x47, 0x62, 0x12, 0x3f, 0x0a, 0x1d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x6d, 0x5f, 0x73, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x6d, 0x53, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x47, 0x62, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x73, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x65, 0x53, 0x63, 0x72, 0x61, 0x74, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x43, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x41, 0x64, 0x64, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4e, 0x43, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x34, 0x0a, 0x17, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x69, 0x6f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x12, 0x82, 0x01, 0x0a, 0x1d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x1b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6e, 0x6f, 0x5f, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6e, 0x6f, 0x49, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x63, 0x72, 0x75, 0x62, 0x4c, 0x6f, 0x67, 0x73, 0x1a, 0x4e, 0x0a, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x29, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x50, 0x49, 0x50, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x54, 0x57, 0x10, 0x02, 0x22, 0x2f, 0x0a, 0x10, 0x53, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x59, 0x50, 0x45, 0x52, 0x56, 0x49, 0x53, 0x4f, 0x52, 0x10, 0x01, 0x22, 0xb6, 0x03, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x31, 0x30, 0x30, 0x4e, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x31, 0x30, 0x30, 0x4e, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x78, 0x65, 0x63, 0x49, 0x64, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2f, 0x68, 0x63, 0x73, 0x73, 0x68, 0x69, 0x6d, 0x2f, 0x63, 0x6d, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x2d, 0x73, 0x68, 0x69, 0x6d, 0x2d, 0x72, 0x75, 0x6e, 0x68, 0x63, 0x73, 0x2d, 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescOnce sync.Once file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescData = file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDesc ) func file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescGZIP() []byte { file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescOnce.Do(func() { file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescData) }) return file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDescData } var file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_goTypes = []any{ (Options_DebugType)(0), // 0: containerd.runhcs.v1.Options.DebugType (Options_SandboxIsolation)(0), // 1: containerd.runhcs.v1.Options.SandboxIsolation (*Options)(nil), // 2: containerd.runhcs.v1.Options (*ProcessDetails)(nil), // 3: containerd.runhcs.v1.ProcessDetails nil, // 4: containerd.runhcs.v1.Options.DefaultContainerAnnotationsEntry (*timestamppb.Timestamp)(nil), // 5: google.protobuf.Timestamp } var file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_depIdxs = []int32{ 0, // 0: containerd.runhcs.v1.Options.debug_type:type_name -> containerd.runhcs.v1.Options.DebugType 1, // 1: containerd.runhcs.v1.Options.sandbox_isolation:type_name -> containerd.runhcs.v1.Options.SandboxIsolation 4, // 2: containerd.runhcs.v1.Options.default_container_annotations:type_name -> containerd.runhcs.v1.Options.DefaultContainerAnnotationsEntry 5, // 3: containerd.runhcs.v1.ProcessDetails.created_at:type_name -> google.protobuf.Timestamp 4, // [4:4] is the sub-list for method output_type 4, // [4:4] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name 4, // [4:4] is the sub-list for extension extendee 0, // [0:4] is the sub-list for field type_name } func init() { file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_init() } func file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_init() { if File_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDesc, NumEnums: 2, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, GoTypes: file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_goTypes, DependencyIndexes: file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_depIdxs, EnumInfos: file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_enumTypes, MessageInfos: file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_msgTypes, }.Build() File_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto = out.File file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_rawDesc = nil file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_goTypes = nil file_github_com_Microsoft_hcsshim_cmd_containerd_shim_runhcs_v1_options_runhcs_proto_depIdxs = nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options/runhcs.proto ================================================ syntax = "proto3"; package containerd.runhcs.v1; import "google/protobuf/timestamp.proto"; option go_package = "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options"; // Options are the set of customizations that can be passed at Create time. message Options { // Enable debug tracing (sets the logrus log level to debug). This may be deprecated in the future, prefer // log_level as this will override debug if both of them are set. bool debug = 1; enum DebugType { NPIPE = 0; FILE = 1; ETW = 2; } // debug tracing output type DebugType debug_type = 2; // registry key root for storage of the runhcs container state string registry_root = 3; // sandbox_image is the image to use for the sandbox that matches the // sandbox_platform. string sandbox_image = 4; // sandbox_platform is a CRI setting that specifies the platform // architecture for all sandbox's in this runtime. Values are // 'windows/amd64' and 'linux/amd64'. string sandbox_platform = 5; enum SandboxIsolation { PROCESS = 0; HYPERVISOR = 1; } // sandbox_isolation is a CRI setting that specifies the isolation level of // the sandbox. For Windows runtime PROCESS and HYPERVISOR are valid. For // LCOW only HYPERVISOR is valid and default if omitted. SandboxIsolation sandbox_isolation = 6; // boot_files_root_path is the path to the directory containing the LCOW // kernel and root FS files. string boot_files_root_path = 7; // vm_processor_count is the default number of processors to create for the // hypervisor isolated utility vm. // // The platform default if omitted is 2, unless the host only has a single // core in which case it is 1. int32 vm_processor_count = 8; // vm_memory_size_in_mb is the default amount of memory to assign to the // hypervisor isolated utility vm. // // The platform default is 1024MB if omitted. int32 vm_memory_size_in_mb = 9; // GPUVHDPath is the path to the gpu vhd to add to the uvm // when a container requests a gpu string GPUVHDPath = 10; // scale_cpu_limits_to_sandbox indicates that container CPU limits should // be adjusted to account for the difference in number of cores between the // host and UVM. bool scale_cpu_limits_to_sandbox = 11; // default_container_scratch_size_in_gb is the default scratch size (sandbox.vhdx) // to be used for containers. Every container will get a sandbox of `size_in_gb` assigned // instead of the default of 20GB. int32 default_container_scratch_size_in_gb = 12; // default_vm_scratch_size_in_gb is the default scratch size (sandbox.vhdx) // to be used for the UVM. This only applies to WCOW as LCOW doesn't mount a scratch // specifically for the UVM. int32 default_vm_scratch_size_in_gb = 13; // share_scratch specifies if we'd like to reuse scratch space between multiple containers. // This currently only affects LCOW. The sandbox containers scratch space is re-used for all // subsequent containers launched in the pod. bool share_scratch = 14; // NCProxyAddr is the address of the network configuration proxy service. If omitted // the network is setup locally. string NCProxyAddr = 15; // log_level specifies the logrus log level for the shim. Supported values are a string representation of the // logrus log levels: "trace", "debug", "info", "warn", "error", "fatal", "panic". This setting will override // the `debug` field if both are specified, unless the level specified is also "debug", as these are equivalent. string log_level = 16; // io_retry_timeout_in_sec is the timeout in seconds for how long to try and reconnect to an upstream IO provider if a connection is lost. // The typical example is if Containerd has restarted but is expected to come back online. A 0 for this field is interpreted as an infinite // timeout. int32 io_retry_timeout_in_sec = 17; // default_container_annotations specifies a set of annotations that should be set for every workload container map default_container_annotations = 18; // no_inherit_host_timezone specifies to skip inheriting the hosts time zone for WCOW UVMs and instead default to // UTC. bool no_inherit_host_timezone = 19; // scrub_logs enables removing environment variables and other potentially sensitive information from logs bool scrub_logs = 20; } // ProcessDetails contains additional information about a process. This is the additional // info returned in the Pids query. message ProcessDetails { string image_name = 1; google.protobuf.Timestamp created_at = 2; uint64 kernel_time_100_ns = 3; uint64 memory_commit_bytes = 4; uint64 memory_working_set_private_bytes = 5; uint64 memory_working_set_shared_bytes = 6; uint32 process_id = 7; uint64 user_time_100_ns = 8; string exec_id = 9; } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/attach.go ================================================ //go:build windows package computestorage import ( "context" "encoding/json" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "go.opencensus.io/trace" ) // AttachLayerStorageFilter sets up the layer storage filter on a writable // container layer. // // `layerPath` is a path to a directory the writable layer is mounted. If the // path does not end in a `\` the platform will append it automatically. // // `layerData` is the parent read-only layer data. func AttachLayerStorageFilter(ctx context.Context, layerPath string, layerData LayerData) (err error) { title := "hcsshim::AttachLayerStorageFilter" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("layerPath", layerPath), ) bytes, err := json.Marshal(layerData) if err != nil { return err } err = hcsAttachLayerStorageFilter(layerPath, string(bytes)) if err != nil { return errors.Wrap(err, "failed to attach layer storage filter") } return nil } // AttachOverlayFilter sets up a filter of the given type on a writable container layer. Currently the only // supported filter types are WCIFS & UnionFS (defined in internal/hcs/schema2/layer.go) // // `volumePath` is volume path at which writable layer is mounted. If the // path does not end in a `\` the platform will append it automatically. // // `layerData` is the parent read-only layer data. func AttachOverlayFilter(ctx context.Context, volumePath string, layerData LayerData) (err error) { title := "hcsshim::AttachOverlayFilter" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("volumePath", volumePath), ) bytes, err := json.Marshal(layerData) if err != nil { return err } err = hcsAttachOverlayFilter(volumePath, string(bytes)) if err != nil { return errors.Wrap(err, "failed to attach overlay filter") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/destroy.go ================================================ //go:build windows package computestorage import ( "context" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "go.opencensus.io/trace" ) // DestroyLayer deletes a container layer. // // `layerPath` is a path to a directory containing the layer to export. func DestroyLayer(ctx context.Context, layerPath string) (err error) { title := "hcsshim::DestroyLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("layerPath", layerPath)) err = hcsDestroyLayer(layerPath) if err != nil { return errors.Wrap(err, "failed to destroy layer") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/detach.go ================================================ //go:build windows package computestorage import ( "context" "encoding/json" hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "go.opencensus.io/trace" ) // DetachLayerStorageFilter detaches the layer storage filter on a writable container layer. // // `layerPath` is a path to a directory containing the layer to export. func DetachLayerStorageFilter(ctx context.Context, layerPath string) (err error) { title := "hcsshim::DetachLayerStorageFilter" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("layerPath", layerPath)) err = hcsDetachLayerStorageFilter(layerPath) if err != nil { return errors.Wrap(err, "failed to detach layer storage filter") } return nil } // DetachOverlayFilter detaches the filter on a writable container layer. // // `volumePath` is a path to writable container volume. func DetachOverlayFilter(ctx context.Context, volumePath string, filterType hcsschema.FileSystemFilterType) (err error) { title := "hcsshim::DetachOverlayFilter" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("volumePath", volumePath)) layerData := LayerData{} layerData.FilterType = filterType bytes, err := json.Marshal(layerData) if err != nil { return err } err = hcsDetachOverlayFilter(volumePath, string(bytes)) if err != nil { return errors.Wrap(err, "failed to detach overlay filter") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/export.go ================================================ //go:build windows package computestorage import ( "context" "encoding/json" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "go.opencensus.io/trace" ) // ExportLayer exports a container layer. // // `layerPath` is a path to a directory containing the layer to export. // // `exportFolderPath` is a pre-existing folder to export the layer to. // // `layerData` is the parent layer data. // // `options` are the export options applied to the exported layer. func ExportLayer(ctx context.Context, layerPath, exportFolderPath string, layerData LayerData, options ExportLayerOptions) (err error) { title := "hcsshim::ExportLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("layerPath", layerPath), trace.StringAttribute("exportFolderPath", exportFolderPath), ) ldBytes, err := json.Marshal(layerData) if err != nil { return err } oBytes, err := json.Marshal(options) if err != nil { return err } err = hcsExportLayer(layerPath, exportFolderPath, string(ldBytes), string(oBytes)) if err != nil { return errors.Wrap(err, "failed to export layer") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/format.go ================================================ //go:build windows package computestorage import ( "context" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "golang.org/x/sys/windows" ) // FormatWritableLayerVhd formats a virtual disk for use as a writable container layer. // // If the VHD is not mounted it will be temporarily mounted. // // NOTE: This API had a breaking change in the operating system after Windows Server 2019. // On ws2019 the API expects to get passed a file handle from CreateFile for the vhd that // the caller wants to format. On > ws2019, its expected that the caller passes a vhd handle // that can be obtained from the virtdisk APIs. func FormatWritableLayerVhd(ctx context.Context, vhdHandle windows.Handle) (err error) { title := "hcsshim::FormatWritableLayerVhd" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() err = hcsFormatWritableLayerVhd(vhdHandle) if err != nil { return errors.Wrap(err, "failed to format writable layer vhd") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/helpers.go ================================================ //go:build windows package computestorage import ( "context" "os" "path/filepath" "syscall" "github.com/Microsoft/go-winio/vhd" "github.com/Microsoft/hcsshim/internal/memory" "github.com/pkg/errors" "golang.org/x/sys/windows" "github.com/Microsoft/hcsshim/internal/security" ) const ( defaultVHDXBlockSizeInMB = 1 ) // SetupContainerBaseLayer is a helper to setup a containers scratch. It // will create and format the vhdx's inside and the size is configurable with the sizeInGB // parameter. // // `layerPath` is the path to the base container layer on disk. // // `baseVhdPath` is the path to where the base vhdx for the base layer should be created. // // `diffVhdPath` is the path where the differencing disk for the base layer should be created. // // `sizeInGB` is the size in gigabytes to make the base vhdx. func SetupContainerBaseLayer(ctx context.Context, layerPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) { var ( hivesPath = filepath.Join(layerPath, "Hives") layoutPath = filepath.Join(layerPath, "Layout") ) // We need to remove the hives directory and layout file as `SetupBaseOSLayer` fails if these files // already exist. `SetupBaseOSLayer` will create these files internally. We also remove the base and // differencing disks if they exist in case we're asking for a different size. if _, err := os.Stat(hivesPath); err == nil { if err := os.RemoveAll(hivesPath); err != nil { return errors.Wrap(err, "failed to remove prexisting hives directory") } } if _, err := os.Stat(layoutPath); err == nil { if err := os.RemoveAll(layoutPath); err != nil { return errors.Wrap(err, "failed to remove prexisting layout file") } } if _, err := os.Stat(baseVhdPath); err == nil { if err := os.RemoveAll(baseVhdPath); err != nil { return errors.Wrap(err, "failed to remove base vhdx path") } } if _, err := os.Stat(diffVhdPath); err == nil { if err := os.RemoveAll(diffVhdPath); err != nil { return errors.Wrap(err, "failed to remove differencing vhdx") } } createParams := &vhd.CreateVirtualDiskParameters{ Version: 2, Version2: vhd.CreateVersion2{ MaximumSize: sizeInGB * memory.GiB, BlockSizeInBytes: defaultVHDXBlockSizeInMB * memory.MiB, }, } handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams) if err != nil { return errors.Wrap(err, "failed to create vhdx") } defer func() { if err != nil { _ = syscall.CloseHandle(handle) os.RemoveAll(baseVhdPath) os.RemoveAll(diffVhdPath) } }() if err = FormatWritableLayerVhd(ctx, windows.Handle(handle)); err != nil { return err } // Base vhd handle must be closed before calling SetupBaseLayer in case of Container layer if err = syscall.CloseHandle(handle); err != nil { return errors.Wrap(err, "failed to close vhdx handle") } options := OsLayerOptions{ Type: OsLayerTypeContainer, } // SetupBaseOSLayer expects an empty vhd handle for a container layer and will // error out otherwise. if err = SetupBaseOSLayer(ctx, layerPath, 0, options); err != nil { return err } // Create the differencing disk that will be what's copied for the final rw layer // for a container. if err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil { return errors.Wrap(err, "failed to create differencing disk") } if err = security.GrantVmGroupAccess(baseVhdPath); err != nil { return errors.Wrapf(err, "failed to grant vm group access to %s", baseVhdPath) } if err = security.GrantVmGroupAccess(diffVhdPath); err != nil { return errors.Wrapf(err, "failed to grant vm group access to %s", diffVhdPath) } return nil } // SetupUtilityVMBaseLayer is a helper to setup a UVMs scratch space. It will create and format // the vhdx inside and the size is configurable by the sizeInGB parameter. // // `uvmPath` is the path to the UtilityVM filesystem. // // `baseVhdPath` is the path to where the base vhdx for the UVM should be created. // // `diffVhdPath` is the path where the differencing disk for the UVM should be created. // // `sizeInGB` specifies the size in gigabytes to make the base vhdx. func SetupUtilityVMBaseLayer(ctx context.Context, uvmPath, baseVhdPath, diffVhdPath string, sizeInGB uint64) (err error) { // Remove the base and differencing disks if they exist in case we're asking for a different size. if _, err := os.Stat(baseVhdPath); err == nil { if err := os.RemoveAll(baseVhdPath); err != nil { return errors.Wrap(err, "failed to remove base vhdx") } } if _, err := os.Stat(diffVhdPath); err == nil { if err := os.RemoveAll(diffVhdPath); err != nil { return errors.Wrap(err, "failed to remove differencing vhdx") } } // Just create the vhdx for utilityVM layer, no need to format it. createParams := &vhd.CreateVirtualDiskParameters{ Version: 2, Version2: vhd.CreateVersion2{ MaximumSize: sizeInGB * memory.GiB, BlockSizeInBytes: defaultVHDXBlockSizeInMB * memory.MiB, }, } handle, err := vhd.CreateVirtualDisk(baseVhdPath, vhd.VirtualDiskAccessNone, vhd.CreateVirtualDiskFlagNone, createParams) if err != nil { return errors.Wrap(err, "failed to create vhdx") } defer func() { if err != nil { _ = syscall.CloseHandle(handle) os.RemoveAll(baseVhdPath) os.RemoveAll(diffVhdPath) } }() // If it is a UtilityVM layer then the base vhdx must be attached when calling // `SetupBaseOSLayer` attachParams := &vhd.AttachVirtualDiskParameters{ Version: 2, } if err := vhd.AttachVirtualDisk(handle, vhd.AttachVirtualDiskFlagNone, attachParams); err != nil { return errors.Wrapf(err, "failed to attach virtual disk") } options := OsLayerOptions{ Type: OsLayerTypeVM, } if err := SetupBaseOSLayer(ctx, uvmPath, windows.Handle(handle), options); err != nil { return err } // Detach and close the handle after setting up the layer as we don't need the handle // for anything else and we no longer need to be attached either. if err = vhd.DetachVirtualDisk(handle); err != nil { return errors.Wrap(err, "failed to detach vhdx") } if err = syscall.CloseHandle(handle); err != nil { return errors.Wrap(err, "failed to close vhdx handle") } // Create the differencing disk that will be what's copied for the final rw layer // for a container. if err = vhd.CreateDiffVhd(diffVhdPath, baseVhdPath, defaultVHDXBlockSizeInMB); err != nil { return errors.Wrap(err, "failed to create differencing disk") } if err := security.GrantVmGroupAccess(baseVhdPath); err != nil { return errors.Wrapf(err, "failed to grant vm group access to %s", baseVhdPath) } if err := security.GrantVmGroupAccess(diffVhdPath); err != nil { return errors.Wrapf(err, "failed to grant vm group access to %s", diffVhdPath) } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/import.go ================================================ //go:build windows package computestorage import ( "context" "encoding/json" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "go.opencensus.io/trace" ) // ImportLayer imports a container layer. // // `layerPath` is a path to a directory to import the layer to. If the directory // does not exist it will be automatically created. // // `sourceFolderpath` is a pre-existing folder that contains the layer to // import. // // `layerData` is the parent layer data. func ImportLayer(ctx context.Context, layerPath, sourceFolderPath string, layerData LayerData) (err error) { title := "hcsshim::ImportLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("layerPath", layerPath), trace.StringAttribute("sourceFolderPath", sourceFolderPath), ) bytes, err := json.Marshal(layerData) if err != nil { return err } err = hcsImportLayer(layerPath, sourceFolderPath, string(bytes)) if err != nil { return errors.Wrap(err, "failed to import layer") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/initialize.go ================================================ //go:build windows package computestorage import ( "context" "encoding/json" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "go.opencensus.io/trace" ) // InitializeWritableLayer initializes a writable layer for a container. // // `layerPath` is a path to a directory the layer is mounted. If the // path does not end in a `\` the platform will append it automatically. // // `layerData` is the parent read-only layer data. func InitializeWritableLayer(ctx context.Context, layerPath string, layerData LayerData) (err error) { title := "hcsshim::InitializeWritableLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("layerPath", layerPath), ) bytes, err := json.Marshal(layerData) if err != nil { return err } // Options are not used in the platform as of RS5 err = hcsInitializeWritableLayer(layerPath, string(bytes), "") if err != nil { return errors.Wrap(err, "failed to intitialize container layer") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/mount.go ================================================ //go:build windows package computestorage import ( "context" "github.com/Microsoft/hcsshim/internal/interop" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "golang.org/x/sys/windows" ) // GetLayerVhdMountPath returns the volume path for a virtual disk of a writable container layer. func GetLayerVhdMountPath(ctx context.Context, vhdHandle windows.Handle) (path string, err error) { title := "hcsshim::GetLayerVhdMountPath" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() var mountPath *uint16 err = hcsGetLayerVhdMountPath(vhdHandle, &mountPath) if err != nil { return "", errors.Wrap(err, "failed to get vhd mount path") } path = interop.ConvertAndFreeCoTaskMemString(mountPath) return path, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/setup.go ================================================ //go:build windows package computestorage import ( "context" "encoding/json" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/osversion" "github.com/pkg/errors" "go.opencensus.io/trace" "golang.org/x/sys/windows" ) // SetupBaseOSLayer sets up a layer that contains a base OS for a container. // // `layerPath` is a path to a directory containing the layer. // // `vhdHandle` is an empty file handle of `options.Type == OsLayerTypeContainer` // or else it is a file handle to the 'SystemTemplateBase.vhdx' if `options.Type // == OsLayerTypeVm`. // // `options` are the options applied while processing the layer. func SetupBaseOSLayer(ctx context.Context, layerPath string, vhdHandle windows.Handle, options OsLayerOptions) (err error) { title := "hcsshim::SetupBaseOSLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("layerPath", layerPath), ) bytes, err := json.Marshal(options) if err != nil { return err } err = hcsSetupBaseOSLayer(layerPath, vhdHandle, string(bytes)) if err != nil { return errors.Wrap(err, "failed to setup base OS layer") } return nil } // SetupBaseOSVolume sets up a volume that contains a base OS for a container. // // `layerPath` is a path to a directory containing the layer. // // `volumePath` is the path to the volume to be used for setup. // // `options` are the options applied while processing the layer. // // NOTE: This API is only available on builds of Windows greater than 19645. Inside we // check if the hosts build has the API available by using 'GetVersion' which requires // the calling application to be manifested. https://docs.microsoft.com/en-us/windows/win32/sbscs/manifests func SetupBaseOSVolume(ctx context.Context, layerPath, volumePath string, options OsLayerOptions) (err error) { if osversion.Build() < 19645 { return errors.New("SetupBaseOSVolume is not present on builds older than 19645") } title := "hcsshim::SetupBaseOSVolume" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("layerPath", layerPath), trace.StringAttribute("volumePath", volumePath), ) bytes, err := json.Marshal(options) if err != nil { return err } err = hcsSetupBaseOSVolume(layerPath, volumePath, string(bytes)) if err != nil { return errors.Wrap(err, "failed to setup base OS layer") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/storage.go ================================================ // Package computestorage is a wrapper around the HCS storage APIs. These are new storage APIs introduced // separate from the original graphdriver calls intended to give more freedom around creating // and managing container layers and scratch spaces. package computestorage import ( hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" ) //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go storage.go //sys hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) = computestorage.HcsImportLayer? //sys hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) = computestorage.HcsExportLayer? //sys hcsDestroyLayer(layerPath string) (hr error) = computestorage.HcsDestroyLayer? //sys hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) = computestorage.HcsSetupBaseOSLayer? //sys hcsInitializeWritableLayer(writableLayerPath string, layerData string, options string) (hr error) = computestorage.HcsInitializeWritableLayer? //sys hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) = computestorage.HcsAttachLayerStorageFilter? //sys hcsDetachLayerStorageFilter(layerPath string) (hr error) = computestorage.HcsDetachLayerStorageFilter? //sys hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) = computestorage.HcsFormatWritableLayerVhd? //sys hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) = computestorage.HcsGetLayerVhdMountPath? //sys hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) = computestorage.HcsSetupBaseOSVolume? //sys hcsAttachOverlayFilter(volumePath string, layerData string) (hr error) = computestorage.HcsAttachOverlayFilter? //sys hcsDetachOverlayFilter(volumePath string, layerData string) (hr error) = computestorage.HcsDetachOverlayFilter? type Version = hcsschema.Version type Layer = hcsschema.Layer // LayerData is the data used to describe parent layer information. type LayerData struct { SchemaVersion Version `json:"SchemaVersion,omitempty"` Layers []Layer `json:"Layers,omitempty"` FilterType hcsschema.FileSystemFilterType `json:"FilterType,omitempty"` } // ExportLayerOptions are the set of options that are used with the `computestorage.HcsExportLayer` syscall. type ExportLayerOptions struct { IsWritableLayer bool `json:"IsWritableLayer,omitempty"` } // OsLayerType is the type of layer being operated on. type OsLayerType string const ( // OsLayerTypeContainer is a container layer. OsLayerTypeContainer OsLayerType = "Container" // OsLayerTypeVM is a virtual machine layer. OsLayerTypeVM OsLayerType = "Vm" ) // OsLayerOptions are the set of options that are used with the `SetupBaseOSLayer` and // `SetupBaseOSVolume` calls. type OsLayerOptions struct { Type OsLayerType `json:"Type,omitempty"` DisableCiCacheOptimization bool `json:"DisableCiCacheOptimization,omitempty"` SkipUpdateBcdForBoot bool `json:"SkipUpdateBcdForBoot,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package computestorage import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modcomputestorage = windows.NewLazySystemDLL("computestorage.dll") procHcsAttachLayerStorageFilter = modcomputestorage.NewProc("HcsAttachLayerStorageFilter") procHcsAttachOverlayFilter = modcomputestorage.NewProc("HcsAttachOverlayFilter") procHcsDestroyLayer = modcomputestorage.NewProc("HcsDestroyLayer") procHcsDetachLayerStorageFilter = modcomputestorage.NewProc("HcsDetachLayerStorageFilter") procHcsDetachOverlayFilter = modcomputestorage.NewProc("HcsDetachOverlayFilter") procHcsExportLayer = modcomputestorage.NewProc("HcsExportLayer") procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd") procHcsGetLayerVhdMountPath = modcomputestorage.NewProc("HcsGetLayerVhdMountPath") procHcsImportLayer = modcomputestorage.NewProc("HcsImportLayer") procHcsInitializeWritableLayer = modcomputestorage.NewProc("HcsInitializeWritableLayer") procHcsSetupBaseOSLayer = modcomputestorage.NewProc("HcsSetupBaseOSLayer") procHcsSetupBaseOSVolume = modcomputestorage.NewProc("HcsSetupBaseOSVolume") ) func hcsAttachLayerStorageFilter(layerPath string, layerData string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(layerData) if hr != nil { return } return _hcsAttachLayerStorageFilter(_p0, _p1) } func _hcsAttachLayerStorageFilter(layerPath *uint16, layerData *uint16) (hr error) { hr = procHcsAttachLayerStorageFilter.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsAttachLayerStorageFilter.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(layerData))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsAttachOverlayFilter(volumePath string, layerData string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(volumePath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(layerData) if hr != nil { return } return _hcsAttachOverlayFilter(_p0, _p1) } func _hcsAttachOverlayFilter(volumePath *uint16, layerData *uint16) (hr error) { hr = procHcsAttachOverlayFilter.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsAttachOverlayFilter.Addr(), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(layerData))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsDestroyLayer(layerPath string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) if hr != nil { return } return _hcsDestroyLayer(_p0) } func _hcsDestroyLayer(layerPath *uint16) (hr error) { hr = procHcsDestroyLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsDestroyLayer.Addr(), uintptr(unsafe.Pointer(layerPath))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsDetachLayerStorageFilter(layerPath string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) if hr != nil { return } return _hcsDetachLayerStorageFilter(_p0) } func _hcsDetachLayerStorageFilter(layerPath *uint16) (hr error) { hr = procHcsDetachLayerStorageFilter.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsDetachLayerStorageFilter.Addr(), uintptr(unsafe.Pointer(layerPath))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsDetachOverlayFilter(volumePath string, layerData string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(volumePath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(layerData) if hr != nil { return } return _hcsDetachOverlayFilter(_p0, _p1) } func _hcsDetachOverlayFilter(volumePath *uint16, layerData *uint16) (hr error) { hr = procHcsDetachOverlayFilter.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsDetachOverlayFilter.Addr(), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(layerData))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(exportFolderPath) if hr != nil { return } var _p2 *uint16 _p2, hr = syscall.UTF16PtrFromString(layerData) if hr != nil { return } var _p3 *uint16 _p3, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsExportLayer(_p0, _p1, _p2, _p3) } func _hcsExportLayer(layerPath *uint16, exportFolderPath *uint16, layerData *uint16, options *uint16) (hr error) { hr = procHcsExportLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsExportLayer.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(exportFolderPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) { hr = procHcsFormatWritableLayerVhd.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsFormatWritableLayerVhd.Addr(), uintptr(handle)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) { hr = procHcsGetLayerVhdMountPath.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsGetLayerVhdMountPath.Addr(), uintptr(vhdHandle), uintptr(unsafe.Pointer(mountPath))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsImportLayer(layerPath string, sourceFolderPath string, layerData string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(sourceFolderPath) if hr != nil { return } var _p2 *uint16 _p2, hr = syscall.UTF16PtrFromString(layerData) if hr != nil { return } return _hcsImportLayer(_p0, _p1, _p2) } func _hcsImportLayer(layerPath *uint16, sourceFolderPath *uint16, layerData *uint16) (hr error) { hr = procHcsImportLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsImportLayer.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(sourceFolderPath)), uintptr(unsafe.Pointer(layerData))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsInitializeWritableLayer(writableLayerPath string, layerData string, options string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(writableLayerPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(layerData) if hr != nil { return } var _p2 *uint16 _p2, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsInitializeWritableLayer(_p0, _p1, _p2) } func _hcsInitializeWritableLayer(writableLayerPath *uint16, layerData *uint16, options *uint16) (hr error) { hr = procHcsInitializeWritableLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsInitializeWritableLayer.Addr(), uintptr(unsafe.Pointer(writableLayerPath)), uintptr(unsafe.Pointer(layerData)), uintptr(unsafe.Pointer(options))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsSetupBaseOSLayer(layerPath string, handle windows.Handle, options string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsSetupBaseOSLayer(_p0, handle, _p1) } func _hcsSetupBaseOSLayer(layerPath *uint16, handle windows.Handle, options *uint16) (hr error) { hr = procHcsSetupBaseOSLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsSetupBaseOSLayer.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(handle), uintptr(unsafe.Pointer(options))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(volumePath) if hr != nil { return } var _p2 *uint16 _p2, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsSetupBaseOSVolume(_p0, _p1, _p2) } func _hcsSetupBaseOSVolume(layerPath *uint16, volumePath *uint16, options *uint16) (hr error) { hr = procHcsSetupBaseOSVolume.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsSetupBaseOSVolume.Addr(), uintptr(unsafe.Pointer(layerPath)), uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(options))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/container.go ================================================ //go:build windows package hcsshim import ( "context" "fmt" "os" "sync" "time" "github.com/Microsoft/hcsshim/internal/hcs" "github.com/Microsoft/hcsshim/internal/hcs/schema1" "github.com/Microsoft/hcsshim/internal/mergemaps" ) // ContainerProperties holds the properties for a container and the processes running in that container type ContainerProperties = schema1.ContainerProperties // MemoryStats holds the memory statistics for a container type MemoryStats = schema1.MemoryStats // ProcessorStats holds the processor statistics for a container type ProcessorStats = schema1.ProcessorStats // StorageStats holds the storage statistics for a container type StorageStats = schema1.StorageStats // NetworkStats holds the network statistics for a container type NetworkStats = schema1.NetworkStats // Statistics is the structure returned by a statistics call on a container type Statistics = schema1.Statistics // ProcessList is the structure of an item returned by a ProcessList call on a container type ProcessListItem = schema1.ProcessListItem // MappedVirtualDiskController is the structure of an item returned by a MappedVirtualDiskList call on a container type MappedVirtualDiskController = schema1.MappedVirtualDiskController // Type of Request Support in ModifySystem type RequestType = schema1.RequestType // Type of Resource Support in ModifySystem type ResourceType = schema1.ResourceType // RequestType const const ( Add = schema1.Add Remove = schema1.Remove Network = schema1.Network ) // ResourceModificationRequestResponse is the structure used to send request to the container to modify the system // Supported resource types are Network and Request Types are Add/Remove type ResourceModificationRequestResponse = schema1.ResourceModificationRequestResponse type container struct { system *hcs.System waitOnce sync.Once waitErr error waitCh chan struct{} } // createContainerAdditionalJSON is read from the environment at initialization // time. It allows an environment variable to define additional JSON which // is merged in the CreateComputeSystem call to HCS. var createContainerAdditionalJSON []byte func init() { createContainerAdditionalJSON = ([]byte)(os.Getenv("HCSSHIM_CREATECONTAINER_ADDITIONALJSON")) } // CreateContainer creates a new container with the given configuration but does not start it. func CreateContainer(id string, c *ContainerConfig) (Container, error) { fullConfig, err := mergemaps.MergeJSON(c, createContainerAdditionalJSON) if err != nil { return nil, fmt.Errorf("failed to merge additional JSON '%s': %w", createContainerAdditionalJSON, err) } system, err := hcs.CreateComputeSystem(context.Background(), id, fullConfig) if err != nil { return nil, err } return &container{system: system}, err } // OpenContainer opens an existing container by ID. func OpenContainer(id string) (Container, error) { system, err := hcs.OpenComputeSystem(context.Background(), id) if err != nil { return nil, err } return &container{system: system}, err } // GetContainers gets a list of the containers on the system that match the query func GetContainers(q ComputeSystemQuery) ([]ContainerProperties, error) { return hcs.GetComputeSystems(context.Background(), q) } // Start synchronously starts the container. func (container *container) Start() error { return convertSystemError(container.system.Start(context.Background()), container) } // Shutdown requests a container shutdown, but it may not actually be shutdown until Wait() succeeds. func (container *container) Shutdown() error { err := container.system.Shutdown(context.Background()) if err != nil { return convertSystemError(err, container) } return &ContainerError{Container: container, Err: ErrVmcomputeOperationPending, Operation: "hcsshim::ComputeSystem::Shutdown"} } // Terminate requests a container terminate, but it may not actually be terminated until Wait() succeeds. func (container *container) Terminate() error { err := container.system.Terminate(context.Background()) if err != nil { return convertSystemError(err, container) } return &ContainerError{Container: container, Err: ErrVmcomputeOperationPending, Operation: "hcsshim::ComputeSystem::Terminate"} } // Waits synchronously waits for the container to shutdown or terminate. func (container *container) Wait() error { err := container.system.Wait() if err == nil { err = container.system.ExitError() } return convertSystemError(err, container) } // WaitTimeout synchronously waits for the container to terminate or the duration to elapse. It // returns false if timeout occurs. func (container *container) WaitTimeout(timeout time.Duration) error { container.waitOnce.Do(func() { container.waitCh = make(chan struct{}) go func() { container.waitErr = container.Wait() close(container.waitCh) }() }) t := time.NewTimer(timeout) defer t.Stop() select { case <-t.C: return &ContainerError{Container: container, Err: ErrTimeout, Operation: "hcsshim::ComputeSystem::Wait"} case <-container.waitCh: return container.waitErr } } // Pause pauses the execution of a container. func (container *container) Pause() error { return convertSystemError(container.system.Pause(context.Background()), container) } // Resume resumes the execution of a container. func (container *container) Resume() error { return convertSystemError(container.system.Resume(context.Background()), container) } // HasPendingUpdates returns true if the container has updates pending to install func (container *container) HasPendingUpdates() (bool, error) { return false, nil } // Statistics returns statistics for the container. This is a legacy v1 call func (container *container) Statistics() (Statistics, error) { properties, err := container.system.Properties(context.Background(), schema1.PropertyTypeStatistics) if err != nil { return Statistics{}, convertSystemError(err, container) } return properties.Statistics, nil } // ProcessList returns an array of ProcessListItems for the container. This is a legacy v1 call func (container *container) ProcessList() ([]ProcessListItem, error) { properties, err := container.system.Properties(context.Background(), schema1.PropertyTypeProcessList) if err != nil { return nil, convertSystemError(err, container) } return properties.ProcessList, nil } // This is a legacy v1 call func (container *container) MappedVirtualDisks() (map[int]MappedVirtualDiskController, error) { properties, err := container.system.Properties(context.Background(), schema1.PropertyTypeMappedVirtualDisk) if err != nil { return nil, convertSystemError(err, container) } return properties.MappedVirtualDiskControllers, nil } // CreateProcess launches a new process within the container. func (container *container) CreateProcess(c *ProcessConfig) (Process, error) { p, err := container.system.CreateProcess(context.Background(), c) if err != nil { return nil, convertSystemError(err, container) } return &process{p: p.(*hcs.Process)}, nil } // OpenProcess gets an interface to an existing process within the container. func (container *container) OpenProcess(pid int) (Process, error) { p, err := container.system.OpenProcess(context.Background(), pid) if err != nil { return nil, convertSystemError(err, container) } return &process{p: p}, nil } // Close cleans up any state associated with the container but does not terminate or wait for it. func (container *container) Close() error { return convertSystemError(container.system.Close(), container) } // Modify the System func (container *container) Modify(config *ResourceModificationRequestResponse) error { return convertSystemError(container.system.Modify(context.Background(), config), container) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/errors.go ================================================ //go:build windows package hcsshim import ( "fmt" "syscall" "github.com/Microsoft/hcsshim/internal/hns" "github.com/Microsoft/hcsshim/internal/hcs" "github.com/Microsoft/hcsshim/internal/hcserror" ) var ( // ErrComputeSystemDoesNotExist is an error encountered when the container being operated on no longer exists = hcs.exist ErrComputeSystemDoesNotExist = hcs.ErrComputeSystemDoesNotExist // ErrElementNotFound is an error encountered when the object being referenced does not exist ErrElementNotFound = hcs.ErrElementNotFound // ErrElementNotFound is an error encountered when the object being referenced does not exist ErrNotSupported = hcs.ErrNotSupported // ErrInvalidData is an error encountered when the request being sent to hcs is invalid/unsupported // decimal -2147024883 / hex 0x8007000d ErrInvalidData = hcs.ErrInvalidData // ErrHandleClose is an error encountered when the handle generating the notification being waited on has been closed ErrHandleClose = hcs.ErrHandleClose // ErrAlreadyClosed is an error encountered when using a handle that has been closed by the Close method ErrAlreadyClosed = hcs.ErrAlreadyClosed // ErrInvalidNotificationType is an error encountered when an invalid notification type is used ErrInvalidNotificationType = hcs.ErrInvalidNotificationType // ErrInvalidProcessState is an error encountered when the process is not in a valid state for the requested operation ErrInvalidProcessState = hcs.ErrInvalidProcessState // ErrTimeout is an error encountered when waiting on a notification times out ErrTimeout = hcs.ErrTimeout // ErrUnexpectedContainerExit is the error encountered when a container exits while waiting for // a different expected notification ErrUnexpectedContainerExit = hcs.ErrUnexpectedContainerExit // ErrUnexpectedProcessAbort is the error encountered when communication with the compute service // is lost while waiting for a notification ErrUnexpectedProcessAbort = hcs.ErrUnexpectedProcessAbort // ErrUnexpectedValue is an error encountered when hcs returns an invalid value ErrUnexpectedValue = hcs.ErrUnexpectedValue // ErrOperationDenied is an error when hcs attempts an operation that is explicitly denied ErrOperationDenied = hcs.ErrOperationDenied // ErrVmcomputeAlreadyStopped is an error encountered when a shutdown or terminate request is made on a stopped container ErrVmcomputeAlreadyStopped = hcs.ErrVmcomputeAlreadyStopped // ErrVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously ErrVmcomputeOperationPending = hcs.ErrVmcomputeOperationPending // ErrVmcomputeOperationInvalidState is an error encountered when the compute system is not in a valid state for the requested operation ErrVmcomputeOperationInvalidState = hcs.ErrVmcomputeOperationInvalidState // ErrProcNotFound is an error encountered when a procedure look up fails. ErrProcNotFound = hcs.ErrProcNotFound // ErrVmcomputeOperationAccessIsDenied is an error which can be encountered when enumerating compute systems in RS1/RS2 // builds when the underlying silo might be in the process of terminating. HCS was fixed in RS3. ErrVmcomputeOperationAccessIsDenied = hcs.ErrVmcomputeOperationAccessIsDenied // ErrVmcomputeInvalidJSON is an error encountered when the compute system does not support/understand the messages sent by management ErrVmcomputeInvalidJSON = hcs.ErrVmcomputeInvalidJSON // ErrVmcomputeUnknownMessage is an error encountered guest compute system doesn't support the message ErrVmcomputeUnknownMessage = hcs.ErrVmcomputeUnknownMessage // ErrNotSupported is an error encountered when hcs doesn't support the request ErrPlatformNotSupported = hcs.ErrPlatformNotSupported ) type EndpointNotFoundError = hns.EndpointNotFoundError type NetworkNotFoundError = hns.NetworkNotFoundError // ProcessError is an error encountered in HCS during an operation on a Process object type ProcessError struct { Process *process Operation string Err error Events []hcs.ErrorEvent } // ContainerError is an error encountered in HCS during an operation on a Container object type ContainerError struct { Container *container Operation string Err error Events []hcs.ErrorEvent } func (e *ContainerError) Error() string { if e == nil { return "" } if e.Container == nil { return "unexpected nil container for error: " + e.Err.Error() } s := "container " + e.Container.system.ID() if e.Operation != "" { s += " encountered an error during " + e.Operation } //nolint:errorlint // legacy code switch e.Err.(type) { case nil: break case syscall.Errno: s += fmt.Sprintf(": failure in a Windows system call: %s (0x%x)", e.Err, hcserror.Win32FromError(e.Err)) default: s += fmt.Sprintf(": %s", e.Err.Error()) } for _, ev := range e.Events { s += "\n" + ev.String() } return s } func (e *ProcessError) Error() string { if e == nil { return "" } if e.Process == nil { return "Unexpected nil process for error: " + e.Err.Error() } s := fmt.Sprintf("process %d in container %s", e.Process.p.Pid(), e.Process.p.SystemID()) if e.Operation != "" { s += " encountered an error during " + e.Operation } //nolint:errorlint // legacy code switch e.Err.(type) { case nil: break case syscall.Errno: s += fmt.Sprintf(": failure in a Windows system call: %s (0x%x)", e.Err, hcserror.Win32FromError(e.Err)) default: s += fmt.Sprintf(": %s", e.Err.Error()) } for _, ev := range e.Events { s += "\n" + ev.String() } return s } // IsNotExist checks if an error is caused by the Container or Process not existing. // Note: Currently, ErrElementNotFound can mean that a Process has either // already exited, or does not exist. Both IsAlreadyStopped and IsNotExist // will currently return true when the error is ErrElementNotFound. func IsNotExist(err error) bool { if _, ok := err.(EndpointNotFoundError); ok { //nolint:errorlint // legacy code return true } if _, ok := err.(NetworkNotFoundError); ok { //nolint:errorlint // legacy code return true } return hcs.IsNotExist(getInnerError(err)) } // IsAlreadyClosed checks if an error is caused by the Container or Process having been // already closed by a call to the Close() method. func IsAlreadyClosed(err error) bool { return hcs.IsAlreadyClosed(getInnerError(err)) } // IsPending returns a boolean indicating whether the error is that // the requested operation is being completed in the background. func IsPending(err error) bool { return hcs.IsPending(getInnerError(err)) } // IsTimeout returns a boolean indicating whether the error is caused by // a timeout waiting for the operation to complete. func IsTimeout(err error) bool { return hcs.IsTimeout(getInnerError(err)) } // IsAlreadyStopped returns a boolean indicating whether the error is caused by // a Container or Process being already stopped. // Note: Currently, ErrElementNotFound can mean that a Process has either // already exited, or does not exist. Both IsAlreadyStopped and IsNotExist // will currently return true when the error is ErrElementNotFound. func IsAlreadyStopped(err error) bool { return hcs.IsAlreadyStopped(getInnerError(err)) } // IsNotSupported returns a boolean indicating whether the error is caused by // unsupported platform requests // Note: Currently Unsupported platform requests can be mean either // ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported or ErrVmcomputeUnknownMessage // is thrown from the Platform func IsNotSupported(err error) bool { return hcs.IsNotSupported(getInnerError(err)) } // IsOperationInvalidState returns true when err is caused by // `ErrVmcomputeOperationInvalidState`. func IsOperationInvalidState(err error) bool { return hcs.IsOperationInvalidState(getInnerError(err)) } // IsAccessIsDenied returns true when err is caused by // `ErrVmcomputeOperationAccessIsDenied`. func IsAccessIsDenied(err error) bool { return hcs.IsAccessIsDenied(getInnerError(err)) } func getInnerError(err error) error { //nolint:errorlint // legacy code switch pe := err.(type) { case nil: return nil case *ContainerError: err = pe.Err case *ProcessError: err = pe.Err } return err } func convertSystemError(err error, c *container) error { if serr, ok := err.(*hcs.SystemError); ok { //nolint:errorlint // legacy code return &ContainerError{Container: c, Operation: serr.Op, Err: serr.Err, Events: serr.Events} } return err } func convertProcessError(err error, p *process) error { if perr, ok := err.(*hcs.ProcessError); ok { //nolint:errorlint // legacy code return &ProcessError{Process: p, Operation: perr.Op, Err: perr.Err, Events: perr.Events} } return err } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/hcsshim.go ================================================ //go:build windows // Shim for the Host Compute Service (HCS) to manage Windows Server // containers and Hyper-V containers. package hcsshim import ( "golang.org/x/sys/windows" "github.com/Microsoft/hcsshim/internal/hcserror" ) //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go hcsshim.go //sys SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) = iphlpapi.SetCurrentThreadCompartmentId const ( // Specific user-visible exit codes WaitErrExecFailed = 32767 ERROR_GEN_FAILURE = windows.ERROR_GEN_FAILURE ERROR_SHUTDOWN_IN_PROGRESS = windows.ERROR_SHUTDOWN_IN_PROGRESS WSAEINVAL = windows.WSAEINVAL // Timeout on wait calls TimeoutInfinite = 0xFFFFFFFF ) type HcsError = hcserror.HcsError ================================================ FILE: vendor/github.com/Microsoft/hcsshim/hnsaccelnet.go ================================================ //go:build windows package hcsshim import ( "errors" "github.com/Microsoft/hcsshim/internal/hns" ) // HNSNnvManagementMacAddress represents management mac address // which needs to be excluded from VF reassignment type HNSNnvManagementMacAddress = hns.HNSNnvManagementMacAddress // HNSNnvManagementMacList represents a list of management // mac addresses for exclusion from VF reassignment type HNSNnvManagementMacList = hns.HNSNnvManagementMacList var ( ErrorEmptyMacAddressList = errors.New("management mac_address list is empty") ) // SetNnvManagementMacAddresses sets a list of // management mac addresses in hns for exclusion from VF reassignment. func SetNnvManagementMacAddresses(managementMacAddresses []string) (*HNSNnvManagementMacList, error) { if len(managementMacAddresses) == 0 { return nil, ErrorEmptyMacAddressList } nnvManagementMacList := &HNSNnvManagementMacList{} for _, mac := range managementMacAddresses { nnvManagementMacList.MacAddressList = append(nnvManagementMacList.MacAddressList, HNSNnvManagementMacAddress{MacAddress: mac}) } return nnvManagementMacList.Set() } // GetNnvManagementMacAddresses retrieves a list of // management mac addresses in hns for exclusion from VF reassignment. func GetNnvManagementMacAddresses() (*HNSNnvManagementMacList, error) { return hns.GetNnvManagementMacAddressList() } // DeleteNnvManagementMacAddresses delete list of // management mac addresses in hns which are excluded from VF reassignment. func DeleteNnvManagementMacAddresses() (*HNSNnvManagementMacList, error) { return hns.DeleteNnvManagementMacAddressList() } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/hnsendpoint.go ================================================ //go:build windows package hcsshim import ( "github.com/Microsoft/hcsshim/internal/hns" ) // HNSEndpoint represents a network endpoint in HNS type HNSEndpoint = hns.HNSEndpoint // HNSEndpointStats represent the stats for an networkendpoint in HNS type HNSEndpointStats = hns.EndpointStats // Namespace represents a Compartment. type Namespace = hns.Namespace // SystemType represents the type of the system on which actions are done type SystemType string // SystemType const const ( ContainerType SystemType = "Container" VirtualMachineType SystemType = "VirtualMachine" HostType SystemType = "Host" ) // EndpointAttachDetachRequest is the structure used to send request to the container to modify the system // Supported resource types are Network and Request Types are Add/Remove type EndpointAttachDetachRequest = hns.EndpointAttachDetachRequest // EndpointResquestResponse is object to get the endpoint request response type EndpointResquestResponse = hns.EndpointResquestResponse // HNSEndpointRequest makes a HNS call to modify/query a network endpoint func HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) { return hns.HNSEndpointRequest(method, path, request) } // HNSListEndpointRequest makes a HNS call to query the list of available endpoints func HNSListEndpointRequest() ([]HNSEndpoint, error) { return hns.HNSListEndpointRequest() } // HotAttachEndpoint makes a HCS Call to attach the endpoint to the container func HotAttachEndpoint(containerID string, endpointID string) error { endpoint, err := GetHNSEndpointByID(endpointID) if err != nil { return err } isAttached, err := endpoint.IsAttached(containerID) if isAttached { return err } return modifyNetworkEndpoint(containerID, endpointID, Add) } // HotDetachEndpoint makes a HCS Call to detach the endpoint from the container func HotDetachEndpoint(containerID string, endpointID string) error { endpoint, err := GetHNSEndpointByID(endpointID) if err != nil { return err } isAttached, err := endpoint.IsAttached(containerID) if !isAttached { return err } return modifyNetworkEndpoint(containerID, endpointID, Remove) } // ModifyContainer corresponding to the container id, by sending a request func modifyContainer(id string, request *ResourceModificationRequestResponse) error { container, err := OpenContainer(id) if err != nil { if IsNotExist(err) { return ErrComputeSystemDoesNotExist } return getInnerError(err) } defer container.Close() err = container.Modify(request) if err != nil { if IsNotSupported(err) { return ErrPlatformNotSupported } return getInnerError(err) } return nil } func modifyNetworkEndpoint(containerID string, endpointID string, request RequestType) error { requestMessage := &ResourceModificationRequestResponse{ Resource: Network, Request: request, Data: endpointID, } err := modifyContainer(containerID, requestMessage) if err != nil { return err } return nil } // GetHNSEndpointByID get the Endpoint by ID func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) { return hns.GetHNSEndpointByID(endpointID) } // GetHNSEndpointByName gets the endpoint filtered by Name func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) { return hns.GetHNSEndpointByName(endpointName) } // GetHNSEndpointStats gets the endpoint stats by ID func GetHNSEndpointStats(endpointName string) (*HNSEndpointStats, error) { return hns.GetHNSEndpointStats(endpointName) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/hnsglobals.go ================================================ //go:build windows package hcsshim import ( "github.com/Microsoft/hcsshim/internal/hns" ) type HNSGlobals = hns.HNSGlobals type HNSVersion = hns.HNSVersion var ( HNSVersion1803 = hns.HNSVersion1803 ) func GetHNSGlobals() (*HNSGlobals, error) { return hns.GetHNSGlobals() } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/hnsnetwork.go ================================================ //go:build windows package hcsshim import ( "github.com/Microsoft/hcsshim/internal/hns" ) // Subnet is associated with a network and represents a list // of subnets available to the network type Subnet = hns.Subnet // MacPool is associated with a network and represents a list // of macaddresses available to the network type MacPool = hns.MacPool // HNSNetwork represents a network in HNS type HNSNetwork = hns.HNSNetwork // HNSNetworkRequest makes a call into HNS to update/query a single network func HNSNetworkRequest(method, path, request string) (*HNSNetwork, error) { return hns.HNSNetworkRequest(method, path, request) } // HNSListNetworkRequest makes a HNS call to query the list of available networks func HNSListNetworkRequest(method, path, request string) ([]HNSNetwork, error) { return hns.HNSListNetworkRequest(method, path, request) } // GetHNSNetworkByID func GetHNSNetworkByID(networkID string) (*HNSNetwork, error) { return hns.GetHNSNetworkByID(networkID) } // GetHNSNetworkName filtered by Name func GetHNSNetworkByName(networkName string) (*HNSNetwork, error) { return hns.GetHNSNetworkByName(networkName) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/hnspolicy.go ================================================ package hcsshim import ( "github.com/Microsoft/hcsshim/internal/hns" ) // Type of Request Support in ModifySystem type PolicyType = hns.PolicyType // RequestType const const ( Nat = hns.Nat ACL = hns.ACL PA = hns.PA VLAN = hns.VLAN VSID = hns.VSID VNet = hns.VNet L2Driver = hns.L2Driver Isolation = hns.Isolation QOS = hns.QOS OutboundNat = hns.OutboundNat ExternalLoadBalancer = hns.ExternalLoadBalancer Route = hns.Route Proxy = hns.Proxy ) type ProxyPolicy = hns.ProxyPolicy type NatPolicy = hns.NatPolicy type QosPolicy = hns.QosPolicy type IsolationPolicy = hns.IsolationPolicy type VlanPolicy = hns.VlanPolicy type VsidPolicy = hns.VsidPolicy type PaPolicy = hns.PaPolicy type OutboundNatPolicy = hns.OutboundNatPolicy type ActionType = hns.ActionType type DirectionType = hns.DirectionType type RuleType = hns.RuleType const ( Allow = hns.Allow Block = hns.Block In = hns.In Out = hns.Out Host = hns.Host Switch = hns.Switch ) type ACLPolicy = hns.ACLPolicy type Policy = hns.Policy ================================================ FILE: vendor/github.com/Microsoft/hcsshim/hnspolicylist.go ================================================ //go:build windows package hcsshim import ( "github.com/Microsoft/hcsshim/internal/hns" ) // RoutePolicy is a structure defining schema for Route based Policy type RoutePolicy = hns.RoutePolicy // ELBPolicy is a structure defining schema for ELB LoadBalancing based Policy type ELBPolicy = hns.ELBPolicy // LBPolicy is a structure defining schema for LoadBalancing based Policy type LBPolicy = hns.LBPolicy // PolicyList is a structure defining schema for Policy list request type PolicyList = hns.PolicyList // HNSPolicyListRequest makes a call into HNS to update/query a single network func HNSPolicyListRequest(method, path, request string) (*PolicyList, error) { return hns.HNSPolicyListRequest(method, path, request) } // HNSListPolicyListRequest gets all the policy list func HNSListPolicyListRequest() ([]PolicyList, error) { return hns.HNSListPolicyListRequest() } // PolicyListRequest makes a HNS call to modify/query a network policy list func PolicyListRequest(method, path, request string) (*PolicyList, error) { return hns.PolicyListRequest(method, path, request) } // GetPolicyListByID get the policy list by ID func GetPolicyListByID(policyListID string) (*PolicyList, error) { return hns.GetPolicyListByID(policyListID) } // AddLoadBalancer policy list for the specified endpoints func AddLoadBalancer(endpoints []HNSEndpoint, isILB bool, sourceVIP, vip string, protocol uint16, internalPort uint16, externalPort uint16) (*PolicyList, error) { return hns.AddLoadBalancer(endpoints, isILB, sourceVIP, vip, protocol, internalPort, externalPort) } // AddRoute adds route policy list for the specified endpoints func AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, encapEnabled bool) (*PolicyList, error) { return hns.AddRoute(endpoints, destinationPrefix, nextHop, encapEnabled) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/hnssupport.go ================================================ //go:build windows package hcsshim import ( "github.com/Microsoft/hcsshim/internal/hns" ) type HNSSupportedFeatures = hns.HNSSupportedFeatures type HNSAclFeatures = hns.HNSAclFeatures func GetHNSSupportedFeatures() HNSSupportedFeatures { return hns.GetHNSSupportedFeatures() } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/interface.go ================================================ //go:build windows package hcsshim import ( "io" "time" "github.com/Microsoft/hcsshim/internal/hcs/schema1" ) // ProcessConfig is used as both the input of Container.CreateProcess // and to convert the parameters to JSON for passing onto the HCS type ProcessConfig = schema1.ProcessConfig type Layer = schema1.Layer type MappedDir = schema1.MappedDir type MappedPipe = schema1.MappedPipe type HvRuntime = schema1.HvRuntime type MappedVirtualDisk = schema1.MappedVirtualDisk // AssignedDevice represents a device that has been directly assigned to a container // // NOTE: Support added in RS5 type AssignedDevice = schema1.AssignedDevice // ContainerConfig is used as both the input of CreateContainer // and to convert the parameters to JSON for passing onto the HCS type ContainerConfig = schema1.ContainerConfig type ComputeSystemQuery = schema1.ComputeSystemQuery // Container represents a created (but not necessarily running) container. type Container interface { // Start synchronously starts the container. Start() error // Shutdown requests a container shutdown, but it may not actually be shutdown until Wait() succeeds. Shutdown() error // Terminate requests a container terminate, but it may not actually be terminated until Wait() succeeds. Terminate() error // Waits synchronously waits for the container to shutdown or terminate. Wait() error // WaitTimeout synchronously waits for the container to terminate or the duration to elapse. It // returns false if timeout occurs. WaitTimeout(time.Duration) error // Pause pauses the execution of a container. Pause() error // Resume resumes the execution of a container. Resume() error // HasPendingUpdates returns true if the container has updates pending to install. HasPendingUpdates() (bool, error) // Statistics returns statistics for a container. Statistics() (Statistics, error) // ProcessList returns details for the processes in a container. ProcessList() ([]ProcessListItem, error) // MappedVirtualDisks returns virtual disks mapped to a utility VM, indexed by controller MappedVirtualDisks() (map[int]MappedVirtualDiskController, error) // CreateProcess launches a new process within the container. CreateProcess(c *ProcessConfig) (Process, error) // OpenProcess gets an interface to an existing process within the container. OpenProcess(pid int) (Process, error) // Close cleans up any state associated with the container but does not terminate or wait for it. Close() error // Modify the System Modify(config *ResourceModificationRequestResponse) error } // Process represents a running or exited process. type Process interface { // Pid returns the process ID of the process within the container. Pid() int // Kill signals the process to terminate but does not wait for it to finish terminating. Kill() error // Wait waits for the process to exit. Wait() error // WaitTimeout waits for the process to exit or the duration to elapse. It returns // false if timeout occurs. WaitTimeout(time.Duration) error // ExitCode returns the exit code of the process. The process must have // already terminated. ExitCode() (int, error) // ResizeConsole resizes the console of the process. ResizeConsole(width, height uint16) error // Stdio returns the stdin, stdout, and stderr pipes, respectively. Closing // these pipes does not close the underlying pipes; it should be possible to // call this multiple times to get multiple interfaces. Stdio() (io.WriteCloser, io.ReadCloser, io.ReadCloser, error) // CloseStdin closes the write side of the stdin pipe so that the process is // notified on the read side that there is no more data in stdin. CloseStdin() error // Close cleans up any state associated with the process but does not kill // or wait on it. Close() error } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go ================================================ //go:build windows package cow import ( "context" "io" "github.com/Microsoft/hcsshim/internal/hcs/schema1" hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" ) // Process is the interface for an OS process running in a container or utility VM. type Process interface { // Close releases resources associated with the process and closes the // writer and readers returned by Stdio. Depending on the implementation, // this may also terminate the process. Close() error // CloseStdin causes the process's stdin handle to receive EOF/EPIPE/whatever // is appropriate to indicate that no more data is available. CloseStdin(ctx context.Context) error // CloseStdout closes the stdout connection to the process. It is used to indicate // that we are done receiving output on the shim side. CloseStdout(ctx context.Context) error // CloseStderr closes the stderr connection to the process. It is used to indicate // that we are done receiving output on the shim side. CloseStderr(ctx context.Context) error // Pid returns the process ID. Pid() int // Stdio returns the stdio streams for a process. These may be nil if a stream // was not requested during CreateProcess. Stdio() (_ io.Writer, _ io.Reader, _ io.Reader) // ResizeConsole resizes the virtual terminal associated with the process. ResizeConsole(ctx context.Context, width, height uint16) error // Kill sends a SIGKILL or equivalent signal to the process and returns whether // the signal was delivered. It does not wait for the process to terminate. Kill(ctx context.Context) (bool, error) // Signal sends a signal to the process and returns whether the signal was // delivered. The input is OS specific (either // guestrequest.SignalProcessOptionsWCOW or // guestrequest.SignalProcessOptionsLCOW). It does not wait for the process // to terminate. Signal(ctx context.Context, options interface{}) (bool, error) // Wait waits for the process to complete, or for a connection to the process to be // terminated by some error condition (including calling Close). Wait() error // ExitCode returns the exit code of the process. Returns an error if the process is // not running. ExitCode() (int, error) } // ProcessHost is the interface for creating processes. type ProcessHost interface { // CreateProcess creates a process. The configuration is host specific // (either hcsschema.ProcessParameters or lcow.ProcessParameters). CreateProcess(ctx context.Context, config interface{}) (Process, error) // OS returns the host's operating system, "linux" or "windows". OS() string // IsOCI specifies whether this is an OCI-compliant process host. If true, // then the configuration passed to CreateProcess should have an OCI process // spec (or nil if this is the initial process in an OCI container). // Otherwise, it should have the HCS-specific process parameters. IsOCI() bool } // Container is the interface for container objects, either running on the host or // in a utility VM. type Container interface { ProcessHost // Close releases the resources associated with the container. Depending on // the implementation, this may also terminate the container. Close() error // ID returns the container ID. ID() string // Properties returns the requested container properties targeting a V1 schema container. Properties(ctx context.Context, types ...schema1.PropertyType) (*schema1.ContainerProperties, error) // PropertiesV2 returns the requested container properties targeting a V2 schema container. PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (*hcsschema.Properties, error) // Start starts a container. Start(ctx context.Context) error // Shutdown sends a shutdown request to the container (but does not wait for // the shutdown to complete). Shutdown(ctx context.Context) error // Terminate sends a terminate request to the container (but does not wait // for the terminate to complete). Terminate(ctx context.Context) error // Wait waits for the container to terminate, or for the connection to the // container to be terminated by some error condition (including calling // Close). Wait() error // WaitChannel returns the wait channel of the container WaitChannel() <-chan struct{} // WaitError returns the container termination error. // This function should only be called after the channel in WaitChannel() // is closed. Otherwise it is not thread safe. WaitError() error // Modify sends a request to modify container resources Modify(ctx context.Context, config interface{}) error } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/callback.go ================================================ //go:build windows package hcs import ( "fmt" "sync" "syscall" "github.com/Microsoft/hcsshim/internal/interop" "github.com/Microsoft/hcsshim/internal/logfields" "github.com/Microsoft/hcsshim/internal/vmcompute" "github.com/sirupsen/logrus" ) var ( nextCallback uintptr callbackMap = map[uintptr]*notificationWatcherContext{} callbackMapLock = sync.RWMutex{} notificationWatcherCallback = syscall.NewCallback(notificationWatcher) // Notifications for HCS_SYSTEM handles hcsNotificationSystemExited hcsNotification = 0x00000001 hcsNotificationSystemCreateCompleted hcsNotification = 0x00000002 hcsNotificationSystemStartCompleted hcsNotification = 0x00000003 hcsNotificationSystemPauseCompleted hcsNotification = 0x00000004 hcsNotificationSystemResumeCompleted hcsNotification = 0x00000005 hcsNotificationSystemCrashReport hcsNotification = 0x00000006 hcsNotificationSystemSiloJobCreated hcsNotification = 0x00000007 hcsNotificationSystemSaveCompleted hcsNotification = 0x00000008 hcsNotificationSystemRdpEnhancedModeStateChanged hcsNotification = 0x00000009 hcsNotificationSystemShutdownFailed hcsNotification = 0x0000000A hcsNotificationSystemGetPropertiesCompleted hcsNotification = 0x0000000B hcsNotificationSystemModifyCompleted hcsNotification = 0x0000000C hcsNotificationSystemCrashInitiated hcsNotification = 0x0000000D hcsNotificationSystemGuestConnectionClosed hcsNotification = 0x0000000E // Notifications for HCS_PROCESS handles hcsNotificationProcessExited hcsNotification = 0x00010000 // Common notifications hcsNotificationInvalid hcsNotification = 0x00000000 hcsNotificationServiceDisconnect hcsNotification = 0x01000000 ) type hcsNotification uint32 func (hn hcsNotification) String() string { switch hn { case hcsNotificationSystemExited: return "SystemExited" case hcsNotificationSystemCreateCompleted: return "SystemCreateCompleted" case hcsNotificationSystemStartCompleted: return "SystemStartCompleted" case hcsNotificationSystemPauseCompleted: return "SystemPauseCompleted" case hcsNotificationSystemResumeCompleted: return "SystemResumeCompleted" case hcsNotificationSystemCrashReport: return "SystemCrashReport" case hcsNotificationSystemSiloJobCreated: return "SystemSiloJobCreated" case hcsNotificationSystemSaveCompleted: return "SystemSaveCompleted" case hcsNotificationSystemRdpEnhancedModeStateChanged: return "SystemRdpEnhancedModeStateChanged" case hcsNotificationSystemShutdownFailed: return "SystemShutdownFailed" case hcsNotificationSystemGetPropertiesCompleted: return "SystemGetPropertiesCompleted" case hcsNotificationSystemModifyCompleted: return "SystemModifyCompleted" case hcsNotificationSystemCrashInitiated: return "SystemCrashInitiated" case hcsNotificationSystemGuestConnectionClosed: return "SystemGuestConnectionClosed" case hcsNotificationProcessExited: return "ProcessExited" case hcsNotificationInvalid: return "Invalid" case hcsNotificationServiceDisconnect: return "ServiceDisconnect" default: return fmt.Sprintf("Unknown: %d", hn) } } type notificationChannel chan error type notificationWatcherContext struct { channels notificationChannels handle vmcompute.HcsCallback systemID string processID int } type notificationChannels map[hcsNotification]notificationChannel func newSystemChannels() notificationChannels { channels := make(notificationChannels) for _, notif := range []hcsNotification{ hcsNotificationServiceDisconnect, hcsNotificationSystemExited, hcsNotificationSystemCreateCompleted, hcsNotificationSystemStartCompleted, hcsNotificationSystemPauseCompleted, hcsNotificationSystemResumeCompleted, hcsNotificationSystemSaveCompleted, } { channels[notif] = make(notificationChannel, 1) } return channels } func newProcessChannels() notificationChannels { channels := make(notificationChannels) for _, notif := range []hcsNotification{ hcsNotificationServiceDisconnect, hcsNotificationProcessExited, } { channels[notif] = make(notificationChannel, 1) } return channels } func closeChannels(channels notificationChannels) { for _, c := range channels { close(c) } } func notificationWatcher(notificationType hcsNotification, callbackNumber uintptr, notificationStatus uintptr, notificationData *uint16) uintptr { var result error if int32(notificationStatus) < 0 { result = interop.Win32FromHresult(notificationStatus) } callbackMapLock.RLock() context := callbackMap[callbackNumber] callbackMapLock.RUnlock() if context == nil { return 0 } log := logrus.WithFields(logrus.Fields{ "notification-type": notificationType.String(), "system-id": context.systemID, }) if context.processID != 0 { log.Data[logfields.ProcessID] = context.processID } log.Debug("HCS notification") if channel, ok := context.channels[notificationType]; ok { channel <- result } return 0 } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/doc.go ================================================ package hcs ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go ================================================ //go:build windows package hcs import ( "context" "encoding/json" "errors" "fmt" "net" "syscall" "github.com/Microsoft/hcsshim/internal/log" ) var ( // ErrComputeSystemDoesNotExist is an error encountered when the container being operated on no longer exists ErrComputeSystemDoesNotExist = syscall.Errno(0xc037010e) // ErrElementNotFound is an error encountered when the object being referenced does not exist ErrElementNotFound = syscall.Errno(0x490) // ErrElementNotFound is an error encountered when the object being referenced does not exist ErrNotSupported = syscall.Errno(0x32) // ErrInvalidData is an error encountered when the request being sent to hcs is invalid/unsupported // decimal -2147024883 / hex 0x8007000d ErrInvalidData = syscall.Errno(0xd) // ErrHandleClose is an error encountered when the handle generating the notification being waited on has been closed ErrHandleClose = errors.New("hcsshim: the handle generating this notification has been closed") // ErrAlreadyClosed is an error encountered when using a handle that has been closed by the Close method ErrAlreadyClosed = errors.New("hcsshim: the handle has already been closed") // ErrInvalidNotificationType is an error encountered when an invalid notification type is used ErrInvalidNotificationType = errors.New("hcsshim: invalid notification type") // ErrInvalidProcessState is an error encountered when the process is not in a valid state for the requested operation ErrInvalidProcessState = errors.New("the process is in an invalid state for the attempted operation") // ErrTimeout is an error encountered when waiting on a notification times out ErrTimeout = errors.New("hcsshim: timeout waiting for notification") // ErrUnexpectedContainerExit is the error encountered when a container exits while waiting for // a different expected notification ErrUnexpectedContainerExit = errors.New("unexpected container exit") // ErrUnexpectedProcessAbort is the error encountered when communication with the compute service // is lost while waiting for a notification ErrUnexpectedProcessAbort = errors.New("lost communication with compute service") // ErrUnexpectedValue is an error encountered when hcs returns an invalid value ErrUnexpectedValue = errors.New("unexpected value returned from hcs") // ErrOperationDenied is an error when hcs attempts an operation that is explicitly denied ErrOperationDenied = errors.New("operation denied") // ErrVmcomputeAlreadyStopped is an error encountered when a shutdown or terminate request is made on a stopped container ErrVmcomputeAlreadyStopped = syscall.Errno(0xc0370110) // ErrVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously ErrVmcomputeOperationPending = syscall.Errno(0xC0370103) // ErrVmcomputeOperationInvalidState is an error encountered when the compute system is not in a valid state for the requested operation ErrVmcomputeOperationInvalidState = syscall.Errno(0xc0370105) // ErrProcNotFound is an error encountered when a procedure look up fails. ErrProcNotFound = syscall.Errno(0x7f) // ErrVmcomputeOperationAccessIsDenied is an error which can be encountered when enumerating compute systems in RS1/RS2 // builds when the underlying silo might be in the process of terminating. HCS was fixed in RS3. ErrVmcomputeOperationAccessIsDenied = syscall.Errno(0x5) // ErrVmcomputeInvalidJSON is an error encountered when the compute system does not support/understand the messages sent by management ErrVmcomputeInvalidJSON = syscall.Errno(0xc037010d) // ErrVmcomputeUnknownMessage is an error encountered guest compute system doesn't support the message ErrVmcomputeUnknownMessage = syscall.Errno(0xc037010b) // ErrVmcomputeUnexpectedExit is an error encountered when the compute system terminates unexpectedly ErrVmcomputeUnexpectedExit = syscall.Errno(0xC0370106) // ErrNotSupported is an error encountered when hcs doesn't support the request ErrPlatformNotSupported = errors.New("unsupported platform request") // ErrProcessAlreadyStopped is returned by hcs if the process we're trying to kill has already been stopped. ErrProcessAlreadyStopped = syscall.Errno(0x8037011f) // ErrInvalidHandle is an error that can be encountered when querying the properties of a compute system when the handle to that // compute system has already been closed. ErrInvalidHandle = syscall.Errno(0x6) ) type ErrorEvent struct { Message string `json:"Message,omitempty"` // Fully formated error message StackTrace string `json:"StackTrace,omitempty"` // Stack trace in string form Provider string `json:"Provider,omitempty"` EventID uint16 `json:"EventId,omitempty"` Flags uint32 `json:"Flags,omitempty"` Source string `json:"Source,omitempty"` //Data []EventData `json:"Data,omitempty"` // Omit this as HCS doesn't encode this well. It's more confusing to include. It is however logged in debug mode (see processHcsResult function) } type hcsResult struct { Error int32 ErrorMessage string ErrorEvents []ErrorEvent `json:"ErrorEvents,omitempty"` } func (ev *ErrorEvent) String() string { evs := "[Event Detail: " + ev.Message if ev.StackTrace != "" { evs += " Stack Trace: " + ev.StackTrace } if ev.Provider != "" { evs += " Provider: " + ev.Provider } if ev.EventID != 0 { evs = fmt.Sprintf("%s EventID: %d", evs, ev.EventID) } if ev.Flags != 0 { evs = fmt.Sprintf("%s flags: %d", evs, ev.Flags) } if ev.Source != "" { evs += " Source: " + ev.Source } evs += "]" return evs } func processHcsResult(ctx context.Context, resultJSON string) []ErrorEvent { if resultJSON != "" { result := &hcsResult{} if err := json.Unmarshal([]byte(resultJSON), result); err != nil { log.G(ctx).WithError(err).Warning("Could not unmarshal HCS result") return nil } return result.ErrorEvents } return nil } type HcsError struct { Op string Err error Events []ErrorEvent } var _ net.Error = &HcsError{} func (e *HcsError) Error() string { s := e.Op + ": " + e.Err.Error() for _, ev := range e.Events { s += "\n" + ev.String() } return s } func (e *HcsError) Is(target error) bool { return errors.Is(e.Err, target) } // unwrap isnt really needed, but helpful convince function func (e *HcsError) Unwrap() error { return e.Err } // Deprecated: net.Error.Temporary is deprecated. func (e *HcsError) Temporary() bool { err := e.netError() return (err != nil) && err.Temporary() } func (e *HcsError) Timeout() bool { err := e.netError() return (err != nil) && err.Timeout() } func (e *HcsError) netError() (err net.Error) { if errors.As(e.Unwrap(), &err) { return err } return nil } // SystemError is an error encountered in HCS during an operation on a Container object type SystemError struct { HcsError ID string } var _ net.Error = &SystemError{} func (e *SystemError) Error() string { s := e.Op + " " + e.ID + ": " + e.Err.Error() for _, ev := range e.Events { s += "\n" + ev.String() } return s } func makeSystemError(system *System, op string, err error, events []ErrorEvent) error { // Don't double wrap errors var e *SystemError if errors.As(err, &e) { return err } return &SystemError{ ID: system.ID(), HcsError: HcsError{ Op: op, Err: err, Events: events, }, } } // ProcessError is an error encountered in HCS during an operation on a Process object type ProcessError struct { HcsError SystemID string Pid int } var _ net.Error = &ProcessError{} func (e *ProcessError) Error() string { s := fmt.Sprintf("%s %s:%d: %s", e.Op, e.SystemID, e.Pid, e.Err.Error()) for _, ev := range e.Events { s += "\n" + ev.String() } return s } func makeProcessError(process *Process, op string, err error, events []ErrorEvent) error { // Don't double wrap errors var e *ProcessError if errors.As(err, &e) { return err } return &ProcessError{ Pid: process.Pid(), SystemID: process.SystemID(), HcsError: HcsError{ Op: op, Err: err, Events: events, }, } } // IsNotExist checks if an error is caused by the Container or Process not existing. // Note: Currently, ErrElementNotFound can mean that a Process has either // already exited, or does not exist. Both IsAlreadyStopped and IsNotExist // will currently return true when the error is ErrElementNotFound. func IsNotExist(err error) bool { return IsAny(err, ErrComputeSystemDoesNotExist, ErrElementNotFound) } // IsErrorInvalidHandle checks whether the error is the result of an operation carried // out on a handle that is invalid/closed. This error popped up while trying to query // stats on a container in the process of being stopped. func IsErrorInvalidHandle(err error) bool { return errors.Is(err, ErrInvalidHandle) } // IsAlreadyClosed checks if an error is caused by the Container or Process having been // already closed by a call to the Close() method. func IsAlreadyClosed(err error) bool { return errors.Is(err, ErrAlreadyClosed) } // IsPending returns a boolean indicating whether the error is that // the requested operation is being completed in the background. func IsPending(err error) bool { return errors.Is(err, ErrVmcomputeOperationPending) } // IsTimeout returns a boolean indicating whether the error is caused by // a timeout waiting for the operation to complete. func IsTimeout(err error) bool { // HcsError and co. implement Timeout regardless of whether the errors they wrap do, // so `errors.As(err, net.Error)`` will always be true. // Using `errors.As(err.Unwrap(), net.Err)` wont work for general errors. // So first check if there an `ErrTimeout` in the chain, then convert to a net error. if errors.Is(err, ErrTimeout) { return true } var nerr net.Error return errors.As(err, &nerr) && nerr.Timeout() } // IsAlreadyStopped returns a boolean indicating whether the error is caused by // a Container or Process being already stopped. // Note: Currently, ErrElementNotFound can mean that a Process has either // already exited, or does not exist. Both IsAlreadyStopped and IsNotExist // will currently return true when the error is ErrElementNotFound. func IsAlreadyStopped(err error) bool { return IsAny(err, ErrVmcomputeAlreadyStopped, ErrProcessAlreadyStopped, ErrElementNotFound) } // IsNotSupported returns a boolean indicating whether the error is caused by // unsupported platform requests // Note: Currently Unsupported platform requests can be mean either // ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported or ErrVmcomputeUnknownMessage // is thrown from the Platform func IsNotSupported(err error) bool { // If Platform doesn't recognize or support the request sent, below errors are seen return IsAny(err, ErrVmcomputeInvalidJSON, ErrInvalidData, ErrNotSupported, ErrVmcomputeUnknownMessage) } // IsOperationInvalidState returns true when err is caused by // `ErrVmcomputeOperationInvalidState`. func IsOperationInvalidState(err error) bool { return errors.Is(err, ErrVmcomputeOperationInvalidState) } // IsAccessIsDenied returns true when err is caused by // `ErrVmcomputeOperationAccessIsDenied`. func IsAccessIsDenied(err error) bool { return errors.Is(err, ErrVmcomputeOperationAccessIsDenied) } // IsAny is a vectorized version of [errors.Is], it returns true if err is one of targets. func IsAny(err error, targets ...error) bool { for _, e := range targets { if errors.Is(err, e) { return true } } return false } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go ================================================ //go:build windows package hcs import ( "context" "encoding/json" "errors" "io" "os" "sync" "syscall" "time" "go.opencensus.io/trace" "github.com/Microsoft/hcsshim/internal/cow" hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" "github.com/Microsoft/hcsshim/internal/log" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/internal/protocol/guestrequest" "github.com/Microsoft/hcsshim/internal/vmcompute" ) type Process struct { handleLock sync.RWMutex handle vmcompute.HcsProcess processID int system *System hasCachedStdio bool stdioLock sync.Mutex stdin io.WriteCloser stdout io.ReadCloser stderr io.ReadCloser callbackNumber uintptr killSignalDelivered bool closedWaitOnce sync.Once waitBlock chan struct{} exitCode int waitError error } var _ cow.Process = &Process{} func newProcess(process vmcompute.HcsProcess, processID int, computeSystem *System) *Process { return &Process{ handle: process, processID: processID, system: computeSystem, waitBlock: make(chan struct{}), } } // Pid returns the process ID of the process within the container. func (process *Process) Pid() int { return process.processID } // SystemID returns the ID of the process's compute system. func (process *Process) SystemID() string { return process.system.ID() } func (process *Process) processSignalResult(ctx context.Context, err error) (bool, error) { if err == nil { return true, nil } if errors.Is(err, ErrVmcomputeOperationInvalidState) || errors.Is(err, ErrComputeSystemDoesNotExist) || errors.Is(err, ErrElementNotFound) { if !process.stopped() { // The process should be gone, but we have not received the notification. // After a second, force unblock the process wait to work around a possible // deadlock in the HCS. go func() { time.Sleep(time.Second) process.closedWaitOnce.Do(func() { log.G(ctx).WithError(err).Warn("force unblocking process waits") process.exitCode = -1 process.waitError = err close(process.waitBlock) }) }() } return false, nil } return false, nil } // Signal signals the process with `options`. // // For LCOW `guestresource.SignalProcessOptionsLCOW`. // // For WCOW `guestresource.SignalProcessOptionsWCOW`. func (process *Process) Signal(ctx context.Context, options interface{}) (bool, error) { process.handleLock.RLock() defer process.handleLock.RUnlock() operation := "hcs::Process::Signal" if process.handle == 0 { return false, makeProcessError(process, operation, ErrAlreadyClosed, nil) } optionsb, err := json.Marshal(options) if err != nil { return false, err } resultJSON, err := vmcompute.HcsSignalProcess(ctx, process.handle, string(optionsb)) events := processHcsResult(ctx, resultJSON) delivered, err := process.processSignalResult(ctx, err) if err != nil { err = makeProcessError(process, operation, err, events) } return delivered, err } // Kill signals the process to terminate but does not wait for it to finish terminating. func (process *Process) Kill(ctx context.Context) (bool, error) { process.handleLock.RLock() defer process.handleLock.RUnlock() operation := "hcs::Process::Kill" if process.handle == 0 { return false, makeProcessError(process, operation, ErrAlreadyClosed, nil) } if process.stopped() { return false, makeProcessError(process, operation, ErrProcessAlreadyStopped, nil) } if process.killSignalDelivered { // A kill signal has already been sent to this process. Sending a second // one offers no real benefit, as processes cannot stop themselves from // being terminated, once a TerminateProcess has been issued. Sending a // second kill may result in a number of errors (two of which detailed bellow) // and which we can avoid handling. return true, nil } // HCS serializes the signals sent to a target pid per compute system handle. // To avoid SIGKILL being serialized behind other signals, we open a new compute // system handle to deliver the kill signal. // If the calls to opening a new compute system handle fail, we forcefully // terminate the container itself so that no container is left behind hcsSystem, err := OpenComputeSystem(ctx, process.system.id) if err != nil { // log error and force termination of container log.G(ctx).WithField("err", err).Error("OpenComputeSystem() call failed") err = process.system.Terminate(ctx) // if the Terminate() call itself ever failed, log and return error if err != nil { log.G(ctx).WithField("err", err).Error("Terminate() call failed") return false, err } process.system.Close() return true, nil } defer hcsSystem.Close() newProcessHandle, err := hcsSystem.OpenProcess(ctx, process.Pid()) if err != nil { // Return true only if the target process has either already // exited, or does not exist. if IsAlreadyStopped(err) { return true, nil } else { return false, err } } defer newProcessHandle.Close() resultJSON, err := vmcompute.HcsTerminateProcess(ctx, newProcessHandle.handle) if err != nil { // We still need to check these two cases, as processes may still be killed by an // external actor (human operator, OOM, random script etc). if errors.Is(err, os.ErrPermission) || IsAlreadyStopped(err) { // There are two cases where it should be safe to ignore an error returned // by HcsTerminateProcess. The first one is cause by the fact that // HcsTerminateProcess ends up calling TerminateProcess in the context // of a container. According to the TerminateProcess documentation: // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess#remarks // After a process has terminated, call to TerminateProcess with open // handles to the process fails with ERROR_ACCESS_DENIED (5) error code. // It's safe to ignore this error here. HCS should always have permissions // to kill processes inside any container. So an ERROR_ACCESS_DENIED // is unlikely to be anything else than what the ending remarks in the // documentation states. // // The second case is generated by hcs itself, if for any reason HcsTerminateProcess // is called twice in a very short amount of time. In such cases, hcs may return // HCS_E_PROCESS_ALREADY_STOPPED. return true, nil } } events := processHcsResult(ctx, resultJSON) delivered, err := newProcessHandle.processSignalResult(ctx, err) if err != nil { err = makeProcessError(newProcessHandle, operation, err, events) } process.killSignalDelivered = delivered return delivered, err } // waitBackground waits for the process exit notification. Once received sets // `process.waitError` (if any) and unblocks all `Wait` calls. // // This MUST be called exactly once per `process.handle` but `Wait` is safe to // call multiple times. func (process *Process) waitBackground() { operation := "hcs::Process::waitBackground" ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() span.AddAttributes( trace.StringAttribute("cid", process.SystemID()), trace.Int64Attribute("pid", int64(process.processID))) var ( err error exitCode = -1 propertiesJSON string resultJSON string ) err = waitForNotification(ctx, process.callbackNumber, hcsNotificationProcessExited, nil) if err != nil { err = makeProcessError(process, operation, err, nil) log.G(ctx).WithError(err).Error("failed wait") } else { process.handleLock.RLock() defer process.handleLock.RUnlock() // Make sure we didn't race with Close() here if process.handle != 0 { propertiesJSON, resultJSON, err = vmcompute.HcsGetProcessProperties(ctx, process.handle) events := processHcsResult(ctx, resultJSON) if err != nil { err = makeProcessError(process, operation, err, events) } else { properties := &hcsschema.ProcessStatus{} err = json.Unmarshal([]byte(propertiesJSON), properties) if err != nil { err = makeProcessError(process, operation, err, nil) } else { if properties.LastWaitResult != 0 { log.G(ctx).WithField("wait-result", properties.LastWaitResult).Warning("non-zero last wait result") } else { exitCode = int(properties.ExitCode) } } } } } log.G(ctx).WithField("exitCode", exitCode).Debug("process exited") process.closedWaitOnce.Do(func() { process.exitCode = exitCode process.waitError = err close(process.waitBlock) }) oc.SetSpanStatus(span, err) } // Wait waits for the process to exit. If the process has already exited returns // the previous error (if any). func (process *Process) Wait() error { <-process.waitBlock return process.waitError } // Exited returns if the process has stopped func (process *Process) stopped() bool { select { case <-process.waitBlock: return true default: return false } } // ResizeConsole resizes the console of the process. func (process *Process) ResizeConsole(ctx context.Context, width, height uint16) error { process.handleLock.RLock() defer process.handleLock.RUnlock() operation := "hcs::Process::ResizeConsole" if process.handle == 0 { return makeProcessError(process, operation, ErrAlreadyClosed, nil) } modifyRequest := hcsschema.ProcessModifyRequest{ Operation: guestrequest.ModifyProcessConsoleSize, ConsoleSize: &hcsschema.ConsoleSize{ Height: height, Width: width, }, } modifyRequestb, err := json.Marshal(modifyRequest) if err != nil { return err } resultJSON, err := vmcompute.HcsModifyProcess(ctx, process.handle, string(modifyRequestb)) events := processHcsResult(ctx, resultJSON) if err != nil { return makeProcessError(process, operation, err, events) } return nil } // ExitCode returns the exit code of the process. The process must have // already terminated. func (process *Process) ExitCode() (int, error) { if !process.stopped() { return -1, makeProcessError(process, "hcs::Process::ExitCode", ErrInvalidProcessState, nil) } if process.waitError != nil { return -1, process.waitError } return process.exitCode, nil } // StdioLegacy returns the stdin, stdout, and stderr pipes, respectively. Closing // these pipes does not close the underlying pipes. Once returned, these pipes // are the responsibility of the caller to close. func (process *Process) StdioLegacy() (_ io.WriteCloser, _ io.ReadCloser, _ io.ReadCloser, err error) { operation := "hcs::Process::StdioLegacy" ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("cid", process.SystemID()), trace.Int64Attribute("pid", int64(process.processID))) process.handleLock.RLock() defer process.handleLock.RUnlock() if process.handle == 0 { return nil, nil, nil, makeProcessError(process, operation, ErrAlreadyClosed, nil) } process.stdioLock.Lock() defer process.stdioLock.Unlock() if process.hasCachedStdio { stdin, stdout, stderr := process.stdin, process.stdout, process.stderr process.stdin, process.stdout, process.stderr = nil, nil, nil process.hasCachedStdio = false return stdin, stdout, stderr, nil } processInfo, resultJSON, err := vmcompute.HcsGetProcessInfo(ctx, process.handle) events := processHcsResult(ctx, resultJSON) if err != nil { return nil, nil, nil, makeProcessError(process, operation, err, events) } pipes, err := makeOpenFiles([]syscall.Handle{processInfo.StdInput, processInfo.StdOutput, processInfo.StdError}) if err != nil { return nil, nil, nil, makeProcessError(process, operation, err, nil) } return pipes[0], pipes[1], pipes[2], nil } // Stdio returns the stdin, stdout, and stderr pipes, respectively. // To close them, close the process handle, or use the `CloseStd*` functions. func (process *Process) Stdio() (stdin io.Writer, stdout, stderr io.Reader) { process.stdioLock.Lock() defer process.stdioLock.Unlock() return process.stdin, process.stdout, process.stderr } // CloseStdin closes the write side of the stdin pipe so that the process is // notified on the read side that there is no more data in stdin. func (process *Process) CloseStdin(ctx context.Context) (err error) { operation := "hcs::Process::CloseStdin" ctx, span := trace.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("cid", process.SystemID()), trace.Int64Attribute("pid", int64(process.processID))) process.handleLock.RLock() defer process.handleLock.RUnlock() if process.handle == 0 { return makeProcessError(process, operation, ErrAlreadyClosed, nil) } //HcsModifyProcess request to close stdin will fail if the process has already exited if !process.stopped() { modifyRequest := hcsschema.ProcessModifyRequest{ Operation: guestrequest.CloseProcessHandle, CloseHandle: &hcsschema.CloseHandle{ Handle: guestrequest.STDInHandle, }, } modifyRequestb, err := json.Marshal(modifyRequest) if err != nil { return err } resultJSON, err := vmcompute.HcsModifyProcess(ctx, process.handle, string(modifyRequestb)) events := processHcsResult(ctx, resultJSON) if err != nil { return makeProcessError(process, operation, err, events) } } process.stdioLock.Lock() defer process.stdioLock.Unlock() if process.stdin != nil { process.stdin.Close() process.stdin = nil } return nil } func (process *Process) CloseStdout(ctx context.Context) (err error) { ctx, span := oc.StartSpan(ctx, "hcs::Process::CloseStdout") //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("cid", process.SystemID()), trace.Int64Attribute("pid", int64(process.processID))) process.handleLock.Lock() defer process.handleLock.Unlock() if process.handle == 0 { return nil } process.stdioLock.Lock() defer process.stdioLock.Unlock() if process.stdout != nil { process.stdout.Close() process.stdout = nil } return nil } func (process *Process) CloseStderr(ctx context.Context) (err error) { ctx, span := oc.StartSpan(ctx, "hcs::Process::CloseStderr") //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("cid", process.SystemID()), trace.Int64Attribute("pid", int64(process.processID))) process.handleLock.Lock() defer process.handleLock.Unlock() if process.handle == 0 { return nil } process.stdioLock.Lock() defer process.stdioLock.Unlock() if process.stderr != nil { process.stderr.Close() process.stderr = nil } return nil } // Close cleans up any state associated with the process but does not kill // or wait on it. func (process *Process) Close() (err error) { operation := "hcs::Process::Close" ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("cid", process.SystemID()), trace.Int64Attribute("pid", int64(process.processID))) process.handleLock.Lock() defer process.handleLock.Unlock() // Don't double free this if process.handle == 0 { return nil } process.stdioLock.Lock() if process.stdin != nil { process.stdin.Close() process.stdin = nil } if process.stdout != nil { process.stdout.Close() process.stdout = nil } if process.stderr != nil { process.stderr.Close() process.stderr = nil } process.stdioLock.Unlock() if err = process.unregisterCallback(ctx); err != nil { return makeProcessError(process, operation, err, nil) } if err = vmcompute.HcsCloseProcess(ctx, process.handle); err != nil { return makeProcessError(process, operation, err, nil) } process.handle = 0 process.closedWaitOnce.Do(func() { process.exitCode = -1 process.waitError = ErrAlreadyClosed close(process.waitBlock) }) return nil } func (process *Process) registerCallback(ctx context.Context) error { callbackContext := ¬ificationWatcherContext{ channels: newProcessChannels(), systemID: process.SystemID(), processID: process.processID, } callbackMapLock.Lock() callbackNumber := nextCallback nextCallback++ callbackMap[callbackNumber] = callbackContext callbackMapLock.Unlock() callbackHandle, err := vmcompute.HcsRegisterProcessCallback(ctx, process.handle, notificationWatcherCallback, callbackNumber) if err != nil { return err } callbackContext.handle = callbackHandle process.callbackNumber = callbackNumber return nil } func (process *Process) unregisterCallback(ctx context.Context) error { callbackNumber := process.callbackNumber callbackMapLock.RLock() callbackContext := callbackMap[callbackNumber] callbackMapLock.RUnlock() if callbackContext == nil { return nil } handle := callbackContext.handle if handle == 0 { return nil } // vmcompute.HcsUnregisterProcessCallback has its own synchronization to // wait for all callbacks to complete. We must NOT hold the callbackMapLock. err := vmcompute.HcsUnregisterProcessCallback(ctx, handle) if err != nil { return err } closeChannels(callbackContext.channels) callbackMapLock.Lock() delete(callbackMap, callbackNumber) callbackMapLock.Unlock() handle = 0 //nolint:ineffassign return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema1/schema1.go ================================================ //go:build windows package schema1 import ( "encoding/json" "time" "github.com/Microsoft/go-winio/pkg/guid" hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" ) // ProcessConfig is used as both the input of Container.CreateProcess // and to convert the parameters to JSON for passing onto the HCS type ProcessConfig struct { ApplicationName string `json:",omitempty"` CommandLine string `json:",omitempty"` CommandArgs []string `json:",omitempty"` // Used by Linux Containers on Windows User string `json:",omitempty"` WorkingDirectory string `json:",omitempty"` Environment map[string]string `json:",omitempty"` EmulateConsole bool `json:",omitempty"` CreateStdInPipe bool `json:",omitempty"` CreateStdOutPipe bool `json:",omitempty"` CreateStdErrPipe bool `json:",omitempty"` ConsoleSize [2]uint `json:",omitempty"` CreateInUtilityVm bool `json:",omitempty"` // Used by Linux Containers on Windows OCISpecification *json.RawMessage `json:",omitempty"` // Used by Linux Containers on Windows } type Layer struct { ID string Path string } type MappedDir struct { HostPath string ContainerPath string ReadOnly bool BandwidthMaximum uint64 IOPSMaximum uint64 CreateInUtilityVM bool // LinuxMetadata - Support added in 1803/RS4+. LinuxMetadata bool `json:",omitempty"` } type MappedPipe struct { HostPath string ContainerPipeName string } type HvRuntime struct { ImagePath string `json:",omitempty"` SkipTemplate bool `json:",omitempty"` LinuxInitrdFile string `json:",omitempty"` // File under ImagePath on host containing an initrd image for starting a Linux utility VM LinuxKernelFile string `json:",omitempty"` // File under ImagePath on host containing a kernel for starting a Linux utility VM LinuxBootParameters string `json:",omitempty"` // Additional boot parameters for starting a Linux Utility VM in initrd mode BootSource string `json:",omitempty"` // "Vhd" for Linux Utility VM booting from VHD WritableBootSource bool `json:",omitempty"` // Linux Utility VM booting from VHD } type MappedVirtualDisk struct { HostPath string `json:",omitempty"` // Path to VHD on the host ContainerPath string // Platform-specific mount point path in the container CreateInUtilityVM bool `json:",omitempty"` ReadOnly bool `json:",omitempty"` Cache string `json:",omitempty"` // "" (Unspecified); "Disabled"; "Enabled"; "Private"; "PrivateAllowSharing" AttachOnly bool `json:",omitempty"` } // AssignedDevice represents a device that has been directly assigned to a container // // NOTE: Support added in RS5 type AssignedDevice struct { // InterfaceClassGUID of the device to assign to container. InterfaceClassGUID string `json:"InterfaceClassGuid,omitempty"` } // ContainerConfig is used as both the input of CreateContainer // and to convert the parameters to JSON for passing onto the HCS type ContainerConfig struct { SystemType string // HCS requires this to be hard-coded to "Container" Name string // Name of the container. We use the docker ID. Owner string `json:",omitempty"` // The management platform that created this container VolumePath string `json:",omitempty"` // Windows volume path for scratch space. Used by Windows Server Containers only. Format \\?\\Volume{GUID} IgnoreFlushesDuringBoot bool `json:",omitempty"` // Optimization hint for container startup in Windows LayerFolderPath string `json:",omitempty"` // Where the layer folders are located. Used by Windows Server Containers only. Format %root%\windowsfilter\containerID Layers []Layer // List of storage layers. Required for Windows Server and Hyper-V Containers. Format ID=GUID;Path=%root%\windowsfilter\layerID Credentials string `json:",omitempty"` // Credentials information ProcessorCount uint32 `json:",omitempty"` // Number of processors to assign to the container. ProcessorWeight uint64 `json:",omitempty"` // CPU shares (relative weight to other containers with cpu shares). Range is from 1 to 10000. A value of 0 results in default shares. ProcessorMaximum int64 `json:",omitempty"` // Specifies the portion of processor cycles that this container can use as a percentage times 100. Range is from 1 to 10000. A value of 0 results in no limit. StorageIOPSMaximum uint64 `json:",omitempty"` // Maximum Storage IOPS StorageBandwidthMaximum uint64 `json:",omitempty"` // Maximum Storage Bandwidth in bytes per second StorageSandboxSize uint64 `json:",omitempty"` // Size in bytes that the container system drive should be expanded to if smaller MemoryMaximumInMB int64 `json:",omitempty"` // Maximum memory available to the container in Megabytes HostName string `json:",omitempty"` // Hostname MappedDirectories []MappedDir `json:",omitempty"` // List of mapped directories (volumes/mounts) MappedPipes []MappedPipe `json:",omitempty"` // List of mapped Windows named pipes HvPartition bool // True if it a Hyper-V Container NetworkSharedContainerName string `json:",omitempty"` // Name (ID) of the container that we will share the network stack with. EndpointList []string `json:",omitempty"` // List of networking endpoints to be attached to container HvRuntime *HvRuntime `json:",omitempty"` // Hyper-V container settings. Used by Hyper-V containers only. Format ImagePath=%root%\BaseLayerID\UtilityVM Servicing bool `json:",omitempty"` // True if this container is for servicing AllowUnqualifiedDNSQuery bool `json:",omitempty"` // True to allow unqualified DNS name resolution DNSSearchList string `json:",omitempty"` // Comma separated list of DNS suffixes to use for name resolution ContainerType string `json:",omitempty"` // "Linux" for Linux containers on Windows. Omitted otherwise. TerminateOnLastHandleClosed bool `json:",omitempty"` // Should HCS terminate the container once all handles have been closed MappedVirtualDisks []MappedVirtualDisk `json:",omitempty"` // Array of virtual disks to mount at start AssignedDevices []AssignedDevice `json:",omitempty"` // Array of devices to assign. NOTE: Support added in RS5 } type ComputeSystemQuery struct { IDs []string `json:"Ids,omitempty"` Types []string `json:",omitempty"` Names []string `json:",omitempty"` Owners []string `json:",omitempty"` } type PropertyType string const ( PropertyTypeStatistics PropertyType = "Statistics" // V1 and V2 PropertyTypeProcessList PropertyType = "ProcessList" // V1 and V2 PropertyTypeMappedVirtualDisk PropertyType = "MappedVirtualDisk" // Not supported in V2 schema call PropertyTypeGuestConnection PropertyType = "GuestConnection" // V1 and V2. Nil return from HCS before RS5 ) type PropertyQuery struct { PropertyTypes []PropertyType `json:",omitempty"` } // ContainerProperties holds the properties for a container and the processes running in that container type ContainerProperties struct { ID string `json:"Id"` State string Name string SystemType string RuntimeOSType string `json:"RuntimeOsType,omitempty"` Owner string SiloGUID string `json:"SiloGuid,omitempty"` RuntimeID guid.GUID `json:"RuntimeId,omitempty"` IsRuntimeTemplate bool `json:",omitempty"` RuntimeImagePath string `json:",omitempty"` Stopped bool `json:",omitempty"` ExitType string `json:",omitempty"` AreUpdatesPending bool `json:",omitempty"` ObRoot string `json:",omitempty"` Statistics Statistics `json:",omitempty"` ProcessList []ProcessListItem `json:",omitempty"` MappedVirtualDiskControllers map[int]MappedVirtualDiskController `json:",omitempty"` GuestConnectionInfo GuestConnectionInfo `json:",omitempty"` } // MemoryStats holds the memory statistics for a container type MemoryStats struct { UsageCommitBytes uint64 `json:"MemoryUsageCommitBytes,omitempty"` UsageCommitPeakBytes uint64 `json:"MemoryUsageCommitPeakBytes,omitempty"` UsagePrivateWorkingSetBytes uint64 `json:"MemoryUsagePrivateWorkingSetBytes,omitempty"` } // ProcessorStats holds the processor statistics for a container type ProcessorStats struct { TotalRuntime100ns uint64 `json:",omitempty"` RuntimeUser100ns uint64 `json:",omitempty"` RuntimeKernel100ns uint64 `json:",omitempty"` } // StorageStats holds the storage statistics for a container type StorageStats struct { ReadCountNormalized uint64 `json:",omitempty"` ReadSizeBytes uint64 `json:",omitempty"` WriteCountNormalized uint64 `json:",omitempty"` WriteSizeBytes uint64 `json:",omitempty"` } // NetworkStats holds the network statistics for a container type NetworkStats struct { BytesReceived uint64 `json:",omitempty"` BytesSent uint64 `json:",omitempty"` PacketsReceived uint64 `json:",omitempty"` PacketsSent uint64 `json:",omitempty"` DroppedPacketsIncoming uint64 `json:",omitempty"` DroppedPacketsOutgoing uint64 `json:",omitempty"` EndpointId string `json:",omitempty"` InstanceId string `json:",omitempty"` } // Statistics is the structure returned by a statistics call on a container type Statistics struct { Timestamp time.Time `json:",omitempty"` ContainerStartTime time.Time `json:",omitempty"` Uptime100ns uint64 `json:",omitempty"` Memory MemoryStats `json:",omitempty"` Processor ProcessorStats `json:",omitempty"` Storage StorageStats `json:",omitempty"` Network []NetworkStats `json:",omitempty"` } // ProcessList is the structure of an item returned by a ProcessList call on a container type ProcessListItem struct { CreateTimestamp time.Time `json:",omitempty"` ImageName string `json:",omitempty"` KernelTime100ns uint64 `json:",omitempty"` MemoryCommitBytes uint64 `json:",omitempty"` MemoryWorkingSetPrivateBytes uint64 `json:",omitempty"` MemoryWorkingSetSharedBytes uint64 `json:",omitempty"` ProcessId uint32 `json:",omitempty"` UserTime100ns uint64 `json:",omitempty"` } // MappedVirtualDiskController is the structure of an item returned by a MappedVirtualDiskList call on a container type MappedVirtualDiskController struct { MappedVirtualDisks map[int]MappedVirtualDisk `json:",omitempty"` } // GuestDefinedCapabilities is part of the GuestConnectionInfo returned by a GuestConnection call on a utility VM type GuestDefinedCapabilities struct { NamespaceAddRequestSupported bool `json:",omitempty"` SignalProcessSupported bool `json:",omitempty"` DumpStacksSupported bool `json:",omitempty"` DeleteContainerStateSupported bool `json:",omitempty"` UpdateContainerSupported bool `json:",omitempty"` } // GuestConnectionInfo is the structure of an iterm return by a GuestConnection call on a utility VM type GuestConnectionInfo struct { SupportedSchemaVersions []hcsschema.Version `json:",omitempty"` ProtocolVersion uint32 `json:",omitempty"` GuestDefinedCapabilities GuestDefinedCapabilities `json:",omitempty"` } // Type of Request Support in ModifySystem type RequestType string // Type of Resource Support in ModifySystem type ResourceType string // RequestType const const ( Add RequestType = "Add" Remove RequestType = "Remove" Network ResourceType = "Network" ) // ResourceModificationRequestResponse is the structure used to send request to the container to modify the system // Supported resource types are Network and Request Types are Add/Remove type ResourceModificationRequestResponse struct { Resource ResourceType `json:"ResourceType"` Data interface{} `json:"Settings"` Request RequestType `json:"RequestType,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/attachment.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Attachment struct { Type_ string `json:"Type,omitempty"` Path string `json:"Path,omitempty"` IgnoreFlushes bool `json:"IgnoreFlushes,omitempty"` CachingMode string `json:"CachingMode,omitempty"` NoWriteHardening bool `json:"NoWriteHardening,omitempty"` DisableExpansionOptimization bool `json:"DisableExpansionOptimization,omitempty"` IgnoreRelativeLocator bool `json:"IgnoreRelativeLocator,omitempty"` CaptureIoAttributionContext bool `json:"CaptureIoAttributionContext,omitempty"` ReadOnly bool `json:"ReadOnly,omitempty"` SupportCompressedVolumes bool `json:"SupportCompressedVolumes,omitempty"` AlwaysAllowSparseFiles bool `json:"AlwaysAllowSparseFiles,omitempty"` ExtensibleVirtualDiskType string `json:"ExtensibleVirtualDiskType,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/battery.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Battery struct { } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cache_query_stats_response.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type CacheQueryStatsResponse struct { L3OccupancyBytes int32 `json:"L3OccupancyBytes,omitempty"` L3TotalBwBytes int32 `json:"L3TotalBwBytes,omitempty"` L3LocalBwBytes int32 `json:"L3LocalBwBytes,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/chipset.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Chipset struct { Uefi *Uefi `json:"Uefi,omitempty"` IsNumLockDisabled bool `json:"IsNumLockDisabled,omitempty"` BaseBoardSerialNumber string `json:"BaseBoardSerialNumber,omitempty"` ChassisSerialNumber string `json:"ChassisSerialNumber,omitempty"` ChassisAssetTag string `json:"ChassisAssetTag,omitempty"` UseUtc bool `json:"UseUtc,omitempty"` // LinuxKernelDirect - Added in v2.2 Builds >=181117 LinuxKernelDirect *LinuxKernelDirect `json:"LinuxKernelDirect,omitempty"` FirmwareFile *FirmwareFile `json:"FirmwareFile,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cimfs.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.5 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type CimMount struct { ImagePath string `json:"ImagePath,omitempty"` FileSystemName string `json:"FileSystemName,omitempty"` VolumeGuid string `json:"VolumeGuid,omitempty"` MountFlags uint32 `json:"MountFlags,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/close_handle.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema import "github.com/Microsoft/hcsshim/internal/protocol/guestrequest" type CloseHandle struct { Handle guestrequest.STDIOHandle `json:"Handle,omitempty"` // NOTE: Swagger generated as string. Locally updated. } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // ComPort specifies the named pipe that will be used for the port, with empty string indicating a disconnected port. type ComPort struct { NamedPipe string `json:"NamedPipe,omitempty"` OptimizeForDebugger bool `json:"OptimizeForDebugger,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/compute_system.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ComputeSystem struct { Owner string `json:"Owner,omitempty"` SchemaVersion *Version `json:"SchemaVersion,omitempty"` HostingSystemId string `json:"HostingSystemId,omitempty"` HostedSystem interface{} `json:"HostedSystem,omitempty"` Container *Container `json:"Container,omitempty"` VirtualMachine *VirtualMachine `json:"VirtualMachine,omitempty"` ShouldTerminateOnLastHandleClosed bool `json:"ShouldTerminateOnLastHandleClosed,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/configuration.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema import ( "net/http" ) // contextKeys are used to identify the type of value in the context. // Since these are string, it is possible to get a short description of the // context key for logging and debugging using key.String(). type contextKey string func (c contextKey) String() string { return "auth " + string(c) } var ( // ContextOAuth2 takes a oauth2.TokenSource as authentication for the request. ContextOAuth2 = contextKey("token") // ContextBasicAuth takes BasicAuth as authentication for the request. ContextBasicAuth = contextKey("basic") // ContextAccessToken takes a string oauth2 access token as authentication for the request. ContextAccessToken = contextKey("accesstoken") // ContextAPIKey takes an APIKey as authentication for the request ContextAPIKey = contextKey("apikey") ) // BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth type BasicAuth struct { UserName string `json:"userName,omitempty"` Password string `json:"password,omitempty"` } // APIKey provides API key based authentication to a request passed via context using ContextAPIKey type APIKey struct { Key string Prefix string } type Configuration struct { BasePath string `json:"basePath,omitempty"` Host string `json:"host,omitempty"` Scheme string `json:"scheme,omitempty"` DefaultHeader map[string]string `json:"defaultHeader,omitempty"` UserAgent string `json:"userAgent,omitempty"` HTTPClient *http.Client } func NewConfiguration() *Configuration { cfg := &Configuration{ BasePath: "https://localhost", DefaultHeader: make(map[string]string), UserAgent: "Swagger-Codegen/2.1.0/go", } return cfg } func (c *Configuration) AddDefaultHeader(key string, value string) { c.DefaultHeader[key] = value } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/console_size.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // NOTE: Swagger generated fields as int32. Locally updated to uint16 to match documentation. // https://learn.microsoft.com/en-us/virtualization/api/hcs/schemareference#ConsoleSize type ConsoleSize struct { Height uint16 `json:"Height,omitempty"` Width uint16 `json:"Width,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Container struct { GuestOs *GuestOs `json:"GuestOs,omitempty"` Storage *Storage `json:"Storage,omitempty"` MappedDirectories []MappedDirectory `json:"MappedDirectories,omitempty"` MappedPipes []MappedPipe `json:"MappedPipes,omitempty"` Memory *Memory `json:"Memory,omitempty"` Processor *Processor `json:"Processor,omitempty"` Networking *Networking `json:"Networking,omitempty"` HvSocket *HvSocket `json:"HvSocket,omitempty"` ContainerCredentialGuard *ContainerCredentialGuardState `json:"ContainerCredentialGuard,omitempty"` RegistryChanges *RegistryChanges `json:"RegistryChanges,omitempty"` AssignedDevices []Device `json:"AssignedDevices,omitempty"` AdditionalDeviceNamespace *ContainerDefinitionDevice `json:"AdditionalDeviceNamespace,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_add_instance_request.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerCredentialGuardAddInstanceRequest struct { Id string `json:"Id,omitempty"` CredentialSpec string `json:"CredentialSpec,omitempty"` Transport string `json:"Transport,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_hv_socket_service_config.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerCredentialGuardHvSocketServiceConfig struct { ServiceId string `json:"ServiceId,omitempty"` ServiceConfig *HvSocketServiceConfig `json:"ServiceConfig,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_instance.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerCredentialGuardInstance struct { Id string `json:"Id,omitempty"` CredentialGuard *ContainerCredentialGuardState `json:"CredentialGuard,omitempty"` HvSocketConfig *ContainerCredentialGuardHvSocketServiceConfig `json:"HvSocketConfig,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_modify_operation.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerCredentialGuardModifyOperation string const ( AddInstance ContainerCredentialGuardModifyOperation = "AddInstance" RemoveInstance ContainerCredentialGuardModifyOperation = "RemoveInstance" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_operation_request.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerCredentialGuardOperationRequest struct { Operation ContainerCredentialGuardModifyOperation `json:"Operation,omitempty"` OperationDetails interface{} `json:"OperationDetails,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_remove_instance_request.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerCredentialGuardRemoveInstanceRequest struct { Id string `json:"Id,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_state.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerCredentialGuardState struct { // Authentication cookie for calls to a Container Credential Guard instance. Cookie string `json:"Cookie,omitempty"` // Name of the RPC endpoint of the Container Credential Guard instance. RpcEndpoint string `json:"RpcEndpoint,omitempty"` // Transport used for the configured Container Credential Guard instance. Transport string `json:"Transport,omitempty"` // Credential spec used for the configured Container Credential Guard instance. CredentialSpec string `json:"CredentialSpec,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_credential_guard_system_info.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerCredentialGuardSystemInfo struct { Instances []ContainerCredentialGuardInstance `json:"Instances,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // memory usage as viewed from within the container type ContainerMemoryInformation struct { TotalPhysicalBytes int32 `json:"TotalPhysicalBytes,omitempty"` TotalUsage int32 `json:"TotalUsage,omitempty"` CommittedBytes int32 `json:"CommittedBytes,omitempty"` SharedCommittedBytes int32 `json:"SharedCommittedBytes,omitempty"` CommitLimitBytes int32 `json:"CommitLimitBytes,omitempty"` PeakCommitmentBytes int32 `json:"PeakCommitmentBytes,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // CPU groups allow Hyper-V administrators to better manage and allocate the host's CPU resources across guest virtual machines type CpuGroup struct { Id string `json:"Id,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_affinity.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type CpuGroupAffinity struct { LogicalProcessorCount int32 `json:"LogicalProcessorCount,omitempty"` LogicalProcessors []int32 `json:"LogicalProcessors,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_config.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type CpuGroupConfig struct { GroupId string `json:"GroupId,omitempty"` Affinity *CpuGroupAffinity `json:"Affinity,omitempty"` GroupProperties []CpuGroupProperty `json:"GroupProperties,omitempty"` // Hypervisor CPU group IDs exposed to clients HypervisorGroupId uint64 `json:"HypervisorGroupId,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_configurations.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Structure used to return cpu groups for a Service property query type CpuGroupConfigurations struct { CpuGroups []CpuGroupConfig `json:"CpuGroups,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_operations.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type CPUGroupOperation string const ( CreateGroup CPUGroupOperation = "CreateGroup" DeleteGroup CPUGroupOperation = "DeleteGroup" SetProperty CPUGroupOperation = "SetProperty" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/cpu_group_property.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type CPUGroupPropertyCode uint32 const ( CPUCapacityProperty = 0x00010000 CPUSchedulingPriorityProperty = 0x00020000 IdleLPReserveProperty = 0x00030000 ) type CpuGroupProperty struct { PropertyCode uint32 `json:"PropertyCode,omitempty"` PropertyValue uint32 `json:"PropertyValue,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/create_group_operation.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Create group operation settings type CreateGroupOperation struct { GroupId string `json:"GroupId,omitempty"` LogicalProcessorCount uint32 `json:"LogicalProcessorCount,omitempty"` LogicalProcessors []uint32 `json:"LogicalProcessors,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/debug_options.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type DebugOptions struct { // BugcheckSavedStateFileName is the path for the file in which the guest VM state will be saved when // the guest crashes. BugcheckSavedStateFileName string `json:"BugcheckSavedStateFileName,omitempty"` // BugcheckNoCrashdumpSavedStateFileName is the path of the file in which the guest VM state will be // saved when the guest crashes but the guest isn't able to generate the crash dump. This usually // happens in early boot failures. BugcheckNoCrashdumpSavedStateFileName string `json:"BugcheckNoCrashdumpSavedStateFileName,omitempty"` TripleFaultSavedStateFileName string `json:"TripleFaultSavedStateFileName,omitempty"` FirmwareDumpFileName string `json:"FirmwareDumpFileName,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/delete_group_operation.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Delete group operation settings type DeleteGroupOperation struct { GroupId string `json:"GroupId,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/device.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type DeviceType string const ( ClassGUID DeviceType = "ClassGuid" DeviceInstanceID DeviceType = "DeviceInstance" GPUMirror DeviceType = "GpuMirror" ) type Device struct { // The type of device to assign to the container. Type DeviceType `json:"Type,omitempty"` // The interface class guid of the device interfaces to assign to the container. Only used when Type is ClassGuid. InterfaceClassGuid string `json:"InterfaceClassGuid,omitempty"` // The location path of the device to assign to the container. Only used when Type is DeviceInstanceID. LocationPath string `json:"LocationPath,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/devices.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Devices struct { ComPorts map[string]ComPort `json:"ComPorts,omitempty"` Scsi map[string]Scsi `json:"Scsi,omitempty"` VirtualPMem *VirtualPMemController `json:"VirtualPMem,omitempty"` NetworkAdapters map[string]NetworkAdapter `json:"NetworkAdapters,omitempty"` VideoMonitor *VideoMonitor `json:"VideoMonitor,omitempty"` Keyboard *Keyboard `json:"Keyboard,omitempty"` Mouse *Mouse `json:"Mouse,omitempty"` HvSocket *HvSocket2 `json:"HvSocket,omitempty"` EnhancedModeVideo *EnhancedModeVideo `json:"EnhancedModeVideo,omitempty"` GuestCrashReporting *GuestCrashReporting `json:"GuestCrashReporting,omitempty"` VirtualSmb *VirtualSmb `json:"VirtualSmb,omitempty"` Plan9 *Plan9 `json:"Plan9,omitempty"` Battery *Battery `json:"Battery,omitempty"` FlexibleIov map[string]FlexibleIoDevice `json:"FlexibleIov,omitempty"` SharedMemory *SharedMemoryConfiguration `json:"SharedMemory,omitempty"` // TODO: This is pre-release support in schema 2.3. Need to add build number // docs when a public build with this is out. VirtualPci map[string]VirtualPciDevice `json:",omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/enhanced_mode_video.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type EnhancedModeVideo struct { ConnectionOptions *RdpConnectionOptions `json:"ConnectionOptions,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/firmware.go ================================================ package hcsschema type FirmwareFile struct { // Parameters is an experimental/pre-release field. The field itself or its // behavior can change in future iterations of the schema. Avoid taking a hard // dependency on this field. Parameters []byte `json:"Parameters,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/flexible_io_device.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type FlexibleIoDevice struct { EmulatorId string `json:"EmulatorId,omitempty"` HostingModel string `json:"HostingModel,omitempty"` Configuration []string `json:"Configuration,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type GuestConnection struct { // Use Vsock rather than Hyper-V sockets to communicate with the guest service. UseVsock bool `json:"UseVsock,omitempty"` // Don't disconnect the guest connection when pausing the virtual machine. UseConnectedSuspend bool `json:"UseConnectedSuspend,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Information about the guest. type GuestConnectionInfo struct { // Each schema version x.y stands for the range of versions a.b where a==x and b<=y. This list comes from the SupportedSchemaVersions field in GcsCapabilities. SupportedSchemaVersions []Version `json:"SupportedSchemaVersions,omitempty"` ProtocolVersion int32 `json:"ProtocolVersion,omitempty"` GuestDefinedCapabilities *interface{} `json:"GuestDefinedCapabilities,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_crash_reporting.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type GuestCrashReporting struct { WindowsCrashSettings *WindowsCrashReporting `json:"WindowsCrashSettings,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_os.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type GuestOs struct { HostName string `json:"HostName,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_state.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type GuestState struct { // The path to an existing file uses for persistent guest state storage. An empty string indicates the system should initialize new transient, in-memory guest state. GuestStateFilePath string `json:"GuestStateFilePath,omitempty"` // The guest state file type affected by different guest isolation modes - whether a file or block storage. GuestStateFileType string `json:"GuestStateFileType,omitempty"` // The path to an existing file for persistent runtime state storage. An empty string indicates the system should initialize new transient, in-memory runtime state. RuntimeStateFilePath string `json:"RuntimeStateFilePath,omitempty"` // If true, the guest state and runtime state files will be used as templates to populate transient, in-memory state instead of using the files as persistent backing store. ForceTransientState bool `json:"ForceTransientState,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/host_processor_modify_request.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Structure used to request a service processor modification type HostProcessorModificationRequest struct { Operation CPUGroupOperation `json:"Operation,omitempty"` OperationDetails interface{} `json:"OperationDetails,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hosted_system.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type HostedSystem struct { SchemaVersion *Version `json:"SchemaVersion,omitempty"` Container *Container `json:"Container,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type HvSocket struct { Config *HvSocketSystemConfig `json:"Config,omitempty"` EnablePowerShellDirect bool `json:"EnablePowerShellDirect,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // HvSocket configuration for a VM type HvSocket2 struct { HvSocketConfig *HvSocketSystemConfig `json:"HvSocketConfig,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // This class defines address settings applied to a VM // by the GCS every time a VM starts or restores. type HvSocketAddress struct { LocalAddress string `json:"LocalAddress,omitempty"` ParentAddress string `json:"ParentAddress,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_service_config.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type HvSocketServiceConfig struct { // SDDL string that HvSocket will check before allowing a host process to bind to this specific service. If not specified, defaults to the system DefaultBindSecurityDescriptor, defined in HvSocketSystemWpConfig in V1. BindSecurityDescriptor string `json:"BindSecurityDescriptor,omitempty"` // SDDL string that HvSocket will check before allowing a host process to connect to this specific service. If not specified, defaults to the system DefaultConnectSecurityDescriptor, defined in HvSocketSystemWpConfig in V1. ConnectSecurityDescriptor string `json:"ConnectSecurityDescriptor,omitempty"` // If true, HvSocket will process wildcard binds for this service/system combination. Wildcard binds are secured in the registry at SOFTWARE/Microsoft/Windows NT/CurrentVersion/Virtualization/HvSocket/WildcardDescriptors AllowWildcardBinds bool `json:"AllowWildcardBinds,omitempty"` // Disabled controls whether the HvSocket service is accepting connection requests. // This set to true will make the service refuse all incoming connections as well as cancel // any connections already established. The service itself will still be active however // and can be re-enabled at a future time. Disabled bool `json:"Disabled,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // This is the HCS Schema version of the HvSocket configuration. The VMWP version is located in Config.Devices.IC in V1. type HvSocketSystemConfig struct { // SDDL string that HvSocket will check before allowing a host process to bind to an unlisted service for this specific container/VM (not wildcard binds). DefaultBindSecurityDescriptor string `json:"DefaultBindSecurityDescriptor,omitempty"` // SDDL string that HvSocket will check before allowing a host process to connect to an unlisted service in the VM/container. DefaultConnectSecurityDescriptor string `json:"DefaultConnectSecurityDescriptor,omitempty"` ServiceTable map[string]HvSocketServiceConfig `json:"ServiceTable,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/interrupt_moderation_mode.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type InterruptModerationName string // The valid interrupt moderation modes for I/O virtualization (IOV) offloading. const ( DefaultName InterruptModerationName = "Default" AdaptiveName InterruptModerationName = "Adaptive" OffName InterruptModerationName = "Off" LowName InterruptModerationName = "Low" MediumName InterruptModerationName = "Medium" HighName InterruptModerationName = "High" ) type InterruptModerationValue uint32 const ( DefaultValue InterruptModerationValue = iota AdaptiveValue OffValue LowValue InterruptModerationValue = 100 MediumValue InterruptModerationValue = 200 HighValue InterruptModerationValue = 300 ) var InterruptModerationValueToName = map[InterruptModerationValue]InterruptModerationName{ DefaultValue: DefaultName, AdaptiveValue: AdaptiveName, OffValue: OffName, LowValue: LowName, MediumValue: MediumName, HighValue: HighName, } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/iov_settings.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type IovSettings struct { // The weight assigned to this port for I/O virtualization (IOV) offloading. // Setting this to 0 disables IOV offloading. OffloadWeight *uint32 `json:"OffloadWeight,omitempty"` // The number of queue pairs requested for this port for I/O virtualization (IOV) offloading. QueuePairsRequested *uint32 `json:"QueuePairsRequested,omitempty"` // The interrupt moderation mode for I/O virtualization (IOV) offloading. InterruptModeration *InterruptModerationName `json:"InterruptModeration,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/isolation_settings.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type IsolationSettings struct { // Guest isolation type options to decide virtual trust levels of virtual machine IsolationType string `json:"IsolationType,omitempty"` // Configuration to debug HCL layer for HCS VM TODO: Task 31102306: Miss the way to prevent the exposure of private debug configuration in HCS TODO: Think about the secret configurations which are private in VMMS VM (only edit by hvsedit) DebugHost string `json:"DebugHost,omitempty"` DebugPort int64 `json:"DebugPort,omitempty"` // Optional data passed by host on isolated virtual machine start LaunchData string `json:"LaunchData,omitempty"` HclEnabled *bool `json:"HclEnabled,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/keyboard.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Keyboard struct { } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type FileSystemFilterType string const ( UnionFS FileSystemFilterType = "UnionFS" WCIFS FileSystemFilterType = "WCIFS" ) type Layer struct { Id string `json:"Id,omitempty"` Path string `json:"Path,omitempty"` PathType string `json:"PathType,omitempty"` // Unspecified defaults to Enabled Cache string `json:"Cache,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/linux_kernel_direct.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.2 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type LinuxKernelDirect struct { KernelFilePath string `json:"KernelFilePath,omitempty"` InitRdPath string `json:"InitRdPath,omitempty"` KernelCmdLine string `json:"KernelCmdLine,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/logical_processor.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type LogicalProcessor struct { LpIndex uint32 `json:"LpIndex,omitempty"` NodeNumber uint8 `json:"NodeNumber,omitempty"` PackageId uint32 `json:"PackageId,omitempty"` CoreId uint32 `json:"CoreId,omitempty"` RootVpIndex int32 `json:"RootVpIndex,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_directory.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type MappedDirectory struct { HostPath string `json:"HostPath,omitempty"` HostPathType string `json:"HostPathType,omitempty"` ContainerPath string `json:"ContainerPath,omitempty"` ReadOnly bool `json:"ReadOnly,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mapped_pipe.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type MappedPipe struct { ContainerPipeName string `json:"ContainerPipeName,omitempty"` HostPath string `json:"HostPath,omitempty"` HostPathType string `json:"HostPathType,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Memory struct { SizeInMB uint64 `json:"SizeInMB,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_backing_type.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swaggerapi/swaggercodegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swaggerapi/swaggercodegen.git) */ package hcsschema type MemoryBackingType string // List of MemoryBackingType const ( MemoryBackingType_PHYSICAL MemoryBackingType = "Physical" MemoryBackingType_VIRTUAL MemoryBackingType = "Virtual" MemoryBackingType_HYBRID MemoryBackingType = "Hybrid" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_information_for_vm.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type MemoryInformationForVm struct { VirtualNodeCount uint32 `json:"VirtualNodeCount,omitempty"` VirtualMachineMemory *VmMemory `json:"VirtualMachineMemory,omitempty"` VirtualNodes []VirtualNodeInfo `json:"VirtualNodes,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Memory runtime statistics type MemoryStats struct { MemoryUsageCommitBytes uint64 `json:"MemoryUsageCommitBytes,omitempty"` MemoryUsageCommitPeakBytes uint64 `json:"MemoryUsageCommitPeakBytes,omitempty"` MemoryUsagePrivateWorkingSetBytes uint64 `json:"MemoryUsagePrivateWorkingSetBytes,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_container_definition_device.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ContainerDefinitionDevice struct { DeviceExtension []DeviceExtension `json:"device_extension,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_category.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type DeviceCategory struct { Name string `json:"name,omitempty"` InterfaceClass []InterfaceClass `json:"interface_class,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_extension.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type DeviceExtension struct { DeviceCategory *DeviceCategory `json:"device_category,omitempty"` Namespace *DeviceExtensionNamespace `json:"namespace,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_instance.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type DeviceInstance struct { Id string `json:"id,omitempty"` LocationPath string `json:"location_path,omitempty"` PortName string `json:"port_name,omitempty"` InterfaceClass []InterfaceClass `json:"interface_class,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_device_namespace.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type DeviceNamespace struct { RequiresDriverstore bool `json:"requires_driverstore,omitempty"` DeviceCategory []DeviceCategory `json:"device_category,omitempty"` DeviceInstance []DeviceInstance `json:"device_instance,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_interface_class.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type InterfaceClass struct { Type_ string `json:"type,omitempty"` Identifier string `json:"identifier,omitempty"` Recurse bool `json:"recurse,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_namespace.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type DeviceExtensionNamespace struct { Ob *ObjectNamespace `json:"ob,omitempty"` Device *DeviceNamespace `json:"device,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_directory.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ObjectDirectory struct { Name string `json:"name,omitempty"` Clonesd string `json:"clonesd,omitempty"` Shadow string `json:"shadow,omitempty"` Symlink []ObjectSymlink `json:"symlink,omitempty"` Objdir []ObjectDirectory `json:"objdir,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_namespace.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ObjectNamespace struct { Shadow string `json:"shadow,omitempty"` Symlink []ObjectSymlink `json:"symlink,omitempty"` Objdir []ObjectDirectory `json:"objdir,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/model_object_symlink.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ObjectSymlink struct { Name string `json:"name,omitempty"` Path string `json:"path,omitempty"` Scope string `json:"scope,omitempty"` Pathtoclone string `json:"pathtoclone,omitempty"` AccessMask int32 `json:"access_mask,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modification_request.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ModificationRequest struct { PropertyType PropertyType `json:"PropertyType,omitempty"` Settings interface{} `json:"Settings,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/modify_setting_request.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema import "github.com/Microsoft/hcsshim/internal/protocol/guestrequest" type ModifySettingRequest struct { ResourcePath string `json:"ResourcePath,omitempty"` RequestType guestrequest.RequestType `json:"RequestType,omitempty"` // NOTE: Swagger generated as string. Locally updated. Settings interface{} `json:"Settings,omitempty"` // NOTE: Swagger generated as *interface{}. Locally updated GuestRequest interface{} `json:"GuestRequest,omitempty"` // NOTE: Swagger generated as *interface{}. Locally updated } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/mouse.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Mouse struct { } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/network_adapter.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type NetworkAdapter struct { EndpointId string `json:"EndpointId,omitempty"` MacAddress string `json:"MacAddress,omitempty"` // The I/O virtualization (IOV) offloading configuration. IovSettings *IovSettings `json:"IovSettings,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/networking.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Networking struct { AllowUnqualifiedDnsQuery bool `json:"AllowUnqualifiedDnsQuery,omitempty"` DnsSearchList string `json:"DnsSearchList,omitempty"` NetworkSharedContainerName string `json:"NetworkSharedContainerName,omitempty"` // Guid in windows; string in linux Namespace string `json:"Namespace,omitempty"` NetworkAdapters []string `json:"NetworkAdapters,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Numa struct { VirtualNodeCount uint8 `json:"VirtualNodeCount,omitempty"` PreferredPhysicalNodes []int64 `json:"PreferredPhysicalNodes,omitempty"` Settings []NumaSetting `json:"Settings,omitempty"` MaxSizePerNode uint64 `json:"MaxSizePerNode,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_node.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type NumaNode struct { VirtualNodeIndex uint32 `json:"VirtualNodeIndex,omitempty"` PhysicalNodeIndex uint32 `json:"PhysicalNodeIndex,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_node_memory.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type NumaNodeMemory struct { // Total physical memory on on this physical NUMA node that is consumable by the VMs. TotalConsumableMemoryInPages uint64 `json:"TotalConsumableMemoryInPages,omitempty"` // Currently available physical memory on this physical NUMA node for the VMs. AvailableMemoryInPages uint64 `json:"AvailableMemoryInPages,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_node_processor.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type NumaNodeProcessor struct { TotalAssignedProcessors uint32 `json:"TotalAssignedProcessors,omitempty"` TotalAvailableProcessors uint32 `json:"TotalAvailableProcessors,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_processors.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type NumaProcessors struct { CountPerNode Range `json:"count_per_node,omitempty"` NodePerSocket uint32 `json:"node_per_socket,omitempty"` } type Range struct { Max uint32 `json:"max,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/numa_setting.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type NumaSetting struct { VirtualNodeNumber uint32 `json:"VirtualNodeNumber,omitempty"` PhysicalNodeNumber uint32 `json:"PhysicalNodeNumber,omitempty"` VirtualSocketNumber uint32 `json:"VirtualSocketNumber,omitempty"` CountOfProcessors uint32 `json:"CountOfProcessors,omitempty"` CountOfMemoryBlocks uint64 `json:"CountOfMemoryBlocks,omitempty"` MemoryBackingType MemoryBackingType `json:"MemoryBackingType,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Notification data that is indicated to components running in the Virtual Machine. type PauseNotification struct { Reason string `json:"Reason,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Options for HcsPauseComputeSystem type PauseOptions struct { SuspensionLevel string `json:"SuspensionLevel,omitempty"` HostedNotification *PauseNotification `json:"HostedNotification,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Plan9 struct { Shares []Plan9Share `json:"Shares,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/plan9_share.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Plan9Share struct { Name string `json:"Name,omitempty"` // The name by which the guest operation system can access this share, via the aname parameter in the Plan9 protocol. AccessName string `json:"AccessName,omitempty"` Path string `json:"Path,omitempty"` Port int32 `json:"Port,omitempty"` // Flags are marked private. Until they are exported correctly // // ReadOnly 0x00000001 // LinuxMetadata 0x00000004 // CaseSensitive 0x00000008 Flags int32 `json:"Flags,omitempty"` ReadOnly bool `json:"ReadOnly,omitempty"` UseShareRootIdentity bool `json:"UseShareRootIdentity,omitempty"` AllowedFiles []string `json:"AllowedFiles,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema import ( "time" ) // Information about a process running in a container type ProcessDetails struct { ProcessId int32 `json:"ProcessId,omitempty"` ImageName string `json:"ImageName,omitempty"` CreateTimestamp time.Time `json:"CreateTimestamp,omitempty"` UserTime100ns int32 `json:"UserTime100ns,omitempty"` KernelTime100ns int32 `json:"KernelTime100ns,omitempty"` MemoryCommitBytes int32 `json:"MemoryCommitBytes,omitempty"` MemoryWorkingSetPrivateBytes int32 `json:"MemoryWorkingSetPrivateBytes,omitempty"` MemoryWorkingSetSharedBytes int32 `json:"MemoryWorkingSetSharedBytes,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_modify_request.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema import "github.com/Microsoft/hcsshim/internal/protocol/guestrequest" // Passed to HcsRpc_ModifyProcess type ProcessModifyRequest struct { Operation guestrequest.ProcessModifyOperation `json:"Operation,omitempty"` // NOTE: Swagger generated as string. Locally updated. ConsoleSize *ConsoleSize `json:"ConsoleSize,omitempty"` CloseHandle *CloseHandle `json:"CloseHandle,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_parameters.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ProcessParameters struct { ApplicationName string `json:"ApplicationName,omitempty"` CommandLine string `json:"CommandLine,omitempty"` // optional alternative to CommandLine, currently only supported by Linux GCS CommandArgs []string `json:"CommandArgs,omitempty"` User string `json:"User,omitempty"` WorkingDirectory string `json:"WorkingDirectory,omitempty"` Environment map[string]string `json:"Environment,omitempty"` // if set, will run as low-privilege process RestrictedToken bool `json:"RestrictedToken,omitempty"` // if set, ignore StdErrPipe EmulateConsole bool `json:"EmulateConsole,omitempty"` CreateStdInPipe bool `json:"CreateStdInPipe,omitempty"` CreateStdOutPipe bool `json:"CreateStdOutPipe,omitempty"` CreateStdErrPipe bool `json:"CreateStdErrPipe,omitempty"` // height then width ConsoleSize []int32 `json:"ConsoleSize,omitempty"` // if set, find an existing session for the user and create the process in it UseExistingLogin bool `json:"UseExistingLogin,omitempty"` // if set, use the legacy console instead of conhost UseLegacyConsole bool `json:"UseLegacyConsole,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_status.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // NOTE: Swagger generated fields as int32. Locally updated to uint16 to match documentation. // https://learn.microsoft.com/en-us/virtualization/api/hcs/schemareference#ConsoleSize // Status of a process running in a container type ProcessStatus struct { ProcessId uint32 `json:"ProcessId,omitempty"` // NOTE: Swagger generated as int32. Locally updated to match documentation. Exited bool `json:"Exited,omitempty"` ExitCode uint32 `json:"ExitCode,omitempty"` // NOTE: Swagger generated as int32. Locally updated to match documentation. LastWaitResult int32 `json:"LastWaitResult,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Processor struct { Count int32 `json:"Count,omitempty"` Maximum int32 `json:"Maximum,omitempty"` Weight int32 `json:"Weight,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // CPU runtime statistics type ProcessorStats struct { TotalRuntime100ns uint64 `json:"TotalRuntime100ns,omitempty"` RuntimeUser100ns uint64 `json:"RuntimeUser100ns,omitempty"` RuntimeKernel100ns uint64 `json:"RuntimeKernel100ns,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_topology.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type ProcessorTopology struct { LogicalProcessorCount uint32 `json:"LogicalProcessorCount,omitempty"` LogicalProcessors []LogicalProcessor `json:"LogicalProcessors,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/properties.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema import ( v1 "github.com/containerd/cgroups/v3/cgroup1/stats" ) type Properties struct { Id string `json:"Id,omitempty"` SystemType string `json:"SystemType,omitempty"` RuntimeOsType string `json:"RuntimeOsType,omitempty"` Name string `json:"Name,omitempty"` Owner string `json:"Owner,omitempty"` RuntimeId string `json:"RuntimeId,omitempty"` SystemGUID string `json:"SystemGUID,omitempty"` RuntimeTemplateId string `json:"RuntimeTemplateId,omitempty"` State string `json:"State,omitempty"` Stopped bool `json:"Stopped,omitempty"` ExitType string `json:"ExitType,omitempty"` Memory *MemoryInformationForVm `json:"Memory,omitempty"` Statistics *Statistics `json:"Statistics,omitempty"` ProcessList []ProcessDetails `json:"ProcessList,omitempty"` TerminateOnLastHandleClosed bool `json:"TerminateOnLastHandleClosed,omitempty"` HostingSystemId string `json:"HostingSystemId,omitempty"` SharedMemoryRegionInfo []SharedMemoryRegionInfo `json:"SharedMemoryRegionInfo,omitempty"` GuestConnectionInfo *GuestConnectionInfo `json:"GuestConnectionInfo,omitempty"` // Metrics is not part of the API for HCS but this is used for LCOW v2 to // return the full cgroup metrics from the guest. Metrics *v1.Metrics `json:"LCOWMetrics,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // By default the basic properties will be returned. This query provides a way to request specific properties. type PropertyQuery struct { PropertyTypes []PropertyType `json:"PropertyTypes,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_type.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type PropertyType string const ( PTMemory PropertyType = "Memory" PTGuestMemory PropertyType = "GuestMemory" PTStatistics PropertyType = "Statistics" PTProcessList PropertyType = "ProcessList" PTTerminateOnLastHandleClosed PropertyType = "TerminateOnLastHandleClosed" PTSharedMemoryRegion PropertyType = "SharedMemoryRegion" PTContainerCredentialGuard PropertyType = "ContainerCredentialGuard" // This field is not generated by swagger. This was added manually. PTGuestConnection PropertyType = "GuestConnection" PTICHeartbeatStatus PropertyType = "ICHeartbeatStatus" PTProcessorTopology PropertyType = "ProcessorTopology" PTCPUGroup PropertyType = "CpuGroup" PTSystemGUID PropertyType = "SystemGUID" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/rdp_connection_options.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type RdpConnectionOptions struct { AccessSids []string `json:"AccessSids,omitempty"` NamedPipe string `json:"NamedPipe,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_changes.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type RegistryChanges struct { AddValues []RegistryValue `json:"AddValues,omitempty"` DeleteKeys []RegistryKey `json:"DeleteKeys,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_hive.go ================================================ package hcsschema // NOTE: manually added type RegistryHive string // List of RegistryHive const ( RegistryHive_SYSTEM RegistryHive = "System" RegistryHive_SOFTWARE RegistryHive = "Software" RegistryHive_SECURITY RegistryHive = "Security" RegistryHive_SAM RegistryHive = "Sam" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type RegistryKey struct { Hive RegistryHive `json:"Hive,omitempty"` Name string `json:"Name,omitempty"` Volatile bool `json:"Volatile,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type RegistryValue struct { Key *RegistryKey `json:"Key,omitempty"` Name string `json:"Name,omitempty"` Type_ RegistryValueType `json:"Type,omitempty"` // One and only one value type must be set. StringValue string `json:"StringValue,omitempty"` BinaryValue string `json:"BinaryValue,omitempty"` DWordValue int32 `json:"DWordValue,omitempty"` QWordValue int32 `json:"QWordValue,omitempty"` // Only used if RegistryValueType is CustomType The data is in BinaryValue CustomType int32 `json:"CustomType,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value_type.go ================================================ package hcsschema // NOTE: manually added type RegistryValueType string // List of RegistryValueType const ( RegistryValueType_NONE RegistryValueType = "None" RegistryValueType_STRING RegistryValueType = "String" RegistryValueType_EXPANDED_STRING RegistryValueType = "ExpandedString" RegistryValueType_MULTI_STRING RegistryValueType = "MultiString" RegistryValueType_BINARY RegistryValueType = "Binary" RegistryValueType_D_WORD RegistryValueType = "DWord" RegistryValueType_Q_WORD RegistryValueType = "QWord" RegistryValueType_CUSTOM_TYPE RegistryValueType = "CustomType" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/restore_state.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type RestoreState struct { // The path to the save state file to restore the system from. SaveStateFilePath string `json:"SaveStateFilePath,omitempty"` // The ID of the template system to clone this new system off of. An empty string indicates the system should not be cloned from a template. TemplateSystemId string `json:"TemplateSystemId,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/save_options.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type SaveOptions struct { // The type of save operation to be performed. SaveType string `json:"SaveType,omitempty"` // The path to the file that will container the saved state. SaveStateFilePath string `json:"SaveStateFilePath,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/scsi.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Scsi struct { // Map of attachments, where the key is the integer LUN number on the controller. Attachments map[string]Attachment `json:"Attachments,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/security_settings.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type SecuritySettings struct { // Enablement of Trusted Platform Module on the computer system EnableTpm bool `json:"EnableTpm,omitempty"` Isolation *IsolationSettings `json:"Isolation,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/service_properties.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema import "encoding/json" type ServiceProperties struct { // Changed Properties field to []json.RawMessage from []interface{} to avoid having to // remarshal sp.Properties[n] and unmarshal into the type(s) we want. Properties []json.RawMessage `json:"Properties,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_configuration.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type SharedMemoryConfiguration struct { Regions []SharedMemoryRegion `json:"Regions,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type SharedMemoryRegion struct { SectionName string `json:"SectionName,omitempty"` StartOffset int32 `json:"StartOffset,omitempty"` Length int32 `json:"Length,omitempty"` AllowGuestWrite bool `json:"AllowGuestWrite,omitempty"` HiddenFromGuest bool `json:"HiddenFromGuest,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/shared_memory_region_info.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type SharedMemoryRegionInfo struct { SectionName string `json:"SectionName,omitempty"` GuestPhysicalAddress int32 `json:"GuestPhysicalAddress,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Silo job information type SiloProperties struct { Enabled bool `json:"Enabled,omitempty"` JobName string `json:"JobName,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema import ( "time" ) // Runtime statistics for a container type Statistics struct { Timestamp time.Time `json:"Timestamp,omitempty"` ContainerStartTime time.Time `json:"ContainerStartTime,omitempty"` Uptime100ns uint64 `json:"Uptime100ns,omitempty"` Processor *ProcessorStats `json:"Processor,omitempty"` Memory *MemoryStats `json:"Memory,omitempty"` Storage *StorageStats `json:"Storage,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Storage struct { // List of layers that describe the parent hierarchy for a container's storage. These layers combined together, presented as a disposable and/or committable working storage, are used by the container to record all changes done to the parent layers. Layers []Layer `json:"Layers,omitempty"` // Path that points to the scratch space of a container, where parent layers are combined together to present a new disposable and/or committable layer with the changes done during its runtime. Path string `json:"Path,omitempty"` QoS *StorageQoS `json:"QoS,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_qo_s.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type StorageQoS struct { IopsMaximum int32 `json:"IopsMaximum,omitempty"` BandwidthMaximum int32 `json:"BandwidthMaximum,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Storage runtime statistics type StorageStats struct { ReadCountNormalized uint64 `json:"ReadCountNormalized,omitempty"` ReadSizeBytes uint64 `json:"ReadSizeBytes,omitempty"` WriteCountNormalized uint64 `json:"WriteCountNormalized,omitempty"` WriteSizeBytes uint64 `json:"WriteSizeBytes,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/system_time.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type SystemTime struct { Year int32 `json:"Year,omitempty"` Month int32 `json:"Month,omitempty"` DayOfWeek int32 `json:"DayOfWeek,omitempty"` Day int32 `json:"Day,omitempty"` Hour int32 `json:"Hour,omitempty"` Minute int32 `json:"Minute,omitempty"` Second int32 `json:"Second,omitempty"` Milliseconds int32 `json:"Milliseconds,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/time_zone_information.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type TimeZoneInformation struct { Bias int32 `json:"Bias,omitempty"` StandardName string `json:"StandardName,omitempty"` StandardDate *SystemTime `json:"StandardDate,omitempty"` StandardBias int32 `json:"StandardBias,omitempty"` DaylightName string `json:"DaylightName,omitempty"` DaylightDate *SystemTime `json:"DaylightDate,omitempty"` DaylightBias int32 `json:"DaylightBias,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/topology.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Topology struct { Memory *VirtualMachineMemory `json:"Memory,omitempty"` Processor *VirtualMachineProcessor `json:"Processor,omitempty"` Numa *Numa `json:"Numa,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Uefi struct { EnableDebugger bool `json:"EnableDebugger,omitempty"` ApplySecureBootTemplate string `json:"ApplySecureBootTemplate,omitempty"` SecureBootTemplateId string `json:"SecureBootTemplateId,omitempty"` BootThis *UefiBootEntry `json:"BootThis,omitempty"` Console string `json:"Console,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/uefi_boot_entry.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type UefiBootEntry struct { DeviceType string `json:"DeviceType,omitempty"` DevicePath string `json:"DevicePath,omitempty"` DiskNumber int32 `json:"DiskNumber,omitempty"` OptionalData string `json:"OptionalData,omitempty"` VmbFsRootPath string `json:"VmbFsRootPath,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/version.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type Version struct { Major int32 `json:"Major,omitempty"` Minor int32 `json:"Minor,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/video_monitor.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VideoMonitor struct { HorizontalResolution int32 `json:"HorizontalResolution,omitempty"` VerticalResolution int32 `json:"VerticalResolution,omitempty"` ConnectionOptions *RdpConnectionOptions `json:"ConnectionOptions,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // Configuration of a virtual machine, used during its creation to set up and/or use resources. type VirtualMachine struct { Version *Version `json:"Version,omitempty"` // When set to true, the virtual machine will treat a reset as a stop, releasing resources and cleaning up state. StopOnReset bool `json:"StopOnReset,omitempty"` Chipset *Chipset `json:"Chipset,omitempty"` ComputeTopology *Topology `json:"ComputeTopology,omitempty"` Devices *Devices `json:"Devices,omitempty"` GuestState *GuestState `json:"GuestState,omitempty"` RestoreState *RestoreState `json:"RestoreState,omitempty"` RegistryChanges *RegistryChanges `json:"RegistryChanges,omitempty"` StorageQoS *StorageQoS `json:"StorageQoS,omitempty"` DebugOptions *DebugOptions `json:"DebugOptions,omitempty"` GuestConnection *GuestConnection `json:"GuestConnection,omitempty"` SecuritySettings *SecuritySettings `json:"SecuritySettings,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine_memory.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualMachineMemory struct { SizeInMB uint64 `json:"SizeInMB,omitempty"` Backing *MemoryBackingType `json:"Backing,omitempty"` // If enabled, then the VM's memory is backed by the Windows pagefile rather than physically backed, statically allocated memory. AllowOvercommit bool `json:"AllowOvercommit,omitempty"` // If enabled, then the memory hot hint feature is exposed to the VM, allowing it to prefetch pages into its working set. (if supported by the guest operating system). EnableHotHint bool `json:"EnableHotHint,omitempty"` // If enabled, then the memory cold hint feature is exposed to the VM, allowing it to trim zeroed pages from its working set (if supported by the guest operating system). EnableColdHint bool `json:"EnableColdHint,omitempty"` // If enabled, then the memory cold discard hint feature is exposed to the VM, allowing it to trim non-zeroed pages from the working set (if supported by the guest operating system). EnableColdDiscardHint bool `json:"EnableColdDiscardHint,omitempty"` // If enabled, then commit is not charged for each backing page until first access. EnableDeferredCommit bool `json:"EnableDeferredCommit,omitempty"` // Low MMIO region allocated below 4GB LowMMIOGapInMB uint64 `json:"LowMmioGapInMB,omitempty"` // High MMIO region allocated above 4GB (base and size) HighMMIOBaseInMB uint64 `json:"HighMmioBaseInMB,omitempty"` HighMMIOGapInMB uint64 `json:"HighMmioGapInMB,omitempty"` SlitType *VirtualSlitType `json:"SlitType,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_machine_processor.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualMachineProcessor struct { Count uint32 `json:"Count,omitempty"` Limit uint64 `json:"Limit,omitempty"` Weight uint64 `json:"Weight,omitempty"` Reservation uint64 `json:"Reservation,omitempty"` CpuGroup *CpuGroup `json:"CpuGroup,omitempty"` NumaProcessorsSettings *NumaProcessors `json:"NumaProcessorsSettings,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_node_info.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualNodeInfo struct { VirtualNodeIndex int32 `json:"VirtualNodeIndex,omitempty"` PhysicalNodeNumber int32 `json:"PhysicalNodeNumber,omitempty"` VirtualProcessorCount int32 `json:"VirtualProcessorCount,omitempty"` MemoryUsageInPages int32 `json:"MemoryUsageInPages,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_controller.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualPMemController struct { Devices map[string]VirtualPMemDevice `json:"Devices,omitempty"` MaximumCount uint32 `json:"MaximumCount,omitempty"` MaximumSizeBytes uint64 `json:"MaximumSizeBytes,omitempty"` Backing string `json:"Backing,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_device.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualPMemDevice struct { HostPath string `json:"HostPath,omitempty"` ReadOnly bool `json:"ReadOnly,omitempty"` ImageFormat string `json:"ImageFormat,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_p_mem_mapping.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualPMemMapping struct { HostPath string `json:"HostPath,omitempty"` ImageFormat string `json:"ImageFormat,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_device.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.3 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // TODO: PropagateNumaAffinity is pre-release/experimental field in schema 2.11. Need to add build number // docs when a public build with this is out. type VirtualPciDevice struct { Functions []VirtualPciFunction `json:",omitempty"` PropagateNumaAffinity *bool `json:"PropagateNumaAffinity,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_pci_function.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.3 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // TODO: This is pre-release support in schema 2.3. Need to add build number // docs when a public build with this is out. type VirtualPciFunction struct { DeviceInstancePath string `json:",omitempty"` VirtualFunction uint16 `json:",omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_slit_type.go ================================================ // Autogenerated code; DO NOT EDIT. /* * Schema Open API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // VirtualSlitType : Indicates if a virtual SLIT should ne enabled for a VM and the type of virtual SLIT to be enabled. type VirtualSlitType string // List of VirtualSlitType const ( VirtualSlitType_NONE VirtualSlitType = "None" VirtualSlitType_FIRMWARE VirtualSlitType = "Firmware" VirtualSlitType_MEASURED VirtualSlitType = "Measured" VirtualSlitType_FIRMWARE_FALLBACK_MEASURED VirtualSlitType = "FirmwareFallbackMeasured" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualSmb struct { Shares []VirtualSmbShare `json:"Shares,omitempty"` DirectFileMappingInMB int64 `json:"DirectFileMappingInMB,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualSmbShare struct { Name string `json:"Name,omitempty"` Path string `json:"Path,omitempty"` AllowedFiles []string `json:"AllowedFiles,omitempty"` Options *VirtualSmbShareOptions `json:"Options,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/virtual_smb_share_options.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VirtualSmbShareOptions struct { ReadOnly bool `json:"ReadOnly,omitempty"` // convert exclusive access to shared read access ShareRead bool `json:"ShareRead,omitempty"` // all opens will use cached I/O CacheIo bool `json:"CacheIo,omitempty"` // disable oplock support NoOplocks bool `json:"NoOplocks,omitempty"` // Acquire the backup privilege when attempting to open TakeBackupPrivilege bool `json:"TakeBackupPrivilege,omitempty"` // Use the identity of the share root when opening UseShareRootIdentity bool `json:"UseShareRootIdentity,omitempty"` // disable Direct Mapping NoDirectmap bool `json:"NoDirectmap,omitempty"` // disable Byterange locks NoLocks bool `json:"NoLocks,omitempty"` // disable Directory CHange Notifications NoDirnotify bool `json:"NoDirnotify,omitempty"` // share is use for VM shared memory VmSharedMemory bool `json:"VmSharedMemory,omitempty"` // allow access only to the files specified in AllowedFiles RestrictFileAccess bool `json:"RestrictFileAccess,omitempty"` // disable all oplocks except Level II ForceLevelIIOplocks bool `json:"ForceLevelIIOplocks,omitempty"` // Allow the host to reparse this base layer ReparseBaseLayer bool `json:"ReparseBaseLayer,omitempty"` // Enable pseudo-oplocks PseudoOplocks bool `json:"PseudoOplocks,omitempty"` // All opens will use non-cached IO NonCacheIo bool `json:"NonCacheIo,omitempty"` // Enable pseudo directory change notifications PseudoDirnotify bool `json:"PseudoDirnotify,omitempty"` // Block directory enumeration, renames, and deletes. SingleFileMapping bool `json:"SingleFileMapping,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_memory.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type VmMemory struct { AvailableMemory int32 `json:"AvailableMemory,omitempty"` AvailableMemoryBuffer int32 `json:"AvailableMemoryBuffer,omitempty"` ReservedMemory uint64 `json:"ReservedMemory,omitempty"` AssignedMemory uint64 `json:"AssignedMemory,omitempty"` SlpActive bool `json:"SlpActive,omitempty"` BalancingEnabled bool `json:"BalancingEnabled,omitempty"` DmOperationInProgress bool `json:"DmOperationInProgress,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/vm_processor_limits.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.4 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema // ProcessorLimits is used when modifying processor scheduling limits of a virtual machine. type ProcessorLimits struct { // Maximum amount of host CPU resources that the virtual machine can use. Limit uint64 `json:"Limit,omitempty"` // Value describing the relative priority of this virtual machine compared to other virtual machines. Weight uint64 `json:"Weight,omitempty"` // Minimum amount of host CPU resources that the virtual machine is guaranteed. Reservation uint64 `json:"Reservation,omitempty"` // Provides the target maximum CPU frequency, in MHz, for a virtual machine. MaximumFrequencyMHz uint32 `json:"MaximumFrequencyMHz,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/windows_crash_reporting.go ================================================ /* * HCS API * * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) * * API version: 2.1 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package hcsschema type WindowsCrashReporting struct { DumpFileName string `json:"DumpFileName,omitempty"` MaxDumpSize int64 `json:"MaxDumpSize,omitempty"` DumpType string `json:"DumpType,omitempty"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/service.go ================================================ //go:build windows package hcs import ( "context" "encoding/json" hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" "github.com/Microsoft/hcsshim/internal/vmcompute" ) // GetServiceProperties returns properties of the host compute service. func GetServiceProperties(ctx context.Context, q hcsschema.PropertyQuery) (*hcsschema.ServiceProperties, error) { operation := "hcs::GetServiceProperties" queryb, err := json.Marshal(q) if err != nil { return nil, err } propertiesJSON, resultJSON, err := vmcompute.HcsGetServiceProperties(ctx, string(queryb)) events := processHcsResult(ctx, resultJSON) if err != nil { return nil, &HcsError{Op: operation, Err: err, Events: events} } if propertiesJSON == "" { return nil, ErrUnexpectedValue } properties := &hcsschema.ServiceProperties{} if err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil { return nil, err } return properties, nil } // ModifyServiceSettings modifies settings of the host compute service. func ModifyServiceSettings(ctx context.Context, settings hcsschema.ModificationRequest) error { operation := "hcs::ModifyServiceSettings" settingsJSON, err := json.Marshal(settings) if err != nil { return err } resultJSON, err := vmcompute.HcsModifyServiceSettings(ctx, string(settingsJSON)) events := processHcsResult(ctx, resultJSON) if err != nil { return &HcsError{Op: operation, Err: err, Events: events} } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go ================================================ //go:build windows package hcs import ( "context" "encoding/json" "errors" "fmt" "strings" "sync" "syscall" "time" "github.com/Microsoft/hcsshim/internal/cow" "github.com/Microsoft/hcsshim/internal/hcs/schema1" hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" "github.com/Microsoft/hcsshim/internal/jobobject" "github.com/Microsoft/hcsshim/internal/log" "github.com/Microsoft/hcsshim/internal/logfields" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/internal/timeout" "github.com/Microsoft/hcsshim/internal/vmcompute" "github.com/sirupsen/logrus" "go.opencensus.io/trace" ) type System struct { handleLock sync.RWMutex handle vmcompute.HcsSystem id string callbackNumber uintptr closedWaitOnce sync.Once waitBlock chan struct{} waitError error exitError error os, typ, owner string startTime time.Time } var _ cow.Container = &System{} var _ cow.ProcessHost = &System{} func newSystem(id string) *System { return &System{ id: id, waitBlock: make(chan struct{}), } } // Implementation detail for silo naming, this should NOT be relied upon very heavily. func siloNameFmt(containerID string) string { return fmt.Sprintf(`\Container_%s`, containerID) } // CreateComputeSystem creates a new compute system with the given configuration but does not start it. func CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface interface{}) (_ *System, err error) { operation := "hcs::CreateComputeSystem" // hcsCreateComputeSystemContext is an async operation. Start the outer span // here to measure the full create time. ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", id)) computeSystem := newSystem(id) hcsDocumentB, err := json.Marshal(hcsDocumentInterface) if err != nil { return nil, err } hcsDocument := string(hcsDocumentB) var ( identity syscall.Handle resultJSON string createError error ) computeSystem.handle, resultJSON, createError = vmcompute.HcsCreateComputeSystem(ctx, id, hcsDocument, identity) if createError == nil || IsPending(createError) { defer func() { if err != nil { computeSystem.Close() } }() if err = computeSystem.registerCallback(ctx); err != nil { // Terminate the compute system if it still exists. We're okay to // ignore a failure here. _ = computeSystem.Terminate(ctx) return nil, makeSystemError(computeSystem, operation, err, nil) } } events, err := processAsyncHcsResult(ctx, createError, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemCreateCompleted, &timeout.SystemCreate) if err != nil { if errors.Is(err, ErrTimeout) { // Terminate the compute system if it still exists. We're okay to // ignore a failure here. _ = computeSystem.Terminate(ctx) } return nil, makeSystemError(computeSystem, operation, err, events) } go computeSystem.waitBackground() if err = computeSystem.getCachedProperties(ctx); err != nil { return nil, err } return computeSystem, nil } // OpenComputeSystem opens an existing compute system by ID. func OpenComputeSystem(ctx context.Context, id string) (*System, error) { operation := "hcs::OpenComputeSystem" computeSystem := newSystem(id) handle, resultJSON, err := vmcompute.HcsOpenComputeSystem(ctx, id) events := processHcsResult(ctx, resultJSON) if err != nil { return nil, makeSystemError(computeSystem, operation, err, events) } computeSystem.handle = handle defer func() { if err != nil { computeSystem.Close() } }() if err = computeSystem.registerCallback(ctx); err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) } go computeSystem.waitBackground() if err = computeSystem.getCachedProperties(ctx); err != nil { return nil, err } return computeSystem, nil } func (computeSystem *System) getCachedProperties(ctx context.Context) error { props, err := computeSystem.Properties(ctx) if err != nil { return err } computeSystem.typ = strings.ToLower(props.SystemType) computeSystem.os = strings.ToLower(props.RuntimeOSType) computeSystem.owner = strings.ToLower(props.Owner) if computeSystem.os == "" && computeSystem.typ == "container" { // Pre-RS5 HCS did not return the OS, but it only supported containers // that ran Windows. computeSystem.os = "windows" } return nil } // OS returns the operating system of the compute system, "linux" or "windows". func (computeSystem *System) OS() string { return computeSystem.os } // IsOCI returns whether processes in the compute system should be created via // OCI. func (computeSystem *System) IsOCI() bool { return computeSystem.os == "linux" && computeSystem.typ == "container" } // GetComputeSystems gets a list of the compute systems on the system that match the query func GetComputeSystems(ctx context.Context, q schema1.ComputeSystemQuery) ([]schema1.ContainerProperties, error) { operation := "hcs::GetComputeSystems" queryb, err := json.Marshal(q) if err != nil { return nil, err } computeSystemsJSON, resultJSON, err := vmcompute.HcsEnumerateComputeSystems(ctx, string(queryb)) events := processHcsResult(ctx, resultJSON) if err != nil { return nil, &HcsError{Op: operation, Err: err, Events: events} } if computeSystemsJSON == "" { return nil, ErrUnexpectedValue } computeSystems := []schema1.ContainerProperties{} if err = json.Unmarshal([]byte(computeSystemsJSON), &computeSystems); err != nil { return nil, err } return computeSystems, nil } // Start synchronously starts the computeSystem. func (computeSystem *System) Start(ctx context.Context) (err error) { operation := "hcs::System::Start" // hcsStartComputeSystemContext is an async operation. Start the outer span // here to measure the full start time. ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() // prevent starting an exited system because waitblock we do not recreate waitBlock // or rerun waitBackground, so we have no way to be notified of it closing again if computeSystem.handle == 0 { return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } resultJSON, err := vmcompute.HcsStartComputeSystem(ctx, computeSystem.handle, "") events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.SystemStart) if err != nil { return makeSystemError(computeSystem, operation, err, events) } computeSystem.startTime = time.Now() return nil } // ID returns the compute system's identifier. func (computeSystem *System) ID() string { return computeSystem.id } // Shutdown requests a compute system shutdown. func (computeSystem *System) Shutdown(ctx context.Context) error { computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() operation := "hcs::System::Shutdown" if computeSystem.handle == 0 || computeSystem.stopped() { return nil } resultJSON, err := vmcompute.HcsShutdownComputeSystem(ctx, computeSystem.handle, "") events := processHcsResult(ctx, resultJSON) if err != nil && !errors.Is(err, ErrVmcomputeAlreadyStopped) && !errors.Is(err, ErrComputeSystemDoesNotExist) && !errors.Is(err, ErrVmcomputeOperationPending) { return makeSystemError(computeSystem, operation, err, events) } return nil } // Terminate requests a compute system terminate. func (computeSystem *System) Terminate(ctx context.Context) error { computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() operation := "hcs::System::Terminate" if computeSystem.handle == 0 || computeSystem.stopped() { return nil } resultJSON, err := vmcompute.HcsTerminateComputeSystem(ctx, computeSystem.handle, "") events := processHcsResult(ctx, resultJSON) if err != nil && !errors.Is(err, ErrVmcomputeAlreadyStopped) && !errors.Is(err, ErrComputeSystemDoesNotExist) && !errors.Is(err, ErrVmcomputeOperationPending) { return makeSystemError(computeSystem, operation, err, events) } return nil } // waitBackground waits for the compute system exit notification. Once received // sets `computeSystem.waitError` (if any) and unblocks all `Wait` calls. // // This MUST be called exactly once per `computeSystem.handle` but `Wait` is // safe to call multiple times. func (computeSystem *System) waitBackground() { operation := "hcs::System::waitBackground" ctx, span := oc.StartSpan(context.Background(), operation) defer span.End() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) err := waitForNotification(ctx, computeSystem.callbackNumber, hcsNotificationSystemExited, nil) if err == nil { log.G(ctx).Debug("system exited") } else if errors.Is(err, ErrVmcomputeUnexpectedExit) { log.G(ctx).Debug("unexpected system exit") computeSystem.exitError = makeSystemError(computeSystem, operation, err, nil) err = nil } else { err = makeSystemError(computeSystem, operation, err, nil) } computeSystem.closedWaitOnce.Do(func() { computeSystem.waitError = err close(computeSystem.waitBlock) }) oc.SetSpanStatus(span, err) } func (computeSystem *System) WaitChannel() <-chan struct{} { return computeSystem.waitBlock } func (computeSystem *System) WaitError() error { return computeSystem.waitError } // Wait synchronously waits for the compute system to shutdown or terminate. // If the compute system has already exited returns the previous error (if any). func (computeSystem *System) Wait() error { return computeSystem.WaitCtx(context.Background()) } // WaitCtx synchronously waits for the compute system to shutdown or terminate, or the context to be cancelled. // // See [System.Wait] for more information. func (computeSystem *System) WaitCtx(ctx context.Context) error { select { case <-computeSystem.WaitChannel(): return computeSystem.WaitError() case <-ctx.Done(): return ctx.Err() } } // stopped returns true if the compute system stopped. func (computeSystem *System) stopped() bool { select { case <-computeSystem.waitBlock: return true default: } return false } // ExitError returns an error describing the reason the compute system terminated. func (computeSystem *System) ExitError() error { if !computeSystem.stopped() { return errors.New("container not exited") } if computeSystem.waitError != nil { return computeSystem.waitError } return computeSystem.exitError } // Properties returns the requested container properties targeting a V1 schema container. func (computeSystem *System) Properties(ctx context.Context, types ...schema1.PropertyType) (*schema1.ContainerProperties, error) { computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() operation := "hcs::System::Properties" if computeSystem.handle == 0 { return nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } queryBytes, err := json.Marshal(schema1.PropertyQuery{PropertyTypes: types}) if err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) } propertiesJSON, resultJSON, err := vmcompute.HcsGetComputeSystemProperties(ctx, computeSystem.handle, string(queryBytes)) events := processHcsResult(ctx, resultJSON) if err != nil { return nil, makeSystemError(computeSystem, operation, err, events) } if propertiesJSON == "" { return nil, ErrUnexpectedValue } properties := &schema1.ContainerProperties{} if err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) } return properties, nil } // queryInProc handles querying for container properties without reaching out to HCS. `props` // will be updated to contain any data returned from the queries present in `types`. If any properties // failed to be queried they will be tallied up and returned in as the first return value. Failures on // query are NOT considered errors; the only failure case for this method is if the containers job object // cannot be opened. func (computeSystem *System) queryInProc( ctx context.Context, props *hcsschema.Properties, types []hcsschema.PropertyType, ) ([]hcsschema.PropertyType, error) { // In the future we can make use of some new functionality in the HCS that allows you // to pass a job object for HCS to use for the container. Currently, the only way we'll // be able to open the job/silo is if we're running as SYSTEM. jobOptions := &jobobject.Options{ UseNTVariant: true, Name: siloNameFmt(computeSystem.id), } job, err := jobobject.Open(ctx, jobOptions) if err != nil { return nil, err } defer job.Close() var fallbackQueryTypes []hcsschema.PropertyType for _, propType := range types { switch propType { case hcsschema.PTStatistics: // Handle a bad caller asking for the same type twice. No use in re-querying if this is // filled in already. if props.Statistics == nil { props.Statistics, err = computeSystem.statisticsInProc(job) if err != nil { log.G(ctx).WithError(err).Warn("failed to get statistics in-proc") fallbackQueryTypes = append(fallbackQueryTypes, propType) } } default: fallbackQueryTypes = append(fallbackQueryTypes, propType) } } return fallbackQueryTypes, nil } // statisticsInProc emulates what HCS does to grab statistics for a given container with a small // change to make grabbing the private working set total much more efficient. func (computeSystem *System) statisticsInProc(job *jobobject.JobObject) (*hcsschema.Statistics, error) { // Start timestamp for these stats before we grab them to match HCS timestamp := time.Now() memInfo, err := job.QueryMemoryStats() if err != nil { return nil, err } processorInfo, err := job.QueryProcessorStats() if err != nil { return nil, err } storageInfo, err := job.QueryStorageStats() if err != nil { return nil, err } // This calculates the private working set more efficiently than HCS does. HCS calls NtQuerySystemInformation // with the class SystemProcessInformation which returns an array containing system information for *every* // process running on the machine. They then grab the pids that are running in the container and filter down // the entries in the array to only what's running in that silo and start tallying up the total. This doesn't // work well as performance should get worse if more processess are running on the machine in general and not // just in the container. All of the additional information besides the WorkingSetPrivateSize field is ignored // as well which isn't great and is wasted work to fetch. // // HCS only let's you grab statistics in an all or nothing fashion, so we can't just grab the private // working set ourselves and ask for everything else separately. The optimization we can make here is // to open the silo ourselves and do the same queries for the rest of the info, as well as calculating // the private working set in a more efficient manner by: // // 1. Find the pids running in the silo // 2. Get a process handle for every process (only need PROCESS_QUERY_LIMITED_INFORMATION access) // 3. Call NtQueryInformationProcess on each process with the class ProcessVmCounters // 4. Tally up the total using the field PrivateWorkingSetSize in VM_COUNTERS_EX2. privateWorkingSet, err := job.QueryPrivateWorkingSet() if err != nil { return nil, err } return &hcsschema.Statistics{ Timestamp: timestamp, ContainerStartTime: computeSystem.startTime, Uptime100ns: uint64(time.Since(computeSystem.startTime).Nanoseconds()) / 100, Memory: &hcsschema.MemoryStats{ MemoryUsageCommitBytes: memInfo.JobMemory, MemoryUsageCommitPeakBytes: memInfo.PeakJobMemoryUsed, MemoryUsagePrivateWorkingSetBytes: privateWorkingSet, }, Processor: &hcsschema.ProcessorStats{ RuntimeKernel100ns: uint64(processorInfo.TotalKernelTime), RuntimeUser100ns: uint64(processorInfo.TotalUserTime), TotalRuntime100ns: uint64(processorInfo.TotalKernelTime + processorInfo.TotalUserTime), }, Storage: &hcsschema.StorageStats{ ReadCountNormalized: uint64(storageInfo.ReadStats.IoCount), ReadSizeBytes: storageInfo.ReadStats.TotalSize, WriteCountNormalized: uint64(storageInfo.WriteStats.IoCount), WriteSizeBytes: storageInfo.WriteStats.TotalSize, }, }, nil } // hcsPropertiesV2Query is a helper to make a HcsGetComputeSystemProperties call using the V2 schema property types. func (computeSystem *System) hcsPropertiesV2Query(ctx context.Context, types []hcsschema.PropertyType) (*hcsschema.Properties, error) { operation := "hcs::System::PropertiesV2" if computeSystem.handle == 0 { return nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } queryBytes, err := json.Marshal(hcsschema.PropertyQuery{PropertyTypes: types}) if err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) } propertiesJSON, resultJSON, err := vmcompute.HcsGetComputeSystemProperties(ctx, computeSystem.handle, string(queryBytes)) events := processHcsResult(ctx, resultJSON) if err != nil { return nil, makeSystemError(computeSystem, operation, err, events) } if propertiesJSON == "" { return nil, ErrUnexpectedValue } props := &hcsschema.Properties{} if err := json.Unmarshal([]byte(propertiesJSON), props); err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) } return props, nil } // PropertiesV2 returns the requested compute systems properties targeting a V2 schema compute system. func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (_ *hcsschema.Properties, err error) { computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() // Let HCS tally up the total for VM based queries instead of querying ourselves. if computeSystem.typ != "container" { return computeSystem.hcsPropertiesV2Query(ctx, types) } // Define a starter Properties struct with the default fields returned from every // query. Owner is only returned from Statistics but it's harmless to include. properties := &hcsschema.Properties{ Id: computeSystem.id, SystemType: computeSystem.typ, RuntimeOsType: computeSystem.os, Owner: computeSystem.owner, } logEntry := log.G(ctx) // First lets try and query ourselves without reaching to HCS. If any of the queries fail // we'll take note and fallback to querying HCS for any of the failed types. fallbackTypes, err := computeSystem.queryInProc(ctx, properties, types) if err == nil && len(fallbackTypes) == 0 { return properties, nil } else if err != nil { logEntry = logEntry.WithError(fmt.Errorf("failed to query compute system properties in-proc: %w", err)) fallbackTypes = types } logEntry.WithFields(logrus.Fields{ logfields.ContainerID: computeSystem.id, "propertyTypes": fallbackTypes, }).Info("falling back to HCS for property type queries") hcsProperties, err := computeSystem.hcsPropertiesV2Query(ctx, fallbackTypes) if err != nil { return nil, err } // Now add in anything that we might have successfully queried in process. if properties.Statistics != nil { hcsProperties.Statistics = properties.Statistics hcsProperties.Owner = properties.Owner } // For future support for querying processlist in-proc as well. if properties.ProcessList != nil { hcsProperties.ProcessList = properties.ProcessList } return hcsProperties, nil } // Pause pauses the execution of the computeSystem. This feature is not enabled in TP5. func (computeSystem *System) Pause(ctx context.Context) (err error) { operation := "hcs::System::Pause" // hcsPauseComputeSystemContext is an async operation. Start the outer span // here to measure the full pause time. ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() if computeSystem.handle == 0 { return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } resultJSON, err := vmcompute.HcsPauseComputeSystem(ctx, computeSystem.handle, "") events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemPauseCompleted, &timeout.SystemPause) if err != nil { return makeSystemError(computeSystem, operation, err, events) } return nil } // Resume resumes the execution of the computeSystem. This feature is not enabled in TP5. func (computeSystem *System) Resume(ctx context.Context) (err error) { operation := "hcs::System::Resume" // hcsResumeComputeSystemContext is an async operation. Start the outer span // here to measure the full restore time. ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() if computeSystem.handle == 0 { return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } resultJSON, err := vmcompute.HcsResumeComputeSystem(ctx, computeSystem.handle, "") events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemResumeCompleted, &timeout.SystemResume) if err != nil { return makeSystemError(computeSystem, operation, err, events) } return nil } // Save the compute system func (computeSystem *System) Save(ctx context.Context, options interface{}) (err error) { operation := "hcs::System::Save" // hcsSaveComputeSystemContext is an async operation. Start the outer span // here to measure the full save time. ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) saveOptions, err := json.Marshal(options) if err != nil { return err } computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() if computeSystem.handle == 0 { return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } result, err := vmcompute.HcsSaveComputeSystem(ctx, computeSystem.handle, string(saveOptions)) events, err := processAsyncHcsResult(ctx, err, result, computeSystem.callbackNumber, hcsNotificationSystemSaveCompleted, &timeout.SystemSave) if err != nil { return makeSystemError(computeSystem, operation, err, events) } return nil } func (computeSystem *System) createProcess(ctx context.Context, operation string, c interface{}) (*Process, *vmcompute.HcsProcessInformation, error) { computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() if computeSystem.handle == 0 { return nil, nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } configurationb, err := json.Marshal(c) if err != nil { return nil, nil, makeSystemError(computeSystem, operation, err, nil) } configuration := string(configurationb) processInfo, processHandle, resultJSON, err := vmcompute.HcsCreateProcess(ctx, computeSystem.handle, configuration) events := processHcsResult(ctx, resultJSON) if err != nil { if v2, ok := c.(*hcsschema.ProcessParameters); ok { operation += ": " + v2.CommandLine } else if v1, ok := c.(*schema1.ProcessConfig); ok { operation += ": " + v1.CommandLine } return nil, nil, makeSystemError(computeSystem, operation, err, events) } log.G(ctx).WithField("pid", processInfo.ProcessId).Debug("created process pid") return newProcess(processHandle, int(processInfo.ProcessId), computeSystem), &processInfo, nil } // CreateProcess launches a new process within the computeSystem. func (computeSystem *System) CreateProcess(ctx context.Context, c interface{}) (cow.Process, error) { operation := "hcs::System::CreateProcess" process, processInfo, err := computeSystem.createProcess(ctx, operation, c) if err != nil { return nil, err } defer func() { if err != nil { process.Close() } }() pipes, err := makeOpenFiles([]syscall.Handle{processInfo.StdInput, processInfo.StdOutput, processInfo.StdError}) if err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) } process.stdin = pipes[0] process.stdout = pipes[1] process.stderr = pipes[2] process.hasCachedStdio = true if err = process.registerCallback(ctx); err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) } go process.waitBackground() return process, nil } // OpenProcess gets an interface to an existing process within the computeSystem. func (computeSystem *System) OpenProcess(ctx context.Context, pid int) (*Process, error) { computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() operation := "hcs::System::OpenProcess" if computeSystem.handle == 0 { return nil, makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } processHandle, resultJSON, err := vmcompute.HcsOpenProcess(ctx, computeSystem.handle, uint32(pid)) events := processHcsResult(ctx, resultJSON) if err != nil { return nil, makeSystemError(computeSystem, operation, err, events) } process := newProcess(processHandle, pid, computeSystem) if err = process.registerCallback(ctx); err != nil { return nil, makeSystemError(computeSystem, operation, err, nil) } go process.waitBackground() return process, nil } // Close cleans up any state associated with the compute system but does not terminate or wait for it. func (computeSystem *System) Close() error { return computeSystem.CloseCtx(context.Background()) } // CloseCtx is similar to [System.Close], but accepts a context. // // The context is used for all operations, including waits, so timeouts/cancellations may prevent // proper system cleanup. func (computeSystem *System) CloseCtx(ctx context.Context) (err error) { operation := "hcs::System::Close" ctx, span := oc.StartSpan(ctx, operation) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) computeSystem.handleLock.Lock() defer computeSystem.handleLock.Unlock() // Don't double free this if computeSystem.handle == 0 { return nil } if err = computeSystem.unregisterCallback(ctx); err != nil { return makeSystemError(computeSystem, operation, err, nil) } err = vmcompute.HcsCloseComputeSystem(ctx, computeSystem.handle) if err != nil { return makeSystemError(computeSystem, operation, err, nil) } computeSystem.handle = 0 computeSystem.closedWaitOnce.Do(func() { computeSystem.waitError = ErrAlreadyClosed close(computeSystem.waitBlock) }) return nil } func (computeSystem *System) registerCallback(ctx context.Context) error { callbackContext := ¬ificationWatcherContext{ channels: newSystemChannels(), systemID: computeSystem.id, } callbackMapLock.Lock() callbackNumber := nextCallback nextCallback++ callbackMap[callbackNumber] = callbackContext callbackMapLock.Unlock() callbackHandle, err := vmcompute.HcsRegisterComputeSystemCallback(ctx, computeSystem.handle, notificationWatcherCallback, callbackNumber) if err != nil { return err } callbackContext.handle = callbackHandle computeSystem.callbackNumber = callbackNumber return nil } func (computeSystem *System) unregisterCallback(ctx context.Context) error { callbackNumber := computeSystem.callbackNumber callbackMapLock.RLock() callbackContext := callbackMap[callbackNumber] callbackMapLock.RUnlock() if callbackContext == nil { return nil } handle := callbackContext.handle if handle == 0 { return nil } // hcsUnregisterComputeSystemCallback has its own synchronization // to wait for all callbacks to complete. We must NOT hold the callbackMapLock. err := vmcompute.HcsUnregisterComputeSystemCallback(ctx, handle) if err != nil { return err } closeChannels(callbackContext.channels) callbackMapLock.Lock() delete(callbackMap, callbackNumber) callbackMapLock.Unlock() handle = 0 //nolint:ineffassign return nil } // Modify the System by sending a request to HCS func (computeSystem *System) Modify(ctx context.Context, config interface{}) error { computeSystem.handleLock.RLock() defer computeSystem.handleLock.RUnlock() operation := "hcs::System::Modify" if computeSystem.handle == 0 { return makeSystemError(computeSystem, operation, ErrAlreadyClosed, nil) } requestBytes, err := json.Marshal(config) if err != nil { return err } requestJSON := string(requestBytes) resultJSON, err := vmcompute.HcsModifyComputeSystem(ctx, computeSystem.handle, requestJSON) events := processHcsResult(ctx, resultJSON) if err != nil { return makeSystemError(computeSystem, operation, err, events) } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go ================================================ //go:build windows package hcs import ( "context" "io" "syscall" "github.com/Microsoft/go-winio" diskutil "github.com/Microsoft/go-winio/vhd" "github.com/Microsoft/hcsshim/computestorage" "github.com/pkg/errors" "golang.org/x/sys/windows" ) // makeOpenFiles calls winio.NewOpenFile for each handle in a slice but closes all the handles // if there is an error. func makeOpenFiles(hs []syscall.Handle) (_ []io.ReadWriteCloser, err error) { fs := make([]io.ReadWriteCloser, len(hs)) for i, h := range hs { if h != syscall.Handle(0) { if err == nil { fs[i], err = winio.NewOpenFile(windows.Handle(h)) } if err != nil { syscall.Close(h) } } } if err != nil { for _, f := range fs { if f != nil { f.Close() } } return nil, err } return fs, nil } // CreateNTFSVHD creates a VHD formatted with NTFS of size `sizeGB` at the given `vhdPath`. func CreateNTFSVHD(ctx context.Context, vhdPath string, sizeGB uint32) (err error) { if err := diskutil.CreateVhdx(vhdPath, sizeGB, 1); err != nil { return errors.Wrap(err, "failed to create VHD") } vhd, err := diskutil.OpenVirtualDisk(vhdPath, diskutil.VirtualDiskAccessNone, diskutil.OpenVirtualDiskFlagNone) if err != nil { return errors.Wrap(err, "failed to open VHD") } defer func() { err2 := windows.CloseHandle(windows.Handle(vhd)) if err == nil { err = errors.Wrap(err2, "failed to close VHD") } }() if err := computestorage.FormatWritableLayerVhd(ctx, windows.Handle(vhd)); err != nil { return errors.Wrap(err, "failed to format VHD") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcs/waithelper.go ================================================ //go:build windows package hcs import ( "context" "time" "github.com/Microsoft/hcsshim/internal/log" ) func processAsyncHcsResult( ctx context.Context, err error, resultJSON string, callbackNumber uintptr, expectedNotification hcsNotification, timeout *time.Duration, ) ([]ErrorEvent, error) { events := processHcsResult(ctx, resultJSON) if IsPending(err) { return nil, waitForNotification(ctx, callbackNumber, expectedNotification, timeout) } return events, err } func waitForNotification( ctx context.Context, callbackNumber uintptr, expectedNotification hcsNotification, timeout *time.Duration, ) error { callbackMapLock.RLock() if _, ok := callbackMap[callbackNumber]; !ok { callbackMapLock.RUnlock() log.G(ctx).WithField("callbackNumber", callbackNumber).Error("failed to waitForNotification: callbackNumber does not exist in callbackMap") return ErrHandleClose } channels := callbackMap[callbackNumber].channels callbackMapLock.RUnlock() expectedChannel := channels[expectedNotification] if expectedChannel == nil { log.G(ctx).WithField("type", expectedNotification).Error("unknown notification type in waitForNotification") return ErrInvalidNotificationType } var c <-chan time.Time if timeout != nil { timer := time.NewTimer(*timeout) c = timer.C defer timer.Stop() } select { case err, ok := <-expectedChannel: if !ok { return ErrHandleClose } return err case err, ok := <-channels[hcsNotificationSystemExited]: if !ok { return ErrHandleClose } // If the expected notification is hcsNotificationSystemExited which of the two selects // chosen is random. Return the raw error if hcsNotificationSystemExited is expected if channels[hcsNotificationSystemExited] == expectedChannel { return err } return ErrUnexpectedContainerExit case _, ok := <-channels[hcsNotificationServiceDisconnect]: if !ok { return ErrHandleClose } // hcsNotificationServiceDisconnect should never be an expected notification // it does not need the same handling as hcsNotificationSystemExited return ErrUnexpectedProcessAbort case <-c: return ErrTimeout } } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcserror/doc.go ================================================ package hcserror ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hcserror/hcserror.go ================================================ //go:build windows package hcserror import ( "errors" "fmt" "golang.org/x/sys/windows" ) type HcsError struct { title string rest string Err error } func (e *HcsError) Error() string { s := e.title if len(s) > 0 && s[len(s)-1] != ' ' { s += " " } s += fmt.Sprintf("failed in Win32: %s (0x%x)", e.Err, Win32FromError(e.Err)) if e.rest != "" { if e.rest[0] != ' ' { s += " " } s += e.rest } return s } func New(err error, title, rest string) error { // Pass through DLL errors directly since they do not originate from HCS. var e *windows.DLLError if errors.As(err, &e) { return err } return &HcsError{title, rest, err} } func Win32FromError(err error) uint32 { var herr *HcsError if errors.As(err, &herr) { return Win32FromError(herr.Err) } var code windows.Errno if errors.As(err, &code) { return uint32(code) } return uint32(windows.ERROR_GEN_FAILURE) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/doc.go ================================================ package hns ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hns.go ================================================ package hns import "fmt" //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go hns.go //sys _hnsCall(method string, path string, object string, response **uint16) (hr error) = vmcompute.HNSCall? type EndpointNotFoundError struct { EndpointName string } func (e EndpointNotFoundError) Error() string { return fmt.Sprintf("Endpoint %s not found", e.EndpointName) } type NetworkNotFoundError struct { NetworkName string } func (e NetworkNotFoundError) Error() string { return fmt.Sprintf("Network %s not found", e.NetworkName) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hnsaccelnet.go ================================================ //go:build windows package hns import ( "encoding/json" "github.com/sirupsen/logrus" ) // HNSNnvManagementMacAddress represents management mac address // which needs to be excluded from VF reassignment type HNSNnvManagementMacAddress struct { MacAddress string `json:",omitempty"` } // HNSNnvManagementMacList represents a list of management // mac addresses for exclusion from VF reassignment type HNSNnvManagementMacList struct { MacAddressList []HNSNnvManagementMacAddress `json:",omitempty"` } // HNSNnvManagementMacRequest makes a HNS call to modify/query NnvManagementMacList func HNSNnvManagementMacRequest(method, path, request string) (*HNSNnvManagementMacList, error) { nnvManagementMacList := &HNSNnvManagementMacList{} err := hnsCall(method, "/accelnet/"+path, request, &nnvManagementMacList) if err != nil { return nil, err } return nnvManagementMacList, nil } // Set ManagementMacAddressList by sending "POST" NnvManagementMacRequest to HNS. func (nnvManagementMacList *HNSNnvManagementMacList) Set() (*HNSNnvManagementMacList, error) { operation := "Set" title := "hcsshim::nnvManagementMacList::" + operation logrus.Debugf(title+" id=%s", nnvManagementMacList.MacAddressList) jsonString, err := json.Marshal(nnvManagementMacList) if err != nil { return nil, err } return HNSNnvManagementMacRequest("POST", "", string(jsonString)) } // Get ManagementMacAddressList by sending "GET" NnvManagementMacRequest to HNS. func GetNnvManagementMacAddressList() (*HNSNnvManagementMacList, error) { operation := "Get" title := "hcsshim::nnvManagementMacList::" + operation logrus.Debug(title) return HNSNnvManagementMacRequest("GET", "", "") } // Delete ManagementMacAddressList by sending "DELETE" NnvManagementMacRequest to HNS. func DeleteNnvManagementMacAddressList() (*HNSNnvManagementMacList, error) { operation := "Delete" title := "hcsshim::nnvManagementMacList::" + operation logrus.Debug(title) return HNSNnvManagementMacRequest("DELETE", "", "") } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go ================================================ //go:build windows package hns import ( "encoding/json" "net" "strings" "github.com/sirupsen/logrus" ) // EndpointState represents the states of an HNS Endpoint lifecycle. type EndpointState uint16 // EndpointState const // The lifecycle of an Endpoint goes through created, attached, AttachedSharing - endpoint is being shared with other containers, // detached, after being attached, degraded and finally destroyed. // Note: This attribute is used by calico to define stale containers and is dependent on HNS v1 api, if we move to HNS v2 api we will need // to update the current calico code and cordinate the change with calico. Reach out to Microsoft to facilate the change via HNS. const ( Uninitialized EndpointState = iota Created EndpointState = 1 Attached EndpointState = 2 AttachedSharing EndpointState = 3 Detached EndpointState = 4 Degraded EndpointState = 5 Destroyed EndpointState = 6 ) func (es EndpointState) String() string { return [...]string{"Uninitialized", "Created", "Attached", "AttachedSharing", "Detached", "Degraded", "Destroyed"}[es] } // HNSEndpoint represents a network endpoint in HNS type HNSEndpoint struct { Id string `json:"ID,omitempty"` Name string `json:",omitempty"` VirtualNetwork string `json:",omitempty"` VirtualNetworkName string `json:",omitempty"` Policies []json.RawMessage `json:",omitempty"` MacAddress string `json:",omitempty"` IPAddress net.IP `json:",omitempty"` IPv6Address net.IP `json:",omitempty"` DNSSuffix string `json:",omitempty"` DNSServerList string `json:",omitempty"` DNSDomain string `json:",omitempty"` GatewayAddress string `json:",omitempty"` GatewayAddressV6 string `json:",omitempty"` EnableInternalDNS bool `json:",omitempty"` DisableICC bool `json:",omitempty"` PrefixLength uint8 `json:",omitempty"` IPv6PrefixLength uint8 `json:",omitempty"` IsRemoteEndpoint bool `json:",omitempty"` EnableLowMetric bool `json:",omitempty"` Namespace *Namespace `json:",omitempty"` EncapOverhead uint16 `json:",omitempty"` SharedContainers []string `json:",omitempty"` State EndpointState `json:",omitempty"` } // SystemType represents the type of the system on which actions are done type SystemType string // SystemType const const ( ContainerType SystemType = "Container" VirtualMachineType SystemType = "VirtualMachine" HostType SystemType = "Host" ) // EndpointAttachDetachRequest is the structure used to send request to the container to modify the system // Supported resource types are Network and Request Types are Add/Remove type EndpointAttachDetachRequest struct { ContainerID string `json:"ContainerId,omitempty"` SystemType SystemType `json:"SystemType"` CompartmentID uint16 `json:"CompartmentId,omitempty"` VirtualNICName string `json:"VirtualNicName,omitempty"` } // EndpointResquestResponse is object to get the endpoint request response type EndpointResquestResponse struct { Success bool Error string } // EndpointStats is the object that has stats for a given endpoint type EndpointStats struct { BytesReceived uint64 `json:"BytesReceived"` BytesSent uint64 `json:"BytesSent"` DroppedPacketsIncoming uint64 `json:"DroppedPacketsIncoming"` DroppedPacketsOutgoing uint64 `json:"DroppedPacketsOutgoing"` EndpointID string `json:"EndpointId"` InstanceID string `json:"InstanceId"` PacketsReceived uint64 `json:"PacketsReceived"` PacketsSent uint64 `json:"PacketsSent"` } // HNSEndpointRequest makes a HNS call to modify/query a network endpoint func HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) { endpoint := &HNSEndpoint{} err := hnsCall(method, "/endpoints/"+path, request, &endpoint) if err != nil { return nil, err } return endpoint, nil } // HNSListEndpointRequest makes a HNS call to query the list of available endpoints func HNSListEndpointRequest() ([]HNSEndpoint, error) { var endpoint []HNSEndpoint err := hnsCall("GET", "/endpoints/", "", &endpoint) if err != nil { return nil, err } return endpoint, nil } // hnsEndpointStatsRequest makes a HNS call to query the stats for a given endpoint ID func hnsEndpointStatsRequest(id string) (*EndpointStats, error) { var stats EndpointStats err := hnsCall("GET", "/endpointstats/"+id, "", &stats) if err != nil { return nil, err } return &stats, nil } // GetHNSEndpointByID get the Endpoint by ID func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) { return HNSEndpointRequest("GET", endpointID, "") } // GetHNSEndpointStats get the stats for a n Endpoint by ID func GetHNSEndpointStats(endpointID string) (*EndpointStats, error) { return hnsEndpointStatsRequest(endpointID) } // GetHNSEndpointByName gets the endpoint filtered by Name func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) { hnsResponse, err := HNSListEndpointRequest() if err != nil { return nil, err } for _, hnsEndpoint := range hnsResponse { if hnsEndpoint.Name == endpointName { return &hnsEndpoint, nil } } return nil, EndpointNotFoundError{EndpointName: endpointName} } type endpointAttachInfo struct { SharedContainers json.RawMessage `json:",omitempty"` } func (endpoint *HNSEndpoint) IsAttached(vID string) (bool, error) { attachInfo := endpointAttachInfo{} err := hnsCall("GET", "/endpoints/"+endpoint.Id, "", &attachInfo) // Return false allows us to just return the err if err != nil { return false, err } if strings.Contains(strings.ToLower(string(attachInfo.SharedContainers)), strings.ToLower(vID)) { return true, nil } return false, nil } // Create Endpoint by sending EndpointRequest to HNS. TODO: Create a separate HNS interface to place all these methods func (endpoint *HNSEndpoint) Create() (*HNSEndpoint, error) { operation := "Create" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) jsonString, err := json.Marshal(endpoint) if err != nil { return nil, err } return HNSEndpointRequest("POST", "", string(jsonString)) } // Delete Endpoint by sending EndpointRequest to HNS func (endpoint *HNSEndpoint) Delete() (*HNSEndpoint, error) { operation := "Delete" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) return HNSEndpointRequest("DELETE", endpoint.Id, "") } // Update Endpoint func (endpoint *HNSEndpoint) Update() (*HNSEndpoint, error) { operation := "Update" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) jsonString, err := json.Marshal(endpoint) if err != nil { return nil, err } err = hnsCall("POST", "/endpoints/"+endpoint.Id, string(jsonString), &endpoint) return endpoint, err } // ApplyACLPolicy applies a set of ACL Policies on the Endpoint func (endpoint *HNSEndpoint) ApplyACLPolicy(policies ...*ACLPolicy) error { operation := "ApplyACLPolicy" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) for _, policy := range policies { if policy == nil { continue } jsonString, err := json.Marshal(policy) if err != nil { return err } endpoint.Policies = append(endpoint.Policies, jsonString) } _, err := endpoint.Update() return err } // ApplyProxyPolicy applies a set of Proxy Policies on the Endpoint func (endpoint *HNSEndpoint) ApplyProxyPolicy(policies ...*ProxyPolicy) error { operation := "ApplyProxyPolicy" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) for _, policy := range policies { if policy == nil { continue } jsonString, err := json.Marshal(policy) if err != nil { return err } endpoint.Policies = append(endpoint.Policies, jsonString) } _, err := endpoint.Update() return err } // ContainerAttach attaches an endpoint to container func (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error { operation := "ContainerAttach" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) requestMessage := &EndpointAttachDetachRequest{ ContainerID: containerID, CompartmentID: compartmentID, SystemType: ContainerType, } response := &EndpointResquestResponse{} jsonString, err := json.Marshal(requestMessage) if err != nil { return err } return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) } // ContainerDetach detaches an endpoint from container func (endpoint *HNSEndpoint) ContainerDetach(containerID string) error { operation := "ContainerDetach" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) requestMessage := &EndpointAttachDetachRequest{ ContainerID: containerID, SystemType: ContainerType, } response := &EndpointResquestResponse{} jsonString, err := json.Marshal(requestMessage) if err != nil { return err } return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) } // HostAttach attaches a nic on the host func (endpoint *HNSEndpoint) HostAttach(compartmentID uint16) error { operation := "HostAttach" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) requestMessage := &EndpointAttachDetachRequest{ CompartmentID: compartmentID, SystemType: HostType, } response := &EndpointResquestResponse{} jsonString, err := json.Marshal(requestMessage) if err != nil { return err } return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) } // HostDetach detaches a nic on the host func (endpoint *HNSEndpoint) HostDetach() error { operation := "HostDetach" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) requestMessage := &EndpointAttachDetachRequest{ SystemType: HostType, } response := &EndpointResquestResponse{} jsonString, err := json.Marshal(requestMessage) if err != nil { return err } return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) } // VirtualMachineNICAttach attaches a endpoint to a virtual machine func (endpoint *HNSEndpoint) VirtualMachineNICAttach(virtualMachineNICName string) error { operation := "VirtualMachineNicAttach" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) requestMessage := &EndpointAttachDetachRequest{ VirtualNICName: virtualMachineNICName, SystemType: VirtualMachineType, } response := &EndpointResquestResponse{} jsonString, err := json.Marshal(requestMessage) if err != nil { return err } return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) } // VirtualMachineNICDetach detaches a endpoint from a virtual machine func (endpoint *HNSEndpoint) VirtualMachineNICDetach() error { operation := "VirtualMachineNicDetach" title := "hcsshim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s", endpoint.Id) requestMessage := &EndpointAttachDetachRequest{ SystemType: VirtualMachineType, } response := &EndpointResquestResponse{} jsonString, err := json.Marshal(requestMessage) if err != nil { return err } return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go ================================================ //go:build windows package hns import ( "encoding/json" "fmt" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/interop" "github.com/sirupsen/logrus" ) func hnsCallRawResponse(method, path, request string) (*hnsResponse, error) { var responseBuffer *uint16 logrus.Debugf("[%s]=>[%s] Request : %s", method, path, request) err := _hnsCall(method, path, request, &responseBuffer) if err != nil { return nil, hcserror.New(err, "hnsCall ", "") } response := interop.ConvertAndFreeCoTaskMemString(responseBuffer) hnsresponse := &hnsResponse{} if err = json.Unmarshal([]byte(response), &hnsresponse); err != nil { return nil, err } return hnsresponse, nil } func hnsCall(method, path, request string, returnResponse interface{}) error { hnsresponse, err := hnsCallRawResponse(method, path, request) if err != nil { return fmt.Errorf("failed during hnsCallRawResponse: %w", err) } if !hnsresponse.Success { return fmt.Errorf("hns failed with error : %s", hnsresponse.Error) } if len(hnsresponse.Output) == 0 { return nil } logrus.Debugf("Network Response : %s", hnsresponse.Output) err = json.Unmarshal(hnsresponse.Output, returnResponse) if err != nil { return err } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hnsglobals.go ================================================ //go:build windows package hns type HNSGlobals struct { Version HNSVersion `json:"Version"` } type HNSVersion struct { Major int `json:"Major"` Minor int `json:"Minor"` } var ( HNSVersion1803 = HNSVersion{Major: 7, Minor: 2} ) func GetHNSGlobals() (*HNSGlobals, error) { var version HNSVersion err := hnsCall("GET", "/globals/version", "", &version) if err != nil { return nil, err } globals := &HNSGlobals{ Version: version, } return globals, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hnsnetwork.go ================================================ //go:build windows package hns import ( "encoding/json" "errors" "net" "github.com/sirupsen/logrus" ) // Subnet is associated with a network and represents a list // of subnets available to the network type Subnet struct { AddressPrefix string `json:",omitempty"` GatewayAddress string `json:",omitempty"` Policies []json.RawMessage `json:",omitempty"` } // MacPool is associated with a network and represents a list // of macaddresses available to the network type MacPool struct { StartMacAddress string `json:",omitempty"` EndMacAddress string `json:",omitempty"` } // HNSNetwork represents a network in HNS type HNSNetwork struct { Id string `json:"ID,omitempty"` Name string `json:",omitempty"` Type string `json:",omitempty"` NetworkAdapterName string `json:",omitempty"` SourceMac string `json:",omitempty"` Policies []json.RawMessage `json:",omitempty"` MacPools []MacPool `json:",omitempty"` Subnets []Subnet `json:",omitempty"` DNSSuffix string `json:",omitempty"` DNSServerList string `json:",omitempty"` DNSServerCompartment uint32 `json:",omitempty"` ManagementIP string `json:",omitempty"` AutomaticDNS bool `json:",omitempty"` } type hnsResponse struct { Success bool Error string Output json.RawMessage } // HNSNetworkRequest makes a call into HNS to update/query a single network func HNSNetworkRequest(method, path, request string) (*HNSNetwork, error) { var network HNSNetwork err := hnsCall(method, "/networks/"+path, request, &network) if err != nil { return nil, err } return &network, nil } // HNSListNetworkRequest makes a HNS call to query the list of available networks func HNSListNetworkRequest(method, path, request string) ([]HNSNetwork, error) { var network []HNSNetwork err := hnsCall(method, "/networks/"+path, request, &network) if err != nil { return nil, err } return network, nil } // GetHNSNetworkByID func GetHNSNetworkByID(networkID string) (*HNSNetwork, error) { return HNSNetworkRequest("GET", networkID, "") } // GetHNSNetworkName filtered by Name func GetHNSNetworkByName(networkName string) (*HNSNetwork, error) { hsnnetworks, err := HNSListNetworkRequest("GET", "", "") if err != nil { return nil, err } for _, hnsnetwork := range hsnnetworks { if hnsnetwork.Name == networkName { return &hnsnetwork, nil } } return nil, NetworkNotFoundError{NetworkName: networkName} } // Create Network by sending NetworkRequest to HNS. func (network *HNSNetwork) Create() (*HNSNetwork, error) { operation := "Create" title := "hcsshim::HNSNetwork::" + operation logrus.Debugf(title+" id=%s", network.Id) for _, subnet := range network.Subnets { if (subnet.AddressPrefix != "") && (subnet.GatewayAddress == "") { return nil, errors.New("network create error, subnet has address prefix but no gateway specified") } } jsonString, err := json.Marshal(network) if err != nil { return nil, err } return HNSNetworkRequest("POST", "", string(jsonString)) } // Delete Network by sending NetworkRequest to HNS func (network *HNSNetwork) Delete() (*HNSNetwork, error) { operation := "Delete" title := "hcsshim::HNSNetwork::" + operation logrus.Debugf(title+" id=%s", network.Id) return HNSNetworkRequest("DELETE", network.Id, "") } // Creates an endpoint on the Network. func (network *HNSNetwork) NewEndpoint(ipAddress net.IP, macAddress net.HardwareAddr) *HNSEndpoint { return &HNSEndpoint{ VirtualNetwork: network.Id, IPAddress: ipAddress, MacAddress: string(macAddress), } } func (network *HNSNetwork) CreateEndpoint(endpoint *HNSEndpoint) (*HNSEndpoint, error) { operation := "CreateEndpoint" title := "hcsshim::HNSNetwork::" + operation logrus.Debugf(title+" id=%s, endpointId=%s", network.Id, endpoint.Id) endpoint.VirtualNetwork = network.Id return endpoint.Create() } func (network *HNSNetwork) CreateRemoteEndpoint(endpoint *HNSEndpoint) (*HNSEndpoint, error) { operation := "CreateRemoteEndpoint" title := "hcsshim::HNSNetwork::" + operation logrus.Debugf(title+" id=%s", network.Id) endpoint.IsRemoteEndpoint = true return network.CreateEndpoint(endpoint) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go ================================================ package hns // Type of Request Support in ModifySystem type PolicyType string // RequestType const const ( Nat PolicyType = "NAT" ACL PolicyType = "ACL" PA PolicyType = "PA" VLAN PolicyType = "VLAN" VSID PolicyType = "VSID" VNet PolicyType = "VNET" L2Driver PolicyType = "L2Driver" Isolation PolicyType = "Isolation" QOS PolicyType = "QOS" OutboundNat PolicyType = "OutBoundNAT" ExternalLoadBalancer PolicyType = "ELB" Route PolicyType = "ROUTE" Proxy PolicyType = "PROXY" ) type NatPolicy struct { Type PolicyType `json:"Type"` Protocol string `json:",omitempty"` InternalPort uint16 `json:",omitempty"` ExternalPort uint16 `json:",omitempty"` ExternalPortReserved bool `json:",omitempty"` } type QosPolicy struct { Type PolicyType `json:"Type"` MaximumOutgoingBandwidthInBytes uint64 } type IsolationPolicy struct { Type PolicyType `json:"Type"` VLAN uint VSID uint InDefaultIsolation bool } type VlanPolicy struct { Type PolicyType `json:"Type"` VLAN uint } type VsidPolicy struct { Type PolicyType `json:"Type"` VSID uint } type PaPolicy struct { Type PolicyType `json:"Type"` PA string `json:"PA"` } type OutboundNatPolicy struct { Policy VIP string `json:"VIP,omitempty"` Exceptions []string `json:"ExceptionList,omitempty"` Destinations []string `json:",omitempty"` MaxPortPoolUsage uint16 `json:",omitempty"` } type ProxyPolicy struct { Type PolicyType `json:"Type"` IP string `json:",omitempty"` Port string `json:",omitempty"` ExceptionList []string `json:",omitempty"` Destination string `json:",omitempty"` OutboundNat bool `json:",omitempty"` } type ActionType string type DirectionType string type RuleType string const ( Allow ActionType = "Allow" Block ActionType = "Block" In DirectionType = "In" Out DirectionType = "Out" Host RuleType = "Host" Switch RuleType = "Switch" ) type ACLPolicy struct { Type PolicyType `json:"Type"` Id string `json:"Id,omitempty"` Protocol uint16 `json:",omitempty"` Protocols string `json:"Protocols,omitempty"` InternalPort uint16 `json:",omitempty"` Action ActionType Direction DirectionType LocalAddresses string `json:",omitempty"` RemoteAddresses string `json:",omitempty"` LocalPorts string `json:"LocalPorts,omitempty"` LocalPort uint16 `json:",omitempty"` RemotePorts string `json:"RemotePorts,omitempty"` RemotePort uint16 `json:",omitempty"` RuleType RuleType `json:"RuleType,omitempty"` Priority uint16 `json:",omitempty"` ServiceName string `json:",omitempty"` } type Policy struct { Type PolicyType `json:"Type"` } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicylist.go ================================================ //go:build windows package hns import ( "encoding/json" "github.com/sirupsen/logrus" ) // RoutePolicy is a structure defining schema for Route based Policy type RoutePolicy struct { Policy DestinationPrefix string `json:"DestinationPrefix,omitempty"` NextHop string `json:"NextHop,omitempty"` EncapEnabled bool `json:"NeedEncap,omitempty"` } // ELBPolicy is a structure defining schema for ELB LoadBalancing based Policy type ELBPolicy struct { LBPolicy SourceVIP string `json:"SourceVIP,omitempty"` VIPs []string `json:"VIPs,omitempty"` ILB bool `json:"ILB,omitempty"` DSR bool `json:"IsDSR,omitempty"` } // LBPolicy is a structure defining schema for LoadBalancing based Policy type LBPolicy struct { Policy Protocol uint16 `json:"Protocol,omitempty"` InternalPort uint16 ExternalPort uint16 } // PolicyList is a structure defining schema for Policy list request type PolicyList struct { ID string `json:"ID,omitempty"` EndpointReferences []string `json:"References,omitempty"` Policies []json.RawMessage `json:"Policies,omitempty"` } // HNSPolicyListRequest makes a call into HNS to update/query a single network func HNSPolicyListRequest(method, path, request string) (*PolicyList, error) { var policy PolicyList err := hnsCall(method, "/policylists/"+path, request, &policy) if err != nil { return nil, err } return &policy, nil } // HNSListPolicyListRequest gets all the policy list func HNSListPolicyListRequest() ([]PolicyList, error) { var plist []PolicyList err := hnsCall("GET", "/policylists/", "", &plist) if err != nil { return nil, err } return plist, nil } // PolicyListRequest makes a HNS call to modify/query a network policy list func PolicyListRequest(method, path, request string) (*PolicyList, error) { policylist := &PolicyList{} err := hnsCall(method, "/policylists/"+path, request, &policylist) if err != nil { return nil, err } return policylist, nil } // GetPolicyListByID get the policy list by ID func GetPolicyListByID(policyListID string) (*PolicyList, error) { return PolicyListRequest("GET", policyListID, "") } // Create PolicyList by sending PolicyListRequest to HNS. func (policylist *PolicyList) Create() (*PolicyList, error) { operation := "Create" title := "hcsshim::PolicyList::" + operation logrus.Debugf(title+" id=%s", policylist.ID) jsonString, err := json.Marshal(policylist) if err != nil { return nil, err } return PolicyListRequest("POST", "", string(jsonString)) } // Delete deletes PolicyList func (policylist *PolicyList) Delete() (*PolicyList, error) { operation := "Delete" title := "hcsshim::PolicyList::" + operation logrus.Debugf(title+" id=%s", policylist.ID) return PolicyListRequest("DELETE", policylist.ID, "") } // AddEndpoint add an endpoint to a Policy List func (policylist *PolicyList) AddEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) { operation := "AddEndpoint" title := "hcsshim::PolicyList::" + operation logrus.Debugf(title+" id=%s, endpointId:%s", policylist.ID, endpoint.Id) _, err := policylist.Delete() if err != nil { return nil, err } // Add Endpoint to the Existing List policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) return policylist.Create() } // RemoveEndpoint removes an endpoint from the Policy List func (policylist *PolicyList) RemoveEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) { operation := "RemoveEndpoint" title := "hcsshim::PolicyList::" + operation logrus.Debugf(title+" id=%s, endpointId:%s", policylist.ID, endpoint.Id) _, err := policylist.Delete() if err != nil { return nil, err } elementToRemove := "/endpoints/" + endpoint.Id var references []string for _, endpointReference := range policylist.EndpointReferences { if endpointReference == elementToRemove { continue } references = append(references, endpointReference) } policylist.EndpointReferences = references return policylist.Create() } // AddLoadBalancer policy list for the specified endpoints func AddLoadBalancer(endpoints []HNSEndpoint, isILB bool, sourceVIP, vip string, protocol uint16, internalPort uint16, externalPort uint16) (*PolicyList, error) { operation := "AddLoadBalancer" title := "hcsshim::PolicyList::" + operation logrus.Debugf(title+" endpointId=%v, isILB=%v, sourceVIP=%s, vip=%s, protocol=%v, internalPort=%v, externalPort=%v", endpoints, isILB, sourceVIP, vip, protocol, internalPort, externalPort) policylist := &PolicyList{} elbPolicy := &ELBPolicy{ SourceVIP: sourceVIP, ILB: isILB, } if len(vip) > 0 { elbPolicy.VIPs = []string{vip} } elbPolicy.Type = ExternalLoadBalancer elbPolicy.Protocol = protocol elbPolicy.InternalPort = internalPort elbPolicy.ExternalPort = externalPort for _, endpoint := range endpoints { policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) } jsonString, err := json.Marshal(elbPolicy) if err != nil { return nil, err } policylist.Policies = append(policylist.Policies, jsonString) return policylist.Create() } // AddRoute adds route policy list for the specified endpoints func AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, encapEnabled bool) (*PolicyList, error) { operation := "AddRoute" title := "hcsshim::PolicyList::" + operation logrus.Debugf(title+" destinationPrefix:%s", destinationPrefix) policylist := &PolicyList{} rPolicy := &RoutePolicy{ DestinationPrefix: destinationPrefix, NextHop: nextHop, EncapEnabled: encapEnabled, } rPolicy.Type = Route for _, endpoint := range endpoints { policylist.EndpointReferences = append(policylist.EndpointReferences, "/endpoints/"+endpoint.Id) } jsonString, err := json.Marshal(rPolicy) if err != nil { return nil, err } policylist.Policies = append(policylist.Policies, jsonString) return policylist.Create() } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/hnssupport.go ================================================ //go:build windows package hns import ( "github.com/sirupsen/logrus" ) type HNSSupportedFeatures struct { Acl HNSAclFeatures `json:"ACL"` } type HNSAclFeatures struct { AclAddressLists bool `json:"AclAddressLists"` AclNoHostRulePriority bool `json:"AclHostRulePriority"` AclPortRanges bool `json:"AclPortRanges"` AclRuleId bool `json:"AclRuleId"` } func GetHNSSupportedFeatures() HNSSupportedFeatures { var hnsFeatures HNSSupportedFeatures globals, err := GetHNSGlobals() if err != nil { // Expected on pre-1803 builds, all features will be false/unsupported logrus.Debugf("Unable to obtain HNS globals: %s", err) return hnsFeatures } hnsFeatures.Acl = HNSAclFeatures{ AclAddressLists: isHNSFeatureSupported(globals.Version, HNSVersion1803), AclNoHostRulePriority: isHNSFeatureSupported(globals.Version, HNSVersion1803), AclPortRanges: isHNSFeatureSupported(globals.Version, HNSVersion1803), AclRuleId: isHNSFeatureSupported(globals.Version, HNSVersion1803), } return hnsFeatures } func isHNSFeatureSupported(currentVersion HNSVersion, minVersionSupported HNSVersion) bool { if currentVersion.Major < minVersionSupported.Major { return false } if currentVersion.Major > minVersionSupported.Major { return true } if currentVersion.Minor < minVersionSupported.Minor { return false } return true } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go ================================================ //go:build windows package hns import ( "encoding/json" "fmt" "os" "path" "strings" ) type namespaceRequest struct { IsDefault bool `json:",omitempty"` } type namespaceEndpointRequest struct { ID string `json:"Id"` } type NamespaceResource struct { Type string Data json.RawMessage } type namespaceResourceRequest struct { Type string Data interface{} } type Namespace struct { ID string IsDefault bool `json:",omitempty"` ResourceList []NamespaceResource `json:",omitempty"` CompartmentId uint32 `json:",omitempty"` } func issueNamespaceRequest(id *string, method, subpath string, request interface{}) (*Namespace, error) { var err error hnspath := "/namespaces/" if id != nil { hnspath = path.Join(hnspath, *id) } if subpath != "" { hnspath = path.Join(hnspath, subpath) } var reqJSON []byte if request != nil { if reqJSON, err = json.Marshal(request); err != nil { return nil, err } } var ns Namespace err = hnsCall(method, hnspath, string(reqJSON), &ns) if err != nil { if strings.Contains(err.Error(), "Element not found.") { return nil, os.ErrNotExist } return nil, fmt.Errorf("%s %s: %w", method, hnspath, err) } return &ns, err } func CreateNamespace() (string, error) { req := namespaceRequest{} ns, err := issueNamespaceRequest(nil, "POST", "", &req) if err != nil { return "", err } return ns.ID, nil } func RemoveNamespace(id string) error { _, err := issueNamespaceRequest(&id, "DELETE", "", nil) return err } func GetNamespaceEndpoints(id string) ([]string, error) { ns, err := issueNamespaceRequest(&id, "GET", "", nil) if err != nil { return nil, err } var endpoints []string for _, rsrc := range ns.ResourceList { if rsrc.Type == "Endpoint" { var endpoint namespaceEndpointRequest err = json.Unmarshal(rsrc.Data, &endpoint) if err != nil { return nil, fmt.Errorf("unmarshal endpoint: %w", err) } endpoints = append(endpoints, endpoint.ID) } } return endpoints, nil } func AddNamespaceEndpoint(id string, endpointID string) error { resource := namespaceResourceRequest{ Type: "Endpoint", Data: namespaceEndpointRequest{endpointID}, } _, err := issueNamespaceRequest(&id, "POST", "addresource", &resource) return err } func RemoveNamespaceEndpoint(id string, endpointID string) error { resource := namespaceResourceRequest{ Type: "Endpoint", Data: namespaceEndpointRequest{endpointID}, } _, err := issueNamespaceRequest(&id, "POST", "removeresource", &resource) return err } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/hns/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package hns import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modvmcompute = windows.NewLazySystemDLL("vmcompute.dll") procHNSCall = modvmcompute.NewProc("HNSCall") ) func _hnsCall(method string, path string, object string, response **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(method) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } var _p2 *uint16 _p2, hr = syscall.UTF16PtrFromString(object) if hr != nil { return } return __hnsCall(_p0, _p1, _p2, response) } func __hnsCall(method *uint16, path *uint16, object *uint16, response **uint16) (hr error) { hr = procHNSCall.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHNSCall.Addr(), uintptr(unsafe.Pointer(method)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(object)), uintptr(unsafe.Pointer(response))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/interop/doc.go ================================================ package interop ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/interop/interop.go ================================================ //go:build windows package interop import ( "syscall" "unsafe" ) //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go interop.go //sys coTaskMemFree(buffer unsafe.Pointer) = api_ms_win_core_com_l1_1_0.CoTaskMemFree func ConvertAndFreeCoTaskMemString(buffer *uint16) string { str := syscall.UTF16ToString((*[1 << 29]uint16)(unsafe.Pointer(buffer))[:]) coTaskMemFree(unsafe.Pointer(buffer)) return str } func Win32FromHresult(hr uintptr) syscall.Errno { if hr&0x1fff0000 == 0x00070000 { return syscall.Errno(hr & 0xffff) } return syscall.Errno(hr) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/interop/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package interop import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modapi_ms_win_core_com_l1_1_0 = windows.NewLazySystemDLL("api-ms-win-core-com-l1-1-0.dll") procCoTaskMemFree = modapi_ms_win_core_com_l1_1_0.NewProc("CoTaskMemFree") ) func coTaskMemFree(buffer unsafe.Pointer) { syscall.SyscallN(procCoTaskMemFree.Addr(), uintptr(buffer)) return } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/jobobject/doc.go ================================================ // This package provides higher level constructs for the win32 job object API. // Most of the core creation and management functions are already present in "golang.org/x/sys/windows" // (CreateJobObject, AssignProcessToJobObject, etc.) as well as most of the limit information // structs and associated limit flags. Whatever is not present from the job object API // in golang.org/x/sys/windows is located in /internal/winapi. // // https://docs.microsoft.com/en-us/windows/win32/procthread/job-objects package jobobject ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go ================================================ //go:build windows package jobobject import ( "context" "errors" "fmt" "sync" "unsafe" "github.com/Microsoft/hcsshim/internal/log" "github.com/Microsoft/hcsshim/internal/queue" "github.com/Microsoft/hcsshim/internal/winapi" "github.com/sirupsen/logrus" "golang.org/x/sys/windows" ) var ( ioInitOnce sync.Once initIOErr error // Global iocp handle that will be re-used for every job object ioCompletionPort windows.Handle // Mapping of job handle to queue to place notifications in. jobMap sync.Map ) // MsgAllProcessesExited is a type representing a message that every process in a job has exited. type MsgAllProcessesExited struct{} // MsgUnimplemented represents a message that we are aware of, but that isn't implemented currently. // This should not be treated as an error. type MsgUnimplemented struct{} // pollIOCP polls the io completion port forever. func pollIOCP(ctx context.Context, iocpHandle windows.Handle) { var ( overlapped uintptr code uint32 key uintptr ) for { err := windows.GetQueuedCompletionStatus(iocpHandle, &code, &key, (**windows.Overlapped)(unsafe.Pointer(&overlapped)), windows.INFINITE) if err != nil { log.G(ctx).WithError(err).Error("failed to poll for job object message") continue } if val, ok := jobMap.Load(key); ok { msq, ok := val.(*queue.MessageQueue) if !ok { log.G(ctx).WithField("value", msq).Warn("encountered non queue type in job map") continue } notification, err := parseMessage(code, overlapped) if err != nil { log.G(ctx).WithFields(logrus.Fields{ "code": code, "overlapped": overlapped, }).Warn("failed to parse job object message") continue } if err := msq.Enqueue(notification); errors.Is(err, queue.ErrQueueClosed) { // Write will only return an error when the queue is closed. // The only time a queue would ever be closed is when we call `Close` on // the job it belongs to which also removes it from the jobMap, so something // went wrong here. We can't return as this is reading messages for all jobs // so just log it and move on. log.G(ctx).WithFields(logrus.Fields{ "code": code, "overlapped": overlapped, }).Warn("tried to write to a closed queue") continue } } else { log.G(ctx).Warn("received a message for a job not present in the mapping") } } } func parseMessage(code uint32, overlapped uintptr) (interface{}, error) { // Check code and parse out relevant information related to that notification // that we care about. For now all we handle is the message that all processes // in the job have exited. switch code { case winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO: return MsgAllProcessesExited{}, nil // Other messages for completeness and a check to make sure that if we fall // into the default case that this is a code we don't know how to handle. case winapi.JOB_OBJECT_MSG_END_OF_JOB_TIME: case winapi.JOB_OBJECT_MSG_END_OF_PROCESS_TIME: case winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT: case winapi.JOB_OBJECT_MSG_NEW_PROCESS: case winapi.JOB_OBJECT_MSG_EXIT_PROCESS: case winapi.JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS: case winapi.JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT: case winapi.JOB_OBJECT_MSG_JOB_MEMORY_LIMIT: case winapi.JOB_OBJECT_MSG_NOTIFICATION_LIMIT: default: return nil, fmt.Errorf("unknown job notification type: %d", code) } return MsgUnimplemented{}, nil } // Assigns an IO completion port to get notified of events for the registered job // object. func attachIOCP(job windows.Handle, iocp windows.Handle) error { info := winapi.JOBOBJECT_ASSOCIATE_COMPLETION_PORT{ CompletionKey: job, CompletionPort: iocp, } _, err := windows.SetInformationJobObject(job, windows.JobObjectAssociateCompletionPortInformation, uintptr(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info))) return err } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go ================================================ //go:build windows package jobobject import ( "context" "errors" "fmt" "os" "path/filepath" "sync" "sync/atomic" "unsafe" "github.com/Microsoft/hcsshim/internal/queue" "github.com/Microsoft/hcsshim/internal/winapi" "golang.org/x/sys/windows" ) // JobObject is a high level wrapper around a Windows job object. Holds a handle to // the job, a queue to receive iocp notifications about the lifecycle // of the job and a mutex for synchronized handle access. type JobObject struct { handle windows.Handle // silo signifies that this job is currently a silo. silo atomic.Bool mq *queue.MessageQueue handleLock sync.RWMutex } // JobLimits represents the resource constraints that can be applied to a job object. type JobLimits struct { CPULimit uint32 CPUWeight uint32 MemoryLimitInBytes uint64 MaxIOPS int64 MaxBandwidth int64 } type CPURateControlType uint32 const ( WeightBased CPURateControlType = iota RateBased ) // Processor resource controls const ( cpuLimitMin = 1 cpuLimitMax = 10000 cpuWeightMin = 1 cpuWeightMax = 9 ) var ( ErrAlreadyClosed = errors.New("the handle has already been closed") ErrNotRegistered = errors.New("job is not registered to receive notifications") ErrNotSilo = errors.New("job is not a silo") ) // Options represents the set of configurable options when making or opening a job object. type Options struct { // `Name` specifies the name of the job object if a named job object is desired. Name string // `Notifications` specifies if the job will be registered to receive notifications. // Defaults to false. Notifications bool // `UseNTVariant` specifies if we should use the `Nt` variant of Open/CreateJobObject. // Defaults to false. UseNTVariant bool // `Silo` specifies to promote the job to a silo. This additionally sets the flag // JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE as it is required for the upgrade to complete. Silo bool // `IOTracking` enables tracking I/O statistics on the job object. More specifically this // calls SetInformationJobObject with the JobObjectIoAttribution class. EnableIOTracking bool } // Create creates a job object. // // If options.Name is an empty string, the job will not be assigned a name. // // If options.Notifications are not enabled `PollNotifications` will return immediately with error `errNotRegistered`. // // If `options` is nil, use default option values. // // Returns a JobObject structure and an error if there is one. func Create(ctx context.Context, options *Options) (_ *JobObject, err error) { if options == nil { options = &Options{} } var jobName *winapi.UnicodeString if options.Name != "" { jobName, err = winapi.NewUnicodeString(options.Name) if err != nil { return nil, err } } var jobHandle windows.Handle if options.UseNTVariant { oa := winapi.ObjectAttributes{ Length: unsafe.Sizeof(winapi.ObjectAttributes{}), ObjectName: jobName, Attributes: 0, } status := winapi.NtCreateJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa) if status != 0 { return nil, winapi.RtlNtStatusToDosError(status) } } else { var jobNameBuf *uint16 if jobName != nil && jobName.Buffer != nil { jobNameBuf = jobName.Buffer } jobHandle, err = windows.CreateJobObject(nil, jobNameBuf) if err != nil { return nil, err } } defer func() { if err != nil { windows.Close(jobHandle) } }() job := &JobObject{ handle: jobHandle, } // If the IOCP we'll be using to receive messages for all jobs hasn't been // created, create it and start polling. if options.Notifications { mq, err := setupNotifications(ctx, job) if err != nil { return nil, err } job.mq = mq } if options.EnableIOTracking { if err := enableIOTracking(jobHandle); err != nil { return nil, err } } if options.Silo { // This is a required setting for upgrading to a silo. if err := job.SetTerminateOnLastHandleClose(); err != nil { return nil, err } if err := job.PromoteToSilo(); err != nil { return nil, err } } return job, nil } // Open opens an existing job object with name provided in `options`. If no name is provided // return an error since we need to know what job object to open. // // If options.Notifications is false `PollNotifications` will return immediately with error `errNotRegistered`. // // Returns a JobObject structure and an error if there is one. func Open(ctx context.Context, options *Options) (_ *JobObject, err error) { if options == nil || options.Name == "" { return nil, errors.New("no job object name specified to open") } unicodeJobName, err := winapi.NewUnicodeString(options.Name) if err != nil { return nil, err } var jobHandle windows.Handle if options.UseNTVariant { oa := winapi.ObjectAttributes{ Length: unsafe.Sizeof(winapi.ObjectAttributes{}), ObjectName: unicodeJobName, Attributes: 0, } status := winapi.NtOpenJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa) if status != 0 { return nil, winapi.RtlNtStatusToDosError(status) } } else { jobHandle, err = winapi.OpenJobObject(winapi.JOB_OBJECT_ALL_ACCESS, false, unicodeJobName.Buffer) if err != nil { return nil, err } } defer func() { if err != nil { windows.Close(jobHandle) } }() job := &JobObject{ handle: jobHandle, } job.silo.Store(isJobSilo(jobHandle)) // If the IOCP we'll be using to receive messages for all jobs hasn't been // created, create it and start polling. if options.Notifications { mq, err := setupNotifications(ctx, job) if err != nil { return nil, err } job.mq = mq } return job, nil } // helper function to setup notifications for creating/opening a job object func setupNotifications(ctx context.Context, job *JobObject) (*queue.MessageQueue, error) { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return nil, ErrAlreadyClosed } ioInitOnce.Do(func() { h, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0xffffffff) if err != nil { initIOErr = err return } ioCompletionPort = h go pollIOCP(ctx, h) }) if initIOErr != nil { return nil, initIOErr } mq := queue.NewMessageQueue() jobMap.Store(uintptr(job.handle), mq) if err := attachIOCP(job.handle, ioCompletionPort); err != nil { jobMap.Delete(uintptr(job.handle)) return nil, fmt.Errorf("failed to attach job to IO completion port: %w", err) } return mq, nil } // PollNotification will poll for a job object notification. This call should only be called once // per job (ideally in a goroutine loop) and will block if there is not a notification ready. // This call will return immediately with error `ErrNotRegistered` if the job was not registered // to receive notifications during `Create`. Internally, messages will be queued and there // is no worry of messages being dropped. func (job *JobObject) PollNotification() (interface{}, error) { if job.mq == nil { return nil, ErrNotRegistered } return job.mq.Dequeue() } // UpdateProcThreadAttribute updates the passed in ProcThreadAttributeList to contain what is necessary to // launch a process in a job at creation time. This can be used to avoid having to call Assign() after a process // has already started running. func (job *JobObject) UpdateProcThreadAttribute(attrList *windows.ProcThreadAttributeListContainer) error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } if err := attrList.Update( winapi.PROC_THREAD_ATTRIBUTE_JOB_LIST, unsafe.Pointer(&job.handle), unsafe.Sizeof(job.handle), ); err != nil { return fmt.Errorf("failed to update proc thread attributes for job object: %w", err) } return nil } // Close closes the job object handle. func (job *JobObject) Close() error { job.handleLock.Lock() defer job.handleLock.Unlock() if job.handle == 0 { return ErrAlreadyClosed } if err := windows.Close(job.handle); err != nil { return err } if job.mq != nil { job.mq.Close() } // Handles now invalid so if the map entry to receive notifications for this job still // exists remove it so we can stop receiving notifications. if _, ok := jobMap.Load(uintptr(job.handle)); ok { jobMap.Delete(uintptr(job.handle)) } job.handle = 0 return nil } // Assign assigns a process to the job object. func (job *JobObject) Assign(pid uint32) error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } if pid == 0 { return errors.New("invalid pid: 0") } hProc, err := windows.OpenProcess(winapi.PROCESS_ALL_ACCESS, true, pid) if err != nil { return err } defer windows.Close(hProc) return windows.AssignProcessToJobObject(job.handle, hProc) } // Terminate terminates the job, essentially calls TerminateProcess on every process in the // job. func (job *JobObject) Terminate(exitCode uint32) error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } return windows.TerminateJobObject(job.handle, exitCode) } // Pids returns all of the process IDs in the job object. func (job *JobObject) Pids() ([]uint32, error) { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return nil, ErrAlreadyClosed } info := winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST{} err := winapi.QueryInformationJobObject( job.handle, winapi.JobObjectBasicProcessIdList, unsafe.Pointer(&info), uint32(unsafe.Sizeof(info)), nil, ) // This is either the case where there is only one process or no processes in // the job. Any other case will result in ERROR_MORE_DATA. Check if info.NumberOfProcessIdsInList // is 1 and just return this, otherwise return an empty slice. if err == nil { if info.NumberOfProcessIdsInList == 1 { return []uint32{uint32(info.ProcessIdList[0])}, nil } // Return empty slice instead of nil to play well with the caller of this. // Do not return an error if no processes are running inside the job return []uint32{}, nil } if err != winapi.ERROR_MORE_DATA { //nolint:errorlint return nil, fmt.Errorf("failed initial query for PIDs in job object: %w", err) } jobBasicProcessIDListSize := unsafe.Sizeof(info) + (unsafe.Sizeof(info.ProcessIdList[0]) * uintptr(info.NumberOfAssignedProcesses-1)) buf := make([]byte, jobBasicProcessIDListSize) if err = winapi.QueryInformationJobObject( job.handle, winapi.JobObjectBasicProcessIdList, unsafe.Pointer(&buf[0]), uint32(len(buf)), nil, ); err != nil { return nil, fmt.Errorf("failed to query for PIDs in job object: %w", err) } bufInfo := (*winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST)(unsafe.Pointer(&buf[0])) pids := make([]uint32, bufInfo.NumberOfProcessIdsInList) for i, bufPid := range bufInfo.AllPids() { pids[i] = uint32(bufPid) } return pids, nil } // QueryMemoryStats gets the memory stats for the job object. func (job *JobObject) QueryMemoryStats() (*winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION, error) { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return nil, ErrAlreadyClosed } info := winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION{} if err := winapi.QueryInformationJobObject( job.handle, winapi.JobObjectMemoryUsageInformation, unsafe.Pointer(&info), uint32(unsafe.Sizeof(info)), nil, ); err != nil { return nil, fmt.Errorf("failed to query for job object memory stats: %w", err) } return &info, nil } // QueryProcessorStats gets the processor stats for the job object. func (job *JobObject) QueryProcessorStats() (*winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, error) { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return nil, ErrAlreadyClosed } info := winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION{} if err := winapi.QueryInformationJobObject( job.handle, winapi.JobObjectBasicAccountingInformation, unsafe.Pointer(&info), uint32(unsafe.Sizeof(info)), nil, ); err != nil { return nil, fmt.Errorf("failed to query for job object process stats: %w", err) } return &info, nil } // QueryStorageStats gets the storage (I/O) stats for the job object. This call will error // if either `EnableIOTracking` wasn't set to true on creation of the job, or SetIOTracking() // hasn't been called since creation of the job. func (job *JobObject) QueryStorageStats() (*winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION, error) { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return nil, ErrAlreadyClosed } info := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{ ControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE, } if err := winapi.QueryInformationJobObject( job.handle, winapi.JobObjectIoAttribution, unsafe.Pointer(&info), uint32(unsafe.Sizeof(info)), nil, ); err != nil { return nil, fmt.Errorf("failed to query for job object storage stats: %w", err) } return &info, nil } // ApplyFileBinding makes a file binding using the Bind Filter from target to root. If the job has // not been upgraded to a silo this call will fail. The binding is only applied and visible for processes // running in the job, any processes on the host or in another job will not be able to see the binding. func (job *JobObject) ApplyFileBinding(root, target string, readOnly bool) error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } if !job.silo.Load() { return ErrNotSilo } // The parent directory needs to exist for the bind to work. MkdirAll stats and // returns nil if the directory exists internally so we should be fine to mkdirall // every time. if err := os.MkdirAll(filepath.Dir(root), 0); err != nil { return err } rootPtr, err := windows.UTF16PtrFromString(root) if err != nil { return err } targetPtr, err := windows.UTF16PtrFromString(target) if err != nil { return err } flags := winapi.BINDFLT_FLAG_USE_CURRENT_SILO_MAPPING if readOnly { flags |= winapi.BINDFLT_FLAG_READ_ONLY_MAPPING } if err := winapi.BfSetupFilter( job.handle, flags, rootPtr, targetPtr, nil, 0, ); err != nil { return fmt.Errorf("failed to bind target %q to root %q for job object: %w", target, root, err) } return nil } // isJobSilo is a helper to determine if a job object that was opened is a silo. This should ONLY be called // from `Open` and any callers in this package afterwards should use `job.isSilo()` func isJobSilo(h windows.Handle) bool { // None of the information from the structure that this info class expects will be used, this is just used as // the call will fail if the job hasn't been upgraded to a silo so we can use this to tell when we open a job // if it's a silo or not. We still need to define the struct layout as expected by Win32, else the struct // alignment might be different and the call will fail. var siloInfo winapi.SILOOBJECT_BASIC_INFORMATION err := winapi.QueryInformationJobObject( h, winapi.JobObjectSiloBasicInformation, unsafe.Pointer(&siloInfo), uint32(unsafe.Sizeof(siloInfo)), nil, ) return err == nil } // PromoteToSilo promotes a job object to a silo. There must be no running processess // in the job for this to succeed. If the job is already a silo this is a no-op. func (job *JobObject) PromoteToSilo() error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } if job.silo.Load() { return nil } pids, err := job.Pids() if err != nil { return err } if len(pids) != 0 { return fmt.Errorf("job cannot have running processes to be promoted to a silo, found %d running processes", len(pids)) } _, err = windows.SetInformationJobObject( job.handle, winapi.JobObjectCreateSilo, 0, 0, ) if err != nil { return fmt.Errorf("failed to promote job to silo: %w", err) } job.silo.Store(true) return nil } // QueryPrivateWorkingSet returns the private working set size for the job. This is calculated by adding up the // private working set for every process running in the job. func (job *JobObject) QueryPrivateWorkingSet() (uint64, error) { pids, err := job.Pids() if err != nil { return 0, err } openAndQueryWorkingSet := func(pid uint32) (uint64, error) { h, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, pid) if err != nil { // Continue to the next if OpenProcess doesn't return a valid handle (fails). Handles a // case where one of the pids in the job exited before we open. return 0, nil } defer func() { _ = windows.Close(h) }() // Check if the process is actually running in the job still. There's a small chance // that the process could have exited and had its pid re-used between grabbing the pids // in the job and opening the handle to it above. var inJob int32 if err := winapi.IsProcessInJob(h, job.handle, &inJob); err != nil { // This shouldn't fail unless we have incorrect access rights which we control // here so probably best to error out if this failed. return 0, err } // Don't report stats for this process as it's not running in the job. This shouldn't be // an error condition though. if inJob == 0 { return 0, nil } var vmCounters winapi.VM_COUNTERS_EX2 status := winapi.NtQueryInformationProcess( h, winapi.ProcessVmCounters, unsafe.Pointer(&vmCounters), uint32(unsafe.Sizeof(vmCounters)), nil, ) if !winapi.NTSuccess(status) { return 0, fmt.Errorf("failed to query information for process: %w", winapi.RtlNtStatusToDosError(status)) } return uint64(vmCounters.PrivateWorkingSetSize), nil } var jobWorkingSetSize uint64 for _, pid := range pids { workingSet, err := openAndQueryWorkingSet(pid) if err != nil { return 0, err } jobWorkingSetSize += workingSet } return jobWorkingSetSize, nil } // SetIOTracking enables IO tracking for processes in the job object. // This enables use of the QueryStorageStats method. func (job *JobObject) SetIOTracking() error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } return enableIOTracking(job.handle) } func enableIOTracking(job windows.Handle) error { info := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{ ControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE, } if _, err := windows.SetInformationJobObject( job, winapi.JobObjectIoAttribution, uintptr(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info)), ); err != nil { return fmt.Errorf("failed to enable IO tracking on job object: %w", err) } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go ================================================ //go:build windows package jobobject import ( "errors" "fmt" "unsafe" "github.com/Microsoft/hcsshim/internal/winapi" "golang.org/x/sys/windows" ) const ( memoryLimitMax uint64 = 0xffffffffffffffff ) func isFlagSet(flag, controlFlags uint32) bool { return (flag & controlFlags) == flag } // SetResourceLimits sets resource limits on the job object (cpu, memory, storage). func (job *JobObject) SetResourceLimits(limits *JobLimits) error { // Go through and check what limits were specified and apply them to the job. if limits.MemoryLimitInBytes != 0 { if err := job.SetMemoryLimit(limits.MemoryLimitInBytes); err != nil { return fmt.Errorf("failed to set job object memory limit: %w", err) } } if limits.CPULimit != 0 { if err := job.SetCPULimit(RateBased, limits.CPULimit); err != nil { return fmt.Errorf("failed to set job object cpu limit: %w", err) } } else if limits.CPUWeight != 0 { if err := job.SetCPULimit(WeightBased, limits.CPUWeight); err != nil { return fmt.Errorf("failed to set job object cpu limit: %w", err) } } if limits.MaxBandwidth != 0 || limits.MaxIOPS != 0 { if err := job.SetIOLimit(limits.MaxBandwidth, limits.MaxIOPS); err != nil { return fmt.Errorf("failed to set io limit on job object: %w", err) } } return nil } // SetTerminateOnLastHandleClose sets the job object flag that specifies that the job should terminate // all processes in the job on the last open handle being closed. func (job *JobObject) SetTerminateOnLastHandleClose() error { info, err := job.getExtendedInformation() if err != nil { return err } info.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE return job.setExtendedInformation(info) } // SetMemoryLimit sets the memory limit of the job object based on the given `memoryLimitInBytes`. func (job *JobObject) SetMemoryLimit(memoryLimitInBytes uint64) error { if memoryLimitInBytes >= memoryLimitMax { return errors.New("memory limit specified exceeds the max size") } info, err := job.getExtendedInformation() if err != nil { return err } info.JobMemoryLimit = uintptr(memoryLimitInBytes) info.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_JOB_MEMORY return job.setExtendedInformation(info) } // GetMemoryLimit gets the memory limit in bytes of the job object. func (job *JobObject) GetMemoryLimit() (uint64, error) { info, err := job.getExtendedInformation() if err != nil { return 0, err } return uint64(info.JobMemoryLimit), nil } // SetCPULimit sets the CPU limit depending on the specified `CPURateControlType` to // `rateControlValue` for the job object. func (job *JobObject) SetCPULimit(rateControlType CPURateControlType, rateControlValue uint32) error { cpuInfo, err := job.getCPURateControlInformation() if err != nil { return err } switch rateControlType { case WeightBased: if rateControlValue < cpuWeightMin || rateControlValue > cpuWeightMax { return fmt.Errorf("processor weight value of `%d` is invalid", rateControlValue) } cpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED cpuInfo.Value = rateControlValue case RateBased: if rateControlValue < cpuLimitMin || rateControlValue > cpuLimitMax { return fmt.Errorf("processor rate of `%d` is invalid", rateControlValue) } cpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP cpuInfo.Value = rateControlValue default: return errors.New("invalid job object cpu rate control type") } return job.setCPURateControlInfo(cpuInfo) } // GetCPULimit gets the cpu limits for the job object. // `rateControlType` is used to indicate what type of cpu limit to query for. func (job *JobObject) GetCPULimit(rateControlType CPURateControlType) (uint32, error) { info, err := job.getCPURateControlInformation() if err != nil { return 0, err } if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE, info.ControlFlags) { return 0, errors.New("the job does not have cpu rate control enabled") } switch rateControlType { case WeightBased: if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED, info.ControlFlags) { return 0, errors.New("cannot get cpu weight for job object without cpu weight option set") } case RateBased: if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP, info.ControlFlags) { return 0, errors.New("cannot get cpu rate hard cap for job object without cpu rate hard cap option set") } default: return 0, errors.New("invalid job object cpu rate control type") } return info.Value, nil } // SetCPUAffinity sets the processor affinity for the job object. // The affinity is passed in as a bitmask. func (job *JobObject) SetCPUAffinity(affinityBitMask uint64) error { info, err := job.getExtendedInformation() if err != nil { return err } info.BasicLimitInformation.LimitFlags |= uint32(windows.JOB_OBJECT_LIMIT_AFFINITY) // We really, really shouldn't be running on 32 bit, but just in case (and to satisfy CodeQL) ... const maxUintptr = ^uintptr(0) if affinityBitMask > uint64(maxUintptr) { return fmt.Errorf("affinity bitmask (%d) exceeds max allowable value (%d)", affinityBitMask, maxUintptr) } // CodeQL [SM03681] checked against max value above (there is no math.MaxUintPtr ...) info.BasicLimitInformation.Affinity = uintptr(affinityBitMask) return job.setExtendedInformation(info) } // GetCPUAffinity gets the processor affinity for the job object. // The returned affinity is a bitmask. func (job *JobObject) GetCPUAffinity() (uint64, error) { info, err := job.getExtendedInformation() if err != nil { return 0, err } return uint64(info.BasicLimitInformation.Affinity), nil } // SetIOLimit sets the IO limits specified on the job object. func (job *JobObject) SetIOLimit(maxBandwidth, maxIOPS int64) error { ioInfo, err := job.getIOLimit() if err != nil { return err } ioInfo.ControlFlags |= winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE if maxBandwidth != 0 { ioInfo.MaxBandwidth = maxBandwidth } if maxIOPS != 0 { ioInfo.MaxIops = maxIOPS } return job.setIORateControlInfo(ioInfo) } // GetIOMaxBandwidthLimit gets the max bandwidth for the job object. func (job *JobObject) GetIOMaxBandwidthLimit() (int64, error) { info, err := job.getIOLimit() if err != nil { return 0, err } return info.MaxBandwidth, nil } // GetIOMaxIopsLimit gets the max iops for the job object. func (job *JobObject) GetIOMaxIopsLimit() (int64, error) { info, err := job.getIOLimit() if err != nil { return 0, err } return info.MaxIops, nil } // Helper function for getting a job object's extended information. func (job *JobObject) getExtendedInformation() (*windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION, error) { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return nil, ErrAlreadyClosed } info := windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION{} if err := winapi.QueryInformationJobObject( job.handle, windows.JobObjectExtendedLimitInformation, unsafe.Pointer(&info), uint32(unsafe.Sizeof(info)), nil, ); err != nil { return nil, fmt.Errorf("query %v returned error: %w", info, err) } return &info, nil } // Helper function for getting a job object's CPU rate control information. func (job *JobObject) getCPURateControlInformation() (*winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION, error) { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return nil, ErrAlreadyClosed } info := winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION{} if err := winapi.QueryInformationJobObject( job.handle, windows.JobObjectCpuRateControlInformation, unsafe.Pointer(&info), uint32(unsafe.Sizeof(info)), nil, ); err != nil { return nil, fmt.Errorf("query %v returned error: %w", info, err) } return &info, nil } // Helper function for setting a job object's extended information. func (job *JobObject) setExtendedInformation(info *windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION) error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } if _, err := windows.SetInformationJobObject( job.handle, windows.JobObjectExtendedLimitInformation, uintptr(unsafe.Pointer(info)), uint32(unsafe.Sizeof(*info)), ); err != nil { return fmt.Errorf("failed to set Extended info %v on job object: %w", info, err) } return nil } // Helper function for querying job handle for IO limit information. func (job *JobObject) getIOLimit() (*winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION, error) { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return nil, ErrAlreadyClosed } ioInfo := &winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION{} var blockCount uint32 = 1 if _, err := winapi.QueryIoRateControlInformationJobObject( job.handle, nil, &ioInfo, &blockCount, ); err != nil { return nil, fmt.Errorf("query %v returned error: %w", ioInfo, err) } if !isFlagSet(winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE, ioInfo.ControlFlags) { return nil, fmt.Errorf("query %v cannot get IO limits for job object without IO rate control option set", ioInfo) } return ioInfo, nil } // Helper function for setting a job object's IO rate control information. func (job *JobObject) setIORateControlInfo(ioInfo *winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION) error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } if _, err := winapi.SetIoRateControlInformationJobObject(job.handle, ioInfo); err != nil { return fmt.Errorf("failed to set IO limit info %v on job object: %w", ioInfo, err) } return nil } // Helper function for setting a job object's CPU rate control information. func (job *JobObject) setCPURateControlInfo(cpuInfo *winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION) error { job.handleLock.RLock() defer job.handleLock.RUnlock() if job.handle == 0 { return ErrAlreadyClosed } if _, err := windows.SetInformationJobObject( job.handle, windows.JobObjectCpuRateControlInformation, uintptr(unsafe.Pointer(cpuInfo)), uint32(unsafe.Sizeof(cpuInfo)), ); err != nil { return fmt.Errorf("failed to set cpu limit info %v on job object: %w", cpuInfo, err) } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/log/context.go ================================================ package log import ( "context" "github.com/sirupsen/logrus" ) type entryContextKeyType int const _entryContextKey entryContextKeyType = iota var ( // L is the default, blank logging entry. WithField and co. all return a copy // of the original entry, so this will not leak fields between calls. // // Do NOT modify fields directly, as that will corrupt state for all users and // is not thread safe. // Instead, use `L.With*` or `L.Dup()`. Or `G(context.Background())`. L = logrus.NewEntry(logrus.StandardLogger()) // G is an alias for GetEntry. G = GetEntry // S is an alias for SetEntry. S = SetEntry // U is an alias for UpdateContext. U = UpdateContext ) // GetEntry returns a `logrus.Entry` stored in the context, if one exists. // Otherwise, it returns a default entry that points to the current context. // // Note: if the a new entry is returned, it will reference the passed in context. // However, existing contexts may be stored in parent contexts and additionally reference // earlier contexts. // Use `UpdateContext` to update the entry and context. func GetEntry(ctx context.Context) *logrus.Entry { entry := fromContext(ctx) if entry == nil { entry = L.WithContext(ctx) } return entry } // SetEntry updates the log entry in the context with the provided fields, and // returns both. It is equivalent to: // // entry := GetEntry(ctx).WithFields(fields) // ctx = WithContext(ctx, entry) // // See WithContext for more information. func SetEntry(ctx context.Context, fields logrus.Fields) (context.Context, *logrus.Entry) { e := GetEntry(ctx) if len(fields) > 0 { e = e.WithFields(fields) } return WithContext(ctx, e) } // UpdateContext extracts the log entry from the context, and, if the entry's // context points to a parent's of the current context, ands the entry // to the most recent context. It is equivalent to: // // entry := GetEntry(ctx) // ctx = WithContext(ctx, entry) // // This allows the entry to reference the most recent context and any new // values (such as span contexts) added to it. // // See WithContext for more information. func UpdateContext(ctx context.Context) context.Context { // there is no way to check its ctx (and not one of its parents) that contains `e` // so, at a slight cost, force add `e` to the context ctx, _ = WithContext(ctx, GetEntry(ctx)) return ctx } // WithContext returns a context that contains the provided log entry. // The entry can be extracted with `GetEntry` (`G`) // // The entry in the context is a copy of `entry` (generated by `entry.WithContext`). func WithContext(ctx context.Context, entry *logrus.Entry) (context.Context, *logrus.Entry) { // regardless of the order, entry.Context != GetEntry(ctx) // here, the returned entry will reference the supplied context entry = entry.WithContext(ctx) ctx = context.WithValue(ctx, _entryContextKey, entry) return ctx, entry } func fromContext(ctx context.Context) *logrus.Entry { e, _ := ctx.Value(_entryContextKey).(*logrus.Entry) return e } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/log/format.go ================================================ package log import ( "bytes" "context" "encoding/json" "fmt" "net" "reflect" "time" "github.com/sirupsen/logrus" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" ) // TimeFormat is [time.RFC3339Nano] with nanoseconds padded using // zeros to ensure the formatted time is always the same number of // characters. // Based on RFC3339NanoFixed from github.com/containerd/log const TimeFormat = "2006-01-02T15:04:05.000000000Z07:00" func FormatTime(t time.Time) string { return t.Format(TimeFormat) } // DurationFormat formats a [time.Duration] log entry. // // A nil value signals an error with the formatting. type DurationFormat func(time.Duration) interface{} func DurationFormatString(d time.Duration) interface{} { return d.String() } func DurationFormatSeconds(d time.Duration) interface{} { return d.Seconds() } func DurationFormatMilliseconds(d time.Duration) interface{} { return d.Milliseconds() } // FormatIO formats net.Conn and other types that have an `Addr()` or `Name()`. // // See FormatEnabled for more information. func FormatIO(ctx context.Context, v interface{}) string { m := make(map[string]string) m["type"] = reflect.TypeOf(v).String() switch t := v.(type) { case net.Conn: m["localAddress"] = formatAddr(t.LocalAddr()) m["remoteAddress"] = formatAddr(t.RemoteAddr()) case interface{ Addr() net.Addr }: m["address"] = formatAddr(t.Addr()) default: return Format(ctx, t) } return Format(ctx, m) } func formatAddr(a net.Addr) string { return a.Network() + "://" + a.String() } // Format formats an object into a JSON string, without any indendtation or // HTML escapes. // Context is used to output a log waring if the conversion fails. // // This is intended primarily for `trace.StringAttribute()` func Format(ctx context.Context, v interface{}) string { b, err := encode(v) if err != nil { // logging errors aren't really warning worthy, and can potentially spam a lot of logs out G(ctx).WithFields(logrus.Fields{ logrus.ErrorKey: err, "type": fmt.Sprintf("%T", v), }).Debug("could not format value") return "" } return string(b) } func encode(v interface{}) (_ []byte, err error) { if m, ok := v.(proto.Message); ok { // use canonical JSON encoding for protobufs (instead of [encoding/json]) // https://protobuf.dev/programming-guides/proto3/#json var b []byte b, err = protojson.MarshalOptions{ AllowPartial: true, // protobuf defaults to camel case for JSON encoding; use proto field name instead (snake case) UseProtoNames: true, }.Marshal(m) if err == nil { // the protojson marshaller tries to unmarshal anypb.Any fields, which can // fail for types encoded with "github.com/containerd/typeurl/v2" // we can try creating a dedicated protoregistry.MessageTypeResolver that uses typeurl, but, its // more robust to fall back on json marshalling for errors in general return b, nil } } buf := &bytes.Buffer{} enc := json.NewEncoder(buf) enc.SetEscapeHTML(false) enc.SetIndent("", "") if jErr := enc.Encode(v); jErr != nil { if err != nil { return nil, fmt.Errorf("protojson encoding: %w; json encoding: %w", err, jErr) } return nil, fmt.Errorf("json encoding: %w", jErr) } // encoder.Encode appends a newline to the end return bytes.TrimSpace(buf.Bytes()), nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/log/hook.go ================================================ package log import ( "bytes" "reflect" "time" "github.com/Microsoft/hcsshim/internal/logfields" "github.com/sirupsen/logrus" "go.opencensus.io/trace" ) const nullString = "null" // Hook intercepts and formats a [logrus.Entry] before it logged. // // The shim either outputs the logs through an ETW hook, discarding the (formatted) output // or logs output to a pipe for logging binaries to consume. // The Linux GCS outputs logrus entries over stdout, which is then consumed and re-output // by the shim. type Hook struct { // EncodeAsJSON formats structs, maps, arrays, slices, and [bytes.Buffer] as JSON. // Variables of [bytes.Buffer] will be converted to []byte. // // Default is false. EncodeAsJSON bool // FormatTime specifies the format for [time.Time] variables. // An empty string disables formatting. // When disabled, the fall back will the JSON encoding, if enabled. // // Default is [TimeFormat]. TimeFormat string // Duration format converts a [time.Duration] fields to an appropriate encoding. // nil disables formatting. // When disabled, the fall back will the JSON encoding, if enabled. // // Default is [DurationFormatString], which appends a duration unit after the value. DurationFormat DurationFormat // AddSpanContext adds [logfields.TraceID] and [logfields.SpanID] fields to // the entry from the span context stored in [logrus.Entry.Context], if it exists. AddSpanContext bool } var _ logrus.Hook = &Hook{} func NewHook() *Hook { return &Hook{ TimeFormat: TimeFormat, DurationFormat: DurationFormatString, AddSpanContext: true, } } func (h *Hook) Levels() []logrus.Level { return logrus.AllLevels } func (h *Hook) Fire(e *logrus.Entry) (err error) { // JSON encode, if necessary, then add span information h.encode(e) h.addSpanContext(e) return nil } // encode loops through all the fields in the [logrus.Entry] and encodes them according to // the settings in [Hook]. // If [Hook.TimeFormat] is non-empty, it will be passed to [time.Time.Format] for // fields of type [time.Time]. // // If [Hook.EncodeAsJSON] is true, then fields that are not numeric, boolean, strings, or // errors will be encoded via a [json.Marshal] (with HTML escaping disabled). // Chanel- and function-typed fields, as well as unsafe pointers are left alone and not encoded. // // If [Hook.TimeFormat] and [Hook.DurationFormat] are empty and [Hook.EncodeAsJSON] is false, // then this is a no-op. func (h *Hook) encode(e *logrus.Entry) { d := e.Data formatTime := h.TimeFormat != "" formatDuration := h.DurationFormat != nil if !(h.EncodeAsJSON || formatTime || formatDuration) { return } for k, v := range d { // encode types with dedicated formatting options first if vv, ok := v.(time.Time); formatTime && ok { d[k] = vv.Format(h.TimeFormat) continue } if vv, ok := v.(time.Duration); formatDuration && ok { d[k] = h.DurationFormat(vv) continue } // general case JSON encoding if !h.EncodeAsJSON { continue } switch vv := v.(type) { // built in types // "json" marshals errors as "{}", so leave alone here case bool, string, error, uintptr, int8, int16, int32, int64, int, uint8, uint32, uint64, uint, float32, float64: continue // Rather than setting d[k] = vv.String(), JSON encode []byte value, since it // may be a binary payload and not representable as a string. // `case bytes.Buffer,*bytes.Buffer:` resolves `vv` to `interface{}`, // so cannot use `vv.Bytes`. // Could move to below the `reflect.Indirect()` call below, but // that would require additional typematching and dereferencing. // Easier to keep these duplicate branches here. case bytes.Buffer: v = vv.Bytes() case *bytes.Buffer: v = vv.Bytes() } // dereference pointer or interface variables rv := reflect.Indirect(reflect.ValueOf(v)) // check if `v` is a null pointer if !rv.IsValid() { d[k] = nullString continue } switch rv.Kind() { case reflect.Map, reflect.Struct, reflect.Array, reflect.Slice: default: // Bool, [U]?Int*, Float*, Complex*, Uintptr, String: encoded as normal // Chan, Func: not supported by json // Interface, Pointer: dereferenced above // UnsafePointer: not supported by json, not safe to de-reference; leave alone continue } b, err := encode(v) if err != nil { // Errors are written to stderr (ie, to `panic.log`) and stops the remaining // hooks (ie, exporting to ETW) from firing. So add encoding errors to // the entry data to be written out, but keep on processing. d[k+"-"+logrus.ErrorKey] = err.Error() // keep the original `v` as the value, continue } d[k] = string(b) } } func (h *Hook) addSpanContext(e *logrus.Entry) { ctx := e.Context if !h.AddSpanContext || ctx == nil { return } span := trace.FromContext(ctx) if span == nil { return } sctx := span.SpanContext() e.Data[logfields.TraceID] = sctx.TraceID.String() e.Data[logfields.SpanID] = sctx.SpanID.String() } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/log/nopformatter.go ================================================ package log import ( "github.com/sirupsen/logrus" ) type NopFormatter struct{} var _ logrus.Formatter = NopFormatter{} // Format does nothing and returns a nil slice. func (NopFormatter) Format(*logrus.Entry) ([]byte, error) { return nil, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/log/scrub.go ================================================ package log import ( "bytes" "encoding/json" "errors" "sync/atomic" hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" ) // This package scrubs objects of potentially sensitive information to pass to logging type genMap = map[string]interface{} type scrubberFunc func(genMap) error const _scrubbedReplacement = "" var ( ErrUnknownType = errors.New("encoded object is of unknown type") // case sensitive keywords, so "env" is not a substring on "Environment" _scrubKeywords = [][]byte{[]byte("env"), []byte("Environment")} _scrub atomic.Bool ) // SetScrubbing enables scrubbing func SetScrubbing(enable bool) { _scrub.Store(enable) } // IsScrubbingEnabled checks if scrubbing is enabled func IsScrubbingEnabled() bool { return _scrub.Load() } // ScrubProcessParameters scrubs HCS Create Process requests with config parameters of // type internal/hcs/schema2.ScrubProcessParameters (aka hcsshema.ScrubProcessParameters) func ScrubProcessParameters(s string) (string, error) { // todo: deal with v1 ProcessConfig b := []byte(s) if !IsScrubbingEnabled() || !hasKeywords(b) || !json.Valid(b) { return s, nil } pp := hcsschema.ProcessParameters{} if err := json.Unmarshal(b, &pp); err != nil { return "", err } pp.Environment = map[string]string{_scrubbedReplacement: _scrubbedReplacement} b, err := encode(pp) if err != nil { return "", err } return string(b), nil } // ScrubBridgeCreate scrubs requests sent over the bridge of type // internal/gcs/protocol.containerCreate wrapping an internal/hcsoci.linuxHostedSystem func ScrubBridgeCreate(b []byte) ([]byte, error) { return scrubBytes(b, scrubBridgeCreate) } func scrubBridgeCreate(m genMap) error { if !isRequestBase(m) { return ErrUnknownType } if ss, ok := m["ContainerConfig"]; ok { // ContainerConfig is a json encoded struct passed as a regular string field s, ok := ss.(string) if !ok { return ErrUnknownType } b, err := scrubBytes([]byte(s), scrubLinuxHostedSystem) if err != nil { return err } m["ContainerConfig"] = string(b) return nil } return ErrUnknownType } func scrubLinuxHostedSystem(m genMap) error { if m, ok := index(m, "OciSpecification"); ok { //nolint:govet // shadow if _, ok := m["annotations"]; ok { m["annotations"] = map[string]string{_scrubbedReplacement: _scrubbedReplacement} } if m, ok := index(m, "process"); ok { //nolint:govet // shadow if _, ok := m["env"]; ok { m["env"] = []string{_scrubbedReplacement} return nil } } } return ErrUnknownType } // ScrubBridgeExecProcess scrubs requests sent over the bridge of type // internal/gcs/protocol.containerExecuteProcess func ScrubBridgeExecProcess(b []byte) ([]byte, error) { return scrubBytes(b, scrubExecuteProcess) } func scrubExecuteProcess(m genMap) error { if !isRequestBase(m) { return ErrUnknownType } if m, ok := index(m, "Settings"); ok { //nolint:govet // shadow if ss, ok := m["ProcessParameters"]; ok { // ProcessParameters is a json encoded struct passed as a regular sting field s, ok := ss.(string) if !ok { return ErrUnknownType } s, err := ScrubProcessParameters(s) if err != nil { return err } m["ProcessParameters"] = s return nil } } return ErrUnknownType } func scrubBytes(b []byte, scrub scrubberFunc) ([]byte, error) { if !IsScrubbingEnabled() || !hasKeywords(b) || !json.Valid(b) { return b, nil } m := make(genMap) if err := json.Unmarshal(b, &m); err != nil { return nil, err } // could use regexp, but if the env strings contain braces, the regexp fails // parsing into individual structs would require access to private structs if err := scrub(m); err != nil { return nil, err } b, err := encode(m) if err != nil { return nil, err } return b, nil } func isRequestBase(m genMap) bool { // neither of these are (currently) `omitempty` _, a := m["ActivityId"] _, c := m["ContainerId"] return a && c } // combination `m, ok := m[s]` and `m, ok := m.(genMap)` func index(m genMap, s string) (genMap, bool) { if m, ok := m[s]; ok { mm, ok := m.(genMap) return mm, ok } return m, false } func hasKeywords(b []byte) bool { for _, bb := range _scrubKeywords { if bytes.Contains(b, bb) { return true } } return false } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go ================================================ package logfields const ( // Identifiers Name = "name" Namespace = "namespace" Operation = "operation" ID = "id" SandboxID = "sid" ContainerID = "cid" ExecID = "eid" ProcessID = "pid" TaskID = "tid" UVMID = "uvm-id" // networking and IO File = "file" Path = "path" Bytes = "bytes" Pipe = "pipe" // Common Misc Attempt = "attemptNo" JSON = "json" // Time StartTime = "startTime" EndTime = "endTime" Duration = "duration" Timeout = "timeout" // Keys/values Field = "field" Key = "key" OCIAnnotation = "oci-annotation" Value = "value" Options = "options" // Golang type's ExpectedType = "expected-type" Bool = "bool" Int32 = "int32" Uint32 = "uint32" Uint64 = "uint64" // runhcs VMShimOperation = "vmshim-op" // logging and tracing TraceID = "traceID" SpanID = "spanID" ParentSpanID = "parentSpanID" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/longpath/longpath.go ================================================ package longpath import ( "path/filepath" "strings" ) // LongAbs makes a path absolute and returns it in NT long path form. func LongAbs(path string) (string, error) { if strings.HasPrefix(path, `\\?\`) || strings.HasPrefix(path, `\\.\`) { return path, nil } if !filepath.IsAbs(path) { absPath, err := filepath.Abs(path) if err != nil { return "", err } path = absPath } if strings.HasPrefix(path, `\\`) { return `\\?\UNC\` + path[2:], nil } return `\\?\` + path, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go ================================================ package memory import ( "github.com/pkg/errors" ) const ( minimumClassSize = MiB maximumClassSize = 4 * GiB memoryClassNumber = 7 ) var ( ErrInvalidMemoryClass = errors.New("invalid memory class") ErrEarlyMerge = errors.New("not all children have been freed") ErrEmptyPoolOperation = errors.New("operation on empty pool") ) // GetMemoryClassType returns the minimum memory class type that can hold a device of // a given size. The smallest class is 1MB and the largest one is 4GB with 2 bit offset // intervals in between, for a total of 7 different classes. This function does not // do a validity check func GetMemoryClassType(s uint64) classType { s = (s - 1) >> 20 memCls := uint32(0) for s > 0 { s = s >> 2 memCls++ } return classType(memCls) } // GetMemoryClassSize returns size in bytes for a given memory class func GetMemoryClassSize(memCls classType) (uint64, error) { if memCls >= memoryClassNumber { return 0, ErrInvalidMemoryClass } return minimumClassSize << (2 * memCls), nil } // region represents a contiguous memory block type region struct { // parent region that has been split into 4 parent *region class classType // offset represents offset in bytes offset uint64 } // memoryPool tracks free and busy (used) memory regions type memoryPool struct { free map[uint64]*region busy map[uint64]*region } // PoolAllocator implements a memory allocation strategy similar to buddy-malloc https://github.com/evanw/buddy-malloc/blob/master/buddy-malloc.c // We borrow the idea of spanning a tree of fixed size regions on top of a contiguous memory // space. // // There are a total of 7 different region sizes that can be allocated, with the smallest // being 1MB and the largest 4GB (the default maximum size of a Virtual PMem device). // // For efficiency and to reduce fragmentation an entire region is allocated when requested. // When there's no available region of requested size, we try to allocate more memory for // this particular size by splitting the next available larger region into smaller ones, e.g. // if there's no region available for size class 0, we try splitting a region from class 1, // then class 2 etc, until we are able to do so or hit the upper limit. type PoolAllocator struct { pools [memoryClassNumber]*memoryPool } var _ MappedRegion = ®ion{} var _ Allocator = &PoolAllocator{} func (r *region) Offset() uint64 { return r.offset } func (r *region) Size() uint64 { sz, err := GetMemoryClassSize(r.class) if err != nil { panic(err) } return sz } func (r *region) Type() classType { return r.class } func newEmptyMemoryPool() *memoryPool { return &memoryPool{ free: make(map[uint64]*region), busy: make(map[uint64]*region), } } func NewPoolMemoryAllocator() PoolAllocator { pa := PoolAllocator{} p := newEmptyMemoryPool() // by default we allocate a single region with maximum possible size (class type) p.free[0] = ®ion{ class: memoryClassNumber - 1, offset: 0, } pa.pools[memoryClassNumber-1] = p return pa } // Allocate checks memory region pool for the given `size` and returns a free region with // minimal offset, if none available tries expanding matched memory pool. // // Internally it's done via moving a region from free pool into a busy pool func (pa *PoolAllocator) Allocate(size uint64) (MappedRegion, error) { memCls := GetMemoryClassType(size) if memCls >= memoryClassNumber { return nil, ErrInvalidMemoryClass } // find region with the smallest offset nextCls, nextOffset, err := pa.findNextOffset(memCls) if err != nil { return nil, err } // this means that there are no more regions for the current class, try expanding if nextCls != memCls { if err := pa.split(memCls); err != nil { if errors.Is(err, ErrInvalidMemoryClass) { return nil, ErrNotEnoughSpace } return nil, err } } if err := pa.markBusy(memCls, nextOffset); err != nil { return nil, err } // by this point memory pool for memCls should have been created, // either prior or during split call if r := pa.pools[memCls].busy[nextOffset]; r != nil { return r, nil } return nil, ErrNotEnoughSpace } // Release marks a memory region of class `memCls` and offset `offset` as free and tries to merge smaller regions into // a bigger one. func (pa *PoolAllocator) Release(reg MappedRegion) error { mp := pa.pools[reg.Type()] if mp == nil { return ErrEmptyPoolOperation } err := pa.markFree(reg.Type(), reg.Offset()) if err != nil { return err } n := mp.free[reg.Offset()] if n == nil { return ErrNotAllocated } if err := pa.merge(n.parent); err != nil { if !errors.Is(err, ErrEarlyMerge) { return err } } return nil } // findNextOffset finds next region location for a given memCls func (pa *PoolAllocator) findNextOffset(memCls classType) (classType, uint64, error) { for mc := memCls; mc < memoryClassNumber; mc++ { pi := pa.pools[mc] if pi == nil || len(pi.free) == 0 { continue } target := uint64(maximumClassSize) for offset := range pi.free { if offset < target { target = offset } } return mc, target, nil } return 0, 0, ErrNotEnoughSpace } // split tries to recursively split a bigger memory region into smaller ones until it succeeds or hits the upper limit func (pa *PoolAllocator) split(clsType classType) error { nextClsType := clsType + 1 if nextClsType >= memoryClassNumber { return ErrInvalidMemoryClass } nextPool := pa.pools[nextClsType] if nextPool == nil { nextPool = newEmptyMemoryPool() pa.pools[nextClsType] = nextPool } cls, offset, err := pa.findNextOffset(nextClsType) if err != nil { return err } // not enough memory in the next class, try to recursively expand if cls != nextClsType { if err := pa.split(nextClsType); err != nil { return err } } if err := pa.markBusy(nextClsType, offset); err != nil { return err } // memCls validity has been checked already, we can ignore the error clsSize, _ := GetMemoryClassSize(clsType) nextReg := nextPool.busy[offset] if nextReg == nil { return ErrNotAllocated } // expand memCls cp := pa.pools[clsType] if cp == nil { cp = newEmptyMemoryPool() pa.pools[clsType] = cp } // create 4 smaller regions for i := uint64(0); i < 4; i++ { offset := nextReg.offset + i*clsSize reg := ®ion{ parent: nextReg, class: clsType, offset: offset, } cp.free[offset] = reg } return nil } func (pa *PoolAllocator) merge(parent *region) error { // nothing to merge if parent == nil { return nil } childCls := parent.class - 1 childPool := pa.pools[childCls] // no child nodes to merge, try to merge parent if childPool == nil { return pa.merge(parent.parent) } childSize, err := GetMemoryClassSize(childCls) if err != nil { return err } // check if all the child nodes are free var children []*region for i := uint64(0); i < 4; i++ { child, free := childPool.free[parent.offset+i*childSize] if !free { return ErrEarlyMerge } children = append(children, child) } // at this point all the child nodes will be free and we can merge for _, child := range children { delete(childPool.free, child.offset) } if err := pa.markFree(parent.class, parent.offset); err != nil { return err } return pa.merge(parent.parent) } // markFree internally moves a region with `offset` from busy to free map func (pa *PoolAllocator) markFree(memCls classType, offset uint64) error { clsPool := pa.pools[memCls] if clsPool == nil { return ErrEmptyPoolOperation } if reg, exists := clsPool.busy[offset]; exists { clsPool.free[offset] = reg delete(clsPool.busy, offset) return nil } return ErrNotAllocated } // markBusy internally moves a region with `offset` from free to busy map func (pa *PoolAllocator) markBusy(memCls classType, offset uint64) error { clsPool := pa.pools[memCls] if clsPool == nil { return ErrEmptyPoolOperation } if reg, exists := clsPool.free[offset]; exists { clsPool.busy[offset] = reg delete(clsPool.free, offset) return nil } return ErrNotAllocated } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/memory/types.go ================================================ package memory import "github.com/pkg/errors" type classType uint32 const ( MiB = 1024 * 1024 GiB = 1024 * MiB ) var ( ErrNotEnoughSpace = errors.New("not enough space") ErrNotAllocated = errors.New("no memory allocated at the given offset") ) // MappedRegion represents a memory block with an offset type MappedRegion interface { Offset() uint64 Size() uint64 Type() classType } // Allocator is an interface for memory allocation type Allocator interface { Allocate(uint64) (MappedRegion, error) Release(MappedRegion) error } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/mergemaps/merge.go ================================================ package mergemaps import "encoding/json" // Merge recursively merges map `fromMap` into map `ToMap`. Any pre-existing values // in ToMap are overwritten. Values in fromMap are added to ToMap. // From http://stackoverflow.com/questions/40491438/merging-two-json-strings-in-golang func Merge(fromMap, ToMap interface{}) interface{} { switch fromMap := fromMap.(type) { case map[string]interface{}: ToMap, ok := ToMap.(map[string]interface{}) if !ok { return fromMap } for keyToMap, valueToMap := range ToMap { if valueFromMap, ok := fromMap[keyToMap]; ok { fromMap[keyToMap] = Merge(valueFromMap, valueToMap) } else { fromMap[keyToMap] = valueToMap } } case nil: // merge(nil, map[string]interface{...}) -> map[string]interface{...} ToMap, ok := ToMap.(map[string]interface{}) if ok { return ToMap } } return fromMap } // MergeJSON merges the contents of a JSON string into an object representation, // returning a new object suitable for translating to JSON. func MergeJSON(object interface{}, additionalJSON []byte) (interface{}, error) { if len(additionalJSON) == 0 { return object, nil } objectJSON, err := json.Marshal(object) if err != nil { return nil, err } var objectMap, newMap map[string]interface{} err = json.Unmarshal(objectJSON, &objectMap) if err != nil { return nil, err } err = json.Unmarshal(additionalJSON, &newMap) if err != nil { return nil, err } return Merge(newMap, objectMap), nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/oc/errors.go ================================================ package oc import ( "errors" "io" "net" "os" errdefs "github.com/containerd/errdefs/pkg/errgrpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) // todo: break import cycle with "internal/hcs/errors.go" and reference errors defined there // todo: add errors defined in "internal/guest/gcserror" (Hresult does not implement error) func toStatusCode(err error) codes.Code { // checks if err implements GRPCStatus() *"google.golang.org/grpc/status".Status, // wraps an error defined in "github.com/containerd/errdefs", or is a // context timeout or cancelled error if s, ok := status.FromError(errdefs.ToGRPC(err)); ok { return s.Code() } switch { // case isAny(err): // return codes.Cancelled case isAny(err, os.ErrInvalid): return codes.InvalidArgument case isAny(err, os.ErrDeadlineExceeded): return codes.DeadlineExceeded case isAny(err, os.ErrNotExist): return codes.NotFound case isAny(err, os.ErrExist): return codes.AlreadyExists case isAny(err, os.ErrPermission): return codes.PermissionDenied // case isAny(err): // return codes.ResourceExhausted case isAny(err, os.ErrClosed, net.ErrClosed, io.ErrClosedPipe, io.ErrShortBuffer): return codes.FailedPrecondition // case isAny(err): // return codes.Aborted // case isAny(err): // return codes.OutOfRange // case isAny(err): // return codes.Unimplemented case isAny(err, io.ErrNoProgress): return codes.Internal // case isAny(err): // return codes.Unavailable case isAny(err, io.ErrShortWrite, io.ErrUnexpectedEOF): return codes.DataLoss // case isAny(err): // return codes.Unauthenticated default: return codes.Unknown } } // isAny returns true if errors.Is is true for any of the provided errors, errs. func isAny(err error, errs ...error) bool { for _, e := range errs { if errors.Is(err, e) { return true } } return false } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/oc/exporter.go ================================================ package oc import ( "github.com/sirupsen/logrus" "go.opencensus.io/trace" "google.golang.org/grpc/codes" "github.com/Microsoft/hcsshim/internal/log" "github.com/Microsoft/hcsshim/internal/logfields" ) const spanMessage = "Span" var _errorCodeKey = logrus.ErrorKey + "Code" // LogrusExporter is an OpenCensus `trace.Exporter` that exports // `trace.SpanData` to logrus output. type LogrusExporter struct{} var _ trace.Exporter = &LogrusExporter{} // ExportSpan exports `s` based on the the following rules: // // 1. All output will contain `s.Attributes`, `s.SpanKind`, `s.TraceID`, // `s.SpanID`, and `s.ParentSpanID` for correlation // // 2. Any calls to .Annotate will not be supported. // // 3. The span itself will be written at `logrus.InfoLevel` unless // `s.Status.Code != 0` in which case it will be written at `logrus.ErrorLevel` // providing `s.Status.Message` as the error value. func (le *LogrusExporter) ExportSpan(s *trace.SpanData) { if s.DroppedAnnotationCount > 0 { logrus.WithFields(logrus.Fields{ "name": s.Name, logfields.TraceID: s.TraceID.String(), logfields.SpanID: s.SpanID.String(), "dropped": s.DroppedAttributeCount, "maxAttributes": len(s.Attributes), }).Warning("span had dropped attributes") } entry := log.L.Dup() // Combine all span annotations with span data (eg, trace ID, span ID, parent span ID, // error, status code) // (OC) Span attributes are guaranteed to be strings, bools, or int64s, so we can // can skip overhead in entry.WithFields() and add them directly to entry.Data. // Preallocate ahead of time, since we should add, at most, 10 additional entries data := make(logrus.Fields, len(entry.Data)+len(s.Attributes)+10) // Default log entry may have prexisting/application-wide data for k, v := range entry.Data { data[k] = v } for k, v := range s.Attributes { data[k] = v } data[logfields.Name] = s.Name data[logfields.TraceID] = s.TraceID.String() data[logfields.SpanID] = s.SpanID.String() data[logfields.ParentSpanID] = s.ParentSpanID.String() data[logfields.StartTime] = s.StartTime data[logfields.EndTime] = s.EndTime data[logfields.Duration] = s.EndTime.Sub(s.StartTime) if sk := spanKindToString(s.SpanKind); sk != "" { data["spanKind"] = sk } level := logrus.InfoLevel if s.Status.Code != 0 { level = logrus.ErrorLevel // don't overwrite an existing "error" or "errorCode" attributes if _, ok := data[logrus.ErrorKey]; !ok { data[logrus.ErrorKey] = s.Status.Message } if _, ok := data[_errorCodeKey]; !ok { data[_errorCodeKey] = codes.Code(s.Status.Code).String() } } entry.Data = data entry.Time = s.StartTime entry.Log(level, spanMessage) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/oc/span.go ================================================ package oc import ( "context" "github.com/Microsoft/hcsshim/internal/log" "go.opencensus.io/trace" ) var DefaultSampler = trace.AlwaysSample() // SetSpanStatus sets `span.SetStatus` to the proper status depending on `err`. If // `err` is `nil` assumes `trace.StatusCodeOk`. func SetSpanStatus(span *trace.Span, err error) { status := trace.Status{} if err != nil { status.Code = int32(toStatusCode(err)) status.Message = err.Error() } span.SetStatus(status) } // StartSpan wraps "go.opencensus.io/trace".StartSpan, but, if the span is sampling, // adds a log entry to the context that points to the newly created span. func StartSpan(ctx context.Context, name string, o ...trace.StartOption) (context.Context, *trace.Span) { ctx, s := trace.StartSpan(ctx, name, o...) return update(ctx, s) } // StartSpanWithRemoteParent wraps "go.opencensus.io/trace".StartSpanWithRemoteParent. // // See StartSpan for more information. func StartSpanWithRemoteParent(ctx context.Context, name string, parent trace.SpanContext, o ...trace.StartOption) (context.Context, *trace.Span) { ctx, s := trace.StartSpanWithRemoteParent(ctx, name, parent, o...) return update(ctx, s) } func update(ctx context.Context, s *trace.Span) (context.Context, *trace.Span) { if s.IsRecordingEvents() { ctx = log.UpdateContext(ctx) } return ctx, s } var WithServerSpanKind = trace.WithSpanKind(trace.SpanKindServer) var WithClientSpanKind = trace.WithSpanKind(trace.SpanKindClient) func spanKindToString(sk int) string { switch sk { case trace.SpanKindClient: return "client" case trace.SpanKindServer: return "server" default: return "" } } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/protocol/guestrequest/types.go ================================================ package guestrequest // These are constants for v2 schema modify requests. type RequestType string type ResourceType string // RequestType const. const ( RequestTypeAdd RequestType = "Add" RequestTypeRemove RequestType = "Remove" RequestTypePreAdd RequestType = "PreAdd" // For networking RequestTypeUpdate RequestType = "Update" ) type SignalValueWCOW string const ( SignalValueWCOWCtrlC SignalValueWCOW = "CtrlC" SignalValueWCOWCtrlBreak SignalValueWCOW = "CtrlBreak" SignalValueWCOWCtrlClose SignalValueWCOW = "CtrlClose" SignalValueWCOWCtrlLogOff SignalValueWCOW = "CtrlLogOff" SignalValueWCOWCtrlShutdown SignalValueWCOW = "CtrlShutdown" ) // ModificationRequest is for modify commands passed to the guest. type ModificationRequest struct { RequestType RequestType `json:"RequestType,omitempty"` ResourceType ResourceType `json:"ResourceType,omitempty"` Settings interface{} `json:"Settings,omitempty"` } type NetworkModifyRequest struct { AdapterId string `json:"AdapterId,omitempty"` //nolint:stylecheck RequestType RequestType `json:"RequestType,omitempty"` Settings interface{} `json:"Settings,omitempty"` } type RS4NetworkModifyRequest struct { AdapterInstanceId string `json:"AdapterInstanceId,omitempty"` //nolint:stylecheck RequestType RequestType `json:"RequestType,omitempty"` Settings interface{} `json:"Settings,omitempty"` } var ( // V5 GUIDs for SCSI controllers // These GUIDs are created with namespace GUID "d422512d-2bf2-4752-809d-7b82b5fcb1b4" // and index as names. For example, first GUID is created like this: // guid.NewV5("d422512d-2bf2-4752-809d-7b82b5fcb1b4", []byte("0")) ScsiControllerGuids = []string{ "df6d0690-79e5-55b6-a5ec-c1e2f77f580a", "0110f83b-de10-5172-a266-78bca56bf50a", "b5d2d8d4-3a75-51bf-945b-3444dc6b8579", "305891a9-b251-5dfe-91a2-c25d9212275b", } ) // constants for v2 schema ProcessModifyRequest // Operation type for [hcsschema.ProcessModifyRequest]. type ProcessModifyOperation string const ( ModifyProcessConsoleSize ProcessModifyOperation = "ConsoleSize" CloseProcessHandle ProcessModifyOperation = "CloseHandle" ) // Standard IO handle(s) to close for [hcsschema.CloseHandle] in [hcsschema.ProcessModifyRequest]. type STDIOHandle string const ( STDInHandle STDIOHandle = "StdIn" STDOutHandle STDIOHandle = "StdOut" STDErrHandle STDIOHandle = "StdErr" AllHandles STDIOHandle = "All" ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go ================================================ package queue import ( "errors" "sync" ) var ErrQueueClosed = errors.New("the queue is closed for reading and writing") // MessageQueue represents a threadsafe message queue to be used to retrieve or // write messages to. type MessageQueue struct { m *sync.RWMutex c *sync.Cond messages []interface{} closed bool } // NewMessageQueue returns a new MessageQueue. func NewMessageQueue() *MessageQueue { m := &sync.RWMutex{} return &MessageQueue{ m: m, c: sync.NewCond(m), messages: []interface{}{}, } } // Enqueue writes `msg` to the queue. func (mq *MessageQueue) Enqueue(msg interface{}) error { mq.m.Lock() defer mq.m.Unlock() if mq.closed { return ErrQueueClosed } mq.messages = append(mq.messages, msg) // Signal a waiter that there is now a value available in the queue. mq.c.Signal() return nil } // Dequeue will read a value from the queue and remove it. If the queue // is empty, this will block until the queue is closed or a value gets enqueued. func (mq *MessageQueue) Dequeue() (interface{}, error) { mq.m.Lock() defer mq.m.Unlock() for !mq.closed && mq.size() == 0 { mq.c.Wait() } // We got woken up, check if it's because the queue got closed. if mq.closed { return nil, ErrQueueClosed } val := mq.messages[0] mq.messages[0] = nil mq.messages = mq.messages[1:] return val, nil } // Size returns the size of the queue. func (mq *MessageQueue) Size() int { mq.m.RLock() defer mq.m.RUnlock() return mq.size() } // Nonexported size check to check if the queue is empty inside already locked functions. func (mq *MessageQueue) size() int { return len(mq.messages) } // Close closes the queue for future writes or reads. Any attempts to read or write from the // queue after close will return ErrQueueClosed. This is safe to call multiple times. func (mq *MessageQueue) Close() { mq.m.Lock() defer mq.m.Unlock() // Already closed, noop if mq.closed { return } mq.messages = nil mq.closed = true // If there's anybody currently waiting on a value from Dequeue, we need to // broadcast so the read(s) can return ErrQueueClosed. mq.c.Broadcast() } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/safefile/do.go ================================================ package safefile ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go ================================================ //go:build windows package safefile import ( "errors" "io" "os" "path/filepath" "strings" "syscall" "unicode/utf16" "unsafe" "github.com/Microsoft/hcsshim/internal/longpath" "github.com/Microsoft/hcsshim/internal/winapi" winio "github.com/Microsoft/go-winio" ) func OpenRoot(path string) (*os.File, error) { longpath, err := longpath.LongAbs(path) if err != nil { return nil, err } return winio.OpenForBackup(longpath, syscall.GENERIC_READ, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, syscall.OPEN_EXISTING) } func cleanGoStringRelativePath(path string) (string, error) { path = filepath.Clean(path) if strings.Contains(path, ":") { // Since alternate data streams must follow the file they // are attached to, finding one here (out of order) is invalid. return "", errors.New("path contains invalid character `:`") } fspath := filepath.FromSlash(path) if len(fspath) > 0 && fspath[0] == '\\' { return "", errors.New("expected relative path") } return fspath, nil } func ntRelativePath(path string) ([]uint16, error) { fspath, err := cleanGoStringRelativePath(path) if err != nil { return nil, err } path16 := utf16.Encode(([]rune)(fspath)) if len(path16) > 32767 { return nil, syscall.ENAMETOOLONG } return path16, nil } // openRelativeInternal opens a relative path from the given root, failing if // any of the intermediate path components are reparse points. func openRelativeInternal(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) { var ( h uintptr iosb winapi.IOStatusBlock oa winapi.ObjectAttributes ) cleanRelativePath, err := cleanGoStringRelativePath(path) if err != nil { return nil, err } if root == nil || root.Fd() == 0 { return nil, errors.New("missing root directory") } pathUnicode, err := winapi.NewUnicodeString(cleanRelativePath) if err != nil { return nil, err } oa.Length = unsafe.Sizeof(oa) oa.ObjectName = pathUnicode oa.RootDirectory = uintptr(root.Fd()) oa.Attributes = winapi.OBJ_DONT_REPARSE status := winapi.NtCreateFile( &h, accessMask|syscall.SYNCHRONIZE, &oa, &iosb, nil, 0, shareFlags, createDisposition, winapi.FILE_OPEN_FOR_BACKUP_INTENT|winapi.FILE_SYNCHRONOUS_IO_NONALERT|flags, nil, 0, ) if status != 0 { return nil, winapi.RtlNtStatusToDosError(status) } fullPath, err := longpath.LongAbs(filepath.Join(root.Name(), path)) if err != nil { syscall.Close(syscall.Handle(h)) return nil, err } return os.NewFile(h, fullPath), nil } // OpenRelative opens a relative path from the given root, failing if // any of the intermediate path components are reparse points. func OpenRelative(path string, root *os.File, accessMask uint32, shareFlags uint32, createDisposition uint32, flags uint32) (*os.File, error) { f, err := openRelativeInternal(path, root, accessMask, shareFlags, createDisposition, flags) if err != nil { err = &os.PathError{Op: "open", Path: filepath.Join(root.Name(), path), Err: err} } return f, err } // LinkRelative creates a hard link from oldname to newname (relative to oldroot // and newroot), failing if any of the intermediate path components are reparse // points. func LinkRelative(oldname string, oldroot *os.File, newname string, newroot *os.File) error { // Open the old file. oldf, err := openRelativeInternal( oldname, oldroot, syscall.FILE_WRITE_ATTRIBUTES, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, winapi.FILE_OPEN, 0, ) if err != nil { return &os.LinkError{Op: "link", Old: filepath.Join(oldroot.Name(), oldname), New: filepath.Join(newroot.Name(), newname), Err: err} } defer oldf.Close() // Open the parent of the new file. var parent *os.File parentPath := filepath.Dir(newname) if parentPath != "." { parent, err = openRelativeInternal( parentPath, newroot, syscall.GENERIC_READ, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, winapi.FILE_OPEN, winapi.FILE_DIRECTORY_FILE) if err != nil { return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: err} } defer parent.Close() fi, err := winio.GetFileBasicInfo(parent) if err != nil { return err } if (fi.FileAttributes & syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 { return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(newroot.Name(), newname), Err: winapi.RtlNtStatusToDosError(winapi.STATUS_REPARSE_POINT_ENCOUNTERED)} } } else { parent = newroot } // Issue an NT call to create the link. This will be safe because NT will // not open any more directories to create the link, so it cannot walk any // more reparse points. newbase := filepath.Base(newname) newbase16, err := ntRelativePath(newbase) if err != nil { return err } size := int(unsafe.Offsetof(winapi.FileLinkInformation{}.FileName)) + len(newbase16)*2 linkinfoBuffer := winapi.LocalAlloc(0, size) defer winapi.LocalFree(linkinfoBuffer) linkinfo := (*winapi.FileLinkInformation)(unsafe.Pointer(linkinfoBuffer)) linkinfo.RootDirectory = parent.Fd() linkinfo.FileNameLength = uint32(len(newbase16) * 2) copy(winapi.Uint16BufferToSlice(&linkinfo.FileName[0], len(newbase16)), newbase16) var iosb winapi.IOStatusBlock status := winapi.NtSetInformationFile( oldf.Fd(), &iosb, linkinfoBuffer, uint32(size), winapi.FileLinkInformationClass, ) if status != 0 { return &os.LinkError{Op: "link", Old: oldf.Name(), New: filepath.Join(parent.Name(), newbase), Err: winapi.RtlNtStatusToDosError(status)} } return nil } // deleteOnClose marks a file to be deleted when the handle is closed. func deleteOnClose(f *os.File) error { disposition := winapi.FileDispositionInformationEx{Flags: winapi.FILE_DISPOSITION_DELETE} var iosb winapi.IOStatusBlock status := winapi.NtSetInformationFile( f.Fd(), &iosb, uintptr(unsafe.Pointer(&disposition)), uint32(unsafe.Sizeof(disposition)), winapi.FileDispositionInformationExClass, ) if status != 0 { return winapi.RtlNtStatusToDosError(status) } return nil } // clearReadOnly clears the readonly attribute on a file. func clearReadOnly(f *os.File) error { bi, err := winio.GetFileBasicInfo(f) if err != nil { return err } if bi.FileAttributes&syscall.FILE_ATTRIBUTE_READONLY == 0 { return nil } sbi := winio.FileBasicInfo{ FileAttributes: bi.FileAttributes &^ syscall.FILE_ATTRIBUTE_READONLY, } if sbi.FileAttributes == 0 { sbi.FileAttributes = syscall.FILE_ATTRIBUTE_NORMAL } return winio.SetFileBasicInfo(f, &sbi) } // RemoveRelative removes a file or directory relative to a root, failing if any // intermediate path components are reparse points. func RemoveRelative(path string, root *os.File) error { f, err := openRelativeInternal( path, root, winapi.FILE_READ_ATTRIBUTES|winapi.FILE_WRITE_ATTRIBUTES|winapi.DELETE, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, winapi.FILE_OPEN, winapi.FILE_OPEN_REPARSE_POINT) if err == nil { defer f.Close() err = deleteOnClose(f) if err == syscall.ERROR_ACCESS_DENIED { //nolint:errorlint // Maybe the file is marked readonly. Clear the bit and retry. _ = clearReadOnly(f) err = deleteOnClose(f) } } if err != nil { return &os.PathError{Op: "remove", Path: filepath.Join(root.Name(), path), Err: err} } return nil } // RemoveAllRelative removes a directory tree relative to a root, failing if any // intermediate path components are reparse points. func RemoveAllRelative(path string, root *os.File) error { fi, err := LstatRelative(path, root) if err != nil { if os.IsNotExist(err) { return nil } return err } fileAttributes := fi.Sys().(*syscall.Win32FileAttributeData).FileAttributes if fileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY == 0 || fileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 { // If this is a reparse point, it can't have children. Simple remove will do. err := RemoveRelative(path, root) if err == nil || os.IsNotExist(err) { return nil } return err } // It is necessary to use os.Open as Readdirnames does not work with // OpenRelative. This is safe because the above LstatRelative fails // if the target is outside the root, and we know this is not a // symlink from the above FILE_ATTRIBUTE_REPARSE_POINT check. fd, err := os.Open(filepath.Join(root.Name(), path)) if err != nil { if os.IsNotExist(err) { // Race. It was deleted between the Lstat and Open. // Return nil per RemoveAll's docs. return nil } return err } // Remove contents & return first error. for { names, err1 := fd.Readdirnames(100) for _, name := range names { if err2 := RemoveAllRelative(path+string(os.PathSeparator)+name, root); err == nil { err = err2 } } if err1 == io.EOF { // Readdirnames has no more files to return break } // If Readdirnames returned an error, use it. if err == nil { err = err1 } if len(names) == 0 { break } } fd.Close() // Remove directory. err1 := RemoveRelative(path, root) if err1 == nil || os.IsNotExist(err1) { return nil } if err == nil { err = err1 } return err } // MkdirRelative creates a directory relative to a root, failing if any // intermediate path components are reparse points. func MkdirRelative(path string, root *os.File) error { f, err := openRelativeInternal( path, root, 0, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, winapi.FILE_CREATE, winapi.FILE_DIRECTORY_FILE) if err == nil { f.Close() } else { err = &os.PathError{Op: "mkdir", Path: filepath.Join(root.Name(), path), Err: err} } return err } // MkdirAllRelative creates each directory in the path relative to a root, failing if // any existing intermediate path components are reparse points. func MkdirAllRelative(path string, root *os.File) error { pathParts := strings.Split(filepath.Clean(path), (string)(filepath.Separator)) for index := range pathParts { partialPath := filepath.Join(pathParts[0 : index+1]...) stat, err := LstatRelative(partialPath, root) if err != nil { if os.IsNotExist(err) { if err := MkdirRelative(partialPath, root); err != nil { return err } continue } return err } if !stat.IsDir() { fullPath := filepath.Join(root.Name(), partialPath) return &os.PathError{Op: "mkdir", Path: fullPath, Err: syscall.ENOTDIR} } } return nil } // LstatRelative performs a stat operation on a file relative to a root, failing // if any intermediate path components are reparse points. func LstatRelative(path string, root *os.File) (os.FileInfo, error) { f, err := openRelativeInternal( path, root, winapi.FILE_READ_ATTRIBUTES, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, winapi.FILE_OPEN, winapi.FILE_OPEN_REPARSE_POINT) if err != nil { return nil, &os.PathError{Op: "stat", Path: filepath.Join(root.Name(), path), Err: err} } defer f.Close() return f.Stat() } // EnsureNotReparsePointRelative validates that a given file (relative to a // root) and all intermediate path components are not a reparse points. func EnsureNotReparsePointRelative(path string, root *os.File) error { // Perform an open with OBJ_DONT_REPARSE but without specifying FILE_OPEN_REPARSE_POINT. f, err := OpenRelative( path, root, 0, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, winapi.FILE_OPEN, 0) if err != nil { return err } f.Close() return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/security/grantvmgroupaccess.go ================================================ //go:build windows // +build windows package security import ( "fmt" "os" "syscall" "unsafe" ) type ( accessMask uint32 accessMode uint32 desiredAccess uint32 inheritMode uint32 objectType uint32 shareMode uint32 securityInformation uint32 trusteeForm uint32 trusteeType uint32 ) type explicitAccess struct { accessPermissions accessMask accessMode accessMode inheritance inheritMode trustee trustee } type trustee struct { multipleTrustee *trustee multipleTrusteeOperation int32 trusteeForm trusteeForm trusteeType trusteeType name uintptr } const ( AccessMaskNone accessMask = 0 AccessMaskRead accessMask = 1 << 31 // GENERIC_READ AccessMaskWrite accessMask = 1 << 30 // GENERIC_WRITE AccessMaskExecute accessMask = 1 << 29 // GENERIC_EXECUTE AccessMaskAll accessMask = 1 << 28 // GENERIC_ALL accessMaskDesiredPermission = AccessMaskRead accessModeGrant accessMode = 1 desiredAccessReadControl desiredAccess = 0x20000 desiredAccessWriteDac desiredAccess = 0x40000 gvmga = "GrantVmGroupAccess:" inheritModeNoInheritance inheritMode = 0x0 inheritModeSubContainersAndObjectsInherit inheritMode = 0x3 objectTypeFileObject objectType = 0x1 securityInformationDACL securityInformation = 0x4 shareModeRead shareMode = 0x1 shareModeWrite shareMode = 0x2 //nolint:stylecheck // ST1003 sidVmGroup = "S-1-5-83-0" trusteeFormIsSid trusteeForm = 0 trusteeTypeWellKnownGroup trusteeType = 5 ) // GrantVmGroupAccess sets the DACL for a specified file or directory to // include Grant ACE entries for the VM Group SID. This is a golang re- // implementation of the same function in vmcompute, just not exported in // RS5. Which kind of sucks. Sucks a lot :/ func GrantVmGroupAccess(name string) error { //nolint:stylecheck // ST1003 return GrantVmGroupAccessWithMask(name, accessMaskDesiredPermission) } // GrantVmGroupAccessWithMask sets the desired DACL for a specified file or // directory. func GrantVmGroupAccessWithMask(name string, access accessMask) error { //nolint:stylecheck // ST1003 if access == 0 || access<<4 != 0 { return fmt.Errorf("invalid access mask: 0x%08x", access) } // Stat (to determine if `name` is a directory). s, err := os.Stat(name) if err != nil { return fmt.Errorf("%s os.Stat %s: %w", gvmga, name, err) } // Get a handle to the file/directory. Must defer Close on success. fd, err := createFile(name, s.IsDir()) if err != nil { return err // Already wrapped } defer func() { _ = syscall.CloseHandle(fd) }() // Get the current DACL and Security Descriptor. Must defer LocalFree on success. ot := objectTypeFileObject si := securityInformationDACL sd := uintptr(0) origDACL := uintptr(0) if err := getSecurityInfo(fd, uint32(ot), uint32(si), nil, nil, &origDACL, nil, &sd); err != nil { return fmt.Errorf("%s GetSecurityInfo %s: %w", gvmga, name, err) } defer func() { _, _ = syscall.LocalFree((syscall.Handle)(unsafe.Pointer(sd))) }() // Generate a new DACL which is the current DACL with the required ACEs added. // Must defer LocalFree on success. newDACL, err := generateDACLWithAcesAdded(name, s.IsDir(), access, origDACL) if err != nil { return err // Already wrapped } defer func() { _, _ = syscall.LocalFree((syscall.Handle)(unsafe.Pointer(newDACL))) }() // And finally use SetSecurityInfo to apply the updated DACL. if err := setSecurityInfo(fd, uint32(ot), uint32(si), uintptr(0), uintptr(0), newDACL, uintptr(0)); err != nil { return fmt.Errorf("%s SetSecurityInfo %s: %w", gvmga, name, err) } return nil } // createFile is a helper function to call [Nt]CreateFile to get a handle to // the file or directory. func createFile(name string, isDir bool) (syscall.Handle, error) { namep, err := syscall.UTF16FromString(name) if err != nil { return 0, fmt.Errorf("syscall.UTF16FromString %s: %w", name, err) } da := uint32(desiredAccessReadControl | desiredAccessWriteDac) sm := uint32(shareModeRead | shareModeWrite) fa := uint32(syscall.FILE_ATTRIBUTE_NORMAL) if isDir { fa = uint32(fa | syscall.FILE_FLAG_BACKUP_SEMANTICS) } fd, err := syscall.CreateFile(&namep[0], da, sm, nil, syscall.OPEN_EXISTING, fa, 0) if err != nil { return 0, fmt.Errorf("%s syscall.CreateFile %s: %w", gvmga, name, err) } return fd, nil } // generateDACLWithAcesAdded generates a new DACL with the two needed ACEs added. // The caller is responsible for LocalFree of the returned DACL on success. func generateDACLWithAcesAdded(name string, isDir bool, desiredAccess accessMask, origDACL uintptr) (uintptr, error) { // Generate pointers to the SIDs based on the string SIDs sid, err := syscall.StringToSid(sidVmGroup) if err != nil { return 0, fmt.Errorf("%s syscall.StringToSid %s %s: %w", gvmga, name, sidVmGroup, err) } inheritance := inheritModeNoInheritance if isDir { inheritance = inheritModeSubContainersAndObjectsInherit } eaArray := []explicitAccess{ { accessPermissions: desiredAccess, accessMode: accessModeGrant, inheritance: inheritance, trustee: trustee{ trusteeForm: trusteeFormIsSid, trusteeType: trusteeTypeWellKnownGroup, name: uintptr(unsafe.Pointer(sid)), }, }, } modifiedDACL := uintptr(0) if err := setEntriesInAcl(uintptr(uint32(1)), uintptr(unsafe.Pointer(&eaArray[0])), origDACL, &modifiedDACL); err != nil { return 0, fmt.Errorf("%s SetEntriesInAcl %s: %w", gvmga, name, err) } return modifiedDACL, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/security/syscall_windows.go ================================================ package security //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go syscall_windows.go //sys getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (win32err error) = advapi32.GetSecurityInfo //sys setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (win32err error) = advapi32.SetSecurityInfo //sys setEntriesInAcl(count uintptr, pListOfEEs uintptr, oldAcl uintptr, newAcl *uintptr) (win32err error) = advapi32.SetEntriesInAclW ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/security/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package security import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") procGetSecurityInfo = modadvapi32.NewProc("GetSecurityInfo") procSetEntriesInAclW = modadvapi32.NewProc("SetEntriesInAclW") procSetSecurityInfo = modadvapi32.NewProc("SetSecurityInfo") ) func getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (win32err error) { r0, _, _ := syscall.SyscallN(procGetSecurityInfo.Addr(), uintptr(handle), uintptr(objectType), uintptr(si), uintptr(unsafe.Pointer(ppsidOwner)), uintptr(unsafe.Pointer(ppsidGroup)), uintptr(unsafe.Pointer(ppDacl)), uintptr(unsafe.Pointer(ppSacl)), uintptr(unsafe.Pointer(ppSecurityDescriptor))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func setEntriesInAcl(count uintptr, pListOfEEs uintptr, oldAcl uintptr, newAcl *uintptr) (win32err error) { r0, _, _ := syscall.SyscallN(procSetEntriesInAclW.Addr(), uintptr(count), uintptr(pListOfEEs), uintptr(oldAcl), uintptr(unsafe.Pointer(newAcl))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (win32err error) { r0, _, _ := syscall.SyscallN(procSetSecurityInfo.Addr(), uintptr(handle), uintptr(objectType), uintptr(si), uintptr(psidOwner), uintptr(psidGroup), uintptr(pDacl), uintptr(pSacl)) if r0 != 0 { win32err = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/timeout/timeout.go ================================================ package timeout import ( "os" "strconv" "time" ) var ( // defaultTimeout is the timeout for most operations that is not overridden. defaultTimeout = 4 * time.Minute // defaultTimeoutTestdRetry is the retry loop timeout for testd to respond // for a disk to come online in LCOW. defaultTimeoutTestdRetry = 5 * time.Second ) // External variables for HCSShim consumers to use. var ( // SystemCreate is the timeout for creating a compute system SystemCreate time.Duration = defaultTimeout // SystemStart is the timeout for starting a compute system SystemStart time.Duration = defaultTimeout // SystemPause is the timeout for pausing a compute system SystemPause time.Duration = defaultTimeout // SystemResume is the timeout for resuming a compute system SystemResume time.Duration = defaultTimeout // SystemSave is the timeout for saving a compute system SystemSave time.Duration = defaultTimeout // SyscallWatcher is the timeout before warning of a potential stuck platform syscall. SyscallWatcher time.Duration = defaultTimeout // Tar2VHD is the timeout for the tar2vhd operation to complete Tar2VHD time.Duration = defaultTimeout // ExternalCommandToStart is the timeout for external commands to start ExternalCommandToStart = defaultTimeout // ExternalCommandToComplete is the timeout for external commands to complete. // Generally this means copying data from their stdio pipes. ExternalCommandToComplete = defaultTimeout // TestDRetryLoop is the timeout for testd retry loop when onlining a SCSI disk in LCOW TestDRetryLoop = defaultTimeoutTestdRetry ) func init() { SystemCreate = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMCREATE", SystemCreate) SystemStart = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMSTART", SystemStart) SystemPause = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMPAUSE", SystemPause) SystemResume = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMRESUME", SystemResume) SystemSave = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSTEMSAVE", SystemSave) SyscallWatcher = durationFromEnvironment("HCSSHIM_TIMEOUT_SYSCALLWATCHER", SyscallWatcher) Tar2VHD = durationFromEnvironment("HCSSHIM_TIMEOUT_TAR2VHD", Tar2VHD) ExternalCommandToStart = durationFromEnvironment("HCSSHIM_TIMEOUT_EXTERNALCOMMANDSTART", ExternalCommandToStart) ExternalCommandToComplete = durationFromEnvironment("HCSSHIM_TIMEOUT_EXTERNALCOMMANDCOMPLETE", ExternalCommandToComplete) TestDRetryLoop = durationFromEnvironment("HCSSHIM_TIMEOUT_TESTDRETRYLOOP", TestDRetryLoop) } func durationFromEnvironment(env string, defaultValue time.Duration) time.Duration { envTimeout := os.Getenv(env) if len(envTimeout) > 0 { e, err := strconv.Atoi(envTimeout) if err == nil && e > 0 { return time.Second * time.Duration(e) } } return defaultValue } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/vmcompute/doc.go ================================================ package vmcompute ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go ================================================ //go:build windows package vmcompute import ( gcontext "context" "syscall" "time" "github.com/sirupsen/logrus" "go.opencensus.io/trace" "github.com/Microsoft/hcsshim/internal/interop" "github.com/Microsoft/hcsshim/internal/log" "github.com/Microsoft/hcsshim/internal/logfields" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/internal/timeout" ) //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go vmcompute.go //sys hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) = vmcompute.HcsEnumerateComputeSystems? //sys hcsCreateComputeSystem(id string, configuration string, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) = vmcompute.HcsCreateComputeSystem? //sys hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) = vmcompute.HcsOpenComputeSystem? //sys hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) = vmcompute.HcsCloseComputeSystem? //sys hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsStartComputeSystem? //sys hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsShutdownComputeSystem? //sys hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsTerminateComputeSystem? //sys hcsPauseComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsPauseComputeSystem? //sys hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsResumeComputeSystem? //sys hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetComputeSystemProperties? //sys hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) = vmcompute.HcsModifyComputeSystem? //sys hcsModifyServiceSettings(settings string, result **uint16) (hr error) = vmcompute.HcsModifyServiceSettings? //sys hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterComputeSystemCallback? //sys hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterComputeSystemCallback? //sys hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) = vmcompute.HcsSaveComputeSystem? //sys hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) = vmcompute.HcsCreateProcess? //sys hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) = vmcompute.HcsOpenProcess? //sys hcsCloseProcess(process HcsProcess) (hr error) = vmcompute.HcsCloseProcess? //sys hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) = vmcompute.HcsTerminateProcess? //sys hcsSignalProcess(process HcsProcess, options string, result **uint16) (hr error) = vmcompute.HcsSignalProcess? //sys hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) = vmcompute.HcsGetProcessInfo? //sys hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) = vmcompute.HcsGetProcessProperties? //sys hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) = vmcompute.HcsModifyProcess? //sys hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) = vmcompute.HcsGetServiceProperties? //sys hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) = vmcompute.HcsRegisterProcessCallback? //sys hcsUnregisterProcessCallback(callbackHandle HcsCallback) (hr error) = vmcompute.HcsUnregisterProcessCallback? // errVmcomputeOperationPending is an error encountered when the operation is being completed asynchronously const errVmcomputeOperationPending = syscall.Errno(0xC0370103) // HcsSystem is the handle associated with a created compute system. type HcsSystem syscall.Handle // HcsProcess is the handle associated with a created process in a compute // system. type HcsProcess syscall.Handle // HcsCallback is the handle associated with the function to call when events // occur. type HcsCallback syscall.Handle // HcsProcessInformation is the structure used when creating or getting process // info. type HcsProcessInformation struct { // ProcessId is the pid of the created process. ProcessId uint32 _ uint32 // reserved padding // StdInput is the handle associated with the stdin of the process. StdInput syscall.Handle // StdOutput is the handle associated with the stdout of the process. StdOutput syscall.Handle // StdError is the handle associated with the stderr of the process. StdError syscall.Handle } func execute(ctx gcontext.Context, timeout time.Duration, f func() error) error { now := time.Now() if timeout > 0 { var cancel gcontext.CancelFunc ctx, cancel = gcontext.WithTimeout(ctx, timeout) defer cancel() } // if ctx already has prior deadlines, the shortest timeout takes precedence and is used. // find the true timeout for reporting // // this is mostly an issue with (*UtilityVM).Start(context.Context), which sets its // own (2 minute) timeout. deadline, ok := ctx.Deadline() trueTimeout := timeout if ok { trueTimeout = deadline.Sub(now) log.G(ctx).WithFields(logrus.Fields{ logfields.Timeout: trueTimeout, "desiredTimeout": timeout, }).Trace("Executing syscall with deadline") } done := make(chan error, 1) go func() { done <- f() }() select { case <-ctx.Done(): if ctx.Err() == gcontext.DeadlineExceeded { log.G(ctx).WithField(logfields.Timeout, trueTimeout). Warning("Syscall did not complete within operation timeout. This may indicate a platform issue. " + "If it appears to be making no forward progress, obtain the stacks and see if there is a syscall " + "stuck in the platform API for a significant length of time.") } return ctx.Err() case err := <-done: return err } } func HcsEnumerateComputeSystems(ctx gcontext.Context, query string) (computeSystems, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsEnumerateComputeSystems") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() span.AddAttributes(trace.StringAttribute("query", query)) return computeSystems, result, execute(ctx, timeout.SyscallWatcher, func() error { var ( computeSystemsp *uint16 resultp *uint16 ) err := hcsEnumerateComputeSystems(query, &computeSystemsp, &resultp) if computeSystemsp != nil { computeSystems = interop.ConvertAndFreeCoTaskMemString(computeSystemsp) } if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsCreateComputeSystem(ctx gcontext.Context, id string, configuration string, identity syscall.Handle) (computeSystem HcsSystem, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsCreateComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() span.AddAttributes( trace.StringAttribute("id", id), trace.StringAttribute("configuration", configuration)) return computeSystem, result, execute(ctx, timeout.SystemCreate, func() error { var resultp *uint16 err := hcsCreateComputeSystem(id, configuration, identity, &computeSystem, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsOpenComputeSystem(ctx gcontext.Context, id string) (computeSystem HcsSystem, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsOpenComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() return computeSystem, result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsOpenComputeSystem(id, &computeSystem, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsCloseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem) (hr error) { ctx, span := oc.StartSpan(ctx, "HcsCloseComputeSystem") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() return execute(ctx, timeout.SyscallWatcher, func() error { return hcsCloseComputeSystem(computeSystem) }) } func HcsStartComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsStartComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() span.AddAttributes(trace.StringAttribute("options", options)) return result, execute(ctx, timeout.SystemStart, func() error { var resultp *uint16 err := hcsStartComputeSystem(computeSystem, options, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsShutdownComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsShutdownComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() span.AddAttributes(trace.StringAttribute("options", options)) return result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsShutdownComputeSystem(computeSystem, options, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsTerminateComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsTerminateComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() span.AddAttributes(trace.StringAttribute("options", options)) return result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsTerminateComputeSystem(computeSystem, options, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsPauseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsPauseComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() span.AddAttributes(trace.StringAttribute("options", options)) return result, execute(ctx, timeout.SystemPause, func() error { var resultp *uint16 err := hcsPauseComputeSystem(computeSystem, options, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsResumeComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsResumeComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() span.AddAttributes(trace.StringAttribute("options", options)) return result, execute(ctx, timeout.SystemResume, func() error { var resultp *uint16 err := hcsResumeComputeSystem(computeSystem, options, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsGetComputeSystemProperties(ctx gcontext.Context, computeSystem HcsSystem, propertyQuery string) (properties, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsGetComputeSystemProperties") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() span.AddAttributes(trace.StringAttribute("propertyQuery", propertyQuery)) return properties, result, execute(ctx, timeout.SyscallWatcher, func() error { var ( propertiesp *uint16 resultp *uint16 ) err := hcsGetComputeSystemProperties(computeSystem, propertyQuery, &propertiesp, &resultp) if propertiesp != nil { properties = interop.ConvertAndFreeCoTaskMemString(propertiesp) } if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsModifyComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, configuration string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsModifyComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() span.AddAttributes(trace.StringAttribute("configuration", configuration)) return result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsModifyComputeSystem(computeSystem, configuration, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsModifyServiceSettings(ctx gcontext.Context, settings string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsModifyServiceSettings") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() span.AddAttributes(trace.StringAttribute("settings", settings)) return result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsModifyServiceSettings(settings, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsRegisterComputeSystemCallback(ctx gcontext.Context, computeSystem HcsSystem, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) { ctx, span := oc.StartSpan(ctx, "HcsRegisterComputeSystemCallback") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() return callbackHandle, execute(ctx, timeout.SyscallWatcher, func() error { return hcsRegisterComputeSystemCallback(computeSystem, callback, context, &callbackHandle) }) } func HcsUnregisterComputeSystemCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) { ctx, span := oc.StartSpan(ctx, "HcsUnregisterComputeSystemCallback") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() return execute(ctx, timeout.SyscallWatcher, func() error { return hcsUnregisterComputeSystemCallback(callbackHandle) }) } func HcsCreateProcess(ctx gcontext.Context, computeSystem HcsSystem, processParameters string) (processInformation HcsProcessInformation, process HcsProcess, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsCreateProcess") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() if span.IsRecordingEvents() { // wont handle v1 process parameters if s, err := log.ScrubProcessParameters(processParameters); err == nil { span.AddAttributes(trace.StringAttribute("processParameters", s)) } } return processInformation, process, result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsCreateProcess(computeSystem, processParameters, &processInformation, &process, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsOpenProcess(ctx gcontext.Context, computeSystem HcsSystem, pid uint32) (process HcsProcess, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsOpenProcess") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() span.AddAttributes(trace.Int64Attribute("pid", int64(pid))) return process, result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsOpenProcess(computeSystem, pid, &process, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsCloseProcess(ctx gcontext.Context, process HcsProcess) (hr error) { ctx, span := oc.StartSpan(ctx, "HcsCloseProcess") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() return execute(ctx, timeout.SyscallWatcher, func() error { return hcsCloseProcess(process) }) } func HcsTerminateProcess(ctx gcontext.Context, process HcsProcess) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsTerminateProcess") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() return result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsTerminateProcess(process, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsSignalProcess(ctx gcontext.Context, process HcsProcess, options string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsSignalProcess") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() span.AddAttributes(trace.StringAttribute("options", options)) return result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsSignalProcess(process, options, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsGetProcessInfo(ctx gcontext.Context, process HcsProcess) (processInformation HcsProcessInformation, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsGetProcessInfo") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() return processInformation, result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsGetProcessInfo(process, &processInformation, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsGetProcessProperties(ctx gcontext.Context, process HcsProcess) (processProperties, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsGetProcessProperties") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() return processProperties, result, execute(ctx, timeout.SyscallWatcher, func() error { var ( processPropertiesp *uint16 resultp *uint16 ) err := hcsGetProcessProperties(process, &processPropertiesp, &resultp) if processPropertiesp != nil { processProperties = interop.ConvertAndFreeCoTaskMemString(processPropertiesp) } if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsModifyProcess(ctx gcontext.Context, process HcsProcess, settings string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsModifyProcess") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() span.AddAttributes(trace.StringAttribute("settings", settings)) return result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsModifyProcess(process, settings, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsGetServiceProperties(ctx gcontext.Context, propertyQuery string) (properties, result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsGetServiceProperties") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } oc.SetSpanStatus(span, hr) }() span.AddAttributes(trace.StringAttribute("propertyQuery", propertyQuery)) return properties, result, execute(ctx, timeout.SyscallWatcher, func() error { var ( propertiesp *uint16 resultp *uint16 ) err := hcsGetServiceProperties(propertyQuery, &propertiesp, &resultp) if propertiesp != nil { properties = interop.ConvertAndFreeCoTaskMemString(propertiesp) } if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } func HcsRegisterProcessCallback(ctx gcontext.Context, process HcsProcess, callback uintptr, context uintptr) (callbackHandle HcsCallback, hr error) { ctx, span := oc.StartSpan(ctx, "HcsRegisterProcessCallback") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() return callbackHandle, execute(ctx, timeout.SyscallWatcher, func() error { return hcsRegisterProcessCallback(process, callback, context, &callbackHandle) }) } func HcsUnregisterProcessCallback(ctx gcontext.Context, callbackHandle HcsCallback) (hr error) { ctx, span := oc.StartSpan(ctx, "HcsUnregisterProcessCallback") defer span.End() defer func() { oc.SetSpanStatus(span, hr) }() return execute(ctx, timeout.SyscallWatcher, func() error { return hcsUnregisterProcessCallback(callbackHandle) }) } func HcsSaveComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options string) (result string, hr error) { ctx, span := oc.StartSpan(ctx, "HcsSaveComputeSystem") defer span.End() defer func() { if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() return result, execute(ctx, timeout.SyscallWatcher, func() error { var resultp *uint16 err := hcsSaveComputeSystem(computeSystem, options, &resultp) if resultp != nil { result = interop.ConvertAndFreeCoTaskMemString(resultp) } return err }) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/vmcompute/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package vmcompute import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modvmcompute = windows.NewLazySystemDLL("vmcompute.dll") procHcsCloseComputeSystem = modvmcompute.NewProc("HcsCloseComputeSystem") procHcsCloseProcess = modvmcompute.NewProc("HcsCloseProcess") procHcsCreateComputeSystem = modvmcompute.NewProc("HcsCreateComputeSystem") procHcsCreateProcess = modvmcompute.NewProc("HcsCreateProcess") procHcsEnumerateComputeSystems = modvmcompute.NewProc("HcsEnumerateComputeSystems") procHcsGetComputeSystemProperties = modvmcompute.NewProc("HcsGetComputeSystemProperties") procHcsGetProcessInfo = modvmcompute.NewProc("HcsGetProcessInfo") procHcsGetProcessProperties = modvmcompute.NewProc("HcsGetProcessProperties") procHcsGetServiceProperties = modvmcompute.NewProc("HcsGetServiceProperties") procHcsModifyComputeSystem = modvmcompute.NewProc("HcsModifyComputeSystem") procHcsModifyProcess = modvmcompute.NewProc("HcsModifyProcess") procHcsModifyServiceSettings = modvmcompute.NewProc("HcsModifyServiceSettings") procHcsOpenComputeSystem = modvmcompute.NewProc("HcsOpenComputeSystem") procHcsOpenProcess = modvmcompute.NewProc("HcsOpenProcess") procHcsPauseComputeSystem = modvmcompute.NewProc("HcsPauseComputeSystem") procHcsRegisterComputeSystemCallback = modvmcompute.NewProc("HcsRegisterComputeSystemCallback") procHcsRegisterProcessCallback = modvmcompute.NewProc("HcsRegisterProcessCallback") procHcsResumeComputeSystem = modvmcompute.NewProc("HcsResumeComputeSystem") procHcsSaveComputeSystem = modvmcompute.NewProc("HcsSaveComputeSystem") procHcsShutdownComputeSystem = modvmcompute.NewProc("HcsShutdownComputeSystem") procHcsSignalProcess = modvmcompute.NewProc("HcsSignalProcess") procHcsStartComputeSystem = modvmcompute.NewProc("HcsStartComputeSystem") procHcsTerminateComputeSystem = modvmcompute.NewProc("HcsTerminateComputeSystem") procHcsTerminateProcess = modvmcompute.NewProc("HcsTerminateProcess") procHcsUnregisterComputeSystemCallback = modvmcompute.NewProc("HcsUnregisterComputeSystemCallback") procHcsUnregisterProcessCallback = modvmcompute.NewProc("HcsUnregisterProcessCallback") ) func hcsCloseComputeSystem(computeSystem HcsSystem) (hr error) { hr = procHcsCloseComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsCloseComputeSystem.Addr(), uintptr(computeSystem)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsCloseProcess(process HcsProcess) (hr error) { hr = procHcsCloseProcess.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsCloseProcess.Addr(), uintptr(process)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsCreateComputeSystem(id string, configuration string, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(configuration) if hr != nil { return } return _hcsCreateComputeSystem(_p0, _p1, identity, computeSystem, result) } func _hcsCreateComputeSystem(id *uint16, configuration *uint16, identity syscall.Handle, computeSystem *HcsSystem, result **uint16) (hr error) { hr = procHcsCreateComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsCreateComputeSystem.Addr(), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(configuration)), uintptr(identity), uintptr(unsafe.Pointer(computeSystem)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsCreateProcess(computeSystem HcsSystem, processParameters string, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(processParameters) if hr != nil { return } return _hcsCreateProcess(computeSystem, _p0, processInformation, process, result) } func _hcsCreateProcess(computeSystem HcsSystem, processParameters *uint16, processInformation *HcsProcessInformation, process *HcsProcess, result **uint16) (hr error) { hr = procHcsCreateProcess.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsCreateProcess.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(processParameters)), uintptr(unsafe.Pointer(processInformation)), uintptr(unsafe.Pointer(process)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsEnumerateComputeSystems(query string, computeSystems **uint16, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(query) if hr != nil { return } return _hcsEnumerateComputeSystems(_p0, computeSystems, result) } func _hcsEnumerateComputeSystems(query *uint16, computeSystems **uint16, result **uint16) (hr error) { hr = procHcsEnumerateComputeSystems.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsEnumerateComputeSystems.Addr(), uintptr(unsafe.Pointer(query)), uintptr(unsafe.Pointer(computeSystems)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery string, properties **uint16, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(propertyQuery) if hr != nil { return } return _hcsGetComputeSystemProperties(computeSystem, _p0, properties, result) } func _hcsGetComputeSystemProperties(computeSystem HcsSystem, propertyQuery *uint16, properties **uint16, result **uint16) (hr error) { hr = procHcsGetComputeSystemProperties.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsGetComputeSystemProperties.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(propertyQuery)), uintptr(unsafe.Pointer(properties)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsGetProcessInfo(process HcsProcess, processInformation *HcsProcessInformation, result **uint16) (hr error) { hr = procHcsGetProcessInfo.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsGetProcessInfo.Addr(), uintptr(process), uintptr(unsafe.Pointer(processInformation)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsGetProcessProperties(process HcsProcess, processProperties **uint16, result **uint16) (hr error) { hr = procHcsGetProcessProperties.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsGetProcessProperties.Addr(), uintptr(process), uintptr(unsafe.Pointer(processProperties)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsGetServiceProperties(propertyQuery string, properties **uint16, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(propertyQuery) if hr != nil { return } return _hcsGetServiceProperties(_p0, properties, result) } func _hcsGetServiceProperties(propertyQuery *uint16, properties **uint16, result **uint16) (hr error) { hr = procHcsGetServiceProperties.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsGetServiceProperties.Addr(), uintptr(unsafe.Pointer(propertyQuery)), uintptr(unsafe.Pointer(properties)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsModifyComputeSystem(computeSystem HcsSystem, configuration string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(configuration) if hr != nil { return } return _hcsModifyComputeSystem(computeSystem, _p0, result) } func _hcsModifyComputeSystem(computeSystem HcsSystem, configuration *uint16, result **uint16) (hr error) { hr = procHcsModifyComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsModifyComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(configuration)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsModifyProcess(process HcsProcess, settings string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(settings) if hr != nil { return } return _hcsModifyProcess(process, _p0, result) } func _hcsModifyProcess(process HcsProcess, settings *uint16, result **uint16) (hr error) { hr = procHcsModifyProcess.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsModifyProcess.Addr(), uintptr(process), uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsModifyServiceSettings(settings string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(settings) if hr != nil { return } return _hcsModifyServiceSettings(_p0, result) } func _hcsModifyServiceSettings(settings *uint16, result **uint16) (hr error) { hr = procHcsModifyServiceSettings.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsModifyServiceSettings.Addr(), uintptr(unsafe.Pointer(settings)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsOpenComputeSystem(id string, computeSystem *HcsSystem, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _hcsOpenComputeSystem(_p0, computeSystem, result) } func _hcsOpenComputeSystem(id *uint16, computeSystem *HcsSystem, result **uint16) (hr error) { hr = procHcsOpenComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsOpenComputeSystem.Addr(), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(computeSystem)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsOpenProcess(computeSystem HcsSystem, pid uint32, process *HcsProcess, result **uint16) (hr error) { hr = procHcsOpenProcess.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsOpenProcess.Addr(), uintptr(computeSystem), uintptr(pid), uintptr(unsafe.Pointer(process)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsPauseComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsPauseComputeSystem(computeSystem, _p0, result) } func _hcsPauseComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { hr = procHcsPauseComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsPauseComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsRegisterComputeSystemCallback(computeSystem HcsSystem, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) { hr = procHcsRegisterComputeSystemCallback.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsRegisterComputeSystemCallback.Addr(), uintptr(computeSystem), uintptr(callback), uintptr(context), uintptr(unsafe.Pointer(callbackHandle))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsRegisterProcessCallback(process HcsProcess, callback uintptr, context uintptr, callbackHandle *HcsCallback) (hr error) { hr = procHcsRegisterProcessCallback.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsRegisterProcessCallback.Addr(), uintptr(process), uintptr(callback), uintptr(context), uintptr(unsafe.Pointer(callbackHandle))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsResumeComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsResumeComputeSystem(computeSystem, _p0, result) } func _hcsResumeComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { hr = procHcsResumeComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsResumeComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsSaveComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsSaveComputeSystem(computeSystem, _p0, result) } func _hcsSaveComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { hr = procHcsSaveComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsSaveComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsShutdownComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsShutdownComputeSystem(computeSystem, _p0, result) } func _hcsShutdownComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { hr = procHcsShutdownComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsShutdownComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsSignalProcess(process HcsProcess, options string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsSignalProcess(process, _p0, result) } func _hcsSignalProcess(process HcsProcess, options *uint16, result **uint16) (hr error) { hr = procHcsSignalProcess.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsSignalProcess.Addr(), uintptr(process), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsStartComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsStartComputeSystem(computeSystem, _p0, result) } func _hcsStartComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { hr = procHcsStartComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsStartComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsTerminateComputeSystem(computeSystem HcsSystem, options string, result **uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(options) if hr != nil { return } return _hcsTerminateComputeSystem(computeSystem, _p0, result) } func _hcsTerminateComputeSystem(computeSystem HcsSystem, options *uint16, result **uint16) (hr error) { hr = procHcsTerminateComputeSystem.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsTerminateComputeSystem.Addr(), uintptr(computeSystem), uintptr(unsafe.Pointer(options)), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsTerminateProcess(process HcsProcess, result **uint16) (hr error) { hr = procHcsTerminateProcess.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsTerminateProcess.Addr(), uintptr(process), uintptr(unsafe.Pointer(result))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsUnregisterComputeSystemCallback(callbackHandle HcsCallback) (hr error) { hr = procHcsUnregisterComputeSystemCallback.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsUnregisterComputeSystemCallback.Addr(), uintptr(callbackHandle)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func hcsUnregisterProcessCallback(callbackHandle HcsCallback) (hr error) { hr = procHcsUnregisterProcessCallback.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procHcsUnregisterProcessCallback.Addr(), uintptr(callbackHandle)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // ActivateLayer will find the layer with the given id and mount it's filesystem. // For a read/write layer, the mounted filesystem will appear as a volume on the // host, while a read-only layer is generally expected to be a no-op. // An activated layer must later be deactivated via DeactivateLayer. func ActivateLayer(ctx context.Context, path string) (err error) { title := "hcsshim::ActivateLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) err = activateLayer(&stdDriverInfo, path) if err != nil { return hcserror.New(err, title, "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go ================================================ //go:build windows package wclayer import ( "errors" "io" "os" "path/filepath" "strings" "syscall" "github.com/Microsoft/go-winio" "github.com/Microsoft/hcsshim/internal/longpath" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) type baseLayerReader struct { s *trace.Span root string result chan *fileEntry proceed chan bool currentFile *os.File backupReader *winio.BackupFileReader } func newBaseLayerReader(root string, s *trace.Span) (r *baseLayerReader) { r = &baseLayerReader{ s: s, root: root, result: make(chan *fileEntry), proceed: make(chan bool), } go r.walk() return r } func (r *baseLayerReader) walkUntilCancelled() error { root, err := longpath.LongAbs(r.root) if err != nil { return err } r.root = root err = filepath.Walk(filepath.Join(r.root, filesPath), func(path string, info os.FileInfo, err error) error { if err != nil { return err } // Indirect fix for https://github.com/moby/moby/issues/32838#issuecomment-343610048. // Handle failure from what may be a golang bug in the conversion of // UTF16 to UTF8 in files which are left in the recycle bin. Os.Lstat // which is called by filepath.Walk will fail when a filename contains // unicode characters. Skip the recycle bin regardless which is goodness. if strings.EqualFold(path, filepath.Join(r.root, `Files\$Recycle.Bin`)) && info.IsDir() { return filepath.SkipDir } r.result <- &fileEntry{path, info, nil} if !<-r.proceed { return errorIterationCanceled } return nil }) if err == errorIterationCanceled { //nolint:errorlint // explicitly returned return nil } if err != nil { return err } utilityVMAbsPath := filepath.Join(r.root, UtilityVMPath) utilityVMFilesAbsPath := filepath.Join(r.root, UtilityVMFilesPath) // Ignore a UtilityVM without Files, that's not _really_ a UtiltyVM if _, err = os.Lstat(utilityVMFilesAbsPath); err != nil { if os.IsNotExist(err) { return io.EOF } return err } err = filepath.Walk(utilityVMAbsPath, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if path != utilityVMAbsPath && path != utilityVMFilesAbsPath && !hasPathPrefix(path, utilityVMFilesAbsPath) { if info.IsDir() { return filepath.SkipDir } return nil } r.result <- &fileEntry{path, info, nil} if !<-r.proceed { return errorIterationCanceled } return nil }) if err == errorIterationCanceled { //nolint:errorlint // explicitly returned return nil } if err != nil { return err } return io.EOF } func (r *baseLayerReader) walk() { defer close(r.result) if !<-r.proceed { return } err := r.walkUntilCancelled() if err != nil { for { r.result <- &fileEntry{err: err} if !<-r.proceed { return } } } } func (r *baseLayerReader) reset() { if r.backupReader != nil { r.backupReader.Close() r.backupReader = nil } if r.currentFile != nil { r.currentFile.Close() r.currentFile = nil } } func (r *baseLayerReader) Next() (path string, size int64, fileInfo *winio.FileBasicInfo, err error) { r.reset() r.proceed <- true fe := <-r.result if fe == nil { err = errors.New("BaseLayerReader closed") return } if fe.err != nil { err = fe.err return } path, err = filepath.Rel(r.root, fe.path) if err != nil { return } f, err := openFileOrDir(fe.path, syscall.GENERIC_READ, syscall.OPEN_EXISTING) if err != nil { return } defer func() { if f != nil { f.Close() } }() fileInfo, err = winio.GetFileBasicInfo(f) if err != nil { return } size = fe.fi.Size() r.backupReader = winio.NewBackupFileReader(f, true) r.currentFile = f f = nil return } func (r *baseLayerReader) LinkInfo() (uint32, *winio.FileIDInfo, error) { fileStandardInfo, err := winio.GetFileStandardInfo(r.currentFile) if err != nil { return 0, nil, err } fileIDInfo, err := winio.GetFileID(r.currentFile) if err != nil { return 0, nil, err } return fileStandardInfo.NumberOfLinks, fileIDInfo, nil } func (r *baseLayerReader) Read(b []byte) (int, error) { if r.backupReader == nil { return 0, io.EOF } return r.backupReader.Read(b) } func (r *baseLayerReader) Close() (err error) { defer r.s.End() defer func() { oc.SetSpanStatus(r.s, err) close(r.proceed) }() r.proceed <- false // The r.result channel will be closed once walk() returns <-r.result r.reset() return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerwriter.go ================================================ //go:build windows package wclayer import ( "context" "errors" "os" "path/filepath" "syscall" "github.com/Microsoft/go-winio" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/internal/safefile" "github.com/Microsoft/hcsshim/internal/winapi" "go.opencensus.io/trace" ) type baseLayerWriter struct { ctx context.Context s *trace.Span root *os.File f *os.File bw *winio.BackupFileWriter err error hasUtilityVM bool dirInfo []dirInfo } type dirInfo struct { path string fileInfo winio.FileBasicInfo } // reapplyDirectoryTimes reapplies directory modification, creation, etc. times // after processing of the directory tree has completed. The times are expected // to be ordered such that parent directories come before child directories. func reapplyDirectoryTimes(root *os.File, dis []dirInfo) error { for i := range dis { di := &dis[len(dis)-i-1] // reverse order: process child directories first f, err := safefile.OpenRelative(di.path, root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_OPEN, winapi.FILE_DIRECTORY_FILE|syscall.FILE_FLAG_OPEN_REPARSE_POINT) if err != nil { return err } err = winio.SetFileBasicInfo(f, &di.fileInfo) f.Close() if err != nil { return err } } return nil } func (w *baseLayerWriter) closeCurrentFile() error { if w.f != nil { err := w.bw.Close() err2 := w.f.Close() w.f = nil w.bw = nil if err != nil { return err } if err2 != nil { return err2 } } return nil } func (w *baseLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) (err error) { defer func() { if err != nil { w.err = err } }() err = w.closeCurrentFile() if err != nil { return err } if filepath.ToSlash(name) == `UtilityVM/Files` { w.hasUtilityVM = true } var f *os.File defer func() { if f != nil { f.Close() } }() extraFlags := uint32(0) if fileInfo.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { extraFlags |= winapi.FILE_DIRECTORY_FILE w.dirInfo = append(w.dirInfo, dirInfo{name, *fileInfo}) } mode := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | winio.WRITE_DAC | winio.WRITE_OWNER | winio.ACCESS_SYSTEM_SECURITY) f, err = safefile.OpenRelative(name, w.root, mode, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, extraFlags) if err != nil { return hcserror.New(err, "Failed to safefile.OpenRelative", name) } err = winio.SetFileBasicInfo(f, fileInfo) if err != nil { return hcserror.New(err, "Failed to SetFileBasicInfo", name) } w.f = f w.bw = winio.NewBackupFileWriter(f, true) f = nil return nil } func (w *baseLayerWriter) AddLink(name string, target string) (err error) { defer func() { if err != nil { w.err = err } }() err = w.closeCurrentFile() if err != nil { return err } return safefile.LinkRelative(target, w.root, name, w.root) } func (w *baseLayerWriter) Remove(name string) error { return errors.New("base layer cannot have tombstones") } func (w *baseLayerWriter) Write(b []byte) (int, error) { n, err := w.bw.Write(b) if err != nil { w.err = err } return n, err } func (w *baseLayerWriter) Close() (err error) { defer w.s.End() defer func() { oc.SetSpanStatus(w.s, err) }() defer func() { w.root.Close() w.root = nil }() err = w.closeCurrentFile() if err != nil { return err } if w.err == nil { // Restore the file times of all the directories, since they may have // been modified by creating child directories. err = reapplyDirectoryTimes(w.root, w.dirInfo) if err != nil { return err } err = ProcessBaseLayer(w.ctx, w.root.Name()) if err != nil { return err } if w.hasUtilityVM { err := safefile.EnsureNotReparsePointRelative("UtilityVM", w.root) if err != nil { return err } err = ProcessUtilityVMImage(w.ctx, filepath.Join(w.root.Name(), "UtilityVM")) if err != nil { return err } } } return w.err } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go ================================================ //go:build windows package wclayer import ( "context" "fmt" "os" "path/filepath" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/longpath" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/internal/safefile" "github.com/Microsoft/hcsshim/internal/winapi" "github.com/pkg/errors" "go.opencensus.io/trace" "golang.org/x/sys/windows" ) var hiveNames = []string{"DEFAULT", "SAM", "SECURITY", "SOFTWARE", "SYSTEM"} // Ensure the given file exists as an ordinary file, and create a minimal hive file if not. func ensureHive(path string, root *os.File) (err error) { _, err = safefile.LstatRelative(path, root) if err != nil && !os.IsNotExist(err) { return fmt.Errorf("accessing %s: %w", path, err) } version := windows.RtlGetVersion() if version == nil { return fmt.Errorf("failed to get OS version") } var fullPath string fullPath, err = longpath.LongAbs(filepath.Join(root.Name(), path)) if err != nil { return fmt.Errorf("getting path: %w", err) } var key winapi.ORHKey err = winapi.ORCreateHive(&key) if err != nil { return fmt.Errorf("creating hive: %w", err) } defer func() { closeErr := winapi.ORCloseHive(key) if closeErr != nil && err == nil { err = fmt.Errorf("closing hive key: %w", closeErr) } }() err = winapi.ORSaveHive(key, fullPath, version.MajorVersion, version.MinorVersion) if err != nil { return fmt.Errorf("saving hive: %w", err) } return nil } func ensureBaseLayer(root *os.File) (hasUtilityVM bool, err error) { // The base layer registry hives will be copied from here const hiveSourcePath = "Files\\Windows\\System32\\config" if err = safefile.MkdirAllRelative(hiveSourcePath, root); err != nil { return } for _, hiveName := range hiveNames { hivePath := filepath.Join(hiveSourcePath, hiveName) if err = ensureHive(hivePath, root); err != nil { return } } stat, err := safefile.LstatRelative(UtilityVMFilesPath, root) if os.IsNotExist(err) { return false, nil } if err != nil { return } if !stat.Mode().IsDir() { fullPath := filepath.Join(root.Name(), UtilityVMFilesPath) return false, errors.Errorf("%s has unexpected file mode %s", fullPath, stat.Mode().String()) } const bcdRelativePath = "EFI\\Microsoft\\Boot\\BCD" // Just check that this exists as a regular file. If it exists but is not a valid registry hive, // ProcessUtilityVMImage will complain: // "The registry could not read in, or write out, or flush, one of the files that contain the system's image of the registry." bcdPath := filepath.Join(UtilityVMFilesPath, bcdRelativePath) stat, err = safefile.LstatRelative(bcdPath, root) if err != nil { return false, errors.Wrapf(err, "UtilityVM must contain '%s'", bcdRelativePath) } if !stat.Mode().IsRegular() { fullPath := filepath.Join(root.Name(), bcdPath) return false, errors.Errorf("%s has unexpected file mode %s", fullPath, stat.Mode().String()) } return true, nil } func convertToBaseLayer(ctx context.Context, root *os.File) error { hasUtilityVM, err := ensureBaseLayer(root) if err != nil { return err } if err := ProcessBaseLayer(ctx, root.Name()); err != nil { return err } if !hasUtilityVM { return nil } err = safefile.EnsureNotReparsePointRelative(UtilityVMPath, root) if err != nil { return err } utilityVMPath := filepath.Join(root.Name(), UtilityVMPath) return ProcessUtilityVMImage(ctx, utilityVMPath) } // ConvertToBaseLayer processes a candidate base layer, i.e. a directory // containing the desired file content under Files/, and optionally the // desired file content for a UtilityVM under UtilityVM/Files/ func ConvertToBaseLayer(ctx context.Context, path string) (err error) { title := "hcsshim::ConvertToBaseLayer" ctx, span := trace.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) root, err := safefile.OpenRoot(path) if err != nil { return hcserror.New(err, title+" - failed", "") } defer func() { if err2 := root.Close(); err == nil && err2 != nil { err = hcserror.New(err2, title+" - failed", "") } }() if err = convertToBaseLayer(ctx, root); err != nil { return hcserror.New(err, title+" - failed", "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // CreateLayer creates a new, empty, read-only layer on the filesystem based on // the parent layer provided. func CreateLayer(ctx context.Context, path, parent string) (err error) { title := "hcsshim::CreateLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("path", path), trace.StringAttribute("parent", parent)) err = createLayer(&stdDriverInfo, path, parent) if err != nil { return hcserror.New(err, title, "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go ================================================ //go:build windows package wclayer import ( "context" "strings" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // CreateScratchLayer creates and populates new read-write layer for use by a container. // This requires the full list of paths to all parent layers up to the base func CreateScratchLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) { title := "hcsshim::CreateScratchLayer" ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("path", path), trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) // Generate layer descriptors layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) if err != nil { return err } err = createSandboxLayer(&stdDriverInfo, path, 0, layers) if err != nil { return hcserror.New(err, title, "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // DeactivateLayer will dismount a layer that was mounted via ActivateLayer. func DeactivateLayer(ctx context.Context, path string) (err error) { title := "hcsshim::DeactivateLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) err = deactivateLayer(&stdDriverInfo, path) if err != nil { return hcserror.New(err, title+"- failed", "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // DestroyLayer will remove the on-disk files representing the layer with the given // path, including that layer's containing folder, if any. func DestroyLayer(ctx context.Context, path string) (err error) { title := "hcsshim::DestroyLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) err = destroyLayer(&stdDriverInfo, path) if err != nil { return hcserror.New(err, title, "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/doc.go ================================================ // Package wclayer provides bindings to HCS's legacy layer management API and // provides a higher level interface around these calls for container layer // management. package wclayer ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go ================================================ //go:build windows package wclayer import ( "context" "os" "path/filepath" "syscall" "unsafe" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // ExpandScratchSize expands the size of a layer to at least size bytes. func ExpandScratchSize(ctx context.Context, path string, size uint64) (err error) { title := "hcsshim::ExpandScratchSize" ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("path", path), trace.Int64Attribute("size", int64(size))) err = expandSandboxSize(&stdDriverInfo, path, size) if err != nil { return hcserror.New(err, title, "") } // Always expand the volume too. In case of legacy layers not expanding the volume here works because // the PrepareLayer call internally handles the expansion. However, in other cases (like CimFS) we // don't call PrepareLayer and so the volume will never be expanded. This also means in case of // legacy layers, we might have a small perf hit because the VHD is mounted twice for expansion (once // here and once during the PrepareLayer call). But as long as the perf hit is minimal, we should be // okay. err = expandSandboxVolume(ctx, path) if err != nil { return err } return nil } type virtualStorageType struct { DeviceID uint32 VendorID [16]byte } type openVersion2 struct { GetInfoOnly int32 // bool but 4-byte aligned ReadOnly int32 // bool but 4-byte aligned ResiliencyGUID [16]byte // GUID } type openVirtualDiskParameters struct { Version uint32 // Must always be set to 2 Version2 openVersion2 } func attachVhd(path string) (syscall.Handle, error) { var ( defaultType virtualStorageType handle syscall.Handle ) parameters := openVirtualDiskParameters{Version: 2} err := openVirtualDisk( &defaultType, path, 0, 0, ¶meters, &handle) if err != nil { return 0, &os.PathError{Op: "OpenVirtualDisk", Path: path, Err: err} } err = attachVirtualDisk(handle, 0, 0, 0, 0, 0) if err != nil { syscall.Close(handle) return 0, &os.PathError{Op: "AttachVirtualDisk", Path: path, Err: err} } return handle, nil } func expandSandboxVolume(ctx context.Context, path string) error { // Mount the sandbox VHD temporarily. vhdPath := filepath.Join(path, "sandbox.vhdx") vhd, err := attachVhd(vhdPath) if err != nil { return &os.PathError{Op: "OpenVirtualDisk", Path: vhdPath, Err: err} } defer syscall.Close(vhd) // Open the volume. volumePath, err := GetLayerMountPath(ctx, path) if err != nil { return err } if volumePath[len(volumePath)-1] == '\\' { volumePath = volumePath[:len(volumePath)-1] } volume, err := os.OpenFile(volumePath, os.O_RDWR, 0) if err != nil { return err } defer volume.Close() // Get the volume's underlying partition size in NTFS clusters. var ( partitionSize int64 bytes uint32 ) const _IOCTL_DISK_GET_LENGTH_INFO = 0x0007405C err = syscall.DeviceIoControl(syscall.Handle(volume.Fd()), _IOCTL_DISK_GET_LENGTH_INFO, nil, 0, (*byte)(unsafe.Pointer(&partitionSize)), 8, &bytes, nil) if err != nil { return &os.PathError{Op: "IOCTL_DISK_GET_LENGTH_INFO", Path: volume.Name(), Err: err} } const ( clusterSize = 4096 sectorSize = 512 ) targetClusters := partitionSize / clusterSize // Get the volume's current size in NTFS clusters. var volumeSize int64 err = getDiskFreeSpaceEx(volume.Name()+"\\", nil, &volumeSize, nil) if err != nil { return &os.PathError{Op: "GetDiskFreeSpaceEx", Path: volume.Name(), Err: err} } volumeClusters := volumeSize / clusterSize // Only resize the volume if there is space to grow, otherwise this will // fail with invalid parameter. NTFS reserves one cluster. if volumeClusters+1 < targetClusters { targetSectors := targetClusters * (clusterSize / sectorSize) const _FSCTL_EXTEND_VOLUME = 0x000900F0 err = syscall.DeviceIoControl(syscall.Handle(volume.Fd()), _FSCTL_EXTEND_VOLUME, (*byte)(unsafe.Pointer(&targetSectors)), 8, nil, 0, &bytes, nil) if err != nil { return &os.PathError{Op: "FSCTL_EXTEND_VOLUME", Path: volume.Name(), Err: err} } } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go ================================================ //go:build windows package wclayer import ( "context" "os" "strings" "github.com/Microsoft/go-winio" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // ExportLayer will create a folder at exportFolderPath and fill that folder with // the transport format version of the layer identified by layerId. This transport // format includes any metadata required for later importing the layer (using // ImportLayer), and requires the full list of parent layer paths in order to // perform the export. func ExportLayer(ctx context.Context, path string, exportFolderPath string, parentLayerPaths []string) (err error) { title := "hcsshim::ExportLayer" ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("path", path), trace.StringAttribute("exportFolderPath", exportFolderPath), trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) // Generate layer descriptors layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) if err != nil { return err } err = exportLayer(&stdDriverInfo, path, exportFolderPath, layers) if err != nil { return hcserror.New(err, title, "") } return nil } // LayerReader is an interface that supports reading an existing container image layer. type LayerReader interface { // Next advances to the next file and returns the name, size, and file info Next() (string, int64, *winio.FileBasicInfo, error) // LinkInfo returns the number of links and the file identifier for the current file. LinkInfo() (uint32, *winio.FileIDInfo, error) // Read reads data from the current file, in the format of a Win32 backup stream, and // returns the number of bytes read. Read(b []byte) (int, error) // Close finishes the layer reading process and releases any resources. Close() error } // NewLayerReader returns a new layer reader for reading the contents of an on-disk layer. // The caller must have taken the SeBackupPrivilege privilege // to call this and any methods on the resulting LayerReader. func NewLayerReader(ctx context.Context, path string, parentLayerPaths []string) (_ LayerReader, err error) { ctx, span := oc.StartSpan(ctx, "hcsshim::NewLayerReader") defer func() { if err != nil { oc.SetSpanStatus(span, err) span.End() } }() span.AddAttributes( trace.StringAttribute("path", path), trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) if len(parentLayerPaths) == 0 { // This is a base layer. It gets exported differently. return newBaseLayerReader(path, span), nil } exportPath, err := os.MkdirTemp("", "hcs") if err != nil { return nil, err } err = ExportLayer(ctx, path, exportPath, parentLayerPaths) if err != nil { os.RemoveAll(exportPath) return nil, err } return &legacyLayerReaderWrapper{ ctx: ctx, s: span, legacyLayerReader: newLegacyLayerReader(exportPath), }, nil } type legacyLayerReaderWrapper struct { ctx context.Context s *trace.Span *legacyLayerReader } func (r *legacyLayerReaderWrapper) Close() (err error) { defer r.s.End() defer func() { oc.SetSpanStatus(r.s, err) }() err = r.legacyLayerReader.Close() os.RemoveAll(r.root) return err } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go ================================================ //go:build windows package wclayer import ( "context" "syscall" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/log" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // GetLayerMountPath will look for a mounted layer with the given path and return // the path at which that layer can be accessed. This path may be a volume path // if the layer is a mounted read-write layer, otherwise it is expected to be the // folder path at which the layer is stored. func GetLayerMountPath(ctx context.Context, path string) (_ string, err error) { title := "hcsshim::GetLayerMountPath" ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) var mountPathLength uintptr = 0 // Call the procedure itself. log.G(ctx).Debug("Calling proc (1)") err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil) if err != nil { return "", hcserror.New(err, title, "(first call)") } // Allocate a mount path of the returned length. if mountPathLength == 0 { return "", nil } mountPathp := make([]uint16, mountPathLength) mountPathp[0] = 0 // Call the procedure again log.G(ctx).Debug("Calling proc (2)") err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0]) if err != nil { return "", hcserror.New(err, title, "(second call)") } mountPath := syscall.UTF16ToString(mountPathp[0:]) span.AddAttributes(trace.StringAttribute("mountPath", mountPath)) return mountPath, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/interop" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // GetSharedBaseImages will enumerate the images stored in the common central // image store and return descriptive info about those images for the purpose // of registering them with the graphdriver, graph, and tagstore. func GetSharedBaseImages(ctx context.Context) (_ string, err error) { title := "hcsshim::GetSharedBaseImages" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() var buffer *uint16 err = getBaseImages(&buffer) if err != nil { return "", hcserror.New(err, title, "") } imageData := interop.ConvertAndFreeCoTaskMemString(buffer) span.AddAttributes(trace.StringAttribute("imageData", imageData)) return imageData, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // GrantVmAccess adds access to a file for a given VM func GrantVmAccess(ctx context.Context, vmid string, filepath string) (err error) { title := "hcsshim::GrantVmAccess" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("vm-id", vmid), trace.StringAttribute("path", filepath)) err = grantVmAccess(vmid, filepath) if err != nil { return hcserror.New(err, title, "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go ================================================ //go:build windows package wclayer import ( "context" "os" "path/filepath" "strings" "github.com/Microsoft/go-winio" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "github.com/Microsoft/hcsshim/internal/safefile" "go.opencensus.io/trace" ) // ImportLayer will take the contents of the folder at importFolderPath and import // that into a layer with the id layerId. Note that in order to correctly populate // the layer and interperet the transport format, all parent layers must already // be present on the system at the paths provided in parentLayerPaths. func ImportLayer(ctx context.Context, path string, importFolderPath string, parentLayerPaths []string) (err error) { title := "hcsshim::ImportLayer" ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("path", path), trace.StringAttribute("importFolderPath", importFolderPath), trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) // Generate layer descriptors layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) if err != nil { return err } err = importLayer(&stdDriverInfo, path, importFolderPath, layers) if err != nil { return hcserror.New(err, title, "") } return nil } // LayerWriter is an interface that supports writing a new container image layer. type LayerWriter interface { // Add adds a file to the layer with given metadata. Add(name string, fileInfo *winio.FileBasicInfo) error // AddLink adds a hard link to the layer. The target must already have been added. AddLink(name string, target string) error // Remove removes a file that was present in a parent layer from the layer. Remove(name string) error // Write writes data to the current file. The data must be in the format of a Win32 // backup stream. Write(b []byte) (int, error) // Close finishes the layer writing process and releases any resources. Close() error } type legacyLayerWriterWrapper struct { ctx context.Context s *trace.Span *legacyLayerWriter path string parentLayerPaths []string } func (r *legacyLayerWriterWrapper) Close() (err error) { defer r.s.End() defer func() { oc.SetSpanStatus(r.s, err) }() defer os.RemoveAll(r.root.Name()) defer r.legacyLayerWriter.CloseRoots() err = r.legacyLayerWriter.Close() if err != nil { return err } if err = ImportLayer(r.ctx, r.destRoot.Name(), r.path, r.parentLayerPaths); err != nil { return err } for _, name := range r.Tombstones { if err = safefile.RemoveRelative(name, r.destRoot); err != nil && !os.IsNotExist(err) { return err } } // Add any hard links that were collected. for _, lnk := range r.PendingLinks { if err = safefile.RemoveRelative(lnk.Path, r.destRoot); err != nil && !os.IsNotExist(err) { return err } if err = safefile.LinkRelative(lnk.Target, lnk.TargetRoot, lnk.Path, r.destRoot); err != nil { return err } } // The reapplyDirectoryTimes must be called AFTER we are done with Tombstone // deletion and hard link creation. This is because Tombstone deletion and hard link // creation updates the directory last write timestamps so that will change the // timestamps added by the `Add` call. Some container applications depend on the // correctness of these timestamps and so we should change the timestamps back to // the original value (i.e the value provided in the Add call) after this // processing is done. err = reapplyDirectoryTimes(r.destRoot, r.changedDi) if err != nil { return err } // Prepare the utility VM for use if one is present in the layer. if r.HasUtilityVM { err := safefile.EnsureNotReparsePointRelative("UtilityVM", r.destRoot) if err != nil { return err } err = ProcessUtilityVMImage(r.ctx, filepath.Join(r.destRoot.Name(), "UtilityVM")) if err != nil { return err } } return nil } // NewLayerWriter returns a new layer writer for creating a layer on disk. // The caller must have taken the SeBackupPrivilege and SeRestorePrivilege privileges // to call this and any methods on the resulting LayerWriter. func NewLayerWriter(ctx context.Context, path string, parentLayerPaths []string) (_ LayerWriter, err error) { ctx, span := oc.StartSpan(ctx, "hcsshim::NewLayerWriter") defer func() { if err != nil { oc.SetSpanStatus(span, err) span.End() } }() span.AddAttributes( trace.StringAttribute("path", path), trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) if len(parentLayerPaths) == 0 { // This is a base layer. It gets imported differently. f, err := safefile.OpenRoot(path) if err != nil { return nil, err } return &baseLayerWriter{ ctx: ctx, s: span, root: f, }, nil } importPath, err := os.MkdirTemp("", "hcs") if err != nil { return nil, err } w, err := newLegacyLayerWriter(importPath, parentLayerPaths, path) if err != nil { return nil, err } return &legacyLayerWriterWrapper{ ctx: ctx, s: span, legacyLayerWriter: w, path: importPath, parentLayerPaths: parentLayerPaths, }, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // LayerExists will return true if a layer with the given id exists and is known // to the system. func LayerExists(ctx context.Context, path string) (_ bool, err error) { title := "hcsshim::LayerExists" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) // Call the procedure itself. var exists uint32 err = layerExists(&stdDriverInfo, path, &exists) if err != nil { return false, hcserror.New(err, title, "") } span.AddAttributes(trace.BoolAttribute("layer-exists", exists != 0)) return exists != 0, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go ================================================ //go:build windows package wclayer import ( "context" "path/filepath" "github.com/Microsoft/go-winio/pkg/guid" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // LayerID returns the layer ID of a layer on disk. func LayerID(ctx context.Context, path string) (_ guid.GUID, err error) { title := "hcsshim::LayerID" ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) _, file := filepath.Split(path) return NameToGuid(ctx, file) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go ================================================ //go:build windows package wclayer // This file contains utility functions to support storage (graph) related // functionality. import ( "context" "fmt" "os" "path/filepath" "strconv" "syscall" "github.com/Microsoft/go-winio/pkg/guid" "github.com/sirupsen/logrus" ) /* To pass into syscall, we need a struct matching the following: enum GraphDriverType { DiffDriver, FilterDriver }; struct DriverInfo { GraphDriverType Flavour; LPCWSTR HomeDir; }; */ type driverInfo struct { Flavour int HomeDirp *uint16 } var ( utf16EmptyString uint16 stdDriverInfo = driverInfo{1, &utf16EmptyString} ) /* To pass into syscall, we need a struct matching the following: typedef struct _WC_LAYER_DESCRIPTOR { // // The ID of the layer // GUID LayerId; // // Additional flags // union { struct { ULONG Reserved : 31; ULONG Dirty : 1; // Created from sandbox as a result of snapshot }; ULONG Value; } Flags; // // Path to the layer root directory, null-terminated // PCWSTR Path; } WC_LAYER_DESCRIPTOR, *PWC_LAYER_DESCRIPTOR; */ type WC_LAYER_DESCRIPTOR struct { LayerId guid.GUID Flags uint32 Pathp *uint16 } func layerPathsToDescriptors(ctx context.Context, parentLayerPaths []string) ([]WC_LAYER_DESCRIPTOR, error) { // Array of descriptors that gets constructed. var layers []WC_LAYER_DESCRIPTOR for i := 0; i < len(parentLayerPaths); i++ { g, err := LayerID(ctx, parentLayerPaths[i]) if err != nil { logrus.WithError(err).Debug("Failed to convert name to guid") return nil, err } p, err := syscall.UTF16PtrFromString(parentLayerPaths[i]) if err != nil { logrus.WithError(err).Debug("Failed conversion of parentLayerPath to pointer") return nil, err } layers = append(layers, WC_LAYER_DESCRIPTOR{ LayerId: g, Flags: 0, Pathp: p, }) } return layers, nil } // GetLayerUvmBuild looks for a file named `uvmbuildversion` at `layerPath\uvmbuildversion` and returns the // build number of the UVM from that file. func GetLayerUvmBuild(layerPath string) (uint16, error) { data, err := os.ReadFile(filepath.Join(layerPath, UvmBuildFileName)) if err != nil { return 0, err } ver, err := strconv.ParseUint(string(data), 10, 16) if err != nil { return 0, err } return uint16(ver), nil } // WriteLayerUvmBuildFile writes a file at path `layerPath\uvmbuildversion` that contains the given `build` // version for future reference. func WriteLayerUvmBuildFile(layerPath string, build uint16) error { return os.WriteFile(filepath.Join(layerPath, UvmBuildFileName), []byte(fmt.Sprintf("%d", build)), 0777) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go ================================================ //go:build windows package wclayer import ( "bufio" "encoding/binary" "errors" "fmt" "io" "os" "path/filepath" "strings" "syscall" "github.com/Microsoft/go-winio" "github.com/Microsoft/hcsshim/internal/longpath" "github.com/Microsoft/hcsshim/internal/safefile" "github.com/Microsoft/hcsshim/internal/winapi" ) var errorIterationCanceled = errors.New("") var mutatedUtilityVMFiles = map[string]bool{ `EFI\Microsoft\Boot\BCD`: true, `EFI\Microsoft\Boot\BCD.LOG`: true, `EFI\Microsoft\Boot\BCD.LOG1`: true, `EFI\Microsoft\Boot\BCD.LOG2`: true, } const ( filesPath = `Files` HivesPath = `Hives` UtilityVMPath = `UtilityVM` UtilityVMFilesPath = `UtilityVM\Files` RegFilesPath = `Files\Windows\System32\config` BootDirRelativePath = `\EFI\Microsoft\Boot` BcdFilePath = `UtilityVM\Files\EFI\Microsoft\Boot\BCD` BootMgrFilePath = `UtilityVM\Files\EFI\Microsoft\Boot\bootmgfw.efi` ContainerBaseVhd = `blank-base.vhdx` ContainerScratchVhd = `blank.vhdx` UtilityVMBaseVhd = `SystemTemplateBase.vhdx` UtilityVMScratchVhd = `SystemTemplate.vhdx` LayoutFileName = `layout` UvmBuildFileName = `uvmbuildversion` ) func openFileOrDir(path string, mode uint32, createDisposition uint32) (file *os.File, err error) { return winio.OpenForBackup(path, mode, syscall.FILE_SHARE_READ, createDisposition) } func hasPathPrefix(p, prefix string) bool { return strings.HasPrefix(p, prefix) && len(p) > len(prefix) && p[len(prefix)] == '\\' } type fileEntry struct { path string fi os.FileInfo err error } type legacyLayerReader struct { root string result chan *fileEntry proceed chan bool currentFile *os.File backupReader *winio.BackupFileReader } // newLegacyLayerReader returns a new LayerReader that can read the Windows // container layer transport format from disk. func newLegacyLayerReader(root string) *legacyLayerReader { r := &legacyLayerReader{ root: root, result: make(chan *fileEntry), proceed: make(chan bool), } go r.walk() return r } func readTombstones(path string) (map[string]([]string), error) { tf, err := os.Open(filepath.Join(path, "tombstones.txt")) if err != nil { return nil, err } defer tf.Close() s := bufio.NewScanner(tf) if !s.Scan() || s.Text() != "\xef\xbb\xbfVersion 1.0" { return nil, errors.New("invalid tombstones file") } ts := make(map[string]([]string)) for s.Scan() { t := filepath.Join(filesPath, s.Text()[1:]) // skip leading `\` dir := filepath.Dir(t) ts[dir] = append(ts[dir], t) } if err = s.Err(); err != nil { return nil, err } return ts, nil } func (r *legacyLayerReader) walkUntilCancelled() error { root, err := longpath.LongAbs(r.root) if err != nil { return err } r.root = root ts, err := readTombstones(r.root) if err != nil { return err } err = filepath.Walk(r.root, func(path string, info os.FileInfo, err error) error { if err != nil { return err } // Indirect fix for https://github.com/moby/moby/issues/32838#issuecomment-343610048. // Handle failure from what may be a golang bug in the conversion of // UTF16 to UTF8 in files which are left in the recycle bin. Os.Lstat // which is called by filepath.Walk will fail when a filename contains // unicode characters. Skip the recycle bin regardless which is goodness. if strings.EqualFold(path, filepath.Join(r.root, `Files\$Recycle.Bin`)) && info.IsDir() { return filepath.SkipDir } if path == r.root || path == filepath.Join(r.root, "tombstones.txt") || strings.HasSuffix(path, ".$wcidirs$") { return nil } r.result <- &fileEntry{path, info, nil} if !<-r.proceed { return errorIterationCanceled } // List all the tombstones. if info.IsDir() { relPath, err := filepath.Rel(r.root, path) if err != nil { return err } if dts, ok := ts[relPath]; ok { for _, t := range dts { r.result <- &fileEntry{filepath.Join(r.root, t), nil, nil} if !<-r.proceed { return errorIterationCanceled } } } } return nil }) if err == errorIterationCanceled { //nolint:errorlint // explicitly returned return nil } if err == nil { return io.EOF } return err } func (r *legacyLayerReader) walk() { defer close(r.result) if !<-r.proceed { return } err := r.walkUntilCancelled() if err != nil { for { r.result <- &fileEntry{err: err} if !<-r.proceed { return } } } } func (r *legacyLayerReader) reset() { if r.backupReader != nil { r.backupReader.Close() r.backupReader = nil } if r.currentFile != nil { r.currentFile.Close() r.currentFile = nil } } func findBackupStreamSize(r io.Reader) (int64, error) { br := winio.NewBackupStreamReader(r) for { hdr, err := br.Next() if err != nil { if errors.Is(err, io.EOF) { err = nil } return 0, err } if hdr.Id == winio.BackupData { return hdr.Size, nil } } } func (r *legacyLayerReader) Next() (path string, size int64, fileInfo *winio.FileBasicInfo, err error) { r.reset() r.proceed <- true fe := <-r.result if fe == nil { err = errors.New("LegacyLayerReader closed") return } if fe.err != nil { err = fe.err return } path, err = filepath.Rel(r.root, fe.path) if err != nil { return } if fe.fi == nil { // This is a tombstone. Return a nil fileInfo. return } if fe.fi.IsDir() && hasPathPrefix(path, filesPath) { fe.path += ".$wcidirs$" } f, err := openFileOrDir(fe.path, syscall.GENERIC_READ, syscall.OPEN_EXISTING) if err != nil { return } defer func() { if f != nil { f.Close() } }() fileInfo, err = winio.GetFileBasicInfo(f) if err != nil { return } if !hasPathPrefix(path, filesPath) { size = fe.fi.Size() r.backupReader = winio.NewBackupFileReader(f, false) if path == HivesPath || path == filesPath { // The Hives directory has a non-deterministic file time because of the // nature of the import process. Use the times from System_Delta. var g *os.File g, err = os.Open(filepath.Join(r.root, HivesPath, `System_Delta`)) if err != nil { return } attr := fileInfo.FileAttributes fileInfo, err = winio.GetFileBasicInfo(g) g.Close() if err != nil { return } fileInfo.FileAttributes = attr } // The creation time and access time get reset for files outside of the Files path. fileInfo.CreationTime = fileInfo.LastWriteTime fileInfo.LastAccessTime = fileInfo.LastWriteTime } else { // The file attributes are written before the backup stream. var attr uint32 err = binary.Read(f, binary.LittleEndian, &attr) if err != nil { return } fileInfo.FileAttributes = attr beginning := int64(4) // Find the accurate file size. if !fe.fi.IsDir() { size, err = findBackupStreamSize(f) if err != nil { err = &os.PathError{Op: "findBackupStreamSize", Path: fe.path, Err: err} return } } // Return back to the beginning of the backup stream. _, err = f.Seek(beginning, 0) if err != nil { return } } r.currentFile = f f = nil return } func (r *legacyLayerReader) LinkInfo() (uint32, *winio.FileIDInfo, error) { fileStandardInfo, err := winio.GetFileStandardInfo(r.currentFile) if err != nil { return 0, nil, err } fileIDInfo, err := winio.GetFileID(r.currentFile) if err != nil { return 0, nil, err } return fileStandardInfo.NumberOfLinks, fileIDInfo, nil } func (r *legacyLayerReader) Read(b []byte) (int, error) { if r.backupReader == nil { if r.currentFile == nil { return 0, io.EOF } return r.currentFile.Read(b) } return r.backupReader.Read(b) } func (r *legacyLayerReader) Seek(offset int64, whence int) (int64, error) { if r.backupReader == nil { if r.currentFile == nil { return 0, errors.New("no current file") } return r.currentFile.Seek(offset, whence) } return 0, errors.New("seek not supported on this stream") } func (r *legacyLayerReader) Close() error { r.proceed <- false <-r.result r.reset() return nil } type pendingLink struct { Path, Target string TargetRoot *os.File } type pendingDir struct { Path string Root *os.File } type legacyLayerWriter struct { root *os.File destRoot *os.File parentRoots []*os.File currentFile *os.File bufWriter *bufio.Writer currentFileName string currentFileRoot *os.File backupWriter *winio.BackupFileWriter Tombstones []string HasUtilityVM bool changedDi []dirInfo addedFiles map[string]bool PendingLinks []pendingLink pendingDirs []pendingDir currentIsDir bool } // newLegacyLayerWriter returns a LayerWriter that can write the container layer // transport format to disk. func newLegacyLayerWriter(root string, parentRoots []string, destRoot string) (w *legacyLayerWriter, err error) { w = &legacyLayerWriter{ addedFiles: make(map[string]bool), } defer func() { if err != nil { w.CloseRoots() w = nil } }() w.root, err = safefile.OpenRoot(root) if err != nil { return } w.destRoot, err = safefile.OpenRoot(destRoot) if err != nil { return } for _, r := range parentRoots { f, err := safefile.OpenRoot(r) if err != nil { return w, err } w.parentRoots = append(w.parentRoots, f) } w.bufWriter = bufio.NewWriterSize(io.Discard, 65536) return } func (w *legacyLayerWriter) CloseRoots() { if w.root != nil { w.root.Close() w.root = nil } if w.destRoot != nil { w.destRoot.Close() w.destRoot = nil } for i := range w.parentRoots { _ = w.parentRoots[i].Close() } w.parentRoots = nil } func (w *legacyLayerWriter) initUtilityVM() error { if !w.HasUtilityVM { err := safefile.MkdirRelative(UtilityVMPath, w.destRoot) if err != nil { return err } // Server 2016 does not support multiple layers for the utility VM, so // clone the utility VM from the parent layer into this layer. Use hard // links to avoid unnecessary copying, since most of the files are // immutable. err = cloneTree(w.parentRoots[0], w.destRoot, UtilityVMFilesPath, mutatedUtilityVMFiles) if err != nil { return fmt.Errorf("cloning the parent utility VM image failed: %w", err) } w.HasUtilityVM = true } return nil } func (w *legacyLayerWriter) reset() error { err := w.bufWriter.Flush() if err != nil { return err } w.bufWriter.Reset(io.Discard) if w.currentIsDir { r := w.currentFile br := winio.NewBackupStreamReader(r) // Seek to the beginning of the backup stream, skipping the fileattrs if _, err := r.Seek(4, io.SeekStart); err != nil { return err } for { bhdr, err := br.Next() if errors.Is(err, io.EOF) { // end of backupstream data break } if err != nil { return err } switch bhdr.Id { case winio.BackupReparseData: // The current file is a `.$wcidirs$` metadata file that // describes a directory reparse point. Delete the placeholder // directory to prevent future files being added into the // destination of the reparse point during the ImportLayer call if err := safefile.RemoveRelative(w.currentFileName, w.currentFileRoot); err != nil { return err } w.pendingDirs = append(w.pendingDirs, pendingDir{Path: w.currentFileName, Root: w.currentFileRoot}) default: // ignore all other stream types, as we only care about directory reparse points } } w.currentIsDir = false } if w.backupWriter != nil { w.backupWriter.Close() w.backupWriter = nil } if w.currentFile != nil { w.currentFile.Close() w.currentFile = nil w.currentFileName = "" w.currentFileRoot = nil } return nil } // copyFileWithMetadata copies a file using the backup/restore APIs in order to preserve metadata func copyFileWithMetadata(srcRoot, destRoot *os.File, subPath string, isDir bool) (fileInfo *winio.FileBasicInfo, err error) { src, err := safefile.OpenRelative( subPath, srcRoot, syscall.GENERIC_READ|winio.ACCESS_SYSTEM_SECURITY, syscall.FILE_SHARE_READ, winapi.FILE_OPEN, winapi.FILE_OPEN_REPARSE_POINT) if err != nil { return nil, err } defer src.Close() srcr := winio.NewBackupFileReader(src, true) defer srcr.Close() fileInfo, err = winio.GetFileBasicInfo(src) if err != nil { return nil, err } extraFlags := uint32(0) if isDir { extraFlags |= winapi.FILE_DIRECTORY_FILE } dest, err := safefile.OpenRelative( subPath, destRoot, syscall.GENERIC_READ|syscall.GENERIC_WRITE|winio.WRITE_DAC|winio.WRITE_OWNER|winio.ACCESS_SYSTEM_SECURITY, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, extraFlags) if err != nil { return nil, err } defer dest.Close() err = winio.SetFileBasicInfo(dest, fileInfo) if err != nil { return nil, err } destw := winio.NewBackupFileWriter(dest, true) defer func() { cerr := destw.Close() if err == nil { err = cerr } }() _, err = io.Copy(destw, srcr) if err != nil { return nil, err } return fileInfo, nil } // cloneTree clones a directory tree using hard links. It skips hard links for // the file names in the provided map and just copies those files. func cloneTree(srcRoot *os.File, destRoot *os.File, subPath string, mutatedFiles map[string]bool) error { var di []dirInfo err := safefile.EnsureNotReparsePointRelative(subPath, srcRoot) if err != nil { return err } err = filepath.Walk(filepath.Join(srcRoot.Name(), subPath), func(srcFilePath string, info os.FileInfo, err error) error { if err != nil { return err } relPath, err := filepath.Rel(srcRoot.Name(), srcFilePath) if err != nil { return err } fileAttributes := info.Sys().(*syscall.Win32FileAttributeData).FileAttributes // Directories, reparse points, and files that will be mutated during // utility VM import must be copied. All other files can be hard linked. isReparsePoint := fileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 // In go1.9, FileInfo.IsDir() returns false if the directory is also a symlink. // See: https://github.com/golang/go/commit/1989921aef60c83e6f9127a8448fb5ede10e9acc // Fixes the problem by checking syscall.FILE_ATTRIBUTE_DIRECTORY directly isDir := fileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 if isDir || isReparsePoint || mutatedFiles[relPath] { fi, err := copyFileWithMetadata(srcRoot, destRoot, relPath, isDir) if err != nil { return err } if isDir { di = append(di, dirInfo{path: relPath, fileInfo: *fi}) } } else { err = safefile.LinkRelative(relPath, srcRoot, relPath, destRoot) if err != nil { return err } } return nil }) if err != nil { return err } return reapplyDirectoryTimes(destRoot, di) } func (w *legacyLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) error { if err := w.reset(); err != nil { return err } if name == UtilityVMPath { return w.initUtilityVM() } if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { w.changedDi = append(w.changedDi, dirInfo{path: name, fileInfo: *fileInfo}) } name = filepath.Clean(name) if hasPathPrefix(name, UtilityVMPath) { if !w.HasUtilityVM { return errors.New("missing UtilityVM directory") } if !hasPathPrefix(name, UtilityVMFilesPath) && name != UtilityVMFilesPath { return errors.New("invalid UtilityVM layer") } createDisposition := uint32(winapi.FILE_OPEN) if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { st, err := safefile.LstatRelative(name, w.destRoot) if err != nil && !os.IsNotExist(err) { return err } if st != nil { // Delete the existing file/directory if it is not the same type as this directory. existingAttr := st.Sys().(*syscall.Win32FileAttributeData).FileAttributes if (uint32(fileInfo.FileAttributes)^existingAttr)&(syscall.FILE_ATTRIBUTE_DIRECTORY|syscall.FILE_ATTRIBUTE_REPARSE_POINT) != 0 { if err = safefile.RemoveAllRelative(name, w.destRoot); err != nil { return err } st = nil } } if st == nil { if err = safefile.MkdirRelative(name, w.destRoot); err != nil { return err } } } else { // Overwrite any existing hard link. err := safefile.RemoveRelative(name, w.destRoot) if err != nil && !os.IsNotExist(err) { return err } createDisposition = winapi.FILE_CREATE } f, err := safefile.OpenRelative( name, w.destRoot, syscall.GENERIC_READ|syscall.GENERIC_WRITE|winio.WRITE_DAC|winio.WRITE_OWNER|winio.ACCESS_SYSTEM_SECURITY, syscall.FILE_SHARE_READ, createDisposition, winapi.FILE_OPEN_REPARSE_POINT, ) if err != nil { return err } defer func() { if f != nil { f.Close() _ = safefile.RemoveRelative(name, w.destRoot) } }() err = winio.SetFileBasicInfo(f, fileInfo) if err != nil { return err } w.backupWriter = winio.NewBackupFileWriter(f, true) w.bufWriter.Reset(w.backupWriter) w.currentFile = f w.currentFileName = name w.currentFileRoot = w.destRoot w.addedFiles[name] = true f = nil return nil } fname := name if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { err := safefile.MkdirRelative(name, w.root) if err != nil { return err } fname += ".$wcidirs$" w.currentIsDir = true } f, err := safefile.OpenRelative(fname, w.root, syscall.GENERIC_READ|syscall.GENERIC_WRITE, syscall.FILE_SHARE_READ, winapi.FILE_CREATE, 0) if err != nil { return err } defer func() { if f != nil { f.Close() _ = safefile.RemoveRelative(fname, w.root) } }() strippedFi := *fileInfo strippedFi.FileAttributes = 0 err = winio.SetFileBasicInfo(f, &strippedFi) if err != nil { return err } if hasPathPrefix(name, HivesPath) { w.backupWriter = winio.NewBackupFileWriter(f, false) w.bufWriter.Reset(w.backupWriter) } else { w.bufWriter.Reset(f) // The file attributes are written before the stream. err = binary.Write(w.bufWriter, binary.LittleEndian, uint32(fileInfo.FileAttributes)) if err != nil { w.bufWriter.Reset(io.Discard) return err } } w.currentFile = f w.currentFileName = name w.currentFileRoot = w.root w.addedFiles[name] = true f = nil return nil } func (w *legacyLayerWriter) AddLink(name string, target string) error { if err := w.reset(); err != nil { return err } target = filepath.Clean(target) var roots []*os.File if hasPathPrefix(target, filesPath) { // Look for cross-layer hard link targets in the parent layers, since // nothing is in the destination path yet. roots = w.parentRoots } else if hasPathPrefix(target, UtilityVMFilesPath) { // Since the utility VM is fully cloned into the destination path // already, look for cross-layer hard link targets directly in the // destination path. roots = []*os.File{w.destRoot} } if roots == nil || (!hasPathPrefix(name, filesPath) && !hasPathPrefix(name, UtilityVMFilesPath)) { return errors.New("invalid hard link in layer") } // Try to find the target of the link in a previously added file. If that // fails, search in parent layers. var selectedRoot *os.File if _, ok := w.addedFiles[target]; ok { selectedRoot = w.destRoot } else { for _, r := range roots { if _, err := safefile.LstatRelative(target, r); err != nil { if !os.IsNotExist(err) { return err } } else { selectedRoot = r break } } if selectedRoot == nil { return fmt.Errorf("failed to find link target for '%s' -> '%s'", name, target) } } // The link can't be written until after the ImportLayer call. w.PendingLinks = append(w.PendingLinks, pendingLink{ Path: name, Target: target, TargetRoot: selectedRoot, }) w.addedFiles[name] = true return nil } func (w *legacyLayerWriter) Remove(name string) error { name = filepath.Clean(name) if hasPathPrefix(name, filesPath) { w.Tombstones = append(w.Tombstones, name) } else if hasPathPrefix(name, UtilityVMFilesPath) { err := w.initUtilityVM() if err != nil { return err } // Make sure the path exists; os.RemoveAll will not fail if the file is // already gone, and this needs to be a fatal error for diagnostics // purposes. if _, err := safefile.LstatRelative(name, w.destRoot); err != nil { return err } err = safefile.RemoveAllRelative(name, w.destRoot) if err != nil { return err } } else { return fmt.Errorf("invalid tombstone %s", name) } return nil } func (w *legacyLayerWriter) Write(b []byte) (int, error) { if w.backupWriter == nil && w.currentFile == nil { return 0, errors.New("closed") } return w.bufWriter.Write(b) } func (w *legacyLayerWriter) Close() error { if err := w.reset(); err != nil { return err } if err := safefile.RemoveRelative("tombstones.txt", w.root); err != nil && !os.IsNotExist(err) { return err } for _, pd := range w.pendingDirs { err := safefile.MkdirRelative(pd.Path, pd.Root) if err != nil { return err } } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/go-winio/pkg/guid" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // NameToGuid converts the given string into a GUID using the algorithm in the // Host Compute Service, ensuring GUIDs generated with the same string are common // across all clients. func NameToGuid(ctx context.Context, name string) (_ guid.GUID, err error) { title := "hcsshim::NameToGuid" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("objectName", name)) var id guid.GUID err = nameToGuid(name, &id) if err != nil { return guid.GUID{}, hcserror.New(err, title, "") } span.AddAttributes(trace.StringAttribute("guid", id.String())) return id, nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go ================================================ //go:build windows package wclayer import ( "context" "strings" "sync" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) var prepareLayerLock sync.Mutex // PrepareLayer finds a mounted read-write layer matching path and enables the // the filesystem filter for use on that layer. This requires the paths to all // parent layers, and is necessary in order to view or interact with the layer // as an actual filesystem (reading and writing files, creating directories, etc). // Disabling the filter must be done via UnprepareLayer. func PrepareLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) { title := "hcsshim::PrepareLayer" ctx, span := oc.StartSpan(ctx, title) defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes( trace.StringAttribute("path", path), trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", "))) // Generate layer descriptors layers, err := layerPathsToDescriptors(ctx, parentLayerPaths) if err != nil { return err } // This lock is a temporary workaround for a Windows bug. Only allowing one // call to prepareLayer at a time vastly reduces the chance of a timeout. prepareLayerLock.Lock() defer prepareLayerLock.Unlock() err = prepareLayer(&stdDriverInfo, path, layers) if err != nil { return hcserror.New(err, title, "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go ================================================ //go:build windows package wclayer import ( "context" "os" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // ProcessBaseLayer post-processes a base layer that has had its files extracted. // The files should have been extracted to \Files. func ProcessBaseLayer(ctx context.Context, path string) (err error) { title := "hcsshim::ProcessBaseLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) err = processBaseImage(path) if err != nil { return &os.PathError{Op: title, Path: path, Err: err} } return nil } // ProcessUtilityVMImage post-processes a utility VM image that has had its files extracted. // The files should have been extracted to \Files. func ProcessUtilityVMImage(ctx context.Context, path string) (err error) { title := "hcsshim::ProcessUtilityVMImage" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) err = processUtilityImage(path) if err != nil { return &os.PathError{Op: title, Path: path, Err: err} } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go ================================================ //go:build windows package wclayer import ( "context" "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" "go.opencensus.io/trace" ) // UnprepareLayer disables the filesystem filter for the read-write layer with // the given id. func UnprepareLayer(ctx context.Context, path string) (err error) { title := "hcsshim::UnprepareLayer" ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck defer span.End() defer func() { oc.SetSpanStatus(span, err) }() span.AddAttributes(trace.StringAttribute("path", path)) err = unprepareLayer(&stdDriverInfo, path) if err != nil { return hcserror.New(err, title, "") } return nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/wclayer.go ================================================ //go:build windows package wclayer import "github.com/Microsoft/go-winio/pkg/guid" //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go wclayer.go //sys activateLayer(info *driverInfo, id string) (hr error) = vmcompute.ActivateLayer? //sys copyLayer(info *driverInfo, srcId string, dstId string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.CopyLayer? //sys createLayer(info *driverInfo, id string, parent string) (hr error) = vmcompute.CreateLayer? //sys createSandboxLayer(info *driverInfo, id string, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.CreateSandboxLayer? //sys expandSandboxSize(info *driverInfo, id string, size uint64) (hr error) = vmcompute.ExpandSandboxSize? //sys deactivateLayer(info *driverInfo, id string) (hr error) = vmcompute.DeactivateLayer? //sys destroyLayer(info *driverInfo, id string) (hr error) = vmcompute.DestroyLayer? //sys exportLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.ExportLayer? //sys getLayerMountPath(info *driverInfo, id string, length *uintptr, buffer *uint16) (hr error) = vmcompute.GetLayerMountPath? //sys getBaseImages(buffer **uint16) (hr error) = vmcompute.GetBaseImages? //sys importLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.ImportLayer? //sys layerExists(info *driverInfo, id string, exists *uint32) (hr error) = vmcompute.LayerExists? //sys nameToGuid(name string, guid *_guid) (hr error) = vmcompute.NameToGuid? //sys prepareLayer(info *driverInfo, id string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) = vmcompute.PrepareLayer? //sys unprepareLayer(info *driverInfo, id string) (hr error) = vmcompute.UnprepareLayer? //sys processBaseImage(path string) (hr error) = vmcompute.ProcessBaseImage? //sys processUtilityImage(path string) (hr error) = vmcompute.ProcessUtilityImage? //sys grantVmAccess(vmid string, filepath string) (hr error) = vmcompute.GrantVmAccess? //sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = virtdisk.OpenVirtualDisk //sys attachVirtualDisk(handle syscall.Handle, sd uintptr, flags uint32, providerFlags uint32, params uintptr, overlapped uintptr) (err error) [failretval != 0] = virtdisk.AttachVirtualDisk //sys getDiskFreeSpaceEx(directoryName string, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) = GetDiskFreeSpaceExW type _guid = guid.GUID ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/wclayer/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package wclayer import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modkernel32 = windows.NewLazySystemDLL("kernel32.dll") modvirtdisk = windows.NewLazySystemDLL("virtdisk.dll") modvmcompute = windows.NewLazySystemDLL("vmcompute.dll") procGetDiskFreeSpaceExW = modkernel32.NewProc("GetDiskFreeSpaceExW") procAttachVirtualDisk = modvirtdisk.NewProc("AttachVirtualDisk") procOpenVirtualDisk = modvirtdisk.NewProc("OpenVirtualDisk") procActivateLayer = modvmcompute.NewProc("ActivateLayer") procCopyLayer = modvmcompute.NewProc("CopyLayer") procCreateLayer = modvmcompute.NewProc("CreateLayer") procCreateSandboxLayer = modvmcompute.NewProc("CreateSandboxLayer") procDeactivateLayer = modvmcompute.NewProc("DeactivateLayer") procDestroyLayer = modvmcompute.NewProc("DestroyLayer") procExpandSandboxSize = modvmcompute.NewProc("ExpandSandboxSize") procExportLayer = modvmcompute.NewProc("ExportLayer") procGetBaseImages = modvmcompute.NewProc("GetBaseImages") procGetLayerMountPath = modvmcompute.NewProc("GetLayerMountPath") procGrantVmAccess = modvmcompute.NewProc("GrantVmAccess") procImportLayer = modvmcompute.NewProc("ImportLayer") procLayerExists = modvmcompute.NewProc("LayerExists") procNameToGuid = modvmcompute.NewProc("NameToGuid") procPrepareLayer = modvmcompute.NewProc("PrepareLayer") procProcessBaseImage = modvmcompute.NewProc("ProcessBaseImage") procProcessUtilityImage = modvmcompute.NewProc("ProcessUtilityImage") procUnprepareLayer = modvmcompute.NewProc("UnprepareLayer") ) func getDiskFreeSpaceEx(directoryName string, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(directoryName) if err != nil { return } return _getDiskFreeSpaceEx(_p0, freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfFreeBytes) } func _getDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *int64, totalNumberOfBytes *int64, totalNumberOfFreeBytes *int64) (err error) { r1, _, e1 := syscall.SyscallN(procGetDiskFreeSpaceExW.Addr(), uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailableToCaller)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes))) if r1 == 0 { err = errnoErr(e1) } return } func attachVirtualDisk(handle syscall.Handle, sd uintptr, flags uint32, providerFlags uint32, params uintptr, overlapped uintptr) (err error) { r1, _, e1 := syscall.SyscallN(procAttachVirtualDisk.Addr(), uintptr(handle), uintptr(sd), uintptr(flags), uintptr(providerFlags), uintptr(params), uintptr(overlapped)) if r1 != 0 { err = errnoErr(e1) } return } func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) { var _p0 *uint16 _p0, err = syscall.UTF16PtrFromString(path) if err != nil { return } return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, flags, parameters, handle) } func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) { r1, _, e1 := syscall.SyscallN(procOpenVirtualDisk.Addr(), uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(flags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle))) if r1 != 0 { err = errnoErr(e1) } return } func activateLayer(info *driverInfo, id string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _activateLayer(info, _p0) } func _activateLayer(info *driverInfo, id *uint16) (hr error) { hr = procActivateLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procActivateLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func copyLayer(info *driverInfo, srcId string, dstId string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(srcId) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(dstId) if hr != nil { return } return _copyLayer(info, _p0, _p1, descriptors) } func _copyLayer(info *driverInfo, srcId *uint16, dstId *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { hr = procCopyLayer.Find() if hr != nil { return } var _p2 *WC_LAYER_DESCRIPTOR if len(descriptors) > 0 { _p2 = &descriptors[0] } r0, _, _ := syscall.SyscallN(procCopyLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(srcId)), uintptr(unsafe.Pointer(dstId)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func createLayer(info *driverInfo, id string, parent string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(parent) if hr != nil { return } return _createLayer(info, _p0, _p1) } func _createLayer(info *driverInfo, id *uint16, parent *uint16) (hr error) { hr = procCreateLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCreateLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(parent))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func createSandboxLayer(info *driverInfo, id string, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _createSandboxLayer(info, _p0, parent, descriptors) } func _createSandboxLayer(info *driverInfo, id *uint16, parent uintptr, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { hr = procCreateSandboxLayer.Find() if hr != nil { return } var _p1 *WC_LAYER_DESCRIPTOR if len(descriptors) > 0 { _p1 = &descriptors[0] } r0, _, _ := syscall.SyscallN(procCreateSandboxLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(parent), uintptr(unsafe.Pointer(_p1)), uintptr(len(descriptors))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func deactivateLayer(info *driverInfo, id string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _deactivateLayer(info, _p0) } func _deactivateLayer(info *driverInfo, id *uint16) (hr error) { hr = procDeactivateLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procDeactivateLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func destroyLayer(info *driverInfo, id string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _destroyLayer(info, _p0) } func _destroyLayer(info *driverInfo, id *uint16) (hr error) { hr = procDestroyLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procDestroyLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func expandSandboxSize(info *driverInfo, id string, size uint64) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _expandSandboxSize(info, _p0, size) } func _expandSandboxSize(info *driverInfo, id *uint16, size uint64) (hr error) { hr = procExpandSandboxSize.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procExpandSandboxSize.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(size)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func exportLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _exportLayer(info, _p0, _p1, descriptors) } func _exportLayer(info *driverInfo, id *uint16, path *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { hr = procExportLayer.Find() if hr != nil { return } var _p2 *WC_LAYER_DESCRIPTOR if len(descriptors) > 0 { _p2 = &descriptors[0] } r0, _, _ := syscall.SyscallN(procExportLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func getBaseImages(buffer **uint16) (hr error) { hr = procGetBaseImages.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procGetBaseImages.Addr(), uintptr(unsafe.Pointer(buffer))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func getLayerMountPath(info *driverInfo, id string, length *uintptr, buffer *uint16) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _getLayerMountPath(info, _p0, length, buffer) } func _getLayerMountPath(info *driverInfo, id *uint16, length *uintptr, buffer *uint16) (hr error) { hr = procGetLayerMountPath.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procGetLayerMountPath.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(length)), uintptr(unsafe.Pointer(buffer))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func grantVmAccess(vmid string, filepath string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(vmid) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(filepath) if hr != nil { return } return _grantVmAccess(_p0, _p1) } func _grantVmAccess(vmid *uint16, filepath *uint16) (hr error) { hr = procGrantVmAccess.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procGrantVmAccess.Addr(), uintptr(unsafe.Pointer(vmid)), uintptr(unsafe.Pointer(filepath))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func importLayer(info *driverInfo, id string, path string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _importLayer(info, _p0, _p1, descriptors) } func _importLayer(info *driverInfo, id *uint16, path *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { hr = procImportLayer.Find() if hr != nil { return } var _p2 *WC_LAYER_DESCRIPTOR if len(descriptors) > 0 { _p2 = &descriptors[0] } r0, _, _ := syscall.SyscallN(procImportLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(_p2)), uintptr(len(descriptors))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func layerExists(info *driverInfo, id string, exists *uint32) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _layerExists(info, _p0, exists) } func _layerExists(info *driverInfo, id *uint16, exists *uint32) (hr error) { hr = procLayerExists.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procLayerExists.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(exists))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func nameToGuid(name string, guid *_guid) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(name) if hr != nil { return } return _nameToGuid(_p0, guid) } func _nameToGuid(name *uint16, guid *_guid) (hr error) { hr = procNameToGuid.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procNameToGuid.Addr(), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(guid))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func prepareLayer(info *driverInfo, id string, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _prepareLayer(info, _p0, descriptors) } func _prepareLayer(info *driverInfo, id *uint16, descriptors []WC_LAYER_DESCRIPTOR) (hr error) { hr = procPrepareLayer.Find() if hr != nil { return } var _p1 *WC_LAYER_DESCRIPTOR if len(descriptors) > 0 { _p1 = &descriptors[0] } r0, _, _ := syscall.SyscallN(procPrepareLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id)), uintptr(unsafe.Pointer(_p1)), uintptr(len(descriptors))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func processBaseImage(path string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _processBaseImage(_p0) } func _processBaseImage(path *uint16) (hr error) { hr = procProcessBaseImage.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procProcessBaseImage.Addr(), uintptr(unsafe.Pointer(path))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func processUtilityImage(path string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _processUtilityImage(_p0) } func _processUtilityImage(path *uint16) (hr error) { hr = procProcessUtilityImage.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procProcessUtilityImage.Addr(), uintptr(unsafe.Pointer(path))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func unprepareLayer(info *driverInfo, id string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(id) if hr != nil { return } return _unprepareLayer(info, _p0) } func _unprepareLayer(info *driverInfo, id *uint16) (hr error) { hr = procUnprepareLayer.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procUnprepareLayer.Addr(), uintptr(unsafe.Pointer(info)), uintptr(unsafe.Pointer(id))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/bindflt.go ================================================ package winapi const ( BINDFLT_FLAG_READ_ONLY_MAPPING uint32 = 0x00000001 BINDFLT_FLAG_MERGED_BIND_MAPPING uint32 = 0x00000002 BINDFLT_FLAG_USE_CURRENT_SILO_MAPPING uint32 = 0x00000004 ) // HRESULT // BfSetupFilter( // _In_opt_ HANDLE JobHandle, // _In_ ULONG Flags, // _In_ LPCWSTR VirtualizationRootPath, // _In_ LPCWSTR VirtualizationTargetPath, // _In_reads_opt_( VirtualizationExceptionPathCount ) LPCWSTR* VirtualizationExceptionPaths, // _In_opt_ ULONG VirtualizationExceptionPathCount // ); // //sys BfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath *uint16, virtTargetPath *uint16, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) = bindfltapi.BfSetupFilter? ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/cimfs.go ================================================ //go:build windows package winapi import ( "unsafe" "github.com/Microsoft/go-winio/pkg/guid" "golang.org/x/sys/windows" ) type g = guid.GUID type FsHandle uintptr type StreamHandle uintptr type CimFsFileMetadata struct { Attributes uint32 FileSize int64 CreationTime windows.Filetime LastWriteTime windows.Filetime ChangeTime windows.Filetime LastAccessTime windows.Filetime SecurityDescriptorBuffer unsafe.Pointer SecurityDescriptorSize uint32 ReparseDataBuffer unsafe.Pointer ReparseDataSize uint32 ExtendedAttributes unsafe.Pointer EACount uint32 } type CimFsImagePath struct { ImageDir *uint16 ImageName *uint16 } //sys CimMountImage(imagePath string, fsName string, flags uint32, volumeID *g) (hr error) = cimfs.CimMountImage? //sys CimDismountImage(volumeID *g) (hr error) = cimfs.CimDismountImage? //sys CimCreateImage(imagePath string, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) = cimfs.CimCreateImage? //sys CimCreateImage2(imagePath string, flags uint32, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) = cimfs.CimCreateImage2? //sys CimCloseImage(cimFSHandle FsHandle) = cimfs.CimCloseImage? //sys CimCommitImage(cimFSHandle FsHandle) (hr error) = cimfs.CimCommitImage? //sys CimCreateFile(cimFSHandle FsHandle, path string, file *CimFsFileMetadata, cimStreamHandle *StreamHandle) (hr error) = cimfs.CimCreateFile? //sys CimCloseStream(cimStreamHandle StreamHandle) (hr error) = cimfs.CimCloseStream? //sys CimWriteStream(cimStreamHandle StreamHandle, buffer uintptr, bufferSize uint32) (hr error) = cimfs.CimWriteStream? //sys CimDeletePath(cimFSHandle FsHandle, path string) (hr error) = cimfs.CimDeletePath? //sys CimCreateHardLink(cimFSHandle FsHandle, newPath string, oldPath string) (hr error) = cimfs.CimCreateHardLink? //sys CimCreateAlternateStream(cimFSHandle FsHandle, path string, size uint64, cimStreamHandle *StreamHandle) (hr error) = cimfs.CimCreateAlternateStream? //sys CimAddFsToMergedImage(cimFSHandle FsHandle, path string) (hr error) = cimfs.CimAddFsToMergedImage? //sys CimAddFsToMergedImage2(cimFSHandle FsHandle, path string, flags uint32) (hr error) = cimfs.CimAddFsToMergedImage2? //sys CimMergeMountImage(numCimPaths uint32, backingImagePaths *CimFsImagePath, flags uint32, volumeID *g) (hr error) = cimfs.CimMergeMountImage? //sys CimTombstoneFile(cimFSHandle FsHandle, path string) (hr error) = cimfs.CimTombstoneFile? //sys CimCreateMergeLink(cimFSHandle FsHandle, newPath string, oldPath string) (hr error) = cimfs.CimCreateMergeLink? ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go ================================================ //go:build windows package winapi import ( "unsafe" "golang.org/x/sys/windows" ) const PSEUDOCONSOLE_INHERIT_CURSOR = 0x1 // CreatePseudoConsole creates a windows pseudo console. func CreatePseudoConsole(size windows.Coord, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) error { // We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand. return createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), hInput, hOutput, 0, hpcon) } // ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`. func ResizePseudoConsole(hpcon windows.Handle, size windows.Coord) error { // We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand. return resizePseudoConsole(hpcon, *((*uint32)(unsafe.Pointer(&size)))) } // HRESULT WINAPI CreatePseudoConsole( // _In_ COORD size, // _In_ HANDLE hInput, // _In_ HANDLE hOutput, // _In_ DWORD dwFlags, // _Out_ HPCON* phPC // ); // //sys createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) = kernel32.CreatePseudoConsole // void WINAPI ClosePseudoConsole( // _In_ HPCON hPC // ); // //sys ClosePseudoConsole(hpc windows.Handle) = kernel32.ClosePseudoConsole // HRESULT WINAPI ResizePseudoConsole( // _In_ HPCON hPC , // _In_ COORD size // ); // //sys resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/devices.go ================================================ //go:build windows package winapi import "github.com/Microsoft/go-winio/pkg/guid" //sys CMGetDeviceIDListSize(pulLen *uint32, pszFilter *byte, uFlags uint32) (hr error) = cfgmgr32.CM_Get_Device_ID_List_SizeA //sys CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags uint32) (hr error)= cfgmgr32.CM_Get_Device_ID_ListA //sys CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) = cfgmgr32.CM_Locate_DevNodeW //sys CMGetDevNodeProperty(dnDevInst uint32, propertyKey *DevPropKey, propertyType *uint32, propertyBuffer *uint16, propertyBufferSize *uint32, uFlags uint32) (hr error) = cfgmgr32.CM_Get_DevNode_PropertyW type DevPropKey struct { Fmtid guid.GUID Pid uint32 } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/doc.go ================================================ // Package winapi contains various low-level bindings to Windows APIs. It can // be thought of as an extension to golang.org/x/sys/windows. package winapi ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/elevation.go ================================================ //go:build windows package winapi import ( "golang.org/x/sys/windows" ) func IsElevated() bool { return windows.GetCurrentProcessToken().IsElevated() } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/errors.go ================================================ //go:build windows package winapi import "syscall" //sys RtlNtStatusToDosError(status uint32) (winerr error) = ntdll.RtlNtStatusToDosError const ( STATUS_REPARSE_POINT_ENCOUNTERED = 0xC000050B ERROR_NO_MORE_ITEMS = 0x103 ERROR_MORE_DATA syscall.Errno = 234 ) func NTSuccess(status uint32) bool { return status == 0 } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/filesystem.go ================================================ //go:build windows package winapi //sys CopyFileW(existingFileName *uint16, newFileName *uint16, failIfExists int32) (err error) = kernel32.CopyFileW //sys NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) = ntdll.NtCreateFile //sys NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) = ntdll.NtSetInformationFile //sys NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) = ntdll.NtOpenDirectoryObject //sys NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32)(status uint32) = ntdll.NtQueryDirectoryObject const ( FileLinkInformationClass = 11 FileDispositionInformationExClass = 64 FILE_READ_ATTRIBUTES = 0x0080 FILE_WRITE_ATTRIBUTES = 0x0100 DELETE = 0x10000 FILE_OPEN = 1 FILE_CREATE = 2 FILE_LIST_DIRECTORY = 0x00000001 FILE_DIRECTORY_FILE = 0x00000001 FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020 FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000 FILE_OPEN_REPARSE_POINT = 0x00200000 FILE_DISPOSITION_DELETE = 0x00000001 OBJ_DONT_REPARSE = 0x1000 STATUS_MORE_ENTRIES = 0x105 STATUS_NO_MORE_ENTRIES = 0x8000001a ) // Select entries from FILE_INFO_BY_HANDLE_CLASS. // // C declaration: // // typedef enum _FILE_INFO_BY_HANDLE_CLASS { // FileBasicInfo, // FileStandardInfo, // FileNameInfo, // FileRenameInfo, // FileDispositionInfo, // FileAllocationInfo, // FileEndOfFileInfo, // FileStreamInfo, // FileCompressionInfo, // FileAttributeTagInfo, // FileIdBothDirectoryInfo, // FileIdBothDirectoryRestartInfo, // FileIoPriorityHintInfo, // FileRemoteProtocolInfo, // FileFullDirectoryInfo, // FileFullDirectoryRestartInfo, // FileStorageInfo, // FileAlignmentInfo, // FileIdInfo, // FileIdExtdDirectoryInfo, // FileIdExtdDirectoryRestartInfo, // FileDispositionInfoEx, // FileRenameInfoEx, // FileCaseSensitiveInfo, // FileNormalizedNameInfo, // MaximumFileInfoByHandleClass // } FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS; // // Documentation: https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ne-minwinbase-file_info_by_handle_class const ( FileIdInfo = 18 ) type FileDispositionInformationEx struct { Flags uintptr } type IOStatusBlock struct { Status, Information uintptr } type ObjectAttributes struct { Length uintptr RootDirectory uintptr ObjectName *UnicodeString Attributes uintptr SecurityDescriptor uintptr SecurityQoS uintptr } type ObjectDirectoryInformation struct { Name UnicodeString TypeName UnicodeString } type FileLinkInformation struct { ReplaceIfExists bool RootDirectory uintptr FileNameLength uint32 FileName [1]uint16 } // C declaration: // // typedef struct _FILE_ID_INFO { // ULONGLONG VolumeSerialNumber; // FILE_ID_128 FileId; // } FILE_ID_INFO, *PFILE_ID_INFO; // // Documentation: https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_id_info type FILE_ID_INFO struct { VolumeSerialNumber uint64 FileID [16]byte } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go ================================================ //go:build windows package winapi import ( "unsafe" "golang.org/x/sys/windows" ) // Messages that can be received from an assigned io completion port. // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port const ( JOB_OBJECT_MSG_END_OF_JOB_TIME uint32 = 1 JOB_OBJECT_MSG_END_OF_PROCESS_TIME uint32 = 2 JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT uint32 = 3 JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO uint32 = 4 JOB_OBJECT_MSG_NEW_PROCESS uint32 = 6 JOB_OBJECT_MSG_EXIT_PROCESS uint32 = 7 JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS uint32 = 8 JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT uint32 = 9 JOB_OBJECT_MSG_JOB_MEMORY_LIMIT uint32 = 10 JOB_OBJECT_MSG_NOTIFICATION_LIMIT uint32 = 11 ) // Access rights for creating or opening job objects. // // https://docs.microsoft.com/en-us/windows/win32/procthread/job-object-security-and-access-rights const ( JOB_OBJECT_QUERY = 0x0004 JOB_OBJECT_ALL_ACCESS = 0x1F003F ) // IO limit flags // // https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information const JOB_OBJECT_IO_RATE_CONTROL_ENABLE = 0x1 const JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE uint32 = 0x1 // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information const ( JOB_OBJECT_CPU_RATE_CONTROL_ENABLE uint32 = 1 << iota JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP JOB_OBJECT_CPU_RATE_CONTROL_NOTIFY JOB_OBJECT_CPU_RATE_CONTROL_MIN_MAX_RATE ) // JobObjectInformationClass values. Used for a call to QueryInformationJobObject // // https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject const ( JobObjectBasicAccountingInformation uint32 = 1 JobObjectBasicProcessIdList uint32 = 3 JobObjectBasicAndIoAccountingInformation uint32 = 8 JobObjectLimitViolationInformation uint32 = 13 JobObjectMemoryUsageInformation uint32 = 28 JobObjectNotificationLimitInformation2 uint32 = 33 JobObjectCreateSilo uint32 = 35 JobObjectSiloBasicInformation uint32 = 36 JobObjectIoAttribution uint32 = 42 ) // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information type JOBOBJECT_BASIC_LIMIT_INFORMATION struct { PerProcessUserTimeLimit int64 PerJobUserTimeLimit int64 LimitFlags uint32 MinimumWorkingSetSize uintptr MaximumWorkingSetSize uintptr ActiveProcessLimit uint32 Affinity uintptr PriorityClass uint32 SchedulingClass uint32 } // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_cpu_rate_control_information type JOBOBJECT_CPU_RATE_CONTROL_INFORMATION struct { ControlFlags uint32 Value uint32 } // https://docs.microsoft.com/en-us/windows/win32/api/jobapi2/ns-jobapi2-jobobject_io_rate_control_information type JOBOBJECT_IO_RATE_CONTROL_INFORMATION struct { MaxIops int64 MaxBandwidth int64 ReservationIops int64 BaseIOSize uint32 VolumeName string ControlFlags uint32 } // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_process_id_list type JOBOBJECT_BASIC_PROCESS_ID_LIST struct { NumberOfAssignedProcesses uint32 NumberOfProcessIdsInList uint32 ProcessIdList [1]uintptr } // AllPids returns all the process Ids in the job object. func (p *JOBOBJECT_BASIC_PROCESS_ID_LIST) AllPids() []uintptr { return (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList:p.NumberOfProcessIdsInList] } // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information type JOBOBJECT_BASIC_ACCOUNTING_INFORMATION struct { TotalUserTime int64 TotalKernelTime int64 ThisPeriodTotalUserTime int64 ThisPeriodTotalKernelTime int64 TotalPageFaultCount uint32 TotalProcesses uint32 ActiveProcesses uint32 TotalTerminateProcesses uint32 } // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_and_io_accounting_information type JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION struct { BasicInfo JOBOBJECT_BASIC_ACCOUNTING_INFORMATION IoInfo windows.IO_COUNTERS } // typedef struct _JOBOBJECT_MEMORY_USAGE_INFORMATION { // ULONG64 JobMemory; // ULONG64 PeakJobMemoryUsed; // } JOBOBJECT_MEMORY_USAGE_INFORMATION, *PJOBOBJECT_MEMORY_USAGE_INFORMATION; type JOBOBJECT_MEMORY_USAGE_INFORMATION struct { JobMemory uint64 PeakJobMemoryUsed uint64 } // typedef struct _JOBOBJECT_IO_ATTRIBUTION_STATS { // ULONG_PTR IoCount; // ULONGLONG TotalNonOverlappedQueueTime; // ULONGLONG TotalNonOverlappedServiceTime; // ULONGLONG TotalSize; // } JOBOBJECT_IO_ATTRIBUTION_STATS, *PJOBOBJECT_IO_ATTRIBUTION_STATS; type JOBOBJECT_IO_ATTRIBUTION_STATS struct { IoCount uintptr TotalNonOverlappedQueueTime uint64 TotalNonOverlappedServiceTime uint64 TotalSize uint64 } // typedef struct _JOBOBJECT_IO_ATTRIBUTION_INFORMATION { // ULONG ControlFlags; // JOBOBJECT_IO_ATTRIBUTION_STATS ReadStats; // JOBOBJECT_IO_ATTRIBUTION_STATS WriteStats; // } JOBOBJECT_IO_ATTRIBUTION_INFORMATION, *PJOBOBJECT_IO_ATTRIBUTION_INFORMATION; type JOBOBJECT_IO_ATTRIBUTION_INFORMATION struct { ControlFlags uint32 ReadStats JOBOBJECT_IO_ATTRIBUTION_STATS WriteStats JOBOBJECT_IO_ATTRIBUTION_STATS } // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_associate_completion_port type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct { CompletionKey windows.Handle CompletionPort windows.Handle } // typedef struct _SILOOBJECT_BASIC_INFORMATION { // DWORD SiloId; // DWORD SiloParentId; // DWORD NumberOfProcesses; // BOOLEAN IsInServerSilo; // BYTE Reserved[3]; // } SILOOBJECT_BASIC_INFORMATION, *PSILOOBJECT_BASIC_INFORMATION; type SILOOBJECT_BASIC_INFORMATION struct { SiloID uint32 SiloParentID uint32 NumberOfProcesses uint32 IsInServerSilo bool Reserved [3]uint8 } // BOOL IsProcessInJob( // HANDLE ProcessHandle, // HANDLE JobHandle, // PBOOL Result // ); // //sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) = kernel32.IsProcessInJob // BOOL QueryInformationJobObject( // HANDLE hJob, // JOBOBJECTINFOCLASS JobObjectInformationClass, // LPVOID lpJobObjectInformation, // DWORD cbJobObjectInformationLength, // LPDWORD lpReturnLength // ); // //sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject // HANDLE OpenJobObjectW( // DWORD dwDesiredAccess, // BOOL bInheritHandle, // LPCWSTR lpName // ); // //sys OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) = kernel32.OpenJobObjectW // DWORD SetIoRateControlInformationJobObject( // HANDLE hJob, // JOBOBJECT_IO_RATE_CONTROL_INFORMATION *IoRateControlInfo // ); // //sys SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) = kernel32.SetIoRateControlInformationJobObject // DWORD QueryIoRateControlInformationJobObject( // HANDLE hJob, // PCWSTR VolumeName, // JOBOBJECT_IO_RATE_CONTROL_INFORMATION **InfoBlocks, // ULONG *InfoBlockCount // ); // //sys QueryIoRateControlInformationJobObject(jobHandle windows.Handle, volumeName *uint16, ioRateControlInfo **JOBOBJECT_IO_RATE_CONTROL_INFORMATION, infoBlockCount *uint32) (ret uint32, err error) = kernel32.QueryIoRateControlInformationJobObject // NTSTATUS // NtOpenJobObject ( // _Out_ PHANDLE JobHandle, // _In_ ACCESS_MASK DesiredAccess, // _In_ POBJECT_ATTRIBUTES ObjectAttributes // ); // //sys NtOpenJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtOpenJobObject // NTSTATUS // NTAPI // NtCreateJobObject ( // _Out_ PHANDLE JobHandle, // _In_ ACCESS_MASK DesiredAccess, // _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes // ); // //sys NtCreateJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) = ntdll.NtCreateJobObject ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/logon.go ================================================ package winapi // BOOL LogonUserA( // LPCWSTR lpszUsername, // LPCWSTR lpszDomain, // LPCWSTR lpszPassword, // DWORD dwLogonType, // DWORD dwLogonProvider, // PHANDLE phToken // ); // //sys LogonUser(username *uint16, domain *uint16, password *uint16, logonType uint32, logonProvider uint32, token *windows.Token) (err error) = advapi32.LogonUserW // Logon types const ( LOGON32_LOGON_INTERACTIVE uint32 = 2 LOGON32_LOGON_NETWORK uint32 = 3 LOGON32_LOGON_BATCH uint32 = 4 LOGON32_LOGON_SERVICE uint32 = 5 LOGON32_LOGON_UNLOCK uint32 = 7 LOGON32_LOGON_NETWORK_CLEARTEXT uint32 = 8 LOGON32_LOGON_NEW_CREDENTIALS uint32 = 9 ) // Logon providers const ( LOGON32_PROVIDER_DEFAULT uint32 = 0 LOGON32_PROVIDER_WINNT40 uint32 = 2 LOGON32_PROVIDER_WINNT50 uint32 = 3 ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/memory.go ================================================ package winapi //sys LocalAlloc(flags uint32, size int) (ptr uintptr) = kernel32.LocalAlloc //sys LocalFree(ptr uintptr) = kernel32.LocalFree ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/net.go ================================================ package winapi //sys SetJobCompartmentId(handle windows.Handle, compartmentId uint32) (win32Err error) = iphlpapi.SetJobCompartmentId ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/offlinereg.go ================================================ package winapi // Offline registry management API type ORHKey uintptr type RegType uint32 const ( // Registry value types: https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types REG_TYPE_NONE RegType = 0 REG_TYPE_SZ RegType = 1 REG_TYPE_EXPAND_SZ RegType = 2 REG_TYPE_BINARY RegType = 3 REG_TYPE_DWORD RegType = 4 REG_TYPE_DWORD_LITTLE_ENDIAN RegType = 4 REG_TYPE_DWORD_BIG_ENDIAN RegType = 5 REG_TYPE_LINK RegType = 6 REG_TYPE_MULTI_SZ RegType = 7 REG_TYPE_RESOURCE_LIST RegType = 8 REG_TYPE_FULL_RESOURCE_DESCRIPTOR RegType = 9 REG_TYPE_RESOURCE_REQUIREMENTS_LIST RegType = 10 REG_TYPE_QWORD RegType = 11 REG_TYPE_QWORD_LITTLE_ENDIAN RegType = 11 ) //sys ORCreateHive(key *ORHKey) (win32err error) = offreg.ORCreateHive //sys ORMergeHives(hiveHandles []ORHKey, result *ORHKey) (win32err error) = offreg.ORMergeHives //sys OROpenHive(hivePath string, result *ORHKey) (win32err error) = offreg.OROpenHive //sys ORCloseHive(handle ORHKey) (win32err error) = offreg.ORCloseHive //sys ORSaveHive(handle ORHKey, hivePath string, osMajorVersion uint32, osMinorVersion uint32) (win32err error) = offreg.ORSaveHive //sys OROpenKey(handle ORHKey, subKey string, result *ORHKey) (win32err error) = offreg.OROpenKey //sys ORCloseKey(handle ORHKey) (win32err error) = offreg.ORCloseKey //sys ORCreateKey(handle ORHKey, subKey string, class uintptr, options uint32, securityDescriptor uintptr, result *ORHKey, disposition *uint32) (win32err error) = offreg.ORCreateKey //sys ORDeleteKey(handle ORHKey, subKey string) (win32err error) = offreg.ORDeleteKey //sys ORGetValue(handle ORHKey, subKey string, value string, valueType *uint32, data *byte, dataLen *uint32) (win32err error) = offreg.ORGetValue //sys ORSetValue(handle ORHKey, valueName string, valueType uint32, data *byte, dataLen uint32) (win32err error) = offreg.ORSetValue ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/path.go ================================================ package winapi // DWORD SearchPathW( // LPCWSTR lpPath, // LPCWSTR lpFileName, // LPCWSTR lpExtension, // DWORD nBufferLength, // LPWSTR lpBuffer, // LPWSTR *lpFilePart // ); // //sys SearchPath(lpPath *uint16, lpFileName *uint16, lpExtension *uint16, nBufferLength uint32, lpBuffer *uint16, lpFilePath *uint16) (size uint32, err error) = kernel32.SearchPathW ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go ================================================ package winapi const PROCESS_ALL_ACCESS uint32 = 2097151 const ( PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x20016 PROC_THREAD_ATTRIBUTE_JOB_LIST = 0x2000D ) // ProcessVmCounters corresponds to the _VM_COUNTERS_EX and _VM_COUNTERS_EX2 structures. const ProcessVmCounters = 3 // __kernel_entry NTSTATUS NtQueryInformationProcess( // [in] HANDLE ProcessHandle, // [in] PROCESSINFOCLASS ProcessInformationClass, // [out] PVOID ProcessInformation, // [in] ULONG ProcessInformationLength, // [out, optional] PULONG ReturnLength // ); // //sys NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQueryInformationProcess // typedef struct _VM_COUNTERS_EX { // SIZE_T PeakVirtualSize; // SIZE_T VirtualSize; // ULONG PageFaultCount; // SIZE_T PeakWorkingSetSize; // SIZE_T WorkingSetSize; // SIZE_T QuotaPeakPagedPoolUsage; // SIZE_T QuotaPagedPoolUsage; // SIZE_T QuotaPeakNonPagedPoolUsage; // SIZE_T QuotaNonPagedPoolUsage; // SIZE_T PagefileUsage; // SIZE_T PeakPagefileUsage; // SIZE_T PrivateUsage; // } VM_COUNTERS_EX, *PVM_COUNTERS_EX; type VM_COUNTERS_EX struct { PeakVirtualSize uintptr VirtualSize uintptr PageFaultCount uint32 PeakWorkingSetSize uintptr WorkingSetSize uintptr QuotaPeakPagedPoolUsage uintptr QuotaPagedPoolUsage uintptr QuotaPeakNonPagedPoolUsage uintptr QuotaNonPagedPoolUsage uintptr PagefileUsage uintptr PeakPagefileUsage uintptr PrivateUsage uintptr } // typedef struct _VM_COUNTERS_EX2 { // VM_COUNTERS_EX CountersEx; // SIZE_T PrivateWorkingSetSize; // SIZE_T SharedCommitUsage; // } VM_COUNTERS_EX2, *PVM_COUNTERS_EX2; type VM_COUNTERS_EX2 struct { CountersEx VM_COUNTERS_EX PrivateWorkingSetSize uintptr SharedCommitUsage uintptr } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/processor.go ================================================ package winapi // Get count from all processor groups. // https://docs.microsoft.com/en-us/windows/win32/procthread/processor-groups const ALL_PROCESSOR_GROUPS = 0xFFFF //sys GetActiveProcessorCount(groupNumber uint16) (amount uint32) = kernel32.GetActiveProcessorCount ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go ================================================ //go:build windows package winapi import "golang.org/x/sys/windows" const SystemProcessInformation = 5 const STATUS_INFO_LENGTH_MISMATCH = 0xC0000004 // __kernel_entry NTSTATUS NtQuerySystemInformation( // SYSTEM_INFORMATION_CLASS SystemInformationClass, // PVOID SystemInformation, // ULONG SystemInformationLength, // PULONG ReturnLength // ); // //sys NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQuerySystemInformation type SYSTEM_PROCESS_INFORMATION struct { NextEntryOffset uint32 // ULONG NumberOfThreads uint32 // ULONG WorkingSetPrivateSize int64 // LARGE_INTEGER HardFaultCount uint32 // ULONG NumberOfThreadsHighWatermark uint32 // ULONG CycleTime uint64 // ULONGLONG CreateTime int64 // LARGE_INTEGER UserTime int64 // LARGE_INTEGER KernelTime int64 // LARGE_INTEGER ImageName UnicodeString // UNICODE_STRING BasePriority int32 // KPRIORITY UniqueProcessID windows.Handle // HANDLE InheritedFromUniqueProcessID windows.Handle // HANDLE HandleCount uint32 // ULONG SessionID uint32 // ULONG UniqueProcessKey *uint32 // ULONG_PTR PeakVirtualSize uintptr // SIZE_T VirtualSize uintptr // SIZE_T PageFaultCount uint32 // ULONG PeakWorkingSetSize uintptr // SIZE_T WorkingSetSize uintptr // SIZE_T QuotaPeakPagedPoolUsage uintptr // SIZE_T QuotaPagedPoolUsage uintptr // SIZE_T QuotaPeakNonPagedPoolUsage uintptr // SIZE_T QuotaNonPagedPoolUsage uintptr // SIZE_T PagefileUsage uintptr // SIZE_T PeakPagefileUsage uintptr // SIZE_T PrivatePageCount uintptr // SIZE_T ReadOperationCount int64 // LARGE_INTEGER WriteOperationCount int64 // LARGE_INTEGER OtherOperationCount int64 // LARGE_INTEGER ReadTransferCount int64 // LARGE_INTEGER WriteTransferCount int64 // LARGE_INTEGER OtherTransferCount int64 // LARGE_INTEGER } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/thread.go ================================================ package winapi // HANDLE CreateRemoteThread( // HANDLE hProcess, // LPSECURITY_ATTRIBUTES lpThreadAttributes, // SIZE_T dwStackSize, // LPTHREAD_START_ROUTINE lpStartAddress, // LPVOID lpParameter, // DWORD dwCreationFlags, // LPDWORD lpThreadId // ); // //sys CreateRemoteThread(process windows.Handle, sa *windows.SecurityAttributes, stackSize uint32, startAddr uintptr, parameter uintptr, creationFlags uint32, threadID *uint32) (handle windows.Handle, err error) = kernel32.CreateRemoteThread ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/user.go ================================================ //go:build windows package winapi import ( "syscall" "golang.org/x/sys/windows" ) const UserNameCharLimit = 20 const ( USER_PRIV_GUEST uint32 = iota USER_PRIV_USER USER_PRIV_ADMIN ) const ( UF_NORMAL_ACCOUNT = 0x00200 UF_DONT_EXPIRE_PASSWD = 0x10000 ) const NERR_UserNotFound = syscall.Errno(0x8AD) // typedef struct _LOCALGROUP_MEMBERS_INFO_0 { // PSID lgrmi0_sid; // } LOCALGROUP_MEMBERS_INFO_0, *PLOCALGROUP_MEMBERS_INFO_0, *LPLOCALGROUP_MEMBERS_INFO_0; type LocalGroupMembersInfo0 struct { Sid *windows.SID } // typedef struct _LOCALGROUP_INFO_1 { // LPWSTR lgrpi1_name; // LPWSTR lgrpi1_comment; // } LOCALGROUP_INFO_1, *PLOCALGROUP_INFO_1, *LPLOCALGROUP_INFO_1; type LocalGroupInfo1 struct { Name *uint16 Comment *uint16 } // typedef struct _USER_INFO_1 { // LPWSTR usri1_name; // LPWSTR usri1_password; // DWORD usri1_password_age; // DWORD usri1_priv; // LPWSTR usri1_home_dir; // LPWSTR usri1_comment; // DWORD usri1_flags; // LPWSTR usri1_script_path; // } USER_INFO_1, *PUSER_INFO_1, *LPUSER_INFO_1; type UserInfo1 struct { Name *uint16 Password *uint16 PasswordAge uint32 Priv uint32 HomeDir *uint16 Comment *uint16 Flags uint32 ScriptPath *uint16 } // NET_API_STATUS NET_API_FUNCTION NetLocalGroupGetInfo( // [in] LPCWSTR servername, // [in] LPCWSTR groupname, // [in] DWORD level, // [out] LPBYTE *bufptr // ); // //sys netLocalGroupGetInfo(serverName *uint16, groupName *uint16, level uint32, bufptr **byte) (status error) = netapi32.NetLocalGroupGetInfo // NetLocalGroupGetInfo is a slightly go friendlier wrapper around the NetLocalGroupGetInfo function. Instead of taking in *uint16's, it takes in // go strings and does the conversion internally. func NetLocalGroupGetInfo(serverName, groupName string, level uint32, bufPtr **byte) (err error) { var ( serverNameUTF16 *uint16 groupNameUTF16 *uint16 ) if serverName != "" { serverNameUTF16, err = windows.UTF16PtrFromString(serverName) if err != nil { return err } } if groupName != "" { groupNameUTF16, err = windows.UTF16PtrFromString(groupName) if err != nil { return err } } return netLocalGroupGetInfo( serverNameUTF16, groupNameUTF16, level, bufPtr, ) } // NET_API_STATUS NET_API_FUNCTION NetUserAdd( // [in] LPCWSTR servername, // [in] DWORD level, // [in] LPBYTE buf, // [out] LPDWORD parm_err // ); // //sys netUserAdd(serverName *uint16, level uint32, buf *byte, parm_err *uint32) (status error) = netapi32.NetUserAdd // NetUserAdd is a slightly go friendlier wrapper around the NetUserAdd function. Instead of taking in *uint16's, it takes in // go strings and does the conversion internally. func NetUserAdd(serverName string, level uint32, buf *byte, parm_err *uint32) (err error) { var serverNameUTF16 *uint16 if serverName != "" { serverNameUTF16, err = windows.UTF16PtrFromString(serverName) if err != nil { return err } } return netUserAdd( serverNameUTF16, level, buf, parm_err, ) } // NET_API_STATUS NET_API_FUNCTION NetUserDel( // [in] LPCWSTR servername, // [in] LPCWSTR username // ); // //sys netUserDel(serverName *uint16, username *uint16) (status error) = netapi32.NetUserDel // NetUserDel is a slightly go friendlier wrapper around the NetUserDel function. Instead of taking in *uint16's, it takes in // go strings and does the conversion internally. func NetUserDel(serverName, userName string) (err error) { var ( serverNameUTF16 *uint16 userNameUTF16 *uint16 ) if serverName != "" { serverNameUTF16, err = windows.UTF16PtrFromString(serverName) if err != nil { return err } } if userName != "" { userNameUTF16, err = windows.UTF16PtrFromString(userName) if err != nil { return err } } return netUserDel( serverNameUTF16, userNameUTF16, ) } // NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers( // [in] LPCWSTR servername, // [in] LPCWSTR groupname, // [in] DWORD level, // [in] LPBYTE buf, // [in] DWORD totalentries // ); // //sys netLocalGroupAddMembers(serverName *uint16, groupName *uint16, level uint32, buf *byte, totalEntries uint32) (status error) = netapi32.NetLocalGroupAddMembers // NetLocalGroupAddMembers is a slightly go friendlier wrapper around the NetLocalGroupAddMembers function. Instead of taking in *uint16's, it takes in // go strings and does the conversion internally. func NetLocalGroupAddMembers(serverName, groupName string, level uint32, buf *byte, totalEntries uint32) (err error) { var ( serverNameUTF16 *uint16 groupNameUTF16 *uint16 ) if serverName != "" { serverNameUTF16, err = windows.UTF16PtrFromString(serverName) if err != nil { return err } } if groupName != "" { groupNameUTF16, err = windows.UTF16PtrFromString(groupName) if err != nil { return err } } return netLocalGroupAddMembers( serverNameUTF16, groupNameUTF16, level, buf, totalEntries, ) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go ================================================ //go:build windows package winapi import ( "errors" "syscall" "unsafe" "golang.org/x/sys/windows" ) // Uint16BufferToSlice wraps a uint16 pointer-and-length into a slice // for easier interop with Go APIs func Uint16BufferToSlice(buffer *uint16, bufferLength int) (result []uint16) { result = unsafe.Slice(buffer, bufferLength) return } // UnicodeString corresponds to UNICODE_STRING win32 struct defined here // https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_unicode_string type UnicodeString struct { Length uint16 MaximumLength uint16 Buffer *uint16 } // NTSTRSAFE_UNICODE_STRING_MAX_CCH is a constant defined in ntstrsafe.h. This value // denotes the maximum number of wide chars a path can have. const NTSTRSAFE_UNICODE_STRING_MAX_CCH = 32767 // String converts a UnicodeString to a golang string func (uni UnicodeString) String() string { // UnicodeString is not guaranteed to be null terminated, therefore // use the UnicodeString's Length field return windows.UTF16ToString(Uint16BufferToSlice(uni.Buffer, int(uni.Length/2))) } // NewUnicodeString allocates a new UnicodeString and copies `s` into // the buffer of the new UnicodeString. func NewUnicodeString(s string) (*UnicodeString, error) { buf, err := windows.UTF16FromString(s) if err != nil { return nil, err } if len(buf) > NTSTRSAFE_UNICODE_STRING_MAX_CCH { return nil, syscall.ENAMETOOLONG } uni := &UnicodeString{ // The length is in bytes and should not include the trailing null character. Length: uint16((len(buf) - 1) * 2), MaximumLength: uint16((len(buf) - 1) * 2), Buffer: &buf[0], } return uni, nil } // ConvertStringSetToSlice is a helper function used to convert the contents of // `buf` into a string slice. `buf` contains a set of null terminated strings // with an additional null at the end to indicate the end of the set. func ConvertStringSetToSlice(buf []byte) ([]string, error) { var results []string prev := 0 for i := range buf { if buf[i] == 0 { if prev == i { // found two null characters in a row, return result return results, nil } results = append(results, string(buf[prev:i])) prev = i + 1 } } return nil, errors.New("string set malformed: missing null terminator at end of buffer") } // ParseUtf16LE parses a UTF-16LE byte array into a string (without passing // through a uint16 or rune array). func ParseUtf16LE(b []byte) string { return windows.UTF16PtrToString((*uint16)(unsafe.Pointer(&b[0]))) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go ================================================ package winapi //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./*.go ================================================ FILE: vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package winapi import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") modbindfltapi = windows.NewLazySystemDLL("bindfltapi.dll") modcfgmgr32 = windows.NewLazySystemDLL("cfgmgr32.dll") modcimfs = windows.NewLazySystemDLL("cimfs.dll") modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll") modkernel32 = windows.NewLazySystemDLL("kernel32.dll") modnetapi32 = windows.NewLazySystemDLL("netapi32.dll") modntdll = windows.NewLazySystemDLL("ntdll.dll") modoffreg = windows.NewLazySystemDLL("offreg.dll") procLogonUserW = modadvapi32.NewProc("LogonUserW") procBfSetupFilter = modbindfltapi.NewProc("BfSetupFilter") procCM_Get_DevNode_PropertyW = modcfgmgr32.NewProc("CM_Get_DevNode_PropertyW") procCM_Get_Device_ID_ListA = modcfgmgr32.NewProc("CM_Get_Device_ID_ListA") procCM_Get_Device_ID_List_SizeA = modcfgmgr32.NewProc("CM_Get_Device_ID_List_SizeA") procCM_Locate_DevNodeW = modcfgmgr32.NewProc("CM_Locate_DevNodeW") procCimAddFsToMergedImage = modcimfs.NewProc("CimAddFsToMergedImage") procCimAddFsToMergedImage2 = modcimfs.NewProc("CimAddFsToMergedImage2") procCimCloseImage = modcimfs.NewProc("CimCloseImage") procCimCloseStream = modcimfs.NewProc("CimCloseStream") procCimCommitImage = modcimfs.NewProc("CimCommitImage") procCimCreateAlternateStream = modcimfs.NewProc("CimCreateAlternateStream") procCimCreateFile = modcimfs.NewProc("CimCreateFile") procCimCreateHardLink = modcimfs.NewProc("CimCreateHardLink") procCimCreateImage = modcimfs.NewProc("CimCreateImage") procCimCreateImage2 = modcimfs.NewProc("CimCreateImage2") procCimCreateMergeLink = modcimfs.NewProc("CimCreateMergeLink") procCimDeletePath = modcimfs.NewProc("CimDeletePath") procCimDismountImage = modcimfs.NewProc("CimDismountImage") procCimMergeMountImage = modcimfs.NewProc("CimMergeMountImage") procCimMountImage = modcimfs.NewProc("CimMountImage") procCimTombstoneFile = modcimfs.NewProc("CimTombstoneFile") procCimWriteStream = modcimfs.NewProc("CimWriteStream") procSetJobCompartmentId = modiphlpapi.NewProc("SetJobCompartmentId") procClosePseudoConsole = modkernel32.NewProc("ClosePseudoConsole") procCopyFileW = modkernel32.NewProc("CopyFileW") procCreatePseudoConsole = modkernel32.NewProc("CreatePseudoConsole") procCreateRemoteThread = modkernel32.NewProc("CreateRemoteThread") procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount") procIsProcessInJob = modkernel32.NewProc("IsProcessInJob") procLocalAlloc = modkernel32.NewProc("LocalAlloc") procLocalFree = modkernel32.NewProc("LocalFree") procOpenJobObjectW = modkernel32.NewProc("OpenJobObjectW") procQueryInformationJobObject = modkernel32.NewProc("QueryInformationJobObject") procQueryIoRateControlInformationJobObject = modkernel32.NewProc("QueryIoRateControlInformationJobObject") procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") procSearchPathW = modkernel32.NewProc("SearchPathW") procSetIoRateControlInformationJobObject = modkernel32.NewProc("SetIoRateControlInformationJobObject") procNetLocalGroupAddMembers = modnetapi32.NewProc("NetLocalGroupAddMembers") procNetLocalGroupGetInfo = modnetapi32.NewProc("NetLocalGroupGetInfo") procNetUserAdd = modnetapi32.NewProc("NetUserAdd") procNetUserDel = modnetapi32.NewProc("NetUserDel") procNtCreateFile = modntdll.NewProc("NtCreateFile") procNtCreateJobObject = modntdll.NewProc("NtCreateJobObject") procNtOpenDirectoryObject = modntdll.NewProc("NtOpenDirectoryObject") procNtOpenJobObject = modntdll.NewProc("NtOpenJobObject") procNtQueryDirectoryObject = modntdll.NewProc("NtQueryDirectoryObject") procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess") procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation") procNtSetInformationFile = modntdll.NewProc("NtSetInformationFile") procRtlNtStatusToDosError = modntdll.NewProc("RtlNtStatusToDosError") procORCloseHive = modoffreg.NewProc("ORCloseHive") procORCloseKey = modoffreg.NewProc("ORCloseKey") procORCreateHive = modoffreg.NewProc("ORCreateHive") procORCreateKey = modoffreg.NewProc("ORCreateKey") procORDeleteKey = modoffreg.NewProc("ORDeleteKey") procORGetValue = modoffreg.NewProc("ORGetValue") procORMergeHives = modoffreg.NewProc("ORMergeHives") procOROpenHive = modoffreg.NewProc("OROpenHive") procOROpenKey = modoffreg.NewProc("OROpenKey") procORSaveHive = modoffreg.NewProc("ORSaveHive") procORSetValue = modoffreg.NewProc("ORSetValue") ) func LogonUser(username *uint16, domain *uint16, password *uint16, logonType uint32, logonProvider uint32, token *windows.Token) (err error) { r1, _, e1 := syscall.SyscallN(procLogonUserW.Addr(), uintptr(unsafe.Pointer(username)), uintptr(unsafe.Pointer(domain)), uintptr(unsafe.Pointer(password)), uintptr(logonType), uintptr(logonProvider), uintptr(unsafe.Pointer(token))) if r1 == 0 { err = errnoErr(e1) } return } func BfSetupFilter(jobHandle windows.Handle, flags uint32, virtRootPath *uint16, virtTargetPath *uint16, virtExceptions **uint16, virtExceptionPathCount uint32) (hr error) { hr = procBfSetupFilter.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procBfSetupFilter.Addr(), uintptr(jobHandle), uintptr(flags), uintptr(unsafe.Pointer(virtRootPath)), uintptr(unsafe.Pointer(virtTargetPath)), uintptr(unsafe.Pointer(virtExceptions)), uintptr(virtExceptionPathCount)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CMGetDevNodeProperty(dnDevInst uint32, propertyKey *DevPropKey, propertyType *uint32, propertyBuffer *uint16, propertyBufferSize *uint32, uFlags uint32) (hr error) { r0, _, _ := syscall.SyscallN(procCM_Get_DevNode_PropertyW.Addr(), uintptr(dnDevInst), uintptr(unsafe.Pointer(propertyKey)), uintptr(unsafe.Pointer(propertyType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(unsafe.Pointer(propertyBufferSize)), uintptr(uFlags)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CMGetDeviceIDList(pszFilter *byte, buffer *byte, bufferLen uint32, uFlags uint32) (hr error) { r0, _, _ := syscall.SyscallN(procCM_Get_Device_ID_ListA.Addr(), uintptr(unsafe.Pointer(pszFilter)), uintptr(unsafe.Pointer(buffer)), uintptr(bufferLen), uintptr(uFlags)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CMGetDeviceIDListSize(pulLen *uint32, pszFilter *byte, uFlags uint32) (hr error) { r0, _, _ := syscall.SyscallN(procCM_Get_Device_ID_List_SizeA.Addr(), uintptr(unsafe.Pointer(pulLen)), uintptr(unsafe.Pointer(pszFilter)), uintptr(uFlags)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CMLocateDevNode(pdnDevInst *uint32, pDeviceID string, uFlags uint32) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(pDeviceID) if hr != nil { return } return _CMLocateDevNode(pdnDevInst, _p0, uFlags) } func _CMLocateDevNode(pdnDevInst *uint32, pDeviceID *uint16, uFlags uint32) (hr error) { r0, _, _ := syscall.SyscallN(procCM_Locate_DevNodeW.Addr(), uintptr(unsafe.Pointer(pdnDevInst)), uintptr(unsafe.Pointer(pDeviceID)), uintptr(uFlags)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimAddFsToMergedImage(cimFSHandle FsHandle, path string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _CimAddFsToMergedImage(cimFSHandle, _p0) } func _CimAddFsToMergedImage(cimFSHandle FsHandle, path *uint16) (hr error) { hr = procCimAddFsToMergedImage.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimAddFsToMergedImage.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimAddFsToMergedImage2(cimFSHandle FsHandle, path string, flags uint32) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _CimAddFsToMergedImage2(cimFSHandle, _p0, flags) } func _CimAddFsToMergedImage2(cimFSHandle FsHandle, path *uint16, flags uint32) (hr error) { hr = procCimAddFsToMergedImage2.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimAddFsToMergedImage2.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)), uintptr(flags)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimCloseImage(cimFSHandle FsHandle) (err error) { err = procCimCloseImage.Find() if err != nil { return } syscall.SyscallN(procCimCloseImage.Addr(), uintptr(cimFSHandle)) return } func CimCloseStream(cimStreamHandle StreamHandle) (hr error) { hr = procCimCloseStream.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimCloseStream.Addr(), uintptr(cimStreamHandle)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimCommitImage(cimFSHandle FsHandle) (hr error) { hr = procCimCommitImage.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimCommitImage.Addr(), uintptr(cimFSHandle)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimCreateAlternateStream(cimFSHandle FsHandle, path string, size uint64, cimStreamHandle *StreamHandle) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _CimCreateAlternateStream(cimFSHandle, _p0, size, cimStreamHandle) } func _CimCreateAlternateStream(cimFSHandle FsHandle, path *uint16, size uint64, cimStreamHandle *StreamHandle) (hr error) { hr = procCimCreateAlternateStream.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimCreateAlternateStream.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)), uintptr(size), uintptr(unsafe.Pointer(cimStreamHandle))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimCreateFile(cimFSHandle FsHandle, path string, file *CimFsFileMetadata, cimStreamHandle *StreamHandle) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _CimCreateFile(cimFSHandle, _p0, file, cimStreamHandle) } func _CimCreateFile(cimFSHandle FsHandle, path *uint16, file *CimFsFileMetadata, cimStreamHandle *StreamHandle) (hr error) { hr = procCimCreateFile.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimCreateFile.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(file)), uintptr(unsafe.Pointer(cimStreamHandle))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimCreateHardLink(cimFSHandle FsHandle, newPath string, oldPath string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(newPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(oldPath) if hr != nil { return } return _CimCreateHardLink(cimFSHandle, _p0, _p1) } func _CimCreateHardLink(cimFSHandle FsHandle, newPath *uint16, oldPath *uint16) (hr error) { hr = procCimCreateHardLink.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimCreateHardLink.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(newPath)), uintptr(unsafe.Pointer(oldPath))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimCreateImage(imagePath string, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(imagePath) if hr != nil { return } return _CimCreateImage(_p0, oldFSName, newFSName, cimFSHandle) } func _CimCreateImage(imagePath *uint16, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) { hr = procCimCreateImage.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimCreateImage.Addr(), uintptr(unsafe.Pointer(imagePath)), uintptr(unsafe.Pointer(oldFSName)), uintptr(unsafe.Pointer(newFSName)), uintptr(unsafe.Pointer(cimFSHandle))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimCreateImage2(imagePath string, flags uint32, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(imagePath) if hr != nil { return } return _CimCreateImage2(_p0, flags, oldFSName, newFSName, cimFSHandle) } func _CimCreateImage2(imagePath *uint16, flags uint32, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) { hr = procCimCreateImage2.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimCreateImage2.Addr(), uintptr(unsafe.Pointer(imagePath)), uintptr(flags), uintptr(unsafe.Pointer(oldFSName)), uintptr(unsafe.Pointer(newFSName)), uintptr(unsafe.Pointer(cimFSHandle))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimCreateMergeLink(cimFSHandle FsHandle, newPath string, oldPath string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(newPath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(oldPath) if hr != nil { return } return _CimCreateMergeLink(cimFSHandle, _p0, _p1) } func _CimCreateMergeLink(cimFSHandle FsHandle, newPath *uint16, oldPath *uint16) (hr error) { hr = procCimCreateMergeLink.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimCreateMergeLink.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(newPath)), uintptr(unsafe.Pointer(oldPath))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimDeletePath(cimFSHandle FsHandle, path string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _CimDeletePath(cimFSHandle, _p0) } func _CimDeletePath(cimFSHandle FsHandle, path *uint16) (hr error) { hr = procCimDeletePath.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimDeletePath.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimDismountImage(volumeID *g) (hr error) { hr = procCimDismountImage.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimDismountImage.Addr(), uintptr(unsafe.Pointer(volumeID))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimMergeMountImage(numCimPaths uint32, backingImagePaths *CimFsImagePath, flags uint32, volumeID *g) (hr error) { hr = procCimMergeMountImage.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimMergeMountImage.Addr(), uintptr(numCimPaths), uintptr(unsafe.Pointer(backingImagePaths)), uintptr(flags), uintptr(unsafe.Pointer(volumeID))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimMountImage(imagePath string, fsName string, flags uint32, volumeID *g) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(imagePath) if hr != nil { return } var _p1 *uint16 _p1, hr = syscall.UTF16PtrFromString(fsName) if hr != nil { return } return _CimMountImage(_p0, _p1, flags, volumeID) } func _CimMountImage(imagePath *uint16, fsName *uint16, flags uint32, volumeID *g) (hr error) { hr = procCimMountImage.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimMountImage.Addr(), uintptr(unsafe.Pointer(imagePath)), uintptr(unsafe.Pointer(fsName)), uintptr(flags), uintptr(unsafe.Pointer(volumeID))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimTombstoneFile(cimFSHandle FsHandle, path string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(path) if hr != nil { return } return _CimTombstoneFile(cimFSHandle, _p0) } func _CimTombstoneFile(cimFSHandle FsHandle, path *uint16) (hr error) { hr = procCimTombstoneFile.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimTombstoneFile.Addr(), uintptr(cimFSHandle), uintptr(unsafe.Pointer(path))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CimWriteStream(cimStreamHandle StreamHandle, buffer uintptr, bufferSize uint32) (hr error) { hr = procCimWriteStream.Find() if hr != nil { return } r0, _, _ := syscall.SyscallN(procCimWriteStream.Addr(), uintptr(cimStreamHandle), uintptr(buffer), uintptr(bufferSize)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func SetJobCompartmentId(handle windows.Handle, compartmentId uint32) (win32Err error) { r0, _, _ := syscall.SyscallN(procSetJobCompartmentId.Addr(), uintptr(handle), uintptr(compartmentId)) if r0 != 0 { win32Err = syscall.Errno(r0) } return } func ClosePseudoConsole(hpc windows.Handle) { syscall.SyscallN(procClosePseudoConsole.Addr(), uintptr(hpc)) return } func CopyFileW(existingFileName *uint16, newFileName *uint16, failIfExists int32) (err error) { r1, _, e1 := syscall.SyscallN(procCopyFileW.Addr(), uintptr(unsafe.Pointer(existingFileName)), uintptr(unsafe.Pointer(newFileName)), uintptr(failIfExists)) if r1 == 0 { err = errnoErr(e1) } return } func createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) { r0, _, _ := syscall.SyscallN(procCreatePseudoConsole.Addr(), uintptr(size), uintptr(hInput), uintptr(hOutput), uintptr(dwFlags), uintptr(unsafe.Pointer(hpcon))) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func CreateRemoteThread(process windows.Handle, sa *windows.SecurityAttributes, stackSize uint32, startAddr uintptr, parameter uintptr, creationFlags uint32, threadID *uint32) (handle windows.Handle, err error) { r0, _, e1 := syscall.SyscallN(procCreateRemoteThread.Addr(), uintptr(process), uintptr(unsafe.Pointer(sa)), uintptr(stackSize), uintptr(startAddr), uintptr(parameter), uintptr(creationFlags), uintptr(unsafe.Pointer(threadID))) handle = windows.Handle(r0) if handle == 0 { err = errnoErr(e1) } return } func GetActiveProcessorCount(groupNumber uint16) (amount uint32) { r0, _, _ := syscall.SyscallN(procGetActiveProcessorCount.Addr(), uintptr(groupNumber)) amount = uint32(r0) return } func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) { r1, _, e1 := syscall.SyscallN(procIsProcessInJob.Addr(), uintptr(procHandle), uintptr(jobHandle), uintptr(unsafe.Pointer(result))) if r1 == 0 { err = errnoErr(e1) } return } func LocalAlloc(flags uint32, size int) (ptr uintptr) { r0, _, _ := syscall.SyscallN(procLocalAlloc.Addr(), uintptr(flags), uintptr(size)) ptr = uintptr(r0) return } func LocalFree(ptr uintptr) { syscall.SyscallN(procLocalFree.Addr(), uintptr(ptr)) return } func OpenJobObject(desiredAccess uint32, inheritHandle bool, lpName *uint16) (handle windows.Handle, err error) { var _p0 uint32 if inheritHandle { _p0 = 1 } r0, _, e1 := syscall.SyscallN(procOpenJobObjectW.Addr(), uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(lpName))) handle = windows.Handle(r0) if handle == 0 { err = errnoErr(e1) } return } func QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) { r1, _, e1 := syscall.SyscallN(procQueryInformationJobObject.Addr(), uintptr(jobHandle), uintptr(infoClass), uintptr(jobObjectInfo), uintptr(jobObjectInformationLength), uintptr(unsafe.Pointer(lpReturnLength))) if r1 == 0 { err = errnoErr(e1) } return } func QueryIoRateControlInformationJobObject(jobHandle windows.Handle, volumeName *uint16, ioRateControlInfo **JOBOBJECT_IO_RATE_CONTROL_INFORMATION, infoBlockCount *uint32) (ret uint32, err error) { r0, _, e1 := syscall.SyscallN(procQueryIoRateControlInformationJobObject.Addr(), uintptr(jobHandle), uintptr(unsafe.Pointer(volumeName)), uintptr(unsafe.Pointer(ioRateControlInfo)), uintptr(unsafe.Pointer(infoBlockCount))) ret = uint32(r0) if ret == 0 { err = errnoErr(e1) } return } func resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) { r0, _, _ := syscall.SyscallN(procResizePseudoConsole.Addr(), uintptr(hPc), uintptr(size)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } func SearchPath(lpPath *uint16, lpFileName *uint16, lpExtension *uint16, nBufferLength uint32, lpBuffer *uint16, lpFilePath *uint16) (size uint32, err error) { r0, _, e1 := syscall.SyscallN(procSearchPathW.Addr(), uintptr(unsafe.Pointer(lpPath)), uintptr(unsafe.Pointer(lpFileName)), uintptr(unsafe.Pointer(lpExtension)), uintptr(nBufferLength), uintptr(unsafe.Pointer(lpBuffer)), uintptr(unsafe.Pointer(lpFilePath))) size = uint32(r0) if size == 0 { err = errnoErr(e1) } return } func SetIoRateControlInformationJobObject(jobHandle windows.Handle, ioRateControlInfo *JOBOBJECT_IO_RATE_CONTROL_INFORMATION) (ret uint32, err error) { r0, _, e1 := syscall.SyscallN(procSetIoRateControlInformationJobObject.Addr(), uintptr(jobHandle), uintptr(unsafe.Pointer(ioRateControlInfo))) ret = uint32(r0) if ret == 0 { err = errnoErr(e1) } return } func netLocalGroupAddMembers(serverName *uint16, groupName *uint16, level uint32, buf *byte, totalEntries uint32) (status error) { r0, _, _ := syscall.SyscallN(procNetLocalGroupAddMembers.Addr(), uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(groupName)), uintptr(level), uintptr(unsafe.Pointer(buf)), uintptr(totalEntries)) if r0 != 0 { status = syscall.Errno(r0) } return } func netLocalGroupGetInfo(serverName *uint16, groupName *uint16, level uint32, bufptr **byte) (status error) { r0, _, _ := syscall.SyscallN(procNetLocalGroupGetInfo.Addr(), uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(groupName)), uintptr(level), uintptr(unsafe.Pointer(bufptr))) if r0 != 0 { status = syscall.Errno(r0) } return } func netUserAdd(serverName *uint16, level uint32, buf *byte, parm_err *uint32) (status error) { r0, _, _ := syscall.SyscallN(procNetUserAdd.Addr(), uintptr(unsafe.Pointer(serverName)), uintptr(level), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(parm_err))) if r0 != 0 { status = syscall.Errno(r0) } return } func netUserDel(serverName *uint16, username *uint16) (status error) { r0, _, _ := syscall.SyscallN(procNetUserDel.Addr(), uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(username))) if r0 != 0 { status = syscall.Errno(r0) } return } func NtCreateFile(handle *uintptr, accessMask uint32, oa *ObjectAttributes, iosb *IOStatusBlock, allocationSize *uint64, fileAttributes uint32, shareAccess uint32, createDisposition uint32, createOptions uint32, eaBuffer *byte, eaLength uint32) (status uint32) { r0, _, _ := syscall.SyscallN(procNtCreateFile.Addr(), uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(unsafe.Pointer(allocationSize)), uintptr(fileAttributes), uintptr(shareAccess), uintptr(createDisposition), uintptr(createOptions), uintptr(unsafe.Pointer(eaBuffer)), uintptr(eaLength)) status = uint32(r0) return } func NtCreateJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) { r0, _, _ := syscall.SyscallN(procNtCreateJobObject.Addr(), uintptr(unsafe.Pointer(jobHandle)), uintptr(desiredAccess), uintptr(unsafe.Pointer(objAttributes))) status = uint32(r0) return } func NtOpenDirectoryObject(handle *uintptr, accessMask uint32, oa *ObjectAttributes) (status uint32) { r0, _, _ := syscall.SyscallN(procNtOpenDirectoryObject.Addr(), uintptr(unsafe.Pointer(handle)), uintptr(accessMask), uintptr(unsafe.Pointer(oa))) status = uint32(r0) return } func NtOpenJobObject(jobHandle *windows.Handle, desiredAccess uint32, objAttributes *ObjectAttributes) (status uint32) { r0, _, _ := syscall.SyscallN(procNtOpenJobObject.Addr(), uintptr(unsafe.Pointer(jobHandle)), uintptr(desiredAccess), uintptr(unsafe.Pointer(objAttributes))) status = uint32(r0) return } func NtQueryDirectoryObject(handle uintptr, buffer *byte, length uint32, singleEntry bool, restartScan bool, context *uint32, returnLength *uint32) (status uint32) { var _p0 uint32 if singleEntry { _p0 = 1 } var _p1 uint32 if restartScan { _p1 = 1 } r0, _, _ := syscall.SyscallN(procNtQueryDirectoryObject.Addr(), uintptr(handle), uintptr(unsafe.Pointer(buffer)), uintptr(length), uintptr(_p0), uintptr(_p1), uintptr(unsafe.Pointer(context)), uintptr(unsafe.Pointer(returnLength))) status = uint32(r0) return } func NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) { r0, _, _ := syscall.SyscallN(procNtQueryInformationProcess.Addr(), uintptr(processHandle), uintptr(processInfoClass), uintptr(processInfo), uintptr(processInfoLength), uintptr(unsafe.Pointer(returnLength))) status = uint32(r0) return } func NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) { r0, _, _ := syscall.SyscallN(procNtQuerySystemInformation.Addr(), uintptr(systemInfoClass), uintptr(systemInformation), uintptr(systemInfoLength), uintptr(unsafe.Pointer(returnLength))) status = uint32(r0) return } func NtSetInformationFile(handle uintptr, iosb *IOStatusBlock, information uintptr, length uint32, class uint32) (status uint32) { r0, _, _ := syscall.SyscallN(procNtSetInformationFile.Addr(), uintptr(handle), uintptr(unsafe.Pointer(iosb)), uintptr(information), uintptr(length), uintptr(class)) status = uint32(r0) return } func RtlNtStatusToDosError(status uint32) (winerr error) { r0, _, _ := syscall.SyscallN(procRtlNtStatusToDosError.Addr(), uintptr(status)) if r0 != 0 { winerr = syscall.Errno(r0) } return } func ORCloseHive(handle ORHKey) (win32err error) { r0, _, _ := syscall.SyscallN(procORCloseHive.Addr(), uintptr(handle)) if r0 != 0 { win32err = syscall.Errno(r0) } return } func ORCloseKey(handle ORHKey) (win32err error) { r0, _, _ := syscall.SyscallN(procORCloseKey.Addr(), uintptr(handle)) if r0 != 0 { win32err = syscall.Errno(r0) } return } func ORCreateHive(key *ORHKey) (win32err error) { r0, _, _ := syscall.SyscallN(procORCreateHive.Addr(), uintptr(unsafe.Pointer(key))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func ORCreateKey(handle ORHKey, subKey string, class uintptr, options uint32, securityDescriptor uintptr, result *ORHKey, disposition *uint32) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(subKey) if win32err != nil { return } return _ORCreateKey(handle, _p0, class, options, securityDescriptor, result, disposition) } func _ORCreateKey(handle ORHKey, subKey *uint16, class uintptr, options uint32, securityDescriptor uintptr, result *ORHKey, disposition *uint32) (win32err error) { r0, _, _ := syscall.SyscallN(procORCreateKey.Addr(), uintptr(handle), uintptr(unsafe.Pointer(subKey)), uintptr(class), uintptr(options), uintptr(securityDescriptor), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func ORDeleteKey(handle ORHKey, subKey string) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(subKey) if win32err != nil { return } return _ORDeleteKey(handle, _p0) } func _ORDeleteKey(handle ORHKey, subKey *uint16) (win32err error) { r0, _, _ := syscall.SyscallN(procORDeleteKey.Addr(), uintptr(handle), uintptr(unsafe.Pointer(subKey))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func ORGetValue(handle ORHKey, subKey string, value string, valueType *uint32, data *byte, dataLen *uint32) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(subKey) if win32err != nil { return } var _p1 *uint16 _p1, win32err = syscall.UTF16PtrFromString(value) if win32err != nil { return } return _ORGetValue(handle, _p0, _p1, valueType, data, dataLen) } func _ORGetValue(handle ORHKey, subKey *uint16, value *uint16, valueType *uint32, data *byte, dataLen *uint32) (win32err error) { r0, _, _ := syscall.SyscallN(procORGetValue.Addr(), uintptr(handle), uintptr(unsafe.Pointer(subKey)), uintptr(unsafe.Pointer(value)), uintptr(unsafe.Pointer(valueType)), uintptr(unsafe.Pointer(data)), uintptr(unsafe.Pointer(dataLen))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func ORMergeHives(hiveHandles []ORHKey, result *ORHKey) (win32err error) { var _p0 *ORHKey if len(hiveHandles) > 0 { _p0 = &hiveHandles[0] } r0, _, _ := syscall.SyscallN(procORMergeHives.Addr(), uintptr(unsafe.Pointer(_p0)), uintptr(len(hiveHandles)), uintptr(unsafe.Pointer(result))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func OROpenHive(hivePath string, result *ORHKey) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(hivePath) if win32err != nil { return } return _OROpenHive(_p0, result) } func _OROpenHive(hivePath *uint16, result *ORHKey) (win32err error) { r0, _, _ := syscall.SyscallN(procOROpenHive.Addr(), uintptr(unsafe.Pointer(hivePath)), uintptr(unsafe.Pointer(result))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func OROpenKey(handle ORHKey, subKey string, result *ORHKey) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(subKey) if win32err != nil { return } return _OROpenKey(handle, _p0, result) } func _OROpenKey(handle ORHKey, subKey *uint16, result *ORHKey) (win32err error) { r0, _, _ := syscall.SyscallN(procOROpenKey.Addr(), uintptr(handle), uintptr(unsafe.Pointer(subKey)), uintptr(unsafe.Pointer(result))) if r0 != 0 { win32err = syscall.Errno(r0) } return } func ORSaveHive(handle ORHKey, hivePath string, osMajorVersion uint32, osMinorVersion uint32) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(hivePath) if win32err != nil { return } return _ORSaveHive(handle, _p0, osMajorVersion, osMinorVersion) } func _ORSaveHive(handle ORHKey, hivePath *uint16, osMajorVersion uint32, osMinorVersion uint32) (win32err error) { r0, _, _ := syscall.SyscallN(procORSaveHive.Addr(), uintptr(handle), uintptr(unsafe.Pointer(hivePath)), uintptr(osMajorVersion), uintptr(osMinorVersion)) if r0 != 0 { win32err = syscall.Errno(r0) } return } func ORSetValue(handle ORHKey, valueName string, valueType uint32, data *byte, dataLen uint32) (win32err error) { var _p0 *uint16 _p0, win32err = syscall.UTF16PtrFromString(valueName) if win32err != nil { return } return _ORSetValue(handle, _p0, valueType, data, dataLen) } func _ORSetValue(handle ORHKey, valueName *uint16, valueType uint32, data *byte, dataLen uint32) (win32err error) { r0, _, _ := syscall.SyscallN(procORSetValue.Addr(), uintptr(handle), uintptr(unsafe.Pointer(valueName)), uintptr(valueType), uintptr(unsafe.Pointer(data)), uintptr(dataLen)) if r0 != 0 { win32err = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/layer.go ================================================ //go:build windows package hcsshim import ( "context" "crypto/sha1" "path/filepath" "github.com/Microsoft/go-winio/pkg/guid" "github.com/Microsoft/hcsshim/internal/wclayer" ) func layerPath(info *DriverInfo, id string) string { return filepath.Join(info.HomeDir, id) } func ActivateLayer(info DriverInfo, id string) error { return wclayer.ActivateLayer(context.Background(), layerPath(&info, id)) } func CreateLayer(info DriverInfo, id, parent string) error { return wclayer.CreateLayer(context.Background(), layerPath(&info, id), parent) } // New clients should use CreateScratchLayer instead. Kept in to preserve API compatibility. func CreateSandboxLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error { return wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) } func CreateScratchLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error { return wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) } func DeactivateLayer(info DriverInfo, id string) error { return wclayer.DeactivateLayer(context.Background(), layerPath(&info, id)) } func DestroyLayer(info DriverInfo, id string) error { return wclayer.DestroyLayer(context.Background(), layerPath(&info, id)) } // New clients should use ExpandScratchSize instead. Kept in to preserve API compatibility. func ExpandSandboxSize(info DriverInfo, layerId string, size uint64) error { return wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size) } func ExpandScratchSize(info DriverInfo, layerId string, size uint64) error { return wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size) } func ExportLayer(info DriverInfo, layerId string, exportFolderPath string, parentLayerPaths []string) error { return wclayer.ExportLayer(context.Background(), layerPath(&info, layerId), exportFolderPath, parentLayerPaths) } func GetLayerMountPath(info DriverInfo, id string) (string, error) { return wclayer.GetLayerMountPath(context.Background(), layerPath(&info, id)) } func GetSharedBaseImages() (imageData string, err error) { return wclayer.GetSharedBaseImages(context.Background()) } func ImportLayer(info DriverInfo, layerID string, importFolderPath string, parentLayerPaths []string) error { return wclayer.ImportLayer(context.Background(), layerPath(&info, layerID), importFolderPath, parentLayerPaths) } func LayerExists(info DriverInfo, id string) (bool, error) { return wclayer.LayerExists(context.Background(), layerPath(&info, id)) } func PrepareLayer(info DriverInfo, layerId string, parentLayerPaths []string) error { return wclayer.PrepareLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths) } func ProcessBaseLayer(path string) error { return wclayer.ProcessBaseLayer(context.Background(), path) } func ProcessUtilityVMImage(path string) error { return wclayer.ProcessUtilityVMImage(context.Background(), path) } func UnprepareLayer(info DriverInfo, layerId string) error { return wclayer.UnprepareLayer(context.Background(), layerPath(&info, layerId)) } func ConvertToBaseLayer(path string) error { return wclayer.ConvertToBaseLayer(context.Background(), path) } type DriverInfo struct { Flavour int HomeDir string } type GUID [16]byte func NameToGuid(name string) (id GUID, err error) { g, err := wclayer.NameToGuid(context.Background(), name) return g.ToWindowsArray(), err } func NewGUID(source string) *GUID { h := sha1.Sum([]byte(source)) var g GUID copy(g[0:], h[0:16]) return &g } func (g *GUID) ToString() string { return guid.FromWindowsArray(*g).String() } type LayerReader = wclayer.LayerReader func NewLayerReader(info DriverInfo, layerID string, parentLayerPaths []string) (LayerReader, error) { return wclayer.NewLayerReader(context.Background(), layerPath(&info, layerID), parentLayerPaths) } type LayerWriter = wclayer.LayerWriter func NewLayerWriter(info DriverInfo, layerID string, parentLayerPaths []string) (LayerWriter, error) { return wclayer.NewLayerWriter(context.Background(), layerPath(&info, layerID), parentLayerPaths) } type WC_LAYER_DESCRIPTOR = wclayer.WC_LAYER_DESCRIPTOR ================================================ FILE: vendor/github.com/Microsoft/hcsshim/osversion/osversion_windows.go ================================================ package osversion import ( "fmt" "sync" "golang.org/x/sys/windows" "golang.org/x/sys/windows/registry" ) // OSVersion is a wrapper for Windows version information // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx type OSVersion struct { Version uint32 MajorVersion uint8 MinorVersion uint8 Build uint16 } var ( osv OSVersion once sync.Once ) // Get gets the operating system version on Windows. // The calling application must be manifested to get the correct version information. func Get() OSVersion { once.Do(func() { v := *windows.RtlGetVersion() osv = OSVersion{} osv.MajorVersion = uint8(v.MajorVersion) osv.MinorVersion = uint8(v.MinorVersion) osv.Build = uint16(v.BuildNumber) // Fill version value so that existing clients don't break osv.Version = v.BuildNumber << 16 osv.Version = osv.Version | (uint32(v.MinorVersion) << 8) osv.Version = osv.Version | v.MajorVersion }) return osv } // Build gets the build-number on Windows // The calling application must be manifested to get the correct version information. func Build() uint16 { return Get().Build } // String returns the OSVersion formatted as a string. It implements the // [fmt.Stringer] interface. func (osv OSVersion) String() string { return fmt.Sprintf("%d.%d.%d", osv.MajorVersion, osv.MinorVersion, osv.Build) } // ToString returns the OSVersion formatted as a string. // // Deprecated: use [OSVersion.String]. func (osv OSVersion) ToString() string { return osv.String() } // Running `cmd /c ver` shows something like "10.0.20348.1000". The last component ("1000") is the revision // number func BuildRevision() (uint32, error) { k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) if err != nil { return 0, fmt.Errorf("open `CurrentVersion` registry key: %w", err) } defer k.Close() s, _, err := k.GetIntegerValue("UBR") if err != nil { return 0, fmt.Errorf("read `UBR` from registry: %w", err) } return uint32(s), nil } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/osversion/platform_compat_windows.go ================================================ package osversion // List of stable ABI compliant ltsc releases // Note: List must be sorted in ascending order var compatLTSCReleases = []uint16{ LTSC2022, LTSC2025, } // CheckHostAndContainerCompat checks if given host and container // OS versions are compatible. // It includes support for stable ABI compliant versions as well. // Every release after WS 2022 will support the previous ltsc // container image. Stable ABI is in preview mode for windows 11 client. // Refer: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-10#windows-server-host-os-compatibility func CheckHostAndContainerCompat(host, ctr OSVersion) bool { // check major minor versions of host and guest if host.MajorVersion != ctr.MajorVersion || host.MinorVersion != ctr.MinorVersion { return false } // If host is < WS 2022, exact version match is required if host.Build < LTSC2022 { return host.Build == ctr.Build } // Find the latest LTSC version that is earlier than the host version. // This is the earliest version of container that the host can run. // // If the host version is an LTSC, then it supports compatibility with // everything from the previous LTSC up to itself, so we want supportedLTSCRelease // to be the previous entry. // // If no match is found, then we know that the host is LTSC2022 exactly, // since we already checked that it's not less than LTSC2022. var supportedLTSCRelease uint16 = LTSC2022 for i := len(compatLTSCReleases) - 1; i >= 0; i-- { if host.Build > compatLTSCReleases[i] { supportedLTSCRelease = compatLTSCReleases[i] break } } return supportedLTSCRelease <= ctr.Build && ctr.Build <= host.Build } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go ================================================ package osversion // Windows Client and Server build numbers. // // See: // https://learn.microsoft.com/en-us/windows/release-health/release-information // https://learn.microsoft.com/en-us/windows/release-health/windows-server-release-info // https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information const ( // RS1 (version 1607, codename "Redstone 1") corresponds to Windows Server // 2016 (ltsc2016) and Windows 10 (Anniversary Update). RS1 = 14393 // V1607 (version 1607, codename "Redstone 1") is an alias for [RS1]. V1607 = RS1 // LTSC2016 (Windows Server 2016) is an alias for [RS1]. LTSC2016 = RS1 // RS2 (version 1703, codename "Redstone 2") was a client-only update, and // corresponds to Windows 10 (Creators Update). RS2 = 15063 // V1703 (version 1703, codename "Redstone 2") is an alias for [RS2]. V1703 = RS2 // RS3 (version 1709, codename "Redstone 3") corresponds to Windows Server // 1709 (Semi-Annual Channel (SAC)), and Windows 10 (Fall Creators Update). RS3 = 16299 // V1709 (version 1709, codename "Redstone 3") is an alias for [RS3]. V1709 = RS3 // RS4 (version 1803, codename "Redstone 4") corresponds to Windows Server // 1803 (Semi-Annual Channel (SAC)), and Windows 10 (April 2018 Update). RS4 = 17134 // V1803 (version 1803, codename "Redstone 4") is an alias for [RS4]. V1803 = RS4 // RS5 (version 1809, codename "Redstone 5") corresponds to Windows Server // 2019 (ltsc2019), and Windows 10 (October 2018 Update). RS5 = 17763 // V1809 (version 1809, codename "Redstone 5") is an alias for [RS5]. V1809 = RS5 // LTSC2019 (Windows Server 2019) is an alias for [RS5]. LTSC2019 = RS5 // V19H1 (version 1903, codename 19H1) corresponds to Windows Server 1903 (semi-annual // channel). V19H1 = 18362 // V1903 (version 1903) is an alias for [V19H1]. V1903 = V19H1 // V19H2 (version 1909, codename 19H2) corresponds to Windows Server 1909 (semi-annual // channel). V19H2 = 18363 // V1909 (version 1909) is an alias for [V19H2]. V1909 = V19H2 // V20H1 (version 2004, codename 20H1) corresponds to Windows Server 2004 (semi-annual // channel). V20H1 = 19041 // V2004 (version 2004) is an alias for [V20H1]. V2004 = V20H1 // V20H2 corresponds to Windows Server 20H2 (semi-annual channel). V20H2 = 19042 // V21H1 corresponds to Windows Server 21H1 (semi-annual channel). V21H1 = 19043 // V21H2Win10 corresponds to Windows 10 (November 2021 Update). V21H2Win10 = 19044 // V21H2Server corresponds to Windows Server 2022 (ltsc2022). V21H2Server = 20348 // LTSC2022 (Windows Server 2022) is an alias for [V21H2Server] LTSC2022 = V21H2Server // V21H2Win11 corresponds to Windows 11 (original release). V21H2Win11 = 22000 // V22H2Win10 corresponds to Windows 10 (2022 Update). V22H2Win10 = 19045 // V22H2Win11 corresponds to Windows 11 (2022 Update). V22H2Win11 = 22621 // V23H2 is the 23H2 release in the Windows Server annual channel. V23H2 = 25398 // Windows Server 2025 build 26100 V25H1Server = 26100 LTSC2025 = V25H1Server ) ================================================ FILE: vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/doc.go ================================================ // Package ociwclayer provides functions for importing and exporting Windows // container layers from and to their OCI tar representation. package ociwclayer ================================================ FILE: vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/export.go ================================================ //go:build windows package ociwclayer import ( "archive/tar" "context" "errors" "io" "path/filepath" "github.com/Microsoft/go-winio/backuptar" "github.com/Microsoft/hcsshim/internal/wclayer" ) // ExportLayerToTar writes an OCI layer tar stream from the provided on-disk layer. // The caller must specify the parent layers, if any, ordered from lowest to // highest layer. // // The layer will be mounted for this process, so the caller should ensure that // it is not currently mounted. func ExportLayerToTar(ctx context.Context, w io.Writer, path string, parentLayerPaths []string) error { err := wclayer.ActivateLayer(ctx, path) if err != nil { return err } defer func() { _ = wclayer.DeactivateLayer(ctx, path) }() // Prepare and unprepare the layer to ensure that it has been initialized. err = wclayer.PrepareLayer(ctx, path, parentLayerPaths) if err != nil { return err } err = wclayer.UnprepareLayer(ctx, path) if err != nil { return err } r, err := wclayer.NewLayerReader(ctx, path, parentLayerPaths) if err != nil { return err } err = writeTarFromLayer(ctx, r, w) cerr := r.Close() if err != nil { return err } return cerr } func writeTarFromLayer(ctx context.Context, r wclayer.LayerReader, w io.Writer) error { linkRecords := make(map[[16]byte]string) t := tar.NewWriter(w) for { select { case <-ctx.Done(): return ctx.Err() default: } name, size, fileInfo, err := r.Next() if errors.Is(err, io.EOF) { break } if err != nil { return err } if fileInfo == nil { // Write a whiteout file. hdr := &tar.Header{ Name: filepath.ToSlash(filepath.Join(filepath.Dir(name), WhiteoutPrefix+filepath.Base(name))), } err := t.WriteHeader(hdr) if err != nil { return err } } else { numberOfLinks, fileIDInfo, err := r.LinkInfo() if err != nil { return err } if numberOfLinks > 1 { if linkName, ok := linkRecords[fileIDInfo.FileID]; ok { // We've seen this file before, by another name, so put a hardlink in the tar stream. hdr := backuptar.BasicInfoHeader(name, 0, fileInfo) hdr.Mode = 0644 hdr.Typeflag = tar.TypeLink hdr.Linkname = linkName if err := t.WriteHeader(hdr); err != nil { return err } continue } // All subsequent names for this file will be hard-linked to this name linkRecords[fileIDInfo.FileID] = filepath.ToSlash(name) } err = backuptar.WriteTarFileFromBackupStream(t, r, name, size, fileInfo) if err != nil { return err } } } return t.Close() } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/pkg/ociwclayer/import.go ================================================ //go:build windows package ociwclayer import ( "archive/tar" "bufio" "context" "errors" "io" "os" "path" "path/filepath" "strings" winio "github.com/Microsoft/go-winio" "github.com/Microsoft/go-winio/backuptar" "github.com/Microsoft/hcsshim/internal/wclayer" ) const WhiteoutPrefix = ".wh." var ( // mutatedFiles is a list of files that are mutated by the import process // and must be backed up and restored. mutatedFiles = map[string]string{ "UtilityVM/Files/EFI/Microsoft/Boot/BCD": "bcd.bak", "UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG": "bcd.log.bak", "UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG1": "bcd.log1.bak", "UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG2": "bcd.log2.bak", } ) // ImportLayerFromTar reads a layer from an OCI layer tar stream and extracts it to the // specified path. The caller must specify the parent layers, if any, ordered // from lowest to highest layer. // // The caller must ensure that the thread or process has acquired backup and // restore privileges. // // This function returns the total size of the layer's files, in bytes. func ImportLayerFromTar(ctx context.Context, r io.Reader, path string, parentLayerPaths []string) (int64, error) { err := os.MkdirAll(path, 0) if err != nil { return 0, err } w, err := wclayer.NewLayerWriter(ctx, path, parentLayerPaths) if err != nil { return 0, err } n, err := writeLayerFromTar(ctx, r, w, path) cerr := w.Close() if err != nil { return 0, err } if cerr != nil { return 0, cerr } return n, nil } func writeLayerFromTar(ctx context.Context, r io.Reader, w wclayer.LayerWriter, root string) (int64, error) { t := tar.NewReader(r) // CodeQL [SM03409] `internal\wclayer` uses `internal/safefile` to bind tar extraction to the layer's root directory hdr, err := t.Next() totalSize := int64(0) buf := bufio.NewWriter(nil) for err == nil { select { case <-ctx.Done(): return 0, ctx.Err() default: } base := path.Base(hdr.Name) if strings.HasPrefix(base, WhiteoutPrefix) { name := path.Join(path.Dir(hdr.Name), base[len(WhiteoutPrefix):]) err = w.Remove(filepath.FromSlash(name)) if err != nil { return 0, err } // CodeQL [SM03409] `internal\wclayer` uses `internal/safefile` to bind tar extraction to the layer's root directory hdr, err = t.Next() } else if hdr.Typeflag == tar.TypeLink { err = w.AddLink(filepath.FromSlash(hdr.Name), filepath.FromSlash(hdr.Linkname)) if err != nil { return 0, err } // CodeQL [SM03409] `internal\wclayer` uses `internal/safefile` to bind tar extraction to the layer's root directory hdr, err = t.Next() } else { var ( name string size int64 fileInfo *winio.FileBasicInfo ) name, size, fileInfo, err = backuptar.FileInfoFromHeader(hdr) if err != nil { return 0, err } err = w.Add(filepath.FromSlash(name), fileInfo) if err != nil { return 0, err } hdr, err = writeBackupStreamFromTarAndSaveMutatedFiles(buf, w, t, hdr, root) totalSize += size } } if !errors.Is(err, io.EOF) { return 0, err } return totalSize, nil } // writeBackupStreamFromTarAndSaveMutatedFiles reads data from a tar stream and // writes it to a backup stream, and also saves any files that will be mutated // by the import layer process to a backup location. func writeBackupStreamFromTarAndSaveMutatedFiles(buf *bufio.Writer, w io.Writer, t *tar.Reader, hdr *tar.Header, root string) (nextHdr *tar.Header, err error) { var bcdBackup *os.File var bcdBackupWriter *winio.BackupFileWriter if backupPath, ok := mutatedFiles[hdr.Name]; ok { bcdBackup, err = os.Create(filepath.Join(root, backupPath)) if err != nil { return nil, err } defer func() { cerr := bcdBackup.Close() if err == nil { err = cerr } }() bcdBackupWriter = winio.NewBackupFileWriter(bcdBackup, false) defer func() { cerr := bcdBackupWriter.Close() if err == nil { err = cerr } }() buf.Reset(io.MultiWriter(w, bcdBackupWriter)) } else { buf.Reset(w) } defer func() { ferr := buf.Flush() if err == nil { err = ferr } }() return backuptar.WriteBackupStreamFromTarFile(buf, t, hdr) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/process.go ================================================ //go:build windows package hcsshim import ( "context" "io" "sync" "time" "github.com/Microsoft/hcsshim/internal/hcs" ) // ContainerError is an error encountered in HCS type process struct { p *hcs.Process waitOnce sync.Once waitCh chan struct{} waitErr error } // Pid returns the process ID of the process within the container. func (process *process) Pid() int { return process.p.Pid() } // Kill signals the process to terminate but does not wait for it to finish terminating. func (process *process) Kill() error { found, err := process.p.Kill(context.Background()) if err != nil { return convertProcessError(err, process) } if !found { return &ProcessError{Process: process, Err: ErrElementNotFound, Operation: "hcsshim::Process::Kill"} } return nil } // Wait waits for the process to exit. func (process *process) Wait() error { return convertProcessError(process.p.Wait(), process) } // WaitTimeout waits for the process to exit or the duration to elapse. It returns // false if timeout occurs. func (process *process) WaitTimeout(timeout time.Duration) error { process.waitOnce.Do(func() { process.waitCh = make(chan struct{}) go func() { process.waitErr = process.Wait() close(process.waitCh) }() }) t := time.NewTimer(timeout) defer t.Stop() select { case <-t.C: return &ProcessError{Process: process, Err: ErrTimeout, Operation: "hcsshim::Process::Wait"} case <-process.waitCh: return process.waitErr } } // ExitCode returns the exit code of the process. The process must have // already terminated. func (process *process) ExitCode() (int, error) { code, err := process.p.ExitCode() if err != nil { err = convertProcessError(err, process) } return code, err } // ResizeConsole resizes the console of the process. func (process *process) ResizeConsole(width, height uint16) error { return convertProcessError(process.p.ResizeConsole(context.Background(), width, height), process) } // Stdio returns the stdin, stdout, and stderr pipes, respectively. Closing // these pipes does not close the underlying pipes; it should be possible to // call this multiple times to get multiple interfaces. func (process *process) Stdio() (io.WriteCloser, io.ReadCloser, io.ReadCloser, error) { stdin, stdout, stderr, err := process.p.StdioLegacy() if err != nil { err = convertProcessError(err, process) } return stdin, stdout, stderr, err } // CloseStdin closes the write side of the stdin pipe so that the process is // notified on the read side that there is no more data in stdin. func (process *process) CloseStdin() error { return convertProcessError(process.p.CloseStdin(context.Background()), process) } // Close cleans up any state associated with the process but does not kill // or wait on it. func (process *process) Close() error { return convertProcessError(process.p.Close(), process) } ================================================ FILE: vendor/github.com/Microsoft/hcsshim/zsyscall_windows.go ================================================ //go:build windows // Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT. package hcsshim import ( "syscall" "unsafe" "golang.org/x/sys/windows" ) var _ unsafe.Pointer // Do the interface allocations only once for common // Errno values. const ( errnoERROR_IO_PENDING = 997 ) var ( errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) errERROR_EINVAL error = syscall.EINVAL ) // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { switch e { case 0: return errERROR_EINVAL case errnoERROR_IO_PENDING: return errERROR_IO_PENDING } return e } var ( modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll") procSetCurrentThreadCompartmentId = modiphlpapi.NewProc("SetCurrentThreadCompartmentId") ) func SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) { r0, _, _ := syscall.SyscallN(procSetCurrentThreadCompartmentId.Addr(), uintptr(compartmentId)) if int32(r0) < 0 { if r0&0x1fff0000 == 0x00070000 { r0 &= 0xffff } hr = syscall.Errno(r0) } return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/AUTHORS ================================================ # This source code refers to The Go Authors for copyright purposes. # The master list of authors is in the main Go distribution, # visible at https://tip.golang.org/AUTHORS. ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS ================================================ # This source code was written by the Go contributors. # The master list of contributors is in the main Go distribution, # visible at https://tip.golang.org/CONTRIBUTORS. ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/LICENSE ================================================ Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS 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 OWNER 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. ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/PATENTS ================================================ Additional IP Rights Grant (Patents) "This implementation" means the copyrightable works distributed by Google as part of the Go project. Google 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, transfer and otherwise run, modify and propagate the contents of this implementation of Go, where such license applies only to those patent claims, both currently owned or controlled by Google and acquired in the future, licensable by Google that are necessarily infringed by this implementation of Go. This grant does not include claims that would be infringed only as a consequence of further modification of this implementation. If you or your agent or exclusive licensee institute or order or agree to the institution of patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that this implementation of Go or any code incorporated within this implementation of Go constitutes direct or contributory patent infringement, or inducement of patent infringement, then any patent rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go ================================================ package bitcurves // Copyright 2010 The Go Authors. All rights reserved. // Copyright 2011 ThePiachu. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package bitelliptic implements several Koblitz elliptic curves over prime // fields. // This package operates, internally, on Jacobian coordinates. For a given // (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1) // where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole // calculation can be performed within the transform (as in ScalarMult and // ScalarBaseMult). But even for Add and Double, it's faster to apply and // reverse the transform than to operate in affine coordinates. import ( "crypto/elliptic" "io" "math/big" "sync" ) // A BitCurve represents a Koblitz Curve with a=0. // See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html type BitCurve struct { Name string P *big.Int // the order of the underlying field N *big.Int // the order of the base point B *big.Int // the constant of the BitCurve equation Gx, Gy *big.Int // (x,y) of the base point BitSize int // the size of the underlying field } // Params returns the parameters of the given BitCurve (see BitCurve struct) func (bitCurve *BitCurve) Params() (cp *elliptic.CurveParams) { cp = new(elliptic.CurveParams) cp.Name = bitCurve.Name cp.P = bitCurve.P cp.N = bitCurve.N cp.Gx = bitCurve.Gx cp.Gy = bitCurve.Gy cp.BitSize = bitCurve.BitSize return cp } // IsOnCurve returns true if the given (x,y) lies on the BitCurve. func (bitCurve *BitCurve) IsOnCurve(x, y *big.Int) bool { // y² = x³ + b y2 := new(big.Int).Mul(y, y) //y² y2.Mod(y2, bitCurve.P) //y²%P x3 := new(big.Int).Mul(x, x) //x² x3.Mul(x3, x) //x³ x3.Add(x3, bitCurve.B) //x³+B x3.Mod(x3, bitCurve.P) //(x³+B)%P return x3.Cmp(y2) == 0 } // affineFromJacobian reverses the Jacobian transform. See the comment at the // top of the file. func (bitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) { if z.Cmp(big.NewInt(0)) == 0 { panic("bitcurve: Can't convert to affine with Jacobian Z = 0") } // x = YZ^2 mod P zinv := new(big.Int).ModInverse(z, bitCurve.P) zinvsq := new(big.Int).Mul(zinv, zinv) xOut = new(big.Int).Mul(x, zinvsq) xOut.Mod(xOut, bitCurve.P) // y = YZ^3 mod P zinvsq.Mul(zinvsq, zinv) yOut = new(big.Int).Mul(y, zinvsq) yOut.Mod(yOut, bitCurve.P) return xOut, yOut } // Add returns the sum of (x1,y1) and (x2,y2) func (bitCurve *BitCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) { z := new(big.Int).SetInt64(1) x, y, z := bitCurve.addJacobian(x1, y1, z, x2, y2, z) return bitCurve.affineFromJacobian(x, y, z) } // addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and // (x2, y2, z2) and returns their sum, also in Jacobian form. func (bitCurve *BitCurve) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) { // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl z1z1 := new(big.Int).Mul(z1, z1) z1z1.Mod(z1z1, bitCurve.P) z2z2 := new(big.Int).Mul(z2, z2) z2z2.Mod(z2z2, bitCurve.P) u1 := new(big.Int).Mul(x1, z2z2) u1.Mod(u1, bitCurve.P) u2 := new(big.Int).Mul(x2, z1z1) u2.Mod(u2, bitCurve.P) h := new(big.Int).Sub(u2, u1) if h.Sign() == -1 { h.Add(h, bitCurve.P) } i := new(big.Int).Lsh(h, 1) i.Mul(i, i) j := new(big.Int).Mul(h, i) s1 := new(big.Int).Mul(y1, z2) s1.Mul(s1, z2z2) s1.Mod(s1, bitCurve.P) s2 := new(big.Int).Mul(y2, z1) s2.Mul(s2, z1z1) s2.Mod(s2, bitCurve.P) r := new(big.Int).Sub(s2, s1) if r.Sign() == -1 { r.Add(r, bitCurve.P) } r.Lsh(r, 1) v := new(big.Int).Mul(u1, i) x3 := new(big.Int).Set(r) x3.Mul(x3, x3) x3.Sub(x3, j) x3.Sub(x3, v) x3.Sub(x3, v) x3.Mod(x3, bitCurve.P) y3 := new(big.Int).Set(r) v.Sub(v, x3) y3.Mul(y3, v) s1.Mul(s1, j) s1.Lsh(s1, 1) y3.Sub(y3, s1) y3.Mod(y3, bitCurve.P) z3 := new(big.Int).Add(z1, z2) z3.Mul(z3, z3) z3.Sub(z3, z1z1) if z3.Sign() == -1 { z3.Add(z3, bitCurve.P) } z3.Sub(z3, z2z2) if z3.Sign() == -1 { z3.Add(z3, bitCurve.P) } z3.Mul(z3, h) z3.Mod(z3, bitCurve.P) return x3, y3, z3 } // Double returns 2*(x,y) func (bitCurve *BitCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) { z1 := new(big.Int).SetInt64(1) return bitCurve.affineFromJacobian(bitCurve.doubleJacobian(x1, y1, z1)) } // doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and // returns its double, also in Jacobian form. func (bitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) { // See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l a := new(big.Int).Mul(x, x) //X1² b := new(big.Int).Mul(y, y) //Y1² c := new(big.Int).Mul(b, b) //B² d := new(big.Int).Add(x, b) //X1+B d.Mul(d, d) //(X1+B)² d.Sub(d, a) //(X1+B)²-A d.Sub(d, c) //(X1+B)²-A-C d.Mul(d, big.NewInt(2)) //2*((X1+B)²-A-C) e := new(big.Int).Mul(big.NewInt(3), a) //3*A f := new(big.Int).Mul(e, e) //E² x3 := new(big.Int).Mul(big.NewInt(2), d) //2*D x3.Sub(f, x3) //F-2*D x3.Mod(x3, bitCurve.P) y3 := new(big.Int).Sub(d, x3) //D-X3 y3.Mul(e, y3) //E*(D-X3) y3.Sub(y3, new(big.Int).Mul(big.NewInt(8), c)) //E*(D-X3)-8*C y3.Mod(y3, bitCurve.P) z3 := new(big.Int).Mul(y, z) //Y1*Z1 z3.Mul(big.NewInt(2), z3) //3*Y1*Z1 z3.Mod(z3, bitCurve.P) return x3, y3, z3 } // TODO: double check if it is okay // ScalarMult returns k*(Bx,By) where k is a number in big-endian form. func (bitCurve *BitCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) { // We have a slight problem in that the identity of the group (the // point at infinity) cannot be represented in (x, y) form on a finite // machine. Thus the standard add/double algorithm has to be tweaked // slightly: our initial state is not the identity, but x, and we // ignore the first true bit in |k|. If we don't find any true bits in // |k|, then we return nil, nil, because we cannot return the identity // element. Bz := new(big.Int).SetInt64(1) x := Bx y := By z := Bz seenFirstTrue := false for _, byte := range k { for bitNum := 0; bitNum < 8; bitNum++ { if seenFirstTrue { x, y, z = bitCurve.doubleJacobian(x, y, z) } if byte&0x80 == 0x80 { if !seenFirstTrue { seenFirstTrue = true } else { x, y, z = bitCurve.addJacobian(Bx, By, Bz, x, y, z) } } byte <<= 1 } } if !seenFirstTrue { return nil, nil } return bitCurve.affineFromJacobian(x, y, z) } // ScalarBaseMult returns k*G, where G is the base point of the group and k is // an integer in big-endian form. func (bitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) { return bitCurve.ScalarMult(bitCurve.Gx, bitCurve.Gy, k) } var mask = []byte{0xff, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f} // TODO: double check if it is okay // GenerateKey returns a public/private key pair. The private key is generated // using the given reader, which must return random data. func (bitCurve *BitCurve) GenerateKey(rand io.Reader) (priv []byte, x, y *big.Int, err error) { byteLen := (bitCurve.BitSize + 7) >> 3 priv = make([]byte, byteLen) for x == nil { _, err = io.ReadFull(rand, priv) if err != nil { return } // We have to mask off any excess bits in the case that the size of the // underlying field is not a whole number of bytes. priv[0] &= mask[bitCurve.BitSize%8] // This is because, in tests, rand will return all zeros and we don't // want to get the point at infinity and loop forever. priv[1] ^= 0x42 x, y = bitCurve.ScalarBaseMult(priv) } return } // Marshal converts a point into the form specified in section 4.3.6 of ANSI // X9.62. func (bitCurve *BitCurve) Marshal(x, y *big.Int) []byte { byteLen := (bitCurve.BitSize + 7) >> 3 ret := make([]byte, 1+2*byteLen) ret[0] = 4 // uncompressed point xBytes := x.Bytes() copy(ret[1+byteLen-len(xBytes):], xBytes) yBytes := y.Bytes() copy(ret[1+2*byteLen-len(yBytes):], yBytes) return ret } // Unmarshal converts a point, serialised by Marshal, into an x, y pair. On // error, x = nil. func (bitCurve *BitCurve) Unmarshal(data []byte) (x, y *big.Int) { byteLen := (bitCurve.BitSize + 7) >> 3 if len(data) != 1+2*byteLen { return } if data[0] != 4 { // uncompressed form return } x = new(big.Int).SetBytes(data[1 : 1+byteLen]) y = new(big.Int).SetBytes(data[1+byteLen:]) return } //curve parameters taken from: //http://www.secg.org/collateral/sec2_final.pdf var initonce sync.Once var secp160k1 *BitCurve var secp192k1 *BitCurve var secp224k1 *BitCurve var secp256k1 *BitCurve func initAll() { initS160() initS192() initS224() initS256() } func initS160() { // See SEC 2 section 2.4.1 secp160k1 = new(BitCurve) secp160k1.Name = "secp160k1" secp160k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", 16) secp160k1.N, _ = new(big.Int).SetString("0100000000000000000001B8FA16DFAB9ACA16B6B3", 16) secp160k1.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000007", 16) secp160k1.Gx, _ = new(big.Int).SetString("3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", 16) secp160k1.Gy, _ = new(big.Int).SetString("938CF935318FDCED6BC28286531733C3F03C4FEE", 16) secp160k1.BitSize = 160 } func initS192() { // See SEC 2 section 2.5.1 secp192k1 = new(BitCurve) secp192k1.Name = "secp192k1" secp192k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", 16) secp192k1.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", 16) secp192k1.B, _ = new(big.Int).SetString("000000000000000000000000000000000000000000000003", 16) secp192k1.Gx, _ = new(big.Int).SetString("DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", 16) secp192k1.Gy, _ = new(big.Int).SetString("9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", 16) secp192k1.BitSize = 192 } func initS224() { // See SEC 2 section 2.6.1 secp224k1 = new(BitCurve) secp224k1.Name = "secp224k1" secp224k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", 16) secp224k1.N, _ = new(big.Int).SetString("010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7", 16) secp224k1.B, _ = new(big.Int).SetString("00000000000000000000000000000000000000000000000000000005", 16) secp224k1.Gx, _ = new(big.Int).SetString("A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", 16) secp224k1.Gy, _ = new(big.Int).SetString("7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5", 16) secp224k1.BitSize = 224 } func initS256() { // See SEC 2 section 2.7.1 secp256k1 = new(BitCurve) secp256k1.Name = "secp256k1" secp256k1.P, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16) secp256k1.N, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16) secp256k1.B, _ = new(big.Int).SetString("0000000000000000000000000000000000000000000000000000000000000007", 16) secp256k1.Gx, _ = new(big.Int).SetString("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16) secp256k1.Gy, _ = new(big.Int).SetString("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16) secp256k1.BitSize = 256 } // S160 returns a BitCurve which implements secp160k1 (see SEC 2 section 2.4.1) func S160() *BitCurve { initonce.Do(initAll) return secp160k1 } // S192 returns a BitCurve which implements secp192k1 (see SEC 2 section 2.5.1) func S192() *BitCurve { initonce.Do(initAll) return secp192k1 } // S224 returns a BitCurve which implements secp224k1 (see SEC 2 section 2.6.1) func S224() *BitCurve { initonce.Do(initAll) return secp224k1 } // S256 returns a BitCurve which implements bitcurves (see SEC 2 section 2.7.1) func S256() *BitCurve { initonce.Do(initAll) return secp256k1 } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go ================================================ // Package brainpool implements Brainpool elliptic curves. // Implementation of rcurves is from github.com/ebfe/brainpool // Note that these curves are implemented with naive, non-constant time operations // and are likely not suitable for environments where timing attacks are a concern. package brainpool import ( "crypto/elliptic" "math/big" "sync" ) var ( once sync.Once p256t1, p384t1, p512t1 *elliptic.CurveParams p256r1, p384r1, p512r1 *rcurve ) func initAll() { initP256t1() initP384t1() initP512t1() initP256r1() initP384r1() initP512r1() } func initP256t1() { p256t1 = &elliptic.CurveParams{Name: "brainpoolP256t1"} p256t1.P, _ = new(big.Int).SetString("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", 16) p256t1.N, _ = new(big.Int).SetString("A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", 16) p256t1.B, _ = new(big.Int).SetString("662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04", 16) p256t1.Gx, _ = new(big.Int).SetString("A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4", 16) p256t1.Gy, _ = new(big.Int).SetString("2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE", 16) p256t1.BitSize = 256 } func initP256r1() { twisted := p256t1 params := &elliptic.CurveParams{ Name: "brainpoolP256r1", P: twisted.P, N: twisted.N, BitSize: twisted.BitSize, } params.Gx, _ = new(big.Int).SetString("8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262", 16) params.Gy, _ = new(big.Int).SetString("547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", 16) z, _ := new(big.Int).SetString("3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0", 16) p256r1 = newrcurve(twisted, params, z) } func initP384t1() { p384t1 = &elliptic.CurveParams{Name: "brainpoolP384t1"} p384t1.P, _ = new(big.Int).SetString("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", 16) p384t1.N, _ = new(big.Int).SetString("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", 16) p384t1.B, _ = new(big.Int).SetString("7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE", 16) p384t1.Gx, _ = new(big.Int).SetString("18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC", 16) p384t1.Gy, _ = new(big.Int).SetString("25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928", 16) p384t1.BitSize = 384 } func initP384r1() { twisted := p384t1 params := &elliptic.CurveParams{ Name: "brainpoolP384r1", P: twisted.P, N: twisted.N, BitSize: twisted.BitSize, } params.Gx, _ = new(big.Int).SetString("1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E", 16) params.Gy, _ = new(big.Int).SetString("8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315", 16) z, _ := new(big.Int).SetString("41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE97D2D63DBC87BCCDDCCC5DA39E8589291C", 16) p384r1 = newrcurve(twisted, params, z) } func initP512t1() { p512t1 = &elliptic.CurveParams{Name: "brainpoolP512t1"} p512t1.P, _ = new(big.Int).SetString("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", 16) p512t1.N, _ = new(big.Int).SetString("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", 16) p512t1.B, _ = new(big.Int).SetString("7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E", 16) p512t1.Gx, _ = new(big.Int).SetString("640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA", 16) p512t1.Gy, _ = new(big.Int).SetString("5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332", 16) p512t1.BitSize = 512 } func initP512r1() { twisted := p512t1 params := &elliptic.CurveParams{ Name: "brainpoolP512r1", P: twisted.P, N: twisted.N, BitSize: twisted.BitSize, } params.Gx, _ = new(big.Int).SetString("81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822", 16) params.Gy, _ = new(big.Int).SetString("7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892", 16) z, _ := new(big.Int).SetString("12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB", 16) p512r1 = newrcurve(twisted, params, z) } // P256t1 returns a Curve which implements Brainpool P256t1 (see RFC 5639, section 3.4) func P256t1() elliptic.Curve { once.Do(initAll) return p256t1 } // P256r1 returns a Curve which implements Brainpool P256r1 (see RFC 5639, section 3.4) func P256r1() elliptic.Curve { once.Do(initAll) return p256r1 } // P384t1 returns a Curve which implements Brainpool P384t1 (see RFC 5639, section 3.6) func P384t1() elliptic.Curve { once.Do(initAll) return p384t1 } // P384r1 returns a Curve which implements Brainpool P384r1 (see RFC 5639, section 3.6) func P384r1() elliptic.Curve { once.Do(initAll) return p384r1 } // P512t1 returns a Curve which implements Brainpool P512t1 (see RFC 5639, section 3.7) func P512t1() elliptic.Curve { once.Do(initAll) return p512t1 } // P512r1 returns a Curve which implements Brainpool P512r1 (see RFC 5639, section 3.7) func P512r1() elliptic.Curve { once.Do(initAll) return p512r1 } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go ================================================ package brainpool import ( "crypto/elliptic" "math/big" ) var _ elliptic.Curve = (*rcurve)(nil) type rcurve struct { twisted elliptic.Curve params *elliptic.CurveParams z *big.Int zinv *big.Int z2 *big.Int z3 *big.Int zinv2 *big.Int zinv3 *big.Int } var ( two = big.NewInt(2) three = big.NewInt(3) ) func newrcurve(twisted elliptic.Curve, params *elliptic.CurveParams, z *big.Int) *rcurve { zinv := new(big.Int).ModInverse(z, params.P) return &rcurve{ twisted: twisted, params: params, z: z, zinv: zinv, z2: new(big.Int).Exp(z, two, params.P), z3: new(big.Int).Exp(z, three, params.P), zinv2: new(big.Int).Exp(zinv, two, params.P), zinv3: new(big.Int).Exp(zinv, three, params.P), } } func (curve *rcurve) toTwisted(x, y *big.Int) (*big.Int, *big.Int) { var tx, ty big.Int tx.Mul(x, curve.z2) tx.Mod(&tx, curve.params.P) ty.Mul(y, curve.z3) ty.Mod(&ty, curve.params.P) return &tx, &ty } func (curve *rcurve) fromTwisted(tx, ty *big.Int) (*big.Int, *big.Int) { var x, y big.Int x.Mul(tx, curve.zinv2) x.Mod(&x, curve.params.P) y.Mul(ty, curve.zinv3) y.Mod(&y, curve.params.P) return &x, &y } func (curve *rcurve) Params() *elliptic.CurveParams { return curve.params } func (curve *rcurve) IsOnCurve(x, y *big.Int) bool { return curve.twisted.IsOnCurve(curve.toTwisted(x, y)) } func (curve *rcurve) Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int) { tx1, ty1 := curve.toTwisted(x1, y1) tx2, ty2 := curve.toTwisted(x2, y2) return curve.fromTwisted(curve.twisted.Add(tx1, ty1, tx2, ty2)) } func (curve *rcurve) Double(x1, y1 *big.Int) (x, y *big.Int) { return curve.fromTwisted(curve.twisted.Double(curve.toTwisted(x1, y1))) } func (curve *rcurve) ScalarMult(x1, y1 *big.Int, scalar []byte) (x, y *big.Int) { tx1, ty1 := curve.toTwisted(x1, y1) return curve.fromTwisted(curve.twisted.ScalarMult(tx1, ty1, scalar)) } func (curve *rcurve) ScalarBaseMult(scalar []byte) (x, y *big.Int) { return curve.fromTwisted(curve.twisted.ScalarBaseMult(scalar)) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/eax/eax.go ================================================ // Copyright (C) 2019 ProtonTech AG // Package eax provides an implementation of the EAX // (encrypt-authenticate-translate) mode of operation, as described in // Bellare, Rogaway, and Wagner "THE EAX MODE OF OPERATION: A TWO-PASS // AUTHENTICATED-ENCRYPTION SCHEME OPTIMIZED FOR SIMPLICITY AND EFFICIENCY." // In FSE'04, volume 3017 of LNCS, 2004 package eax import ( "crypto/cipher" "crypto/subtle" "errors" "github.com/ProtonMail/go-crypto/internal/byteutil" ) const ( defaultTagSize = 16 defaultNonceSize = 16 ) type eax struct { block cipher.Block // Only AES-{128, 192, 256} supported tagSize int // At least 12 bytes recommended nonceSize int } func (e *eax) NonceSize() int { return e.nonceSize } func (e *eax) Overhead() int { return e.tagSize } // NewEAX returns an EAX instance with AES-{KEYLENGTH} and default nonce and // tag lengths. Supports {128, 192, 256}- bit key length. func NewEAX(block cipher.Block) (cipher.AEAD, error) { return NewEAXWithNonceAndTagSize(block, defaultNonceSize, defaultTagSize) } // NewEAXWithNonceAndTagSize returns an EAX instance with AES-{keyLength} and // given nonce and tag lengths in bytes. Panics on zero nonceSize and // exceedingly long tags. // // It is recommended to use at least 12 bytes as tag length (see, for instance, // NIST SP 800-38D). // // Only to be used for compatibility with existing cryptosystems with // non-standard parameters. For all other cases, prefer NewEAX. func NewEAXWithNonceAndTagSize( block cipher.Block, nonceSize, tagSize int) (cipher.AEAD, error) { if nonceSize < 1 { return nil, eaxError("Cannot initialize EAX with nonceSize = 0") } if tagSize > block.BlockSize() { return nil, eaxError("Custom tag length exceeds blocksize") } return &eax{ block: block, tagSize: tagSize, nonceSize: nonceSize, }, nil } func (e *eax) Seal(dst, nonce, plaintext, adata []byte) []byte { if len(nonce) > e.nonceSize { panic("crypto/eax: Nonce too long for this instance") } ret, out := byteutil.SliceForAppend(dst, len(plaintext)+e.tagSize) omacNonce := e.omacT(0, nonce) omacAdata := e.omacT(1, adata) // Encrypt message using CTR mode and omacNonce as IV ctr := cipher.NewCTR(e.block, omacNonce) ciphertextData := out[:len(plaintext)] ctr.XORKeyStream(ciphertextData, plaintext) omacCiphertext := e.omacT(2, ciphertextData) tag := out[len(plaintext):] for i := 0; i < e.tagSize; i++ { tag[i] = omacCiphertext[i] ^ omacNonce[i] ^ omacAdata[i] } return ret } func (e *eax) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) { if len(nonce) > e.nonceSize { panic("crypto/eax: Nonce too long for this instance") } if len(ciphertext) < e.tagSize { return nil, eaxError("Ciphertext shorter than tag length") } sep := len(ciphertext) - e.tagSize // Compute tag omacNonce := e.omacT(0, nonce) omacAdata := e.omacT(1, adata) omacCiphertext := e.omacT(2, ciphertext[:sep]) tag := make([]byte, e.tagSize) for i := 0; i < e.tagSize; i++ { tag[i] = omacCiphertext[i] ^ omacNonce[i] ^ omacAdata[i] } // Compare tags if subtle.ConstantTimeCompare(ciphertext[sep:], tag) != 1 { return nil, eaxError("Tag authentication failed") } // Decrypt ciphertext ret, out := byteutil.SliceForAppend(dst, len(ciphertext)) ctr := cipher.NewCTR(e.block, omacNonce) ctr.XORKeyStream(out, ciphertext[:sep]) return ret[:sep], nil } // Tweakable OMAC - Calls OMAC_K([t]_n || plaintext) func (e *eax) omacT(t byte, plaintext []byte) []byte { blockSize := e.block.BlockSize() byteT := make([]byte, blockSize) byteT[blockSize-1] = t concat := append(byteT, plaintext...) return e.omac(concat) } func (e *eax) omac(plaintext []byte) []byte { blockSize := e.block.BlockSize() // L ← E_K(0^n); B ← 2L; P ← 4L L := make([]byte, blockSize) e.block.Encrypt(L, L) B := byteutil.GfnDouble(L) P := byteutil.GfnDouble(B) // CBC with IV = 0 cbc := cipher.NewCBCEncrypter(e.block, make([]byte, blockSize)) padded := e.pad(plaintext, B, P) cbcCiphertext := make([]byte, len(padded)) cbc.CryptBlocks(cbcCiphertext, padded) return cbcCiphertext[len(cbcCiphertext)-blockSize:] } func (e *eax) pad(plaintext, B, P []byte) []byte { // if |M| in {n, 2n, 3n, ...} blockSize := e.block.BlockSize() if len(plaintext) != 0 && len(plaintext)%blockSize == 0 { return byteutil.RightXor(plaintext, B) } // else return (M || 1 || 0^(n−1−(|M| % n))) xor→ P ending := make([]byte, blockSize-len(plaintext)%blockSize) ending[0] = 0x80 padded := append(plaintext, ending...) return byteutil.RightXor(padded, P) } func eaxError(err string) error { return errors.New("crypto/eax: " + err) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go ================================================ package eax // Test vectors from // https://web.cs.ucdavis.edu/~rogaway/papers/eax.pdf var testVectors = []struct { msg, key, nonce, header, ciphertext string }{ {"", "233952DEE4D5ED5F9B9C6D6FF80FF478", "62EC67F9C3A4A407FCB2A8C49031A8B3", "6BFB914FD07EAE6B", "E037830E8389F27B025A2D6527E79D01"}, {"F7FB", "91945D3F4DCBEE0BF45EF52255F095A4", "BECAF043B0A23D843194BA972C66DEBD", "FA3BFD4806EB53FA", "19DD5C4C9331049D0BDAB0277408F67967E5"}, {"1A47CB4933", "01F74AD64077F2E704C0F60ADA3DD523", "70C3DB4F0D26368400A10ED05D2BFF5E", "234A3463C1264AC6", "D851D5BAE03A59F238A23E39199DC9266626C40F80"}, {"481C9E39B1", "D07CF6CBB7F313BDDE66B727AFD3C5E8", "8408DFFF3C1A2B1292DC199E46B7D617", "33CCE2EABFF5A79D", "632A9D131AD4C168A4225D8E1FF755939974A7BEDE"}, {"40D0C07DA5E4", "35B6D0580005BBC12B0587124557D2C2", "FDB6B06676EEDC5C61D74276E1F8E816", "AEB96EAEBE2970E9", "071DFE16C675CB0677E536F73AFE6A14B74EE49844DD"}, {"4DE3B35C3FC039245BD1FB7D", "BD8E6E11475E60B268784C38C62FEB22", "6EAC5C93072D8E8513F750935E46DA1B", "D4482D1CA78DCE0F", "835BB4F15D743E350E728414ABB8644FD6CCB86947C5E10590210A4F"}, {"8B0A79306C9CE7ED99DAE4F87F8DD61636", "7C77D6E813BED5AC98BAA417477A2E7D", "1A8C98DCD73D38393B2BF1569DEEFC19", "65D2017990D62528", "02083E3979DA014812F59F11D52630DA30137327D10649B0AA6E1C181DB617D7F2"}, {"1BDA122BCE8A8DBAF1877D962B8592DD2D56", "5FFF20CAFAB119CA2FC73549E20F5B0D", "DDE59B97D722156D4D9AFF2BC7559826", "54B9F04E6A09189A", "2EC47B2C4954A489AFC7BA4897EDCDAE8CC33B60450599BD02C96382902AEF7F832A"}, {"6CF36720872B8513F6EAB1A8A44438D5EF11", "A4A4782BCFFD3EC5E7EF6D8C34A56123", "B781FCF2F75FA5A8DE97A9CA48E522EC", "899A175897561D7E", "0DE18FD0FDD91E7AF19F1D8EE8733938B1E8E7F6D2231618102FDB7FE55FF1991700"}, {"CA40D7446E545FFAED3BD12A740A659FFBBB3CEAB7", "8395FCF1E95BEBD697BD010BC766AAC3", "22E7ADD93CFC6393C57EC0B3C17D6B44", "126735FCC320D25A", "CB8920F87A6C75CFF39627B56E3ED197C552D295A7CFC46AFC253B4652B1AF3795B124AB6E"}, } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go ================================================ // These vectors include key length in {128, 192, 256}, tag size 128, and // random nonce, header, and plaintext lengths. // This file was automatically generated. package eax var randomVectors = []struct { key, nonce, header, plaintext, ciphertext string }{ {"DFDE093F36B0356E5A81F609786982E3", "1D8AC604419001816905BA72B14CED7E", "152A1517A998D7A24163FCDD146DE81AC347C8B97088F502093C1ABB8F6E33D9A219C34D7603A18B1F5ABE02E56661B7D7F67E81EC08C1302EF38D80A859486D450E94A4F26AD9E68EEBBC0C857A0FC5CF9E641D63D565A7E361BC8908F5A8DC8FD6", "1C8EAAB71077FE18B39730A3156ADE29C5EE824C7EE86ED2A253B775603FB237116E654F6FEC588DD27F523A0E01246FE73FE348491F2A8E9ABC6CA58D663F71CDBCF4AD798BE46C42AE6EE8B599DB44A1A48D7BBBBA0F7D2750181E1C5E66967F7D57CBD30AFBDA5727", "79E7E150934BBEBF7013F61C60462A14D8B15AF7A248AFB8A344EF021C1500E16666891D6E973D8BB56B71A371F12CA34660C4410C016982B20F547E3762A58B7BF4F20236CADCF559E2BE7D783B13723B2741FC7CDC8997D839E39A3DDD2BADB96743DD7049F1BDB0516A262869915B3F70498AFB7B191BF960"}, {"F10619EF02E5D94D7550EB84ED364A21", "8DC0D4F2F745BBAE835CC5574B942D20", "FE561358F2E8DF7E1024FF1AE9A8D36EBD01352214505CB99D644777A8A1F6027FA2BDBFC529A9B91136D5F2416CFC5F0F4EC3A1AFD32BDDA23CA504C5A5CB451785FABF4DFE4CD50D817491991A60615B30286361C100A95D1712F2A45F8E374461F4CA2B", "D7B5A971FC219631D30EFC3664AE3127D9CF3097DAD9C24AC7905D15E8D9B25B026B31D68CAE00975CDB81EB1FD96FD5E1A12E2BB83FA25F1B1D91363457657FC03875C27F2946C5", "2F336ED42D3CC38FC61660C4CD60BA4BD438B05F5965D8B7B399D2E7167F5D34F792D318F94DB15D67463AC449E13D568CC09BFCE32A35EE3EE96A041927680AE329811811E27F2D1E8E657707AF99BA96D13A478D695D59"}, {"429F514EFC64D98A698A9247274CFF45", "976AA5EB072F912D126ACEBC954FEC38", "A71D89DC5B6CEDBB7451A27C3C2CAE09126DB4C421", "5632FE62AB1DC549D54D3BC3FC868ACCEDEFD9ECF5E9F8", "848AE4306CA8C7F416F8707625B7F55881C0AB430353A5C967CDA2DA787F581A70E34DBEBB2385"}, {"398138F309085F47F8457CDF53895A63", "F8A8A7F2D28E5FFF7BBC2F24353F7A36", "5D633C21BA7764B8855CAB586F3746E236AD486039C83C6B56EFA9C651D38A41D6B20DAEE3418BFEA44B8BD6", "A3BBAA91920AF5E10659818B1B3B300AC79BFC129C8329E75251F73A66D3AE0128EB91D5031E0A65C329DB7D1E9C0493E268", "D078097267606E5FB07CFB7E2B4B718172A82C6A4CEE65D549A4DFB9838003BD2FBF64A7A66988AC1A632FD88F9E9FBB57C5A78AD2E086EACBA3DB68511D81C2970A"}, {"7A4151EBD3901B42CBA45DAFB2E931BA", "0FC88ACEE74DD538040321C330974EB8", "250464FB04733BAB934C59E6AD2D6AE8D662CBCFEFBE61E5A308D4211E58C4C25935B72C69107722E946BFCBF416796600542D76AEB73F2B25BF53BAF97BDEB36ED3A7A51C31E7F170EB897457E7C17571D1BA0A908954E9", "88C41F3EBEC23FAB8A362D969CAC810FAD4F7CA6A7F7D0D44F060F92E37E1183768DD4A8C733F71C96058D362A39876D183B86C103DE", "74A25B2182C51096D48A870D80F18E1CE15867778E34FCBA6BD7BFB3739FDCD42AD0F2D9F4EBA29085285C6048C15BCE5E5166F1F962D3337AA88E6062F05523029D0A7F0BF9"}, {"BFB147E1CD5459424F8C0271FC0E0DC5", "EABCC126442BF373969EA3015988CC45", "4C0880E1D71AA2C7", "BE1B5EC78FBF73E7A6682B21BA7E0E5D2D1C7ABE", "5660D7C1380E2F306895B1402CB2D6C37876504276B414D120F4CF92FDDDBB293A238EA0"}, {"595DD6F52D18BC2CA8EB4EDAA18D9FA3", "0F84B5D36CF4BC3B863313AF3B4D2E97", "30AE6CC5F99580F12A779D98BD379A60948020C0B6FBD5746B30BA3A15C6CD33DAF376C70A9F15B6C0EB410A93161F7958AE23", "8EF3687A1642B070970B0B91462229D1D76ABC154D18211F7152AA9FF368", "317C1DDB11417E5A9CC4DDE7FDFF6659A5AC4B31DE025212580A05CDAC6024D3E4AE7C2966E52B9129E9ECDBED86"}, {"44E6F2DC8FDC778AD007137D11410F50", "270A237AD977F7187AA6C158A0BAB24F", "509B0F0EB12E2AA5C5BA2DE553C07FAF4CE0C9E926531AA709A3D6224FCB783ACCF1559E10B1123EBB7D52E8AB54E6B5352A9ED0D04124BF0E9D9BACFD7E32B817B2E625F5EE94A64EDE9E470DE7FE6886C19B294F9F828209FE257A78", "8B3D7815DF25618A5D0C55A601711881483878F113A12EC36CF64900549A3199555528559DC118F789788A55FAFD944E6E99A9CA3F72F238CD3F4D88223F7A745992B3FAED1848", "1CC00D79F7AD82FDA71B58D286E5F34D0CC4CEF30704E771CC1E50746BDF83E182B078DB27149A42BAE619DF0F85B0B1090AD55D3B4471B0D6F6ECCD09C8F876B30081F0E7537A9624F8AAF29DA85E324122EFB4D68A56"}, {"BB7BC352A03044B4428D8DBB4B0701FDEC4649FD17B81452", "8B4BBE26CCD9859DCD84884159D6B0A4", "2212BEB0E78E0F044A86944CF33C8D5C80D9DBE1034BF3BCF73611835C7D3A52F5BD2D81B68FD681B68540A496EE5DA16FD8AC8824E60E1EC2042BE28FB0BFAD4E4B03596446BDD8C37D936D9B3D5295BE19F19CF5ACE1D33A46C952CE4DE5C12F92C1DD051E04AEED", "9037234CC44FFF828FABED3A7084AF40FA7ABFF8E0C0EFB57A1CC361E18FC4FAC1AB54F3ABFE9FF77263ACE16C3A", "A9391B805CCD956081E0B63D282BEA46E7025126F1C1631239C33E92AA6F92CD56E5A4C56F00FF9658E93D48AF4EF0EF81628E34AD4DB0CDAEDCD2A17EE7"}, {"99C0AD703196D2F60A74E6B378B838B31F82EA861F06FC4E", "92745C018AA708ECFEB1667E9F3F1B01", "828C69F376C0C0EC651C67749C69577D589EE39E51404D80EBF70C8660A8F5FD375473F4A7C611D59CB546A605D67446CE2AA844135FCD78BB5FBC90222A00D42920BB1D7EEDFB0C4672554F583EF23184F89063CDECBE482367B5F9AF3ACBC3AF61392BD94CBCD9B64677", "A879214658FD0A5B0E09836639BF82E05EC7A5EF71D4701934BDA228435C68AC3D5CEB54997878B06A655EEACEFB1345C15867E7FE6C6423660C8B88DF128EBD6BCD85118DBAE16E9252FFB204324E5C8F38CA97759BDBF3CB0083", "51FE87996F194A2585E438B023B345439EA60D1AEBED4650CDAF48A4D4EEC4FC77DC71CC4B09D3BEEF8B7B7AF716CE2B4EFFB3AC9E6323C18AC35E0AA6E2BBBC8889490EB6226C896B0D105EAB42BFE7053CCF00ED66BA94C1BA09A792AA873F0C3B26C5C5F9A936E57B25"}, {"7086816D00D648FB8304AA8C9E552E1B69A9955FB59B25D1", "0F45CF7F0BF31CCEB85D9DA10F4D749F", "93F27C60A417D9F0669E86ACC784FC8917B502DAF30A6338F11B30B94D74FEFE2F8BE1BBE2EAD10FAB7EED3C6F72B7C3ECEE1937C32ED4970A6404E139209C05", "877F046601F3CBE4FB1491943FA29487E738F94B99AF206262A1D6FF856C9AA0B8D4D08A54370C98F8E88FA3DCC2B14C1F76D71B2A4C7963AEE8AF960464C5BEC8357AD00DC8", "FE96906B895CE6A8E72BC72344E2C8BB3C63113D70EAFA26C299BAFE77A8A6568172EB447FB3E86648A0AF3512DEB1AAC0819F3EC553903BF28A9FB0F43411237A774BF9EE03E445D280FBB9CD12B9BAAB6EF5E52691"}, {"062F65A896D5BF1401BADFF70E91B458E1F9BD4888CB2E4D", "5B11EA1D6008EBB41CF892FCA5B943D1", "BAF4FF5C8242", "A8870E091238355984EB2F7D61A865B9170F440BFF999A5993DD41A10F4440D21FF948DDA2BF663B2E03AC3324492DC5E40262ECC6A65C07672353BE23E7FB3A9D79FF6AA38D97960905A38DECC312CB6A59E5467ECF06C311CD43ADC0B543EDF34FE8BE611F176460D5627CA51F8F8D9FED71F55C", "B10E127A632172CF8AA7539B140D2C9C2590E6F28C3CB892FC498FCE56A34F732FBFF32E79C7B9747D9094E8635A0C084D6F0247F9768FB5FF83493799A9BEC6C39572120C40E9292C8C947AE8573462A9108C36D9D7112E6995AE5867E6C8BB387D1C5D4BEF524F391B9FD9F0A3B4BFA079E915BCD920185CFD38D114C558928BD7D47877"}, {"38A8E45D6D705A11AF58AED5A1344896998EACF359F2E26A", "FD82B5B31804FF47D44199B533D0CF84", "DE454D4E62FE879F2050EE3E25853623D3E9AC52EEC1A1779A48CFAF5ECA0BFDE44749391866D1", "B804", "164BB965C05EBE0931A1A63293EDF9C38C27"}, {"34C33C97C6D7A0850DA94D78A58DC61EC717CD7574833068", "343BE00DA9483F05C14F2E9EB8EA6AE8", "78312A43EFDE3CAE34A65796FF059A3FE15304EEA5CF1D9306949FE5BF3349D4977D4EBE76C040FE894C5949E4E4D6681153DA87FB9AC5062063CA2EA183566343362370944CE0362D25FC195E124FD60E8682E665D13F2229DDA3E4B2CB1DCA", "CC11BB284B1153578E4A5ED9D937B869DAF00F5B1960C23455CA9CC43F486A3BE0B66254F1041F04FDF459C8640465B6E1D2CF899A381451E8E7FCB50CF87823BE77E24B132BBEEDC72E53369B275E1D8F49ECE59F4F215230AC4FE133FC80E4F634EE80BA4682B62C86", "E7F703DC31A95E3A4919FF957836CB76C063D81702AEA4703E1C2BF30831E58C4609D626EC6810E12EAA5B930F049FF9EFC22C3E3F1EBD4A1FB285CB02A1AC5AD46B425199FC0A85670A5C4E3DAA9636C8F64C199F42F18AAC8EA7457FD377F322DD7752D7D01B946C8F0A97E6113F0D50106F319AFD291AAACE"}, {"C6ECF7F053573E403E61B83052A343D93CBCC179D1E835BE", "E280E13D7367042E3AA09A80111B6184", "21486C9D7A9647", "5F2639AFA6F17931853791CD8C92382BBB677FD72D0AB1A080D0E49BFAA21810E963E4FACD422E92F65CBFAD5884A60CD94740DF31AF02F95AA57DA0C4401B0ED906", "5C51DB20755302070C45F52E50128A67C8B2E4ED0EACB7E29998CCE2E8C289DD5655913EC1A51CC3AABE5CDC2402B2BE7D6D4BF6945F266FBD70BA9F37109067157AE7530678B45F64475D4EBFCB5FFF46A5"}, {"5EC6CF7401BC57B18EF154E8C38ACCA8959E57D2F3975FF5", "656B41CB3F9CF8C08BAD7EBFC80BD225", "6B817C2906E2AF425861A7EF59BA5801F143EE2A139EE72697CDE168B4", "2C0E1DDC9B1E5389BA63845B18B1F8A1DB062037151BCC56EF7C21C0BB4DAE366636BBA975685D7CC5A94AFBE89C769016388C56FB7B57CE750A12B718A8BDCF70E80E8659A8330EFC8F86640F21735E8C80E23FE43ABF23507CE3F964AE4EC99D", "ED780CF911E6D1AA8C979B889B0B9DC1ABE261832980BDBFB576901D9EF5AB8048998E31A15BE54B3E5845A4D136AD24D0BDA1C3006168DF2F8AC06729CB0818867398150020131D8F04EDF1923758C9EABB5F735DE5EA1758D4BC0ACFCA98AFD202E9839B8720253693B874C65586C6F0"}, {"C92F678EB2208662F5BCF3403EC05F5961E957908A3E79421E1D25FC19054153", "DA0F3A40983D92F2D4C01FED33C7A192", "2B6E9D26DB406A0FAB47608657AA10EFC2B4AA5F459B29FF85AC9A40BFFE7AEB04F77E9A11FAAA116D7F6D4DA417671A9AB02C588E0EF59CB1BFB4B1CC931B63A3B3A159FCEC97A04D1E6F0C7E6A9CEF6B0ABB04758A69F1FE754DF4C2610E8C46B6CF413BDB31351D55BEDCB7B4A13A1C98E10984475E0F2F957853", "F37326A80E08", "83519E53E321D334F7C10B568183775C0E9AAE55F806"}, {"6847E0491BE57E72995D186D50094B0B3593957A5146798FCE68B287B2FB37B5", "3EE1182AEBB19A02B128F28E1D5F7F99", "D9F35ABB16D776CE", "DB7566ED8EA95BDF837F23DB277BAFBC5E70D1105ADFD0D9EF15475051B1EF94709C67DCA9F8D5", "2CDCED0C9EBD6E2A508822A685F7DCD1CDD99E7A5FCA786C234E7F7F1D27EC49751AD5DCFA30C5EDA87C43CAE3B919B6BBCFE34C8EDA59"}, {"82B019673642C08388D3E42075A4D5D587558C229E4AB8F660E37650C4C41A0A", "336F5D681E0410FAE7B607246092C6DC", "D430CBD8FE435B64214E9E9CDC5DE99D31CFCFB8C10AA0587A49DF276611", "998404153AD77003E1737EDE93ED79859EE6DCCA93CB40C4363AA817ABF2DBBD46E42A14A7183B6CC01E12A577888141363D0AE011EB6E8D28C0B235", "9BEF69EEB60BD3D6065707B7557F25292A8872857CFBD24F2F3C088E4450995333088DA50FD9121221C504DF1D0CD5EFE6A12666C5D5BB12282CF4C19906E9CFAB97E9BDF7F49DC17CFC384B"}, {"747B2E269B1859F0622C15C8BAD6A725028B1F94B8DB7326948D1E6ED663A8BC", "AB91F7245DDCE3F1C747872D47BE0A8A", "3B03F786EF1DDD76E1D42646DA4CD2A5165DC5383CE86D1A0B5F13F910DC278A4E451EE0192CBA178E13B3BA27FDC7840DF73D2E104B", "6B803F4701114F3E5FE21718845F8416F70F626303F545BE197189E0A2BA396F37CE06D389EB2658BC7D56D67868708F6D0D32", "1570DDB0BCE75AA25D1957A287A2C36B1A5F2270186DA81BA6112B7F43B0F3D1D0ED072591DCF1F1C99BBB25621FC39B896FF9BD9413A2845363A9DCD310C32CF98E57"}, {"02E59853FB29AEDA0FE1C5F19180AD99A12FF2F144670BB2B8BADF09AD812E0A", "C691294EF67CD04D1B9242AF83DD1421", "879334DAE3", "1E17F46A98FEF5CBB40759D95354", "FED8C3FF27DDF6313AED444A2985B36CBA268AAD6AAC563C0BA28F6DB5DB"}, {"F6C1FB9B4188F2288FF03BD716023198C3582CF2A037FC2F29760916C2B7FCDB", "4228DA0678CA3534588859E77DFF014C", "D8153CAF35539A61DD8D05B3C9B44F01E564FB9348BCD09A1C23B84195171308861058F0A3CD2A55B912A3AAEE06FF4D356C77275828F2157C2FC7C115DA39E443210CCC56BEDB0CC99BBFB227ABD5CC454F4E7F547C7378A659EEB6A7E809101A84F866503CB18D4484E1FA09B3EC7FC75EB2E35270800AA7", "23B660A779AD285704B12EC1C580387A47BEC7B00D452C6570", "5AA642BBABA8E49849002A2FAF31DB8FC7773EFDD656E469CEC19B3206D4174C9A263D0A05484261F6"}, {"8FF6086F1FADB9A3FBE245EAC52640C43B39D43F89526BB5A6EBA47710931446", "943188480C99437495958B0AE4831AA9", "AD5CD0BDA426F6EBA23C8EB23DC73FF9FEC173355EDBD6C9344C4C4383F211888F7CE6B29899A6801DF6B38651A7C77150941A", "80CD5EA8D7F81DDF5070B934937912E8F541A5301877528EB41AB60C020968D459960ED8FB73083329841A", "ABAE8EB7F36FCA2362551E72DAC890BA1BB6794797E0FC3B67426EC9372726ED4725D379EA0AC9147E48DCD0005C502863C2C5358A38817C8264B5"}, {"A083B54E6B1FE01B65D42FCD248F97BB477A41462BBFE6FD591006C022C8FD84", "B0490F5BD68A52459556B3749ACDF40E", "8892E047DA5CFBBDF7F3CFCBD1BD21C6D4C80774B1826999234394BD3E513CC7C222BB40E1E3140A152F19B3802F0D036C24A590512AD0E8", "D7B15752789DC94ED0F36778A5C7BBB207BEC32BAC66E702B39966F06E381E090C6757653C3D26A81EC6AD6C364D66867A334C91BB0B8A8A4B6EACDF0783D09010AEBA2DD2062308FE99CC1F", "C071280A732ADC93DF272BF1E613B2BB7D46FC6665EF2DC1671F3E211D6BDE1D6ADDD28DF3AA2E47053FC8BB8AE9271EC8BC8B2CFFA320D225B451685B6D23ACEFDD241FE284F8ADC8DB07F456985B14330BBB66E0FB212213E05B3E"}, } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go ================================================ // Copyright (C) 2019 ProtonTech AG // This file contains necessary tools for the aex and ocb packages. // // These functions SHOULD NOT be used elsewhere, since they are optimized for // specific input nature in the EAX and OCB modes of operation. package byteutil // GfnDouble computes 2 * input in the field of 2^n elements. // The irreducible polynomial in the finite field for n=128 is // x^128 + x^7 + x^2 + x + 1 (equals 0x87) // Constant-time execution in order to avoid side-channel attacks func GfnDouble(input []byte) []byte { if len(input) != 16 { panic("Doubling in GFn only implemented for n = 128") } // If the first bit is zero, return 2L = L << 1 // Else return (L << 1) xor 0^120 10000111 shifted := ShiftBytesLeft(input) shifted[15] ^= ((input[0] >> 7) * 0x87) return shifted } // ShiftBytesLeft outputs the byte array corresponding to x << 1 in binary. func ShiftBytesLeft(x []byte) []byte { l := len(x) dst := make([]byte, l) for i := 0; i < l-1; i++ { dst[i] = (x[i] << 1) | (x[i+1] >> 7) } dst[l-1] = x[l-1] << 1 return dst } // ShiftNBytesLeft puts in dst the byte array corresponding to x << n in binary. func ShiftNBytesLeft(dst, x []byte, n int) { // Erase first n / 8 bytes copy(dst, x[n/8:]) // Shift the remaining n % 8 bits bits := uint(n % 8) l := len(dst) for i := 0; i < l-1; i++ { dst[i] = (dst[i] << bits) | (dst[i+1] >> uint(8-bits)) } dst[l-1] = dst[l-1] << bits // Append trailing zeroes dst = append(dst, make([]byte, n/8)...) } // XorBytesMut replaces X with X XOR Y. len(X) must be >= len(Y). func XorBytesMut(X, Y []byte) { for i := 0; i < len(Y); i++ { X[i] ^= Y[i] } } // XorBytes puts X XOR Y into Z. len(Z) and len(X) must be >= len(Y). func XorBytes(Z, X, Y []byte) { for i := 0; i < len(Y); i++ { Z[i] = X[i] ^ Y[i] } } // RightXor XORs smaller input (assumed Y) at the right of the larger input (assumed X) func RightXor(X, Y []byte) []byte { offset := len(X) - len(Y) xored := make([]byte, len(X)) copy(xored, X) for i := 0; i < len(Y); i++ { xored[offset+i] ^= Y[i] } return xored } // SliceForAppend takes a slice and a requested number of bytes. It returns a // slice with the contents of the given slice followed by that many bytes and a // second slice that aliases into it and contains only the extra bytes. If the // original slice has sufficient capacity then no allocation is performed. func SliceForAppend(in []byte, n int) (head, tail []byte) { if total := len(in) + n; cap(in) >= total { head = in[:total] } else { head = make([]byte, total) copy(head, in) } tail = head[len(in):] return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go ================================================ // Copyright (C) 2019 ProtonTech AG // Package ocb provides an implementation of the OCB (offset codebook) mode of // operation, as described in RFC-7253 of the IRTF and in Rogaway, Bellare, // Black and Krovetz - OCB: A BLOCK-CIPHER MODE OF OPERATION FOR EFFICIENT // AUTHENTICATED ENCRYPTION (2003). // Security considerations (from RFC-7253): A private key MUST NOT be used to // encrypt more than 2^48 blocks. Tag length should be at least 12 bytes (a // brute-force forging adversary succeeds after 2^{tag length} attempts). A // single key SHOULD NOT be used to decrypt ciphertext with different tag // lengths. Nonces need not be secret, but MUST NOT be reused. // This package only supports underlying block ciphers with 128-bit blocks, // such as AES-{128, 192, 256}, but may be extended to other sizes. package ocb import ( "bytes" "crypto/cipher" "crypto/subtle" "errors" "math/bits" "github.com/ProtonMail/go-crypto/internal/byteutil" ) type ocb struct { block cipher.Block tagSize int nonceSize int mask mask // Optimized en/decrypt: For each nonce N used to en/decrypt, the 'Ktop' // internal variable can be reused for en/decrypting with nonces sharing // all but the last 6 bits with N. The prefix of the first nonce used to // compute the new Ktop, and the Ktop value itself, are stored in // reusableKtop. If using incremental nonces, this saves one block cipher // call every 63 out of 64 OCB encryptions, and stores one nonce and one // output of the block cipher in memory only. reusableKtop reusableKtop } type mask struct { // L_*, L_$, (L_i)_{i ∈ N} lAst []byte lDol []byte L [][]byte } type reusableKtop struct { noncePrefix []byte Ktop []byte } const ( defaultTagSize = 16 defaultNonceSize = 15 ) const ( enc = iota dec ) func (o *ocb) NonceSize() int { return o.nonceSize } func (o *ocb) Overhead() int { return o.tagSize } // NewOCB returns an OCB instance with the given block cipher and default // tag and nonce sizes. func NewOCB(block cipher.Block) (cipher.AEAD, error) { return NewOCBWithNonceAndTagSize(block, defaultNonceSize, defaultTagSize) } // NewOCBWithNonceAndTagSize returns an OCB instance with the given block // cipher, nonce length, and tag length. Panics on zero nonceSize and // exceedingly long tag size. // // It is recommended to use at least 12 bytes as tag length. func NewOCBWithNonceAndTagSize( block cipher.Block, nonceSize, tagSize int) (cipher.AEAD, error) { if block.BlockSize() != 16 { return nil, ocbError("Block cipher must have 128-bit blocks") } if nonceSize < 1 { return nil, ocbError("Incorrect nonce length") } if nonceSize >= block.BlockSize() { return nil, ocbError("Nonce length exceeds blocksize - 1") } if tagSize > block.BlockSize() { return nil, ocbError("Custom tag length exceeds blocksize") } return &ocb{ block: block, tagSize: tagSize, nonceSize: nonceSize, mask: initializeMaskTable(block), reusableKtop: reusableKtop{ noncePrefix: nil, Ktop: nil, }, }, nil } func (o *ocb) Seal(dst, nonce, plaintext, adata []byte) []byte { if len(nonce) > o.nonceSize { panic("crypto/ocb: Incorrect nonce length given to OCB") } sep := len(plaintext) ret, out := byteutil.SliceForAppend(dst, sep+o.tagSize) tag := o.crypt(enc, out[:sep], nonce, adata, plaintext) copy(out[sep:], tag) return ret } func (o *ocb) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) { if len(nonce) > o.nonceSize { panic("Nonce too long for this instance") } if len(ciphertext) < o.tagSize { return nil, ocbError("Ciphertext shorter than tag length") } sep := len(ciphertext) - o.tagSize ret, out := byteutil.SliceForAppend(dst, sep) ciphertextData := ciphertext[:sep] tag := o.crypt(dec, out, nonce, adata, ciphertextData) if subtle.ConstantTimeCompare(tag, ciphertext[sep:]) == 1 { return ret, nil } for i := range out { out[i] = 0 } return nil, ocbError("Tag authentication failed") } // On instruction enc (resp. dec), crypt is the encrypt (resp. decrypt) // function. It writes the resulting plain/ciphertext into Y and returns // the tag. func (o *ocb) crypt(instruction int, Y, nonce, adata, X []byte) []byte { // // Consider X as a sequence of 128-bit blocks // // Note: For encryption (resp. decryption), X is the plaintext (resp., the // ciphertext without the tag). blockSize := o.block.BlockSize() // // Nonce-dependent and per-encryption variables // // Zero out the last 6 bits of the nonce into truncatedNonce to see if Ktop // is already computed. truncatedNonce := make([]byte, len(nonce)) copy(truncatedNonce, nonce) truncatedNonce[len(truncatedNonce)-1] &= 192 var Ktop []byte if bytes.Equal(truncatedNonce, o.reusableKtop.noncePrefix) { Ktop = o.reusableKtop.Ktop } else { // Nonce = num2str(TAGLEN mod 128, 7) || zeros(120 - bitlen(N)) || 1 || N paddedNonce := append(make([]byte, blockSize-1-len(nonce)), 1) paddedNonce = append(paddedNonce, truncatedNonce...) paddedNonce[0] |= byte(((8 * o.tagSize) % (8 * blockSize)) << 1) // Last 6 bits of paddedNonce are already zero. Encrypt into Ktop paddedNonce[blockSize-1] &= 192 Ktop = paddedNonce o.block.Encrypt(Ktop, Ktop) o.reusableKtop.noncePrefix = truncatedNonce o.reusableKtop.Ktop = Ktop } // Stretch = Ktop || ((lower half of Ktop) XOR (lower half of Ktop << 8)) xorHalves := make([]byte, blockSize/2) byteutil.XorBytes(xorHalves, Ktop[:blockSize/2], Ktop[1:1+blockSize/2]) stretch := append(Ktop, xorHalves...) bottom := int(nonce[len(nonce)-1] & 63) offset := make([]byte, len(stretch)) byteutil.ShiftNBytesLeft(offset, stretch, bottom) offset = offset[:blockSize] // // Process any whole blocks // // Note: For encryption Y is ciphertext || tag, for decryption Y is // plaintext || tag. checksum := make([]byte, blockSize) m := len(X) / blockSize for i := 0; i < m; i++ { index := bits.TrailingZeros(uint(i + 1)) if len(o.mask.L)-1 < index { o.mask.extendTable(index) } byteutil.XorBytesMut(offset, o.mask.L[bits.TrailingZeros(uint(i+1))]) blockX := X[i*blockSize : (i+1)*blockSize] blockY := Y[i*blockSize : (i+1)*blockSize] switch instruction { case enc: byteutil.XorBytesMut(checksum, blockX) byteutil.XorBytes(blockY, blockX, offset) o.block.Encrypt(blockY, blockY) byteutil.XorBytesMut(blockY, offset) case dec: byteutil.XorBytes(blockY, blockX, offset) o.block.Decrypt(blockY, blockY) byteutil.XorBytesMut(blockY, offset) byteutil.XorBytesMut(checksum, blockY) } } // // Process any final partial block and compute raw tag // tag := make([]byte, blockSize) if len(X)%blockSize != 0 { byteutil.XorBytesMut(offset, o.mask.lAst) pad := make([]byte, blockSize) o.block.Encrypt(pad, offset) chunkX := X[blockSize*m:] chunkY := Y[blockSize*m : len(X)] switch instruction { case enc: byteutil.XorBytesMut(checksum, chunkX) checksum[len(chunkX)] ^= 128 byteutil.XorBytes(chunkY, chunkX, pad[:len(chunkX)]) // P_* || bit(1) || zeroes(127) - len(P_*) case dec: byteutil.XorBytes(chunkY, chunkX, pad[:len(chunkX)]) // P_* || bit(1) || zeroes(127) - len(P_*) byteutil.XorBytesMut(checksum, chunkY) checksum[len(chunkY)] ^= 128 } } byteutil.XorBytes(tag, checksum, offset) byteutil.XorBytesMut(tag, o.mask.lDol) o.block.Encrypt(tag, tag) byteutil.XorBytesMut(tag, o.hash(adata)) return tag[:o.tagSize] } // This hash function is used to compute the tag. Per design, on empty input it // returns a slice of zeros, of the same length as the underlying block cipher // block size. func (o *ocb) hash(adata []byte) []byte { // // Consider A as a sequence of 128-bit blocks // A := make([]byte, len(adata)) copy(A, adata) blockSize := o.block.BlockSize() // // Process any whole blocks // sum := make([]byte, blockSize) offset := make([]byte, blockSize) m := len(A) / blockSize for i := 0; i < m; i++ { chunk := A[blockSize*i : blockSize*(i+1)] index := bits.TrailingZeros(uint(i + 1)) // If the mask table is too short if len(o.mask.L)-1 < index { o.mask.extendTable(index) } byteutil.XorBytesMut(offset, o.mask.L[index]) byteutil.XorBytesMut(chunk, offset) o.block.Encrypt(chunk, chunk) byteutil.XorBytesMut(sum, chunk) } // // Process any final partial block; compute final hash value // if len(A)%blockSize != 0 { byteutil.XorBytesMut(offset, o.mask.lAst) // Pad block with 1 || 0 ^ 127 - bitlength(a) ending := make([]byte, blockSize-len(A)%blockSize) ending[0] = 0x80 encrypted := append(A[blockSize*m:], ending...) byteutil.XorBytesMut(encrypted, offset) o.block.Encrypt(encrypted, encrypted) byteutil.XorBytesMut(sum, encrypted) } return sum } func initializeMaskTable(block cipher.Block) mask { // // Key-dependent variables // lAst := make([]byte, block.BlockSize()) block.Encrypt(lAst, lAst) lDol := byteutil.GfnDouble(lAst) L := make([][]byte, 1) L[0] = byteutil.GfnDouble(lDol) return mask{ lAst: lAst, lDol: lDol, L: L, } } // Extends the L array of mask m up to L[limit], with L[i] = GfnDouble(L[i-1]) func (m *mask) extendTable(limit int) { for i := len(m.L); i <= limit; i++ { m.L = append(m.L, byteutil.GfnDouble(m.L[i-1])) } } func ocbError(err string) error { return errors.New("crypto/ocb: " + err) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go ================================================ // In the test vectors provided by RFC 7253, the "bottom" // internal variable, which defines "offset" for the first time, does not // exceed 15. However, it can attain values up to 63. // These vectors include key length in {128, 192, 256}, tag size 128, and // random nonce, header, and plaintext lengths. // This file was automatically generated. package ocb var randomVectors = []struct { key, nonce, header, plaintext, ciphertext string }{ {"9438C5D599308EAF13F800D2D31EA7F0", "C38EE4801BEBFFA1CD8635BE", "0E507B7DADD8A98CDFE272D3CB6B3E8332B56AE583FB049C0874D4200BED16BD1A044182434E9DA0E841F182DFD5B3016B34641CED0784F1745F63AB3D0DA22D3351C9EF9A658B8081E24498EBF61FCE40DA6D8E184536", "962D227786FB8913A8BAD5DC3250", "EEDEF5FFA5986D1E3BF86DDD33EF9ADC79DCA06E215FA772CCBA814F63AD"}, {"BA7DE631C7D6712167C6724F5B9A2B1D", "35263EBDA05765DC0E71F1F5", "0103257B4224507C0242FEFE821EA7FA42E0A82863E5F8B68F7D881B4B44FA428A2B6B21D2F591260802D8AB6D83", "9D6D1FC93AE8A64E7889B7B2E3521EFA9B920A8DDB692E6F833DDC4A38AFA535E5E2A3ED82CB7E26404AB86C54D01C4668F28398C2DF33D5D561CBA1C8DCFA7A912F5048E545B59483C0E3221F54B14DAA2E4EB657B3BEF9554F34CAD69B2724AE962D3D8A", "E93852D1985C5E775655E937FA79CE5BF28A585F2AF53A5018853B9634BE3C84499AC0081918FDCE0624494D60E25F76ACD6853AC7576E3C350F332249BFCABD4E73CEABC36BE4EDDA40914E598AE74174A0D7442149B26990899491BDDFE8FC54D6C18E83AE9E9A6FFBF5D376565633862EEAD88D"}, {"2E74B25289F6FD3E578C24866E9C72A5", "FD912F15025AF8414642BA1D1D", "FB5FB8C26F365EEDAB5FE260C6E3CCD27806729C8335F146063A7F9EA93290E56CF84576EB446350D22AD730547C267B1F0BBB97EB34E1E2C41A", "6C092EBF78F76EE8C1C6E592277D9545BA16EDB67BC7D8480B9827702DC2F8A129E2B08A2CE710CA7E1DA45CE162BB6CD4B512E632116E2211D3C90871EFB06B8D4B902681C7FB", "6AC0A77F26531BF4F354A1737F99E49BE32ECD909A7A71AD69352906F54B08A9CE9B8CA5D724CBFFC5673437F23F630697F3B84117A1431D6FA8CC13A974FB4AD360300522E09511B99E71065D5AC4BBCB1D791E864EF4"}, {"E7EC507C802528F790AFF5303A017B17", "4B97A7A568940A9E3CE7A99E93031E", "28349BDC5A09390C480F9B8AA3EDEA3DDB8B9D64BCA322C570B8225DF0E31190DAB25A4014BA39519E02ABFB12B89AA28BBFD29E486E7FB28734258C817B63CED9912DBAFEBB93E2798AB2890DE3B0ACFCFF906AB15563EF7823CE83D27CDB251195E22BD1337BCBDE65E7C2C427321C463C2777BFE5AEAA", "9455B3EA706B74", "7F33BA3EA848D48A96B9530E26888F43EBD4463C9399B6"}, {"6C928AA3224736F28EE7378DE0090191", "8936138E2E4C6A13280017A1622D", "6202717F2631565BDCDC57C6584543E72A7C8BD444D0D108ED35069819633C", "DA0691439E5F035F3E455269D14FE5C201C8C9B0A3FE2D3F86BCC59387C868FE65733D388360B31E3CE28B4BF6A8BE636706B536D5720DB66B47CF1C7A5AFD6F61E0EF90F1726D6B0E169F9A768B2B7AE4EE00A17F630AC905FCAAA1B707FFF25B3A1AAE83B504837C64A5639B2A34002B300EC035C9B43654DA55", "B8804D182AB0F0EEB464FA7BD1329AD6154F982013F3765FEDFE09E26DAC078C9C1439BFC1159D6C02A25E3FF83EF852570117B315852AD5EE20E0FA3AA0A626B0E43BC0CEA38B44579DD36803455FB46989B90E6D229F513FD727AF8372517E9488384C515D6067704119C931299A0982EDDFB9C2E86A90C450C077EB222511EC9CCABC9FCFDB19F70088"}, {"ECEA315CA4B3F425B0C9957A17805EA4", "664CDAE18403F4F9BA13015A44FC", "642AFB090D6C6DB46783F08B01A3EF2A8FEB5736B531EAC226E7888FCC8505F396818F83105065FACB3267485B9E5E4A0261F621041C08FCCB2A809A49AB5252A91D0971BCC620B9D614BD77E57A0EED2FA5", "6852C31F8083E20E364CEA21BB7854D67CEE812FE1C9ED2425C0932A90D3780728D1BB", "2ECEF962A9695A463ADABB275BDA9FF8B2BA57AEC2F52EFFB700CD9271A74D2A011C24AEA946051BD6291776429B7E681BA33E"}, {"4EE616C4A58AAA380878F71A373461F6", "91B8C9C176D9C385E9C47E52", "CDA440B7F9762C572A718AC754EDEECC119E5EE0CCB9FEA4FFB22EEE75087C032EBF3DA9CDD8A28CC010B99ED45143B41A4BA50EA2A005473F89639237838867A57F23B0F0ED3BF22490E4501DAC9C658A9B9F", "D6E645FA9AE410D15B8123FD757FA356A8DBE9258DDB5BE88832E615910993F497EC", "B70ED7BF959FB2AAED4F36174A2A99BFB16992C8CDF369C782C4DB9C73DE78C5DB8E0615F647243B97ACDB24503BC9CADC48"}, {"DCD475773136C830D5E3D0C5FE05B7FF", "BB8E1FBB483BE7616A922C4A", "36FEF2E1CB29E76A6EA663FC3AF66ECD7404F466382F7B040AABED62293302B56E8783EF7EBC21B4A16C3E78A7483A0A403F253A2CDC5BBF79DC3DAE6C73F39A961D8FBBE8D41B", "441E886EA38322B2437ECA7DEB5282518865A66780A454E510878E61BFEC3106A3CD93D2A02052E6F9E1832F9791053E3B76BF4C07EFDD6D4106E3027FABB752E60C1AA425416A87D53938163817A1051EBA1D1DEEB4B9B25C7E97368B52E5911A31810B0EC5AF547559B6142D9F4C4A6EF24A4CF75271BF9D48F62B", "1BE4DD2F4E25A6512C2CC71D24BBB07368589A94C2714962CD0ACE5605688F06342587521E75F0ACAFFD86212FB5C34327D238DB36CF2B787794B9A4412E7CD1410EA5DDD2450C265F29CF96013CD213FD2880657694D718558964BC189B4A84AFCF47EB012935483052399DBA5B088B0A0477F20DFE0E85DCB735E21F22A439FB837DD365A93116D063E607"}, {"3FBA2B3D30177FFE15C1C59ED2148BB2C091F5615FBA7C07", "FACF804A4BEBF998505FF9DE", "8213B9263B2971A5BDA18DBD02208EE1", "15B323926993B326EA19F892D704439FC478828322AF72118748284A1FD8A6D814E641F70512FD706980337379F31DC63355974738D7FEA87AD2858C0C2EBBFBE74371C21450072373C7B651B334D7C4D43260B9D7CCD3AF9EDB", "6D35DC1469B26E6AAB26272A41B46916397C24C485B61162E640A062D9275BC33DDCFD3D9E1A53B6C8F51AC89B66A41D59B3574197A40D9B6DCF8A4E2A001409C8112F16B9C389E0096179DB914E05D6D11ED0005AD17E1CE105A2F0BAB8F6B1540DEB968B7A5428FF44"}, {"53B52B8D4D748BCDF1DDE68857832FA46227FA6E2F32EFA1", "0B0EF53D4606B28D1398355F", "F23882436349094AF98BCACA8218E81581A043B19009E28EFBF2DE37883E04864148CC01D240552CA8844EC1456F42034653067DA67E80F87105FD06E14FF771246C9612867BE4D215F6D761", "F15030679BD4088D42CAC9BF2E9606EAD4798782FA3ED8C57EBE7F84A53236F51B25967C6489D0CD20C9EEA752F9BC", "67B96E2D67C3729C96DAEAEDF821D61C17E648643A2134C5621FEC621186915AD80864BFD1EB5B238BF526A679385E012A457F583AFA78134242E9D9C1B4E4"}, {"0272DD80F23399F49BFC320381A5CD8225867245A49A7D41", "5C83F4896D0738E1366B1836", "69B0337289B19F73A12BAEEA857CCAF396C11113715D9500CCCF48BA08CFF12BC8B4BADB3084E63B85719DB5058FA7C2C11DEB096D7943CFA7CAF5", "C01AD10FC8B562CD17C7BC2FAB3E26CBDFF8D7F4DEA816794BBCC12336991712972F52816AABAB244EB43B0137E2BAC1DD413CE79531E78BEF782E6B439612BB3AEF154DE3502784F287958EBC159419F9EBA27916A28D6307324129F506B1DE80C1755A929F87", "FEFE52DD7159C8DD6E8EC2D3D3C0F37AB6CB471A75A071D17EC4ACDD8F3AA4D7D4F7BB559F3C09099E3D9003E5E8AA1F556B79CECDE66F85B08FA5955E6976BF2695EA076388A62D2AD5BAB7CBF1A7F3F4C8D5CDF37CDE99BD3E30B685D9E5EEE48C7C89118EF4878EB89747F28271FA2CC45F8E9E7601"}, {"3EEAED04A455D6E5E5AB53CFD5AFD2F2BC625C7BF4BE49A5", "36B88F63ADBB5668588181D774", "D367E3CB3703E762D23C6533188EF7028EFF9D935A3977150361997EC9DEAF1E4794BDE26AA8B53C124980B1362EC86FCDDFC7A90073171C1BAEE351A53234B86C66E8AB92FAE99EC6967A6D3428892D80", "573454C719A9A55E04437BF7CBAAF27563CCCD92ADD5E515CD63305DFF0687E5EEF790C5DCA5C0033E9AB129505E2775438D92B38F08F3B0356BA142C6F694", "E9F79A5B432D9E682C9AAA5661CFC2E49A0FCB81A431E54B42EB73DD3BED3F377FEC556ABA81624BA64A5D739AD41467460088F8D4F442180A9382CA635745473794C382FCDDC49BA4EB6D8A44AE3C"}, {"B695C691538F8CBD60F039D0E28894E3693CC7C36D92D79D", "BC099AEB637361BAC536B57618", "BFFF1A65AE38D1DC142C71637319F5F6508E2CB33C9DCB94202B359ED5A5ED8042E7F4F09231D32A7242976677E6F4C549BF65FADC99E5AF43F7A46FD95E16C2", "081DF3FD85B415D803F0BE5AC58CFF0023FDDED99788296C3731D8", "E50C64E3614D94FE69C47092E46ACC9957C6FEA2CCBF96BC62FBABE7424753C75F9C147C42AE26FE171531"}, {"C9ACBD2718F0689A1BE9802A551B6B8D9CF5614DAF5E65ED", "B1B0AAF373B8B026EB80422051D8", "6648C0E61AC733C76119D23FB24548D637751387AA2EAE9D80E912B7BD486CAAD9EAF4D7A5FE2B54AAD481E8EC94BB4D558000896E2010462B70C9FED1E7273080D1", "189F591F6CB6D59AFEDD14C341741A8F1037DC0DF00FC57CE65C30F49E860255CEA5DC6019380CC0FE8880BC1A9E685F41C239C38F36E3F2A1388865C5C311059C0A", "922A5E949B61D03BE34AB5F4E58607D4504EA14017BB363DAE3C873059EA7A1C77A746FB78981671D26C2CF6D9F24952D510044CE02A10177E9DB42D0145211DFE6E84369C5E3BC2669EAB4147B2822895F9"}, {"7A832BD2CF5BF4919F353CE2A8C86A5E406DA2D52BE16A72", "2F2F17CECF7E5A756D10785A3CB9DB", "61DA05E3788CC2D8405DBA70C7A28E5AF699863C9F72E6C6770126929F5D6FA267F005EBCF49495CB46400958A3AE80D1289D1C671", "44E91121195A41AF14E8CFDBD39A4B517BE0DF1A72977ED8A3EEF8EEDA1166B2EB6DB2C4AE2E74FA0F0C74537F659BFBD141E5DDEC67E64EDA85AABD3F52C85A785B9FB3CECD70E7DF", "BEDF596EA21288D2B84901E188F6EE1468B14D5161D3802DBFE00D60203A24E2AB62714BF272A45551489838C3A7FEAADC177B591836E73684867CCF4E12901DCF2064058726BBA554E84ADC5136F507E961188D4AF06943D3"}, {"1508E8AE9079AA15F1CEC4F776B4D11BCCB061B58AA56C18", "BCA625674F41D1E3AB47672DC0C3", "8B12CF84F16360F0EAD2A41BC021530FFCEC7F3579CAE658E10E2D3D81870F65AFCED0C77C6C4C6E6BA424FF23088C796BA6195ABA35094BF1829E089662E7A95FC90750AE16D0C8AFA55DAC789D7735B970B58D4BE7CEC7341DA82A0179A01929C27A59C5063215B859EA43", "E525422519ECE070E82C", "B47BC07C3ED1C0A43BA52C43CBACBCDBB29CAF1001E09FDF7107"}, {"7550C2761644E911FE9ADD119BAC07376BEA442845FEAD876D7E7AC1B713E464", "36D2EC25ADD33CDEDF495205BBC923", "7FCFE81A3790DE97FFC3DE160C470847EA7E841177C2F759571CBD837EA004A6CA8C6F4AEBFF2E9FD552D73EB8A30705D58D70C0B67AEEA280CBBF0A477358ACEF1E7508F2735CD9A0E4F9AC92B8C008F575D3B6278F1C18BD01227E3502E5255F3AB1893632AD00C717C588EF652A51A43209E7EE90", "2B1A62F8FDFAA3C16470A21AD307C9A7D03ADE8EF72C69B06F8D738CDE578D7AEFD0D40BD9C022FB9F580DF5394C998ACCCEFC5471A3996FB8F1045A81FDC6F32D13502EA65A211390C8D882B8E0BEFD8DD8CBEF51D1597B124E9F7F", "C873E02A22DB89EB0787DB6A60B99F7E4A0A085D5C4232A81ADCE2D60AA36F92DDC33F93DD8640AC0E08416B187FB382B3EC3EE85A64B0E6EE41C1366A5AD2A282F66605E87031CCBA2FA7B2DA201D975994AADE3DD1EE122AE09604AD489B84BF0C1AB7129EE16C6934850E"}, {"A51300285E554FDBDE7F771A9A9A80955639DD87129FAEF74987C91FB9687C71", "81691D5D20EC818FCFF24B33DECC", "C948093218AA9EB2A8E44A87EEA73FC8B6B75A196819A14BD83709EA323E8DF8B491045220E1D88729A38DBCFFB60D3056DAD4564498FD6574F74512945DEB34B69329ACED9FFC05D5D59DFCD5B973E2ACAFE6AD1EF8BBBC49351A2DD12508ED89ED", "EB861165DAF7625F827C6B574ED703F03215", "C6CD1CE76D2B3679C1B5AA1CFD67CCB55444B6BFD3E22C81CBC9BB738796B83E54E3"}, {"8CE0156D26FAEB7E0B9B800BBB2E9D4075B5EAC5C62358B0E7F6FCE610223282", "D2A7B94DD12CDACA909D3AD7", "E021A78F374FC271389AB9A3E97077D755", "7C26000B58929F5095E1CEE154F76C2A299248E299F9B5ADE6C403AA1FD4A67FD4E0232F214CE7B919EE7A1027D2B76C57475715CD078461", "C556FB38DF069B56F337B5FF5775CE6EAA16824DFA754F20B78819028EA635C3BB7AA731DE8776B2DCB67DCA2D33EEDF3C7E52EA450013722A41755A0752433ED17BDD5991AAE77A"}, {"1E8000A2CE00A561C9920A30BF0D7B983FEF8A1014C8F04C35CA6970E6BA02BD", "65ED3D63F79F90BBFD19775E", "336A8C0B7243582A46B221AA677647FCAE91", "134A8B34824A290E7B", "914FBEF80D0E6E17F8BDBB6097EBF5FBB0554952DC2B9E5151"}, {"53D5607BBE690B6E8D8F6D97F3DF2BA853B682597A214B8AA0EA6E598650AF15", "C391A856B9FE234E14BA1AC7BB40FF", "479682BC21349C4BE1641D5E78FE2C79EC1B9CF5470936DCAD9967A4DCD7C4EFADA593BC9EDE71E6A08829B8580901B61E274227E9D918502DE3", "EAD154DC09C5E26C5D26FF33ED148B27120C7F2C23225CC0D0631B03E1F6C6D96FEB88C1A4052ACB4CE746B884B6502931F407021126C6AAB8C514C077A5A38438AE88EE", "938821286EBB671D999B87C032E1D6055392EB564E57970D55E545FC5E8BAB90E6E3E3C0913F6320995FC636D72CD9919657CC38BD51552F4A502D8D1FE56DB33EBAC5092630E69EBB986F0E15CEE9FC8C052501"}, {"294362FCC984F440CEA3E9F7D2C06AF20C53AAC1B3738CA2186C914A6E193ABB", "B15B61C8BB39261A8F55AB178EC3", "D0729B6B75BB", "2BD089ADCE9F334BAE3B065996C7D616DD0C27DF4218DCEEA0FBCA0F968837CE26B0876083327E25681FDDD620A32EC0DA12F73FAE826CC94BFF2B90A54D2651", "AC94B25E4E21DE2437B806966CCD5D9385EF0CD4A51AB9FA6DE675C7B8952D67802E9FEC1FDE9F5D1EAB06057498BC0EEA454804FC9D2068982A3E24182D9AC2E7AB9994DDC899A604264583F63D066B"}, {"959DBFEB039B1A5B8CE6A44649B602AAA5F98A906DB96143D202CD2024F749D9", "01D7BDB1133E9C347486C1EFA6", "F3843955BD741F379DD750585EDC55E2CDA05CCBA8C1F4622AC2FE35214BC3A019B8BD12C4CC42D9213D1E1556941E8D8450830287FFB3B763A13722DD4140ED9846FB5FFF745D7B0B967D810A068222E10B259AF1D392035B0D83DC1498A6830B11B2418A840212599171E0258A1C203B05362978", "A21811232C950FA8B12237C2EBD6A7CD2C3A155905E9E0C7C120", "63C1CE397B22F1A03F1FA549B43178BC405B152D3C95E977426D519B3DFCA28498823240592B6EEE7A14"}, {"096AE499F5294173F34FF2B375F0E5D5AB79D0D03B33B1A74D7D576826345DF4", "0C52B3D11D636E5910A4DD76D32C", "229E9ECA3053789E937447BC719467075B6138A142DA528DA8F0CF8DDF022FD9AF8E74779BA3AC306609", "8B7A00038783E8BAF6EDEAE0C4EAB48FC8FD501A588C7E4A4DB71E3604F2155A97687D3D2FFF8569261375A513CF4398CE0F87CA1658A1050F6EF6C4EA3E25", "C20B6CF8D3C8241825FD90B2EDAC7593600646E579A8D8DAAE9E2E40C3835FE801B2BE4379131452BC5182C90307B176DFBE2049544222FE7783147B690774F6D9D7CEF52A91E61E298E9AA15464AC"}, } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go ================================================ package ocb import ( "encoding/hex" ) // Test vectors from https://tools.ietf.org/html/rfc7253. Note that key is // shared across tests. var testKey, _ = hex.DecodeString("000102030405060708090A0B0C0D0E0F") var rfc7253testVectors = []struct { nonce, header, plaintext, ciphertext string }{ {"BBAA99887766554433221100", "", "", "785407BFFFC8AD9EDCC5520AC9111EE6"}, {"BBAA99887766554433221101", "0001020304050607", "0001020304050607", "6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009"}, {"BBAA99887766554433221102", "0001020304050607", "", "81017F8203F081277152FADE694A0A00"}, {"BBAA99887766554433221103", "", "0001020304050607", "45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9"}, {"BBAA99887766554433221104", "000102030405060708090A0B0C0D0E0F", "000102030405060708090A0B0C0D0E0F", "571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5701C1CCEC8FC3358"}, {"BBAA99887766554433221105", "000102030405060708090A0B0C0D0E0F", "", "8CF761B6902EF764462AD86498CA6B97"}, {"BBAA99887766554433221106", "", "000102030405060708090A0B0C0D0E0F", "5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436BDF06D8FA1ECA343D"}, {"BBAA99887766554433221107", "000102030405060708090A0B0C0D0E0F1011121314151617", "000102030405060708090A0B0C0D0E0F1011121314151617", "1CA2207308C87C010756104D8840CE1952F09673A448A122C92C62241051F57356D7F3C90BB0E07F"}, {"BBAA99887766554433221108", "000102030405060708090A0B0C0D0E0F1011121314151617", "", "6DC225A071FC1B9F7C69F93B0F1E10DE"}, {"BBAA99887766554433221109", "", "000102030405060708090A0B0C0D0E0F1011121314151617", "221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3CE725F32494B9F914D85C0B1EB38357FF"}, {"BBAA9988776655443322110A", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", "BD6F6C496201C69296C11EFD138A467ABD3C707924B964DEAFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240"}, {"BBAA9988776655443322110B", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", "", "FE80690BEE8A485D11F32965BC9D2A32"}, {"BBAA9988776655443322110C", "", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", "2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF46040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF"}, {"BBAA9988776655443322110D", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", "D5CA91748410C1751FF8A2F618255B68A0A12E093FF454606E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483A7035490C5769E60"}, {"BBAA9988776655443322110E", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", "", "C5CD9D1850C141E358649994EE701B68"}, {"BBAA9988776655443322110F", "", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", "4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95A98CA5F3000B1479"}, } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go ================================================ package ocb // Second set of test vectors from https://tools.ietf.org/html/rfc7253 var rfc7253TestVectorTaglen96 = struct { key, nonce, header, plaintext, ciphertext string }{"0F0E0D0C0B0A09080706050403020100", "BBAA9988776655443322110D", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627", "1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FDAC4F02AA"} var rfc7253AlgorithmTest = []struct { KEYLEN, TAGLEN int OUTPUT string }{ {128, 128, "67E944D23256C5E0B6C61FA22FDF1EA2"}, {192, 128, "F673F2C3E7174AAE7BAE986CA9F29E17"}, {256, 128, "D90EB8E9C977C88B79DD793D7FFA161C"}, {128, 96, "77A3D8E73589158D25D01209"}, {192, 96, "05D56EAD2752C86BE6932C5E"}, {256, 96, "5458359AC23B0CBA9E6330DD"}, {128, 64, "192C9B7BD90BA06A"}, {192, 64, "0066BC6E0EF34E24"}, {256, 64, "7D4EA5D445501CBE"}, } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go ================================================ // Copyright 2014 Matthew Endsley // All rights reserved // // Redistribution and use in source and binary forms, with or without // modification, are permitted providing that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. 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. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. // Package keywrap is an implementation of the RFC 3394 AES key wrapping // algorithm. This is used in OpenPGP with elliptic curve keys. package keywrap import ( "crypto/aes" "encoding/binary" "errors" ) var ( // ErrWrapPlaintext is returned if the plaintext is not a multiple // of 64 bits. ErrWrapPlaintext = errors.New("keywrap: plainText must be a multiple of 64 bits") // ErrUnwrapCiphertext is returned if the ciphertext is not a // multiple of 64 bits. ErrUnwrapCiphertext = errors.New("keywrap: cipherText must by a multiple of 64 bits") // ErrUnwrapFailed is returned if unwrapping a key fails. ErrUnwrapFailed = errors.New("keywrap: failed to unwrap key") // NB: the AES NewCipher call only fails if the key is an invalid length. // ErrInvalidKey is returned when the AES key is invalid. ErrInvalidKey = errors.New("keywrap: invalid AES key") ) // Wrap a key using the RFC 3394 AES Key Wrap Algorithm. func Wrap(key, plainText []byte) ([]byte, error) { if len(plainText)%8 != 0 { return nil, ErrWrapPlaintext } c, err := aes.NewCipher(key) if err != nil { return nil, ErrInvalidKey } nblocks := len(plainText) / 8 // 1) Initialize variables. var block [aes.BlockSize]byte // - Set A = IV, an initial value (see 2.2.3) for ii := 0; ii < 8; ii++ { block[ii] = 0xA6 } // - For i = 1 to n // - Set R[i] = P[i] intermediate := make([]byte, len(plainText)) copy(intermediate, plainText) // 2) Calculate intermediate values. for ii := 0; ii < 6; ii++ { for jj := 0; jj < nblocks; jj++ { // - B = AES(K, A | R[i]) copy(block[8:], intermediate[jj*8:jj*8+8]) c.Encrypt(block[:], block[:]) // - A = MSB(64, B) ^ t where t = (n*j)+1 t := uint64(ii*nblocks + jj + 1) val := binary.BigEndian.Uint64(block[:8]) ^ t binary.BigEndian.PutUint64(block[:8], val) // - R[i] = LSB(64, B) copy(intermediate[jj*8:jj*8+8], block[8:]) } } // 3) Output results. // - Set C[0] = A // - For i = 1 to n // - C[i] = R[i] return append(block[:8], intermediate...), nil } // Unwrap a key using the RFC 3394 AES Key Wrap Algorithm. func Unwrap(key, cipherText []byte) ([]byte, error) { if len(cipherText)%8 != 0 { return nil, ErrUnwrapCiphertext } c, err := aes.NewCipher(key) if err != nil { return nil, ErrInvalidKey } nblocks := len(cipherText)/8 - 1 // 1) Initialize variables. var block [aes.BlockSize]byte // - Set A = C[0] copy(block[:8], cipherText[:8]) // - For i = 1 to n // - Set R[i] = C[i] intermediate := make([]byte, len(cipherText)-8) copy(intermediate, cipherText[8:]) // 2) Compute intermediate values. for jj := 5; jj >= 0; jj-- { for ii := nblocks - 1; ii >= 0; ii-- { // - B = AES-1(K, (A ^ t) | R[i]) where t = n*j+1 // - A = MSB(64, B) t := uint64(jj*nblocks + ii + 1) val := binary.BigEndian.Uint64(block[:8]) ^ t binary.BigEndian.PutUint64(block[:8], val) copy(block[8:], intermediate[ii*8:ii*8+8]) c.Decrypt(block[:], block[:]) // - R[i] = LSB(B, 64) copy(intermediate[ii*8:ii*8+8], block[8:]) } } // 3) Output results. // - If A is an appropriate initial value (see 2.2.3), for ii := 0; ii < 8; ii++ { if block[ii] != 0xA6 { return nil, ErrUnwrapFailed } } // - For i = 1 to n // - P[i] = R[i] return intermediate, nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go ================================================ // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package armor implements OpenPGP ASCII Armor, see RFC 4880. OpenPGP Armor is // very similar to PEM except that it has an additional CRC checksum. package armor // import "github.com/ProtonMail/go-crypto/openpgp/armor" import ( "bufio" "bytes" "encoding/base64" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ) // A Block represents an OpenPGP armored structure. // // The encoded form is: // // -----BEGIN Type----- // Headers // // base64-encoded Bytes // '=' base64 encoded checksum (optional) not checked anymore // -----END Type----- // // where Headers is a possibly empty sequence of Key: Value lines. // // Since the armored data can be very large, this package presents a streaming // interface. type Block struct { Type string // The type, taken from the preamble (i.e. "PGP SIGNATURE"). Header map[string]string // Optional headers. Body io.Reader // A Reader from which the contents can be read lReader lineReader oReader openpgpReader } var ArmorCorrupt error = errors.StructuralError("armor invalid") var armorStart = []byte("-----BEGIN ") var armorEnd = []byte("-----END ") var armorEndOfLine = []byte("-----") // lineReader wraps a line based reader. It watches for the end of an armor block type lineReader struct { in *bufio.Reader buf []byte eof bool } func (l *lineReader) Read(p []byte) (n int, err error) { if l.eof { return 0, io.EOF } if len(l.buf) > 0 { n = copy(p, l.buf) l.buf = l.buf[n:] return } line, isPrefix, err := l.in.ReadLine() if err != nil { return } if isPrefix { return 0, ArmorCorrupt } if bytes.HasPrefix(line, armorEnd) { l.eof = true return 0, io.EOF } if len(line) == 5 && line[0] == '=' { // This is the checksum line // Don't check the checksum l.eof = true return 0, io.EOF } if len(line) > 96 { return 0, ArmorCorrupt } n = copy(p, line) bytesToSave := len(line) - n if bytesToSave > 0 { if cap(l.buf) < bytesToSave { l.buf = make([]byte, 0, bytesToSave) } l.buf = l.buf[0:bytesToSave] copy(l.buf, line[n:]) } return } // openpgpReader passes Read calls to the underlying base64 decoder. type openpgpReader struct { lReader *lineReader b64Reader io.Reader } func (r *openpgpReader) Read(p []byte) (n int, err error) { n, err = r.b64Reader.Read(p) return } // Decode reads a PGP armored block from the given Reader. It will ignore // leading garbage. If it doesn't find a block, it will return nil, io.EOF. The // given Reader is not usable after calling this function: an arbitrary amount // of data may have been read past the end of the block. func Decode(in io.Reader) (p *Block, err error) { r := bufio.NewReaderSize(in, 100) var line []byte ignoreNext := false TryNextBlock: p = nil // Skip leading garbage for { ignoreThis := ignoreNext line, ignoreNext, err = r.ReadLine() if err != nil { return } if ignoreNext || ignoreThis { continue } line = bytes.TrimSpace(line) if len(line) > len(armorStart)+len(armorEndOfLine) && bytes.HasPrefix(line, armorStart) { break } } p = new(Block) p.Type = string(line[len(armorStart) : len(line)-len(armorEndOfLine)]) p.Header = make(map[string]string) nextIsContinuation := false var lastKey string // Read headers for { isContinuation := nextIsContinuation line, nextIsContinuation, err = r.ReadLine() if err != nil { p = nil return } if isContinuation { p.Header[lastKey] += string(line) continue } line = bytes.TrimSpace(line) if len(line) == 0 { break } i := bytes.Index(line, []byte(":")) if i == -1 { goto TryNextBlock } lastKey = string(line[:i]) var value string if len(line) > i+2 { value = string(line[i+2:]) } p.Header[lastKey] = value } p.lReader.in = r p.oReader.lReader = &p.lReader p.oReader.b64Reader = base64.NewDecoder(base64.StdEncoding, &p.lReader) p.Body = &p.oReader return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go ================================================ // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package armor import ( "encoding/base64" "io" "sort" ) var armorHeaderSep = []byte(": ") var blockEnd = []byte("\n=") var newline = []byte("\n") var armorEndOfLineOut = []byte("-----\n") const crc24Init = 0xb704ce const crc24Poly = 0x1864cfb // crc24 calculates the OpenPGP checksum as specified in RFC 4880, section 6.1 func crc24(crc uint32, d []byte) uint32 { for _, b := range d { crc ^= uint32(b) << 16 for i := 0; i < 8; i++ { crc <<= 1 if crc&0x1000000 != 0 { crc ^= crc24Poly } } } return crc } // writeSlices writes its arguments to the given Writer. func writeSlices(out io.Writer, slices ...[]byte) (err error) { for _, s := range slices { _, err = out.Write(s) if err != nil { return err } } return } // lineBreaker breaks data across several lines, all of the same byte length // (except possibly the last). Lines are broken with a single '\n'. type lineBreaker struct { lineLength int line []byte used int out io.Writer haveWritten bool } func newLineBreaker(out io.Writer, lineLength int) *lineBreaker { return &lineBreaker{ lineLength: lineLength, line: make([]byte, lineLength), used: 0, out: out, } } func (l *lineBreaker) Write(b []byte) (n int, err error) { n = len(b) if n == 0 { return } if l.used == 0 && l.haveWritten { _, err = l.out.Write([]byte{'\n'}) if err != nil { return } } if l.used+len(b) < l.lineLength { l.used += copy(l.line[l.used:], b) return } l.haveWritten = true _, err = l.out.Write(l.line[0:l.used]) if err != nil { return } excess := l.lineLength - l.used l.used = 0 _, err = l.out.Write(b[0:excess]) if err != nil { return } _, err = l.Write(b[excess:]) return } func (l *lineBreaker) Close() (err error) { if l.used > 0 { _, err = l.out.Write(l.line[0:l.used]) if err != nil { return } } return } // encoding keeps track of a running CRC24 over the data which has been written // to it and outputs a OpenPGP checksum when closed, followed by an armor // trailer. // // It's built into a stack of io.Writers: // // encoding -> base64 encoder -> lineBreaker -> out type encoding struct { out io.Writer breaker *lineBreaker b64 io.WriteCloser crc uint32 crcEnabled bool blockType []byte } func (e *encoding) Write(data []byte) (n int, err error) { if e.crcEnabled { e.crc = crc24(e.crc, data) } return e.b64.Write(data) } func (e *encoding) Close() (err error) { err = e.b64.Close() if err != nil { return } e.breaker.Close() if e.crcEnabled { var checksumBytes [3]byte checksumBytes[0] = byte(e.crc >> 16) checksumBytes[1] = byte(e.crc >> 8) checksumBytes[2] = byte(e.crc) var b64ChecksumBytes [4]byte base64.StdEncoding.Encode(b64ChecksumBytes[:], checksumBytes[:]) return writeSlices(e.out, blockEnd, b64ChecksumBytes[:], newline, armorEnd, e.blockType, armorEndOfLine) } return writeSlices(e.out, newline, armorEnd, e.blockType, armorEndOfLine) } func encode(out io.Writer, blockType string, headers map[string]string, checksum bool) (w io.WriteCloser, err error) { bType := []byte(blockType) err = writeSlices(out, armorStart, bType, armorEndOfLineOut) if err != nil { return } keys := make([]string, len(headers)) i := 0 for k := range headers { keys[i] = k i++ } sort.Strings(keys) for _, k := range keys { err = writeSlices(out, []byte(k), armorHeaderSep, []byte(headers[k]), newline) if err != nil { return } } _, err = out.Write(newline) if err != nil { return } e := &encoding{ out: out, breaker: newLineBreaker(out, 64), blockType: bType, crc: crc24Init, crcEnabled: checksum, } e.b64 = base64.NewEncoder(base64.StdEncoding, e.breaker) return e, nil } // Encode returns a WriteCloser which will encode the data written to it in // OpenPGP armor. func Encode(out io.Writer, blockType string, headers map[string]string) (w io.WriteCloser, err error) { return encode(out, blockType, headers, true) } // EncodeWithChecksumOption returns a WriteCloser which will encode the data written to it in // OpenPGP armor and provides the option to include a checksum. // When forming ASCII Armor, the CRC24 footer SHOULD NOT be generated, // unless interoperability with implementations that require the CRC24 footer // to be present is a concern. func EncodeWithChecksumOption(out io.Writer, blockType string, headers map[string]string, doChecksum bool) (w io.WriteCloser, err error) { return encode(out, blockType, headers, doChecksum) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/canonical_text.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package openpgp import ( "hash" "io" ) // NewCanonicalTextHash reformats text written to it into the canonical // form and then applies the hash h. See RFC 4880, section 5.2.1. func NewCanonicalTextHash(h hash.Hash) hash.Hash { return &canonicalTextHash{h, 0} } type canonicalTextHash struct { h hash.Hash s int } var newline = []byte{'\r', '\n'} func writeCanonical(cw io.Writer, buf []byte, s *int) (int, error) { start := 0 for i, c := range buf { switch *s { case 0: if c == '\r' { *s = 1 } else if c == '\n' { if _, err := cw.Write(buf[start:i]); err != nil { return 0, err } if _, err := cw.Write(newline); err != nil { return 0, err } start = i + 1 } case 1: *s = 0 } } if _, err := cw.Write(buf[start:]); err != nil { return 0, err } return len(buf), nil } func (cth *canonicalTextHash) Write(buf []byte) (int, error) { return writeCanonical(cth.h, buf, &cth.s) } func (cth *canonicalTextHash) Sum(in []byte) []byte { return cth.h.Sum(in) } func (cth *canonicalTextHash) Reset() { cth.h.Reset() cth.s = 0 } func (cth *canonicalTextHash) Size() int { return cth.h.Size() } func (cth *canonicalTextHash) BlockSize() int { return cth.h.BlockSize() } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package ecdh implements ECDH encryption, suitable for OpenPGP, // as specified in RFC 6637, section 8. package ecdh import ( "bytes" "errors" "io" "github.com/ProtonMail/go-crypto/openpgp/aes/keywrap" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" ) type KDF struct { Hash algorithm.Hash Cipher algorithm.Cipher } type PublicKey struct { curve ecc.ECDHCurve Point []byte KDF } type PrivateKey struct { PublicKey D []byte } func NewPublicKey(curve ecc.ECDHCurve, kdfHash algorithm.Hash, kdfCipher algorithm.Cipher) *PublicKey { return &PublicKey{ curve: curve, KDF: KDF{ Hash: kdfHash, Cipher: kdfCipher, }, } } func NewPrivateKey(key PublicKey) *PrivateKey { return &PrivateKey{ PublicKey: key, } } func (pk *PublicKey) GetCurve() ecc.ECDHCurve { return pk.curve } func (pk *PublicKey) MarshalPoint() []byte { return pk.curve.MarshalBytePoint(pk.Point) } func (pk *PublicKey) UnmarshalPoint(p []byte) error { pk.Point = pk.curve.UnmarshalBytePoint(p) if pk.Point == nil { return errors.New("ecdh: failed to parse EC point") } return nil } func (sk *PrivateKey) MarshalByteSecret() []byte { return sk.curve.MarshalByteSecret(sk.D) } func (sk *PrivateKey) UnmarshalByteSecret(d []byte) error { sk.D = sk.curve.UnmarshalByteSecret(d) if sk.D == nil { return errors.New("ecdh: failed to parse scalar") } return nil } func GenerateKey(rand io.Reader, c ecc.ECDHCurve, kdf KDF) (priv *PrivateKey, err error) { priv = new(PrivateKey) priv.PublicKey.curve = c priv.PublicKey.KDF = kdf priv.PublicKey.Point, priv.D, err = c.GenerateECDH(rand) return } func Encrypt(random io.Reader, pub *PublicKey, msg, curveOID, fingerprint []byte) (vsG, c []byte, err error) { if len(msg) > 40 { return nil, nil, errors.New("ecdh: message too long") } // the sender MAY use 21, 13, and 5 bytes of padding for AES-128, // AES-192, and AES-256, respectively, to provide the same number of // octets, 40 total, as an input to the key wrapping method. padding := make([]byte, 40-len(msg)) for i := range padding { padding[i] = byte(40 - len(msg)) } m := append(msg, padding...) ephemeral, zb, err := pub.curve.Encaps(random, pub.Point) if err != nil { return nil, nil, err } vsG = pub.curve.MarshalBytePoint(ephemeral) z, err := buildKey(pub, zb, curveOID, fingerprint, false, false) if err != nil { return nil, nil, err } if c, err = keywrap.Wrap(z, m); err != nil { return nil, nil, err } return vsG, c, nil } func Decrypt(priv *PrivateKey, vsG, c, curveOID, fingerprint []byte) (msg []byte, err error) { var m []byte zb, err := priv.PublicKey.curve.Decaps(priv.curve.UnmarshalBytePoint(vsG), priv.D) // Try buildKey three times to workaround an old bug, see comments in buildKey. for i := 0; i < 3; i++ { var z []byte // RFC6637 §8: "Compute Z = KDF( S, Z_len, Param );" z, err = buildKey(&priv.PublicKey, zb, curveOID, fingerprint, i == 1, i == 2) if err != nil { return nil, err } // RFC6637 §8: "Compute C = AESKeyWrap( Z, c ) as per [RFC3394]" m, err = keywrap.Unwrap(z, c) if err == nil { break } } // Only return an error after we've tried all (required) variants of buildKey. if err != nil { return nil, err } // RFC6637 §8: "m = symm_alg_ID || session key || checksum || pkcs5_padding" // The last byte should be the length of the padding, as per PKCS5; strip it off. return m[:len(m)-int(m[len(m)-1])], nil } func buildKey(pub *PublicKey, zb []byte, curveOID, fingerprint []byte, stripLeading, stripTrailing bool) ([]byte, error) { // Param = curve_OID_len || curve_OID || public_key_alg_ID || 03 // || 01 || KDF_hash_ID || KEK_alg_ID for AESKeyWrap // || "Anonymous Sender " || recipient_fingerprint; param := new(bytes.Buffer) if _, err := param.Write(curveOID); err != nil { return nil, err } algKDF := []byte{18, 3, 1, pub.KDF.Hash.Id(), pub.KDF.Cipher.Id()} if _, err := param.Write(algKDF); err != nil { return nil, err } if _, err := param.Write([]byte("Anonymous Sender ")); err != nil { return nil, err } if _, err := param.Write(fingerprint[:]); err != nil { return nil, err } // MB = Hash ( 00 || 00 || 00 || 01 || ZB || Param ); h := pub.KDF.Hash.New() if _, err := h.Write([]byte{0x0, 0x0, 0x0, 0x1}); err != nil { return nil, err } zbLen := len(zb) i := 0 j := zbLen - 1 if stripLeading { // Work around old go crypto bug where the leading zeros are missing. for i < zbLen && zb[i] == 0 { i++ } } if stripTrailing { // Work around old OpenPGP.js bug where insignificant trailing zeros in // this little-endian number are missing. // (See https://github.com/openpgpjs/openpgpjs/pull/853.) for j >= 0 && zb[j] == 0 { j-- } } if _, err := h.Write(zb[i : j+1]); err != nil { return nil, err } if _, err := h.Write(param.Bytes()); err != nil { return nil, err } mb := h.Sum(nil) return mb[:pub.KDF.Cipher.KeySize()], nil // return oBits leftmost bits of MB. } func Validate(priv *PrivateKey) error { return priv.curve.ValidateECDH(priv.Point, priv.D) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/ecdsa/ecdsa.go ================================================ // Package ecdsa implements ECDSA signature, suitable for OpenPGP, // as specified in RFC 6637, section 5. package ecdsa import ( "errors" "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" "io" "math/big" ) type PublicKey struct { X, Y *big.Int curve ecc.ECDSACurve } type PrivateKey struct { PublicKey D *big.Int } func NewPublicKey(curve ecc.ECDSACurve) *PublicKey { return &PublicKey{ curve: curve, } } func NewPrivateKey(key PublicKey) *PrivateKey { return &PrivateKey{ PublicKey: key, } } func (pk *PublicKey) GetCurve() ecc.ECDSACurve { return pk.curve } func (pk *PublicKey) MarshalPoint() []byte { return pk.curve.MarshalIntegerPoint(pk.X, pk.Y) } func (pk *PublicKey) UnmarshalPoint(p []byte) error { pk.X, pk.Y = pk.curve.UnmarshalIntegerPoint(p) if pk.X == nil { return errors.New("ecdsa: failed to parse EC point") } return nil } func (sk *PrivateKey) MarshalIntegerSecret() []byte { return sk.curve.MarshalIntegerSecret(sk.D) } func (sk *PrivateKey) UnmarshalIntegerSecret(d []byte) error { sk.D = sk.curve.UnmarshalIntegerSecret(d) if sk.D == nil { return errors.New("ecdsa: failed to parse scalar") } return nil } func GenerateKey(rand io.Reader, c ecc.ECDSACurve) (priv *PrivateKey, err error) { priv = new(PrivateKey) priv.PublicKey.curve = c priv.PublicKey.X, priv.PublicKey.Y, priv.D, err = c.GenerateECDSA(rand) return } func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) { return priv.PublicKey.curve.Sign(rand, priv.X, priv.Y, priv.D, hash) } func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool { return pub.curve.Verify(pub.X, pub.Y, hash, r, s) } func Validate(priv *PrivateKey) error { return priv.curve.ValidateECDSA(priv.X, priv.Y, priv.D.Bytes()) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/ed25519/ed25519.go ================================================ // Package ed25519 implements the ed25519 signature algorithm for OpenPGP // as defined in the Open PGP crypto refresh. package ed25519 import ( "crypto/subtle" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ed25519lib "github.com/cloudflare/circl/sign/ed25519" ) const ( // PublicKeySize is the size, in bytes, of public keys in this package. PublicKeySize = ed25519lib.PublicKeySize // SeedSize is the size, in bytes, of private key seeds. // The private key representation used by RFC 8032. SeedSize = ed25519lib.SeedSize // SignatureSize is the size, in bytes, of signatures generated and verified by this package. SignatureSize = ed25519lib.SignatureSize ) type PublicKey struct { // Point represents the elliptic curve point of the public key. Point []byte } type PrivateKey struct { PublicKey // Key the private key representation by RFC 8032, // encoded as seed | pub key point. Key []byte } // NewPublicKey creates a new empty ed25519 public key. func NewPublicKey() *PublicKey { return &PublicKey{} } // NewPrivateKey creates a new empty private key referencing the public key. func NewPrivateKey(key PublicKey) *PrivateKey { return &PrivateKey{ PublicKey: key, } } // Seed returns the ed25519 private key secret seed. // The private key representation by RFC 8032. func (pk *PrivateKey) Seed() []byte { return pk.Key[:SeedSize] } // MarshalByteSecret returns the underlying 32 byte seed of the private key. func (pk *PrivateKey) MarshalByteSecret() []byte { return pk.Seed() } // UnmarshalByteSecret computes the private key from the secret seed // and stores it in the private key object. func (sk *PrivateKey) UnmarshalByteSecret(seed []byte) error { sk.Key = ed25519lib.NewKeyFromSeed(seed) return nil } // GenerateKey generates a fresh private key with the provided randomness source. func GenerateKey(rand io.Reader) (*PrivateKey, error) { publicKey, privateKey, err := ed25519lib.GenerateKey(rand) if err != nil { return nil, err } privateKeyOut := new(PrivateKey) privateKeyOut.PublicKey.Point = publicKey[:] privateKeyOut.Key = privateKey[:] return privateKeyOut, nil } // Sign signs a message with the ed25519 algorithm. // priv MUST be a valid key! Check this with Validate() before use. func Sign(priv *PrivateKey, message []byte) ([]byte, error) { return ed25519lib.Sign(priv.Key, message), nil } // Verify verifies an ed25519 signature. func Verify(pub *PublicKey, message []byte, signature []byte) bool { return ed25519lib.Verify(pub.Point, message, signature) } // Validate checks if the ed25519 private key is valid. func Validate(priv *PrivateKey) error { expectedPrivateKey := ed25519lib.NewKeyFromSeed(priv.Seed()) if subtle.ConstantTimeCompare(priv.Key, expectedPrivateKey) == 0 { return errors.KeyInvalidError("ed25519: invalid ed25519 secret") } if subtle.ConstantTimeCompare(priv.PublicKey.Point, expectedPrivateKey[SeedSize:]) == 0 { return errors.KeyInvalidError("ed25519: invalid ed25519 public key") } return nil } // ENCODING/DECODING signature: // WriteSignature encodes and writes an ed25519 signature to writer. func WriteSignature(writer io.Writer, signature []byte) error { _, err := writer.Write(signature) return err } // ReadSignature decodes an ed25519 signature from a reader. func ReadSignature(reader io.Reader) ([]byte, error) { signature := make([]byte, SignatureSize) if _, err := io.ReadFull(reader, signature); err != nil { return nil, err } return signature, nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/ed448/ed448.go ================================================ // Package ed448 implements the ed448 signature algorithm for OpenPGP // as defined in the Open PGP crypto refresh. package ed448 import ( "crypto/subtle" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ed448lib "github.com/cloudflare/circl/sign/ed448" ) const ( // PublicKeySize is the size, in bytes, of public keys in this package. PublicKeySize = ed448lib.PublicKeySize // SeedSize is the size, in bytes, of private key seeds. // The private key representation used by RFC 8032. SeedSize = ed448lib.SeedSize // SignatureSize is the size, in bytes, of signatures generated and verified by this package. SignatureSize = ed448lib.SignatureSize ) type PublicKey struct { // Point represents the elliptic curve point of the public key. Point []byte } type PrivateKey struct { PublicKey // Key the private key representation by RFC 8032, // encoded as seed | public key point. Key []byte } // NewPublicKey creates a new empty ed448 public key. func NewPublicKey() *PublicKey { return &PublicKey{} } // NewPrivateKey creates a new empty private key referencing the public key. func NewPrivateKey(key PublicKey) *PrivateKey { return &PrivateKey{ PublicKey: key, } } // Seed returns the ed448 private key secret seed. // The private key representation by RFC 8032. func (pk *PrivateKey) Seed() []byte { return pk.Key[:SeedSize] } // MarshalByteSecret returns the underlying seed of the private key. func (pk *PrivateKey) MarshalByteSecret() []byte { return pk.Seed() } // UnmarshalByteSecret computes the private key from the secret seed // and stores it in the private key object. func (sk *PrivateKey) UnmarshalByteSecret(seed []byte) error { sk.Key = ed448lib.NewKeyFromSeed(seed) return nil } // GenerateKey generates a fresh private key with the provided randomness source. func GenerateKey(rand io.Reader) (*PrivateKey, error) { publicKey, privateKey, err := ed448lib.GenerateKey(rand) if err != nil { return nil, err } privateKeyOut := new(PrivateKey) privateKeyOut.PublicKey.Point = publicKey[:] privateKeyOut.Key = privateKey[:] return privateKeyOut, nil } // Sign signs a message with the ed448 algorithm. // priv MUST be a valid key! Check this with Validate() before use. func Sign(priv *PrivateKey, message []byte) ([]byte, error) { // Ed448 is used with the empty string as a context string. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-08#section-13.7 return ed448lib.Sign(priv.Key, message, ""), nil } // Verify verifies a ed448 signature func Verify(pub *PublicKey, message []byte, signature []byte) bool { // Ed448 is used with the empty string as a context string. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-08#section-13.7 return ed448lib.Verify(pub.Point, message, signature, "") } // Validate checks if the ed448 private key is valid func Validate(priv *PrivateKey) error { expectedPrivateKey := ed448lib.NewKeyFromSeed(priv.Seed()) if subtle.ConstantTimeCompare(priv.Key, expectedPrivateKey) == 0 { return errors.KeyInvalidError("ed448: invalid ed448 secret") } if subtle.ConstantTimeCompare(priv.PublicKey.Point, expectedPrivateKey[SeedSize:]) == 0 { return errors.KeyInvalidError("ed448: invalid ed448 public key") } return nil } // ENCODING/DECODING signature: // WriteSignature encodes and writes an ed448 signature to writer. func WriteSignature(writer io.Writer, signature []byte) error { _, err := writer.Write(signature) return err } // ReadSignature decodes an ed448 signature from a reader. func ReadSignature(reader io.Reader) ([]byte, error) { signature := make([]byte, SignatureSize) if _, err := io.ReadFull(reader, signature); err != nil { return nil, err } return signature, nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/eddsa/eddsa.go ================================================ // Package eddsa implements EdDSA signature, suitable for OpenPGP, as specified in // https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-13.7 package eddsa import ( "errors" "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" "io" ) type PublicKey struct { X []byte curve ecc.EdDSACurve } type PrivateKey struct { PublicKey D []byte } func NewPublicKey(curve ecc.EdDSACurve) *PublicKey { return &PublicKey{ curve: curve, } } func NewPrivateKey(key PublicKey) *PrivateKey { return &PrivateKey{ PublicKey: key, } } func (pk *PublicKey) GetCurve() ecc.EdDSACurve { return pk.curve } func (pk *PublicKey) MarshalPoint() []byte { return pk.curve.MarshalBytePoint(pk.X) } func (pk *PublicKey) UnmarshalPoint(x []byte) error { pk.X = pk.curve.UnmarshalBytePoint(x) if pk.X == nil { return errors.New("eddsa: failed to parse EC point") } return nil } func (sk *PrivateKey) MarshalByteSecret() []byte { return sk.curve.MarshalByteSecret(sk.D) } func (sk *PrivateKey) UnmarshalByteSecret(d []byte) error { sk.D = sk.curve.UnmarshalByteSecret(d) if sk.D == nil { return errors.New("eddsa: failed to parse scalar") } return nil } func GenerateKey(rand io.Reader, c ecc.EdDSACurve) (priv *PrivateKey, err error) { priv = new(PrivateKey) priv.PublicKey.curve = c priv.PublicKey.X, priv.D, err = c.GenerateEdDSA(rand) return } func Sign(priv *PrivateKey, message []byte) (r, s []byte, err error) { sig, err := priv.PublicKey.curve.Sign(priv.PublicKey.X, priv.D, message) if err != nil { return nil, nil, err } r, s = priv.PublicKey.curve.MarshalSignature(sig) return } func Verify(pub *PublicKey, message, r, s []byte) bool { sig := pub.curve.UnmarshalSignature(r, s) if sig == nil { return false } return pub.curve.Verify(pub.X, message, sig) } func Validate(priv *PrivateKey) error { return priv.curve.ValidateEdDSA(priv.PublicKey.X, priv.D) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package elgamal implements ElGamal encryption, suitable for OpenPGP, // as specified in "A Public-Key Cryptosystem and a Signature Scheme Based on // Discrete Logarithms," IEEE Transactions on Information Theory, v. IT-31, // n. 4, 1985, pp. 469-472. // // This form of ElGamal embeds PKCS#1 v1.5 padding, which may make it // unsuitable for other protocols. RSA should be used in preference in any // case. package elgamal // import "github.com/ProtonMail/go-crypto/openpgp/elgamal" import ( "crypto/rand" "crypto/subtle" "errors" "io" "math/big" ) // PublicKey represents an ElGamal public key. type PublicKey struct { G, P, Y *big.Int } // PrivateKey represents an ElGamal private key. type PrivateKey struct { PublicKey X *big.Int } // Encrypt encrypts the given message to the given public key. The result is a // pair of integers. Errors can result from reading random, or because msg is // too large to be encrypted to the public key. func Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err error) { pLen := (pub.P.BitLen() + 7) / 8 if len(msg) > pLen-11 { err = errors.New("elgamal: message too long") return } // EM = 0x02 || PS || 0x00 || M em := make([]byte, pLen-1) em[0] = 2 ps, mm := em[1:len(em)-len(msg)-1], em[len(em)-len(msg):] err = nonZeroRandomBytes(ps, random) if err != nil { return } em[len(em)-len(msg)-1] = 0 copy(mm, msg) m := new(big.Int).SetBytes(em) k, err := rand.Int(random, pub.P) if err != nil { return } c1 = new(big.Int).Exp(pub.G, k, pub.P) s := new(big.Int).Exp(pub.Y, k, pub.P) c2 = s.Mul(s, m) c2.Mod(c2, pub.P) return } // Decrypt takes two integers, resulting from an ElGamal encryption, and // returns the plaintext of the message. An error can result only if the // ciphertext is invalid. Users should keep in mind that this is a padding // oracle and thus, if exposed to an adaptive chosen ciphertext attack, can // be used to break the cryptosystem. See “Chosen Ciphertext Attacks // Against Protocols Based on the RSA Encryption Standard PKCS #1”, Daniel // Bleichenbacher, Advances in Cryptology (Crypto '98), func Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) { s := new(big.Int).Exp(c1, priv.X, priv.P) if s.ModInverse(s, priv.P) == nil { return nil, errors.New("elgamal: invalid private key") } s.Mul(s, c2) s.Mod(s, priv.P) em := s.Bytes() firstByteIsTwo := subtle.ConstantTimeByteEq(em[0], 2) // The remainder of the plaintext must be a string of non-zero random // octets, followed by a 0, followed by the message. // lookingForIndex: 1 iff we are still looking for the zero. // index: the offset of the first zero byte. var lookingForIndex, index int lookingForIndex = 1 for i := 1; i < len(em); i++ { equals0 := subtle.ConstantTimeByteEq(em[i], 0) index = subtle.ConstantTimeSelect(lookingForIndex&equals0, i, index) lookingForIndex = subtle.ConstantTimeSelect(equals0, 0, lookingForIndex) } if firstByteIsTwo != 1 || lookingForIndex != 0 || index < 9 { return nil, errors.New("elgamal: decryption error") } return em[index+1:], nil } // nonZeroRandomBytes fills the given slice with non-zero random octets. func nonZeroRandomBytes(s []byte, rand io.Reader) (err error) { _, err = io.ReadFull(rand, s) if err != nil { return } for i := 0; i < len(s); i++ { for s[i] == 0 { _, err = io.ReadFull(rand, s[i:i+1]) if err != nil { return } } } return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/errors/errors.go ================================================ // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package errors contains common error types for the OpenPGP packages. package errors // import "github.com/ProtonMail/go-crypto/openpgp/errors" import ( "fmt" "strconv" ) var ( // ErrDecryptSessionKeyParsing is a generic error message for parsing errors in decrypted data // to reduce the risk of oracle attacks. ErrDecryptSessionKeyParsing = DecryptWithSessionKeyError("parsing error") // ErrAEADTagVerification is returned if one of the tag verifications in SEIPDv2 fails ErrAEADTagVerification error = DecryptWithSessionKeyError("AEAD tag verification failed") // ErrMDCHashMismatch ErrMDCHashMismatch error = SignatureError("MDC hash mismatch") // ErrMDCMissing ErrMDCMissing error = SignatureError("MDC packet not found") ) // A StructuralError is returned when OpenPGP data is found to be syntactically // invalid. type StructuralError string func (s StructuralError) Error() string { return "openpgp: invalid data: " + string(s) } // A DecryptWithSessionKeyError is returned when a failure occurs when reading from symmetrically decrypted data or // an authentication tag verification fails. // Such an error indicates that the supplied session key is likely wrong or the data got corrupted. type DecryptWithSessionKeyError string func (s DecryptWithSessionKeyError) Error() string { return "openpgp: decryption with session key failed: " + string(s) } // HandleSensitiveParsingError handles parsing errors when reading data from potentially decrypted data. // The function makes parsing errors generic to reduce the risk of oracle attacks in SEIPDv1. func HandleSensitiveParsingError(err error, decrypted bool) error { if !decrypted { // Data was not encrypted so we return the inner error. return err } // The data is read from a stream that decrypts using a session key; // therefore, we need to handle parsing errors appropriately. // This is essential to mitigate the risk of oracle attacks. if decError, ok := err.(*DecryptWithSessionKeyError); ok { return decError } if decError, ok := err.(DecryptWithSessionKeyError); ok { return decError } return ErrDecryptSessionKeyParsing } // UnsupportedError indicates that, although the OpenPGP data is valid, it // makes use of currently unimplemented features. type UnsupportedError string func (s UnsupportedError) Error() string { return "openpgp: unsupported feature: " + string(s) } // InvalidArgumentError indicates that the caller is in error and passed an // incorrect value. type InvalidArgumentError string func (i InvalidArgumentError) Error() string { return "openpgp: invalid argument: " + string(i) } // SignatureError indicates that a syntactically valid signature failed to // validate. type SignatureError string func (b SignatureError) Error() string { return "openpgp: invalid signature: " + string(b) } type signatureExpiredError int func (se signatureExpiredError) Error() string { return "openpgp: signature expired" } var ErrSignatureExpired error = signatureExpiredError(0) type keyExpiredError int func (ke keyExpiredError) Error() string { return "openpgp: key expired" } var ErrSignatureOlderThanKey error = signatureOlderThanKeyError(0) type signatureOlderThanKeyError int func (ske signatureOlderThanKeyError) Error() string { return "openpgp: signature is older than the key" } var ErrKeyExpired error = keyExpiredError(0) type keyIncorrectError int func (ki keyIncorrectError) Error() string { return "openpgp: incorrect key" } var ErrKeyIncorrect error = keyIncorrectError(0) // KeyInvalidError indicates that the public key parameters are invalid // as they do not match the private ones type KeyInvalidError string func (e KeyInvalidError) Error() string { return "openpgp: invalid key: " + string(e) } type unknownIssuerError int func (unknownIssuerError) Error() string { return "openpgp: signature made by unknown entity" } var ErrUnknownIssuer error = unknownIssuerError(0) type keyRevokedError int func (keyRevokedError) Error() string { return "openpgp: signature made by revoked key" } var ErrKeyRevoked error = keyRevokedError(0) type WeakAlgorithmError string func (e WeakAlgorithmError) Error() string { return "openpgp: weak algorithms are rejected: " + string(e) } type UnknownPacketTypeError uint8 func (upte UnknownPacketTypeError) Error() string { return "openpgp: unknown packet type: " + strconv.Itoa(int(upte)) } type CriticalUnknownPacketTypeError uint8 func (upte CriticalUnknownPacketTypeError) Error() string { return "openpgp: unknown critical packet type: " + strconv.Itoa(int(upte)) } // AEADError indicates that there is a problem when initializing or using a // AEAD instance, configuration struct, nonces or index values. type AEADError string func (ae AEADError) Error() string { return "openpgp: aead error: " + string(ae) } // ErrDummyPrivateKey results when operations are attempted on a private key // that is just a dummy key. See // https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=doc/DETAILS;h=fe55ae16ab4e26d8356dc574c9e8bc935e71aef1;hb=23191d7851eae2217ecdac6484349849a24fd94a#l1109 type ErrDummyPrivateKey string func (dke ErrDummyPrivateKey) Error() string { return "openpgp: s2k GNU dummy key: " + string(dke) } // ErrMalformedMessage results when the packet sequence is incorrect type ErrMalformedMessage string func (dke ErrMalformedMessage) Error() string { return "openpgp: malformed message " + string(dke) } // ErrEncryptionKeySelection is returned if encryption key selection fails (v2 API). type ErrEncryptionKeySelection struct { PrimaryKeyId string PrimaryKeyErr error EncSelectionKeyId *string EncSelectionErr error } func (eks ErrEncryptionKeySelection) Error() string { prefix := fmt.Sprintf("openpgp: key selection for primary key %s:", eks.PrimaryKeyId) if eks.PrimaryKeyErr != nil { return fmt.Sprintf("%s invalid primary key: %s", prefix, eks.PrimaryKeyErr) } if eks.EncSelectionKeyId != nil { return fmt.Sprintf("%s invalid encryption key %s: %s", prefix, *eks.EncSelectionKeyId, eks.EncSelectionErr) } return fmt.Sprintf("%s no encryption key: %s", prefix, eks.EncSelectionErr) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/hash.go ================================================ package openpgp import ( "crypto" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" ) // HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP // hash id. func HashIdToHash(id byte) (h crypto.Hash, ok bool) { return algorithm.HashIdToHash(id) } // HashIdToString returns the name of the hash function corresponding to the // given OpenPGP hash id. func HashIdToString(id byte) (name string, ok bool) { return algorithm.HashIdToString(id) } // HashToHashId returns an OpenPGP hash id which corresponds the given Hash. func HashToHashId(h crypto.Hash) (id byte, ok bool) { return algorithm.HashToHashId(h) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go ================================================ // Copyright (C) 2019 ProtonTech AG package algorithm import ( "crypto/cipher" "github.com/ProtonMail/go-crypto/eax" "github.com/ProtonMail/go-crypto/ocb" ) // AEADMode defines the Authenticated Encryption with Associated Data mode of // operation. type AEADMode uint8 // Supported modes of operation (see RFC4880bis [EAX] and RFC7253) const ( AEADModeEAX = AEADMode(1) AEADModeOCB = AEADMode(2) AEADModeGCM = AEADMode(3) ) // TagLength returns the length in bytes of authentication tags. func (mode AEADMode) TagLength() int { switch mode { case AEADModeEAX: return 16 case AEADModeOCB: return 16 case AEADModeGCM: return 16 default: return 0 } } // NonceLength returns the length in bytes of nonces. func (mode AEADMode) NonceLength() int { switch mode { case AEADModeEAX: return 16 case AEADModeOCB: return 15 case AEADModeGCM: return 12 default: return 0 } } // New returns a fresh instance of the given mode func (mode AEADMode) New(block cipher.Block) (alg cipher.AEAD) { var err error switch mode { case AEADModeEAX: alg, err = eax.NewEAX(block) case AEADModeOCB: alg, err = ocb.NewOCB(block) case AEADModeGCM: alg, err = cipher.NewGCM(block) } if err != nil { panic(err.Error()) } return alg } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/cipher.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package algorithm import ( "crypto/aes" "crypto/cipher" "crypto/des" "golang.org/x/crypto/cast5" ) // Cipher is an official symmetric key cipher algorithm. See RFC 4880, // section 9.2. type Cipher interface { // Id returns the algorithm ID, as a byte, of the cipher. Id() uint8 // KeySize returns the key size, in bytes, of the cipher. KeySize() int // BlockSize returns the block size, in bytes, of the cipher. BlockSize() int // New returns a fresh instance of the given cipher. New(key []byte) cipher.Block } // The following constants mirror the OpenPGP standard (RFC 4880). const ( TripleDES = CipherFunction(2) CAST5 = CipherFunction(3) AES128 = CipherFunction(7) AES192 = CipherFunction(8) AES256 = CipherFunction(9) ) // CipherById represents the different block ciphers specified for OpenPGP. See // http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13 var CipherById = map[uint8]Cipher{ TripleDES.Id(): TripleDES, CAST5.Id(): CAST5, AES128.Id(): AES128, AES192.Id(): AES192, AES256.Id(): AES256, } type CipherFunction uint8 // ID returns the algorithm Id, as a byte, of cipher. func (sk CipherFunction) Id() uint8 { return uint8(sk) } // KeySize returns the key size, in bytes, of cipher. func (cipher CipherFunction) KeySize() int { switch cipher { case CAST5: return cast5.KeySize case AES128: return 16 case AES192, TripleDES: return 24 case AES256: return 32 } return 0 } // BlockSize returns the block size, in bytes, of cipher. func (cipher CipherFunction) BlockSize() int { switch cipher { case TripleDES: return des.BlockSize case CAST5: return 8 case AES128, AES192, AES256: return 16 } return 0 } // New returns a fresh instance of the given cipher. func (cipher CipherFunction) New(key []byte) (block cipher.Block) { var err error switch cipher { case TripleDES: block, err = des.NewTripleDESCipher(key) case CAST5: block, err = cast5.NewCipher(key) case AES128, AES192, AES256: block, err = aes.NewCipher(key) } if err != nil { panic(err.Error()) } return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package algorithm import ( "crypto" "fmt" "hash" ) // Hash is an official hash function algorithm. See RFC 4880, section 9.4. type Hash interface { // Id returns the algorithm ID, as a byte, of Hash. Id() uint8 // Available reports whether the given hash function is linked into the binary. Available() bool // HashFunc simply returns the value of h so that Hash implements SignerOpts. HashFunc() crypto.Hash // New returns a new hash.Hash calculating the given hash function. New // panics if the hash function is not linked into the binary. New() hash.Hash // Size returns the length, in bytes, of a digest resulting from the given // hash function. It doesn't require that the hash function in question be // linked into the program. Size() int // String is the name of the hash function corresponding to the given // OpenPGP hash id. String() string } // The following vars mirror the crypto/Hash supported hash functions. var ( SHA1 Hash = cryptoHash{2, crypto.SHA1} SHA256 Hash = cryptoHash{8, crypto.SHA256} SHA384 Hash = cryptoHash{9, crypto.SHA384} SHA512 Hash = cryptoHash{10, crypto.SHA512} SHA224 Hash = cryptoHash{11, crypto.SHA224} SHA3_256 Hash = cryptoHash{12, crypto.SHA3_256} SHA3_512 Hash = cryptoHash{14, crypto.SHA3_512} ) // HashById represents the different hash functions specified for OpenPGP. See // http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-14 var ( HashById = map[uint8]Hash{ SHA256.Id(): SHA256, SHA384.Id(): SHA384, SHA512.Id(): SHA512, SHA224.Id(): SHA224, SHA3_256.Id(): SHA3_256, SHA3_512.Id(): SHA3_512, } ) // cryptoHash contains pairs relating OpenPGP's hash identifier with // Go's crypto.Hash type. See RFC 4880, section 9.4. type cryptoHash struct { id uint8 crypto.Hash } // Id returns the algorithm ID, as a byte, of cryptoHash. func (h cryptoHash) Id() uint8 { return h.id } var hashNames = map[uint8]string{ SHA256.Id(): "SHA256", SHA384.Id(): "SHA384", SHA512.Id(): "SHA512", SHA224.Id(): "SHA224", SHA3_256.Id(): "SHA3-256", SHA3_512.Id(): "SHA3-512", } func (h cryptoHash) String() string { s, ok := hashNames[h.id] if !ok { panic(fmt.Sprintf("Unsupported hash function %d", h.id)) } return s } // HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP // hash id. func HashIdToHash(id byte) (h crypto.Hash, ok bool) { if hash, ok := HashById[id]; ok { return hash.HashFunc(), true } return 0, false } // HashIdToHashWithSha1 returns a crypto.Hash which corresponds to the given OpenPGP // hash id, allowing sha1. func HashIdToHashWithSha1(id byte) (h crypto.Hash, ok bool) { if hash, ok := HashById[id]; ok { return hash.HashFunc(), true } if id == SHA1.Id() { return SHA1.HashFunc(), true } return 0, false } // HashIdToString returns the name of the hash function corresponding to the // given OpenPGP hash id. func HashIdToString(id byte) (name string, ok bool) { if hash, ok := HashById[id]; ok { return hash.String(), true } return "", false } // HashToHashId returns an OpenPGP hash id which corresponds the given Hash. func HashToHashId(h crypto.Hash) (id byte, ok bool) { for id, hash := range HashById { if hash.HashFunc() == h { return id, true } } return 0, false } // HashToHashIdWithSha1 returns an OpenPGP hash id which corresponds the given Hash, // allowing instances of SHA1 func HashToHashIdWithSha1(h crypto.Hash) (id byte, ok bool) { for id, hash := range HashById { if hash.HashFunc() == h { return id, true } } if h == SHA1.HashFunc() { return SHA1.Id(), true } return 0, false } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.go ================================================ // Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA. package ecc import ( "crypto/subtle" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" x25519lib "github.com/cloudflare/circl/dh/x25519" ) type curve25519 struct{} func NewCurve25519() *curve25519 { return &curve25519{} } func (c *curve25519) GetCurveName() string { return "curve25519" } // MarshalBytePoint encodes the public point from native format, adding the prefix. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6 func (c *curve25519) MarshalBytePoint(point []byte) []byte { return append([]byte{0x40}, point...) } // UnmarshalBytePoint decodes the public point to native format, removing the prefix. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6 func (c *curve25519) UnmarshalBytePoint(point []byte) []byte { if len(point) != x25519lib.Size+1 { return nil } // Remove prefix return point[1:] } // MarshalByteSecret encodes the secret scalar from native format. // Note that the EC secret scalar differs from the definition of public keys in // [Curve25519] in two ways: (1) the byte-ordering is big-endian, which is // more uniform with how big integers are represented in OpenPGP, and (2) the // leading zeros are truncated. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.1 // Note that leading zero bytes are stripped later when encoding as an MPI. func (c *curve25519) MarshalByteSecret(secret []byte) []byte { d := make([]byte, x25519lib.Size) copyReversed(d, secret) // The following ensures that the private key is a number of the form // 2^{254} + 8 * [0, 2^{251}), in order to avoid the small subgroup of // the curve. // // This masking is done internally in the underlying lib and so is unnecessary // for security, but OpenPGP implementations require that private keys be // pre-masked. d[0] &= 127 d[0] |= 64 d[31] &= 248 return d } // UnmarshalByteSecret decodes the secret scalar from native format. // Note that the EC secret scalar differs from the definition of public keys in // [Curve25519] in two ways: (1) the byte-ordering is big-endian, which is // more uniform with how big integers are represented in OpenPGP, and (2) the // leading zeros are truncated. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.1 func (c *curve25519) UnmarshalByteSecret(d []byte) []byte { if len(d) > x25519lib.Size { return nil } // Ensure truncated leading bytes are re-added secret := make([]byte, x25519lib.Size) copyReversed(secret, d) return secret } // generateKeyPairBytes Generates a private-public key-pair. // 'priv' is a private key; a little-endian scalar belonging to the set // 2^{254} + 8 * [0, 2^{251}), in order to avoid the small subgroup of the // curve. 'pub' is simply 'priv' * G where G is the base point. // See https://cr.yp.to/ecdh.html and RFC7748, sec 5. func (c *curve25519) generateKeyPairBytes(rand io.Reader) (priv, pub x25519lib.Key, err error) { _, err = io.ReadFull(rand, priv[:]) if err != nil { return } x25519lib.KeyGen(&pub, &priv) return } func (c *curve25519) GenerateECDH(rand io.Reader) (point []byte, secret []byte, err error) { priv, pub, err := c.generateKeyPairBytes(rand) if err != nil { return } return pub[:], priv[:], nil } func (c *genericCurve) MaskSecret(secret []byte) []byte { return secret } func (c *curve25519) Encaps(rand io.Reader, point []byte) (ephemeral, sharedSecret []byte, err error) { // RFC6637 §8: "Generate an ephemeral key pair {v, V=vG}" // ephemeralPrivate corresponds to `v`. // ephemeralPublic corresponds to `V`. ephemeralPrivate, ephemeralPublic, err := c.generateKeyPairBytes(rand) if err != nil { return nil, nil, err } // RFC6637 §8: "Obtain the authenticated recipient public key R" // pubKey corresponds to `R`. var pubKey x25519lib.Key copy(pubKey[:], point) // RFC6637 §8: "Compute the shared point S = vR" // "VB = convert point V to the octet string" // sharedPoint corresponds to `VB`. var sharedPoint x25519lib.Key x25519lib.Shared(&sharedPoint, &ephemeralPrivate, &pubKey) return ephemeralPublic[:], sharedPoint[:], nil } func (c *curve25519) Decaps(vsG, secret []byte) (sharedSecret []byte, err error) { var ephemeralPublic, decodedPrivate, sharedPoint x25519lib.Key // RFC6637 §8: "The decryption is the inverse of the method given." // All quoted descriptions in comments below describe encryption, and // the reverse is performed. // vsG corresponds to `VB` in RFC6637 §8 . // RFC6637 §8: "VB = convert point V to the octet string" copy(ephemeralPublic[:], vsG) // decodedPrivate corresponds to `r` in RFC6637 §8 . copy(decodedPrivate[:], secret) // RFC6637 §8: "Note that the recipient obtains the shared secret by calculating // S = rV = rvG, where (r,R) is the recipient's key pair." // sharedPoint corresponds to `S`. x25519lib.Shared(&sharedPoint, &decodedPrivate, &ephemeralPublic) return sharedPoint[:], nil } func (c *curve25519) ValidateECDH(point []byte, secret []byte) (err error) { var pk, sk x25519lib.Key copy(sk[:], secret) x25519lib.KeyGen(&pk, &sk) if subtle.ConstantTimeCompare(point, pk[:]) == 0 { return errors.KeyInvalidError("ecc: invalid curve25519 public point") } return nil } func copyReversed(out []byte, in []byte) { l := len(in) for i := 0; i < l; i++ { out[i] = in[l-i-1] } } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve_info.go ================================================ // Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA. package ecc import ( "bytes" "crypto/elliptic" "github.com/ProtonMail/go-crypto/bitcurves" "github.com/ProtonMail/go-crypto/brainpool" "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" ) const Curve25519GenName = "Curve25519" type CurveInfo struct { GenName string Oid *encoding.OID Curve Curve } var Curves = []CurveInfo{ { // NIST P-256 GenName: "P256", Oid: encoding.NewOID([]byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}), Curve: NewGenericCurve(elliptic.P256()), }, { // NIST P-384 GenName: "P384", Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x22}), Curve: NewGenericCurve(elliptic.P384()), }, { // NIST P-521 GenName: "P521", Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x23}), Curve: NewGenericCurve(elliptic.P521()), }, { // SecP256k1 GenName: "SecP256k1", Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x0A}), Curve: NewGenericCurve(bitcurves.S256()), }, { // Curve25519 GenName: Curve25519GenName, Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01}), Curve: NewCurve25519(), }, { // x448 GenName: "Curve448", Oid: encoding.NewOID([]byte{0x2B, 0x65, 0x6F}), Curve: NewX448(), }, { // Ed25519 GenName: Curve25519GenName, Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01}), Curve: NewEd25519(), }, { // Ed448 GenName: "Curve448", Oid: encoding.NewOID([]byte{0x2B, 0x65, 0x71}), Curve: NewEd448(), }, { // BrainpoolP256r1 GenName: "BrainpoolP256", Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07}), Curve: NewGenericCurve(brainpool.P256r1()), }, { // BrainpoolP384r1 GenName: "BrainpoolP384", Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B}), Curve: NewGenericCurve(brainpool.P384r1()), }, { // BrainpoolP512r1 GenName: "BrainpoolP512", Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D}), Curve: NewGenericCurve(brainpool.P512r1()), }, } func FindByCurve(curve Curve) *CurveInfo { for _, curveInfo := range Curves { if curveInfo.Curve.GetCurveName() == curve.GetCurveName() { return &curveInfo } } return nil } func FindByOid(oid encoding.Field) *CurveInfo { var rawBytes = oid.Bytes() for _, curveInfo := range Curves { if bytes.Equal(curveInfo.Oid.Bytes(), rawBytes) { return &curveInfo } } return nil } func FindEdDSAByGenName(curveGenName string) EdDSACurve { for _, curveInfo := range Curves { if curveInfo.GenName == curveGenName { curve, ok := curveInfo.Curve.(EdDSACurve) if ok { return curve } } } return nil } func FindECDSAByGenName(curveGenName string) ECDSACurve { for _, curveInfo := range Curves { if curveInfo.GenName == curveGenName { curve, ok := curveInfo.Curve.(ECDSACurve) if ok { return curve } } } return nil } func FindECDHByGenName(curveGenName string) ECDHCurve { for _, curveInfo := range Curves { if curveInfo.GenName == curveGenName { curve, ok := curveInfo.Curve.(ECDHCurve) if ok { return curve } } } return nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curves.go ================================================ // Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA. package ecc import ( "io" "math/big" ) type Curve interface { GetCurveName() string } type ECDSACurve interface { Curve MarshalIntegerPoint(x, y *big.Int) []byte UnmarshalIntegerPoint([]byte) (x, y *big.Int) MarshalIntegerSecret(d *big.Int) []byte UnmarshalIntegerSecret(d []byte) *big.Int GenerateECDSA(rand io.Reader) (x, y, secret *big.Int, err error) Sign(rand io.Reader, x, y, d *big.Int, hash []byte) (r, s *big.Int, err error) Verify(x, y *big.Int, hash []byte, r, s *big.Int) bool ValidateECDSA(x, y *big.Int, secret []byte) error } type EdDSACurve interface { Curve MarshalBytePoint(x []byte) []byte UnmarshalBytePoint([]byte) (x []byte) MarshalByteSecret(d []byte) []byte UnmarshalByteSecret(d []byte) []byte MarshalSignature(sig []byte) (r, s []byte) UnmarshalSignature(r, s []byte) (sig []byte) GenerateEdDSA(rand io.Reader) (pub, priv []byte, err error) Sign(publicKey, privateKey, message []byte) (sig []byte, err error) Verify(publicKey, message, sig []byte) bool ValidateEdDSA(publicKey, privateKey []byte) (err error) } type ECDHCurve interface { Curve MarshalBytePoint([]byte) (encoded []byte) UnmarshalBytePoint(encoded []byte) []byte MarshalByteSecret(d []byte) []byte UnmarshalByteSecret(d []byte) []byte GenerateECDH(rand io.Reader) (point []byte, secret []byte, err error) Encaps(rand io.Reader, point []byte) (ephemeral, sharedSecret []byte, err error) Decaps(ephemeral, secret []byte) (sharedSecret []byte, err error) ValidateECDH(public []byte, secret []byte) error } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed25519.go ================================================ // Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA. package ecc import ( "bytes" "crypto/subtle" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ed25519lib "github.com/cloudflare/circl/sign/ed25519" ) const ed25519Size = 32 type ed25519 struct{} func NewEd25519() *ed25519 { return &ed25519{} } func (c *ed25519) GetCurveName() string { return "ed25519" } // MarshalBytePoint encodes the public point from native format, adding the prefix. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed25519) MarshalBytePoint(x []byte) []byte { return append([]byte{0x40}, x...) } // UnmarshalBytePoint decodes a point from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed25519) UnmarshalBytePoint(point []byte) (x []byte) { if len(point) != ed25519lib.PublicKeySize+1 { return nil } // Return unprefixed return point[1:] } // MarshalByteSecret encodes a scalar in native format. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed25519) MarshalByteSecret(d []byte) []byte { return d } // UnmarshalByteSecret decodes a scalar in native format and re-adds the stripped leading zeroes // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed25519) UnmarshalByteSecret(s []byte) (d []byte) { if len(s) > ed25519lib.SeedSize { return nil } // Handle stripped leading zeroes d = make([]byte, ed25519lib.SeedSize) copy(d[ed25519lib.SeedSize-len(s):], s) return } // MarshalSignature splits a signature in R and S. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.1 func (c *ed25519) MarshalSignature(sig []byte) (r, s []byte) { return sig[:ed25519Size], sig[ed25519Size:] } // UnmarshalSignature decodes R and S in the native format, re-adding the stripped leading zeroes // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.1 func (c *ed25519) UnmarshalSignature(r, s []byte) (sig []byte) { // Check size if len(r) > 32 || len(s) > 32 { return nil } sig = make([]byte, ed25519lib.SignatureSize) // Handle stripped leading zeroes copy(sig[ed25519Size-len(r):ed25519Size], r) copy(sig[ed25519lib.SignatureSize-len(s):], s) return sig } func (c *ed25519) GenerateEdDSA(rand io.Reader) (pub, priv []byte, err error) { pk, sk, err := ed25519lib.GenerateKey(rand) if err != nil { return nil, nil, err } return pk, sk[:ed25519lib.SeedSize], nil } func getEd25519Sk(publicKey, privateKey []byte) ed25519lib.PrivateKey { privateKeyCap, privateKeyLen, publicKeyLen := cap(privateKey), len(privateKey), len(publicKey) if privateKeyCap >= privateKeyLen+publicKeyLen && bytes.Equal(privateKey[privateKeyLen:privateKeyLen+publicKeyLen], publicKey) { return privateKey[:privateKeyLen+publicKeyLen] } return append(privateKey[:privateKeyLen:privateKeyLen], publicKey...) } func (c *ed25519) Sign(publicKey, privateKey, message []byte) (sig []byte, err error) { sig = ed25519lib.Sign(getEd25519Sk(publicKey, privateKey), message) return sig, nil } func (c *ed25519) Verify(publicKey, message, sig []byte) bool { return ed25519lib.Verify(publicKey, message, sig) } func (c *ed25519) ValidateEdDSA(publicKey, privateKey []byte) (err error) { priv := getEd25519Sk(publicKey, privateKey) expectedPriv := ed25519lib.NewKeyFromSeed(priv.Seed()) if subtle.ConstantTimeCompare(priv, expectedPriv) == 0 { return errors.KeyInvalidError("ecc: invalid ed25519 secret") } return nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed448.go ================================================ // Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA. package ecc import ( "bytes" "crypto/subtle" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ed448lib "github.com/cloudflare/circl/sign/ed448" ) type ed448 struct{} func NewEd448() *ed448 { return &ed448{} } func (c *ed448) GetCurveName() string { return "ed448" } // MarshalBytePoint encodes the public point from native format, adding the prefix. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed448) MarshalBytePoint(x []byte) []byte { // Return prefixed return append([]byte{0x40}, x...) } // UnmarshalBytePoint decodes a point from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed448) UnmarshalBytePoint(point []byte) (x []byte) { if len(point) != ed448lib.PublicKeySize+1 { return nil } // Strip prefix return point[1:] } // MarshalByteSecret encoded a scalar from native format to prefixed. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed448) MarshalByteSecret(d []byte) []byte { // Return prefixed return append([]byte{0x40}, d...) } // UnmarshalByteSecret decodes a scalar from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.5 func (c *ed448) UnmarshalByteSecret(s []byte) (d []byte) { // Check prefixed size if len(s) != ed448lib.SeedSize+1 { return nil } // Strip prefix return s[1:] } // MarshalSignature splits a signature in R and S, where R is in prefixed native format and // S is an MPI with value zero. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.2 func (c *ed448) MarshalSignature(sig []byte) (r, s []byte) { return append([]byte{0x40}, sig...), []byte{} } // UnmarshalSignature decodes R and S in the native format. Only R is used, in prefixed native format. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.2.3.3.2 func (c *ed448) UnmarshalSignature(r, s []byte) (sig []byte) { if len(r) != ed448lib.SignatureSize+1 { return nil } return r[1:] } func (c *ed448) GenerateEdDSA(rand io.Reader) (pub, priv []byte, err error) { pk, sk, err := ed448lib.GenerateKey(rand) if err != nil { return nil, nil, err } return pk, sk[:ed448lib.SeedSize], nil } func getEd448Sk(publicKey, privateKey []byte) ed448lib.PrivateKey { privateKeyCap, privateKeyLen, publicKeyLen := cap(privateKey), len(privateKey), len(publicKey) if privateKeyCap >= privateKeyLen+publicKeyLen && bytes.Equal(privateKey[privateKeyLen:privateKeyLen+publicKeyLen], publicKey) { return privateKey[:privateKeyLen+publicKeyLen] } return append(privateKey[:privateKeyLen:privateKeyLen], publicKey...) } func (c *ed448) Sign(publicKey, privateKey, message []byte) (sig []byte, err error) { // Ed448 is used with the empty string as a context string. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-13.7 sig = ed448lib.Sign(getEd448Sk(publicKey, privateKey), message, "") return sig, nil } func (c *ed448) Verify(publicKey, message, sig []byte) bool { // Ed448 is used with the empty string as a context string. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-13.7 return ed448lib.Verify(publicKey, message, sig, "") } func (c *ed448) ValidateEdDSA(publicKey, privateKey []byte) (err error) { priv := getEd448Sk(publicKey, privateKey) expectedPriv := ed448lib.NewKeyFromSeed(priv.Seed()) if subtle.ConstantTimeCompare(priv, expectedPriv) == 0 { return errors.KeyInvalidError("ecc: invalid ed448 secret") } return nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/generic.go ================================================ // Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA. package ecc import ( "crypto/ecdsa" "crypto/elliptic" "fmt" "github.com/ProtonMail/go-crypto/openpgp/errors" "io" "math/big" ) type genericCurve struct { Curve elliptic.Curve } func NewGenericCurve(c elliptic.Curve) *genericCurve { return &genericCurve{ Curve: c, } } func (c *genericCurve) GetCurveName() string { return c.Curve.Params().Name } func (c *genericCurve) MarshalBytePoint(point []byte) []byte { return point } func (c *genericCurve) UnmarshalBytePoint(point []byte) []byte { return point } func (c *genericCurve) MarshalIntegerPoint(x, y *big.Int) []byte { return elliptic.Marshal(c.Curve, x, y) } func (c *genericCurve) UnmarshalIntegerPoint(point []byte) (x, y *big.Int) { return elliptic.Unmarshal(c.Curve, point) } func (c *genericCurve) MarshalByteSecret(d []byte) []byte { return d } func (c *genericCurve) UnmarshalByteSecret(d []byte) []byte { return d } func (c *genericCurve) MarshalIntegerSecret(d *big.Int) []byte { return d.Bytes() } func (c *genericCurve) UnmarshalIntegerSecret(d []byte) *big.Int { return new(big.Int).SetBytes(d) } func (c *genericCurve) GenerateECDH(rand io.Reader) (point, secret []byte, err error) { secret, x, y, err := elliptic.GenerateKey(c.Curve, rand) if err != nil { return nil, nil, err } point = elliptic.Marshal(c.Curve, x, y) return point, secret, nil } func (c *genericCurve) GenerateECDSA(rand io.Reader) (x, y, secret *big.Int, err error) { priv, err := ecdsa.GenerateKey(c.Curve, rand) if err != nil { return } return priv.X, priv.Y, priv.D, nil } func (c *genericCurve) Encaps(rand io.Reader, point []byte) (ephemeral, sharedSecret []byte, err error) { xP, yP := elliptic.Unmarshal(c.Curve, point) if xP == nil { panic("invalid point") } d, x, y, err := elliptic.GenerateKey(c.Curve, rand) if err != nil { return nil, nil, err } vsG := elliptic.Marshal(c.Curve, x, y) zbBig, _ := c.Curve.ScalarMult(xP, yP, d) byteLen := (c.Curve.Params().BitSize + 7) >> 3 zb := make([]byte, byteLen) zbBytes := zbBig.Bytes() copy(zb[byteLen-len(zbBytes):], zbBytes) return vsG, zb, nil } func (c *genericCurve) Decaps(ephemeral, secret []byte) (sharedSecret []byte, err error) { x, y := elliptic.Unmarshal(c.Curve, ephemeral) zbBig, _ := c.Curve.ScalarMult(x, y, secret) byteLen := (c.Curve.Params().BitSize + 7) >> 3 zb := make([]byte, byteLen) zbBytes := zbBig.Bytes() copy(zb[byteLen-len(zbBytes):], zbBytes) return zb, nil } func (c *genericCurve) Sign(rand io.Reader, x, y, d *big.Int, hash []byte) (r, s *big.Int, err error) { priv := &ecdsa.PrivateKey{D: d, PublicKey: ecdsa.PublicKey{X: x, Y: y, Curve: c.Curve}} return ecdsa.Sign(rand, priv, hash) } func (c *genericCurve) Verify(x, y *big.Int, hash []byte, r, s *big.Int) bool { pub := &ecdsa.PublicKey{X: x, Y: y, Curve: c.Curve} return ecdsa.Verify(pub, hash, r, s) } func (c *genericCurve) validate(xP, yP *big.Int, secret []byte) error { // the public point should not be at infinity (0,0) zero := new(big.Int) if xP.Cmp(zero) == 0 && yP.Cmp(zero) == 0 { return errors.KeyInvalidError(fmt.Sprintf("ecc (%s): infinity point", c.Curve.Params().Name)) } // re-derive the public point Q' = (X,Y) = dG // to compare to declared Q in public key expectedX, expectedY := c.Curve.ScalarBaseMult(secret) if xP.Cmp(expectedX) != 0 || yP.Cmp(expectedY) != 0 { return errors.KeyInvalidError(fmt.Sprintf("ecc (%s): invalid point", c.Curve.Params().Name)) } return nil } func (c *genericCurve) ValidateECDSA(xP, yP *big.Int, secret []byte) error { return c.validate(xP, yP, secret) } func (c *genericCurve) ValidateECDH(point []byte, secret []byte) error { xP, yP := elliptic.Unmarshal(c.Curve, point) if xP == nil { return errors.KeyInvalidError(fmt.Sprintf("ecc (%s): invalid point", c.Curve.Params().Name)) } return c.validate(xP, yP, secret) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/x448.go ================================================ // Package ecc implements a generic interface for ECDH, ECDSA, and EdDSA. package ecc import ( "crypto/subtle" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" x448lib "github.com/cloudflare/circl/dh/x448" ) type x448 struct{} func NewX448() *x448 { return &x448{} } func (c *x448) GetCurveName() string { return "x448" } // MarshalBytePoint encodes the public point from native format, adding the prefix. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6 func (c *x448) MarshalBytePoint(point []byte) []byte { return append([]byte{0x40}, point...) } // UnmarshalBytePoint decodes a point from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6 func (c *x448) UnmarshalBytePoint(point []byte) []byte { if len(point) != x448lib.Size+1 { return nil } return point[1:] } // MarshalByteSecret encoded a scalar from native format to prefixed. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.2 func (c *x448) MarshalByteSecret(d []byte) []byte { return append([]byte{0x40}, d...) } // UnmarshalByteSecret decodes a scalar from prefixed format to native. // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh-06#section-5.5.5.6.1.2 func (c *x448) UnmarshalByteSecret(d []byte) []byte { if len(d) != x448lib.Size+1 { return nil } // Store without prefix return d[1:] } func (c *x448) generateKeyPairBytes(rand io.Reader) (sk, pk x448lib.Key, err error) { if _, err = rand.Read(sk[:]); err != nil { return } x448lib.KeyGen(&pk, &sk) return } func (c *x448) GenerateECDH(rand io.Reader) (point []byte, secret []byte, err error) { priv, pub, err := c.generateKeyPairBytes(rand) if err != nil { return } return pub[:], priv[:], nil } func (c *x448) Encaps(rand io.Reader, point []byte) (ephemeral, sharedSecret []byte, err error) { var pk, ss x448lib.Key seed, e, err := c.generateKeyPairBytes(rand) if err != nil { return nil, nil, err } copy(pk[:], point) x448lib.Shared(&ss, &seed, &pk) return e[:], ss[:], nil } func (c *x448) Decaps(ephemeral, secret []byte) (sharedSecret []byte, err error) { var ss, sk, e x448lib.Key copy(sk[:], secret) copy(e[:], ephemeral) x448lib.Shared(&ss, &sk, &e) return ss[:], nil } func (c *x448) ValidateECDH(point []byte, secret []byte) error { var sk, pk, expectedPk x448lib.Key copy(pk[:], point) copy(sk[:], secret) x448lib.KeyGen(&expectedPk, &sk) if subtle.ConstantTimeCompare(expectedPk[:], pk[:]) == 0 { return errors.KeyInvalidError("ecc: invalid curve25519 public point") } return nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/encoding.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package encoding implements openpgp packet field encodings as specified in // RFC 4880 and 6637. package encoding import "io" // Field is an encoded field of an openpgp packet. type Field interface { // Bytes returns the decoded data. Bytes() []byte // BitLength is the size in bits of the decoded data. BitLength() uint16 // EncodedBytes returns the encoded data. EncodedBytes() []byte // EncodedLength is the size in bytes of the encoded data. EncodedLength() uint16 // ReadFrom reads the next Field from r. ReadFrom(r io.Reader) (int64, error) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/mpi.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package encoding import ( "io" "math/big" "math/bits" ) // An MPI is used to store the contents of a big integer, along with the bit // length that was specified in the original input. This allows the MPI to be // reserialized exactly. type MPI struct { bytes []byte bitLength uint16 } // NewMPI returns a MPI initialized with bytes. func NewMPI(bytes []byte) *MPI { for len(bytes) != 0 && bytes[0] == 0 { bytes = bytes[1:] } if len(bytes) == 0 { bitLength := uint16(0) return &MPI{bytes, bitLength} } bitLength := 8*uint16(len(bytes)-1) + uint16(bits.Len8(bytes[0])) return &MPI{bytes, bitLength} } // Bytes returns the decoded data. func (m *MPI) Bytes() []byte { return m.bytes } // BitLength is the size in bits of the decoded data. func (m *MPI) BitLength() uint16 { return m.bitLength } // EncodedBytes returns the encoded data. func (m *MPI) EncodedBytes() []byte { return append([]byte{byte(m.bitLength >> 8), byte(m.bitLength)}, m.bytes...) } // EncodedLength is the size in bytes of the encoded data. func (m *MPI) EncodedLength() uint16 { return uint16(2 + len(m.bytes)) } // ReadFrom reads into m the next MPI from r. func (m *MPI) ReadFrom(r io.Reader) (int64, error) { var buf [2]byte n, err := io.ReadFull(r, buf[0:]) if err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF } return int64(n), err } m.bitLength = uint16(buf[0])<<8 | uint16(buf[1]) m.bytes = make([]byte, (int(m.bitLength)+7)/8) nn, err := io.ReadFull(r, m.bytes) if err == io.EOF { err = io.ErrUnexpectedEOF } // remove leading zero bytes from malformed GnuPG encoded MPIs: // https://bugs.gnupg.org/gnupg/issue1853 // for _, b := range m.bytes { // if b != 0 { // break // } // m.bytes = m.bytes[1:] // m.bitLength -= 8 // } return int64(n) + int64(nn), err } // SetBig initializes m with the bits from n. func (m *MPI) SetBig(n *big.Int) *MPI { m.bytes = n.Bytes() m.bitLength = uint16(n.BitLen()) return m } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/oid.go ================================================ // Copyright 2017 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package encoding import ( "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ) // OID is used to store a variable-length field with a one-octet size // prefix. See https://tools.ietf.org/html/rfc6637#section-9. type OID struct { bytes []byte } const ( // maxOID is the maximum number of bytes in a OID. maxOID = 254 // reservedOIDLength1 and reservedOIDLength2 are OID lengths that the RFC // specifies are reserved. reservedOIDLength1 = 0 reservedOIDLength2 = 0xff ) // NewOID returns a OID initialized with bytes. func NewOID(bytes []byte) *OID { switch len(bytes) { case reservedOIDLength1, reservedOIDLength2: panic("encoding: NewOID argument length is reserved") default: if len(bytes) > maxOID { panic("encoding: NewOID argument too large") } } return &OID{ bytes: bytes, } } // Bytes returns the decoded data. func (o *OID) Bytes() []byte { return o.bytes } // BitLength is the size in bits of the decoded data. func (o *OID) BitLength() uint16 { return uint16(len(o.bytes) * 8) } // EncodedBytes returns the encoded data. func (o *OID) EncodedBytes() []byte { return append([]byte{byte(len(o.bytes))}, o.bytes...) } // EncodedLength is the size in bytes of the encoded data. func (o *OID) EncodedLength() uint16 { return uint16(1 + len(o.bytes)) } // ReadFrom reads into b the next OID from r. func (o *OID) ReadFrom(r io.Reader) (int64, error) { var buf [1]byte n, err := io.ReadFull(r, buf[:]) if err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF } return int64(n), err } switch buf[0] { case reservedOIDLength1, reservedOIDLength2: return int64(n), errors.UnsupportedError("reserved for future extensions") } o.bytes = make([]byte, buf[0]) nn, err := io.ReadFull(r, o.bytes) if err == io.EOF { err = io.ErrUnexpectedEOF } return int64(n) + int64(nn), err } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package openpgp import ( "crypto" "crypto/rand" "crypto/rsa" goerrors "errors" "io" "math/big" "time" "github.com/ProtonMail/go-crypto/openpgp/ecdh" "github.com/ProtonMail/go-crypto/openpgp/ecdsa" "github.com/ProtonMail/go-crypto/openpgp/ed25519" "github.com/ProtonMail/go-crypto/openpgp/ed448" "github.com/ProtonMail/go-crypto/openpgp/eddsa" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" "github.com/ProtonMail/go-crypto/openpgp/packet" "github.com/ProtonMail/go-crypto/openpgp/x25519" "github.com/ProtonMail/go-crypto/openpgp/x448" ) // NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a // single identity composed of the given full name, comment and email, any of // which may be empty but must not contain any of "()<>\x00". // If config is nil, sensible defaults will be used. func NewEntity(name, comment, email string, config *packet.Config) (*Entity, error) { creationTime := config.Now() keyLifetimeSecs := config.KeyLifetime() // Generate a primary signing key primaryPrivRaw, err := newSigner(config) if err != nil { return nil, err } primary := packet.NewSignerPrivateKey(creationTime, primaryPrivRaw) if config.V6() { if err := primary.UpgradeToV6(); err != nil { return nil, err } } e := &Entity{ PrimaryKey: &primary.PublicKey, PrivateKey: primary, Identities: make(map[string]*Identity), Subkeys: []Subkey{}, Signatures: []*packet.Signature{}, } if config.V6() { // In v6 keys algorithm preferences should be stored in direct key signatures selfSignature := createSignaturePacket(&primary.PublicKey, packet.SigTypeDirectSignature, config) err = writeKeyProperties(selfSignature, creationTime, keyLifetimeSecs, config) if err != nil { return nil, err } err = selfSignature.SignDirectKeyBinding(&primary.PublicKey, primary, config) if err != nil { return nil, err } e.Signatures = append(e.Signatures, selfSignature) e.SelfSignature = selfSignature } err = e.addUserId(name, comment, email, config, creationTime, keyLifetimeSecs, !config.V6()) if err != nil { return nil, err } // NOTE: No key expiry here, but we will not return this subkey in EncryptionKey() // if the primary/master key has expired. err = e.addEncryptionSubkey(config, creationTime, 0) if err != nil { return nil, err } return e, nil } func (t *Entity) AddUserId(name, comment, email string, config *packet.Config) error { creationTime := config.Now() keyLifetimeSecs := config.KeyLifetime() return t.addUserId(name, comment, email, config, creationTime, keyLifetimeSecs, !config.V6()) } func writeKeyProperties(selfSignature *packet.Signature, creationTime time.Time, keyLifetimeSecs uint32, config *packet.Config) error { advertiseAead := config.AEAD() != nil selfSignature.CreationTime = creationTime selfSignature.KeyLifetimeSecs = &keyLifetimeSecs selfSignature.FlagsValid = true selfSignature.FlagSign = true selfSignature.FlagCertify = true selfSignature.SEIPDv1 = true // true by default, see 5.8 vs. 5.14 selfSignature.SEIPDv2 = advertiseAead // Set the PreferredHash for the SelfSignature from the packet.Config. // If it is not the must-implement algorithm from rfc4880bis, append that. hash, ok := algorithm.HashToHashId(config.Hash()) if !ok { return errors.UnsupportedError("unsupported preferred hash function") } selfSignature.PreferredHash = []uint8{hash} if config.Hash() != crypto.SHA256 { selfSignature.PreferredHash = append(selfSignature.PreferredHash, hashToHashId(crypto.SHA256)) } // Likewise for DefaultCipher. selfSignature.PreferredSymmetric = []uint8{uint8(config.Cipher())} if config.Cipher() != packet.CipherAES128 { selfSignature.PreferredSymmetric = append(selfSignature.PreferredSymmetric, uint8(packet.CipherAES128)) } // We set CompressionNone as the preferred compression algorithm because // of compression side channel attacks, then append the configured // DefaultCompressionAlgo if any is set (to signal support for cases // where the application knows that using compression is safe). selfSignature.PreferredCompression = []uint8{uint8(packet.CompressionNone)} if config.Compression() != packet.CompressionNone { selfSignature.PreferredCompression = append(selfSignature.PreferredCompression, uint8(config.Compression())) } if advertiseAead { // Get the preferred AEAD mode from the packet.Config. // If it is not the must-implement algorithm from rfc9580, append that. modes := []uint8{uint8(config.AEAD().Mode())} if config.AEAD().Mode() != packet.AEADModeOCB { modes = append(modes, uint8(packet.AEADModeOCB)) } // For preferred (AES256, GCM), we'll generate (AES256, GCM), (AES256, OCB), (AES128, GCM), (AES128, OCB) for _, cipher := range selfSignature.PreferredSymmetric { for _, mode := range modes { selfSignature.PreferredCipherSuites = append(selfSignature.PreferredCipherSuites, [2]uint8{cipher, mode}) } } } return nil } func (t *Entity) addUserId(name, comment, email string, config *packet.Config, creationTime time.Time, keyLifetimeSecs uint32, writeProperties bool) error { uid := packet.NewUserId(name, comment, email) if uid == nil { return errors.InvalidArgumentError("user id field contained invalid characters") } if _, ok := t.Identities[uid.Id]; ok { return errors.InvalidArgumentError("user id exist") } primary := t.PrivateKey isPrimaryId := len(t.Identities) == 0 selfSignature := createSignaturePacket(&primary.PublicKey, packet.SigTypePositiveCert, config) if writeProperties { err := writeKeyProperties(selfSignature, creationTime, keyLifetimeSecs, config) if err != nil { return err } } selfSignature.IsPrimaryId = &isPrimaryId // User ID binding signature err := selfSignature.SignUserId(uid.Id, &primary.PublicKey, primary, config) if err != nil { return err } t.Identities[uid.Id] = &Identity{ Name: uid.Id, UserId: uid, SelfSignature: selfSignature, Signatures: []*packet.Signature{selfSignature}, } return nil } // AddSigningSubkey adds a signing keypair as a subkey to the Entity. // If config is nil, sensible defaults will be used. func (e *Entity) AddSigningSubkey(config *packet.Config) error { creationTime := config.Now() keyLifetimeSecs := config.KeyLifetime() subPrivRaw, err := newSigner(config) if err != nil { return err } sub := packet.NewSignerPrivateKey(creationTime, subPrivRaw) sub.IsSubkey = true if config.V6() { if err := sub.UpgradeToV6(); err != nil { return err } } subkey := Subkey{ PublicKey: &sub.PublicKey, PrivateKey: sub, } subkey.Sig = createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyBinding, config) subkey.Sig.CreationTime = creationTime subkey.Sig.KeyLifetimeSecs = &keyLifetimeSecs subkey.Sig.FlagsValid = true subkey.Sig.FlagSign = true subkey.Sig.EmbeddedSignature = createSignaturePacket(subkey.PublicKey, packet.SigTypePrimaryKeyBinding, config) subkey.Sig.EmbeddedSignature.CreationTime = creationTime err = subkey.Sig.EmbeddedSignature.CrossSignKey(subkey.PublicKey, e.PrimaryKey, subkey.PrivateKey, config) if err != nil { return err } err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config) if err != nil { return err } e.Subkeys = append(e.Subkeys, subkey) return nil } // AddEncryptionSubkey adds an encryption keypair as a subkey to the Entity. // If config is nil, sensible defaults will be used. func (e *Entity) AddEncryptionSubkey(config *packet.Config) error { creationTime := config.Now() keyLifetimeSecs := config.KeyLifetime() return e.addEncryptionSubkey(config, creationTime, keyLifetimeSecs) } func (e *Entity) addEncryptionSubkey(config *packet.Config, creationTime time.Time, keyLifetimeSecs uint32) error { subPrivRaw, err := newDecrypter(config) if err != nil { return err } sub := packet.NewDecrypterPrivateKey(creationTime, subPrivRaw) sub.IsSubkey = true if config.V6() { if err := sub.UpgradeToV6(); err != nil { return err } } subkey := Subkey{ PublicKey: &sub.PublicKey, PrivateKey: sub, } subkey.Sig = createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyBinding, config) subkey.Sig.CreationTime = creationTime subkey.Sig.KeyLifetimeSecs = &keyLifetimeSecs subkey.Sig.FlagsValid = true subkey.Sig.FlagEncryptStorage = true subkey.Sig.FlagEncryptCommunications = true err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config) if err != nil { return err } e.Subkeys = append(e.Subkeys, subkey) return nil } // Generates a signing key func newSigner(config *packet.Config) (signer interface{}, err error) { switch config.PublicKeyAlgorithm() { case packet.PubKeyAlgoRSA: bits := config.RSAModulusBits() if bits < 1024 { return nil, errors.InvalidArgumentError("bits must be >= 1024") } if config != nil && len(config.RSAPrimes) >= 2 { primes := config.RSAPrimes[0:2] config.RSAPrimes = config.RSAPrimes[2:] return generateRSAKeyWithPrimes(config.Random(), 2, bits, primes) } return rsa.GenerateKey(config.Random(), bits) case packet.PubKeyAlgoEdDSA: if config.V6() { // Implementations MUST NOT accept or generate v6 key material // using the deprecated OIDs. return nil, errors.InvalidArgumentError("EdDSALegacy cannot be used for v6 keys") } curve := ecc.FindEdDSAByGenName(string(config.CurveName())) if curve == nil { return nil, errors.InvalidArgumentError("unsupported curve") } priv, err := eddsa.GenerateKey(config.Random(), curve) if err != nil { return nil, err } return priv, nil case packet.PubKeyAlgoECDSA: curve := ecc.FindECDSAByGenName(string(config.CurveName())) if curve == nil { return nil, errors.InvalidArgumentError("unsupported curve") } priv, err := ecdsa.GenerateKey(config.Random(), curve) if err != nil { return nil, err } return priv, nil case packet.PubKeyAlgoEd25519: priv, err := ed25519.GenerateKey(config.Random()) if err != nil { return nil, err } return priv, nil case packet.PubKeyAlgoEd448: priv, err := ed448.GenerateKey(config.Random()) if err != nil { return nil, err } return priv, nil default: return nil, errors.InvalidArgumentError("unsupported public key algorithm") } } // Generates an encryption/decryption key func newDecrypter(config *packet.Config) (decrypter interface{}, err error) { switch config.PublicKeyAlgorithm() { case packet.PubKeyAlgoRSA: bits := config.RSAModulusBits() if bits < 1024 { return nil, errors.InvalidArgumentError("bits must be >= 1024") } if config != nil && len(config.RSAPrimes) >= 2 { primes := config.RSAPrimes[0:2] config.RSAPrimes = config.RSAPrimes[2:] return generateRSAKeyWithPrimes(config.Random(), 2, bits, primes) } return rsa.GenerateKey(config.Random(), bits) case packet.PubKeyAlgoEdDSA, packet.PubKeyAlgoECDSA: fallthrough // When passing EdDSA or ECDSA, we generate an ECDH subkey case packet.PubKeyAlgoECDH: if config.V6() && (config.CurveName() == packet.Curve25519 || config.CurveName() == packet.Curve448) { // Implementations MUST NOT accept or generate v6 key material // using the deprecated OIDs. return nil, errors.InvalidArgumentError("ECDH with Curve25519/448 legacy cannot be used for v6 keys") } var kdf = ecdh.KDF{ Hash: algorithm.SHA512, Cipher: algorithm.AES256, } curve := ecc.FindECDHByGenName(string(config.CurveName())) if curve == nil { return nil, errors.InvalidArgumentError("unsupported curve") } return ecdh.GenerateKey(config.Random(), curve, kdf) case packet.PubKeyAlgoEd25519, packet.PubKeyAlgoX25519: // When passing Ed25519, we generate an x25519 subkey return x25519.GenerateKey(config.Random()) case packet.PubKeyAlgoEd448, packet.PubKeyAlgoX448: // When passing Ed448, we generate an x448 subkey return x448.GenerateKey(config.Random()) default: return nil, errors.InvalidArgumentError("unsupported public key algorithm") } } var bigOne = big.NewInt(1) // generateRSAKeyWithPrimes generates a multi-prime RSA keypair of the // given bit size, using the given random source and pre-populated primes. func generateRSAKeyWithPrimes(random io.Reader, nprimes int, bits int, prepopulatedPrimes []*big.Int) (*rsa.PrivateKey, error) { priv := new(rsa.PrivateKey) priv.E = 65537 if nprimes < 2 { return nil, goerrors.New("generateRSAKeyWithPrimes: nprimes must be >= 2") } if bits < 1024 { return nil, goerrors.New("generateRSAKeyWithPrimes: bits must be >= 1024") } primes := make([]*big.Int, nprimes) NextSetOfPrimes: for { todo := bits // crypto/rand should set the top two bits in each prime. // Thus each prime has the form // p_i = 2^bitlen(p_i) × 0.11... (in base 2). // And the product is: // P = 2^todo × α // where α is the product of nprimes numbers of the form 0.11... // // If α < 1/2 (which can happen for nprimes > 2), we need to // shift todo to compensate for lost bits: the mean value of 0.11... // is 7/8, so todo + shift - nprimes * log2(7/8) ~= bits - 1/2 // will give good results. if nprimes >= 7 { todo += (nprimes - 2) / 5 } for i := 0; i < nprimes; i++ { var err error if len(prepopulatedPrimes) == 0 { primes[i], err = rand.Prime(random, todo/(nprimes-i)) if err != nil { return nil, err } } else { primes[i] = prepopulatedPrimes[0] prepopulatedPrimes = prepopulatedPrimes[1:] } todo -= primes[i].BitLen() } // Make sure that primes is pairwise unequal. for i, prime := range primes { for j := 0; j < i; j++ { if prime.Cmp(primes[j]) == 0 { continue NextSetOfPrimes } } } n := new(big.Int).Set(bigOne) totient := new(big.Int).Set(bigOne) pminus1 := new(big.Int) for _, prime := range primes { n.Mul(n, prime) pminus1.Sub(prime, bigOne) totient.Mul(totient, pminus1) } if n.BitLen() != bits { // This should never happen for nprimes == 2 because // crypto/rand should set the top two bits in each prime. // For nprimes > 2 we hope it does not happen often. continue NextSetOfPrimes } priv.D = new(big.Int) e := big.NewInt(int64(priv.E)) ok := priv.D.ModInverse(e, totient) if ok != nil { priv.Primes = primes priv.N = n break } } priv.Precompute() return priv, nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package openpgp import ( goerrors "errors" "fmt" "io" "time" "github.com/ProtonMail/go-crypto/openpgp/armor" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/packet" ) // PublicKeyType is the armor type for a PGP public key. var PublicKeyType = "PGP PUBLIC KEY BLOCK" // PrivateKeyType is the armor type for a PGP private key. var PrivateKeyType = "PGP PRIVATE KEY BLOCK" // An Entity represents the components of an OpenPGP key: a primary public key // (which must be a signing key), one or more identities claimed by that key, // and zero or more subkeys, which may be encryption keys. type Entity struct { PrimaryKey *packet.PublicKey PrivateKey *packet.PrivateKey Identities map[string]*Identity // indexed by Identity.Name Revocations []*packet.Signature Subkeys []Subkey SelfSignature *packet.Signature // Direct-key self signature of the PrimaryKey (contains primary key properties in v6) Signatures []*packet.Signature // all (potentially unverified) self-signatures, revocations, and third-party signatures } // An Identity represents an identity claimed by an Entity and zero or more // assertions by other entities about that claim. type Identity struct { Name string // by convention, has the form "Full Name (comment) " UserId *packet.UserId SelfSignature *packet.Signature Revocations []*packet.Signature Signatures []*packet.Signature // all (potentially unverified) self-signatures, revocations, and third-party signatures } // A Subkey is an additional public key in an Entity. Subkeys can be used for // encryption. type Subkey struct { PublicKey *packet.PublicKey PrivateKey *packet.PrivateKey Sig *packet.Signature Revocations []*packet.Signature } // A Key identifies a specific public key in an Entity. This is either the // Entity's primary key or a subkey. type Key struct { Entity *Entity PublicKey *packet.PublicKey PrivateKey *packet.PrivateKey SelfSignature *packet.Signature Revocations []*packet.Signature } // A KeyRing provides access to public and private keys. type KeyRing interface { // KeysById returns the set of keys that have the given key id. KeysById(id uint64) []Key // KeysByIdAndUsage returns the set of keys with the given id // that also meet the key usage given by requiredUsage. // The requiredUsage is expressed as the bitwise-OR of // packet.KeyFlag* values. KeysByIdUsage(id uint64, requiredUsage byte) []Key // DecryptionKeys returns all private keys that are valid for // decryption. DecryptionKeys() []Key } // PrimaryIdentity returns an Identity, preferring non-revoked identities, // identities marked as primary, or the latest-created identity, in that order. func (e *Entity) PrimaryIdentity() *Identity { var primaryIdentity *Identity for _, ident := range e.Identities { if shouldPreferIdentity(primaryIdentity, ident) { primaryIdentity = ident } } return primaryIdentity } func shouldPreferIdentity(existingId, potentialNewId *Identity) bool { if existingId == nil { return true } if len(existingId.Revocations) > len(potentialNewId.Revocations) { return true } if len(existingId.Revocations) < len(potentialNewId.Revocations) { return false } if existingId.SelfSignature == nil { return true } if existingId.SelfSignature.IsPrimaryId != nil && *existingId.SelfSignature.IsPrimaryId && !(potentialNewId.SelfSignature.IsPrimaryId != nil && *potentialNewId.SelfSignature.IsPrimaryId) { return false } if !(existingId.SelfSignature.IsPrimaryId != nil && *existingId.SelfSignature.IsPrimaryId) && potentialNewId.SelfSignature.IsPrimaryId != nil && *potentialNewId.SelfSignature.IsPrimaryId { return true } return potentialNewId.SelfSignature.CreationTime.After(existingId.SelfSignature.CreationTime) } // EncryptionKey returns the best candidate Key for encrypting a message to the // given Entity. func (e *Entity) EncryptionKey(now time.Time) (Key, bool) { // Fail to find any encryption key if the... primarySelfSignature, primaryIdentity := e.PrimarySelfSignature() if primarySelfSignature == nil || // no self-signature found e.PrimaryKey.KeyExpired(primarySelfSignature, now) || // primary key has expired e.Revoked(now) || // primary key has been revoked primarySelfSignature.SigExpired(now) || // user ID or or direct self-signature has expired (primaryIdentity != nil && primaryIdentity.Revoked(now)) { // user ID has been revoked (for v4 keys) return Key{}, false } // Iterate the keys to find the newest, unexpired one candidateSubkey := -1 var maxTime time.Time for i, subkey := range e.Subkeys { if subkey.Sig.FlagsValid && subkey.Sig.FlagEncryptCommunications && subkey.PublicKey.PubKeyAlgo.CanEncrypt() && !subkey.PublicKey.KeyExpired(subkey.Sig, now) && !subkey.Sig.SigExpired(now) && !subkey.Revoked(now) && (maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) { candidateSubkey = i maxTime = subkey.Sig.CreationTime } } if candidateSubkey != -1 { subkey := e.Subkeys[candidateSubkey] return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig, subkey.Revocations}, true } // If we don't have any subkeys for encryption and the primary key // is marked as OK to encrypt with, then we can use it. if primarySelfSignature.FlagsValid && primarySelfSignature.FlagEncryptCommunications && e.PrimaryKey.PubKeyAlgo.CanEncrypt() { return Key{e, e.PrimaryKey, e.PrivateKey, primarySelfSignature, e.Revocations}, true } return Key{}, false } // CertificationKey return the best candidate Key for certifying a key with this // Entity. func (e *Entity) CertificationKey(now time.Time) (Key, bool) { return e.CertificationKeyById(now, 0) } // CertificationKeyById return the Key for key certification with this // Entity and keyID. func (e *Entity) CertificationKeyById(now time.Time, id uint64) (Key, bool) { return e.signingKeyByIdUsage(now, id, packet.KeyFlagCertify) } // SigningKey return the best candidate Key for signing a message with this // Entity. func (e *Entity) SigningKey(now time.Time) (Key, bool) { return e.SigningKeyById(now, 0) } // SigningKeyById return the Key for signing a message with this // Entity and keyID. func (e *Entity) SigningKeyById(now time.Time, id uint64) (Key, bool) { return e.signingKeyByIdUsage(now, id, packet.KeyFlagSign) } func (e *Entity) signingKeyByIdUsage(now time.Time, id uint64, flags int) (Key, bool) { // Fail to find any signing key if the... primarySelfSignature, primaryIdentity := e.PrimarySelfSignature() if primarySelfSignature == nil || // no self-signature found e.PrimaryKey.KeyExpired(primarySelfSignature, now) || // primary key has expired e.Revoked(now) || // primary key has been revoked primarySelfSignature.SigExpired(now) || // user ID or direct self-signature has expired (primaryIdentity != nil && primaryIdentity.Revoked(now)) { // user ID has been revoked (for v4 keys) return Key{}, false } // Iterate the keys to find the newest, unexpired one candidateSubkey := -1 var maxTime time.Time for idx, subkey := range e.Subkeys { if subkey.Sig.FlagsValid && (flags&packet.KeyFlagCertify == 0 || subkey.Sig.FlagCertify) && (flags&packet.KeyFlagSign == 0 || subkey.Sig.FlagSign) && subkey.PublicKey.PubKeyAlgo.CanSign() && !subkey.PublicKey.KeyExpired(subkey.Sig, now) && !subkey.Sig.SigExpired(now) && !subkey.Revoked(now) && (maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) && (id == 0 || subkey.PublicKey.KeyId == id) { candidateSubkey = idx maxTime = subkey.Sig.CreationTime } } if candidateSubkey != -1 { subkey := e.Subkeys[candidateSubkey] return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig, subkey.Revocations}, true } // If we don't have any subkeys for signing and the primary key // is marked as OK to sign with, then we can use it. if primarySelfSignature.FlagsValid && (flags&packet.KeyFlagCertify == 0 || primarySelfSignature.FlagCertify) && (flags&packet.KeyFlagSign == 0 || primarySelfSignature.FlagSign) && e.PrimaryKey.PubKeyAlgo.CanSign() && (id == 0 || e.PrimaryKey.KeyId == id) { return Key{e, e.PrimaryKey, e.PrivateKey, primarySelfSignature, e.Revocations}, true } // No keys with a valid Signing Flag or no keys matched the id passed in return Key{}, false } func revoked(revocations []*packet.Signature, now time.Time) bool { for _, revocation := range revocations { if revocation.RevocationReason != nil && *revocation.RevocationReason == packet.KeyCompromised { // If the key is compromised, the key is considered revoked even before the revocation date. return true } if !revocation.SigExpired(now) { return true } } return false } // Revoked returns whether the entity has any direct key revocation signatures. // Note that third-party revocation signatures are not supported. // Note also that Identity and Subkey revocation should be checked separately. func (e *Entity) Revoked(now time.Time) bool { return revoked(e.Revocations, now) } // EncryptPrivateKeys encrypts all non-encrypted keys in the entity with the same key // derived from the provided passphrase. Public keys and dummy keys are ignored, // and don't cause an error to be returned. func (e *Entity) EncryptPrivateKeys(passphrase []byte, config *packet.Config) error { var keysToEncrypt []*packet.PrivateKey // Add entity private key to encrypt. if e.PrivateKey != nil && !e.PrivateKey.Dummy() && !e.PrivateKey.Encrypted { keysToEncrypt = append(keysToEncrypt, e.PrivateKey) } // Add subkeys to encrypt. for _, sub := range e.Subkeys { if sub.PrivateKey != nil && !sub.PrivateKey.Dummy() && !sub.PrivateKey.Encrypted { keysToEncrypt = append(keysToEncrypt, sub.PrivateKey) } } return packet.EncryptPrivateKeys(keysToEncrypt, passphrase, config) } // DecryptPrivateKeys decrypts all encrypted keys in the entity with the given passphrase. // Avoids recomputation of similar s2k key derivations. Public keys and dummy keys are ignored, // and don't cause an error to be returned. func (e *Entity) DecryptPrivateKeys(passphrase []byte) error { var keysToDecrypt []*packet.PrivateKey // Add entity private key to decrypt. if e.PrivateKey != nil && !e.PrivateKey.Dummy() && e.PrivateKey.Encrypted { keysToDecrypt = append(keysToDecrypt, e.PrivateKey) } // Add subkeys to decrypt. for _, sub := range e.Subkeys { if sub.PrivateKey != nil && !sub.PrivateKey.Dummy() && sub.PrivateKey.Encrypted { keysToDecrypt = append(keysToDecrypt, sub.PrivateKey) } } return packet.DecryptPrivateKeys(keysToDecrypt, passphrase) } // Revoked returns whether the identity has been revoked by a self-signature. // Note that third-party revocation signatures are not supported. func (i *Identity) Revoked(now time.Time) bool { return revoked(i.Revocations, now) } // Revoked returns whether the subkey has been revoked by a self-signature. // Note that third-party revocation signatures are not supported. func (s *Subkey) Revoked(now time.Time) bool { return revoked(s.Revocations, now) } // Revoked returns whether the key or subkey has been revoked by a self-signature. // Note that third-party revocation signatures are not supported. // Note also that Identity revocation should be checked separately. // Normally, it's not necessary to call this function, except on keys returned by // KeysById or KeysByIdUsage. func (key *Key) Revoked(now time.Time) bool { return revoked(key.Revocations, now) } // An EntityList contains one or more Entities. type EntityList []*Entity // KeysById returns the set of keys that have the given key id. func (el EntityList) KeysById(id uint64) (keys []Key) { for _, e := range el { if e.PrimaryKey.KeyId == id { selfSig, _ := e.PrimarySelfSignature() keys = append(keys, Key{e, e.PrimaryKey, e.PrivateKey, selfSig, e.Revocations}) } for _, subKey := range e.Subkeys { if subKey.PublicKey.KeyId == id { keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig, subKey.Revocations}) } } } return } // KeysByIdAndUsage returns the set of keys with the given id that also meet // the key usage given by requiredUsage. The requiredUsage is expressed as // the bitwise-OR of packet.KeyFlag* values. func (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) { for _, key := range el.KeysById(id) { if requiredUsage != 0 { if key.SelfSignature == nil || !key.SelfSignature.FlagsValid { continue } var usage byte if key.SelfSignature.FlagCertify { usage |= packet.KeyFlagCertify } if key.SelfSignature.FlagSign { usage |= packet.KeyFlagSign } if key.SelfSignature.FlagEncryptCommunications { usage |= packet.KeyFlagEncryptCommunications } if key.SelfSignature.FlagEncryptStorage { usage |= packet.KeyFlagEncryptStorage } if usage&requiredUsage != requiredUsage { continue } } keys = append(keys, key) } return } // DecryptionKeys returns all private keys that are valid for decryption. func (el EntityList) DecryptionKeys() (keys []Key) { for _, e := range el { for _, subKey := range e.Subkeys { if subKey.PrivateKey != nil && subKey.Sig.FlagsValid && (subKey.Sig.FlagEncryptStorage || subKey.Sig.FlagEncryptCommunications) { keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig, subKey.Revocations}) } } } return } // ReadArmoredKeyRing reads one or more public/private keys from an armor keyring file. func ReadArmoredKeyRing(r io.Reader) (EntityList, error) { block, err := armor.Decode(r) if err == io.EOF { return nil, errors.InvalidArgumentError("no armored data found") } if err != nil { return nil, err } if block.Type != PublicKeyType && block.Type != PrivateKeyType { return nil, errors.InvalidArgumentError("expected public or private key block, got: " + block.Type) } return ReadKeyRing(block.Body) } // ReadKeyRing reads one or more public/private keys. Unsupported keys are // ignored as long as at least a single valid key is found. func ReadKeyRing(r io.Reader) (el EntityList, err error) { packets := packet.NewReader(r) var lastUnsupportedError error for { var e *Entity e, err = ReadEntity(packets) if err != nil { // TODO: warn about skipped unsupported/unreadable keys if _, ok := err.(errors.UnsupportedError); ok { lastUnsupportedError = err err = readToNextPublicKey(packets) } else if _, ok := err.(errors.StructuralError); ok { // Skip unreadable, badly-formatted keys lastUnsupportedError = err err = readToNextPublicKey(packets) } if err == io.EOF { err = nil break } if err != nil { el = nil break } } else { el = append(el, e) } } if len(el) == 0 && err == nil { err = lastUnsupportedError } return } // readToNextPublicKey reads packets until the start of the entity and leaves // the first packet of the new entity in the Reader. func readToNextPublicKey(packets *packet.Reader) (err error) { var p packet.Packet for { p, err = packets.Next() if err == io.EOF { return } else if err != nil { if _, ok := err.(errors.UnsupportedError); ok { continue } return } if pk, ok := p.(*packet.PublicKey); ok && !pk.IsSubkey { packets.Unread(p) return } } } // ReadEntity reads an entity (public key, identities, subkeys etc) from the // given Reader. func ReadEntity(packets *packet.Reader) (*Entity, error) { e := new(Entity) e.Identities = make(map[string]*Identity) p, err := packets.Next() if err != nil { return nil, err } var ok bool if e.PrimaryKey, ok = p.(*packet.PublicKey); !ok { if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok { packets.Unread(p) return nil, errors.StructuralError("first packet was not a public/private key") } e.PrimaryKey = &e.PrivateKey.PublicKey } if !e.PrimaryKey.PubKeyAlgo.CanSign() { return nil, errors.StructuralError("primary key cannot be used for signatures") } var revocations []*packet.Signature var directSignatures []*packet.Signature EachPacket: for { p, err := packets.Next() if err == io.EOF { break } else if err != nil { return nil, err } switch pkt := p.(type) { case *packet.UserId: if err := addUserID(e, packets, pkt); err != nil { return nil, err } case *packet.Signature: if pkt.SigType == packet.SigTypeKeyRevocation { revocations = append(revocations, pkt) } else if pkt.SigType == packet.SigTypeDirectSignature { directSignatures = append(directSignatures, pkt) } // Else, ignoring the signature as it does not follow anything // we would know to attach it to. case *packet.PrivateKey: if !pkt.IsSubkey { packets.Unread(p) break EachPacket } err = addSubkey(e, packets, &pkt.PublicKey, pkt) if err != nil { return nil, err } case *packet.PublicKey: if !pkt.IsSubkey { packets.Unread(p) break EachPacket } err = addSubkey(e, packets, pkt, nil) if err != nil { return nil, err } default: // we ignore unknown packets. } } if len(e.Identities) == 0 && e.PrimaryKey.Version < 6 { return nil, errors.StructuralError(fmt.Sprintf("v%d entity without any identities", e.PrimaryKey.Version)) } // An implementation MUST ensure that a valid direct-key signature is present before using a v6 key. if e.PrimaryKey.Version == 6 { if len(directSignatures) == 0 { return nil, errors.StructuralError("v6 entity without a valid direct-key signature") } // Select main direct key signature. var mainDirectKeySelfSignature *packet.Signature for _, directSignature := range directSignatures { if directSignature.SigType == packet.SigTypeDirectSignature && directSignature.CheckKeyIdOrFingerprint(e.PrimaryKey) && (mainDirectKeySelfSignature == nil || directSignature.CreationTime.After(mainDirectKeySelfSignature.CreationTime)) { mainDirectKeySelfSignature = directSignature } } if mainDirectKeySelfSignature == nil { return nil, errors.StructuralError("no valid direct-key self-signature for v6 primary key found") } // Check that the main self-signature is valid. err = e.PrimaryKey.VerifyDirectKeySignature(mainDirectKeySelfSignature) if err != nil { return nil, errors.StructuralError("invalid direct-key self-signature for v6 primary key") } e.SelfSignature = mainDirectKeySelfSignature e.Signatures = directSignatures } for _, revocation := range revocations { err = e.PrimaryKey.VerifyRevocationSignature(revocation) if err == nil { e.Revocations = append(e.Revocations, revocation) } else { // TODO: RFC 4880 5.2.3.15 defines revocation keys. return nil, errors.StructuralError("revocation signature signed by alternate key") } } return e, nil } func addUserID(e *Entity, packets *packet.Reader, pkt *packet.UserId) error { // Make a new Identity object, that we might wind up throwing away. // We'll only add it if we get a valid self-signature over this // userID. identity := new(Identity) identity.Name = pkt.Id identity.UserId = pkt for { p, err := packets.Next() if err == io.EOF { break } else if err != nil { return err } sig, ok := p.(*packet.Signature) if !ok { packets.Unread(p) break } if sig.SigType != packet.SigTypeGenericCert && sig.SigType != packet.SigTypePersonaCert && sig.SigType != packet.SigTypeCasualCert && sig.SigType != packet.SigTypePositiveCert && sig.SigType != packet.SigTypeCertificationRevocation { return errors.StructuralError("user ID signature with wrong type") } if sig.CheckKeyIdOrFingerprint(e.PrimaryKey) { if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { return errors.StructuralError("user ID self-signature invalid: " + err.Error()) } if sig.SigType == packet.SigTypeCertificationRevocation { identity.Revocations = append(identity.Revocations, sig) } else if identity.SelfSignature == nil || sig.CreationTime.After(identity.SelfSignature.CreationTime) { identity.SelfSignature = sig } identity.Signatures = append(identity.Signatures, sig) e.Identities[pkt.Id] = identity } else { identity.Signatures = append(identity.Signatures, sig) } } return nil } func addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error { var subKey Subkey subKey.PublicKey = pub subKey.PrivateKey = priv for { p, err := packets.Next() if err == io.EOF { break } else if err != nil { return errors.StructuralError("subkey signature invalid: " + err.Error()) } sig, ok := p.(*packet.Signature) if !ok { packets.Unread(p) break } if sig.SigType != packet.SigTypeSubkeyBinding && sig.SigType != packet.SigTypeSubkeyRevocation { return errors.StructuralError("subkey signature with wrong type") } if err := e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, sig); err != nil { return errors.StructuralError("subkey signature invalid: " + err.Error()) } switch sig.SigType { case packet.SigTypeSubkeyRevocation: subKey.Revocations = append(subKey.Revocations, sig) case packet.SigTypeSubkeyBinding: if subKey.Sig == nil || sig.CreationTime.After(subKey.Sig.CreationTime) { subKey.Sig = sig } } } if subKey.Sig == nil { return errors.StructuralError("subkey packet not followed by signature") } e.Subkeys = append(e.Subkeys, subKey) return nil } // SerializePrivate serializes an Entity, including private key material, but // excluding signatures from other entities, to the given Writer. // Identities and subkeys are re-signed in case they changed since NewEntry. // If config is nil, sensible defaults will be used. func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) { if e.PrivateKey.Dummy() { return errors.ErrDummyPrivateKey("dummy private key cannot re-sign identities") } return e.serializePrivate(w, config, true) } // SerializePrivateWithoutSigning serializes an Entity, including private key // material, but excluding signatures from other entities, to the given Writer. // Self-signatures of identities and subkeys are not re-signed. This is useful // when serializing GNU dummy keys, among other things. // If config is nil, sensible defaults will be used. func (e *Entity) SerializePrivateWithoutSigning(w io.Writer, config *packet.Config) (err error) { return e.serializePrivate(w, config, false) } func (e *Entity) serializePrivate(w io.Writer, config *packet.Config, reSign bool) (err error) { if e.PrivateKey == nil { return goerrors.New("openpgp: private key is missing") } err = e.PrivateKey.Serialize(w) if err != nil { return } for _, revocation := range e.Revocations { err := revocation.Serialize(w) if err != nil { return err } } for _, directSignature := range e.Signatures { err := directSignature.Serialize(w) if err != nil { return err } } for _, ident := range e.Identities { err = ident.UserId.Serialize(w) if err != nil { return } if reSign { if ident.SelfSignature == nil { return goerrors.New("openpgp: can't re-sign identity without valid self-signature") } err = ident.SelfSignature.SignUserId(ident.UserId.Id, e.PrimaryKey, e.PrivateKey, config) if err != nil { return } } for _, sig := range ident.Signatures { err = sig.Serialize(w) if err != nil { return err } } } for _, subkey := range e.Subkeys { err = subkey.PrivateKey.Serialize(w) if err != nil { return } if reSign { err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config) if err != nil { return } if subkey.Sig.EmbeddedSignature != nil { err = subkey.Sig.EmbeddedSignature.CrossSignKey(subkey.PublicKey, e.PrimaryKey, subkey.PrivateKey, config) if err != nil { return } } } for _, revocation := range subkey.Revocations { err := revocation.Serialize(w) if err != nil { return err } } err = subkey.Sig.Serialize(w) if err != nil { return } } return nil } // Serialize writes the public part of the given Entity to w, including // signatures from other entities. No private key material will be output. func (e *Entity) Serialize(w io.Writer) error { err := e.PrimaryKey.Serialize(w) if err != nil { return err } for _, revocation := range e.Revocations { err := revocation.Serialize(w) if err != nil { return err } } for _, directSignature := range e.Signatures { err := directSignature.Serialize(w) if err != nil { return err } } for _, ident := range e.Identities { err = ident.UserId.Serialize(w) if err != nil { return err } for _, sig := range ident.Signatures { err = sig.Serialize(w) if err != nil { return err } } } for _, subkey := range e.Subkeys { err = subkey.PublicKey.Serialize(w) if err != nil { return err } for _, revocation := range subkey.Revocations { err := revocation.Serialize(w) if err != nil { return err } } err = subkey.Sig.Serialize(w) if err != nil { return err } } return nil } // SignIdentity adds a signature to e, from signer, attesting that identity is // associated with e. The provided identity must already be an element of // e.Identities and the private key of signer must have been decrypted if // necessary. // If config is nil, sensible defaults will be used. func (e *Entity) SignIdentity(identity string, signer *Entity, config *packet.Config) error { certificationKey, ok := signer.CertificationKey(config.Now()) if !ok { return errors.InvalidArgumentError("no valid certification key found") } if certificationKey.PrivateKey.Encrypted { return errors.InvalidArgumentError("signing Entity's private key must be decrypted") } ident, ok := e.Identities[identity] if !ok { return errors.InvalidArgumentError("given identity string not found in Entity") } sig := createSignaturePacket(certificationKey.PublicKey, packet.SigTypeGenericCert, config) signingUserID := config.SigningUserId() if signingUserID != "" { if _, ok := signer.Identities[signingUserID]; !ok { return errors.InvalidArgumentError("signer identity string not found in signer Entity") } sig.SignerUserId = &signingUserID } if err := sig.SignUserId(identity, e.PrimaryKey, certificationKey.PrivateKey, config); err != nil { return err } ident.Signatures = append(ident.Signatures, sig) return nil } // RevokeKey generates a key revocation signature (packet.SigTypeKeyRevocation) with the // specified reason code and text (RFC4880 section-5.2.3.23). // If config is nil, sensible defaults will be used. func (e *Entity) RevokeKey(reason packet.ReasonForRevocation, reasonText string, config *packet.Config) error { revSig := createSignaturePacket(e.PrimaryKey, packet.SigTypeKeyRevocation, config) revSig.RevocationReason = &reason revSig.RevocationReasonText = reasonText if err := revSig.RevokeKey(e.PrimaryKey, e.PrivateKey, config); err != nil { return err } e.Revocations = append(e.Revocations, revSig) return nil } // RevokeSubkey generates a subkey revocation signature (packet.SigTypeSubkeyRevocation) for // a subkey with the specified reason code and text (RFC4880 section-5.2.3.23). // If config is nil, sensible defaults will be used. func (e *Entity) RevokeSubkey(sk *Subkey, reason packet.ReasonForRevocation, reasonText string, config *packet.Config) error { if err := e.PrimaryKey.VerifyKeySignature(sk.PublicKey, sk.Sig); err != nil { return errors.InvalidArgumentError("given subkey is not associated with this key") } revSig := createSignaturePacket(e.PrimaryKey, packet.SigTypeSubkeyRevocation, config) revSig.RevocationReason = &reason revSig.RevocationReasonText = reasonText if err := revSig.RevokeSubkey(sk.PublicKey, e.PrivateKey, config); err != nil { return err } sk.Revocations = append(sk.Revocations, revSig) return nil } func (e *Entity) primaryDirectSignature() *packet.Signature { return e.SelfSignature } // PrimarySelfSignature searches the entity for the self-signature that stores key preferences. // For V4 keys, returns the self-signature of the primary identity, and the identity. // For V6 keys, returns the latest valid direct-key self-signature, and no identity (nil). // This self-signature is to be used to check the key expiration, // algorithm preferences, and so on. func (e *Entity) PrimarySelfSignature() (*packet.Signature, *Identity) { if e.PrimaryKey.Version == 6 { return e.primaryDirectSignature(), nil } primaryIdentity := e.PrimaryIdentity() if primaryIdentity == nil { return nil, nil } return primaryIdentity.SelfSignature, primaryIdentity } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go ================================================ package openpgp const expiringKeyHex = "c6c04d0451d0c680010800abbb021fd03ffc4e96618901180c3fdcb060ee69eeead97b91256d11420d80b5f1b51930248044130bd300605cf8a05b7a40d3d8cfb0a910be2e3db50dcd50a9c54064c2a5550801daa834ff4480b33d3d3ca495ff8a4e84a886977d17d998f881241a874083d8b995beab555b6d22b8a4817ab17ac3e7304f7d4d2c05c495fb2218348d3bc13651db1d92732e368a9dd7dcefa6eddff30b94706a9aaee47e9d39321460b740c59c6fc3c2fd8ab6c0fb868cb87c0051f0321301fe0f0e1820b15e7fb7063395769b525005c7e30a7ce85984f5cac00504e7b4fdc45d74958de8388436fd5c7ba9ea121f1c851b5911dd1b47a14d81a09e92ef37721e2325b6790011010001cd00c2c07b041001080025050251d0c680050900278d00060b09070803020415080a0203160201021901021b03021e01000a0910e7b484133a890a35ae4b0800a1beb82e7f28eaf5273d6af9d3391314f6280b2b624eaca2851f89a9ebcaf80ac589ebd509f168bc4322106ca2e2ce77a76e071a3c7444787d65216b5f05e82c77928860b92aace3b7d0327db59492f422eb9dfab7249266d37429870b091a98aba8724c2259ebf8f85093f21255eafa75aa841e31d94f2ac891b9755fed455e539044ee69fc47950b80e003fc9f298d695660f28329eaa38037c367efde1727458e514faf990d439a21461b719edaddf9296d3d0647b43ca56cb8dbf63b4fcf8b9968e7928c463470fab3b98e44d0d95645062f94b2d04fe56bd52822b71934db8ce845622c40b92fcbe765a142e7f38b61a6aa9606c8e8858dcd3b6eb1894acec04d0451d1f06b01080088bea67444e1789390e7c0335c86775502d58ec783d99c8ef4e06de235ed3dd4b0467f6f358d818c7d8989d43ec6d69fcbc8c32632d5a1b605e3fa8e41d695fcdcaa535936cd0157f9040dce362519803b908eafe838bb13216c885c6f93e9e8d5745607f0d062322085d6bdc760969149a8ff8dd9f5c18d9bfe2e6f63a06e17694cf1f67587c6fb70e9aebf90ffc528ca3b615ac7c9d4a21ea4f7c06f2e98fbbd90a859b8608bf9ea638e3a54289ce44c283110d0c45fa458de6251cd6e7baf71f80f12c8978340490fd90c92b81736ae902ed958e478dceae2835953d189c45d182aff02ea2be61b81d8e94430f041d638647b43e2fcb45fd512fbf5068b810011010001c2c06504180108000f050251d1f06b050900081095021b0c000a0910e7b484133a890a35e63407fe2ec88d6d1e6c9ce7553ece0cb2524747217bad29f251d33df84599ffcc900141a355abd62126800744068a5e05dc167056aa9205273dc7765a2ed49db15c2a83b8d6e6429c902136f1e12229086c1c10c0053242c2a4ae1930db58163387a48cad64607ff2153c320e42843dec28e3fce90e7399d63ac0affa2fee1f0adc0953c89eb3f46ef1d6c04328ed13b491669d5120a3782e3ffb7c69575fb77eebd108794f4dda9d34be2bae57e8e59ec8ebfda2f6f06104b2321be408ea146e2db482b00c5055c8618de36ac9716f80da2617e225556d0fce61b01c8cea2d1e0ea982c31711060ca370f2739366e1e708f38405d784b49d16a26cf62d152eae734327cec04d0451d1f07b010800d5af91c5e7c2fd8951c8d254eab0c97cdcb66822f868b79b78c366255059a68fd74ebca9adb9b970cd9e586690e6e0756705432306878c897b10a4b4ca0005966f99ac8fa4e6f9caf54bf8e53844544beee9872a7ac64c119cf1393d96e674254b661f61ee975633d0e8a8672531edb6bb8e211204e7754a9efa802342118eee850beea742bac95a3f706cc2024cf6037a308bb68162b2f53b9a6346a96e6d31871a2456186e24a1c7a82b82ac04afdfd57cd7fb9ba77a9c760d40b76a170f7be525e5fb6a9848cc726e806187710d9b190387df28700f321f988a392899f93815cc937f309129eb94d5299c5547cb2c085898e6639496e70d746c9d3fb9881d0011010001c2c06504180108000f050251d1f07b050900266305021b0c000a0910e7b484133a890a35bff207fd10dfe8c4a6ea1dd30568012b6fd6891a763c87ad0f7a1d112aad9e8e3239378a3b85588c235865bac2e614348cb4f216d7217f53b3ef48c192e0a4d31d64d7bfa5faccf21155965fa156e887056db644a05ad08a85cc6152d1377d9e37b46f4ff462bbe68ace2dc586ef90070314576c985d8037c2ba63f0a7dc17a62e15bd77e88bc61d9d00858979709f12304264a4cf4225c5cf86f12c8e19486cb9cdcc69f18f027e5f16f4ca8b50e28b3115eaff3a345acd21f624aef81f6ede515c1b55b26b84c1e32264754eab672d5489b287e7277ea855e0a5ff2aa9e8b8c76d579a964ec225255f4d57bf66639ccb34b64798846943e162a41096a7002ca21c7f56" const subkeyUsageHex = "988d04533a52bc010400d26af43085558f65b9e7dbc90cb9238015259aed5e954637adcfa2181548b2d0b60c65f1f42ec5081cbf1bc0a8aa4900acfb77070837c58f26012fbce297d70afe96e759ad63531f0037538e70dbf8e384569b9720d99d8eb39d8d0a2947233ed242436cb6ac7dfe74123354b3d0119b5c235d3dd9c9d6c004f8ffaf67ad8583001101000188b7041f010200210502533b8552170c8001ce094aa433f7040bb2ddf0be3893cb843d0fe70c020700000a0910a42704b92866382aa98404009d63d916a27543da4221c60087c33f1c44bec9998c5438018ed370cca4962876c748e94b73eb39c58eb698063f3fd6346d58dd2a11c0247934c4a9d71f24754f7468f96fb24c3e791dd2392b62f626148ad724189498cbf993db2df7c0cdc2d677c35da0f16cb16c9ce7c33b4de65a4a91b1d21a130ae9cc26067718910ef8e2b417556d627261203c756d627261407379642e65642e61753e88b80413010200220502533a52bc021b03060b090807030206150802090a0b0416020301021e01021780000a0910a42704b92866382a47840400c0c2bd04f5fca586de408b395b3c280a278259c93eaaa8b79a53b97003f8ed502a8a00446dd9947fb462677e4fcac0dac2f0701847d15130aadb6cd9e0705ea0cf5f92f129136c7be21a718d46c8e641eb7f044f2adae573e11ae423a0a9ca51324f03a8a2f34b91fa40c3cc764bee4dccadedb54c768ba0469b683ea53f1c29b88d04533a52bc01040099c92a5d6f8b744224da27bc2369127c35269b58bec179de6bbc038f749344222f85a31933224f26b70243c4e4b2d242f0c4777eaef7b5502f9dad6d8bf3aaeb471210674b74de2d7078af497d55f5cdad97c7bedfbc1b41e8065a97c9c3d344b21fc81d27723af8e374bc595da26ea242dccb6ae497be26eea57e563ed517e90011010001889f0418010200090502533a52bc021b0c000a0910a42704b92866382afa1403ff70284c2de8a043ff51d8d29772602fa98009b7861c540535f874f2c230af8caf5638151a636b21f8255003997ccd29747fdd06777bb24f9593bd7d98a3e887689bf902f999915fcc94625ae487e5d13e6616f89090ebc4fdc7eb5cad8943e4056995bb61c6af37f8043016876a958ec7ebf39c43d20d53b7f546cfa83e8d2604b88d04533b8283010400c0b529316dbdf58b4c54461e7e669dc11c09eb7f73819f178ccd4177b9182b91d138605fcf1e463262fabefa73f94a52b5e15d1904635541c7ea540f07050ce0fb51b73e6f88644cec86e91107c957a114f69554548a85295d2b70bd0b203992f76eb5d493d86d9eabcaa7ef3fc7db7e458438db3fcdb0ca1cc97c638439a9170011010001889f0418010200090502533b8283021b0c000a0910a42704b92866382adc6d0400cfff6258485a21675adb7a811c3e19ebca18851533f75a7ba317950b9997fda8d1a4c8c76505c08c04b6c2cc31dc704d33da36a21273f2b388a1a706f7c3378b66d887197a525936ed9a69acb57fe7f718133da85ec742001c5d1864e9c6c8ea1b94f1c3759cebfd93b18606066c063a63be86085b7e37bdbc65f9a915bf084bb901a204533b85cd110400aed3d2c52af2b38b5b67904b0ef73d6dd7aef86adb770e2b153cd22489654dcc91730892087bb9856ae2d9f7ed1eb48f214243fe86bfe87b349ebd7c30e630e49c07b21fdabf78b7a95c8b7f969e97e3d33f2e074c63552ba64a2ded7badc05ce0ea2be6d53485f6900c7860c7aa76560376ce963d7271b9b54638a4028b573f00a0d8854bfcdb04986141568046202192263b9b67350400aaa1049dbc7943141ef590a70dcb028d730371d92ea4863de715f7f0f16d168bd3dc266c2450457d46dcbbf0b071547e5fbee7700a820c3750b236335d8d5848adb3c0da010e998908dfd93d961480084f3aea20b247034f8988eccb5546efaa35a92d0451df3aaf1aee5aa36a4c4d462c760ecd9cebcabfbe1412b1f21450f203fd126687cd486496e971a87fd9e1a8a765fe654baa219a6871ab97768596ab05c26c1aeea8f1a2c72395a58dbc12ef9640d2b95784e974a4d2d5a9b17c25fedacfe551bda52602de8f6d2e48443f5dd1a2a2a8e6a5e70ecdb88cd6e766ad9745c7ee91d78cc55c3d06536b49c3fee6c3d0b6ff0fb2bf13a314f57c953b8f4d93bf88e70418010200090502533b85cd021b0200520910a42704b92866382a47200419110200060502533b85cd000a091042ce2c64bc0ba99214b2009e26b26852c8b13b10c35768e40e78fbbb48bd084100a0c79d9ea0844fa5853dd3c85ff3ecae6f2c9dd6c557aa04008bbbc964cd65b9b8299d4ebf31f41cc7264b8cf33a00e82c5af022331fac79efc9563a822497ba012953cefe2629f1242fcdcb911dbb2315985bab060bfd58261ace3c654bdbbe2e8ed27a46e836490145c86dc7bae15c011f7e1ffc33730109b9338cd9f483e7cef3d2f396aab5bd80efb6646d7e778270ee99d934d187dd98" const revokedKeyHex = "988d045331ce82010400c4fdf7b40a5477f206e6ee278eaef888ca73bf9128a9eef9f2f1ddb8b7b71a4c07cfa241f028a04edb405e4d916c61d6beabc333813dc7b484d2b3c52ee233c6a79b1eea4e9cc51596ba9cd5ac5aeb9df62d86ea051055b79d03f8a4fa9f38386f5bd17529138f3325d46801514ea9047977e0829ed728e68636802796801be10011010001889f04200102000905025331d0e3021d03000a0910a401d9f09a34f7c042aa040086631196405b7e6af71026b88e98012eab44aa9849f6ef3fa930c7c9f23deaedba9db1538830f8652fb7648ec3fcade8dbcbf9eaf428e83c6cbcc272201bfe2fbb90d41963397a7c0637a1a9d9448ce695d9790db2dc95433ad7be19eb3de72dacf1d6db82c3644c13eae2a3d072b99bb341debba012c5ce4006a7d34a1f4b94b444526567205265766f6b657220283c52656727732022424d204261726973746122204b657920262530305c303e5c29203c72656740626d626172697374612e636f2e61753e88b704130102002205025331ce82021b03060b090807030206150802090a0b0416020301021e01021780000a0910a401d9f09a34f7c0019c03f75edfbeb6a73e7225ad3cc52724e2872e04260d7daf0d693c170d8c4b243b8767bc7785763533febc62ec2600c30603c433c095453ede59ff2fcabeb84ce32e0ed9d5cf15ffcbc816202b64370d4d77c1e9077d74e94a16fb4fa2e5bec23a56d7a73cf275f91691ae1801a976fcde09e981a2f6327ac27ea1fecf3185df0d56889c04100102000605025331cfb5000a0910fe9645554e8266b64b4303fc084075396674fb6f778d302ac07cef6bc0b5d07b66b2004c44aef711cbac79617ef06d836b4957522d8772dd94bf41a2f4ac8b1ee6d70c57503f837445a74765a076d07b829b8111fc2a918423ddb817ead7ca2a613ef0bfb9c6b3562aec6c3cf3c75ef3031d81d95f6563e4cdcc9960bcb386c5d757b104fcca5fe11fc709df884604101102000605025331cfe7000a09107b15a67f0b3ddc0317f6009e360beea58f29c1d963a22b962b80788c3fa6c84e009d148cfde6b351469b8eae91187eff07ad9d08fcaab88d045331ce820104009f25e20a42b904f3fa555530fe5c46737cf7bd076c35a2a0d22b11f7e0b61a69320b768f4a80fe13980ce380d1cfc4a0cd8fbe2d2e2ef85416668b77208baa65bf973fe8e500e78cc310d7c8705cdb34328bf80e24f0385fce5845c33bc7943cf6b11b02348a23da0bf6428e57c05135f2dc6bd7c1ce325d666d5a5fd2fd5e410011010001889f04180102000905025331ce82021b0c000a0910a401d9f09a34f7c0418003fe34feafcbeaef348a800a0d908a7a6809cc7304017d820f70f0474d5e23cb17e38b67dc6dca282c6ca00961f4ec9edf2738d0f087b1d81e4871ef08e1798010863afb4eac4c44a376cb343be929c5be66a78cfd4456ae9ec6a99d97f4e1c3ff3583351db2147a65c0acef5c003fb544ab3a2e2dc4d43646f58b811a6c3a369d1f" const revokedSubkeyHex = "988d04533121f6010400aefc803a3e4bb1a61c86e8a86d2726c6a43e0079e9f2713f1fa017e9854c83877f4aced8e331d675c67ea83ddab80aacbfa0b9040bb12d96f5a3d6be09455e2a76546cbd21677537db941cab710216b6d24ec277ee0bd65b910f416737ed120f6b93a9d3b306245c8cfd8394606fdb462e5cf43c551438d2864506c63367fc890011010001b41d416c696365203c616c69636540626d626172697374612e636f2e61753e88bb041301020025021b03060b090807030206150802090a0b0416020301021e01021780050253312798021901000a09104ef7e4beccde97f015a803ff5448437780f63263b0df8442a995e7f76c221351a51edd06f2063d8166cf3157aada4923dfc44aa0f2a6a4da5cf83b7fe722ba8ab416c976e77c6b5682e7f1069026673bd0de56ba06fd5d7a9f177607f277d9b55ff940a638c3e68525c67517e2b3d976899b93ca267f705b3e5efad7d61220e96b618a4497eab8d04403d23f8846041011020006050253312910000a09107b15a67f0b3ddc03d96e009f50b6365d86c4be5d5e9d0ea42d5e56f5794c617700a0ab274e19c2827780016d23417ce89e0a2c0d987d889c04100102000605025331cf7a000a0910a401d9f09a34f7c0ee970400aca292f213041c9f3b3fc49148cbda9d84afee6183c8dd6c5ff2600b29482db5fecd4303797be1ee6d544a20a858080fec43412061c9a71fae4039fd58013b4ae341273e6c66ad4c7cdd9e68245bedb260562e7b166f2461a1032f2b38c0e0e5715fb3d1656979e052b55ca827a76f872b78a9fdae64bc298170bfcebedc1271b41a416c696365203c616c696365407379646973702e6f722e61753e88b804130102002205025331278b021b03060b090807030206150802090a0b0416020301021e01021780000a09104ef7e4beccde97f06a7003fa03c3af68d272ebc1fa08aa72a03b02189c26496a2833d90450801c4e42c5b5f51ad96ce2d2c9cef4b7c02a6a2fcf1412d6a2d486098eb762f5010a201819c17fd2888aec8eda20c65a3b75744de7ee5cc8ac7bfc470cbe3cb982720405a27a3c6a8c229cfe36905f881b02ed5680f6a8f05866efb9d6c5844897e631deb949ca8846041011020006050253312910000a09107b15a67f0b3ddc0347bc009f7fa35db59147469eb6f2c5aaf6428accb138b22800a0caa2f5f0874bacc5909c652a57a31beda65eddd5889c04100102000605025331cf7a000a0910a401d9f09a34f7c0316403ff46f2a5c101256627f16384d34a38fb47a6c88ba60506843e532d91614339fccae5f884a5741e7582ffaf292ba38ee10a270a05f139bde3814b6a077e8cd2db0f105ebea2a83af70d385f13b507fac2ad93ff79d84950328bb86f3074745a8b7f9b64990fb142e2a12976e27e8d09a28dc5621f957ac49091116da410ac3cbde1b88d04533121f6010400cbd785b56905e4192e2fb62a720727d43c4fa487821203cf72138b884b78b701093243e1d8c92a0248a6c0203a5a88693da34af357499abacaf4b3309c640797d03093870a323b4b6f37865f6eaa2838148a67df4735d43a90ca87942554cdf1c4a751b1e75f9fd4ce4e97e278d6c1c7ed59d33441df7d084f3f02beb68896c70011010001889f0418010200090502533121f6021b0c000a09104ef7e4beccde97f0b98b03fc0a5ccf6a372995835a2f5da33b282a7d612c0ab2a97f59cf9fff73e9110981aac2858c41399afa29624a7fd8a0add11654e3d882c0fd199e161bdad65e5e2548f7b68a437ea64293db1246e3011cbb94dc1bcdeaf0f2539bd88ff16d95547144d97cead6a8c5927660a91e6db0d16eb36b7b49a3525b54d1644e65599b032b7eb901a204533127a0110400bd3edaa09eff9809c4edc2c2a0ebe52e53c50a19c1e49ab78e6167bf61473bb08f2050d78a5cbbc6ed66aff7b42cd503f16b4a0b99fa1609681fca9b7ce2bbb1a5b3864d6cdda4d7ef7849d156d534dea30fb0efb9e4cf8959a2b2ce623905882d5430b995a15c3b9fe92906086788b891002924f94abe139b42cbbfaaabe42f00a0b65dc1a1ad27d798adbcb5b5ad02d2688c89477b03ff4eebb6f7b15a73b96a96bed201c0e5e4ea27e4c6e2dd1005b94d4b90137a5b1cf5e01c6226c070c4cc999938101578877ee76d296b9aab8246d57049caacf489e80a3f40589cade790a020b1ac146d6f7a6241184b8c7fcde680eae3188f5dcbe846d7f7bdad34f6fcfca08413e19c1d5df83fc7c7c627d493492e009c2f52a80400a2fe82de87136fd2e8845888c4431b032ba29d9a29a804277e31002a8201fb8591a3e55c7a0d0881496caf8b9fb07544a5a4879291d0dc026a0ea9e5bd88eb4aa4947bbd694b25012e208a250d65ddc6f1eea59d3aed3b4ec15fcab85e2afaa23a40ab1ef9ce3e11e1bc1c34a0e758e7aa64deb8739276df0af7d4121f834a9b88e70418010200090502533127a0021b02005209104ef7e4beccde97f047200419110200060502533127a0000a0910dbce4ee19529437fe045009c0b32f5ead48ee8a7e98fac0dea3d3e6c0e2c552500a0ad71fadc5007cfaf842d9b7db3335a8cdad15d3d1a6404009b08e2c68fe8f3b45c1bb72a4b3278cdf3012aa0f229883ad74aa1f6000bb90b18301b2f85372ca5d6b9bf478d235b733b1b197d19ccca48e9daf8e890cb64546b4ce1b178faccfff07003c172a2d4f5ebaba9f57153955f3f61a9b80a4f5cb959908f8b211b03b7026a8a82fc612bfedd3794969bcf458c4ce92be215a1176ab88d045331d144010400a5063000c5aaf34953c1aa3bfc95045b3aab9882b9a8027fecfe2142dc6b47ba8aca667399990244d513dd0504716908c17d92c65e74219e004f7b83fc125e575dd58efec3ab6dd22e3580106998523dea42ec75bf9aa111734c82df54630bebdff20fe981cfc36c76f865eb1c2fb62c9e85bc3a6e5015a361a2eb1c8431578d0011010001889f04280102000905025331d433021d03000a09104ef7e4beccde97f02e5503ff5e0630d1b65291f4882b6d40a29da4616bb5088717d469fbcc3648b8276de04a04988b1f1b9f3e18f52265c1f8b6c85861691c1a6b8a3a25a1809a0b32ad330aec5667cb4262f4450649184e8113849b05e5ad06a316ea80c001e8e71838190339a6e48bbde30647bcf245134b9a97fa875c1d83a9862cae87ffd7e2c4ce3a1b89013d04180102000905025331d144021b0200a809104ef7e4beccde97f09d2004190102000605025331d144000a0910677815e371c2fd23522203fe22ab62b8e7a151383cea3edd3a12995693911426f8ccf125e1f6426388c0010f88d9ca7da2224aee8d1c12135998640c5e1813d55a93df472faae75bef858457248db41b4505827590aeccf6f9eb646da7f980655dd3050c6897feddddaca90676dee856d66db8923477d251712bb9b3186b4d0114daf7d6b59272b53218dd1da94a03ff64006fcbe71211e5daecd9961fba66cdb6de3f914882c58ba5beddeba7dcb950c1156d7fba18c19ea880dccc800eae335deec34e3b84ac75ffa24864f782f87815cda1c0f634b3dd2fa67cea30811d21723d21d9551fa12ccbcfa62b6d3a15d01307b99925707992556d50065505b090aadb8579083a20fe65bd2a270da9b011" const missingCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- Charset: UTF-8 mQENBFMYynYBCACVOZ3/e8Bm2b9KH9QyIlHGo/i1bnkpqsgXj8tpJ2MIUOnXMMAY ztW7kKFLCmgVdLIC0vSoLA4yhaLcMojznh/2CcUglZeb6Ao8Gtelr//Rd5DRfPpG zqcfUo+m+eO1co2Orabw0tZDfGpg5p3AYl0hmxhUyYSc/xUq93xL1UJzBFgYXY54 QsM8dgeQgFseSk/YvdP5SMx1ev+eraUyiiUtWzWrWC1TdyRa5p4UZg6Rkoppf+WJ QrW6BWrhAtqATHc8ozV7uJjeONjUEq24roRc/OFZdmQQGK6yrzKnnbA6MdHhqpdo 9kWDcXYb7pSE63Lc+OBa5X2GUVvXJLS/3nrtABEBAAG0F2ludmFsaWQtc2lnbmlu Zy1zdWJrZXlziQEoBBMBAgASBQJTnKB5AhsBAgsHAhUIAh4BAAoJEO3UDQUIHpI/ dN4H/idX4FQ1LIZCnpHS/oxoWQWfpRgdKAEM0qCqjMgiipJeEwSQbqjTCynuh5/R JlODDz85ABR06aoF4l5ebGLQWFCYifPnJZ/Yf5OYcMGtb7dIbqxWVFL9iLMO/oDL ioI3dotjPui5e+2hI9pVH1UHB/bZ/GvMGo6Zg0XxLPolKQODMVjpjLAQ0YJ3spew RAmOGre6tIvbDsMBnm8qREt7a07cBJ6XK7xjxYaZHQBiHVxyEWDa6gyANONx8duW /fhQ/zDTnyVM/ik6VO0Ty9BhPpcEYLFwh5c1ilFari1ta3e6qKo6ZGa9YMk/REhu yBHd9nTkI+0CiQUmbckUiVjDKKe5AQ0EUxjKdgEIAJcXQeP+NmuciE99YcJoffxv 2gVLU4ZXBNHEaP0mgaJ1+tmMD089vUQAcyGRvw8jfsNsVZQIOAuRxY94aHQhIRHR bUzBN28ofo/AJJtfx62C15xt6fDKRV6HXYqAiygrHIpEoRLyiN69iScUsjIJeyFL C8wa72e8pSL6dkHoaV1N9ZH/xmrJ+k0vsgkQaAh9CzYufncDxcwkoP+aOlGtX1gP WwWoIbz0JwLEMPHBWvDDXQcQPQTYQyj+LGC9U6f9VZHN25E94subM1MjuT9OhN9Y MLfWaaIc5WyhLFyQKW2Upofn9wSFi8ubyBnv640Dfd0rVmaWv7LNTZpoZ/GbJAMA EQEAAYkBHwQYAQIACQUCU5ygeQIbAgAKCRDt1A0FCB6SP0zCB/sEzaVR38vpx+OQ MMynCBJrakiqDmUZv9xtplY7zsHSQjpd6xGflbU2n+iX99Q+nav0ETQZifNUEd4N 1ljDGQejcTyKD6Pkg6wBL3x9/RJye7Zszazm4+toJXZ8xJ3800+BtaPoI39akYJm +ijzbskvN0v/j5GOFJwQO0pPRAFtdHqRs9Kf4YanxhedB4dIUblzlIJuKsxFit6N lgGRblagG3Vv2eBszbxzPbJjHCgVLR3RmrVezKOsZjr/2i7X+xLWIR0uD3IN1qOW CXQxLBizEEmSNVNxsp7KPGTLnqO3bPtqFirxS9PJLIMPTPLNBY7ZYuPNTMqVIUWF 4artDmrG =7FfJ -----END PGP PUBLIC KEY BLOCK-----` const invalidCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBFMYynYBCACVOZ3/e8Bm2b9KH9QyIlHGo/i1bnkpqsgXj8tpJ2MIUOnXMMAY ztW7kKFLCmgVdLIC0vSoLA4yhaLcMojznh/2CcUglZeb6Ao8Gtelr//Rd5DRfPpG zqcfUo+m+eO1co2Orabw0tZDfGpg5p3AYl0hmxhUyYSc/xUq93xL1UJzBFgYXY54 QsM8dgeQgFseSk/YvdP5SMx1ev+eraUyiiUtWzWrWC1TdyRa5p4UZg6Rkoppf+WJ QrW6BWrhAtqATHc8ozV7uJjeONjUEq24roRc/OFZdmQQGK6yrzKnnbA6MdHhqpdo 9kWDcXYb7pSE63Lc+OBa5X2GUVvXJLS/3nrtABEBAAG0F2ludmFsaWQtc2lnbmlu Zy1zdWJrZXlziQEoBBMBAgASBQJTnKB5AhsBAgsHAhUIAh4BAAoJEO3UDQUIHpI/ dN4H/idX4FQ1LIZCnpHS/oxoWQWfpRgdKAEM0qCqjMgiipJeEwSQbqjTCynuh5/R JlODDz85ABR06aoF4l5ebGLQWFCYifPnJZ/Yf5OYcMGtb7dIbqxWVFL9iLMO/oDL ioI3dotjPui5e+2hI9pVH1UHB/bZ/GvMGo6Zg0XxLPolKQODMVjpjLAQ0YJ3spew RAmOGre6tIvbDsMBnm8qREt7a07cBJ6XK7xjxYaZHQBiHVxyEWDa6gyANONx8duW /fhQ/zDTnyVM/ik6VO0Ty9BhPpcEYLFwh5c1ilFari1ta3e6qKo6ZGa9YMk/REhu yBHd9nTkI+0CiQUmbckUiVjDKKe5AQ0EUxjKdgEIAIINDqlj7X6jYKc6DjwrOkjQ UIRWbQQar0LwmNilehmt70g5DCL1SYm9q4LcgJJ2Nhxj0/5qqsYib50OSWMcKeEe iRXpXzv1ObpcQtI5ithp0gR53YPXBib80t3bUzomQ5UyZqAAHzMp3BKC54/vUrSK FeRaxDzNLrCeyI00+LHNUtwghAqHvdNcsIf8VRumK8oTm3RmDh0TyjASWYbrt9c8 R1Um3zuoACOVy+mEIgIzsfHq0u7dwYwJB5+KeM7ZLx+HGIYdUYzHuUE1sLwVoELh +SHIGHI1HDicOjzqgajShuIjj5hZTyQySVprrsLKiXS6NEwHAP20+XjayJ/R3tEA EQEAAYkCPgQYAQIBKAUCU5ygeQIbAsBdIAQZAQIABgUCU5ygeQAKCRCpVlnFZmhO 52RJB/9uD1MSa0wjY6tHOIgquZcP3bHBvHmrHNMw9HR2wRCMO91ZkhrpdS3ZHtgb u3/55etj0FdvDo1tb8P8FGSVtO5Vcwf5APM8sbbqoi8L951Q3i7qt847lfhu6sMl w0LWFvPTOLHrliZHItPRjOltS1WAWfr2jUYhsU9ytaDAJmvf9DujxEOsN5G1YJep 54JCKVCkM/y585Zcnn+yxk/XwqoNQ0/iJUT9qRrZWvoeasxhl1PQcwihCwss44A+ YXaAt3hbk+6LEQuZoYS73yR3WHj+42tfm7YxRGeubXfgCEz/brETEWXMh4pe0vCL bfWrmfSPq2rDegYcAybxRQz0lF8PAAoJEO3UDQUIHpI/exkH/0vQfdHA8g/N4T6E i6b1CUVBAkvtdJpCATZjWPhXmShOw62gkDw306vHPilL4SCvEEi4KzG72zkp6VsB DSRcpxCwT4mHue+duiy53/aRMtSJ+vDfiV1Vhq+3sWAck/yUtfDU9/u4eFaiNok1 8/Gd7reyuZt5CiJnpdPpjCwelK21l2w7sHAnJF55ITXdOxI8oG3BRKufz0z5lyDY s2tXYmhhQIggdgelN8LbcMhWs/PBbtUr6uZlNJG2lW1yscD4aI529VjwJlCeo745 U7pO4eF05VViUJ2mmfoivL3tkhoTUWhx8xs8xCUcCg8DoEoSIhxtOmoTPR22Z9BL 6LCg2mg= =Dhm4 -----END PGP PUBLIC KEY BLOCK-----` const goodCrossSignatureKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mI0EVUqeVwEEAMufHRrMPWK3gyvi0O0tABCs/oON9zV9KDZlr1a1M91ShCSFwCPo 7r80PxdWVWcj0V5h50/CJYtpN3eE/mUIgW2z1uDYQF1OzrQ8ubrksfsJvpAhENom lTQEppv9mV8qhcM278teb7TX0pgrUHLYF5CfPdp1L957JLLXoQR/lwLVABEBAAG0 E2dvb2Qtc2lnbmluZy1zdWJrZXmIuAQTAQIAIgUCVUqeVwIbAwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AACgkQNRjL95IRWP69XQQAlH6+eyXJN4DZTLX78KGjHrsw 6FCvxxClEPtPUjcJy/1KCRQmtLAt9PbbA78dvgzjDeZMZqRAwdjyJhjyg/fkU2OH 7wq4ktjUu+dLcOBb+BFMEY+YjKZhf6EJuVfxoTVr5f82XNPbYHfTho9/OABKH6kv X70PaKZhbwnwij8Nts65AaIEVUqftREEAJ3WxZfqAX0bTDbQPf2CMT2IVMGDfhK7 GyubOZgDFFjwUJQvHNvsrbeGLZ0xOBumLINyPO1amIfTgJNm1iiWFWfmnHReGcDl y5mpYG60Mb79Whdcer7CMm3AqYh/dW4g6IB02NwZMKoUHo3PXmFLxMKXnWyJ0clw R0LI/Qn509yXAKDh1SO20rqrBM+EAP2c5bfI98kyNwQAi3buu94qo3RR1ZbvfxgW CKXDVm6N99jdZGNK7FbRifXqzJJDLcXZKLnstnC4Sd3uyfyf1uFhmDLIQRryn5m+ LBYHfDBPN3kdm7bsZDDq9GbTHiFZUfm/tChVKXWxkhpAmHhU/tH6GGzNSMXuIWSO aOz3Rqq0ED4NXyNKjdF9MiwD/i83S0ZBc0LmJYt4Z10jtH2B6tYdqnAK29uQaadx yZCX2scE09UIm32/w7pV77CKr1Cp/4OzAXS1tmFzQ+bX7DR+Gl8t4wxr57VeEMvl BGw4Vjh3X8//m3xynxycQU18Q1zJ6PkiMyPw2owZ/nss3hpSRKFJsxMLhW3fKmKr Ey2KiOcEGAECAAkFAlVKn7UCGwIAUgkQNRjL95IRWP5HIAQZEQIABgUCVUqftQAK CRD98VjDN10SqkWrAKDTpEY8D8HC02E/KVC5YUI01B30wgCgurpILm20kXEDCeHp C5pygfXw1DJrhAP+NyPJ4um/bU1I+rXaHHJYroYJs8YSweiNcwiHDQn0Engh/mVZ SqLHvbKh2dL/RXymC3+rjPvQf5cup9bPxNMa6WagdYBNAfzWGtkVISeaQW+cTEp/ MtgVijRGXR/lGLGETPg2X3Afwn9N9bLMBkBprKgbBqU7lpaoPupxT61bL70= =vtbN -----END PGP PUBLIC KEY BLOCK-----` const revokedUserIDKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBFsgO5EBCADhREPmcjsPkXe1z7ctvyWL0S7oa9JaoGZ9oPDHFDlQxd0qlX2e DZJZDg0qYvVixmaULIulApq1puEsaJCn3lHUbHlb4PYKwLEywYXM28JN91KtLsz/ uaEX2KC5WqeP40utmzkNLq+oRX/xnRMgwbO7yUNVG2UlEa6eI+xOXO3YtLdmJMBW ClQ066ZnOIzEo1JxnIwha1CDBMWLLfOLrg6l8InUqaXbtEBbnaIYO6fXVXELUjkx nmk7t/QOk0tXCy8muH9UDqJkwDUESY2l79XwBAcx9riX8vY7vwC34pm22fAUVLCJ x1SJx0J8bkeNp38jKM2Zd9SUQqSbfBopQ4pPABEBAAG0I0dvbGFuZyBHb3BoZXIg PG5vLXJlcGx5QGdvbGFuZy5jb20+iQFUBBMBCgA+FiEE5Ik5JLcNx6l6rZfw1oFy 9I6cUoMFAlsgO5ECGwMFCQPCZwAFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQ 1oFy9I6cUoMIkwf8DNPeD23i4jRwd/pylbvxwZintZl1fSwTJW1xcOa1emXaEtX2 depuqhP04fjlRQGfsYAQh7X9jOJxAHjTmhqFBi5sD7QvKU00cPFYbJ/JTx0B41bl aXnSbGhRPh63QtEZL7ACAs+shwvvojJqysx7kyVRu0EW2wqjXdHwR/SJO6nhNBa2 DXzSiOU/SUA42mmG+5kjF8Aabq9wPwT9wjraHShEweNerNMmOqJExBOy3yFeyDpa XwEZFzBfOKoxFNkIaVf5GSdIUGhFECkGvBMB935khftmgR8APxdU4BE7XrXexFJU 8RCuPXonm4WQOwTWR0vQg64pb2WKAzZ8HhwTGbQiR29sYW5nIEdvcGhlciA8cmV2 b2tlZEBnb2xhbmcuY29tPokBNgQwAQoAIBYhBOSJOSS3Dcepeq2X8NaBcvSOnFKD BQJbIDv3Ah0AAAoJENaBcvSOnFKDfWMIAKhI/Tvu3h8fSUxp/gSAcduT6bC1JttG 0lYQ5ilKB/58lBUA5CO3ZrKDKlzW3M8VEcvohVaqeTMKeoQd5rCZq8KxHn/KvN6N s85REfXfniCKfAbnGgVXX3kDmZ1g63pkxrFu0fDZjVDXC6vy+I0sGyI/Inro0Pzb tvn0QCsxjapKK15BtmSrpgHgzVqVg0cUp8vqZeKFxarYbYB2idtGRci4b9tObOK0 BSTVFy26+I/mrFGaPrySYiy2Kz5NMEcRhjmTxJ8jSwEr2O2sUR0yjbgUAXbTxDVE /jg5fQZ1ACvBRQnB7LvMHcInbzjyeTM3FazkkSYQD6b97+dkWwb1iWG5AQ0EWyA7 kQEIALkg04REDZo1JgdYV4x8HJKFS4xAYWbIva1ZPqvDNmZRUbQZR2+gpJGEwn7z VofGvnOYiGW56AS5j31SFf5kro1+1bZQ5iOONBng08OOo58/l1hRseIIVGB5TGSa PCdChKKHreJI6hS3mShxH6hdfFtiZuB45rwoaArMMsYcjaezLwKeLc396cpUwwcZ snLUNd1Xu5EWEF2OdFkZ2a1qYdxBvAYdQf4+1Nr+NRIx1u1NS9c8jp3PuMOkrQEi bNtc1v6v0Jy52mKLG4y7mC/erIkvkQBYJdxPaP7LZVaPYc3/xskcyijrJ/5ufoD8 K71/ShtsZUXSQn9jlRaYR0EbojMAEQEAAYkBPAQYAQoAJhYhBOSJOSS3Dcepeq2X 8NaBcvSOnFKDBQJbIDuRAhsMBQkDwmcAAAoJENaBcvSOnFKDkFMIAIt64bVZ8x7+ TitH1bR4pgcNkaKmgKoZz6FXu80+SnbuEt2NnDyf1cLOSimSTILpwLIuv9Uft5Pb OraQbYt3xi9yrqdKqGLv80bxqK0NuryNkvh9yyx5WoG1iKqMj9/FjGghuPrRaT4l QinNAghGVkEy1+aXGFrG2DsOC1FFI51CC2WVTzZ5RwR2GpiNRfESsU1rZAUqf/2V yJl9bD5R4SUNy8oQmhOxi+gbhD4Ao34e4W0ilibslI/uawvCiOwlu5NGd8zv5n+U heiQvzkApQup5c+BhH5zFDFdKJ2CBByxw9+7QjMFI/wgLixKuE0Ob2kAokXf7RlB 7qTZOahrETw= =IKnw -----END PGP PUBLIC KEY BLOCK-----` const keyWithFirstUserIDRevoked = `-----BEGIN PGP PUBLIC KEY BLOCK----- Version: OpenPGP.js v4.10.10 Comment: https://openpgpjs.org xsBNBFsgO5EBCADhREPmcjsPkXe1z7ctvyWL0S7oa9JaoGZ9oPDHFDlQxd0q lX2eDZJZDg0qYvVixmaULIulApq1puEsaJCn3lHUbHlb4PYKwLEywYXM28JN 91KtLsz/uaEX2KC5WqeP40utmzkNLq+oRX/xnRMgwbO7yUNVG2UlEa6eI+xO XO3YtLdmJMBWClQ066ZnOIzEo1JxnIwha1CDBMWLLfOLrg6l8InUqaXbtEBb naIYO6fXVXELUjkxnmk7t/QOk0tXCy8muH9UDqJkwDUESY2l79XwBAcx9riX 8vY7vwC34pm22fAUVLCJx1SJx0J8bkeNp38jKM2Zd9SUQqSbfBopQ4pPABEB AAHNIkdvbGFuZyBHb3BoZXIgPHJldm9rZWRAZ29sYW5nLmNvbT7CwI0EMAEK ACAWIQTkiTkktw3HqXqtl/DWgXL0jpxSgwUCWyA79wIdAAAhCRDWgXL0jpxS gxYhBOSJOSS3Dcepeq2X8NaBcvSOnFKDfWMIAKhI/Tvu3h8fSUxp/gSAcduT 6bC1JttG0lYQ5ilKB/58lBUA5CO3ZrKDKlzW3M8VEcvohVaqeTMKeoQd5rCZ q8KxHn/KvN6Ns85REfXfniCKfAbnGgVXX3kDmZ1g63pkxrFu0fDZjVDXC6vy +I0sGyI/Inro0Pzbtvn0QCsxjapKK15BtmSrpgHgzVqVg0cUp8vqZeKFxarY bYB2idtGRci4b9tObOK0BSTVFy26+I/mrFGaPrySYiy2Kz5NMEcRhjmTxJ8j SwEr2O2sUR0yjbgUAXbTxDVE/jg5fQZ1ACvBRQnB7LvMHcInbzjyeTM3Fazk kSYQD6b97+dkWwb1iWHNI0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFu Zy5jb20+wsCrBBMBCgA+FiEE5Ik5JLcNx6l6rZfw1oFy9I6cUoMFAlsgO5EC GwMFCQPCZwAFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AAIQkQ1oFy9I6cUoMW IQTkiTkktw3HqXqtl/DWgXL0jpxSgwiTB/wM094PbeLiNHB3+nKVu/HBmKe1 mXV9LBMlbXFw5rV6ZdoS1fZ16m6qE/Th+OVFAZ+xgBCHtf2M4nEAeNOaGoUG LmwPtC8pTTRw8Vhsn8lPHQHjVuVpedJsaFE+HrdC0RkvsAICz6yHC++iMmrK zHuTJVG7QRbbCqNd0fBH9Ik7qeE0FrYNfNKI5T9JQDjaaYb7mSMXwBpur3A/ BP3COtodKETB416s0yY6okTEE7LfIV7IOlpfARkXMF84qjEU2QhpV/kZJ0hQ aEUQKQa8EwH3fmSF+2aBHwA/F1TgETtetd7EUlTxEK49eiebhZA7BNZHS9CD rilvZYoDNnweHBMZzsBNBFsgO5EBCAC5INOERA2aNSYHWFeMfByShUuMQGFm yL2tWT6rwzZmUVG0GUdvoKSRhMJ+81aHxr5zmIhluegEuY99UhX+ZK6NftW2 UOYjjjQZ4NPDjqOfP5dYUbHiCFRgeUxkmjwnQoSih63iSOoUt5kocR+oXXxb YmbgeOa8KGgKzDLGHI2nsy8Cni3N/enKVMMHGbJy1DXdV7uRFhBdjnRZGdmt amHcQbwGHUH+PtTa/jUSMdbtTUvXPI6dz7jDpK0BImzbXNb+r9CcudpiixuM u5gv3qyJL5EAWCXcT2j+y2VWj2HN/8bJHMoo6yf+bn6A/Cu9f0obbGVF0kJ/ Y5UWmEdBG6IzABEBAAHCwJMEGAEKACYWIQTkiTkktw3HqXqtl/DWgXL0jpxS gwUCWyA7kQIbDAUJA8JnAAAhCRDWgXL0jpxSgxYhBOSJOSS3Dcepeq2X8NaB cvSOnFKDkFMIAIt64bVZ8x7+TitH1bR4pgcNkaKmgKoZz6FXu80+SnbuEt2N nDyf1cLOSimSTILpwLIuv9Uft5PbOraQbYt3xi9yrqdKqGLv80bxqK0NuryN kvh9yyx5WoG1iKqMj9/FjGghuPrRaT4lQinNAghGVkEy1+aXGFrG2DsOC1FF I51CC2WVTzZ5RwR2GpiNRfESsU1rZAUqf/2VyJl9bD5R4SUNy8oQmhOxi+gb hD4Ao34e4W0ilibslI/uawvCiOwlu5NGd8zv5n+UheiQvzkApQup5c+BhH5z FDFdKJ2CBByxw9+7QjMFI/wgLixKuE0Ob2kAokXf7RlB7qTZOahrETw= =+2T8 -----END PGP PUBLIC KEY BLOCK----- ` const keyWithOnlyUserIDRevoked = `-----BEGIN PGP PUBLIC KEY BLOCK----- mDMEYYwB7RYJKwYBBAHaRw8BAQdARimqhPPzyGAXmfQJjcqM1QVPzLtURJSzNVll JV4tEaW0KVJldm9rZWQgUHJpbWFyeSBVc2VyIElEIDxyZXZva2VkQGtleS5jb20+ iHgEMBYIACAWIQSpyJZAXYqVEFkjyKutFcS0yeB0LQUCYYwCtgIdAAAKCRCtFcS0 yeB0LbSsAQD8OYMaaBjrdzzpwIkP1stgmPd4/kzN/ZG28Ywl6a5F5QEA5Xg7aq4e /t6Fsb4F5iqB956kSPe6YJrikobD/tBbMwSIkAQTFggAOBYhBKnIlkBdipUQWSPI q60VxLTJ4HQtBQJhjAHtAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEK0V xLTJ4HQtBaoBAPZL7luTCji+Tqhn7XNfFE/0QIahCt8k9wfO1cGlB3inAQDf8Tzw ZGR5fNluUcNoVxQT7bUSFStbaGo3k0BaOYPbCLg4BGGMAe0SCisGAQQBl1UBBQEB B0DLwSpveSrbIO/IVZD13yrs1XuB3FURZUnafGrRq7+jUAMBCAeIeAQYFggAIBYh BKnIlkBdipUQWSPIq60VxLTJ4HQtBQJhjAHtAhsMAAoJEK0VxLTJ4HQtZ1oA/j9u 8+p3xTNzsmabTL6BkNbMeB/RUKCrlm6woM6AV+vxAQCcXTn3JC2sNoNrLoXuVzaA mcG3/TwG5GSQUUPkrDsGDA== =mFWy -----END PGP PUBLIC KEY BLOCK----- ` const keyWithSubKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- mI0EWyKwKQEEALwXhKBnyaaNFeK3ljfc/qn9X/QFw+28EUfgZPHjRmHubuXLE2uR s3ZoSXY2z7Dkv+NyHYMt8p+X8q5fR7JvUjK2XbPyKoiJVnHINll83yl67DaWfKNL EjNoO0kIfbXfCkZ7EG6DL+iKtuxniGTcnGT47e+HJSqb/STpLMnWwXjBABEBAAG0 I0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFuZy5jb20+iM4EEwEKADgWIQQ/ lRafP/p9PytHbwxMvYJsOQdOOAUCWyKwKQIbAwULCQgHAwUVCgkICwUWAgMBAAIe AQIXgAAKCRBMvYJsOQdOOOsFBAC62mXww8XuqvYLcVOvHkWLT6mhxrQOJXnlfpn7 2uBV9CMhoG/Ycd43NONsJrB95Apr9TDIqWnVszNbqPCuBhZQSGLdbiDKjxnCWBk0 69qv4RNtkpOhYB7jK4s8F5oQZqId6JasT/PmJTH92mhBYhhTQr0GYFuPX2UJdkw9 Sn9C67iNBFsisDUBBAC3A+Yo9lgCnxi/pfskyLrweYif6kIXWLAtLTsM6g/6jt7b wTrknuCPyTv0QKGXsAEe/cK/Xq3HvX9WfXPGIHc/X56ZIsHQ+RLowbZV/Lhok1IW FAuQm8axr/by80cRwFnzhfPc/ukkAq2Qyj4hLsGblu6mxeAhzcp8aqmWOO2H9QAR AQABiLYEKAEKACAWIQQ/lRafP/p9PytHbwxMvYJsOQdOOAUCWyK16gIdAAAKCRBM vYJsOQdOOB1vA/4u4uLONsE+2GVOyBsHyy7uTdkuxaR9b54A/cz6jT/tzUbeIzgx 22neWhgvIEghnUZd0vEyK9k1wy5vbDlEo6nKzHso32N1QExGr5upRERAxweDxGOj 7luDwNypI7QcifE64lS/JmlnunwRCdRWMKc0Fp+7jtRc5mpwyHN/Suf5RokBagQY AQoAIBYhBD+VFp8/+n0/K0dvDEy9gmw5B044BQJbIrA1AhsCAL8JEEy9gmw5B044 tCAEGQEKAB0WIQSNdnkaWY6t62iX336UXbGvYdhXJwUCWyKwNQAKCRCUXbGvYdhX JxJSA/9fCPHP6sUtGF1o3G1a3yvOUDGr1JWcct9U+QpbCt1mZoNopCNDDQAJvDWl mvDgHfuogmgNJRjOMznvahbF+wpTXmB7LS0SK412gJzl1fFIpK4bgnhu0TwxNsO1 8UkCZWqxRMgcNUn9z6XWONK8dgt5JNvHSHrwF4CxxwjL23AAtK+FA/UUoi3U4kbC 0XnSr1Sl+mrzQi1+H7xyMe7zjqe+gGANtskqexHzwWPUJCPZ5qpIa2l8ghiUim6b 4ymJ+N8/T8Yva1FaPEqfMzzqJr8McYFm0URioXJPvOAlRxdHPteZ0qUopt/Jawxl Xt6B9h1YpeLoJwjwsvbi98UTRs0jXwoY =3fWu -----END PGP PUBLIC KEY BLOCK-----` const keyWithSubKeyAndBadSelfSigOrder = `-----BEGIN PGP PUBLIC KEY BLOCK----- mI0EWyLLDQEEAOqIOpJ/ha1OYAGduu9tS3rBz5vyjbNgJO4sFveEM0mgsHQ0X9/L plonW+d0gRoO1dhJ8QICjDAc6+cna1DE3tEb5m6JtQ30teLZuqrR398Cf6w7NNVz r3lrlmnH9JaKRuXl7tZciwyovneBfZVCdtsRZjaLI1uMQCz/BToiYe3DABEBAAG0 I0dvbGFuZyBHb3BoZXIgPG5vLXJlcGx5QGdvbGFuZy5jb20+iM4EEwEKADgWIQRZ sixZOfQcZdW0wUqmgmdsv1O9xgUCWyLLDQIbAwULCQgHAwUVCgkICwUWAgMBAAIe AQIXgAAKCRCmgmdsv1O9xql2A/4pix98NxjhdsXtazA9agpAKeADf9tG4Za27Gj+ 3DCww/E4iP2X35jZimSm/30QRB6j08uGCqd9vXkkJxtOt63y/IpVOtWX6vMWSTUm k8xKkaYMP0/IzKNJ1qC/qYEUYpwERBKg9Z+k99E2Ql4kRHdxXUHq6OzY79H18Y+s GdeM/riNBFsiyxsBBAC54Pxg/8ZWaZX1phGdwfe5mek27SOYpC0AxIDCSOdMeQ6G HPk38pywl1d+S+KmF/F4Tdi+kWro62O4eG2uc/T8JQuRDUhSjX0Qa51gPzJrUOVT CFyUkiZ/3ZDhtXkgfuso8ua2ChBgR9Ngr4v43tSqa9y6AK7v0qjxD1x+xMrjXQAR AQABiQFxBBgBCgAmAhsCFiEEWbIsWTn0HGXVtMFKpoJnbL9TvcYFAlsizTIFCQAN MRcAv7QgBBkBCgAdFiEEJcoVUVJIk5RWj1c/o62jUpRPICQFAlsiyxsACgkQo62j UpRPICQq5gQApoWIigZxXFoM0uw4uJBS5JFZtirTANvirZV5RhndwHeMN6JttaBS YnjyA4+n1D+zB2VqliD2QrsX12KJN6rGOehCtEIClQ1Hodo9nC6kMzzAwW1O8bZs nRJmXV+bsvD4sidLZLjdwOVa3Cxh6pvq4Uur6a7/UYx121hEY0Qx0s8JEKaCZ2y/ U73GGi0D/i20VW8AWYAPACm2zMlzExKTOAV01YTQH/3vW0WLrOse53WcIVZga6es HuO4So0SOEAvxKMe5HpRIu2dJxTvd99Bo9xk9xJU0AoFrO0vNCRnL+5y68xMlODK lEw5/kl0jeaTBp6xX0HDQOEVOpPGUwWV4Ij2EnvfNDXaE1vK1kffiQFrBBgBCgAg AhsCFiEEWbIsWTn0HGXVtMFKpoJnbL9TvcYFAlsi0AYAv7QgBBkBCgAdFiEEJcoV UVJIk5RWj1c/o62jUpRPICQFAlsiyxsACgkQo62jUpRPICQq5gQApoWIigZxXFoM 0uw4uJBS5JFZtirTANvirZV5RhndwHeMN6JttaBSYnjyA4+n1D+zB2VqliD2QrsX 12KJN6rGOehCtEIClQ1Hodo9nC6kMzzAwW1O8bZsnRJmXV+bsvD4sidLZLjdwOVa 3Cxh6pvq4Uur6a7/UYx121hEY0Qx0s8JEKaCZ2y/U73GRl0EAJokkXmy4zKDHWWi wvK9gi2gQgRkVnu2AiONxJb5vjeLhM/07BRmH6K1o+w3fOeEQp4FjXj1eQ5fPSM6 Hhwx2CTl9SDnPSBMiKXsEFRkmwQ2AAsQZLmQZvKBkLZYeBiwf+IY621eYDhZfo+G 1dh1WoUCyREZsJQg2YoIpWIcvw+a =bNRo -----END PGP PUBLIC KEY BLOCK----- ` const onlySubkeyNoPrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQCVBFggvocBBAC7vBsHn7MKmS6IiiZNTXdciplVgS9cqVd+RTdIAoyNTcsiV1H0 GQ3QtodOPeDlQDNoqinqaobd7R9g3m3hS53Nor7yBZkCWQ5x9v9JxRtoAq0sklh1 I1X2zEqZk2l6YrfBF/64zWrhjnW3j23szkrAIVu0faQXbQ4z56tmZrw11wARAQAB /gdlAkdOVQG0CUdOVSBEdW1teYi4BBMBAgAiBQJYIL6HAhsDBgsJCAcDAgYVCAIJ CgsEFgIDAQIeAQIXgAAKCRCd1xxWp1CYAnjGA/9synn6ZXJUKAXQzySgmCZvCIbl rqBfEpxwLG4Q/lONhm5vthAE0z49I8hj5Gc5e2tLYUtq0o0OCRdCrYHa/efOYWpJ 6RsK99bePOisVzmOABLIgZkcr022kHoMCmkPgv9CUGKP1yqbGl+zzAwQfUjRUmvD ZIcWLHi2ge4GzPMPi50B2ARYIL6cAQQAxWHnicKejAFcFcF1/3gUSgSH7eiwuBPX M7vDdgGzlve1o1jbV4tzrjN9jsCl6r0nJPDMfBSzgLr1auNTRG6HpJ4abcOx86ED Ad+avDcQPZb7z3dPhH/gb2lQejZsHh7bbeOS8WMSzHV3RqCLd8J/xwWPNR5zKn1f yp4IGfopidMAEQEAAQAD+wQOelnR82+dxyM2IFmZdOB9wSXQeCVOvxSaNMh6Y3lk UOOkO8Nlic4x0ungQRvjoRs4wBmCuwFK/MII6jKui0B7dn/NDf51i7rGdNGuJXDH e676By1sEY/NGkc74jr74T+5GWNU64W0vkpfgVmjSAzsUtpmhJMXsc7beBhJdnVl AgDKCb8hZqj1alcdmLoNvb7ibA3K/V8J462CPD7bMySPBa/uayoFhNxibpoXml2r oOtHa5izF3b0/9JY97F6rqkdAgD6GdTJ+xmlCoz1Sewoif1I6krq6xoa7gOYpIXo UL1Afr+LiJeyAnF/M34j/kjIVmPanZJjry0kkjHE5ILjH3uvAf4/6n9np+Th8ujS YDCIzKwR7639+H+qccOaddCep8Y6KGUMVdD/vTKEx1rMtK+hK/CDkkkxnFslifMJ kqoqv3WUqCWJAT0EGAECAAkFAlggvpwCGwIAqAkQndccVqdQmAKdIAQZAQIABgUC WCC+nAAKCRDmGUholQPwvQk+A/9latnSsR5s5/1A9TFki11GzSEnfLbx46FYOdkW n3YBxZoPQGxNA1vIn8GmouxZInw9CF4jdOJxEdzLlYQJ9YLTLtN5tQEMl/19/bR8 /qLacAZ9IOezYRWxxZsyn6//jfl7A0Y+FV59d4YajKkEfItcIIlgVBSW6T+TNQT3 R+EH5HJ/A/4/AN0CmBhhE2vGzTnVU0VPrE4V64pjn1rufFdclgpixNZCuuqpKpoE VVHn6mnBf4njKjZrAGPs5kfQ+H4NsM7v3Zz4yV6deu9FZc4O6E+V1WJ38rO8eBix 7G2jko106CC6vtxsCPVIzY7aaG3H5pjRtomw+pX7SzrQ7FUg2PGumg== =F/T0 -----END PGP PRIVATE KEY BLOCK-----` const ecdsaPrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- xaUEX1KsSRMIKoZIzj0DAQcCAwTpYqJsnJiFhKKh+8TulWD+lVmerBFNS+Ii B+nlG3T0xQQ4Sy5eIjJ0CExIQQzi3EElF/Z2l4F3WC5taFA11NgA/gkDCHSS PThf1M2K4LN8F1MRcvR+sb7i0nH55ojkwuVB1DE6jqIT9m9i+mX1tzjSAS+6 lPQiweCJvG7xTC7Hs3AzRapf/r1At4TB+v+5G2/CKynNFEJpbGwgPGJpbGxA aG9tZS5jb20+wncEEBMIAB8FAl9SrEkGCwkHCAMCBBUICgIDFgIBAhkBAhsD Ah4BAAoJEMpwT3+q3+xqw5UBAMebZN9isEZ1ML+R/jWAAWMwa/knMugrEZ1v Bl9+ZwM0AQCZdf80/wYY4Nve01qSRFv8OmKswLli3TvDv6FKc4cLz8epBF9S rEkSCCqGSM49AwEHAgMEAjKnT9b5wY2bf9TpAV3d7OUfPOxKj9c4VzeVzSrH AtQgo/MuI1cdYVURicV4i76DNjFhQHQFTk7BrC+C2u1yqQMBCAf+CQMIHImA iYfzQtjgQWSFZYUkCFpbbwhNF0ch+3HNaZkaHCnZRIsWsRnc6FCb6lRQyK9+ Dq59kHlduE5QgY40894jfmP2JdJHU6nBdYrivbEdbMJhBBgTCAAJBQJfUqxJ AhsMAAoJEMpwT3+q3+xqUI0BAMykhV08kQ4Ip9Qlbss6Jdufv7YrU0Vd5hou b5TmiPd0APoDBh3qIic+aLLUcAuG3+Gt1P1AbUlmqV61ozn1WfHxfw== =KLN8 -----END PGP PRIVATE KEY BLOCK-----` const dsaPrivateKeyWithElGamalSubkey = `-----BEGIN PGP PRIVATE KEY BLOCK----- lQOBBF9/MLsRCACeaF6BI0jTgDAs86t8/kXPfwlPvR2MCYzB0BCqAdcq1hV/GTYd oNmJRna/ZJfsI/vf+d8Nv+EYOQkPheFS1MJVBitkAXjQPgm8i1tQWen1FCWZxqGk /vwZYF4yo8GhZ+Wxi3w09W9Cp9QM/CTmyE1Xe7wpPBGe+oD+me8Zxjyt8JBS4Qx+ gvWbfHxfHnggh4pz7U8QkItlLsBNQEdX4R5+zwRN66g2ZSX/shaa/EkVnihUhD7r njP9I51ORWucTQD6OvgooaNQZCkQ/Se9TzdakwWKS2XSIFXiY/e2E5ZgKI/pfKDU iA/KessxddPb7nP/05OIJqg9AoDrD4vmehLzAQD+zsUS3LDU1m9/cG4LMsQbT2VK Te4HqbGIAle+eu/asQf8DDJMrbZpiJZvADum9j0TJ0oep6VdMbzo9RSDKvlLKT9m kG63H8oDWnCZm1a+HmGq9YIX+JHWmsLXXsFLeEouLzHO+mZo0X28eji3V2T87hyR MmUM0wFo4k7jK8uVmkDXv3XwNp2uByWxUKZd7EnWmcEZWqIiexJ7XpCS0Pg3tRaI zxve0SRe/dxfUPnTk/9KQ9hS6DWroBKquL182zx1Fggh4LIWWE2zq+UYn8BI0E8A rmIDFJdF8ymFQGRrEy6g79NnkPmkrZWsgMRYY65P6v4zLVmqohJKkpm3/Uxa6QAP CCoPh/JTOvPeCP2bOJH8z4Z9Py3ouMIjofQW8sXqRgf/RIHbh0KsINHrwwZ4gVIr MK3RofpaYxw1ztPIWb4cMWoWZHH1Pxh7ggTGSBpAhKXkiWw2Rxat8QF5aA7e962c bLvVv8dqsPrD/RnVJHag89cbPTzjn7gY9elE8EM8ithV3oQkwHTr4avYlpDZsgNd hUW3YgRwGo31tdzxoG04AcpV2t+07P8XMPr9hsfWs4rHohXPi38Hseu1Ji+dBoWQ 3+1w/HH3o55s+jy4Ruaz78AIrjbmAJq+6rA2mIcCgrhw3DnzuwQAKeBvSeqn9zfS ZC812osMBVmkycwelpaIh64WZ0vWL3GvdXDctV2kXM+qVpDTLEny0LuiXxrwCKQL Ev4HAwK9uQBcreDEEud7pfRb8EYP5lzO2ZA7RaIvje6EWAGBvJGMRT0QQE5SGqc7 Fw5geigBdt+vVyRuNNhg3c2fdn/OBQaYu0J/8AiOogG8EaM8tCFlbGdhbWFsQGRz YS5jb20gPGVsZ2FtYWxAZHNhLmNvbT6IkAQTEQgAOBYhBI+gnfiHQxB35/Dp0XAQ aE/rsWC5BQJffzC7AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEHAQaE/r sWC5A4EA/0GcJmyPtN+Klc7b9sVT3JgKTRnB/URxOJfYJofP0hZLAQCkqyMO+adV JvbgDH0zaITQWZSSXPqpgMpCA6juTrDsd50CawRffzC7EAgAxFFFSAAEQzWTgKU5 EBtpxxoPzHqcChawTHRxHxjcELXzmUBS5PzfA1HXSPnNqK/x3Ut5ycC3CsW41Fnt Gm3706Wu9VFbFZVn55F9lPiplUo61n5pqMvOr1gmuQsdXiTa0t5FRa4TZ2VSiHFw vdAVSPTUsT4ZxJ1rPyFYRtq1n3pQcvdZowd07r0JnzTMjLLMFYCKhwIowoOC4zqJ iB8enjwOlpaqBATRm9xpVF7SJkroPF6/B1vdhj7E3c1aJyHlo0PYBAg756sSHWHg UuLyUQ4TA0hcCVenn/L/aSY2LnbdZB1EBhlYjA7dTCgwIqsQhfQmPkjz6g64A7+Y HbbrLwADBQgAk14QIEQ+J/VHetpQV/jt2pNsFK1kVK7mXK0spTExaC2yj2sXlHjL Ie3bO5T/KqmIaBEB5db5fA5xK9cZt79qrQHDKsEqUetUeMUWLBx77zBsus3grIgy bwDZKseRzQ715pwxquxQlScGoDIBKEh08HpwHkq140eIj3w+MAIfndaZaSCNaxaP Snky7BQmJ7Wc7qrIwoQP6yrnUqyW2yNi81nJYUhxjChqaFSlwzLs/iNGryBKo0ic BqVIRjikKHBlwBng6WyrltQo/Vt9GG8w+lqaAVXbJRlaBZJUR+2NKi/YhP3qQse3 v8fi4kns0gh5LK+2C01RvdX4T49QSExuIf4HAwLJqYIGwadA2uem5v7/765ZtFWV oL0iZ0ueTJDby4wTFDpLVzzDi/uVcB0ZRFrGOp7w6OYcNYTtV8n3xmli2Q5Trw0c wZVzvg+ABKWiv7faBjMczIFF8y6WZKOIeAQYEQgAIBYhBI+gnfiHQxB35/Dp0XAQ aE/rsWC5BQJffzC7AhsMAAoJEHAQaE/rsWC5ZmIA/jhS4r4lClbvjuPWt0Yqdn7R fss2SPMYvMrrDh42aE0OAQD8xn4G6CN8UtW9xihXOY6FpxiJ/sMc2VaneeUd34oa 4g== =XZm8 -----END PGP PRIVATE KEY BLOCK-----` // https://tests.sequoia-pgp.org/#Certificate_expiration // P _ U p const expiringPrimaryUIDKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- xsDNBF2lnPIBDAC5cL9PQoQLTMuhjbYvb4Ncuuo0bfmgPRFywX53jPhoFf4Zg6mv /seOXpgecTdOcVttfzC8ycIKrt3aQTiwOG/ctaR4Bk/t6ayNFfdUNxHWk4WCKzdz /56fW2O0F23qIRd8UUJp5IIlN4RDdRCtdhVQIAuzvp2oVy/LaS2kxQoKvph/5pQ/ 5whqsyroEWDJoSV0yOb25B/iwk/pLUFoyhDG9bj0kIzDxrEqW+7Ba8nocQlecMF3 X5KMN5kp2zraLv9dlBBpWW43XktjcCZgMy20SouraVma8Je/ECwUWYUiAZxLIlMv 9CurEOtxUw6N3RdOtLmYZS9uEnn5y1UkF88o8Nku890uk6BrewFzJyLAx5wRZ4F0 qV/yq36UWQ0JB/AUGhHVPdFf6pl6eaxBwT5GXvbBUibtf8YI2og5RsgTWtXfU7eb SGXrl5ZMpbA6mbfhd0R8aPxWfmDWiIOhBufhMCvUHh1sApMKVZnvIff9/0Dca3wb vLIwa3T4CyshfT0AEQEAAc0hQm9iIEJhYmJhZ2UgPGJvYkBvcGVucGdwLmV4YW1w bGU+wsFcBBMBCgCQBYJhesp/BYkEWQPJBQsJCAcCCRD7/MgqAV5zMEcUAAAAAAAe ACBzYWx0QG5vdGF0aW9ucy5zZXF1b2lhLXBncC5vcmeEOQlNyTLFkc9I/elp+BpY 495V7KatqtDmsyDr+zDAdwYVCgkICwIEFgIDAQIXgAIbAwIeARYhBNGmbhojsYLJ mA94jPv8yCoBXnMwAABSCQv/av8hKyynMtXVKFuWOGJw0mR8auDm84WdhMFRZg8t yTJ1L88+Ny4WUAFeqo2j7DU2yPGrm5rmuvzlEedFYFeOWt+A4adz+oumgRd0nsgG Lf3QYUWQhLWVlz+H7zubgKqSB2A2RqV65S7mTTVro42nb2Mng6rvGWiqeKG5nrXN /01p1mIBQGR/KnZSqYLzA2Pw2PiJoSkXT26PDz/kiEMXpjKMR6sicV4bKVlEdUvm pIImIPBHZq1EsKXEyWtWC41w/pc+FofGE+uSFs2aef1vvEHFkj3BHSK8gRcH3kfR eFroTET8C2q9V1AOELWm+Ys6PzGzF72URK1MKXlThuL4t4LjvXWGNA78IKW+/RQH DzK4U0jqSO0mL6qxqVS5Ij6jjL6OTrVEGdtDf5n0vI8tcUTBKtVqYAYk+t2YGT05 ayxALtb7viVKo8f10WEcCuKshn0gdsEFMRZQzJ89uQIY3R3FbsdRCaE6OEaDgKMQ UTFROyfhthgzRKbRxfcplMUCzsDNBF2lnPIBDADWML9cbGMrp12CtF9b2P6z9TTT 74S8iyBOzaSvdGDQY/sUtZXRg21HWamXnn9sSXvIDEINOQ6A9QxdxoqWdCHrOuW3 ofneYXoG+zeKc4dC86wa1TR2q9vW+RMXSO4uImA+Uzula/6k1DogDf28qhCxMwG/ i/m9g1c/0aApuDyKdQ1PXsHHNlgd/Dn6rrd5y2AObaifV7wIhEJnvqgFXDN2RXGj LeCOHV4Q2WTYPg/S4k1nMXVDwZXrvIsA0YwIMgIT86Rafp1qKlgPNbiIlC1g9RY/ iFaGN2b4Ir6GDohBQSfZW2+LXoPZuVE/wGlQ01rh827KVZW4lXvqsge+wtnWlszc selGATyzqOK9LdHPdZGzROZYI2e8c+paLNDdVPL6vdRBUnkCaEkOtl1mr2JpQi5n TU+gTX4IeInC7E+1a9UDF/Y85ybUz8XV8rUnR76UqVC7KidNepdHbZjjXCt8/Zo+ Tec9JNbYNQB/e9ExmDntmlHEsSEQzFwzj8sxH48AEQEAAcLA9gQYAQoAIBYhBNGm bhojsYLJmA94jPv8yCoBXnMwBQJdpZzyAhsMAAoJEPv8yCoBXnMw6f8L/26C34dk jBffTzMj5Bdzm8MtF67OYneJ4TQMw7+41IL4rVcSKhIhk/3Ud5knaRtP2ef1+5F6 6h9/RPQOJ5+tvBwhBAcUWSupKnUrdVaZQanYmtSxcVV2PL9+QEiNN3tzluhaWO// rACxJ+K/ZXQlIzwQVTpNhfGzAaMVV9zpf3u0k14itcv6alKY8+rLZvO1wIIeRZLm U0tZDD5HtWDvUV7rIFI1WuoLb+KZgbYn3OWjCPHVdTrdZ2CqnZbG3SXw6awH9bzR LV9EXkbhIMez0deCVdeo+wFFklh8/5VK2b0vk/+wqMJxfpa1lHvJLobzOP9fvrsw sr92MA2+k901WeISR7qEzcI0Fdg8AyFAExaEK6VyjP7SXGLwvfisw34OxuZr3qmx 1Sufu4toH3XrB7QJN8XyqqbsGxUCBqWif9RSK4xjzRTe56iPeiSJJOIciMP9i2ld I+KgLycyeDvGoBj0HCLO3gVaBe4ubVrj5KjhX2PVNEJd3XZRzaXZE2aAMQ== =AmgT -----END PGP PUBLIC KEY BLOCK-----` const rsa2048PrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: gpg (GnuPG) 2.2.27 with libgcrypt 1.9.4 lQPGBGL07P0BCADL0etN8efyAXA6sL2WfQvHe5wEKYXPWeN2+jiqSppfeRZAOlzP kZ3U+cloeJriplYvVJwI3ID2aw52Z/TRn8iKRP5eOUFrEgcgl06lazLtOndK7o7p oBV5mLtHEirFHm6W61fNt10jzM0jx0PV6nseLhFB2J42F1cmU/aBgFo41wjLSZYr owR+v+O9S5sUXblQF6sEDcY01sBEu09zrIgT49VFwQ1Cvdh9XZEOTQBfdiugoj5a DS3fAqAka3r1VoQK4eR7/upnYSgSACGeaQ4pUelKku5rpm50gdWTY8ppq0k9e1eT y2x0OQcW3hWE+j4os1ca0ZEADMdqr/99MOxrABEBAAH+BwMCJWxU4VOZOJ7/I6vX FxdfBhIBEXlJ52FM3S/oYtXqLhkGyrtmZOeEazVvUtuCe3M3ScHI8xCthcmE8E0j bi+ZEHPS2NiBZtgHFF27BLn7zZuTc+oD5WKduZdK3463egnyThTqIIMl25WZBuab k5ycwYrWwBH0jfA4gwJ13ai4pufKC2RM8qIu6YAVPglYBKFLKGvvJHa5vI+LuA0E K+k35hIic7yVUcQneNnAF2598X5yWiieYnOZpmHlRw1zfbMwOJr3ZNj2v94u7b+L sTa/1Uv9887Vb6sJp0c2Sh4cwEccoPYkvMqFn3ZrJUr3UdDu1K2vWohPtswzhrYV +RdPZE5RLoCQufKvlPezk0Pzhzb3bBU7XjUbdGY1nH/EyQeBNp+Gw6qldKvzcBaB cyOK1c6hPSszpJX93m5UxCN55IeifmcNjmbDh8vGCCdajy6d56qV2n4F3k7vt1J1 0UlxIGhqijJoaTCX66xjLMC6VXkSz6aHQ35rnXosm/cqPcQshsZTdlfSyWkorfdr 4Hj8viBER26mjYurTMLBKDtUN724ZrR0Ev5jorX9uoKlgl87bDZHty2Ku2S+vR68 VAvnj6Fi1BYNclnDoqxdRB2z5T9JbWE52HuG83/QsplhEqXxESDxriTyTHMbNxEe 88soVCDh4tgflZFa2ucUr6gEKJKij7jgahARnyaXfPZlQBUAS1YUeILYmN+VR+M/ sHENpwDWc7TInn8VN638nJV+ScZGMih3AwWZTIoiLju3MMt1K0YZ3NuiqwGH4Jwg /BbEdTWeCci9y3NEQHQ3uZZ5p6j2CwFVlK11idemCMvAiTVxF+gKdaLMkeCwKxru J3YzhKEo+iDVYbPYBYizx/EHBn2U5kITQ5SBXzjTaaFMNZJEf9JYsL1ybPB6HOFY VNVB2KT8CGVwtCJHb2xhbmcgR29waGVyIDxnb2xhbmdAZXhhbXBsZS5vcmc+iQFO BBMBCgA4FiEEC6K7U7f4qesybTnqSkra7gHusm0FAmL07P0CGwMFCwkIBwIGFQoJ CAsCBBYCAwECHgECF4AACgkQSkra7gHusm1MvwgAxpClWkeSqIhMQfbiuz0+lOkE 89y1DCFw8bHjZoUf4/4K8hFA3dGkk+q72XFgiyaCpfXxMt6Gi+dN47t+tTv9NIqC sukbaoJBmJDhN6+djmJOgOYy+FWsW2LAk2LOwKYulpnBZdcA5rlMAhBg7gevQpF+ ruSU69P7UUaFJl/DC7hDmaIcj+4cjBE/HO26SnVQjoTfjZT82rDh1Wsuf8LnkJUk b3wezBLpXKjDvdHikdv4gdlR4AputVM38aZntYYglh/EASo5TneyZ7ZscdLNRdcF r5O2fKqrOJLOdaoYRFZZWOvP5GtEVFDU7WGivOSVfiszBE0wZR3dgZRJipHCXJ0D xgRi9Oz9AQgAtMJcJqLLVANJHl90tWuoizDkm+Imcwq2ubQAjpclnNrODnDK+7o4 pBsWmXbZSdkC4gY+LhOQA6bPDD0JEHM58DOnrm49BddxXAyK0HPsk4sGGt2SS86B OawWNdfJVyqw4bAiHWDmQg4PcjBbt3ocOIxAR6I5kBSiQVxuGQs9T+Zvg3G1r3Or fS6DzlgY3HFUML5YsGH4lOxNSOoKAP68GIH/WNdUZ+feiRg9knIib6I3Hgtf5eO8 JRH7aWE/TD7eNu36bLLjT5TZPq5r6xaD2plbtPOyXbNPWs9qI1yG+VnErfaLY0w8 Qo0aqzbgID+CTZVomXSOpOcQseaFKw8ZfQARAQAB/gcDArha6+/+d4OY/w9N32K9 hFNYt4LufTETMQ+k/sBeaMuAVzmT47DlAXzkrZhGW4dZOtXMu1rXaUwHlqkhEyzL L4MYEWVXfD+LbZNEK3MEFss6RK+UAMeT/PTV9aA8cXQVPcSJYzfBXHQ1U1hnOgrO apn92MN8RmkhX8wJLyeWTMMuP4lXByJMmmGo8WvifeRD2kFY4y0WVBDAXJAV4Ljf Di/bBiwoc5a+gxHuZT2W9ZSxBQJNXdt4Un2IlyZuo58s5MLx2N0EaNJ8PwRUE6fM RZYO8aZCEPUtINE4njbvsWOMCtrblsMPwZ1B0SiIaWmLaNyGdCNKea+fCIW7kasC JYMhnLumpUTXg5HNexkCsl7ABWj0PYBflOE61h8EjWpnQ7JBBVKS2ua4lMjwHRX7 5o5yxym9k5UZNFdGoXVL7xpizCcdGawxTJvwhs3vBqu1ZWYCegOAZWDrOkCyhUpq 8uKMROZFbn+FwE+7tjt+v2ed62FVEvD6g4V3ThCA6mQqeOARfJWN8GZY8BDm8lht crOXriUkrx+FlrgGtm2CkwjW5/9Xd7AhFpHnQdFeozOHyq1asNSgJF9sNi9Lz94W skQSVRi0IExxSXYGI3Y0nnAZUe2BAQflYPJdEveSr3sKlUqXiETTA1VXsTPK3kOC 92CbLzj/Hz199jZvywwyu53I+GKMpF42rMq7zxr2oa61YWY4YE/GDezwwys/wLx/ QpCW4X3ppI7wJjCSSqEV0baYZSSli1ayheS6dxi8QnSpX1Bmpz6gU7m/M9Sns+hl J7ZvgpjCAiV7KJTjtclr5/S02zP78LTVkoTWoz/6MOTROwaP63VBUXX8pbJhf/vu DLmNnDk8joMJxoDXWeNU0EnNl4hP7Z/jExRBOEO4oAnUf/Sf6gCWQhL5qcajtg6w tGv7vx3f2IkBNgQYAQoAIBYhBAuiu1O3+KnrMm056kpK2u4B7rJtBQJi9Oz9AhsM AAoJEEpK2u4B7rJt6lgIAMBWqP4BCOGnQXBbgJ0+ACVghpkFUXZTb/tXJc8UUvTM 8uov6k/RsqDGZrvhhufD7Wwt7j9v7dD7VPp7bPyjVWyimglQzWguTUUqLDGlstYH 5uYv1pzma0ZsAGNqFeGlTLsKOSGKFMH4rB2KfN2n51L8POvtp1y7GKZQbWIWneaB cZr3BINU5GMvYYU7pAYcoR+mJPdJx5Up3Ocn+bn8Tu1sy9C/ArtCQucazGnoE9u1 HhNLrh0CdzzX7TNH6TQ8LwPOvq0K5l/WqbN9lE0WBBhMv2HydxhluO8AhU+A5GqC C+wET7nVDnhoOm/fstIeb7/LN7OYejKPeHdFBJEL9GA= =u442 -----END PGP PRIVATE KEY BLOCK-----` const curve25519PrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: gpg (GnuPG) 2.2.27 with libgcrypt 1.9.4 lFgEYvTtQBYJKwYBBAHaRw8BAQdAxsNXLbrk5xOjpO24VhOMvQ0/F+JcyIkckMDH X3FIGxcAAQDFOlunZWYuPsCx5JLp78vKqUTfgef9TGG4oD6I/Sa0zBMstCJHb2xh bmcgR29waGVyIDxnb2xhbmdAZXhhbXBsZS5vcmc+iJAEExYIADgWIQSFQHEOazmo h1ldII4MvfnLQ4JBNwUCYvTtQAIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK CRAMvfnLQ4JBN5yeAQCKdry8B5ScCPrev2+UByMCss7Sdu5RhomCFsHdNPLcKAEA 8ugei+1owHsV+3cGwWWzKk6sLa8ZN87i3SKuOGp9DQycXQRi9O1AEgorBgEEAZdV AQUBAQdA5CubPp8l7lrVQ25h7Hx5XN2C8xanRnnpcjzEooCaEA0DAQgHAAD/Rpc+ sOZUXrFk9HOWB1XU41LoWbDBoG8sP8RWAVYwD5AQRYh4BBgWCAAgFiEEhUBxDms5 qIdZXSCODL35y0OCQTcFAmL07UACGwwACgkQDL35y0OCQTcvdwEA7lb5g/YisrEf iq660uwMGoepLUfvtqKzuQ6heYe83y0BAN65Ffg5HYOJzUEi0kZQRf7OhdtuL2kJ SRXn8DmCTfEB =cELM -----END PGP PRIVATE KEY BLOCK-----` const curve448PrivateKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: C1DB 65D5 80D7 B922 7254 4B1E A699 9895 FABA CE52 xYUEYV2UmRYDK2VxAc9AFyxgh5xnSbyt50TWl558mw9xdMN+/UBLr5+UMP8IsrvV MdXuTIE8CyaUQKSotHtH2RkYEXj5nsMAAAHPQIbTMSzjIWug8UFECzAex5FHgAgH gYF3RK+TS8D24wX8kOu2C/NoVxwGY+p+i0JHaB+7yljriSKAGxs6wsBEBB8WCgCD BYJhXZSZBYkFpI+9AwsJBwkQppmYlfq6zlJHFAAAAAAAHgAgc2FsdEBub3RhdGlv bnMuc2VxdW9pYS1wZ3Aub3Jn5wSpIutJ5HncJWk4ruUV8GzQF390rR5+qWEAnAoY akcDFQoIApsBAh4BFiEEwdtl1YDXuSJyVEseppmYlfq6zlIAALzdA5dA/fsgYg/J qaQriYKaPUkyHL7EB3BXhV2d1h/gk+qJLvXQuU2WEJ/XSs3GrsBRiiZwvPH4o+7b mleAxjy5wpS523vqrrBR2YZ5FwIku7WS4litSdn4AtVam/TlLdMNIf41CtFeZKBe c5R5VNdQy8y7qy8AAADNEUN1cnZlNDQ4IE9wdGlvbiA4wsBHBBMWCgCGBYJhXZSZ BYkFpI+9AwsJBwkQppmYlfq6zlJHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMuc2Vx dW9pYS1wZ3Aub3JnD55UsYMzE6OACP+mgw5zvT+BBgol8/uFQjHg4krjUCMDFQoI ApkBApsBAh4BFiEEwdtl1YDXuSJyVEseppmYlfq6zlIAAPQJA5dA0Xqwzn/0uwCq RlsOVCB3f5NOj1exKnlBvRw0xT1VBee1yxvlUt5eIAoCxWoRlWBJob3TTkhm9AEA 8dyhwPmyGfWHzPw5NFG3xsXrZdNXNvit9WMVAPcmsyR7teXuDlJItxRAdJJc/qfJ YVbBFoaNrhYAAADHhQRhXZSZFgMrZXEBz0BL7THZ9MnCLfSPJ1FMLim9eGkQ3Bfn M3he5rOwO3t14QI1LjI96OjkeJipMgcFAmEP1Bq/ZHGO7oAAAc9AFnE8iNBaT3OU EFtxkmWHXtdaYMmGGRdopw9JPXr/UxuunDln5o9dxPxf7q7z26zXrZen+qed/Isa HsDCwSwEGBYKAWsFgmFdlJkFiQWkj70JEKaZmJX6us5SRxQAAAAAAB4AIHNhbHRA bm90YXRpb25zLnNlcXVvaWEtcGdwLm9yZxREUizdTcepBzgSMOv2VWQCWbl++3CZ EbgAWDryvSsyApsCwDGgBBkWCgBvBYJhXZSZCRBKo3SL4S5djkcUAAAAAAAeACBz YWx0QG5vdGF0aW9ucy5zZXF1b2lhLXBncC5vcmemoGTDjmNQiIzw6HOEddvS0OB7 UZ/P07jM/EVmnYxTlBYhBAxsnkGpx1UCiH6gUUqjdIvhLl2OAAALYQOXQAMB1oKq OWxSFmvmgCKNcbAAyA3piF5ERIqs4z07oJvqDYrOWt75UsEIH/04gU/vHc4EmfG2 JDLJgOLlyTUPkL/08f0ydGZPofFQBhn8HkuFFjnNtJ5oz3GIP4cdWMQFaUw0uvjb PM9Tm3ptENGd6Ts1AAAAFiEEwdtl1YDXuSJyVEseppmYlfq6zlIAAGpTA5dATR6i U2GrpUcQgpG+JqfAsGmF4yAOhgFxc1UfidFk3nTup3fLgjipkYY170WLRNbyKkVO Sodx93GAs58rizO1acDAWiLq3cyEPBFXbyFThbcNPcLl+/77Uk/mgkYrPQFAQWdK 1kSRm4SizDBK37K8ChAAAADHhwRhXZSZEgMrZW8Bx0DMhzvhQo+OsXeqQ6QVw4sF CaexHh6rLohh7TzL3hQSjoJ27fV6JBkIWdn0LfrMlJIDbSv2SLdlgQMBCgkAAcdA MO7Dc1myF6Co1fAH+EuP+OxhxP/7V6ljuSCZENDfA49tQkzTta+PniG+pOVB2LHb huyaKBkqiaogo8LAOQQYFgoAeAWCYV2UmQWJBaSPvQkQppmYlfq6zlJHFAAAAAAA HgAgc2FsdEBub3RhdGlvbnMuc2VxdW9pYS1wZ3Aub3JnEjBMQAmc/2u45u5FQGmB QAytjSG2LM3JQN+PPVl5vEkCmwwWIQTB22XVgNe5InJUSx6mmZiV+rrOUgAASdYD l0DXEHQ9ykNP2rZP35ET1dmiFagFtTj/hLQcWlg16LqvJNGqOgYXuqTerbiOOt02 XLCBln+wdewpU4ChEffMUDRBfqfQco/YsMqWV7bHJHAO0eC/DMKCjyU90xdH7R/d QgqsfguR1PqPuJxpXV4bSr6CGAAAAA== =MSvh -----END PGP PRIVATE KEY BLOCK-----` const keyWithNotation = `-----BEGIN PGP PRIVATE KEY BLOCK----- xVgEY9gIshYJKwYBBAHaRw8BAQdAF25fSM8OpFlXZhop4Qpqo5ywGZ4jgWlR ppjhIKDthREAAQC+LFpzFcMJYcjxGKzBGHN0Px2jU4d04YSRnFAik+lVVQ6u zRdUZXN0IDx0ZXN0QGV4YW1wbGUuY29tPsLACgQQFgoAfAUCY9gIsgQLCQcI CRD/utJOCym8pR0UgAAAAAAQAAR0ZXh0QGV4YW1wbGUuY29tdGVzdB8UAAAA AAASAARiaW5hcnlAZXhhbXBsZS5jb20AAQIDAxUICgQWAAIBAhkBAhsDAh4B FiEEEMCQTUVGKgCX5rDQ/7rSTgspvKUAAPl5AP9Npz90LxzrB97Qr2DrGwfG wuYn4FSYwtuPfZHHeoIabwD/QEbvpQJ/NBb9EAZuow4Rirlt1yv19mmnF+j5 8yUzhQjHXQRj2AiyEgorBgEEAZdVAQUBAQdARXAo30DmKcyUg6co7OUm0RNT z9iqFbDBzA8A47JEt1MDAQgHAAD/XKK3lBm0SqMR558HLWdBrNG6NqKuqb5X joCML987ZNgRD8J4BBgWCAAqBQJj2AiyCRD/utJOCym8pQIbDBYhBBDAkE1F RioAl+aw0P+60k4LKbylAADRxgEAg7UfBDiDPp5LHcW9D+SgFHk6+GyEU4ev VppQxdtxPvAA/34snHBX7Twnip1nMt7P4e2hDiw/hwQ7oqioOvc6jMkP =Z8YJ -----END PGP PRIVATE KEY BLOCK----- ` ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go ================================================ // Copyright (C) 2019 ProtonTech AG package packet import "math/bits" // CipherSuite contains a combination of Cipher and Mode type CipherSuite struct { // The cipher function Cipher CipherFunction // The AEAD mode of operation. Mode AEADMode } // AEADConfig collects a number of AEAD parameters along with sensible defaults. // A nil AEADConfig is valid and results in all default values. type AEADConfig struct { // The AEAD mode of operation. DefaultMode AEADMode // Amount of octets in each chunk of data ChunkSize uint64 } // Mode returns the AEAD mode of operation. func (conf *AEADConfig) Mode() AEADMode { // If no preference is specified, OCB is used (which is mandatory to implement). if conf == nil || conf.DefaultMode == 0 { return AEADModeOCB } mode := conf.DefaultMode if mode != AEADModeEAX && mode != AEADModeOCB && mode != AEADModeGCM { panic("AEAD mode unsupported") } return mode } // ChunkSizeByte returns the byte indicating the chunk size. The effective // chunk size is computed with the formula uint64(1) << (chunkSizeByte + 6) // limit chunkSizeByte to 16 which equals to 2^22 = 4 MiB // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2 func (conf *AEADConfig) ChunkSizeByte() byte { if conf == nil || conf.ChunkSize == 0 { return 12 // 1 << (12 + 6) == 262144 bytes } chunkSize := conf.ChunkSize exponent := bits.Len64(chunkSize) - 1 switch { case exponent < 6: exponent = 6 case exponent > 22: exponent = 22 } return byte(exponent - 6) } // decodeAEADChunkSize returns the effective chunk size. In 32-bit systems, the // maximum returned value is 1 << 30. func decodeAEADChunkSize(c byte) int { size := uint64(1 << (c + 6)) if size != uint64(int(size)) { return 1 << 30 } return int(size) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_crypter.go ================================================ // Copyright (C) 2019 ProtonTech AG package packet import ( "crypto/cipher" "encoding/binary" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ) // aeadCrypter is an AEAD opener/sealer, its configuration, and data for en/decryption. type aeadCrypter struct { aead cipher.AEAD chunkSize int nonce []byte associatedData []byte // Chunk-independent associated data chunkIndex []byte // Chunk counter packetTag packetType // SEIP packet (v2) or AEAD Encrypted Data packet bytesProcessed int // Amount of plaintext bytes encrypted/decrypted } // computeNonce takes the incremental index and computes an eXclusive OR with // the least significant 8 bytes of the receivers' initial nonce (see sec. // 5.16.1 and 5.16.2). It returns the resulting nonce. func (wo *aeadCrypter) computeNextNonce() (nonce []byte) { if wo.packetTag == packetTypeSymmetricallyEncryptedIntegrityProtected { return wo.nonce } nonce = make([]byte, len(wo.nonce)) copy(nonce, wo.nonce) offset := len(wo.nonce) - 8 for i := 0; i < 8; i++ { nonce[i+offset] ^= wo.chunkIndex[i] } return } // incrementIndex performs an integer increment by 1 of the integer represented by the // slice, modifying it accordingly. func (wo *aeadCrypter) incrementIndex() error { index := wo.chunkIndex if len(index) == 0 { return errors.AEADError("Index has length 0") } for i := len(index) - 1; i >= 0; i-- { if index[i] < 255 { index[i]++ return nil } index[i] = 0 } return errors.AEADError("cannot further increment index") } // aeadDecrypter reads and decrypts bytes. It buffers extra decrypted bytes when // necessary, similar to aeadEncrypter. type aeadDecrypter struct { aeadCrypter // Embedded ciphertext opener reader io.Reader // 'reader' is a partialLengthReader chunkBytes []byte peekedBytes []byte // Used to detect last chunk buffer []byte // Buffered decrypted bytes } // Read decrypts bytes and reads them into dst. It decrypts when necessary and // buffers extra decrypted bytes. It returns the number of bytes copied into dst // and an error. func (ar *aeadDecrypter) Read(dst []byte) (n int, err error) { // Return buffered plaintext bytes from previous calls if len(ar.buffer) > 0 { n = copy(dst, ar.buffer) ar.buffer = ar.buffer[n:] return } // Read a chunk tagLen := ar.aead.Overhead() copy(ar.chunkBytes, ar.peekedBytes) // Copy bytes peeked in previous chunk or in initialization bytesRead, errRead := io.ReadFull(ar.reader, ar.chunkBytes[tagLen:]) if errRead != nil && errRead != io.EOF && errRead != io.ErrUnexpectedEOF { return 0, errRead } if bytesRead > 0 { ar.peekedBytes = ar.chunkBytes[bytesRead:bytesRead+tagLen] decrypted, errChunk := ar.openChunk(ar.chunkBytes[:bytesRead]) if errChunk != nil { return 0, errChunk } // Return decrypted bytes, buffering if necessary n = copy(dst, decrypted) ar.buffer = decrypted[n:] return } return 0, io.EOF } // Close checks the final authentication tag of the stream. // In the future, this function could also be used to wipe the reader // and peeked & decrypted bytes, if necessary. func (ar *aeadDecrypter) Close() (err error) { errChunk := ar.validateFinalTag(ar.peekedBytes) if errChunk != nil { return errChunk } return nil } // openChunk decrypts and checks integrity of an encrypted chunk, returning // the underlying plaintext and an error. It accesses peeked bytes from next // chunk, to identify the last chunk and decrypt/validate accordingly. func (ar *aeadDecrypter) openChunk(data []byte) ([]byte, error) { adata := ar.associatedData if ar.aeadCrypter.packetTag == packetTypeAEADEncrypted { adata = append(ar.associatedData, ar.chunkIndex...) } nonce := ar.computeNextNonce() plainChunk, err := ar.aead.Open(data[:0:len(data)], nonce, data, adata) if err != nil { return nil, errors.ErrAEADTagVerification } ar.bytesProcessed += len(plainChunk) if err = ar.aeadCrypter.incrementIndex(); err != nil { return nil, err } return plainChunk, nil } // Checks the summary tag. It takes into account the total decrypted bytes into // the associated data. It returns an error, or nil if the tag is valid. func (ar *aeadDecrypter) validateFinalTag(tag []byte) error { // Associated: tag, version, cipher, aead, chunk size, ... amountBytes := make([]byte, 8) binary.BigEndian.PutUint64(amountBytes, uint64(ar.bytesProcessed)) adata := ar.associatedData if ar.aeadCrypter.packetTag == packetTypeAEADEncrypted { // ... index ... adata = append(ar.associatedData, ar.chunkIndex...) } // ... and total number of encrypted octets adata = append(adata, amountBytes...) nonce := ar.computeNextNonce() if _, err := ar.aead.Open(nil, nonce, tag, adata); err != nil { return errors.ErrAEADTagVerification } return nil } // aeadEncrypter encrypts and writes bytes. It encrypts when necessary according // to the AEAD block size, and buffers the extra encrypted bytes for next write. type aeadEncrypter struct { aeadCrypter // Embedded plaintext sealer writer io.WriteCloser // 'writer' is a partialLengthWriter chunkBytes []byte offset int } // Write encrypts and writes bytes. It encrypts when necessary and buffers extra // plaintext bytes for next call. When the stream is finished, Close() MUST be // called to append the final tag. func (aw *aeadEncrypter) Write(plaintextBytes []byte) (n int, err error) { for n != len(plaintextBytes) { copied := copy(aw.chunkBytes[aw.offset:aw.chunkSize], plaintextBytes[n:]) n += copied aw.offset += copied if aw.offset == aw.chunkSize { encryptedChunk, err := aw.sealChunk(aw.chunkBytes[:aw.offset]) if err != nil { return n, err } _, err = aw.writer.Write(encryptedChunk) if err != nil { return n, err } aw.offset = 0 } } return } // Close encrypts and writes the remaining buffered plaintext if any, appends // the final authentication tag, and closes the embedded writer. This function // MUST be called at the end of a stream. func (aw *aeadEncrypter) Close() (err error) { // Encrypt and write a chunk if there's buffered data left, or if we haven't // written any chunks yet. if aw.offset > 0 || aw.bytesProcessed == 0 { lastEncryptedChunk, err := aw.sealChunk(aw.chunkBytes[:aw.offset]) if err != nil { return err } _, err = aw.writer.Write(lastEncryptedChunk) if err != nil { return err } } // Compute final tag (associated data: packet tag, version, cipher, aead, // chunk size... adata := aw.associatedData if aw.aeadCrypter.packetTag == packetTypeAEADEncrypted { // ... index ... adata = append(aw.associatedData, aw.chunkIndex...) } // ... and total number of encrypted octets amountBytes := make([]byte, 8) binary.BigEndian.PutUint64(amountBytes, uint64(aw.bytesProcessed)) adata = append(adata, amountBytes...) nonce := aw.computeNextNonce() finalTag := aw.aead.Seal(nil, nonce, nil, adata) _, err = aw.writer.Write(finalTag) if err != nil { return err } return aw.writer.Close() } // sealChunk Encrypts and authenticates the given chunk. func (aw *aeadEncrypter) sealChunk(data []byte) ([]byte, error) { if len(data) > aw.chunkSize { return nil, errors.AEADError("chunk exceeds maximum length") } if aw.associatedData == nil { return nil, errors.AEADError("can't seal without headers") } adata := aw.associatedData if aw.aeadCrypter.packetTag == packetTypeAEADEncrypted { adata = append(aw.associatedData, aw.chunkIndex...) } nonce := aw.computeNextNonce() encrypted := aw.aead.Seal(data[:0], nonce, data, adata) aw.bytesProcessed += len(data) if err := aw.aeadCrypter.incrementIndex(); err != nil { return nil, err } return encrypted, nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go ================================================ // Copyright (C) 2019 ProtonTech AG package packet import ( "io" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" ) // AEADEncrypted represents an AEAD Encrypted Packet. // See https://www.ietf.org/archive/id/draft-koch-openpgp-2015-rfc4880bis-00.html#name-aead-encrypted-data-packet-t type AEADEncrypted struct { cipher CipherFunction mode AEADMode chunkSizeByte byte Contents io.Reader // Encrypted chunks and tags initialNonce []byte // Referred to as IV in RFC4880-bis } // Only currently defined version const aeadEncryptedVersion = 1 func (ae *AEADEncrypted) parse(buf io.Reader) error { headerData := make([]byte, 4) if n, err := io.ReadFull(buf, headerData); n < 4 { return errors.AEADError("could not read aead header:" + err.Error()) } // Read initial nonce mode := AEADMode(headerData[2]) nonceLen := mode.IvLength() // This packet supports only EAX and OCB // https://www.ietf.org/archive/id/draft-koch-openpgp-2015-rfc4880bis-00.html#name-aead-encrypted-data-packet-t if nonceLen == 0 || mode > AEADModeOCB { return errors.AEADError("unknown mode") } initialNonce := make([]byte, nonceLen) if n, err := io.ReadFull(buf, initialNonce); n < nonceLen { return errors.AEADError("could not read aead nonce:" + err.Error()) } ae.Contents = buf ae.initialNonce = initialNonce c := headerData[1] if _, ok := algorithm.CipherById[c]; !ok { return errors.UnsupportedError("unknown cipher: " + string(c)) } ae.cipher = CipherFunction(c) ae.mode = mode ae.chunkSizeByte = headerData[3] return nil } // Decrypt returns a io.ReadCloser from which decrypted bytes can be read, or // an error. func (ae *AEADEncrypted) Decrypt(ciph CipherFunction, key []byte) (io.ReadCloser, error) { return ae.decrypt(key) } // decrypt prepares an aeadCrypter and returns a ReadCloser from which // decrypted bytes can be read (see aeadDecrypter.Read()). func (ae *AEADEncrypted) decrypt(key []byte) (io.ReadCloser, error) { blockCipher := ae.cipher.new(key) aead := ae.mode.new(blockCipher) // Carry the first tagLen bytes chunkSize := decodeAEADChunkSize(ae.chunkSizeByte) tagLen := ae.mode.TagLength() chunkBytes := make([]byte, chunkSize+tagLen*2) peekedBytes := chunkBytes[chunkSize+tagLen:] n, err := io.ReadFull(ae.Contents, peekedBytes) if n < tagLen || (err != nil && err != io.EOF) { return nil, errors.AEADError("Not enough data to decrypt:" + err.Error()) } return &aeadDecrypter{ aeadCrypter: aeadCrypter{ aead: aead, chunkSize: chunkSize, nonce: ae.initialNonce, associatedData: ae.associatedData(), chunkIndex: make([]byte, 8), packetTag: packetTypeAEADEncrypted, }, reader: ae.Contents, chunkBytes: chunkBytes, peekedBytes: peekedBytes, }, nil } // associatedData for chunks: tag, version, cipher, mode, chunk size byte func (ae *AEADEncrypted) associatedData() []byte { return []byte{ 0xD4, aeadEncryptedVersion, byte(ae.cipher), byte(ae.mode), ae.chunkSizeByte} } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/compressed.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "compress/bzip2" "compress/flate" "compress/zlib" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/errors" ) // Compressed represents a compressed OpenPGP packet. The decompressed contents // will contain more OpenPGP packets. See RFC 4880, section 5.6. type Compressed struct { Body io.Reader } const ( NoCompression = flate.NoCompression BestSpeed = flate.BestSpeed BestCompression = flate.BestCompression DefaultCompression = flate.DefaultCompression ) // CompressionConfig contains compressor configuration settings. type CompressionConfig struct { // Level is the compression level to use. It must be set to // between -1 and 9, with -1 causing the compressor to use the // default compression level, 0 causing the compressor to use // no compression and 1 to 9 representing increasing (better, // slower) compression levels. If Level is less than -1 or // more then 9, a non-nil error will be returned during // encryption. See the constants above for convenient common // settings for Level. Level int } // decompressionReader ensures that the whole compression packet is read. type decompressionReader struct { compressed io.Reader decompressed io.ReadCloser readAll bool } func newDecompressionReader(r io.Reader, decompressor io.ReadCloser) *decompressionReader { return &decompressionReader{ compressed: r, decompressed: decompressor, } } func (dr *decompressionReader) Read(data []byte) (n int, err error) { if dr.readAll { return 0, io.EOF } n, err = dr.decompressed.Read(data) if err == io.EOF { dr.readAll = true // Close the decompressor. if errDec := dr.decompressed.Close(); errDec != nil { return n, errDec } // Consume all remaining data from the compressed packet. consumeAll(dr.compressed) } return n, err } func (c *Compressed) parse(r io.Reader) error { var buf [1]byte _, err := readFull(r, buf[:]) if err != nil { return err } switch buf[0] { case 0: c.Body = r case 1: c.Body = newDecompressionReader(r, flate.NewReader(r)) case 2: decompressor, err := zlib.NewReader(r) if err != nil { return err } c.Body = newDecompressionReader(r, decompressor) case 3: c.Body = newDecompressionReader(r, io.NopCloser(bzip2.NewReader(r))) default: err = errors.UnsupportedError("unknown compression algorithm: " + strconv.Itoa(int(buf[0]))) } return err } // compressedWriterCloser represents the serialized compression stream // header and the compressor. Its Close() method ensures that both the // compressor and serialized stream header are closed. Its Write() // method writes to the compressor. type compressedWriteCloser struct { sh io.Closer // Stream Header c io.WriteCloser // Compressor } func (cwc compressedWriteCloser) Write(p []byte) (int, error) { return cwc.c.Write(p) } func (cwc compressedWriteCloser) Close() (err error) { err = cwc.c.Close() if err != nil { return err } return cwc.sh.Close() } // SerializeCompressed serializes a compressed data packet to w and // returns a WriteCloser to which the literal data packets themselves // can be written and which MUST be closed on completion. If cc is // nil, sensible defaults will be used to configure the compression // algorithm. func SerializeCompressed(w io.WriteCloser, algo CompressionAlgo, cc *CompressionConfig) (literaldata io.WriteCloser, err error) { compressed, err := serializeStreamHeader(w, packetTypeCompressed) if err != nil { return } _, err = compressed.Write([]byte{uint8(algo)}) if err != nil { return } level := DefaultCompression if cc != nil { level = cc.Level } var compressor io.WriteCloser switch algo { case CompressionZIP: compressor, err = flate.NewWriter(compressed, level) case CompressionZLIB: compressor, err = zlib.NewWriterLevel(compressed, level) default: s := strconv.Itoa(int(algo)) err = errors.UnsupportedError("Unsupported compression algorithm: " + s) } if err != nil { return } literaldata = compressedWriteCloser{compressed, compressor} return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "crypto" "crypto/rand" "io" "math/big" "time" "github.com/ProtonMail/go-crypto/openpgp/s2k" ) var ( defaultRejectPublicKeyAlgorithms = map[PublicKeyAlgorithm]bool{ PubKeyAlgoElGamal: true, PubKeyAlgoDSA: true, } defaultRejectHashAlgorithms = map[crypto.Hash]bool{ crypto.MD5: true, crypto.RIPEMD160: true, } defaultRejectMessageHashAlgorithms = map[crypto.Hash]bool{ crypto.SHA1: true, crypto.MD5: true, crypto.RIPEMD160: true, } defaultRejectCurves = map[Curve]bool{ CurveSecP256k1: true, } ) // A global feature flag to indicate v5 support. // Can be set via a build tag, e.g.: `go build -tags v5 ./...` // If the build tag is missing config_v5.go will set it to true. // // Disables parsing of v5 keys and v5 signatures. // These are non-standard entities, which in the crypto-refresh have been superseded // by v6 keys, v6 signatures and SEIPDv2 encrypted data, respectively. var V5Disabled = false // Config collects a number of parameters along with sensible defaults. // A nil *Config is valid and results in all default values. type Config struct { // Rand provides the source of entropy. // If nil, the crypto/rand Reader is used. Rand io.Reader // DefaultHash is the default hash function to be used. // If zero, SHA-256 is used. DefaultHash crypto.Hash // DefaultCipher is the cipher to be used. // If zero, AES-128 is used. DefaultCipher CipherFunction // Time returns the current time as the number of seconds since the // epoch. If Time is nil, time.Now is used. Time func() time.Time // DefaultCompressionAlgo is the compression algorithm to be // applied to the plaintext before encryption. If zero, no // compression is done. DefaultCompressionAlgo CompressionAlgo // CompressionConfig configures the compression settings. CompressionConfig *CompressionConfig // S2K (String to Key) config, used for key derivation in the context of secret key encryption // and password-encrypted data. // If nil, the default configuration is used S2KConfig *s2k.Config // Iteration count for Iterated S2K (String to Key). // Only used if sk2.Mode is nil. // This value is duplicated here from s2k.Config for backwards compatibility. // It determines the strength of the passphrase stretching when // the said passphrase is hashed to produce a key. S2KCount // should be between 65536 and 65011712, inclusive. If Config // is nil or S2KCount is 0, the value 16777216 used. Not all // values in the above range can be represented. S2KCount will // be rounded up to the next representable value if it cannot // be encoded exactly. When set, it is strongly encrouraged to // use a value that is at least 65536. See RFC 4880 Section // 3.7.1.3. // // Deprecated: SK2Count should be configured in S2KConfig instead. S2KCount int // RSABits is the number of bits in new RSA keys made with NewEntity. // If zero, then 2048 bit keys are created. RSABits int // The public key algorithm to use - will always create a signing primary // key and encryption subkey. Algorithm PublicKeyAlgorithm // Some known primes that are optionally prepopulated by the caller RSAPrimes []*big.Int // Curve configures the desired packet.Curve if the Algorithm is PubKeyAlgoECDSA, // PubKeyAlgoEdDSA, or PubKeyAlgoECDH. If empty Curve25519 is used. Curve Curve // AEADConfig configures the use of the new AEAD Encrypted Data Packet, // defined in the draft of the next version of the OpenPGP specification. // If a non-nil AEADConfig is passed, usage of this packet is enabled. By // default, it is disabled. See the documentation of AEADConfig for more // configuration options related to AEAD. // **Note: using this option may break compatibility with other OpenPGP // implementations, as well as future versions of this library.** AEADConfig *AEADConfig // V6Keys configures version 6 key generation. If false, this package still // supports version 6 keys, but produces version 4 keys. V6Keys bool // Minimum RSA key size allowed for key generation and message signing, verification and encryption. MinRSABits uint16 // Reject insecure algorithms, only works with v2 api RejectPublicKeyAlgorithms map[PublicKeyAlgorithm]bool RejectHashAlgorithms map[crypto.Hash]bool RejectMessageHashAlgorithms map[crypto.Hash]bool RejectCurves map[Curve]bool // "The validity period of the key. This is the number of seconds after // the key creation time that the key expires. If this is not present // or has a value of zero, the key never expires. This is found only on // a self-signature."" // https://tools.ietf.org/html/rfc4880#section-5.2.3.6 KeyLifetimeSecs uint32 // "The validity period of the signature. This is the number of seconds // after the signature creation time that the signature expires. If // this is not present or has a value of zero, it never expires." // https://tools.ietf.org/html/rfc4880#section-5.2.3.10 SigLifetimeSecs uint32 // SigningKeyId is used to specify the signing key to use (by Key ID). // By default, the signing key is selected automatically, preferring // signing subkeys if available. SigningKeyId uint64 // SigningIdentity is used to specify a user ID (packet Signer's User ID, type 28) // when producing a generic certification signature onto an existing user ID. // The identity must be present in the signer Entity. SigningIdentity string // InsecureAllowUnauthenticatedMessages controls, whether it is tolerated to read // encrypted messages without Modification Detection Code (MDC). // MDC is mandated by the IETF OpenPGP Crypto Refresh draft and has long been implemented // in most OpenPGP implementations. Messages without MDC are considered unnecessarily // insecure and should be prevented whenever possible. // In case one needs to deal with messages from very old OpenPGP implementations, there // might be no other way than to tolerate the missing MDC. Setting this flag, allows this // mode of operation. It should be considered a measure of last resort. InsecureAllowUnauthenticatedMessages bool // InsecureAllowDecryptionWithSigningKeys allows decryption with keys marked as signing keys in the v2 API. // This setting is potentially insecure, but it is needed as some libraries // ignored key flags when selecting a key for encryption. // Not relevant for the v1 API, as all keys were allowed in decryption. InsecureAllowDecryptionWithSigningKeys bool // KnownNotations is a map of Notation Data names to bools, which controls // the notation names that are allowed to be present in critical Notation Data // signature subpackets. KnownNotations map[string]bool // SignatureNotations is a list of Notations to be added to any signatures. SignatureNotations []*Notation // CheckIntendedRecipients controls, whether the OpenPGP Intended Recipient Fingerprint feature // should be enabled for encryption and decryption. // (See https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-12.html#name-intended-recipient-fingerpr). // When the flag is set, encryption produces Intended Recipient Fingerprint signature sub-packets and decryption // checks whether the key it was encrypted to is one of the included fingerprints in the signature. // If the flag is disabled, no Intended Recipient Fingerprint sub-packets are created or checked. // The default behavior, when the config or flag is nil, is to enable the feature. CheckIntendedRecipients *bool // CacheSessionKey controls if decryption should return the session key used for decryption. // If the flag is set, the session key is cached in the message details struct. CacheSessionKey bool // CheckPacketSequence is a flag that controls if the pgp message reader should strictly check // that the packet sequence conforms with the grammar mandated by rfc4880. // The default behavior, when the config or flag is nil, is to check the packet sequence. CheckPacketSequence *bool // NonDeterministicSignaturesViaNotation is a flag to enable randomization of signatures. // If true, a salt notation is used to randomize signatures generated by v4 and v5 keys // (v6 signatures are always non-deterministic, by design). // This protects EdDSA signatures from potentially leaking the secret key in case of faults (i.e. bitflips) which, in principle, could occur // during the signing computation. It is added to signatures of any algo for simplicity, and as it may also serve as protection in case of // weaknesses in the hash algo, potentially hindering e.g. some chosen-prefix attacks. // The default behavior, when the config or flag is nil, is to enable the feature. NonDeterministicSignaturesViaNotation *bool // InsecureAllowAllKeyFlagsWhenMissing determines how a key without valid key flags is handled. // When set to true, a key without flags is treated as if all flags are enabled. // This behavior is consistent with GPG. InsecureAllowAllKeyFlagsWhenMissing bool } func (c *Config) Random() io.Reader { if c == nil || c.Rand == nil { return rand.Reader } return c.Rand } func (c *Config) Hash() crypto.Hash { if c == nil || uint(c.DefaultHash) == 0 { return crypto.SHA256 } return c.DefaultHash } func (c *Config) Cipher() CipherFunction { if c == nil || uint8(c.DefaultCipher) == 0 { return CipherAES128 } return c.DefaultCipher } func (c *Config) Now() time.Time { if c == nil || c.Time == nil { return time.Now().Truncate(time.Second) } return c.Time().Truncate(time.Second) } // KeyLifetime returns the validity period of the key. func (c *Config) KeyLifetime() uint32 { if c == nil { return 0 } return c.KeyLifetimeSecs } // SigLifetime returns the validity period of the signature. func (c *Config) SigLifetime() uint32 { if c == nil { return 0 } return c.SigLifetimeSecs } func (c *Config) Compression() CompressionAlgo { if c == nil { return CompressionNone } return c.DefaultCompressionAlgo } func (c *Config) RSAModulusBits() int { if c == nil || c.RSABits == 0 { return 2048 } return c.RSABits } func (c *Config) PublicKeyAlgorithm() PublicKeyAlgorithm { if c == nil || c.Algorithm == 0 { return PubKeyAlgoRSA } return c.Algorithm } func (c *Config) CurveName() Curve { if c == nil || c.Curve == "" { return Curve25519 } return c.Curve } // Deprecated: The hash iterations should now be queried via the S2K() method. func (c *Config) PasswordHashIterations() int { if c == nil || c.S2KCount == 0 { return 0 } return c.S2KCount } func (c *Config) S2K() *s2k.Config { if c == nil { return nil } // for backwards compatibility if c.S2KCount > 0 && c.S2KConfig == nil { return &s2k.Config{ S2KCount: c.S2KCount, } } return c.S2KConfig } func (c *Config) AEAD() *AEADConfig { if c == nil { return nil } return c.AEADConfig } func (c *Config) SigningKey() uint64 { if c == nil { return 0 } return c.SigningKeyId } func (c *Config) SigningUserId() string { if c == nil { return "" } return c.SigningIdentity } func (c *Config) AllowUnauthenticatedMessages() bool { if c == nil { return false } return c.InsecureAllowUnauthenticatedMessages } func (c *Config) AllowDecryptionWithSigningKeys() bool { if c == nil { return false } return c.InsecureAllowDecryptionWithSigningKeys } func (c *Config) KnownNotation(notationName string) bool { if c == nil { return false } return c.KnownNotations[notationName] } func (c *Config) Notations() []*Notation { if c == nil { return nil } return c.SignatureNotations } func (c *Config) V6() bool { if c == nil { return false } return c.V6Keys } func (c *Config) IntendedRecipients() bool { if c == nil || c.CheckIntendedRecipients == nil { return true } return *c.CheckIntendedRecipients } func (c *Config) RetrieveSessionKey() bool { if c == nil { return false } return c.CacheSessionKey } func (c *Config) MinimumRSABits() uint16 { if c == nil || c.MinRSABits == 0 { return 2047 } return c.MinRSABits } func (c *Config) RejectPublicKeyAlgorithm(alg PublicKeyAlgorithm) bool { var rejectedAlgorithms map[PublicKeyAlgorithm]bool if c == nil || c.RejectPublicKeyAlgorithms == nil { // Default rejectedAlgorithms = defaultRejectPublicKeyAlgorithms } else { rejectedAlgorithms = c.RejectPublicKeyAlgorithms } return rejectedAlgorithms[alg] } func (c *Config) RejectHashAlgorithm(hash crypto.Hash) bool { var rejectedAlgorithms map[crypto.Hash]bool if c == nil || c.RejectHashAlgorithms == nil { // Default rejectedAlgorithms = defaultRejectHashAlgorithms } else { rejectedAlgorithms = c.RejectHashAlgorithms } return rejectedAlgorithms[hash] } func (c *Config) RejectMessageHashAlgorithm(hash crypto.Hash) bool { var rejectedAlgorithms map[crypto.Hash]bool if c == nil || c.RejectMessageHashAlgorithms == nil { // Default rejectedAlgorithms = defaultRejectMessageHashAlgorithms } else { rejectedAlgorithms = c.RejectMessageHashAlgorithms } return rejectedAlgorithms[hash] } func (c *Config) RejectCurve(curve Curve) bool { var rejectedCurve map[Curve]bool if c == nil || c.RejectCurves == nil { // Default rejectedCurve = defaultRejectCurves } else { rejectedCurve = c.RejectCurves } return rejectedCurve[curve] } func (c *Config) StrictPacketSequence() bool { if c == nil || c.CheckPacketSequence == nil { return true } return *c.CheckPacketSequence } func (c *Config) RandomizeSignaturesViaNotation() bool { if c == nil || c.NonDeterministicSignaturesViaNotation == nil { return true } return *c.NonDeterministicSignaturesViaNotation } func (c *Config) AllowAllKeyFlagsWhenMissing() bool { if c == nil { return false } return c.InsecureAllowAllKeyFlagsWhenMissing } // BoolPointer is a helper function to set a boolean pointer in the Config. // e.g., config.CheckPacketSequence = BoolPointer(true) func BoolPointer(value bool) *bool { return &value } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config_v5.go ================================================ //go:build !v5 package packet func init() { V5Disabled = true } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "bytes" "crypto" "crypto/rsa" "encoding/binary" "encoding/hex" "io" "math/big" "strconv" "github.com/ProtonMail/go-crypto/openpgp/ecdh" "github.com/ProtonMail/go-crypto/openpgp/elgamal" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" "github.com/ProtonMail/go-crypto/openpgp/x25519" "github.com/ProtonMail/go-crypto/openpgp/x448" ) // EncryptedKey represents a public-key encrypted session key. See RFC 4880, // section 5.1. type EncryptedKey struct { Version int KeyId uint64 KeyVersion int // v6 KeyFingerprint []byte // v6 Algo PublicKeyAlgorithm CipherFunc CipherFunction // only valid after a successful Decrypt for a v3 packet Key []byte // only valid after a successful Decrypt encryptedMPI1, encryptedMPI2 encoding.Field ephemeralPublicX25519 *x25519.PublicKey // used for x25519 ephemeralPublicX448 *x448.PublicKey // used for x448 encryptedSession []byte // used for x25519 and x448 } func (e *EncryptedKey) parse(r io.Reader) (err error) { var buf [8]byte _, err = readFull(r, buf[:versionSize]) if err != nil { return } e.Version = int(buf[0]) if e.Version != 3 && e.Version != 6 { return errors.UnsupportedError("unknown EncryptedKey version " + strconv.Itoa(int(buf[0]))) } if e.Version == 6 { //Read a one-octet size of the following two fields. if _, err = readFull(r, buf[:1]); err != nil { return } // The size may also be zero, and the key version and // fingerprint omitted for an "anonymous recipient" if buf[0] != 0 { // non-anonymous case _, err = readFull(r, buf[:versionSize]) if err != nil { return } e.KeyVersion = int(buf[0]) if e.KeyVersion != 4 && e.KeyVersion != 6 { return errors.UnsupportedError("unknown public key version " + strconv.Itoa(e.KeyVersion)) } var fingerprint []byte if e.KeyVersion == 6 { fingerprint = make([]byte, fingerprintSizeV6) } else if e.KeyVersion == 4 { fingerprint = make([]byte, fingerprintSize) } _, err = readFull(r, fingerprint) if err != nil { return } e.KeyFingerprint = fingerprint if e.KeyVersion == 6 { e.KeyId = binary.BigEndian.Uint64(e.KeyFingerprint[:keyIdSize]) } else if e.KeyVersion == 4 { e.KeyId = binary.BigEndian.Uint64(e.KeyFingerprint[fingerprintSize-keyIdSize : fingerprintSize]) } } } else { _, err = readFull(r, buf[:8]) if err != nil { return } e.KeyId = binary.BigEndian.Uint64(buf[:keyIdSize]) } _, err = readFull(r, buf[:1]) if err != nil { return } e.Algo = PublicKeyAlgorithm(buf[0]) var cipherFunction byte switch e.Algo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: e.encryptedMPI1 = new(encoding.MPI) if _, err = e.encryptedMPI1.ReadFrom(r); err != nil { return } case PubKeyAlgoElGamal: e.encryptedMPI1 = new(encoding.MPI) if _, err = e.encryptedMPI1.ReadFrom(r); err != nil { return } e.encryptedMPI2 = new(encoding.MPI) if _, err = e.encryptedMPI2.ReadFrom(r); err != nil { return } case PubKeyAlgoECDH: e.encryptedMPI1 = new(encoding.MPI) if _, err = e.encryptedMPI1.ReadFrom(r); err != nil { return } e.encryptedMPI2 = new(encoding.OID) if _, err = e.encryptedMPI2.ReadFrom(r); err != nil { return } case PubKeyAlgoX25519: e.ephemeralPublicX25519, e.encryptedSession, cipherFunction, err = x25519.DecodeFields(r, e.Version == 6) if err != nil { return } case PubKeyAlgoX448: e.ephemeralPublicX448, e.encryptedSession, cipherFunction, err = x448.DecodeFields(r, e.Version == 6) if err != nil { return } } if e.Version < 6 { switch e.Algo { case PubKeyAlgoX25519, PubKeyAlgoX448: e.CipherFunc = CipherFunction(cipherFunction) // Check for validiy is in the Decrypt method } } _, err = consumeAll(r) return } // Decrypt decrypts an encrypted session key with the given private key. The // private key must have been decrypted first. // If config is nil, sensible defaults will be used. func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { if e.Version < 6 && e.KeyId != 0 && e.KeyId != priv.KeyId { return errors.InvalidArgumentError("cannot decrypt encrypted session key for key id " + strconv.FormatUint(e.KeyId, 16) + " with private key id " + strconv.FormatUint(priv.KeyId, 16)) } if e.Version == 6 && e.KeyVersion != 0 && !bytes.Equal(e.KeyFingerprint, priv.Fingerprint) { return errors.InvalidArgumentError("cannot decrypt encrypted session key for key fingerprint " + hex.EncodeToString(e.KeyFingerprint) + " with private key fingerprint " + hex.EncodeToString(priv.Fingerprint)) } if e.Algo != priv.PubKeyAlgo { return errors.InvalidArgumentError("cannot decrypt encrypted session key of type " + strconv.Itoa(int(e.Algo)) + " with private key of type " + strconv.Itoa(int(priv.PubKeyAlgo))) } if priv.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } var err error var b []byte // TODO(agl): use session key decryption routines here to avoid // padding oracle attacks. switch priv.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: // Supports both *rsa.PrivateKey and crypto.Decrypter k := priv.PrivateKey.(crypto.Decrypter) b, err = k.Decrypt(config.Random(), padToKeySize(k.Public().(*rsa.PublicKey), e.encryptedMPI1.Bytes()), nil) case PubKeyAlgoElGamal: c1 := new(big.Int).SetBytes(e.encryptedMPI1.Bytes()) c2 := new(big.Int).SetBytes(e.encryptedMPI2.Bytes()) b, err = elgamal.Decrypt(priv.PrivateKey.(*elgamal.PrivateKey), c1, c2) case PubKeyAlgoECDH: vsG := e.encryptedMPI1.Bytes() m := e.encryptedMPI2.Bytes() oid := priv.PublicKey.oid.EncodedBytes() fp := priv.PublicKey.Fingerprint[:] if priv.PublicKey.Version == 5 { // For v5 the, the fingerprint must be restricted to 20 bytes fp = fp[:20] } b, err = ecdh.Decrypt(priv.PrivateKey.(*ecdh.PrivateKey), vsG, m, oid, fp) case PubKeyAlgoX25519: b, err = x25519.Decrypt(priv.PrivateKey.(*x25519.PrivateKey), e.ephemeralPublicX25519, e.encryptedSession) case PubKeyAlgoX448: b, err = x448.Decrypt(priv.PrivateKey.(*x448.PrivateKey), e.ephemeralPublicX448, e.encryptedSession) default: err = errors.InvalidArgumentError("cannot decrypt encrypted session key with private key of type " + strconv.Itoa(int(priv.PubKeyAlgo))) } if err != nil { return err } var key []byte switch priv.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal, PubKeyAlgoECDH: keyOffset := 0 if e.Version < 6 { e.CipherFunc = CipherFunction(b[0]) keyOffset = 1 if !e.CipherFunc.IsSupported() { return errors.UnsupportedError("unsupported encryption function") } } key, err = decodeChecksumKey(b[keyOffset:]) if err != nil { return err } case PubKeyAlgoX25519, PubKeyAlgoX448: if e.Version < 6 { switch e.CipherFunc { case CipherAES128, CipherAES192, CipherAES256: break default: return errors.StructuralError("v3 PKESK mandates AES as cipher function for x25519 and x448") } } key = b[:] default: return errors.UnsupportedError("unsupported algorithm for decryption") } e.Key = key return nil } // Serialize writes the encrypted key packet, e, to w. func (e *EncryptedKey) Serialize(w io.Writer) error { var encodedLength int switch e.Algo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: encodedLength = int(e.encryptedMPI1.EncodedLength()) case PubKeyAlgoElGamal: encodedLength = int(e.encryptedMPI1.EncodedLength()) + int(e.encryptedMPI2.EncodedLength()) case PubKeyAlgoECDH: encodedLength = int(e.encryptedMPI1.EncodedLength()) + int(e.encryptedMPI2.EncodedLength()) case PubKeyAlgoX25519: encodedLength = x25519.EncodedFieldsLength(e.encryptedSession, e.Version == 6) case PubKeyAlgoX448: encodedLength = x448.EncodedFieldsLength(e.encryptedSession, e.Version == 6) default: return errors.InvalidArgumentError("don't know how to serialize encrypted key type " + strconv.Itoa(int(e.Algo))) } packetLen := versionSize /* version */ + keyIdSize /* key id */ + algorithmSize /* algo */ + encodedLength if e.Version == 6 { packetLen = versionSize /* version */ + algorithmSize /* algo */ + encodedLength + keyVersionSize /* key version */ if e.KeyVersion == 6 { packetLen += fingerprintSizeV6 } else if e.KeyVersion == 4 { packetLen += fingerprintSize } } err := serializeHeader(w, packetTypeEncryptedKey, packetLen) if err != nil { return err } _, err = w.Write([]byte{byte(e.Version)}) if err != nil { return err } if e.Version == 6 { _, err = w.Write([]byte{byte(e.KeyVersion)}) if err != nil { return err } // The key version number may also be zero, // and the fingerprint omitted if e.KeyVersion != 0 { _, err = w.Write(e.KeyFingerprint) if err != nil { return err } } } else { // Write KeyID err = binary.Write(w, binary.BigEndian, e.KeyId) if err != nil { return err } } _, err = w.Write([]byte{byte(e.Algo)}) if err != nil { return err } switch e.Algo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: _, err := w.Write(e.encryptedMPI1.EncodedBytes()) return err case PubKeyAlgoElGamal: if _, err := w.Write(e.encryptedMPI1.EncodedBytes()); err != nil { return err } _, err := w.Write(e.encryptedMPI2.EncodedBytes()) return err case PubKeyAlgoECDH: if _, err := w.Write(e.encryptedMPI1.EncodedBytes()); err != nil { return err } _, err := w.Write(e.encryptedMPI2.EncodedBytes()) return err case PubKeyAlgoX25519: err := x25519.EncodeFields(w, e.ephemeralPublicX25519, e.encryptedSession, byte(e.CipherFunc), e.Version == 6) return err case PubKeyAlgoX448: err := x448.EncodeFields(w, e.ephemeralPublicX448, e.encryptedSession, byte(e.CipherFunc), e.Version == 6) return err default: panic("internal error") } } // SerializeEncryptedKeyAEAD serializes an encrypted key packet to w that contains // key, encrypted to pub. // If aeadSupported is set, PKESK v6 is used, otherwise v3. // Note: aeadSupported MUST match the value passed to SerializeSymmetricallyEncrypted. // If config is nil, sensible defaults will be used. func SerializeEncryptedKeyAEAD(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, aeadSupported bool, key []byte, config *Config) error { return SerializeEncryptedKeyAEADwithHiddenOption(w, pub, cipherFunc, aeadSupported, key, false, config) } // SerializeEncryptedKeyAEADwithHiddenOption serializes an encrypted key packet to w that contains // key, encrypted to pub. // Offers the hidden flag option to indicated if the PKESK packet should include a wildcard KeyID. // If aeadSupported is set, PKESK v6 is used, otherwise v3. // Note: aeadSupported MUST match the value passed to SerializeSymmetricallyEncrypted. // If config is nil, sensible defaults will be used. func SerializeEncryptedKeyAEADwithHiddenOption(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, aeadSupported bool, key []byte, hidden bool, config *Config) error { var buf [36]byte // max possible header size is v6 lenHeaderWritten := versionSize version := 3 if aeadSupported { version = 6 } // An implementation MUST NOT generate ElGamal v6 PKESKs. if version == 6 && pub.PubKeyAlgo == PubKeyAlgoElGamal { return errors.InvalidArgumentError("ElGamal v6 PKESK are not allowed") } // In v3 PKESKs, for x25519 and x448, mandate using AES if version == 3 && (pub.PubKeyAlgo == PubKeyAlgoX25519 || pub.PubKeyAlgo == PubKeyAlgoX448) { switch cipherFunc { case CipherAES128, CipherAES192, CipherAES256: break default: return errors.InvalidArgumentError("v3 PKESK mandates AES for x25519 and x448") } } buf[0] = byte(version) // If hidden is set, the key should be hidden // An implementation MAY accept or use a Key ID of all zeros, // or a key version of zero and no key fingerprint, to hide the intended decryption key. // See Section 5.1.8. in the open pgp crypto refresh if version == 6 { if !hidden { // A one-octet size of the following two fields. buf[1] = byte(keyVersionSize + len(pub.Fingerprint)) // A one octet key version number. buf[2] = byte(pub.Version) lenHeaderWritten += keyVersionSize + 1 // The fingerprint of the public key copy(buf[lenHeaderWritten:lenHeaderWritten+len(pub.Fingerprint)], pub.Fingerprint) lenHeaderWritten += len(pub.Fingerprint) } else { // The size may also be zero, and the key version // and fingerprint omitted for an "anonymous recipient" buf[1] = 0 lenHeaderWritten += 1 } } else { if !hidden { binary.BigEndian.PutUint64(buf[versionSize:(versionSize+keyIdSize)], pub.KeyId) } lenHeaderWritten += keyIdSize } buf[lenHeaderWritten] = byte(pub.PubKeyAlgo) lenHeaderWritten += algorithmSize var keyBlock []byte switch pub.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal, PubKeyAlgoECDH: lenKeyBlock := len(key) + 2 if version < 6 { lenKeyBlock += 1 // cipher type included } keyBlock = make([]byte, lenKeyBlock) keyOffset := 0 if version < 6 { keyBlock[0] = byte(cipherFunc) keyOffset = 1 } encodeChecksumKey(keyBlock[keyOffset:], key) case PubKeyAlgoX25519, PubKeyAlgoX448: // algorithm is added in plaintext below keyBlock = key } switch pub.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: return serializeEncryptedKeyRSA(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*rsa.PublicKey), keyBlock) case PubKeyAlgoElGamal: return serializeEncryptedKeyElGamal(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*elgamal.PublicKey), keyBlock) case PubKeyAlgoECDH: return serializeEncryptedKeyECDH(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*ecdh.PublicKey), keyBlock, pub.oid, pub.Fingerprint) case PubKeyAlgoX25519: return serializeEncryptedKeyX25519(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*x25519.PublicKey), keyBlock, byte(cipherFunc), version) case PubKeyAlgoX448: return serializeEncryptedKeyX448(w, config.Random(), buf[:lenHeaderWritten], pub.PublicKey.(*x448.PublicKey), keyBlock, byte(cipherFunc), version) case PubKeyAlgoDSA, PubKeyAlgoRSASignOnly: return errors.InvalidArgumentError("cannot encrypt to public key of type " + strconv.Itoa(int(pub.PubKeyAlgo))) } return errors.UnsupportedError("encrypting a key to public key of type " + strconv.Itoa(int(pub.PubKeyAlgo))) } // SerializeEncryptedKey serializes an encrypted key packet to w that contains // key, encrypted to pub. // PKESKv6 is used if config.AEAD() is not nil. // If config is nil, sensible defaults will be used. // Deprecated: Use SerializeEncryptedKeyAEAD instead. func SerializeEncryptedKey(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, key []byte, config *Config) error { return SerializeEncryptedKeyAEAD(w, pub, cipherFunc, config.AEAD() != nil, key, config) } // SerializeEncryptedKeyWithHiddenOption serializes an encrypted key packet to w that contains // key, encrypted to pub. PKESKv6 is used if config.AEAD() is not nil. // The hidden option controls if the packet should be anonymous, i.e., omit key metadata. // If config is nil, sensible defaults will be used. // Deprecated: Use SerializeEncryptedKeyAEADwithHiddenOption instead. func SerializeEncryptedKeyWithHiddenOption(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, key []byte, hidden bool, config *Config) error { return SerializeEncryptedKeyAEADwithHiddenOption(w, pub, cipherFunc, config.AEAD() != nil, key, hidden, config) } func serializeEncryptedKeyRSA(w io.Writer, rand io.Reader, header []byte, pub *rsa.PublicKey, keyBlock []byte) error { cipherText, err := rsa.EncryptPKCS1v15(rand, pub, keyBlock) if err != nil { return errors.InvalidArgumentError("RSA encryption failed: " + err.Error()) } cipherMPI := encoding.NewMPI(cipherText) packetLen := len(header) /* header length */ + int(cipherMPI.EncodedLength()) err = serializeHeader(w, packetTypeEncryptedKey, packetLen) if err != nil { return err } _, err = w.Write(header[:]) if err != nil { return err } _, err = w.Write(cipherMPI.EncodedBytes()) return err } func serializeEncryptedKeyElGamal(w io.Writer, rand io.Reader, header []byte, pub *elgamal.PublicKey, keyBlock []byte) error { c1, c2, err := elgamal.Encrypt(rand, pub, keyBlock) if err != nil { return errors.InvalidArgumentError("ElGamal encryption failed: " + err.Error()) } packetLen := len(header) /* header length */ packetLen += 2 /* mpi size */ + (c1.BitLen()+7)/8 packetLen += 2 /* mpi size */ + (c2.BitLen()+7)/8 err = serializeHeader(w, packetTypeEncryptedKey, packetLen) if err != nil { return err } _, err = w.Write(header[:]) if err != nil { return err } if _, err = w.Write(new(encoding.MPI).SetBig(c1).EncodedBytes()); err != nil { return err } _, err = w.Write(new(encoding.MPI).SetBig(c2).EncodedBytes()) return err } func serializeEncryptedKeyECDH(w io.Writer, rand io.Reader, header []byte, pub *ecdh.PublicKey, keyBlock []byte, oid encoding.Field, fingerprint []byte) error { vsG, c, err := ecdh.Encrypt(rand, pub, keyBlock, oid.EncodedBytes(), fingerprint) if err != nil { return errors.InvalidArgumentError("ECDH encryption failed: " + err.Error()) } g := encoding.NewMPI(vsG) m := encoding.NewOID(c) packetLen := len(header) /* header length */ packetLen += int(g.EncodedLength()) + int(m.EncodedLength()) err = serializeHeader(w, packetTypeEncryptedKey, packetLen) if err != nil { return err } _, err = w.Write(header[:]) if err != nil { return err } if _, err = w.Write(g.EncodedBytes()); err != nil { return err } _, err = w.Write(m.EncodedBytes()) return err } func serializeEncryptedKeyX25519(w io.Writer, rand io.Reader, header []byte, pub *x25519.PublicKey, keyBlock []byte, cipherFunc byte, version int) error { ephemeralPublicX25519, ciphertext, err := x25519.Encrypt(rand, pub, keyBlock) if err != nil { return errors.InvalidArgumentError("x25519 encryption failed: " + err.Error()) } packetLen := len(header) /* header length */ packetLen += x25519.EncodedFieldsLength(ciphertext, version == 6) err = serializeHeader(w, packetTypeEncryptedKey, packetLen) if err != nil { return err } _, err = w.Write(header[:]) if err != nil { return err } return x25519.EncodeFields(w, ephemeralPublicX25519, ciphertext, cipherFunc, version == 6) } func serializeEncryptedKeyX448(w io.Writer, rand io.Reader, header []byte, pub *x448.PublicKey, keyBlock []byte, cipherFunc byte, version int) error { ephemeralPublicX448, ciphertext, err := x448.Encrypt(rand, pub, keyBlock) if err != nil { return errors.InvalidArgumentError("x448 encryption failed: " + err.Error()) } packetLen := len(header) /* header length */ packetLen += x448.EncodedFieldsLength(ciphertext, version == 6) err = serializeHeader(w, packetTypeEncryptedKey, packetLen) if err != nil { return err } _, err = w.Write(header[:]) if err != nil { return err } return x448.EncodeFields(w, ephemeralPublicX448, ciphertext, cipherFunc, version == 6) } func checksumKeyMaterial(key []byte) uint16 { var checksum uint16 for _, v := range key { checksum += uint16(v) } return checksum } func decodeChecksumKey(msg []byte) (key []byte, err error) { key = msg[:len(msg)-2] expectedChecksum := uint16(msg[len(msg)-2])<<8 | uint16(msg[len(msg)-1]) checksum := checksumKeyMaterial(key) if checksum != expectedChecksum { err = errors.StructuralError("session key checksum is incorrect") } return } func encodeChecksumKey(buffer []byte, key []byte) { copy(buffer, key) checksum := checksumKeyMaterial(key) buffer[len(key)] = byte(checksum >> 8) buffer[len(key)+1] = byte(checksum) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/literal.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "encoding/binary" "io" ) // LiteralData represents an encrypted file. See RFC 4880, section 5.9. type LiteralData struct { Format uint8 IsBinary bool FileName string Time uint32 // Unix epoch time. Either creation time or modification time. 0 means undefined. Body io.Reader } // ForEyesOnly returns whether the contents of the LiteralData have been marked // as especially sensitive. func (l *LiteralData) ForEyesOnly() bool { return l.FileName == "_CONSOLE" } func (l *LiteralData) parse(r io.Reader) (err error) { var buf [256]byte _, err = readFull(r, buf[:2]) if err != nil { return } l.Format = buf[0] l.IsBinary = l.Format == 'b' fileNameLen := int(buf[1]) _, err = readFull(r, buf[:fileNameLen]) if err != nil { return } l.FileName = string(buf[:fileNameLen]) _, err = readFull(r, buf[:4]) if err != nil { return } l.Time = binary.BigEndian.Uint32(buf[:4]) l.Body = r return } // SerializeLiteral serializes a literal data packet to w and returns a // WriteCloser to which the data itself can be written and which MUST be closed // on completion. The fileName is truncated to 255 bytes. func SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, err error) { var buf [4]byte buf[0] = 'b' if !isBinary { buf[0] = 'u' } if len(fileName) > 255 { fileName = fileName[:255] } buf[1] = byte(len(fileName)) inner, err := serializeStreamHeader(w, packetTypeLiteralData) if err != nil { return } _, err = inner.Write(buf[:2]) if err != nil { return } _, err = inner.Write([]byte(fileName)) if err != nil { return } binary.BigEndian.PutUint32(buf[:], time) _, err = inner.Write(buf[:]) if err != nil { return } plaintext = inner return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/marker.go ================================================ package packet import ( "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ) type Marker struct{} const markerString = "PGP" // parse just checks if the packet contains "PGP". func (m *Marker) parse(reader io.Reader) error { var buffer [3]byte if _, err := io.ReadFull(reader, buffer[:]); err != nil { return err } if string(buffer[:]) != markerString { return errors.StructuralError("invalid marker packet") } return nil } // SerializeMarker writes a marker packet to writer. func SerializeMarker(writer io.Writer) error { err := serializeHeader(writer, packetTypeMarker, len(markerString)) if err != nil { return err } _, err = writer.Write([]byte(markerString)) return err } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/notation.go ================================================ package packet // Notation type represents a Notation Data subpacket // see https://tools.ietf.org/html/rfc4880#section-5.2.3.16 type Notation struct { Name string Value []byte IsCritical bool IsHumanReadable bool } func (notation *Notation) getData() []byte { nameData := []byte(notation.Name) nameLen := len(nameData) valueLen := len(notation.Value) data := make([]byte, 8+nameLen+valueLen) if notation.IsHumanReadable { data[0] = 0x80 } data[4] = byte(nameLen >> 8) data[5] = byte(nameLen) data[6] = byte(valueLen >> 8) data[7] = byte(valueLen) copy(data[8:8+nameLen], nameData) copy(data[8+nameLen:], notation.Value) return data } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/ocfb.go ================================================ // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // OpenPGP CFB Mode. http://tools.ietf.org/html/rfc4880#section-13.9 package packet import ( "crypto/cipher" ) type ocfbEncrypter struct { b cipher.Block fre []byte outUsed int } // An OCFBResyncOption determines if the "resynchronization step" of OCFB is // performed. type OCFBResyncOption bool const ( OCFBResync OCFBResyncOption = true OCFBNoResync OCFBResyncOption = false ) // NewOCFBEncrypter returns a cipher.Stream which encrypts data with OpenPGP's // cipher feedback mode using the given cipher.Block, and an initial amount of // ciphertext. randData must be random bytes and be the same length as the // cipher.Block's block size. Resync determines if the "resynchronization step" // from RFC 4880, 13.9 step 7 is performed. Different parts of OpenPGP vary on // this point. func NewOCFBEncrypter(block cipher.Block, randData []byte, resync OCFBResyncOption) (cipher.Stream, []byte) { blockSize := block.BlockSize() if len(randData) != blockSize { return nil, nil } x := &ocfbEncrypter{ b: block, fre: make([]byte, blockSize), outUsed: 0, } prefix := make([]byte, blockSize+2) block.Encrypt(x.fre, x.fre) for i := 0; i < blockSize; i++ { prefix[i] = randData[i] ^ x.fre[i] } block.Encrypt(x.fre, prefix[:blockSize]) prefix[blockSize] = x.fre[0] ^ randData[blockSize-2] prefix[blockSize+1] = x.fre[1] ^ randData[blockSize-1] if resync { block.Encrypt(x.fre, prefix[2:]) } else { x.fre[0] = prefix[blockSize] x.fre[1] = prefix[blockSize+1] x.outUsed = 2 } return x, prefix } func (x *ocfbEncrypter) XORKeyStream(dst, src []byte) { for i := 0; i < len(src); i++ { if x.outUsed == len(x.fre) { x.b.Encrypt(x.fre, x.fre) x.outUsed = 0 } x.fre[x.outUsed] ^= src[i] dst[i] = x.fre[x.outUsed] x.outUsed++ } } type ocfbDecrypter struct { b cipher.Block fre []byte outUsed int } // NewOCFBDecrypter returns a cipher.Stream which decrypts data with OpenPGP's // cipher feedback mode using the given cipher.Block. Prefix must be the first // blockSize + 2 bytes of the ciphertext, where blockSize is the cipher.Block's // block size. On successful exit, blockSize+2 bytes of decrypted data are written into // prefix. Resync determines if the "resynchronization step" from RFC 4880, // 13.9 step 7 is performed. Different parts of OpenPGP vary on this point. func NewOCFBDecrypter(block cipher.Block, prefix []byte, resync OCFBResyncOption) cipher.Stream { blockSize := block.BlockSize() if len(prefix) != blockSize+2 { return nil } x := &ocfbDecrypter{ b: block, fre: make([]byte, blockSize), outUsed: 0, } prefixCopy := make([]byte, len(prefix)) copy(prefixCopy, prefix) block.Encrypt(x.fre, x.fre) for i := 0; i < blockSize; i++ { prefixCopy[i] ^= x.fre[i] } block.Encrypt(x.fre, prefix[:blockSize]) prefixCopy[blockSize] ^= x.fre[0] prefixCopy[blockSize+1] ^= x.fre[1] if resync { block.Encrypt(x.fre, prefix[2:]) } else { x.fre[0] = prefix[blockSize] x.fre[1] = prefix[blockSize+1] x.outUsed = 2 } copy(prefix, prefixCopy) return x } func (x *ocfbDecrypter) XORKeyStream(dst, src []byte) { for i := 0; i < len(src); i++ { if x.outUsed == len(x.fre) { x.b.Encrypt(x.fre, x.fre) x.outUsed = 0 } c := src[i] dst[i] = x.fre[x.outUsed] ^ src[i] x.fre[x.outUsed] = c x.outUsed++ } } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "crypto" "encoding/binary" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" ) // OnePassSignature represents a one-pass signature packet. See RFC 4880, // section 5.4. type OnePassSignature struct { Version int SigType SignatureType Hash crypto.Hash PubKeyAlgo PublicKeyAlgorithm KeyId uint64 IsLast bool Salt []byte // v6 only KeyFingerprint []byte // v6 only } func (ops *OnePassSignature) parse(r io.Reader) (err error) { var buf [8]byte // Read: version | signature type | hash algorithm | public-key algorithm _, err = readFull(r, buf[:4]) if err != nil { return } if buf[0] != 3 && buf[0] != 6 { return errors.UnsupportedError("one-pass-signature packet version " + strconv.Itoa(int(buf[0]))) } ops.Version = int(buf[0]) var ok bool ops.Hash, ok = algorithm.HashIdToHashWithSha1(buf[2]) if !ok { return errors.UnsupportedError("hash function: " + strconv.Itoa(int(buf[2]))) } ops.SigType = SignatureType(buf[1]) ops.PubKeyAlgo = PublicKeyAlgorithm(buf[3]) if ops.Version == 6 { // Only for v6, a variable-length field containing the salt _, err = readFull(r, buf[:1]) if err != nil { return } saltLength := int(buf[0]) var expectedSaltLength int expectedSaltLength, err = SaltLengthForHash(ops.Hash) if err != nil { return } if saltLength != expectedSaltLength { err = errors.StructuralError("unexpected salt size for the given hash algorithm") return } salt := make([]byte, expectedSaltLength) _, err = readFull(r, salt) if err != nil { return } ops.Salt = salt // Only for v6 packets, 32 octets of the fingerprint of the signing key. fingerprint := make([]byte, 32) _, err = readFull(r, fingerprint) if err != nil { return } ops.KeyFingerprint = fingerprint ops.KeyId = binary.BigEndian.Uint64(ops.KeyFingerprint[:8]) } else { _, err = readFull(r, buf[:8]) if err != nil { return } ops.KeyId = binary.BigEndian.Uint64(buf[:8]) } _, err = readFull(r, buf[:1]) if err != nil { return } ops.IsLast = buf[0] != 0 return } // Serialize marshals the given OnePassSignature to w. func (ops *OnePassSignature) Serialize(w io.Writer) error { //v3 length 1+1+1+1+8+1 = packetLength := 13 if ops.Version == 6 { // v6 length 1+1+1+1+1+len(salt)+32+1 = packetLength = 38 + len(ops.Salt) } if err := serializeHeader(w, packetTypeOnePassSignature, packetLength); err != nil { return err } var buf [8]byte buf[0] = byte(ops.Version) buf[1] = uint8(ops.SigType) var ok bool buf[2], ok = algorithm.HashToHashIdWithSha1(ops.Hash) if !ok { return errors.UnsupportedError("hash type: " + strconv.Itoa(int(ops.Hash))) } buf[3] = uint8(ops.PubKeyAlgo) _, err := w.Write(buf[:4]) if err != nil { return err } if ops.Version == 6 { // write salt for v6 signatures _, err := w.Write([]byte{uint8(len(ops.Salt))}) if err != nil { return err } _, err = w.Write(ops.Salt) if err != nil { return err } // write fingerprint v6 signatures _, err = w.Write(ops.KeyFingerprint) if err != nil { return err } } else { binary.BigEndian.PutUint64(buf[:8], ops.KeyId) _, err := w.Write(buf[:8]) if err != nil { return err } } isLast := []byte{byte(0)} if ops.IsLast { isLast[0] = 1 } _, err = w.Write(isLast) return err } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go ================================================ // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "bytes" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ) // OpaquePacket represents an OpenPGP packet as raw, unparsed data. This is // useful for splitting and storing the original packet contents separately, // handling unsupported packet types or accessing parts of the packet not yet // implemented by this package. type OpaquePacket struct { // Packet type Tag uint8 // Reason why the packet was parsed opaquely Reason error // Binary contents of the packet data Contents []byte } func (op *OpaquePacket) parse(r io.Reader) (err error) { op.Contents, err = io.ReadAll(r) return } // Serialize marshals the packet to a writer in its original form, including // the packet header. func (op *OpaquePacket) Serialize(w io.Writer) (err error) { err = serializeHeader(w, packetType(op.Tag), len(op.Contents)) if err == nil { _, err = w.Write(op.Contents) } return } // Parse attempts to parse the opaque contents into a structure supported by // this package. If the packet is not known then the result will be another // OpaquePacket. func (op *OpaquePacket) Parse() (p Packet, err error) { hdr := bytes.NewBuffer(nil) err = serializeHeader(hdr, packetType(op.Tag), len(op.Contents)) if err != nil { op.Reason = err return op, err } p, err = Read(io.MultiReader(hdr, bytes.NewBuffer(op.Contents))) if err != nil { op.Reason = err p = op } return } // OpaqueReader reads OpaquePackets from an io.Reader. type OpaqueReader struct { r io.Reader } func NewOpaqueReader(r io.Reader) *OpaqueReader { return &OpaqueReader{r: r} } // Read the next OpaquePacket. func (or *OpaqueReader) Next() (op *OpaquePacket, err error) { tag, _, contents, err := readHeader(or.r) if err != nil { return } op = &OpaquePacket{Tag: uint8(tag), Reason: err} err = op.parse(contents) if err != nil { consumeAll(contents) } return } // OpaqueSubpacket represents an unparsed OpenPGP subpacket, // as found in signature and user attribute packets. type OpaqueSubpacket struct { SubType uint8 EncodedLength []byte // Store the original encoded length for signature verifications. Contents []byte } // OpaqueSubpackets extracts opaque, unparsed OpenPGP subpackets from // their byte representation. func OpaqueSubpackets(contents []byte) (result []*OpaqueSubpacket, err error) { var ( subHeaderLen int subPacket *OpaqueSubpacket ) for len(contents) > 0 { subHeaderLen, subPacket, err = nextSubpacket(contents) if err != nil { break } result = append(result, subPacket) contents = contents[subHeaderLen+len(subPacket.Contents):] } return } func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacket, err error) { // RFC 4880, section 5.2.3.1 var subLen uint32 var encodedLength []byte if len(contents) < 1 { goto Truncated } subPacket = &OpaqueSubpacket{} switch { case contents[0] < 192: subHeaderLen = 2 // 1 length byte, 1 subtype byte if len(contents) < subHeaderLen { goto Truncated } encodedLength = contents[0:1] subLen = uint32(contents[0]) contents = contents[1:] case contents[0] < 255: subHeaderLen = 3 // 2 length bytes, 1 subtype if len(contents) < subHeaderLen { goto Truncated } encodedLength = contents[0:2] subLen = uint32(contents[0]-192)<<8 + uint32(contents[1]) + 192 contents = contents[2:] default: subHeaderLen = 6 // 5 length bytes, 1 subtype if len(contents) < subHeaderLen { goto Truncated } encodedLength = contents[0:5] subLen = uint32(contents[1])<<24 | uint32(contents[2])<<16 | uint32(contents[3])<<8 | uint32(contents[4]) contents = contents[5:] } if subLen > uint32(len(contents)) || subLen == 0 { goto Truncated } subPacket.SubType = contents[0] subPacket.EncodedLength = encodedLength subPacket.Contents = contents[1:subLen] return Truncated: err = errors.StructuralError("subpacket truncated") return } func (osp *OpaqueSubpacket) Serialize(w io.Writer) (err error) { buf := make([]byte, 6) copy(buf, osp.EncodedLength) n := len(osp.EncodedLength) buf[n] = osp.SubType if _, err = w.Write(buf[:n+1]); err != nil { return } _, err = w.Write(osp.Contents) return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package packet implements parsing and serialization of OpenPGP packets, as // specified in RFC 4880. package packet // import "github.com/ProtonMail/go-crypto/openpgp/packet" import ( "bytes" "crypto/cipher" "crypto/rsa" "io" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" ) // readFull is the same as io.ReadFull except that reading zero bytes returns // ErrUnexpectedEOF rather than EOF. func readFull(r io.Reader, buf []byte) (n int, err error) { n, err = io.ReadFull(r, buf) if err == io.EOF { err = io.ErrUnexpectedEOF } return } // readLength reads an OpenPGP length from r. See RFC 4880, section 4.2.2. func readLength(r io.Reader) (length int64, isPartial bool, err error) { var buf [4]byte _, err = readFull(r, buf[:1]) if err != nil { return } switch { case buf[0] < 192: length = int64(buf[0]) case buf[0] < 224: length = int64(buf[0]-192) << 8 _, err = readFull(r, buf[0:1]) if err != nil { return } length += int64(buf[0]) + 192 case buf[0] < 255: length = int64(1) << (buf[0] & 0x1f) isPartial = true default: _, err = readFull(r, buf[0:4]) if err != nil { return } length = int64(buf[0])<<24 | int64(buf[1])<<16 | int64(buf[2])<<8 | int64(buf[3]) } return } // partialLengthReader wraps an io.Reader and handles OpenPGP partial lengths. // The continuation lengths are parsed and removed from the stream and EOF is // returned at the end of the packet. See RFC 4880, section 4.2.2.4. type partialLengthReader struct { r io.Reader remaining int64 isPartial bool } func (r *partialLengthReader) Read(p []byte) (n int, err error) { for r.remaining == 0 { if !r.isPartial { return 0, io.EOF } r.remaining, r.isPartial, err = readLength(r.r) if err != nil { return 0, err } } toRead := int64(len(p)) if toRead > r.remaining { toRead = r.remaining } n, err = r.r.Read(p[:int(toRead)]) r.remaining -= int64(n) if n < int(toRead) && err == io.EOF { err = io.ErrUnexpectedEOF } return } // partialLengthWriter writes a stream of data using OpenPGP partial lengths. // See RFC 4880, section 4.2.2.4. type partialLengthWriter struct { w io.WriteCloser buf bytes.Buffer lengthByte [1]byte } func (w *partialLengthWriter) Write(p []byte) (n int, err error) { bufLen := w.buf.Len() if bufLen > 512 { for power := uint(30); ; power-- { l := 1 << power if bufLen >= l { w.lengthByte[0] = 224 + uint8(power) _, err = w.w.Write(w.lengthByte[:]) if err != nil { return } var m int m, err = w.w.Write(w.buf.Next(l)) if err != nil { return } if m != l { return 0, io.ErrShortWrite } break } } } return w.buf.Write(p) } func (w *partialLengthWriter) Close() (err error) { len := w.buf.Len() err = serializeLength(w.w, len) if err != nil { return err } _, err = w.buf.WriteTo(w.w) if err != nil { return err } return w.w.Close() } // A spanReader is an io.LimitReader, but it returns ErrUnexpectedEOF if the // underlying Reader returns EOF before the limit has been reached. type spanReader struct { r io.Reader n int64 } func (l *spanReader) Read(p []byte) (n int, err error) { if l.n <= 0 { return 0, io.EOF } if int64(len(p)) > l.n { p = p[0:l.n] } n, err = l.r.Read(p) l.n -= int64(n) if l.n > 0 && err == io.EOF { err = io.ErrUnexpectedEOF } return } // readHeader parses a packet header and returns an io.Reader which will return // the contents of the packet. See RFC 4880, section 4.2. func readHeader(r io.Reader) (tag packetType, length int64, contents io.Reader, err error) { var buf [4]byte _, err = io.ReadFull(r, buf[:1]) if err != nil { return } if buf[0]&0x80 == 0 { err = errors.StructuralError("tag byte does not have MSB set") return } if buf[0]&0x40 == 0 { // Old format packet tag = packetType((buf[0] & 0x3f) >> 2) lengthType := buf[0] & 3 if lengthType == 3 { length = -1 contents = r return } lengthBytes := 1 << lengthType _, err = readFull(r, buf[0:lengthBytes]) if err != nil { return } for i := 0; i < lengthBytes; i++ { length <<= 8 length |= int64(buf[i]) } contents = &spanReader{r, length} return } // New format packet tag = packetType(buf[0] & 0x3f) length, isPartial, err := readLength(r) if err != nil { return } if isPartial { contents = &partialLengthReader{ remaining: length, isPartial: true, r: r, } length = -1 } else { contents = &spanReader{r, length} } return } // serializeHeader writes an OpenPGP packet header to w. See RFC 4880, section // 4.2. func serializeHeader(w io.Writer, ptype packetType, length int) (err error) { err = serializeType(w, ptype) if err != nil { return } return serializeLength(w, length) } // serializeType writes an OpenPGP packet type to w. See RFC 4880, section // 4.2. func serializeType(w io.Writer, ptype packetType) (err error) { var buf [1]byte buf[0] = 0x80 | 0x40 | byte(ptype) _, err = w.Write(buf[:]) return } // serializeLength writes an OpenPGP packet length to w. See RFC 4880, section // 4.2.2. func serializeLength(w io.Writer, length int) (err error) { var buf [5]byte var n int if length < 192 { buf[0] = byte(length) n = 1 } else if length < 8384 { length -= 192 buf[0] = 192 + byte(length>>8) buf[1] = byte(length) n = 2 } else { buf[0] = 255 buf[1] = byte(length >> 24) buf[2] = byte(length >> 16) buf[3] = byte(length >> 8) buf[4] = byte(length) n = 5 } _, err = w.Write(buf[:n]) return } // serializeStreamHeader writes an OpenPGP packet header to w where the // length of the packet is unknown. It returns a io.WriteCloser which can be // used to write the contents of the packet. See RFC 4880, section 4.2. func serializeStreamHeader(w io.WriteCloser, ptype packetType) (out io.WriteCloser, err error) { err = serializeType(w, ptype) if err != nil { return } out = &partialLengthWriter{w: w} return } // Packet represents an OpenPGP packet. Users are expected to try casting // instances of this interface to specific packet types. type Packet interface { parse(io.Reader) error } // consumeAll reads from the given Reader until error, returning the number of // bytes read. func consumeAll(r io.Reader) (n int64, err error) { var m int var buf [1024]byte for { m, err = r.Read(buf[:]) n += int64(m) if err == io.EOF { err = nil return } if err != nil { return } } } // packetType represents the numeric ids of the different OpenPGP packet types. See // http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-2 type packetType uint8 const ( packetTypeEncryptedKey packetType = 1 packetTypeSignature packetType = 2 packetTypeSymmetricKeyEncrypted packetType = 3 packetTypeOnePassSignature packetType = 4 packetTypePrivateKey packetType = 5 packetTypePublicKey packetType = 6 packetTypePrivateSubkey packetType = 7 packetTypeCompressed packetType = 8 packetTypeSymmetricallyEncrypted packetType = 9 packetTypeMarker packetType = 10 packetTypeLiteralData packetType = 11 packetTypeTrust packetType = 12 packetTypeUserId packetType = 13 packetTypePublicSubkey packetType = 14 packetTypeUserAttribute packetType = 17 packetTypeSymmetricallyEncryptedIntegrityProtected packetType = 18 packetTypeAEADEncrypted packetType = 20 packetPadding packetType = 21 ) // EncryptedDataPacket holds encrypted data. It is currently implemented by // SymmetricallyEncrypted and AEADEncrypted. type EncryptedDataPacket interface { Decrypt(CipherFunction, []byte) (io.ReadCloser, error) } // Read reads a single OpenPGP packet from the given io.Reader. If there is an // error parsing a packet, the whole packet is consumed from the input. func Read(r io.Reader) (p Packet, err error) { tag, len, contents, err := readHeader(r) if err != nil { return } switch tag { case packetTypeEncryptedKey: p = new(EncryptedKey) case packetTypeSignature: p = new(Signature) case packetTypeSymmetricKeyEncrypted: p = new(SymmetricKeyEncrypted) case packetTypeOnePassSignature: p = new(OnePassSignature) case packetTypePrivateKey, packetTypePrivateSubkey: pk := new(PrivateKey) if tag == packetTypePrivateSubkey { pk.IsSubkey = true } p = pk case packetTypePublicKey, packetTypePublicSubkey: isSubkey := tag == packetTypePublicSubkey p = &PublicKey{IsSubkey: isSubkey} case packetTypeCompressed: p = new(Compressed) case packetTypeSymmetricallyEncrypted: p = new(SymmetricallyEncrypted) case packetTypeLiteralData: p = new(LiteralData) case packetTypeUserId: p = new(UserId) case packetTypeUserAttribute: p = new(UserAttribute) case packetTypeSymmetricallyEncryptedIntegrityProtected: se := new(SymmetricallyEncrypted) se.IntegrityProtected = true p = se case packetTypeAEADEncrypted: p = new(AEADEncrypted) case packetPadding: p = Padding(len) case packetTypeMarker: p = new(Marker) case packetTypeTrust: // Not implemented, just consume err = errors.UnknownPacketTypeError(tag) default: // Packet Tags from 0 to 39 are critical. // Packet Tags from 40 to 63 are non-critical. if tag < 40 { err = errors.CriticalUnknownPacketTypeError(tag) } else { err = errors.UnknownPacketTypeError(tag) } } if p != nil { err = p.parse(contents) } if err != nil { consumeAll(contents) } return } // ReadWithCheck reads a single OpenPGP message packet from the given io.Reader. If there is an // error parsing a packet, the whole packet is consumed from the input. // ReadWithCheck additionally checks if the OpenPGP message packet sequence adheres // to the packet composition rules in rfc4880, if not throws an error. func ReadWithCheck(r io.Reader, sequence *SequenceVerifier) (p Packet, msgErr error, err error) { tag, len, contents, err := readHeader(r) if err != nil { return } switch tag { case packetTypeEncryptedKey: msgErr = sequence.Next(ESKSymbol) p = new(EncryptedKey) case packetTypeSignature: msgErr = sequence.Next(SigSymbol) p = new(Signature) case packetTypeSymmetricKeyEncrypted: msgErr = sequence.Next(ESKSymbol) p = new(SymmetricKeyEncrypted) case packetTypeOnePassSignature: msgErr = sequence.Next(OPSSymbol) p = new(OnePassSignature) case packetTypeCompressed: msgErr = sequence.Next(CompSymbol) p = new(Compressed) case packetTypeSymmetricallyEncrypted: msgErr = sequence.Next(EncSymbol) p = new(SymmetricallyEncrypted) case packetTypeLiteralData: msgErr = sequence.Next(LDSymbol) p = new(LiteralData) case packetTypeSymmetricallyEncryptedIntegrityProtected: msgErr = sequence.Next(EncSymbol) se := new(SymmetricallyEncrypted) se.IntegrityProtected = true p = se case packetTypeAEADEncrypted: msgErr = sequence.Next(EncSymbol) p = new(AEADEncrypted) case packetPadding: p = Padding(len) case packetTypeMarker: p = new(Marker) case packetTypeTrust: // Not implemented, just consume err = errors.UnknownPacketTypeError(tag) case packetTypePrivateKey, packetTypePrivateSubkey, packetTypePublicKey, packetTypePublicSubkey, packetTypeUserId, packetTypeUserAttribute: msgErr = sequence.Next(UnknownSymbol) consumeAll(contents) default: // Packet Tags from 0 to 39 are critical. // Packet Tags from 40 to 63 are non-critical. if tag < 40 { err = errors.CriticalUnknownPacketTypeError(tag) } else { err = errors.UnknownPacketTypeError(tag) } } if p != nil { err = p.parse(contents) } if err != nil { consumeAll(contents) } return } // SignatureType represents the different semantic meanings of an OpenPGP // signature. See RFC 4880, section 5.2.1. type SignatureType uint8 const ( SigTypeBinary SignatureType = 0x00 SigTypeText SignatureType = 0x01 SigTypeGenericCert SignatureType = 0x10 SigTypePersonaCert SignatureType = 0x11 SigTypeCasualCert SignatureType = 0x12 SigTypePositiveCert SignatureType = 0x13 SigTypeSubkeyBinding SignatureType = 0x18 SigTypePrimaryKeyBinding SignatureType = 0x19 SigTypeDirectSignature SignatureType = 0x1F SigTypeKeyRevocation SignatureType = 0x20 SigTypeSubkeyRevocation SignatureType = 0x28 SigTypeCertificationRevocation SignatureType = 0x30 ) // PublicKeyAlgorithm represents the different public key system specified for // OpenPGP. See // http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-12 type PublicKeyAlgorithm uint8 const ( PubKeyAlgoRSA PublicKeyAlgorithm = 1 PubKeyAlgoElGamal PublicKeyAlgorithm = 16 PubKeyAlgoDSA PublicKeyAlgorithm = 17 // RFC 6637, Section 5. PubKeyAlgoECDH PublicKeyAlgorithm = 18 PubKeyAlgoECDSA PublicKeyAlgorithm = 19 // https://www.ietf.org/archive/id/draft-koch-eddsa-for-openpgp-04.txt PubKeyAlgoEdDSA PublicKeyAlgorithm = 22 // https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh PubKeyAlgoX25519 PublicKeyAlgorithm = 25 PubKeyAlgoX448 PublicKeyAlgorithm = 26 PubKeyAlgoEd25519 PublicKeyAlgorithm = 27 PubKeyAlgoEd448 PublicKeyAlgorithm = 28 // Deprecated in RFC 4880, Section 13.5. Use key flags instead. PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3 ) // CanEncrypt returns true if it's possible to encrypt a message to a public // key of the given type. func (pka PublicKeyAlgorithm) CanEncrypt() bool { switch pka { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal, PubKeyAlgoECDH, PubKeyAlgoX25519, PubKeyAlgoX448: return true } return false } // CanSign returns true if it's possible for a public key of the given type to // sign a message. func (pka PublicKeyAlgorithm) CanSign() bool { switch pka { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA, PubKeyAlgoEdDSA, PubKeyAlgoEd25519, PubKeyAlgoEd448: return true } return false } // CipherFunction represents the different block ciphers specified for OpenPGP. See // http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13 type CipherFunction algorithm.CipherFunction const ( Cipher3DES CipherFunction = 2 CipherCAST5 CipherFunction = 3 CipherAES128 CipherFunction = 7 CipherAES192 CipherFunction = 8 CipherAES256 CipherFunction = 9 ) // KeySize returns the key size, in bytes, of cipher. func (cipher CipherFunction) KeySize() int { return algorithm.CipherFunction(cipher).KeySize() } // IsSupported returns true if the cipher is supported from the library func (cipher CipherFunction) IsSupported() bool { return algorithm.CipherFunction(cipher).KeySize() > 0 } // blockSize returns the block size, in bytes, of cipher. func (cipher CipherFunction) blockSize() int { return algorithm.CipherFunction(cipher).BlockSize() } // new returns a fresh instance of the given cipher. func (cipher CipherFunction) new(key []byte) (block cipher.Block) { return algorithm.CipherFunction(cipher).New(key) } // padToKeySize left-pads a MPI with zeroes to match the length of the // specified RSA public. func padToKeySize(pub *rsa.PublicKey, b []byte) []byte { k := (pub.N.BitLen() + 7) / 8 if len(b) >= k { return b } bb := make([]byte, k) copy(bb[len(bb)-len(b):], b) return bb } // CompressionAlgo Represents the different compression algorithms // supported by OpenPGP (except for BZIP2, which is not currently // supported). See Section 9.3 of RFC 4880. type CompressionAlgo uint8 const ( CompressionNone CompressionAlgo = 0 CompressionZIP CompressionAlgo = 1 CompressionZLIB CompressionAlgo = 2 ) // AEADMode represents the different Authenticated Encryption with Associated // Data specified for OpenPGP. // See https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.6 type AEADMode algorithm.AEADMode const ( AEADModeEAX AEADMode = 1 AEADModeOCB AEADMode = 2 AEADModeGCM AEADMode = 3 ) func (mode AEADMode) IvLength() int { return algorithm.AEADMode(mode).NonceLength() } func (mode AEADMode) TagLength() int { return algorithm.AEADMode(mode).TagLength() } // IsSupported returns true if the aead mode is supported from the library func (mode AEADMode) IsSupported() bool { return algorithm.AEADMode(mode).TagLength() > 0 } // new returns a fresh instance of the given mode. func (mode AEADMode) new(block cipher.Block) cipher.AEAD { return algorithm.AEADMode(mode).New(block) } // ReasonForRevocation represents a revocation reason code as per RFC4880 // section 5.2.3.23. type ReasonForRevocation uint8 const ( NoReason ReasonForRevocation = 0 KeySuperseded ReasonForRevocation = 1 KeyCompromised ReasonForRevocation = 2 KeyRetired ReasonForRevocation = 3 UserIDNotValid ReasonForRevocation = 32 Unknown ReasonForRevocation = 200 ) func NewReasonForRevocation(value byte) ReasonForRevocation { if value < 4 || value == 32 { return ReasonForRevocation(value) } return Unknown } // Curve is a mapping to supported ECC curves for key generation. // See https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-06.html#name-curve-specific-wire-formats type Curve string const ( Curve25519 Curve = "Curve25519" Curve448 Curve = "Curve448" CurveNistP256 Curve = "P256" CurveNistP384 Curve = "P384" CurveNistP521 Curve = "P521" CurveSecP256k1 Curve = "SecP256k1" CurveBrainpoolP256 Curve = "BrainpoolP256" CurveBrainpoolP384 Curve = "BrainpoolP384" CurveBrainpoolP512 Curve = "BrainpoolP512" ) // TrustLevel represents a trust level per RFC4880 5.2.3.13 type TrustLevel uint8 // TrustAmount represents a trust amount per RFC4880 5.2.3.13 type TrustAmount uint8 const ( // versionSize is the length in bytes of the version value. versionSize = 1 // algorithmSize is the length in bytes of the key algorithm value. algorithmSize = 1 // keyVersionSize is the length in bytes of the key version value keyVersionSize = 1 // keyIdSize is the length in bytes of the key identifier value. keyIdSize = 8 // timestampSize is the length in bytes of encoded timestamps. timestampSize = 4 // fingerprintSizeV6 is the length in bytes of the key fingerprint in v6. fingerprintSizeV6 = 32 // fingerprintSize is the length in bytes of the key fingerprint. fingerprintSize = 20 ) ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet_sequence.go ================================================ package packet // This file implements the pushdown automata (PDA) from PGPainless (Paul Schaub) // to verify pgp packet sequences. See Paul's blogpost for more details: // https://blog.jabberhead.tk/2022/10/26/implementing-packet-sequence-validation-using-pushdown-automata/ import ( "fmt" "github.com/ProtonMail/go-crypto/openpgp/errors" ) func NewErrMalformedMessage(from State, input InputSymbol, stackSymbol StackSymbol) errors.ErrMalformedMessage { return errors.ErrMalformedMessage(fmt.Sprintf("state %d, input symbol %d, stack symbol %d ", from, input, stackSymbol)) } // InputSymbol defines the input alphabet of the PDA type InputSymbol uint8 const ( LDSymbol InputSymbol = iota SigSymbol OPSSymbol CompSymbol ESKSymbol EncSymbol EOSSymbol UnknownSymbol ) // StackSymbol defines the stack alphabet of the PDA type StackSymbol int8 const ( MsgStackSymbol StackSymbol = iota OpsStackSymbol KeyStackSymbol EndStackSymbol EmptyStackSymbol ) // State defines the states of the PDA type State int8 const ( OpenPGPMessage State = iota ESKMessage LiteralMessage CompressedMessage EncryptedMessage ValidMessage ) // transition represents a state transition in the PDA type transition func(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) // SequenceVerifier is a pushdown automata to verify // PGP messages packet sequences according to rfc4880. type SequenceVerifier struct { stack []StackSymbol state State } // Next performs a state transition with the given input symbol. // If the transition fails a ErrMalformedMessage is returned. func (sv *SequenceVerifier) Next(input InputSymbol) error { for { stackSymbol := sv.popStack() transitionFunc := getTransition(sv.state) nextState, newStackSymbols, redo, err := transitionFunc(input, stackSymbol) if err != nil { return err } if redo { sv.pushStack(stackSymbol) } for _, newStackSymbol := range newStackSymbols { sv.pushStack(newStackSymbol) } sv.state = nextState if !redo { break } } return nil } // Valid returns true if RDA is in a valid state. func (sv *SequenceVerifier) Valid() bool { return sv.state == ValidMessage && len(sv.stack) == 0 } func (sv *SequenceVerifier) AssertValid() error { if !sv.Valid() { return errors.ErrMalformedMessage("invalid message") } return nil } func NewSequenceVerifier() *SequenceVerifier { return &SequenceVerifier{ stack: []StackSymbol{EndStackSymbol, MsgStackSymbol}, state: OpenPGPMessage, } } func (sv *SequenceVerifier) popStack() StackSymbol { if len(sv.stack) == 0 { return EmptyStackSymbol } elemIndex := len(sv.stack) - 1 stackSymbol := sv.stack[elemIndex] sv.stack = sv.stack[:elemIndex] return stackSymbol } func (sv *SequenceVerifier) pushStack(stackSymbol StackSymbol) { sv.stack = append(sv.stack, stackSymbol) } func getTransition(from State) transition { switch from { case OpenPGPMessage: return fromOpenPGPMessage case LiteralMessage: return fromLiteralMessage case CompressedMessage: return fromCompressedMessage case EncryptedMessage: return fromEncryptedMessage case ESKMessage: return fromESKMessage case ValidMessage: return fromValidMessage } return nil } // fromOpenPGPMessage is the transition for the state OpenPGPMessage. func fromOpenPGPMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) { if stackSymbol != MsgStackSymbol { return 0, nil, false, NewErrMalformedMessage(OpenPGPMessage, input, stackSymbol) } switch input { case LDSymbol: return LiteralMessage, nil, false, nil case SigSymbol: return OpenPGPMessage, []StackSymbol{MsgStackSymbol}, false, nil case OPSSymbol: return OpenPGPMessage, []StackSymbol{OpsStackSymbol, MsgStackSymbol}, false, nil case CompSymbol: return CompressedMessage, nil, false, nil case ESKSymbol: return ESKMessage, []StackSymbol{KeyStackSymbol}, false, nil case EncSymbol: return EncryptedMessage, nil, false, nil } return 0, nil, false, NewErrMalformedMessage(OpenPGPMessage, input, stackSymbol) } // fromESKMessage is the transition for the state ESKMessage. func fromESKMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) { if stackSymbol != KeyStackSymbol { return 0, nil, false, NewErrMalformedMessage(ESKMessage, input, stackSymbol) } switch input { case ESKSymbol: return ESKMessage, []StackSymbol{KeyStackSymbol}, false, nil case EncSymbol: return EncryptedMessage, nil, false, nil } return 0, nil, false, NewErrMalformedMessage(ESKMessage, input, stackSymbol) } // fromLiteralMessage is the transition for the state LiteralMessage. func fromLiteralMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) { switch input { case SigSymbol: if stackSymbol == OpsStackSymbol { return LiteralMessage, nil, false, nil } case EOSSymbol: if stackSymbol == EndStackSymbol { return ValidMessage, nil, false, nil } } return 0, nil, false, NewErrMalformedMessage(LiteralMessage, input, stackSymbol) } // fromLiteralMessage is the transition for the state CompressedMessage. func fromCompressedMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) { switch input { case SigSymbol: if stackSymbol == OpsStackSymbol { return CompressedMessage, nil, false, nil } case EOSSymbol: if stackSymbol == EndStackSymbol { return ValidMessage, nil, false, nil } } return OpenPGPMessage, []StackSymbol{MsgStackSymbol}, true, nil } // fromEncryptedMessage is the transition for the state EncryptedMessage. func fromEncryptedMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) { switch input { case SigSymbol: if stackSymbol == OpsStackSymbol { return EncryptedMessage, nil, false, nil } case EOSSymbol: if stackSymbol == EndStackSymbol { return ValidMessage, nil, false, nil } } return OpenPGPMessage, []StackSymbol{MsgStackSymbol}, true, nil } // fromValidMessage is the transition for the state ValidMessage. func fromValidMessage(input InputSymbol, stackSymbol StackSymbol) (State, []StackSymbol, bool, error) { return 0, nil, false, NewErrMalformedMessage(ValidMessage, input, stackSymbol) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet_unsupported.go ================================================ package packet import ( "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ) // UnsupportedPackage represents a OpenPGP packet with a known packet type // but with unsupported content. type UnsupportedPacket struct { IncompletePacket Packet Error errors.UnsupportedError } // Implements the Packet interface func (up *UnsupportedPacket) parse(read io.Reader) error { err := up.IncompletePacket.parse(read) if castedErr, ok := err.(errors.UnsupportedError); ok { up.Error = castedErr return nil } return err } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/padding.go ================================================ package packet import ( "io" ) // Padding type represents a Padding Packet (Tag 21). // The padding type is represented by the length of its padding. // see https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh#name-padding-packet-tag-21 type Padding int // parse just ignores the padding content. func (pad Padding) parse(reader io.Reader) error { _, err := io.CopyN(io.Discard, reader, int64(pad)) return err } // SerializePadding writes the padding to writer. func (pad Padding) SerializePadding(writer io.Writer, rand io.Reader) error { err := serializeHeader(writer, packetPadding, int(pad)) if err != nil { return err } _, err = io.CopyN(writer, rand, int64(pad)) return err } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "bytes" "crypto" "crypto/cipher" "crypto/dsa" "crypto/rsa" "crypto/sha1" "crypto/sha256" "crypto/subtle" "fmt" "io" "math/big" "strconv" "time" "github.com/ProtonMail/go-crypto/openpgp/ecdh" "github.com/ProtonMail/go-crypto/openpgp/ecdsa" "github.com/ProtonMail/go-crypto/openpgp/ed25519" "github.com/ProtonMail/go-crypto/openpgp/ed448" "github.com/ProtonMail/go-crypto/openpgp/eddsa" "github.com/ProtonMail/go-crypto/openpgp/elgamal" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" "github.com/ProtonMail/go-crypto/openpgp/s2k" "github.com/ProtonMail/go-crypto/openpgp/x25519" "github.com/ProtonMail/go-crypto/openpgp/x448" "golang.org/x/crypto/hkdf" ) // PrivateKey represents a possibly encrypted private key. See RFC 4880, // section 5.5.3. type PrivateKey struct { PublicKey Encrypted bool // if true then the private key is unavailable until Decrypt has been called. encryptedData []byte cipher CipherFunction s2k func(out, in []byte) aead AEADMode // only relevant if S2KAEAD is enabled // An *{rsa|dsa|elgamal|ecdh|ecdsa|ed25519|ed448}.PrivateKey or // crypto.Signer/crypto.Decrypter (Decryptor RSA only). PrivateKey interface{} iv []byte // Type of encryption of the S2K packet // Allowed values are 0 (Not encrypted), 253 (AEAD), 254 (SHA1), or // 255 (2-byte checksum) s2kType S2KType // Full parameters of the S2K packet s2kParams *s2k.Params } // S2KType s2k packet type type S2KType uint8 const ( // S2KNON unencrypt S2KNON S2KType = 0 // S2KAEAD use authenticated encryption S2KAEAD S2KType = 253 // S2KSHA1 sha1 sum check S2KSHA1 S2KType = 254 // S2KCHECKSUM sum check S2KCHECKSUM S2KType = 255 ) func NewRSAPrivateKey(creationTime time.Time, priv *rsa.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewDSAPrivateKey(creationTime time.Time, priv *dsa.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewDSAPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewElGamalPrivateKey(creationTime time.Time, priv *elgamal.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewECDSAPrivateKey(creationTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewECDSAPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewEdDSAPrivateKey(creationTime time.Time, priv *eddsa.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewEdDSAPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewECDHPrivateKey(creationTime time.Time, priv *ecdh.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewECDHPublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewX25519PrivateKey(creationTime time.Time, priv *x25519.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewX25519PublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewX448PrivateKey(creationTime time.Time, priv *x448.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewX448PublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewEd25519PrivateKey(creationTime time.Time, priv *ed25519.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewEd25519PublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } func NewEd448PrivateKey(creationTime time.Time, priv *ed448.PrivateKey) *PrivateKey { pk := new(PrivateKey) pk.PublicKey = *NewEd448PublicKey(creationTime, &priv.PublicKey) pk.PrivateKey = priv return pk } // NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that // implements RSA, ECDSA or EdDSA. func NewSignerPrivateKey(creationTime time.Time, signer interface{}) *PrivateKey { pk := new(PrivateKey) // In general, the public Keys should be used as pointers. We still // type-switch on the values, for backwards-compatibility. switch pubkey := signer.(type) { case *rsa.PrivateKey: pk.PublicKey = *NewRSAPublicKey(creationTime, &pubkey.PublicKey) case rsa.PrivateKey: pk.PublicKey = *NewRSAPublicKey(creationTime, &pubkey.PublicKey) case *ecdsa.PrivateKey: pk.PublicKey = *NewECDSAPublicKey(creationTime, &pubkey.PublicKey) case ecdsa.PrivateKey: pk.PublicKey = *NewECDSAPublicKey(creationTime, &pubkey.PublicKey) case *eddsa.PrivateKey: pk.PublicKey = *NewEdDSAPublicKey(creationTime, &pubkey.PublicKey) case eddsa.PrivateKey: pk.PublicKey = *NewEdDSAPublicKey(creationTime, &pubkey.PublicKey) case *ed25519.PrivateKey: pk.PublicKey = *NewEd25519PublicKey(creationTime, &pubkey.PublicKey) case ed25519.PrivateKey: pk.PublicKey = *NewEd25519PublicKey(creationTime, &pubkey.PublicKey) case *ed448.PrivateKey: pk.PublicKey = *NewEd448PublicKey(creationTime, &pubkey.PublicKey) case ed448.PrivateKey: pk.PublicKey = *NewEd448PublicKey(creationTime, &pubkey.PublicKey) default: panic("openpgp: unknown signer type in NewSignerPrivateKey") } pk.PrivateKey = signer return pk } // NewDecrypterPrivateKey creates a PrivateKey from a *{rsa|elgamal|ecdh|x25519|x448}.PrivateKey. func NewDecrypterPrivateKey(creationTime time.Time, decrypter interface{}) *PrivateKey { pk := new(PrivateKey) switch priv := decrypter.(type) { case *rsa.PrivateKey: pk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey) case *elgamal.PrivateKey: pk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey) case *ecdh.PrivateKey: pk.PublicKey = *NewECDHPublicKey(creationTime, &priv.PublicKey) case *x25519.PrivateKey: pk.PublicKey = *NewX25519PublicKey(creationTime, &priv.PublicKey) case *x448.PrivateKey: pk.PublicKey = *NewX448PublicKey(creationTime, &priv.PublicKey) default: panic("openpgp: unknown decrypter type in NewDecrypterPrivateKey") } pk.PrivateKey = decrypter return pk } func (pk *PrivateKey) parse(r io.Reader) (err error) { err = (&pk.PublicKey).parse(r) if err != nil { return } v5 := pk.PublicKey.Version == 5 v6 := pk.PublicKey.Version == 6 if V5Disabled && v5 { return errors.UnsupportedError("support for parsing v5 entities is disabled; build with `-tags v5` if needed") } var buf [1]byte _, err = readFull(r, buf[:]) if err != nil { return } pk.s2kType = S2KType(buf[0]) var optCount [1]byte if v5 || (v6 && pk.s2kType != S2KNON) { if _, err = readFull(r, optCount[:]); err != nil { return } } switch pk.s2kType { case S2KNON: pk.s2k = nil pk.Encrypted = false case S2KSHA1, S2KCHECKSUM, S2KAEAD: if (v5 || v6) && pk.s2kType == S2KCHECKSUM { return errors.StructuralError(fmt.Sprintf("wrong s2k identifier for version %d", pk.Version)) } _, err = readFull(r, buf[:]) if err != nil { return } pk.cipher = CipherFunction(buf[0]) if pk.cipher != 0 && !pk.cipher.IsSupported() { return errors.UnsupportedError("unsupported cipher function in private key") } // [Optional] If string-to-key usage octet was 253, // a one-octet AEAD algorithm. if pk.s2kType == S2KAEAD { _, err = readFull(r, buf[:]) if err != nil { return } pk.aead = AEADMode(buf[0]) if !pk.aead.IsSupported() { return errors.UnsupportedError("unsupported aead mode in private key") } } // [Optional] Only for a version 6 packet, // and if string-to-key usage octet was 255, 254, or 253, // an one-octet count of the following field. if v6 { _, err = readFull(r, buf[:]) if err != nil { return } } pk.s2kParams, err = s2k.ParseIntoParams(r) if err != nil { return } if pk.s2kParams.Dummy() { return } if pk.s2kParams.Mode() == s2k.Argon2S2K && pk.s2kType != S2KAEAD { return errors.StructuralError("using Argon2 S2K without AEAD is not allowed") } if pk.s2kParams.Mode() == s2k.SimpleS2K && pk.Version == 6 { return errors.StructuralError("using Simple S2K with version 6 keys is not allowed") } pk.s2k, err = pk.s2kParams.Function() if err != nil { return } pk.Encrypted = true default: return errors.UnsupportedError("deprecated s2k function in private key") } if pk.Encrypted { var ivSize int // If the S2K usage octet was 253, the IV is of the size expected by the AEAD mode, // unless it's a version 5 key, in which case it's the size of the symmetric cipher's block size. // For all other S2K modes, it's always the block size. if !v5 && pk.s2kType == S2KAEAD { ivSize = pk.aead.IvLength() } else { ivSize = pk.cipher.blockSize() } if ivSize == 0 { return errors.UnsupportedError("unsupported cipher in private key: " + strconv.Itoa(int(pk.cipher))) } pk.iv = make([]byte, ivSize) _, err = readFull(r, pk.iv) if err != nil { return } if v5 && pk.s2kType == S2KAEAD { pk.iv = pk.iv[:pk.aead.IvLength()] } } var privateKeyData []byte if v5 { var n [4]byte /* secret material four octet count */ _, err = readFull(r, n[:]) if err != nil { return } count := uint32(uint32(n[0])<<24 | uint32(n[1])<<16 | uint32(n[2])<<8 | uint32(n[3])) if !pk.Encrypted { count = count + 2 /* two octet checksum */ } privateKeyData = make([]byte, count) _, err = readFull(r, privateKeyData) if err != nil { return } } else { privateKeyData, err = io.ReadAll(r) if err != nil { return } } if !pk.Encrypted { if len(privateKeyData) < 2 { return errors.StructuralError("truncated private key data") } if pk.Version != 6 { // checksum var sum uint16 for i := 0; i < len(privateKeyData)-2; i++ { sum += uint16(privateKeyData[i]) } if privateKeyData[len(privateKeyData)-2] != uint8(sum>>8) || privateKeyData[len(privateKeyData)-1] != uint8(sum) { return errors.StructuralError("private key checksum failure") } privateKeyData = privateKeyData[:len(privateKeyData)-2] return pk.parsePrivateKey(privateKeyData) } else { // No checksum return pk.parsePrivateKey(privateKeyData) } } pk.encryptedData = privateKeyData return } // Dummy returns true if the private key is a dummy key. This is a GNU extension. func (pk *PrivateKey) Dummy() bool { return pk.s2kParams.Dummy() } func mod64kHash(d []byte) uint16 { var h uint16 for _, b := range d { h += uint16(b) } return h } func (pk *PrivateKey) Serialize(w io.Writer) (err error) { contents := bytes.NewBuffer(nil) err = pk.PublicKey.serializeWithoutHeaders(contents) if err != nil { return } if _, err = contents.Write([]byte{uint8(pk.s2kType)}); err != nil { return } optional := bytes.NewBuffer(nil) if pk.Encrypted || pk.Dummy() { // [Optional] If string-to-key usage octet was 255, 254, or 253, // a one-octet symmetric encryption algorithm. if _, err = optional.Write([]byte{uint8(pk.cipher)}); err != nil { return } // [Optional] If string-to-key usage octet was 253, // a one-octet AEAD algorithm. if pk.s2kType == S2KAEAD { if _, err = optional.Write([]byte{uint8(pk.aead)}); err != nil { return } } s2kBuffer := bytes.NewBuffer(nil) if err := pk.s2kParams.Serialize(s2kBuffer); err != nil { return err } // [Optional] Only for a version 6 packet, and if string-to-key // usage octet was 255, 254, or 253, an one-octet // count of the following field. if pk.Version == 6 { if _, err = optional.Write([]byte{uint8(s2kBuffer.Len())}); err != nil { return } } // [Optional] If string-to-key usage octet was 255, 254, or 253, // a string-to-key (S2K) specifier. The length of the string-to-key specifier // depends on its type if _, err = io.Copy(optional, s2kBuffer); err != nil { return } // IV if pk.Encrypted { if _, err = optional.Write(pk.iv); err != nil { return } if pk.Version == 5 && pk.s2kType == S2KAEAD { // Add padding for version 5 padding := make([]byte, pk.cipher.blockSize()-len(pk.iv)) if _, err = optional.Write(padding); err != nil { return } } } } if pk.Version == 5 || (pk.Version == 6 && pk.s2kType != S2KNON) { contents.Write([]byte{uint8(optional.Len())}) } if _, err := io.Copy(contents, optional); err != nil { return err } if !pk.Dummy() { l := 0 var priv []byte if !pk.Encrypted { buf := bytes.NewBuffer(nil) err = pk.serializePrivateKey(buf) if err != nil { return err } l = buf.Len() if pk.Version != 6 { checksum := mod64kHash(buf.Bytes()) buf.Write([]byte{byte(checksum >> 8), byte(checksum)}) } priv = buf.Bytes() } else { priv, l = pk.encryptedData, len(pk.encryptedData) } if pk.Version == 5 { contents.Write([]byte{byte(l >> 24), byte(l >> 16), byte(l >> 8), byte(l)}) } contents.Write(priv) } ptype := packetTypePrivateKey if pk.IsSubkey { ptype = packetTypePrivateSubkey } err = serializeHeader(w, ptype, contents.Len()) if err != nil { return } _, err = io.Copy(w, contents) if err != nil { return } return } func serializeRSAPrivateKey(w io.Writer, priv *rsa.PrivateKey) error { if _, err := w.Write(new(encoding.MPI).SetBig(priv.D).EncodedBytes()); err != nil { return err } if _, err := w.Write(new(encoding.MPI).SetBig(priv.Primes[1]).EncodedBytes()); err != nil { return err } if _, err := w.Write(new(encoding.MPI).SetBig(priv.Primes[0]).EncodedBytes()); err != nil { return err } _, err := w.Write(new(encoding.MPI).SetBig(priv.Precomputed.Qinv).EncodedBytes()) return err } func serializeDSAPrivateKey(w io.Writer, priv *dsa.PrivateKey) error { _, err := w.Write(new(encoding.MPI).SetBig(priv.X).EncodedBytes()) return err } func serializeElGamalPrivateKey(w io.Writer, priv *elgamal.PrivateKey) error { _, err := w.Write(new(encoding.MPI).SetBig(priv.X).EncodedBytes()) return err } func serializeECDSAPrivateKey(w io.Writer, priv *ecdsa.PrivateKey) error { _, err := w.Write(encoding.NewMPI(priv.MarshalIntegerSecret()).EncodedBytes()) return err } func serializeEdDSAPrivateKey(w io.Writer, priv *eddsa.PrivateKey) error { _, err := w.Write(encoding.NewMPI(priv.MarshalByteSecret()).EncodedBytes()) return err } func serializeECDHPrivateKey(w io.Writer, priv *ecdh.PrivateKey) error { _, err := w.Write(encoding.NewMPI(priv.MarshalByteSecret()).EncodedBytes()) return err } func serializeX25519PrivateKey(w io.Writer, priv *x25519.PrivateKey) error { _, err := w.Write(priv.Secret) return err } func serializeX448PrivateKey(w io.Writer, priv *x448.PrivateKey) error { _, err := w.Write(priv.Secret) return err } func serializeEd25519PrivateKey(w io.Writer, priv *ed25519.PrivateKey) error { _, err := w.Write(priv.MarshalByteSecret()) return err } func serializeEd448PrivateKey(w io.Writer, priv *ed448.PrivateKey) error { _, err := w.Write(priv.MarshalByteSecret()) return err } // decrypt decrypts an encrypted private key using a decryption key. func (pk *PrivateKey) decrypt(decryptionKey []byte) error { if pk.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } if !pk.Encrypted { return nil } block := pk.cipher.new(decryptionKey) var data []byte switch pk.s2kType { case S2KAEAD: aead := pk.aead.new(block) additionalData, err := pk.additionalData() if err != nil { return err } // Decrypt the encrypted key material with aead data, err = aead.Open(nil, pk.iv, pk.encryptedData, additionalData) if err != nil { return err } case S2KSHA1, S2KCHECKSUM: cfb := cipher.NewCFBDecrypter(block, pk.iv) data = make([]byte, len(pk.encryptedData)) cfb.XORKeyStream(data, pk.encryptedData) if pk.s2kType == S2KSHA1 { if len(data) < sha1.Size { return errors.StructuralError("truncated private key data") } h := sha1.New() h.Write(data[:len(data)-sha1.Size]) sum := h.Sum(nil) if !bytes.Equal(sum, data[len(data)-sha1.Size:]) { return errors.StructuralError("private key checksum failure") } data = data[:len(data)-sha1.Size] } else { if len(data) < 2 { return errors.StructuralError("truncated private key data") } var sum uint16 for i := 0; i < len(data)-2; i++ { sum += uint16(data[i]) } if data[len(data)-2] != uint8(sum>>8) || data[len(data)-1] != uint8(sum) { return errors.StructuralError("private key checksum failure") } data = data[:len(data)-2] } default: return errors.InvalidArgumentError("invalid s2k type") } err := pk.parsePrivateKey(data) if _, ok := err.(errors.KeyInvalidError); ok { return errors.KeyInvalidError("invalid key parameters") } if err != nil { return err } // Mark key as unencrypted pk.s2kType = S2KNON pk.s2k = nil pk.Encrypted = false pk.encryptedData = nil return nil } func (pk *PrivateKey) decryptWithCache(passphrase []byte, keyCache *s2k.Cache) error { if pk.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } if !pk.Encrypted { return nil } key, err := keyCache.GetOrComputeDerivedKey(passphrase, pk.s2kParams, pk.cipher.KeySize()) if err != nil { return err } if pk.s2kType == S2KAEAD { key = pk.applyHKDF(key) } return pk.decrypt(key) } // Decrypt decrypts an encrypted private key using a passphrase. func (pk *PrivateKey) Decrypt(passphrase []byte) error { if pk.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } if !pk.Encrypted { return nil } key := make([]byte, pk.cipher.KeySize()) pk.s2k(key, passphrase) if pk.s2kType == S2KAEAD { key = pk.applyHKDF(key) } return pk.decrypt(key) } // DecryptPrivateKeys decrypts all encrypted keys with the given config and passphrase. // Avoids recomputation of similar s2k key derivations. func DecryptPrivateKeys(keys []*PrivateKey, passphrase []byte) error { // Create a cache to avoid recomputation of key derviations for the same passphrase. s2kCache := &s2k.Cache{} for _, key := range keys { if key != nil && !key.Dummy() && key.Encrypted { err := key.decryptWithCache(passphrase, s2kCache) if err != nil { return err } } } return nil } // encrypt encrypts an unencrypted private key. func (pk *PrivateKey) encrypt(key []byte, params *s2k.Params, s2kType S2KType, cipherFunction CipherFunction, rand io.Reader) error { if pk.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } if pk.Encrypted { return nil } // check if encryptionKey has the correct size if len(key) != cipherFunction.KeySize() { return errors.InvalidArgumentError("supplied encryption key has the wrong size") } if params.Mode() == s2k.Argon2S2K && s2kType != S2KAEAD { return errors.InvalidArgumentError("using Argon2 S2K without AEAD is not allowed") } if params.Mode() != s2k.Argon2S2K && params.Mode() != s2k.IteratedSaltedS2K && params.Mode() != s2k.SaltedS2K { // only allowed for high-entropy passphrases return errors.InvalidArgumentError("insecure S2K mode") } priv := bytes.NewBuffer(nil) err := pk.serializePrivateKey(priv) if err != nil { return err } pk.cipher = cipherFunction pk.s2kParams = params pk.s2k, err = pk.s2kParams.Function() if err != nil { return err } privateKeyBytes := priv.Bytes() pk.s2kType = s2kType block := pk.cipher.new(key) switch s2kType { case S2KAEAD: if pk.aead == 0 { return errors.StructuralError("aead mode is not set on key") } aead := pk.aead.new(block) additionalData, err := pk.additionalData() if err != nil { return err } pk.iv = make([]byte, aead.NonceSize()) _, err = io.ReadFull(rand, pk.iv) if err != nil { return err } // Decrypt the encrypted key material with aead pk.encryptedData = aead.Seal(nil, pk.iv, privateKeyBytes, additionalData) case S2KSHA1, S2KCHECKSUM: pk.iv = make([]byte, pk.cipher.blockSize()) _, err = io.ReadFull(rand, pk.iv) if err != nil { return err } cfb := cipher.NewCFBEncrypter(block, pk.iv) if s2kType == S2KSHA1 { h := sha1.New() h.Write(privateKeyBytes) sum := h.Sum(nil) privateKeyBytes = append(privateKeyBytes, sum...) } else { var sum uint16 for _, b := range privateKeyBytes { sum += uint16(b) } privateKeyBytes = append(privateKeyBytes, []byte{uint8(sum >> 8), uint8(sum)}...) } pk.encryptedData = make([]byte, len(privateKeyBytes)) cfb.XORKeyStream(pk.encryptedData, privateKeyBytes) default: return errors.InvalidArgumentError("invalid s2k type for encryption") } pk.Encrypted = true pk.PrivateKey = nil return err } // EncryptWithConfig encrypts an unencrypted private key using the passphrase and the config. func (pk *PrivateKey) EncryptWithConfig(passphrase []byte, config *Config) error { params, err := s2k.Generate(config.Random(), config.S2K()) if err != nil { return err } // Derive an encryption key with the configured s2k function. key := make([]byte, config.Cipher().KeySize()) s2k, err := params.Function() if err != nil { return err } s2k(key, passphrase) s2kType := S2KSHA1 if config.AEAD() != nil { s2kType = S2KAEAD pk.aead = config.AEAD().Mode() pk.cipher = config.Cipher() key = pk.applyHKDF(key) } // Encrypt the private key with the derived encryption key. return pk.encrypt(key, params, s2kType, config.Cipher(), config.Random()) } // EncryptPrivateKeys encrypts all unencrypted keys with the given config and passphrase. // Only derives one key from the passphrase, which is then used to encrypt each key. func EncryptPrivateKeys(keys []*PrivateKey, passphrase []byte, config *Config) error { params, err := s2k.Generate(config.Random(), config.S2K()) if err != nil { return err } // Derive an encryption key with the configured s2k function. encryptionKey := make([]byte, config.Cipher().KeySize()) s2k, err := params.Function() if err != nil { return err } s2k(encryptionKey, passphrase) for _, key := range keys { if key != nil && !key.Dummy() && !key.Encrypted { s2kType := S2KSHA1 if config.AEAD() != nil { s2kType = S2KAEAD key.aead = config.AEAD().Mode() key.cipher = config.Cipher() derivedKey := key.applyHKDF(encryptionKey) err = key.encrypt(derivedKey, params, s2kType, config.Cipher(), config.Random()) } else { err = key.encrypt(encryptionKey, params, s2kType, config.Cipher(), config.Random()) } if err != nil { return err } } } return nil } // Encrypt encrypts an unencrypted private key using a passphrase. func (pk *PrivateKey) Encrypt(passphrase []byte) error { // Default config of private key encryption config := &Config{ S2KConfig: &s2k.Config{ S2KMode: s2k.IteratedSaltedS2K, S2KCount: 65536, Hash: crypto.SHA256, }, DefaultCipher: CipherAES256, } return pk.EncryptWithConfig(passphrase, config) } func (pk *PrivateKey) serializePrivateKey(w io.Writer) (err error) { switch priv := pk.PrivateKey.(type) { case *rsa.PrivateKey: err = serializeRSAPrivateKey(w, priv) case *dsa.PrivateKey: err = serializeDSAPrivateKey(w, priv) case *elgamal.PrivateKey: err = serializeElGamalPrivateKey(w, priv) case *ecdsa.PrivateKey: err = serializeECDSAPrivateKey(w, priv) case *eddsa.PrivateKey: err = serializeEdDSAPrivateKey(w, priv) case *ecdh.PrivateKey: err = serializeECDHPrivateKey(w, priv) case *x25519.PrivateKey: err = serializeX25519PrivateKey(w, priv) case *x448.PrivateKey: err = serializeX448PrivateKey(w, priv) case *ed25519.PrivateKey: err = serializeEd25519PrivateKey(w, priv) case *ed448.PrivateKey: err = serializeEd448PrivateKey(w, priv) default: err = errors.InvalidArgumentError("unknown private key type") } return } func (pk *PrivateKey) parsePrivateKey(data []byte) (err error) { switch pk.PublicKey.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoRSAEncryptOnly: return pk.parseRSAPrivateKey(data) case PubKeyAlgoDSA: return pk.parseDSAPrivateKey(data) case PubKeyAlgoElGamal: return pk.parseElGamalPrivateKey(data) case PubKeyAlgoECDSA: return pk.parseECDSAPrivateKey(data) case PubKeyAlgoECDH: return pk.parseECDHPrivateKey(data) case PubKeyAlgoEdDSA: return pk.parseEdDSAPrivateKey(data) case PubKeyAlgoX25519: return pk.parseX25519PrivateKey(data) case PubKeyAlgoX448: return pk.parseX448PrivateKey(data) case PubKeyAlgoEd25519: return pk.parseEd25519PrivateKey(data) case PubKeyAlgoEd448: return pk.parseEd448PrivateKey(data) default: err = errors.StructuralError("unknown private key type") return } } func (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err error) { rsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey) rsaPriv := new(rsa.PrivateKey) rsaPriv.PublicKey = *rsaPub buf := bytes.NewBuffer(data) d := new(encoding.MPI) if _, err := d.ReadFrom(buf); err != nil { return err } p := new(encoding.MPI) if _, err := p.ReadFrom(buf); err != nil { return err } q := new(encoding.MPI) if _, err := q.ReadFrom(buf); err != nil { return err } rsaPriv.D = new(big.Int).SetBytes(d.Bytes()) rsaPriv.Primes = make([]*big.Int, 2) rsaPriv.Primes[0] = new(big.Int).SetBytes(p.Bytes()) rsaPriv.Primes[1] = new(big.Int).SetBytes(q.Bytes()) if err := rsaPriv.Validate(); err != nil { return errors.KeyInvalidError(err.Error()) } rsaPriv.Precompute() pk.PrivateKey = rsaPriv return nil } func (pk *PrivateKey) parseDSAPrivateKey(data []byte) (err error) { dsaPub := pk.PublicKey.PublicKey.(*dsa.PublicKey) dsaPriv := new(dsa.PrivateKey) dsaPriv.PublicKey = *dsaPub buf := bytes.NewBuffer(data) x := new(encoding.MPI) if _, err := x.ReadFrom(buf); err != nil { return err } dsaPriv.X = new(big.Int).SetBytes(x.Bytes()) if err := validateDSAParameters(dsaPriv); err != nil { return err } pk.PrivateKey = dsaPriv return nil } func (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err error) { pub := pk.PublicKey.PublicKey.(*elgamal.PublicKey) priv := new(elgamal.PrivateKey) priv.PublicKey = *pub buf := bytes.NewBuffer(data) x := new(encoding.MPI) if _, err := x.ReadFrom(buf); err != nil { return err } priv.X = new(big.Int).SetBytes(x.Bytes()) if err := validateElGamalParameters(priv); err != nil { return err } pk.PrivateKey = priv return nil } func (pk *PrivateKey) parseECDSAPrivateKey(data []byte) (err error) { ecdsaPub := pk.PublicKey.PublicKey.(*ecdsa.PublicKey) ecdsaPriv := ecdsa.NewPrivateKey(*ecdsaPub) buf := bytes.NewBuffer(data) d := new(encoding.MPI) if _, err := d.ReadFrom(buf); err != nil { return err } if err := ecdsaPriv.UnmarshalIntegerSecret(d.Bytes()); err != nil { return err } if err := ecdsa.Validate(ecdsaPriv); err != nil { return err } pk.PrivateKey = ecdsaPriv return nil } func (pk *PrivateKey) parseECDHPrivateKey(data []byte) (err error) { ecdhPub := pk.PublicKey.PublicKey.(*ecdh.PublicKey) ecdhPriv := ecdh.NewPrivateKey(*ecdhPub) buf := bytes.NewBuffer(data) d := new(encoding.MPI) if _, err := d.ReadFrom(buf); err != nil { return err } if err := ecdhPriv.UnmarshalByteSecret(d.Bytes()); err != nil { return err } if err := ecdh.Validate(ecdhPriv); err != nil { return err } pk.PrivateKey = ecdhPriv return nil } func (pk *PrivateKey) parseX25519PrivateKey(data []byte) (err error) { publicKey := pk.PublicKey.PublicKey.(*x25519.PublicKey) privateKey := x25519.NewPrivateKey(*publicKey) privateKey.PublicKey = *publicKey privateKey.Secret = make([]byte, x25519.KeySize) if len(data) != x25519.KeySize { err = errors.StructuralError("wrong x25519 key size") return err } subtle.ConstantTimeCopy(1, privateKey.Secret, data) if err = x25519.Validate(privateKey); err != nil { return err } pk.PrivateKey = privateKey return nil } func (pk *PrivateKey) parseX448PrivateKey(data []byte) (err error) { publicKey := pk.PublicKey.PublicKey.(*x448.PublicKey) privateKey := x448.NewPrivateKey(*publicKey) privateKey.PublicKey = *publicKey privateKey.Secret = make([]byte, x448.KeySize) if len(data) != x448.KeySize { err = errors.StructuralError("wrong x448 key size") return err } subtle.ConstantTimeCopy(1, privateKey.Secret, data) if err = x448.Validate(privateKey); err != nil { return err } pk.PrivateKey = privateKey return nil } func (pk *PrivateKey) parseEd25519PrivateKey(data []byte) (err error) { publicKey := pk.PublicKey.PublicKey.(*ed25519.PublicKey) privateKey := ed25519.NewPrivateKey(*publicKey) privateKey.PublicKey = *publicKey if len(data) != ed25519.SeedSize { err = errors.StructuralError("wrong ed25519 key size") return err } err = privateKey.UnmarshalByteSecret(data) if err != nil { return err } err = ed25519.Validate(privateKey) if err != nil { return err } pk.PrivateKey = privateKey return nil } func (pk *PrivateKey) parseEd448PrivateKey(data []byte) (err error) { publicKey := pk.PublicKey.PublicKey.(*ed448.PublicKey) privateKey := ed448.NewPrivateKey(*publicKey) privateKey.PublicKey = *publicKey if len(data) != ed448.SeedSize { err = errors.StructuralError("wrong ed448 key size") return err } err = privateKey.UnmarshalByteSecret(data) if err != nil { return err } err = ed448.Validate(privateKey) if err != nil { return err } pk.PrivateKey = privateKey return nil } func (pk *PrivateKey) parseEdDSAPrivateKey(data []byte) (err error) { eddsaPub := pk.PublicKey.PublicKey.(*eddsa.PublicKey) eddsaPriv := eddsa.NewPrivateKey(*eddsaPub) eddsaPriv.PublicKey = *eddsaPub buf := bytes.NewBuffer(data) d := new(encoding.MPI) if _, err := d.ReadFrom(buf); err != nil { return err } if err = eddsaPriv.UnmarshalByteSecret(d.Bytes()); err != nil { return err } if err := eddsa.Validate(eddsaPriv); err != nil { return err } pk.PrivateKey = eddsaPriv return nil } func (pk *PrivateKey) additionalData() ([]byte, error) { additionalData := bytes.NewBuffer(nil) // Write additional data prefix based on packet type var packetByte byte if pk.PublicKey.IsSubkey { packetByte = 0xc7 } else { packetByte = 0xc5 } // Write public key to additional data _, err := additionalData.Write([]byte{packetByte}) if err != nil { return nil, err } err = pk.PublicKey.serializeWithoutHeaders(additionalData) if err != nil { return nil, err } return additionalData.Bytes(), nil } func (pk *PrivateKey) applyHKDF(inputKey []byte) []byte { var packetByte byte if pk.PublicKey.IsSubkey { packetByte = 0xc7 } else { packetByte = 0xc5 } associatedData := []byte{packetByte, byte(pk.Version), byte(pk.cipher), byte(pk.aead)} hkdfReader := hkdf.New(sha256.New, inputKey, []byte{}, associatedData) encryptionKey := make([]byte, pk.cipher.KeySize()) _, _ = readFull(hkdfReader, encryptionKey) return encryptionKey } func validateDSAParameters(priv *dsa.PrivateKey) error { p := priv.P // group prime q := priv.Q // subgroup order g := priv.G // g has order q mod p x := priv.X // secret y := priv.Y // y == g**x mod p one := big.NewInt(1) // expect g, y >= 2 and g < p if g.Cmp(one) <= 0 || y.Cmp(one) <= 0 || g.Cmp(p) > 0 { return errors.KeyInvalidError("dsa: invalid group") } // expect p > q if p.Cmp(q) <= 0 { return errors.KeyInvalidError("dsa: invalid group prime") } // q should be large enough and divide p-1 pSub1 := new(big.Int).Sub(p, one) if q.BitLen() < 150 || new(big.Int).Mod(pSub1, q).Cmp(big.NewInt(0)) != 0 { return errors.KeyInvalidError("dsa: invalid order") } // confirm that g has order q mod p if !q.ProbablyPrime(32) || new(big.Int).Exp(g, q, p).Cmp(one) != 0 { return errors.KeyInvalidError("dsa: invalid order") } // check y if new(big.Int).Exp(g, x, p).Cmp(y) != 0 { return errors.KeyInvalidError("dsa: mismatching values") } return nil } func validateElGamalParameters(priv *elgamal.PrivateKey) error { p := priv.P // group prime g := priv.G // g has order p-1 mod p x := priv.X // secret y := priv.Y // y == g**x mod p one := big.NewInt(1) // Expect g, y >= 2 and g < p if g.Cmp(one) <= 0 || y.Cmp(one) <= 0 || g.Cmp(p) > 0 { return errors.KeyInvalidError("elgamal: invalid group") } if p.BitLen() < 1024 { return errors.KeyInvalidError("elgamal: group order too small") } pSub1 := new(big.Int).Sub(p, one) if new(big.Int).Exp(g, pSub1, p).Cmp(one) != 0 { return errors.KeyInvalidError("elgamal: invalid group") } // Since p-1 is not prime, g might have a smaller order that divides p-1. // We cannot confirm the exact order of g, but we make sure it is not too small. gExpI := new(big.Int).Set(g) i := 1 threshold := 2 << 17 // we want order > threshold for i < threshold { i++ // we check every order to make sure key validation is not easily bypassed by guessing y' gExpI.Mod(new(big.Int).Mul(gExpI, g), p) if gExpI.Cmp(one) == 0 { return errors.KeyInvalidError("elgamal: order too small") } } // Check y if new(big.Int).Exp(g, x, p).Cmp(y) != 0 { return errors.KeyInvalidError("elgamal: mismatching values") } return nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key_test_data.go ================================================ package packet // Generated with `gpg --export-secret-keys "Test Key 2"` const privKeyRSAHex = "9501fe044cc349a8010400b70ca0010e98c090008d45d1ee8f9113bd5861fd57b88bacb7c68658747663f1e1a3b5a98f32fda6472373c024b97359cd2efc88ff60f77751adfbf6af5e615e6a1408cfad8bf0cea30b0d5f53aa27ad59089ba9b15b7ebc2777a25d7b436144027e3bcd203909f147d0e332b240cf63d3395f5dfe0df0a6c04e8655af7eacdf0011010001fe0303024a252e7d475fd445607de39a265472aa74a9320ba2dac395faa687e9e0336aeb7e9a7397e511b5afd9dc84557c80ac0f3d4d7bfec5ae16f20d41c8c84a04552a33870b930420e230e179564f6d19bb153145e76c33ae993886c388832b0fa042ddda7f133924f3854481533e0ede31d51278c0519b29abc3bf53da673e13e3e1214b52413d179d7f66deee35cac8eacb060f78379d70ef4af8607e68131ff529439668fc39c9ce6dfef8a5ac234d234802cbfb749a26107db26406213ae5c06d4673253a3cbee1fcbae58d6ab77e38d6e2c0e7c6317c48e054edadb5a40d0d48acb44643d998139a8a66bb820be1f3f80185bc777d14b5954b60effe2448a036d565c6bc0b915fcea518acdd20ab07bc1529f561c58cd044f723109b93f6fd99f876ff891d64306b5d08f48bab59f38695e9109c4dec34013ba3153488ce070268381ba923ee1eb77125b36afcb4347ec3478c8f2735b06ef17351d872e577fa95d0c397c88c71b59629a36aec" // Generated by `gpg --export-secret-keys` followed by a manual extraction of // the ElGamal subkey from the packets. const privKeyElGamalHex = "9d0157044df9ee1a100400eb8e136a58ec39b582629cdadf830bc64e0a94ed8103ca8bb247b27b11b46d1d25297ef4bcc3071785ba0c0bedfe89eabc5287fcc0edf81ab5896c1c8e4b20d27d79813c7aede75320b33eaeeaa586edc00fd1036c10133e6ba0ff277245d0d59d04b2b3421b7244aca5f4a8d870c6f1c1fbff9e1c26699a860b9504f35ca1d700030503fd1ededd3b840795be6d9ccbe3c51ee42e2f39233c432b831ddd9c4e72b7025a819317e47bf94f9ee316d7273b05d5fcf2999c3a681f519b1234bbfa6d359b4752bd9c3f77d6b6456cde152464763414ca130f4e91d91041432f90620fec0e6d6b5116076c2985d5aeaae13be492b9b329efcaf7ee25120159a0a30cd976b42d7afe030302dae7eb80db744d4960c4df930d57e87fe81412eaace9f900e6c839817a614ddb75ba6603b9417c33ea7b6c93967dfa2bcff3fa3c74a5ce2c962db65b03aece14c96cbd0038fc" // pkcs1PrivKeyHex is a PKCS#1, RSA private key. // Generated by `openssl genrsa 1024 | openssl rsa -outform DER | xxd -p` const pkcs1PrivKeyHex = "3082025d02010002818100e98edfa1c3b35884a54d0b36a6a603b0290fa85e49e30fa23fc94fef9c6790bc4849928607aa48d809da326fb42a969d06ad756b98b9c1a90f5d4a2b6d0ac05953c97f4da3120164a21a679793ce181c906dc01d235cc085ddcdf6ea06c389b6ab8885dfd685959e693138856a68a7e5db263337ff82a088d583a897cf2d59e9020301000102818100b6d5c9eb70b02d5369b3ee5b520a14490b5bde8a317d36f7e4c74b7460141311d1e5067735f8f01d6f5908b2b96fbd881f7a1ab9a84d82753e39e19e2d36856be960d05ac9ef8e8782ea1b6d65aee28fdfe1d61451e8cff0adfe84322f12cf455028b581cf60eb9e0e140ba5d21aeba6c2634d7c65318b9a665fc01c3191ca21024100fa5e818da3705b0fa33278bb28d4b6f6050388af2d4b75ec9375dd91ccf2e7d7068086a8b82a8f6282e4fbbdb8a7f2622eb97295249d87acea7f5f816f54d347024100eecf9406d7dc49cdfb95ab1eff4064de84c7a30f64b2798936a0d2018ba9eb52e4b636f82e96c49cc63b80b675e91e40d1b2e4017d4b9adaf33ab3d9cf1c214f024100c173704ace742c082323066226a4655226819a85304c542b9dacbeacbf5d1881ee863485fcf6f59f3a604f9b42289282067447f2b13dfeed3eab7851fc81e0550240741fc41f3fc002b382eed8730e33c5d8de40256e4accee846667f536832f711ab1d4590e7db91a8a116ac5bff3be13d3f9243ff2e976662aa9b395d907f8e9c9024046a5696c9ef882363e06c9fa4e2f5b580906452befba03f4a99d0f873697ef1f851d2226ca7934b30b7c3e80cb634a67172bbbf4781735fe3e09263e2dd723e7" ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "crypto/dsa" "crypto/rsa" "crypto/sha1" "crypto/sha256" _ "crypto/sha512" "encoding/binary" "fmt" "hash" "io" "math/big" "strconv" "time" "github.com/ProtonMail/go-crypto/openpgp/ecdh" "github.com/ProtonMail/go-crypto/openpgp/ecdsa" "github.com/ProtonMail/go-crypto/openpgp/ed25519" "github.com/ProtonMail/go-crypto/openpgp/ed448" "github.com/ProtonMail/go-crypto/openpgp/eddsa" "github.com/ProtonMail/go-crypto/openpgp/elgamal" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/internal/ecc" "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" "github.com/ProtonMail/go-crypto/openpgp/x25519" "github.com/ProtonMail/go-crypto/openpgp/x448" ) // PublicKey represents an OpenPGP public key. See RFC 4880, section 5.5.2. type PublicKey struct { Version int CreationTime time.Time PubKeyAlgo PublicKeyAlgorithm PublicKey interface{} // *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey or *eddsa.PublicKey, *x25519.PublicKey, *x448.PublicKey, *ed25519.PublicKey, *ed448.PublicKey Fingerprint []byte KeyId uint64 IsSubkey bool // RFC 4880 fields n, e, p, q, g, y encoding.Field // RFC 6637 fields // oid contains the OID byte sequence identifying the elliptic curve used oid encoding.Field // kdf stores key derivation function parameters // used for ECDH encryption. See RFC 6637, Section 9. kdf encoding.Field } // UpgradeToV5 updates the version of the key to v5, and updates all necessary // fields. func (pk *PublicKey) UpgradeToV5() { pk.Version = 5 pk.setFingerprintAndKeyId() } // UpgradeToV6 updates the version of the key to v6, and updates all necessary // fields. func (pk *PublicKey) UpgradeToV6() error { pk.Version = 6 pk.setFingerprintAndKeyId() return pk.checkV6Compatibility() } // signingKey provides a convenient abstraction over signature verification // for v3 and v4 public keys. type signingKey interface { SerializeForHash(io.Writer) error SerializeSignaturePrefix(io.Writer) error serializeWithoutHeaders(io.Writer) error } // NewRSAPublicKey returns a PublicKey that wraps the given rsa.PublicKey. func NewRSAPublicKey(creationTime time.Time, pub *rsa.PublicKey) *PublicKey { pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoRSA, PublicKey: pub, n: new(encoding.MPI).SetBig(pub.N), e: new(encoding.MPI).SetBig(big.NewInt(int64(pub.E))), } pk.setFingerprintAndKeyId() return pk } // NewDSAPublicKey returns a PublicKey that wraps the given dsa.PublicKey. func NewDSAPublicKey(creationTime time.Time, pub *dsa.PublicKey) *PublicKey { pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoDSA, PublicKey: pub, p: new(encoding.MPI).SetBig(pub.P), q: new(encoding.MPI).SetBig(pub.Q), g: new(encoding.MPI).SetBig(pub.G), y: new(encoding.MPI).SetBig(pub.Y), } pk.setFingerprintAndKeyId() return pk } // NewElGamalPublicKey returns a PublicKey that wraps the given elgamal.PublicKey. func NewElGamalPublicKey(creationTime time.Time, pub *elgamal.PublicKey) *PublicKey { pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoElGamal, PublicKey: pub, p: new(encoding.MPI).SetBig(pub.P), g: new(encoding.MPI).SetBig(pub.G), y: new(encoding.MPI).SetBig(pub.Y), } pk.setFingerprintAndKeyId() return pk } func NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey { pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoECDSA, PublicKey: pub, p: encoding.NewMPI(pub.MarshalPoint()), } curveInfo := ecc.FindByCurve(pub.GetCurve()) if curveInfo == nil { panic("unknown elliptic curve") } pk.oid = curveInfo.Oid pk.setFingerprintAndKeyId() return pk } func NewECDHPublicKey(creationTime time.Time, pub *ecdh.PublicKey) *PublicKey { var pk *PublicKey var kdf = encoding.NewOID([]byte{0x1, pub.Hash.Id(), pub.Cipher.Id()}) pk = &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoECDH, PublicKey: pub, p: encoding.NewMPI(pub.MarshalPoint()), kdf: kdf, } curveInfo := ecc.FindByCurve(pub.GetCurve()) if curveInfo == nil { panic("unknown elliptic curve") } pk.oid = curveInfo.Oid pk.setFingerprintAndKeyId() return pk } func NewEdDSAPublicKey(creationTime time.Time, pub *eddsa.PublicKey) *PublicKey { curveInfo := ecc.FindByCurve(pub.GetCurve()) pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoEdDSA, PublicKey: pub, oid: curveInfo.Oid, // Native point format, see draft-koch-eddsa-for-openpgp-04, Appendix B p: encoding.NewMPI(pub.MarshalPoint()), } pk.setFingerprintAndKeyId() return pk } func NewX25519PublicKey(creationTime time.Time, pub *x25519.PublicKey) *PublicKey { pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoX25519, PublicKey: pub, } pk.setFingerprintAndKeyId() return pk } func NewX448PublicKey(creationTime time.Time, pub *x448.PublicKey) *PublicKey { pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoX448, PublicKey: pub, } pk.setFingerprintAndKeyId() return pk } func NewEd25519PublicKey(creationTime time.Time, pub *ed25519.PublicKey) *PublicKey { pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoEd25519, PublicKey: pub, } pk.setFingerprintAndKeyId() return pk } func NewEd448PublicKey(creationTime time.Time, pub *ed448.PublicKey) *PublicKey { pk := &PublicKey{ Version: 4, CreationTime: creationTime, PubKeyAlgo: PubKeyAlgoEd448, PublicKey: pub, } pk.setFingerprintAndKeyId() return pk } func (pk *PublicKey) parse(r io.Reader) (err error) { // RFC 4880, section 5.5.2 var buf [6]byte _, err = readFull(r, buf[:]) if err != nil { return } pk.Version = int(buf[0]) if pk.Version != 4 && pk.Version != 5 && pk.Version != 6 { return errors.UnsupportedError("public key version " + strconv.Itoa(int(buf[0]))) } if V5Disabled && pk.Version == 5 { return errors.UnsupportedError("support for parsing v5 entities is disabled; build with `-tags v5` if needed") } if pk.Version >= 5 { // Read the four-octet scalar octet count // The count is not used in this implementation var n [4]byte _, err = readFull(r, n[:]) if err != nil { return } } pk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0) pk.PubKeyAlgo = PublicKeyAlgorithm(buf[5]) // Ignore four-ocet length switch pk.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: err = pk.parseRSA(r) case PubKeyAlgoDSA: err = pk.parseDSA(r) case PubKeyAlgoElGamal: err = pk.parseElGamal(r) case PubKeyAlgoECDSA: err = pk.parseECDSA(r) case PubKeyAlgoECDH: err = pk.parseECDH(r) case PubKeyAlgoEdDSA: err = pk.parseEdDSA(r) case PubKeyAlgoX25519: err = pk.parseX25519(r) case PubKeyAlgoX448: err = pk.parseX448(r) case PubKeyAlgoEd25519: err = pk.parseEd25519(r) case PubKeyAlgoEd448: err = pk.parseEd448(r) default: err = errors.UnsupportedError("public key type: " + strconv.Itoa(int(pk.PubKeyAlgo))) } if err != nil { return } pk.setFingerprintAndKeyId() return } func (pk *PublicKey) setFingerprintAndKeyId() { // RFC 4880, section 12.2 if pk.Version >= 5 { fingerprint := sha256.New() if err := pk.SerializeForHash(fingerprint); err != nil { // Should not happen for a hash. panic(err) } pk.Fingerprint = make([]byte, 32) copy(pk.Fingerprint, fingerprint.Sum(nil)) pk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[:8]) } else { fingerprint := sha1.New() if err := pk.SerializeForHash(fingerprint); err != nil { // Should not happen for a hash. panic(err) } pk.Fingerprint = make([]byte, 20) copy(pk.Fingerprint, fingerprint.Sum(nil)) pk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[12:20]) } } func (pk *PublicKey) checkV6Compatibility() error { // Implementations MUST NOT accept or generate version 6 key material using the deprecated OIDs. switch pk.PubKeyAlgo { case PubKeyAlgoECDH: curveInfo := ecc.FindByOid(pk.oid) if curveInfo == nil { return errors.UnsupportedError(fmt.Sprintf("unknown oid: %x", pk.oid)) } if curveInfo.GenName == ecc.Curve25519GenName { return errors.StructuralError("cannot generate v6 key with deprecated OID: Curve25519Legacy") } case PubKeyAlgoEdDSA: return errors.StructuralError("cannot generate v6 key with deprecated algorithm: EdDSALegacy") } return nil } // parseRSA parses RSA public key material from the given Reader. See RFC 4880, // section 5.5.2. func (pk *PublicKey) parseRSA(r io.Reader) (err error) { pk.n = new(encoding.MPI) if _, err = pk.n.ReadFrom(r); err != nil { return } pk.e = new(encoding.MPI) if _, err = pk.e.ReadFrom(r); err != nil { return } if len(pk.e.Bytes()) > 3 { err = errors.UnsupportedError("large public exponent") return } rsa := &rsa.PublicKey{ N: new(big.Int).SetBytes(pk.n.Bytes()), E: 0, } for i := 0; i < len(pk.e.Bytes()); i++ { rsa.E <<= 8 rsa.E |= int(pk.e.Bytes()[i]) } pk.PublicKey = rsa return } // parseDSA parses DSA public key material from the given Reader. See RFC 4880, // section 5.5.2. func (pk *PublicKey) parseDSA(r io.Reader) (err error) { pk.p = new(encoding.MPI) if _, err = pk.p.ReadFrom(r); err != nil { return } pk.q = new(encoding.MPI) if _, err = pk.q.ReadFrom(r); err != nil { return } pk.g = new(encoding.MPI) if _, err = pk.g.ReadFrom(r); err != nil { return } pk.y = new(encoding.MPI) if _, err = pk.y.ReadFrom(r); err != nil { return } dsa := new(dsa.PublicKey) dsa.P = new(big.Int).SetBytes(pk.p.Bytes()) dsa.Q = new(big.Int).SetBytes(pk.q.Bytes()) dsa.G = new(big.Int).SetBytes(pk.g.Bytes()) dsa.Y = new(big.Int).SetBytes(pk.y.Bytes()) pk.PublicKey = dsa return } // parseElGamal parses ElGamal public key material from the given Reader. See // RFC 4880, section 5.5.2. func (pk *PublicKey) parseElGamal(r io.Reader) (err error) { pk.p = new(encoding.MPI) if _, err = pk.p.ReadFrom(r); err != nil { return } pk.g = new(encoding.MPI) if _, err = pk.g.ReadFrom(r); err != nil { return } pk.y = new(encoding.MPI) if _, err = pk.y.ReadFrom(r); err != nil { return } elgamal := new(elgamal.PublicKey) elgamal.P = new(big.Int).SetBytes(pk.p.Bytes()) elgamal.G = new(big.Int).SetBytes(pk.g.Bytes()) elgamal.Y = new(big.Int).SetBytes(pk.y.Bytes()) pk.PublicKey = elgamal return } // parseECDSA parses ECDSA public key material from the given Reader. See // RFC 6637, Section 9. func (pk *PublicKey) parseECDSA(r io.Reader) (err error) { pk.oid = new(encoding.OID) if _, err = pk.oid.ReadFrom(r); err != nil { return } curveInfo := ecc.FindByOid(pk.oid) if curveInfo == nil { return errors.UnsupportedError(fmt.Sprintf("unknown oid: %x", pk.oid)) } pk.p = new(encoding.MPI) if _, err = pk.p.ReadFrom(r); err != nil { return } c, ok := curveInfo.Curve.(ecc.ECDSACurve) if !ok { return errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", pk.oid)) } ecdsaKey := ecdsa.NewPublicKey(c) err = ecdsaKey.UnmarshalPoint(pk.p.Bytes()) pk.PublicKey = ecdsaKey return } // parseECDH parses ECDH public key material from the given Reader. See // RFC 6637, Section 9. func (pk *PublicKey) parseECDH(r io.Reader) (err error) { pk.oid = new(encoding.OID) if _, err = pk.oid.ReadFrom(r); err != nil { return } curveInfo := ecc.FindByOid(pk.oid) if curveInfo == nil { return errors.UnsupportedError(fmt.Sprintf("unknown oid: %x", pk.oid)) } if pk.Version == 6 && curveInfo.GenName == ecc.Curve25519GenName { // Implementations MUST NOT accept or generate version 6 key material using the deprecated OIDs. return errors.StructuralError("cannot read v6 key with deprecated OID: Curve25519Legacy") } pk.p = new(encoding.MPI) if _, err = pk.p.ReadFrom(r); err != nil { return } pk.kdf = new(encoding.OID) if _, err = pk.kdf.ReadFrom(r); err != nil { return } c, ok := curveInfo.Curve.(ecc.ECDHCurve) if !ok { return errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", pk.oid)) } if kdfLen := len(pk.kdf.Bytes()); kdfLen < 3 { return errors.UnsupportedError("unsupported ECDH KDF length: " + strconv.Itoa(kdfLen)) } if reserved := pk.kdf.Bytes()[0]; reserved != 0x01 { return errors.UnsupportedError("unsupported KDF reserved field: " + strconv.Itoa(int(reserved))) } kdfHash, ok := algorithm.HashById[pk.kdf.Bytes()[1]] if !ok { return errors.UnsupportedError("unsupported ECDH KDF hash: " + strconv.Itoa(int(pk.kdf.Bytes()[1]))) } kdfCipher, ok := algorithm.CipherById[pk.kdf.Bytes()[2]] if !ok { return errors.UnsupportedError("unsupported ECDH KDF cipher: " + strconv.Itoa(int(pk.kdf.Bytes()[2]))) } ecdhKey := ecdh.NewPublicKey(c, kdfHash, kdfCipher) err = ecdhKey.UnmarshalPoint(pk.p.Bytes()) pk.PublicKey = ecdhKey return } func (pk *PublicKey) parseEdDSA(r io.Reader) (err error) { if pk.Version == 6 { // Implementations MUST NOT accept or generate version 6 key material using the deprecated OIDs. return errors.StructuralError("cannot generate v6 key with deprecated algorithm: EdDSALegacy") } pk.oid = new(encoding.OID) if _, err = pk.oid.ReadFrom(r); err != nil { return } curveInfo := ecc.FindByOid(pk.oid) if curveInfo == nil { return errors.UnsupportedError(fmt.Sprintf("unknown oid: %x", pk.oid)) } c, ok := curveInfo.Curve.(ecc.EdDSACurve) if !ok { return errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", pk.oid)) } pk.p = new(encoding.MPI) if _, err = pk.p.ReadFrom(r); err != nil { return } if len(pk.p.Bytes()) == 0 { return errors.StructuralError("empty EdDSA public key") } pub := eddsa.NewPublicKey(c) switch flag := pk.p.Bytes()[0]; flag { case 0x04: // TODO: see _grcy_ecc_eddsa_ensure_compact in grcypt return errors.UnsupportedError("unsupported EdDSA compression: " + strconv.Itoa(int(flag))) case 0x40: err = pub.UnmarshalPoint(pk.p.Bytes()) default: return errors.UnsupportedError("unsupported EdDSA compression: " + strconv.Itoa(int(flag))) } pk.PublicKey = pub return } func (pk *PublicKey) parseX25519(r io.Reader) (err error) { point := make([]byte, x25519.KeySize) _, err = io.ReadFull(r, point) if err != nil { return } pub := &x25519.PublicKey{ Point: point, } pk.PublicKey = pub return } func (pk *PublicKey) parseX448(r io.Reader) (err error) { point := make([]byte, x448.KeySize) _, err = io.ReadFull(r, point) if err != nil { return } pub := &x448.PublicKey{ Point: point, } pk.PublicKey = pub return } func (pk *PublicKey) parseEd25519(r io.Reader) (err error) { point := make([]byte, ed25519.PublicKeySize) _, err = io.ReadFull(r, point) if err != nil { return } pub := &ed25519.PublicKey{ Point: point, } pk.PublicKey = pub return } func (pk *PublicKey) parseEd448(r io.Reader) (err error) { point := make([]byte, ed448.PublicKeySize) _, err = io.ReadFull(r, point) if err != nil { return } pub := &ed448.PublicKey{ Point: point, } pk.PublicKey = pub return } // SerializeForHash serializes the PublicKey to w with the special packet // header format needed for hashing. func (pk *PublicKey) SerializeForHash(w io.Writer) error { if err := pk.SerializeSignaturePrefix(w); err != nil { return err } return pk.serializeWithoutHeaders(w) } // SerializeSignaturePrefix writes the prefix for this public key to the given Writer. // The prefix is used when calculating a signature over this public key. See // RFC 4880, section 5.2.4. func (pk *PublicKey) SerializeSignaturePrefix(w io.Writer) error { var pLength = pk.algorithmSpecificByteCount() // version, timestamp, algorithm pLength += versionSize + timestampSize + algorithmSize if pk.Version >= 5 { // key octet count (4). pLength += 4 _, err := w.Write([]byte{ // When a v4 signature is made over a key, the hash data starts with the octet 0x99, followed by a two-octet length // of the key, and then the body of the key packet. When a v6 signature is made over a key, the hash data starts // with the salt, then octet 0x9B, followed by a four-octet length of the key, and then the body of the key packet. 0x95 + byte(pk.Version), byte(pLength >> 24), byte(pLength >> 16), byte(pLength >> 8), byte(pLength), }) return err } if _, err := w.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)}); err != nil { return err } return nil } func (pk *PublicKey) Serialize(w io.Writer) (err error) { length := uint32(versionSize + timestampSize + algorithmSize) // 6 byte header length += pk.algorithmSpecificByteCount() if pk.Version >= 5 { length += 4 // octet key count } packetType := packetTypePublicKey if pk.IsSubkey { packetType = packetTypePublicSubkey } err = serializeHeader(w, packetType, int(length)) if err != nil { return } return pk.serializeWithoutHeaders(w) } func (pk *PublicKey) algorithmSpecificByteCount() uint32 { length := uint32(0) switch pk.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: length += uint32(pk.n.EncodedLength()) length += uint32(pk.e.EncodedLength()) case PubKeyAlgoDSA: length += uint32(pk.p.EncodedLength()) length += uint32(pk.q.EncodedLength()) length += uint32(pk.g.EncodedLength()) length += uint32(pk.y.EncodedLength()) case PubKeyAlgoElGamal: length += uint32(pk.p.EncodedLength()) length += uint32(pk.g.EncodedLength()) length += uint32(pk.y.EncodedLength()) case PubKeyAlgoECDSA: length += uint32(pk.oid.EncodedLength()) length += uint32(pk.p.EncodedLength()) case PubKeyAlgoECDH: length += uint32(pk.oid.EncodedLength()) length += uint32(pk.p.EncodedLength()) length += uint32(pk.kdf.EncodedLength()) case PubKeyAlgoEdDSA: length += uint32(pk.oid.EncodedLength()) length += uint32(pk.p.EncodedLength()) case PubKeyAlgoX25519: length += x25519.KeySize case PubKeyAlgoX448: length += x448.KeySize case PubKeyAlgoEd25519: length += ed25519.PublicKeySize case PubKeyAlgoEd448: length += ed448.PublicKeySize default: panic("unknown public key algorithm") } return length } // serializeWithoutHeaders marshals the PublicKey to w in the form of an // OpenPGP public key packet, not including the packet header. func (pk *PublicKey) serializeWithoutHeaders(w io.Writer) (err error) { t := uint32(pk.CreationTime.Unix()) if _, err = w.Write([]byte{ byte(pk.Version), byte(t >> 24), byte(t >> 16), byte(t >> 8), byte(t), byte(pk.PubKeyAlgo), }); err != nil { return } if pk.Version >= 5 { n := pk.algorithmSpecificByteCount() if _, err = w.Write([]byte{ byte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n), }); err != nil { return } } switch pk.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: if _, err = w.Write(pk.n.EncodedBytes()); err != nil { return } _, err = w.Write(pk.e.EncodedBytes()) return case PubKeyAlgoDSA: if _, err = w.Write(pk.p.EncodedBytes()); err != nil { return } if _, err = w.Write(pk.q.EncodedBytes()); err != nil { return } if _, err = w.Write(pk.g.EncodedBytes()); err != nil { return } _, err = w.Write(pk.y.EncodedBytes()) return case PubKeyAlgoElGamal: if _, err = w.Write(pk.p.EncodedBytes()); err != nil { return } if _, err = w.Write(pk.g.EncodedBytes()); err != nil { return } _, err = w.Write(pk.y.EncodedBytes()) return case PubKeyAlgoECDSA: if _, err = w.Write(pk.oid.EncodedBytes()); err != nil { return } _, err = w.Write(pk.p.EncodedBytes()) return case PubKeyAlgoECDH: if _, err = w.Write(pk.oid.EncodedBytes()); err != nil { return } if _, err = w.Write(pk.p.EncodedBytes()); err != nil { return } _, err = w.Write(pk.kdf.EncodedBytes()) return case PubKeyAlgoEdDSA: if _, err = w.Write(pk.oid.EncodedBytes()); err != nil { return } _, err = w.Write(pk.p.EncodedBytes()) return case PubKeyAlgoX25519: publicKey := pk.PublicKey.(*x25519.PublicKey) _, err = w.Write(publicKey.Point) return case PubKeyAlgoX448: publicKey := pk.PublicKey.(*x448.PublicKey) _, err = w.Write(publicKey.Point) return case PubKeyAlgoEd25519: publicKey := pk.PublicKey.(*ed25519.PublicKey) _, err = w.Write(publicKey.Point) return case PubKeyAlgoEd448: publicKey := pk.PublicKey.(*ed448.PublicKey) _, err = w.Write(publicKey.Point) return } return errors.InvalidArgumentError("bad public-key algorithm") } // CanSign returns true iff this public key can generate signatures func (pk *PublicKey) CanSign() bool { return pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly && pk.PubKeyAlgo != PubKeyAlgoElGamal && pk.PubKeyAlgo != PubKeyAlgoECDH } // VerifyHashTag returns nil iff sig appears to be a plausible signature of the data // hashed into signed, based solely on its HashTag. signed is mutated by this call. func VerifyHashTag(signed hash.Hash, sig *Signature) (err error) { if sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) { sig.AddMetadataToHashSuffix() } signed.Write(sig.HashSuffix) hashBytes := signed.Sum(nil) if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { return errors.SignatureError("hash tag doesn't match") } return nil } // VerifySignature returns nil iff sig is a valid signature, made by this // public key, of the data hashed into signed. signed is mutated by this call. func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err error) { if !pk.CanSign() { return errors.InvalidArgumentError("public key cannot generate signatures") } if sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) { sig.AddMetadataToHashSuffix() } signed.Write(sig.HashSuffix) hashBytes := signed.Sum(nil) // see discussion https://github.com/ProtonMail/go-crypto/issues/107 if sig.Version >= 5 && (hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1]) { return errors.SignatureError("hash tag doesn't match") } if pk.PubKeyAlgo != sig.PubKeyAlgo { return errors.InvalidArgumentError("public key and signature use different algorithms") } switch pk.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: rsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey) err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.Bytes())) if err != nil { return errors.SignatureError("RSA verification failure") } return nil case PubKeyAlgoDSA: dsaPublicKey, _ := pk.PublicKey.(*dsa.PublicKey) // Need to truncate hashBytes to match FIPS 186-3 section 4.6. subgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8 if len(hashBytes) > subgroupSize { hashBytes = hashBytes[:subgroupSize] } if !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.Bytes()), new(big.Int).SetBytes(sig.DSASigS.Bytes())) { return errors.SignatureError("DSA verification failure") } return nil case PubKeyAlgoECDSA: ecdsaPublicKey := pk.PublicKey.(*ecdsa.PublicKey) if !ecdsa.Verify(ecdsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.ECDSASigR.Bytes()), new(big.Int).SetBytes(sig.ECDSASigS.Bytes())) { return errors.SignatureError("ECDSA verification failure") } return nil case PubKeyAlgoEdDSA: eddsaPublicKey := pk.PublicKey.(*eddsa.PublicKey) if !eddsa.Verify(eddsaPublicKey, hashBytes, sig.EdDSASigR.Bytes(), sig.EdDSASigS.Bytes()) { return errors.SignatureError("EdDSA verification failure") } return nil case PubKeyAlgoEd25519: ed25519PublicKey := pk.PublicKey.(*ed25519.PublicKey) if !ed25519.Verify(ed25519PublicKey, hashBytes, sig.EdSig) { return errors.SignatureError("Ed25519 verification failure") } return nil case PubKeyAlgoEd448: ed448PublicKey := pk.PublicKey.(*ed448.PublicKey) if !ed448.Verify(ed448PublicKey, hashBytes, sig.EdSig) { return errors.SignatureError("ed448 verification failure") } return nil default: return errors.SignatureError("Unsupported public key algorithm used in signature") } } // keySignatureHash returns a Hash of the message that needs to be signed for // pk to assert a subkey relationship to signed. func keySignatureHash(pk, signed signingKey, hashFunc hash.Hash) (h hash.Hash, err error) { h = hashFunc // RFC 4880, section 5.2.4 err = pk.SerializeForHash(h) if err != nil { return nil, err } err = signed.SerializeForHash(h) return } // VerifyKeyHashTag returns nil iff sig appears to be a plausible signature over this // primary key and subkey, based solely on its HashTag. func (pk *PublicKey) VerifyKeyHashTag(signed *PublicKey, sig *Signature) error { preparedHash, err := sig.PrepareVerify() if err != nil { return err } h, err := keySignatureHash(pk, signed, preparedHash) if err != nil { return err } return VerifyHashTag(h, sig) } // VerifyKeySignature returns nil iff sig is a valid signature, made by this // public key, of signed. func (pk *PublicKey) VerifyKeySignature(signed *PublicKey, sig *Signature) error { preparedHash, err := sig.PrepareVerify() if err != nil { return err } h, err := keySignatureHash(pk, signed, preparedHash) if err != nil { return err } if err = pk.VerifySignature(h, sig); err != nil { return err } if sig.FlagSign { // Signing subkeys must be cross-signed. See // https://www.gnupg.org/faq/subkey-cross-certify.html. if sig.EmbeddedSignature == nil { return errors.StructuralError("signing subkey is missing cross-signature") } preparedHashEmbedded, err := sig.EmbeddedSignature.PrepareVerify() if err != nil { return err } // Verify the cross-signature. This is calculated over the same // data as the main signature, so we cannot just recursively // call signed.VerifyKeySignature(...) if h, err = keySignatureHash(pk, signed, preparedHashEmbedded); err != nil { return errors.StructuralError("error while hashing for cross-signature: " + err.Error()) } if err := signed.VerifySignature(h, sig.EmbeddedSignature); err != nil { return errors.StructuralError("error while verifying cross-signature: " + err.Error()) } } return nil } func keyRevocationHash(pk signingKey, hashFunc hash.Hash) (err error) { return pk.SerializeForHash(hashFunc) } // VerifyRevocationHashTag returns nil iff sig appears to be a plausible signature // over this public key, based solely on its HashTag. func (pk *PublicKey) VerifyRevocationHashTag(sig *Signature) (err error) { preparedHash, err := sig.PrepareVerify() if err != nil { return err } if err = keyRevocationHash(pk, preparedHash); err != nil { return err } return VerifyHashTag(preparedHash, sig) } // VerifyRevocationSignature returns nil iff sig is a valid signature, made by this // public key. func (pk *PublicKey) VerifyRevocationSignature(sig *Signature) (err error) { preparedHash, err := sig.PrepareVerify() if err != nil { return err } if err = keyRevocationHash(pk, preparedHash); err != nil { return err } return pk.VerifySignature(preparedHash, sig) } // VerifySubkeyRevocationSignature returns nil iff sig is a valid subkey revocation signature, // made by this public key, of signed. func (pk *PublicKey) VerifySubkeyRevocationSignature(sig *Signature, signed *PublicKey) (err error) { preparedHash, err := sig.PrepareVerify() if err != nil { return err } h, err := keySignatureHash(pk, signed, preparedHash) if err != nil { return err } return pk.VerifySignature(h, sig) } // userIdSignatureHash returns a Hash of the message that needs to be signed // to assert that pk is a valid key for id. func userIdSignatureHash(id string, pk *PublicKey, h hash.Hash) (err error) { // RFC 4880, section 5.2.4 if err := pk.SerializeSignaturePrefix(h); err != nil { return err } if err := pk.serializeWithoutHeaders(h); err != nil { return err } var buf [5]byte buf[0] = 0xb4 buf[1] = byte(len(id) >> 24) buf[2] = byte(len(id) >> 16) buf[3] = byte(len(id) >> 8) buf[4] = byte(len(id)) h.Write(buf[:]) h.Write([]byte(id)) return nil } // directKeySignatureHash returns a Hash of the message that needs to be signed. func directKeySignatureHash(pk *PublicKey, h hash.Hash) (err error) { return pk.SerializeForHash(h) } // VerifyUserIdHashTag returns nil iff sig appears to be a plausible signature over this // public key and UserId, based solely on its HashTag func (pk *PublicKey) VerifyUserIdHashTag(id string, sig *Signature) (err error) { preparedHash, err := sig.PrepareVerify() if err != nil { return err } err = userIdSignatureHash(id, pk, preparedHash) if err != nil { return err } return VerifyHashTag(preparedHash, sig) } // VerifyUserIdSignature returns nil iff sig is a valid signature, made by this // public key, that id is the identity of pub. func (pk *PublicKey) VerifyUserIdSignature(id string, pub *PublicKey, sig *Signature) (err error) { h, err := sig.PrepareVerify() if err != nil { return err } if err := userIdSignatureHash(id, pub, h); err != nil { return err } return pk.VerifySignature(h, sig) } // VerifyDirectKeySignature returns nil iff sig is a valid signature, made by this // public key. func (pk *PublicKey) VerifyDirectKeySignature(sig *Signature) (err error) { h, err := sig.PrepareVerify() if err != nil { return err } if err := directKeySignatureHash(pk, h); err != nil { return err } return pk.VerifySignature(h, sig) } // KeyIdString returns the public key's fingerprint in capital hex // (e.g. "6C7EE1B8621CC013"). func (pk *PublicKey) KeyIdString() string { return fmt.Sprintf("%016X", pk.KeyId) } // KeyIdShortString returns the short form of public key's fingerprint // in capital hex, as shown by gpg --list-keys (e.g. "621CC013"). // This function will return the full key id for v5 and v6 keys // since the short key id is undefined for them. func (pk *PublicKey) KeyIdShortString() string { if pk.Version >= 5 { return pk.KeyIdString() } return fmt.Sprintf("%X", pk.Fingerprint[16:20]) } // BitLength returns the bit length for the given public key. func (pk *PublicKey) BitLength() (bitLength uint16, err error) { switch pk.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: bitLength = pk.n.BitLength() case PubKeyAlgoDSA: bitLength = pk.p.BitLength() case PubKeyAlgoElGamal: bitLength = pk.p.BitLength() case PubKeyAlgoECDSA: bitLength = pk.p.BitLength() case PubKeyAlgoECDH: bitLength = pk.p.BitLength() case PubKeyAlgoEdDSA: bitLength = pk.p.BitLength() case PubKeyAlgoX25519: bitLength = x25519.KeySize * 8 case PubKeyAlgoX448: bitLength = x448.KeySize * 8 case PubKeyAlgoEd25519: bitLength = ed25519.PublicKeySize * 8 case PubKeyAlgoEd448: bitLength = ed448.PublicKeySize * 8 default: err = errors.InvalidArgumentError("bad public-key algorithm") } return } // Curve returns the used elliptic curve of this public key. // Returns an error if no elliptic curve is used. func (pk *PublicKey) Curve() (curve Curve, err error) { switch pk.PubKeyAlgo { case PubKeyAlgoECDSA, PubKeyAlgoECDH, PubKeyAlgoEdDSA: curveInfo := ecc.FindByOid(pk.oid) if curveInfo == nil { return "", errors.UnsupportedError(fmt.Sprintf("unknown oid: %x", pk.oid)) } curve = Curve(curveInfo.GenName) case PubKeyAlgoEd25519, PubKeyAlgoX25519: curve = Curve25519 case PubKeyAlgoEd448, PubKeyAlgoX448: curve = Curve448 default: err = errors.InvalidArgumentError("public key does not operate with an elliptic curve") } return } // KeyExpired returns whether sig is a self-signature of a key that has // expired or is created in the future. func (pk *PublicKey) KeyExpired(sig *Signature, currentTime time.Time) bool { if pk.CreationTime.Unix() > currentTime.Unix() { return true } if sig.KeyLifetimeSecs == nil || *sig.KeyLifetimeSecs == 0 { return false } expiry := pk.CreationTime.Add(time.Duration(*sig.KeyLifetimeSecs) * time.Second) return currentTime.Unix() > expiry.Unix() } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key_test_data.go ================================================ package packet const rsaFingerprintHex = "5fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb" const rsaPkDataHex = "988d044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd0011010001" const dsaFingerprintHex = "eece4c094db002103714c63c8e8fbe54062f19ed" const dsaPkDataHex = "9901a2044d432f89110400cd581334f0d7a1e1bdc8b9d6d8c0baf68793632735d2bb0903224cbaa1dfbf35a60ee7a13b92643421e1eb41aa8d79bea19a115a677f6b8ba3c7818ce53a6c2a24a1608bd8b8d6e55c5090cbde09dd26e356267465ae25e69ec8bdd57c7bbb2623e4d73336f73a0a9098f7f16da2e25252130fd694c0e8070c55a812a423ae7f00a0ebf50e70c2f19c3520a551bd4b08d30f23530d3d03ff7d0bf4a53a64a09dc5e6e6e35854b7d70c882b0c60293401958b1bd9e40abec3ea05ba87cf64899299d4bd6aa7f459c201d3fbbd6c82004bdc5e8a9eb8082d12054cc90fa9d4ec251a843236a588bf49552441817436c4f43326966fe85447d4e6d0acf8fa1ef0f014730770603ad7634c3088dc52501c237328417c31c89ed70400b2f1a98b0bf42f11fefc430704bebbaa41d9f355600c3facee1e490f64208e0e094ea55e3a598a219a58500bf78ac677b670a14f4e47e9cf8eab4f368cc1ddcaa18cc59309d4cc62dd4f680e73e6cc3e1ce87a84d0925efbcb26c575c093fc42eecf45135fabf6403a25c2016e1774c0484e440a18319072c617cc97ac0a3bb0" const ecdsaFingerprintHex = "9892270b38b8980b05c8d56d43fe956c542ca00b" const ecdsaPkDataHex = "9893045071c29413052b8104002304230401f4867769cedfa52c325018896245443968e52e51d0c2df8d939949cb5b330f2921711fbee1c9b9dddb95d15cb0255e99badeddda7cc23d9ddcaacbc290969b9f24019375d61c2e4e3b36953a28d8b2bc95f78c3f1d592fb24499be348656a7b17e3963187b4361afe497bc5f9f81213f04069f8e1fb9e6a6290ae295ca1a92b894396cb4" const ecdhFingerprintHex = "722354df2475a42164d1d49faa8b938f9a201946" const ecdhPkDataHex = "b90073044d53059212052b810400220303042faa84024a20b6735c4897efa5bfb41bf85b7eefeab5ca0cb9ffc8ea04a46acb25534a577694f9e25340a4ab5223a9dd1eda530c8aa2e6718db10d7e672558c7736fe09369ea5739a2a3554bf16d41faa50562f11c6d39bbd5dffb6b9a9ec91803010909" const eddsaFingerprintHex = "b2d5e5ec0e6deca6bc8eeeb00907e75e1dd99ad8" const eddsaPkDataHex = "98330456e2132b16092b06010401da470f01010740bbda39266affa511a8c2d02edf690fb784b0499c4406185811a163539ef11dc1b41d74657374696e67203c74657374696e674074657374696e672e636f6d3e8879041316080021050256e2132b021b03050b09080702061508090a0b020416020301021e01021780000a09100907e75e1dd99ad86d0c00fe39d2008359352782bc9b61ac382584cd8eff3f57a18c2287e3afeeb05d1f04ba00fe2d0bc1ddf3ff8adb9afa3e7d9287244b4ec567f3db4d60b74a9b5465ed528203" // Source: https://sites.google.com/site/brainhub/pgpecckeys#TOC-ECC-NIST-P-384-key const ecc384PubHex = `99006f044d53059213052b81040022030304f6b8c5aced5b84ef9f4a209db2e4a9dfb70d28cb8c10ecd57674a9fa5a67389942b62d5e51367df4c7bfd3f8e500feecf07ed265a621a8ebbbe53e947ec78c677eba143bd1533c2b350e1c29f82313e1e1108eba063be1e64b10e6950e799c2db42465635f6473615f64685f333834203c6f70656e70677040627261696e6875622e6f72673e8900cb04101309005305024d530592301480000000002000077072656665727265642d656d61696c2d656e636f64696e67407067702e636f6d7067706d696d65040b090807021901051b03000000021602051e010000000415090a08000a0910098033880f54719fca2b0180aa37350968bd5f115afd8ce7bc7b103822152dbff06d0afcda835329510905b98cb469ba208faab87c7412b799e7b633017f58364ea480e8a1a3f253a0c5f22c446e8be9a9fce6210136ee30811abbd49139de28b5bdf8dc36d06ae748579e9ff503b90073044d53059212052b810400220303042faa84024a20b6735c4897efa5bfb41bf85b7eefeab5ca0cb9ffc8ea04a46acb25534a577694f9e25340a4ab5223a9dd1eda530c8aa2e6718db10d7e672558c7736fe09369ea5739a2a3554bf16d41faa50562f11c6d39bbd5dffb6b9a9ec9180301090989008404181309000c05024d530592051b0c000000000a0910098033880f54719f80970180eee7a6d8fcee41ee4f9289df17f9bcf9d955dca25c583b94336f3a2b2d4986dc5cf417b8d2dc86f741a9e1a6d236c0e3017d1c76575458a0cfb93ae8a2b274fcc65ceecd7a91eec83656ba13219969f06945b48c56bd04152c3a0553c5f2f4bd1267` ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/reader.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ) type PacketReader interface { Next() (p Packet, err error) Push(reader io.Reader) (err error) Unread(p Packet) } // Reader reads packets from an io.Reader and allows packets to be 'unread' so // that they result from the next call to Next. type Reader struct { q []Packet readers []io.Reader } // New io.Readers are pushed when a compressed or encrypted packet is processed // and recursively treated as a new source of packets. However, a carefully // crafted packet can trigger an infinite recursive sequence of packets. See // http://mumble.net/~campbell/misc/pgp-quine // https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-4402 // This constant limits the number of recursive packets that may be pushed. const maxReaders = 32 // Next returns the most recently unread Packet, or reads another packet from // the top-most io.Reader. Unknown/unsupported/Marker packet types are skipped. func (r *Reader) Next() (p Packet, err error) { for { p, err := r.read() if err == io.EOF { break } else if err != nil { if _, ok := err.(errors.UnknownPacketTypeError); ok { continue } if _, ok := err.(errors.UnsupportedError); ok { switch p.(type) { case *SymmetricallyEncrypted, *AEADEncrypted, *Compressed, *LiteralData: return nil, err } continue } return nil, err } else { //A marker packet MUST be ignored when received switch p.(type) { case *Marker: continue } return p, nil } } return nil, io.EOF } // Next returns the most recently unread Packet, or reads another packet from // the top-most io.Reader. Unknown/Marker packet types are skipped while unsupported // packets are returned as UnsupportedPacket type. func (r *Reader) NextWithUnsupported() (p Packet, err error) { for { p, err = r.read() if err == io.EOF { break } else if err != nil { if _, ok := err.(errors.UnknownPacketTypeError); ok { continue } if casteErr, ok := err.(errors.UnsupportedError); ok { return &UnsupportedPacket{ IncompletePacket: p, Error: casteErr, }, nil } return } else { //A marker packet MUST be ignored when received switch p.(type) { case *Marker: continue } return } } return nil, io.EOF } func (r *Reader) read() (p Packet, err error) { if len(r.q) > 0 { p = r.q[len(r.q)-1] r.q = r.q[:len(r.q)-1] return } for len(r.readers) > 0 { p, err = Read(r.readers[len(r.readers)-1]) if err == io.EOF { r.readers = r.readers[:len(r.readers)-1] continue } return p, err } return nil, io.EOF } // Push causes the Reader to start reading from a new io.Reader. When an EOF // error is seen from the new io.Reader, it is popped and the Reader continues // to read from the next most recent io.Reader. Push returns a StructuralError // if pushing the reader would exceed the maximum recursion level, otherwise it // returns nil. func (r *Reader) Push(reader io.Reader) (err error) { if len(r.readers) >= maxReaders { return errors.StructuralError("too many layers of packets") } r.readers = append(r.readers, reader) return nil } // Unread causes the given Packet to be returned from the next call to Next. func (r *Reader) Unread(p Packet) { r.q = append(r.q, p) } func NewReader(r io.Reader) *Reader { return &Reader{ q: nil, readers: []io.Reader{r}, } } // CheckReader is similar to Reader but additionally // uses the pushdown automata to verify the read packet sequence. type CheckReader struct { Reader verifier *SequenceVerifier fullyRead bool } // Next returns the most recently unread Packet, or reads another packet from // the top-most io.Reader. Unknown packet types are skipped. // If the read packet sequence does not conform to the packet composition // rules in rfc4880, it returns an error. func (r *CheckReader) Next() (p Packet, err error) { if r.fullyRead { return nil, io.EOF } if len(r.q) > 0 { p = r.q[len(r.q)-1] r.q = r.q[:len(r.q)-1] return } var errMsg error for len(r.readers) > 0 { p, errMsg, err = ReadWithCheck(r.readers[len(r.readers)-1], r.verifier) if errMsg != nil { err = errMsg return } if err == nil { return } if err == io.EOF { r.readers = r.readers[:len(r.readers)-1] continue } //A marker packet MUST be ignored when received switch p.(type) { case *Marker: continue } if _, ok := err.(errors.UnknownPacketTypeError); ok { continue } if _, ok := err.(errors.UnsupportedError); ok { switch p.(type) { case *SymmetricallyEncrypted, *AEADEncrypted, *Compressed, *LiteralData: return nil, err } continue } return nil, err } if errMsg = r.verifier.Next(EOSSymbol); errMsg != nil { return nil, errMsg } if errMsg = r.verifier.AssertValid(); errMsg != nil { return nil, errMsg } r.fullyRead = true return nil, io.EOF } func NewCheckReader(r io.Reader) *CheckReader { return &CheckReader{ Reader: Reader{ q: nil, readers: []io.Reader{r}, }, verifier: NewSequenceVerifier(), fullyRead: false, } } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/recipient.go ================================================ package packet // Recipient type represents a Intended Recipient Fingerprint subpacket // See https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh#name-intended-recipient-fingerpr type Recipient struct { KeyVersion int Fingerprint []byte } func (r *Recipient) Serialize() []byte { packet := make([]byte, len(r.Fingerprint)+1) packet[0] = byte(r.KeyVersion) copy(packet[1:], r.Fingerprint) return packet } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "bytes" "crypto" "crypto/dsa" "encoding/asn1" "encoding/binary" "hash" "io" "math/big" "strconv" "time" "github.com/ProtonMail/go-crypto/openpgp/ecdsa" "github.com/ProtonMail/go-crypto/openpgp/ed25519" "github.com/ProtonMail/go-crypto/openpgp/ed448" "github.com/ProtonMail/go-crypto/openpgp/eddsa" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/internal/encoding" ) const ( // First octet of key flags. // See RFC 9580, section 5.2.3.29 for details. KeyFlagCertify = 1 << iota KeyFlagSign KeyFlagEncryptCommunications KeyFlagEncryptStorage KeyFlagSplitKey KeyFlagAuthenticate _ KeyFlagGroupKey ) const ( // First octet of keyserver preference flags. // See RFC 9580, section 5.2.3.25 for details. _ = 1 << iota _ _ _ _ _ _ KeyserverPrefNoModify ) const SaltNotationName = "salt@notations.openpgpjs.org" // Signature represents a signature. See RFC 9580, section 5.2. type Signature struct { Version int SigType SignatureType PubKeyAlgo PublicKeyAlgorithm Hash crypto.Hash // salt contains a random salt value for v6 signatures // See RFC 9580 Section 5.2.4. salt []byte // HashSuffix is extra data that is hashed in after the signed data. HashSuffix []byte // HashTag contains the first two bytes of the hash for fast rejection // of bad signed data. HashTag [2]byte // Metadata includes format, filename and time, and is protected by v5 // signatures of type 0x00 or 0x01. This metadata is included into the hash // computation; if nil, six 0x00 bytes are used instead. See section 5.2.4. Metadata *LiteralData CreationTime time.Time RSASignature encoding.Field DSASigR, DSASigS encoding.Field ECDSASigR, ECDSASigS encoding.Field EdDSASigR, EdDSASigS encoding.Field EdSig []byte // rawSubpackets contains the unparsed subpackets, in order. rawSubpackets []outputSubpacket // The following are optional so are nil when not included in the // signature. SigLifetimeSecs, KeyLifetimeSecs *uint32 PreferredSymmetric, PreferredHash, PreferredCompression []uint8 PreferredCipherSuites [][2]uint8 IssuerKeyId *uint64 IssuerFingerprint []byte SignerUserId *string IsPrimaryId *bool Notations []*Notation IntendedRecipients []*Recipient // TrustLevel and TrustAmount can be set by the signer to assert that // the key is not only valid but also trustworthy at the specified // level. // See RFC 9580, section 5.2.3.21 for details. TrustLevel TrustLevel TrustAmount TrustAmount // TrustRegularExpression can be used in conjunction with trust Signature // packets to limit the scope of the trust that is extended. // See RFC 9580, section 5.2.3.22 for details. TrustRegularExpression *string // KeyserverPrefsValid is set if any keyserver preferences were given. See RFC 9580, section // 5.2.3.25 for details. KeyserverPrefsValid bool KeyserverPrefNoModify bool // PreferredKeyserver can be set to a URI where the latest version of the // key that this signature is made over can be found. See RFC 9580, section // 5.2.3.26 for details. PreferredKeyserver string // PolicyURI can be set to the URI of a document that describes the // policy under which the signature was issued. See RFC 9580, section // 5.2.3.28 for details. PolicyURI string // FlagsValid is set if any flags were given. See RFC 9580, section // 5.2.3.29 for details. FlagsValid bool FlagCertify, FlagSign, FlagEncryptCommunications, FlagEncryptStorage, FlagSplitKey, FlagAuthenticate, FlagGroupKey bool // RevocationReason is set if this signature has been revoked. // See RFC 9580, section 5.2.3.31 for details. RevocationReason *ReasonForRevocation RevocationReasonText string // In a self-signature, these flags are set there is a features subpacket // indicating that the issuer implementation supports these features // see https://datatracker.ietf.org/doc/html/draft-ietf-openpgp-crypto-refresh#features-subpacket SEIPDv1, SEIPDv2 bool // EmbeddedSignature, if non-nil, is a signature of the parent key, by // this key. This prevents an attacker from claiming another's signing // subkey as their own. EmbeddedSignature *Signature outSubpackets []outputSubpacket } // VerifiableSignature internally keeps state if the // the signature has been verified before. type VerifiableSignature struct { Valid *bool // nil if it has not been verified yet Packet *Signature } // NewVerifiableSig returns a struct of type VerifiableSignature referencing the input signature. func NewVerifiableSig(signature *Signature) *VerifiableSignature { return &VerifiableSignature{ Packet: signature, } } // Salt returns the signature salt for v6 signatures. func (sig *Signature) Salt() []byte { if sig == nil { return nil } return sig.salt } func (sig *Signature) parse(r io.Reader) (err error) { // RFC 9580, section 5.2.3 var buf [7]byte _, err = readFull(r, buf[:1]) if err != nil { return } sig.Version = int(buf[0]) if sig.Version != 4 && sig.Version != 5 && sig.Version != 6 { err = errors.UnsupportedError("signature packet version " + strconv.Itoa(int(buf[0]))) return } if V5Disabled && sig.Version == 5 { return errors.UnsupportedError("support for parsing v5 entities is disabled; build with `-tags v5` if needed") } if sig.Version == 6 { _, err = readFull(r, buf[:7]) } else { _, err = readFull(r, buf[:5]) } if err != nil { return } sig.SigType = SignatureType(buf[0]) sig.PubKeyAlgo = PublicKeyAlgorithm(buf[1]) switch sig.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA, PubKeyAlgoEdDSA, PubKeyAlgoEd25519, PubKeyAlgoEd448: default: err = errors.UnsupportedError("public key algorithm " + strconv.Itoa(int(sig.PubKeyAlgo))) return } var ok bool if sig.Version < 5 { sig.Hash, ok = algorithm.HashIdToHashWithSha1(buf[2]) } else { sig.Hash, ok = algorithm.HashIdToHash(buf[2]) } if !ok { return errors.UnsupportedError("hash function " + strconv.Itoa(int(buf[2]))) } var hashedSubpacketsLength int if sig.Version == 6 { // For a v6 signature, a four-octet length is used. hashedSubpacketsLength = int(buf[3])<<24 | int(buf[4])<<16 | int(buf[5])<<8 | int(buf[6]) } else { hashedSubpacketsLength = int(buf[3])<<8 | int(buf[4]) } hashedSubpackets := make([]byte, hashedSubpacketsLength) _, err = readFull(r, hashedSubpackets) if err != nil { return } err = sig.buildHashSuffix(hashedSubpackets) if err != nil { return } err = parseSignatureSubpackets(sig, hashedSubpackets, true) if err != nil { return } if sig.Version == 6 { _, err = readFull(r, buf[:4]) } else { _, err = readFull(r, buf[:2]) } if err != nil { return } var unhashedSubpacketsLength uint32 if sig.Version == 6 { unhashedSubpacketsLength = uint32(buf[0])<<24 | uint32(buf[1])<<16 | uint32(buf[2])<<8 | uint32(buf[3]) } else { unhashedSubpacketsLength = uint32(buf[0])<<8 | uint32(buf[1]) } unhashedSubpackets := make([]byte, unhashedSubpacketsLength) _, err = readFull(r, unhashedSubpackets) if err != nil { return } err = parseSignatureSubpackets(sig, unhashedSubpackets, false) if err != nil { return } _, err = readFull(r, sig.HashTag[:2]) if err != nil { return } if sig.Version == 6 { // Only for v6 signatures, a variable-length field containing the salt _, err = readFull(r, buf[:1]) if err != nil { return } saltLength := int(buf[0]) var expectedSaltLength int expectedSaltLength, err = SaltLengthForHash(sig.Hash) if err != nil { return } if saltLength != expectedSaltLength { err = errors.StructuralError("unexpected salt size for the given hash algorithm") return } salt := make([]byte, expectedSaltLength) _, err = readFull(r, salt) if err != nil { return } sig.salt = salt } switch sig.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: sig.RSASignature = new(encoding.MPI) _, err = sig.RSASignature.ReadFrom(r) case PubKeyAlgoDSA: sig.DSASigR = new(encoding.MPI) if _, err = sig.DSASigR.ReadFrom(r); err != nil { return } sig.DSASigS = new(encoding.MPI) _, err = sig.DSASigS.ReadFrom(r) case PubKeyAlgoECDSA: sig.ECDSASigR = new(encoding.MPI) if _, err = sig.ECDSASigR.ReadFrom(r); err != nil { return } sig.ECDSASigS = new(encoding.MPI) _, err = sig.ECDSASigS.ReadFrom(r) case PubKeyAlgoEdDSA: sig.EdDSASigR = new(encoding.MPI) if _, err = sig.EdDSASigR.ReadFrom(r); err != nil { return } sig.EdDSASigS = new(encoding.MPI) if _, err = sig.EdDSASigS.ReadFrom(r); err != nil { return } case PubKeyAlgoEd25519: sig.EdSig, err = ed25519.ReadSignature(r) if err != nil { return } case PubKeyAlgoEd448: sig.EdSig, err = ed448.ReadSignature(r) if err != nil { return } default: panic("unreachable") } return } // parseSignatureSubpackets parses subpackets of the main signature packet. See // RFC 9580, section 5.2.3.1. func parseSignatureSubpackets(sig *Signature, subpackets []byte, isHashed bool) (err error) { for len(subpackets) > 0 { subpackets, err = parseSignatureSubpacket(sig, subpackets, isHashed) if err != nil { return } } if sig.CreationTime.IsZero() { err = errors.StructuralError("no creation time in signature") } return } type signatureSubpacketType uint8 const ( creationTimeSubpacket signatureSubpacketType = 2 signatureExpirationSubpacket signatureSubpacketType = 3 exportableCertSubpacket signatureSubpacketType = 4 trustSubpacket signatureSubpacketType = 5 regularExpressionSubpacket signatureSubpacketType = 6 keyExpirationSubpacket signatureSubpacketType = 9 prefSymmetricAlgosSubpacket signatureSubpacketType = 11 issuerSubpacket signatureSubpacketType = 16 notationDataSubpacket signatureSubpacketType = 20 prefHashAlgosSubpacket signatureSubpacketType = 21 prefCompressionSubpacket signatureSubpacketType = 22 keyserverPrefsSubpacket signatureSubpacketType = 23 prefKeyserverSubpacket signatureSubpacketType = 24 primaryUserIdSubpacket signatureSubpacketType = 25 policyUriSubpacket signatureSubpacketType = 26 keyFlagsSubpacket signatureSubpacketType = 27 signerUserIdSubpacket signatureSubpacketType = 28 reasonForRevocationSubpacket signatureSubpacketType = 29 featuresSubpacket signatureSubpacketType = 30 embeddedSignatureSubpacket signatureSubpacketType = 32 issuerFingerprintSubpacket signatureSubpacketType = 33 intendedRecipientSubpacket signatureSubpacketType = 35 prefCipherSuitesSubpacket signatureSubpacketType = 39 ) // parseSignatureSubpacket parses a single subpacket. len(subpacket) is >= 1. func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (rest []byte, err error) { // RFC 9580, section 5.2.3.7 var ( length uint32 packetType signatureSubpacketType isCritical bool ) if len(subpacket) == 0 { err = errors.StructuralError("zero length signature subpacket") return } switch { case subpacket[0] < 192: length = uint32(subpacket[0]) subpacket = subpacket[1:] case subpacket[0] < 255: if len(subpacket) < 2 { goto Truncated } length = uint32(subpacket[0]-192)<<8 + uint32(subpacket[1]) + 192 subpacket = subpacket[2:] default: if len(subpacket) < 5 { goto Truncated } length = uint32(subpacket[1])<<24 | uint32(subpacket[2])<<16 | uint32(subpacket[3])<<8 | uint32(subpacket[4]) subpacket = subpacket[5:] } if length > uint32(len(subpacket)) { goto Truncated } rest = subpacket[length:] subpacket = subpacket[:length] if len(subpacket) == 0 { err = errors.StructuralError("zero length signature subpacket") return } packetType = signatureSubpacketType(subpacket[0] & 0x7f) isCritical = subpacket[0]&0x80 == 0x80 subpacket = subpacket[1:] sig.rawSubpackets = append(sig.rawSubpackets, outputSubpacket{isHashed, packetType, isCritical, subpacket}) if !isHashed && packetType != issuerSubpacket && packetType != issuerFingerprintSubpacket && packetType != embeddedSignatureSubpacket { return } switch packetType { case creationTimeSubpacket: if len(subpacket) != 4 { err = errors.StructuralError("signature creation time not four bytes") return } t := binary.BigEndian.Uint32(subpacket) sig.CreationTime = time.Unix(int64(t), 0) case signatureExpirationSubpacket: // Signature expiration time, section 5.2.3.18 if len(subpacket) != 4 { err = errors.StructuralError("expiration subpacket with bad length") return } sig.SigLifetimeSecs = new(uint32) *sig.SigLifetimeSecs = binary.BigEndian.Uint32(subpacket) case exportableCertSubpacket: if subpacket[0] == 0 { err = errors.UnsupportedError("signature with non-exportable certification") return } case trustSubpacket: if len(subpacket) != 2 { err = errors.StructuralError("trust subpacket with bad length") return } // Trust level and amount, section 5.2.3.21 sig.TrustLevel = TrustLevel(subpacket[0]) sig.TrustAmount = TrustAmount(subpacket[1]) case regularExpressionSubpacket: if len(subpacket) == 0 { err = errors.StructuralError("regexp subpacket with bad length") return } // Trust regular expression, section 5.2.3.22 // RFC specifies the string should be null-terminated; remove a null byte from the end if subpacket[len(subpacket)-1] != 0x00 { err = errors.StructuralError("expected regular expression to be null-terminated") return } trustRegularExpression := string(subpacket[:len(subpacket)-1]) sig.TrustRegularExpression = &trustRegularExpression case keyExpirationSubpacket: // Key expiration time, section 5.2.3.13 if len(subpacket) != 4 { err = errors.StructuralError("key expiration subpacket with bad length") return } sig.KeyLifetimeSecs = new(uint32) *sig.KeyLifetimeSecs = binary.BigEndian.Uint32(subpacket) case prefSymmetricAlgosSubpacket: // Preferred symmetric algorithms, section 5.2.3.14 sig.PreferredSymmetric = make([]byte, len(subpacket)) copy(sig.PreferredSymmetric, subpacket) case issuerSubpacket: // Issuer, section 5.2.3.12 if sig.Version > 4 && isHashed { err = errors.StructuralError("issuer subpacket found in v6 key") return } if len(subpacket) != 8 { err = errors.StructuralError("issuer subpacket with bad length") return } if sig.Version <= 4 { sig.IssuerKeyId = new(uint64) *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket) } case notationDataSubpacket: // Notation data, section 5.2.3.24 if len(subpacket) < 8 { err = errors.StructuralError("notation data subpacket with bad length") return } nameLength := uint32(subpacket[4])<<8 | uint32(subpacket[5]) valueLength := uint32(subpacket[6])<<8 | uint32(subpacket[7]) if len(subpacket) != int(nameLength)+int(valueLength)+8 { err = errors.StructuralError("notation data subpacket with bad length") return } notation := Notation{ IsHumanReadable: (subpacket[0] & 0x80) == 0x80, Name: string(subpacket[8:(nameLength + 8)]), Value: subpacket[(nameLength + 8):(valueLength + nameLength + 8)], IsCritical: isCritical, } sig.Notations = append(sig.Notations, ¬ation) case prefHashAlgosSubpacket: // Preferred hash algorithms, section 5.2.3.16 sig.PreferredHash = make([]byte, len(subpacket)) copy(sig.PreferredHash, subpacket) case prefCompressionSubpacket: // Preferred compression algorithms, section 5.2.3.17 sig.PreferredCompression = make([]byte, len(subpacket)) copy(sig.PreferredCompression, subpacket) case keyserverPrefsSubpacket: // Keyserver preferences, section 5.2.3.25 sig.KeyserverPrefsValid = true if len(subpacket) == 0 { return } if subpacket[0]&KeyserverPrefNoModify != 0 { sig.KeyserverPrefNoModify = true } case prefKeyserverSubpacket: // Preferred keyserver, section 5.2.3.26 sig.PreferredKeyserver = string(subpacket) case primaryUserIdSubpacket: // Primary User ID, section 5.2.3.27 if len(subpacket) != 1 { err = errors.StructuralError("primary user id subpacket with bad length") return } sig.IsPrimaryId = new(bool) if subpacket[0] > 0 { *sig.IsPrimaryId = true } case keyFlagsSubpacket: // Key flags, section 5.2.3.29 sig.FlagsValid = true if len(subpacket) == 0 { return } if subpacket[0]&KeyFlagCertify != 0 { sig.FlagCertify = true } if subpacket[0]&KeyFlagSign != 0 { sig.FlagSign = true } if subpacket[0]&KeyFlagEncryptCommunications != 0 { sig.FlagEncryptCommunications = true } if subpacket[0]&KeyFlagEncryptStorage != 0 { sig.FlagEncryptStorage = true } if subpacket[0]&KeyFlagSplitKey != 0 { sig.FlagSplitKey = true } if subpacket[0]&KeyFlagAuthenticate != 0 { sig.FlagAuthenticate = true } if subpacket[0]&KeyFlagGroupKey != 0 { sig.FlagGroupKey = true } case signerUserIdSubpacket: userId := string(subpacket) sig.SignerUserId = &userId case reasonForRevocationSubpacket: // Reason For Revocation, section 5.2.3.31 if len(subpacket) == 0 { err = errors.StructuralError("empty revocation reason subpacket") return } sig.RevocationReason = new(ReasonForRevocation) *sig.RevocationReason = NewReasonForRevocation(subpacket[0]) sig.RevocationReasonText = string(subpacket[1:]) case featuresSubpacket: // Features subpacket, section 5.2.3.32 specifies a very general // mechanism for OpenPGP implementations to signal support for new // features. if len(subpacket) > 0 { if subpacket[0]&0x01 != 0 { sig.SEIPDv1 = true } // 0x02 and 0x04 are reserved if subpacket[0]&0x08 != 0 { sig.SEIPDv2 = true } } case embeddedSignatureSubpacket: // Only usage is in signatures that cross-certify // signing subkeys. section 5.2.3.34 describes the // format, with its usage described in section 11.1 if sig.EmbeddedSignature != nil { err = errors.StructuralError("Cannot have multiple embedded signatures") return } sig.EmbeddedSignature = new(Signature) if err := sig.EmbeddedSignature.parse(bytes.NewBuffer(subpacket)); err != nil { return nil, err } if sigType := sig.EmbeddedSignature.SigType; sigType != SigTypePrimaryKeyBinding { return nil, errors.StructuralError("cross-signature has unexpected type " + strconv.Itoa(int(sigType))) } case policyUriSubpacket: // Policy URI, section 5.2.3.28 sig.PolicyURI = string(subpacket) case issuerFingerprintSubpacket: if len(subpacket) == 0 { err = errors.StructuralError("empty issuer fingerprint subpacket") return } v, l := subpacket[0], len(subpacket[1:]) if v >= 5 && l != 32 || v < 5 && l != 20 { return nil, errors.StructuralError("bad fingerprint length") } sig.IssuerFingerprint = make([]byte, l) copy(sig.IssuerFingerprint, subpacket[1:]) sig.IssuerKeyId = new(uint64) if v >= 5 { *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket[1:9]) } else { *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket[13:21]) } case intendedRecipientSubpacket: // Intended Recipient Fingerprint, section 5.2.3.36 if len(subpacket) < 1 { return nil, errors.StructuralError("invalid intended recipient fingerpring length") } version, length := subpacket[0], len(subpacket[1:]) if version >= 5 && length != 32 || version < 5 && length != 20 { return nil, errors.StructuralError("invalid fingerprint length") } fingerprint := make([]byte, length) copy(fingerprint, subpacket[1:]) sig.IntendedRecipients = append(sig.IntendedRecipients, &Recipient{int(version), fingerprint}) case prefCipherSuitesSubpacket: // Preferred AEAD cipher suites, section 5.2.3.15 if len(subpacket)%2 != 0 { err = errors.StructuralError("invalid aead cipher suite length") return } sig.PreferredCipherSuites = make([][2]byte, len(subpacket)/2) for i := 0; i < len(subpacket)/2; i++ { sig.PreferredCipherSuites[i] = [2]uint8{subpacket[2*i], subpacket[2*i+1]} } default: if isCritical { err = errors.UnsupportedError("unknown critical signature subpacket type " + strconv.Itoa(int(packetType))) return } } return Truncated: err = errors.StructuralError("signature subpacket truncated") return } // subpacketLengthLength returns the length, in bytes, of an encoded length value. func subpacketLengthLength(length int) int { if length < 192 { return 1 } if length < 16320 { return 2 } return 5 } func (sig *Signature) CheckKeyIdOrFingerprint(pk *PublicKey) bool { if sig.IssuerFingerprint != nil && len(sig.IssuerFingerprint) >= 20 { return bytes.Equal(sig.IssuerFingerprint, pk.Fingerprint) } return sig.IssuerKeyId != nil && *sig.IssuerKeyId == pk.KeyId } func (sig *Signature) CheckKeyIdOrFingerprintExplicit(fingerprint []byte, keyId uint64) bool { if sig.IssuerFingerprint != nil && len(sig.IssuerFingerprint) >= 20 && fingerprint != nil { return bytes.Equal(sig.IssuerFingerprint, fingerprint) } return sig.IssuerKeyId != nil && *sig.IssuerKeyId == keyId } // serializeSubpacketLength marshals the given length into to. func serializeSubpacketLength(to []byte, length int) int { // RFC 9580, Section 4.2.1. if length < 192 { to[0] = byte(length) return 1 } if length < 16320 { length -= 192 to[0] = byte((length >> 8) + 192) to[1] = byte(length) return 2 } to[0] = 255 to[1] = byte(length >> 24) to[2] = byte(length >> 16) to[3] = byte(length >> 8) to[4] = byte(length) return 5 } // subpacketsLength returns the serialized length, in bytes, of the given // subpackets. func subpacketsLength(subpackets []outputSubpacket, hashed bool) (length int) { for _, subpacket := range subpackets { if subpacket.hashed == hashed { length += subpacketLengthLength(len(subpacket.contents) + 1) length += 1 // type byte length += len(subpacket.contents) } } return } // serializeSubpackets marshals the given subpackets into to. func serializeSubpackets(to []byte, subpackets []outputSubpacket, hashed bool) { for _, subpacket := range subpackets { if subpacket.hashed == hashed { n := serializeSubpacketLength(to, len(subpacket.contents)+1) to[n] = byte(subpacket.subpacketType) if subpacket.isCritical { to[n] |= 0x80 } to = to[1+n:] n = copy(to, subpacket.contents) to = to[n:] } } } // SigExpired returns whether sig is a signature that has expired or is created // in the future. func (sig *Signature) SigExpired(currentTime time.Time) bool { if sig.CreationTime.Unix() > currentTime.Unix() { return true } if sig.SigLifetimeSecs == nil || *sig.SigLifetimeSecs == 0 { return false } expiry := sig.CreationTime.Add(time.Duration(*sig.SigLifetimeSecs) * time.Second) return currentTime.Unix() > expiry.Unix() } // buildHashSuffix constructs the HashSuffix member of sig in preparation for signing. func (sig *Signature) buildHashSuffix(hashedSubpackets []byte) (err error) { var hashId byte var ok bool if sig.Version < 5 { hashId, ok = algorithm.HashToHashIdWithSha1(sig.Hash) } else { hashId, ok = algorithm.HashToHashId(sig.Hash) } if !ok { sig.HashSuffix = nil return errors.InvalidArgumentError("hash cannot be represented in OpenPGP: " + strconv.Itoa(int(sig.Hash))) } hashedFields := bytes.NewBuffer([]byte{ uint8(sig.Version), uint8(sig.SigType), uint8(sig.PubKeyAlgo), uint8(hashId), }) hashedSubpacketsLength := len(hashedSubpackets) if sig.Version == 6 { // v6 signatures store the length in 4 octets hashedFields.Write([]byte{ uint8(hashedSubpacketsLength >> 24), uint8(hashedSubpacketsLength >> 16), uint8(hashedSubpacketsLength >> 8), uint8(hashedSubpacketsLength), }) } else { hashedFields.Write([]byte{ uint8(hashedSubpacketsLength >> 8), uint8(hashedSubpacketsLength), }) } lenPrefix := hashedFields.Len() hashedFields.Write(hashedSubpackets) var l uint64 = uint64(lenPrefix + len(hashedSubpackets)) if sig.Version == 5 { // v5 case hashedFields.Write([]byte{0x05, 0xff}) hashedFields.Write([]byte{ uint8(l >> 56), uint8(l >> 48), uint8(l >> 40), uint8(l >> 32), uint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l), }) } else { // v4 and v6 case hashedFields.Write([]byte{byte(sig.Version), 0xff}) hashedFields.Write([]byte{ uint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l), }) } sig.HashSuffix = make([]byte, hashedFields.Len()) copy(sig.HashSuffix, hashedFields.Bytes()) return } func (sig *Signature) signPrepareHash(h hash.Hash) (digest []byte, err error) { hashedSubpacketsLen := subpacketsLength(sig.outSubpackets, true) hashedSubpackets := make([]byte, hashedSubpacketsLen) serializeSubpackets(hashedSubpackets, sig.outSubpackets, true) err = sig.buildHashSuffix(hashedSubpackets) if err != nil { return } if sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) { sig.AddMetadataToHashSuffix() } h.Write(sig.HashSuffix) digest = h.Sum(nil) copy(sig.HashTag[:], digest) return } // PrepareSign must be called to create a hash object before Sign for v6 signatures. // The created hash object initially hashes a randomly generated salt // as required by v6 signatures. The generated salt is stored in sig. If the signature is not v6, // the method returns an empty hash object. // See RFC 9580 Section 5.2.4. func (sig *Signature) PrepareSign(config *Config) (hash.Hash, error) { if !sig.Hash.Available() { return nil, errors.UnsupportedError("hash function") } hasher := sig.Hash.New() if sig.Version == 6 { if sig.salt == nil { var err error sig.salt, err = SignatureSaltForHash(sig.Hash, config.Random()) if err != nil { return nil, err } } hasher.Write(sig.salt) } return hasher, nil } // SetSalt sets the signature salt for v6 signatures. // Assumes salt is generated correctly and checks if length matches. // If the signature is not v6, the method ignores the salt. // Use PrepareSign whenever possible instead of generating and // hashing the salt externally. // See RFC 9580 Section 5.2.4. func (sig *Signature) SetSalt(salt []byte) error { if sig.Version == 6 { expectedSaltLength, err := SaltLengthForHash(sig.Hash) if err != nil { return err } if salt == nil || len(salt) != expectedSaltLength { return errors.InvalidArgumentError("unexpected salt size for the given hash algorithm") } sig.salt = salt } return nil } // PrepareVerify must be called to create a hash object before verifying v6 signatures. // The created hash object initially hashes the internally stored salt. // If the signature is not v6, the method returns an empty hash object. // See RFC 9580 Section 5.2.4. func (sig *Signature) PrepareVerify() (hash.Hash, error) { if !sig.Hash.Available() { return nil, errors.UnsupportedError("hash function") } hasher := sig.Hash.New() if sig.Version == 6 { if sig.salt == nil { return nil, errors.StructuralError("v6 requires a salt for the hash to be signed") } hasher.Write(sig.salt) } return hasher, nil } // Sign signs a message with a private key. The hash, h, must contain // the hash of the message to be signed and will be mutated by this function. // On success, the signature is stored in sig. Call Serialize to write it out. // If config is nil, sensible defaults will be used. func (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err error) { if priv.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } sig.Version = priv.PublicKey.Version sig.IssuerFingerprint = priv.PublicKey.Fingerprint if sig.Version < 6 && config.RandomizeSignaturesViaNotation() { sig.removeNotationsWithName(SaltNotationName) salt, err := SignatureSaltForHash(sig.Hash, config.Random()) if err != nil { return err } notation := Notation{ Name: SaltNotationName, Value: salt, IsCritical: false, IsHumanReadable: false, } sig.Notations = append(sig.Notations, ¬ation) } sig.outSubpackets, err = sig.buildSubpackets(priv.PublicKey) if err != nil { return err } digest, err := sig.signPrepareHash(h) if err != nil { return } switch priv.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: // supports both *rsa.PrivateKey and crypto.Signer sigdata, err := priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) if err == nil { sig.RSASignature = encoding.NewMPI(sigdata) } case PubKeyAlgoDSA: dsaPriv := priv.PrivateKey.(*dsa.PrivateKey) // Need to truncate hashBytes to match FIPS 186-3 section 4.6. subgroupSize := (dsaPriv.Q.BitLen() + 7) / 8 if len(digest) > subgroupSize { digest = digest[:subgroupSize] } r, s, err := dsa.Sign(config.Random(), dsaPriv, digest) if err == nil { sig.DSASigR = new(encoding.MPI).SetBig(r) sig.DSASigS = new(encoding.MPI).SetBig(s) } case PubKeyAlgoECDSA: var r, s *big.Int if sk, ok := priv.PrivateKey.(*ecdsa.PrivateKey); ok { r, s, err = ecdsa.Sign(config.Random(), sk, digest) } else { var b []byte b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) if err == nil { r, s, err = unwrapECDSASig(b) } } if err == nil { sig.ECDSASigR = new(encoding.MPI).SetBig(r) sig.ECDSASigS = new(encoding.MPI).SetBig(s) } case PubKeyAlgoEdDSA: sk := priv.PrivateKey.(*eddsa.PrivateKey) r, s, err := eddsa.Sign(sk, digest) if err == nil { sig.EdDSASigR = encoding.NewMPI(r) sig.EdDSASigS = encoding.NewMPI(s) } case PubKeyAlgoEd25519: sk := priv.PrivateKey.(*ed25519.PrivateKey) signature, err := ed25519.Sign(sk, digest) if err == nil { sig.EdSig = signature } case PubKeyAlgoEd448: sk := priv.PrivateKey.(*ed448.PrivateKey) signature, err := ed448.Sign(sk, digest) if err == nil { sig.EdSig = signature } default: err = errors.UnsupportedError("public key algorithm: " + strconv.Itoa(int(sig.PubKeyAlgo))) } return } // unwrapECDSASig parses the two integer components of an ASN.1-encoded ECDSA signature. func unwrapECDSASig(b []byte) (r, s *big.Int, err error) { var ecsdaSig struct { R, S *big.Int } _, err = asn1.Unmarshal(b, &ecsdaSig) if err != nil { return } return ecsdaSig.R, ecsdaSig.S, nil } // SignUserId computes a signature from priv, asserting that pub is a valid // key for the identity id. On success, the signature is stored in sig. Call // Serialize to write it out. // If config is nil, sensible defaults will be used. func (sig *Signature) SignUserId(id string, pub *PublicKey, priv *PrivateKey, config *Config) error { if priv.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } prepareHash, err := sig.PrepareSign(config) if err != nil { return err } if err := userIdSignatureHash(id, pub, prepareHash); err != nil { return err } return sig.Sign(prepareHash, priv, config) } // SignDirectKeyBinding computes a signature from priv // On success, the signature is stored in sig. // Call Serialize to write it out. // If config is nil, sensible defaults will be used. func (sig *Signature) SignDirectKeyBinding(pub *PublicKey, priv *PrivateKey, config *Config) error { if priv.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } prepareHash, err := sig.PrepareSign(config) if err != nil { return err } if err := directKeySignatureHash(pub, prepareHash); err != nil { return err } return sig.Sign(prepareHash, priv, config) } // CrossSignKey computes a signature from signingKey on pub hashed using hashKey. On success, // the signature is stored in sig. Call Serialize to write it out. // If config is nil, sensible defaults will be used. func (sig *Signature) CrossSignKey(pub *PublicKey, hashKey *PublicKey, signingKey *PrivateKey, config *Config) error { prepareHash, err := sig.PrepareSign(config) if err != nil { return err } h, err := keySignatureHash(hashKey, pub, prepareHash) if err != nil { return err } return sig.Sign(h, signingKey, config) } // SignKey computes a signature from priv, asserting that pub is a subkey. On // success, the signature is stored in sig. Call Serialize to write it out. // If config is nil, sensible defaults will be used. func (sig *Signature) SignKey(pub *PublicKey, priv *PrivateKey, config *Config) error { if priv.Dummy() { return errors.ErrDummyPrivateKey("dummy key found") } prepareHash, err := sig.PrepareSign(config) if err != nil { return err } h, err := keySignatureHash(&priv.PublicKey, pub, prepareHash) if err != nil { return err } return sig.Sign(h, priv, config) } // RevokeKey computes a revocation signature of pub using priv. On success, the signature is // stored in sig. Call Serialize to write it out. // If config is nil, sensible defaults will be used. func (sig *Signature) RevokeKey(pub *PublicKey, priv *PrivateKey, config *Config) error { prepareHash, err := sig.PrepareSign(config) if err != nil { return err } if err := keyRevocationHash(pub, prepareHash); err != nil { return err } return sig.Sign(prepareHash, priv, config) } // RevokeSubkey computes a subkey revocation signature of pub using priv. // On success, the signature is stored in sig. Call Serialize to write it out. // If config is nil, sensible defaults will be used. func (sig *Signature) RevokeSubkey(pub *PublicKey, priv *PrivateKey, config *Config) error { // Identical to a subkey binding signature return sig.SignKey(pub, priv, config) } // Serialize marshals sig to w. Sign, SignUserId or SignKey must have been // called first. func (sig *Signature) Serialize(w io.Writer) (err error) { if len(sig.outSubpackets) == 0 { sig.outSubpackets = sig.rawSubpackets } if sig.RSASignature == nil && sig.DSASigR == nil && sig.ECDSASigR == nil && sig.EdDSASigR == nil && sig.EdSig == nil { return errors.InvalidArgumentError("Signature: need to call Sign, SignUserId or SignKey before Serialize") } sigLength := 0 switch sig.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: sigLength = int(sig.RSASignature.EncodedLength()) case PubKeyAlgoDSA: sigLength = int(sig.DSASigR.EncodedLength()) sigLength += int(sig.DSASigS.EncodedLength()) case PubKeyAlgoECDSA: sigLength = int(sig.ECDSASigR.EncodedLength()) sigLength += int(sig.ECDSASigS.EncodedLength()) case PubKeyAlgoEdDSA: sigLength = int(sig.EdDSASigR.EncodedLength()) sigLength += int(sig.EdDSASigS.EncodedLength()) case PubKeyAlgoEd25519: sigLength = ed25519.SignatureSize case PubKeyAlgoEd448: sigLength = ed448.SignatureSize default: panic("impossible") } hashedSubpacketsLen := subpacketsLength(sig.outSubpackets, true) unhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false) length := 4 + /* length of version|signature type|public-key algorithm|hash algorithm */ 2 /* length of hashed subpackets */ + hashedSubpacketsLen + 2 /* length of unhashed subpackets */ + unhashedSubpacketsLen + 2 /* hash tag */ + sigLength if sig.Version == 6 { length += 4 + /* the two length fields are four-octet instead of two */ 1 + /* salt length */ len(sig.salt) /* length salt */ } err = serializeHeader(w, packetTypeSignature, length) if err != nil { return } err = sig.serializeBody(w) if err != nil { return err } return } func (sig *Signature) serializeBody(w io.Writer) (err error) { var fields []byte if sig.Version == 6 { // v6 signatures use 4 octets for length hashedSubpacketsLen := uint32(uint32(sig.HashSuffix[4])<<24) | uint32(uint32(sig.HashSuffix[5])<<16) | uint32(uint32(sig.HashSuffix[6])<<8) | uint32(sig.HashSuffix[7]) fields = sig.HashSuffix[:8+hashedSubpacketsLen] } else { hashedSubpacketsLen := uint16(uint16(sig.HashSuffix[4])<<8) | uint16(sig.HashSuffix[5]) fields = sig.HashSuffix[:6+hashedSubpacketsLen] } _, err = w.Write(fields) if err != nil { return } unhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false) var unhashedSubpackets []byte if sig.Version == 6 { unhashedSubpackets = make([]byte, 4+unhashedSubpacketsLen) unhashedSubpackets[0] = byte(unhashedSubpacketsLen >> 24) unhashedSubpackets[1] = byte(unhashedSubpacketsLen >> 16) unhashedSubpackets[2] = byte(unhashedSubpacketsLen >> 8) unhashedSubpackets[3] = byte(unhashedSubpacketsLen) serializeSubpackets(unhashedSubpackets[4:], sig.outSubpackets, false) } else { unhashedSubpackets = make([]byte, 2+unhashedSubpacketsLen) unhashedSubpackets[0] = byte(unhashedSubpacketsLen >> 8) unhashedSubpackets[1] = byte(unhashedSubpacketsLen) serializeSubpackets(unhashedSubpackets[2:], sig.outSubpackets, false) } _, err = w.Write(unhashedSubpackets) if err != nil { return } _, err = w.Write(sig.HashTag[:]) if err != nil { return } if sig.Version == 6 { // write salt for v6 signatures _, err = w.Write([]byte{uint8(len(sig.salt))}) if err != nil { return } _, err = w.Write(sig.salt) if err != nil { return } } switch sig.PubKeyAlgo { case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: _, err = w.Write(sig.RSASignature.EncodedBytes()) case PubKeyAlgoDSA: if _, err = w.Write(sig.DSASigR.EncodedBytes()); err != nil { return } _, err = w.Write(sig.DSASigS.EncodedBytes()) case PubKeyAlgoECDSA: if _, err = w.Write(sig.ECDSASigR.EncodedBytes()); err != nil { return } _, err = w.Write(sig.ECDSASigS.EncodedBytes()) case PubKeyAlgoEdDSA: if _, err = w.Write(sig.EdDSASigR.EncodedBytes()); err != nil { return } _, err = w.Write(sig.EdDSASigS.EncodedBytes()) case PubKeyAlgoEd25519: err = ed25519.WriteSignature(w, sig.EdSig) case PubKeyAlgoEd448: err = ed448.WriteSignature(w, sig.EdSig) default: panic("impossible") } return } // outputSubpacket represents a subpacket to be marshaled. type outputSubpacket struct { hashed bool // true if this subpacket is in the hashed area. subpacketType signatureSubpacketType isCritical bool contents []byte } func (sig *Signature) buildSubpackets(issuer PublicKey) (subpackets []outputSubpacket, err error) { creationTime := make([]byte, 4) binary.BigEndian.PutUint32(creationTime, uint32(sig.CreationTime.Unix())) // Signature Creation Time subpackets = append(subpackets, outputSubpacket{true, creationTimeSubpacket, true, creationTime}) // Signature Expiration Time if sig.SigLifetimeSecs != nil && *sig.SigLifetimeSecs != 0 { sigLifetime := make([]byte, 4) binary.BigEndian.PutUint32(sigLifetime, *sig.SigLifetimeSecs) subpackets = append(subpackets, outputSubpacket{true, signatureExpirationSubpacket, true, sigLifetime}) } // Trust Signature if sig.TrustLevel != 0 { subpackets = append(subpackets, outputSubpacket{true, trustSubpacket, true, []byte{byte(sig.TrustLevel), byte(sig.TrustAmount)}}) } // Regular Expression if sig.TrustRegularExpression != nil { // RFC specifies the string should be null-terminated; add a null byte to the end subpackets = append(subpackets, outputSubpacket{true, regularExpressionSubpacket, true, []byte(*sig.TrustRegularExpression + "\000")}) } // Key Expiration Time if sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 { keyLifetime := make([]byte, 4) binary.BigEndian.PutUint32(keyLifetime, *sig.KeyLifetimeSecs) subpackets = append(subpackets, outputSubpacket{true, keyExpirationSubpacket, true, keyLifetime}) } // Preferred Symmetric Ciphers for v1 SEIPD if len(sig.PreferredSymmetric) > 0 { subpackets = append(subpackets, outputSubpacket{true, prefSymmetricAlgosSubpacket, false, sig.PreferredSymmetric}) } // Issuer Key ID if sig.IssuerKeyId != nil && sig.Version == 4 { keyId := make([]byte, 8) binary.BigEndian.PutUint64(keyId, *sig.IssuerKeyId) // Note: making this critical breaks RPM <=4.16. // See: https://github.com/ProtonMail/go-crypto/issues/263 subpackets = append(subpackets, outputSubpacket{true, issuerSubpacket, false, keyId}) } // Notation Data for _, notation := range sig.Notations { subpackets = append( subpackets, outputSubpacket{ true, notationDataSubpacket, notation.IsCritical, notation.getData(), }) } // Preferred Hash Algorithms if len(sig.PreferredHash) > 0 { subpackets = append(subpackets, outputSubpacket{true, prefHashAlgosSubpacket, false, sig.PreferredHash}) } // Preferred Compression Algorithms if len(sig.PreferredCompression) > 0 { subpackets = append(subpackets, outputSubpacket{true, prefCompressionSubpacket, false, sig.PreferredCompression}) } // Keyserver Preferences // Keyserver preferences may only appear in self-signatures or certification signatures. if sig.KeyserverPrefsValid { var prefs byte if sig.KeyserverPrefNoModify { prefs |= KeyserverPrefNoModify } subpackets = append(subpackets, outputSubpacket{true, keyserverPrefsSubpacket, false, []byte{prefs}}) } // Preferred Keyserver if len(sig.PreferredKeyserver) > 0 { subpackets = append(subpackets, outputSubpacket{true, prefKeyserverSubpacket, false, []uint8(sig.PreferredKeyserver)}) } // Primary User ID if sig.IsPrimaryId != nil && *sig.IsPrimaryId { subpackets = append(subpackets, outputSubpacket{true, primaryUserIdSubpacket, false, []byte{1}}) } // Policy URI if len(sig.PolicyURI) > 0 { subpackets = append(subpackets, outputSubpacket{true, policyUriSubpacket, false, []uint8(sig.PolicyURI)}) } // Key Flags // Key flags may only appear in self-signatures or certification signatures. if sig.FlagsValid { var flags byte if sig.FlagCertify { flags |= KeyFlagCertify } if sig.FlagSign { flags |= KeyFlagSign } if sig.FlagEncryptCommunications { flags |= KeyFlagEncryptCommunications } if sig.FlagEncryptStorage { flags |= KeyFlagEncryptStorage } if sig.FlagSplitKey { flags |= KeyFlagSplitKey } if sig.FlagAuthenticate { flags |= KeyFlagAuthenticate } if sig.FlagGroupKey { flags |= KeyFlagGroupKey } subpackets = append(subpackets, outputSubpacket{true, keyFlagsSubpacket, true, []byte{flags}}) } // Signer's User ID if sig.SignerUserId != nil { subpackets = append(subpackets, outputSubpacket{true, signerUserIdSubpacket, false, []byte(*sig.SignerUserId)}) } // Reason for Revocation // Revocation reason appears only in revocation signatures and is serialized as per section 5.2.3.31. if sig.RevocationReason != nil { subpackets = append(subpackets, outputSubpacket{true, reasonForRevocationSubpacket, true, append([]uint8{uint8(*sig.RevocationReason)}, []uint8(sig.RevocationReasonText)...)}) } // Features var features = byte(0x00) if sig.SEIPDv1 { features |= 0x01 } if sig.SEIPDv2 { features |= 0x08 } if features != 0x00 { subpackets = append(subpackets, outputSubpacket{true, featuresSubpacket, false, []byte{features}}) } // Embedded Signature // EmbeddedSignature appears only in subkeys capable of signing and is serialized as per section 5.2.3.34. if sig.EmbeddedSignature != nil { var buf bytes.Buffer err = sig.EmbeddedSignature.serializeBody(&buf) if err != nil { return } subpackets = append(subpackets, outputSubpacket{true, embeddedSignatureSubpacket, true, buf.Bytes()}) } // Issuer Fingerprint if sig.IssuerFingerprint != nil { contents := append([]uint8{uint8(issuer.Version)}, sig.IssuerFingerprint...) subpackets = append(subpackets, outputSubpacket{true, issuerFingerprintSubpacket, sig.Version >= 5, contents}) } // Intended Recipient Fingerprint for _, recipient := range sig.IntendedRecipients { subpackets = append( subpackets, outputSubpacket{ true, intendedRecipientSubpacket, false, recipient.Serialize(), }) } // Preferred AEAD Ciphersuites if len(sig.PreferredCipherSuites) > 0 { serialized := make([]byte, len(sig.PreferredCipherSuites)*2) for i, cipherSuite := range sig.PreferredCipherSuites { serialized[2*i] = cipherSuite[0] serialized[2*i+1] = cipherSuite[1] } subpackets = append(subpackets, outputSubpacket{true, prefCipherSuitesSubpacket, false, serialized}) } return } // AddMetadataToHashSuffix modifies the current hash suffix to include metadata // (format, filename, and time). Version 5 keys protect this data including it // in the hash computation. See section 5.2.4. func (sig *Signature) AddMetadataToHashSuffix() { if sig == nil || sig.Version != 5 { return } if sig.SigType != 0x00 && sig.SigType != 0x01 { return } lit := sig.Metadata if lit == nil { // This will translate into six 0x00 bytes. lit = &LiteralData{} } // Extract the current byte count n := sig.HashSuffix[len(sig.HashSuffix)-8:] l := uint64( uint64(n[0])<<56 | uint64(n[1])<<48 | uint64(n[2])<<40 | uint64(n[3])<<32 | uint64(n[4])<<24 | uint64(n[5])<<16 | uint64(n[6])<<8 | uint64(n[7])) suffix := bytes.NewBuffer(nil) suffix.Write(sig.HashSuffix[:l]) // Add the metadata var buf [4]byte buf[0] = lit.Format fileName := lit.FileName if len(lit.FileName) > 255 { fileName = fileName[:255] } buf[1] = byte(len(fileName)) suffix.Write(buf[:2]) suffix.Write([]byte(lit.FileName)) binary.BigEndian.PutUint32(buf[:], lit.Time) suffix.Write(buf[:]) suffix.Write([]byte{0x05, 0xff}) suffix.Write([]byte{ uint8(l >> 56), uint8(l >> 48), uint8(l >> 40), uint8(l >> 32), uint8(l >> 24), uint8(l >> 16), uint8(l >> 8), uint8(l), }) sig.HashSuffix = suffix.Bytes() } // SaltLengthForHash selects the required salt length for the given hash algorithm, // as per Table 23 (Hash algorithm registry) of the crypto refresh. // See RFC 9580 Section 9.5. func SaltLengthForHash(hash crypto.Hash) (int, error) { switch hash { case crypto.SHA256, crypto.SHA224, crypto.SHA3_256: return 16, nil case crypto.SHA384: return 24, nil case crypto.SHA512, crypto.SHA3_512: return 32, nil default: return 0, errors.UnsupportedError("hash function not supported for V6 signatures") } } // SignatureSaltForHash generates a random signature salt // with the length for the given hash algorithm. // See RFC 9580 Section 9.5. func SignatureSaltForHash(hash crypto.Hash, randReader io.Reader) ([]byte, error) { saltLength, err := SaltLengthForHash(hash) if err != nil { return nil, err } salt := make([]byte, saltLength) _, err = io.ReadFull(randReader, salt) if err != nil { return nil, err } return salt, nil } // removeNotationsWithName removes all notations in this signature with the given name. func (sig *Signature) removeNotationsWithName(name string) { if sig == nil || sig.Notations == nil { return } updatedNotations := make([]*Notation, 0, len(sig.Notations)) for _, notation := range sig.Notations { if notation.Name != name { updatedNotations = append(updatedNotations, notation) } } sig.Notations = updatedNotations } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "bytes" "crypto/cipher" "crypto/sha256" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/s2k" "golang.org/x/crypto/hkdf" ) // This is the largest session key that we'll support. Since at most 256-bit cipher // is supported in OpenPGP, this is large enough to contain also the auth tag. const maxSessionKeySizeInBytes = 64 // SymmetricKeyEncrypted represents a passphrase protected session key. See RFC // 4880, section 5.3. type SymmetricKeyEncrypted struct { Version int CipherFunc CipherFunction Mode AEADMode s2k func(out, in []byte) iv []byte encryptedKey []byte // Contains also the authentication tag for AEAD } // parse parses an SymmetricKeyEncrypted packet as specified in // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#name-symmetric-key-encrypted-ses func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error { var buf [1]byte // Version if _, err := readFull(r, buf[:]); err != nil { return err } ske.Version = int(buf[0]) if ske.Version != 4 && ske.Version != 5 && ske.Version != 6 { return errors.UnsupportedError("unknown SymmetricKeyEncrypted version") } if V5Disabled && ske.Version == 5 { return errors.UnsupportedError("support for parsing v5 entities is disabled; build with `-tags v5` if needed") } if ske.Version > 5 { // Scalar octet count if _, err := readFull(r, buf[:]); err != nil { return err } } // Cipher function if _, err := readFull(r, buf[:]); err != nil { return err } ske.CipherFunc = CipherFunction(buf[0]) if !ske.CipherFunc.IsSupported() { return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(buf[0]))) } if ske.Version >= 5 { // AEAD mode if _, err := readFull(r, buf[:]); err != nil { return errors.StructuralError("cannot read AEAD octet from packet") } ske.Mode = AEADMode(buf[0]) } if ske.Version > 5 { // Scalar octet count if _, err := readFull(r, buf[:]); err != nil { return err } } var err error if ske.s2k, err = s2k.Parse(r); err != nil { if _, ok := err.(errors.ErrDummyPrivateKey); ok { return errors.UnsupportedError("missing key GNU extension in session key") } return err } if ske.Version >= 5 { // AEAD IV iv := make([]byte, ske.Mode.IvLength()) _, err := readFull(r, iv) if err != nil { return errors.StructuralError("cannot read AEAD IV") } ske.iv = iv } encryptedKey := make([]byte, maxSessionKeySizeInBytes) // The session key may follow. We just have to try and read to find // out. If it exists then we limit it to maxSessionKeySizeInBytes. n, err := readFull(r, encryptedKey) if err != nil && err != io.ErrUnexpectedEOF { return err } if n != 0 { if n == maxSessionKeySizeInBytes { return errors.UnsupportedError("oversized encrypted session key") } ske.encryptedKey = encryptedKey[:n] } return nil } // Decrypt attempts to decrypt an encrypted session key and returns the key and // the cipher to use when decrypting a subsequent Symmetrically Encrypted Data // packet. func (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) ([]byte, CipherFunction, error) { key := make([]byte, ske.CipherFunc.KeySize()) ske.s2k(key, passphrase) if len(ske.encryptedKey) == 0 { return key, ske.CipherFunc, nil } switch ske.Version { case 4: plaintextKey, cipherFunc, err := ske.decryptV4(key) return plaintextKey, cipherFunc, err case 5, 6: plaintextKey, err := ske.aeadDecrypt(ske.Version, key) return plaintextKey, CipherFunction(0), err } err := errors.UnsupportedError("unknown SymmetricKeyEncrypted version") return nil, CipherFunction(0), err } func (ske *SymmetricKeyEncrypted) decryptV4(key []byte) ([]byte, CipherFunction, error) { // the IV is all zeros iv := make([]byte, ske.CipherFunc.blockSize()) c := cipher.NewCFBDecrypter(ske.CipherFunc.new(key), iv) plaintextKey := make([]byte, len(ske.encryptedKey)) c.XORKeyStream(plaintextKey, ske.encryptedKey) cipherFunc := CipherFunction(plaintextKey[0]) if cipherFunc.blockSize() == 0 { return nil, ske.CipherFunc, errors.UnsupportedError( "unknown cipher: " + strconv.Itoa(int(cipherFunc))) } plaintextKey = plaintextKey[1:] if len(plaintextKey) != cipherFunc.KeySize() { return nil, cipherFunc, errors.StructuralError( "length of decrypted key not equal to cipher keysize") } return plaintextKey, cipherFunc, nil } func (ske *SymmetricKeyEncrypted) aeadDecrypt(version int, key []byte) ([]byte, error) { adata := []byte{0xc3, byte(version), byte(ske.CipherFunc), byte(ske.Mode)} aead := getEncryptedKeyAeadInstance(ske.CipherFunc, ske.Mode, key, adata, version) plaintextKey, err := aead.Open(nil, ske.iv, ske.encryptedKey, adata) if err != nil { return nil, err } return plaintextKey, nil } // SerializeSymmetricKeyEncrypted serializes a symmetric key packet to w. // The packet contains a random session key, encrypted by a key derived from // the given passphrase. The session key is returned and must be passed to // SerializeSymmetricallyEncrypted. // If config is nil, sensible defaults will be used. func SerializeSymmetricKeyEncrypted(w io.Writer, passphrase []byte, config *Config) (key []byte, err error) { cipherFunc := config.Cipher() sessionKey := make([]byte, cipherFunc.KeySize()) _, err = io.ReadFull(config.Random(), sessionKey) if err != nil { return } err = SerializeSymmetricKeyEncryptedReuseKey(w, sessionKey, passphrase, config) if err != nil { return } key = sessionKey return } // SerializeSymmetricKeyEncryptedReuseKey serializes a symmetric key packet to w. // The packet contains the given session key, encrypted by a key derived from // the given passphrase. The returned session key must be passed to // SerializeSymmetricallyEncrypted. // If config is nil, sensible defaults will be used. // Deprecated: Use SerializeSymmetricKeyEncryptedAEADReuseKey instead. func SerializeSymmetricKeyEncryptedReuseKey(w io.Writer, sessionKey []byte, passphrase []byte, config *Config) (err error) { return SerializeSymmetricKeyEncryptedAEADReuseKey(w, sessionKey, passphrase, config.AEAD() != nil, config) } // SerializeSymmetricKeyEncryptedAEADReuseKey serializes a symmetric key packet to w. // The packet contains the given session key, encrypted by a key derived from // the given passphrase. The returned session key must be passed to // SerializeSymmetricallyEncrypted. // If aeadSupported is set, SKESK v6 is used, otherwise v4. // Note: aeadSupported MUST match the value passed to SerializeSymmetricallyEncrypted. // If config is nil, sensible defaults will be used. func SerializeSymmetricKeyEncryptedAEADReuseKey(w io.Writer, sessionKey []byte, passphrase []byte, aeadSupported bool, config *Config) (err error) { var version int if aeadSupported { version = 6 } else { version = 4 } cipherFunc := config.Cipher() // cipherFunc must be AES if !cipherFunc.IsSupported() || cipherFunc < CipherAES128 || cipherFunc > CipherAES256 { return errors.UnsupportedError("unsupported cipher: " + strconv.Itoa(int(cipherFunc))) } keySize := cipherFunc.KeySize() s2kBuf := new(bytes.Buffer) keyEncryptingKey := make([]byte, keySize) // s2k.Serialize salts and stretches the passphrase, and writes the // resulting key to keyEncryptingKey and the s2k descriptor to s2kBuf. err = s2k.Serialize(s2kBuf, keyEncryptingKey, config.Random(), passphrase, config.S2K()) if err != nil { return } s2kBytes := s2kBuf.Bytes() var packetLength int switch version { case 4: packetLength = 2 /* header */ + len(s2kBytes) + 1 /* cipher type */ + keySize case 5, 6: ivLen := config.AEAD().Mode().IvLength() tagLen := config.AEAD().Mode().TagLength() packetLength = 3 + len(s2kBytes) + ivLen + keySize + tagLen } if version > 5 { packetLength += 2 // additional octet count fields } err = serializeHeader(w, packetTypeSymmetricKeyEncrypted, packetLength) if err != nil { return } // Symmetric Key Encrypted Version buf := []byte{byte(version)} if version > 5 { // Scalar octet count buf = append(buf, byte(3+len(s2kBytes)+config.AEAD().Mode().IvLength())) } // Cipher function buf = append(buf, byte(cipherFunc)) if version >= 5 { // AEAD mode buf = append(buf, byte(config.AEAD().Mode())) } if version > 5 { // Scalar octet count buf = append(buf, byte(len(s2kBytes))) } _, err = w.Write(buf) if err != nil { return } _, err = w.Write(s2kBytes) if err != nil { return } switch version { case 4: iv := make([]byte, cipherFunc.blockSize()) c := cipher.NewCFBEncrypter(cipherFunc.new(keyEncryptingKey), iv) encryptedCipherAndKey := make([]byte, keySize+1) c.XORKeyStream(encryptedCipherAndKey, buf[1:]) c.XORKeyStream(encryptedCipherAndKey[1:], sessionKey) _, err = w.Write(encryptedCipherAndKey) if err != nil { return } case 5, 6: mode := config.AEAD().Mode() adata := []byte{0xc3, byte(version), byte(cipherFunc), byte(mode)} aead := getEncryptedKeyAeadInstance(cipherFunc, mode, keyEncryptingKey, adata, version) // Sample iv using random reader iv := make([]byte, config.AEAD().Mode().IvLength()) _, err = io.ReadFull(config.Random(), iv) if err != nil { return } // Seal and write (encryptedData includes auth. tag) encryptedData := aead.Seal(nil, iv, sessionKey, adata) _, err = w.Write(iv) if err != nil { return } _, err = w.Write(encryptedData) if err != nil { return } } return } func getEncryptedKeyAeadInstance(c CipherFunction, mode AEADMode, inputKey, associatedData []byte, version int) (aead cipher.AEAD) { var blockCipher cipher.Block if version > 5 { hkdfReader := hkdf.New(sha256.New, inputKey, []byte{}, associatedData) encryptionKey := make([]byte, c.KeySize()) _, _ = readFull(hkdfReader, encryptionKey) blockCipher = c.new(encryptionKey) } else { blockCipher = c.new(inputKey) } return mode.new(blockCipher) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "io" "github.com/ProtonMail/go-crypto/openpgp/errors" ) const aeadSaltSize = 32 // SymmetricallyEncrypted represents a symmetrically encrypted byte string. The // encrypted Contents will consist of more OpenPGP packets. See RFC 4880, // sections 5.7 and 5.13. type SymmetricallyEncrypted struct { Version int Contents io.Reader // contains tag for version 2 IntegrityProtected bool // If true it is type 18 (with MDC or AEAD). False is packet type 9 // Specific to version 1 prefix []byte // Specific to version 2 Cipher CipherFunction Mode AEADMode ChunkSizeByte byte Salt [aeadSaltSize]byte } const ( symmetricallyEncryptedVersionMdc = 1 symmetricallyEncryptedVersionAead = 2 ) func (se *SymmetricallyEncrypted) parse(r io.Reader) error { if se.IntegrityProtected { // See RFC 4880, section 5.13. var buf [1]byte _, err := readFull(r, buf[:]) if err != nil { return err } switch buf[0] { case symmetricallyEncryptedVersionMdc: se.Version = symmetricallyEncryptedVersionMdc case symmetricallyEncryptedVersionAead: se.Version = symmetricallyEncryptedVersionAead if err := se.parseAead(r); err != nil { return err } default: return errors.UnsupportedError("unknown SymmetricallyEncrypted version") } } se.Contents = r return nil } // Decrypt returns a ReadCloser, from which the decrypted Contents of the // packet can be read. An incorrect key will only be detected after trying // to decrypt the entire data. func (se *SymmetricallyEncrypted) Decrypt(c CipherFunction, key []byte) (io.ReadCloser, error) { if se.Version == symmetricallyEncryptedVersionAead { return se.decryptAead(key) } return se.decryptMdc(c, key) } // SerializeSymmetricallyEncrypted serializes a symmetrically encrypted packet // to w and returns a WriteCloser to which the to-be-encrypted packets can be // written. // If aeadSupported is set to true, SEIPDv2 is used with the indicated CipherSuite. // Otherwise, SEIPDv1 is used with the indicated CipherFunction. // Note: aeadSupported MUST match the value passed to SerializeEncryptedKeyAEAD // and/or SerializeSymmetricKeyEncryptedAEADReuseKey. // If config is nil, sensible defaults will be used. func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, aeadSupported bool, cipherSuite CipherSuite, key []byte, config *Config) (Contents io.WriteCloser, err error) { writeCloser := noOpCloser{w} ciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedIntegrityProtected) if err != nil { return } if aeadSupported { return serializeSymmetricallyEncryptedAead(ciphertext, cipherSuite, config.AEADConfig.ChunkSizeByte(), config.Random(), key) } return serializeSymmetricallyEncryptedMdc(ciphertext, c, key, config) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_aead.go ================================================ // Copyright 2023 Proton AG. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "crypto/cipher" "crypto/sha256" "fmt" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/errors" "golang.org/x/crypto/hkdf" ) // parseAead parses a V2 SEIPD packet (AEAD) as specified in // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2 func (se *SymmetricallyEncrypted) parseAead(r io.Reader) error { headerData := make([]byte, 3) if n, err := io.ReadFull(r, headerData); n < 3 { return errors.StructuralError("could not read aead header: " + err.Error()) } // Cipher se.Cipher = CipherFunction(headerData[0]) // cipherFunc must have block size 16 to use AEAD if se.Cipher.blockSize() != 16 { return errors.UnsupportedError("invalid aead cipher: " + strconv.Itoa(int(se.Cipher))) } // Mode se.Mode = AEADMode(headerData[1]) if se.Mode.TagLength() == 0 { return errors.UnsupportedError("unknown aead mode: " + strconv.Itoa(int(se.Mode))) } // Chunk size se.ChunkSizeByte = headerData[2] if se.ChunkSizeByte > 16 { return errors.UnsupportedError("invalid aead chunk size byte: " + strconv.Itoa(int(se.ChunkSizeByte))) } // Salt if n, err := io.ReadFull(r, se.Salt[:]); n < aeadSaltSize { return errors.StructuralError("could not read aead salt: " + err.Error()) } return nil } // associatedData for chunks: tag, version, cipher, mode, chunk size byte func (se *SymmetricallyEncrypted) associatedData() []byte { return []byte{ 0xD2, symmetricallyEncryptedVersionAead, byte(se.Cipher), byte(se.Mode), se.ChunkSizeByte, } } // decryptAead decrypts a V2 SEIPD packet (AEAD) as specified in // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2 func (se *SymmetricallyEncrypted) decryptAead(inputKey []byte) (io.ReadCloser, error) { if se.Cipher.KeySize() != len(inputKey) { return nil, errors.StructuralError(fmt.Sprintf("invalid session key length for cipher: got %d bytes, but expected %d bytes", len(inputKey), se.Cipher.KeySize())) } aead, nonce := getSymmetricallyEncryptedAeadInstance(se.Cipher, se.Mode, inputKey, se.Salt[:], se.associatedData()) // Carry the first tagLen bytes chunkSize := decodeAEADChunkSize(se.ChunkSizeByte) tagLen := se.Mode.TagLength() chunkBytes := make([]byte, chunkSize+tagLen*2) peekedBytes := chunkBytes[chunkSize+tagLen:] n, err := io.ReadFull(se.Contents, peekedBytes) if n < tagLen || (err != nil && err != io.EOF) { return nil, errors.StructuralError("not enough data to decrypt:" + err.Error()) } return &aeadDecrypter{ aeadCrypter: aeadCrypter{ aead: aead, chunkSize: decodeAEADChunkSize(se.ChunkSizeByte), nonce: nonce, associatedData: se.associatedData(), chunkIndex: nonce[len(nonce)-8:], packetTag: packetTypeSymmetricallyEncryptedIntegrityProtected, }, reader: se.Contents, chunkBytes: chunkBytes, peekedBytes: peekedBytes, }, nil } // serializeSymmetricallyEncryptedAead encrypts to a writer a V2 SEIPD packet (AEAD) as specified in // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2 func serializeSymmetricallyEncryptedAead(ciphertext io.WriteCloser, cipherSuite CipherSuite, chunkSizeByte byte, rand io.Reader, inputKey []byte) (Contents io.WriteCloser, err error) { // cipherFunc must have block size 16 to use AEAD if cipherSuite.Cipher.blockSize() != 16 { return nil, errors.InvalidArgumentError("invalid aead cipher function") } if cipherSuite.Cipher.KeySize() != len(inputKey) { return nil, errors.InvalidArgumentError("error in aead serialization: bad key length") } // Data for en/decryption: tag, version, cipher, aead mode, chunk size prefix := []byte{ 0xD2, symmetricallyEncryptedVersionAead, byte(cipherSuite.Cipher), byte(cipherSuite.Mode), chunkSizeByte, } // Write header (that correspond to prefix except first byte) n, err := ciphertext.Write(prefix[1:]) if err != nil || n < 4 { return nil, err } // Random salt salt := make([]byte, aeadSaltSize) if _, err := io.ReadFull(rand, salt); err != nil { return nil, err } if _, err := ciphertext.Write(salt); err != nil { return nil, err } aead, nonce := getSymmetricallyEncryptedAeadInstance(cipherSuite.Cipher, cipherSuite.Mode, inputKey, salt, prefix) chunkSize := decodeAEADChunkSize(chunkSizeByte) tagLen := aead.Overhead() chunkBytes := make([]byte, chunkSize+tagLen) return &aeadEncrypter{ aeadCrypter: aeadCrypter{ aead: aead, chunkSize: chunkSize, associatedData: prefix, nonce: nonce, chunkIndex: nonce[len(nonce)-8:], packetTag: packetTypeSymmetricallyEncryptedIntegrityProtected, }, writer: ciphertext, chunkBytes: chunkBytes, }, nil } func getSymmetricallyEncryptedAeadInstance(c CipherFunction, mode AEADMode, inputKey, salt, associatedData []byte) (aead cipher.AEAD, nonce []byte) { hkdfReader := hkdf.New(sha256.New, inputKey, salt, associatedData) encryptionKey := make([]byte, c.KeySize()) _, _ = readFull(hkdfReader, encryptionKey) nonce = make([]byte, mode.IvLength()) // Last 64 bits of nonce are the counter _, _ = readFull(hkdfReader, nonce[:len(nonce)-8]) blockCipher := c.new(encryptionKey) aead = mode.new(blockCipher) return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_mdc.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "crypto/cipher" "crypto/sha1" "crypto/subtle" "hash" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/errors" ) // seMdcReader wraps an io.Reader with a no-op Close method. type seMdcReader struct { in io.Reader } func (ser seMdcReader) Read(buf []byte) (int, error) { return ser.in.Read(buf) } func (ser seMdcReader) Close() error { return nil } func (se *SymmetricallyEncrypted) decryptMdc(c CipherFunction, key []byte) (io.ReadCloser, error) { if !c.IsSupported() { return nil, errors.UnsupportedError("unsupported cipher: " + strconv.Itoa(int(c))) } if len(key) != c.KeySize() { return nil, errors.InvalidArgumentError("SymmetricallyEncrypted: incorrect key length") } if se.prefix == nil { se.prefix = make([]byte, c.blockSize()+2) _, err := readFull(se.Contents, se.prefix) if err != nil { return nil, err } } else if len(se.prefix) != c.blockSize()+2 { return nil, errors.InvalidArgumentError("can't try ciphers with different block lengths") } ocfbResync := OCFBResync if se.IntegrityProtected { // MDC packets use a different form of OCFB mode. ocfbResync = OCFBNoResync } s := NewOCFBDecrypter(c.new(key), se.prefix, ocfbResync) plaintext := cipher.StreamReader{S: s, R: se.Contents} if se.IntegrityProtected { // IntegrityProtected packets have an embedded hash that we need to check. h := sha1.New() h.Write(se.prefix) return &seMDCReader{in: plaintext, h: h}, nil } // Otherwise, we just need to wrap plaintext so that it's a valid ReadCloser. return seMdcReader{plaintext}, nil } const mdcTrailerSize = 1 /* tag byte */ + 1 /* length byte */ + sha1.Size // An seMDCReader wraps an io.Reader, maintains a running hash and keeps hold // of the most recent 22 bytes (mdcTrailerSize). Upon EOF, those bytes form an // MDC packet containing a hash of the previous Contents which is checked // against the running hash. See RFC 4880, section 5.13. type seMDCReader struct { in io.Reader h hash.Hash trailer [mdcTrailerSize]byte scratch [mdcTrailerSize]byte trailerUsed int error bool eof bool } func (ser *seMDCReader) Read(buf []byte) (n int, err error) { if ser.error { err = io.ErrUnexpectedEOF return } if ser.eof { err = io.EOF return } // If we haven't yet filled the trailer buffer then we must do that // first. for ser.trailerUsed < mdcTrailerSize { n, err = ser.in.Read(ser.trailer[ser.trailerUsed:]) ser.trailerUsed += n if err == io.EOF { if ser.trailerUsed != mdcTrailerSize { n = 0 err = io.ErrUnexpectedEOF ser.error = true return } ser.eof = true n = 0 return } if err != nil { n = 0 return } } // If it's a short read then we read into a temporary buffer and shift // the data into the caller's buffer. if len(buf) <= mdcTrailerSize { n, err = readFull(ser.in, ser.scratch[:len(buf)]) copy(buf, ser.trailer[:n]) ser.h.Write(buf[:n]) copy(ser.trailer[:], ser.trailer[n:]) copy(ser.trailer[mdcTrailerSize-n:], ser.scratch[:]) if n < len(buf) { ser.eof = true err = io.EOF } return } n, err = ser.in.Read(buf[mdcTrailerSize:]) copy(buf, ser.trailer[:]) ser.h.Write(buf[:n]) copy(ser.trailer[:], buf[n:]) if err == io.EOF { ser.eof = true } return } // This is a new-format packet tag byte for a type 19 (Integrity Protected) packet. const mdcPacketTagByte = byte(0x80) | 0x40 | 19 func (ser *seMDCReader) Close() error { if ser.error { return errors.ErrMDCHashMismatch } for !ser.eof { // We haven't seen EOF so we need to read to the end var buf [1024]byte _, err := ser.Read(buf[:]) if err == io.EOF { break } if err != nil { return errors.ErrMDCHashMismatch } } ser.h.Write(ser.trailer[:2]) final := ser.h.Sum(nil) if subtle.ConstantTimeCompare(final, ser.trailer[2:]) != 1 { return errors.ErrMDCHashMismatch } // The hash already includes the MDC header, but we still check its value // to confirm encryption correctness if ser.trailer[0] != mdcPacketTagByte || ser.trailer[1] != sha1.Size { return errors.ErrMDCHashMismatch } return nil } // An seMDCWriter writes through to an io.WriteCloser while maintains a running // hash of the data written. On close, it emits an MDC packet containing the // running hash. type seMDCWriter struct { w io.WriteCloser h hash.Hash } func (w *seMDCWriter) Write(buf []byte) (n int, err error) { w.h.Write(buf) return w.w.Write(buf) } func (w *seMDCWriter) Close() (err error) { var buf [mdcTrailerSize]byte buf[0] = mdcPacketTagByte buf[1] = sha1.Size w.h.Write(buf[:2]) digest := w.h.Sum(nil) copy(buf[2:], digest) _, err = w.w.Write(buf[:]) if err != nil { return } return w.w.Close() } // noOpCloser is like an ioutil.NopCloser, but for an io.Writer. type noOpCloser struct { w io.Writer } func (c noOpCloser) Write(data []byte) (n int, err error) { return c.w.Write(data) } func (c noOpCloser) Close() error { return nil } func serializeSymmetricallyEncryptedMdc(ciphertext io.WriteCloser, c CipherFunction, key []byte, config *Config) (Contents io.WriteCloser, err error) { // Disallow old cipher suites if !c.IsSupported() || c < CipherAES128 { return nil, errors.InvalidArgumentError("invalid mdc cipher function") } if c.KeySize() != len(key) { return nil, errors.InvalidArgumentError("error in mdc serialization: bad key length") } _, err = ciphertext.Write([]byte{symmetricallyEncryptedVersionMdc}) if err != nil { return } block := c.new(key) blockSize := block.BlockSize() iv := make([]byte, blockSize) _, err = io.ReadFull(config.Random(), iv) if err != nil { return nil, err } s, prefix := NewOCFBEncrypter(block, iv, OCFBNoResync) _, err = ciphertext.Write(prefix) if err != nil { return } plaintext := cipher.StreamWriter{S: s, W: ciphertext} h := sha1.New() h.Write(iv) h.Write(iv[blockSize-2:]) Contents = &seMDCWriter{w: plaintext, h: h} return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "bytes" "image" "image/jpeg" "io" ) const UserAttrImageSubpacket = 1 // UserAttribute is capable of storing other types of data about a user // beyond name, email and a text comment. In practice, user attributes are typically used // to store a signed thumbnail photo JPEG image of the user. // See RFC 4880, section 5.12. type UserAttribute struct { Contents []*OpaqueSubpacket } // NewUserAttributePhoto creates a user attribute packet // containing the given images. func NewUserAttributePhoto(photos ...image.Image) (uat *UserAttribute, err error) { uat = new(UserAttribute) for _, photo := range photos { var buf bytes.Buffer // RFC 4880, Section 5.12.1. data := []byte{ 0x10, 0x00, // Little-endian image header length (16 bytes) 0x01, // Image header version 1 0x01, // JPEG 0, 0, 0, 0, // 12 reserved octets, must be all zero. 0, 0, 0, 0, 0, 0, 0, 0} if _, err = buf.Write(data); err != nil { return } if err = jpeg.Encode(&buf, photo, nil); err != nil { return } lengthBuf := make([]byte, 5) n := serializeSubpacketLength(lengthBuf, len(buf.Bytes())+1) lengthBuf = lengthBuf[:n] uat.Contents = append(uat.Contents, &OpaqueSubpacket{ SubType: UserAttrImageSubpacket, EncodedLength: lengthBuf, Contents: buf.Bytes(), }) } return } // NewUserAttribute creates a new user attribute packet containing the given subpackets. func NewUserAttribute(contents ...*OpaqueSubpacket) *UserAttribute { return &UserAttribute{Contents: contents} } func (uat *UserAttribute) parse(r io.Reader) (err error) { // RFC 4880, section 5.13 b, err := io.ReadAll(r) if err != nil { return } uat.Contents, err = OpaqueSubpackets(b) return } // Serialize marshals the user attribute to w in the form of an OpenPGP packet, including // header. func (uat *UserAttribute) Serialize(w io.Writer) (err error) { var buf bytes.Buffer for _, sp := range uat.Contents { err = sp.Serialize(&buf) if err != nil { return err } } if err = serializeHeader(w, packetTypeUserAttribute, buf.Len()); err != nil { return err } _, err = w.Write(buf.Bytes()) return } // ImageData returns zero or more byte slices, each containing // JPEG File Interchange Format (JFIF), for each photo in the // user attribute packet. func (uat *UserAttribute) ImageData() (imageData [][]byte) { for _, sp := range uat.Contents { if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 { imageData = append(imageData, sp.Contents[16:]) } } return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userid.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package packet import ( "io" "strings" ) // UserId contains text that is intended to represent the name and email // address of the key holder. See RFC 4880, section 5.11. By convention, this // takes the form "Full Name (Comment) " type UserId struct { Id string // By convention, this takes the form "Full Name (Comment) " which is split out in the fields below. Name, Comment, Email string } func hasInvalidCharacters(s string) bool { for _, c := range s { switch c { case '(', ')', '<', '>', 0: return true } } return false } // NewUserId returns a UserId or nil if any of the arguments contain invalid // characters. The invalid characters are '\x00', '(', ')', '<' and '>' func NewUserId(name, comment, email string) *UserId { // RFC 4880 doesn't deal with the structure of userid strings; the // name, comment and email form is just a convention. However, there's // no convention about escaping the metacharacters and GPG just refuses // to create user ids where, say, the name contains a '('. We mirror // this behaviour. if hasInvalidCharacters(name) || hasInvalidCharacters(comment) || hasInvalidCharacters(email) { return nil } uid := new(UserId) uid.Name, uid.Comment, uid.Email = name, comment, email uid.Id = name if len(comment) > 0 { if len(uid.Id) > 0 { uid.Id += " " } uid.Id += "(" uid.Id += comment uid.Id += ")" } if len(email) > 0 { if len(uid.Id) > 0 { uid.Id += " " } uid.Id += "<" uid.Id += email uid.Id += ">" } return uid } func (uid *UserId) parse(r io.Reader) (err error) { // RFC 4880, section 5.11 b, err := io.ReadAll(r) if err != nil { return } uid.Id = string(b) uid.Name, uid.Comment, uid.Email = parseUserId(uid.Id) return } // Serialize marshals uid to w in the form of an OpenPGP packet, including // header. func (uid *UserId) Serialize(w io.Writer) error { err := serializeHeader(w, packetTypeUserId, len(uid.Id)) if err != nil { return err } _, err = w.Write([]byte(uid.Id)) return err } // parseUserId extracts the name, comment and email from a user id string that // is formatted as "Full Name (Comment) ". func parseUserId(id string) (name, comment, email string) { var n, c, e struct { start, end int } var state int for offset, rune := range id { switch state { case 0: // Entering name n.start = offset state = 1 fallthrough case 1: // In name if rune == '(' { state = 2 n.end = offset } else if rune == '<' { state = 5 n.end = offset } case 2: // Entering comment c.start = offset state = 3 fallthrough case 3: // In comment if rune == ')' { state = 4 c.end = offset } case 4: // Between comment and email if rune == '<' { state = 5 } case 5: // Entering email e.start = offset state = 6 fallthrough case 6: // In email if rune == '>' { state = 7 e.end = offset } default: // After email } } switch state { case 1: // ended in the name n.end = len(id) case 3: // ended in comment c.end = len(id) case 6: // ended in email e.end = len(id) } name = strings.TrimSpace(id[n.start:n.end]) comment = strings.TrimSpace(id[c.start:c.end]) email = strings.TrimSpace(id[e.start:e.end]) // RFC 2822 3.4: alternate simple form of a mailbox if email == "" && strings.ContainsRune(name, '@') { email = name name = "" } return } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/read.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package openpgp implements high level operations on OpenPGP messages. package openpgp // import "github.com/ProtonMail/go-crypto/openpgp" import ( "crypto" _ "crypto/sha256" _ "crypto/sha512" "hash" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/armor" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/packet" _ "golang.org/x/crypto/sha3" ) // SignatureType is the armor type for a PGP signature. var SignatureType = "PGP SIGNATURE" // readArmored reads an armored block with the given type. func readArmored(r io.Reader, expectedType string) (body io.Reader, err error) { block, err := armor.Decode(r) if err != nil { return } if block.Type != expectedType { return nil, errors.InvalidArgumentError("expected '" + expectedType + "', got: " + block.Type) } return block.Body, nil } // MessageDetails contains the result of parsing an OpenPGP encrypted and/or // signed message. type MessageDetails struct { IsEncrypted bool // true if the message was encrypted. EncryptedToKeyIds []uint64 // the list of recipient key ids. IsSymmetricallyEncrypted bool // true if a passphrase could have decrypted the message. DecryptedWith Key // the private key used to decrypt the message, if any. IsSigned bool // true if the message is signed. SignedByKeyId uint64 // the key id of the signer, if any. SignedByFingerprint []byte // the key fingerprint of the signer, if any. SignedBy *Key // the key of the signer, if available. LiteralData *packet.LiteralData // the metadata of the contents UnverifiedBody io.Reader // the contents of the message. // If IsSigned is true and SignedBy is non-zero then the signature will // be verified as UnverifiedBody is read. The signature cannot be // checked until the whole of UnverifiedBody is read so UnverifiedBody // must be consumed until EOF before the data can be trusted. Even if a // message isn't signed (or the signer is unknown) the data may contain // an authentication code that is only checked once UnverifiedBody has // been consumed. Once EOF has been seen, the following fields are // valid. (An authentication code failure is reported as a // SignatureError error when reading from UnverifiedBody.) Signature *packet.Signature // the signature packet itself. SignatureError error // nil if the signature is good. UnverifiedSignatures []*packet.Signature // all other unverified signature packets. decrypted io.ReadCloser } // A PromptFunction is used as a callback by functions that may need to decrypt // a private key, or prompt for a passphrase. It is called with a list of // acceptable, encrypted private keys and a boolean that indicates whether a // passphrase is usable. It should either decrypt a private key or return a // passphrase to try. If the decrypted private key or given passphrase isn't // correct, the function will be called again, forever. Any error returned will // be passed up. type PromptFunction func(keys []Key, symmetric bool) ([]byte, error) // A keyEnvelopePair is used to store a private key with the envelope that // contains a symmetric key, encrypted with that key. type keyEnvelopePair struct { key Key encryptedKey *packet.EncryptedKey } // ReadMessage parses an OpenPGP message that may be signed and/or encrypted. // The given KeyRing should contain both public keys (for signature // verification) and, possibly encrypted, private keys for decrypting. // If config is nil, sensible defaults will be used. func ReadMessage(r io.Reader, keyring KeyRing, prompt PromptFunction, config *packet.Config) (md *MessageDetails, err error) { var p packet.Packet var symKeys []*packet.SymmetricKeyEncrypted var pubKeys []keyEnvelopePair // Integrity protected encrypted packet: SymmetricallyEncrypted or AEADEncrypted var edp packet.EncryptedDataPacket packets := packet.NewReader(r) md = new(MessageDetails) md.IsEncrypted = true // The message, if encrypted, starts with a number of packets // containing an encrypted decryption key. The decryption key is either // encrypted to a public key, or with a passphrase. This loop // collects these packets. ParsePackets: for { p, err = packets.Next() if err != nil { return nil, err } switch p := p.(type) { case *packet.SymmetricKeyEncrypted: // This packet contains the decryption key encrypted with a passphrase. md.IsSymmetricallyEncrypted = true symKeys = append(symKeys, p) case *packet.EncryptedKey: // This packet contains the decryption key encrypted to a public key. md.EncryptedToKeyIds = append(md.EncryptedToKeyIds, p.KeyId) switch p.Algo { case packet.PubKeyAlgoRSA, packet.PubKeyAlgoRSAEncryptOnly, packet.PubKeyAlgoElGamal, packet.PubKeyAlgoECDH, packet.PubKeyAlgoX25519, packet.PubKeyAlgoX448: break default: continue } if keyring != nil { var keys []Key if p.KeyId == 0 { keys = keyring.DecryptionKeys() } else { keys = keyring.KeysById(p.KeyId) } for _, k := range keys { pubKeys = append(pubKeys, keyEnvelopePair{k, p}) } } case *packet.SymmetricallyEncrypted: if !p.IntegrityProtected && !config.AllowUnauthenticatedMessages() { return nil, errors.UnsupportedError("message is not integrity protected") } edp = p break ParsePackets case *packet.AEADEncrypted: edp = p break ParsePackets case *packet.Compressed, *packet.LiteralData, *packet.OnePassSignature: // This message isn't encrypted. if len(symKeys) != 0 || len(pubKeys) != 0 { return nil, errors.StructuralError("key material not followed by encrypted message") } packets.Unread(p) return readSignedMessage(packets, nil, keyring, config) } } var candidates []Key var decrypted io.ReadCloser // Now that we have the list of encrypted keys we need to decrypt at // least one of them or, if we cannot, we need to call the prompt // function so that it can decrypt a key or give us a passphrase. FindKey: for { // See if any of the keys already have a private key available candidates = candidates[:0] candidateFingerprints := make(map[string]bool) for _, pk := range pubKeys { if pk.key.PrivateKey == nil { continue } if !pk.key.PrivateKey.Encrypted { if len(pk.encryptedKey.Key) == 0 { errDec := pk.encryptedKey.Decrypt(pk.key.PrivateKey, config) if errDec != nil { continue } } // Try to decrypt symmetrically encrypted decrypted, err = edp.Decrypt(pk.encryptedKey.CipherFunc, pk.encryptedKey.Key) if err != nil && err != errors.ErrKeyIncorrect { return nil, err } if decrypted != nil { md.DecryptedWith = pk.key break FindKey } } else { fpr := string(pk.key.PublicKey.Fingerprint[:]) if v := candidateFingerprints[fpr]; v { continue } candidates = append(candidates, pk.key) candidateFingerprints[fpr] = true } } if len(candidates) == 0 && len(symKeys) == 0 { return nil, errors.ErrKeyIncorrect } if prompt == nil { return nil, errors.ErrKeyIncorrect } passphrase, err := prompt(candidates, len(symKeys) != 0) if err != nil { return nil, err } // Try the symmetric passphrase first if len(symKeys) != 0 && passphrase != nil { for _, s := range symKeys { key, cipherFunc, err := s.Decrypt(passphrase) // In v4, on wrong passphrase, session key decryption is very likely to result in an invalid cipherFunc: // only for < 5% of cases we will proceed to decrypt the data if err == nil { decrypted, err = edp.Decrypt(cipherFunc, key) if err != nil { return nil, err } if decrypted != nil { break FindKey } } } } } md.decrypted = decrypted if err := packets.Push(decrypted); err != nil { return nil, err } mdFinal, sensitiveParsingErr := readSignedMessage(packets, md, keyring, config) if sensitiveParsingErr != nil { return nil, errors.HandleSensitiveParsingError(sensitiveParsingErr, md.decrypted != nil) } return mdFinal, nil } // readSignedMessage reads a possibly signed message if mdin is non-zero then // that structure is updated and returned. Otherwise a fresh MessageDetails is // used. func readSignedMessage(packets *packet.Reader, mdin *MessageDetails, keyring KeyRing, config *packet.Config) (md *MessageDetails, err error) { if mdin == nil { mdin = new(MessageDetails) } md = mdin var p packet.Packet var h hash.Hash var wrappedHash hash.Hash var prevLast bool FindLiteralData: for { p, err = packets.Next() if err != nil { return nil, err } switch p := p.(type) { case *packet.Compressed: if err := packets.Push(p.Body); err != nil { return nil, err } case *packet.OnePassSignature: if prevLast { return nil, errors.UnsupportedError("nested signature packets") } if p.IsLast { prevLast = true } h, wrappedHash, err = hashForSignature(p.Hash, p.SigType, p.Salt) if err != nil { md.SignatureError = err } md.IsSigned = true if p.Version == 6 { md.SignedByFingerprint = p.KeyFingerprint } md.SignedByKeyId = p.KeyId if keyring != nil { keys := keyring.KeysByIdUsage(p.KeyId, packet.KeyFlagSign) if len(keys) > 0 { md.SignedBy = &keys[0] } } case *packet.LiteralData: md.LiteralData = p break FindLiteralData } } if md.IsSigned && md.SignatureError == nil { md.UnverifiedBody = &signatureCheckReader{packets, h, wrappedHash, md, config} } else if md.decrypted != nil { md.UnverifiedBody = &checkReader{md, false} } else { md.UnverifiedBody = md.LiteralData.Body } return md, nil } func wrapHashForSignature(hashFunc hash.Hash, sigType packet.SignatureType) (hash.Hash, error) { switch sigType { case packet.SigTypeBinary: return hashFunc, nil case packet.SigTypeText: return NewCanonicalTextHash(hashFunc), nil } return nil, errors.UnsupportedError("unsupported signature type: " + strconv.Itoa(int(sigType))) } // hashForSignature returns a pair of hashes that can be used to verify a // signature. The signature may specify that the contents of the signed message // should be preprocessed (i.e. to normalize line endings). Thus this function // returns two hashes. The second should be used to hash the message itself and // performs any needed preprocessing. func hashForSignature(hashFunc crypto.Hash, sigType packet.SignatureType, sigSalt []byte) (hash.Hash, hash.Hash, error) { if _, ok := algorithm.HashToHashIdWithSha1(hashFunc); !ok { return nil, nil, errors.UnsupportedError("unsupported hash function") } if !hashFunc.Available() { return nil, nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashFunc))) } h := hashFunc.New() if sigSalt != nil { h.Write(sigSalt) } wrappedHash, err := wrapHashForSignature(h, sigType) if err != nil { return nil, nil, err } switch sigType { case packet.SigTypeBinary: return h, wrappedHash, nil case packet.SigTypeText: return h, wrappedHash, nil } return nil, nil, errors.UnsupportedError("unsupported signature type: " + strconv.Itoa(int(sigType))) } // checkReader wraps an io.Reader from a LiteralData packet. When it sees EOF // it closes the ReadCloser from any SymmetricallyEncrypted packet to trigger // MDC checks. type checkReader struct { md *MessageDetails checked bool } func (cr *checkReader) Read(buf []byte) (int, error) { n, sensitiveParsingError := cr.md.LiteralData.Body.Read(buf) if sensitiveParsingError == io.EOF { if cr.checked { // Only check once return n, io.EOF } mdcErr := cr.md.decrypted.Close() if mdcErr != nil { return n, mdcErr } cr.checked = true return n, io.EOF } if sensitiveParsingError != nil { return n, errors.HandleSensitiveParsingError(sensitiveParsingError, true) } return n, nil } // signatureCheckReader wraps an io.Reader from a LiteralData packet and hashes // the data as it is read. When it sees an EOF from the underlying io.Reader // it parses and checks a trailing Signature packet and triggers any MDC checks. type signatureCheckReader struct { packets *packet.Reader h, wrappedHash hash.Hash md *MessageDetails config *packet.Config } func (scr *signatureCheckReader) Read(buf []byte) (int, error) { n, sensitiveParsingError := scr.md.LiteralData.Body.Read(buf) // Hash only if required if scr.md.SignedBy != nil { scr.wrappedHash.Write(buf[:n]) } readsDecryptedData := scr.md.decrypted != nil if sensitiveParsingError == io.EOF { var p packet.Packet var readError error var sig *packet.Signature p, readError = scr.packets.Next() for readError == nil { var ok bool if sig, ok = p.(*packet.Signature); ok { if sig.Version == 5 && (sig.SigType == 0x00 || sig.SigType == 0x01) { sig.Metadata = scr.md.LiteralData } // If signature KeyID matches if scr.md.SignedBy != nil && *sig.IssuerKeyId == scr.md.SignedByKeyId { key := scr.md.SignedBy signatureError := key.PublicKey.VerifySignature(scr.h, sig) if signatureError == nil { signatureError = checkMessageSignatureDetails(key, sig, scr.config) } scr.md.Signature = sig scr.md.SignatureError = signatureError } else { scr.md.UnverifiedSignatures = append(scr.md.UnverifiedSignatures, sig) } } p, readError = scr.packets.Next() } if scr.md.SignedBy != nil && scr.md.Signature == nil { if scr.md.UnverifiedSignatures == nil { scr.md.SignatureError = errors.StructuralError("LiteralData not followed by signature") } else { scr.md.SignatureError = errors.StructuralError("No matching signature found") } } // The SymmetricallyEncrypted packet, if any, might have an // unsigned hash of its own. In order to check this we need to // close that Reader. if scr.md.decrypted != nil { if sensitiveParsingError := scr.md.decrypted.Close(); sensitiveParsingError != nil { return n, errors.HandleSensitiveParsingError(sensitiveParsingError, true) } } return n, io.EOF } if sensitiveParsingError != nil { return n, errors.HandleSensitiveParsingError(sensitiveParsingError, readsDecryptedData) } return n, nil } // VerifyDetachedSignature takes a signed file and a detached signature and // returns the signature packet and the entity the signature was signed by, // if any, and a possible signature verification error. // If the signer isn't known, ErrUnknownIssuer is returned. func VerifyDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) { return verifyDetachedSignature(keyring, signed, signature, nil, false, config) } // VerifyDetachedSignatureAndHash performs the same actions as // VerifyDetachedSignature and checks that the expected hash functions were used. func VerifyDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) { return verifyDetachedSignature(keyring, signed, signature, expectedHashes, true, config) } // CheckDetachedSignature takes a signed file and a detached signature and // returns the entity the signature was signed by, if any, and a possible // signature verification error. If the signer isn't known, // ErrUnknownIssuer is returned. func CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (signer *Entity, err error) { _, signer, err = verifyDetachedSignature(keyring, signed, signature, nil, false, config) return } // CheckDetachedSignatureAndHash performs the same actions as // CheckDetachedSignature and checks that the expected hash functions were used. func CheckDetachedSignatureAndHash(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, config *packet.Config) (signer *Entity, err error) { _, signer, err = verifyDetachedSignature(keyring, signed, signature, expectedHashes, true, config) return } func verifyDetachedSignature(keyring KeyRing, signed, signature io.Reader, expectedHashes []crypto.Hash, checkHashes bool, config *packet.Config) (sig *packet.Signature, signer *Entity, err error) { var issuerKeyId uint64 var hashFunc crypto.Hash var sigType packet.SignatureType var keys []Key var p packet.Packet packets := packet.NewReader(signature) for { p, err = packets.Next() if err == io.EOF { return nil, nil, errors.ErrUnknownIssuer } if err != nil { return nil, nil, err } var ok bool sig, ok = p.(*packet.Signature) if !ok { return nil, nil, errors.StructuralError("non signature packet found") } if sig.IssuerKeyId == nil { return nil, nil, errors.StructuralError("signature doesn't have an issuer") } issuerKeyId = *sig.IssuerKeyId hashFunc = sig.Hash sigType = sig.SigType if checkHashes { matchFound := false // check for hashes for _, expectedHash := range expectedHashes { if hashFunc == expectedHash { matchFound = true break } } if !matchFound { return nil, nil, errors.StructuralError("hash algorithm or salt mismatch with cleartext message headers") } } keys = keyring.KeysByIdUsage(issuerKeyId, packet.KeyFlagSign) if len(keys) > 0 { break } } if len(keys) == 0 { panic("unreachable") } h, err := sig.PrepareVerify() if err != nil { return nil, nil, err } wrappedHash, err := wrapHashForSignature(h, sigType) if err != nil { return nil, nil, err } if _, err := io.Copy(wrappedHash, signed); err != nil && err != io.EOF { return nil, nil, err } for _, key := range keys { err = key.PublicKey.VerifySignature(h, sig) if err == nil { return sig, key.Entity, checkMessageSignatureDetails(&key, sig, config) } } return nil, nil, err } // CheckArmoredDetachedSignature performs the same actions as // CheckDetachedSignature but expects the signature to be armored. func CheckArmoredDetachedSignature(keyring KeyRing, signed, signature io.Reader, config *packet.Config) (signer *Entity, err error) { body, err := readArmored(signature, SignatureType) if err != nil { return } return CheckDetachedSignature(keyring, signed, body, config) } // checkMessageSignatureDetails returns an error if: // - The signature (or one of the binding signatures mentioned below) // has a unknown critical notation data subpacket // - The primary key of the signing entity is revoked // - The primary identity is revoked // - The signature is expired // - The primary key of the signing entity is expired according to the // primary identity binding signature // // ... or, if the signature was signed by a subkey and: // - The signing subkey is revoked // - The signing subkey is expired according to the subkey binding signature // - The signing subkey binding signature is expired // - The signing subkey cross-signature is expired // // NOTE: The order of these checks is important, as the caller may choose to // ignore ErrSignatureExpired or ErrKeyExpired errors, but should never // ignore any other errors. func checkMessageSignatureDetails(key *Key, signature *packet.Signature, config *packet.Config) error { now := config.Now() primarySelfSignature, primaryIdentity := key.Entity.PrimarySelfSignature() signedBySubKey := key.PublicKey != key.Entity.PrimaryKey sigsToCheck := []*packet.Signature{signature, primarySelfSignature} if signedBySubKey { sigsToCheck = append(sigsToCheck, key.SelfSignature, key.SelfSignature.EmbeddedSignature) } for _, sig := range sigsToCheck { for _, notation := range sig.Notations { if notation.IsCritical && !config.KnownNotation(notation.Name) { return errors.SignatureError("unknown critical notation: " + notation.Name) } } } if key.Entity.Revoked(now) || // primary key is revoked (signedBySubKey && key.Revoked(now)) || // subkey is revoked (primaryIdentity != nil && primaryIdentity.Revoked(now)) { // primary identity is revoked for v4 return errors.ErrKeyRevoked } if key.Entity.PrimaryKey.KeyExpired(primarySelfSignature, now) { // primary key is expired return errors.ErrKeyExpired } if signedBySubKey { if key.PublicKey.KeyExpired(key.SelfSignature, now) { // subkey is expired return errors.ErrKeyExpired } } for _, sig := range sigsToCheck { if sig.SigExpired(now) { // any of the relevant signatures are expired return errors.ErrSignatureExpired } } return nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go ================================================ package openpgp const testKey1KeyId uint64 = 0xA34D7E18C20C31BB const testKey3KeyId uint64 = 0x338934250CCC0360 const testKeyP256KeyId uint64 = 0xd44a2c495918513e const signedInput = "Signed message\nline 2\nline 3\n" const signedTextInput = "Signed message\r\nline 2\r\nline 3\r\n" const recipientUnspecifiedHex = "848c0300000000000000000103ff62d4d578d03cf40c3da998dfe216c074fa6ddec5e31c197c9666ba292830d91d18716a80f699f9d897389a90e6d62d0238f5f07a5248073c0f24920e4bc4a30c2d17ee4e0cae7c3d4aaa4e8dced50e3010a80ee692175fa0385f62ecca4b56ee6e9980aa3ec51b61b077096ac9e800edaf161268593eedb6cc7027ff5cb32745d250010d407a6221ae22ef18469b444f2822478c4d190b24d36371a95cb40087cdd42d9399c3d06a53c0673349bfb607927f20d1e122bde1e2bf3aa6cae6edf489629bcaa0689539ae3b718914d88ededc3b" const detachedSignatureHex = "889c04000102000605024d449cd1000a0910a34d7e18c20c31bb167603ff57718d09f28a519fdc7b5a68b6a3336da04df85e38c5cd5d5bd2092fa4629848a33d85b1729402a2aab39c3ac19f9d573f773cc62c264dc924c067a79dfd8a863ae06c7c8686120760749f5fd9b1e03a64d20a7df3446ddc8f0aeadeaeba7cbaee5c1e366d65b6a0c6cc749bcb912d2f15013f812795c2e29eb7f7b77f39ce77" const detachedSignatureTextHex = "889c04010102000605024d449d21000a0910a34d7e18c20c31bbc8c60400a24fbef7342603a41cb1165767bd18985d015fb72fe05db42db36cfb2f1d455967f1e491194fbf6cf88146222b23bf6ffbd50d17598d976a0417d3192ff9cc0034fd00f287b02e90418bbefe609484b09231e4e7a5f3562e199bf39909ab5276c4d37382fe088f6b5c3426fc1052865da8b3ab158672d58b6264b10823dc4b39" const detachedSignatureDSAHex = "884604001102000605024d6c4eac000a0910338934250ccc0360f18d00a087d743d6405ed7b87755476629600b8b694a39e900a0abff8126f46faf1547c1743c37b21b4ea15b8f83" const detachedSignatureP256Hex = "885e0400130a0006050256e5bb00000a0910d44a2c495918513edef001009841a4f792beb0befccb35c8838a6a87d9b936beaa86db6745ddc7b045eee0cf00fd1ac1f78306b17e965935dd3f8bae4587a76587e4af231efe19cc4011a8434817" // The plaintext is https://www.gutenberg.org/cache/epub/1080/pg1080.txt const modestProposalSha512 = "lbbrB1+WP3T9AaC9OQqBdOcCjgeEQadlulXsNPgVx0tyqPzDHwUugZ2gE7V0ESKAw6kAVfgkcuvfgxAAGaeHtw==" const testKeys1And2Hex = "988d044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd0011010001b41054657374204b6579203120285253412988b804130102002205024d3c5c10021b03060b090807030206150802090a0b0416020301021e01021780000a0910a34d7e18c20c31bbb5b304009cc45fe610b641a2c146331be94dade0a396e73ca725e1b25c21708d9cab46ecca5ccebc23055879df8f99eea39b377962a400f2ebdc36a7c99c333d74aeba346315137c3ff9d0a09b0273299090343048afb8107cf94cbd1400e3026f0ccac7ecebbc4d78588eb3e478fe2754d3ca664bcf3eac96ca4a6b0c8d7df5102f60f6b0020003b88d044d3c5c10010400b201df61d67487301f11879d514f4248ade90c8f68c7af1284c161098de4c28c2850f1ec7b8e30f959793e571542ffc6532189409cb51c3d30dad78c4ad5165eda18b20d9826d8707d0f742e2ab492103a85bbd9ddf4f5720f6de7064feb0d39ee002219765bb07bcfb8b877f47abe270ddeda4f676108cecb6b9bb2ad484a4f0011010001889f04180102000905024d3c5c10021b0c000a0910a34d7e18c20c31bb1a03040085c8d62e16d05dc4e9dad64953c8a2eed8b6c12f92b1575eeaa6dcf7be9473dd5b24b37b6dffbb4e7c99ed1bd3cb11634be19b3e6e207bed7505c7ca111ccf47cb323bf1f8851eb6360e8034cbff8dd149993c959de89f8f77f38e7e98b8e3076323aa719328e2b408db5ec0d03936efd57422ba04f925cdc7b4c1af7590e40ab0020003988d044d3c5c33010400b488c3e5f83f4d561f317817538d9d0397981e9aef1321ca68ebfae1cf8b7d388e19f4b5a24a82e2fbbf1c6c26557a6c5845307a03d815756f564ac7325b02bc83e87d5480a8fae848f07cb891f2d51ce7df83dcafdc12324517c86d472cc0ee10d47a68fd1d9ae49a6c19bbd36d82af597a0d88cc9c49de9df4e696fc1f0b5d0011010001b42754657374204b6579203220285253412c20656e637279707465642070726976617465206b65792988b804130102002205024d3c5c33021b03060b090807030206150802090a0b0416020301021e01021780000a0910d4984f961e35246b98940400908a73b6a6169f700434f076c6c79015a49bee37130eaf23aaa3cfa9ce60bfe4acaa7bc95f1146ada5867e0079babb38804891f4f0b8ebca57a86b249dee786161a755b7a342e68ccf3f78ed6440a93a6626beb9a37aa66afcd4f888790cb4bb46d94a4ae3eb3d7d3e6b00f6bfec940303e89ec5b32a1eaaacce66497d539328b0020003b88d044d3c5c33010400a4e913f9442abcc7f1804ccab27d2f787ffa592077ca935a8bb23165bd8d57576acac647cc596b2c3f814518cc8c82953c7a4478f32e0cf645630a5ba38d9618ef2bc3add69d459ae3dece5cab778938d988239f8c5ae437807075e06c828019959c644ff05ef6a5a1dab72227c98e3a040b0cf219026640698d7a13d8538a570011010001889f04180102000905024d3c5c33021b0c000a0910d4984f961e35246b26c703ff7ee29ef53bc1ae1ead533c408fa136db508434e233d6e62be621e031e5940bbd4c08142aed0f82217e7c3e1ec8de574bc06ccf3c36633be41ad78a9eacd209f861cae7b064100758545cc9dd83db71806dc1cfd5fb9ae5c7474bba0c19c44034ae61bae5eca379383339dece94ff56ff7aa44a582f3e5c38f45763af577c0934b0020003" const testKeys1And2PrivateHex = "9501d8044d3c5c10010400b1d13382944bd5aba23a4312968b5095d14f947f600eb478e14a6fcb16b0e0cac764884909c020bc495cfcc39a935387c661507bdb236a0612fb582cac3af9b29cc2c8c70090616c41b662f4da4c1201e195472eb7f4ae1ccbcbf9940fe21d985e379a5563dde5b9a23d35f1cfaa5790da3b79db26f23695107bfaca8e7b5bcd00110100010003ff4d91393b9a8e3430b14d6209df42f98dc927425b881f1209f319220841273a802a97c7bdb8b3a7740b3ab5866c4d1d308ad0d3a79bd1e883aacf1ac92dfe720285d10d08752a7efe3c609b1d00f17f2805b217be53999a7da7e493bfc3e9618fd17018991b8128aea70a05dbce30e4fbe626aa45775fa255dd9177aabf4df7cf0200c1ded12566e4bc2bb590455e5becfb2e2c9796482270a943343a7835de41080582c2be3caf5981aa838140e97afa40ad652a0b544f83eb1833b0957dce26e47b0200eacd6046741e9ce2ec5beb6fb5e6335457844fb09477f83b050a96be7da043e17f3a9523567ed40e7a521f818813a8b8a72209f1442844843ccc7eb9805442570200bdafe0438d97ac36e773c7162028d65844c4d463e2420aa2228c6e50dc2743c3d6c72d0d782a5173fe7be2169c8a9f4ef8a7cf3e37165e8c61b89c346cdc6c1799d2b41054657374204b6579203120285253412988b804130102002205024d3c5c10021b03060b090807030206150802090a0b0416020301021e01021780000a0910a34d7e18c20c31bbb5b304009cc45fe610b641a2c146331be94dade0a396e73ca725e1b25c21708d9cab46ecca5ccebc23055879df8f99eea39b377962a400f2ebdc36a7c99c333d74aeba346315137c3ff9d0a09b0273299090343048afb8107cf94cbd1400e3026f0ccac7ecebbc4d78588eb3e478fe2754d3ca664bcf3eac96ca4a6b0c8d7df5102f60f6b00200009d01d8044d3c5c10010400b201df61d67487301f11879d514f4248ade90c8f68c7af1284c161098de4c28c2850f1ec7b8e30f959793e571542ffc6532189409cb51c3d30dad78c4ad5165eda18b20d9826d8707d0f742e2ab492103a85bbd9ddf4f5720f6de7064feb0d39ee002219765bb07bcfb8b877f47abe270ddeda4f676108cecb6b9bb2ad484a4f00110100010003fd17a7490c22a79c59281fb7b20f5e6553ec0c1637ae382e8adaea295f50241037f8997cf42c1ce26417e015091451b15424b2c59eb8d4161b0975630408e394d3b00f88d4b4e18e2cc85e8251d4753a27c639c83f5ad4a571c4f19d7cd460b9b73c25ade730c99df09637bd173d8e3e981ac64432078263bb6dc30d3e974150dd0200d0ee05be3d4604d2146fb0457f31ba17c057560785aa804e8ca5530a7cd81d3440d0f4ba6851efcfd3954b7e68908fc0ba47f7ac37bf559c6c168b70d3a7c8cd0200da1c677c4bce06a068070f2b3733b0a714e88d62aa3f9a26c6f5216d48d5c2b5624144f3807c0df30be66b3268eeeca4df1fbded58faf49fc95dc3c35f134f8b01fd1396b6c0fc1b6c4f0eb8f5e44b8eace1e6073e20d0b8bc5385f86f1cf3f050f66af789f3ef1fc107b7f4421e19e0349c730c68f0a226981f4e889054fdb4dc149e8e889f04180102000905024d3c5c10021b0c000a0910a34d7e18c20c31bb1a03040085c8d62e16d05dc4e9dad64953c8a2eed8b6c12f92b1575eeaa6dcf7be9473dd5b24b37b6dffbb4e7c99ed1bd3cb11634be19b3e6e207bed7505c7ca111ccf47cb323bf1f8851eb6360e8034cbff8dd149993c959de89f8f77f38e7e98b8e3076323aa719328e2b408db5ec0d03936efd57422ba04f925cdc7b4c1af7590e40ab00200009501fe044d3c5c33010400b488c3e5f83f4d561f317817538d9d0397981e9aef1321ca68ebfae1cf8b7d388e19f4b5a24a82e2fbbf1c6c26557a6c5845307a03d815756f564ac7325b02bc83e87d5480a8fae848f07cb891f2d51ce7df83dcafdc12324517c86d472cc0ee10d47a68fd1d9ae49a6c19bbd36d82af597a0d88cc9c49de9df4e696fc1f0b5d0011010001fe030302e9030f3c783e14856063f16938530e148bc57a7aa3f3e4f90df9dceccdc779bc0835e1ad3d006e4a8d7b36d08b8e0de5a0d947254ecfbd22037e6572b426bcfdc517796b224b0036ff90bc574b5509bede85512f2eefb520fb4b02aa523ba739bff424a6fe81c5041f253f8d757e69a503d3563a104d0d49e9e890b9d0c26f96b55b743883b472caa7050c4acfd4a21f875bdf1258d88bd61224d303dc9df77f743137d51e6d5246b88c406780528fd9a3e15bab5452e5b93970d9dcc79f48b38651b9f15bfbcf6da452837e9cc70683d1bdca94507870f743e4ad902005812488dd342f836e72869afd00ce1850eea4cfa53ce10e3608e13d3c149394ee3cbd0e23d018fcbcb6e2ec5a1a22972d1d462ca05355d0d290dd2751e550d5efb38c6c89686344df64852bf4ff86638708f644e8ec6bd4af9b50d8541cb91891a431326ab2e332faa7ae86cfb6e0540aa63160c1e5cdd5a4add518b303fff0a20117c6bc77f7cfbaf36b04c865c6c2b42754657374204b6579203220285253412c20656e637279707465642070726976617465206b65792988b804130102002205024d3c5c33021b03060b090807030206150802090a0b0416020301021e01021780000a0910d4984f961e35246b98940400908a73b6a6169f700434f076c6c79015a49bee37130eaf23aaa3cfa9ce60bfe4acaa7bc95f1146ada5867e0079babb38804891f4f0b8ebca57a86b249dee786161a755b7a342e68ccf3f78ed6440a93a6626beb9a37aa66afcd4f888790cb4bb46d94a4ae3eb3d7d3e6b00f6bfec940303e89ec5b32a1eaaacce66497d539328b00200009d01fe044d3c5c33010400a4e913f9442abcc7f1804ccab27d2f787ffa592077ca935a8bb23165bd8d57576acac647cc596b2c3f814518cc8c82953c7a4478f32e0cf645630a5ba38d9618ef2bc3add69d459ae3dece5cab778938d988239f8c5ae437807075e06c828019959c644ff05ef6a5a1dab72227c98e3a040b0cf219026640698d7a13d8538a570011010001fe030302e9030f3c783e148560f936097339ae381d63116efcf802ff8b1c9360767db5219cc987375702a4123fd8657d3e22700f23f95020d1b261eda5257e9a72f9a918e8ef22dd5b3323ae03bbc1923dd224db988cadc16acc04b120a9f8b7e84da9716c53e0334d7b66586ddb9014df604b41be1e960dcfcbc96f4ed150a1a0dd070b9eb14276b9b6be413a769a75b519a53d3ecc0c220e85cd91ca354d57e7344517e64b43b6e29823cbd87eae26e2b2e78e6dedfbb76e3e9f77bcb844f9a8932eb3db2c3f9e44316e6f5d60e9e2a56e46b72abe6b06dc9a31cc63f10023d1f5e12d2a3ee93b675c96f504af0001220991c88db759e231b3320dcedf814dcf723fd9857e3d72d66a0f2af26950b915abdf56c1596f46a325bf17ad4810d3535fb02a259b247ac3dbd4cc3ecf9c51b6c07cebb009c1506fba0a89321ec8683e3fd009a6e551d50243e2d5092fefb3321083a4bad91320dc624bd6b5dddf93553e3d53924c05bfebec1fb4bd47e89a1a889f04180102000905024d3c5c33021b0c000a0910d4984f961e35246b26c703ff7ee29ef53bc1ae1ead533c408fa136db508434e233d6e62be621e031e5940bbd4c08142aed0f82217e7c3e1ec8de574bc06ccf3c36633be41ad78a9eacd209f861cae7b064100758545cc9dd83db71806dc1cfd5fb9ae5c7474bba0c19c44034ae61bae5eca379383339dece94ff56ff7aa44a582f3e5c38f45763af577c0934b0020000" const dsaElGamalTestKeysHex = "9501e1044dfcb16a110400aa3e5c1a1f43dd28c2ffae8abf5cfce555ee874134d8ba0a0f7b868ce2214beddc74e5e1e21ded354a95d18acdaf69e5e342371a71fbb9093162e0c5f3427de413a7f2c157d83f5cd2f9d791256dc4f6f0e13f13c3302af27f2384075ab3021dff7a050e14854bbde0a1094174855fc02f0bae8e00a340d94a1f22b32e48485700a0cec672ac21258fb95f61de2ce1af74b2c4fa3e6703ff698edc9be22c02ae4d916e4fa223f819d46582c0516235848a77b577ea49018dcd5e9e15cff9dbb4663a1ae6dd7580fa40946d40c05f72814b0f88481207e6c0832c3bded4853ebba0a7e3bd8e8c66df33d5a537cd4acf946d1080e7a3dcea679cb2b11a72a33a2b6a9dc85f466ad2ddf4c3db6283fa645343286971e3dd700703fc0c4e290d45767f370831a90187e74e9972aae5bff488eeff7d620af0362bfb95c1a6c3413ab5d15a2e4139e5d07a54d72583914661ed6a87cce810be28a0aa8879a2dd39e52fb6fe800f4f181ac7e328f740cde3d09a05cecf9483e4cca4253e60d4429ffd679d9996a520012aad119878c941e3cf151459873bdfc2a9563472fe0303027a728f9feb3b864260a1babe83925ce794710cfd642ee4ae0e5b9d74cee49e9c67b6cd0ea5dfbb582132195a121356a1513e1bca73e5b80c58c7ccb4164453412f456c47616d616c2054657374204b65792031886204131102002205024dfcb16a021b03060b090807030206150802090a0b0416020301021e01021780000a091033af447ccd759b09fadd00a0b8fd6f5a790bad7e9f2dbb7632046dc4493588db009c087c6a9ba9f7f49fab221587a74788c00db4889ab00200009d0157044dfcb16a1004008dec3f9291205255ccff8c532318133a6840739dd68b03ba942676f9038612071447bf07d00d559c5c0875724ea16a4c774f80d8338b55fca691a0522e530e604215b467bbc9ccfd483a1da99d7bc2648b4318fdbd27766fc8bfad3fddb37c62b8ae7ccfe9577e9b8d1e77c1d417ed2c2ef02d52f4da11600d85d3229607943700030503ff506c94c87c8cab778e963b76cf63770f0a79bf48fb49d3b4e52234620fc9f7657f9f8d56c96a2b7c7826ae6b57ebb2221a3fe154b03b6637cea7e6d98e3e45d87cf8dc432f723d3d71f89c5192ac8d7290684d2c25ce55846a80c9a7823f6acd9bb29fa6cd71f20bc90eccfca20451d0c976e460e672b000df49466408d527affe0303027a728f9feb3b864260abd761730327bca2aaa4ea0525c175e92bf240682a0e83b226f97ecb2e935b62c9a133858ce31b271fa8eb41f6a1b3cd72a63025ce1a75ee4180dcc284884904181102000905024dfcb16a021b0c000a091033af447ccd759b09dd0b009e3c3e7296092c81bee5a19929462caaf2fff3ae26009e218c437a2340e7ea628149af1ec98ec091a43992b00200009501e1044dfcb1be1104009f61faa61aa43df75d128cbe53de528c4aec49ce9360c992e70c77072ad5623de0a3a6212771b66b39a30dad6781799e92608316900518ec01184a85d872365b7d2ba4bacfb5882ea3c2473d3750dc6178cc1cf82147fb58caa28b28e9f12f6d1efcb0534abed644156c91cca4ab78834268495160b2400bc422beb37d237c2300a0cac94911b6d493bda1e1fbc6feeca7cb7421d34b03fe22cec6ccb39675bb7b94a335c2b7be888fd3906a1125f33301d8aa6ec6ee6878f46f73961c8d57a3e9544d8ef2a2cbfd4d52da665b1266928cfe4cb347a58c412815f3b2d2369dec04b41ac9a71cc9547426d5ab941cccf3b18575637ccfb42df1a802df3cfe0a999f9e7109331170e3a221991bf868543960f8c816c28097e503fe319db10fb98049f3a57d7c80c420da66d56f3644371631fad3f0ff4040a19a4fedc2d07727a1b27576f75a4d28c47d8246f27071e12d7a8de62aad216ddbae6aa02efd6b8a3e2818cda48526549791ab277e447b3a36c57cefe9b592f5eab73959743fcc8e83cbefec03a329b55018b53eec196765ae40ef9e20521a603c551efe0303020950d53a146bf9c66034d00c23130cce95576a2ff78016ca471276e8227fb30b1ffbd92e61804fb0c3eff9e30b1a826ee8f3e4730b4d86273ca977b4164453412f456c47616d616c2054657374204b65792032886204131102002205024dfcb1be021b03060b090807030206150802090a0b0416020301021e01021780000a0910a86bf526325b21b22bd9009e34511620415c974750a20df5cb56b182f3b48e6600a0a9466cb1a1305a84953445f77d461593f1d42bc1b00200009d0157044dfcb1be1004009565a951da1ee87119d600c077198f1c1bceb0f7aa54552489298e41ff788fa8f0d43a69871f0f6f77ebdfb14a4260cf9fbeb65d5844b4272a1904dd95136d06c3da745dc46327dd44a0f16f60135914368c8039a34033862261806bb2c5ce1152e2840254697872c85441ccb7321431d75a747a4bfb1d2c66362b51ce76311700030503fc0ea76601c196768070b7365a200e6ddb09307f262d5f39eec467b5f5784e22abdf1aa49226f59ab37cb49969d8f5230ea65caf56015abda62604544ed526c5c522bf92bed178a078789f6c807b6d34885688024a5bed9e9f8c58d11d4b82487b44c5f470c5606806a0443b79cadb45e0f897a561a53f724e5349b9267c75ca17fe0303020950d53a146bf9c660bc5f4ce8f072465e2d2466434320c1e712272fafc20e342fe7608101580fa1a1a367e60486a7cd1246b7ef5586cf5e10b32762b710a30144f12dd17dd4884904181102000905024dfcb1be021b0c000a0910a86bf526325b21b2904c00a0b2b66b4b39ccffda1d10f3ea8d58f827e30a8b8e009f4255b2d8112a184e40cde43a34e8655ca7809370b0020000" const ed25519wX25519Key = "c54b0663877fe31b00000020f94da7bb48d60a61e567706a6587d0331999bb9d891a08242ead84543df895a3001972817b12be707e8d5f586ce61361201d344eb266a2c82fde6835762b65b0b7c2b1061f1b0a00000042058263877fe3030b090705150a0e080c021600029b03021e09222106cb186c4f0609a697e4d52dfa6c722b0c1f1e27c18a56708f6525ec27bad9acc905270902070200000000ad2820103e2d7d227ec0e6d7ce4471db36bfc97083253690271498a7ef0576c07faae14585b3b903b0127ec4fda2f023045a2ec76bcb4f9571a9651e14aee1137a1d668442c88f951e33c4ffd33fb9a17d511eed758fc6d9cc50cb5fd793b2039d5804c74b0663877fe319000000208693248367f9e5015db922f8f48095dda784987f2d5985b12fbad16caf5e4435004d600a4f794d44775c57a26e0feefed558e9afffd6ad0d582d57fb2ba2dcedb8c29b06181b0a0000002c050263877fe322a106cb186c4f0609a697e4d52dfa6c722b0c1f1e27c18a56708f6525ec27bad9acc9021b0c00000000defa20a6e9186d9d5935fc8fe56314cdb527486a5a5120f9b762a235a729f039010a56b89c658568341fbef3b894e9834ad9bc72afae2f4c9c47a43855e65f1cb0a3f77bbc5f61085c1f8249fe4e7ca59af5f0bcee9398e0fa8d76e522e1d8ab42bb0d" const signedMessageHex = "a3019bc0cbccc0c4b8d8b74ee2108fe16ec6d3ca490cbe362d3f8333d3f352531472538b8b13d353b97232f352158c20943157c71c16064626063656269052062e4e01987e9b6fccff4b7df3a34c534b23e679cbec3bc0f8f6e64dfb4b55fe3f8efa9ce110ddb5cd79faf1d753c51aecfa669f7e7aa043436596cccc3359cb7dd6bbe9ecaa69e5989d9e57209571edc0b2fa7f57b9b79a64ee6e99ce1371395fee92fec2796f7b15a77c386ff668ee27f6d38f0baa6c438b561657377bf6acff3c5947befd7bf4c196252f1d6e5c524d0300" const signedTextMessageHex = "a3019bc0cbccc8c4b8d8b74ee2108fe16ec6d36a250cbece0c178233d3f352531472538b8b13d35379b97232f352158ca0b4312f57c71c1646462606365626906a062e4e019811591798ff99bf8afee860b0d8a8c2a85c3387e3bcf0bb3b17987f2bbcfab2aa526d930cbfd3d98757184df3995c9f3e7790e36e3e9779f06089d4c64e9e47dd6202cb6e9bc73c5d11bb59fbaf89d22d8dc7cf199ddf17af96e77c5f65f9bbed56f427bd8db7af37f6c9984bf9385efaf5f184f986fb3e6adb0ecfe35bbf92d16a7aa2a344fb0bc52fb7624f0200" const signedEncryptedMessageHex = "c18c032a67d68660df41c70103ff5a84c9a72f80e74ef0384c2d6a9ebfe2b09e06a8f298394f6d2abf174e40934ab0ec01fb2d0ddf21211c6fe13eb238563663b017a6b44edca552eb4736c4b7dc6ed907dd9e12a21b51b64b46f902f76fb7aaf805c1db8070574d8d0431a23e324a750f77fb72340a17a42300ee4ca8207301e95a731da229a63ab9c6b44541fbd2c11d016d810b3b3b2b38f15b5b40f0a4910332829c2062f1f7cc61f5b03677d73c54cafa1004ced41f315d46444946faae571d6f426e6dbd45d9780eb466df042005298adabf7ce0ef766dfeb94cd449c7ed0046c880339599c4711af073ce649b1e237c40b50a5536283e03bdbb7afad78bd08707715c67fb43295f905b4c479178809d429a8e167a9a8c6dfd8ab20b4edebdc38d6dec879a3202e1b752690d9bb5b0c07c5a227c79cc200e713a99251a4219d62ad5556900cf69bd384b6c8e726c7be267471d0d23af956da165af4af757246c2ebcc302b39e8ef2fccb4971b234fcda22d759ddb20e27269ee7f7fe67898a9de721bfa02ab0becaa046d00ea16cb1afc4e2eab40d0ac17121c565686e5cbd0cbdfbd9d6db5c70278b9c9db5a83176d04f61fbfbc4471d721340ede2746e5c312ded4f26787985af92b64fae3f253dbdde97f6a5e1996fd4d865599e32ff76325d3e9abe93184c02988ee89a4504356a4ef3b9b7a57cbb9637ca90af34a7676b9ef559325c3cca4e29d69fec1887f5440bb101361d744ad292a8547f22b4f22b419a42aa836169b89190f46d9560824cb2ac6e8771de8223216a5e647e132ab9eebcba89569ab339cb1c3d70fe806b31f4f4c600b4103b8d7583ebff16e43dcda551e6530f975122eb8b29" const verifiedSignatureEncryptedMessageHex = "c2b304000108000605026048f6d600210910a34d7e18c20c31bb1621045fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb9a3b0400a32ddac1af259c1b0abab0041327ea04970944401978fb647dd1cf9aba4f164e43f0d8a9389501886474bdd4a6e77f6aea945c07dfbf87743835b44cc2c39a1f9aeecfa83135abc92e18e50396f2e6a06c44e0188b0081effbfb4160d28f118d4ff73dd199a102e47cffd8c7ff2bacd83ae72b5820c021a486766dd587b5da61" const unverifiedSignatureEncryptedMessageHex = "c2b304000108000605026048f6d600210910a34d7e18c20c31bb1621045fb74b1d03b1e3cb31bc2f8aa34d7e18c20c31bb9a3b0400a32ddac1af259c1b0abab0041327ea04970944401978fb647dd1cf9aba4f164e43f0d8a9389501886474bdd4a6e77f6aea945c07dfbf87743835b44cc2c39a1f9aeecfa83135abc92e18e50396f2e6a06c44e0188b0081effbfb4160d28f118d4ff73dd199a102e47cffd8c7ff2bacd83ae72b5820c021a486766dd587b5da61" const signedEncryptedMessage2Hex = "85010e03cf6a7abcd43e36731003fb057f5495b79db367e277cdbe4ab90d924ddee0c0381494112ff8c1238fb0184af35d1731573b01bc4c55ecacd2aafbe2003d36310487d1ecc9ac994f3fada7f9f7f5c3a64248ab7782906c82c6ff1303b69a84d9a9529c31ecafbcdb9ba87e05439897d87e8a2a3dec55e14df19bba7f7bd316291c002ae2efd24f83f9e3441203fc081c0c23dc3092a454ca8a082b27f631abf73aca341686982e8fbda7e0e7d863941d68f3de4a755c2964407f4b5e0477b3196b8c93d551dd23c8beef7d0f03fbb1b6066f78907faf4bf1677d8fcec72651124080e0b7feae6b476e72ab207d38d90b958759fdedfc3c6c35717c9dbfc979b3cfbbff0a76d24a5e57056bb88acbd2a901ef64bc6e4db02adc05b6250ff378de81dca18c1910ab257dff1b9771b85bb9bbe0a69f5989e6d1710a35e6dfcceb7d8fb5ccea8db3932b3d9ff3fe0d327597c68b3622aec8e3716c83a6c93f497543b459b58ba504ed6bcaa747d37d2ca746fe49ae0a6ce4a8b694234e941b5159ff8bd34b9023da2814076163b86f40eed7c9472f81b551452d5ab87004a373c0172ec87ea6ce42ccfa7dbdad66b745496c4873d8019e8c28d6b3" const signatureEncryptedMessage2Hex = "c24604001102000605024dfd0166000a091033af447ccd759b09bae600a096ec5e63ecf0a403085e10f75cc3bab327663282009f51fad9df457ed8d2b70d8a73c76e0443eac0f377" const symmetricallyEncryptedCompressedHex = "c32e040903085a357c1a7b5614ed00cc0d1d92f428162058b3f558a0fb0980d221ebac6c97d5eda4e0fe32f6e706e94dd263012d6ca1ef8c4bbd324098225e603a10c85ebf09cbf7b5aeeb5ce46381a52edc51038b76a8454483be74e6dcd1e50d5689a8ae7eceaeefed98a0023d49b22eb1f65c2aa1ef1783bb5e1995713b0457102ec3c3075fe871267ffa4b686ad5d52000d857" const dsaTestKeyHex = "9901a2044d6c49de110400cb5ce438cf9250907ac2ba5bf6547931270b89f7c4b53d9d09f4d0213a5ef2ec1f26806d3d259960f872a4a102ef1581ea3f6d6882d15134f21ef6a84de933cc34c47cc9106efe3bd84c6aec12e78523661e29bc1a61f0aab17fa58a627fd5fd33f5149153fbe8cd70edf3d963bc287ef875270ff14b5bfdd1bca4483793923b00a0fe46d76cb6e4cbdc568435cd5480af3266d610d303fe33ae8273f30a96d4d34f42fa28ce1112d425b2e3bf7ea553d526e2db6b9255e9dc7419045ce817214d1a0056dbc8d5289956a4b1b69f20f1105124096e6a438f41f2e2495923b0f34b70642607d45559595c7fe94d7fa85fc41bf7d68c1fd509ebeaa5f315f6059a446b9369c277597e4f474a9591535354c7e7f4fd98a08aa60400b130c24ff20bdfbf683313f5daebf1c9b34b3bdadfc77f2ddd72ee1fb17e56c473664bc21d66467655dd74b9005e3a2bacce446f1920cd7017231ae447b67036c9b431b8179deacd5120262d894c26bc015bffe3d827ba7087ad9b700d2ca1f6d16cc1786581e5dd065f293c31209300f9b0afcc3f7c08dd26d0a22d87580b4db41054657374204b65792033202844534129886204131102002205024d6c49de021b03060b090807030206150802090a0b0416020301021e01021780000a0910338934250ccc03607e0400a0bdb9193e8a6b96fc2dfc108ae848914b504481f100a09c4dc148cb693293a67af24dd40d2b13a9e36794" const dsaTestKeyPrivateHex = "9501bb044d6c49de110400cb5ce438cf9250907ac2ba5bf6547931270b89f7c4b53d9d09f4d0213a5ef2ec1f26806d3d259960f872a4a102ef1581ea3f6d6882d15134f21ef6a84de933cc34c47cc9106efe3bd84c6aec12e78523661e29bc1a61f0aab17fa58a627fd5fd33f5149153fbe8cd70edf3d963bc287ef875270ff14b5bfdd1bca4483793923b00a0fe46d76cb6e4cbdc568435cd5480af3266d610d303fe33ae8273f30a96d4d34f42fa28ce1112d425b2e3bf7ea553d526e2db6b9255e9dc7419045ce817214d1a0056dbc8d5289956a4b1b69f20f1105124096e6a438f41f2e2495923b0f34b70642607d45559595c7fe94d7fa85fc41bf7d68c1fd509ebeaa5f315f6059a446b9369c277597e4f474a9591535354c7e7f4fd98a08aa60400b130c24ff20bdfbf683313f5daebf1c9b34b3bdadfc77f2ddd72ee1fb17e56c473664bc21d66467655dd74b9005e3a2bacce446f1920cd7017231ae447b67036c9b431b8179deacd5120262d894c26bc015bffe3d827ba7087ad9b700d2ca1f6d16cc1786581e5dd065f293c31209300f9b0afcc3f7c08dd26d0a22d87580b4d00009f592e0619d823953577d4503061706843317e4fee083db41054657374204b65792033202844534129886204131102002205024d6c49de021b03060b090807030206150802090a0b0416020301021e01021780000a0910338934250ccc03607e0400a0bdb9193e8a6b96fc2dfc108ae848914b504481f100a09c4dc148cb693293a67af24dd40d2b13a9e36794" const p256TestKeyHex = "98520456e5b83813082a8648ce3d030107020304a2072cd6d21321266c758cc5b83fab0510f751cb8d91897cddb7047d8d6f185546e2107111b0a95cb8ef063c33245502af7a65f004d5919d93ee74eb71a66253b424502d3235362054657374204b6579203c696e76616c6964406578616d706c652e636f6d3e8879041313080021050256e5b838021b03050b09080702061508090a0b020416020301021e01021780000a0910d44a2c495918513e54e50100dfa64f97d9b47766fc1943c6314ba3f2b2a103d71ad286dc5b1efb96a345b0c80100dbc8150b54241f559da6ef4baacea6d31902b4f4b1bdc09b34bf0502334b7754b8560456e5b83812082a8648ce3d030107020304bfe3cea9cee13486f8d518aa487fecab451f25467d2bf08e58f63e5fa525d5482133e6a79299c274b068ef0be448152ad65cf11cf764348588ca4f6a0bcf22b6030108078861041813080009050256e5b838021b0c000a0910d44a2c495918513e4a4800ff49d589fa64024ad30be363a032e3a0e0e6f5db56ba4c73db850518bf0121b8f20100fd78e065f4c70ea5be9df319ea67e493b936fc78da834a71828043d3154af56e" const p256TestKeyPrivateHex = "94a50456e5b83813082a8648ce3d030107020304a2072cd6d21321266c758cc5b83fab0510f751cb8d91897cddb7047d8d6f185546e2107111b0a95cb8ef063c33245502af7a65f004d5919d93ee74eb71a66253fe070302f0c2bfb0b6c30f87ee1599472b8636477eab23ced13b271886a4b50ed34c9d8436af5af5b8f88921f0efba6ef8c37c459bbb88bc1c6a13bbd25c4ce9b1e97679569ee77645d469bf4b43de637f5561b424502d3235362054657374204b6579203c696e76616c6964406578616d706c652e636f6d3e8879041313080021050256e5b838021b03050b09080702061508090a0b020416020301021e01021780000a0910d44a2c495918513e54e50100dfa64f97d9b47766fc1943c6314ba3f2b2a103d71ad286dc5b1efb96a345b0c80100dbc8150b54241f559da6ef4baacea6d31902b4f4b1bdc09b34bf0502334b77549ca90456e5b83812082a8648ce3d030107020304bfe3cea9cee13486f8d518aa487fecab451f25467d2bf08e58f63e5fa525d5482133e6a79299c274b068ef0be448152ad65cf11cf764348588ca4f6a0bcf22b603010807fe0703027510012471a603cfee2968dce19f732721ddf03e966fd133b4e3c7a685b788705cbc46fb026dc94724b830c9edbaecd2fb2c662f23169516cacd1fe423f0475c364ecc10abcabcfd4bbbda1a36a1bd8861041813080009050256e5b838021b0c000a0910d44a2c495918513e4a4800ff49d589fa64024ad30be363a032e3a0e0e6f5db56ba4c73db850518bf0121b8f20100fd78e065f4c70ea5be9df319ea67e493b936fc78da834a71828043d3154af56e" const armoredPrivateKeyBlock = `-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1.4.10 (GNU/Linux) lQHYBE2rFNoBBADFwqWQIW/DSqcB4yCQqnAFTJ27qS5AnB46ccAdw3u4Greeu3Bp idpoHdjULy7zSKlwR1EA873dO/k/e11Ml3dlAFUinWeejWaK2ugFP6JjiieSsrKn vWNicdCS4HTWn0X4sjl0ZiAygw6GNhqEQ3cpLeL0g8E9hnYzJKQ0LWJa0QARAQAB AAP/TB81EIo2VYNmTq0pK1ZXwUpxCrvAAIG3hwKjEzHcbQznsjNvPUihZ+NZQ6+X 0HCfPAdPkGDCLCb6NavcSW+iNnLTrdDnSI6+3BbIONqWWdRDYJhqZCkqmG6zqSfL IdkJgCw94taUg5BWP/AAeQrhzjChvpMQTVKQL5mnuZbUCeMCAN5qrYMP2S9iKdnk VANIFj7656ARKt/nf4CBzxcpHTyB8+d2CtPDKCmlJP6vL8t58Jmih+kHJMvC0dzn gr5f5+sCAOOe5gt9e0am7AvQWhdbHVfJU0TQJx+m2OiCJAqGTB1nvtBLHdJnfdC9 TnXXQ6ZXibqLyBies/xeY2sCKL5qtTMCAKnX9+9d/5yQxRyrQUHt1NYhaXZnJbHx q4ytu0eWz+5i68IYUSK69jJ1NWPM0T6SkqpB3KCAIv68VFm9PxqG1KmhSrQIVGVz dCBLZXmIuAQTAQIAIgUCTasU2gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA CgkQO9o98PRieSoLhgQAkLEZex02Qt7vGhZzMwuN0R22w3VwyYyjBx+fM3JFETy1 ut4xcLJoJfIaF5ZS38UplgakHG0FQ+b49i8dMij0aZmDqGxrew1m4kBfjXw9B/v+ eIqpODryb6cOSwyQFH0lQkXC040pjq9YqDsO5w0WYNXYKDnzRV0p4H1pweo2VDid AdgETasU2gEEAN46UPeWRqKHvA99arOxee38fBt2CI08iiWyI8T3J6ivtFGixSqV bRcPxYO/qLpVe5l84Nb3X71GfVXlc9hyv7CD6tcowL59hg1E/DC5ydI8K8iEpUmK /UnHdIY5h8/kqgGxkY/T/hgp5fRQgW1ZoZxLajVlMRZ8W4tFtT0DeA+JABEBAAEA A/0bE1jaaZKj6ndqcw86jd+QtD1SF+Cf21CWRNeLKnUds4FRRvclzTyUMuWPkUeX TaNNsUOFqBsf6QQ2oHUBBK4VCHffHCW4ZEX2cd6umz7mpHW6XzN4DECEzOVksXtc lUC1j4UB91DC/RNQqwX1IV2QLSwssVotPMPqhOi0ZLNY7wIA3n7DWKInxYZZ4K+6 rQ+POsz6brEoRHwr8x6XlHenq1Oki855pSa1yXIARoTrSJkBtn5oI+f8AzrnN0BN oyeQAwIA/7E++3HDi5aweWrViiul9cd3rcsS0dEnksPhvS0ozCJiHsq/6GFmy7J8 QSHZPteedBnZyNp5jR+H7cIfVN3KgwH/Skq4PsuPhDq5TKK6i8Pc1WW8MA6DXTdU nLkX7RGmMwjC0DBf7KWAlPjFaONAX3a8ndnz//fy1q7u2l9AZwrj1qa1iJ8EGAEC AAkFAk2rFNoCGwwACgkQO9o98PRieSo2/QP/WTzr4ioINVsvN1akKuekmEMI3LAp BfHwatufxxP1U+3Si/6YIk7kuPB9Hs+pRqCXzbvPRrI8NHZBmc8qIGthishdCYad AHcVnXjtxrULkQFGbGvhKURLvS9WnzD/m1K2zzwxzkPTzT9/Yf06O6Mal5AdugPL VrM0m72/jnpKo04= =zNCn -----END PGP PRIVATE KEY BLOCK-----` const e2ePublicKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- Charset: UTF-8 xv8AAABSBAAAAAATCCqGSM49AwEHAgME1LRoXSpOxtHXDUdmuvzchyg6005qIBJ4 sfaSxX7QgH9RV2ONUhC+WiayCNADq+UMzuR/vunSr4aQffXvuGnR383/AAAAFDxk Z2lsQHlhaG9vLWluYy5jb20+wv8AAACGBBATCAA4/wAAAAWCVGvAG/8AAAACiwn/ AAAACZC2VkQCOjdvYf8AAAAFlQgJCgv/AAAAA5YBAv8AAAACngEAAE1BAP0X8veD 24IjmI5/C6ZAfVNXxgZZFhTAACFX75jUA3oD6AEAzoSwKf1aqH6oq62qhCN/pekX +WAsVMBhNwzLpqtCRjLO/wAAAFYEAAAAABIIKoZIzj0DAQcCAwT50ain7vXiIRv8 B1DO3x3cE/aattZ5sHNixJzRCXi2vQIA5QmOxZ6b5jjUekNbdHG3SZi1a2Ak5mfX fRxC/5VGAwEIB8L/AAAAZQQYEwgAGP8AAAAFglRrwBz/AAAACZC2VkQCOjdvYQAA FJAA9isX3xtGyMLYwp2F3nXm7QEdY5bq5VUcD/RJlj792VwA/1wH0pCzVLl4Q9F9 ex7En5r7rHR5xwX82Msc+Rq9dSyO =7MrZ -----END PGP PUBLIC KEY BLOCK-----` const dsaKeyWithSHA512 = `9901a2044f04b07f110400db244efecc7316553ee08d179972aab87bb1214de7692593fcf5b6feb1c80fba268722dd464748539b85b81d574cd2d7ad0ca2444de4d849b8756bad7768c486c83a824f9bba4af773d11742bdfb4ac3b89ef8cc9452d4aad31a37e4b630d33927bff68e879284a1672659b8b298222fc68f370f3e24dccacc4a862442b9438b00a0ea444a24088dc23e26df7daf8f43cba3bffc4fe703fe3d6cd7fdca199d54ed8ae501c30e3ec7871ea9cdd4cf63cfe6fc82281d70a5b8bb493f922cd99fba5f088935596af087c8d818d5ec4d0b9afa7f070b3d7c1dd32a84fca08d8280b4890c8da1dde334de8e3cad8450eed2a4a4fcc2db7b8e5528b869a74a7f0189e11ef097ef1253582348de072bb07a9fa8ab838e993cef0ee203ff49298723e2d1f549b00559f886cd417a41692ce58d0ac1307dc71d85a8af21b0cf6eaa14baf2922d3a70389bedf17cc514ba0febbd107675a372fe84b90162a9e88b14d4b1c6be855b96b33fb198c46f058568817780435b6936167ebb3724b680f32bf27382ada2e37a879b3d9de2abe0c3f399350afd1ad438883f4791e2e3b4184453412068617368207472756e636174696f6e207465737488620413110a002205024f04b07f021b03060b090807030206150802090a0b0416020301021e01021780000a0910ef20e0cefca131581318009e2bf3bf047a44d75a9bacd00161ee04d435522397009a03a60d51bd8a568c6c021c8d7cf1be8d990d6417b0020003` const unknownHashFunctionHex = `8a00000040040001990006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101` const rsaSignatureBadMPIlength = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101` const missingHashFunctionHex = `8a00000040040001030006050253863c24000a09103b4fe6acc0b21f32ffff0101010101010101010101010101010101010101010101010101010101010101010101010101` const campbellQuine = `a0b001000300fcffa0b001000d00f2ff000300fcffa0b001000d00f2ff8270a01c00000500faff8270a01c00000500faff000500faff001400ebff8270a01c00000500faff000500faff001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400001400ebff428821c400000000ffff000000ffff000b00f4ff428821c400000000ffff000000ffff000b00f4ff0233214c40000100feff000233214c40000100feff0000` const keyV4forVerifyingSignedMessageV3 = `-----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mI0EVfxoFQEEAMBIqmbDfYygcvP6Phr1wr1XI41IF7Qixqybs/foBF8qqblD9gIY BKpXjnBOtbkcVOJ0nljd3/sQIfH4E0vQwK5/4YRQSI59eKOqd6Fx+fWQOLG+uu6z tewpeCj9LLHvibx/Sc7VWRnrznia6ftrXxJ/wHMezSab3tnGC0YPVdGNABEBAAG0 JEdvY3J5cHRvIFRlc3QgS2V5IDx0aGVtYXhAZ21haWwuY29tPoi5BBMBCgAjBQJV /GgVAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQeXnQmhdGW9PFVAP+ K7TU0qX5ArvIONIxh/WAweyOk884c5cE8f+3NOPOOCRGyVy0FId5A7MmD5GOQh4H JseOZVEVCqlmngEvtHZb3U1VYtVGE5WZ+6rQhGsMcWP5qaT4soYwMBlSYxgYwQcx YhN9qOr292f9j2Y//TTIJmZT4Oa+lMxhWdqTfX+qMgG4jQRV/GgVAQQArhFSiij1 b+hT3dnapbEU+23Z1yTu1DfF6zsxQ4XQWEV3eR8v+8mEDDNcz8oyyF56k6UQ3rXi UMTIwRDg4V6SbZmaFbZYCOwp/EmXJ3rfhm7z7yzXj2OFN22luuqbyVhuL7LRdB0M pxgmjXb4tTvfgKd26x34S+QqUJ7W6uprY4sAEQEAAYifBBgBCgAJBQJV/GgVAhsM AAoJEHl50JoXRlvT7y8D/02ckx4OMkKBZo7viyrBw0MLG92i+DC2bs35PooHR6zz 786mitjOp5z2QWNLBvxC70S0qVfCIz8jKupO1J6rq6Z8CcbLF3qjm6h1omUBf8Nd EfXKD2/2HV6zMKVknnKzIEzauh+eCKS2CeJUSSSryap/QLVAjRnckaES/OsEWhNB =RZia -----END PGP PUBLIC KEY BLOCK----- ` const signedMessageV3 = `-----BEGIN PGP MESSAGE----- Comment: GPGTools - https://gpgtools.org owGbwMvMwMVYWXlhlrhb9GXG03JJDKF/MtxDMjKLFYAoUaEktbhEITe1uDgxPVWP q5NhKjMrWAVcC9evD8z/bF/uWNjqtk/X3y5/38XGRQHm/57rrDRYuGnTw597Xqka uM3137/hH3Os+Jf2dc0fXOITKwJvXJvecPVs0ta+Vg7ZO1MLn8w58Xx+6L58mbka DGHyU9yTueZE8D+QF/Tz28Y78dqtF56R1VPn9Xw4uJqrWYdd7b3vIZ1V6R4Nh05d iT57d/OhWwA= =hG7R -----END PGP MESSAGE----- ` // https://mailarchive.ietf.org/arch/msg/openpgp/9SheW_LENE0Kxf7haNllovPyAdY/ const v5PrivKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- lGEFXJH05BYAAAAtCSsGAQQB2kcPAQEHQFhZlVcVVtwf+21xNQPX+ecMJJBL0MPd fj75iux+my8QAAAAAAAiAQCHZ1SnSUmWqxEsoI6facIVZQu6mph3cBFzzTvcm5lA Ng5ctBhlbW1hLmdvbGRtYW5AZXhhbXBsZS5uZXSIlgUTFggASCIhBRk0e8mHJGQC X5nfPsLgAA7ZiEiS4fez6kyUAJFZVptUBQJckfTkAhsDBQsJCAcCAyICAQYVCgkI CwIEFgIDAQIeBwIXgAAA9cAA/jiR3yMsZMeEQ40u6uzEoXa6UXeV/S3wwJAXRJy9 M8s0AP9vuL/7AyTfFXwwzSjDnYmzS0qAhbLDQ643N+MXGBJ2BZxmBVyR9OQSAAAA MgorBgEEAZdVAQUBAQdA+nysrzml2UCweAqtpDuncSPlvrcBWKU0yfU0YvYWWAoD AQgHAAAAAAAiAP9OdAPppjU1WwpqjIItkxr+VPQRT8Zm/Riw7U3F6v3OiBFHiHoF GBYIACwiIQUZNHvJhyRkAl+Z3z7C4AAO2YhIkuH3s+pMlACRWVabVAUCXJH05AIb DAAAOSQBAP4BOOIR/sGLNMOfeb5fPs/02QMieoiSjIBnijhob2U5AQC+RtOHCHx7 TcIYl5/Uyoi+FOvPLcNw4hOv2nwUzSSVAw== =IiS2 -----END PGP PRIVATE KEY BLOCK-----` // See OpenPGP crypto refresh Section A.3. const v6PrivKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- xUsGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laMAGXKB exK+cH6NX1hs5hNhIB00TrJmosgv3mg1ditlsLfCsQYfGwoAAABCBYJjh3/jAwsJ BwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lwgyU2kCcUmKfvBXbAf6rh RYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaEQsiPlR4zxP/TP7mhfVEe 7XWPxtnMUMtf15OyA51YBMdLBmOHf+MZAAAAIIaTJINn+eUBXbki+PSAld2nhJh/ LVmFsS+60WyvXkQ1AE1gCk95TUR3XFeibg/u/tVY6a//1q0NWC1X+yui3O24wpsG GBsKAAAALAWCY4d/4wKbDCIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJAAAAAAQBIKbpGG2dWTX8j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDE M0g12vYxoWM8Y81W+bHBw805I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUr k0mXubZvyl4GBg== -----END PGP PRIVATE KEY BLOCK-----` // See OpenPGP crypto refresh merge request: // https://gitlab.com/openpgp-wg/rfc4880bis/-/merge_requests/304 const v6PrivKeyMsg = `-----BEGIN PGP MESSAGE----- wV0GIQYSyD8ecG9jCP4VGkF3Q6HwM3kOk+mXhIjR2zeNqZMIhRmHzxjV8bU/gXzO WgBM85PMiVi93AZfJfhK9QmxfdNnZBjeo1VDeVZheQHgaVf7yopqR6W1FT6NOrfS aQIHAgZhZBZTW+CwcW1g4FKlbExAf56zaw76/prQoN+bAzxpohup69LA7JW/Vp0l yZnuSj3hcFj0DfqLTGgr4/u717J+sPWbtQBfgMfG9AOIwwrUBqsFE9zW+f1zdlYo bhF30A+IitsxxA== -----END PGP MESSAGE-----` // See OpenPGP crypto refresh merge request: // https://gitlab.com/openpgp-wg/rfc4880bis/-/merge_requests/305 const v6PrivKeyInlineSignMsg = `-----BEGIN PGP MESSAGE----- wV0GIQYSyD8ecG9jCP4VGkF3Q6HwM3kOk+mXhIjR2zeNqZMIhRmHzxjV8bU/gXzO WgBM85PMiVi93AZfJfhK9QmxfdNnZBjeo1VDeVZheQHgaVf7yopqR6W1FT6NOrfS aQIHAgZhZBZTW+CwcW1g4FKlbExAf56zaw76/prQoN+bAzxpohup69LA7JW/Vp0l yZnuSj3hcFj0DfqLTGgr4/u717J+sPWbtQBfgMfG9AOIwwrUBqsFE9zW+f1zdlYo bhF30A+IitsxxA== -----END PGP MESSAGE-----` // See https://gitlab.com/openpgp-wg/rfc4880bis/-/merge_requests/274 // decryption password: "correct horse battery staple" const v6ArgonSealedPrivKey = `-----BEGIN PGP PRIVATE KEY BLOCK----- xYIGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laP9JgkC FARdb9ccngltHraRe25uHuyuAQQVtKipJ0+r5jL4dacGWSAheCWPpITYiyfyIOPS 3gIDyg8f7strd1OB4+LZsUhcIjOMpVHgmiY/IutJkulneoBYwrEGHxsKAAAAQgWC Y4d/4wMLCQcFFQoOCAwCFgACmwMCHgkiIQbLGGxPBgmml+TVLfpscisMHx4nwYpW cI9lJewnutmsyQUnCQIHAgAAAACtKCAQPi19In7A5tfORHHbNr/JcIMlNpAnFJin 7wV2wH+q4UWFs7kDsBJ+xP2i8CMEWi7Ha8tPlXGpZR4UruETeh1mhELIj5UeM8T/ 0z+5oX1RHu11j8bZzFDLX9eTsgOdWATHggZjh3/jGQAAACCGkySDZ/nlAV25Ivj0 gJXdp4SYfy1ZhbEvutFsr15ENf0mCQIUBA5hhGgp2oaavg6mFUXcFMwBBBUuE8qf 9Ock+xwusd+GAglBr5LVyr/lup3xxQvHXFSjjA2haXfoN6xUGRdDEHI6+uevKjVR v5oAxgu7eJpaXNjCmwYYGwoAAAAsBYJjh3/jApsMIiEGyxhsTwYJppfk1S36bHIr DB8eJ8GKVnCPZSXsJ7rZrMkAAAAABAEgpukYbZ1ZNfyP5WMUzbUnSGpaUSD5t2Ki Nacp8DkBClZRa2c3AMQzSDXa9jGhYzxjzVb5scHDzTkjyRZWRdTq8U6L4da+/+Kt ruh8m7Xo2ehSSFyWRSuTSZe5tm/KXgYG -----END PGP PRIVATE KEY BLOCK-----` const v4Key25519 = `-----BEGIN PGP PRIVATE KEY BLOCK----- xUkEZB3qzRto01j2k2pwN5ux9w70stPinAdXULLr20CRW7U7h2GSeACch0M+ qzQg8yjFQ8VBvu3uwgKH9senoHmj72lLSCLTmhFKzQR0ZXN0wogEEBsIAD4F gmQd6s0ECwkHCAmQIf45+TuC+xMDFQgKBBYAAgECGQECmwMCHgEWIQSWEzMi jJUHvyIbVKIh/jn5O4L7EwAAUhaHNlgudvxARdPPETUzVgjuWi+YIz8w1xIb lHQMvIrbe2sGCQIethpWofd0x7DHuv/ciHg+EoxJ/Td6h4pWtIoKx0kEZB3q zRm4CyA7quliq7yx08AoOqHTuuCgvpkSdEhpp3pEyejQOgBo0p6ywIiLPllY 0t+jpNspHpAGfXID6oqjpYuJw3AfVRBlwnQEGBsIACoFgmQd6s0JkCH+Ofk7 gvsTApsMFiEElhMzIoyVB78iG1SiIf45+TuC+xMAAGgQuN9G73446ykvJ/mL sCZ7zGFId2gBd1EnG0FTC4npfOKpck0X8dngByrCxU8LDSfvjsEp/xDAiKsQ aU71tdtNBQ== =e7jT -----END PGP PRIVATE KEY BLOCK-----` const keyWithExpiredCrossSig = `-----BEGIN PGP PUBLIC KEY BLOCK----- xsDNBF2lnPIBDAC5cL9PQoQLTMuhjbYvb4Ncuuo0bfmgPRFywX53jPhoFf4Zg6mv /seOXpgecTdOcVttfzC8ycIKrt3aQTiwOG/ctaR4Bk/t6ayNFfdUNxHWk4WCKzdz /56fW2O0F23qIRd8UUJp5IIlN4RDdRCtdhVQIAuzvp2oVy/LaS2kxQoKvph/5pQ/ 5whqsyroEWDJoSV0yOb25B/iwk/pLUFoyhDG9bj0kIzDxrEqW+7Ba8nocQlecMF3 X5KMN5kp2zraLv9dlBBpWW43XktjcCZgMy20SouraVma8Je/ECwUWYUiAZxLIlMv 9CurEOtxUw6N3RdOtLmYZS9uEnn5y1UkF88o8Nku890uk6BrewFzJyLAx5wRZ4F0 qV/yq36UWQ0JB/AUGhHVPdFf6pl6eaxBwT5GXvbBUibtf8YI2og5RsgTWtXfU7eb SGXrl5ZMpbA6mbfhd0R8aPxWfmDWiIOhBufhMCvUHh1sApMKVZnvIff9/0Dca3wb vLIwa3T4CyshfT0AEQEAAc0hQm9iIEJhYmJhZ2UgPGJvYkBvcGVucGdwLmV4YW1w bGU+wsEABBMBCgATBYJeO2eVAgsJAxUICgKbAQIeAQAhCRD7/MgqAV5zMBYhBNGm bhojsYLJmA94jPv8yCoBXnMwKWUMAJ3FKZfJ2mXvh+GFqgymvK4NoKkDRPB0CbUN aDdG7ZOizQrWXo7Da2MYIZ6eZUDqBKLdhZ5gZfVnisDfu/yeCgpENaKib1MPHpA8 nZQjnPejbBDomNqY8HRzr5jvXNlwywBpjWGtegCKUY9xbSynjbfzIlMrWL4S+Rfl +bOOQKRyYJWXmECmVyqY8cz2VUYmETjNcwC8VCDUxQnhtcCJ7Aej22hfYwVEPb/J BsJBPq8WECCiGfJ9Y2y6TF+62KzG9Kfs5hqUeHhQy8V4TSi479ewwL7DH86XmIIK chSANBS+7iyMtctjNZfmF9zYdGJFvjI/mbBR/lK66E515Inuf75XnL8hqlXuwqvG ni+i03Aet1DzULZEIio4uIU6ioc1lGO9h7K2Xn4S7QQH1QoISNMWqXibUR0RCGjw FsEDTt2QwJl8XXxoJCooM7BCcCQo+rMNVUHDjIwrdoQjPld3YZsUQQRcqH6bLuln cfn5ufl8zTGWKydoj/iTz8KcjZ7w187AzQRdpZzyAQwA1jC/XGxjK6ddgrRfW9j+ s/U00++EvIsgTs2kr3Rg0GP7FLWV0YNtR1mpl55/bEl7yAxCDTkOgPUMXcaKlnQh 6zrlt6H53mF6Bvs3inOHQvOsGtU0dqvb1vkTF0juLiJgPlM7pWv+pNQ6IA39vKoQ sTMBv4v5vYNXP9GgKbg8inUNT17BxzZYHfw5+q63ectgDm2on1e8CIRCZ76oBVwz dkVxoy3gjh1eENlk2D4P0uJNZzF1Q8GV67yLANGMCDICE/OkWn6daipYDzW4iJQt YPUWP4hWhjdm+CK+hg6IQUEn2Vtvi16D2blRP8BpUNNa4fNuylWVuJV76rIHvsLZ 1pbM3LHpRgE8s6jivS3Rz3WRs0TmWCNnvHPqWizQ3VTy+r3UQVJ5AmhJDrZdZq9i aUIuZ01PoE1+CHiJwuxPtWvVAxf2POcm1M/F1fK1J0e+lKlQuyonTXqXR22Y41wr fP2aPk3nPSTW2DUAf3vRMZg57ZpRxLEhEMxcM4/LMR+PABEBAAHCwrIEGAEKAAkF gl8sAVYCmwIB3QkQ+/zIKgFeczDA+qAEGQEKAAwFgl47Z5UFgwB4TOAAIQkQfC+q Tfk8N7IWIQQd3OFfCSF87i87N2B8L6pN+Tw3st58C/0exp0X2U4LqicSHEOSqHZj jiysdqIELHGyo5DSPv92UFPp36aqjF9OFgtNNwSa56fmAVCD4+hor/fKARRIeIjF qdIC5Y/9a4B10NQFJa5lsvB38x/d39LI2kEoglZnqWgdJskROo3vNQF4KlIcm6FH dn4WI8UkC5oUUcrpZVMSKoacIaxLwqnXT42nIVgYYuqrd/ZagZZjG5WlrTOd5+NI zi/l0fWProcPHGLjmAh4Thu8i7omtVw1nQaMnq9I77ffg3cPDgXknYrLL+q8xXh/ 0mEJyIhnmPwllWCSZuLv9DrD5pOexFfdlwXhf6cLzNpW6QhXD/Tf5KrqIPr9aOv8 9xaEEXWh0vEby2kIsI2++ft+vfdIyxYw/wKqx0awTSnuBV1rG3z1dswX4BfoY66x Bz3KOVqlz9+mG/FTRQwrgPvR+qgLCHbuotxoGN7fzW+PI75hQG5JQAqhsC9sHjQH UrI21/VUNwzfw3v5pYsWuFb5bdQ3ASJetICQiMy7IW8WIQTRpm4aI7GCyZgPeIz7 /MgqAV5zMG6/C/wLpPl/9e6Hf5wmXIUwpZNQbNZvpiCcyx9sXsHXaycOQVxn3McZ nYOUP9/mobl1tIeDQyTNbkxWjU0zzJl8XQsDZerb5098pg+x7oGIL7M1vn5s5JMl owROourqF88JEtOBxLMxlAM7X4hB48xKQ3Hu9hS1GdnqLKki4MqRGl4l5FUwyGOM GjyS3TzkfiDJNwQxybQiC9n57ij20ieNyLfuWCMLcNNnZUgZtnF6wCctoq/0ZIWu a7nvuA/XC2WW9YjEJJiWdy5109pqac+qWiY11HWy/nms4gpMdxVpT0RhrKGWq4o0 M5q3ZElOoeN70UO3OSbU5EVrG7gB1GuwF9mTHUVlV0veSTw0axkta3FGT//XfSpD lRrCkyLzwq0M+UUHQAuYpAfobDlDdnxxOD2jm5GyTzak3GSVFfjW09QFVO6HlGp5 01/jtzkUiS6nwoHHkfnyn0beZuR8X6KlcrzLB0VFgQFLmkSM9cSOgYhD0PTu9aHb hW1Hj9AO8lzggBQ= =Nt+N -----END PGP PUBLIC KEY BLOCK----- ` const sigFromKeyWithExpiredCrossSig = `-----BEGIN PGP SIGNATURE----- wsDzBAABCgAGBYJfLAFsACEJEHwvqk35PDeyFiEEHdzhXwkhfO4vOzdgfC+qTfk8 N7KiqwwAts4QGB7v9bABCC2qkTxJhmStC0wQMcHRcjL/qAiVnmasQWmvE9KVsdm3 AaXd8mIx4a37/RRvr9dYrY2eE4uw72cMqPxNja2tvVXkHQvk1oEUqfkvbXs4ypKI NyeTWjXNOTZEbg0hbm3nMy+Wv7zgB1CEvAsEboLDJlhGqPcD+X8a6CJGrBGUBUrv KVmZr3U6vEzClz3DBLpoddCQseJRhT4YM1nKmBlZ5quh2LFgTSpajv5OsZheqt9y EZAPbqmLhDmWRQwGzkWHKceKS7nZ/ox2WK6OS7Ob8ZGZkM64iPo6/EGj5Yc19vQN AGiIaPEGszBBWlOpHTPhNm0LB0nMWqqaT87oNYwP8CQuuxDb6rKJ2lffCmZH27Lb UbQZcH8J+0UhpeaiadPZxH5ATJAcenmVtVVMLVOFnm+eIlxzov9ntpgGYt8hLdXB ITEG9mMgp3TGS9ZzSifMZ8UGtHdp9QdBg8NEVPFzDOMGxpc/Bftav7RRRuPiAER+ 7A5CBid5 =aQkm -----END PGP SIGNATURE----- ` const signedMessageWithCriticalNotation = `-----BEGIN PGP MESSAGE----- owGbwMvMwMH4oOW7S46CznTG09xJDDE3Wl1KUotLuDousDAwcjBYiSmyXL+48d6x U1PSGUxcj8IUszKBVMpMaWAAAgEGZpAeh9SKxNyCnFS95PzcytRiBi5OAZjyXXzM f8WYLqv7TXP61Sa4rqT12CI3xaN73YS2pt089f96odCKaEPnWJ3iSGmzJaW/ug10 2Zo8Wj2k4s7t8wt4H3HtTu+y5UZfV3VOO+l//sdE/o+Lsub8FZH7/eOq7OnbNp4n vwjE8mqJXetNMfj8r2SCyvkEnlVRYR+/mnge+ib56FdJ8uKtqSxyvgA= =fRXs -----END PGP MESSAGE-----` const criticalNotationSigner = `-----BEGIN PGP PUBLIC KEY BLOCK----- mI0EUmEvTgEEANyWtQQMOybQ9JltDqmaX0WnNPJeLILIM36sw6zL0nfTQ5zXSS3+ fIF6P29lJFxpblWk02PSID5zX/DYU9/zjM2xPO8Oa4xo0cVTOTLj++Ri5mtr//f5 GLsIXxFrBJhD/ghFsL3Op0GXOeLJ9A5bsOn8th7x6JucNKuaRB6bQbSPABEBAAG0 JFRlc3QgTWNUZXN0aW5ndG9uIDx0ZXN0QGV4YW1wbGUuY29tPoi5BBMBAgAjBQJS YS9OAhsvBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQSmNhOk1uQJQwDAP6 AgrTyqkRlJVqz2pb46TfbDM2TDF7o9CBnBzIGoxBhlRwpqALz7z2kxBDmwpQa+ki Bq3jZN/UosY9y8bhwMAlnrDY9jP1gdCo+H0sD48CdXybblNwaYpwqC8VSpDdTndf 9j2wE/weihGp/DAdy/2kyBCaiOY1sjhUfJ1GogF49rC4jQRSYS9OAQQA6R/PtBFa JaT4jq10yqASk4sqwVMsc6HcifM5lSdxzExFP74naUMMyEsKHP53QxTF0Grqusag Qg/ZtgT0CN1HUM152y7ACOdp1giKjpMzOTQClqCoclyvWOFB+L/SwGEIJf7LSCEr woBuJifJc8xAVr0XX0JthoW+uP91eTQ3XpsAEQEAAYkBPQQYAQIACQUCUmEvTgIb LgCoCRBKY2E6TW5AlJ0gBBkBAgAGBQJSYS9OAAoJEOCE90RsICyXuqIEANmmiRCA SF7YK7PvFkieJNwzeK0V3F2lGX+uu6Y3Q/Zxdtwc4xR+me/CSBmsURyXTO29OWhP GLszPH9zSJU9BdDi6v0yNprmFPX/1Ng0Abn/sCkwetvjxC1YIvTLFwtUL/7v6NS2 bZpsUxRTg9+cSrMWWSNjiY9qUKajm1tuzPDZXAUEAMNmAN3xXN/Kjyvj2OK2ck0X W748sl/tc3qiKPMJ+0AkMF7Pjhmh9nxqE9+QCEl7qinFqqBLjuzgUhBU4QlwX1GD AtNTq6ihLMD5v1d82ZC7tNatdlDMGWnIdvEMCv2GZcuIqDQ9rXWs49e7tq1NncLY hz3tYjKhoFTKEIq3y3Pp =h/aX -----END PGP PUBLIC KEY BLOCK-----` const keyv5Test = `-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: Bob's OpenPGP Transferable Secret Key lQVYBF2lnPIBDAC5cL9PQoQLTMuhjbYvb4Ncuuo0bfmgPRFywX53jPhoFf4Zg6mv /seOXpgecTdOcVttfzC8ycIKrt3aQTiwOG/ctaR4Bk/t6ayNFfdUNxHWk4WCKzdz /56fW2O0F23qIRd8UUJp5IIlN4RDdRCtdhVQIAuzvp2oVy/LaS2kxQoKvph/5pQ/ 5whqsyroEWDJoSV0yOb25B/iwk/pLUFoyhDG9bj0kIzDxrEqW+7Ba8nocQlecMF3 X5KMN5kp2zraLv9dlBBpWW43XktjcCZgMy20SouraVma8Je/ECwUWYUiAZxLIlMv 9CurEOtxUw6N3RdOtLmYZS9uEnn5y1UkF88o8Nku890uk6BrewFzJyLAx5wRZ4F0 qV/yq36UWQ0JB/AUGhHVPdFf6pl6eaxBwT5GXvbBUibtf8YI2og5RsgTWtXfU7eb SGXrl5ZMpbA6mbfhd0R8aPxWfmDWiIOhBufhMCvUHh1sApMKVZnvIff9/0Dca3wb vLIwa3T4CyshfT0AEQEAAQAL/RZqbJW2IqQDCnJi4Ozm++gPqBPiX1RhTWSjwxfM cJKUZfzLj414rMKm6Jh1cwwGY9jekROhB9WmwaaKT8HtcIgrZNAlYzANGRCM4TLK 3VskxfSwKKna8l+s+mZglqbAjUg3wmFuf9Tj2xcUZYmyRm1DEmcN2ZzpvRtHgX7z Wn1mAKUlSDJZSQks0zjuMNbupcpyJokdlkUg2+wBznBOTKzgMxVNC9b2g5/tMPUs hGGWmF1UH+7AHMTaS6dlmr2ZBIyogdnfUqdNg5sZwsxSNrbglKP4sqe7X61uEAIQ bD7rT3LonLbhkrj3I8wilUD8usIwt5IecoHhd9HziqZjRCc1BUBkboUEoyedbDV4 i4qfsFZ6CEWoLuD5pW7dEp0M+WeuHXO164Rc+LnH6i1VQrpb1Okl4qO6ejIpIjBI 1t3GshtUu/mwGBBxs60KBX5g77mFQ9lLCRj8lSYqOsHRKBhUp4qM869VA+fD0BRP fqPT0I9IH4Oa/A3jYJcg622GwQYA1LhnP208Waf6PkQSJ6kyr8ymY1yVh9VBE/g6 fRDYA+pkqKnw9wfH2Qho3ysAA+OmVOX8Hldg+Pc0Zs0e5pCavb0En8iFLvTA0Q2E LR5rLue9uD7aFuKFU/VdcddY9Ww/vo4k5p/tVGp7F8RYCFn9rSjIWbfvvZi1q5Tx +akoZbga+4qQ4WYzB/obdX6SCmi6BndcQ1QdjCCQU6gpYx0MddVERbIp9+2SXDyL hpxjSyz+RGsZi/9UAshT4txP4+MZBgDfK3ZqtW+h2/eMRxkANqOJpxSjMyLO/FXN WxzTDYeWtHNYiAlOwlQZEPOydZFty9IVzzNFQCIUCGjQ/nNyhw7adSgUk3+BXEx/ MyJPYY0BYuhLxLYcrfQ9nrhaVKxRJj25SVHj2ASsiwGJRZW4CC3uw40OYxfKEvNC mer/VxM3kg8qqGf9KUzJ1dVdAvjyx2Hz6jY2qWCyRQ6IMjWHyd43C4r3jxooYKUC YnstRQyb/gCSKahveSEjo07CiXMr88UGALwzEr3npFAsPW3osGaFLj49y1oRe11E he9gCHFm+fuzbXrWmdPjYU5/ZdqdojzDqfu4ThfnipknpVUM1o6MQqkjM896FHm8 zbKVFSMhEP6DPHSCexMFrrSgN03PdwHTO6iBaIBBFqmGY01tmJ03SxvSpiBPON9P NVvy/6UZFedTq8A07OUAxO62YUSNtT5pmK2vzs3SAZJmbFbMh+NN204TRI72GlqT t5hcfkuv8hrmwPS/ZR6q312mKQ6w/1pqO9qitCFCb2IgQmFiYmFnZSA8Ym9iQG9w ZW5wZ3AuZXhhbXBsZT6JAc4EEwEKADgCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC F4AWIQTRpm4aI7GCyZgPeIz7/MgqAV5zMAUCXaWe+gAKCRD7/MgqAV5zMG9sC/9U 2T3RrqEbw533FPNfEflhEVRIZ8gDXKM8hU6cqqEzCmzZT6xYTe6sv4y+PJBGXJFX yhj0g6FDkSyboM5litOcTupURObVqMgA/Y4UKERznm4fzzH9qek85c4ljtLyNufe doL2pp3vkGtn7eD0QFRaLLmnxPKQ/TlZKdLE1G3u8Uot8QHicaR6GnAdc5UXQJE3 BiV7jZuDyWmZ1cUNwJkKL6oRtp+ZNDOQCrLNLecKHcgCqrpjSQG5oouba1I1Q6Vl sP44dhA1nkmLHtxlTOzpeHj4jnk1FaXmyasurrrI5CgU/L2Oi39DGKTH/A/cywDN 4ZplIQ9zR8enkbXquUZvFDe+Xz+6xRXtb5MwQyWODB3nHw85HocLwRoIN9WdQEI+ L8a/56AuOwhs8llkSuiITjR7r9SgKJC2WlAHl7E8lhJ3VDW3ELC56KH308d6mwOG ZRAqIAKzM1T5FGjMBhq7ZV0eqdEntBh3EcOIfj2M8rg1MzJv+0mHZOIjByawikad BVgEXaWc8gEMANYwv1xsYyunXYK0X1vY/rP1NNPvhLyLIE7NpK90YNBj+xS1ldGD bUdZqZeef2xJe8gMQg05DoD1DF3GipZ0Ies65beh+d5hegb7N4pzh0LzrBrVNHar 29b5ExdI7i4iYD5TO6Vr/qTUOiAN/byqELEzAb+L+b2DVz/RoCm4PIp1DU9ewcc2 WB38Ofqut3nLYA5tqJ9XvAiEQme+qAVcM3ZFcaMt4I4dXhDZZNg+D9LiTWcxdUPB leu8iwDRjAgyAhPzpFp+nWoqWA81uIiULWD1Fj+IVoY3ZvgivoYOiEFBJ9lbb4te g9m5UT/AaVDTWuHzbspVlbiVe+qyB77C2daWzNyx6UYBPLOo4r0t0c91kbNE5lgj Z7xz6los0N1U8vq91EFSeQJoSQ62XWavYmlCLmdNT6BNfgh4icLsT7Vr1QMX9jzn JtTPxdXytSdHvpSpULsqJ016l0dtmONcK3z9mj5N5z0k1tg1AH970TGYOe2aUcSx IRDMXDOPyzEfjwARAQABAAv9F2CwsjS+Sjh1M1vegJbZjei4gF1HHpEM0K0PSXsp SfVvpR4AoSJ4He6CXSMWg0ot8XKtDuZoV9jnJaES5UL9pMAD7JwIOqZm/DYVJM5h OASCh1c356/wSbFbzRHPtUdZO9Q30WFNJM5pHbCJPjtNoRmRGkf71RxtvHBzy7np Ga+W6U/NVKHw0i0CYwMI0YlKDakYW3Pm+QL+gHZFvngGweTod0f9l2VLLAmeQR/c +EZs7lNumhuZ8mXcwhUc9JQIhOkpO+wreDysEFkAcsKbkQP3UDUsA1gFx9pbMzT0 tr1oZq2a4QBtxShHzP/ph7KLpN+6qtjks3xB/yjTgaGmtrwM8tSe0wD1RwXS+/1o BHpXTnQ7TfeOGUAu4KCoOQLv6ELpKWbRBLWuiPwMdbGpvVFALO8+kvKAg9/r+/ny zM2GQHY+J3Jh5JxPiJnHfXNZjIKLbFbIPdSKNyJBuazXW8xIa//mEHMI5OcvsZBK clAIp7LXzjEjKXIwHwDcTn9pBgDpdOKTHOtJ3JUKx0rWVsDH6wq6iKV/FTVSY5jl zN+puOEsskF1Lfxn9JsJihAVO3yNsp6RvkKtyNlFazaCVKtDAmkjoh60XNxcNRqr gCnwdpbgdHP6v/hvZY54ZaJjz6L2e8unNEkYLxDt8cmAyGPgH2XgL7giHIp9jrsQ aS381gnYwNX6wE1aEikgtY91nqJjwPlibF9avSyYQoMtEqM/1UjTjB2KdD/MitK5 fP0VpvuXpNYZedmyq4UOMwdkiNMGAOrfmOeT0olgLrTMT5H97Cn3Yxbk13uXHNu/ ZUZZNe8s+QtuLfUlKAJtLEUutN33TlWQY522FV0m17S+b80xJib3yZVJteVurrh5 HSWHAM+zghQAvCesg5CLXa2dNMkTCmZKgCBvfDLZuZbjFwnwCI6u/NhOY9egKuUf SA/je/RXaT8m5VxLYMxwqQXKApzD87fv0tLPlVIEvjEsaf992tFEFSNPcG1l/jpd 5AVXw6kKuf85UkJtYR1x2MkQDrqY1QX/XMw00kt8y9kMZUre19aCArcmor+hDhRJ E3Gt4QJrD9z/bICESw4b4z2DbgD/Xz9IXsA/r9cKiM1h5QMtXvuhyfVeM01enhxM GbOH3gjqqGNKysx0UODGEwr6AV9hAd8RWXMchJLaExK9J5SRawSg671ObAU24SdY vMQ9Z4kAQ2+1ReUZzf3ogSMRZtMT+d18gT6L90/y+APZIaoArLPhebIAGq39HLmJ 26x3z0WAgrpA1kNsjXEXkoiZGPLKIGoe3hqJAbYEGAEKACAWIQTRpm4aI7GCyZgP eIz7/MgqAV5zMAUCXaWc8gIbDAAKCRD7/MgqAV5zMOn/C/9ugt+HZIwX308zI+QX c5vDLReuzmJ3ieE0DMO/uNSC+K1XEioSIZP91HeZJ2kbT9nn9fuReuoff0T0Dief rbwcIQQHFFkrqSp1K3VWmUGp2JrUsXFVdjy/fkBIjTd7c5boWljv/6wAsSfiv2V0 JSM8EFU6TYXxswGjFVfc6X97tJNeIrXL+mpSmPPqy2bztcCCHkWS5lNLWQw+R7Vg 71Fe6yBSNVrqC2/imYG2J9zlowjx1XU63Wdgqp2Wxt0l8OmsB/W80S1fRF5G4SDH s9HXglXXqPsBRZJYfP+VStm9L5P/sKjCcX6WtZR7yS6G8zj/X767MLK/djANvpPd NVniEke6hM3CNBXYPAMhQBMWhCulcoz+0lxi8L34rMN+Dsbma96psdUrn7uLaB91 6we0CTfF8qqm7BsVAgalon/UUiuMY80U3ueoj3okiSTiHIjD/YtpXSPioC8nMng7 xqAY9Bwizt4FWgXuLm1a4+So4V9j1TRCXd12Uc2l2RNmgDE= =miES -----END PGP PRIVATE KEY BLOCK----- ` const certv5Test = `-----BEGIN PGP PRIVATE KEY BLOCK----- lGEFXJH05BYAAAAtCSsGAQQB2kcPAQEHQFhZlVcVVtwf+21xNQPX+ecMJJBL0MPd fj75iux+my8QAAAAAAAiAQCHZ1SnSUmWqxEsoI6facIVZQu6mph3cBFzzTvcm5lA Ng5ctBhlbW1hLmdvbGRtYW5AZXhhbXBsZS5uZXSIlgUTFggASCIhBRk0e8mHJGQC X5nfPsLgAA7ZiEiS4fez6kyUAJFZVptUBQJckfTkAhsDBQsJCAcCAyICAQYVCgkI CwIEFgIDAQIeBwIXgAAA9cAA/jiR3yMsZMeEQ40u6uzEoXa6UXeV/S3wwJAXRJy9 M8s0AP9vuL/7AyTfFXwwzSjDnYmzS0qAhbLDQ643N+MXGBJ2BZxmBVyR9OQSAAAA MgorBgEEAZdVAQUBAQdA+nysrzml2UCweAqtpDuncSPlvrcBWKU0yfU0YvYWWAoD AQgHAAAAAAAiAP9OdAPppjU1WwpqjIItkxr+VPQRT8Zm/Riw7U3F6v3OiBFHiHoF GBYIACwiIQUZNHvJhyRkAl+Z3z7C4AAO2YhIkuH3s+pMlACRWVabVAUCXJH05AIb DAAAOSQBAP4BOOIR/sGLNMOfeb5fPs/02QMieoiSjIBnijhob2U5AQC+RtOHCHx7 TcIYl5/Uyoi+FOvPLcNw4hOv2nwUzSSVAw== =IiS2 -----END PGP PRIVATE KEY BLOCK----- ` const msgv5Test = `-----BEGIN PGP MESSAGE----- wcDMA3wvqk35PDeyAQv+PcQiLsoYTH30nJYQh3j3cJaO2+jErtVCrIQRIU0+ rmgMddERYST4A9mA0DQIiTI4FQ0Lp440D3BWCgpq3LlNWewGzduaWwym5rN6 cwHz5ccDqOcqbd9X0GXXGy/ZH/ljSgzuVMIytMAXKdF/vrRrVgH/+I7cxvm9 HwnhjMN5dF0j4aEt996H2T7cbtzSr2GN9SWGW8Gyu7I8Zx73hgrGUI7gDiJB Afaff+P6hfkkHSGOItr94dde8J/7AUF4VEwwxdVVPvsNEFyvv6gRIbYtOCa2 6RE6h1V/QTxW2O7zZgzWALrE2ui0oaYr9QuqQSssd9CdgExLfdPbI+3/ZAnE v31Idzpk3/6ILiakYHtXkElPXvf46mCNpobty8ysT34irF+fy3C1p3oGwAsx 5VDV9OSFU6z5U+UPbSPYAy9rkc5ZssuIKxCER2oTvZ2L8Q5cfUvEUiJtRGGn CJlHrVDdp3FssKv2tlKgLkvxJLyoOjuEkj44H1qRk+D02FzmmUT/0sAHAYYx lTir6mjHeLpcGjn4waUuWIAJyph8SxUexP60bic0L0NBa6Qp5SxxijKsPIDb FPHxWwfJSDZRrgUyYT7089YFB/ZM4FHyH9TZcnxn0f0xIB7NS6YNDsxzN2zT EVEYf+De4qT/dQTsdww78Chtcv9JY9r2kDm77dk2MUGHL2j7n8jasbLtgA7h pn2DMIWLrGamMLWRmlwslolKr1sMV5x8w+5Ias6C33iBMl9phkg42an0gYmc byVJHvLO/XErtC+GNIJeMg== =liRq -----END PGP MESSAGE----- ` ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package s2k implements the various OpenPGP string-to-key transforms as // specified in RFC 4800 section 3.7.1, and Argon2 specified in // draft-ietf-openpgp-crypto-refresh-08 section 3.7.1.4. package s2k // import "github.com/ProtonMail/go-crypto/openpgp/s2k" import ( "crypto" "hash" "io" "strconv" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "golang.org/x/crypto/argon2" ) type Mode uint8 // Defines the default S2KMode constants // // 0 (simple), 1(salted), 3(iterated), 4(argon2) const ( SimpleS2K Mode = 0 SaltedS2K Mode = 1 IteratedSaltedS2K Mode = 3 Argon2S2K Mode = 4 GnuS2K Mode = 101 ) const Argon2SaltSize int = 16 // Params contains all the parameters of the s2k packet type Params struct { // mode is the mode of s2k function. // It can be 0 (simple), 1(salted), 3(iterated) // 2(reserved) 100-110(private/experimental). mode Mode // hashId is the ID of the hash function used in any of the modes hashId byte // salt is a byte array to use as a salt in hashing process or argon2 saltBytes [Argon2SaltSize]byte // countByte is used to determine how many rounds of hashing are to // be performed in s2k mode 3. See RFC 4880 Section 3.7.1.3. countByte byte // passes is a parameter in Argon2 to determine the number of iterations // See RFC the crypto refresh Section 3.7.1.4. passes byte // parallelism is a parameter in Argon2 to determine the degree of paralellism // See RFC the crypto refresh Section 3.7.1.4. parallelism byte // memoryExp is a parameter in Argon2 to determine the memory usage // i.e., 2 ** memoryExp kibibytes // See RFC the crypto refresh Section 3.7.1.4. memoryExp byte } // encodeCount converts an iterative "count" in the range 1024 to // 65011712, inclusive, to an encoded count. The return value is the // octet that is actually stored in the GPG file. encodeCount panics // if i is not in the above range (encodedCount above takes care to // pass i in the correct range). See RFC 4880 Section 3.7.7.1. func encodeCount(i int) uint8 { if i < 65536 || i > 65011712 { panic("count arg i outside the required range") } for encoded := 96; encoded < 256; encoded++ { count := decodeCount(uint8(encoded)) if count >= i { return uint8(encoded) } } return 255 } // decodeCount returns the s2k mode 3 iterative "count" corresponding to // the encoded octet c. func decodeCount(c uint8) int { return (16 + int(c&15)) << (uint32(c>>4) + 6) } // encodeMemory converts the Argon2 "memory" in the range parallelism*8 to // 2**31, inclusive, to an encoded memory. The return value is the // octet that is actually stored in the GPG file. encodeMemory panics // if is not in the above range // See OpenPGP crypto refresh Section 3.7.1.4. func encodeMemory(memory uint32, parallelism uint8) uint8 { if memory < (8*uint32(parallelism)) || memory > uint32(2147483648) { panic("Memory argument memory is outside the required range") } for exp := 3; exp < 31; exp++ { compare := decodeMemory(uint8(exp)) if compare >= memory { return uint8(exp) } } return 31 } // decodeMemory computes the decoded memory in kibibytes as 2**memoryExponent func decodeMemory(memoryExponent uint8) uint32 { return uint32(1) << memoryExponent } // Simple writes to out the result of computing the Simple S2K function (RFC // 4880, section 3.7.1.1) using the given hash and input passphrase. func Simple(out []byte, h hash.Hash, in []byte) { Salted(out, h, in, nil) } var zero [1]byte // Salted writes to out the result of computing the Salted S2K function (RFC // 4880, section 3.7.1.2) using the given hash, input passphrase and salt. func Salted(out []byte, h hash.Hash, in []byte, salt []byte) { done := 0 var digest []byte for i := 0; done < len(out); i++ { h.Reset() for j := 0; j < i; j++ { h.Write(zero[:]) } h.Write(salt) h.Write(in) digest = h.Sum(digest[:0]) n := copy(out[done:], digest) done += n } } // Iterated writes to out the result of computing the Iterated and Salted S2K // function (RFC 4880, section 3.7.1.3) using the given hash, input passphrase, // salt and iteration count. func Iterated(out []byte, h hash.Hash, in []byte, salt []byte, count int) { combined := make([]byte, len(in)+len(salt)) copy(combined, salt) copy(combined[len(salt):], in) if count < len(combined) { count = len(combined) } done := 0 var digest []byte for i := 0; done < len(out); i++ { h.Reset() for j := 0; j < i; j++ { h.Write(zero[:]) } written := 0 for written < count { if written+len(combined) > count { todo := count - written h.Write(combined[:todo]) written = count } else { h.Write(combined) written += len(combined) } } digest = h.Sum(digest[:0]) n := copy(out[done:], digest) done += n } } // Argon2 writes to out the key derived from the password (in) with the Argon2 // function (the crypto refresh, section 3.7.1.4) func Argon2(out []byte, in []byte, salt []byte, passes uint8, paralellism uint8, memoryExp uint8) { key := argon2.IDKey(in, salt, uint32(passes), decodeMemory(memoryExp), paralellism, uint32(len(out))) copy(out[:], key) } // Generate generates valid parameters from given configuration. // It will enforce the Iterated and Salted or Argon2 S2K method. func Generate(rand io.Reader, c *Config) (*Params, error) { var params *Params if c != nil && c.Mode() == Argon2S2K { // handle Argon2 case argonConfig := c.Argon2() params = &Params{ mode: Argon2S2K, passes: argonConfig.Passes(), parallelism: argonConfig.Parallelism(), memoryExp: argonConfig.EncodedMemory(), } } else if c != nil && c.PassphraseIsHighEntropy && c.Mode() == SaltedS2K { // Allow SaltedS2K if PassphraseIsHighEntropy hashId, ok := algorithm.HashToHashId(c.hash()) if !ok { return nil, errors.UnsupportedError("no such hash") } params = &Params{ mode: SaltedS2K, hashId: hashId, } } else { // Enforce IteratedSaltedS2K method otherwise hashId, ok := algorithm.HashToHashId(c.hash()) if !ok { return nil, errors.UnsupportedError("no such hash") } if c != nil { c.S2KMode = IteratedSaltedS2K } params = &Params{ mode: IteratedSaltedS2K, hashId: hashId, countByte: c.EncodedCount(), } } if _, err := io.ReadFull(rand, params.salt()); err != nil { return nil, err } return params, nil } // Parse reads a binary specification for a string-to-key transformation from r // and returns a function which performs that transform. If the S2K is a special // GNU extension that indicates that the private key is missing, then the error // returned is errors.ErrDummyPrivateKey. func Parse(r io.Reader) (f func(out, in []byte), err error) { params, err := ParseIntoParams(r) if err != nil { return nil, err } return params.Function() } // ParseIntoParams reads a binary specification for a string-to-key // transformation from r and returns a struct describing the s2k parameters. func ParseIntoParams(r io.Reader) (params *Params, err error) { var buf [Argon2SaltSize + 3]byte _, err = io.ReadFull(r, buf[:1]) if err != nil { return } params = &Params{ mode: Mode(buf[0]), } switch params.mode { case SimpleS2K: _, err = io.ReadFull(r, buf[:1]) if err != nil { return nil, err } params.hashId = buf[0] return params, nil case SaltedS2K: _, err = io.ReadFull(r, buf[:9]) if err != nil { return nil, err } params.hashId = buf[0] copy(params.salt(), buf[1:9]) return params, nil case IteratedSaltedS2K: _, err = io.ReadFull(r, buf[:10]) if err != nil { return nil, err } params.hashId = buf[0] copy(params.salt(), buf[1:9]) params.countByte = buf[9] return params, nil case Argon2S2K: _, err = io.ReadFull(r, buf[:Argon2SaltSize+3]) if err != nil { return nil, err } copy(params.salt(), buf[:Argon2SaltSize]) params.passes = buf[Argon2SaltSize] params.parallelism = buf[Argon2SaltSize+1] params.memoryExp = buf[Argon2SaltSize+2] if err := validateArgon2Params(params); err != nil { return nil, err } return params, nil case GnuS2K: // This is a GNU extension. See // https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=doc/DETAILS;h=fe55ae16ab4e26d8356dc574c9e8bc935e71aef1;hb=23191d7851eae2217ecdac6484349849a24fd94a#l1109 if _, err = io.ReadFull(r, buf[:5]); err != nil { return nil, err } params.hashId = buf[0] if buf[1] == 'G' && buf[2] == 'N' && buf[3] == 'U' && buf[4] == 1 { return params, nil } return nil, errors.UnsupportedError("GNU S2K extension") } return nil, errors.UnsupportedError("S2K function") } func (params *Params) Mode() Mode { return params.mode } func (params *Params) Dummy() bool { return params != nil && params.mode == GnuS2K } func (params *Params) salt() []byte { switch params.mode { case SaltedS2K, IteratedSaltedS2K: return params.saltBytes[:8] case Argon2S2K: return params.saltBytes[:Argon2SaltSize] default: return nil } } func (params *Params) Function() (f func(out, in []byte), err error) { if params.Dummy() { return nil, errors.ErrDummyPrivateKey("dummy key found") } var hashObj crypto.Hash if params.mode != Argon2S2K { var ok bool hashObj, ok = algorithm.HashIdToHashWithSha1(params.hashId) if !ok { return nil, errors.UnsupportedError("hash for S2K function: " + strconv.Itoa(int(params.hashId))) } if !hashObj.Available() { return nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashObj))) } } switch params.mode { case SimpleS2K: f := func(out, in []byte) { Simple(out, hashObj.New(), in) } return f, nil case SaltedS2K: f := func(out, in []byte) { Salted(out, hashObj.New(), in, params.salt()) } return f, nil case IteratedSaltedS2K: f := func(out, in []byte) { Iterated(out, hashObj.New(), in, params.salt(), decodeCount(params.countByte)) } return f, nil case Argon2S2K: f := func(out, in []byte) { Argon2(out, in, params.salt(), params.passes, params.parallelism, params.memoryExp) } return f, nil } return nil, errors.UnsupportedError("S2K function") } func (params *Params) Serialize(w io.Writer) (err error) { if _, err = w.Write([]byte{uint8(params.mode)}); err != nil { return } if params.mode != Argon2S2K { if _, err = w.Write([]byte{params.hashId}); err != nil { return } } if params.Dummy() { _, err = w.Write(append([]byte("GNU"), 1)) return } if params.mode > 0 { if _, err = w.Write(params.salt()); err != nil { return } if params.mode == IteratedSaltedS2K { _, err = w.Write([]byte{params.countByte}) } if params.mode == Argon2S2K { _, err = w.Write([]byte{params.passes, params.parallelism, params.memoryExp}) } } return } // Serialize salts and stretches the given passphrase and writes the // resulting key into key. It also serializes an S2K descriptor to // w. The key stretching can be configured with c, which may be // nil. In that case, sensible defaults will be used. func Serialize(w io.Writer, key []byte, rand io.Reader, passphrase []byte, c *Config) error { params, err := Generate(rand, c) if err != nil { return err } err = params.Serialize(w) if err != nil { return err } f, err := params.Function() if err != nil { return err } f(key, passphrase) return nil } // validateArgon2Params checks that the argon2 parameters are valid according to RFC9580. func validateArgon2Params(params *Params) error { // The number of passes t and the degree of parallelism p MUST be non-zero. if params.parallelism == 0 { return errors.StructuralError("invalid argon2 params: parallelism is 0") } if params.passes == 0 { return errors.StructuralError("invalid argon2 params: iterations is 0") } // The encoded memory size MUST be a value from 3+ceil(log2(p)) to 31, // such that the decoded memory size m is a value from 8*p to 2^31. if params.memoryExp > 31 || decodeMemory(params.memoryExp) < 8*uint32(params.parallelism) { return errors.StructuralError("invalid argon2 params: memory is out of bounds") } return nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_cache.go ================================================ package s2k // Cache stores keys derived with s2k functions from one passphrase // to avoid recomputation if multiple items are encrypted with // the same parameters. type Cache map[Params][]byte // GetOrComputeDerivedKey tries to retrieve the key // for the given s2k parameters from the cache. // If there is no hit, it derives the key with the s2k function from the passphrase, // updates the cache, and returns the key. func (c *Cache) GetOrComputeDerivedKey(passphrase []byte, params *Params, expectedKeySize int) ([]byte, error) { key, found := (*c)[*params] if !found || len(key) != expectedKeySize { var err error derivedKey := make([]byte, expectedKeySize) s2k, err := params.Function() if err != nil { return nil, err } s2k(derivedKey, passphrase) (*c)[*params] = key return derivedKey, nil } return key, nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_config.go ================================================ package s2k import "crypto" // Config collects configuration parameters for s2k key-stretching // transformations. A nil *Config is valid and results in all default // values. type Config struct { // S2K (String to Key) mode, used for key derivation in the context of secret key encryption // and passphrase-encrypted data. Either s2k.Argon2S2K or s2k.IteratedSaltedS2K may be used. // If the passphrase is a high-entropy key, indicated by setting PassphraseIsHighEntropy to true, // s2k.SaltedS2K can also be used. // Note: Argon2 is the strongest option but not all OpenPGP implementations are compatible with it //(pending standardisation). // 0 (simple), 1(salted), 3(iterated), 4(argon2) // 2(reserved) 100-110(private/experimental). S2KMode Mode // Only relevant if S2KMode is not set to s2k.Argon2S2K. // Hash is the default hash function to be used. If // nil, SHA256 is used. Hash crypto.Hash // Argon2 parameters for S2K (String to Key). // Only relevant if S2KMode is set to s2k.Argon2S2K. // If nil, default parameters are used. // For more details on the choice of parameters, see https://tools.ietf.org/html/rfc9106#section-4. Argon2Config *Argon2Config // Only relevant if S2KMode is set to s2k.IteratedSaltedS2K. // Iteration count for Iterated S2K (String to Key). It // determines the strength of the passphrase stretching when // the said passphrase is hashed to produce a key. S2KCount // should be between 65536 and 65011712, inclusive. If Config // is nil or S2KCount is 0, the value 16777216 used. Not all // values in the above range can be represented. S2KCount will // be rounded up to the next representable value if it cannot // be encoded exactly. When set, it is strongly encrouraged to // use a value that is at least 65536. See RFC 4880 Section // 3.7.1.3. S2KCount int // Indicates whether the passphrase passed by the application is a // high-entropy key (e.g. it's randomly generated or derived from // another passphrase using a strong key derivation function). // When true, allows the S2KMode to be s2k.SaltedS2K. // When the passphrase is not a high-entropy key, using SaltedS2K is // insecure, and not allowed by draft-ietf-openpgp-crypto-refresh-08. PassphraseIsHighEntropy bool } // Argon2Config stores the Argon2 parameters // A nil *Argon2Config is valid and results in all default type Argon2Config struct { NumberOfPasses uint8 DegreeOfParallelism uint8 // Memory specifies the desired Argon2 memory usage in kibibytes. // For example memory=64*1024 sets the memory cost to ~64 MB. Memory uint32 } func (c *Config) Mode() Mode { if c == nil { return IteratedSaltedS2K } return c.S2KMode } func (c *Config) hash() crypto.Hash { if c == nil || uint(c.Hash) == 0 { return crypto.SHA256 } return c.Hash } func (c *Config) Argon2() *Argon2Config { if c == nil || c.Argon2Config == nil { return nil } return c.Argon2Config } // EncodedCount get encoded count func (c *Config) EncodedCount() uint8 { if c == nil || c.S2KCount == 0 { return 224 // The common case. Corresponding to 16777216 } i := c.S2KCount switch { case i < 65536: i = 65536 case i > 65011712: i = 65011712 } return encodeCount(i) } func (c *Argon2Config) Passes() uint8 { if c == nil || c.NumberOfPasses == 0 { return 3 } return c.NumberOfPasses } func (c *Argon2Config) Parallelism() uint8 { if c == nil || c.DegreeOfParallelism == 0 { return 4 } return c.DegreeOfParallelism } func (c *Argon2Config) EncodedMemory() uint8 { if c == nil || c.Memory == 0 { return 16 // 64 MiB of RAM } memory := c.Memory lowerBound := uint32(c.Parallelism()) * 8 upperBound := uint32(2147483648) switch { case memory < lowerBound: memory = lowerBound case memory > upperBound: memory = upperBound } return encodeMemory(memory, c.Parallelism()) } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/write.go ================================================ // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package openpgp import ( "crypto" "hash" "io" "strconv" "time" "github.com/ProtonMail/go-crypto/openpgp/armor" "github.com/ProtonMail/go-crypto/openpgp/errors" "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm" "github.com/ProtonMail/go-crypto/openpgp/packet" ) // DetachSign signs message with the private key from signer (which must // already have been decrypted) and writes the signature to w. // If config is nil, sensible defaults will be used. func DetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { return detachSign(w, signer, message, packet.SigTypeBinary, config) } // ArmoredDetachSign signs message with the private key from signer (which // must already have been decrypted) and writes an armored signature to w. // If config is nil, sensible defaults will be used. func ArmoredDetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) (err error) { return armoredDetachSign(w, signer, message, packet.SigTypeBinary, config) } // DetachSignText signs message (after canonicalising the line endings) with // the private key from signer (which must already have been decrypted) and // writes the signature to w. // If config is nil, sensible defaults will be used. func DetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { return detachSign(w, signer, message, packet.SigTypeText, config) } // ArmoredDetachSignText signs message (after canonicalising the line endings) // with the private key from signer (which must already have been decrypted) // and writes an armored signature to w. // If config is nil, sensible defaults will be used. func ArmoredDetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { return armoredDetachSign(w, signer, message, packet.SigTypeText, config) } func armoredDetachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { out, err := armor.Encode(w, SignatureType, nil) if err != nil { return } err = detachSign(out, signer, message, sigType, config) if err != nil { return } return out.Close() } func detachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { signingKey, ok := signer.SigningKeyById(config.Now(), config.SigningKey()) if !ok { return errors.InvalidArgumentError("no valid signing keys") } if signingKey.PrivateKey == nil { return errors.InvalidArgumentError("signing key doesn't have a private key") } if signingKey.PrivateKey.Encrypted { return errors.InvalidArgumentError("signing key is encrypted") } if _, ok := algorithm.HashToHashId(config.Hash()); !ok { return errors.InvalidArgumentError("invalid hash function") } sig := createSignaturePacket(signingKey.PublicKey, sigType, config) h, err := sig.PrepareSign(config) if err != nil { return } wrappedHash, err := wrapHashForSignature(h, sig.SigType) if err != nil { return } if _, err = io.Copy(wrappedHash, message); err != nil { return err } err = sig.Sign(h, signingKey.PrivateKey, config) if err != nil { return } return sig.Serialize(w) } // FileHints contains metadata about encrypted files. This metadata is, itself, // encrypted. type FileHints struct { // IsBinary can be set to hint that the contents are binary data. IsBinary bool // FileName hints at the name of the file that should be written. It's // truncated to 255 bytes if longer. It may be empty to suggest that the // file should not be written to disk. It may be equal to "_CONSOLE" to // suggest the data should not be written to disk. FileName string // ModTime contains the modification time of the file, or the zero time if not applicable. ModTime time.Time } // SymmetricallyEncrypt acts like gpg -c: it encrypts a file with a passphrase. // The resulting WriteCloser must be closed after the contents of the file have // been written. // If config is nil, sensible defaults will be used. func SymmetricallyEncrypt(ciphertext io.Writer, passphrase []byte, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { if hints == nil { hints = &FileHints{} } key, err := packet.SerializeSymmetricKeyEncrypted(ciphertext, passphrase, config) if err != nil { return } var w io.WriteCloser cipherSuite := packet.CipherSuite{ Cipher: config.Cipher(), Mode: config.AEAD().Mode(), } w, err = packet.SerializeSymmetricallyEncrypted(ciphertext, config.Cipher(), config.AEAD() != nil, cipherSuite, key, config) if err != nil { return } literalData := w if algo := config.Compression(); algo != packet.CompressionNone { var compConfig *packet.CompressionConfig if config != nil { compConfig = config.CompressionConfig } literalData, err = packet.SerializeCompressed(w, algo, compConfig) if err != nil { return } } var epochSeconds uint32 if !hints.ModTime.IsZero() { epochSeconds = uint32(hints.ModTime.Unix()) } return packet.SerializeLiteral(literalData, hints.IsBinary, hints.FileName, epochSeconds) } // intersectPreferences mutates and returns a prefix of a that contains only // the values in the intersection of a and b. The order of a is preserved. func intersectPreferences(a []uint8, b []uint8) (intersection []uint8) { var j int for _, v := range a { for _, v2 := range b { if v == v2 { a[j] = v j++ break } } } return a[:j] } // intersectPreferences mutates and returns a prefix of a that contains only // the values in the intersection of a and b. The order of a is preserved. func intersectCipherSuites(a [][2]uint8, b [][2]uint8) (intersection [][2]uint8) { var j int for _, v := range a { for _, v2 := range b { if v[0] == v2[0] && v[1] == v2[1] { a[j] = v j++ break } } } return a[:j] } func hashToHashId(h crypto.Hash) uint8 { v, ok := algorithm.HashToHashId(h) if !ok { panic("tried to convert unknown hash") } return v } // EncryptText encrypts a message to a number of recipients and, optionally, // signs it. Optional information is contained in 'hints', also encrypted, that // aids the recipients in processing the message. The resulting WriteCloser // must be closed after the contents of the file have been written. If config // is nil, sensible defaults will be used. The signing is done in text mode. func EncryptText(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { return encrypt(ciphertext, ciphertext, to, signed, hints, packet.SigTypeText, config) } // Encrypt encrypts a message to a number of recipients and, optionally, signs // it. hints contains optional information, that is also encrypted, that aids // the recipients in processing the message. The resulting WriteCloser must // be closed after the contents of the file have been written. // If config is nil, sensible defaults will be used. func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { return encrypt(ciphertext, ciphertext, to, signed, hints, packet.SigTypeBinary, config) } // EncryptSplit encrypts a message to a number of recipients and, optionally, signs // it. hints contains optional information, that is also encrypted, that aids // the recipients in processing the message. The resulting WriteCloser must // be closed after the contents of the file have been written. // If config is nil, sensible defaults will be used. func EncryptSplit(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { return encrypt(keyWriter, dataWriter, to, signed, hints, packet.SigTypeBinary, config) } // EncryptTextSplit encrypts a message to a number of recipients and, optionally, signs // it. hints contains optional information, that is also encrypted, that aids // the recipients in processing the message. The resulting WriteCloser must // be closed after the contents of the file have been written. // If config is nil, sensible defaults will be used. func EncryptTextSplit(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { return encrypt(keyWriter, dataWriter, to, signed, hints, packet.SigTypeText, config) } // writeAndSign writes the data as a payload package and, optionally, signs // it. hints contains optional information, that is also encrypted, // that aids the recipients in processing the message. The resulting // WriteCloser must be closed after the contents of the file have been // written. If config is nil, sensible defaults will be used. func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entity, hints *FileHints, sigType packet.SignatureType, config *packet.Config) (plaintext io.WriteCloser, err error) { var signer *packet.PrivateKey if signed != nil { signKey, ok := signed.SigningKeyById(config.Now(), config.SigningKey()) if !ok { return nil, errors.InvalidArgumentError("no valid signing keys") } signer = signKey.PrivateKey if signer == nil { return nil, errors.InvalidArgumentError("no private key in signing key") } if signer.Encrypted { return nil, errors.InvalidArgumentError("signing key must be decrypted") } } var hash crypto.Hash for _, hashId := range candidateHashes { if h, ok := algorithm.HashIdToHash(hashId); ok && h.Available() { hash = h break } } // If the hash specified by config is a candidate, we'll use that. if configuredHash := config.Hash(); configuredHash.Available() { for _, hashId := range candidateHashes { if h, ok := algorithm.HashIdToHash(hashId); ok && h == configuredHash { hash = h break } } } if hash == 0 { hashId := candidateHashes[0] name, ok := algorithm.HashIdToString(hashId) if !ok { name = "#" + strconv.Itoa(int(hashId)) } return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") } var salt []byte if signer != nil { var opsVersion = 3 if signer.Version == 6 { opsVersion = signer.Version } ops := &packet.OnePassSignature{ Version: opsVersion, SigType: sigType, Hash: hash, PubKeyAlgo: signer.PubKeyAlgo, KeyId: signer.KeyId, IsLast: true, } if opsVersion == 6 { ops.KeyFingerprint = signer.Fingerprint salt, err = packet.SignatureSaltForHash(hash, config.Random()) if err != nil { return nil, err } ops.Salt = salt } if err := ops.Serialize(payload); err != nil { return nil, err } } if hints == nil { hints = &FileHints{} } w := payload if signer != nil { // If we need to write a signature packet after the literal // data then we need to stop literalData from closing // encryptedData. w = noOpCloser{w} } var epochSeconds uint32 if !hints.ModTime.IsZero() { epochSeconds = uint32(hints.ModTime.Unix()) } literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) if err != nil { return nil, err } if signer != nil { h, wrappedHash, err := hashForSignature(hash, sigType, salt) if err != nil { return nil, err } metadata := &packet.LiteralData{ Format: 'u', FileName: hints.FileName, Time: epochSeconds, } if hints.IsBinary { metadata.Format = 'b' } return signatureWriter{payload, literalData, hash, wrappedHash, h, salt, signer, sigType, config, metadata}, nil } return literalData, nil } // encrypt encrypts a message to a number of recipients and, optionally, signs // it. hints contains optional information, that is also encrypted, that aids // the recipients in processing the message. The resulting WriteCloser must // be closed after the contents of the file have been written. // If config is nil, sensible defaults will be used. func encrypt(keyWriter io.Writer, dataWriter io.Writer, to []*Entity, signed *Entity, hints *FileHints, sigType packet.SignatureType, config *packet.Config) (plaintext io.WriteCloser, err error) { if len(to) == 0 { return nil, errors.InvalidArgumentError("no encryption recipient provided") } // These are the possible ciphers that we'll use for the message. candidateCiphers := []uint8{ uint8(packet.CipherAES256), uint8(packet.CipherAES128), } // These are the possible hash functions that we'll use for the signature. candidateHashes := []uint8{ hashToHashId(crypto.SHA256), hashToHashId(crypto.SHA384), hashToHashId(crypto.SHA512), hashToHashId(crypto.SHA3_256), hashToHashId(crypto.SHA3_512), } // Prefer GCM if everyone supports it candidateCipherSuites := [][2]uint8{ {uint8(packet.CipherAES256), uint8(packet.AEADModeGCM)}, {uint8(packet.CipherAES256), uint8(packet.AEADModeEAX)}, {uint8(packet.CipherAES256), uint8(packet.AEADModeOCB)}, {uint8(packet.CipherAES128), uint8(packet.AEADModeGCM)}, {uint8(packet.CipherAES128), uint8(packet.AEADModeEAX)}, {uint8(packet.CipherAES128), uint8(packet.AEADModeOCB)}, } candidateCompression := []uint8{ uint8(packet.CompressionNone), uint8(packet.CompressionZIP), uint8(packet.CompressionZLIB), } encryptKeys := make([]Key, len(to)) // AEAD is used only if config enables it and every key supports it aeadSupported := config.AEAD() != nil for i := range to { var ok bool encryptKeys[i], ok = to[i].EncryptionKey(config.Now()) if !ok { return nil, errors.InvalidArgumentError("cannot encrypt a message to key id " + strconv.FormatUint(to[i].PrimaryKey.KeyId, 16) + " because it has no valid encryption keys") } primarySelfSignature, _ := to[i].PrimarySelfSignature() if primarySelfSignature == nil { return nil, errors.InvalidArgumentError("entity without a self-signature") } if !primarySelfSignature.SEIPDv2 { aeadSupported = false } candidateCiphers = intersectPreferences(candidateCiphers, primarySelfSignature.PreferredSymmetric) candidateHashes = intersectPreferences(candidateHashes, primarySelfSignature.PreferredHash) candidateCipherSuites = intersectCipherSuites(candidateCipherSuites, primarySelfSignature.PreferredCipherSuites) candidateCompression = intersectPreferences(candidateCompression, primarySelfSignature.PreferredCompression) } // In the event that the intersection of supported algorithms is empty we use the ones // labelled as MUST that every implementation supports. if len(candidateCiphers) == 0 { // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.3 candidateCiphers = []uint8{uint8(packet.CipherAES128)} } if len(candidateHashes) == 0 { // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#hash-algos candidateHashes = []uint8{hashToHashId(crypto.SHA256)} } if len(candidateCipherSuites) == 0 { // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.6 candidateCipherSuites = [][2]uint8{{uint8(packet.CipherAES128), uint8(packet.AEADModeOCB)}} } cipher := packet.CipherFunction(candidateCiphers[0]) aeadCipherSuite := packet.CipherSuite{ Cipher: packet.CipherFunction(candidateCipherSuites[0][0]), Mode: packet.AEADMode(candidateCipherSuites[0][1]), } // If the cipher specified by config is a candidate, we'll use that. configuredCipher := config.Cipher() for _, c := range candidateCiphers { cipherFunc := packet.CipherFunction(c) if cipherFunc == configuredCipher { cipher = cipherFunc break } } var symKey []byte if aeadSupported { symKey = make([]byte, aeadCipherSuite.Cipher.KeySize()) } else { symKey = make([]byte, cipher.KeySize()) } if _, err := io.ReadFull(config.Random(), symKey); err != nil { return nil, err } for _, key := range encryptKeys { if err := packet.SerializeEncryptedKeyAEAD(keyWriter, key.PublicKey, cipher, aeadSupported, symKey, config); err != nil { return nil, err } } var payload io.WriteCloser payload, err = packet.SerializeSymmetricallyEncrypted(dataWriter, cipher, aeadSupported, aeadCipherSuite, symKey, config) if err != nil { return } payload, err = handleCompression(payload, candidateCompression, config) if err != nil { return nil, err } return writeAndSign(payload, candidateHashes, signed, hints, sigType, config) } // Sign signs a message. The resulting WriteCloser must be closed after the // contents of the file have been written. hints contains optional information // that aids the recipients in processing the message. // If config is nil, sensible defaults will be used. func Sign(output io.Writer, signed *Entity, hints *FileHints, config *packet.Config) (input io.WriteCloser, err error) { if signed == nil { return nil, errors.InvalidArgumentError("no signer provided") } // These are the possible hash functions that we'll use for the signature. candidateHashes := []uint8{ hashToHashId(crypto.SHA256), hashToHashId(crypto.SHA384), hashToHashId(crypto.SHA512), hashToHashId(crypto.SHA3_256), hashToHashId(crypto.SHA3_512), } defaultHashes := candidateHashes[0:1] primarySelfSignature, _ := signed.PrimarySelfSignature() if primarySelfSignature == nil { return nil, errors.StructuralError("signed entity has no self-signature") } preferredHashes := primarySelfSignature.PreferredHash if len(preferredHashes) == 0 { preferredHashes = defaultHashes } candidateHashes = intersectPreferences(candidateHashes, preferredHashes) if len(candidateHashes) == 0 { return nil, errors.StructuralError("cannot sign because signing key shares no common algorithms with candidate hashes") } return writeAndSign(noOpCloser{output}, candidateHashes, signed, hints, packet.SigTypeBinary, config) } // signatureWriter hashes the contents of a message while passing it along to // literalData. When closed, it closes literalData, writes a signature packet // to encryptedData and then also closes encryptedData. type signatureWriter struct { encryptedData io.WriteCloser literalData io.WriteCloser hashType crypto.Hash wrappedHash hash.Hash h hash.Hash salt []byte // v6 only signer *packet.PrivateKey sigType packet.SignatureType config *packet.Config metadata *packet.LiteralData // V5 signatures protect document metadata } func (s signatureWriter) Write(data []byte) (int, error) { s.wrappedHash.Write(data) switch s.sigType { case packet.SigTypeBinary: return s.literalData.Write(data) case packet.SigTypeText: flag := 0 return writeCanonical(s.literalData, data, &flag) } return 0, errors.UnsupportedError("unsupported signature type: " + strconv.Itoa(int(s.sigType))) } func (s signatureWriter) Close() error { sig := createSignaturePacket(&s.signer.PublicKey, s.sigType, s.config) sig.Hash = s.hashType sig.Metadata = s.metadata if err := sig.SetSalt(s.salt); err != nil { return err } if err := sig.Sign(s.h, s.signer, s.config); err != nil { return err } if err := s.literalData.Close(); err != nil { return err } if err := sig.Serialize(s.encryptedData); err != nil { return err } return s.encryptedData.Close() } func createSignaturePacket(signer *packet.PublicKey, sigType packet.SignatureType, config *packet.Config) *packet.Signature { sigLifetimeSecs := config.SigLifetime() return &packet.Signature{ Version: signer.Version, SigType: sigType, PubKeyAlgo: signer.PubKeyAlgo, Hash: config.Hash(), CreationTime: config.Now(), IssuerKeyId: &signer.KeyId, IssuerFingerprint: signer.Fingerprint, Notations: config.Notations(), SigLifetimeSecs: &sigLifetimeSecs, } } // noOpCloser is like an ioutil.NopCloser, but for an io.Writer. // TODO: we have two of these in OpenPGP packages alone. This probably needs // to be promoted somewhere more common. type noOpCloser struct { w io.Writer } func (c noOpCloser) Write(data []byte) (n int, err error) { return c.w.Write(data) } func (c noOpCloser) Close() error { return nil } func handleCompression(compressed io.WriteCloser, candidateCompression []uint8, config *packet.Config) (data io.WriteCloser, err error) { data = compressed confAlgo := config.Compression() if confAlgo == packet.CompressionNone { return } // Set algorithm labelled as MUST as fallback // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-9.4 finalAlgo := packet.CompressionNone // if compression specified by config available we will use it for _, c := range candidateCompression { if uint8(confAlgo) == c { finalAlgo = confAlgo break } } if finalAlgo != packet.CompressionNone { var compConfig *packet.CompressionConfig if config != nil { compConfig = config.CompressionConfig } data, err = packet.SerializeCompressed(compressed, finalAlgo, compConfig) if err != nil { return } } return data, nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/x25519/x25519.go ================================================ package x25519 import ( "crypto/sha256" "crypto/subtle" "io" "github.com/ProtonMail/go-crypto/openpgp/aes/keywrap" "github.com/ProtonMail/go-crypto/openpgp/errors" x25519lib "github.com/cloudflare/circl/dh/x25519" "golang.org/x/crypto/hkdf" ) const ( hkdfInfo = "OpenPGP X25519" aes128KeySize = 16 // The size of a public or private key in bytes. KeySize = x25519lib.Size ) type PublicKey struct { // Point represents the encoded elliptic curve point of the public key. Point []byte } type PrivateKey struct { PublicKey // Secret represents the secret of the private key. Secret []byte } // NewPrivateKey creates a new empty private key including the public key. func NewPrivateKey(key PublicKey) *PrivateKey { return &PrivateKey{ PublicKey: key, } } // Validate validates that the provided public key matches the private key. func Validate(pk *PrivateKey) (err error) { var expectedPublicKey, privateKey x25519lib.Key subtle.ConstantTimeCopy(1, privateKey[:], pk.Secret) x25519lib.KeyGen(&expectedPublicKey, &privateKey) if subtle.ConstantTimeCompare(expectedPublicKey[:], pk.PublicKey.Point) == 0 { return errors.KeyInvalidError("x25519: invalid key") } return nil } // GenerateKey generates a new x25519 key pair. func GenerateKey(rand io.Reader) (*PrivateKey, error) { var privateKey, publicKey x25519lib.Key privateKeyOut := new(PrivateKey) err := generateKey(rand, &privateKey, &publicKey) if err != nil { return nil, err } privateKeyOut.PublicKey.Point = publicKey[:] privateKeyOut.Secret = privateKey[:] return privateKeyOut, nil } func generateKey(rand io.Reader, privateKey *x25519lib.Key, publicKey *x25519lib.Key) error { maxRounds := 10 isZero := true for round := 0; isZero; round++ { if round == maxRounds { return errors.InvalidArgumentError("x25519: zero keys only, randomness source might be corrupt") } _, err := io.ReadFull(rand, privateKey[:]) if err != nil { return err } isZero = constantTimeIsZero(privateKey[:]) } x25519lib.KeyGen(publicKey, privateKey) return nil } // Encrypt encrypts a sessionKey with x25519 according to // the OpenPGP crypto refresh specification section 5.1.6. The function assumes that the // sessionKey has the correct format and padding according to the specification. func Encrypt(rand io.Reader, publicKey *PublicKey, sessionKey []byte) (ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, err error) { var ephemeralPrivate, ephemeralPublic, staticPublic, shared x25519lib.Key // Check that the input static public key has 32 bytes if len(publicKey.Point) != KeySize { err = errors.KeyInvalidError("x25519: the public key has the wrong size") return } copy(staticPublic[:], publicKey.Point) // Generate ephemeral keyPair err = generateKey(rand, &ephemeralPrivate, &ephemeralPublic) if err != nil { return } // Compute shared key ok := x25519lib.Shared(&shared, &ephemeralPrivate, &staticPublic) if !ok { err = errors.KeyInvalidError("x25519: the public key is a low order point") return } // Derive the encryption key from the shared secret encryptionKey := applyHKDF(ephemeralPublic[:], publicKey.Point[:], shared[:]) ephemeralPublicKey = &PublicKey{ Point: ephemeralPublic[:], } // Encrypt the sessionKey with aes key wrapping encryptedSessionKey, err = keywrap.Wrap(encryptionKey, sessionKey) return } // Decrypt decrypts a session key stored in ciphertext with the provided x25519 // private key and ephemeral public key. func Decrypt(privateKey *PrivateKey, ephemeralPublicKey *PublicKey, ciphertext []byte) (encodedSessionKey []byte, err error) { var ephemeralPublic, staticPrivate, shared x25519lib.Key // Check that the input ephemeral public key has 32 bytes if len(ephemeralPublicKey.Point) != KeySize { err = errors.KeyInvalidError("x25519: the public key has the wrong size") return } copy(ephemeralPublic[:], ephemeralPublicKey.Point) subtle.ConstantTimeCopy(1, staticPrivate[:], privateKey.Secret) // Compute shared key ok := x25519lib.Shared(&shared, &staticPrivate, &ephemeralPublic) if !ok { err = errors.KeyInvalidError("x25519: the ephemeral public key is a low order point") return } // Derive the encryption key from the shared secret encryptionKey := applyHKDF(ephemeralPublicKey.Point[:], privateKey.PublicKey.Point[:], shared[:]) // Decrypt the session key with aes key wrapping encodedSessionKey, err = keywrap.Unwrap(encryptionKey, ciphertext) return } func applyHKDF(ephemeralPublicKey []byte, publicKey []byte, sharedSecret []byte) []byte { inputKey := make([]byte, 3*KeySize) // ephemeral public key | recipient public key | shared secret subtle.ConstantTimeCopy(1, inputKey[:KeySize], ephemeralPublicKey) subtle.ConstantTimeCopy(1, inputKey[KeySize:2*KeySize], publicKey) subtle.ConstantTimeCopy(1, inputKey[2*KeySize:], sharedSecret) hkdfReader := hkdf.New(sha256.New, inputKey, []byte{}, []byte(hkdfInfo)) encryptionKey := make([]byte, aes128KeySize) _, _ = io.ReadFull(hkdfReader, encryptionKey) return encryptionKey } func constantTimeIsZero(bytes []byte) bool { isZero := byte(0) for _, b := range bytes { isZero |= b } return isZero == 0 } // ENCODING/DECODING ciphertexts: // EncodeFieldsLength returns the length of the ciphertext encoding // given the encrypted session key. func EncodedFieldsLength(encryptedSessionKey []byte, v6 bool) int { lenCipherFunction := 0 if !v6 { lenCipherFunction = 1 } return KeySize + 1 + len(encryptedSessionKey) + lenCipherFunction } // EncodeField encodes x25519 session key encryption fields as // ephemeral x25519 public key | follow byte length | cipherFunction (v3 only) | encryptedSessionKey // and writes it to writer. func EncodeFields(writer io.Writer, ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, cipherFunction byte, v6 bool) (err error) { lenAlgorithm := 0 if !v6 { lenAlgorithm = 1 } if _, err = writer.Write(ephemeralPublicKey.Point); err != nil { return err } if _, err = writer.Write([]byte{byte(len(encryptedSessionKey) + lenAlgorithm)}); err != nil { return err } if !v6 { if _, err = writer.Write([]byte{cipherFunction}); err != nil { return err } } _, err = writer.Write(encryptedSessionKey) return err } // DecodeField decodes a x25519 session key encryption as // ephemeral x25519 public key | follow byte length | cipherFunction (v3 only) | encryptedSessionKey. func DecodeFields(reader io.Reader, v6 bool) (ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, cipherFunction byte, err error) { var buf [1]byte ephemeralPublicKey = &PublicKey{ Point: make([]byte, KeySize), } // 32 octets representing an ephemeral x25519 public key. if _, err = io.ReadFull(reader, ephemeralPublicKey.Point); err != nil { return nil, nil, 0, err } // A one-octet size of the following fields. if _, err = io.ReadFull(reader, buf[:]); err != nil { return nil, nil, 0, err } followingLen := buf[0] // The one-octet algorithm identifier, if it was passed (in the case of a v3 PKESK packet). if !v6 { if _, err = io.ReadFull(reader, buf[:]); err != nil { return nil, nil, 0, err } cipherFunction = buf[0] followingLen -= 1 } // The encrypted session key. encryptedSessionKey = make([]byte, followingLen) if _, err = io.ReadFull(reader, encryptedSessionKey); err != nil { return nil, nil, 0, err } return ephemeralPublicKey, encryptedSessionKey, cipherFunction, nil } ================================================ FILE: vendor/github.com/ProtonMail/go-crypto/openpgp/x448/x448.go ================================================ package x448 import ( "crypto/sha512" "crypto/subtle" "io" "github.com/ProtonMail/go-crypto/openpgp/aes/keywrap" "github.com/ProtonMail/go-crypto/openpgp/errors" x448lib "github.com/cloudflare/circl/dh/x448" "golang.org/x/crypto/hkdf" ) const ( hkdfInfo = "OpenPGP X448" aes256KeySize = 32 // The size of a public or private key in bytes. KeySize = x448lib.Size ) type PublicKey struct { // Point represents the encoded elliptic curve point of the public key. Point []byte } type PrivateKey struct { PublicKey // Secret represents the secret of the private key. Secret []byte } // NewPrivateKey creates a new empty private key including the public key. func NewPrivateKey(key PublicKey) *PrivateKey { return &PrivateKey{ PublicKey: key, } } // Validate validates that the provided public key matches // the private key. func Validate(pk *PrivateKey) (err error) { var expectedPublicKey, privateKey x448lib.Key subtle.ConstantTimeCopy(1, privateKey[:], pk.Secret) x448lib.KeyGen(&expectedPublicKey, &privateKey) if subtle.ConstantTimeCompare(expectedPublicKey[:], pk.PublicKey.Point) == 0 { return errors.KeyInvalidError("x448: invalid key") } return nil } // GenerateKey generates a new x448 key pair. func GenerateKey(rand io.Reader) (*PrivateKey, error) { var privateKey, publicKey x448lib.Key privateKeyOut := new(PrivateKey) err := generateKey(rand, &privateKey, &publicKey) if err != nil { return nil, err } privateKeyOut.PublicKey.Point = publicKey[:] privateKeyOut.Secret = privateKey[:] return privateKeyOut, nil } func generateKey(rand io.Reader, privateKey *x448lib.Key, publicKey *x448lib.Key) error { maxRounds := 10 isZero := true for round := 0; isZero; round++ { if round == maxRounds { return errors.InvalidArgumentError("x448: zero keys only, randomness source might be corrupt") } _, err := io.ReadFull(rand, privateKey[:]) if err != nil { return err } isZero = constantTimeIsZero(privateKey[:]) } x448lib.KeyGen(publicKey, privateKey) return nil } // Encrypt encrypts a sessionKey with x448 according to // the OpenPGP crypto refresh specification section 5.1.7. The function assumes that the // sessionKey has the correct format and padding according to the specification. func Encrypt(rand io.Reader, publicKey *PublicKey, sessionKey []byte) (ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, err error) { var ephemeralPrivate, ephemeralPublic, staticPublic, shared x448lib.Key // Check that the input static public key has 56 bytes. if len(publicKey.Point) != KeySize { err = errors.KeyInvalidError("x448: the public key has the wrong size") return nil, nil, err } copy(staticPublic[:], publicKey.Point) // Generate ephemeral keyPair. if err = generateKey(rand, &ephemeralPrivate, &ephemeralPublic); err != nil { return nil, nil, err } // Compute shared key. ok := x448lib.Shared(&shared, &ephemeralPrivate, &staticPublic) if !ok { err = errors.KeyInvalidError("x448: the public key is a low order point") return nil, nil, err } // Derive the encryption key from the shared secret. encryptionKey := applyHKDF(ephemeralPublic[:], publicKey.Point[:], shared[:]) ephemeralPublicKey = &PublicKey{ Point: ephemeralPublic[:], } // Encrypt the sessionKey with aes key wrapping. encryptedSessionKey, err = keywrap.Wrap(encryptionKey, sessionKey) if err != nil { return nil, nil, err } return ephemeralPublicKey, encryptedSessionKey, nil } // Decrypt decrypts a session key stored in ciphertext with the provided x448 // private key and ephemeral public key. func Decrypt(privateKey *PrivateKey, ephemeralPublicKey *PublicKey, ciphertext []byte) (encodedSessionKey []byte, err error) { var ephemeralPublic, staticPrivate, shared x448lib.Key // Check that the input ephemeral public key has 56 bytes. if len(ephemeralPublicKey.Point) != KeySize { err = errors.KeyInvalidError("x448: the public key has the wrong size") return nil, err } copy(ephemeralPublic[:], ephemeralPublicKey.Point) subtle.ConstantTimeCopy(1, staticPrivate[:], privateKey.Secret) // Compute shared key. ok := x448lib.Shared(&shared, &staticPrivate, &ephemeralPublic) if !ok { err = errors.KeyInvalidError("x448: the ephemeral public key is a low order point") return nil, err } // Derive the encryption key from the shared secret. encryptionKey := applyHKDF(ephemeralPublicKey.Point[:], privateKey.PublicKey.Point[:], shared[:]) // Decrypt the session key with aes key wrapping. encodedSessionKey, err = keywrap.Unwrap(encryptionKey, ciphertext) if err != nil { return nil, err } return encodedSessionKey, nil } func applyHKDF(ephemeralPublicKey []byte, publicKey []byte, sharedSecret []byte) []byte { inputKey := make([]byte, 3*KeySize) // ephemeral public key | recipient public key | shared secret. subtle.ConstantTimeCopy(1, inputKey[:KeySize], ephemeralPublicKey) subtle.ConstantTimeCopy(1, inputKey[KeySize:2*KeySize], publicKey) subtle.ConstantTimeCopy(1, inputKey[2*KeySize:], sharedSecret) hkdfReader := hkdf.New(sha512.New, inputKey, []byte{}, []byte(hkdfInfo)) encryptionKey := make([]byte, aes256KeySize) _, _ = io.ReadFull(hkdfReader, encryptionKey) return encryptionKey } func constantTimeIsZero(bytes []byte) bool { isZero := byte(0) for _, b := range bytes { isZero |= b } return isZero == 0 } // ENCODING/DECODING ciphertexts: // EncodeFieldsLength returns the length of the ciphertext encoding // given the encrypted session key. func EncodedFieldsLength(encryptedSessionKey []byte, v6 bool) int { lenCipherFunction := 0 if !v6 { lenCipherFunction = 1 } return KeySize + 1 + len(encryptedSessionKey) + lenCipherFunction } // EncodeField encodes x448 session key encryption fields as // ephemeral x448 public key | follow byte length | cipherFunction (v3 only) | encryptedSessionKey // and writes it to writer. func EncodeFields(writer io.Writer, ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, cipherFunction byte, v6 bool) (err error) { lenAlgorithm := 0 if !v6 { lenAlgorithm = 1 } if _, err = writer.Write(ephemeralPublicKey.Point); err != nil { return err } if _, err = writer.Write([]byte{byte(len(encryptedSessionKey) + lenAlgorithm)}); err != nil { return err } if !v6 { if _, err = writer.Write([]byte{cipherFunction}); err != nil { return err } } if _, err = writer.Write(encryptedSessionKey); err != nil { return err } return nil } // DecodeField decodes a x448 session key encryption as // ephemeral x448 public key | follow byte length | cipherFunction (v3 only) | encryptedSessionKey. func DecodeFields(reader io.Reader, v6 bool) (ephemeralPublicKey *PublicKey, encryptedSessionKey []byte, cipherFunction byte, err error) { var buf [1]byte ephemeralPublicKey = &PublicKey{ Point: make([]byte, KeySize), } // 56 octets representing an ephemeral x448 public key. if _, err = io.ReadFull(reader, ephemeralPublicKey.Point); err != nil { return nil, nil, 0, err } // A one-octet size of the following fields. if _, err = io.ReadFull(reader, buf[:]); err != nil { return nil, nil, 0, err } followingLen := buf[0] // The one-octet algorithm identifier, if it was passed (in the case of a v3 PKESK packet). if !v6 { if _, err = io.ReadFull(reader, buf[:]); err != nil { return nil, nil, 0, err } cipherFunction = buf[0] followingLen -= 1 } // The encrypted session key. encryptedSessionKey = make([]byte, followingLen) if _, err = io.ReadFull(reader, encryptedSessionKey); err != nil { return nil, nil, 0, err } return ephemeralPublicKey, encryptedSessionKey, cipherFunction, nil } ================================================ FILE: vendor/github.com/agext/levenshtein/.gitignore ================================================ # Ignore docs files _gh_pages _site # Ignore temporary files README.html coverage.out .tmp # Numerous always-ignore extensions *.diff *.err *.log *.orig *.rej *.swo *.swp *.vi *.zip *~ # OS or Editor folders ._* .cache .DS_Store .idea .project .settings .tmproj *.esproj *.sublime-project *.sublime-workspace nbproject Thumbs.db # Komodo .komodotools *.komodoproject # SCSS-Lint scss-lint-report.xml # grunt-contrib-sass cache .sass-cache # Jekyll metadata docs/.jekyll-metadata # Folders to ignore .build .test bower_components node_modules ================================================ FILE: vendor/github.com/agext/levenshtein/.travis.yml ================================================ language: go sudo: false matrix: fast_finish: true include: - go: 1.14.x env: TEST_METHOD=goveralls - go: 1.13.x - go: 1.12.x - go: 1.11.x - go: 1.10.x - go: tip - go: 1.9.x - go: 1.8.x - go: 1.7.x - go: 1.6.x - go: 1.5.x allow_failures: - go: tip - go: 1.11.x - go: 1.10.x - go: 1.9.x - go: 1.8.x - go: 1.7.x - go: 1.6.x - go: 1.5.x script: ./test.sh $TEST_METHOD notifications: email: on_success: never ================================================ FILE: vendor/github.com/agext/levenshtein/DCO ================================================ Developer Certificate of Origin Version 1.1 Copyright (C) 2004, 2006 The Linux Foundation and its contributors. 660 York Street, Suite 102, San Francisco, CA 94110 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Developer's Certificate of Origin 1.1 By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. ================================================ FILE: vendor/github.com/agext/levenshtein/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/agext/levenshtein/MAINTAINERS ================================================ Alex Bucataru (@AlexBucataru) ================================================ FILE: vendor/github.com/agext/levenshtein/NOTICE ================================================ Alrux Go EXTensions (AGExt) - package levenshtein Copyright 2016 ALRUX Inc. This product includes software developed at ALRUX Inc. (http://www.alrux.com/). ================================================ FILE: vendor/github.com/agext/levenshtein/README.md ================================================ # A Go package for calculating the Levenshtein distance between two strings [![Release](https://img.shields.io/github/release/agext/levenshtein.svg?style=flat)](https://github.com/agext/levenshtein/releases/latest) [![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/agext/levenshtein)  [![Build Status](https://travis-ci.org/agext/levenshtein.svg?branch=master&style=flat)](https://travis-ci.org/agext/levenshtein) [![Coverage Status](https://coveralls.io/repos/github/agext/levenshtein/badge.svg?style=flat)](https://coveralls.io/github/agext/levenshtein) [![Go Report Card](https://goreportcard.com/badge/github.com/agext/levenshtein?style=flat)](https://goreportcard.com/report/github.com/agext/levenshtein) This package implements distance and similarity metrics for strings, based on the Levenshtein measure, in [Go](http://golang.org). ## Project Status v1.2.3 Stable: Guaranteed no breaking changes to the API in future v1.x releases. Probably safe to use in production, though provided on "AS IS" basis. This package is being actively maintained. If you encounter any problems or have any suggestions for improvement, please [open an issue](https://github.com/agext/levenshtein/issues). Pull requests are welcome. ## Overview The Levenshtein `Distance` between two strings is the minimum total cost of edits that would convert the first string into the second. The allowed edit operations are insertions, deletions, and substitutions, all at character (one UTF-8 code point) level. Each operation has a default cost of 1, but each can be assigned its own cost equal to or greater than 0. A `Distance` of 0 means the two strings are identical, and the higher the value the more different the strings. Since in practice we are interested in finding if the two strings are "close enough", it often does not make sense to continue the calculation once the result is mathematically guaranteed to exceed a desired threshold. Providing this value to the `Distance` function allows it to take a shortcut and return a lower bound instead of an exact cost when the threshold is exceeded. The `Similarity` function calculates the distance, then converts it into a normalized metric within the range 0..1, with 1 meaning the strings are identical, and 0 that they have nothing in common. A minimum similarity threshold can be provided to speed up the calculation of the metric for strings that are far too dissimilar for the purpose at hand. All values under this threshold are rounded down to 0. The `Match` function provides a similarity metric, with the same range and meaning as `Similarity`, but with a bonus for string pairs that share a common prefix and have a similarity above a "bonus threshold". It uses the same method as proposed by Winkler for the Jaro distance, and the reasoning behind it is that these string pairs are very likely spelling variations or errors, and they are more closely linked than the edit distance alone would suggest. The underlying `Calculate` function is also exported, to allow the building of other derivative metrics, if needed. ## Installation ``` go get github.com/agext/levenshtein ``` ## License Package levenshtein is released under the Apache 2.0 license. See the [LICENSE](LICENSE) file for details. ================================================ FILE: vendor/github.com/agext/levenshtein/levenshtein.go ================================================ // Copyright 2016 ALRUX Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /* Package levenshtein implements distance and similarity metrics for strings, based on the Levenshtein measure. The Levenshtein `Distance` between two strings is the minimum total cost of edits that would convert the first string into the second. The allowed edit operations are insertions, deletions, and substitutions, all at character (one UTF-8 code point) level. Each operation has a default cost of 1, but each can be assigned its own cost equal to or greater than 0. A `Distance` of 0 means the two strings are identical, and the higher the value the more different the strings. Since in practice we are interested in finding if the two strings are "close enough", it often does not make sense to continue the calculation once the result is mathematically guaranteed to exceed a desired threshold. Providing this value to the `Distance` function allows it to take a shortcut and return a lower bound instead of an exact cost when the threshold is exceeded. The `Similarity` function calculates the distance, then converts it into a normalized metric within the range 0..1, with 1 meaning the strings are identical, and 0 that they have nothing in common. A minimum similarity threshold can be provided to speed up the calculation of the metric for strings that are far too dissimilar for the purpose at hand. All values under this threshold are rounded down to 0. The `Match` function provides a similarity metric, with the same range and meaning as `Similarity`, but with a bonus for string pairs that share a common prefix and have a similarity above a "bonus threshold". It uses the same method as proposed by Winkler for the Jaro distance, and the reasoning behind it is that these string pairs are very likely spelling variations or errors, and they are more closely linked than the edit distance alone would suggest. The underlying `Calculate` function is also exported, to allow the building of other derivative metrics, if needed. */ package levenshtein // Calculate determines the Levenshtein distance between two strings, using // the given costs for each edit operation. It returns the distance along with // the lengths of the longest common prefix and suffix. // // If maxCost is non-zero, the calculation stops as soon as the distance is determined // to be greater than maxCost. Therefore, any return value higher than maxCost is a // lower bound for the actual distance. func Calculate(str1, str2 []rune, maxCost, insCost, subCost, delCost int) (dist, prefixLen, suffixLen int) { l1, l2 := len(str1), len(str2) // trim common prefix, if any, as it doesn't affect the distance for ; prefixLen < l1 && prefixLen < l2; prefixLen++ { if str1[prefixLen] != str2[prefixLen] { break } } str1, str2 = str1[prefixLen:], str2[prefixLen:] l1 -= prefixLen l2 -= prefixLen // trim common suffix, if any, as it doesn't affect the distance for 0 < l1 && 0 < l2 { if str1[l1-1] != str2[l2-1] { str1, str2 = str1[:l1], str2[:l2] break } l1-- l2-- suffixLen++ } // if the first string is empty, the distance is the length of the second string times the cost of insertion if l1 == 0 { dist = l2 * insCost return } // if the second string is empty, the distance is the length of the first string times the cost of deletion if l2 == 0 { dist = l1 * delCost return } // variables used in inner "for" loops var y, dy, c, l int // if maxCost is greater than or equal to the maximum possible distance, it's equivalent to 'unlimited' if maxCost > 0 { if subCost < delCost+insCost { if maxCost >= l1*subCost+(l2-l1)*insCost { maxCost = 0 } } else { if maxCost >= l1*delCost+l2*insCost { maxCost = 0 } } } if maxCost > 0 { // prefer the longer string first, to minimize time; // a swap also transposes the meanings of insertion and deletion. if l1 < l2 { str1, str2, l1, l2, insCost, delCost = str2, str1, l2, l1, delCost, insCost } // the length differential times cost of deletion is a lower bound for the cost; // if it is higher than the maxCost, there is no point going into the main calculation. if dist = (l1 - l2) * delCost; dist > maxCost { return } d := make([]int, l1+1) // offset and length of d in the current row doff, dlen := 0, 1 for y, dy = 1, delCost; y <= l1 && dy <= maxCost; dlen++ { d[y] = dy y++ dy = y * delCost } // fmt.Printf("%q -> %q: init doff=%d dlen=%d d[%d:%d]=%v\n", str1, str2, doff, dlen, doff, doff+dlen, d[doff:doff+dlen]) for x := 0; x < l2; x++ { dy, d[doff] = d[doff], d[doff]+insCost for doff < l1 && d[doff] > maxCost && dlen > 0 { if str1[doff] != str2[x] { dy += subCost } doff++ dlen-- if c = d[doff] + insCost; c < dy { dy = c } dy, d[doff] = d[doff], dy } for y, l = doff, doff+dlen-1; y < l; dy, d[y] = d[y], dy { if str1[y] != str2[x] { dy += subCost } if c = d[y] + delCost; c < dy { dy = c } y++ if c = d[y] + insCost; c < dy { dy = c } } if y < l1 { if str1[y] != str2[x] { dy += subCost } if c = d[y] + delCost; c < dy { dy = c } for ; dy <= maxCost && y < l1; dy, d[y] = dy+delCost, dy { y++ dlen++ } } // fmt.Printf("%q -> %q: x=%d doff=%d dlen=%d d[%d:%d]=%v\n", str1, str2, x, doff, dlen, doff, doff+dlen, d[doff:doff+dlen]) if dlen == 0 { dist = maxCost + 1 return } } if doff+dlen-1 < l1 { dist = maxCost + 1 return } dist = d[l1] } else { // ToDo: This is O(l1*l2) time and O(min(l1,l2)) space; investigate if it is // worth to implement diagonal approach - O(l1*(1+dist)) time, up to O(l1*l2) space // http://www.csse.monash.edu.au/~lloyd/tildeStrings/Alignment/92.IPL.html // prefer the shorter string first, to minimize space; time is O(l1*l2) anyway; // a swap also transposes the meanings of insertion and deletion. if l1 > l2 { str1, str2, l1, l2, insCost, delCost = str2, str1, l2, l1, delCost, insCost } d := make([]int, l1+1) for y = 1; y <= l1; y++ { d[y] = y * delCost } for x := 0; x < l2; x++ { dy, d[0] = d[0], d[0]+insCost for y = 0; y < l1; dy, d[y] = d[y], dy { if str1[y] != str2[x] { dy += subCost } if c = d[y] + delCost; c < dy { dy = c } y++ if c = d[y] + insCost; c < dy { dy = c } } } dist = d[l1] } return } // Distance returns the Levenshtein distance between str1 and str2, using the // default or provided cost values. Pass nil for the third argument to use the // default cost of 1 for all three operations, with no maximum. func Distance(str1, str2 string, p *Params) int { if p == nil { p = defaultParams } dist, _, _ := Calculate([]rune(str1), []rune(str2), p.maxCost, p.insCost, p.subCost, p.delCost) return dist } // Similarity returns a score in the range of 0..1 for how similar the two strings are. // A score of 1 means the strings are identical, and 0 means they have nothing in common. // // A nil third argument uses the default cost of 1 for all three operations. // // If a non-zero MinScore value is provided in the parameters, scores lower than it // will be returned as 0. func Similarity(str1, str2 string, p *Params) float64 { return Match(str1, str2, p.Clone().BonusThreshold(1.1)) // guaranteed no bonus } // Match returns a similarity score adjusted by the same method as proposed by Winkler for // the Jaro distance - giving a bonus to string pairs that share a common prefix, only if their // similarity score is already over a threshold. // // The score is in the range of 0..1, with 1 meaning the strings are identical, // and 0 meaning they have nothing in common. // // A nil third argument uses the default cost of 1 for all three operations, maximum length of // common prefix to consider for bonus of 4, scaling factor of 0.1, and bonus threshold of 0.7. // // If a non-zero MinScore value is provided in the parameters, scores lower than it // will be returned as 0. func Match(str1, str2 string, p *Params) float64 { s1, s2 := []rune(str1), []rune(str2) l1, l2 := len(s1), len(s2) // two empty strings are identical; shortcut also avoids divByZero issues later on. if l1 == 0 && l2 == 0 { return 1 } if p == nil { p = defaultParams } // a min over 1 can never be satisfied, so the score is 0. if p.minScore > 1 { return 0 } insCost, delCost, maxDist, max := p.insCost, p.delCost, 0, 0 if l1 > l2 { l1, l2, insCost, delCost = l2, l1, delCost, insCost } if p.subCost < delCost+insCost { maxDist = l1*p.subCost + (l2-l1)*insCost } else { maxDist = l1*delCost + l2*insCost } // a zero min is always satisfied, so no need to set a max cost. if p.minScore > 0 { // if p.minScore is lower than p.bonusThreshold, we can use a simplified formula // for the max cost, because a sim score below min cannot receive a bonus. if p.minScore < p.bonusThreshold { // round down the max - a cost equal to a rounded up max would already be under min. max = int((1 - p.minScore) * float64(maxDist)) } else { // p.minScore <= sim + p.bonusPrefix*p.bonusScale*(1-sim) // p.minScore <= (1-dist/maxDist) + p.bonusPrefix*p.bonusScale*(1-(1-dist/maxDist)) // p.minScore <= 1 - dist/maxDist + p.bonusPrefix*p.bonusScale*dist/maxDist // 1 - p.minScore >= dist/maxDist - p.bonusPrefix*p.bonusScale*dist/maxDist // (1-p.minScore)*maxDist/(1-p.bonusPrefix*p.bonusScale) >= dist max = int((1 - p.minScore) * float64(maxDist) / (1 - float64(p.bonusPrefix)*p.bonusScale)) } } dist, pl, _ := Calculate(s1, s2, max, p.insCost, p.subCost, p.delCost) if max > 0 && dist > max { return 0 } sim := 1 - float64(dist)/float64(maxDist) if sim >= p.bonusThreshold && sim < 1 && p.bonusPrefix > 0 && p.bonusScale > 0 { if pl > p.bonusPrefix { pl = p.bonusPrefix } sim += float64(pl) * p.bonusScale * (1 - sim) } if sim < p.minScore { return 0 } return sim } ================================================ FILE: vendor/github.com/agext/levenshtein/params.go ================================================ // Copyright 2016 ALRUX Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package levenshtein // Params represents a set of parameter values for the various formulas involved // in the calculation of the Levenshtein string metrics. type Params struct { insCost int subCost int delCost int maxCost int minScore float64 bonusPrefix int bonusScale float64 bonusThreshold float64 } var ( defaultParams = NewParams() ) // NewParams creates a new set of parameters and initializes it with the default values. func NewParams() *Params { return &Params{ insCost: 1, subCost: 1, delCost: 1, maxCost: 0, minScore: 0, bonusPrefix: 4, bonusScale: .1, bonusThreshold: .7, } } // Clone returns a pointer to a copy of the receiver parameter set, or of a new // default parameter set if the receiver is nil. func (p *Params) Clone() *Params { if p == nil { return NewParams() } return &Params{ insCost: p.insCost, subCost: p.subCost, delCost: p.delCost, maxCost: p.maxCost, minScore: p.minScore, bonusPrefix: p.bonusPrefix, bonusScale: p.bonusScale, bonusThreshold: p.bonusThreshold, } } // InsCost overrides the default value of 1 for the cost of insertion. // The new value must be zero or positive. func (p *Params) InsCost(v int) *Params { if v >= 0 { p.insCost = v } return p } // SubCost overrides the default value of 1 for the cost of substitution. // The new value must be zero or positive. func (p *Params) SubCost(v int) *Params { if v >= 0 { p.subCost = v } return p } // DelCost overrides the default value of 1 for the cost of deletion. // The new value must be zero or positive. func (p *Params) DelCost(v int) *Params { if v >= 0 { p.delCost = v } return p } // MaxCost overrides the default value of 0 (meaning unlimited) for the maximum cost. // The calculation of Distance() stops when the result is guaranteed to exceed // this maximum, returning a lower-bound rather than exact value. // The new value must be zero or positive. func (p *Params) MaxCost(v int) *Params { if v >= 0 { p.maxCost = v } return p } // MinScore overrides the default value of 0 for the minimum similarity score. // Scores below this threshold are returned as 0 by Similarity() and Match(). // The new value must be zero or positive. Note that a minimum greater than 1 // can never be satisfied, resulting in a score of 0 for any pair of strings. func (p *Params) MinScore(v float64) *Params { if v >= 0 { p.minScore = v } return p } // BonusPrefix overrides the default value for the maximum length of // common prefix to be considered for bonus by Match(). // The new value must be zero or positive. func (p *Params) BonusPrefix(v int) *Params { if v >= 0 { p.bonusPrefix = v } return p } // BonusScale overrides the default value for the scaling factor used by Match() // in calculating the bonus. // The new value must be zero or positive. To guarantee that the similarity score // remains in the interval 0..1, this scaling factor is not allowed to exceed // 1 / BonusPrefix. func (p *Params) BonusScale(v float64) *Params { if v >= 0 { p.bonusScale = v } // the bonus cannot exceed (1-sim), or the score may become greater than 1. if float64(p.bonusPrefix)*p.bonusScale > 1 { p.bonusScale = 1 / float64(p.bonusPrefix) } return p } // BonusThreshold overrides the default value for the minimum similarity score // for which Match() can assign a bonus. // The new value must be zero or positive. Note that a threshold greater than 1 // effectively makes Match() become the equivalent of Similarity(). func (p *Params) BonusThreshold(v float64) *Params { if v >= 0 { p.bonusThreshold = v } return p } ================================================ FILE: vendor/github.com/agext/levenshtein/test.sh ================================================ set -ev if [[ "$1" == "goveralls" ]]; then echo "Testing with goveralls..." go get github.com/mattn/goveralls $HOME/gopath/bin/goveralls -service=travis-ci else echo "Testing with go test..." go test -v ./... fi ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/NOTICE.txt ================================================ AWS SDK for Go Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Copyright 2014-2015 Stripe, Inc. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/accountid_endpoint_mode.go ================================================ package aws // AccountIDEndpointMode controls how a resolved AWS account ID is handled for endpoint routing. type AccountIDEndpointMode string const ( // AccountIDEndpointModeUnset indicates the AWS account ID will not be used for endpoint routing AccountIDEndpointModeUnset AccountIDEndpointMode = "" // AccountIDEndpointModePreferred indicates the AWS account ID will be used for endpoint routing if present AccountIDEndpointModePreferred = "preferred" // AccountIDEndpointModeRequired indicates an error will be returned if the AWS account ID is not resolved from identity AccountIDEndpointModeRequired = "required" // AccountIDEndpointModeDisabled indicates the AWS account ID will be ignored during endpoint routing AccountIDEndpointModeDisabled = "disabled" ) ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/arn/arn.go ================================================ // Package arn provides a parser for interacting with Amazon Resource Names. package arn import ( "errors" "strings" ) const ( arnDelimiter = ":" arnSections = 6 arnPrefix = "arn:" // zero-indexed sectionPartition = 1 sectionService = 2 sectionRegion = 3 sectionAccountID = 4 sectionResource = 5 // errors invalidPrefix = "arn: invalid prefix" invalidSections = "arn: not enough sections" ) // ARN captures the individual fields of an Amazon Resource Name. // See http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html for more information. type ARN struct { // The partition that the resource is in. For standard AWS regions, the partition is "aws". If you have resources in // other partitions, the partition is "aws-partitionname". For example, the partition for resources in the China // (Beijing) region is "aws-cn". Partition string // The service namespace that identifies the AWS product (for example, Amazon S3, IAM, or Amazon RDS). For a list of // namespaces, see // http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces. Service string // The region the resource resides in. Note that the ARNs for some resources do not require a region, so this // component might be omitted. Region string // The ID of the AWS account that owns the resource, without the hyphens. For example, 123456789012. Note that the // ARNs for some resources don't require an account number, so this component might be omitted. AccountID string // The content of this part of the ARN varies by service. It often includes an indicator of the type of resource — // for example, an IAM user or Amazon RDS database - followed by a slash (/) or a colon (:), followed by the // resource name itself. Some services allows paths for resource names, as described in // http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arns-paths. Resource string } // Parse parses an ARN into its constituent parts. // // Some example ARNs: // arn:aws:elasticbeanstalk:us-east-1:123456789012:environment/My App/MyEnvironment // arn:aws:iam::123456789012:user/David // arn:aws:rds:eu-west-1:123456789012:db:mysql-db // arn:aws:s3:::my_corporate_bucket/exampleobject.png func Parse(arn string) (ARN, error) { if !strings.HasPrefix(arn, arnPrefix) { return ARN{}, errors.New(invalidPrefix) } sections := strings.SplitN(arn, arnDelimiter, arnSections) if len(sections) != arnSections { return ARN{}, errors.New(invalidSections) } return ARN{ Partition: sections[sectionPartition], Service: sections[sectionService], Region: sections[sectionRegion], AccountID: sections[sectionAccountID], Resource: sections[sectionResource], }, nil } // IsARN returns whether the given string is an arn // by looking for whether the string starts with arn: func IsARN(arn string) bool { return strings.HasPrefix(arn, arnPrefix) && strings.Count(arn, ":") >= arnSections-1 } // String returns the canonical representation of the ARN func (arn ARN) String() string { return arnPrefix + arn.Partition + arnDelimiter + arn.Service + arnDelimiter + arn.Region + arnDelimiter + arn.AccountID + arnDelimiter + arn.Resource } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/checksum.go ================================================ package aws // RequestChecksumCalculation controls request checksum calculation workflow type RequestChecksumCalculation int const ( // RequestChecksumCalculationUnset is the unset value for RequestChecksumCalculation RequestChecksumCalculationUnset RequestChecksumCalculation = iota // RequestChecksumCalculationWhenSupported indicates request checksum will be calculated // if the operation supports input checksums RequestChecksumCalculationWhenSupported // RequestChecksumCalculationWhenRequired indicates request checksum will be calculated // if required by the operation or if user elects to set a checksum algorithm in request RequestChecksumCalculationWhenRequired ) // ResponseChecksumValidation controls response checksum validation workflow type ResponseChecksumValidation int const ( // ResponseChecksumValidationUnset is the unset value for ResponseChecksumValidation ResponseChecksumValidationUnset ResponseChecksumValidation = iota // ResponseChecksumValidationWhenSupported indicates response checksum will be validated // if the operation supports output checksums ResponseChecksumValidationWhenSupported // ResponseChecksumValidationWhenRequired indicates response checksum will only // be validated if the operation requires output checksum validation ResponseChecksumValidationWhenRequired ) ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/config.go ================================================ package aws import ( "net/http" smithybearer "github.com/aws/smithy-go/auth/bearer" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/middleware" ) // HTTPClient provides the interface to provide custom HTTPClients. Generally // *http.Client is sufficient for most use cases. The HTTPClient should not // follow 301 or 302 redirects. type HTTPClient interface { Do(*http.Request) (*http.Response, error) } // A Config provides service configuration for service clients. type Config struct { // The region to send requests to. This parameter is required and must // be configured globally or on a per-client basis unless otherwise // noted. A full list of regions is found in the "Regions and Endpoints" // document. // // See http://docs.aws.amazon.com/general/latest/gr/rande.html for // information on AWS regions. Region string // The credentials object to use when signing requests. // Use the LoadDefaultConfig to load configuration from all the SDK's supported // sources, and resolve credentials using the SDK's default credential chain. Credentials CredentialsProvider // The Bearer Authentication token provider to use for authenticating API // operation calls with a Bearer Authentication token. The API clients and // operation must support Bearer Authentication scheme in order for the // token provider to be used. API clients created with NewFromConfig will // automatically be configured with this option, if the API client support // Bearer Authentication. // // The SDK's config.LoadDefaultConfig can automatically populate this // option for external configuration options such as SSO session. // https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html BearerAuthTokenProvider smithybearer.TokenProvider // The HTTP Client the SDK's API clients will use to invoke HTTP requests. // The SDK defaults to a BuildableClient allowing API clients to create // copies of the HTTP Client for service specific customizations. // // Use a (*http.Client) for custom behavior. Using a custom http.Client // will prevent the SDK from modifying the HTTP client. HTTPClient HTTPClient // An endpoint resolver that can be used to provide or override an endpoint // for the given service and region. // // See the `aws.EndpointResolver` documentation for additional usage // information. // // Deprecated: See Config.EndpointResolverWithOptions EndpointResolver EndpointResolver // An endpoint resolver that can be used to provide or override an endpoint // for the given service and region. // // When EndpointResolverWithOptions is specified, it will be used by a // service client rather than using EndpointResolver if also specified. // // See the `aws.EndpointResolverWithOptions` documentation for additional // usage information. // // Deprecated: with the release of endpoint resolution v2 in API clients, // EndpointResolver and EndpointResolverWithOptions are deprecated. // Providing a value for this field will likely prevent you from using // newer endpoint-related service features. See API client options // EndpointResolverV2 and BaseEndpoint. EndpointResolverWithOptions EndpointResolverWithOptions // RetryMaxAttempts specifies the maximum number attempts an API client // will call an operation that fails with a retryable error. // // API Clients will only use this value to construct a retryer if the // Config.Retryer member is not nil. This value will be ignored if // Retryer is not nil. RetryMaxAttempts int // RetryMode specifies the retry model the API client will be created with. // // API Clients will only use this value to construct a retryer if the // Config.Retryer member is not nil. This value will be ignored if // Retryer is not nil. RetryMode RetryMode // Retryer is a function that provides a Retryer implementation. A Retryer // guides how HTTP requests should be retried in case of recoverable // failures. When nil the API client will use a default retryer. // // In general, the provider function should return a new instance of a // Retryer if you are attempting to provide a consistent Retryer // configuration across all clients. This will ensure that each client will // be provided a new instance of the Retryer implementation, and will avoid // issues such as sharing the same retry token bucket across services. // // If not nil, RetryMaxAttempts, and RetryMode will be ignored by API // clients. Retryer func() Retryer // ConfigSources are the sources that were used to construct the Config. // Allows for additional configuration to be loaded by clients. ConfigSources []interface{} // APIOptions provides the set of middleware mutations modify how the API // client requests will be handled. This is useful for adding additional // tracing data to a request, or changing behavior of the SDK's client. APIOptions []func(*middleware.Stack) error // The logger writer interface to write logging messages to. Defaults to // standard error. Logger logging.Logger // Configures the events that will be sent to the configured logger. This // can be used to configure the logging of signing, retries, request, and // responses of the SDK clients. // // See the ClientLogMode type documentation for the complete set of logging // modes and available configuration. ClientLogMode ClientLogMode // The configured DefaultsMode. If not specified, service clients will // default to legacy. // // Supported modes are: auto, cross-region, in-region, legacy, mobile, // standard DefaultsMode DefaultsMode // The RuntimeEnvironment configuration, only populated if the DefaultsMode // is set to DefaultsModeAuto and is initialized by // `config.LoadDefaultConfig`. You should not populate this structure // programmatically, or rely on the values here within your applications. RuntimeEnvironment RuntimeEnvironment // AppId is an optional application specific identifier that can be set. // When set it will be appended to the User-Agent header of every request // in the form of App/{AppId}. This variable is sourced from environment // variable AWS_SDK_UA_APP_ID or the shared config profile attribute sdk_ua_app_id. // See https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html for // more information on environment variables and shared config settings. AppID string // BaseEndpoint is an intermediary transfer location to a service specific // BaseEndpoint on a service's Options. BaseEndpoint *string // DisableRequestCompression toggles if an operation request could be // compressed or not. Will be set to false by default. This variable is sourced from // environment variable AWS_DISABLE_REQUEST_COMPRESSION or the shared config profile attribute // disable_request_compression DisableRequestCompression bool // RequestMinCompressSizeBytes sets the inclusive min bytes of a request body that could be // compressed. Will be set to 10240 by default and must be within 0 and 10485760 bytes inclusively. // This variable is sourced from environment variable AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES or // the shared config profile attribute request_min_compression_size_bytes RequestMinCompressSizeBytes int64 // Controls how a resolved AWS account ID is handled for endpoint routing. AccountIDEndpointMode AccountIDEndpointMode // RequestChecksumCalculation determines when request checksum calculation is performed. // // There are two possible values for this setting: // // 1. RequestChecksumCalculationWhenSupported (default): The checksum is always calculated // if the operation supports it, regardless of whether the user sets an algorithm in the request. // // 2. RequestChecksumCalculationWhenRequired: The checksum is only calculated if the user // explicitly sets a checksum algorithm in the request. // // This setting is sourced from the environment variable AWS_REQUEST_CHECKSUM_CALCULATION // or the shared config profile attribute "request_checksum_calculation". RequestChecksumCalculation RequestChecksumCalculation // ResponseChecksumValidation determines when response checksum validation is performed // // There are two possible values for this setting: // // 1. ResponseChecksumValidationWhenSupported (default): The checksum is always validated // if the operation supports it, regardless of whether the user sets the validation mode to ENABLED in request. // // 2. ResponseChecksumValidationWhenRequired: The checksum is only validated if the user // explicitly sets the validation mode to ENABLED in the request // This variable is sourced from environment variable AWS_RESPONSE_CHECKSUM_VALIDATION or // the shared config profile attribute "response_checksum_validation". ResponseChecksumValidation ResponseChecksumValidation } // NewConfig returns a new Config pointer that can be chained with builder // methods to set multiple configuration values inline without using pointers. func NewConfig() *Config { return &Config{} } // Copy will return a shallow copy of the Config object. func (c Config) Copy() Config { cp := c return cp } // EndpointDiscoveryEnableState indicates if endpoint discovery is // enabled, disabled, auto or unset state. // // Default behavior (Auto or Unset) indicates operations that require endpoint // discovery will use Endpoint Discovery by default. Operations that // optionally use Endpoint Discovery will not use Endpoint Discovery // unless EndpointDiscovery is explicitly enabled. type EndpointDiscoveryEnableState uint // Enumeration values for EndpointDiscoveryEnableState const ( // EndpointDiscoveryUnset represents EndpointDiscoveryEnableState is unset. // Users do not need to use this value explicitly. The behavior for unset // is the same as for EndpointDiscoveryAuto. EndpointDiscoveryUnset EndpointDiscoveryEnableState = iota // EndpointDiscoveryAuto represents an AUTO state that allows endpoint // discovery only when required by the api. This is the default // configuration resolved by the client if endpoint discovery is neither // enabled or disabled. EndpointDiscoveryAuto // default state // EndpointDiscoveryDisabled indicates client MUST not perform endpoint // discovery even when required. EndpointDiscoveryDisabled // EndpointDiscoveryEnabled indicates client MUST always perform endpoint // discovery if supported for the operation. EndpointDiscoveryEnabled ) ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/context.go ================================================ package aws import ( "context" "time" ) type suppressedContext struct { context.Context } func (s *suppressedContext) Deadline() (deadline time.Time, ok bool) { return time.Time{}, false } func (s *suppressedContext) Done() <-chan struct{} { return nil } func (s *suppressedContext) Err() error { return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go ================================================ package aws import ( "context" "fmt" "sync/atomic" "time" sdkrand "github.com/aws/aws-sdk-go-v2/internal/rand" "github.com/aws/aws-sdk-go-v2/internal/sync/singleflight" ) // CredentialsCacheOptions are the options type CredentialsCacheOptions struct { // ExpiryWindow will allow the credentials to trigger refreshing prior to // the credentials actually expiring. This is beneficial so race conditions // with expiring credentials do not cause request to fail unexpectedly // due to ExpiredTokenException exceptions. // // An ExpiryWindow of 10s would cause calls to IsExpired() to return true // 10 seconds before the credentials are actually expired. This can cause an // increased number of requests to refresh the credentials to occur. // // If ExpiryWindow is 0 or less it will be ignored. ExpiryWindow time.Duration // ExpiryWindowJitterFrac provides a mechanism for randomizing the // expiration of credentials within the configured ExpiryWindow by a random // percentage. Valid values are between 0.0 and 1.0. // // As an example if ExpiryWindow is 60 seconds and ExpiryWindowJitterFrac // is 0.5 then credentials will be set to expire between 30 to 60 seconds // prior to their actual expiration time. // // If ExpiryWindow is 0 or less then ExpiryWindowJitterFrac is ignored. // If ExpiryWindowJitterFrac is 0 then no randomization will be applied to the window. // If ExpiryWindowJitterFrac < 0 the value will be treated as 0. // If ExpiryWindowJitterFrac > 1 the value will be treated as 1. ExpiryWindowJitterFrac float64 } // CredentialsCache provides caching and concurrency safe credentials retrieval // via the provider's retrieve method. // // CredentialsCache will look for optional interfaces on the Provider to adjust // how the credential cache handles credentials caching. // // - HandleFailRefreshCredentialsCacheStrategy - Allows provider to handle // credential refresh failures. This could return an updated Credentials // value, or attempt another means of retrieving credentials. // // - AdjustExpiresByCredentialsCacheStrategy - Allows provider to adjust how // credentials Expires is modified. This could modify how the Credentials // Expires is adjusted based on the CredentialsCache ExpiryWindow option. // Such as providing a floor not to reduce the Expires below. type CredentialsCache struct { provider CredentialsProvider options CredentialsCacheOptions creds atomic.Value sf singleflight.Group } // NewCredentialsCache returns a CredentialsCache that wraps provider. Provider // is expected to not be nil. A variadic list of one or more functions can be // provided to modify the CredentialsCache configuration. This allows for // configuration of credential expiry window and jitter. func NewCredentialsCache(provider CredentialsProvider, optFns ...func(options *CredentialsCacheOptions)) *CredentialsCache { options := CredentialsCacheOptions{} for _, fn := range optFns { fn(&options) } if options.ExpiryWindow < 0 { options.ExpiryWindow = 0 } if options.ExpiryWindowJitterFrac < 0 { options.ExpiryWindowJitterFrac = 0 } else if options.ExpiryWindowJitterFrac > 1 { options.ExpiryWindowJitterFrac = 1 } return &CredentialsCache{ provider: provider, options: options, } } // Retrieve returns the credentials. If the credentials have already been // retrieved, and not expired the cached credentials will be returned. If the // credentials have not been retrieved yet, or expired the provider's Retrieve // method will be called. // // Returns and error if the provider's retrieve method returns an error. func (p *CredentialsCache) Retrieve(ctx context.Context) (Credentials, error) { if creds, ok := p.getCreds(); ok && !creds.Expired() { return creds, nil } resCh := p.sf.DoChan("", func() (interface{}, error) { return p.singleRetrieve(&suppressedContext{ctx}) }) select { case res := <-resCh: return res.Val.(Credentials), res.Err case <-ctx.Done(): return Credentials{}, &RequestCanceledError{Err: ctx.Err()} } } func (p *CredentialsCache) singleRetrieve(ctx context.Context) (interface{}, error) { currCreds, ok := p.getCreds() if ok && !currCreds.Expired() { return currCreds, nil } newCreds, err := p.provider.Retrieve(ctx) if err != nil { handleFailToRefresh := defaultHandleFailToRefresh if cs, ok := p.provider.(HandleFailRefreshCredentialsCacheStrategy); ok { handleFailToRefresh = cs.HandleFailToRefresh } newCreds, err = handleFailToRefresh(ctx, currCreds, err) if err != nil { return Credentials{}, fmt.Errorf("failed to refresh cached credentials, %w", err) } } if newCreds.CanExpire && p.options.ExpiryWindow > 0 { adjustExpiresBy := defaultAdjustExpiresBy if cs, ok := p.provider.(AdjustExpiresByCredentialsCacheStrategy); ok { adjustExpiresBy = cs.AdjustExpiresBy } randFloat64, err := sdkrand.CryptoRandFloat64() if err != nil { return Credentials{}, fmt.Errorf("failed to get random provider, %w", err) } var jitter time.Duration if p.options.ExpiryWindowJitterFrac > 0 { jitter = time.Duration(randFloat64 * p.options.ExpiryWindowJitterFrac * float64(p.options.ExpiryWindow)) } newCreds, err = adjustExpiresBy(newCreds, -(p.options.ExpiryWindow - jitter)) if err != nil { return Credentials{}, fmt.Errorf("failed to adjust credentials expires, %w", err) } } p.creds.Store(&newCreds) return newCreds, nil } // getCreds returns the currently stored credentials and true. Returning false // if no credentials were stored. func (p *CredentialsCache) getCreds() (Credentials, bool) { v := p.creds.Load() if v == nil { return Credentials{}, false } c := v.(*Credentials) if c == nil || !c.HasKeys() { return Credentials{}, false } return *c, true } // ProviderSources returns a list of where the underlying credential provider // has been sourced, if available. Returns empty if the provider doesn't implement // the interface func (p *CredentialsCache) ProviderSources() []CredentialSource { asSource, ok := p.provider.(CredentialProviderSource) if !ok { return []CredentialSource{} } return asSource.ProviderSources() } // Invalidate will invalidate the cached credentials. The next call to Retrieve // will cause the provider's Retrieve method to be called. func (p *CredentialsCache) Invalidate() { p.creds.Store((*Credentials)(nil)) } // IsCredentialsProvider returns whether credential provider wrapped by CredentialsCache // matches the target provider type. func (p *CredentialsCache) IsCredentialsProvider(target CredentialsProvider) bool { return IsCredentialsProvider(p.provider, target) } // HandleFailRefreshCredentialsCacheStrategy is an interface for // CredentialsCache to allow CredentialsProvider how failed to refresh // credentials is handled. type HandleFailRefreshCredentialsCacheStrategy interface { // Given the previously cached Credentials, if any, and refresh error, may // returns new or modified set of Credentials, or error. // // Credential caches may use default implementation if nil. HandleFailToRefresh(context.Context, Credentials, error) (Credentials, error) } // defaultHandleFailToRefresh returns the passed in error. func defaultHandleFailToRefresh(ctx context.Context, _ Credentials, err error) (Credentials, error) { return Credentials{}, err } // AdjustExpiresByCredentialsCacheStrategy is an interface for CredentialCache // to allow CredentialsProvider to intercept adjustments to Credentials expiry // based on expectations and use cases of CredentialsProvider. // // Credential caches may use default implementation if nil. type AdjustExpiresByCredentialsCacheStrategy interface { // Given a Credentials as input, applying any mutations and // returning the potentially updated Credentials, or error. AdjustExpiresBy(Credentials, time.Duration) (Credentials, error) } // defaultAdjustExpiresBy adds the duration to the passed in credentials Expires, // and returns the updated credentials value. If Credentials value's CanExpire // is false, the passed in credentials are returned unchanged. func defaultAdjustExpiresBy(creds Credentials, dur time.Duration) (Credentials, error) { if !creds.CanExpire { return creds, nil } creds.Expires = creds.Expires.Add(dur) return creds, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go ================================================ package aws import ( "context" "fmt" "reflect" "time" "github.com/aws/aws-sdk-go-v2/internal/sdk" ) // AnonymousCredentials provides a sentinel CredentialsProvider that should be // used to instruct the SDK's signing middleware to not sign the request. // // Using `nil` credentials when configuring an API client will achieve the same // result. The AnonymousCredentials type allows you to configure the SDK's // external config loading to not attempt to source credentials from the shared // config or environment. // // For example you can use this CredentialsProvider with an API client's // Options to instruct the client not to sign a request for accessing public // S3 bucket objects. // // The following example demonstrates using the AnonymousCredentials to prevent // SDK's external config loading attempt to resolve credentials. // // cfg, err := config.LoadDefaultConfig(context.TODO(), // config.WithCredentialsProvider(aws.AnonymousCredentials{}), // ) // if err != nil { // log.Fatalf("failed to load config, %v", err) // } // // client := s3.NewFromConfig(cfg) // // Alternatively you can leave the API client Option's `Credential` member to // nil. If using the `NewFromConfig` constructor you'll need to explicitly set // the `Credentials` member to nil, if the external config resolved a // credential provider. // // client := s3.New(s3.Options{ // // Credentials defaults to a nil value. // }) // // This can also be configured for specific operations calls too. // // cfg, err := config.LoadDefaultConfig(context.TODO()) // if err != nil { // log.Fatalf("failed to load config, %v", err) // } // // client := s3.NewFromConfig(config) // // result, err := client.GetObject(context.TODO(), s3.GetObject{ // Bucket: aws.String("example-bucket"), // Key: aws.String("example-key"), // }, func(o *s3.Options) { // o.Credentials = nil // // Or // o.Credentials = aws.AnonymousCredentials{} // }) type AnonymousCredentials struct{} // Retrieve implements the CredentialsProvider interface, but will always // return error, and cannot be used to sign a request. The AnonymousCredentials // type is used as a sentinel type instructing the AWS request signing // middleware to not sign a request. func (AnonymousCredentials) Retrieve(context.Context) (Credentials, error) { return Credentials{Source: "AnonymousCredentials"}, fmt.Errorf("the AnonymousCredentials is not a valid credential provider, and cannot be used to sign AWS requests with") } // CredentialSource is the source of the credential provider. // A provider can have multiple credential sources: For example, a provider that reads a profile, calls ECS to // get credentials and then assumes a role using STS will have all these as part of its provider chain. type CredentialSource int const ( // CredentialSourceUndefined is the sentinel zero value CredentialSourceUndefined CredentialSource = iota // CredentialSourceCode credentials resolved from code, cli parameters, session object, or client instance CredentialSourceCode // CredentialSourceEnvVars credentials resolved from environment variables CredentialSourceEnvVars // CredentialSourceEnvVarsSTSWebIDToken credentials resolved from environment variables for assuming a role with STS using a web identity token CredentialSourceEnvVarsSTSWebIDToken // CredentialSourceSTSAssumeRole credentials resolved from STS using AssumeRole CredentialSourceSTSAssumeRole // CredentialSourceSTSAssumeRoleSaml credentials resolved from STS using assume role with SAML CredentialSourceSTSAssumeRoleSaml // CredentialSourceSTSAssumeRoleWebID credentials resolved from STS using assume role with web identity CredentialSourceSTSAssumeRoleWebID // CredentialSourceSTSFederationToken credentials resolved from STS using a federation token CredentialSourceSTSFederationToken // CredentialSourceSTSSessionToken credentials resolved from STS using a session token S CredentialSourceSTSSessionToken // CredentialSourceProfile credentials resolved from a config file(s) profile with static credentials CredentialSourceProfile // CredentialSourceProfileSourceProfile credentials resolved from a source profile in a config file(s) profile CredentialSourceProfileSourceProfile // CredentialSourceProfileNamedProvider credentials resolved from a named provider in a config file(s) profile (like EcsContainer) CredentialSourceProfileNamedProvider // CredentialSourceProfileSTSWebIDToken credentials resolved from configuration for assuming a role with STS using web identity token in a config file(s) profile CredentialSourceProfileSTSWebIDToken // CredentialSourceProfileSSO credentials resolved from an SSO session in a config file(s) profile CredentialSourceProfileSSO // CredentialSourceSSO credentials resolved from an SSO session CredentialSourceSSO // CredentialSourceProfileSSOLegacy credentials resolved from an SSO session in a config file(s) profile using legacy format CredentialSourceProfileSSOLegacy // CredentialSourceSSOLegacy credentials resolved from an SSO session using legacy format CredentialSourceSSOLegacy // CredentialSourceProfileProcess credentials resolved from a process in a config file(s) profile CredentialSourceProfileProcess // CredentialSourceProcess credentials resolved from a process CredentialSourceProcess // CredentialSourceHTTP credentials resolved from an HTTP endpoint CredentialSourceHTTP // CredentialSourceIMDS credentials resolved from the instance metadata service (IMDS) CredentialSourceIMDS ) // A Credentials is the AWS credentials value for individual credential fields. type Credentials struct { // AWS Access key ID AccessKeyID string // AWS Secret Access Key SecretAccessKey string // AWS Session Token SessionToken string // Source of the credentials Source string // States if the credentials can expire or not. CanExpire bool // The time the credentials will expire at. Should be ignored if CanExpire // is false. Expires time.Time // The ID of the account for the credentials. AccountID string } // Expired returns if the credentials have expired. func (v Credentials) Expired() bool { if v.CanExpire { // Calling Round(0) on the current time will truncate the monotonic // reading only. Ensures credential expiry time is always based on // reported wall-clock time. return !v.Expires.After(sdk.NowTime().Round(0)) } return false } // HasKeys returns if the credentials keys are set. func (v Credentials) HasKeys() bool { return len(v.AccessKeyID) > 0 && len(v.SecretAccessKey) > 0 } // A CredentialsProvider is the interface for any component which will provide // credentials Credentials. A CredentialsProvider is required to manage its own // Expired state, and what to be expired means. // // A credentials provider implementation can be wrapped with a CredentialCache // to cache the credential value retrieved. Without the cache the SDK will // attempt to retrieve the credentials for every request. type CredentialsProvider interface { // Retrieve returns nil if it successfully retrieved the value. // Error is returned if the value were not obtainable, or empty. Retrieve(ctx context.Context) (Credentials, error) } // CredentialProviderSource allows any credential provider to track // all providers where a credential provider were sourced. For example, if the credentials came from a // call to a role specified in the profile, this method will give the whole breadcrumb trail type CredentialProviderSource interface { ProviderSources() []CredentialSource } // CredentialsProviderFunc provides a helper wrapping a function value to // satisfy the CredentialsProvider interface. type CredentialsProviderFunc func(context.Context) (Credentials, error) // Retrieve delegates to the function value the CredentialsProviderFunc wraps. func (fn CredentialsProviderFunc) Retrieve(ctx context.Context) (Credentials, error) { return fn(ctx) } type isCredentialsProvider interface { IsCredentialsProvider(CredentialsProvider) bool } // IsCredentialsProvider returns whether the target CredentialProvider is the same type as provider when comparing the // implementation type. // // If provider has a method IsCredentialsProvider(CredentialsProvider) bool it will be responsible for validating // whether target matches the credential provider type. // // When comparing the CredentialProvider implementations provider and target for equality, the following rules are used: // // If provider is of type T and target is of type V, true if type *T is the same as type *V, otherwise false // If provider is of type *T and target is of type V, true if type *T is the same as type *V, otherwise false // If provider is of type T and target is of type *V, true if type *T is the same as type *V, otherwise false // If provider is of type *T and target is of type *V,true if type *T is the same as type *V, otherwise false func IsCredentialsProvider(provider, target CredentialsProvider) bool { if target == nil || provider == nil { return provider == target } if x, ok := provider.(isCredentialsProvider); ok { return x.IsCredentialsProvider(target) } targetType := reflect.TypeOf(target) if targetType.Kind() != reflect.Ptr { targetType = reflect.PtrTo(targetType) } providerType := reflect.TypeOf(provider) if providerType.Kind() != reflect.Ptr { providerType = reflect.PtrTo(providerType) } return targetType.AssignableTo(providerType) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/auto.go ================================================ package defaults import ( "github.com/aws/aws-sdk-go-v2/aws" "runtime" "strings" ) var getGOOS = func() string { return runtime.GOOS } // ResolveDefaultsModeAuto is used to determine the effective aws.DefaultsMode when the mode // is set to aws.DefaultsModeAuto. func ResolveDefaultsModeAuto(region string, environment aws.RuntimeEnvironment) aws.DefaultsMode { goos := getGOOS() if goos == "android" || goos == "ios" { return aws.DefaultsModeMobile } var currentRegion string if len(environment.EnvironmentIdentifier) > 0 { currentRegion = environment.Region } if len(currentRegion) == 0 && len(environment.EC2InstanceMetadataRegion) > 0 { currentRegion = environment.EC2InstanceMetadataRegion } if len(region) > 0 && len(currentRegion) > 0 { if strings.EqualFold(region, currentRegion) { return aws.DefaultsModeInRegion } return aws.DefaultsModeCrossRegion } return aws.DefaultsModeStandard } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/configuration.go ================================================ package defaults import ( "time" "github.com/aws/aws-sdk-go-v2/aws" ) // Configuration is the set of SDK configuration options that are determined based // on the configured DefaultsMode. type Configuration struct { // RetryMode is the configuration's default retry mode API clients should // use for constructing a Retryer. RetryMode aws.RetryMode // ConnectTimeout is the maximum amount of time a dial will wait for // a connect to complete. // // See https://pkg.go.dev/net#Dialer.Timeout ConnectTimeout *time.Duration // TLSNegotiationTimeout specifies the maximum amount of time waiting to // wait for a TLS handshake. // // See https://pkg.go.dev/net/http#Transport.TLSHandshakeTimeout TLSNegotiationTimeout *time.Duration } // GetConnectTimeout returns the ConnectTimeout value, returns false if the value is not set. func (c *Configuration) GetConnectTimeout() (time.Duration, bool) { if c.ConnectTimeout == nil { return 0, false } return *c.ConnectTimeout, true } // GetTLSNegotiationTimeout returns the TLSNegotiationTimeout value, returns false if the value is not set. func (c *Configuration) GetTLSNegotiationTimeout() (time.Duration, bool) { if c.TLSNegotiationTimeout == nil { return 0, false } return *c.TLSNegotiationTimeout, true } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/defaults.go ================================================ // Code generated by github.com/aws/aws-sdk-go-v2/internal/codegen/cmd/defaultsconfig. DO NOT EDIT. package defaults import ( "fmt" "github.com/aws/aws-sdk-go-v2/aws" "time" ) // GetModeConfiguration returns the default Configuration descriptor for the given mode. // // Supports the following modes: cross-region, in-region, mobile, standard func GetModeConfiguration(mode aws.DefaultsMode) (Configuration, error) { var mv aws.DefaultsMode mv.SetFromString(string(mode)) switch mv { case aws.DefaultsModeCrossRegion: settings := Configuration{ ConnectTimeout: aws.Duration(3100 * time.Millisecond), RetryMode: aws.RetryMode("standard"), TLSNegotiationTimeout: aws.Duration(3100 * time.Millisecond), } return settings, nil case aws.DefaultsModeInRegion: settings := Configuration{ ConnectTimeout: aws.Duration(1100 * time.Millisecond), RetryMode: aws.RetryMode("standard"), TLSNegotiationTimeout: aws.Duration(1100 * time.Millisecond), } return settings, nil case aws.DefaultsModeMobile: settings := Configuration{ ConnectTimeout: aws.Duration(30000 * time.Millisecond), RetryMode: aws.RetryMode("standard"), TLSNegotiationTimeout: aws.Duration(30000 * time.Millisecond), } return settings, nil case aws.DefaultsModeStandard: settings := Configuration{ ConnectTimeout: aws.Duration(3100 * time.Millisecond), RetryMode: aws.RetryMode("standard"), TLSNegotiationTimeout: aws.Duration(3100 * time.Millisecond), } return settings, nil default: return Configuration{}, fmt.Errorf("unsupported defaults mode: %v", mode) } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/doc.go ================================================ // Package defaults provides recommended configuration values for AWS SDKs and CLIs. package defaults ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/defaultsmode.go ================================================ // Code generated by github.com/aws/aws-sdk-go-v2/internal/codegen/cmd/defaultsmode. DO NOT EDIT. package aws import ( "strings" ) // DefaultsMode is the SDK defaults mode setting. type DefaultsMode string // The DefaultsMode constants. const ( // DefaultsModeAuto is an experimental mode that builds on the standard mode. // The SDK will attempt to discover the execution environment to determine the // appropriate settings automatically. // // Note that the auto detection is heuristics-based and does not guarantee 100% // accuracy. STANDARD mode will be used if the execution environment cannot // be determined. The auto detection might query EC2 Instance Metadata service // (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html), // which might introduce latency. Therefore we recommend choosing an explicit // defaults_mode instead if startup latency is critical to your application DefaultsModeAuto DefaultsMode = "auto" // DefaultsModeCrossRegion builds on the standard mode and includes optimization // tailored for applications which call AWS services in a different region // // Note that the default values vended from this mode might change as best practices // may evolve. As a result, it is encouraged to perform tests when upgrading // the SDK DefaultsModeCrossRegion DefaultsMode = "cross-region" // DefaultsModeInRegion builds on the standard mode and includes optimization // tailored for applications which call AWS services from within the same AWS // region // // Note that the default values vended from this mode might change as best practices // may evolve. As a result, it is encouraged to perform tests when upgrading // the SDK DefaultsModeInRegion DefaultsMode = "in-region" // DefaultsModeLegacy provides default settings that vary per SDK and were used // prior to establishment of defaults_mode DefaultsModeLegacy DefaultsMode = "legacy" // DefaultsModeMobile builds on the standard mode and includes optimization // tailored for mobile applications // // Note that the default values vended from this mode might change as best practices // may evolve. As a result, it is encouraged to perform tests when upgrading // the SDK DefaultsModeMobile DefaultsMode = "mobile" // DefaultsModeStandard provides the latest recommended default values that // should be safe to run in most scenarios // // Note that the default values vended from this mode might change as best practices // may evolve. As a result, it is encouraged to perform tests when upgrading // the SDK DefaultsModeStandard DefaultsMode = "standard" ) // SetFromString sets the DefaultsMode value to one of the pre-defined constants that matches // the provided string when compared using EqualFold. If the value does not match a known // constant it will be set to as-is and the function will return false. As a special case, if the // provided value is a zero-length string, the mode will be set to LegacyDefaultsMode. func (d *DefaultsMode) SetFromString(v string) (ok bool) { switch { case strings.EqualFold(v, string(DefaultsModeAuto)): *d = DefaultsModeAuto ok = true case strings.EqualFold(v, string(DefaultsModeCrossRegion)): *d = DefaultsModeCrossRegion ok = true case strings.EqualFold(v, string(DefaultsModeInRegion)): *d = DefaultsModeInRegion ok = true case strings.EqualFold(v, string(DefaultsModeLegacy)): *d = DefaultsModeLegacy ok = true case strings.EqualFold(v, string(DefaultsModeMobile)): *d = DefaultsModeMobile ok = true case strings.EqualFold(v, string(DefaultsModeStandard)): *d = DefaultsModeStandard ok = true case len(v) == 0: *d = DefaultsModeLegacy ok = true default: *d = DefaultsMode(v) } return ok } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/doc.go ================================================ // Package aws provides the core SDK's utilities and shared types. Use this package's // utilities to simplify setting and reading API operations parameters. // // # Value and Pointer Conversion Utilities // // This package includes a helper conversion utility for each scalar type the SDK's // API use. These utilities make getting a pointer of the scalar, and dereferencing // a pointer easier. // // Each conversion utility comes in two forms. Value to Pointer and Pointer to Value. // The Pointer to value will safely dereference the pointer and return its value. // If the pointer was nil, the scalar's zero value will be returned. // // The value to pointer functions will be named after the scalar type. So get a // *string from a string value use the "String" function. This makes it easy to // to get pointer of a literal string value, because getting the address of a // literal requires assigning the value to a variable first. // // var strPtr *string // // // Without the SDK's conversion functions // str := "my string" // strPtr = &str // // // With the SDK's conversion functions // strPtr = aws.String("my string") // // // Convert *string to string value // str = aws.ToString(strPtr) // // In addition to scalars the aws package also includes conversion utilities for // map and slice for commonly types used in API parameters. The map and slice // conversion functions use similar naming pattern as the scalar conversion // functions. // // var strPtrs []*string // var strs []string = []string{"Go", "Gophers", "Go"} // // // Convert []string to []*string // strPtrs = aws.StringSlice(strs) // // // Convert []*string to []string // strs = aws.ToStringSlice(strPtrs) // // # SDK Default HTTP Client // // The SDK will use the http.DefaultClient if a HTTP client is not provided to // the SDK's Session, or service client constructor. This means that if the // http.DefaultClient is modified by other components of your application the // modifications will be picked up by the SDK as well. // // In some cases this might be intended, but it is a better practice to create // a custom HTTP Client to share explicitly through your application. You can // configure the SDK to use the custom HTTP Client by setting the HTTPClient // value of the SDK's Config type when creating a Session or service client. package aws // generate.go uses a build tag of "ignore", go run doesn't need to specify // this because go run ignores all build flags when running a go file directly. //go:generate go run -tags codegen generate.go //go:generate go run -tags codegen logging_generate.go //go:generate gofmt -w -s . ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/endpoints.go ================================================ package aws import ( "fmt" ) // DualStackEndpointState is a constant to describe the dual-stack endpoint resolution behavior. type DualStackEndpointState uint const ( // DualStackEndpointStateUnset is the default value behavior for dual-stack endpoint resolution. DualStackEndpointStateUnset DualStackEndpointState = iota // DualStackEndpointStateEnabled enables dual-stack endpoint resolution for service endpoints. DualStackEndpointStateEnabled // DualStackEndpointStateDisabled disables dual-stack endpoint resolution for endpoints. DualStackEndpointStateDisabled ) // GetUseDualStackEndpoint takes a service's EndpointResolverOptions and returns the UseDualStackEndpoint value. // Returns boolean false if the provided options does not have a method to retrieve the DualStackEndpointState. func GetUseDualStackEndpoint(options ...interface{}) (value DualStackEndpointState, found bool) { type iface interface { GetUseDualStackEndpoint() DualStackEndpointState } for _, option := range options { if i, ok := option.(iface); ok { value = i.GetUseDualStackEndpoint() found = true break } } return value, found } // FIPSEndpointState is a constant to describe the FIPS endpoint resolution behavior. type FIPSEndpointState uint const ( // FIPSEndpointStateUnset is the default value behavior for FIPS endpoint resolution. FIPSEndpointStateUnset FIPSEndpointState = iota // FIPSEndpointStateEnabled enables FIPS endpoint resolution for service endpoints. FIPSEndpointStateEnabled // FIPSEndpointStateDisabled disables FIPS endpoint resolution for endpoints. FIPSEndpointStateDisabled ) // GetUseFIPSEndpoint takes a service's EndpointResolverOptions and returns the UseDualStackEndpoint value. // Returns boolean false if the provided options does not have a method to retrieve the DualStackEndpointState. func GetUseFIPSEndpoint(options ...interface{}) (value FIPSEndpointState, found bool) { type iface interface { GetUseFIPSEndpoint() FIPSEndpointState } for _, option := range options { if i, ok := option.(iface); ok { value = i.GetUseFIPSEndpoint() found = true break } } return value, found } // Endpoint represents the endpoint a service client should make API operation // calls to. // // The SDK will automatically resolve these endpoints per API client using an // internal endpoint resolvers. If you'd like to provide custom endpoint // resolving behavior you can implement the EndpointResolver interface. // // Deprecated: This structure was used with the global [EndpointResolver] // interface, which has been deprecated in favor of service-specific endpoint // resolution. See the deprecation docs on that interface for more information. type Endpoint struct { // The base URL endpoint the SDK API clients will use to make API calls to. // The SDK will suffix URI path and query elements to this endpoint. URL string // Specifies if the endpoint's hostname can be modified by the SDK's API // client. // // If the hostname is mutable the SDK API clients may modify any part of // the hostname based on the requirements of the API, (e.g. adding, or // removing content in the hostname). Such as, Amazon S3 API client // prefixing "bucketname" to the hostname, or changing the // hostname service name component from "s3." to "s3-accesspoint.dualstack." // for the dualstack endpoint of an S3 Accesspoint resource. // // Care should be taken when providing a custom endpoint for an API. If the // endpoint hostname is mutable, and the client cannot modify the endpoint // correctly, the operation call will most likely fail, or have undefined // behavior. // // If hostname is immutable, the SDK API clients will not modify the // hostname of the URL. This may cause the API client not to function // correctly if the API requires the operation specific hostname values // to be used by the client. // // This flag does not modify the API client's behavior if this endpoint // will be used instead of Endpoint Discovery, or if the endpoint will be // used to perform Endpoint Discovery. That behavior is configured via the // API Client's Options. HostnameImmutable bool // The AWS partition the endpoint belongs to. PartitionID string // The service name that should be used for signing the requests to the // endpoint. SigningName string // The region that should be used for signing the request to the endpoint. SigningRegion string // The signing method that should be used for signing the requests to the // endpoint. SigningMethod string // The source of the Endpoint. By default, this will be EndpointSourceServiceMetadata. // When providing a custom endpoint, you should set the source as EndpointSourceCustom. // If source is not provided when providing a custom endpoint, the SDK may not // perform required host mutations correctly. Source should be used along with // HostnameImmutable property as per the usage requirement. Source EndpointSource } // EndpointSource is the endpoint source type. // // Deprecated: The global [Endpoint] structure is deprecated. type EndpointSource int const ( // EndpointSourceServiceMetadata denotes service modeled endpoint metadata is used as Endpoint Source. EndpointSourceServiceMetadata EndpointSource = iota // EndpointSourceCustom denotes endpoint is a custom endpoint. This source should be used when // user provides a custom endpoint to be used by the SDK. EndpointSourceCustom ) // EndpointNotFoundError is a sentinel error to indicate that the // EndpointResolver implementation was unable to resolve an endpoint for the // given service and region. Resolvers should use this to indicate that an API // client should fallback and attempt to use it's internal default resolver to // resolve the endpoint. type EndpointNotFoundError struct { Err error } // Error is the error message. func (e *EndpointNotFoundError) Error() string { return fmt.Sprintf("endpoint not found, %v", e.Err) } // Unwrap returns the underlying error. func (e *EndpointNotFoundError) Unwrap() error { return e.Err } // EndpointResolver is an endpoint resolver that can be used to provide or // override an endpoint for the given service and region. API clients will // attempt to use the EndpointResolver first to resolve an endpoint if // available. If the EndpointResolver returns an EndpointNotFoundError error, // API clients will fallback to attempting to resolve the endpoint using its // internal default endpoint resolver. // // Deprecated: The global endpoint resolution interface is deprecated. The API // for endpoint resolution is now unique to each service and is set via the // EndpointResolverV2 field on service client options. Setting a value for // EndpointResolver on aws.Config or service client options will prevent you // from using any endpoint-related service features released after the // introduction of EndpointResolverV2. You may also encounter broken or // unexpected behavior when using the old global interface with services that // use many endpoint-related customizations such as S3. type EndpointResolver interface { ResolveEndpoint(service, region string) (Endpoint, error) } // EndpointResolverFunc wraps a function to satisfy the EndpointResolver interface. // // Deprecated: The global endpoint resolution interface is deprecated. See // deprecation docs on [EndpointResolver]. type EndpointResolverFunc func(service, region string) (Endpoint, error) // ResolveEndpoint calls the wrapped function and returns the results. func (e EndpointResolverFunc) ResolveEndpoint(service, region string) (Endpoint, error) { return e(service, region) } // EndpointResolverWithOptions is an endpoint resolver that can be used to provide or // override an endpoint for the given service, region, and the service client's EndpointOptions. API clients will // attempt to use the EndpointResolverWithOptions first to resolve an endpoint if // available. If the EndpointResolverWithOptions returns an EndpointNotFoundError error, // API clients will fallback to attempting to resolve the endpoint using its // internal default endpoint resolver. // // Deprecated: The global endpoint resolution interface is deprecated. See // deprecation docs on [EndpointResolver]. type EndpointResolverWithOptions interface { ResolveEndpoint(service, region string, options ...interface{}) (Endpoint, error) } // EndpointResolverWithOptionsFunc wraps a function to satisfy the EndpointResolverWithOptions interface. // // Deprecated: The global endpoint resolution interface is deprecated. See // deprecation docs on [EndpointResolver]. type EndpointResolverWithOptionsFunc func(service, region string, options ...interface{}) (Endpoint, error) // ResolveEndpoint calls the wrapped function and returns the results. func (e EndpointResolverWithOptionsFunc) ResolveEndpoint(service, region string, options ...interface{}) (Endpoint, error) { return e(service, region, options...) } // GetDisableHTTPS takes a service's EndpointResolverOptions and returns the DisableHTTPS value. // Returns boolean false if the provided options does not have a method to retrieve the DisableHTTPS. func GetDisableHTTPS(options ...interface{}) (value bool, found bool) { type iface interface { GetDisableHTTPS() bool } for _, option := range options { if i, ok := option.(iface); ok { value = i.GetDisableHTTPS() found = true break } } return value, found } // GetResolvedRegion takes a service's EndpointResolverOptions and returns the ResolvedRegion value. // Returns boolean false if the provided options does not have a method to retrieve the ResolvedRegion. func GetResolvedRegion(options ...interface{}) (value string, found bool) { type iface interface { GetResolvedRegion() string } for _, option := range options { if i, ok := option.(iface); ok { value = i.GetResolvedRegion() found = true break } } return value, found } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/errors.go ================================================ package aws // MissingRegionError is an error that is returned if region configuration // value was not found. type MissingRegionError struct{} func (*MissingRegionError) Error() string { return "an AWS region is required, but was not found" } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/from_ptr.go ================================================ // Code generated by aws/generate.go DO NOT EDIT. package aws import ( "github.com/aws/smithy-go/ptr" "time" ) // ToBool returns bool value dereferenced if the passed // in pointer was not nil. Returns a bool zero value if the // pointer was nil. func ToBool(p *bool) (v bool) { return ptr.ToBool(p) } // ToBoolSlice returns a slice of bool values, that are // dereferenced if the passed in pointer was not nil. Returns a bool // zero value if the pointer was nil. func ToBoolSlice(vs []*bool) []bool { return ptr.ToBoolSlice(vs) } // ToBoolMap returns a map of bool values, that are // dereferenced if the passed in pointer was not nil. The bool // zero value is used if the pointer was nil. func ToBoolMap(vs map[string]*bool) map[string]bool { return ptr.ToBoolMap(vs) } // ToByte returns byte value dereferenced if the passed // in pointer was not nil. Returns a byte zero value if the // pointer was nil. func ToByte(p *byte) (v byte) { return ptr.ToByte(p) } // ToByteSlice returns a slice of byte values, that are // dereferenced if the passed in pointer was not nil. Returns a byte // zero value if the pointer was nil. func ToByteSlice(vs []*byte) []byte { return ptr.ToByteSlice(vs) } // ToByteMap returns a map of byte values, that are // dereferenced if the passed in pointer was not nil. The byte // zero value is used if the pointer was nil. func ToByteMap(vs map[string]*byte) map[string]byte { return ptr.ToByteMap(vs) } // ToString returns string value dereferenced if the passed // in pointer was not nil. Returns a string zero value if the // pointer was nil. func ToString(p *string) (v string) { return ptr.ToString(p) } // ToStringSlice returns a slice of string values, that are // dereferenced if the passed in pointer was not nil. Returns a string // zero value if the pointer was nil. func ToStringSlice(vs []*string) []string { return ptr.ToStringSlice(vs) } // ToStringMap returns a map of string values, that are // dereferenced if the passed in pointer was not nil. The string // zero value is used if the pointer was nil. func ToStringMap(vs map[string]*string) map[string]string { return ptr.ToStringMap(vs) } // ToInt returns int value dereferenced if the passed // in pointer was not nil. Returns a int zero value if the // pointer was nil. func ToInt(p *int) (v int) { return ptr.ToInt(p) } // ToIntSlice returns a slice of int values, that are // dereferenced if the passed in pointer was not nil. Returns a int // zero value if the pointer was nil. func ToIntSlice(vs []*int) []int { return ptr.ToIntSlice(vs) } // ToIntMap returns a map of int values, that are // dereferenced if the passed in pointer was not nil. The int // zero value is used if the pointer was nil. func ToIntMap(vs map[string]*int) map[string]int { return ptr.ToIntMap(vs) } // ToInt8 returns int8 value dereferenced if the passed // in pointer was not nil. Returns a int8 zero value if the // pointer was nil. func ToInt8(p *int8) (v int8) { return ptr.ToInt8(p) } // ToInt8Slice returns a slice of int8 values, that are // dereferenced if the passed in pointer was not nil. Returns a int8 // zero value if the pointer was nil. func ToInt8Slice(vs []*int8) []int8 { return ptr.ToInt8Slice(vs) } // ToInt8Map returns a map of int8 values, that are // dereferenced if the passed in pointer was not nil. The int8 // zero value is used if the pointer was nil. func ToInt8Map(vs map[string]*int8) map[string]int8 { return ptr.ToInt8Map(vs) } // ToInt16 returns int16 value dereferenced if the passed // in pointer was not nil. Returns a int16 zero value if the // pointer was nil. func ToInt16(p *int16) (v int16) { return ptr.ToInt16(p) } // ToInt16Slice returns a slice of int16 values, that are // dereferenced if the passed in pointer was not nil. Returns a int16 // zero value if the pointer was nil. func ToInt16Slice(vs []*int16) []int16 { return ptr.ToInt16Slice(vs) } // ToInt16Map returns a map of int16 values, that are // dereferenced if the passed in pointer was not nil. The int16 // zero value is used if the pointer was nil. func ToInt16Map(vs map[string]*int16) map[string]int16 { return ptr.ToInt16Map(vs) } // ToInt32 returns int32 value dereferenced if the passed // in pointer was not nil. Returns a int32 zero value if the // pointer was nil. func ToInt32(p *int32) (v int32) { return ptr.ToInt32(p) } // ToInt32Slice returns a slice of int32 values, that are // dereferenced if the passed in pointer was not nil. Returns a int32 // zero value if the pointer was nil. func ToInt32Slice(vs []*int32) []int32 { return ptr.ToInt32Slice(vs) } // ToInt32Map returns a map of int32 values, that are // dereferenced if the passed in pointer was not nil. The int32 // zero value is used if the pointer was nil. func ToInt32Map(vs map[string]*int32) map[string]int32 { return ptr.ToInt32Map(vs) } // ToInt64 returns int64 value dereferenced if the passed // in pointer was not nil. Returns a int64 zero value if the // pointer was nil. func ToInt64(p *int64) (v int64) { return ptr.ToInt64(p) } // ToInt64Slice returns a slice of int64 values, that are // dereferenced if the passed in pointer was not nil. Returns a int64 // zero value if the pointer was nil. func ToInt64Slice(vs []*int64) []int64 { return ptr.ToInt64Slice(vs) } // ToInt64Map returns a map of int64 values, that are // dereferenced if the passed in pointer was not nil. The int64 // zero value is used if the pointer was nil. func ToInt64Map(vs map[string]*int64) map[string]int64 { return ptr.ToInt64Map(vs) } // ToUint returns uint value dereferenced if the passed // in pointer was not nil. Returns a uint zero value if the // pointer was nil. func ToUint(p *uint) (v uint) { return ptr.ToUint(p) } // ToUintSlice returns a slice of uint values, that are // dereferenced if the passed in pointer was not nil. Returns a uint // zero value if the pointer was nil. func ToUintSlice(vs []*uint) []uint { return ptr.ToUintSlice(vs) } // ToUintMap returns a map of uint values, that are // dereferenced if the passed in pointer was not nil. The uint // zero value is used if the pointer was nil. func ToUintMap(vs map[string]*uint) map[string]uint { return ptr.ToUintMap(vs) } // ToUint8 returns uint8 value dereferenced if the passed // in pointer was not nil. Returns a uint8 zero value if the // pointer was nil. func ToUint8(p *uint8) (v uint8) { return ptr.ToUint8(p) } // ToUint8Slice returns a slice of uint8 values, that are // dereferenced if the passed in pointer was not nil. Returns a uint8 // zero value if the pointer was nil. func ToUint8Slice(vs []*uint8) []uint8 { return ptr.ToUint8Slice(vs) } // ToUint8Map returns a map of uint8 values, that are // dereferenced if the passed in pointer was not nil. The uint8 // zero value is used if the pointer was nil. func ToUint8Map(vs map[string]*uint8) map[string]uint8 { return ptr.ToUint8Map(vs) } // ToUint16 returns uint16 value dereferenced if the passed // in pointer was not nil. Returns a uint16 zero value if the // pointer was nil. func ToUint16(p *uint16) (v uint16) { return ptr.ToUint16(p) } // ToUint16Slice returns a slice of uint16 values, that are // dereferenced if the passed in pointer was not nil. Returns a uint16 // zero value if the pointer was nil. func ToUint16Slice(vs []*uint16) []uint16 { return ptr.ToUint16Slice(vs) } // ToUint16Map returns a map of uint16 values, that are // dereferenced if the passed in pointer was not nil. The uint16 // zero value is used if the pointer was nil. func ToUint16Map(vs map[string]*uint16) map[string]uint16 { return ptr.ToUint16Map(vs) } // ToUint32 returns uint32 value dereferenced if the passed // in pointer was not nil. Returns a uint32 zero value if the // pointer was nil. func ToUint32(p *uint32) (v uint32) { return ptr.ToUint32(p) } // ToUint32Slice returns a slice of uint32 values, that are // dereferenced if the passed in pointer was not nil. Returns a uint32 // zero value if the pointer was nil. func ToUint32Slice(vs []*uint32) []uint32 { return ptr.ToUint32Slice(vs) } // ToUint32Map returns a map of uint32 values, that are // dereferenced if the passed in pointer was not nil. The uint32 // zero value is used if the pointer was nil. func ToUint32Map(vs map[string]*uint32) map[string]uint32 { return ptr.ToUint32Map(vs) } // ToUint64 returns uint64 value dereferenced if the passed // in pointer was not nil. Returns a uint64 zero value if the // pointer was nil. func ToUint64(p *uint64) (v uint64) { return ptr.ToUint64(p) } // ToUint64Slice returns a slice of uint64 values, that are // dereferenced if the passed in pointer was not nil. Returns a uint64 // zero value if the pointer was nil. func ToUint64Slice(vs []*uint64) []uint64 { return ptr.ToUint64Slice(vs) } // ToUint64Map returns a map of uint64 values, that are // dereferenced if the passed in pointer was not nil. The uint64 // zero value is used if the pointer was nil. func ToUint64Map(vs map[string]*uint64) map[string]uint64 { return ptr.ToUint64Map(vs) } // ToFloat32 returns float32 value dereferenced if the passed // in pointer was not nil. Returns a float32 zero value if the // pointer was nil. func ToFloat32(p *float32) (v float32) { return ptr.ToFloat32(p) } // ToFloat32Slice returns a slice of float32 values, that are // dereferenced if the passed in pointer was not nil. Returns a float32 // zero value if the pointer was nil. func ToFloat32Slice(vs []*float32) []float32 { return ptr.ToFloat32Slice(vs) } // ToFloat32Map returns a map of float32 values, that are // dereferenced if the passed in pointer was not nil. The float32 // zero value is used if the pointer was nil. func ToFloat32Map(vs map[string]*float32) map[string]float32 { return ptr.ToFloat32Map(vs) } // ToFloat64 returns float64 value dereferenced if the passed // in pointer was not nil. Returns a float64 zero value if the // pointer was nil. func ToFloat64(p *float64) (v float64) { return ptr.ToFloat64(p) } // ToFloat64Slice returns a slice of float64 values, that are // dereferenced if the passed in pointer was not nil. Returns a float64 // zero value if the pointer was nil. func ToFloat64Slice(vs []*float64) []float64 { return ptr.ToFloat64Slice(vs) } // ToFloat64Map returns a map of float64 values, that are // dereferenced if the passed in pointer was not nil. The float64 // zero value is used if the pointer was nil. func ToFloat64Map(vs map[string]*float64) map[string]float64 { return ptr.ToFloat64Map(vs) } // ToTime returns time.Time value dereferenced if the passed // in pointer was not nil. Returns a time.Time zero value if the // pointer was nil. func ToTime(p *time.Time) (v time.Time) { return ptr.ToTime(p) } // ToTimeSlice returns a slice of time.Time values, that are // dereferenced if the passed in pointer was not nil. Returns a time.Time // zero value if the pointer was nil. func ToTimeSlice(vs []*time.Time) []time.Time { return ptr.ToTimeSlice(vs) } // ToTimeMap returns a map of time.Time values, that are // dereferenced if the passed in pointer was not nil. The time.Time // zero value is used if the pointer was nil. func ToTimeMap(vs map[string]*time.Time) map[string]time.Time { return ptr.ToTimeMap(vs) } // ToDuration returns time.Duration value dereferenced if the passed // in pointer was not nil. Returns a time.Duration zero value if the // pointer was nil. func ToDuration(p *time.Duration) (v time.Duration) { return ptr.ToDuration(p) } // ToDurationSlice returns a slice of time.Duration values, that are // dereferenced if the passed in pointer was not nil. Returns a time.Duration // zero value if the pointer was nil. func ToDurationSlice(vs []*time.Duration) []time.Duration { return ptr.ToDurationSlice(vs) } // ToDurationMap returns a map of time.Duration values, that are // dereferenced if the passed in pointer was not nil. The time.Duration // zero value is used if the pointer was nil. func ToDurationMap(vs map[string]*time.Duration) map[string]time.Duration { return ptr.ToDurationMap(vs) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package aws // goModuleVersion is the tagged release for this module const goModuleVersion = "1.36.3" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/logging.go ================================================ // Code generated by aws/logging_generate.go DO NOT EDIT. package aws // ClientLogMode represents the logging mode of SDK clients. The client logging mode is a bit-field where // each bit is a flag that describes the logging behavior for one or more client components. // The entire 64-bit group is reserved for later expansion by the SDK. // // Example: Setting ClientLogMode to enable logging of retries and requests // // clientLogMode := aws.LogRetries | aws.LogRequest // // Example: Adding an additional log mode to an existing ClientLogMode value // // clientLogMode |= aws.LogResponse type ClientLogMode uint64 // Supported ClientLogMode bits that can be configured to toggle logging of specific SDK events. const ( LogSigning ClientLogMode = 1 << (64 - 1 - iota) LogRetries LogRequest LogRequestWithBody LogResponse LogResponseWithBody LogDeprecatedUsage LogRequestEventMessage LogResponseEventMessage ) // IsSigning returns whether the Signing logging mode bit is set func (m ClientLogMode) IsSigning() bool { return m&LogSigning != 0 } // IsRetries returns whether the Retries logging mode bit is set func (m ClientLogMode) IsRetries() bool { return m&LogRetries != 0 } // IsRequest returns whether the Request logging mode bit is set func (m ClientLogMode) IsRequest() bool { return m&LogRequest != 0 } // IsRequestWithBody returns whether the RequestWithBody logging mode bit is set func (m ClientLogMode) IsRequestWithBody() bool { return m&LogRequestWithBody != 0 } // IsResponse returns whether the Response logging mode bit is set func (m ClientLogMode) IsResponse() bool { return m&LogResponse != 0 } // IsResponseWithBody returns whether the ResponseWithBody logging mode bit is set func (m ClientLogMode) IsResponseWithBody() bool { return m&LogResponseWithBody != 0 } // IsDeprecatedUsage returns whether the DeprecatedUsage logging mode bit is set func (m ClientLogMode) IsDeprecatedUsage() bool { return m&LogDeprecatedUsage != 0 } // IsRequestEventMessage returns whether the RequestEventMessage logging mode bit is set func (m ClientLogMode) IsRequestEventMessage() bool { return m&LogRequestEventMessage != 0 } // IsResponseEventMessage returns whether the ResponseEventMessage logging mode bit is set func (m ClientLogMode) IsResponseEventMessage() bool { return m&LogResponseEventMessage != 0 } // ClearSigning clears the Signing logging mode bit func (m *ClientLogMode) ClearSigning() { *m &^= LogSigning } // ClearRetries clears the Retries logging mode bit func (m *ClientLogMode) ClearRetries() { *m &^= LogRetries } // ClearRequest clears the Request logging mode bit func (m *ClientLogMode) ClearRequest() { *m &^= LogRequest } // ClearRequestWithBody clears the RequestWithBody logging mode bit func (m *ClientLogMode) ClearRequestWithBody() { *m &^= LogRequestWithBody } // ClearResponse clears the Response logging mode bit func (m *ClientLogMode) ClearResponse() { *m &^= LogResponse } // ClearResponseWithBody clears the ResponseWithBody logging mode bit func (m *ClientLogMode) ClearResponseWithBody() { *m &^= LogResponseWithBody } // ClearDeprecatedUsage clears the DeprecatedUsage logging mode bit func (m *ClientLogMode) ClearDeprecatedUsage() { *m &^= LogDeprecatedUsage } // ClearRequestEventMessage clears the RequestEventMessage logging mode bit func (m *ClientLogMode) ClearRequestEventMessage() { *m &^= LogRequestEventMessage } // ClearResponseEventMessage clears the ResponseEventMessage logging mode bit func (m *ClientLogMode) ClearResponseEventMessage() { *m &^= LogResponseEventMessage } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/logging_generate.go ================================================ //go:build clientlogmode // +build clientlogmode package main import ( "fmt" "log" "os" "strings" "text/template" ) var config = struct { ModeBits []string }{ // Items should be appended only to keep bit-flag positions stable ModeBits: []string{ "Signing", "Retries", "Request", "RequestWithBody", "Response", "ResponseWithBody", "DeprecatedUsage", "RequestEventMessage", "ResponseEventMessage", }, } func bitName(name string) string { return strings.ToUpper(name[:1]) + name[1:] } var tmpl = template.Must(template.New("ClientLogMode").Funcs(map[string]interface{}{ "symbolName": func(name string) string { return "Log" + bitName(name) }, "bitName": bitName, }).Parse(`// Code generated by aws/logging_generate.go DO NOT EDIT. package aws // ClientLogMode represents the logging mode of SDK clients. The client logging mode is a bit-field where // each bit is a flag that describes the logging behavior for one or more client components. // The entire 64-bit group is reserved for later expansion by the SDK. // // Example: Setting ClientLogMode to enable logging of retries and requests // clientLogMode := aws.LogRetries | aws.LogRequest // // Example: Adding an additional log mode to an existing ClientLogMode value // clientLogMode |= aws.LogResponse type ClientLogMode uint64 // Supported ClientLogMode bits that can be configured to toggle logging of specific SDK events. const ( {{- range $index, $field := .ModeBits }} {{ (symbolName $field) }}{{- if (eq 0 $index) }} ClientLogMode = 1 << (64 - 1 - iota){{- end }} {{- end }} ) {{ range $_, $field := .ModeBits }} // Is{{- bitName $field }} returns whether the {{ bitName $field }} logging mode bit is set func (m ClientLogMode) Is{{- bitName $field }}() bool { return m&{{- (symbolName $field) }} != 0 } {{ end }} {{- range $_, $field := .ModeBits }} // Clear{{- bitName $field }} clears the {{ bitName $field }} logging mode bit func (m *ClientLogMode) Clear{{- bitName $field }}() { *m &^= {{ (symbolName $field) }} } {{ end -}} `)) func main() { uniqueBitFields := make(map[string]struct{}) for _, bitName := range config.ModeBits { if _, ok := uniqueBitFields[strings.ToLower(bitName)]; ok { panic(fmt.Sprintf("duplicate bit field: %s", bitName)) } uniqueBitFields[bitName] = struct{}{} } file, err := os.Create("logging.go") if err != nil { log.Fatal(err) } defer file.Close() err = tmpl.Execute(file, config) if err != nil { log.Fatal(err) } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/metadata.go ================================================ package middleware import ( "context" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/smithy-go/middleware" ) // RegisterServiceMetadata registers metadata about the service and operation into the middleware context // so that it is available at runtime for other middleware to introspect. type RegisterServiceMetadata struct { ServiceID string SigningName string Region string OperationName string } // ID returns the middleware identifier. func (s *RegisterServiceMetadata) ID() string { return "RegisterServiceMetadata" } // HandleInitialize registers service metadata information into the middleware context, allowing for introspection. func (s RegisterServiceMetadata) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) (out middleware.InitializeOutput, metadata middleware.Metadata, err error) { if len(s.ServiceID) > 0 { ctx = SetServiceID(ctx, s.ServiceID) } if len(s.SigningName) > 0 { ctx = SetSigningName(ctx, s.SigningName) } if len(s.Region) > 0 { ctx = setRegion(ctx, s.Region) } if len(s.OperationName) > 0 { ctx = setOperationName(ctx, s.OperationName) } return next.HandleInitialize(ctx, in) } // service metadata keys for storing and lookup of runtime stack information. type ( serviceIDKey struct{} signingNameKey struct{} signingRegionKey struct{} regionKey struct{} operationNameKey struct{} partitionIDKey struct{} requiresLegacyEndpointsKey struct{} ) // GetServiceID retrieves the service id from the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetServiceID(ctx context.Context) (v string) { v, _ = middleware.GetStackValue(ctx, serviceIDKey{}).(string) return v } // GetSigningName retrieves the service signing name from the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. // // Deprecated: This value is unstable. The resolved signing name is available // in the signer properties object passed to the signer. func GetSigningName(ctx context.Context) (v string) { v, _ = middleware.GetStackValue(ctx, signingNameKey{}).(string) return v } // GetSigningRegion retrieves the region from the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. // // Deprecated: This value is unstable. The resolved signing region is available // in the signer properties object passed to the signer. func GetSigningRegion(ctx context.Context) (v string) { v, _ = middleware.GetStackValue(ctx, signingRegionKey{}).(string) return v } // GetRegion retrieves the endpoint region from the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetRegion(ctx context.Context) (v string) { v, _ = middleware.GetStackValue(ctx, regionKey{}).(string) return v } // GetOperationName retrieves the service operation metadata from the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetOperationName(ctx context.Context) (v string) { v, _ = middleware.GetStackValue(ctx, operationNameKey{}).(string) return v } // GetPartitionID retrieves the endpoint partition id from the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetPartitionID(ctx context.Context) string { v, _ := middleware.GetStackValue(ctx, partitionIDKey{}).(string) return v } // GetRequiresLegacyEndpoints the flag used to indicate if legacy endpoint // customizations need to be executed. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetRequiresLegacyEndpoints(ctx context.Context) bool { v, _ := middleware.GetStackValue(ctx, requiresLegacyEndpointsKey{}).(bool) return v } // SetRequiresLegacyEndpoints set or modifies the flag indicated that // legacy endpoint customizations are needed. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func SetRequiresLegacyEndpoints(ctx context.Context, value bool) context.Context { return middleware.WithStackValue(ctx, requiresLegacyEndpointsKey{}, value) } // SetSigningName set or modifies the sigv4 or sigv4a signing name on the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. // // Deprecated: This value is unstable. Use WithSigV4SigningName client option // funcs instead. func SetSigningName(ctx context.Context, value string) context.Context { return middleware.WithStackValue(ctx, signingNameKey{}, value) } // SetSigningRegion sets or modifies the region on the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. // // Deprecated: This value is unstable. Use WithSigV4SigningRegion client option // funcs instead. func SetSigningRegion(ctx context.Context, value string) context.Context { return middleware.WithStackValue(ctx, signingRegionKey{}, value) } // SetServiceID sets the service id on the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func SetServiceID(ctx context.Context, value string) context.Context { return middleware.WithStackValue(ctx, serviceIDKey{}, value) } // setRegion sets the endpoint region on the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func setRegion(ctx context.Context, value string) context.Context { return middleware.WithStackValue(ctx, regionKey{}, value) } // setOperationName sets the service operation on the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func setOperationName(ctx context.Context, value string) context.Context { return middleware.WithStackValue(ctx, operationNameKey{}, value) } // SetPartitionID sets the partition id of a resolved region on the context // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func SetPartitionID(ctx context.Context, value string) context.Context { return middleware.WithStackValue(ctx, partitionIDKey{}, value) } // EndpointSource key type endpointSourceKey struct{} // GetEndpointSource returns an endpoint source if set on context func GetEndpointSource(ctx context.Context) (v aws.EndpointSource) { v, _ = middleware.GetStackValue(ctx, endpointSourceKey{}).(aws.EndpointSource) return v } // SetEndpointSource sets endpoint source on context func SetEndpointSource(ctx context.Context, value aws.EndpointSource) context.Context { return middleware.WithStackValue(ctx, endpointSourceKey{}, value) } type signingCredentialsKey struct{} // GetSigningCredentials returns the credentials that were used for signing if set on context. func GetSigningCredentials(ctx context.Context) (v aws.Credentials) { v, _ = middleware.GetStackValue(ctx, signingCredentialsKey{}).(aws.Credentials) return v } // SetSigningCredentials sets the credentails used for signing on the context. func SetSigningCredentials(ctx context.Context, value aws.Credentials) context.Context { return middleware.WithStackValue(ctx, signingCredentialsKey{}, value) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/middleware.go ================================================ package middleware import ( "context" "fmt" "time" "github.com/aws/aws-sdk-go-v2/internal/rand" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/middleware" smithyrand "github.com/aws/smithy-go/rand" smithyhttp "github.com/aws/smithy-go/transport/http" ) // ClientRequestID is a Smithy BuildMiddleware that will generate a unique ID for logical API operation // invocation. type ClientRequestID struct{} // ID the identifier for the ClientRequestID func (r *ClientRequestID) ID() string { return "ClientRequestID" } // HandleBuild attaches a unique operation invocation id for the operation to the request func (r ClientRequestID) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", req) } invocationID, err := smithyrand.NewUUID(rand.Reader).GetUUID() if err != nil { return out, metadata, err } const invocationIDHeader = "Amz-Sdk-Invocation-Id" req.Header[invocationIDHeader] = append(req.Header[invocationIDHeader][:0], invocationID) return next.HandleBuild(ctx, in) } // RecordResponseTiming records the response timing for the SDK client requests. type RecordResponseTiming struct{} // ID is the middleware identifier func (a *RecordResponseTiming) ID() string { return "RecordResponseTiming" } // HandleDeserialize calculates response metadata and clock skew func (a RecordResponseTiming) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) responseAt := sdk.NowTime() setResponseAt(&metadata, responseAt) var serverTime time.Time switch resp := out.RawResponse.(type) { case *smithyhttp.Response: respDateHeader := resp.Header.Get("Date") if len(respDateHeader) == 0 { break } var parseErr error serverTime, parseErr = smithyhttp.ParseTime(respDateHeader) if parseErr != nil { logger := middleware.GetLogger(ctx) logger.Logf(logging.Warn, "failed to parse response Date header value, got %v", parseErr.Error()) break } setServerTime(&metadata, serverTime) } if !serverTime.IsZero() { attemptSkew := serverTime.Sub(responseAt) setAttemptSkew(&metadata, attemptSkew) } return out, metadata, err } type responseAtKey struct{} // GetResponseAt returns the time response was received at. func GetResponseAt(metadata middleware.Metadata) (v time.Time, ok bool) { v, ok = metadata.Get(responseAtKey{}).(time.Time) return v, ok } // setResponseAt sets the response time on the metadata. func setResponseAt(metadata *middleware.Metadata, v time.Time) { metadata.Set(responseAtKey{}, v) } type serverTimeKey struct{} // GetServerTime returns the server time for response. func GetServerTime(metadata middleware.Metadata) (v time.Time, ok bool) { v, ok = metadata.Get(serverTimeKey{}).(time.Time) return v, ok } // setServerTime sets the server time on the metadata. func setServerTime(metadata *middleware.Metadata, v time.Time) { metadata.Set(serverTimeKey{}, v) } type attemptSkewKey struct{} // GetAttemptSkew returns Attempt clock skew for response from metadata. func GetAttemptSkew(metadata middleware.Metadata) (v time.Duration, ok bool) { v, ok = metadata.Get(attemptSkewKey{}).(time.Duration) return v, ok } // setAttemptSkew sets the attempt clock skew on the metadata. func setAttemptSkew(metadata *middleware.Metadata, v time.Duration) { metadata.Set(attemptSkewKey{}, v) } // AddClientRequestIDMiddleware adds ClientRequestID to the middleware stack func AddClientRequestIDMiddleware(stack *middleware.Stack) error { return stack.Build.Add(&ClientRequestID{}, middleware.After) } // AddRecordResponseTiming adds RecordResponseTiming middleware to the // middleware stack. func AddRecordResponseTiming(stack *middleware.Stack) error { return stack.Deserialize.Add(&RecordResponseTiming{}, middleware.After) } // rawResponseKey is the accessor key used to store and access the // raw response within the response metadata. type rawResponseKey struct{} // AddRawResponse middleware adds raw response on to the metadata type AddRawResponse struct{} // ID the identifier for the ClientRequestID func (m *AddRawResponse) ID() string { return "AddRawResponseToMetadata" } // HandleDeserialize adds raw response on the middleware metadata func (m AddRawResponse) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) metadata.Set(rawResponseKey{}, out.RawResponse) return out, metadata, err } // AddRawResponseToMetadata adds middleware to the middleware stack that // store raw response on to the metadata. func AddRawResponseToMetadata(stack *middleware.Stack) error { return stack.Deserialize.Add(&AddRawResponse{}, middleware.Before) } // GetRawResponse returns raw response set on metadata func GetRawResponse(metadata middleware.Metadata) interface{} { return metadata.Get(rawResponseKey{}) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/osname.go ================================================ //go:build go1.16 // +build go1.16 package middleware import "runtime" func getNormalizedOSName() (os string) { switch runtime.GOOS { case "android": os = "android" case "linux": os = "linux" case "windows": os = "windows" case "darwin": os = "macos" case "ios": os = "ios" default: os = "other" } return os } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/osname_go115.go ================================================ //go:build !go1.16 // +build !go1.16 package middleware import "runtime" func getNormalizedOSName() (os string) { switch runtime.GOOS { case "android": os = "android" case "linux": os = "linux" case "windows": os = "windows" case "darwin": // Due to Apple M1 we can't distinguish between macOS and iOS when GOOS/GOARCH is darwin/amd64 // For now declare this as "other" until we have a better detection mechanism. fallthrough default: os = "other" } return os } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/recursion_detection.go ================================================ package middleware import ( "context" "fmt" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "os" ) const envAwsLambdaFunctionName = "AWS_LAMBDA_FUNCTION_NAME" const envAmznTraceID = "_X_AMZN_TRACE_ID" const amznTraceIDHeader = "X-Amzn-Trace-Id" // AddRecursionDetection adds recursionDetection to the middleware stack func AddRecursionDetection(stack *middleware.Stack) error { return stack.Build.Add(&RecursionDetection{}, middleware.After) } // RecursionDetection detects Lambda environment and sets its X-Ray trace ID to request header if absent // to avoid recursion invocation in Lambda type RecursionDetection struct{} // ID returns the middleware identifier func (m *RecursionDetection) ID() string { return "RecursionDetection" } // HandleBuild detects Lambda environment and adds its trace ID to request header if absent func (m *RecursionDetection) HandleBuild( ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, ) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown request type %T", req) } _, hasLambdaEnv := os.LookupEnv(envAwsLambdaFunctionName) xAmznTraceID, hasTraceID := os.LookupEnv(envAmznTraceID) value := req.Header.Get(amznTraceIDHeader) // only set the X-Amzn-Trace-Id header when it is not set initially, the // current environment is Lambda and the _X_AMZN_TRACE_ID env variable exists if value != "" || !hasLambdaEnv || !hasTraceID { return next.HandleBuild(ctx, in) } req.Header.Set(amznTraceIDHeader, percentEncode(xAmznTraceID)) return next.HandleBuild(ctx, in) } func percentEncode(s string) string { upperhex := "0123456789ABCDEF" hexCount := 0 for i := 0; i < len(s); i++ { c := s[i] if shouldEncode(c) { hexCount++ } } if hexCount == 0 { return s } required := len(s) + 2*hexCount t := make([]byte, required) j := 0 for i := 0; i < len(s); i++ { if c := s[i]; shouldEncode(c) { t[j] = '%' t[j+1] = upperhex[c>>4] t[j+2] = upperhex[c&15] j += 3 } else { t[j] = c j++ } } return string(t) } func shouldEncode(c byte) bool { if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { return false } switch c { case '-', '=', ';', ':', '+', '&', '[', ']', '{', '}', '"', '\'', ',': return false default: return true } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/request_id.go ================================================ package middleware import ( "github.com/aws/smithy-go/middleware" ) // requestIDKey is used to retrieve request id from response metadata type requestIDKey struct{} // SetRequestIDMetadata sets the provided request id over middleware metadata func SetRequestIDMetadata(metadata *middleware.Metadata, id string) { metadata.Set(requestIDKey{}, id) } // GetRequestIDMetadata retrieves the request id from middleware metadata // returns string and bool indicating value of request id, whether request id was set. func GetRequestIDMetadata(metadata middleware.Metadata) (string, bool) { if !metadata.Has(requestIDKey{}) { return "", false } v, ok := metadata.Get(requestIDKey{}).(string) if !ok { return "", true } return v, true } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/request_id_retriever.go ================================================ package middleware import ( "context" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" ) // AddRequestIDRetrieverMiddleware adds request id retriever middleware func AddRequestIDRetrieverMiddleware(stack *middleware.Stack) error { // add error wrapper middleware before operation deserializers so that it can wrap the error response // returned by operation deserializers return stack.Deserialize.Insert(&RequestIDRetriever{}, "OperationDeserializer", middleware.Before) } // RequestIDRetriever middleware captures the AWS service request ID from the // raw response. type RequestIDRetriever struct { } // ID returns the middleware identifier func (m *RequestIDRetriever) ID() string { return "RequestIDRetriever" } // HandleDeserialize pulls the AWS request ID from the response, storing it in // operation metadata. func (m *RequestIDRetriever) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) resp, ok := out.RawResponse.(*smithyhttp.Response) if !ok { // No raw response to wrap with. return out, metadata, err } // Different header which can map to request id requestIDHeaderList := []string{"X-Amzn-Requestid", "X-Amz-RequestId"} for _, h := range requestIDHeaderList { // check for headers known to contain Request id if v := resp.Header.Get(h); len(v) != 0 { // set reqID on metadata for successful responses. SetRequestIDMetadata(&metadata, v) span, _ := tracing.GetSpan(ctx) span.SetProperty("aws.request_id", v) break } } return out, metadata, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go ================================================ package middleware import ( "context" "fmt" "os" "runtime" "sort" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) var languageVersion = strings.TrimPrefix(runtime.Version(), "go") // SDKAgentKeyType is the metadata type to add to the SDK agent string type SDKAgentKeyType int // The set of valid SDKAgentKeyType constants. If an unknown value is assigned for SDKAgentKeyType it will // be mapped to AdditionalMetadata. const ( _ SDKAgentKeyType = iota APIMetadata OperatingSystemMetadata LanguageMetadata EnvironmentMetadata FeatureMetadata ConfigMetadata FrameworkMetadata AdditionalMetadata ApplicationIdentifier FeatureMetadata2 ) // Hardcoded value to specify which version of the user agent we're using const uaMetadata = "ua/2.1" func (k SDKAgentKeyType) string() string { switch k { case APIMetadata: return "api" case OperatingSystemMetadata: return "os" case LanguageMetadata: return "lang" case EnvironmentMetadata: return "exec-env" case FeatureMetadata: return "ft" case ConfigMetadata: return "cfg" case FrameworkMetadata: return "lib" case ApplicationIdentifier: return "app" case FeatureMetadata2: return "m" case AdditionalMetadata: fallthrough default: return "md" } } const execEnvVar = `AWS_EXECUTION_ENV` var validChars = map[rune]bool{ '!': true, '#': true, '$': true, '%': true, '&': true, '\'': true, '*': true, '+': true, '-': true, '.': true, '^': true, '_': true, '`': true, '|': true, '~': true, } // UserAgentFeature enumerates tracked SDK features. type UserAgentFeature string // Enumerates UserAgentFeature. const ( UserAgentFeatureResourceModel UserAgentFeature = "A" // n/a (we don't generate separate resource types) UserAgentFeatureWaiter = "B" UserAgentFeaturePaginator = "C" UserAgentFeatureRetryModeLegacy = "D" // n/a (equivalent to standard) UserAgentFeatureRetryModeStandard = "E" UserAgentFeatureRetryModeAdaptive = "F" UserAgentFeatureS3Transfer = "G" UserAgentFeatureS3CryptoV1N = "H" // n/a (crypto client is external) UserAgentFeatureS3CryptoV2 = "I" // n/a UserAgentFeatureS3ExpressBucket = "J" UserAgentFeatureS3AccessGrants = "K" // not yet implemented UserAgentFeatureGZIPRequestCompression = "L" UserAgentFeatureProtocolRPCV2CBOR = "M" UserAgentFeatureAccountIDEndpoint = "O" // DO NOT IMPLEMENT: rules output is not currently defined. SDKs should not parse endpoints for feature information. UserAgentFeatureAccountIDModePreferred = "P" UserAgentFeatureAccountIDModeDisabled = "Q" UserAgentFeatureAccountIDModeRequired = "R" UserAgentFeatureRequestChecksumCRC32 = "U" UserAgentFeatureRequestChecksumCRC32C = "V" UserAgentFeatureRequestChecksumCRC64 = "W" UserAgentFeatureRequestChecksumSHA1 = "X" UserAgentFeatureRequestChecksumSHA256 = "Y" UserAgentFeatureRequestChecksumWhenSupported = "Z" UserAgentFeatureRequestChecksumWhenRequired = "a" UserAgentFeatureResponseChecksumWhenSupported = "b" UserAgentFeatureResponseChecksumWhenRequired = "c" UserAgentFeatureDynamoDBUserAgent = "d" // not yet implemented UserAgentFeatureCredentialsCode = "e" UserAgentFeatureCredentialsJvmSystemProperties = "f" // n/a (this is not a JVM sdk) UserAgentFeatureCredentialsEnvVars = "g" UserAgentFeatureCredentialsEnvVarsStsWebIDToken = "h" UserAgentFeatureCredentialsStsAssumeRole = "i" UserAgentFeatureCredentialsStsAssumeRoleSaml = "j" // not yet implemented UserAgentFeatureCredentialsStsAssumeRoleWebID = "k" UserAgentFeatureCredentialsStsFederationToken = "l" // not yet implemented UserAgentFeatureCredentialsStsSessionToken = "m" // not yet implemented UserAgentFeatureCredentialsProfile = "n" UserAgentFeatureCredentialsProfileSourceProfile = "o" UserAgentFeatureCredentialsProfileNamedProvider = "p" UserAgentFeatureCredentialsProfileStsWebIDToken = "q" UserAgentFeatureCredentialsProfileSso = "r" UserAgentFeatureCredentialsSso = "s" UserAgentFeatureCredentialsProfileSsoLegacy = "t" UserAgentFeatureCredentialsSsoLegacy = "u" UserAgentFeatureCredentialsProfileProcess = "v" UserAgentFeatureCredentialsProcess = "w" UserAgentFeatureCredentialsBoto2ConfigFile = "x" // n/a (this is not boto/Python) UserAgentFeatureCredentialsAwsSdkStore = "y" // n/a (this is used by .NET based sdk) UserAgentFeatureCredentialsHTTP = "z" UserAgentFeatureCredentialsIMDS = "0" ) var credentialSourceToFeature = map[aws.CredentialSource]UserAgentFeature{ aws.CredentialSourceCode: UserAgentFeatureCredentialsCode, aws.CredentialSourceEnvVars: UserAgentFeatureCredentialsEnvVars, aws.CredentialSourceEnvVarsSTSWebIDToken: UserAgentFeatureCredentialsEnvVarsStsWebIDToken, aws.CredentialSourceSTSAssumeRole: UserAgentFeatureCredentialsStsAssumeRole, aws.CredentialSourceSTSAssumeRoleSaml: UserAgentFeatureCredentialsStsAssumeRoleSaml, aws.CredentialSourceSTSAssumeRoleWebID: UserAgentFeatureCredentialsStsAssumeRoleWebID, aws.CredentialSourceSTSFederationToken: UserAgentFeatureCredentialsStsFederationToken, aws.CredentialSourceSTSSessionToken: UserAgentFeatureCredentialsStsSessionToken, aws.CredentialSourceProfile: UserAgentFeatureCredentialsProfile, aws.CredentialSourceProfileSourceProfile: UserAgentFeatureCredentialsProfileSourceProfile, aws.CredentialSourceProfileNamedProvider: UserAgentFeatureCredentialsProfileNamedProvider, aws.CredentialSourceProfileSTSWebIDToken: UserAgentFeatureCredentialsProfileStsWebIDToken, aws.CredentialSourceProfileSSO: UserAgentFeatureCredentialsProfileSso, aws.CredentialSourceSSO: UserAgentFeatureCredentialsSso, aws.CredentialSourceProfileSSOLegacy: UserAgentFeatureCredentialsProfileSsoLegacy, aws.CredentialSourceSSOLegacy: UserAgentFeatureCredentialsSsoLegacy, aws.CredentialSourceProfileProcess: UserAgentFeatureCredentialsProfileProcess, aws.CredentialSourceProcess: UserAgentFeatureCredentialsProcess, aws.CredentialSourceHTTP: UserAgentFeatureCredentialsHTTP, aws.CredentialSourceIMDS: UserAgentFeatureCredentialsIMDS, } // RequestUserAgent is a build middleware that set the User-Agent for the request. type RequestUserAgent struct { sdkAgent, userAgent *smithyhttp.UserAgentBuilder features map[UserAgentFeature]struct{} } // NewRequestUserAgent returns a new requestUserAgent which will set the User-Agent and X-Amz-User-Agent for the // request. // // User-Agent example: // // aws-sdk-go-v2/1.2.3 // // X-Amz-User-Agent example: // // aws-sdk-go-v2/1.2.3 md/GOOS/linux md/GOARCH/amd64 lang/go/1.15 func NewRequestUserAgent() *RequestUserAgent { userAgent, sdkAgent := smithyhttp.NewUserAgentBuilder(), smithyhttp.NewUserAgentBuilder() addProductName(userAgent) addUserAgentMetadata(userAgent) addProductName(sdkAgent) r := &RequestUserAgent{ sdkAgent: sdkAgent, userAgent: userAgent, features: map[UserAgentFeature]struct{}{}, } addSDKMetadata(r) return r } func addSDKMetadata(r *RequestUserAgent) { r.AddSDKAgentKey(OperatingSystemMetadata, getNormalizedOSName()) r.AddSDKAgentKeyValue(LanguageMetadata, "go", languageVersion) r.AddSDKAgentKeyValue(AdditionalMetadata, "GOOS", runtime.GOOS) r.AddSDKAgentKeyValue(AdditionalMetadata, "GOARCH", runtime.GOARCH) if ev := os.Getenv(execEnvVar); len(ev) > 0 { r.AddSDKAgentKey(EnvironmentMetadata, ev) } } func addProductName(builder *smithyhttp.UserAgentBuilder) { builder.AddKeyValue(aws.SDKName, aws.SDKVersion) } func addUserAgentMetadata(builder *smithyhttp.UserAgentBuilder) { builder.AddKey(uaMetadata) } // AddUserAgentKey retrieves a requestUserAgent from the provided stack, or initializes one. func AddUserAgentKey(key string) func(*middleware.Stack) error { return func(stack *middleware.Stack) error { requestUserAgent, err := getOrAddRequestUserAgent(stack) if err != nil { return err } requestUserAgent.AddUserAgentKey(key) return nil } } // AddUserAgentKeyValue retrieves a requestUserAgent from the provided stack, or initializes one. func AddUserAgentKeyValue(key, value string) func(*middleware.Stack) error { return func(stack *middleware.Stack) error { requestUserAgent, err := getOrAddRequestUserAgent(stack) if err != nil { return err } requestUserAgent.AddUserAgentKeyValue(key, value) return nil } } // AddSDKAgentKey retrieves a requestUserAgent from the provided stack, or initializes one. func AddSDKAgentKey(keyType SDKAgentKeyType, key string) func(*middleware.Stack) error { return func(stack *middleware.Stack) error { requestUserAgent, err := getOrAddRequestUserAgent(stack) if err != nil { return err } requestUserAgent.AddSDKAgentKey(keyType, key) return nil } } // AddSDKAgentKeyValue retrieves a requestUserAgent from the provided stack, or initializes one. func AddSDKAgentKeyValue(keyType SDKAgentKeyType, key, value string) func(*middleware.Stack) error { return func(stack *middleware.Stack) error { requestUserAgent, err := getOrAddRequestUserAgent(stack) if err != nil { return err } requestUserAgent.AddSDKAgentKeyValue(keyType, key, value) return nil } } // AddRequestUserAgentMiddleware registers a requestUserAgent middleware on the stack if not present. func AddRequestUserAgentMiddleware(stack *middleware.Stack) error { _, err := getOrAddRequestUserAgent(stack) return err } func getOrAddRequestUserAgent(stack *middleware.Stack) (*RequestUserAgent, error) { id := (*RequestUserAgent)(nil).ID() bm, ok := stack.Build.Get(id) if !ok { bm = NewRequestUserAgent() err := stack.Build.Add(bm, middleware.After) if err != nil { return nil, err } } requestUserAgent, ok := bm.(*RequestUserAgent) if !ok { return nil, fmt.Errorf("%T for %s middleware did not match expected type", bm, id) } return requestUserAgent, nil } // AddUserAgentKey adds the component identified by name to the User-Agent string. func (u *RequestUserAgent) AddUserAgentKey(key string) { u.userAgent.AddKey(strings.Map(rules, key)) } // AddUserAgentKeyValue adds the key identified by the given name and value to the User-Agent string. func (u *RequestUserAgent) AddUserAgentKeyValue(key, value string) { u.userAgent.AddKeyValue(strings.Map(rules, key), strings.Map(rules, value)) } // AddUserAgentFeature adds the feature ID to the tracking list to be emitted // in the final User-Agent string. func (u *RequestUserAgent) AddUserAgentFeature(feature UserAgentFeature) { u.features[feature] = struct{}{} } // AddSDKAgentKey adds the component identified by name to the User-Agent string. func (u *RequestUserAgent) AddSDKAgentKey(keyType SDKAgentKeyType, key string) { // TODO: should target sdkAgent u.userAgent.AddKey(keyType.string() + "/" + strings.Map(rules, key)) } // AddSDKAgentKeyValue adds the key identified by the given name and value to the User-Agent string. func (u *RequestUserAgent) AddSDKAgentKeyValue(keyType SDKAgentKeyType, key, value string) { // TODO: should target sdkAgent u.userAgent.AddKeyValue(keyType.string(), strings.Map(rules, key)+"#"+strings.Map(rules, value)) } // AddCredentialsSource adds the credential source as a feature on the User-Agent string func (u *RequestUserAgent) AddCredentialsSource(source aws.CredentialSource) { x, ok := credentialSourceToFeature[source] if ok { u.AddUserAgentFeature(x) } } // ID the name of the middleware. func (u *RequestUserAgent) ID() string { return "UserAgent" } // HandleBuild adds or appends the constructed user agent to the request. func (u *RequestUserAgent) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { switch req := in.Request.(type) { case *smithyhttp.Request: u.addHTTPUserAgent(req) // TODO: To be re-enabled // u.addHTTPSDKAgent(req) default: return out, metadata, fmt.Errorf("unknown transport type %T", in) } return next.HandleBuild(ctx, in) } func (u *RequestUserAgent) addHTTPUserAgent(request *smithyhttp.Request) { const userAgent = "User-Agent" if len(u.features) > 0 { updateHTTPHeader(request, userAgent, buildFeatureMetrics(u.features)) } updateHTTPHeader(request, userAgent, u.userAgent.Build()) } func (u *RequestUserAgent) addHTTPSDKAgent(request *smithyhttp.Request) { const sdkAgent = "X-Amz-User-Agent" updateHTTPHeader(request, sdkAgent, u.sdkAgent.Build()) } func updateHTTPHeader(request *smithyhttp.Request, header string, value string) { var current string if v := request.Header[header]; len(v) > 0 { current = v[0] } if len(current) > 0 { current = value + " " + current } else { current = value } request.Header[header] = append(request.Header[header][:0], current) } func rules(r rune) rune { switch { case r >= '0' && r <= '9': return r case r >= 'A' && r <= 'Z' || r >= 'a' && r <= 'z': return r case validChars[r]: return r default: return '-' } } func buildFeatureMetrics(features map[UserAgentFeature]struct{}) string { fs := make([]string, 0, len(features)) for f := range features { fs = append(fs, string(f)) } sort.Strings(fs) return fmt.Sprintf("%s/%s", FeatureMetadata2.string(), strings.Join(fs, ",")) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md ================================================ # v1.6.10 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 # v1.6.9 (2025-02-14) * **Bug Fix**: Remove max limit on event stream messages # v1.6.8 (2025-01-24) * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.6.7 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. # v1.6.6 (2024-10-04) * No change notes available for this release. # v1.6.5 (2024-09-20) * No change notes available for this release. # v1.6.4 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. # v1.6.3 (2024-06-28) * No change notes available for this release. # v1.6.2 (2024-03-29) * No change notes available for this release. # v1.6.1 (2024-02-21) * No change notes available for this release. # v1.6.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. # v1.5.4 (2023-12-07) * No change notes available for this release. # v1.5.3 (2023-11-30) * No change notes available for this release. # v1.5.2 (2023-11-29) * No change notes available for this release. # v1.5.1 (2023-11-15) * No change notes available for this release. # v1.5.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). # v1.4.14 (2023-10-06) * No change notes available for this release. # v1.4.13 (2023-08-18) * No change notes available for this release. # v1.4.12 (2023-08-07) * No change notes available for this release. # v1.4.11 (2023-07-31) * No change notes available for this release. # v1.4.10 (2022-12-02) * No change notes available for this release. # v1.4.9 (2022-10-24) * No change notes available for this release. # v1.4.8 (2022-09-14) * No change notes available for this release. # v1.4.7 (2022-09-02) * No change notes available for this release. # v1.4.6 (2022-08-31) * No change notes available for this release. # v1.4.5 (2022-08-29) * No change notes available for this release. # v1.4.4 (2022-08-09) * No change notes available for this release. # v1.4.3 (2022-06-29) * No change notes available for this release. # v1.4.2 (2022-06-07) * No change notes available for this release. # v1.4.1 (2022-03-24) * No change notes available for this release. # v1.4.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.3.0 (2022-02-24) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.2.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.1.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.0.0 (2021-11-06) * **Announcement**: Support has been added for AWS EventStream APIs for Kinesis, S3, and Transcribe Streaming. Support for the Lex Runtime V2 EventStream API will be added in a future release. * **Release**: Protocol support has been added for AWS event stream. * **Feature**: Updated `github.com/aws/smithy-go` to latest version ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/debug.go ================================================ package eventstream import ( "bytes" "encoding/base64" "encoding/json" "fmt" "strconv" ) type decodedMessage struct { rawMessage Headers decodedHeaders `json:"headers"` } type jsonMessage struct { Length json.Number `json:"total_length"` HeadersLen json.Number `json:"headers_length"` PreludeCRC json.Number `json:"prelude_crc"` Headers decodedHeaders `json:"headers"` Payload []byte `json:"payload"` CRC json.Number `json:"message_crc"` } func (d *decodedMessage) UnmarshalJSON(b []byte) (err error) { var jsonMsg jsonMessage if err = json.Unmarshal(b, &jsonMsg); err != nil { return err } d.Length, err = numAsUint32(jsonMsg.Length) if err != nil { return err } d.HeadersLen, err = numAsUint32(jsonMsg.HeadersLen) if err != nil { return err } d.PreludeCRC, err = numAsUint32(jsonMsg.PreludeCRC) if err != nil { return err } d.Headers = jsonMsg.Headers d.Payload = jsonMsg.Payload d.CRC, err = numAsUint32(jsonMsg.CRC) if err != nil { return err } return nil } func (d *decodedMessage) MarshalJSON() ([]byte, error) { jsonMsg := jsonMessage{ Length: json.Number(strconv.Itoa(int(d.Length))), HeadersLen: json.Number(strconv.Itoa(int(d.HeadersLen))), PreludeCRC: json.Number(strconv.Itoa(int(d.PreludeCRC))), Headers: d.Headers, Payload: d.Payload, CRC: json.Number(strconv.Itoa(int(d.CRC))), } return json.Marshal(jsonMsg) } func numAsUint32(n json.Number) (uint32, error) { v, err := n.Int64() if err != nil { return 0, fmt.Errorf("failed to get int64 json number, %v", err) } return uint32(v), nil } func (d decodedMessage) Message() Message { return Message{ Headers: Headers(d.Headers), Payload: d.Payload, } } type decodedHeaders Headers func (hs *decodedHeaders) UnmarshalJSON(b []byte) error { var jsonHeaders []struct { Name string `json:"name"` Type valueType `json:"type"` Value interface{} `json:"value"` } decoder := json.NewDecoder(bytes.NewReader(b)) decoder.UseNumber() if err := decoder.Decode(&jsonHeaders); err != nil { return err } var headers Headers for _, h := range jsonHeaders { value, err := valueFromType(h.Type, h.Value) if err != nil { return err } headers.Set(h.Name, value) } *hs = decodedHeaders(headers) return nil } func valueFromType(typ valueType, val interface{}) (Value, error) { switch typ { case trueValueType: return BoolValue(true), nil case falseValueType: return BoolValue(false), nil case int8ValueType: v, err := val.(json.Number).Int64() return Int8Value(int8(v)), err case int16ValueType: v, err := val.(json.Number).Int64() return Int16Value(int16(v)), err case int32ValueType: v, err := val.(json.Number).Int64() return Int32Value(int32(v)), err case int64ValueType: v, err := val.(json.Number).Int64() return Int64Value(v), err case bytesValueType: v, err := base64.StdEncoding.DecodeString(val.(string)) return BytesValue(v), err case stringValueType: v, err := base64.StdEncoding.DecodeString(val.(string)) return StringValue(string(v)), err case timestampValueType: v, err := val.(json.Number).Int64() return TimestampValue(timeFromEpochMilli(v)), err case uuidValueType: v, err := base64.StdEncoding.DecodeString(val.(string)) var tv UUIDValue copy(tv[:], v) return tv, err default: panic(fmt.Sprintf("unknown type, %s, %T", typ.String(), val)) } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/decode.go ================================================ package eventstream import ( "bytes" "encoding/binary" "encoding/hex" "encoding/json" "fmt" "github.com/aws/smithy-go/logging" "hash" "hash/crc32" "io" ) // DecoderOptions is the Decoder configuration options. type DecoderOptions struct { Logger logging.Logger LogMessages bool } // Decoder provides decoding of an Event Stream messages. type Decoder struct { options DecoderOptions } // NewDecoder initializes and returns a Decoder for decoding event // stream messages from the reader provided. func NewDecoder(optFns ...func(*DecoderOptions)) *Decoder { options := DecoderOptions{} for _, fn := range optFns { fn(&options) } return &Decoder{ options: options, } } // Decode attempts to decode a single message from the event stream reader. // Will return the event stream message, or error if decodeMessage fails to read // the message from the stream. // // payloadBuf is a byte slice that will be used in the returned Message.Payload. Callers // must ensure that the Message.Payload from a previous decode has been consumed before passing in the same underlying // payloadBuf byte slice. func (d *Decoder) Decode(reader io.Reader, payloadBuf []byte) (m Message, err error) { if d.options.Logger != nil && d.options.LogMessages { debugMsgBuf := bytes.NewBuffer(nil) reader = io.TeeReader(reader, debugMsgBuf) defer func() { logMessageDecode(d.options.Logger, debugMsgBuf, m, err) }() } m, err = decodeMessage(reader, payloadBuf) return m, err } // decodeMessage attempts to decode a single message from the event stream reader. // Will return the event stream message, or error if decodeMessage fails to read // the message from the reader. func decodeMessage(reader io.Reader, payloadBuf []byte) (m Message, err error) { crc := crc32.New(crc32IEEETable) hashReader := io.TeeReader(reader, crc) prelude, err := decodePrelude(hashReader, crc) if err != nil { return Message{}, err } if prelude.HeadersLen > 0 { lr := io.LimitReader(hashReader, int64(prelude.HeadersLen)) m.Headers, err = decodeHeaders(lr) if err != nil { return Message{}, err } } if payloadLen := prelude.PayloadLen(); payloadLen > 0 { buf, err := decodePayload(payloadBuf, io.LimitReader(hashReader, int64(payloadLen))) if err != nil { return Message{}, err } m.Payload = buf } msgCRC := crc.Sum32() if err := validateCRC(reader, msgCRC); err != nil { return Message{}, err } return m, nil } func logMessageDecode(logger logging.Logger, msgBuf *bytes.Buffer, msg Message, decodeErr error) { w := bytes.NewBuffer(nil) defer func() { logger.Logf(logging.Debug, w.String()) }() fmt.Fprintf(w, "Raw message:\n%s\n", hex.Dump(msgBuf.Bytes())) if decodeErr != nil { fmt.Fprintf(w, "decodeMessage error: %v\n", decodeErr) return } rawMsg, err := msg.rawMessage() if err != nil { fmt.Fprintf(w, "failed to create raw message, %v\n", err) return } decodedMsg := decodedMessage{ rawMessage: rawMsg, Headers: decodedHeaders(msg.Headers), } fmt.Fprintf(w, "Decoded message:\n") encoder := json.NewEncoder(w) if err := encoder.Encode(decodedMsg); err != nil { fmt.Fprintf(w, "failed to generate decoded message, %v\n", err) } } func decodePrelude(r io.Reader, crc hash.Hash32) (messagePrelude, error) { var p messagePrelude var err error p.Length, err = decodeUint32(r) if err != nil { return messagePrelude{}, err } p.HeadersLen, err = decodeUint32(r) if err != nil { return messagePrelude{}, err } if err := p.ValidateLens(); err != nil { return messagePrelude{}, err } preludeCRC := crc.Sum32() if err := validateCRC(r, preludeCRC); err != nil { return messagePrelude{}, err } p.PreludeCRC = preludeCRC return p, nil } func decodePayload(buf []byte, r io.Reader) ([]byte, error) { w := bytes.NewBuffer(buf[0:0]) _, err := io.Copy(w, r) return w.Bytes(), err } func decodeUint8(r io.Reader) (uint8, error) { type byteReader interface { ReadByte() (byte, error) } if br, ok := r.(byteReader); ok { v, err := br.ReadByte() return v, err } var b [1]byte _, err := io.ReadFull(r, b[:]) return b[0], err } func decodeUint16(r io.Reader) (uint16, error) { var b [2]byte bs := b[:] _, err := io.ReadFull(r, bs) if err != nil { return 0, err } return binary.BigEndian.Uint16(bs), nil } func decodeUint32(r io.Reader) (uint32, error) { var b [4]byte bs := b[:] _, err := io.ReadFull(r, bs) if err != nil { return 0, err } return binary.BigEndian.Uint32(bs), nil } func decodeUint64(r io.Reader) (uint64, error) { var b [8]byte bs := b[:] _, err := io.ReadFull(r, bs) if err != nil { return 0, err } return binary.BigEndian.Uint64(bs), nil } func validateCRC(r io.Reader, expect uint32) error { msgCRC, err := decodeUint32(r) if err != nil { return err } if msgCRC != expect { return ChecksumError{} } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/encode.go ================================================ package eventstream import ( "bytes" "encoding/binary" "encoding/hex" "encoding/json" "fmt" "github.com/aws/smithy-go/logging" "hash" "hash/crc32" "io" ) // EncoderOptions is the configuration options for Encoder. type EncoderOptions struct { Logger logging.Logger LogMessages bool } // Encoder provides EventStream message encoding. type Encoder struct { options EncoderOptions headersBuf *bytes.Buffer messageBuf *bytes.Buffer } // NewEncoder initializes and returns an Encoder to encode Event Stream // messages. func NewEncoder(optFns ...func(*EncoderOptions)) *Encoder { o := EncoderOptions{} for _, fn := range optFns { fn(&o) } return &Encoder{ options: o, headersBuf: bytes.NewBuffer(nil), messageBuf: bytes.NewBuffer(nil), } } // Encode encodes a single EventStream message to the io.Writer the Encoder // was created with. An error is returned if writing the message fails. func (e *Encoder) Encode(w io.Writer, msg Message) (err error) { e.headersBuf.Reset() e.messageBuf.Reset() var writer io.Writer = e.messageBuf if e.options.Logger != nil && e.options.LogMessages { encodeMsgBuf := bytes.NewBuffer(nil) writer = io.MultiWriter(writer, encodeMsgBuf) defer func() { logMessageEncode(e.options.Logger, encodeMsgBuf, msg, err) }() } if err = EncodeHeaders(e.headersBuf, msg.Headers); err != nil { return err } crc := crc32.New(crc32IEEETable) hashWriter := io.MultiWriter(writer, crc) headersLen := uint32(e.headersBuf.Len()) payloadLen := uint32(len(msg.Payload)) if err = encodePrelude(hashWriter, crc, headersLen, payloadLen); err != nil { return err } if headersLen > 0 { if _, err = io.Copy(hashWriter, e.headersBuf); err != nil { return err } } if payloadLen > 0 { if _, err = hashWriter.Write(msg.Payload); err != nil { return err } } msgCRC := crc.Sum32() if err := binary.Write(writer, binary.BigEndian, msgCRC); err != nil { return err } _, err = io.Copy(w, e.messageBuf) return err } func logMessageEncode(logger logging.Logger, msgBuf *bytes.Buffer, msg Message, encodeErr error) { w := bytes.NewBuffer(nil) defer func() { logger.Logf(logging.Debug, w.String()) }() fmt.Fprintf(w, "Message to encode:\n") encoder := json.NewEncoder(w) if err := encoder.Encode(msg); err != nil { fmt.Fprintf(w, "Failed to get encoded message, %v\n", err) } if encodeErr != nil { fmt.Fprintf(w, "Encode error: %v\n", encodeErr) return } fmt.Fprintf(w, "Raw message:\n%s\n", hex.Dump(msgBuf.Bytes())) } func encodePrelude(w io.Writer, crc hash.Hash32, headersLen, payloadLen uint32) error { p := messagePrelude{ Length: minMsgLen + headersLen + payloadLen, HeadersLen: headersLen, } if err := p.ValidateLens(); err != nil { return err } err := binaryWriteFields(w, binary.BigEndian, p.Length, p.HeadersLen, ) if err != nil { return err } p.PreludeCRC = crc.Sum32() err = binary.Write(w, binary.BigEndian, p.PreludeCRC) if err != nil { return err } return nil } // EncodeHeaders writes the header values to the writer encoded in the event // stream format. Returns an error if a header fails to encode. func EncodeHeaders(w io.Writer, headers Headers) error { for _, h := range headers { hn := headerName{ Len: uint8(len(h.Name)), } copy(hn.Name[:hn.Len], h.Name) if err := hn.encode(w); err != nil { return err } if err := h.Value.encode(w); err != nil { return err } } return nil } func binaryWriteFields(w io.Writer, order binary.ByteOrder, vs ...interface{}) error { for _, v := range vs { if err := binary.Write(w, order, v); err != nil { return err } } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/error.go ================================================ package eventstream import "fmt" // LengthError provides the error for items being larger than a maximum length. type LengthError struct { Part string Want int Have int Value interface{} } func (e LengthError) Error() string { return fmt.Sprintf("%s length invalid, %d/%d, %v", e.Part, e.Want, e.Have, e.Value) } // ChecksumError provides the error for message checksum invalidation errors. type ChecksumError struct{} func (e ChecksumError) Error() string { return "message checksum mismatch" } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/headers.go ================================================ package eventstreamapi // EventStream headers with specific meaning to async API functionality. const ( ChunkSignatureHeader = `:chunk-signature` // chunk signature for message DateHeader = `:date` // Date header for signature ContentTypeHeader = ":content-type" // message payload content-type // Message header and values MessageTypeHeader = `:message-type` // Identifies type of message. EventMessageType = `event` ErrorMessageType = `error` ExceptionMessageType = `exception` // Message Events EventTypeHeader = `:event-type` // Identifies message event type e.g. "Stats". // Message Error ErrorCodeHeader = `:error-code` ErrorMessageHeader = `:error-message` // Message Exception ExceptionTypeHeader = `:exception-type` ) ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/middleware.go ================================================ package eventstreamapi import ( "context" "fmt" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "io" ) type eventStreamWriterKey struct{} // GetInputStreamWriter returns EventTypeHeader io.PipeWriter used for the operation's input event stream. func GetInputStreamWriter(ctx context.Context) io.WriteCloser { writeCloser, _ := middleware.GetStackValue(ctx, eventStreamWriterKey{}).(io.WriteCloser) return writeCloser } func setInputStreamWriter(ctx context.Context, writeCloser io.WriteCloser) context.Context { return middleware.WithStackValue(ctx, eventStreamWriterKey{}, writeCloser) } // InitializeStreamWriter is a Finalize middleware initializes an in-memory pipe for sending event stream messages // via the HTTP request body. type InitializeStreamWriter struct{} // AddInitializeStreamWriter adds the InitializeStreamWriter middleware to the provided stack. func AddInitializeStreamWriter(stack *middleware.Stack) error { return stack.Finalize.Add(&InitializeStreamWriter{}, middleware.After) } // ID returns the identifier for the middleware. func (i *InitializeStreamWriter) ID() string { return "InitializeStreamWriter" } // HandleFinalize is the middleware implementation. func (i *InitializeStreamWriter) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type: %T", in.Request) } inputReader, inputWriter := io.Pipe() defer func() { if err == nil { return } _ = inputReader.Close() _ = inputWriter.Close() }() request, err = request.SetStream(inputReader) if err != nil { return out, metadata, err } in.Request = request ctx = setInputStreamWriter(ctx, inputWriter) out, metadata, err = next.HandleFinalize(ctx, in) if err != nil { return out, metadata, err } return out, metadata, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/transport.go ================================================ //go:build go1.18 // +build go1.18 package eventstreamapi import smithyhttp "github.com/aws/smithy-go/transport/http" // ApplyHTTPTransportFixes applies fixes to the HTTP request for proper event stream functionality. // // This operation is a no-op for Go 1.18 and above. func ApplyHTTPTransportFixes(r *smithyhttp.Request) error { return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi/transport_go117.go ================================================ //go:build !go1.18 // +build !go1.18 package eventstreamapi import smithyhttp "github.com/aws/smithy-go/transport/http" // ApplyHTTPTransportFixes applies fixes to the HTTP request for proper event stream functionality. func ApplyHTTPTransportFixes(r *smithyhttp.Request) error { r.Header.Set("Expect", "100-continue") return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package eventstream // goModuleVersion is the tagged release for this module const goModuleVersion = "1.6.10" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/header.go ================================================ package eventstream import ( "encoding/binary" "fmt" "io" ) // Headers are a collection of EventStream header values. type Headers []Header // Header is a single EventStream Key Value header pair. type Header struct { Name string Value Value } // Set associates the name with a value. If the header name already exists in // the Headers the value will be replaced with the new one. func (hs *Headers) Set(name string, value Value) { var i int for ; i < len(*hs); i++ { if (*hs)[i].Name == name { (*hs)[i].Value = value return } } *hs = append(*hs, Header{ Name: name, Value: value, }) } // Get returns the Value associated with the header. Nil is returned if the // value does not exist. func (hs Headers) Get(name string) Value { for i := 0; i < len(hs); i++ { if h := hs[i]; h.Name == name { return h.Value } } return nil } // Del deletes the value in the Headers if it exists. func (hs *Headers) Del(name string) { for i := 0; i < len(*hs); i++ { if (*hs)[i].Name == name { copy((*hs)[i:], (*hs)[i+1:]) (*hs) = (*hs)[:len(*hs)-1] } } } // Clone returns a deep copy of the headers func (hs Headers) Clone() Headers { o := make(Headers, 0, len(hs)) for _, h := range hs { o.Set(h.Name, h.Value) } return o } func decodeHeaders(r io.Reader) (Headers, error) { hs := Headers{} for { name, err := decodeHeaderName(r) if err != nil { if err == io.EOF { // EOF while getting header name means no more headers break } return nil, err } value, err := decodeHeaderValue(r) if err != nil { return nil, err } hs.Set(name, value) } return hs, nil } func decodeHeaderName(r io.Reader) (string, error) { var n headerName var err error n.Len, err = decodeUint8(r) if err != nil { return "", err } name := n.Name[:n.Len] if _, err := io.ReadFull(r, name); err != nil { return "", err } return string(name), nil } func decodeHeaderValue(r io.Reader) (Value, error) { var raw rawValue typ, err := decodeUint8(r) if err != nil { return nil, err } raw.Type = valueType(typ) var v Value switch raw.Type { case trueValueType: v = BoolValue(true) case falseValueType: v = BoolValue(false) case int8ValueType: var tv Int8Value err = tv.decode(r) v = tv case int16ValueType: var tv Int16Value err = tv.decode(r) v = tv case int32ValueType: var tv Int32Value err = tv.decode(r) v = tv case int64ValueType: var tv Int64Value err = tv.decode(r) v = tv case bytesValueType: var tv BytesValue err = tv.decode(r) v = tv case stringValueType: var tv StringValue err = tv.decode(r) v = tv case timestampValueType: var tv TimestampValue err = tv.decode(r) v = tv case uuidValueType: var tv UUIDValue err = tv.decode(r) v = tv default: panic(fmt.Sprintf("unknown value type %d", raw.Type)) } // Error could be EOF, let caller deal with it return v, err } const maxHeaderNameLen = 255 type headerName struct { Len uint8 Name [maxHeaderNameLen]byte } func (v headerName) encode(w io.Writer) error { if err := binary.Write(w, binary.BigEndian, v.Len); err != nil { return err } _, err := w.Write(v.Name[:v.Len]) return err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/header_value.go ================================================ package eventstream import ( "encoding/base64" "encoding/binary" "encoding/hex" "fmt" "io" "strconv" "time" ) const maxHeaderValueLen = 1<<15 - 1 // 2^15-1 or 32KB - 1 // valueType is the EventStream header value type. type valueType uint8 // Header value types const ( trueValueType valueType = iota falseValueType int8ValueType // Byte int16ValueType // Short int32ValueType // Integer int64ValueType // Long bytesValueType stringValueType timestampValueType uuidValueType ) func (t valueType) String() string { switch t { case trueValueType: return "bool" case falseValueType: return "bool" case int8ValueType: return "int8" case int16ValueType: return "int16" case int32ValueType: return "int32" case int64ValueType: return "int64" case bytesValueType: return "byte_array" case stringValueType: return "string" case timestampValueType: return "timestamp" case uuidValueType: return "uuid" default: return fmt.Sprintf("unknown value type %d", uint8(t)) } } type rawValue struct { Type valueType Len uint16 // Only set for variable length slices Value []byte // byte representation of value, BigEndian encoding. } func (r rawValue) encodeScalar(w io.Writer, v interface{}) error { return binaryWriteFields(w, binary.BigEndian, r.Type, v, ) } func (r rawValue) encodeFixedSlice(w io.Writer, v []byte) error { binary.Write(w, binary.BigEndian, r.Type) _, err := w.Write(v) return err } func (r rawValue) encodeBytes(w io.Writer, v []byte) error { if len(v) > maxHeaderValueLen { return LengthError{ Part: "header value", Want: maxHeaderValueLen, Have: len(v), Value: v, } } r.Len = uint16(len(v)) err := binaryWriteFields(w, binary.BigEndian, r.Type, r.Len, ) if err != nil { return err } _, err = w.Write(v) return err } func (r rawValue) encodeString(w io.Writer, v string) error { if len(v) > maxHeaderValueLen { return LengthError{ Part: "header value", Want: maxHeaderValueLen, Have: len(v), Value: v, } } r.Len = uint16(len(v)) type stringWriter interface { WriteString(string) (int, error) } err := binaryWriteFields(w, binary.BigEndian, r.Type, r.Len, ) if err != nil { return err } if sw, ok := w.(stringWriter); ok { _, err = sw.WriteString(v) } else { _, err = w.Write([]byte(v)) } return err } func decodeFixedBytesValue(r io.Reader, buf []byte) error { _, err := io.ReadFull(r, buf) return err } func decodeBytesValue(r io.Reader) ([]byte, error) { var raw rawValue var err error raw.Len, err = decodeUint16(r) if err != nil { return nil, err } buf := make([]byte, raw.Len) _, err = io.ReadFull(r, buf) if err != nil { return nil, err } return buf, nil } func decodeStringValue(r io.Reader) (string, error) { v, err := decodeBytesValue(r) return string(v), err } // Value represents the abstract header value. type Value interface { Get() interface{} String() string valueType() valueType encode(io.Writer) error } // An BoolValue provides eventstream encoding, and representation // of a Go bool value. type BoolValue bool // Get returns the underlying type func (v BoolValue) Get() interface{} { return bool(v) } // valueType returns the EventStream header value type value. func (v BoolValue) valueType() valueType { if v { return trueValueType } return falseValueType } func (v BoolValue) String() string { return strconv.FormatBool(bool(v)) } // encode encodes the BoolValue into an eventstream binary value // representation. func (v BoolValue) encode(w io.Writer) error { return binary.Write(w, binary.BigEndian, v.valueType()) } // An Int8Value provides eventstream encoding, and representation of a Go // int8 value. type Int8Value int8 // Get returns the underlying value. func (v Int8Value) Get() interface{} { return int8(v) } // valueType returns the EventStream header value type value. func (Int8Value) valueType() valueType { return int8ValueType } func (v Int8Value) String() string { return fmt.Sprintf("0x%02x", int8(v)) } // encode encodes the Int8Value into an eventstream binary value // representation. func (v Int8Value) encode(w io.Writer) error { raw := rawValue{ Type: v.valueType(), } return raw.encodeScalar(w, v) } func (v *Int8Value) decode(r io.Reader) error { n, err := decodeUint8(r) if err != nil { return err } *v = Int8Value(n) return nil } // An Int16Value provides eventstream encoding, and representation of a Go // int16 value. type Int16Value int16 // Get returns the underlying value. func (v Int16Value) Get() interface{} { return int16(v) } // valueType returns the EventStream header value type value. func (Int16Value) valueType() valueType { return int16ValueType } func (v Int16Value) String() string { return fmt.Sprintf("0x%04x", int16(v)) } // encode encodes the Int16Value into an eventstream binary value // representation. func (v Int16Value) encode(w io.Writer) error { raw := rawValue{ Type: v.valueType(), } return raw.encodeScalar(w, v) } func (v *Int16Value) decode(r io.Reader) error { n, err := decodeUint16(r) if err != nil { return err } *v = Int16Value(n) return nil } // An Int32Value provides eventstream encoding, and representation of a Go // int32 value. type Int32Value int32 // Get returns the underlying value. func (v Int32Value) Get() interface{} { return int32(v) } // valueType returns the EventStream header value type value. func (Int32Value) valueType() valueType { return int32ValueType } func (v Int32Value) String() string { return fmt.Sprintf("0x%08x", int32(v)) } // encode encodes the Int32Value into an eventstream binary value // representation. func (v Int32Value) encode(w io.Writer) error { raw := rawValue{ Type: v.valueType(), } return raw.encodeScalar(w, v) } func (v *Int32Value) decode(r io.Reader) error { n, err := decodeUint32(r) if err != nil { return err } *v = Int32Value(n) return nil } // An Int64Value provides eventstream encoding, and representation of a Go // int64 value. type Int64Value int64 // Get returns the underlying value. func (v Int64Value) Get() interface{} { return int64(v) } // valueType returns the EventStream header value type value. func (Int64Value) valueType() valueType { return int64ValueType } func (v Int64Value) String() string { return fmt.Sprintf("0x%016x", int64(v)) } // encode encodes the Int64Value into an eventstream binary value // representation. func (v Int64Value) encode(w io.Writer) error { raw := rawValue{ Type: v.valueType(), } return raw.encodeScalar(w, v) } func (v *Int64Value) decode(r io.Reader) error { n, err := decodeUint64(r) if err != nil { return err } *v = Int64Value(n) return nil } // An BytesValue provides eventstream encoding, and representation of a Go // byte slice. type BytesValue []byte // Get returns the underlying value. func (v BytesValue) Get() interface{} { return []byte(v) } // valueType returns the EventStream header value type value. func (BytesValue) valueType() valueType { return bytesValueType } func (v BytesValue) String() string { return base64.StdEncoding.EncodeToString([]byte(v)) } // encode encodes the BytesValue into an eventstream binary value // representation. func (v BytesValue) encode(w io.Writer) error { raw := rawValue{ Type: v.valueType(), } return raw.encodeBytes(w, []byte(v)) } func (v *BytesValue) decode(r io.Reader) error { buf, err := decodeBytesValue(r) if err != nil { return err } *v = BytesValue(buf) return nil } // An StringValue provides eventstream encoding, and representation of a Go // string. type StringValue string // Get returns the underlying value. func (v StringValue) Get() interface{} { return string(v) } // valueType returns the EventStream header value type value. func (StringValue) valueType() valueType { return stringValueType } func (v StringValue) String() string { return string(v) } // encode encodes the StringValue into an eventstream binary value // representation. func (v StringValue) encode(w io.Writer) error { raw := rawValue{ Type: v.valueType(), } return raw.encodeString(w, string(v)) } func (v *StringValue) decode(r io.Reader) error { s, err := decodeStringValue(r) if err != nil { return err } *v = StringValue(s) return nil } // An TimestampValue provides eventstream encoding, and representation of a Go // timestamp. type TimestampValue time.Time // Get returns the underlying value. func (v TimestampValue) Get() interface{} { return time.Time(v) } // valueType returns the EventStream header value type value. func (TimestampValue) valueType() valueType { return timestampValueType } func (v TimestampValue) epochMilli() int64 { nano := time.Time(v).UnixNano() msec := nano / int64(time.Millisecond) return msec } func (v TimestampValue) String() string { msec := v.epochMilli() return strconv.FormatInt(msec, 10) } // encode encodes the TimestampValue into an eventstream binary value // representation. func (v TimestampValue) encode(w io.Writer) error { raw := rawValue{ Type: v.valueType(), } msec := v.epochMilli() return raw.encodeScalar(w, msec) } func (v *TimestampValue) decode(r io.Reader) error { n, err := decodeUint64(r) if err != nil { return err } *v = TimestampValue(timeFromEpochMilli(int64(n))) return nil } // MarshalJSON implements the json.Marshaler interface func (v TimestampValue) MarshalJSON() ([]byte, error) { return []byte(v.String()), nil } func timeFromEpochMilli(t int64) time.Time { secs := t / 1e3 msec := t % 1e3 return time.Unix(secs, msec*int64(time.Millisecond)).UTC() } // An UUIDValue provides eventstream encoding, and representation of a UUID // value. type UUIDValue [16]byte // Get returns the underlying value. func (v UUIDValue) Get() interface{} { return v[:] } // valueType returns the EventStream header value type value. func (UUIDValue) valueType() valueType { return uuidValueType } func (v UUIDValue) String() string { var scratch [36]byte const dash = '-' hex.Encode(scratch[:8], v[0:4]) scratch[8] = dash hex.Encode(scratch[9:13], v[4:6]) scratch[13] = dash hex.Encode(scratch[14:18], v[6:8]) scratch[18] = dash hex.Encode(scratch[19:23], v[8:10]) scratch[23] = dash hex.Encode(scratch[24:], v[10:]) return string(scratch[:]) } // encode encodes the UUIDValue into an eventstream binary value // representation. func (v UUIDValue) encode(w io.Writer) error { raw := rawValue{ Type: v.valueType(), } return raw.encodeFixedSlice(w, v[:]) } func (v *UUIDValue) decode(r io.Reader) error { tv := (*v)[:] return decodeFixedBytesValue(r, tv) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/message.go ================================================ package eventstream import ( "bytes" "encoding/binary" "hash/crc32" ) const preludeLen = 8 const preludeCRCLen = 4 const msgCRCLen = 4 const minMsgLen = preludeLen + preludeCRCLen + msgCRCLen var crc32IEEETable = crc32.MakeTable(crc32.IEEE) // A Message provides the eventstream message representation. type Message struct { Headers Headers Payload []byte } func (m *Message) rawMessage() (rawMessage, error) { var raw rawMessage if len(m.Headers) > 0 { var headers bytes.Buffer if err := EncodeHeaders(&headers, m.Headers); err != nil { return rawMessage{}, err } raw.Headers = headers.Bytes() raw.HeadersLen = uint32(len(raw.Headers)) } raw.Length = raw.HeadersLen + uint32(len(m.Payload)) + minMsgLen hash := crc32.New(crc32IEEETable) binaryWriteFields(hash, binary.BigEndian, raw.Length, raw.HeadersLen) raw.PreludeCRC = hash.Sum32() binaryWriteFields(hash, binary.BigEndian, raw.PreludeCRC) if raw.HeadersLen > 0 { hash.Write(raw.Headers) } // Read payload bytes and update hash for it as well. if len(m.Payload) > 0 { raw.Payload = m.Payload hash.Write(raw.Payload) } raw.CRC = hash.Sum32() return raw, nil } // Clone returns a deep copy of the message. func (m Message) Clone() Message { var payload []byte if m.Payload != nil { payload = make([]byte, len(m.Payload)) copy(payload, m.Payload) } return Message{ Headers: m.Headers.Clone(), Payload: payload, } } type messagePrelude struct { Length uint32 HeadersLen uint32 PreludeCRC uint32 } func (p messagePrelude) PayloadLen() uint32 { return p.Length - p.HeadersLen - minMsgLen } func (p messagePrelude) ValidateLens() error { if p.Length == 0 { return LengthError{ Part: "message prelude", Want: minMsgLen, Have: int(p.Length), } } return nil } type rawMessage struct { messagePrelude Headers []byte Payload []byte CRC uint32 } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/array.go ================================================ package query import ( "net/url" "strconv" ) // Array represents the encoding of Query lists and sets. A Query array is a // representation of a list of values of a fixed type. A serialized array might // look like the following: // // ListName.member.1=foo // &ListName.member.2=bar // &Listname.member.3=baz type Array struct { // The query values to add the array to. values url.Values // The array's prefix, which includes the names of all parent structures // and ends with the name of the list. For example, the prefix might be // "ParentStructure.ListName". This prefix will be used to form the full // keys for each element in the list. For example, an entry might have the // key "ParentStructure.ListName.member.MemberName.1". // // When the array is not flat the prefix will contain the memberName otherwise the memberName is ignored prefix string // Elements are stored in values, so we keep track of the list size here. size int32 // Empty lists are encoded as "=", if we add a value later we will // remove this encoding emptyValue Value } func newArray(values url.Values, prefix string, flat bool, memberName string) *Array { emptyValue := newValue(values, prefix, flat) emptyValue.String("") if !flat { // This uses string concatenation in place of fmt.Sprintf as fmt.Sprintf has a much higher resource overhead prefix = prefix + keySeparator + memberName } return &Array{ values: values, prefix: prefix, emptyValue: emptyValue, } } // Value adds a new element to the Query Array. Returns a Value type used to // encode the array element. func (a *Array) Value() Value { if a.size == 0 { delete(a.values, a.emptyValue.key) } // Query lists start a 1, so adjust the size first a.size++ // Lists can't have flat members // This uses string concatenation in place of fmt.Sprintf as fmt.Sprintf has a much higher resource overhead return newValue(a.values, a.prefix+keySeparator+strconv.FormatInt(int64(a.size), 10), false) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/encoder.go ================================================ package query import ( "io" "net/url" "sort" ) // Encoder is a Query encoder that supports construction of Query body // values using methods. type Encoder struct { // The query values that will be built up to manage encoding. values url.Values // The writer that the encoded body will be written to. writer io.Writer Value } // NewEncoder returns a new Query body encoder func NewEncoder(writer io.Writer) *Encoder { values := url.Values{} return &Encoder{ values: values, writer: writer, Value: newBaseValue(values), } } // Encode returns the []byte slice representing the current // state of the Query encoder. func (e Encoder) Encode() error { ws, ok := e.writer.(interface{ WriteString(string) (int, error) }) if !ok { // Fall back to less optimal byte slice casting if WriteString isn't available. ws = &wrapWriteString{writer: e.writer} } // Get the keys and sort them to have a stable output keys := make([]string, 0, len(e.values)) for k := range e.values { keys = append(keys, k) } sort.Strings(keys) isFirstEntry := true for _, key := range keys { queryValues := e.values[key] escapedKey := url.QueryEscape(key) for _, value := range queryValues { if !isFirstEntry { if _, err := ws.WriteString(`&`); err != nil { return err } } else { isFirstEntry = false } if _, err := ws.WriteString(escapedKey); err != nil { return err } if _, err := ws.WriteString(`=`); err != nil { return err } if _, err := ws.WriteString(url.QueryEscape(value)); err != nil { return err } } } return nil } // wrapWriteString wraps an io.Writer to provide a WriteString method // where one is not available. type wrapWriteString struct { writer io.Writer } // WriteString writes a string to the wrapped writer by casting it to // a byte array first. func (w wrapWriteString) WriteString(v string) (int, error) { return w.writer.Write([]byte(v)) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/map.go ================================================ package query import ( "fmt" "net/url" ) // Map represents the encoding of Query maps. A Query map is a representation // of a mapping of arbitrary string keys to arbitrary values of a fixed type. // A Map differs from an Object in that the set of keys is not fixed, in that // the values must all be of the same type, and that map entries are ordered. // A serialized map might look like the following: // // MapName.entry.1.key=Foo // &MapName.entry.1.value=spam // &MapName.entry.2.key=Bar // &MapName.entry.2.value=eggs type Map struct { // The query values to add the map to. values url.Values // The map's prefix, which includes the names of all parent structures // and ends with the name of the object. For example, the prefix might be // "ParentStructure.MapName". This prefix will be used to form the full // keys for each key-value pair of the map. For example, a value might have // the key "ParentStructure.MapName.1.value". // // While this is currently represented as a string that gets added to, it // could also be represented as a stack that only gets condensed into a // string when a finalized key is created. This could potentially reduce // allocations. prefix string // Whether the map is flat or not. A map that is not flat will produce the // following entries to the url.Values for a given key-value pair: // MapName.entry.1.KeyLocationName=mykey // MapName.entry.1.ValueLocationName=myvalue // A map that is flat will produce the following: // MapName.1.KeyLocationName=mykey // MapName.1.ValueLocationName=myvalue flat bool // The location name of the key. In most cases this should be "key". keyLocationName string // The location name of the value. In most cases this should be "value". valueLocationName string // Elements are stored in values, so we keep track of the list size here. size int32 } func newMap(values url.Values, prefix string, flat bool, keyLocationName string, valueLocationName string) *Map { return &Map{ values: values, prefix: prefix, flat: flat, keyLocationName: keyLocationName, valueLocationName: valueLocationName, } } // Key adds the given named key to the Query map. // Returns a Value encoder that should be used to encode a Query value type. func (m *Map) Key(name string) Value { // Query lists start a 1, so adjust the size first m.size++ var key string var value string if m.flat { key = fmt.Sprintf("%s.%d.%s", m.prefix, m.size, m.keyLocationName) value = fmt.Sprintf("%s.%d.%s", m.prefix, m.size, m.valueLocationName) } else { key = fmt.Sprintf("%s.entry.%d.%s", m.prefix, m.size, m.keyLocationName) value = fmt.Sprintf("%s.entry.%d.%s", m.prefix, m.size, m.valueLocationName) } // The key can only be a string, so we just go ahead and set it here newValue(m.values, key, false).String(name) // Maps can't have flat members return newValue(m.values, value, false) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/middleware.go ================================================ package query import ( "context" "fmt" "io/ioutil" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // AddAsGetRequestMiddleware adds a middleware to the Serialize stack after the // operation serializer that will convert the query request body to a GET // operation with the query message in the HTTP request querystring. func AddAsGetRequestMiddleware(stack *middleware.Stack) error { return stack.Serialize.Insert(&asGetRequest{}, "OperationSerializer", middleware.After) } type asGetRequest struct{} func (*asGetRequest) ID() string { return "Query:AsGetRequest" } func (m *asGetRequest) HandleSerialize( ctx context.Context, input middleware.SerializeInput, next middleware.SerializeHandler, ) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { req, ok := input.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("expect smithy HTTP Request, got %T", input.Request) } req.Method = "GET" // If the stream is not set, nothing else to do. stream := req.GetStream() if stream == nil { return next.HandleSerialize(ctx, input) } // Clear the stream since there will not be any body. req.Header.Del("Content-Type") req, err = req.SetStream(nil) if err != nil { return out, metadata, fmt.Errorf("unable update request body %w", err) } input.Request = req // Update request query with the body's query string value. delim := "" if len(req.URL.RawQuery) != 0 { delim = "&" } b, err := ioutil.ReadAll(stream) if err != nil { return out, metadata, fmt.Errorf("unable to get request body %w", err) } req.URL.RawQuery += delim + string(b) return next.HandleSerialize(ctx, input) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/object.go ================================================ package query import "net/url" // Object represents the encoding of Query structures and unions. A Query // object is a representation of a mapping of string keys to arbitrary // values where there is a fixed set of keys whose values each have their // own known type. A serialized object might look like the following: // // ObjectName.Foo=value // &ObjectName.Bar=5 type Object struct { // The query values to add the object to. values url.Values // The object's prefix, which includes the names of all parent structures // and ends with the name of the object. For example, the prefix might be // "ParentStructure.ObjectName". This prefix will be used to form the full // keys for each member of the object. For example, a member might have the // key "ParentStructure.ObjectName.MemberName". // // While this is currently represented as a string that gets added to, it // could also be represented as a stack that only gets condensed into a // string when a finalized key is created. This could potentially reduce // allocations. prefix string } func newObject(values url.Values, prefix string) *Object { return &Object{ values: values, prefix: prefix, } } // Key adds the given named key to the Query object. // Returns a Value encoder that should be used to encode a Query value type. func (o *Object) Key(name string) Value { return o.key(name, false) } // KeyWithValues adds the given named key to the Query object. // Returns a Value encoder that should be used to encode a Query list of values. func (o *Object) KeyWithValues(name string) Value { return o.keyWithValues(name, false) } // FlatKey adds the given named key to the Query object. // Returns a Value encoder that should be used to encode a Query value type. The // value will be flattened if it is a map or array. func (o *Object) FlatKey(name string) Value { return o.key(name, true) } func (o *Object) key(name string, flatValue bool) Value { if o.prefix != "" { // This uses string concatenation in place of fmt.Sprintf as fmt.Sprintf has a much higher resource overhead return newValue(o.values, o.prefix+keySeparator+name, flatValue) } return newValue(o.values, name, flatValue) } func (o *Object) keyWithValues(name string, flatValue bool) Value { if o.prefix != "" { // This uses string concatenation in place of fmt.Sprintf as fmt.Sprintf has a much higher resource overhead return newAppendValue(o.values, o.prefix+keySeparator+name, flatValue) } return newAppendValue(o.values, name, flatValue) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/query/value.go ================================================ package query import ( "math/big" "net/url" "github.com/aws/smithy-go/encoding/httpbinding" ) const keySeparator = "." // Value represents a Query Value type. type Value struct { // The query values to add the value to. values url.Values // The value's key, which will form the prefix for complex types. key string // Whether the value should be flattened or not if it's a flattenable type. flat bool queryValue httpbinding.QueryValue } func newValue(values url.Values, key string, flat bool) Value { return Value{ values: values, key: key, flat: flat, queryValue: httpbinding.NewQueryValue(values, key, false), } } func newAppendValue(values url.Values, key string, flat bool) Value { return Value{ values: values, key: key, flat: flat, queryValue: httpbinding.NewQueryValue(values, key, true), } } func newBaseValue(values url.Values) Value { return Value{ values: values, queryValue: httpbinding.NewQueryValue(nil, "", false), } } // Array returns a new Array encoder. func (qv Value) Array(locationName string) *Array { return newArray(qv.values, qv.key, qv.flat, locationName) } // Object returns a new Object encoder. func (qv Value) Object() *Object { return newObject(qv.values, qv.key) } // Map returns a new Map encoder. func (qv Value) Map(keyLocationName string, valueLocationName string) *Map { return newMap(qv.values, qv.key, qv.flat, keyLocationName, valueLocationName) } // Base64EncodeBytes encodes v as a base64 query string value. // This is intended to enable compatibility with the JSON encoder. func (qv Value) Base64EncodeBytes(v []byte) { qv.queryValue.Blob(v) } // Boolean encodes v as a query string value func (qv Value) Boolean(v bool) { qv.queryValue.Boolean(v) } // String encodes v as a query string value func (qv Value) String(v string) { qv.queryValue.String(v) } // Byte encodes v as a query string value func (qv Value) Byte(v int8) { qv.queryValue.Byte(v) } // Short encodes v as a query string value func (qv Value) Short(v int16) { qv.queryValue.Short(v) } // Integer encodes v as a query string value func (qv Value) Integer(v int32) { qv.queryValue.Integer(v) } // Long encodes v as a query string value func (qv Value) Long(v int64) { qv.queryValue.Long(v) } // Float encodes v as a query string value func (qv Value) Float(v float32) { qv.queryValue.Float(v) } // Double encodes v as a query string value func (qv Value) Double(v float64) { qv.queryValue.Double(v) } // BigInteger encodes v as a query string value func (qv Value) BigInteger(v *big.Int) { qv.queryValue.BigInteger(v) } // BigDecimal encodes v as a query string value func (qv Value) BigDecimal(v *big.Float) { qv.queryValue.BigDecimal(v) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/restjson/decoder_util.go ================================================ package restjson import ( "encoding/json" "io" "strings" "github.com/aws/smithy-go" ) // GetErrorInfo util looks for code, __type, and message members in the // json body. These members are optionally available, and the function // returns the value of member if it is available. This function is useful to // identify the error code, msg in a REST JSON error response. func GetErrorInfo(decoder *json.Decoder) (errorType string, message string, err error) { var errInfo struct { Code string Type string `json:"__type"` Message string } err = decoder.Decode(&errInfo) if err != nil { if err == io.EOF { return errorType, message, nil } return errorType, message, err } // assign error type if len(errInfo.Code) != 0 { errorType = errInfo.Code } else if len(errInfo.Type) != 0 { errorType = errInfo.Type } // assign error message if len(errInfo.Message) != 0 { message = errInfo.Message } // sanitize error if len(errorType) != 0 { errorType = SanitizeErrorCode(errorType) } return errorType, message, nil } // SanitizeErrorCode sanitizes the errorCode string . // The rule for sanitizing is if a `:` character is present, then take only the // contents before the first : character in the value. // If a # character is present, then take only the contents after the // first # character in the value. func SanitizeErrorCode(errorCode string) string { if strings.ContainsAny(errorCode, ":") { errorCode = strings.SplitN(errorCode, ":", 2)[0] } if strings.ContainsAny(errorCode, "#") { errorCode = strings.SplitN(errorCode, "#", 2)[1] } return errorCode } // GetSmithyGenericAPIError returns smithy generic api error and an error interface. // Takes in json decoder, and error Code string as args. The function retrieves error message // and error code from the decoder body. If errorCode of length greater than 0 is passed in as // an argument, it is used instead. func GetSmithyGenericAPIError(decoder *json.Decoder, errorCode string) (*smithy.GenericAPIError, error) { errorType, message, err := GetErrorInfo(decoder) if err != nil { return nil, err } if len(errorCode) == 0 { errorCode = errorType } return &smithy.GenericAPIError{ Code: errorCode, Message: message, }, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/xml/error_utils.go ================================================ package xml import ( "encoding/xml" "fmt" "io" ) // ErrorComponents represents the error response fields // that will be deserialized from an xml error response body type ErrorComponents struct { Code string Message string RequestID string } // GetErrorResponseComponents returns the error fields from an xml error response body func GetErrorResponseComponents(r io.Reader, noErrorWrapping bool) (ErrorComponents, error) { if noErrorWrapping { var errResponse noWrappedErrorResponse if err := xml.NewDecoder(r).Decode(&errResponse); err != nil && err != io.EOF { return ErrorComponents{}, fmt.Errorf("error while deserializing xml error response: %w", err) } return ErrorComponents(errResponse), nil } var errResponse wrappedErrorResponse if err := xml.NewDecoder(r).Decode(&errResponse); err != nil && err != io.EOF { return ErrorComponents{}, fmt.Errorf("error while deserializing xml error response: %w", err) } return ErrorComponents(errResponse), nil } // noWrappedErrorResponse represents the error response body with // no internal Error wrapping type noWrappedErrorResponse struct { Code string `xml:"Code"` Message string `xml:"Message"` RequestID string `xml:"RequestId"` } // wrappedErrorResponse represents the error response body // wrapped within Error type wrappedErrorResponse struct { Code string `xml:"Error>Code"` Message string `xml:"Error>Message"` RequestID string `xml:"RequestId"` } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/none.go ================================================ package ratelimit import "context" // None implements a no-op rate limiter which effectively disables client-side // rate limiting (also known as "retry quotas"). // // GetToken does nothing and always returns a nil error. The returned // token-release function does nothing, and always returns a nil error. // // AddTokens does nothing and always returns a nil error. var None = &none{} type none struct{} func (*none) GetToken(ctx context.Context, cost uint) (func() error, error) { return func() error { return nil }, nil } func (*none) AddTokens(v uint) error { return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_bucket.go ================================================ package ratelimit import ( "sync" ) // TokenBucket provides a concurrency safe utility for adding and removing // tokens from the available token bucket. type TokenBucket struct { remainingTokens uint maxCapacity uint minCapacity uint mu sync.Mutex } // NewTokenBucket returns an initialized TokenBucket with the capacity // specified. func NewTokenBucket(i uint) *TokenBucket { return &TokenBucket{ remainingTokens: i, maxCapacity: i, minCapacity: 1, } } // Retrieve attempts to reduce the available tokens by the amount requested. If // there are tokens available true will be returned along with the number of // available tokens remaining. If amount requested is larger than the available // capacity, false will be returned along with the available capacity. If the // amount is less than the available capacity, the capacity will be reduced by // that amount, and the remaining capacity and true will be returned. func (t *TokenBucket) Retrieve(amount uint) (available uint, retrieved bool) { t.mu.Lock() defer t.mu.Unlock() if amount > t.remainingTokens { return t.remainingTokens, false } t.remainingTokens -= amount return t.remainingTokens, true } // Refund returns the amount of tokens back to the available token bucket, up // to the initial capacity. func (t *TokenBucket) Refund(amount uint) { t.mu.Lock() defer t.mu.Unlock() // Capacity cannot exceed max capacity. t.remainingTokens = uintMin(t.remainingTokens+amount, t.maxCapacity) } // Capacity returns the maximum capacity of tokens that the bucket could // contain. func (t *TokenBucket) Capacity() uint { t.mu.Lock() defer t.mu.Unlock() return t.maxCapacity } // Remaining returns the number of tokens that remaining in the bucket. func (t *TokenBucket) Remaining() uint { t.mu.Lock() defer t.mu.Unlock() return t.remainingTokens } // Resize adjusts the size of the token bucket. Returns the capacity remaining. func (t *TokenBucket) Resize(size uint) uint { t.mu.Lock() defer t.mu.Unlock() t.maxCapacity = uintMax(size, t.minCapacity) // Capacity needs to be capped at max capacity, if max size reduced. t.remainingTokens = uintMin(t.remainingTokens, t.maxCapacity) return t.remainingTokens } func uintMin(a, b uint) uint { if a < b { return a } return b } func uintMax(a, b uint) uint { if a > b { return a } return b } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/ratelimit/token_rate_limit.go ================================================ package ratelimit import ( "context" "fmt" ) type rateToken struct { tokenCost uint bucket *TokenBucket } func (t rateToken) release() error { t.bucket.Refund(t.tokenCost) return nil } // TokenRateLimit provides a Token Bucket RateLimiter implementation // that limits the overall number of retry attempts that can be made across // operation invocations. type TokenRateLimit struct { bucket *TokenBucket } // NewTokenRateLimit returns an TokenRateLimit with default values. // Functional options can configure the retry rate limiter. func NewTokenRateLimit(tokens uint) *TokenRateLimit { return &TokenRateLimit{ bucket: NewTokenBucket(tokens), } } type canceledError struct { Err error } func (c canceledError) CanceledError() bool { return true } func (c canceledError) Unwrap() error { return c.Err } func (c canceledError) Error() string { return fmt.Sprintf("canceled, %v", c.Err) } // GetToken may cause a available pool of retry quota to be // decremented. Will return an error if the decremented value can not be // reduced from the retry quota. func (l *TokenRateLimit) GetToken(ctx context.Context, cost uint) (func() error, error) { select { case <-ctx.Done(): return nil, canceledError{Err: ctx.Err()} default: } if avail, ok := l.bucket.Retrieve(cost); !ok { return nil, QuotaExceededError{Available: avail, Requested: cost} } return rateToken{ tokenCost: cost, bucket: l.bucket, }.release, nil } // AddTokens increments the token bucket by a fixed amount. func (l *TokenRateLimit) AddTokens(v uint) error { l.bucket.Refund(v) return nil } // Remaining returns the number of remaining tokens in the bucket. func (l *TokenRateLimit) Remaining() uint { return l.bucket.Remaining() } // QuotaExceededError provides the SDK error when the retries for a given // token bucket have been exhausted. type QuotaExceededError struct { Available uint Requested uint } func (e QuotaExceededError) Error() string { return fmt.Sprintf("retry quota exceeded, %d available, %d requested", e.Available, e.Requested) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/request.go ================================================ package aws import ( "fmt" ) // TODO remove replace with smithy.CanceledError // RequestCanceledError is the error that will be returned by an API request // that was canceled. Requests given a Context may return this error when // canceled. type RequestCanceledError struct { Err error } // CanceledError returns true to satisfy interfaces checking for canceled errors. func (*RequestCanceledError) CanceledError() bool { return true } // Unwrap returns the underlying error, if there was one. func (e *RequestCanceledError) Unwrap() error { return e.Err } func (e *RequestCanceledError) Error() string { return fmt.Sprintf("request canceled, %v", e.Err) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive.go ================================================ package retry import ( "context" "fmt" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/internal/sdk" ) const ( // DefaultRequestCost is the cost of a single request from the adaptive // rate limited token bucket. DefaultRequestCost uint = 1 ) // DefaultThrottles provides the set of errors considered throttle errors that // are checked by default. var DefaultThrottles = []IsErrorThrottle{ ThrottleErrorCode{ Codes: DefaultThrottleErrorCodes, }, } // AdaptiveModeOptions provides the functional options for configuring the // adaptive retry mode, and delay behavior. type AdaptiveModeOptions struct { // If the adaptive token bucket is empty, when an attempt will be made // AdaptiveMode will sleep until a token is available. This can occur when // attempts fail with throttle errors. Use this option to disable the sleep // until token is available, and return error immediately. FailOnNoAttemptTokens bool // The cost of an attempt from the AdaptiveMode's adaptive token bucket. RequestCost uint // Set of strategies to determine if the attempt failed due to a throttle // error. // // It is safe to append to this list in NewAdaptiveMode's functional options. Throttles []IsErrorThrottle // Set of options for standard retry mode that AdaptiveMode is built on top // of. AdaptiveMode may apply its own defaults to Standard retry mode that // are different than the defaults of NewStandard. Use these options to // override the default options. StandardOptions []func(*StandardOptions) } // AdaptiveMode provides an experimental retry strategy that expands on the // Standard retry strategy, adding client attempt rate limits. The attempt rate // limit is initially unrestricted, but becomes restricted when the attempt // fails with for a throttle error. When restricted AdaptiveMode may need to // sleep before an attempt is made, if too many throttles have been received. // AdaptiveMode's sleep can be canceled with context cancel. Set // AdaptiveModeOptions FailOnNoAttemptTokens to change the behavior from sleep, // to fail fast. // // Eventually unrestricted attempt rate limit will be restored once attempts no // longer are failing due to throttle errors. type AdaptiveMode struct { options AdaptiveModeOptions throttles IsErrorThrottles retryer aws.RetryerV2 rateLimit *adaptiveRateLimit } // NewAdaptiveMode returns an initialized AdaptiveMode retry strategy. func NewAdaptiveMode(optFns ...func(*AdaptiveModeOptions)) *AdaptiveMode { o := AdaptiveModeOptions{ RequestCost: DefaultRequestCost, Throttles: append([]IsErrorThrottle{}, DefaultThrottles...), } for _, fn := range optFns { fn(&o) } return &AdaptiveMode{ options: o, throttles: IsErrorThrottles(o.Throttles), retryer: NewStandard(o.StandardOptions...), rateLimit: newAdaptiveRateLimit(), } } // IsErrorRetryable returns if the failed attempt is retryable. This check // should determine if the error can be retried, or if the error is // terminal. func (a *AdaptiveMode) IsErrorRetryable(err error) bool { return a.retryer.IsErrorRetryable(err) } // MaxAttempts returns the maximum number of attempts that can be made for // an attempt before failing. A value of 0 implies that the attempt should // be retried until it succeeds if the errors are retryable. func (a *AdaptiveMode) MaxAttempts() int { return a.retryer.MaxAttempts() } // RetryDelay returns the delay that should be used before retrying the // attempt. Will return error if the if the delay could not be determined. func (a *AdaptiveMode) RetryDelay(attempt int, opErr error) ( time.Duration, error, ) { return a.retryer.RetryDelay(attempt, opErr) } // GetRetryToken attempts to deduct the retry cost from the retry token pool. // Returning the token release function, or error. func (a *AdaptiveMode) GetRetryToken(ctx context.Context, opErr error) ( releaseToken func(error) error, err error, ) { return a.retryer.GetRetryToken(ctx, opErr) } // GetInitialToken returns the initial attempt token that can increment the // retry token pool if the attempt is successful. // // Deprecated: This method does not provide a way to block using Context, // nor can it return an error. Use RetryerV2, and GetAttemptToken instead. Only // present to implement Retryer interface. func (a *AdaptiveMode) GetInitialToken() (releaseToken func(error) error) { return nopRelease } // GetAttemptToken returns the attempt token that can be used to rate limit // attempt calls. Will be used by the SDK's retry package's Attempt // middleware to get an attempt token prior to calling the temp and releasing // the attempt token after the attempt has been made. func (a *AdaptiveMode) GetAttemptToken(ctx context.Context) (func(error) error, error) { for { acquiredToken, waitTryAgain := a.rateLimit.AcquireToken(a.options.RequestCost) if acquiredToken { break } if a.options.FailOnNoAttemptTokens { return nil, fmt.Errorf( "unable to get attempt token, and FailOnNoAttemptTokens enables") } if err := sdk.SleepWithContext(ctx, waitTryAgain); err != nil { return nil, fmt.Errorf("failed to wait for token to be available, %w", err) } } return a.handleResponse, nil } func (a *AdaptiveMode) handleResponse(opErr error) error { throttled := a.throttles.IsErrorThrottle(opErr).Bool() a.rateLimit.Update(throttled) return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive_ratelimit.go ================================================ package retry import ( "math" "sync" "time" "github.com/aws/aws-sdk-go-v2/internal/sdk" ) type adaptiveRateLimit struct { tokenBucketEnabled bool smooth float64 beta float64 scaleConstant float64 minFillRate float64 fillRate float64 calculatedRate float64 lastRefilled time.Time measuredTxRate float64 lastTxRateBucket float64 requestCount int64 lastMaxRate float64 lastThrottleTime time.Time timeWindow float64 tokenBucket *adaptiveTokenBucket mu sync.Mutex } func newAdaptiveRateLimit() *adaptiveRateLimit { now := sdk.NowTime() return &adaptiveRateLimit{ smooth: 0.8, beta: 0.7, scaleConstant: 0.4, minFillRate: 0.5, lastTxRateBucket: math.Floor(timeFloat64Seconds(now)), lastThrottleTime: now, tokenBucket: newAdaptiveTokenBucket(0), } } func (a *adaptiveRateLimit) Enable(v bool) { a.mu.Lock() defer a.mu.Unlock() a.tokenBucketEnabled = v } func (a *adaptiveRateLimit) AcquireToken(amount uint) ( tokenAcquired bool, waitTryAgain time.Duration, ) { a.mu.Lock() defer a.mu.Unlock() if !a.tokenBucketEnabled { return true, 0 } a.tokenBucketRefill() available, ok := a.tokenBucket.Retrieve(float64(amount)) if !ok { waitDur := float64Seconds((float64(amount) - available) / a.fillRate) return false, waitDur } return true, 0 } func (a *adaptiveRateLimit) Update(throttled bool) { a.mu.Lock() defer a.mu.Unlock() a.updateMeasuredRate() if throttled { rateToUse := a.measuredTxRate if a.tokenBucketEnabled { rateToUse = math.Min(a.measuredTxRate, a.fillRate) } a.lastMaxRate = rateToUse a.calculateTimeWindow() a.lastThrottleTime = sdk.NowTime() a.calculatedRate = a.cubicThrottle(rateToUse) a.tokenBucketEnabled = true } else { a.calculateTimeWindow() a.calculatedRate = a.cubicSuccess(sdk.NowTime()) } newRate := math.Min(a.calculatedRate, 2*a.measuredTxRate) a.tokenBucketUpdateRate(newRate) } func (a *adaptiveRateLimit) cubicSuccess(t time.Time) float64 { dt := secondsFloat64(t.Sub(a.lastThrottleTime)) return (a.scaleConstant * math.Pow(dt-a.timeWindow, 3)) + a.lastMaxRate } func (a *adaptiveRateLimit) cubicThrottle(rateToUse float64) float64 { return rateToUse * a.beta } func (a *adaptiveRateLimit) calculateTimeWindow() { a.timeWindow = math.Pow((a.lastMaxRate*(1.-a.beta))/a.scaleConstant, 1./3.) } func (a *adaptiveRateLimit) tokenBucketUpdateRate(newRPS float64) { a.tokenBucketRefill() a.fillRate = math.Max(newRPS, a.minFillRate) a.tokenBucket.Resize(newRPS) } func (a *adaptiveRateLimit) updateMeasuredRate() { now := sdk.NowTime() timeBucket := math.Floor(timeFloat64Seconds(now)*2.) / 2. a.requestCount++ if timeBucket > a.lastTxRateBucket { currentRate := float64(a.requestCount) / (timeBucket - a.lastTxRateBucket) a.measuredTxRate = (currentRate * a.smooth) + (a.measuredTxRate * (1. - a.smooth)) a.requestCount = 0 a.lastTxRateBucket = timeBucket } } func (a *adaptiveRateLimit) tokenBucketRefill() { now := sdk.NowTime() if a.lastRefilled.IsZero() { a.lastRefilled = now return } fillAmount := secondsFloat64(now.Sub(a.lastRefilled)) * a.fillRate a.tokenBucket.Refund(fillAmount) a.lastRefilled = now } func float64Seconds(v float64) time.Duration { return time.Duration(v * float64(time.Second)) } func secondsFloat64(v time.Duration) float64 { return float64(v) / float64(time.Second) } func timeFloat64Seconds(v time.Time) float64 { return float64(v.UnixNano()) / float64(time.Second) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/adaptive_token_bucket.go ================================================ package retry import ( "math" "sync" ) // adaptiveTokenBucket provides a concurrency safe utility for adding and // removing tokens from the available token bucket. type adaptiveTokenBucket struct { remainingTokens float64 maxCapacity float64 minCapacity float64 mu sync.Mutex } // newAdaptiveTokenBucket returns an initialized adaptiveTokenBucket with the // capacity specified. func newAdaptiveTokenBucket(i float64) *adaptiveTokenBucket { return &adaptiveTokenBucket{ remainingTokens: i, maxCapacity: i, minCapacity: 1, } } // Retrieve attempts to reduce the available tokens by the amount requested. If // there are tokens available true will be returned along with the number of // available tokens remaining. If amount requested is larger than the available // capacity, false will be returned along with the available capacity. If the // amount is less than the available capacity, the capacity will be reduced by // that amount, and the remaining capacity and true will be returned. func (t *adaptiveTokenBucket) Retrieve(amount float64) (available float64, retrieved bool) { t.mu.Lock() defer t.mu.Unlock() if amount > t.remainingTokens { return t.remainingTokens, false } t.remainingTokens -= amount return t.remainingTokens, true } // Refund returns the amount of tokens back to the available token bucket, up // to the initial capacity. func (t *adaptiveTokenBucket) Refund(amount float64) { t.mu.Lock() defer t.mu.Unlock() // Capacity cannot exceed max capacity. t.remainingTokens = math.Min(t.remainingTokens+amount, t.maxCapacity) } // Capacity returns the maximum capacity of tokens that the bucket could // contain. func (t *adaptiveTokenBucket) Capacity() float64 { t.mu.Lock() defer t.mu.Unlock() return t.maxCapacity } // Remaining returns the number of tokens that remaining in the bucket. func (t *adaptiveTokenBucket) Remaining() float64 { t.mu.Lock() defer t.mu.Unlock() return t.remainingTokens } // Resize adjusts the size of the token bucket. Returns the capacity remaining. func (t *adaptiveTokenBucket) Resize(size float64) float64 { t.mu.Lock() defer t.mu.Unlock() t.maxCapacity = math.Max(size, t.minCapacity) // Capacity needs to be capped at max capacity, if max size reduced. t.remainingTokens = math.Min(t.remainingTokens, t.maxCapacity) return t.remainingTokens } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/attempt_metrics.go ================================================ package retry import ( "context" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" ) type attemptMetrics struct { Attempts metrics.Int64Counter Errors metrics.Int64Counter AttemptDuration metrics.Float64Histogram } func newAttemptMetrics(meter metrics.Meter) (*attemptMetrics, error) { m := &attemptMetrics{} var err error m.Attempts, err = meter.Int64Counter("client.call.attempts", func(o *metrics.InstrumentOptions) { o.UnitLabel = "{attempt}" o.Description = "The number of attempts for an individual operation" }) if err != nil { return nil, err } m.Errors, err = meter.Int64Counter("client.call.errors", func(o *metrics.InstrumentOptions) { o.UnitLabel = "{error}" o.Description = "The number of errors for an operation" }) if err != nil { return nil, err } m.AttemptDuration, err = meter.Float64Histogram("client.call.attempt_duration", func(o *metrics.InstrumentOptions) { o.UnitLabel = "s" o.Description = "The time it takes to connect to the service, send the request, and get back HTTP status code and headers (including time queued waiting to be sent)" }) if err != nil { return nil, err } return m, nil } func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { return func(o *metrics.RecordMetricOptions) { o.Properties.Set("rpc.service", middleware.GetServiceID(ctx)) o.Properties.Set("rpc.method", middleware.GetOperationName(ctx)) } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/doc.go ================================================ // Package retry provides interfaces and implementations for SDK request retry behavior. // // # Retryer Interface and Implementations // // This package defines Retryer interface that is used to either implement custom retry behavior // or to extend the existing retry implementations provided by the SDK. This package provides a single // retry implementation: Standard. // // # Standard // // Standard is the default retryer implementation used by service clients. The standard retryer is a rate limited // retryer that has a configurable max attempts to limit the number of retry attempts when a retryable error occurs. // In addition, the retryer uses a configurable token bucket to rate limit the retry attempts across the client, // and uses an additional delay policy to limit the time between a requests subsequent attempts. // // By default the standard retryer uses the DefaultRetryables slice of IsErrorRetryable types to determine whether // a given error is retryable. By default this list of retryables includes the following: // - Retrying errors that implement the RetryableError method, and return true. // - Connection Errors // - Errors that implement a ConnectionError, Temporary, or Timeout method that return true. // - Connection Reset Errors. // - net.OpErr types that are dialing errors or are temporary. // - HTTP Status Codes: 500, 502, 503, and 504. // - API Error Codes // - RequestTimeout, RequestTimeoutException // - Throttling, ThrottlingException, ThrottledException, RequestThrottledException, TooManyRequestsException, // RequestThrottled, SlowDown, EC2ThrottledException // - ProvisionedThroughputExceededException, RequestLimitExceeded, BandwidthLimitExceeded, LimitExceededException // - TransactionInProgressException, PriorRequestNotComplete // // The standard retryer will not retry a request in the event if the context associated with the request // has been cancelled. Applications must handle this case explicitly if they wish to retry with a different context // value. // // You can configure the standard retryer implementation to fit your applications by constructing a standard retryer // using the NewStandard function, and providing one more functional argument that mutate the StandardOptions // structure. StandardOptions provides the ability to modify the token bucket rate limiter, retryable error conditions, // and the retry delay policy. // // For example to modify the default retry attempts for the standard retryer: // // // configure the custom retryer // customRetry := retry.NewStandard(func(o *retry.StandardOptions) { // o.MaxAttempts = 5 // }) // // // create a service client with the retryer // s3.NewFromConfig(cfg, func(o *s3.Options) { // o.Retryer = customRetry // }) // // # Utilities // // A number of package functions have been provided to easily wrap retryer implementations in an implementation agnostic // way. These are: // // AddWithErrorCodes - Provides the ability to add additional API error codes that should be considered retryable // in addition to those considered retryable by the provided retryer. // // AddWithMaxAttempts - Provides the ability to set the max number of attempts for retrying a request by wrapping // a retryer implementation. // // AddWithMaxBackoffDelay - Provides the ability to set the max back off delay that can occur before retrying a // request by wrapping a retryer implementation. // // The following package functions have been provided to easily satisfy different retry interfaces to further customize // a given retryer's behavior: // // BackoffDelayerFunc - Can be used to wrap a function to satisfy the BackoffDelayer interface. For example, // you can use this method to easily create custom back off policies to be used with the // standard retryer. // // IsErrorRetryableFunc - Can be used to wrap a function to satisfy the IsErrorRetryable interface. For example, // this can be used to extend the standard retryer to add additional logic to determine if an // error should be retried. // // IsErrorTimeoutFunc - Can be used to wrap a function to satisfy IsErrorTimeout interface. For example, // this can be used to extend the standard retryer to add additional logic to determine if an // error should be considered a timeout. package retry ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/errors.go ================================================ package retry import "fmt" // MaxAttemptsError provides the error when the maximum number of attempts have // been exceeded. type MaxAttemptsError struct { Attempt int Err error } func (e *MaxAttemptsError) Error() string { return fmt.Sprintf("exceeded maximum number of attempts, %d, %v", e.Attempt, e.Err) } // Unwrap returns the nested error causing the max attempts error. Provides the // implementation for errors.Is and errors.As to unwrap nested errors. func (e *MaxAttemptsError) Unwrap() error { return e.Err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/jitter_backoff.go ================================================ package retry import ( "math" "time" "github.com/aws/aws-sdk-go-v2/internal/rand" "github.com/aws/aws-sdk-go-v2/internal/timeconv" ) // ExponentialJitterBackoff provides backoff delays with jitter based on the // number of attempts. type ExponentialJitterBackoff struct { maxBackoff time.Duration // precomputed number of attempts needed to reach max backoff. maxBackoffAttempts float64 randFloat64 func() (float64, error) } // NewExponentialJitterBackoff returns an ExponentialJitterBackoff configured // for the max backoff. func NewExponentialJitterBackoff(maxBackoff time.Duration) *ExponentialJitterBackoff { return &ExponentialJitterBackoff{ maxBackoff: maxBackoff, maxBackoffAttempts: math.Log2( float64(maxBackoff) / float64(time.Second)), randFloat64: rand.CryptoRandFloat64, } } // BackoffDelay returns the duration to wait before the next attempt should be // made. Returns an error if unable get a duration. func (j *ExponentialJitterBackoff) BackoffDelay(attempt int, err error) (time.Duration, error) { if attempt > int(j.maxBackoffAttempts) { return j.maxBackoff, nil } b, err := j.randFloat64() if err != nil { return 0, err } // [0.0, 1.0) * 2 ^ attempts ri := int64(1 << uint64(attempt)) delaySeconds := b * float64(ri) return timeconv.FloatSecondsDur(delaySeconds), nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/metadata.go ================================================ package retry import ( awsmiddle "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" ) // attemptResultsKey is a metadata accessor key to retrieve metadata // for all request attempts. type attemptResultsKey struct { } // GetAttemptResults retrieves attempts results from middleware metadata. func GetAttemptResults(metadata middleware.Metadata) (AttemptResults, bool) { m, ok := metadata.Get(attemptResultsKey{}).(AttemptResults) return m, ok } // AttemptResults represents struct containing metadata returned by all request attempts. type AttemptResults struct { // Results is a slice consisting attempt result from all request attempts. // Results are stored in order request attempt is made. Results []AttemptResult } // AttemptResult represents attempt result returned by a single request attempt. type AttemptResult struct { // Err is the error if received for the request attempt. Err error // Retryable denotes if request may be retried. This states if an // error is considered retryable. Retryable bool // Retried indicates if this request was retried. Retried bool // ResponseMetadata is any existing metadata passed via the response middlewares. ResponseMetadata middleware.Metadata } // addAttemptResults adds attempt results to middleware metadata func addAttemptResults(metadata *middleware.Metadata, v AttemptResults) { metadata.Set(attemptResultsKey{}, v) } // GetRawResponse returns raw response recorded for the attempt result func (a AttemptResult) GetRawResponse() interface{} { return awsmiddle.GetRawResponse(a.ResponseMetadata) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/middleware.go ================================================ package retry import ( "context" "errors" "fmt" "strconv" "strings" "time" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" "github.com/aws/smithy-go" "github.com/aws/aws-sdk-go-v2/aws" awsmiddle "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/metrics" smithymiddle "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" "github.com/aws/smithy-go/transport/http" ) // RequestCloner is a function that can take an input request type and clone // the request for use in a subsequent retry attempt. type RequestCloner func(interface{}) interface{} type retryMetadata struct { AttemptNum int AttemptTime time.Time MaxAttempts int AttemptClockSkew time.Duration } // Attempt is a Smithy Finalize middleware that handles retry attempts using // the provided Retryer implementation. type Attempt struct { // Enable the logging of retry attempts performed by the SDK. This will // include logging retry attempts, unretryable errors, and when max // attempts are reached. LogAttempts bool // A Meter instance for recording retry-related metrics. OperationMeter metrics.Meter retryer aws.RetryerV2 requestCloner RequestCloner } // define the threshold at which we will consider certain kind of errors to be probably // caused by clock skew const skewThreshold = 4 * time.Minute // NewAttemptMiddleware returns a new Attempt retry middleware. func NewAttemptMiddleware(retryer aws.Retryer, requestCloner RequestCloner, optFns ...func(*Attempt)) *Attempt { m := &Attempt{ retryer: wrapAsRetryerV2(retryer), requestCloner: requestCloner, } for _, fn := range optFns { fn(m) } if m.OperationMeter == nil { m.OperationMeter = metrics.NopMeterProvider{}.Meter("") } return m } // ID returns the middleware identifier func (r *Attempt) ID() string { return "Retry" } func (r Attempt) logf(logger logging.Logger, classification logging.Classification, format string, v ...interface{}) { if !r.LogAttempts { return } logger.Logf(classification, format, v...) } // HandleFinalize utilizes the provider Retryer implementation to attempt // retries over the next handler func (r *Attempt) HandleFinalize(ctx context.Context, in smithymiddle.FinalizeInput, next smithymiddle.FinalizeHandler) ( out smithymiddle.FinalizeOutput, metadata smithymiddle.Metadata, err error, ) { var attemptNum int var attemptClockSkew time.Duration var attemptResults AttemptResults maxAttempts := r.retryer.MaxAttempts() releaseRetryToken := nopRelease retryMetrics, err := newAttemptMetrics(r.OperationMeter) if err != nil { return out, metadata, err } for { attemptNum++ attemptInput := in attemptInput.Request = r.requestCloner(attemptInput.Request) // Record the metadata for the for attempt being started. attemptCtx := setRetryMetadata(ctx, retryMetadata{ AttemptNum: attemptNum, AttemptTime: sdk.NowTime().UTC(), MaxAttempts: maxAttempts, AttemptClockSkew: attemptClockSkew, }) // Setting clock skew to be used on other context (like signing) ctx = internalcontext.SetAttemptSkewContext(ctx, attemptClockSkew) var attemptResult AttemptResult attemptCtx, span := tracing.StartSpan(attemptCtx, "Attempt", func(o *tracing.SpanOptions) { o.Properties.Set("operation.attempt", attemptNum) }) retryMetrics.Attempts.Add(ctx, 1, withOperationMetadata(ctx)) start := sdk.NowTime() out, attemptResult, releaseRetryToken, err = r.handleAttempt(attemptCtx, attemptInput, releaseRetryToken, next) elapsed := sdk.NowTime().Sub(start) retryMetrics.AttemptDuration.Record(ctx, float64(elapsed)/1e9, withOperationMetadata(ctx)) if err != nil { retryMetrics.Errors.Add(ctx, 1, withOperationMetadata(ctx), func(o *metrics.RecordMetricOptions) { o.Properties.Set("exception.type", errorType(err)) }) } span.End() attemptClockSkew, _ = awsmiddle.GetAttemptSkew(attemptResult.ResponseMetadata) // AttemptResult Retried states that the attempt was not successful, and // should be retried. shouldRetry := attemptResult.Retried // Add attempt metadata to list of all attempt metadata attemptResults.Results = append(attemptResults.Results, attemptResult) if !shouldRetry { // Ensure the last response's metadata is used as the bases for result // metadata returned by the stack. The Slice of attempt results // will be added to this cloned metadata. metadata = attemptResult.ResponseMetadata.Clone() break } } addAttemptResults(&metadata, attemptResults) return out, metadata, err } // handleAttempt handles an individual request attempt. func (r *Attempt) handleAttempt( ctx context.Context, in smithymiddle.FinalizeInput, releaseRetryToken func(error) error, next smithymiddle.FinalizeHandler, ) ( out smithymiddle.FinalizeOutput, attemptResult AttemptResult, _ func(error) error, err error, ) { defer func() { attemptResult.Err = err }() // Short circuit if this attempt never can succeed because the context is // canceled. This reduces the chance of token pools being modified for // attempts that will not be made select { case <-ctx.Done(): return out, attemptResult, nopRelease, ctx.Err() default: } //------------------------------ // Get Attempt Token //------------------------------ releaseAttemptToken, err := r.retryer.GetAttemptToken(ctx) if err != nil { return out, attemptResult, nopRelease, fmt.Errorf( "failed to get retry Send token, %w", err) } //------------------------------ // Send Attempt //------------------------------ logger := smithymiddle.GetLogger(ctx) service, operation := awsmiddle.GetServiceID(ctx), awsmiddle.GetOperationName(ctx) retryMetadata, _ := getRetryMetadata(ctx) attemptNum := retryMetadata.AttemptNum maxAttempts := retryMetadata.MaxAttempts // Following attempts must ensure the request payload stream starts in a // rewound state. if attemptNum > 1 { if rewindable, ok := in.Request.(interface{ RewindStream() error }); ok { if rewindErr := rewindable.RewindStream(); rewindErr != nil { return out, attemptResult, nopRelease, fmt.Errorf( "failed to rewind transport stream for retry, %w", rewindErr) } } r.logf(logger, logging.Debug, "retrying request %s/%s, attempt %d", service, operation, attemptNum) } var metadata smithymiddle.Metadata out, metadata, err = next.HandleFinalize(ctx, in) attemptResult.ResponseMetadata = metadata //------------------------------ // Bookkeeping //------------------------------ // Release the retry token based on the state of the attempt's error (if any). if releaseError := releaseRetryToken(err); releaseError != nil && err != nil { return out, attemptResult, nopRelease, fmt.Errorf( "failed to release retry token after request error, %w", err) } // Release the attempt token based on the state of the attempt's error (if any). if releaseError := releaseAttemptToken(err); releaseError != nil && err != nil { return out, attemptResult, nopRelease, fmt.Errorf( "failed to release initial token after request error, %w", err) } // If there was no error making the attempt, nothing further to do. There // will be nothing to retry. if err == nil { return out, attemptResult, nopRelease, err } err = wrapAsClockSkew(ctx, err) //------------------------------ // Is Retryable and Should Retry //------------------------------ // If the attempt failed with an unretryable error, nothing further to do // but return, and inform the caller about the terminal failure. retryable := r.retryer.IsErrorRetryable(err) if !retryable { r.logf(logger, logging.Debug, "request failed with unretryable error %v", err) return out, attemptResult, nopRelease, err } // set retryable to true attemptResult.Retryable = true // Once the maximum number of attempts have been exhausted there is nothing // further to do other than inform the caller about the terminal failure. if maxAttempts > 0 && attemptNum >= maxAttempts { r.logf(logger, logging.Debug, "max retry attempts exhausted, max %d", maxAttempts) err = &MaxAttemptsError{ Attempt: attemptNum, Err: err, } return out, attemptResult, nopRelease, err } //------------------------------ // Get Retry (aka Retry Quota) Token //------------------------------ // Get a retry token that will be released after the releaseRetryToken, retryTokenErr := r.retryer.GetRetryToken(ctx, err) if retryTokenErr != nil { return out, attemptResult, nopRelease, retryTokenErr } //------------------------------ // Retry Delay and Sleep //------------------------------ // Get the retry delay before another attempt can be made, and sleep for // that time. Potentially early exist if the sleep is canceled via the // context. retryDelay, reqErr := r.retryer.RetryDelay(attemptNum, err) if reqErr != nil { return out, attemptResult, releaseRetryToken, reqErr } if reqErr = sdk.SleepWithContext(ctx, retryDelay); reqErr != nil { err = &aws.RequestCanceledError{Err: reqErr} return out, attemptResult, releaseRetryToken, err } // The request should be re-attempted. attemptResult.Retried = true return out, attemptResult, releaseRetryToken, err } // errors that, if detected when we know there's a clock skew, // can be retried and have a high chance of success var possibleSkewCodes = map[string]struct{}{ "InvalidSignatureException": {}, "SignatureDoesNotMatch": {}, "AuthFailure": {}, } var definiteSkewCodes = map[string]struct{}{ "RequestExpired": {}, "RequestInTheFuture": {}, "RequestTimeTooSkewed": {}, } // wrapAsClockSkew checks if this error could be related to a clock skew // error and if so, wrap the error. func wrapAsClockSkew(ctx context.Context, err error) error { var v interface{ ErrorCode() string } if !errors.As(err, &v) { return err } if _, ok := definiteSkewCodes[v.ErrorCode()]; ok { return &retryableClockSkewError{Err: err} } _, isPossibleSkewCode := possibleSkewCodes[v.ErrorCode()] if skew := internalcontext.GetAttemptSkewContext(ctx); skew > skewThreshold && isPossibleSkewCode { return &retryableClockSkewError{Err: err} } return err } // MetricsHeader attaches SDK request metric header for retries to the transport type MetricsHeader struct{} // ID returns the middleware identifier func (r *MetricsHeader) ID() string { return "RetryMetricsHeader" } // HandleFinalize attaches the SDK request metric header to the transport layer func (r MetricsHeader) HandleFinalize(ctx context.Context, in smithymiddle.FinalizeInput, next smithymiddle.FinalizeHandler) ( out smithymiddle.FinalizeOutput, metadata smithymiddle.Metadata, err error, ) { retryMetadata, _ := getRetryMetadata(ctx) const retryMetricHeader = "Amz-Sdk-Request" var parts []string parts = append(parts, "attempt="+strconv.Itoa(retryMetadata.AttemptNum)) if retryMetadata.MaxAttempts != 0 { parts = append(parts, "max="+strconv.Itoa(retryMetadata.MaxAttempts)) } var ttl time.Time if deadline, ok := ctx.Deadline(); ok { ttl = deadline } // Only append the TTL if it can be determined. if !ttl.IsZero() && retryMetadata.AttemptClockSkew > 0 { const unixTimeFormat = "20060102T150405Z" ttl = ttl.Add(retryMetadata.AttemptClockSkew) parts = append(parts, "ttl="+ttl.Format(unixTimeFormat)) } switch req := in.Request.(type) { case *http.Request: req.Header[retryMetricHeader] = append(req.Header[retryMetricHeader][:0], strings.Join(parts, "; ")) default: return out, metadata, fmt.Errorf("unknown transport type %T", req) } return next.HandleFinalize(ctx, in) } type retryMetadataKey struct{} // getRetryMetadata retrieves retryMetadata from the context and a bool // indicating if it was set. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func getRetryMetadata(ctx context.Context) (metadata retryMetadata, ok bool) { metadata, ok = smithymiddle.GetStackValue(ctx, retryMetadataKey{}).(retryMetadata) return metadata, ok } // setRetryMetadata sets the retryMetadata on the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func setRetryMetadata(ctx context.Context, metadata retryMetadata) context.Context { return smithymiddle.WithStackValue(ctx, retryMetadataKey{}, metadata) } // AddRetryMiddlewaresOptions is the set of options that can be passed to // AddRetryMiddlewares for configuring retry associated middleware. type AddRetryMiddlewaresOptions struct { Retryer aws.Retryer // Enable the logging of retry attempts performed by the SDK. This will // include logging retry attempts, unretryable errors, and when max // attempts are reached. LogRetryAttempts bool } // AddRetryMiddlewares adds retry middleware to operation middleware stack func AddRetryMiddlewares(stack *smithymiddle.Stack, options AddRetryMiddlewaresOptions) error { attempt := NewAttemptMiddleware(options.Retryer, http.RequestCloner, func(middleware *Attempt) { middleware.LogAttempts = options.LogRetryAttempts }) // index retry to before signing, if signing exists if err := stack.Finalize.Insert(attempt, "Signing", smithymiddle.Before); err != nil { return err } if err := stack.Finalize.Insert(&MetricsHeader{}, attempt.ID(), smithymiddle.After); err != nil { return err } return nil } // Determines the value of exception.type for metrics purposes. We prefer an // API-specific error code, otherwise it's just the Go type for the value. func errorType(err error) string { var terr smithy.APIError if errors.As(err, &terr) { return terr.ErrorCode() } return fmt.Sprintf("%T", err) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retry.go ================================================ package retry import ( "context" "time" "github.com/aws/aws-sdk-go-v2/aws" ) // AddWithErrorCodes returns a Retryer with additional error codes considered // for determining if the error should be retried. func AddWithErrorCodes(r aws.Retryer, codes ...string) aws.Retryer { retryable := &RetryableErrorCode{ Codes: map[string]struct{}{}, } for _, c := range codes { retryable.Codes[c] = struct{}{} } return &withIsErrorRetryable{ RetryerV2: wrapAsRetryerV2(r), Retryable: retryable, } } type withIsErrorRetryable struct { aws.RetryerV2 Retryable IsErrorRetryable } func (r *withIsErrorRetryable) IsErrorRetryable(err error) bool { if v := r.Retryable.IsErrorRetryable(err); v != aws.UnknownTernary { return v.Bool() } return r.RetryerV2.IsErrorRetryable(err) } // AddWithMaxAttempts returns a Retryer with MaxAttempts set to the value // specified. func AddWithMaxAttempts(r aws.Retryer, max int) aws.Retryer { return &withMaxAttempts{ RetryerV2: wrapAsRetryerV2(r), Max: max, } } type withMaxAttempts struct { aws.RetryerV2 Max int } func (w *withMaxAttempts) MaxAttempts() int { return w.Max } // AddWithMaxBackoffDelay returns a retryer wrapping the passed in retryer // overriding the RetryDelay behavior for a alternate minimum initial backoff // delay. func AddWithMaxBackoffDelay(r aws.Retryer, delay time.Duration) aws.Retryer { return &withMaxBackoffDelay{ RetryerV2: wrapAsRetryerV2(r), backoff: NewExponentialJitterBackoff(delay), } } type withMaxBackoffDelay struct { aws.RetryerV2 backoff *ExponentialJitterBackoff } func (r *withMaxBackoffDelay) RetryDelay(attempt int, err error) (time.Duration, error) { return r.backoff.BackoffDelay(attempt, err) } type wrappedAsRetryerV2 struct { aws.Retryer } func wrapAsRetryerV2(r aws.Retryer) aws.RetryerV2 { v, ok := r.(aws.RetryerV2) if !ok { v = wrappedAsRetryerV2{Retryer: r} } return v } func (w wrappedAsRetryerV2) GetAttemptToken(context.Context) (func(error) error, error) { return w.Retryer.GetInitialToken(), nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/retryable_error.go ================================================ package retry import ( "errors" "fmt" "net" "net/url" "strings" "github.com/aws/aws-sdk-go-v2/aws" ) // IsErrorRetryable provides the interface of an implementation to determine if // a error as the result of an operation is retryable. type IsErrorRetryable interface { IsErrorRetryable(error) aws.Ternary } // IsErrorRetryables is a collection of checks to determine of the error is // retryable. Iterates through the checks and returns the state of retryable // if any check returns something other than unknown. type IsErrorRetryables []IsErrorRetryable // IsErrorRetryable returns if the error is retryable if any of the checks in // the list return a value other than unknown. func (r IsErrorRetryables) IsErrorRetryable(err error) aws.Ternary { for _, re := range r { if v := re.IsErrorRetryable(err); v != aws.UnknownTernary { return v } } return aws.UnknownTernary } // IsErrorRetryableFunc wraps a function with the IsErrorRetryable interface. type IsErrorRetryableFunc func(error) aws.Ternary // IsErrorRetryable returns if the error is retryable. func (fn IsErrorRetryableFunc) IsErrorRetryable(err error) aws.Ternary { return fn(err) } // RetryableError is an IsErrorRetryable implementation which uses the // optional interface Retryable on the error value to determine if the error is // retryable. type RetryableError struct{} // IsErrorRetryable returns if the error is retryable if it satisfies the // Retryable interface, and returns if the attempt should be retried. func (RetryableError) IsErrorRetryable(err error) aws.Ternary { var v interface{ RetryableError() bool } if !errors.As(err, &v) { return aws.UnknownTernary } return aws.BoolTernary(v.RetryableError()) } // NoRetryCanceledError detects if the error was an request canceled error and // returns if so. type NoRetryCanceledError struct{} // IsErrorRetryable returns the error is not retryable if the request was // canceled. func (NoRetryCanceledError) IsErrorRetryable(err error) aws.Ternary { var v interface{ CanceledError() bool } if !errors.As(err, &v) { return aws.UnknownTernary } if v.CanceledError() { return aws.FalseTernary } return aws.UnknownTernary } // RetryableConnectionError determines if the underlying error is an HTTP // connection and returns if it should be retried. // // Includes errors such as connection reset, connection refused, net dial, // temporary, and timeout errors. type RetryableConnectionError struct{} // IsErrorRetryable returns if the error is caused by and HTTP connection // error, and should be retried. func (r RetryableConnectionError) IsErrorRetryable(err error) aws.Ternary { if err == nil { return aws.UnknownTernary } var retryable bool var conErr interface{ ConnectionError() bool } var tempErr interface{ Temporary() bool } var timeoutErr interface{ Timeout() bool } var urlErr *url.Error var netOpErr *net.OpError var dnsError *net.DNSError if errors.As(err, &dnsError) { // NXDOMAIN errors should not be retried if dnsError.IsNotFound { return aws.BoolTernary(false) } // if !dnsError.Temporary(), error may or may not be temporary, // (i.e. !Temporary() =/=> !retryable) so we should fall through to // remaining checks if dnsError.Temporary() { return aws.BoolTernary(true) } } switch { case errors.As(err, &conErr) && conErr.ConnectionError(): retryable = true case strings.Contains(err.Error(), "use of closed network connection"): fallthrough case strings.Contains(err.Error(), "connection reset"): // The errors "connection reset" and "use of closed network connection" // are effectively the same. It appears to be the difference between // sync and async read of TCP RST in the stdlib's net.Conn read loop. // see #2737 retryable = true case errors.As(err, &urlErr): // Refused connections should be retried as the service may not yet be // running on the port. Go TCP dial considers refused connections as // not temporary. if strings.Contains(urlErr.Error(), "connection refused") { retryable = true } else { return r.IsErrorRetryable(errors.Unwrap(urlErr)) } case errors.As(err, &netOpErr): // Network dial, or temporary network errors are always retryable. if strings.EqualFold(netOpErr.Op, "dial") || netOpErr.Temporary() { retryable = true } else { return r.IsErrorRetryable(errors.Unwrap(netOpErr)) } case errors.As(err, &tempErr) && tempErr.Temporary(): // Fallback to the generic temporary check, with temporary errors // retryable. retryable = true case errors.As(err, &timeoutErr) && timeoutErr.Timeout(): // Fallback to the generic timeout check, with timeout errors // retryable. retryable = true default: return aws.UnknownTernary } return aws.BoolTernary(retryable) } // RetryableHTTPStatusCode provides a IsErrorRetryable based on HTTP status // codes. type RetryableHTTPStatusCode struct { Codes map[int]struct{} } // IsErrorRetryable return if the passed in error is retryable based on the // HTTP status code. func (r RetryableHTTPStatusCode) IsErrorRetryable(err error) aws.Ternary { var v interface{ HTTPStatusCode() int } if !errors.As(err, &v) { return aws.UnknownTernary } _, ok := r.Codes[v.HTTPStatusCode()] if !ok { return aws.UnknownTernary } return aws.TrueTernary } // RetryableErrorCode determines if an attempt should be retried based on the // API error code. type RetryableErrorCode struct { Codes map[string]struct{} } // IsErrorRetryable return if the error is retryable based on the error codes. // Returns unknown if the error doesn't have a code or it is unknown. func (r RetryableErrorCode) IsErrorRetryable(err error) aws.Ternary { var v interface{ ErrorCode() string } if !errors.As(err, &v) { return aws.UnknownTernary } _, ok := r.Codes[v.ErrorCode()] if !ok { return aws.UnknownTernary } return aws.TrueTernary } // retryableClockSkewError marks errors that can be caused by clock skew // (difference between server time and client time). // This is returned when there's certain confidence that adjusting the client time // could allow a retry to succeed type retryableClockSkewError struct{ Err error } func (e *retryableClockSkewError) Error() string { return fmt.Sprintf("Probable clock skew error: %v", e.Err) } // Unwrap returns the wrapped error. func (e *retryableClockSkewError) Unwrap() error { return e.Err } // RetryableError allows the retryer to retry this request func (e *retryableClockSkewError) RetryableError() bool { return true } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/standard.go ================================================ package retry import ( "context" "fmt" "time" "github.com/aws/aws-sdk-go-v2/aws/ratelimit" ) // BackoffDelayer provides the interface for determining the delay to before // another request attempt, that previously failed. type BackoffDelayer interface { BackoffDelay(attempt int, err error) (time.Duration, error) } // BackoffDelayerFunc provides a wrapper around a function to determine the // backoff delay of an attempt retry. type BackoffDelayerFunc func(int, error) (time.Duration, error) // BackoffDelay returns the delay before attempt to retry a request. func (fn BackoffDelayerFunc) BackoffDelay(attempt int, err error) (time.Duration, error) { return fn(attempt, err) } const ( // DefaultMaxAttempts is the maximum of attempts for an API request DefaultMaxAttempts int = 3 // DefaultMaxBackoff is the maximum back off delay between attempts DefaultMaxBackoff time.Duration = 20 * time.Second ) // Default retry token quota values. const ( DefaultRetryRateTokens uint = 500 DefaultRetryCost uint = 5 DefaultRetryTimeoutCost uint = 10 DefaultNoRetryIncrement uint = 1 ) // DefaultRetryableHTTPStatusCodes is the default set of HTTP status codes the SDK // should consider as retryable errors. var DefaultRetryableHTTPStatusCodes = map[int]struct{}{ 500: {}, 502: {}, 503: {}, 504: {}, } // DefaultRetryableErrorCodes provides the set of API error codes that should // be retried. var DefaultRetryableErrorCodes = map[string]struct{}{ "RequestTimeout": {}, "RequestTimeoutException": {}, } // DefaultThrottleErrorCodes provides the set of API error codes that are // considered throttle errors. var DefaultThrottleErrorCodes = map[string]struct{}{ "Throttling": {}, "ThrottlingException": {}, "ThrottledException": {}, "RequestThrottledException": {}, "TooManyRequestsException": {}, "ProvisionedThroughputExceededException": {}, "TransactionInProgressException": {}, "RequestLimitExceeded": {}, "BandwidthLimitExceeded": {}, "LimitExceededException": {}, "RequestThrottled": {}, "SlowDown": {}, "PriorRequestNotComplete": {}, "EC2ThrottledException": {}, } // DefaultRetryables provides the set of retryable checks that are used by // default. var DefaultRetryables = []IsErrorRetryable{ NoRetryCanceledError{}, RetryableError{}, RetryableConnectionError{}, RetryableHTTPStatusCode{ Codes: DefaultRetryableHTTPStatusCodes, }, RetryableErrorCode{ Codes: DefaultRetryableErrorCodes, }, RetryableErrorCode{ Codes: DefaultThrottleErrorCodes, }, } // DefaultTimeouts provides the set of timeout checks that are used by default. var DefaultTimeouts = []IsErrorTimeout{ TimeouterError{}, } // StandardOptions provides the functional options for configuring the standard // retryable, and delay behavior. type StandardOptions struct { // Maximum number of attempts that should be made. MaxAttempts int // MaxBackoff duration between retried attempts. MaxBackoff time.Duration // Provides the backoff strategy the retryer will use to determine the // delay between retry attempts. Backoff BackoffDelayer // Set of strategies to determine if the attempt should be retried based on // the error response received. // // It is safe to append to this list in NewStandard's functional options. Retryables []IsErrorRetryable // Set of strategies to determine if the attempt failed due to a timeout // error. // // It is safe to append to this list in NewStandard's functional options. Timeouts []IsErrorTimeout // Provides the rate limiting strategy for rate limiting attempt retries // across all attempts the retryer is being used with. // // A RateLimiter operates as a token bucket with a set capacity, where // attempt failures events consume tokens. A retry attempt that attempts to // consume more tokens than what's available results in operation failure. // The default implementation is parameterized as follows: // - a capacity of 500 (DefaultRetryRateTokens) // - a retry caused by a timeout costs 10 tokens (DefaultRetryCost) // - a retry caused by other errors costs 5 tokens (DefaultRetryTimeoutCost) // - an operation that succeeds on the 1st attempt adds 1 token (DefaultNoRetryIncrement) // // You can disable rate limiting by setting this field to ratelimit.None. RateLimiter RateLimiter // The cost to deduct from the RateLimiter's token bucket per retry. RetryCost uint // The cost to deduct from the RateLimiter's token bucket per retry caused // by timeout error. RetryTimeoutCost uint // The cost to payback to the RateLimiter's token bucket for successful // attempts. NoRetryIncrement uint } // RateLimiter provides the interface for limiting the rate of attempt retries // allowed by the retryer. type RateLimiter interface { GetToken(ctx context.Context, cost uint) (releaseToken func() error, err error) AddTokens(uint) error } // Standard is the standard retry pattern for the SDK. It uses a set of // retryable checks to determine of the failed attempt should be retried, and // what retry delay should be used. type Standard struct { options StandardOptions timeout IsErrorTimeout retryable IsErrorRetryable backoff BackoffDelayer } // NewStandard initializes a standard retry behavior with defaults that can be // overridden via functional options. func NewStandard(fnOpts ...func(*StandardOptions)) *Standard { o := StandardOptions{ MaxAttempts: DefaultMaxAttempts, MaxBackoff: DefaultMaxBackoff, Retryables: append([]IsErrorRetryable{}, DefaultRetryables...), Timeouts: append([]IsErrorTimeout{}, DefaultTimeouts...), RateLimiter: ratelimit.NewTokenRateLimit(DefaultRetryRateTokens), RetryCost: DefaultRetryCost, RetryTimeoutCost: DefaultRetryTimeoutCost, NoRetryIncrement: DefaultNoRetryIncrement, } for _, fn := range fnOpts { fn(&o) } if o.MaxAttempts <= 0 { o.MaxAttempts = DefaultMaxAttempts } backoff := o.Backoff if backoff == nil { backoff = NewExponentialJitterBackoff(o.MaxBackoff) } return &Standard{ options: o, backoff: backoff, retryable: IsErrorRetryables(o.Retryables), timeout: IsErrorTimeouts(o.Timeouts), } } // MaxAttempts returns the maximum number of attempts that can be made for a // request before failing. func (s *Standard) MaxAttempts() int { return s.options.MaxAttempts } // IsErrorRetryable returns if the error is can be retried or not. Should not // consider the number of attempts made. func (s *Standard) IsErrorRetryable(err error) bool { return s.retryable.IsErrorRetryable(err).Bool() } // RetryDelay returns the delay to use before another request attempt is made. func (s *Standard) RetryDelay(attempt int, err error) (time.Duration, error) { return s.backoff.BackoffDelay(attempt, err) } // GetAttemptToken returns the token to be released after then attempt completes. // The release token will add NoRetryIncrement to the RateLimiter token pool if // the attempt was successful. If the attempt failed, nothing will be done. func (s *Standard) GetAttemptToken(context.Context) (func(error) error, error) { return s.GetInitialToken(), nil } // GetInitialToken returns a token for adding the NoRetryIncrement to the // RateLimiter token if the attempt completed successfully without error. // // InitialToken applies to result of the each attempt, including the first. // Whereas the RetryToken applies to the result of subsequent attempts. // // Deprecated: use GetAttemptToken instead. func (s *Standard) GetInitialToken() func(error) error { return releaseToken(s.noRetryIncrement).release } func (s *Standard) noRetryIncrement() error { return s.options.RateLimiter.AddTokens(s.options.NoRetryIncrement) } // GetRetryToken attempts to deduct the retry cost from the retry token pool. // Returning the token release function, or error. func (s *Standard) GetRetryToken(ctx context.Context, opErr error) (func(error) error, error) { cost := s.options.RetryCost if s.timeout.IsErrorTimeout(opErr).Bool() { cost = s.options.RetryTimeoutCost } fn, err := s.options.RateLimiter.GetToken(ctx, cost) if err != nil { return nil, fmt.Errorf("failed to get rate limit token, %w", err) } return releaseToken(fn).release, nil } func nopRelease(error) error { return nil } type releaseToken func() error func (f releaseToken) release(err error) error { if err != nil { return nil } return f() } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/throttle_error.go ================================================ package retry import ( "errors" "github.com/aws/aws-sdk-go-v2/aws" ) // IsErrorThrottle provides the interface of an implementation to determine if // a error response from an operation is a throttling error. type IsErrorThrottle interface { IsErrorThrottle(error) aws.Ternary } // IsErrorThrottles is a collection of checks to determine of the error a // throttle error. Iterates through the checks and returns the state of // throttle if any check returns something other than unknown. type IsErrorThrottles []IsErrorThrottle // IsErrorThrottle returns if the error is a throttle error if any of the // checks in the list return a value other than unknown. func (r IsErrorThrottles) IsErrorThrottle(err error) aws.Ternary { for _, re := range r { if v := re.IsErrorThrottle(err); v != aws.UnknownTernary { return v } } return aws.UnknownTernary } // IsErrorThrottleFunc wraps a function with the IsErrorThrottle interface. type IsErrorThrottleFunc func(error) aws.Ternary // IsErrorThrottle returns if the error is a throttle error. func (fn IsErrorThrottleFunc) IsErrorThrottle(err error) aws.Ternary { return fn(err) } // ThrottleErrorCode determines if an attempt should be retried based on the // API error code. type ThrottleErrorCode struct { Codes map[string]struct{} } // IsErrorThrottle return if the error is a throttle error based on the error // codes. Returns unknown if the error doesn't have a code or it is unknown. func (r ThrottleErrorCode) IsErrorThrottle(err error) aws.Ternary { var v interface{ ErrorCode() string } if !errors.As(err, &v) { return aws.UnknownTernary } _, ok := r.Codes[v.ErrorCode()] if !ok { return aws.UnknownTernary } return aws.TrueTernary } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retry/timeout_error.go ================================================ package retry import ( "errors" "github.com/aws/aws-sdk-go-v2/aws" ) // IsErrorTimeout provides the interface of an implementation to determine if // a error matches. type IsErrorTimeout interface { IsErrorTimeout(err error) aws.Ternary } // IsErrorTimeouts is a collection of checks to determine of the error is // retryable. Iterates through the checks and returns the state of retryable // if any check returns something other than unknown. type IsErrorTimeouts []IsErrorTimeout // IsErrorTimeout returns if the error is retryable if any of the checks in // the list return a value other than unknown. func (ts IsErrorTimeouts) IsErrorTimeout(err error) aws.Ternary { for _, t := range ts { if v := t.IsErrorTimeout(err); v != aws.UnknownTernary { return v } } return aws.UnknownTernary } // IsErrorTimeoutFunc wraps a function with the IsErrorTimeout interface. type IsErrorTimeoutFunc func(error) aws.Ternary // IsErrorTimeout returns if the error is retryable. func (fn IsErrorTimeoutFunc) IsErrorTimeout(err error) aws.Ternary { return fn(err) } // TimeouterError provides the IsErrorTimeout implementation for determining if // an error is a timeout based on type with the Timeout method. type TimeouterError struct{} // IsErrorTimeout returns if the error is a timeout error. func (t TimeouterError) IsErrorTimeout(err error) aws.Ternary { var v interface{ Timeout() bool } if !errors.As(err, &v) { return aws.UnknownTernary } return aws.BoolTernary(v.Timeout()) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/retryer.go ================================================ package aws import ( "context" "fmt" "time" ) // RetryMode provides the mode the API client will use to create a retryer // based on. type RetryMode string const ( // RetryModeStandard model provides rate limited retry attempts with // exponential backoff delay. RetryModeStandard RetryMode = "standard" // RetryModeAdaptive model provides attempt send rate limiting on throttle // responses in addition to standard mode's retry rate limiting. // // Adaptive retry mode is experimental and is subject to change in the // future. RetryModeAdaptive RetryMode = "adaptive" ) // ParseRetryMode attempts to parse a RetryMode from the given string. // Returning error if the value is not a known RetryMode. func ParseRetryMode(v string) (mode RetryMode, err error) { switch v { case "standard": return RetryModeStandard, nil case "adaptive": return RetryModeAdaptive, nil default: return mode, fmt.Errorf("unknown RetryMode, %v", v) } } func (m RetryMode) String() string { return string(m) } // Retryer is an interface to determine if a given error from a // attempt should be retried, and if so what backoff delay to apply. The // default implementation used by most services is the retry package's Standard // type. Which contains basic retry logic using exponential backoff. type Retryer interface { // IsErrorRetryable returns if the failed attempt is retryable. This check // should determine if the error can be retried, or if the error is // terminal. IsErrorRetryable(error) bool // MaxAttempts returns the maximum number of attempts that can be made for // an attempt before failing. A value of 0 implies that the attempt should // be retried until it succeeds if the errors are retryable. MaxAttempts() int // RetryDelay returns the delay that should be used before retrying the // attempt. Will return error if the delay could not be determined. RetryDelay(attempt int, opErr error) (time.Duration, error) // GetRetryToken attempts to deduct the retry cost from the retry token pool. // Returning the token release function, or error. GetRetryToken(ctx context.Context, opErr error) (releaseToken func(error) error, err error) // GetInitialToken returns the initial attempt token that can increment the // retry token pool if the attempt is successful. GetInitialToken() (releaseToken func(error) error) } // RetryerV2 is an interface to determine if a given error from an attempt // should be retried, and if so what backoff delay to apply. The default // implementation used by most services is the retry package's Standard type. // Which contains basic retry logic using exponential backoff. // // RetryerV2 replaces the Retryer interface, deprecating the GetInitialToken // method in favor of GetAttemptToken which takes a context, and can return an error. // // The SDK's retry package's Attempt middleware, and utilities will always // wrap a Retryer as a RetryerV2. Delegating to GetInitialToken, only if // GetAttemptToken is not implemented. type RetryerV2 interface { Retryer // GetInitialToken returns the initial attempt token that can increment the // retry token pool if the attempt is successful. // // Deprecated: This method does not provide a way to block using Context, // nor can it return an error. Use RetryerV2, and GetAttemptToken instead. GetInitialToken() (releaseToken func(error) error) // GetAttemptToken returns the send token that can be used to rate limit // attempt calls. Will be used by the SDK's retry package's Attempt // middleware to get a send token prior to calling the temp and releasing // the send token after the attempt has been made. GetAttemptToken(context.Context) (func(error) error, error) } // NopRetryer provides a RequestRetryDecider implementation that will flag // all attempt errors as not retryable, with a max attempts of 1. type NopRetryer struct{} // IsErrorRetryable returns false for all error values. func (NopRetryer) IsErrorRetryable(error) bool { return false } // MaxAttempts always returns 1 for the original attempt. func (NopRetryer) MaxAttempts() int { return 1 } // RetryDelay is not valid for the NopRetryer. Will always return error. func (NopRetryer) RetryDelay(int, error) (time.Duration, error) { return 0, fmt.Errorf("not retrying any attempt errors") } // GetRetryToken returns a stub function that does nothing. func (NopRetryer) GetRetryToken(context.Context, error) (func(error) error, error) { return nopReleaseToken, nil } // GetInitialToken returns a stub function that does nothing. func (NopRetryer) GetInitialToken() func(error) error { return nopReleaseToken } // GetAttemptToken returns a stub function that does nothing. func (NopRetryer) GetAttemptToken(context.Context) (func(error) error, error) { return nopReleaseToken, nil } func nopReleaseToken(error) error { return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/runtime.go ================================================ package aws // ExecutionEnvironmentID is the AWS execution environment runtime identifier. type ExecutionEnvironmentID string // RuntimeEnvironment is a collection of values that are determined at runtime // based on the environment that the SDK is executing in. Some of these values // may or may not be present based on the executing environment and certain SDK // configuration properties that drive whether these values are populated.. type RuntimeEnvironment struct { EnvironmentIdentifier ExecutionEnvironmentID Region string EC2InstanceMetadataRegion string } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/cache.go ================================================ package v4 import ( "strings" "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" ) func lookupKey(service, region string) string { var s strings.Builder s.Grow(len(region) + len(service) + 3) s.WriteString(region) s.WriteRune('/') s.WriteString(service) return s.String() } type derivedKey struct { AccessKey string Date time.Time Credential []byte } type derivedKeyCache struct { values map[string]derivedKey mutex sync.RWMutex } func newDerivedKeyCache() derivedKeyCache { return derivedKeyCache{ values: make(map[string]derivedKey), } } func (s *derivedKeyCache) Get(credentials aws.Credentials, service, region string, signingTime SigningTime) []byte { key := lookupKey(service, region) s.mutex.RLock() if cred, ok := s.get(key, credentials, signingTime.Time); ok { s.mutex.RUnlock() return cred } s.mutex.RUnlock() s.mutex.Lock() if cred, ok := s.get(key, credentials, signingTime.Time); ok { s.mutex.Unlock() return cred } cred := deriveKey(credentials.SecretAccessKey, service, region, signingTime) entry := derivedKey{ AccessKey: credentials.AccessKeyID, Date: signingTime.Time, Credential: cred, } s.values[key] = entry s.mutex.Unlock() return cred } func (s *derivedKeyCache) get(key string, credentials aws.Credentials, signingTime time.Time) ([]byte, bool) { cacheEntry, ok := s.retrieveFromCache(key) if ok && cacheEntry.AccessKey == credentials.AccessKeyID && isSameDay(signingTime, cacheEntry.Date) { return cacheEntry.Credential, true } return nil, false } func (s *derivedKeyCache) retrieveFromCache(key string) (derivedKey, bool) { if v, ok := s.values[key]; ok { return v, true } return derivedKey{}, false } // SigningKeyDeriver derives a signing key from a set of credentials type SigningKeyDeriver struct { cache derivedKeyCache } // NewSigningKeyDeriver returns a new SigningKeyDeriver func NewSigningKeyDeriver() *SigningKeyDeriver { return &SigningKeyDeriver{ cache: newDerivedKeyCache(), } } // DeriveKey returns a derived signing key from the given credentials to be used with SigV4 signing. func (k *SigningKeyDeriver) DeriveKey(credential aws.Credentials, service, region string, signingTime SigningTime) []byte { return k.cache.Get(credential, service, region, signingTime) } func deriveKey(secret, service, region string, t SigningTime) []byte { hmacDate := HMACSHA256([]byte("AWS4"+secret), []byte(t.ShortTimeFormat())) hmacRegion := HMACSHA256(hmacDate, []byte(region)) hmacService := HMACSHA256(hmacRegion, []byte(service)) return HMACSHA256(hmacService, []byte("aws4_request")) } func isSameDay(x, y time.Time) bool { xYear, xMonth, xDay := x.Date() yYear, yMonth, yDay := y.Date() if xYear != yYear { return false } if xMonth != yMonth { return false } return xDay == yDay } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/const.go ================================================ package v4 // Signature Version 4 (SigV4) Constants const ( // EmptyStringSHA256 is the hex encoded sha256 value of an empty string EmptyStringSHA256 = `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855` // UnsignedPayload indicates that the request payload body is unsigned UnsignedPayload = "UNSIGNED-PAYLOAD" // AmzAlgorithmKey indicates the signing algorithm AmzAlgorithmKey = "X-Amz-Algorithm" // AmzSecurityTokenKey indicates the security token to be used with temporary credentials AmzSecurityTokenKey = "X-Amz-Security-Token" // AmzDateKey is the UTC timestamp for the request in the format YYYYMMDD'T'HHMMSS'Z' AmzDateKey = "X-Amz-Date" // AmzCredentialKey is the access key ID and credential scope AmzCredentialKey = "X-Amz-Credential" // AmzSignedHeadersKey is the set of headers signed for the request AmzSignedHeadersKey = "X-Amz-SignedHeaders" // AmzSignatureKey is the query parameter to store the SigV4 signature AmzSignatureKey = "X-Amz-Signature" // TimeFormat is the time format to be used in the X-Amz-Date header or query parameter TimeFormat = "20060102T150405Z" // ShortTimeFormat is the shorten time format used in the credential scope ShortTimeFormat = "20060102" // ContentSHAKey is the SHA256 of request body ContentSHAKey = "X-Amz-Content-Sha256" // StreamingEventsPayload indicates that the request payload body is a signed event stream. StreamingEventsPayload = "STREAMING-AWS4-HMAC-SHA256-EVENTS" ) ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/header_rules.go ================================================ package v4 import ( sdkstrings "github.com/aws/aws-sdk-go-v2/internal/strings" ) // Rules houses a set of Rule needed for validation of a // string value type Rules []Rule // Rule interface allows for more flexible rules and just simply // checks whether or not a value adheres to that Rule type Rule interface { IsValid(value string) bool } // IsValid will iterate through all rules and see if any rules // apply to the value and supports nested rules func (r Rules) IsValid(value string) bool { for _, rule := range r { if rule.IsValid(value) { return true } } return false } // MapRule generic Rule for maps type MapRule map[string]struct{} // IsValid for the map Rule satisfies whether it exists in the map func (m MapRule) IsValid(value string) bool { _, ok := m[value] return ok } // AllowList is a generic Rule for include listing type AllowList struct { Rule } // IsValid for AllowList checks if the value is within the AllowList func (w AllowList) IsValid(value string) bool { return w.Rule.IsValid(value) } // ExcludeList is a generic Rule for exclude listing type ExcludeList struct { Rule } // IsValid for AllowList checks if the value is within the AllowList func (b ExcludeList) IsValid(value string) bool { return !b.Rule.IsValid(value) } // Patterns is a list of strings to match against type Patterns []string // IsValid for Patterns checks each pattern and returns if a match has // been found func (p Patterns) IsValid(value string) bool { for _, pattern := range p { if sdkstrings.HasPrefixFold(value, pattern) { return true } } return false } // InclusiveRules rules allow for rules to depend on one another type InclusiveRules []Rule // IsValid will return true if all rules are true func (r InclusiveRules) IsValid(value string) bool { for _, rule := range r { if !rule.IsValid(value) { return false } } return true } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/headers.go ================================================ package v4 // IgnoredHeaders is a list of headers that are ignored during signing var IgnoredHeaders = Rules{ ExcludeList{ MapRule{ "Authorization": struct{}{}, "User-Agent": struct{}{}, "X-Amzn-Trace-Id": struct{}{}, "Expect": struct{}{}, "Transfer-Encoding": struct{}{}, }, }, } // RequiredSignedHeaders is a allow list for Build canonical headers. var RequiredSignedHeaders = Rules{ AllowList{ MapRule{ "Cache-Control": struct{}{}, "Content-Disposition": struct{}{}, "Content-Encoding": struct{}{}, "Content-Language": struct{}{}, "Content-Md5": struct{}{}, "Content-Type": struct{}{}, "Expires": struct{}{}, "If-Match": struct{}{}, "If-Modified-Since": struct{}{}, "If-None-Match": struct{}{}, "If-Unmodified-Since": struct{}{}, "Range": struct{}{}, "X-Amz-Acl": struct{}{}, "X-Amz-Copy-Source": struct{}{}, "X-Amz-Copy-Source-If-Match": struct{}{}, "X-Amz-Copy-Source-If-Modified-Since": struct{}{}, "X-Amz-Copy-Source-If-None-Match": struct{}{}, "X-Amz-Copy-Source-If-Unmodified-Since": struct{}{}, "X-Amz-Copy-Source-Range": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, "X-Amz-Grant-Full-control": struct{}{}, "X-Amz-Grant-Read": struct{}{}, "X-Amz-Grant-Read-Acp": struct{}{}, "X-Amz-Grant-Write": struct{}{}, "X-Amz-Grant-Write-Acp": struct{}{}, "X-Amz-Metadata-Directive": struct{}{}, "X-Amz-Mfa": struct{}{}, "X-Amz-Server-Side-Encryption": struct{}{}, "X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id": struct{}{}, "X-Amz-Server-Side-Encryption-Context": struct{}{}, "X-Amz-Server-Side-Encryption-Customer-Algorithm": struct{}{}, "X-Amz-Server-Side-Encryption-Customer-Key": struct{}{}, "X-Amz-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, "X-Amz-Storage-Class": struct{}{}, "X-Amz-Website-Redirect-Location": struct{}{}, "X-Amz-Content-Sha256": struct{}{}, "X-Amz-Tagging": struct{}{}, }, }, Patterns{"X-Amz-Object-Lock-"}, Patterns{"X-Amz-Meta-"}, } // AllowedQueryHoisting is a allowed list for Build query headers. The boolean value // represents whether or not it is a pattern. var AllowedQueryHoisting = InclusiveRules{ ExcludeList{RequiredSignedHeaders}, Patterns{"X-Amz-"}, } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/hmac.go ================================================ package v4 import ( "crypto/hmac" "crypto/sha256" ) // HMACSHA256 computes a HMAC-SHA256 of data given the provided key. func HMACSHA256(key []byte, data []byte) []byte { hash := hmac.New(sha256.New, key) hash.Write(data) return hash.Sum(nil) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/host.go ================================================ package v4 import ( "net/http" "strings" ) // SanitizeHostForHeader removes default port from host and updates request.Host func SanitizeHostForHeader(r *http.Request) { host := getHost(r) port := portOnly(host) if port != "" && isDefaultPort(r.URL.Scheme, port) { r.Host = stripPort(host) } } // Returns host from request func getHost(r *http.Request) string { if r.Host != "" { return r.Host } return r.URL.Host } // Hostname returns u.Host, without any port number. // // If Host is an IPv6 literal with a port number, Hostname returns the // IPv6 literal without the square brackets. IPv6 literals may include // a zone identifier. // // Copied from the Go 1.8 standard library (net/url) func stripPort(hostport string) string { colon := strings.IndexByte(hostport, ':') if colon == -1 { return hostport } if i := strings.IndexByte(hostport, ']'); i != -1 { return strings.TrimPrefix(hostport[:i], "[") } return hostport[:colon] } // Port returns the port part of u.Host, without the leading colon. // If u.Host doesn't contain a port, Port returns an empty string. // // Copied from the Go 1.8 standard library (net/url) func portOnly(hostport string) string { colon := strings.IndexByte(hostport, ':') if colon == -1 { return "" } if i := strings.Index(hostport, "]:"); i != -1 { return hostport[i+len("]:"):] } if strings.Contains(hostport, "]") { return "" } return hostport[colon+len(":"):] } // Returns true if the specified URI is using the standard port // (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs) func isDefaultPort(scheme, port string) bool { if port == "" { return true } lowerCaseScheme := strings.ToLower(scheme) if (lowerCaseScheme == "http" && port == "80") || (lowerCaseScheme == "https" && port == "443") { return true } return false } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/scope.go ================================================ package v4 import "strings" // BuildCredentialScope builds the Signature Version 4 (SigV4) signing scope func BuildCredentialScope(signingTime SigningTime, region, service string) string { return strings.Join([]string{ signingTime.ShortTimeFormat(), region, service, "aws4_request", }, "/") } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/time.go ================================================ package v4 import "time" // SigningTime provides a wrapper around a time.Time which provides cached values for SigV4 signing. type SigningTime struct { time.Time timeFormat string shortTimeFormat string } // NewSigningTime creates a new SigningTime given a time.Time func NewSigningTime(t time.Time) SigningTime { return SigningTime{ Time: t, } } // TimeFormat provides a time formatted in the X-Amz-Date format. func (m *SigningTime) TimeFormat() string { return m.format(&m.timeFormat, TimeFormat) } // ShortTimeFormat provides a time formatted of 20060102. func (m *SigningTime) ShortTimeFormat() string { return m.format(&m.shortTimeFormat, ShortTimeFormat) } func (m *SigningTime) format(target *string, format string) string { if len(*target) > 0 { return *target } v := m.Time.Format(format) *target = v return v } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/util.go ================================================ package v4 import ( "net/url" "strings" ) const doubleSpace = " " // StripExcessSpaces will rewrite the passed in slice's string values to not // contain multiple side-by-side spaces. func StripExcessSpaces(str string) string { var j, k, l, m, spaces int // Trim trailing spaces for j = len(str) - 1; j >= 0 && str[j] == ' '; j-- { } // Trim leading spaces for k = 0; k < j && str[k] == ' '; k++ { } str = str[k : j+1] // Strip multiple spaces. j = strings.Index(str, doubleSpace) if j < 0 { return str } buf := []byte(str) for k, m, l = j, j, len(buf); k < l; k++ { if buf[k] == ' ' { if spaces == 0 { // First space. buf[m] = buf[k] m++ } spaces++ } else { // End of multiple spaces. spaces = 0 buf[m] = buf[k] m++ } } return string(buf[:m]) } // GetURIPath returns the escaped URI component from the provided URL. func GetURIPath(u *url.URL) string { var uriPath string if len(u.Opaque) > 0 { const schemeSep, pathSep, queryStart = "//", "/", "?" opaque := u.Opaque // Cut off the query string if present. if idx := strings.Index(opaque, queryStart); idx >= 0 { opaque = opaque[:idx] } // Cutout the scheme separator if present. if strings.Index(opaque, schemeSep) == 0 { opaque = opaque[len(schemeSep):] } // capture URI path starting with first path separator. if idx := strings.Index(opaque, pathSep); idx >= 0 { uriPath = opaque[idx:] } } else { uriPath = u.EscapedPath() } if len(uriPath) == 0 { uriPath = "/" } return uriPath } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/middleware.go ================================================ package v4 import ( "context" "crypto/sha256" "encoding/hex" "fmt" "io" "net/http" "strings" "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" v4Internal "github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4" internalauth "github.com/aws/aws-sdk-go-v2/internal/auth" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" ) const computePayloadHashMiddlewareID = "ComputePayloadHash" // HashComputationError indicates an error occurred while computing the signing hash type HashComputationError struct { Err error } // Error is the error message func (e *HashComputationError) Error() string { return fmt.Sprintf("failed to compute payload hash: %v", e.Err) } // Unwrap returns the underlying error if one is set func (e *HashComputationError) Unwrap() error { return e.Err } // SigningError indicates an error condition occurred while performing SigV4 signing type SigningError struct { Err error } func (e *SigningError) Error() string { return fmt.Sprintf("failed to sign request: %v", e.Err) } // Unwrap returns the underlying error cause func (e *SigningError) Unwrap() error { return e.Err } // UseDynamicPayloadSigningMiddleware swaps the compute payload sha256 middleware with a resolver middleware that // switches between unsigned and signed payload based on TLS state for request. // This middleware should not be used for AWS APIs that do not support unsigned payload signing auth. // By default, SDK uses this middleware for known AWS APIs that support such TLS based auth selection . // // Usage example - // S3 PutObject API allows unsigned payload signing auth usage when TLS is enabled, and uses this middleware to // dynamically switch between unsigned and signed payload based on TLS state for request. func UseDynamicPayloadSigningMiddleware(stack *middleware.Stack) error { _, err := stack.Finalize.Swap(computePayloadHashMiddlewareID, &dynamicPayloadSigningMiddleware{}) return err } // dynamicPayloadSigningMiddleware dynamically resolves the middleware that computes and set payload sha256 middleware. type dynamicPayloadSigningMiddleware struct { } // ID returns the resolver identifier func (m *dynamicPayloadSigningMiddleware) ID() string { return computePayloadHashMiddlewareID } // HandleFinalize delegates SHA256 computation according to whether the request // is TLS-enabled. func (m *dynamicPayloadSigningMiddleware) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if req.IsHTTPS() { return (&UnsignedPayload{}).HandleFinalize(ctx, in, next) } return (&ComputePayloadSHA256{}).HandleFinalize(ctx, in, next) } // UnsignedPayload sets the SigV4 request payload hash to unsigned. // // Will not set the Unsigned Payload magic SHA value, if a SHA has already been // stored in the context. (e.g. application pre-computed SHA256 before making // API call). // // This middleware does not check the X-Amz-Content-Sha256 header, if that // header is serialized a middleware must translate it into the context. type UnsignedPayload struct{} // AddUnsignedPayloadMiddleware adds unsignedPayload to the operation // middleware stack func AddUnsignedPayloadMiddleware(stack *middleware.Stack) error { return stack.Finalize.Insert(&UnsignedPayload{}, "ResolveEndpointV2", middleware.After) } // ID returns the unsignedPayload identifier func (m *UnsignedPayload) ID() string { return computePayloadHashMiddlewareID } // HandleFinalize sets the payload hash magic value to the unsigned sentinel. func (m *UnsignedPayload) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { if GetPayloadHash(ctx) == "" { ctx = SetPayloadHash(ctx, v4Internal.UnsignedPayload) } return next.HandleFinalize(ctx, in) } // ComputePayloadSHA256 computes SHA256 payload hash to sign. // // Will not set the Unsigned Payload magic SHA value, if a SHA has already been // stored in the context. (e.g. application pre-computed SHA256 before making // API call). // // This middleware does not check the X-Amz-Content-Sha256 header, if that // header is serialized a middleware must translate it into the context. type ComputePayloadSHA256 struct{} // AddComputePayloadSHA256Middleware adds computePayloadSHA256 to the // operation middleware stack func AddComputePayloadSHA256Middleware(stack *middleware.Stack) error { return stack.Finalize.Insert(&ComputePayloadSHA256{}, "ResolveEndpointV2", middleware.After) } // RemoveComputePayloadSHA256Middleware removes computePayloadSHA256 from the // operation middleware stack func RemoveComputePayloadSHA256Middleware(stack *middleware.Stack) error { _, err := stack.Finalize.Remove(computePayloadHashMiddlewareID) return err } // ID is the middleware name func (m *ComputePayloadSHA256) ID() string { return computePayloadHashMiddlewareID } // HandleFinalize computes the payload hash for the request, storing it to the // context. This is a no-op if a caller has previously set that value. func (m *ComputePayloadSHA256) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { if GetPayloadHash(ctx) != "" { return next.HandleFinalize(ctx, in) } _, span := tracing.StartSpan(ctx, "ComputePayloadSHA256") defer span.End() req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &HashComputationError{ Err: fmt.Errorf("unexpected request middleware type %T", in.Request), } } hash := sha256.New() if stream := req.GetStream(); stream != nil { _, err = io.Copy(hash, stream) if err != nil { return out, metadata, &HashComputationError{ Err: fmt.Errorf("failed to compute payload hash, %w", err), } } if err := req.RewindStream(); err != nil { return out, metadata, &HashComputationError{ Err: fmt.Errorf("failed to seek body to start, %w", err), } } } ctx = SetPayloadHash(ctx, hex.EncodeToString(hash.Sum(nil))) span.End() return next.HandleFinalize(ctx, in) } // SwapComputePayloadSHA256ForUnsignedPayloadMiddleware replaces the // ComputePayloadSHA256 middleware with the UnsignedPayload middleware. // // Use this to disable computing the Payload SHA256 checksum and instead use // UNSIGNED-PAYLOAD for the SHA256 value. func SwapComputePayloadSHA256ForUnsignedPayloadMiddleware(stack *middleware.Stack) error { _, err := stack.Finalize.Swap(computePayloadHashMiddlewareID, &UnsignedPayload{}) return err } // ContentSHA256Header sets the X-Amz-Content-Sha256 header value to // the Payload hash stored in the context. type ContentSHA256Header struct{} // AddContentSHA256HeaderMiddleware adds ContentSHA256Header to the // operation middleware stack func AddContentSHA256HeaderMiddleware(stack *middleware.Stack) error { return stack.Finalize.Insert(&ContentSHA256Header{}, computePayloadHashMiddlewareID, middleware.After) } // RemoveContentSHA256HeaderMiddleware removes contentSHA256Header middleware // from the operation middleware stack func RemoveContentSHA256HeaderMiddleware(stack *middleware.Stack) error { _, err := stack.Finalize.Remove((*ContentSHA256Header)(nil).ID()) return err } // ID returns the ContentSHA256HeaderMiddleware identifier func (m *ContentSHA256Header) ID() string { return "SigV4ContentSHA256Header" } // HandleFinalize sets the X-Amz-Content-Sha256 header value to the Payload hash // stored in the context. func (m *ContentSHA256Header) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &HashComputationError{Err: fmt.Errorf("unexpected request middleware type %T", in.Request)} } req.Header.Set(v4Internal.ContentSHAKey, GetPayloadHash(ctx)) return next.HandleFinalize(ctx, in) } // SignHTTPRequestMiddlewareOptions is the configuration options for // [SignHTTPRequestMiddleware]. // // Deprecated: [SignHTTPRequestMiddleware] is deprecated. type SignHTTPRequestMiddlewareOptions struct { CredentialsProvider aws.CredentialsProvider Signer HTTPSigner LogSigning bool } // SignHTTPRequestMiddleware is a `FinalizeMiddleware` implementation for SigV4 // HTTP Signing. // // Deprecated: AWS service clients no longer use this middleware. Signing as an // SDK operation is now performed through an internal per-service middleware // which opaquely selects and uses the signer from the resolved auth scheme. type SignHTTPRequestMiddleware struct { credentialsProvider aws.CredentialsProvider signer HTTPSigner logSigning bool } // NewSignHTTPRequestMiddleware constructs a [SignHTTPRequestMiddleware] using // the given [Signer] for signing requests. // // Deprecated: SignHTTPRequestMiddleware is deprecated. func NewSignHTTPRequestMiddleware(options SignHTTPRequestMiddlewareOptions) *SignHTTPRequestMiddleware { return &SignHTTPRequestMiddleware{ credentialsProvider: options.CredentialsProvider, signer: options.Signer, logSigning: options.LogSigning, } } // ID is the SignHTTPRequestMiddleware identifier. // // Deprecated: SignHTTPRequestMiddleware is deprecated. func (s *SignHTTPRequestMiddleware) ID() string { return "Signing" } // HandleFinalize will take the provided input and sign the request using the // SigV4 authentication scheme. // // Deprecated: SignHTTPRequestMiddleware is deprecated. func (s *SignHTTPRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { if !haveCredentialProvider(s.credentialsProvider) { return next.HandleFinalize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &SigningError{Err: fmt.Errorf("unexpected request middleware type %T", in.Request)} } signingName, signingRegion := awsmiddleware.GetSigningName(ctx), awsmiddleware.GetSigningRegion(ctx) payloadHash := GetPayloadHash(ctx) if len(payloadHash) == 0 { return out, metadata, &SigningError{Err: fmt.Errorf("computed payload hash missing from context")} } credentials, err := s.credentialsProvider.Retrieve(ctx) if err != nil { return out, metadata, &SigningError{Err: fmt.Errorf("failed to retrieve credentials: %w", err)} } signerOptions := []func(o *SignerOptions){ func(o *SignerOptions) { o.Logger = middleware.GetLogger(ctx) o.LogSigning = s.logSigning }, } // existing DisableURIPathEscaping is equivalent in purpose // to authentication scheme property DisableDoubleEncoding disableDoubleEncoding, overridden := internalauth.GetDisableDoubleEncoding(ctx) if overridden { signerOptions = append(signerOptions, func(o *SignerOptions) { o.DisableURIPathEscaping = disableDoubleEncoding }) } err = s.signer.SignHTTP(ctx, credentials, req.Request, payloadHash, signingName, signingRegion, sdk.NowTime(), signerOptions...) if err != nil { return out, metadata, &SigningError{Err: fmt.Errorf("failed to sign http request, %w", err)} } ctx = awsmiddleware.SetSigningCredentials(ctx, credentials) return next.HandleFinalize(ctx, in) } // StreamingEventsPayload signs input event stream messages. type StreamingEventsPayload struct{} // AddStreamingEventsPayload adds the streamingEventsPayload middleware to the stack. func AddStreamingEventsPayload(stack *middleware.Stack) error { return stack.Finalize.Add(&StreamingEventsPayload{}, middleware.Before) } // ID identifies the middleware. func (s *StreamingEventsPayload) ID() string { return computePayloadHashMiddlewareID } // HandleFinalize marks the input stream to be signed with SigV4. func (s *StreamingEventsPayload) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { contentSHA := GetPayloadHash(ctx) if len(contentSHA) == 0 { contentSHA = v4Internal.StreamingEventsPayload } ctx = SetPayloadHash(ctx, contentSHA) return next.HandleFinalize(ctx, in) } // GetSignedRequestSignature attempts to extract the signature of the request. // Returning an error if the request is unsigned, or unable to extract the // signature. func GetSignedRequestSignature(r *http.Request) ([]byte, error) { const authHeaderSignatureElem = "Signature=" if auth := r.Header.Get(authorizationHeader); len(auth) != 0 { ps := strings.Split(auth, ",") for _, p := range ps { p = strings.TrimSpace(p) if idx := strings.Index(p, authHeaderSignatureElem); idx >= 0 { sig := p[len(authHeaderSignatureElem):] if len(sig) == 0 { return nil, fmt.Errorf("invalid request signature authorization header") } return hex.DecodeString(sig) } } } if sig := r.URL.Query().Get("X-Amz-Signature"); len(sig) != 0 { return hex.DecodeString(sig) } return nil, fmt.Errorf("request not signed") } func haveCredentialProvider(p aws.CredentialsProvider) bool { if p == nil { return false } return !aws.IsCredentialsProvider(p, (*aws.AnonymousCredentials)(nil)) } type payloadHashKey struct{} // GetPayloadHash retrieves the payload hash to use for signing // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetPayloadHash(ctx context.Context) (v string) { v, _ = middleware.GetStackValue(ctx, payloadHashKey{}).(string) return v } // SetPayloadHash sets the payload hash to be used for signing the request // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func SetPayloadHash(ctx context.Context, hash string) context.Context { return middleware.WithStackValue(ctx, payloadHashKey{}, hash) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/presign_middleware.go ================================================ package v4 import ( "context" "fmt" "net/http" "time" "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go/middleware" smithyHTTP "github.com/aws/smithy-go/transport/http" ) // HTTPPresigner is an interface to a SigV4 signer that can sign create a // presigned URL for a HTTP requests. type HTTPPresigner interface { PresignHTTP( ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*SignerOptions), ) (url string, signedHeader http.Header, err error) } // PresignedHTTPRequest provides the URL and signed headers that are included // in the presigned URL. type PresignedHTTPRequest struct { URL string Method string SignedHeader http.Header } // PresignHTTPRequestMiddlewareOptions is the options for the PresignHTTPRequestMiddleware middleware. type PresignHTTPRequestMiddlewareOptions struct { CredentialsProvider aws.CredentialsProvider Presigner HTTPPresigner LogSigning bool } // PresignHTTPRequestMiddleware provides the Finalize middleware for creating a // presigned URL for an HTTP request. // // Will short circuit the middleware stack and not forward onto the next // Finalize handler. type PresignHTTPRequestMiddleware struct { credentialsProvider aws.CredentialsProvider presigner HTTPPresigner logSigning bool } // NewPresignHTTPRequestMiddleware returns a new PresignHTTPRequestMiddleware // initialized with the presigner. func NewPresignHTTPRequestMiddleware(options PresignHTTPRequestMiddlewareOptions) *PresignHTTPRequestMiddleware { return &PresignHTTPRequestMiddleware{ credentialsProvider: options.CredentialsProvider, presigner: options.Presigner, logSigning: options.LogSigning, } } // ID provides the middleware ID. func (*PresignHTTPRequestMiddleware) ID() string { return "PresignHTTPRequest" } // HandleFinalize will take the provided input and create a presigned url for // the http request using the SigV4 presign authentication scheme. // // Since the signed request is not a valid HTTP request func (s *PresignHTTPRequestMiddleware) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyHTTP.Request) if !ok { return out, metadata, &SigningError{ Err: fmt.Errorf("unexpected request middleware type %T", in.Request), } } httpReq := req.Build(ctx) if !haveCredentialProvider(s.credentialsProvider) { out.Result = &PresignedHTTPRequest{ URL: httpReq.URL.String(), Method: httpReq.Method, SignedHeader: http.Header{}, } return out, metadata, nil } signingName := awsmiddleware.GetSigningName(ctx) signingRegion := awsmiddleware.GetSigningRegion(ctx) payloadHash := GetPayloadHash(ctx) if len(payloadHash) == 0 { return out, metadata, &SigningError{ Err: fmt.Errorf("computed payload hash missing from context"), } } credentials, err := s.credentialsProvider.Retrieve(ctx) if err != nil { return out, metadata, &SigningError{ Err: fmt.Errorf("failed to retrieve credentials: %w", err), } } u, h, err := s.presigner.PresignHTTP(ctx, credentials, httpReq, payloadHash, signingName, signingRegion, sdk.NowTime(), func(o *SignerOptions) { o.Logger = middleware.GetLogger(ctx) o.LogSigning = s.logSigning }) if err != nil { return out, metadata, &SigningError{ Err: fmt.Errorf("failed to sign http request, %w", err), } } out.Result = &PresignedHTTPRequest{ URL: u, Method: httpReq.Method, SignedHeader: h, } return out, metadata, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/stream.go ================================================ package v4 import ( "context" "crypto/sha256" "encoding/hex" "github.com/aws/aws-sdk-go-v2/aws" v4Internal "github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4" "strings" "time" ) // EventStreamSigner is an AWS EventStream protocol signer. type EventStreamSigner interface { GetSignature(ctx context.Context, headers, payload []byte, signingTime time.Time, optFns ...func(*StreamSignerOptions)) ([]byte, error) } // StreamSignerOptions is the configuration options for StreamSigner. type StreamSignerOptions struct{} // StreamSigner implements Signature Version 4 (SigV4) signing of event stream encoded payloads. type StreamSigner struct { options StreamSignerOptions credentials aws.Credentials service string region string prevSignature []byte signingKeyDeriver *v4Internal.SigningKeyDeriver } // NewStreamSigner returns a new AWS EventStream protocol signer. func NewStreamSigner(credentials aws.Credentials, service, region string, seedSignature []byte, optFns ...func(*StreamSignerOptions)) *StreamSigner { o := StreamSignerOptions{} for _, fn := range optFns { fn(&o) } return &StreamSigner{ options: o, credentials: credentials, service: service, region: region, signingKeyDeriver: v4Internal.NewSigningKeyDeriver(), prevSignature: seedSignature, } } // GetSignature signs the provided header and payload bytes. func (s *StreamSigner) GetSignature(ctx context.Context, headers, payload []byte, signingTime time.Time, optFns ...func(*StreamSignerOptions)) ([]byte, error) { options := s.options for _, fn := range optFns { fn(&options) } prevSignature := s.prevSignature st := v4Internal.NewSigningTime(signingTime) sigKey := s.signingKeyDeriver.DeriveKey(s.credentials, s.service, s.region, st) scope := v4Internal.BuildCredentialScope(st, s.region, s.service) stringToSign := s.buildEventStreamStringToSign(headers, payload, prevSignature, scope, &st) signature := v4Internal.HMACSHA256(sigKey, []byte(stringToSign)) s.prevSignature = signature return signature, nil } func (s *StreamSigner) buildEventStreamStringToSign(headers, payload, previousSignature []byte, credentialScope string, signingTime *v4Internal.SigningTime) string { hash := sha256.New() return strings.Join([]string{ "AWS4-HMAC-SHA256-PAYLOAD", signingTime.TimeFormat(), credentialScope, hex.EncodeToString(previousSignature), hex.EncodeToString(makeHash(hash, headers)), hex.EncodeToString(makeHash(hash, payload)), }, "\n") } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/v4.go ================================================ // Package v4 implements the AWS signature version 4 algorithm (commonly known // as SigV4). // // For more information about SigV4, see [Signing AWS API requests] in the IAM // user guide. // // While this implementation CAN work in an external context, it is developed // primarily for SDK use and you may encounter fringe behaviors around header // canonicalization. // // # Pre-escaping a request URI // // AWS v4 signature validation requires that the canonical string's URI path // component must be the escaped form of the HTTP request's path. // // The Go HTTP client will perform escaping automatically on the HTTP request. // This may cause signature validation errors because the request differs from // the URI path or query from which the signature was generated. // // Because of this, we recommend that you explicitly escape the request when // using this signer outside of the SDK to prevent possible signature mismatch. // This can be done by setting URL.Opaque on the request. The signer will // prefer that value, falling back to the return of URL.EscapedPath if unset. // // When setting URL.Opaque you must do so in the form of: // // "///" // // // e.g. // "//example.com/some/path" // // The leading "//" and hostname are required or the escaping will not work // correctly. // // The TestStandaloneSign unit test provides a complete example of using the // signer outside of the SDK and pre-escaping the URI path. // // [Signing AWS API requests]: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html package v4 import ( "context" "crypto/sha256" "encoding/hex" "fmt" "hash" "net/http" "net/textproto" "net/url" "sort" "strconv" "strings" "time" "github.com/aws/aws-sdk-go-v2/aws" v4Internal "github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4" "github.com/aws/smithy-go/encoding/httpbinding" "github.com/aws/smithy-go/logging" ) const ( signingAlgorithm = "AWS4-HMAC-SHA256" authorizationHeader = "Authorization" // Version of signing v4 Version = "SigV4" ) // HTTPSigner is an interface to a SigV4 signer that can sign HTTP requests type HTTPSigner interface { SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*SignerOptions)) error } type keyDerivator interface { DeriveKey(credential aws.Credentials, service, region string, signingTime v4Internal.SigningTime) []byte } // SignerOptions is the SigV4 Signer options. type SignerOptions struct { // Disables the Signer's moving HTTP header key/value pairs from the HTTP // request header to the request's query string. This is most commonly used // with pre-signed requests preventing headers from being added to the // request's query string. DisableHeaderHoisting bool // Disables the automatic escaping of the URI path of the request for the // siganture's canonical string's path. For services that do not need additional // escaping then use this to disable the signer escaping the path. // // S3 is an example of a service that does not need additional escaping. // // http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html DisableURIPathEscaping bool // The logger to send log messages to. Logger logging.Logger // Enable logging of signed requests. // This will enable logging of the canonical request, the string to sign, and for presigning the subsequent // presigned URL. LogSigning bool // Disables setting the session token on the request as part of signing // through X-Amz-Security-Token. This is needed for variations of v4 that // present the token elsewhere. DisableSessionToken bool } // Signer applies AWS v4 signing to given request. Use this to sign requests // that need to be signed with AWS V4 Signatures. type Signer struct { options SignerOptions keyDerivator keyDerivator } // NewSigner returns a new SigV4 Signer func NewSigner(optFns ...func(signer *SignerOptions)) *Signer { options := SignerOptions{} for _, fn := range optFns { fn(&options) } return &Signer{options: options, keyDerivator: v4Internal.NewSigningKeyDeriver()} } type httpSigner struct { Request *http.Request ServiceName string Region string Time v4Internal.SigningTime Credentials aws.Credentials KeyDerivator keyDerivator IsPreSign bool PayloadHash string DisableHeaderHoisting bool DisableURIPathEscaping bool DisableSessionToken bool } func (s *httpSigner) Build() (signedRequest, error) { req := s.Request query := req.URL.Query() headers := req.Header s.setRequiredSigningFields(headers, query) // Sort Each Query Key's Values for key := range query { sort.Strings(query[key]) } v4Internal.SanitizeHostForHeader(req) credentialScope := s.buildCredentialScope() credentialStr := s.Credentials.AccessKeyID + "/" + credentialScope if s.IsPreSign { query.Set(v4Internal.AmzCredentialKey, credentialStr) } unsignedHeaders := headers if s.IsPreSign && !s.DisableHeaderHoisting { var urlValues url.Values urlValues, unsignedHeaders = buildQuery(v4Internal.AllowedQueryHoisting, headers) for k := range urlValues { query[k] = urlValues[k] } } host := req.URL.Host if len(req.Host) > 0 { host = req.Host } signedHeaders, signedHeadersStr, canonicalHeaderStr := s.buildCanonicalHeaders(host, v4Internal.IgnoredHeaders, unsignedHeaders, s.Request.ContentLength) if s.IsPreSign { query.Set(v4Internal.AmzSignedHeadersKey, signedHeadersStr) } var rawQuery strings.Builder rawQuery.WriteString(strings.Replace(query.Encode(), "+", "%20", -1)) canonicalURI := v4Internal.GetURIPath(req.URL) if !s.DisableURIPathEscaping { canonicalURI = httpbinding.EscapePath(canonicalURI, false) } canonicalString := s.buildCanonicalString( req.Method, canonicalURI, rawQuery.String(), signedHeadersStr, canonicalHeaderStr, ) strToSign := s.buildStringToSign(credentialScope, canonicalString) signingSignature, err := s.buildSignature(strToSign) if err != nil { return signedRequest{}, err } if s.IsPreSign { rawQuery.WriteString("&X-Amz-Signature=") rawQuery.WriteString(signingSignature) } else { headers[authorizationHeader] = append(headers[authorizationHeader][:0], buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature)) } req.URL.RawQuery = rawQuery.String() return signedRequest{ Request: req, SignedHeaders: signedHeaders, CanonicalString: canonicalString, StringToSign: strToSign, PreSigned: s.IsPreSign, }, nil } func buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature string) string { const credential = "Credential=" const signedHeaders = "SignedHeaders=" const signature = "Signature=" const commaSpace = ", " var parts strings.Builder parts.Grow(len(signingAlgorithm) + 1 + len(credential) + len(credentialStr) + 2 + len(signedHeaders) + len(signedHeadersStr) + 2 + len(signature) + len(signingSignature), ) parts.WriteString(signingAlgorithm) parts.WriteRune(' ') parts.WriteString(credential) parts.WriteString(credentialStr) parts.WriteString(commaSpace) parts.WriteString(signedHeaders) parts.WriteString(signedHeadersStr) parts.WriteString(commaSpace) parts.WriteString(signature) parts.WriteString(signingSignature) return parts.String() } // SignHTTP signs AWS v4 requests with the provided payload hash, service name, region the // request is made to, and time the request is signed at. The signTime allows // you to specify that a request is signed for the future, and cannot be // used until then. // // The payloadHash is the hex encoded SHA-256 hash of the request payload, and // must be provided. Even if the request has no payload (aka body). If the // request has no payload you should use the hex encoded SHA-256 of an empty // string as the payloadHash value. // // "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" // // Some services such as Amazon S3 accept alternative values for the payload // hash, such as "UNSIGNED-PAYLOAD" for requests where the body will not be // included in the request signature. // // https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html // // Sign differs from Presign in that it will sign the request using HTTP // header values. This type of signing is intended for http.Request values that // will not be shared, or are shared in a way the header values on the request // will not be lost. // // The passed in request will be modified in place. func (s Signer) SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(options *SignerOptions)) error { options := s.options for _, fn := range optFns { fn(&options) } signer := &httpSigner{ Request: r, PayloadHash: payloadHash, ServiceName: service, Region: region, Credentials: credentials, Time: v4Internal.NewSigningTime(signingTime.UTC()), DisableHeaderHoisting: options.DisableHeaderHoisting, DisableURIPathEscaping: options.DisableURIPathEscaping, DisableSessionToken: options.DisableSessionToken, KeyDerivator: s.keyDerivator, } signedRequest, err := signer.Build() if err != nil { return err } logSigningInfo(ctx, options, &signedRequest, false) return nil } // PresignHTTP signs AWS v4 requests with the payload hash, service name, region // the request is made to, and time the request is signed at. The signTime // allows you to specify that a request is signed for the future, and cannot // be used until then. // // Returns the signed URL and the map of HTTP headers that were included in the // signature or an error if signing the request failed. For presigned requests // these headers and their values must be included on the HTTP request when it // is made. This is helpful to know what header values need to be shared with // the party the presigned request will be distributed to. // // The payloadHash is the hex encoded SHA-256 hash of the request payload, and // must be provided. Even if the request has no payload (aka body). If the // request has no payload you should use the hex encoded SHA-256 of an empty // string as the payloadHash value. // // "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" // // Some services such as Amazon S3 accept alternative values for the payload // hash, such as "UNSIGNED-PAYLOAD" for requests where the body will not be // included in the request signature. // // https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html // // PresignHTTP differs from SignHTTP in that it will sign the request using // query string instead of header values. This allows you to share the // Presigned Request's URL with third parties, or distribute it throughout your // system with minimal dependencies. // // PresignHTTP will not set the expires time of the presigned request // automatically. To specify the expire duration for a request add the // "X-Amz-Expires" query parameter on the request with the value as the // duration in seconds the presigned URL should be considered valid for. This // parameter is not used by all AWS services, and is most notable used by // Amazon S3 APIs. // // expires := 20 * time.Minute // query := req.URL.Query() // query.Set("X-Amz-Expires", strconv.FormatInt(int64(expires/time.Second), 10)) // req.URL.RawQuery = query.Encode() // // This method does not modify the provided request. func (s *Signer) PresignHTTP( ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*SignerOptions), ) (signedURI string, signedHeaders http.Header, err error) { options := s.options for _, fn := range optFns { fn(&options) } signer := &httpSigner{ Request: r.Clone(r.Context()), PayloadHash: payloadHash, ServiceName: service, Region: region, Credentials: credentials, Time: v4Internal.NewSigningTime(signingTime.UTC()), IsPreSign: true, DisableHeaderHoisting: options.DisableHeaderHoisting, DisableURIPathEscaping: options.DisableURIPathEscaping, DisableSessionToken: options.DisableSessionToken, KeyDerivator: s.keyDerivator, } signedRequest, err := signer.Build() if err != nil { return "", nil, err } logSigningInfo(ctx, options, &signedRequest, true) signedHeaders = make(http.Header) // For the signed headers we canonicalize the header keys in the returned map. // This avoids situations where can standard library double headers like host header. For example the standard // library will set the Host header, even if it is present in lower-case form. for k, v := range signedRequest.SignedHeaders { key := textproto.CanonicalMIMEHeaderKey(k) signedHeaders[key] = append(signedHeaders[key], v...) } return signedRequest.Request.URL.String(), signedHeaders, nil } func (s *httpSigner) buildCredentialScope() string { return v4Internal.BuildCredentialScope(s.Time, s.Region, s.ServiceName) } func buildQuery(r v4Internal.Rule, header http.Header) (url.Values, http.Header) { query := url.Values{} unsignedHeaders := http.Header{} // A list of headers to be converted to lower case to mitigate a limitation from S3 lowerCaseHeaders := map[string]string{ "X-Amz-Expected-Bucket-Owner": "x-amz-expected-bucket-owner", // see #2508 "X-Amz-Request-Payer": "x-amz-request-payer", // see #2764 } for k, h := range header { if newKey, ok := lowerCaseHeaders[k]; ok { k = newKey } if r.IsValid(k) { query[k] = h } else { unsignedHeaders[k] = h } } return query, unsignedHeaders } func (s *httpSigner) buildCanonicalHeaders(host string, rule v4Internal.Rule, header http.Header, length int64) (signed http.Header, signedHeaders, canonicalHeadersStr string) { signed = make(http.Header) var headers []string const hostHeader = "host" headers = append(headers, hostHeader) signed[hostHeader] = append(signed[hostHeader], host) const contentLengthHeader = "content-length" if length > 0 { headers = append(headers, contentLengthHeader) signed[contentLengthHeader] = append(signed[contentLengthHeader], strconv.FormatInt(length, 10)) } for k, v := range header { if !rule.IsValid(k) { continue // ignored header } if strings.EqualFold(k, contentLengthHeader) { // prevent signing already handled content-length header. continue } lowerCaseKey := strings.ToLower(k) if _, ok := signed[lowerCaseKey]; ok { // include additional values signed[lowerCaseKey] = append(signed[lowerCaseKey], v...) continue } headers = append(headers, lowerCaseKey) signed[lowerCaseKey] = v } sort.Strings(headers) signedHeaders = strings.Join(headers, ";") var canonicalHeaders strings.Builder n := len(headers) const colon = ':' for i := 0; i < n; i++ { if headers[i] == hostHeader { canonicalHeaders.WriteString(hostHeader) canonicalHeaders.WriteRune(colon) canonicalHeaders.WriteString(v4Internal.StripExcessSpaces(host)) } else { canonicalHeaders.WriteString(headers[i]) canonicalHeaders.WriteRune(colon) // Trim out leading, trailing, and dedup inner spaces from signed header values. values := signed[headers[i]] for j, v := range values { cleanedValue := strings.TrimSpace(v4Internal.StripExcessSpaces(v)) canonicalHeaders.WriteString(cleanedValue) if j < len(values)-1 { canonicalHeaders.WriteRune(',') } } } canonicalHeaders.WriteRune('\n') } canonicalHeadersStr = canonicalHeaders.String() return signed, signedHeaders, canonicalHeadersStr } func (s *httpSigner) buildCanonicalString(method, uri, query, signedHeaders, canonicalHeaders string) string { return strings.Join([]string{ method, uri, query, canonicalHeaders, signedHeaders, s.PayloadHash, }, "\n") } func (s *httpSigner) buildStringToSign(credentialScope, canonicalRequestString string) string { return strings.Join([]string{ signingAlgorithm, s.Time.TimeFormat(), credentialScope, hex.EncodeToString(makeHash(sha256.New(), []byte(canonicalRequestString))), }, "\n") } func makeHash(hash hash.Hash, b []byte) []byte { hash.Reset() hash.Write(b) return hash.Sum(nil) } func (s *httpSigner) buildSignature(strToSign string) (string, error) { key := s.KeyDerivator.DeriveKey(s.Credentials, s.ServiceName, s.Region, s.Time) return hex.EncodeToString(v4Internal.HMACSHA256(key, []byte(strToSign))), nil } func (s *httpSigner) setRequiredSigningFields(headers http.Header, query url.Values) { amzDate := s.Time.TimeFormat() if s.IsPreSign { query.Set(v4Internal.AmzAlgorithmKey, signingAlgorithm) sessionToken := s.Credentials.SessionToken if !s.DisableSessionToken && len(sessionToken) > 0 { query.Set("X-Amz-Security-Token", sessionToken) } query.Set(v4Internal.AmzDateKey, amzDate) return } headers[v4Internal.AmzDateKey] = append(headers[v4Internal.AmzDateKey][:0], amzDate) if !s.DisableSessionToken && len(s.Credentials.SessionToken) > 0 { headers[v4Internal.AmzSecurityTokenKey] = append(headers[v4Internal.AmzSecurityTokenKey][:0], s.Credentials.SessionToken) } } func logSigningInfo(ctx context.Context, options SignerOptions, request *signedRequest, isPresign bool) { if !options.LogSigning { return } signedURLMsg := "" if isPresign { signedURLMsg = fmt.Sprintf(logSignedURLMsg, request.Request.URL.String()) } logger := logging.WithContext(ctx, options.Logger) logger.Logf(logging.Debug, logSignInfoMsg, request.CanonicalString, request.StringToSign, signedURLMsg) } type signedRequest struct { Request *http.Request SignedHeaders http.Header CanonicalString string StringToSign string PreSigned bool } const logSignInfoMsg = `Request Signature: ---[ CANONICAL STRING ]----------------------------- %s ---[ STRING TO SIGN ]-------------------------------- %s%s -----------------------------------------------------` const logSignedURLMsg = ` ---[ SIGNED URL ]------------------------------------ %s` ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/to_ptr.go ================================================ // Code generated by aws/generate.go DO NOT EDIT. package aws import ( "github.com/aws/smithy-go/ptr" "time" ) // Bool returns a pointer value for the bool value passed in. func Bool(v bool) *bool { return ptr.Bool(v) } // BoolSlice returns a slice of bool pointers from the values // passed in. func BoolSlice(vs []bool) []*bool { return ptr.BoolSlice(vs) } // BoolMap returns a map of bool pointers from the values // passed in. func BoolMap(vs map[string]bool) map[string]*bool { return ptr.BoolMap(vs) } // Byte returns a pointer value for the byte value passed in. func Byte(v byte) *byte { return ptr.Byte(v) } // ByteSlice returns a slice of byte pointers from the values // passed in. func ByteSlice(vs []byte) []*byte { return ptr.ByteSlice(vs) } // ByteMap returns a map of byte pointers from the values // passed in. func ByteMap(vs map[string]byte) map[string]*byte { return ptr.ByteMap(vs) } // String returns a pointer value for the string value passed in. func String(v string) *string { return ptr.String(v) } // StringSlice returns a slice of string pointers from the values // passed in. func StringSlice(vs []string) []*string { return ptr.StringSlice(vs) } // StringMap returns a map of string pointers from the values // passed in. func StringMap(vs map[string]string) map[string]*string { return ptr.StringMap(vs) } // Int returns a pointer value for the int value passed in. func Int(v int) *int { return ptr.Int(v) } // IntSlice returns a slice of int pointers from the values // passed in. func IntSlice(vs []int) []*int { return ptr.IntSlice(vs) } // IntMap returns a map of int pointers from the values // passed in. func IntMap(vs map[string]int) map[string]*int { return ptr.IntMap(vs) } // Int8 returns a pointer value for the int8 value passed in. func Int8(v int8) *int8 { return ptr.Int8(v) } // Int8Slice returns a slice of int8 pointers from the values // passed in. func Int8Slice(vs []int8) []*int8 { return ptr.Int8Slice(vs) } // Int8Map returns a map of int8 pointers from the values // passed in. func Int8Map(vs map[string]int8) map[string]*int8 { return ptr.Int8Map(vs) } // Int16 returns a pointer value for the int16 value passed in. func Int16(v int16) *int16 { return ptr.Int16(v) } // Int16Slice returns a slice of int16 pointers from the values // passed in. func Int16Slice(vs []int16) []*int16 { return ptr.Int16Slice(vs) } // Int16Map returns a map of int16 pointers from the values // passed in. func Int16Map(vs map[string]int16) map[string]*int16 { return ptr.Int16Map(vs) } // Int32 returns a pointer value for the int32 value passed in. func Int32(v int32) *int32 { return ptr.Int32(v) } // Int32Slice returns a slice of int32 pointers from the values // passed in. func Int32Slice(vs []int32) []*int32 { return ptr.Int32Slice(vs) } // Int32Map returns a map of int32 pointers from the values // passed in. func Int32Map(vs map[string]int32) map[string]*int32 { return ptr.Int32Map(vs) } // Int64 returns a pointer value for the int64 value passed in. func Int64(v int64) *int64 { return ptr.Int64(v) } // Int64Slice returns a slice of int64 pointers from the values // passed in. func Int64Slice(vs []int64) []*int64 { return ptr.Int64Slice(vs) } // Int64Map returns a map of int64 pointers from the values // passed in. func Int64Map(vs map[string]int64) map[string]*int64 { return ptr.Int64Map(vs) } // Uint returns a pointer value for the uint value passed in. func Uint(v uint) *uint { return ptr.Uint(v) } // UintSlice returns a slice of uint pointers from the values // passed in. func UintSlice(vs []uint) []*uint { return ptr.UintSlice(vs) } // UintMap returns a map of uint pointers from the values // passed in. func UintMap(vs map[string]uint) map[string]*uint { return ptr.UintMap(vs) } // Uint8 returns a pointer value for the uint8 value passed in. func Uint8(v uint8) *uint8 { return ptr.Uint8(v) } // Uint8Slice returns a slice of uint8 pointers from the values // passed in. func Uint8Slice(vs []uint8) []*uint8 { return ptr.Uint8Slice(vs) } // Uint8Map returns a map of uint8 pointers from the values // passed in. func Uint8Map(vs map[string]uint8) map[string]*uint8 { return ptr.Uint8Map(vs) } // Uint16 returns a pointer value for the uint16 value passed in. func Uint16(v uint16) *uint16 { return ptr.Uint16(v) } // Uint16Slice returns a slice of uint16 pointers from the values // passed in. func Uint16Slice(vs []uint16) []*uint16 { return ptr.Uint16Slice(vs) } // Uint16Map returns a map of uint16 pointers from the values // passed in. func Uint16Map(vs map[string]uint16) map[string]*uint16 { return ptr.Uint16Map(vs) } // Uint32 returns a pointer value for the uint32 value passed in. func Uint32(v uint32) *uint32 { return ptr.Uint32(v) } // Uint32Slice returns a slice of uint32 pointers from the values // passed in. func Uint32Slice(vs []uint32) []*uint32 { return ptr.Uint32Slice(vs) } // Uint32Map returns a map of uint32 pointers from the values // passed in. func Uint32Map(vs map[string]uint32) map[string]*uint32 { return ptr.Uint32Map(vs) } // Uint64 returns a pointer value for the uint64 value passed in. func Uint64(v uint64) *uint64 { return ptr.Uint64(v) } // Uint64Slice returns a slice of uint64 pointers from the values // passed in. func Uint64Slice(vs []uint64) []*uint64 { return ptr.Uint64Slice(vs) } // Uint64Map returns a map of uint64 pointers from the values // passed in. func Uint64Map(vs map[string]uint64) map[string]*uint64 { return ptr.Uint64Map(vs) } // Float32 returns a pointer value for the float32 value passed in. func Float32(v float32) *float32 { return ptr.Float32(v) } // Float32Slice returns a slice of float32 pointers from the values // passed in. func Float32Slice(vs []float32) []*float32 { return ptr.Float32Slice(vs) } // Float32Map returns a map of float32 pointers from the values // passed in. func Float32Map(vs map[string]float32) map[string]*float32 { return ptr.Float32Map(vs) } // Float64 returns a pointer value for the float64 value passed in. func Float64(v float64) *float64 { return ptr.Float64(v) } // Float64Slice returns a slice of float64 pointers from the values // passed in. func Float64Slice(vs []float64) []*float64 { return ptr.Float64Slice(vs) } // Float64Map returns a map of float64 pointers from the values // passed in. func Float64Map(vs map[string]float64) map[string]*float64 { return ptr.Float64Map(vs) } // Time returns a pointer value for the time.Time value passed in. func Time(v time.Time) *time.Time { return ptr.Time(v) } // TimeSlice returns a slice of time.Time pointers from the values // passed in. func TimeSlice(vs []time.Time) []*time.Time { return ptr.TimeSlice(vs) } // TimeMap returns a map of time.Time pointers from the values // passed in. func TimeMap(vs map[string]time.Time) map[string]*time.Time { return ptr.TimeMap(vs) } // Duration returns a pointer value for the time.Duration value passed in. func Duration(v time.Duration) *time.Duration { return ptr.Duration(v) } // DurationSlice returns a slice of time.Duration pointers from the values // passed in. func DurationSlice(vs []time.Duration) []*time.Duration { return ptr.DurationSlice(vs) } // DurationMap returns a map of time.Duration pointers from the values // passed in. func DurationMap(vs map[string]time.Duration) map[string]*time.Duration { return ptr.DurationMap(vs) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go ================================================ package http import ( "context" "crypto/tls" "net" "net/http" "reflect" "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/smithy-go/tracing" ) // Defaults for the HTTPTransportBuilder. var ( // Default connection pool options DefaultHTTPTransportMaxIdleConns = 100 DefaultHTTPTransportMaxIdleConnsPerHost = 10 // Default connection timeouts DefaultHTTPTransportIdleConnTimeout = 90 * time.Second DefaultHTTPTransportTLSHandleshakeTimeout = 10 * time.Second DefaultHTTPTransportExpectContinueTimeout = 1 * time.Second // Default to TLS 1.2 for all HTTPS requests. DefaultHTTPTransportTLSMinVersion uint16 = tls.VersionTLS12 ) // Timeouts for net.Dialer's network connection. var ( DefaultDialConnectTimeout = 30 * time.Second DefaultDialKeepAliveTimeout = 30 * time.Second ) // BuildableClient provides a HTTPClient implementation with options to // create copies of the HTTPClient when additional configuration is provided. // // The client's methods will not share the http.Transport value between copies // of the BuildableClient. Only exported member values of the Transport and // optional Dialer will be copied between copies of BuildableClient. type BuildableClient struct { transport *http.Transport dialer *net.Dialer initOnce sync.Once clientTimeout time.Duration client *http.Client } // NewBuildableClient returns an initialized client for invoking HTTP // requests. func NewBuildableClient() *BuildableClient { return &BuildableClient{} } // Do implements the HTTPClient interface's Do method to invoke a HTTP request, // and receive the response. Uses the BuildableClient's current // configuration to invoke the http.Request. // // If connection pooling is enabled (aka HTTP KeepAlive) the client will only // share pooled connections with its own instance. Copies of the // BuildableClient will have their own connection pools. // // Redirect (3xx) responses will not be followed, the HTTP response received // will returned instead. func (b *BuildableClient) Do(req *http.Request) (*http.Response, error) { b.initOnce.Do(b.build) return b.client.Do(req) } // Freeze returns a frozen aws.HTTPClient implementation that is no longer a BuildableClient. // Use this to prevent the SDK from applying DefaultMode configuration values to a buildable client. func (b *BuildableClient) Freeze() aws.HTTPClient { cpy := b.clone() cpy.build() return cpy.client } func (b *BuildableClient) build() { b.client = wrapWithLimitedRedirect(&http.Client{ Timeout: b.clientTimeout, Transport: b.GetTransport(), }) } func (b *BuildableClient) clone() *BuildableClient { cpy := NewBuildableClient() cpy.transport = b.GetTransport() cpy.dialer = b.GetDialer() cpy.clientTimeout = b.clientTimeout return cpy } // WithTransportOptions copies the BuildableClient and returns it with the // http.Transport options applied. // // If a non (*http.Transport) was set as the round tripper, the round tripper // will be replaced with a default Transport value before invoking the option // functions. func (b *BuildableClient) WithTransportOptions(opts ...func(*http.Transport)) *BuildableClient { cpy := b.clone() tr := cpy.GetTransport() for _, opt := range opts { opt(tr) } cpy.transport = tr return cpy } // WithDialerOptions copies the BuildableClient and returns it with the // net.Dialer options applied. Will set the client's http.Transport DialContext // member. func (b *BuildableClient) WithDialerOptions(opts ...func(*net.Dialer)) *BuildableClient { cpy := b.clone() dialer := cpy.GetDialer() for _, opt := range opts { opt(dialer) } cpy.dialer = dialer tr := cpy.GetTransport() tr.DialContext = cpy.dialer.DialContext cpy.transport = tr return cpy } // WithTimeout Sets the timeout used by the client for all requests. func (b *BuildableClient) WithTimeout(timeout time.Duration) *BuildableClient { cpy := b.clone() cpy.clientTimeout = timeout return cpy } // GetTransport returns a copy of the client's HTTP Transport. func (b *BuildableClient) GetTransport() *http.Transport { var tr *http.Transport if b.transport != nil { tr = b.transport.Clone() } else { tr = defaultHTTPTransport() } return tr } // GetDialer returns a copy of the client's network dialer. func (b *BuildableClient) GetDialer() *net.Dialer { var dialer *net.Dialer if b.dialer != nil { dialer = shallowCopyStruct(b.dialer).(*net.Dialer) } else { dialer = defaultDialer() } return dialer } // GetTimeout returns a copy of the client's timeout to cancel requests with. func (b *BuildableClient) GetTimeout() time.Duration { return b.clientTimeout } func defaultDialer() *net.Dialer { return &net.Dialer{ Timeout: DefaultDialConnectTimeout, KeepAlive: DefaultDialKeepAliveTimeout, DualStack: true, } } func defaultHTTPTransport() *http.Transport { dialer := defaultDialer() tr := &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: traceDialContext(dialer.DialContext), TLSHandshakeTimeout: DefaultHTTPTransportTLSHandleshakeTimeout, MaxIdleConns: DefaultHTTPTransportMaxIdleConns, MaxIdleConnsPerHost: DefaultHTTPTransportMaxIdleConnsPerHost, IdleConnTimeout: DefaultHTTPTransportIdleConnTimeout, ExpectContinueTimeout: DefaultHTTPTransportExpectContinueTimeout, ForceAttemptHTTP2: true, TLSClientConfig: &tls.Config{ MinVersion: DefaultHTTPTransportTLSMinVersion, }, } return tr } type dialContext func(ctx context.Context, network, addr string) (net.Conn, error) func traceDialContext(dc dialContext) dialContext { return func(ctx context.Context, network, addr string) (net.Conn, error) { span, _ := tracing.GetSpan(ctx) span.SetProperty("net.peer.name", addr) conn, err := dc(ctx, network, addr) if err != nil { return conn, err } raddr := conn.RemoteAddr() if raddr == nil { return conn, err } host, port, err := net.SplitHostPort(raddr.String()) if err != nil { // don't blow up just because we couldn't parse span.SetProperty("net.peer.addr", raddr.String()) } else { span.SetProperty("net.peer.host", host) span.SetProperty("net.peer.port", port) } return conn, err } } // shallowCopyStruct creates a shallow copy of the passed in source struct, and // returns that copy of the same struct type. func shallowCopyStruct(src interface{}) interface{} { srcVal := reflect.ValueOf(src) srcValType := srcVal.Type() var returnAsPtr bool if srcValType.Kind() == reflect.Ptr { srcVal = srcVal.Elem() srcValType = srcValType.Elem() returnAsPtr = true } dstVal := reflect.New(srcValType).Elem() for i := 0; i < srcValType.NumField(); i++ { ft := srcValType.Field(i) if len(ft.PkgPath) != 0 { // unexported fields have a PkgPath continue } dstVal.Field(i).Set(srcVal.Field(i)) } if returnAsPtr { dstVal = dstVal.Addr() } return dstVal.Interface() } // wrapWithLimitedRedirect updates the Client's Transport and CheckRedirect to // not follow any redirect other than 307 and 308. No other redirect will be // followed. // // If the client does not have a Transport defined will use a new SDK default // http.Transport configuration. func wrapWithLimitedRedirect(c *http.Client) *http.Client { tr := c.Transport if tr == nil { tr = defaultHTTPTransport() } cc := *c cc.CheckRedirect = limitedRedirect cc.Transport = suppressBadHTTPRedirectTransport{ tr: tr, } return &cc } // limitedRedirect is a CheckRedirect that prevents the client from following // any non 307/308 HTTP status code redirects. // // The 307 and 308 redirects are allowed because the client must use the // original HTTP method for the redirected to location. Whereas 301 and 302 // allow the client to switch to GET for the redirect. // // Suppresses all redirect requests with a URL of badHTTPRedirectLocation. func limitedRedirect(r *http.Request, via []*http.Request) error { // Request.Response, in CheckRedirect is the response that is triggering // the redirect. resp := r.Response if r.URL.String() == badHTTPRedirectLocation { resp.Header.Del(badHTTPRedirectLocation) return http.ErrUseLastResponse } switch resp.StatusCode { case 307, 308: // Only allow 307 and 308 redirects as they preserve the method. return nil } return http.ErrUseLastResponse } // suppressBadHTTPRedirectTransport provides an http.RoundTripper // implementation that wraps another http.RoundTripper to prevent HTTP client // receiving 301 and 302 HTTP responses redirects without the required location // header. // // Clients using this utility must have a CheckRedirect, e.g. limitedRedirect, // that check for responses with having a URL of baseHTTPRedirectLocation, and // suppress the redirect. type suppressBadHTTPRedirectTransport struct { tr http.RoundTripper } const badHTTPRedirectLocation = `https://amazonaws.com/badhttpredirectlocation` // RoundTrip backfills a stub location when a 301/302 response is received // without a location. This stub location is used by limitedRedirect to prevent // the HTTP client from failing attempting to use follow a redirect without a // location value. func (t suppressBadHTTPRedirectTransport) RoundTrip(r *http.Request) (*http.Response, error) { resp, err := t.tr.RoundTrip(r) if err != nil { return resp, err } // S3 is the only known service to return 301 without location header. // The Go standard library HTTP client will return an opaque error if it // tries to follow a 301/302 response missing the location header. switch resp.StatusCode { case 301, 302: if v := resp.Header.Get("Location"); len(v) == 0 { resp.Header.Set("Location", badHTTPRedirectLocation) } } return resp, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/content_type.go ================================================ package http import ( "context" "fmt" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // removeContentTypeHeader is a build middleware that removes // content type header if content-length header is unset or // is set to zero, type removeContentTypeHeader struct { } // ID the name of the middleware. func (m *removeContentTypeHeader) ID() string { return "RemoveContentTypeHeader" } // HandleBuild adds or appends the constructed user agent to the request. func (m *removeContentTypeHeader) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in) } // remove contentTypeHeader when content-length is zero if req.ContentLength == 0 { req.Header.Del("content-type") } return next.HandleBuild(ctx, in) } // RemoveContentTypeHeader removes content-type header if // content length is unset or equal to zero. func RemoveContentTypeHeader(stack *middleware.Stack) error { return stack.Build.Add(&removeContentTypeHeader{}, middleware.After) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/response_error.go ================================================ package http import ( "errors" "fmt" smithyhttp "github.com/aws/smithy-go/transport/http" ) // ResponseError provides the HTTP centric error type wrapping the underlying error // with the HTTP response value and the deserialized RequestID. type ResponseError struct { *smithyhttp.ResponseError // RequestID associated with response error RequestID string } // ServiceRequestID returns the request id associated with Response Error func (e *ResponseError) ServiceRequestID() string { return e.RequestID } // Error returns the formatted error func (e *ResponseError) Error() string { return fmt.Sprintf( "https response error StatusCode: %d, RequestID: %s, %v", e.Response.StatusCode, e.RequestID, e.Err) } // As populates target and returns true if the type of target is a error type that // the ResponseError embeds, (e.g.AWS HTTP ResponseError) func (e *ResponseError) As(target interface{}) bool { return errors.As(e.ResponseError, target) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/response_error_middleware.go ================================================ package http import ( "context" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // AddResponseErrorMiddleware adds response error wrapper middleware func AddResponseErrorMiddleware(stack *middleware.Stack) error { // add error wrapper middleware before request id retriever middleware so that it can wrap the error response // returned by operation deserializers return stack.Deserialize.Insert(&ResponseErrorWrapper{}, "RequestIDRetriever", middleware.Before) } // ResponseErrorWrapper wraps operation errors with ResponseError. type ResponseErrorWrapper struct { } // ID returns the middleware identifier func (m *ResponseErrorWrapper) ID() string { return "ResponseErrorWrapper" } // HandleDeserialize wraps the stack error with smithyhttp.ResponseError. func (m *ResponseErrorWrapper) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err == nil { // Nothing to do when there is no error. return out, metadata, err } resp, ok := out.RawResponse.(*smithyhttp.Response) if !ok { // No raw response to wrap with. return out, metadata, err } // look for request id in metadata reqID, _ := awsmiddleware.GetRequestIDMetadata(metadata) // Wrap the returned smithy error with the request id retrieved from the metadata err = &ResponseError{ ResponseError: &smithyhttp.ResponseError{ Response: resp, Err: err, }, RequestID: reqID, } return out, metadata, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/timeout_read_closer.go ================================================ package http import ( "context" "fmt" "io" "time" "github.com/aws/smithy-go" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) type readResult struct { n int err error } // ResponseTimeoutError is an error when the reads from the response are // delayed longer than the timeout the read was configured for. type ResponseTimeoutError struct { TimeoutDur time.Duration } // Timeout returns that the error is was caused by a timeout, and can be // retried. func (*ResponseTimeoutError) Timeout() bool { return true } func (e *ResponseTimeoutError) Error() string { return fmt.Sprintf("read on body reach timeout limit, %v", e.TimeoutDur) } // timeoutReadCloser will handle body reads that take too long. // We will return a ErrReadTimeout error if a timeout occurs. type timeoutReadCloser struct { reader io.ReadCloser duration time.Duration } // Read will spin off a goroutine to call the reader's Read method. We will // select on the timer's channel or the read's channel. Whoever completes first // will be returned. func (r *timeoutReadCloser) Read(b []byte) (int, error) { timer := time.NewTimer(r.duration) c := make(chan readResult, 1) go func() { n, err := r.reader.Read(b) timer.Stop() c <- readResult{n: n, err: err} }() select { case data := <-c: return data.n, data.err case <-timer.C: return 0, &ResponseTimeoutError{TimeoutDur: r.duration} } } func (r *timeoutReadCloser) Close() error { return r.reader.Close() } // AddResponseReadTimeoutMiddleware adds a middleware to the stack that wraps the // response body so that a read that takes too long will return an error. func AddResponseReadTimeoutMiddleware(stack *middleware.Stack, duration time.Duration) error { return stack.Deserialize.Add(&readTimeout{duration: duration}, middleware.After) } // readTimeout wraps the response body with a timeoutReadCloser type readTimeout struct { duration time.Duration } // ID returns the id of the middleware func (*readTimeout) ID() string { return "ReadResponseTimeout" } // HandleDeserialize implements the DeserializeMiddleware interface func (m *readTimeout) HandleDeserialize( ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler, ) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } response.Body = &timeoutReadCloser{ reader: response.Body, duration: m.duration, } out.RawResponse = response return out, metadata, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/types.go ================================================ package aws import ( "fmt" ) // Ternary is an enum allowing an unknown or none state in addition to a bool's // true and false. type Ternary int func (t Ternary) String() string { switch t { case UnknownTernary: return "unknown" case FalseTernary: return "false" case TrueTernary: return "true" default: return fmt.Sprintf("unknown value, %d", int(t)) } } // Bool returns true if the value is TrueTernary, false otherwise. func (t Ternary) Bool() bool { return t == TrueTernary } // Enumerations for the values of the Ternary type. const ( UnknownTernary Ternary = iota FalseTernary TrueTernary ) // BoolTernary returns a true or false Ternary value for the bool provided. func BoolTernary(v bool) Ternary { if v { return TrueTernary } return FalseTernary } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/aws/version.go ================================================ // Package aws provides core functionality for making requests to AWS services. package aws // SDKName is the name of this AWS SDK const SDKName = "aws-sdk-go-v2" // SDKVersion is the version of this SDK const SDKVersion = goModuleVersion ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md ================================================ # v1.29.14 (2025-04-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.13 (2025-04-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.12 (2025-03-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.11 (2025-03-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.10 (2025-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.9 (2025-03-04.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.8 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.7 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.29.6 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.5 (2025-02-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.4 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.3 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.2 (2025-01-24) * **Bug Fix**: Fix env config naming and usage of deprecated ioutil * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.29.1 (2025-01-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.0 (2025-01-15) * **Feature**: S3 client behavior is updated to always calculate a checksum by default for operations that support it (such as PutObject or UploadPart), or require it (such as DeleteObjects). The checksum algorithm used by default now becomes CRC32. Checksum behavior can be configured using `when_supported` and `when_required` options - in code using RequestChecksumCalculation, in shared config using request_checksum_calculation, or as env variable using AWS_REQUEST_CHECKSUM_CALCULATION. The S3 client attempts to validate response checksums for all S3 API operations that support checksums. However, if the SDK has not implemented the specified checksum algorithm then this validation is skipped. Checksum validation behavior can be configured using `when_supported` and `when_required` options - in code using ResponseChecksumValidation, in shared config using response_checksum_validation, or as env variable using AWS_RESPONSE_CHECKSUM_VALIDATION. * **Dependency Update**: Updated to the latest SDK module versions # v1.28.11 (2025-01-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.10 (2025-01-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.9 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.8 (2025-01-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.7 (2024-12-19) * **Bug Fix**: Fix improper use of printf-style functions. * **Dependency Update**: Updated to the latest SDK module versions # v1.28.6 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.5 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.28.4 (2024-11-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.3 (2024-11-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.2 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.1 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.0 (2024-10-16) * **Feature**: Adds the LoadOptions hook `WithBaseEndpoint` for setting global endpoint override in-code. # v1.27.43 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.42 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.41 (2024-10-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.40 (2024-10-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.39 (2024-09-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.38 (2024-09-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.37 (2024-09-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.36 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.35 (2024-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.34 (2024-09-16) * **Bug Fix**: Read `AWS_CONTAINER_CREDENTIALS_FULL_URI` env variable if set when reading a profile with `credential_source`. Also ensure `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` is always read before it # v1.27.33 (2024-09-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.32 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.31 (2024-08-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.30 (2024-08-23) * **Bug Fix**: Don't fail credentials unit tests if credentials are found on a file # v1.27.29 (2024-08-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.28 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.27.27 (2024-07-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.26 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.25 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.24 (2024-07-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.23 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.22 (2024-06-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.21 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.20 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.19 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.18 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.17 (2024-06-03) * **Documentation**: Add deprecation docs to global endpoint resolution interfaces. These APIs were previously deprecated with the introduction of service-specific endpoint resolution (EndpointResolverV2 and BaseEndpoint on service client options). * **Dependency Update**: Updated to the latest SDK module versions # v1.27.16 (2024-05-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.15 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.14 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.13 (2024-05-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.12 (2024-05-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.11 (2024-04-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.10 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.9 (2024-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.8 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.7 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.27.6 (2024-03-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.5 (2024-03-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.4 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.3 (2024-02-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.2 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.1 (2024-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.26.6 (2024-01-22) * **Bug Fix**: Remove invalid escaping of shared config values. All values in the shared config file will now be interpreted literally, save for fully-quoted strings which are unwrapped for legacy reasons. * **Dependency Update**: Updated to the latest SDK module versions # v1.26.5 (2024-01-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.4 (2024-01-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.3 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.2 (2023-12-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.1 (2023-12-08) * **Bug Fix**: Correct loading of [services *] sections into shared config. * **Dependency Update**: Updated to the latest SDK module versions # v1.26.0 (2023-12-07) * **Feature**: Support modeled request compression. The only algorithm supported at this time is `gzip`. * **Dependency Update**: Updated to the latest SDK module versions # v1.25.12 (2023-12-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.11 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.10 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.9 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.8 (2023-11-28.3) * **Bug Fix**: Correct resolution of S3Express auth disable toggle. # v1.25.7 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.6 (2023-11-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.5 (2023-11-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.4 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.3 (2023-11-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.2 (2023-11-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.1 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.0 (2023-11-14) * **Feature**: Add support for dynamic auth token from file and EKS container host in absolute/relative URIs in the HTTP credential provider. * **Dependency Update**: Updated to the latest SDK module versions # v1.24.0 (2023-11-13) * **Feature**: Replace the legacy config parser with a modern, less-strict implementation. Parsing failures within a section will now simply ignore the invalid line rather than silently drop the entire section. * **Dependency Update**: Updated to the latest SDK module versions # v1.23.0 (2023-11-09.2) * **Feature**: BREAKFIX: In order to support subproperty parsing, invalid property definitions must not be ignored * **Dependency Update**: Updated to the latest SDK module versions # v1.22.3 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.22.2 (2023-11-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.22.1 (2023-11-06) * No change notes available for this release. # v1.22.0 (2023-11-02) * **Feature**: Add env and shared config settings for disabling IMDSv1 fallback. * **Dependency Update**: Updated to the latest SDK module versions # v1.21.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. * **Dependency Update**: Updated to the latest SDK module versions # v1.20.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.19.1 (2023-10-24) * No change notes available for this release. # v1.19.0 (2023-10-16) * **Feature**: Modify logic of retrieving user agent appID from env config # v1.18.45 (2023-10-12) * **Bug Fix**: Fail to load config if an explicitly provided profile doesn't exist. * **Dependency Update**: Updated to the latest SDK module versions # v1.18.44 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.43 (2023-10-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.42 (2023-09-22) * **Bug Fix**: Fixed a bug where merging `max_attempts` or `duration_seconds` fields across shared config files with invalid values would silently default them to 0. * **Bug Fix**: Move type assertion of config values out of the parsing stage, which resolves an issue where the contents of a profile would silently be dropped with certain numeric formats. * **Dependency Update**: Updated to the latest SDK module versions # v1.18.41 (2023-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.40 (2023-09-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.39 (2023-09-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.38 (2023-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.37 (2023-08-23) * No change notes available for this release. # v1.18.36 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.35 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.34 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.33 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.32 (2023-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.31 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.30 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.29 (2023-07-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.28 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.27 (2023-06-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.26 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.25 (2023-05-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.24 (2023-05-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.23 (2023-05-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.22 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.21 (2023-04-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.20 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.19 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.18 (2023-03-16) * **Bug Fix**: Allow RoleARN to be set as functional option on STS WebIdentityRoleOptions. Fixes aws/aws-sdk-go-v2#2015. # v1.18.17 (2023-03-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.16 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.15 (2023-02-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.14 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.13 (2023-02-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.12 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.11 (2023-02-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.10 (2023-01-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.9 (2023-01-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.8 (2023-01-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.7 (2022-12-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.6 (2022-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.5 (2022-12-15) * **Bug Fix**: Unify logic between shared config and in finding home directory * **Dependency Update**: Updated to the latest SDK module versions # v1.18.4 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.3 (2022-11-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.2 (2022-11-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.1 (2022-11-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.0 (2022-11-11) * **Announcement**: When using the SSOTokenProvider, a previous implementation incorrectly compensated for invalid SSOTokenProvider configurations in the shared profile. This has been fixed via PR #1903 and tracked in issue #1846 * **Feature**: Adds token refresh support (via SSOTokenProvider) when using the SSOCredentialProvider * **Dependency Update**: Updated to the latest SDK module versions # v1.17.11 (2022-11-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.10 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.9 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.8 (2022-09-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.7 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.6 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.5 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.4 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.3 (2022-08-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.2 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.1 (2022-08-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.0 (2022-08-14) * **Feature**: Add alternative mechanism for determning the users `$HOME` or `%USERPROFILE%` location when the environment variables are not present. # v1.16.1 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.0 (2022-08-10) * **Feature**: Adds support for the following settings in the `~/.aws/credentials` file: `sso_account_id`, `sso_region`, `sso_role_name`, `sso_start_url`, and `ca_bundle`. # v1.15.17 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.16 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.15 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.14 (2022-07-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.13 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.12 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.11 (2022-06-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.10 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.9 (2022-05-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.8 (2022-05-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.7 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.6 (2022-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.5 (2022-05-09) * **Bug Fix**: Fixes a bug in LoadDefaultConfig to correctly assign ConfigSources so all config resolvers have access to the config sources. This fixes the feature/ec2/imds client not having configuration applied via config.LoadOptions such as EC2IMDSClientEnableState. PR [#1682](https://github.com/aws/aws-sdk-go-v2/pull/1682) # v1.15.4 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.14.0 (2022-02-24) * **Feature**: Adds support for loading RetryMaxAttempts and RetryMod from the environment and shared configuration files. These parameters drive how the SDK's API client will initialize its default retryer, if custome retryer has not been specified. See [config](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config) module and [aws.Config](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#Config) for more information about and how to use these new options. * **Feature**: Adds support for the `ca_bundle` parameter in shared config and credentials files. The usage of the file is the same as environment variable, `AWS_CA_BUNDLE`, but sourced from shared config. Fixes [#1589](https://github.com/aws/aws-sdk-go-v2/issues/1589) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.13.1 (2022-01-28) * **Bug Fix**: Fixes LoadDefaultConfig handling of errors returned by passed in functional options. Previously errors returned from the LoadOptions passed into LoadDefaultConfig were incorrectly ignored. [#1562](https://github.com/aws/aws-sdk-go-v2/pull/1562). Thanks to [Pinglei Guo](https://github.com/pingleig) for submitting this PR. * **Bug Fix**: Fixes the SDK's handling of `duration_sections` in the shared credentials file or specified in multiple shared config and shared credentials files under the same profile. [#1568](https://github.com/aws/aws-sdk-go-v2/pull/1568). Thanks to [Amir Szekely](https://github.com/kichik) for help reproduce this bug. * **Bug Fix**: Updates `config` module to use os.UserHomeDir instead of hard coded environment variable for OS. [#1563](https://github.com/aws/aws-sdk-go-v2/pull/1563) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2022-01-07) * **Feature**: Add load option for CredentialCache. Adds a new member to the LoadOptions struct, CredentialsCacheOptions. This member allows specifying a function that will be used to configure the CredentialsCache. The CredentialsCacheOptions will only be used if the configuration loader will wrap the underlying credential provider in the CredentialsCache. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.11.1 (2021-12-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2021-12-02) * **Feature**: Add support for specifying `EndpointResolverWithOptions` on `LoadOptions`, and associated `WithEndpointResolverWithOptions`. * **Dependency Update**: Updated to the latest SDK module versions # v1.10.3 (2021-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.2 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.1 (2021-11-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2021-11-06) * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.9.0 (2021-10-21) * **Feature**: Updated to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.8.3 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.8.2 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.8.1 (2021-09-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.8.0 (2021-09-02) * **Feature**: Add support for S3 Multi-Region Access Point ARNs. # v1.7.0 (2021-08-27) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.6.1 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.6.0 (2021-08-04) * **Feature**: adds error handling for defered close calls * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.5.0 (2021-07-15) * **Feature**: Support has been added for EC2 IPv6-enabled Instance Metadata Service Endpoints. * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.1 (2021-07-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2021-06-25) * **Feature**: Adds configuration setting for enabling endpoint discovery. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-05-20) * **Feature**: SSO credentials can now be defined alongside other credential providers within the same configuration profile. * **Bug Fix**: Profile names were incorrectly normalized to lower-case, which could result in unexpected profile configurations. * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/config.go ================================================ package config import ( "context" "os" "github.com/aws/aws-sdk-go-v2/aws" ) // defaultAWSConfigResolvers are a slice of functions that will resolve external // configuration values into AWS configuration values. // // This will setup the AWS configuration's Region, var defaultAWSConfigResolvers = []awsConfigResolver{ // Resolves the default configuration the SDK's aws.Config will be // initialized with. resolveDefaultAWSConfig, // Sets the logger to be used. Could be user provided logger, and client // logging mode. resolveLogger, resolveClientLogMode, // Sets the HTTP client and configuration to use for making requests using // the HTTP transport. resolveHTTPClient, resolveCustomCABundle, // Sets the endpoint resolving behavior the API Clients will use for making // requests to. Clients default to their own clients this allows overrides // to be specified. The resolveEndpointResolver option is deprecated, but // we still need to set it for backwards compatibility on config // construction. resolveEndpointResolver, resolveEndpointResolverWithOptions, // Sets the retry behavior API clients will use within their retry attempt // middleware. Defaults to unset, allowing API clients to define their own // retry behavior. resolveRetryer, // Sets the region the API Clients should use for making requests to. resolveRegion, resolveEC2IMDSRegion, resolveDefaultRegion, // Sets the additional set of middleware stack mutators that will custom // API client request pipeline middleware. resolveAPIOptions, // Resolves the DefaultsMode that should be used by SDK clients. If this // mode is set to DefaultsModeAuto. // // Comes after HTTPClient and CustomCABundle to ensure the HTTP client is // configured if provided before invoking IMDS if mode is auto. Comes // before resolving credentials so that those subsequent clients use the // configured auto mode. resolveDefaultsModeOptions, // Sets the resolved credentials the API clients will use for // authentication. Provides the SDK's default credential chain. // // Should probably be the last step in the resolve chain to ensure that all // other configurations are resolved first in case downstream credentials // implementations depend on or can be configured with earlier resolved // configuration options. resolveCredentials, // Sets the resolved bearer authentication token API clients will use for // httpBearerAuth authentication scheme. resolveBearerAuthToken, // Sets the sdk app ID if present in env var or shared config profile resolveAppID, resolveBaseEndpoint, // Sets the DisableRequestCompression if present in env var or shared config profile resolveDisableRequestCompression, // Sets the RequestMinCompressSizeBytes if present in env var or shared config profile resolveRequestMinCompressSizeBytes, // Sets the AccountIDEndpointMode if present in env var or shared config profile resolveAccountIDEndpointMode, // Sets the RequestChecksumCalculation if present in env var or shared config profile resolveRequestChecksumCalculation, // Sets the ResponseChecksumValidation if present in env var or shared config profile resolveResponseChecksumValidation, } // A Config represents a generic configuration value or set of values. This type // will be used by the AWSConfigResolvers to extract // // General the Config type will use type assertion against the Provider interfaces // to extract specific data from the Config. type Config interface{} // A loader is used to load external configuration data and returns it as // a generic Config type. // // The loader should return an error if it fails to load the external configuration // or the configuration data is malformed, or required components missing. type loader func(context.Context, configs) (Config, error) // An awsConfigResolver will extract configuration data from the configs slice // using the provider interfaces to extract specific functionality. The extracted // configuration values will be written to the AWS Config value. // // The resolver should return an error if it it fails to extract the data, the // data is malformed, or incomplete. type awsConfigResolver func(ctx context.Context, cfg *aws.Config, configs configs) error // configs is a slice of Config values. These values will be used by the // AWSConfigResolvers to extract external configuration values to populate the // AWS Config type. // // Use AppendFromLoaders to add additional external Config values that are // loaded from external sources. // // Use ResolveAWSConfig after external Config values have been added or loaded // to extract the loaded configuration values into the AWS Config. type configs []Config // AppendFromLoaders iterates over the slice of loaders passed in calling each // loader function in order. The external config value returned by the loader // will be added to the returned configs slice. // // If a loader returns an error this method will stop iterating and return // that error. func (cs configs) AppendFromLoaders(ctx context.Context, loaders []loader) (configs, error) { for _, fn := range loaders { cfg, err := fn(ctx, cs) if err != nil { return nil, err } cs = append(cs, cfg) } return cs, nil } // ResolveAWSConfig returns a AWS configuration populated with values by calling // the resolvers slice passed in. Each resolver is called in order. Any resolver // may overwrite the AWS Configuration value of a previous resolver. // // If an resolver returns an error this method will return that error, and stop // iterating over the resolvers. func (cs configs) ResolveAWSConfig(ctx context.Context, resolvers []awsConfigResolver) (aws.Config, error) { var cfg aws.Config for _, fn := range resolvers { if err := fn(ctx, &cfg, cs); err != nil { return aws.Config{}, err } } return cfg, nil } // ResolveConfig calls the provide function passing slice of configuration sources. // This implements the aws.ConfigResolver interface. func (cs configs) ResolveConfig(f func(configs []interface{}) error) error { var cfgs []interface{} for i := range cs { cfgs = append(cfgs, cs[i]) } return f(cfgs) } // LoadDefaultConfig reads the SDK's default external configurations, and // populates an AWS Config with the values from the external configurations. // // An optional variadic set of additional Config values can be provided as input // that will be prepended to the configs slice. Use this to add custom configuration. // The custom configurations must satisfy the respective providers for their data // or the custom data will be ignored by the resolvers and config loaders. // // cfg, err := config.LoadDefaultConfig( context.TODO(), // config.WithSharedConfigProfile("test-profile"), // ) // if err != nil { // panic(fmt.Sprintf("failed loading config, %v", err)) // } // // The default configuration sources are: // * Environment Variables // * Shared Configuration and Shared Credentials files. func LoadDefaultConfig(ctx context.Context, optFns ...func(*LoadOptions) error) (cfg aws.Config, err error) { var options LoadOptions for _, optFn := range optFns { if err := optFn(&options); err != nil { return aws.Config{}, err } } // assign Load Options to configs var cfgCpy = configs{options} cfgCpy, err = cfgCpy.AppendFromLoaders(ctx, resolveConfigLoaders(&options)) if err != nil { return aws.Config{}, err } cfg, err = cfgCpy.ResolveAWSConfig(ctx, defaultAWSConfigResolvers) if err != nil { return aws.Config{}, err } return cfg, nil } func resolveConfigLoaders(options *LoadOptions) []loader { loaders := make([]loader, 2) loaders[0] = loadEnvConfig // specification of a profile should cause a load failure if it doesn't exist if os.Getenv(awsProfileEnv) != "" || options.SharedConfigProfile != "" { loaders[1] = loadSharedConfig } else { loaders[1] = loadSharedConfigIgnoreNotExist } return loaders } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/defaultsmode.go ================================================ package config import ( "context" "os" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" ) const execEnvVar = "AWS_EXECUTION_ENV" // DefaultsModeOptions is the set of options that are used to configure type DefaultsModeOptions struct { // The SDK configuration defaults mode. Defaults to legacy if not specified. // // Supported modes are: auto, cross-region, in-region, legacy, mobile, standard Mode aws.DefaultsMode // The EC2 Instance Metadata Client that should be used when performing environment // discovery when aws.DefaultsModeAuto is set. // // If not specified the SDK will construct a client if the instance metadata service has not been disabled by // the AWS_EC2_METADATA_DISABLED environment variable. IMDSClient *imds.Client } func resolveDefaultsModeRuntimeEnvironment(ctx context.Context, envConfig *EnvConfig, client *imds.Client) (aws.RuntimeEnvironment, error) { getRegionOutput, err := client.GetRegion(ctx, &imds.GetRegionInput{}) // honor context timeouts, but if we couldn't talk to IMDS don't fail runtime environment introspection. select { case <-ctx.Done(): return aws.RuntimeEnvironment{}, err default: } var imdsRegion string if err == nil { imdsRegion = getRegionOutput.Region } return aws.RuntimeEnvironment{ EnvironmentIdentifier: aws.ExecutionEnvironmentID(os.Getenv(execEnvVar)), Region: envConfig.Region, EC2InstanceMetadataRegion: imdsRegion, }, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/doc.go ================================================ // Package config provides utilities for loading configuration from multiple // sources that can be used to configure the SDK's API clients, and utilities. // // The config package will load configuration from environment variables, AWS // shared configuration file (~/.aws/config), and AWS shared credentials file // (~/.aws/credentials). // // Use the LoadDefaultConfig to load configuration from all the SDK's supported // sources, and resolve credentials using the SDK's default credential chain. // // LoadDefaultConfig allows for a variadic list of additional Config sources that can // provide one or more configuration values which can be used to programmatically control the resolution // of a specific value, or allow for broader range of additional configuration sources not supported by the SDK. // A Config source implements one or more provider interfaces defined in this package. Config sources passed in will // take precedence over the default environment and shared config sources used by the SDK. If one or more Config sources // implement the same provider interface, priority will be handled by the order in which the sources were passed in. // // A number of helpers (prefixed by “With“) are provided in this package that implement their respective provider // interface. These helpers should be used for overriding configuration programmatically at runtime. package config ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/env_config.go ================================================ package config import ( "bytes" "context" "fmt" "io" "os" "strconv" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" smithyrequestcompression "github.com/aws/smithy-go/private/requestcompression" ) // CredentialsSourceName provides a name of the provider when config is // loaded from environment. const CredentialsSourceName = "EnvConfigCredentials" // Environment variables that will be read for configuration values. const ( awsAccessKeyIDEnv = "AWS_ACCESS_KEY_ID" awsAccessKeyEnv = "AWS_ACCESS_KEY" awsSecretAccessKeyEnv = "AWS_SECRET_ACCESS_KEY" awsSecretKeyEnv = "AWS_SECRET_KEY" awsSessionTokenEnv = "AWS_SESSION_TOKEN" awsContainerCredentialsFullURIEnv = "AWS_CONTAINER_CREDENTIALS_FULL_URI" awsContainerCredentialsRelativeURIEnv = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" awsContainerAuthorizationTokenEnv = "AWS_CONTAINER_AUTHORIZATION_TOKEN" awsRegionEnv = "AWS_REGION" awsDefaultRegionEnv = "AWS_DEFAULT_REGION" awsProfileEnv = "AWS_PROFILE" awsDefaultProfileEnv = "AWS_DEFAULT_PROFILE" awsSharedCredentialsFileEnv = "AWS_SHARED_CREDENTIALS_FILE" awsConfigFileEnv = "AWS_CONFIG_FILE" awsCABundleEnv = "AWS_CA_BUNDLE" awsWebIdentityTokenFileEnv = "AWS_WEB_IDENTITY_TOKEN_FILE" awsRoleARNEnv = "AWS_ROLE_ARN" awsRoleSessionNameEnv = "AWS_ROLE_SESSION_NAME" awsEnableEndpointDiscoveryEnv = "AWS_ENABLE_ENDPOINT_DISCOVERY" awsS3UseARNRegionEnv = "AWS_S3_USE_ARN_REGION" awsEc2MetadataServiceEndpointModeEnv = "AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE" awsEc2MetadataServiceEndpointEnv = "AWS_EC2_METADATA_SERVICE_ENDPOINT" awsEc2MetadataDisabledEnv = "AWS_EC2_METADATA_DISABLED" awsEc2MetadataV1DisabledEnv = "AWS_EC2_METADATA_V1_DISABLED" awsS3DisableMultiRegionAccessPointsEnv = "AWS_S3_DISABLE_MULTIREGION_ACCESS_POINTS" awsUseDualStackEndpointEnv = "AWS_USE_DUALSTACK_ENDPOINT" awsUseFIPSEndpointEnv = "AWS_USE_FIPS_ENDPOINT" awsDefaultsModeEnv = "AWS_DEFAULTS_MODE" awsMaxAttemptsEnv = "AWS_MAX_ATTEMPTS" awsRetryModeEnv = "AWS_RETRY_MODE" awsSdkUaAppIDEnv = "AWS_SDK_UA_APP_ID" awsIgnoreConfiguredEndpointURLEnv = "AWS_IGNORE_CONFIGURED_ENDPOINT_URLS" awsEndpointURLEnv = "AWS_ENDPOINT_URL" awsDisableRequestCompressionEnv = "AWS_DISABLE_REQUEST_COMPRESSION" awsRequestMinCompressionSizeBytesEnv = "AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES" awsS3DisableExpressSessionAuthEnv = "AWS_S3_DISABLE_EXPRESS_SESSION_AUTH" awsAccountIDEnv = "AWS_ACCOUNT_ID" awsAccountIDEndpointModeEnv = "AWS_ACCOUNT_ID_ENDPOINT_MODE" awsRequestChecksumCalculation = "AWS_REQUEST_CHECKSUM_CALCULATION" awsResponseChecksumValidation = "AWS_RESPONSE_CHECKSUM_VALIDATION" ) var ( credAccessEnvKeys = []string{ awsAccessKeyIDEnv, awsAccessKeyEnv, } credSecretEnvKeys = []string{ awsSecretAccessKeyEnv, awsSecretKeyEnv, } regionEnvKeys = []string{ awsRegionEnv, awsDefaultRegionEnv, } profileEnvKeys = []string{ awsProfileEnv, awsDefaultProfileEnv, } ) // EnvConfig is a collection of environment values the SDK will read // setup config from. All environment values are optional. But some values // such as credentials require multiple values to be complete or the values // will be ignored. type EnvConfig struct { // Environment configuration values. If set both Access Key ID and Secret Access // Key must be provided. Session Token and optionally also be provided, but is // not required. // // # Access Key ID // AWS_ACCESS_KEY_ID=AKID // AWS_ACCESS_KEY=AKID # only read if AWS_ACCESS_KEY_ID is not set. // // # Secret Access Key // AWS_SECRET_ACCESS_KEY=SECRET // AWS_SECRET_KEY=SECRET # only read if AWS_SECRET_ACCESS_KEY is not set. // // # Session Token // AWS_SESSION_TOKEN=TOKEN Credentials aws.Credentials // ContainerCredentialsEndpoint value is the HTTP enabled endpoint to retrieve credentials // using the endpointcreds.Provider ContainerCredentialsEndpoint string // ContainerCredentialsRelativePath is the relative URI path that will be used when attempting to retrieve // credentials from the container endpoint. ContainerCredentialsRelativePath string // ContainerAuthorizationToken is the authorization token that will be included in the HTTP Authorization // header when attempting to retrieve credentials from the container credentials endpoint. ContainerAuthorizationToken string // Region value will instruct the SDK where to make service API requests to. If is // not provided in the environment the region must be provided before a service // client request is made. // // AWS_REGION=us-west-2 // AWS_DEFAULT_REGION=us-west-2 Region string // Profile name the SDK should load use when loading shared configuration from the // shared configuration files. If not provided "default" will be used as the // profile name. // // AWS_PROFILE=my_profile // AWS_DEFAULT_PROFILE=my_profile SharedConfigProfile string // Shared credentials file path can be set to instruct the SDK to use an alternate // file for the shared credentials. If not set the file will be loaded from // $HOME/.aws/credentials on Linux/Unix based systems, and // %USERPROFILE%\.aws\credentials on Windows. // // AWS_SHARED_CREDENTIALS_FILE=$HOME/my_shared_credentials SharedCredentialsFile string // Shared config file path can be set to instruct the SDK to use an alternate // file for the shared config. If not set the file will be loaded from // $HOME/.aws/config on Linux/Unix based systems, and // %USERPROFILE%\.aws\config on Windows. // // AWS_CONFIG_FILE=$HOME/my_shared_config SharedConfigFile string // Sets the path to a custom Credentials Authority (CA) Bundle PEM file // that the SDK will use instead of the system's root CA bundle. // Only use this if you want to configure the SDK to use a custom set // of CAs. // // Enabling this option will attempt to merge the Transport // into the SDK's HTTP client. If the client's Transport is // not a http.Transport an error will be returned. If the // Transport's TLS config is set this option will cause the // SDK to overwrite the Transport's TLS config's RootCAs value. // // Setting a custom HTTPClient in the aws.Config options will override this setting. // To use this option and custom HTTP client, the HTTP client needs to be provided // when creating the config. Not the service client. // // AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle CustomCABundle string // Enables endpoint discovery via environment variables. // // AWS_ENABLE_ENDPOINT_DISCOVERY=true EnableEndpointDiscovery aws.EndpointDiscoveryEnableState // Specifies the WebIdentity token the SDK should use to assume a role // with. // // AWS_WEB_IDENTITY_TOKEN_FILE=file_path WebIdentityTokenFilePath string // Specifies the IAM role arn to use when assuming an role. // // AWS_ROLE_ARN=role_arn RoleARN string // Specifies the IAM role session name to use when assuming a role. // // AWS_ROLE_SESSION_NAME=session_name RoleSessionName string // Specifies if the S3 service should allow ARNs to direct the region // the client's requests are sent to. // // AWS_S3_USE_ARN_REGION=true S3UseARNRegion *bool // Specifies if the EC2 IMDS service client is enabled. // // AWS_EC2_METADATA_DISABLED=true EC2IMDSClientEnableState imds.ClientEnableState // Specifies if EC2 IMDSv1 fallback is disabled. // // AWS_EC2_METADATA_V1_DISABLED=true EC2IMDSv1Disabled *bool // Specifies the EC2 Instance Metadata Service default endpoint selection mode (IPv4 or IPv6) // // AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE=IPv6 EC2IMDSEndpointMode imds.EndpointModeState // Specifies the EC2 Instance Metadata Service endpoint to use. If specified it overrides EC2IMDSEndpointMode. // // AWS_EC2_METADATA_SERVICE_ENDPOINT=http://fd00:ec2::254 EC2IMDSEndpoint string // Specifies if the S3 service should disable multi-region access points // support. // // AWS_S3_DISABLE_MULTIREGION_ACCESS_POINTS=true S3DisableMultiRegionAccessPoints *bool // Specifies that SDK clients must resolve a dual-stack endpoint for // services. // // AWS_USE_DUALSTACK_ENDPOINT=true UseDualStackEndpoint aws.DualStackEndpointState // Specifies that SDK clients must resolve a FIPS endpoint for // services. // // AWS_USE_FIPS_ENDPOINT=true UseFIPSEndpoint aws.FIPSEndpointState // Specifies the SDK Defaults Mode used by services. // // AWS_DEFAULTS_MODE=standard DefaultsMode aws.DefaultsMode // Specifies the maximum number attempts an API client will call an // operation that fails with a retryable error. // // AWS_MAX_ATTEMPTS=3 RetryMaxAttempts int // Specifies the retry model the API client will be created with. // // aws_retry_mode=standard RetryMode aws.RetryMode // aws sdk app ID that can be added to user agent header string AppID string // Flag used to disable configured endpoints. IgnoreConfiguredEndpoints *bool // Value to contain configured endpoints to be propagated to // corresponding endpoint resolution field. BaseEndpoint string // determine if request compression is allowed, default to false // retrieved from env var AWS_DISABLE_REQUEST_COMPRESSION DisableRequestCompression *bool // inclusive threshold request body size to trigger compression, // default to 10240 and must be within 0 and 10485760 bytes inclusive // retrieved from env var AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES RequestMinCompressSizeBytes *int64 // Whether S3Express auth is disabled. // // This will NOT prevent requests from being made to S3Express buckets, it // will only bypass the modified endpoint routing and signing behaviors // associated with the feature. S3DisableExpressAuth *bool // Indicates whether account ID will be required/ignored in endpoint2.0 routing AccountIDEndpointMode aws.AccountIDEndpointMode // Indicates whether request checksum should be calculated RequestChecksumCalculation aws.RequestChecksumCalculation // Indicates whether response checksum should be validated ResponseChecksumValidation aws.ResponseChecksumValidation } // loadEnvConfig reads configuration values from the OS's environment variables. // Returning the a Config typed EnvConfig to satisfy the ConfigLoader func type. func loadEnvConfig(ctx context.Context, cfgs configs) (Config, error) { return NewEnvConfig() } // NewEnvConfig retrieves the SDK's environment configuration. // See `EnvConfig` for the values that will be retrieved. func NewEnvConfig() (EnvConfig, error) { var cfg EnvConfig creds := aws.Credentials{ Source: CredentialsSourceName, } setStringFromEnvVal(&creds.AccessKeyID, credAccessEnvKeys) setStringFromEnvVal(&creds.SecretAccessKey, credSecretEnvKeys) if creds.HasKeys() { creds.AccountID = os.Getenv(awsAccountIDEnv) creds.SessionToken = os.Getenv(awsSessionTokenEnv) cfg.Credentials = creds } cfg.ContainerCredentialsEndpoint = os.Getenv(awsContainerCredentialsFullURIEnv) cfg.ContainerCredentialsRelativePath = os.Getenv(awsContainerCredentialsRelativeURIEnv) cfg.ContainerAuthorizationToken = os.Getenv(awsContainerAuthorizationTokenEnv) setStringFromEnvVal(&cfg.Region, regionEnvKeys) setStringFromEnvVal(&cfg.SharedConfigProfile, profileEnvKeys) cfg.SharedCredentialsFile = os.Getenv(awsSharedCredentialsFileEnv) cfg.SharedConfigFile = os.Getenv(awsConfigFileEnv) cfg.CustomCABundle = os.Getenv(awsCABundleEnv) cfg.WebIdentityTokenFilePath = os.Getenv(awsWebIdentityTokenFileEnv) cfg.RoleARN = os.Getenv(awsRoleARNEnv) cfg.RoleSessionName = os.Getenv(awsRoleSessionNameEnv) cfg.AppID = os.Getenv(awsSdkUaAppIDEnv) if err := setBoolPtrFromEnvVal(&cfg.DisableRequestCompression, []string{awsDisableRequestCompressionEnv}); err != nil { return cfg, err } if err := setInt64PtrFromEnvVal(&cfg.RequestMinCompressSizeBytes, []string{awsRequestMinCompressionSizeBytesEnv}, smithyrequestcompression.MaxRequestMinCompressSizeBytes); err != nil { return cfg, err } if err := setEndpointDiscoveryTypeFromEnvVal(&cfg.EnableEndpointDiscovery, []string{awsEnableEndpointDiscoveryEnv}); err != nil { return cfg, err } if err := setBoolPtrFromEnvVal(&cfg.S3UseARNRegion, []string{awsS3UseARNRegionEnv}); err != nil { return cfg, err } setEC2IMDSClientEnableState(&cfg.EC2IMDSClientEnableState, []string{awsEc2MetadataDisabledEnv}) if err := setEC2IMDSEndpointMode(&cfg.EC2IMDSEndpointMode, []string{awsEc2MetadataServiceEndpointModeEnv}); err != nil { return cfg, err } cfg.EC2IMDSEndpoint = os.Getenv(awsEc2MetadataServiceEndpointEnv) if err := setBoolPtrFromEnvVal(&cfg.EC2IMDSv1Disabled, []string{awsEc2MetadataV1DisabledEnv}); err != nil { return cfg, err } if err := setBoolPtrFromEnvVal(&cfg.S3DisableMultiRegionAccessPoints, []string{awsS3DisableMultiRegionAccessPointsEnv}); err != nil { return cfg, err } if err := setUseDualStackEndpointFromEnvVal(&cfg.UseDualStackEndpoint, []string{awsUseDualStackEndpointEnv}); err != nil { return cfg, err } if err := setUseFIPSEndpointFromEnvVal(&cfg.UseFIPSEndpoint, []string{awsUseFIPSEndpointEnv}); err != nil { return cfg, err } if err := setDefaultsModeFromEnvVal(&cfg.DefaultsMode, []string{awsDefaultsModeEnv}); err != nil { return cfg, err } if err := setIntFromEnvVal(&cfg.RetryMaxAttempts, []string{awsMaxAttemptsEnv}); err != nil { return cfg, err } if err := setRetryModeFromEnvVal(&cfg.RetryMode, []string{awsRetryModeEnv}); err != nil { return cfg, err } setStringFromEnvVal(&cfg.BaseEndpoint, []string{awsEndpointURLEnv}) if err := setBoolPtrFromEnvVal(&cfg.IgnoreConfiguredEndpoints, []string{awsIgnoreConfiguredEndpointURLEnv}); err != nil { return cfg, err } if err := setBoolPtrFromEnvVal(&cfg.S3DisableExpressAuth, []string{awsS3DisableExpressSessionAuthEnv}); err != nil { return cfg, err } if err := setAIDEndPointModeFromEnvVal(&cfg.AccountIDEndpointMode, []string{awsAccountIDEndpointModeEnv}); err != nil { return cfg, err } if err := setRequestChecksumCalculationFromEnvVal(&cfg.RequestChecksumCalculation, []string{awsRequestChecksumCalculation}); err != nil { return cfg, err } if err := setResponseChecksumValidationFromEnvVal(&cfg.ResponseChecksumValidation, []string{awsResponseChecksumValidation}); err != nil { return cfg, err } return cfg, nil } func (c EnvConfig) getDefaultsMode(ctx context.Context) (aws.DefaultsMode, bool, error) { if len(c.DefaultsMode) == 0 { return "", false, nil } return c.DefaultsMode, true, nil } func (c EnvConfig) getAppID(context.Context) (string, bool, error) { return c.AppID, len(c.AppID) > 0, nil } func (c EnvConfig) getDisableRequestCompression(context.Context) (bool, bool, error) { if c.DisableRequestCompression == nil { return false, false, nil } return *c.DisableRequestCompression, true, nil } func (c EnvConfig) getRequestMinCompressSizeBytes(context.Context) (int64, bool, error) { if c.RequestMinCompressSizeBytes == nil { return 0, false, nil } return *c.RequestMinCompressSizeBytes, true, nil } func (c EnvConfig) getAccountIDEndpointMode(context.Context) (aws.AccountIDEndpointMode, bool, error) { return c.AccountIDEndpointMode, len(c.AccountIDEndpointMode) > 0, nil } func (c EnvConfig) getRequestChecksumCalculation(context.Context) (aws.RequestChecksumCalculation, bool, error) { return c.RequestChecksumCalculation, c.RequestChecksumCalculation > 0, nil } func (c EnvConfig) getResponseChecksumValidation(context.Context) (aws.ResponseChecksumValidation, bool, error) { return c.ResponseChecksumValidation, c.ResponseChecksumValidation > 0, nil } // GetRetryMaxAttempts returns the value of AWS_MAX_ATTEMPTS if was specified, // and not 0. func (c EnvConfig) GetRetryMaxAttempts(ctx context.Context) (int, bool, error) { if c.RetryMaxAttempts == 0 { return 0, false, nil } return c.RetryMaxAttempts, true, nil } // GetRetryMode returns the RetryMode of AWS_RETRY_MODE if was specified, and a // valid value. func (c EnvConfig) GetRetryMode(ctx context.Context) (aws.RetryMode, bool, error) { if len(c.RetryMode) == 0 { return "", false, nil } return c.RetryMode, true, nil } func setEC2IMDSClientEnableState(state *imds.ClientEnableState, keys []string) { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue } switch { case strings.EqualFold(value, "true"): *state = imds.ClientDisabled case strings.EqualFold(value, "false"): *state = imds.ClientEnabled default: continue } break } } func setDefaultsModeFromEnvVal(mode *aws.DefaultsMode, keys []string) error { for _, k := range keys { if value := os.Getenv(k); len(value) > 0 { if ok := mode.SetFromString(value); !ok { return fmt.Errorf("invalid %s value: %s", k, value) } break } } return nil } func setRetryModeFromEnvVal(mode *aws.RetryMode, keys []string) (err error) { for _, k := range keys { if value := os.Getenv(k); len(value) > 0 { *mode, err = aws.ParseRetryMode(value) if err != nil { return fmt.Errorf("invalid %s value, %w", k, err) } break } } return nil } func setEC2IMDSEndpointMode(mode *imds.EndpointModeState, keys []string) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue } if err := mode.SetFromString(value); err != nil { return fmt.Errorf("invalid value for environment variable, %s=%s, %v", k, value, err) } } return nil } func setAIDEndPointModeFromEnvVal(m *aws.AccountIDEndpointMode, keys []string) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue } switch value { case "preferred": *m = aws.AccountIDEndpointModePreferred case "required": *m = aws.AccountIDEndpointModeRequired case "disabled": *m = aws.AccountIDEndpointModeDisabled default: return fmt.Errorf("invalid value for environment variable, %s=%s, must be preferred/required/disabled", k, value) } break } return nil } func setRequestChecksumCalculationFromEnvVal(m *aws.RequestChecksumCalculation, keys []string) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue } switch strings.ToLower(value) { case checksumWhenSupported: *m = aws.RequestChecksumCalculationWhenSupported case checksumWhenRequired: *m = aws.RequestChecksumCalculationWhenRequired default: return fmt.Errorf("invalid value for environment variable, %s=%s, must be when_supported/when_required", k, value) } } return nil } func setResponseChecksumValidationFromEnvVal(m *aws.ResponseChecksumValidation, keys []string) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue } switch strings.ToLower(value) { case checksumWhenSupported: *m = aws.ResponseChecksumValidationWhenSupported case checksumWhenRequired: *m = aws.ResponseChecksumValidationWhenRequired default: return fmt.Errorf("invalid value for environment variable, %s=%s, must be when_supported/when_required", k, value) } } return nil } // GetRegion returns the AWS Region if set in the environment. Returns an empty // string if not set. func (c EnvConfig) getRegion(ctx context.Context) (string, bool, error) { if len(c.Region) == 0 { return "", false, nil } return c.Region, true, nil } // GetSharedConfigProfile returns the shared config profile if set in the // environment. Returns an empty string if not set. func (c EnvConfig) getSharedConfigProfile(ctx context.Context) (string, bool, error) { if len(c.SharedConfigProfile) == 0 { return "", false, nil } return c.SharedConfigProfile, true, nil } // getSharedConfigFiles returns a slice of filenames set in the environment. // // Will return the filenames in the order of: // * Shared Config func (c EnvConfig) getSharedConfigFiles(context.Context) ([]string, bool, error) { var files []string if v := c.SharedConfigFile; len(v) > 0 { files = append(files, v) } if len(files) == 0 { return nil, false, nil } return files, true, nil } // getSharedCredentialsFiles returns a slice of filenames set in the environment. // // Will return the filenames in the order of: // * Shared Credentials func (c EnvConfig) getSharedCredentialsFiles(context.Context) ([]string, bool, error) { var files []string if v := c.SharedCredentialsFile; len(v) > 0 { files = append(files, v) } if len(files) == 0 { return nil, false, nil } return files, true, nil } // GetCustomCABundle returns the custom CA bundle's PEM bytes if the file was func (c EnvConfig) getCustomCABundle(context.Context) (io.Reader, bool, error) { if len(c.CustomCABundle) == 0 { return nil, false, nil } b, err := os.ReadFile(c.CustomCABundle) if err != nil { return nil, false, err } return bytes.NewReader(b), true, nil } // GetIgnoreConfiguredEndpoints is used in knowing when to disable configured // endpoints feature. func (c EnvConfig) GetIgnoreConfiguredEndpoints(context.Context) (bool, bool, error) { if c.IgnoreConfiguredEndpoints == nil { return false, false, nil } return *c.IgnoreConfiguredEndpoints, true, nil } func (c EnvConfig) getBaseEndpoint(context.Context) (string, bool, error) { return c.BaseEndpoint, len(c.BaseEndpoint) > 0, nil } // GetServiceBaseEndpoint is used to retrieve a normalized SDK ID for use // with configured endpoints. func (c EnvConfig) GetServiceBaseEndpoint(ctx context.Context, sdkID string) (string, bool, error) { if endpt := os.Getenv(fmt.Sprintf("%s_%s", awsEndpointURLEnv, normalizeEnv(sdkID))); endpt != "" { return endpt, true, nil } return "", false, nil } func normalizeEnv(sdkID string) string { upper := strings.ToUpper(sdkID) return strings.ReplaceAll(upper, " ", "_") } // GetS3UseARNRegion returns whether to allow ARNs to direct the region // the S3 client's requests are sent to. func (c EnvConfig) GetS3UseARNRegion(ctx context.Context) (value, ok bool, err error) { if c.S3UseARNRegion == nil { return false, false, nil } return *c.S3UseARNRegion, true, nil } // GetS3DisableMultiRegionAccessPoints returns whether to disable multi-region access point // support for the S3 client. func (c EnvConfig) GetS3DisableMultiRegionAccessPoints(ctx context.Context) (value, ok bool, err error) { if c.S3DisableMultiRegionAccessPoints == nil { return false, false, nil } return *c.S3DisableMultiRegionAccessPoints, true, nil } // GetUseDualStackEndpoint returns whether the service's dual-stack endpoint should be // used for requests. func (c EnvConfig) GetUseDualStackEndpoint(ctx context.Context) (value aws.DualStackEndpointState, found bool, err error) { if c.UseDualStackEndpoint == aws.DualStackEndpointStateUnset { return aws.DualStackEndpointStateUnset, false, nil } return c.UseDualStackEndpoint, true, nil } // GetUseFIPSEndpoint returns whether the service's FIPS endpoint should be // used for requests. func (c EnvConfig) GetUseFIPSEndpoint(ctx context.Context) (value aws.FIPSEndpointState, found bool, err error) { if c.UseFIPSEndpoint == aws.FIPSEndpointStateUnset { return aws.FIPSEndpointStateUnset, false, nil } return c.UseFIPSEndpoint, true, nil } func setStringFromEnvVal(dst *string, keys []string) { for _, k := range keys { if v := os.Getenv(k); len(v) > 0 { *dst = v break } } } func setIntFromEnvVal(dst *int, keys []string) error { for _, k := range keys { if v := os.Getenv(k); len(v) > 0 { i, err := strconv.ParseInt(v, 10, 64) if err != nil { return fmt.Errorf("invalid value %s=%s, %w", k, v, err) } *dst = int(i) break } } return nil } func setBoolPtrFromEnvVal(dst **bool, keys []string) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue } if *dst == nil { *dst = new(bool) } switch { case strings.EqualFold(value, "false"): **dst = false case strings.EqualFold(value, "true"): **dst = true default: return fmt.Errorf( "invalid value for environment variable, %s=%s, need true or false", k, value) } break } return nil } func setInt64PtrFromEnvVal(dst **int64, keys []string, max int64) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue } v, err := strconv.ParseInt(value, 10, 64) if err != nil { return fmt.Errorf("invalid value for env var, %s=%s, need int64", k, value) } else if v < 0 || v > max { return fmt.Errorf("invalid range for env var min request compression size bytes %q, must be within 0 and 10485760 inclusively", v) } if *dst == nil { *dst = new(int64) } **dst = v break } return nil } func setEndpointDiscoveryTypeFromEnvVal(dst *aws.EndpointDiscoveryEnableState, keys []string) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue // skip if empty } switch { case strings.EqualFold(value, endpointDiscoveryDisabled): *dst = aws.EndpointDiscoveryDisabled case strings.EqualFold(value, endpointDiscoveryEnabled): *dst = aws.EndpointDiscoveryEnabled case strings.EqualFold(value, endpointDiscoveryAuto): *dst = aws.EndpointDiscoveryAuto default: return fmt.Errorf( "invalid value for environment variable, %s=%s, need true, false or auto", k, value) } } return nil } func setUseDualStackEndpointFromEnvVal(dst *aws.DualStackEndpointState, keys []string) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue // skip if empty } switch { case strings.EqualFold(value, "true"): *dst = aws.DualStackEndpointStateEnabled case strings.EqualFold(value, "false"): *dst = aws.DualStackEndpointStateDisabled default: return fmt.Errorf( "invalid value for environment variable, %s=%s, need true, false", k, value) } } return nil } func setUseFIPSEndpointFromEnvVal(dst *aws.FIPSEndpointState, keys []string) error { for _, k := range keys { value := os.Getenv(k) if len(value) == 0 { continue // skip if empty } switch { case strings.EqualFold(value, "true"): *dst = aws.FIPSEndpointStateEnabled case strings.EqualFold(value, "false"): *dst = aws.FIPSEndpointStateDisabled default: return fmt.Errorf( "invalid value for environment variable, %s=%s, need true, false", k, value) } } return nil } // GetEnableEndpointDiscovery returns resolved value for EnableEndpointDiscovery env variable setting. func (c EnvConfig) GetEnableEndpointDiscovery(ctx context.Context) (value aws.EndpointDiscoveryEnableState, found bool, err error) { if c.EnableEndpointDiscovery == aws.EndpointDiscoveryUnset { return aws.EndpointDiscoveryUnset, false, nil } return c.EnableEndpointDiscovery, true, nil } // GetEC2IMDSClientEnableState implements a EC2IMDSClientEnableState options resolver interface. func (c EnvConfig) GetEC2IMDSClientEnableState() (imds.ClientEnableState, bool, error) { if c.EC2IMDSClientEnableState == imds.ClientDefaultEnableState { return imds.ClientDefaultEnableState, false, nil } return c.EC2IMDSClientEnableState, true, nil } // GetEC2IMDSEndpointMode implements a EC2IMDSEndpointMode option resolver interface. func (c EnvConfig) GetEC2IMDSEndpointMode() (imds.EndpointModeState, bool, error) { if c.EC2IMDSEndpointMode == imds.EndpointModeStateUnset { return imds.EndpointModeStateUnset, false, nil } return c.EC2IMDSEndpointMode, true, nil } // GetEC2IMDSEndpoint implements a EC2IMDSEndpoint option resolver interface. func (c EnvConfig) GetEC2IMDSEndpoint() (string, bool, error) { if len(c.EC2IMDSEndpoint) == 0 { return "", false, nil } return c.EC2IMDSEndpoint, true, nil } // GetEC2IMDSV1FallbackDisabled implements an EC2IMDSV1FallbackDisabled option // resolver interface. func (c EnvConfig) GetEC2IMDSV1FallbackDisabled() (bool, bool) { if c.EC2IMDSv1Disabled == nil { return false, false } return *c.EC2IMDSv1Disabled, true } // GetS3DisableExpressAuth returns the configured value for // [EnvConfig.S3DisableExpressAuth]. func (c EnvConfig) GetS3DisableExpressAuth() (value, ok bool) { if c.S3DisableExpressAuth == nil { return false, false } return *c.S3DisableExpressAuth, true } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/generate.go ================================================ package config //go:generate go run -tags codegen ./codegen -output=provider_assert_test.go //go:generate gofmt -s -w ./ ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package config // goModuleVersion is the tagged release for this module const goModuleVersion = "1.29.14" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/load_options.go ================================================ package config import ( "context" "io" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds" "github.com/aws/aws-sdk-go-v2/credentials/endpointcreds" "github.com/aws/aws-sdk-go-v2/credentials/processcreds" "github.com/aws/aws-sdk-go-v2/credentials/ssocreds" "github.com/aws/aws-sdk-go-v2/credentials/stscreds" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" smithybearer "github.com/aws/smithy-go/auth/bearer" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/middleware" ) // LoadOptionsFunc is a type alias for LoadOptions functional option type LoadOptionsFunc func(*LoadOptions) error // LoadOptions are discrete set of options that are valid for loading the // configuration type LoadOptions struct { // Region is the region to send requests to. Region string // Credentials object to use when signing requests. Credentials aws.CredentialsProvider // Token provider for authentication operations with bearer authentication. BearerAuthTokenProvider smithybearer.TokenProvider // HTTPClient the SDK's API clients will use to invoke HTTP requests. HTTPClient HTTPClient // EndpointResolver that can be used to provide or override an endpoint for // the given service and region. // // See the `aws.EndpointResolver` documentation on usage. // // Deprecated: See EndpointResolverWithOptions EndpointResolver aws.EndpointResolver // EndpointResolverWithOptions that can be used to provide or override an // endpoint for the given service and region. // // See the `aws.EndpointResolverWithOptions` documentation on usage. EndpointResolverWithOptions aws.EndpointResolverWithOptions // RetryMaxAttempts specifies the maximum number attempts an API client // will call an operation that fails with a retryable error. // // This value will only be used if Retryer option is nil. RetryMaxAttempts int // RetryMode specifies the retry model the API client will be created with. // // This value will only be used if Retryer option is nil. RetryMode aws.RetryMode // Retryer is a function that provides a Retryer implementation. A Retryer // guides how HTTP requests should be retried in case of recoverable // failures. // // If not nil, RetryMaxAttempts, and RetryMode will be ignored. Retryer func() aws.Retryer // APIOptions provides the set of middleware mutations modify how the API // client requests will be handled. This is useful for adding additional // tracing data to a request, or changing behavior of the SDK's client. APIOptions []func(*middleware.Stack) error // Logger writer interface to write logging messages to. Logger logging.Logger // ClientLogMode is used to configure the events that will be sent to the // configured logger. This can be used to configure the logging of signing, // retries, request, and responses of the SDK clients. // // See the ClientLogMode type documentation for the complete set of logging // modes and available configuration. ClientLogMode *aws.ClientLogMode // SharedConfigProfile is the profile to be used when loading the SharedConfig SharedConfigProfile string // SharedConfigFiles is the slice of custom shared config files to use when // loading the SharedConfig. A non-default profile used within config file // must have name defined with prefix 'profile '. eg [profile xyz] // indicates a profile with name 'xyz'. To read more on the format of the // config file, please refer the documentation at // https://docs.aws.amazon.com/credref/latest/refdocs/file-format.html#file-format-config // // If duplicate profiles are provided within the same, or across multiple // shared config files, the next parsed profile will override only the // properties that conflict with the previously defined profile. Note that // if duplicate profiles are provided within the SharedCredentialsFiles and // SharedConfigFiles, the properties defined in shared credentials file // take precedence. SharedConfigFiles []string // SharedCredentialsFile is the slice of custom shared credentials files to // use when loading the SharedConfig. The profile name used within // credentials file must not prefix 'profile '. eg [xyz] indicates a // profile with name 'xyz'. Profile declared as [profile xyz] will be // ignored. To read more on the format of the credentials file, please // refer the documentation at // https://docs.aws.amazon.com/credref/latest/refdocs/file-format.html#file-format-creds // // If duplicate profiles are provided with a same, or across multiple // shared credentials files, the next parsed profile will override only // properties that conflict with the previously defined profile. Note that // if duplicate profiles are provided within the SharedCredentialsFiles and // SharedConfigFiles, the properties defined in shared credentials file // take precedence. SharedCredentialsFiles []string // CustomCABundle is CA bundle PEM bytes reader CustomCABundle io.Reader // DefaultRegion is the fall back region, used if a region was not resolved // from other sources DefaultRegion string // UseEC2IMDSRegion indicates if SDK should retrieve the region // from the EC2 Metadata service UseEC2IMDSRegion *UseEC2IMDSRegion // CredentialsCacheOptions is a function for setting the // aws.CredentialsCacheOptions CredentialsCacheOptions func(*aws.CredentialsCacheOptions) // BearerAuthTokenCacheOptions is a function for setting the smithy-go // auth/bearer#TokenCacheOptions BearerAuthTokenCacheOptions func(*smithybearer.TokenCacheOptions) // SSOTokenProviderOptions is a function for setting the // credentials/ssocreds.SSOTokenProviderOptions SSOTokenProviderOptions func(*ssocreds.SSOTokenProviderOptions) // ProcessCredentialOptions is a function for setting // the processcreds.Options ProcessCredentialOptions func(*processcreds.Options) // EC2RoleCredentialOptions is a function for setting // the ec2rolecreds.Options EC2RoleCredentialOptions func(*ec2rolecreds.Options) // EndpointCredentialOptions is a function for setting // the endpointcreds.Options EndpointCredentialOptions func(*endpointcreds.Options) // WebIdentityRoleCredentialOptions is a function for setting // the stscreds.WebIdentityRoleOptions WebIdentityRoleCredentialOptions func(*stscreds.WebIdentityRoleOptions) // AssumeRoleCredentialOptions is a function for setting the // stscreds.AssumeRoleOptions AssumeRoleCredentialOptions func(*stscreds.AssumeRoleOptions) // SSOProviderOptions is a function for setting // the ssocreds.Options SSOProviderOptions func(options *ssocreds.Options) // LogConfigurationWarnings when set to true, enables logging // configuration warnings LogConfigurationWarnings *bool // S3UseARNRegion specifies if the S3 service should allow ARNs to direct // the region, the client's requests are sent to. S3UseARNRegion *bool // S3DisableMultiRegionAccessPoints specifies if the S3 service should disable // the S3 Multi-Region access points feature. S3DisableMultiRegionAccessPoints *bool // EnableEndpointDiscovery specifies if endpoint discovery is enable for // the client. EnableEndpointDiscovery aws.EndpointDiscoveryEnableState // Specifies if the EC2 IMDS service client is enabled. // // AWS_EC2_METADATA_DISABLED=true EC2IMDSClientEnableState imds.ClientEnableState // Specifies the EC2 Instance Metadata Service default endpoint selection // mode (IPv4 or IPv6) EC2IMDSEndpointMode imds.EndpointModeState // Specifies the EC2 Instance Metadata Service endpoint to use. If // specified it overrides EC2IMDSEndpointMode. EC2IMDSEndpoint string // Specifies that SDK clients must resolve a dual-stack endpoint for // services. UseDualStackEndpoint aws.DualStackEndpointState // Specifies that SDK clients must resolve a FIPS endpoint for // services. UseFIPSEndpoint aws.FIPSEndpointState // Specifies the SDK configuration mode for defaults. DefaultsModeOptions DefaultsModeOptions // The sdk app ID retrieved from env var or shared config to be added to request user agent header AppID string // Specifies whether an operation request could be compressed DisableRequestCompression *bool // The inclusive min bytes of a request body that could be compressed RequestMinCompressSizeBytes *int64 // Whether S3 Express auth is disabled. S3DisableExpressAuth *bool // Whether account id should be built into endpoint resolution AccountIDEndpointMode aws.AccountIDEndpointMode // Specify if request checksum should be calculated RequestChecksumCalculation aws.RequestChecksumCalculation // Specifies if response checksum should be validated ResponseChecksumValidation aws.ResponseChecksumValidation // Service endpoint override. This value is not necessarily final and is // passed to the service's EndpointResolverV2 for further delegation. BaseEndpoint string } func (o LoadOptions) getDefaultsMode(ctx context.Context) (aws.DefaultsMode, bool, error) { if len(o.DefaultsModeOptions.Mode) == 0 { return "", false, nil } return o.DefaultsModeOptions.Mode, true, nil } // GetRetryMaxAttempts returns the RetryMaxAttempts if specified in the // LoadOptions and not 0. func (o LoadOptions) GetRetryMaxAttempts(ctx context.Context) (int, bool, error) { if o.RetryMaxAttempts == 0 { return 0, false, nil } return o.RetryMaxAttempts, true, nil } // GetRetryMode returns the RetryMode specified in the LoadOptions. func (o LoadOptions) GetRetryMode(ctx context.Context) (aws.RetryMode, bool, error) { if len(o.RetryMode) == 0 { return "", false, nil } return o.RetryMode, true, nil } func (o LoadOptions) getDefaultsModeIMDSClient(ctx context.Context) (*imds.Client, bool, error) { if o.DefaultsModeOptions.IMDSClient == nil { return nil, false, nil } return o.DefaultsModeOptions.IMDSClient, true, nil } // getRegion returns Region from config's LoadOptions func (o LoadOptions) getRegion(ctx context.Context) (string, bool, error) { if len(o.Region) == 0 { return "", false, nil } return o.Region, true, nil } // getAppID returns AppID from config's LoadOptions func (o LoadOptions) getAppID(ctx context.Context) (string, bool, error) { return o.AppID, len(o.AppID) > 0, nil } // getDisableRequestCompression returns DisableRequestCompression from config's LoadOptions func (o LoadOptions) getDisableRequestCompression(ctx context.Context) (bool, bool, error) { if o.DisableRequestCompression == nil { return false, false, nil } return *o.DisableRequestCompression, true, nil } // getRequestMinCompressSizeBytes returns RequestMinCompressSizeBytes from config's LoadOptions func (o LoadOptions) getRequestMinCompressSizeBytes(ctx context.Context) (int64, bool, error) { if o.RequestMinCompressSizeBytes == nil { return 0, false, nil } return *o.RequestMinCompressSizeBytes, true, nil } func (o LoadOptions) getAccountIDEndpointMode(ctx context.Context) (aws.AccountIDEndpointMode, bool, error) { return o.AccountIDEndpointMode, len(o.AccountIDEndpointMode) > 0, nil } func (o LoadOptions) getRequestChecksumCalculation(ctx context.Context) (aws.RequestChecksumCalculation, bool, error) { return o.RequestChecksumCalculation, o.RequestChecksumCalculation > 0, nil } func (o LoadOptions) getResponseChecksumValidation(ctx context.Context) (aws.ResponseChecksumValidation, bool, error) { return o.ResponseChecksumValidation, o.ResponseChecksumValidation > 0, nil } func (o LoadOptions) getBaseEndpoint(context.Context) (string, bool, error) { return o.BaseEndpoint, o.BaseEndpoint != "", nil } // GetServiceBaseEndpoint satisfies (internal/configsources).ServiceBaseEndpointProvider. // // The sdkID value is unused because LoadOptions only supports setting a GLOBAL // endpoint override. In-code, per-service endpoint overrides are performed via // functional options in service client space. func (o LoadOptions) GetServiceBaseEndpoint(context.Context, string) (string, bool, error) { return o.BaseEndpoint, o.BaseEndpoint != "", nil } // WithRegion is a helper function to construct functional options // that sets Region on config's LoadOptions. Setting the region to // an empty string, will result in the region value being ignored. // If multiple WithRegion calls are made, the last call overrides // the previous call values. func WithRegion(v string) LoadOptionsFunc { return func(o *LoadOptions) error { o.Region = v return nil } } // WithAppID is a helper function to construct functional options // that sets AppID on config's LoadOptions. func WithAppID(ID string) LoadOptionsFunc { return func(o *LoadOptions) error { o.AppID = ID return nil } } // WithDisableRequestCompression is a helper function to construct functional options // that sets DisableRequestCompression on config's LoadOptions. func WithDisableRequestCompression(DisableRequestCompression *bool) LoadOptionsFunc { return func(o *LoadOptions) error { if DisableRequestCompression == nil { return nil } o.DisableRequestCompression = DisableRequestCompression return nil } } // WithRequestMinCompressSizeBytes is a helper function to construct functional options // that sets RequestMinCompressSizeBytes on config's LoadOptions. func WithRequestMinCompressSizeBytes(RequestMinCompressSizeBytes *int64) LoadOptionsFunc { return func(o *LoadOptions) error { if RequestMinCompressSizeBytes == nil { return nil } o.RequestMinCompressSizeBytes = RequestMinCompressSizeBytes return nil } } // WithAccountIDEndpointMode is a helper function to construct functional options // that sets AccountIDEndpointMode on config's LoadOptions func WithAccountIDEndpointMode(m aws.AccountIDEndpointMode) LoadOptionsFunc { return func(o *LoadOptions) error { if m != "" { o.AccountIDEndpointMode = m } return nil } } // WithRequestChecksumCalculation is a helper function to construct functional options // that sets RequestChecksumCalculation on config's LoadOptions func WithRequestChecksumCalculation(c aws.RequestChecksumCalculation) LoadOptionsFunc { return func(o *LoadOptions) error { if c > 0 { o.RequestChecksumCalculation = c } return nil } } // WithResponseChecksumValidation is a helper function to construct functional options // that sets ResponseChecksumValidation on config's LoadOptions func WithResponseChecksumValidation(v aws.ResponseChecksumValidation) LoadOptionsFunc { return func(o *LoadOptions) error { o.ResponseChecksumValidation = v return nil } } // getDefaultRegion returns DefaultRegion from config's LoadOptions func (o LoadOptions) getDefaultRegion(ctx context.Context) (string, bool, error) { if len(o.DefaultRegion) == 0 { return "", false, nil } return o.DefaultRegion, true, nil } // WithDefaultRegion is a helper function to construct functional options // that sets a DefaultRegion on config's LoadOptions. Setting the default // region to an empty string, will result in the default region value // being ignored. If multiple WithDefaultRegion calls are made, the last // call overrides the previous call values. Note that both WithRegion and // WithEC2IMDSRegion call takes precedence over WithDefaultRegion call // when resolving region. func WithDefaultRegion(v string) LoadOptionsFunc { return func(o *LoadOptions) error { o.DefaultRegion = v return nil } } // getSharedConfigProfile returns SharedConfigProfile from config's LoadOptions func (o LoadOptions) getSharedConfigProfile(ctx context.Context) (string, bool, error) { if len(o.SharedConfigProfile) == 0 { return "", false, nil } return o.SharedConfigProfile, true, nil } // WithSharedConfigProfile is a helper function to construct functional options // that sets SharedConfigProfile on config's LoadOptions. Setting the shared // config profile to an empty string, will result in the shared config profile // value being ignored. // If multiple WithSharedConfigProfile calls are made, the last call overrides // the previous call values. func WithSharedConfigProfile(v string) LoadOptionsFunc { return func(o *LoadOptions) error { o.SharedConfigProfile = v return nil } } // getSharedConfigFiles returns SharedConfigFiles set on config's LoadOptions func (o LoadOptions) getSharedConfigFiles(ctx context.Context) ([]string, bool, error) { if o.SharedConfigFiles == nil { return nil, false, nil } return o.SharedConfigFiles, true, nil } // WithSharedConfigFiles is a helper function to construct functional options // that sets slice of SharedConfigFiles on config's LoadOptions. // Setting the shared config files to an nil string slice, will result in the // shared config files value being ignored. // If multiple WithSharedConfigFiles calls are made, the last call overrides // the previous call values. func WithSharedConfigFiles(v []string) LoadOptionsFunc { return func(o *LoadOptions) error { o.SharedConfigFiles = v return nil } } // getSharedCredentialsFiles returns SharedCredentialsFiles set on config's LoadOptions func (o LoadOptions) getSharedCredentialsFiles(ctx context.Context) ([]string, bool, error) { if o.SharedCredentialsFiles == nil { return nil, false, nil } return o.SharedCredentialsFiles, true, nil } // WithSharedCredentialsFiles is a helper function to construct functional options // that sets slice of SharedCredentialsFiles on config's LoadOptions. // Setting the shared credentials files to an nil string slice, will result in the // shared credentials files value being ignored. // If multiple WithSharedCredentialsFiles calls are made, the last call overrides // the previous call values. func WithSharedCredentialsFiles(v []string) LoadOptionsFunc { return func(o *LoadOptions) error { o.SharedCredentialsFiles = v return nil } } // getCustomCABundle returns CustomCABundle from LoadOptions func (o LoadOptions) getCustomCABundle(ctx context.Context) (io.Reader, bool, error) { if o.CustomCABundle == nil { return nil, false, nil } return o.CustomCABundle, true, nil } // WithCustomCABundle is a helper function to construct functional options // that sets CustomCABundle on config's LoadOptions. Setting the custom CA Bundle // to nil will result in custom CA Bundle value being ignored. // If multiple WithCustomCABundle calls are made, the last call overrides the // previous call values. func WithCustomCABundle(v io.Reader) LoadOptionsFunc { return func(o *LoadOptions) error { o.CustomCABundle = v return nil } } // UseEC2IMDSRegion provides a regionProvider that retrieves the region // from the EC2 Metadata service. type UseEC2IMDSRegion struct { // If unset will default to generic EC2 IMDS client. Client *imds.Client } // getRegion attempts to retrieve the region from EC2 Metadata service. func (p *UseEC2IMDSRegion) getRegion(ctx context.Context) (string, bool, error) { if ctx == nil { ctx = context.Background() } client := p.Client if client == nil { client = imds.New(imds.Options{}) } result, err := client.GetRegion(ctx, nil) if err != nil { return "", false, err } if len(result.Region) != 0 { return result.Region, true, nil } return "", false, nil } // getEC2IMDSRegion returns the value of EC2 IMDS region. func (o LoadOptions) getEC2IMDSRegion(ctx context.Context) (string, bool, error) { if o.UseEC2IMDSRegion == nil { return "", false, nil } return o.UseEC2IMDSRegion.getRegion(ctx) } // WithEC2IMDSRegion is a helper function to construct functional options // that enables resolving EC2IMDS region. The function takes // in a UseEC2IMDSRegion functional option, and can be used to set the // EC2IMDS client which will be used to resolve EC2IMDSRegion. // If no functional option is provided, an EC2IMDS client is built and used // by the resolver. If multiple WithEC2IMDSRegion calls are made, the last // call overrides the previous call values. Note that the WithRegion calls takes // precedence over WithEC2IMDSRegion when resolving region. func WithEC2IMDSRegion(fnOpts ...func(o *UseEC2IMDSRegion)) LoadOptionsFunc { return func(o *LoadOptions) error { o.UseEC2IMDSRegion = &UseEC2IMDSRegion{} for _, fn := range fnOpts { fn(o.UseEC2IMDSRegion) } return nil } } // getCredentialsProvider returns the credentials value func (o LoadOptions) getCredentialsProvider(ctx context.Context) (aws.CredentialsProvider, bool, error) { if o.Credentials == nil { return nil, false, nil } return o.Credentials, true, nil } // WithCredentialsProvider is a helper function to construct functional options // that sets Credential provider value on config's LoadOptions. If credentials // provider is set to nil, the credentials provider value will be ignored. // If multiple WithCredentialsProvider calls are made, the last call overrides // the previous call values. func WithCredentialsProvider(v aws.CredentialsProvider) LoadOptionsFunc { return func(o *LoadOptions) error { o.Credentials = v return nil } } // getCredentialsCacheOptionsProvider returns the wrapped function to set aws.CredentialsCacheOptions func (o LoadOptions) getCredentialsCacheOptions(ctx context.Context) (func(*aws.CredentialsCacheOptions), bool, error) { if o.CredentialsCacheOptions == nil { return nil, false, nil } return o.CredentialsCacheOptions, true, nil } // WithCredentialsCacheOptions is a helper function to construct functional // options that sets a function to modify the aws.CredentialsCacheOptions the // aws.CredentialsCache will be configured with, if the CredentialsCache is used // by the configuration loader. // // If multiple WithCredentialsCacheOptions calls are made, the last call // overrides the previous call values. func WithCredentialsCacheOptions(v func(*aws.CredentialsCacheOptions)) LoadOptionsFunc { return func(o *LoadOptions) error { o.CredentialsCacheOptions = v return nil } } // getBearerAuthTokenProvider returns the credentials value func (o LoadOptions) getBearerAuthTokenProvider(ctx context.Context) (smithybearer.TokenProvider, bool, error) { if o.BearerAuthTokenProvider == nil { return nil, false, nil } return o.BearerAuthTokenProvider, true, nil } // WithBearerAuthTokenProvider is a helper function to construct functional options // that sets Credential provider value on config's LoadOptions. If credentials // provider is set to nil, the credentials provider value will be ignored. // If multiple WithBearerAuthTokenProvider calls are made, the last call overrides // the previous call values. func WithBearerAuthTokenProvider(v smithybearer.TokenProvider) LoadOptionsFunc { return func(o *LoadOptions) error { o.BearerAuthTokenProvider = v return nil } } // getBearerAuthTokenCacheOptionsProvider returns the wrapped function to set smithybearer.TokenCacheOptions func (o LoadOptions) getBearerAuthTokenCacheOptions(ctx context.Context) (func(*smithybearer.TokenCacheOptions), bool, error) { if o.BearerAuthTokenCacheOptions == nil { return nil, false, nil } return o.BearerAuthTokenCacheOptions, true, nil } // WithBearerAuthTokenCacheOptions is a helper function to construct functional options // that sets a function to modify the TokenCacheOptions the smithy-go // auth/bearer#TokenCache will be configured with, if the TokenCache is used by // the configuration loader. // // If multiple WithBearerAuthTokenCacheOptions calls are made, the last call overrides // the previous call values. func WithBearerAuthTokenCacheOptions(v func(*smithybearer.TokenCacheOptions)) LoadOptionsFunc { return func(o *LoadOptions) error { o.BearerAuthTokenCacheOptions = v return nil } } // getSSOTokenProviderOptionsProvider returns the wrapped function to set smithybearer.TokenCacheOptions func (o LoadOptions) getSSOTokenProviderOptions(ctx context.Context) (func(*ssocreds.SSOTokenProviderOptions), bool, error) { if o.SSOTokenProviderOptions == nil { return nil, false, nil } return o.SSOTokenProviderOptions, true, nil } // WithSSOTokenProviderOptions is a helper function to construct functional // options that sets a function to modify the SSOtokenProviderOptions the SDK's // credentials/ssocreds#SSOProvider will be configured with, if the // SSOTokenProvider is used by the configuration loader. // // If multiple WithSSOTokenProviderOptions calls are made, the last call overrides // the previous call values. func WithSSOTokenProviderOptions(v func(*ssocreds.SSOTokenProviderOptions)) LoadOptionsFunc { return func(o *LoadOptions) error { o.SSOTokenProviderOptions = v return nil } } // getProcessCredentialOptions returns the wrapped function to set processcreds.Options func (o LoadOptions) getProcessCredentialOptions(ctx context.Context) (func(*processcreds.Options), bool, error) { if o.ProcessCredentialOptions == nil { return nil, false, nil } return o.ProcessCredentialOptions, true, nil } // WithProcessCredentialOptions is a helper function to construct functional options // that sets a function to use processcreds.Options on config's LoadOptions. // If process credential options is set to nil, the process credential value will // be ignored. If multiple WithProcessCredentialOptions calls are made, the last call // overrides the previous call values. func WithProcessCredentialOptions(v func(*processcreds.Options)) LoadOptionsFunc { return func(o *LoadOptions) error { o.ProcessCredentialOptions = v return nil } } // getEC2RoleCredentialOptions returns the wrapped function to set the ec2rolecreds.Options func (o LoadOptions) getEC2RoleCredentialOptions(ctx context.Context) (func(*ec2rolecreds.Options), bool, error) { if o.EC2RoleCredentialOptions == nil { return nil, false, nil } return o.EC2RoleCredentialOptions, true, nil } // WithEC2RoleCredentialOptions is a helper function to construct functional options // that sets a function to use ec2rolecreds.Options on config's LoadOptions. If // EC2 role credential options is set to nil, the EC2 role credential options value // will be ignored. If multiple WithEC2RoleCredentialOptions calls are made, // the last call overrides the previous call values. func WithEC2RoleCredentialOptions(v func(*ec2rolecreds.Options)) LoadOptionsFunc { return func(o *LoadOptions) error { o.EC2RoleCredentialOptions = v return nil } } // getEndpointCredentialOptions returns the wrapped function to set endpointcreds.Options func (o LoadOptions) getEndpointCredentialOptions(context.Context) (func(*endpointcreds.Options), bool, error) { if o.EndpointCredentialOptions == nil { return nil, false, nil } return o.EndpointCredentialOptions, true, nil } // WithEndpointCredentialOptions is a helper function to construct functional options // that sets a function to use endpointcreds.Options on config's LoadOptions. If // endpoint credential options is set to nil, the endpoint credential options // value will be ignored. If multiple WithEndpointCredentialOptions calls are made, // the last call overrides the previous call values. func WithEndpointCredentialOptions(v func(*endpointcreds.Options)) LoadOptionsFunc { return func(o *LoadOptions) error { o.EndpointCredentialOptions = v return nil } } // getWebIdentityRoleCredentialOptions returns the wrapped function func (o LoadOptions) getWebIdentityRoleCredentialOptions(context.Context) (func(*stscreds.WebIdentityRoleOptions), bool, error) { if o.WebIdentityRoleCredentialOptions == nil { return nil, false, nil } return o.WebIdentityRoleCredentialOptions, true, nil } // WithWebIdentityRoleCredentialOptions is a helper function to construct // functional options that sets a function to use stscreds.WebIdentityRoleOptions // on config's LoadOptions. If web identity role credentials options is set to nil, // the web identity role credentials value will be ignored. If multiple // WithWebIdentityRoleCredentialOptions calls are made, the last call // overrides the previous call values. func WithWebIdentityRoleCredentialOptions(v func(*stscreds.WebIdentityRoleOptions)) LoadOptionsFunc { return func(o *LoadOptions) error { o.WebIdentityRoleCredentialOptions = v return nil } } // getAssumeRoleCredentialOptions returns AssumeRoleCredentialOptions from LoadOptions func (o LoadOptions) getAssumeRoleCredentialOptions(context.Context) (func(options *stscreds.AssumeRoleOptions), bool, error) { if o.AssumeRoleCredentialOptions == nil { return nil, false, nil } return o.AssumeRoleCredentialOptions, true, nil } // WithAssumeRoleCredentialOptions is a helper function to construct // functional options that sets a function to use stscreds.AssumeRoleOptions // on config's LoadOptions. If assume role credentials options is set to nil, // the assume role credentials value will be ignored. If multiple // WithAssumeRoleCredentialOptions calls are made, the last call overrides // the previous call values. func WithAssumeRoleCredentialOptions(v func(*stscreds.AssumeRoleOptions)) LoadOptionsFunc { return func(o *LoadOptions) error { o.AssumeRoleCredentialOptions = v return nil } } func (o LoadOptions) getHTTPClient(ctx context.Context) (HTTPClient, bool, error) { if o.HTTPClient == nil { return nil, false, nil } return o.HTTPClient, true, nil } // WithHTTPClient is a helper function to construct functional options // that sets HTTPClient on LoadOptions. If HTTPClient is set to nil, // the HTTPClient value will be ignored. // If multiple WithHTTPClient calls are made, the last call overrides // the previous call values. func WithHTTPClient(v HTTPClient) LoadOptionsFunc { return func(o *LoadOptions) error { o.HTTPClient = v return nil } } func (o LoadOptions) getAPIOptions(ctx context.Context) ([]func(*middleware.Stack) error, bool, error) { if o.APIOptions == nil { return nil, false, nil } return o.APIOptions, true, nil } // WithAPIOptions is a helper function to construct functional options // that sets APIOptions on LoadOptions. If APIOptions is set to nil, the // APIOptions value is ignored. If multiple WithAPIOptions calls are // made, the last call overrides the previous call values. func WithAPIOptions(v []func(*middleware.Stack) error) LoadOptionsFunc { return func(o *LoadOptions) error { if v == nil { return nil } o.APIOptions = append(o.APIOptions, v...) return nil } } func (o LoadOptions) getRetryMaxAttempts(ctx context.Context) (int, bool, error) { if o.RetryMaxAttempts == 0 { return 0, false, nil } return o.RetryMaxAttempts, true, nil } // WithRetryMaxAttempts is a helper function to construct functional options that sets // RetryMaxAttempts on LoadOptions. If RetryMaxAttempts is unset, the RetryMaxAttempts value is // ignored. If multiple WithRetryMaxAttempts calls are made, the last call overrides // the previous call values. // // Will be ignored of LoadOptions.Retryer or WithRetryer are used. func WithRetryMaxAttempts(v int) LoadOptionsFunc { return func(o *LoadOptions) error { o.RetryMaxAttempts = v return nil } } func (o LoadOptions) getRetryMode(ctx context.Context) (aws.RetryMode, bool, error) { if o.RetryMode == "" { return "", false, nil } return o.RetryMode, true, nil } // WithRetryMode is a helper function to construct functional options that sets // RetryMode on LoadOptions. If RetryMode is unset, the RetryMode value is // ignored. If multiple WithRetryMode calls are made, the last call overrides // the previous call values. // // Will be ignored of LoadOptions.Retryer or WithRetryer are used. func WithRetryMode(v aws.RetryMode) LoadOptionsFunc { return func(o *LoadOptions) error { o.RetryMode = v return nil } } func (o LoadOptions) getRetryer(ctx context.Context) (func() aws.Retryer, bool, error) { if o.Retryer == nil { return nil, false, nil } return o.Retryer, true, nil } // WithRetryer is a helper function to construct functional options // that sets Retryer on LoadOptions. If Retryer is set to nil, the // Retryer value is ignored. If multiple WithRetryer calls are // made, the last call overrides the previous call values. func WithRetryer(v func() aws.Retryer) LoadOptionsFunc { return func(o *LoadOptions) error { o.Retryer = v return nil } } func (o LoadOptions) getEndpointResolver(ctx context.Context) (aws.EndpointResolver, bool, error) { if o.EndpointResolver == nil { return nil, false, nil } return o.EndpointResolver, true, nil } // WithEndpointResolver is a helper function to construct functional options // that sets the EndpointResolver on LoadOptions. If the EndpointResolver is set to nil, // the EndpointResolver value is ignored. If multiple WithEndpointResolver calls // are made, the last call overrides the previous call values. // // Deprecated: The global endpoint resolution interface is deprecated. The API // for endpoint resolution is now unique to each service and is set via the // EndpointResolverV2 field on service client options. Use of // WithEndpointResolver or WithEndpointResolverWithOptions will prevent you // from using any endpoint-related service features released after the // introduction of EndpointResolverV2. You may also encounter broken or // unexpected behavior when using the old global interface with services that // use many endpoint-related customizations such as S3. func WithEndpointResolver(v aws.EndpointResolver) LoadOptionsFunc { return func(o *LoadOptions) error { o.EndpointResolver = v return nil } } func (o LoadOptions) getEndpointResolverWithOptions(ctx context.Context) (aws.EndpointResolverWithOptions, bool, error) { if o.EndpointResolverWithOptions == nil { return nil, false, nil } return o.EndpointResolverWithOptions, true, nil } // WithEndpointResolverWithOptions is a helper function to construct functional options // that sets the EndpointResolverWithOptions on LoadOptions. If the EndpointResolverWithOptions is set to nil, // the EndpointResolver value is ignored. If multiple WithEndpointResolver calls // are made, the last call overrides the previous call values. // // Deprecated: The global endpoint resolution interface is deprecated. See // deprecation docs on [WithEndpointResolver]. func WithEndpointResolverWithOptions(v aws.EndpointResolverWithOptions) LoadOptionsFunc { return func(o *LoadOptions) error { o.EndpointResolverWithOptions = v return nil } } func (o LoadOptions) getLogger(ctx context.Context) (logging.Logger, bool, error) { if o.Logger == nil { return nil, false, nil } return o.Logger, true, nil } // WithLogger is a helper function to construct functional options // that sets Logger on LoadOptions. If Logger is set to nil, the // Logger value will be ignored. If multiple WithLogger calls are made, // the last call overrides the previous call values. func WithLogger(v logging.Logger) LoadOptionsFunc { return func(o *LoadOptions) error { o.Logger = v return nil } } func (o LoadOptions) getClientLogMode(ctx context.Context) (aws.ClientLogMode, bool, error) { if o.ClientLogMode == nil { return 0, false, nil } return *o.ClientLogMode, true, nil } // WithClientLogMode is a helper function to construct functional options // that sets client log mode on LoadOptions. If client log mode is set to nil, // the client log mode value will be ignored. If multiple WithClientLogMode calls are made, // the last call overrides the previous call values. func WithClientLogMode(v aws.ClientLogMode) LoadOptionsFunc { return func(o *LoadOptions) error { o.ClientLogMode = &v return nil } } func (o LoadOptions) getLogConfigurationWarnings(ctx context.Context) (v bool, found bool, err error) { if o.LogConfigurationWarnings == nil { return false, false, nil } return *o.LogConfigurationWarnings, true, nil } // WithLogConfigurationWarnings is a helper function to construct // functional options that can be used to set LogConfigurationWarnings // on LoadOptions. // // If multiple WithLogConfigurationWarnings calls are made, the last call // overrides the previous call values. func WithLogConfigurationWarnings(v bool) LoadOptionsFunc { return func(o *LoadOptions) error { o.LogConfigurationWarnings = &v return nil } } // GetS3UseARNRegion returns whether to allow ARNs to direct the region // the S3 client's requests are sent to. func (o LoadOptions) GetS3UseARNRegion(ctx context.Context) (v bool, found bool, err error) { if o.S3UseARNRegion == nil { return false, false, nil } return *o.S3UseARNRegion, true, nil } // WithS3UseARNRegion is a helper function to construct functional options // that can be used to set S3UseARNRegion on LoadOptions. // If multiple WithS3UseARNRegion calls are made, the last call overrides // the previous call values. func WithS3UseARNRegion(v bool) LoadOptionsFunc { return func(o *LoadOptions) error { o.S3UseARNRegion = &v return nil } } // GetS3DisableMultiRegionAccessPoints returns whether to disable // the S3 multi-region access points feature. func (o LoadOptions) GetS3DisableMultiRegionAccessPoints(ctx context.Context) (v bool, found bool, err error) { if o.S3DisableMultiRegionAccessPoints == nil { return false, false, nil } return *o.S3DisableMultiRegionAccessPoints, true, nil } // WithS3DisableMultiRegionAccessPoints is a helper function to construct functional options // that can be used to set S3DisableMultiRegionAccessPoints on LoadOptions. // If multiple WithS3DisableMultiRegionAccessPoints calls are made, the last call overrides // the previous call values. func WithS3DisableMultiRegionAccessPoints(v bool) LoadOptionsFunc { return func(o *LoadOptions) error { o.S3DisableMultiRegionAccessPoints = &v return nil } } // GetEnableEndpointDiscovery returns if the EnableEndpointDiscovery flag is set. func (o LoadOptions) GetEnableEndpointDiscovery(ctx context.Context) (value aws.EndpointDiscoveryEnableState, ok bool, err error) { if o.EnableEndpointDiscovery == aws.EndpointDiscoveryUnset { return aws.EndpointDiscoveryUnset, false, nil } return o.EnableEndpointDiscovery, true, nil } // WithEndpointDiscovery is a helper function to construct functional options // that can be used to enable endpoint discovery on LoadOptions for supported clients. // If multiple WithEndpointDiscovery calls are made, the last call overrides // the previous call values. func WithEndpointDiscovery(v aws.EndpointDiscoveryEnableState) LoadOptionsFunc { return func(o *LoadOptions) error { o.EnableEndpointDiscovery = v return nil } } // getSSOProviderOptions returns AssumeRoleCredentialOptions from LoadOptions func (o LoadOptions) getSSOProviderOptions(context.Context) (func(options *ssocreds.Options), bool, error) { if o.SSOProviderOptions == nil { return nil, false, nil } return o.SSOProviderOptions, true, nil } // WithSSOProviderOptions is a helper function to construct // functional options that sets a function to use ssocreds.Options // on config's LoadOptions. If the SSO credential provider options is set to nil, // the sso provider options value will be ignored. If multiple // WithSSOProviderOptions calls are made, the last call overrides // the previous call values. func WithSSOProviderOptions(v func(*ssocreds.Options)) LoadOptionsFunc { return func(o *LoadOptions) error { o.SSOProviderOptions = v return nil } } // GetEC2IMDSClientEnableState implements a EC2IMDSClientEnableState options resolver interface. func (o LoadOptions) GetEC2IMDSClientEnableState() (imds.ClientEnableState, bool, error) { if o.EC2IMDSClientEnableState == imds.ClientDefaultEnableState { return imds.ClientDefaultEnableState, false, nil } return o.EC2IMDSClientEnableState, true, nil } // GetEC2IMDSEndpointMode implements a EC2IMDSEndpointMode option resolver interface. func (o LoadOptions) GetEC2IMDSEndpointMode() (imds.EndpointModeState, bool, error) { if o.EC2IMDSEndpointMode == imds.EndpointModeStateUnset { return imds.EndpointModeStateUnset, false, nil } return o.EC2IMDSEndpointMode, true, nil } // GetEC2IMDSEndpoint implements a EC2IMDSEndpoint option resolver interface. func (o LoadOptions) GetEC2IMDSEndpoint() (string, bool, error) { if len(o.EC2IMDSEndpoint) == 0 { return "", false, nil } return o.EC2IMDSEndpoint, true, nil } // WithEC2IMDSClientEnableState is a helper function to construct functional options that sets the EC2IMDSClientEnableState. func WithEC2IMDSClientEnableState(v imds.ClientEnableState) LoadOptionsFunc { return func(o *LoadOptions) error { o.EC2IMDSClientEnableState = v return nil } } // WithEC2IMDSEndpointMode is a helper function to construct functional options that sets the EC2IMDSEndpointMode. func WithEC2IMDSEndpointMode(v imds.EndpointModeState) LoadOptionsFunc { return func(o *LoadOptions) error { o.EC2IMDSEndpointMode = v return nil } } // WithEC2IMDSEndpoint is a helper function to construct functional options that sets the EC2IMDSEndpoint. func WithEC2IMDSEndpoint(v string) LoadOptionsFunc { return func(o *LoadOptions) error { o.EC2IMDSEndpoint = v return nil } } // WithUseDualStackEndpoint is a helper function to construct // functional options that can be used to set UseDualStackEndpoint on LoadOptions. func WithUseDualStackEndpoint(v aws.DualStackEndpointState) LoadOptionsFunc { return func(o *LoadOptions) error { o.UseDualStackEndpoint = v return nil } } // GetUseDualStackEndpoint returns whether the service's dual-stack endpoint should be // used for requests. func (o LoadOptions) GetUseDualStackEndpoint(ctx context.Context) (value aws.DualStackEndpointState, found bool, err error) { if o.UseDualStackEndpoint == aws.DualStackEndpointStateUnset { return aws.DualStackEndpointStateUnset, false, nil } return o.UseDualStackEndpoint, true, nil } // WithUseFIPSEndpoint is a helper function to construct // functional options that can be used to set UseFIPSEndpoint on LoadOptions. func WithUseFIPSEndpoint(v aws.FIPSEndpointState) LoadOptionsFunc { return func(o *LoadOptions) error { o.UseFIPSEndpoint = v return nil } } // GetUseFIPSEndpoint returns whether the service's FIPS endpoint should be // used for requests. func (o LoadOptions) GetUseFIPSEndpoint(ctx context.Context) (value aws.FIPSEndpointState, found bool, err error) { if o.UseFIPSEndpoint == aws.FIPSEndpointStateUnset { return aws.FIPSEndpointStateUnset, false, nil } return o.UseFIPSEndpoint, true, nil } // WithDefaultsMode sets the SDK defaults configuration mode to the value provided. // // Zero or more functional options can be provided to provide configuration options for performing // environment discovery when using aws.DefaultsModeAuto. func WithDefaultsMode(mode aws.DefaultsMode, optFns ...func(options *DefaultsModeOptions)) LoadOptionsFunc { do := DefaultsModeOptions{ Mode: mode, } for _, fn := range optFns { fn(&do) } return func(options *LoadOptions) error { options.DefaultsModeOptions = do return nil } } // GetS3DisableExpressAuth returns the configured value for // [EnvConfig.S3DisableExpressAuth]. func (o LoadOptions) GetS3DisableExpressAuth() (value, ok bool) { if o.S3DisableExpressAuth == nil { return false, false } return *o.S3DisableExpressAuth, true } // WithS3DisableExpressAuth sets [LoadOptions.S3DisableExpressAuth] // to the value provided. func WithS3DisableExpressAuth(v bool) LoadOptionsFunc { return func(o *LoadOptions) error { o.S3DisableExpressAuth = &v return nil } } // WithBaseEndpoint is a helper function to construct functional options that // sets BaseEndpoint on config's LoadOptions. Empty values have no effect, and // subsequent calls to this API override previous ones. // // This is an in-code setting, therefore, any value set using this hook takes // precedence over and will override ALL environment and shared config // directives that set endpoint URLs. Functional options on service clients // have higher specificity, and functional options that modify the value of // BaseEndpoint on a client will take precedence over this setting. func WithBaseEndpoint(v string) LoadOptionsFunc { return func(o *LoadOptions) error { o.BaseEndpoint = v return nil } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/local.go ================================================ package config import ( "fmt" "net" "net/url" ) var lookupHostFn = net.LookupHost func isLoopbackHost(host string) (bool, error) { ip := net.ParseIP(host) if ip != nil { return ip.IsLoopback(), nil } // Host is not an ip, perform lookup addrs, err := lookupHostFn(host) if err != nil { return false, err } if len(addrs) == 0 { return false, fmt.Errorf("no addrs found for host, %s", host) } for _, addr := range addrs { if !net.ParseIP(addr).IsLoopback() { return false, nil } } return true, nil } func validateLocalURL(v string) error { u, err := url.Parse(v) if err != nil { return err } host := u.Hostname() if len(host) == 0 { return fmt.Errorf("unable to parse host from local HTTP cred provider URL") } else if isLoopback, err := isLoopbackHost(host); err != nil { return fmt.Errorf("failed to resolve host %q, %v", host, err) } else if !isLoopback { return fmt.Errorf("invalid endpoint host, %q, only host resolving to loopback addresses are allowed", host) } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/provider.go ================================================ package config import ( "context" "io" "net/http" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds" "github.com/aws/aws-sdk-go-v2/credentials/endpointcreds" "github.com/aws/aws-sdk-go-v2/credentials/processcreds" "github.com/aws/aws-sdk-go-v2/credentials/ssocreds" "github.com/aws/aws-sdk-go-v2/credentials/stscreds" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" smithybearer "github.com/aws/smithy-go/auth/bearer" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/middleware" ) // sharedConfigProfileProvider provides access to the shared config profile // name external configuration value. type sharedConfigProfileProvider interface { getSharedConfigProfile(ctx context.Context) (string, bool, error) } // getSharedConfigProfile searches the configs for a sharedConfigProfileProvider // and returns the value if found. Returns an error if a provider fails before a // value is found. func getSharedConfigProfile(ctx context.Context, configs configs) (value string, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(sharedConfigProfileProvider); ok { value, found, err = p.getSharedConfigProfile(ctx) if err != nil || found { break } } } return } // sharedConfigFilesProvider provides access to the shared config filesnames // external configuration value. type sharedConfigFilesProvider interface { getSharedConfigFiles(ctx context.Context) ([]string, bool, error) } // getSharedConfigFiles searches the configs for a sharedConfigFilesProvider // and returns the value if found. Returns an error if a provider fails before a // value is found. func getSharedConfigFiles(ctx context.Context, configs configs) (value []string, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(sharedConfigFilesProvider); ok { value, found, err = p.getSharedConfigFiles(ctx) if err != nil || found { break } } } return } // sharedCredentialsFilesProvider provides access to the shared credentials filesnames // external configuration value. type sharedCredentialsFilesProvider interface { getSharedCredentialsFiles(ctx context.Context) ([]string, bool, error) } // getSharedCredentialsFiles searches the configs for a sharedCredentialsFilesProvider // and returns the value if found. Returns an error if a provider fails before a // value is found. func getSharedCredentialsFiles(ctx context.Context, configs configs) (value []string, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(sharedCredentialsFilesProvider); ok { value, found, err = p.getSharedCredentialsFiles(ctx) if err != nil || found { break } } } return } // customCABundleProvider provides access to the custom CA bundle PEM bytes. type customCABundleProvider interface { getCustomCABundle(ctx context.Context) (io.Reader, bool, error) } // getCustomCABundle searches the configs for a customCABundleProvider // and returns the value if found. Returns an error if a provider fails before a // value is found. func getCustomCABundle(ctx context.Context, configs configs) (value io.Reader, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(customCABundleProvider); ok { value, found, err = p.getCustomCABundle(ctx) if err != nil || found { break } } } return } // regionProvider provides access to the region external configuration value. type regionProvider interface { getRegion(ctx context.Context) (string, bool, error) } // getRegion searches the configs for a regionProvider and returns the value // if found. Returns an error if a provider fails before a value is found. func getRegion(ctx context.Context, configs configs) (value string, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(regionProvider); ok { value, found, err = p.getRegion(ctx) if err != nil || found { break } } } return } // IgnoreConfiguredEndpointsProvider is needed to search for all providers // that provide a flag to disable configured endpoints. type IgnoreConfiguredEndpointsProvider interface { GetIgnoreConfiguredEndpoints(ctx context.Context) (bool, bool, error) } // GetIgnoreConfiguredEndpoints is used in knowing when to disable configured // endpoints feature. func GetIgnoreConfiguredEndpoints(ctx context.Context, configs []interface{}) (value bool, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(IgnoreConfiguredEndpointsProvider); ok { value, found, err = p.GetIgnoreConfiguredEndpoints(ctx) if err != nil || found { break } } } return } type baseEndpointProvider interface { getBaseEndpoint(ctx context.Context) (string, bool, error) } func getBaseEndpoint(ctx context.Context, configs configs) (value string, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(baseEndpointProvider); ok { value, found, err = p.getBaseEndpoint(ctx) if err != nil || found { break } } } return } type servicesObjectProvider interface { getServicesObject(ctx context.Context) (map[string]map[string]string, bool, error) } func getServicesObject(ctx context.Context, configs configs) (value map[string]map[string]string, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(servicesObjectProvider); ok { value, found, err = p.getServicesObject(ctx) if err != nil || found { break } } } return } // appIDProvider provides access to the sdk app ID value type appIDProvider interface { getAppID(ctx context.Context) (string, bool, error) } func getAppID(ctx context.Context, configs configs) (value string, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(appIDProvider); ok { value, found, err = p.getAppID(ctx) if err != nil || found { break } } } return } // disableRequestCompressionProvider provides access to the DisableRequestCompression type disableRequestCompressionProvider interface { getDisableRequestCompression(context.Context) (bool, bool, error) } func getDisableRequestCompression(ctx context.Context, configs configs) (value bool, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(disableRequestCompressionProvider); ok { value, found, err = p.getDisableRequestCompression(ctx) if err != nil || found { break } } } return } // requestMinCompressSizeBytesProvider provides access to the MinCompressSizeBytes type requestMinCompressSizeBytesProvider interface { getRequestMinCompressSizeBytes(context.Context) (int64, bool, error) } func getRequestMinCompressSizeBytes(ctx context.Context, configs configs) (value int64, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(requestMinCompressSizeBytesProvider); ok { value, found, err = p.getRequestMinCompressSizeBytes(ctx) if err != nil || found { break } } } return } // accountIDEndpointModeProvider provides access to the AccountIDEndpointMode type accountIDEndpointModeProvider interface { getAccountIDEndpointMode(context.Context) (aws.AccountIDEndpointMode, bool, error) } func getAccountIDEndpointMode(ctx context.Context, configs configs) (value aws.AccountIDEndpointMode, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(accountIDEndpointModeProvider); ok { value, found, err = p.getAccountIDEndpointMode(ctx) if err != nil || found { break } } } return } // requestChecksumCalculationProvider provides access to the RequestChecksumCalculation type requestChecksumCalculationProvider interface { getRequestChecksumCalculation(context.Context) (aws.RequestChecksumCalculation, bool, error) } func getRequestChecksumCalculation(ctx context.Context, configs configs) (value aws.RequestChecksumCalculation, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(requestChecksumCalculationProvider); ok { value, found, err = p.getRequestChecksumCalculation(ctx) if err != nil || found { break } } } return } // responseChecksumValidationProvider provides access to the ResponseChecksumValidation type responseChecksumValidationProvider interface { getResponseChecksumValidation(context.Context) (aws.ResponseChecksumValidation, bool, error) } func getResponseChecksumValidation(ctx context.Context, configs configs) (value aws.ResponseChecksumValidation, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(responseChecksumValidationProvider); ok { value, found, err = p.getResponseChecksumValidation(ctx) if err != nil || found { break } } } return } // ec2IMDSRegionProvider provides access to the ec2 imds region // configuration value type ec2IMDSRegionProvider interface { getEC2IMDSRegion(ctx context.Context) (string, bool, error) } // getEC2IMDSRegion searches the configs for a ec2IMDSRegionProvider and // returns the value if found. Returns an error if a provider fails before // a value is found. func getEC2IMDSRegion(ctx context.Context, configs configs) (region string, found bool, err error) { for _, cfg := range configs { if provider, ok := cfg.(ec2IMDSRegionProvider); ok { region, found, err = provider.getEC2IMDSRegion(ctx) if err != nil || found { break } } } return } // credentialsProviderProvider provides access to the credentials external // configuration value. type credentialsProviderProvider interface { getCredentialsProvider(ctx context.Context) (aws.CredentialsProvider, bool, error) } // getCredentialsProvider searches the configs for a credentialsProviderProvider // and returns the value if found. Returns an error if a provider fails before a // value is found. func getCredentialsProvider(ctx context.Context, configs configs) (p aws.CredentialsProvider, found bool, err error) { for _, cfg := range configs { if provider, ok := cfg.(credentialsProviderProvider); ok { p, found, err = provider.getCredentialsProvider(ctx) if err != nil || found { break } } } return } // credentialsCacheOptionsProvider is an interface for retrieving a function for setting // the aws.CredentialsCacheOptions. type credentialsCacheOptionsProvider interface { getCredentialsCacheOptions(ctx context.Context) (func(*aws.CredentialsCacheOptions), bool, error) } // getCredentialsCacheOptionsProvider is an interface for retrieving a function for setting // the aws.CredentialsCacheOptions. func getCredentialsCacheOptionsProvider(ctx context.Context, configs configs) ( f func(*aws.CredentialsCacheOptions), found bool, err error, ) { for _, config := range configs { if p, ok := config.(credentialsCacheOptionsProvider); ok { f, found, err = p.getCredentialsCacheOptions(ctx) if err != nil || found { break } } } return } // bearerAuthTokenProviderProvider provides access to the bearer authentication // token external configuration value. type bearerAuthTokenProviderProvider interface { getBearerAuthTokenProvider(context.Context) (smithybearer.TokenProvider, bool, error) } // getBearerAuthTokenProvider searches the config sources for a // bearerAuthTokenProviderProvider and returns the value if found. Returns an // error if a provider fails before a value is found. func getBearerAuthTokenProvider(ctx context.Context, configs configs) (p smithybearer.TokenProvider, found bool, err error) { for _, cfg := range configs { if provider, ok := cfg.(bearerAuthTokenProviderProvider); ok { p, found, err = provider.getBearerAuthTokenProvider(ctx) if err != nil || found { break } } } return } // bearerAuthTokenCacheOptionsProvider is an interface for retrieving a function for // setting the smithy-go auth/bearer#TokenCacheOptions. type bearerAuthTokenCacheOptionsProvider interface { getBearerAuthTokenCacheOptions(context.Context) (func(*smithybearer.TokenCacheOptions), bool, error) } // getBearerAuthTokenCacheOptionsProvider is an interface for retrieving a function for // setting the smithy-go auth/bearer#TokenCacheOptions. func getBearerAuthTokenCacheOptions(ctx context.Context, configs configs) ( f func(*smithybearer.TokenCacheOptions), found bool, err error, ) { for _, config := range configs { if p, ok := config.(bearerAuthTokenCacheOptionsProvider); ok { f, found, err = p.getBearerAuthTokenCacheOptions(ctx) if err != nil || found { break } } } return } // ssoTokenProviderOptionsProvider is an interface for retrieving a function for // setting the SDK's credentials/ssocreds#SSOTokenProviderOptions. type ssoTokenProviderOptionsProvider interface { getSSOTokenProviderOptions(context.Context) (func(*ssocreds.SSOTokenProviderOptions), bool, error) } // getSSOTokenProviderOptions is an interface for retrieving a function for // setting the SDK's credentials/ssocreds#SSOTokenProviderOptions. func getSSOTokenProviderOptions(ctx context.Context, configs configs) ( f func(*ssocreds.SSOTokenProviderOptions), found bool, err error, ) { for _, config := range configs { if p, ok := config.(ssoTokenProviderOptionsProvider); ok { f, found, err = p.getSSOTokenProviderOptions(ctx) if err != nil || found { break } } } return } // ssoTokenProviderOptionsProvider // processCredentialOptions is an interface for retrieving a function for setting // the processcreds.Options. type processCredentialOptions interface { getProcessCredentialOptions(ctx context.Context) (func(*processcreds.Options), bool, error) } // getProcessCredentialOptions searches the slice of configs and returns the first function found func getProcessCredentialOptions(ctx context.Context, configs configs) (f func(*processcreds.Options), found bool, err error) { for _, config := range configs { if p, ok := config.(processCredentialOptions); ok { f, found, err = p.getProcessCredentialOptions(ctx) if err != nil || found { break } } } return } // ec2RoleCredentialOptionsProvider is an interface for retrieving a function // for setting the ec2rolecreds.Provider options. type ec2RoleCredentialOptionsProvider interface { getEC2RoleCredentialOptions(ctx context.Context) (func(*ec2rolecreds.Options), bool, error) } // getEC2RoleCredentialProviderOptions searches the slice of configs and returns the first function found func getEC2RoleCredentialProviderOptions(ctx context.Context, configs configs) (f func(*ec2rolecreds.Options), found bool, err error) { for _, config := range configs { if p, ok := config.(ec2RoleCredentialOptionsProvider); ok { f, found, err = p.getEC2RoleCredentialOptions(ctx) if err != nil || found { break } } } return } // defaultRegionProvider is an interface for retrieving a default region if a region was not resolved from other sources type defaultRegionProvider interface { getDefaultRegion(ctx context.Context) (string, bool, error) } // getDefaultRegion searches the slice of configs and returns the first fallback region found func getDefaultRegion(ctx context.Context, configs configs) (value string, found bool, err error) { for _, config := range configs { if p, ok := config.(defaultRegionProvider); ok { value, found, err = p.getDefaultRegion(ctx) if err != nil || found { break } } } return } // endpointCredentialOptionsProvider is an interface for retrieving a function for setting // the endpointcreds.ProviderOptions. type endpointCredentialOptionsProvider interface { getEndpointCredentialOptions(ctx context.Context) (func(*endpointcreds.Options), bool, error) } // getEndpointCredentialProviderOptions searches the slice of configs and returns the first function found func getEndpointCredentialProviderOptions(ctx context.Context, configs configs) (f func(*endpointcreds.Options), found bool, err error) { for _, config := range configs { if p, ok := config.(endpointCredentialOptionsProvider); ok { f, found, err = p.getEndpointCredentialOptions(ctx) if err != nil || found { break } } } return } // webIdentityRoleCredentialOptionsProvider is an interface for retrieving a function for setting // the stscreds.WebIdentityRoleProvider. type webIdentityRoleCredentialOptionsProvider interface { getWebIdentityRoleCredentialOptions(ctx context.Context) (func(*stscreds.WebIdentityRoleOptions), bool, error) } // getWebIdentityCredentialProviderOptions searches the slice of configs and returns the first function found func getWebIdentityCredentialProviderOptions(ctx context.Context, configs configs) (f func(*stscreds.WebIdentityRoleOptions), found bool, err error) { for _, config := range configs { if p, ok := config.(webIdentityRoleCredentialOptionsProvider); ok { f, found, err = p.getWebIdentityRoleCredentialOptions(ctx) if err != nil || found { break } } } return } // assumeRoleCredentialOptionsProvider is an interface for retrieving a function for setting // the stscreds.AssumeRoleOptions. type assumeRoleCredentialOptionsProvider interface { getAssumeRoleCredentialOptions(ctx context.Context) (func(*stscreds.AssumeRoleOptions), bool, error) } // getAssumeRoleCredentialProviderOptions searches the slice of configs and returns the first function found func getAssumeRoleCredentialProviderOptions(ctx context.Context, configs configs) (f func(*stscreds.AssumeRoleOptions), found bool, err error) { for _, config := range configs { if p, ok := config.(assumeRoleCredentialOptionsProvider); ok { f, found, err = p.getAssumeRoleCredentialOptions(ctx) if err != nil || found { break } } } return } // HTTPClient is an HTTP client implementation type HTTPClient interface { Do(*http.Request) (*http.Response, error) } // httpClientProvider is an interface for retrieving HTTPClient type httpClientProvider interface { getHTTPClient(ctx context.Context) (HTTPClient, bool, error) } // getHTTPClient searches the slice of configs and returns the HTTPClient set on configs func getHTTPClient(ctx context.Context, configs configs) (client HTTPClient, found bool, err error) { for _, config := range configs { if p, ok := config.(httpClientProvider); ok { client, found, err = p.getHTTPClient(ctx) if err != nil || found { break } } } return } // apiOptionsProvider is an interface for retrieving APIOptions type apiOptionsProvider interface { getAPIOptions(ctx context.Context) ([]func(*middleware.Stack) error, bool, error) } // getAPIOptions searches the slice of configs and returns the APIOptions set on configs func getAPIOptions(ctx context.Context, configs configs) (apiOptions []func(*middleware.Stack) error, found bool, err error) { for _, config := range configs { if p, ok := config.(apiOptionsProvider); ok { // retrieve APIOptions from configs and set it on cfg apiOptions, found, err = p.getAPIOptions(ctx) if err != nil || found { break } } } return } // endpointResolverProvider is an interface for retrieving an aws.EndpointResolver from a configuration source type endpointResolverProvider interface { getEndpointResolver(ctx context.Context) (aws.EndpointResolver, bool, error) } // getEndpointResolver searches the provided config sources for a EndpointResolverFunc that can be used // to configure the aws.Config.EndpointResolver value. func getEndpointResolver(ctx context.Context, configs configs) (f aws.EndpointResolver, found bool, err error) { for _, c := range configs { if p, ok := c.(endpointResolverProvider); ok { f, found, err = p.getEndpointResolver(ctx) if err != nil || found { break } } } return } // endpointResolverWithOptionsProvider is an interface for retrieving an aws.EndpointResolverWithOptions from a configuration source type endpointResolverWithOptionsProvider interface { getEndpointResolverWithOptions(ctx context.Context) (aws.EndpointResolverWithOptions, bool, error) } // getEndpointResolver searches the provided config sources for a EndpointResolverFunc that can be used // to configure the aws.Config.EndpointResolver value. func getEndpointResolverWithOptions(ctx context.Context, configs configs) (f aws.EndpointResolverWithOptions, found bool, err error) { for _, c := range configs { if p, ok := c.(endpointResolverWithOptionsProvider); ok { f, found, err = p.getEndpointResolverWithOptions(ctx) if err != nil || found { break } } } return } // loggerProvider is an interface for retrieving a logging.Logger from a configuration source. type loggerProvider interface { getLogger(ctx context.Context) (logging.Logger, bool, error) } // getLogger searches the provided config sources for a logging.Logger that can be used // to configure the aws.Config.Logger value. func getLogger(ctx context.Context, configs configs) (l logging.Logger, found bool, err error) { for _, c := range configs { if p, ok := c.(loggerProvider); ok { l, found, err = p.getLogger(ctx) if err != nil || found { break } } } return } // clientLogModeProvider is an interface for retrieving the aws.ClientLogMode from a configuration source. type clientLogModeProvider interface { getClientLogMode(ctx context.Context) (aws.ClientLogMode, bool, error) } func getClientLogMode(ctx context.Context, configs configs) (m aws.ClientLogMode, found bool, err error) { for _, c := range configs { if p, ok := c.(clientLogModeProvider); ok { m, found, err = p.getClientLogMode(ctx) if err != nil || found { break } } } return } // retryProvider is an configuration provider for custom Retryer. type retryProvider interface { getRetryer(ctx context.Context) (func() aws.Retryer, bool, error) } func getRetryer(ctx context.Context, configs configs) (v func() aws.Retryer, found bool, err error) { for _, c := range configs { if p, ok := c.(retryProvider); ok { v, found, err = p.getRetryer(ctx) if err != nil || found { break } } } return } // logConfigurationWarningsProvider is an configuration provider for // retrieving a boolean indicating whether configuration issues should // be logged when loading from config sources type logConfigurationWarningsProvider interface { getLogConfigurationWarnings(ctx context.Context) (bool, bool, error) } func getLogConfigurationWarnings(ctx context.Context, configs configs) (v bool, found bool, err error) { for _, c := range configs { if p, ok := c.(logConfigurationWarningsProvider); ok { v, found, err = p.getLogConfigurationWarnings(ctx) if err != nil || found { break } } } return } // ssoCredentialOptionsProvider is an interface for retrieving a function for setting // the ssocreds.Options. type ssoCredentialOptionsProvider interface { getSSOProviderOptions(context.Context) (func(*ssocreds.Options), bool, error) } func getSSOProviderOptions(ctx context.Context, configs configs) (v func(options *ssocreds.Options), found bool, err error) { for _, c := range configs { if p, ok := c.(ssoCredentialOptionsProvider); ok { v, found, err = p.getSSOProviderOptions(ctx) if err != nil || found { break } } } return v, found, err } type defaultsModeIMDSClientProvider interface { getDefaultsModeIMDSClient(context.Context) (*imds.Client, bool, error) } func getDefaultsModeIMDSClient(ctx context.Context, configs configs) (v *imds.Client, found bool, err error) { for _, c := range configs { if p, ok := c.(defaultsModeIMDSClientProvider); ok { v, found, err = p.getDefaultsModeIMDSClient(ctx) if err != nil || found { break } } } return v, found, err } type defaultsModeProvider interface { getDefaultsMode(context.Context) (aws.DefaultsMode, bool, error) } func getDefaultsMode(ctx context.Context, configs configs) (v aws.DefaultsMode, found bool, err error) { for _, c := range configs { if p, ok := c.(defaultsModeProvider); ok { v, found, err = p.getDefaultsMode(ctx) if err != nil || found { break } } } return v, found, err } type retryMaxAttemptsProvider interface { GetRetryMaxAttempts(context.Context) (int, bool, error) } func getRetryMaxAttempts(ctx context.Context, configs configs) (v int, found bool, err error) { for _, c := range configs { if p, ok := c.(retryMaxAttemptsProvider); ok { v, found, err = p.GetRetryMaxAttempts(ctx) if err != nil || found { break } } } return v, found, err } type retryModeProvider interface { GetRetryMode(context.Context) (aws.RetryMode, bool, error) } func getRetryMode(ctx context.Context, configs configs) (v aws.RetryMode, found bool, err error) { for _, c := range configs { if p, ok := c.(retryModeProvider); ok { v, found, err = p.GetRetryMode(ctx) if err != nil || found { break } } } return v, found, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/resolve.go ================================================ package config import ( "context" "crypto/tls" "crypto/x509" "fmt" "io/ioutil" "net/http" "os" "github.com/aws/aws-sdk-go-v2/aws" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" "github.com/aws/smithy-go/logging" ) // resolveDefaultAWSConfig will write default configuration values into the cfg // value. It will write the default values, overwriting any previous value. // // This should be used as the first resolver in the slice of resolvers when // resolving external configuration. func resolveDefaultAWSConfig(ctx context.Context, cfg *aws.Config, cfgs configs) error { var sources []interface{} for _, s := range cfgs { sources = append(sources, s) } *cfg = aws.Config{ Logger: logging.NewStandardLogger(os.Stderr), ConfigSources: sources, } return nil } // resolveCustomCABundle extracts the first instance of a custom CA bundle filename // from the external configurations. It will update the HTTP Client's builder // to be configured with the custom CA bundle. // // Config provider used: // * customCABundleProvider func resolveCustomCABundle(ctx context.Context, cfg *aws.Config, cfgs configs) error { pemCerts, found, err := getCustomCABundle(ctx, cfgs) if err != nil { // TODO error handling, What is the best way to handle this? // capture previous errors continue. error out if all errors return err } if !found { return nil } if cfg.HTTPClient == nil { cfg.HTTPClient = awshttp.NewBuildableClient() } trOpts, ok := cfg.HTTPClient.(*awshttp.BuildableClient) if !ok { return fmt.Errorf("unable to add custom RootCAs HTTPClient, "+ "has no WithTransportOptions, %T", cfg.HTTPClient) } var appendErr error client := trOpts.WithTransportOptions(func(tr *http.Transport) { if tr.TLSClientConfig == nil { tr.TLSClientConfig = &tls.Config{} } if tr.TLSClientConfig.RootCAs == nil { tr.TLSClientConfig.RootCAs = x509.NewCertPool() } b, err := ioutil.ReadAll(pemCerts) if err != nil { appendErr = fmt.Errorf("failed to read custom CA bundle PEM file") } if !tr.TLSClientConfig.RootCAs.AppendCertsFromPEM(b) { appendErr = fmt.Errorf("failed to load custom CA bundle PEM file") } }) if appendErr != nil { return appendErr } cfg.HTTPClient = client return err } // resolveRegion extracts the first instance of a Region from the configs slice. // // Config providers used: // * regionProvider func resolveRegion(ctx context.Context, cfg *aws.Config, configs configs) error { v, found, err := getRegion(ctx, configs) if err != nil { // TODO error handling, What is the best way to handle this? // capture previous errors continue. error out if all errors return err } if !found { return nil } cfg.Region = v return nil } func resolveBaseEndpoint(ctx context.Context, cfg *aws.Config, configs configs) error { var downcastCfgSources []interface{} for _, cs := range configs { downcastCfgSources = append(downcastCfgSources, interface{}(cs)) } if val, found, err := GetIgnoreConfiguredEndpoints(ctx, downcastCfgSources); found && val && err == nil { cfg.BaseEndpoint = nil return nil } v, found, err := getBaseEndpoint(ctx, configs) if err != nil { return err } if !found { return nil } cfg.BaseEndpoint = aws.String(v) return nil } // resolveAppID extracts the sdk app ID from the configs slice's SharedConfig or env var func resolveAppID(ctx context.Context, cfg *aws.Config, configs configs) error { ID, _, err := getAppID(ctx, configs) if err != nil { return err } cfg.AppID = ID return nil } // resolveDisableRequestCompression extracts the DisableRequestCompression from the configs slice's // SharedConfig or EnvConfig func resolveDisableRequestCompression(ctx context.Context, cfg *aws.Config, configs configs) error { disable, _, err := getDisableRequestCompression(ctx, configs) if err != nil { return err } cfg.DisableRequestCompression = disable return nil } // resolveRequestMinCompressSizeBytes extracts the RequestMinCompressSizeBytes from the configs slice's // SharedConfig or EnvConfig func resolveRequestMinCompressSizeBytes(ctx context.Context, cfg *aws.Config, configs configs) error { minBytes, found, err := getRequestMinCompressSizeBytes(ctx, configs) if err != nil { return err } // must set a default min size 10240 if not configured if !found { minBytes = 10240 } cfg.RequestMinCompressSizeBytes = minBytes return nil } // resolveAccountIDEndpointMode extracts the AccountIDEndpointMode from the configs slice's // SharedConfig or EnvConfig func resolveAccountIDEndpointMode(ctx context.Context, cfg *aws.Config, configs configs) error { m, found, err := getAccountIDEndpointMode(ctx, configs) if err != nil { return err } if !found { m = aws.AccountIDEndpointModePreferred } cfg.AccountIDEndpointMode = m return nil } // resolveRequestChecksumCalculation extracts the RequestChecksumCalculation from the configs slice's // SharedConfig or EnvConfig func resolveRequestChecksumCalculation(ctx context.Context, cfg *aws.Config, configs configs) error { c, found, err := getRequestChecksumCalculation(ctx, configs) if err != nil { return err } if !found { c = aws.RequestChecksumCalculationWhenSupported } cfg.RequestChecksumCalculation = c return nil } // resolveResponseValidation extracts the ResponseChecksumValidation from the configs slice's // SharedConfig or EnvConfig func resolveResponseChecksumValidation(ctx context.Context, cfg *aws.Config, configs configs) error { c, found, err := getResponseChecksumValidation(ctx, configs) if err != nil { return err } if !found { c = aws.ResponseChecksumValidationWhenSupported } cfg.ResponseChecksumValidation = c return nil } // resolveDefaultRegion extracts the first instance of a default region and sets `aws.Config.Region` to the default // region if region had not been resolved from other sources. func resolveDefaultRegion(ctx context.Context, cfg *aws.Config, configs configs) error { if len(cfg.Region) > 0 { return nil } v, found, err := getDefaultRegion(ctx, configs) if err != nil { return err } if !found { return nil } cfg.Region = v return nil } // resolveHTTPClient extracts the first instance of a HTTPClient and sets `aws.Config.HTTPClient` to the HTTPClient instance // if one has not been resolved from other sources. func resolveHTTPClient(ctx context.Context, cfg *aws.Config, configs configs) error { c, found, err := getHTTPClient(ctx, configs) if err != nil { return err } if !found { return nil } cfg.HTTPClient = c return nil } // resolveAPIOptions extracts the first instance of APIOptions and sets `aws.Config.APIOptions` to the resolved API options // if one has not been resolved from other sources. func resolveAPIOptions(ctx context.Context, cfg *aws.Config, configs configs) error { o, found, err := getAPIOptions(ctx, configs) if err != nil { return err } if !found { return nil } cfg.APIOptions = o return nil } // resolveEndpointResolver extracts the first instance of a EndpointResolverFunc from the config slice // and sets the functions result on the aws.Config.EndpointResolver func resolveEndpointResolver(ctx context.Context, cfg *aws.Config, configs configs) error { endpointResolver, found, err := getEndpointResolver(ctx, configs) if err != nil { return err } if !found { return nil } cfg.EndpointResolver = endpointResolver return nil } // resolveEndpointResolver extracts the first instance of a EndpointResolverFunc from the config slice // and sets the functions result on the aws.Config.EndpointResolver func resolveEndpointResolverWithOptions(ctx context.Context, cfg *aws.Config, configs configs) error { endpointResolver, found, err := getEndpointResolverWithOptions(ctx, configs) if err != nil { return err } if !found { return nil } cfg.EndpointResolverWithOptions = endpointResolver return nil } func resolveLogger(ctx context.Context, cfg *aws.Config, configs configs) error { logger, found, err := getLogger(ctx, configs) if err != nil { return err } if !found { return nil } cfg.Logger = logger return nil } func resolveClientLogMode(ctx context.Context, cfg *aws.Config, configs configs) error { mode, found, err := getClientLogMode(ctx, configs) if err != nil { return err } if !found { return nil } cfg.ClientLogMode = mode return nil } func resolveRetryer(ctx context.Context, cfg *aws.Config, configs configs) error { retryer, found, err := getRetryer(ctx, configs) if err != nil { return err } if found { cfg.Retryer = retryer return nil } // Only load the retry options if a custom retryer has not be specified. if err = resolveRetryMaxAttempts(ctx, cfg, configs); err != nil { return err } return resolveRetryMode(ctx, cfg, configs) } func resolveEC2IMDSRegion(ctx context.Context, cfg *aws.Config, configs configs) error { if len(cfg.Region) > 0 { return nil } region, found, err := getEC2IMDSRegion(ctx, configs) if err != nil { return err } if !found { return nil } cfg.Region = region return nil } func resolveDefaultsModeOptions(ctx context.Context, cfg *aws.Config, configs configs) error { defaultsMode, found, err := getDefaultsMode(ctx, configs) if err != nil { return err } if !found { defaultsMode = aws.DefaultsModeLegacy } var environment aws.RuntimeEnvironment if defaultsMode == aws.DefaultsModeAuto { envConfig, _, _ := getAWSConfigSources(configs) client, found, err := getDefaultsModeIMDSClient(ctx, configs) if err != nil { return err } if !found { client = imds.NewFromConfig(*cfg) } environment, err = resolveDefaultsModeRuntimeEnvironment(ctx, envConfig, client) if err != nil { return err } } cfg.DefaultsMode = defaultsMode cfg.RuntimeEnvironment = environment return nil } func resolveRetryMaxAttempts(ctx context.Context, cfg *aws.Config, configs configs) error { maxAttempts, found, err := getRetryMaxAttempts(ctx, configs) if err != nil || !found { return err } cfg.RetryMaxAttempts = maxAttempts return nil } func resolveRetryMode(ctx context.Context, cfg *aws.Config, configs configs) error { retryMode, found, err := getRetryMode(ctx, configs) if err != nil || !found { return err } cfg.RetryMode = retryMode return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/resolve_bearer_token.go ================================================ package config import ( "context" "fmt" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/credentials/ssocreds" "github.com/aws/aws-sdk-go-v2/service/ssooidc" smithybearer "github.com/aws/smithy-go/auth/bearer" ) // resolveBearerAuthToken extracts a token provider from the config sources. // // If an explicit bearer authentication token provider is not found the // resolver will fallback to resolving token provider via other config sources // such as SharedConfig. func resolveBearerAuthToken(ctx context.Context, cfg *aws.Config, configs configs) error { found, err := resolveBearerAuthTokenProvider(ctx, cfg, configs) if found || err != nil { return err } return resolveBearerAuthTokenProviderChain(ctx, cfg, configs) } // resolveBearerAuthTokenProvider extracts the first instance of // BearerAuthTokenProvider from the config sources. // // The resolved BearerAuthTokenProvider will be wrapped in a cache to ensure // the Token is only refreshed when needed. This also protects the // TokenProvider so it can be used concurrently. // // Config providers used: // * bearerAuthTokenProviderProvider func resolveBearerAuthTokenProvider(ctx context.Context, cfg *aws.Config, configs configs) (bool, error) { tokenProvider, found, err := getBearerAuthTokenProvider(ctx, configs) if !found || err != nil { return false, err } cfg.BearerAuthTokenProvider, err = wrapWithBearerAuthTokenCache( ctx, configs, tokenProvider) if err != nil { return false, err } return true, nil } func resolveBearerAuthTokenProviderChain(ctx context.Context, cfg *aws.Config, configs configs) (err error) { _, sharedConfig, _ := getAWSConfigSources(configs) var provider smithybearer.TokenProvider if sharedConfig.SSOSession != nil { provider, err = resolveBearerAuthSSOTokenProvider( ctx, cfg, sharedConfig.SSOSession, configs) } if err == nil && provider != nil { cfg.BearerAuthTokenProvider, err = wrapWithBearerAuthTokenCache( ctx, configs, provider) } return err } func resolveBearerAuthSSOTokenProvider(ctx context.Context, cfg *aws.Config, session *SSOSession, configs configs) (*ssocreds.SSOTokenProvider, error) { ssoTokenProviderOptionsFn, found, err := getSSOTokenProviderOptions(ctx, configs) if err != nil { return nil, fmt.Errorf("failed to get SSOTokenProviderOptions from config sources, %w", err) } var optFns []func(*ssocreds.SSOTokenProviderOptions) if found { optFns = append(optFns, ssoTokenProviderOptionsFn) } cachePath, err := ssocreds.StandardCachedTokenFilepath(session.Name) if err != nil { return nil, fmt.Errorf("failed to get SSOTokenProvider's cache path, %w", err) } client := ssooidc.NewFromConfig(*cfg) provider := ssocreds.NewSSOTokenProvider(client, cachePath, optFns...) return provider, nil } // wrapWithBearerAuthTokenCache will wrap provider with an smithy-go // bearer/auth#TokenCache with the provided options if the provider is not // already a TokenCache. func wrapWithBearerAuthTokenCache( ctx context.Context, cfgs configs, provider smithybearer.TokenProvider, optFns ...func(*smithybearer.TokenCacheOptions), ) (smithybearer.TokenProvider, error) { _, ok := provider.(*smithybearer.TokenCache) if ok { return provider, nil } tokenCacheConfigOptions, optionsFound, err := getBearerAuthTokenCacheOptions(ctx, cfgs) if err != nil { return nil, err } opts := make([]func(*smithybearer.TokenCacheOptions), 0, 2+len(optFns)) opts = append(opts, func(o *smithybearer.TokenCacheOptions) { o.RefreshBeforeExpires = 5 * time.Minute o.RetrieveBearerTokenTimeout = 30 * time.Second }) opts = append(opts, optFns...) if optionsFound { opts = append(opts, tokenCacheConfigOptions) } return smithybearer.NewTokenCache(provider, opts...), nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go ================================================ package config import ( "context" "fmt" "io/ioutil" "net" "net/url" "os" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds" "github.com/aws/aws-sdk-go-v2/credentials/endpointcreds" "github.com/aws/aws-sdk-go-v2/credentials/processcreds" "github.com/aws/aws-sdk-go-v2/credentials/ssocreds" "github.com/aws/aws-sdk-go-v2/credentials/stscreds" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" "github.com/aws/aws-sdk-go-v2/service/sso" "github.com/aws/aws-sdk-go-v2/service/ssooidc" "github.com/aws/aws-sdk-go-v2/service/sts" ) const ( // valid credential source values credSourceEc2Metadata = "Ec2InstanceMetadata" credSourceEnvironment = "Environment" credSourceECSContainer = "EcsContainer" httpProviderAuthFileEnvVar = "AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE" ) // direct representation of the IPv4 address for the ECS container // "169.254.170.2" var ecsContainerIPv4 net.IP = []byte{ 169, 254, 170, 2, } // direct representation of the IPv4 address for the EKS container // "169.254.170.23" var eksContainerIPv4 net.IP = []byte{ 169, 254, 170, 23, } // direct representation of the IPv6 address for the EKS container // "fd00:ec2::23" var eksContainerIPv6 net.IP = []byte{ 0xFD, 0, 0xE, 0xC2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x23, } var ( ecsContainerEndpoint = "http://169.254.170.2" // not constant to allow for swapping during unit-testing ) // resolveCredentials extracts a credential provider from slice of config // sources. // // If an explicit credential provider is not found the resolver will fallback // to resolving credentials by extracting a credential provider from EnvConfig // and SharedConfig. func resolveCredentials(ctx context.Context, cfg *aws.Config, configs configs) error { found, err := resolveCredentialProvider(ctx, cfg, configs) if found || err != nil { return err } return resolveCredentialChain(ctx, cfg, configs) } // resolveCredentialProvider extracts the first instance of Credentials from the // config slices. // // The resolved CredentialProvider will be wrapped in a cache to ensure the // credentials are only refreshed when needed. This also protects the // credential provider to be used concurrently. // // Config providers used: // * credentialsProviderProvider func resolveCredentialProvider(ctx context.Context, cfg *aws.Config, configs configs) (bool, error) { credProvider, found, err := getCredentialsProvider(ctx, configs) if !found || err != nil { return false, err } cfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, credProvider) if err != nil { return false, err } return true, nil } // resolveCredentialChain resolves a credential provider chain using EnvConfig // and SharedConfig if present in the slice of provided configs. // // The resolved CredentialProvider will be wrapped in a cache to ensure the // credentials are only refreshed when needed. This also protects the // credential provider to be used concurrently. func resolveCredentialChain(ctx context.Context, cfg *aws.Config, configs configs) (err error) { envConfig, sharedConfig, other := getAWSConfigSources(configs) // When checking if a profile was specified programmatically we should only consider the "other" // configuration sources that have been provided. This ensures we correctly honor the expected credential // hierarchy. _, sharedProfileSet, err := getSharedConfigProfile(ctx, other) if err != nil { return err } switch { case sharedProfileSet: ctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig, other) case envConfig.Credentials.HasKeys(): ctx = addCredentialSource(ctx, aws.CredentialSourceEnvVars) cfg.Credentials = credentials.StaticCredentialsProvider{Value: envConfig.Credentials, Source: getCredentialSources(ctx)} case len(envConfig.WebIdentityTokenFilePath) > 0: ctx = addCredentialSource(ctx, aws.CredentialSourceEnvVarsSTSWebIDToken) err = assumeWebIdentity(ctx, cfg, envConfig.WebIdentityTokenFilePath, envConfig.RoleARN, envConfig.RoleSessionName, configs) default: ctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig, other) } if err != nil { return err } // Wrap the resolved provider in a cache so the SDK will cache credentials. cfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, cfg.Credentials) if err != nil { return err } return nil } func resolveCredsFromProfile(ctx context.Context, cfg *aws.Config, envConfig *EnvConfig, sharedConfig *SharedConfig, configs configs) (ctx2 context.Context, err error) { switch { case sharedConfig.Source != nil: ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSourceProfile) // Assume IAM role with credentials source from a different profile. ctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig.Source, configs) case sharedConfig.Credentials.HasKeys(): // Static Credentials from Shared Config/Credentials file. ctx = addCredentialSource(ctx, aws.CredentialSourceProfile) cfg.Credentials = credentials.StaticCredentialsProvider{ Value: sharedConfig.Credentials, Source: getCredentialSources(ctx), } case len(sharedConfig.CredentialSource) != 0: ctx = addCredentialSource(ctx, aws.CredentialSourceProfileNamedProvider) ctx, err = resolveCredsFromSource(ctx, cfg, envConfig, sharedConfig, configs) case len(sharedConfig.WebIdentityTokenFile) != 0: // Credentials from Assume Web Identity token require an IAM Role, and // that roll will be assumed. May be wrapped with another assume role // via SourceProfile. ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSTSWebIDToken) return ctx, assumeWebIdentity(ctx, cfg, sharedConfig.WebIdentityTokenFile, sharedConfig.RoleARN, sharedConfig.RoleSessionName, configs) case sharedConfig.hasSSOConfiguration(): if sharedConfig.hasLegacySSOConfiguration() { ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSSOLegacy) ctx = addCredentialSource(ctx, aws.CredentialSourceSSOLegacy) } else { ctx = addCredentialSource(ctx, aws.CredentialSourceSSO) } if sharedConfig.SSOSession != nil { ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSSO) } err = resolveSSOCredentials(ctx, cfg, sharedConfig, configs) case len(sharedConfig.CredentialProcess) != 0: // Get credentials from CredentialProcess ctx = addCredentialSource(ctx, aws.CredentialSourceProfileProcess) ctx = addCredentialSource(ctx, aws.CredentialSourceProcess) err = processCredentials(ctx, cfg, sharedConfig, configs) case len(envConfig.ContainerCredentialsRelativePath) != 0: ctx = addCredentialSource(ctx, aws.CredentialSourceHTTP) err = resolveHTTPCredProvider(ctx, cfg, ecsContainerURI(envConfig.ContainerCredentialsRelativePath), envConfig.ContainerAuthorizationToken, configs) case len(envConfig.ContainerCredentialsEndpoint) != 0: ctx = addCredentialSource(ctx, aws.CredentialSourceHTTP) err = resolveLocalHTTPCredProvider(ctx, cfg, envConfig.ContainerCredentialsEndpoint, envConfig.ContainerAuthorizationToken, configs) default: ctx = addCredentialSource(ctx, aws.CredentialSourceIMDS) err = resolveEC2RoleCredentials(ctx, cfg, configs) } if err != nil { return ctx, err } if len(sharedConfig.RoleARN) > 0 { return ctx, credsFromAssumeRole(ctx, cfg, sharedConfig, configs) } return ctx, nil } func resolveSSOCredentials(ctx context.Context, cfg *aws.Config, sharedConfig *SharedConfig, configs configs) error { if err := sharedConfig.validateSSOConfiguration(); err != nil { return err } var options []func(*ssocreds.Options) v, found, err := getSSOProviderOptions(ctx, configs) if err != nil { return err } if found { options = append(options, v) } cfgCopy := cfg.Copy() options = append(options, func(o *ssocreds.Options) { o.CredentialSources = getCredentialSources(ctx) }) if sharedConfig.SSOSession != nil { ssoTokenProviderOptionsFn, found, err := getSSOTokenProviderOptions(ctx, configs) if err != nil { return fmt.Errorf("failed to get SSOTokenProviderOptions from config sources, %w", err) } var optFns []func(*ssocreds.SSOTokenProviderOptions) if found { optFns = append(optFns, ssoTokenProviderOptionsFn) } cfgCopy.Region = sharedConfig.SSOSession.SSORegion cachedPath, err := ssocreds.StandardCachedTokenFilepath(sharedConfig.SSOSession.Name) if err != nil { return err } oidcClient := ssooidc.NewFromConfig(cfgCopy) tokenProvider := ssocreds.NewSSOTokenProvider(oidcClient, cachedPath, optFns...) options = append(options, func(o *ssocreds.Options) { o.SSOTokenProvider = tokenProvider o.CachedTokenFilepath = cachedPath }) } else { cfgCopy.Region = sharedConfig.SSORegion } cfg.Credentials = ssocreds.New(sso.NewFromConfig(cfgCopy), sharedConfig.SSOAccountID, sharedConfig.SSORoleName, sharedConfig.SSOStartURL, options...) return nil } func ecsContainerURI(path string) string { return fmt.Sprintf("%s%s", ecsContainerEndpoint, path) } func processCredentials(ctx context.Context, cfg *aws.Config, sharedConfig *SharedConfig, configs configs) error { var opts []func(*processcreds.Options) options, found, err := getProcessCredentialOptions(ctx, configs) if err != nil { return err } if found { opts = append(opts, options) } opts = append(opts, func(o *processcreds.Options) { o.CredentialSources = getCredentialSources(ctx) }) cfg.Credentials = processcreds.NewProvider(sharedConfig.CredentialProcess, opts...) return nil } // isAllowedHost allows host to be loopback or known ECS/EKS container IPs // // host can either be an IP address OR an unresolved hostname - resolution will // be automatically performed in the latter case func isAllowedHost(host string) (bool, error) { if ip := net.ParseIP(host); ip != nil { return isIPAllowed(ip), nil } addrs, err := lookupHostFn(host) if err != nil { return false, err } for _, addr := range addrs { if ip := net.ParseIP(addr); ip == nil || !isIPAllowed(ip) { return false, nil } } return true, nil } func isIPAllowed(ip net.IP) bool { return ip.IsLoopback() || ip.Equal(ecsContainerIPv4) || ip.Equal(eksContainerIPv4) || ip.Equal(eksContainerIPv6) } func resolveLocalHTTPCredProvider(ctx context.Context, cfg *aws.Config, endpointURL, authToken string, configs configs) error { var resolveErr error parsed, err := url.Parse(endpointURL) if err != nil { resolveErr = fmt.Errorf("invalid URL, %w", err) } else { host := parsed.Hostname() if len(host) == 0 { resolveErr = fmt.Errorf("unable to parse host from local HTTP cred provider URL") } else if parsed.Scheme == "http" { if isAllowedHost, allowHostErr := isAllowedHost(host); allowHostErr != nil { resolveErr = fmt.Errorf("failed to resolve host %q, %v", host, allowHostErr) } else if !isAllowedHost { resolveErr = fmt.Errorf("invalid endpoint host, %q, only loopback/ecs/eks hosts are allowed", host) } } } if resolveErr != nil { return resolveErr } return resolveHTTPCredProvider(ctx, cfg, endpointURL, authToken, configs) } func resolveHTTPCredProvider(ctx context.Context, cfg *aws.Config, url, authToken string, configs configs) error { optFns := []func(*endpointcreds.Options){ func(options *endpointcreds.Options) { if len(authToken) != 0 { options.AuthorizationToken = authToken } if authFilePath := os.Getenv(httpProviderAuthFileEnvVar); authFilePath != "" { options.AuthorizationTokenProvider = endpointcreds.TokenProviderFunc(func() (string, error) { var contents []byte var err error if contents, err = ioutil.ReadFile(authFilePath); err != nil { return "", fmt.Errorf("failed to read authorization token from %v: %v", authFilePath, err) } return string(contents), nil }) } options.APIOptions = cfg.APIOptions if cfg.Retryer != nil { options.Retryer = cfg.Retryer() } options.CredentialSources = getCredentialSources(ctx) }, } optFn, found, err := getEndpointCredentialProviderOptions(ctx, configs) if err != nil { return err } if found { optFns = append(optFns, optFn) } provider := endpointcreds.New(url, optFns...) cfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, provider, func(options *aws.CredentialsCacheOptions) { options.ExpiryWindow = 5 * time.Minute }) if err != nil { return err } return nil } func resolveCredsFromSource(ctx context.Context, cfg *aws.Config, envConfig *EnvConfig, sharedCfg *SharedConfig, configs configs) (context.Context, error) { switch sharedCfg.CredentialSource { case credSourceEc2Metadata: ctx = addCredentialSource(ctx, aws.CredentialSourceIMDS) return ctx, resolveEC2RoleCredentials(ctx, cfg, configs) case credSourceEnvironment: ctx = addCredentialSource(ctx, aws.CredentialSourceHTTP) cfg.Credentials = credentials.StaticCredentialsProvider{Value: envConfig.Credentials, Source: getCredentialSources(ctx)} case credSourceECSContainer: ctx = addCredentialSource(ctx, aws.CredentialSourceHTTP) if len(envConfig.ContainerCredentialsRelativePath) != 0 { return ctx, resolveHTTPCredProvider(ctx, cfg, ecsContainerURI(envConfig.ContainerCredentialsRelativePath), envConfig.ContainerAuthorizationToken, configs) } if len(envConfig.ContainerCredentialsEndpoint) != 0 { return ctx, resolveLocalHTTPCredProvider(ctx, cfg, envConfig.ContainerCredentialsEndpoint, envConfig.ContainerAuthorizationToken, configs) } return ctx, fmt.Errorf("EcsContainer was specified as the credential_source, but neither 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' or AWS_CONTAINER_CREDENTIALS_FULL_URI' was set") default: return ctx, fmt.Errorf("credential_source values must be EcsContainer, Ec2InstanceMetadata, or Environment") } return ctx, nil } func resolveEC2RoleCredentials(ctx context.Context, cfg *aws.Config, configs configs) error { optFns := make([]func(*ec2rolecreds.Options), 0, 2) optFn, found, err := getEC2RoleCredentialProviderOptions(ctx, configs) if err != nil { return err } if found { optFns = append(optFns, optFn) } optFns = append(optFns, func(o *ec2rolecreds.Options) { // Only define a client from config if not already defined. if o.Client == nil { o.Client = imds.NewFromConfig(*cfg) } o.CredentialSources = getCredentialSources(ctx) }) provider := ec2rolecreds.New(optFns...) cfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, provider) if err != nil { return err } return nil } func getAWSConfigSources(cfgs configs) (*EnvConfig, *SharedConfig, configs) { var ( envConfig *EnvConfig sharedConfig *SharedConfig other configs ) for i := range cfgs { switch c := cfgs[i].(type) { case EnvConfig: if envConfig == nil { envConfig = &c } case *EnvConfig: if envConfig == nil { envConfig = c } case SharedConfig: if sharedConfig == nil { sharedConfig = &c } case *SharedConfig: if envConfig == nil { sharedConfig = c } default: other = append(other, c) } } if envConfig == nil { envConfig = &EnvConfig{} } if sharedConfig == nil { sharedConfig = &SharedConfig{} } return envConfig, sharedConfig, other } // AssumeRoleTokenProviderNotSetError is an error returned when creating a // session when the MFAToken option is not set when shared config is configured // load assume a role with an MFA token. type AssumeRoleTokenProviderNotSetError struct{} // Error is the error message func (e AssumeRoleTokenProviderNotSetError) Error() string { return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.") } func assumeWebIdentity(ctx context.Context, cfg *aws.Config, filepath string, roleARN, sessionName string, configs configs) error { if len(filepath) == 0 { return fmt.Errorf("token file path is not set") } optFns := []func(*stscreds.WebIdentityRoleOptions){ func(options *stscreds.WebIdentityRoleOptions) { options.RoleSessionName = sessionName }, } optFn, found, err := getWebIdentityCredentialProviderOptions(ctx, configs) if err != nil { return err } if found { optFns = append(optFns, optFn) } opts := stscreds.WebIdentityRoleOptions{ RoleARN: roleARN, } optFns = append(optFns, func(options *stscreds.WebIdentityRoleOptions) { options.CredentialSources = getCredentialSources(ctx) }) for _, fn := range optFns { fn(&opts) } if len(opts.RoleARN) == 0 { return fmt.Errorf("role ARN is not set") } client := opts.Client if client == nil { client = sts.NewFromConfig(*cfg) } provider := stscreds.NewWebIdentityRoleProvider(client, roleARN, stscreds.IdentityTokenFile(filepath), optFns...) cfg.Credentials = provider return nil } func credsFromAssumeRole(ctx context.Context, cfg *aws.Config, sharedCfg *SharedConfig, configs configs) (err error) { // resolve credentials early credentialSources := getCredentialSources(ctx) optFns := []func(*stscreds.AssumeRoleOptions){ func(options *stscreds.AssumeRoleOptions) { options.RoleSessionName = sharedCfg.RoleSessionName if sharedCfg.RoleDurationSeconds != nil { if *sharedCfg.RoleDurationSeconds/time.Minute > 15 { options.Duration = *sharedCfg.RoleDurationSeconds } } // Assume role with external ID if len(sharedCfg.ExternalID) > 0 { options.ExternalID = aws.String(sharedCfg.ExternalID) } // Assume role with MFA if len(sharedCfg.MFASerial) != 0 { options.SerialNumber = aws.String(sharedCfg.MFASerial) } // add existing credential chain options.CredentialSources = credentialSources }, } optFn, found, err := getAssumeRoleCredentialProviderOptions(ctx, configs) if err != nil { return err } if found { optFns = append(optFns, optFn) } { // Synthesize options early to validate configuration errors sooner to ensure a token provider // is present if the SerialNumber was set. var o stscreds.AssumeRoleOptions for _, fn := range optFns { fn(&o) } if o.TokenProvider == nil && o.SerialNumber != nil { return AssumeRoleTokenProviderNotSetError{} } } cfg.Credentials = stscreds.NewAssumeRoleProvider(sts.NewFromConfig(*cfg), sharedCfg.RoleARN, optFns...) return nil } // wrapWithCredentialsCache will wrap provider with an aws.CredentialsCache // with the provided options if the provider is not already a // aws.CredentialsCache. func wrapWithCredentialsCache( ctx context.Context, cfgs configs, provider aws.CredentialsProvider, optFns ...func(options *aws.CredentialsCacheOptions), ) (aws.CredentialsProvider, error) { _, ok := provider.(*aws.CredentialsCache) if ok { return provider, nil } credCacheOptions, optionsFound, err := getCredentialsCacheOptionsProvider(ctx, cfgs) if err != nil { return nil, err } // force allocation of a new slice if the additional options are // needed, to prevent overwriting the passed in slice of options. optFns = optFns[:len(optFns):len(optFns)] if optionsFound { optFns = append(optFns, credCacheOptions) } return aws.NewCredentialsCache(provider, optFns...), nil } // credentialSource stores the chain of providers that was used to create an instance of // a credentials provider on the context type credentialSource struct{} func addCredentialSource(ctx context.Context, source aws.CredentialSource) context.Context { existing, ok := ctx.Value(credentialSource{}).([]aws.CredentialSource) if !ok { existing = []aws.CredentialSource{source} } else { existing = append(existing, source) } return context.WithValue(ctx, credentialSource{}, existing) } func getCredentialSources(ctx context.Context) []aws.CredentialSource { return ctx.Value(credentialSource{}).([]aws.CredentialSource) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go ================================================ package config import ( "bytes" "context" "errors" "fmt" "io" "io/ioutil" "os" "path/filepath" "strings" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" "github.com/aws/aws-sdk-go-v2/internal/ini" "github.com/aws/aws-sdk-go-v2/internal/shareddefaults" "github.com/aws/smithy-go/logging" smithyrequestcompression "github.com/aws/smithy-go/private/requestcompression" ) const ( // Prefix to use for filtering profiles. The profile prefix should only // exist in the shared config file, not the credentials file. profilePrefix = `profile ` // Prefix to be used for SSO sections. These are supposed to only exist in // the shared config file, not the credentials file. ssoSectionPrefix = `sso-session ` // Prefix for services section. It is referenced in profile via the services // parameter to configure clients for service-specific parameters. servicesPrefix = `services ` // string equivalent for boolean endpointDiscoveryDisabled = `false` endpointDiscoveryEnabled = `true` endpointDiscoveryAuto = `auto` // Static Credentials group accessKeyIDKey = `aws_access_key_id` // group required secretAccessKey = `aws_secret_access_key` // group required sessionTokenKey = `aws_session_token` // optional // Assume Role Credentials group roleArnKey = `role_arn` // group required sourceProfileKey = `source_profile` // group required credentialSourceKey = `credential_source` // group required (or source_profile) externalIDKey = `external_id` // optional mfaSerialKey = `mfa_serial` // optional roleSessionNameKey = `role_session_name` // optional roleDurationSecondsKey = "duration_seconds" // optional // AWS Single Sign-On (AWS SSO) group ssoSessionNameKey = "sso_session" ssoRegionKey = "sso_region" ssoStartURLKey = "sso_start_url" ssoAccountIDKey = "sso_account_id" ssoRoleNameKey = "sso_role_name" // Additional Config fields regionKey = `region` // endpoint discovery group enableEndpointDiscoveryKey = `endpoint_discovery_enabled` // optional // External Credential process credentialProcessKey = `credential_process` // optional // Web Identity Token File webIdentityTokenFileKey = `web_identity_token_file` // optional // S3 ARN Region Usage s3UseARNRegionKey = "s3_use_arn_region" ec2MetadataServiceEndpointModeKey = "ec2_metadata_service_endpoint_mode" ec2MetadataServiceEndpointKey = "ec2_metadata_service_endpoint" ec2MetadataV1DisabledKey = "ec2_metadata_v1_disabled" // Use DualStack Endpoint Resolution useDualStackEndpoint = "use_dualstack_endpoint" // DefaultSharedConfigProfile is the default profile to be used when // loading configuration from the config files if another profile name // is not provided. DefaultSharedConfigProfile = `default` // S3 Disable Multi-Region AccessPoints s3DisableMultiRegionAccessPointsKey = `s3_disable_multiregion_access_points` useFIPSEndpointKey = "use_fips_endpoint" defaultsModeKey = "defaults_mode" // Retry options retryMaxAttemptsKey = "max_attempts" retryModeKey = "retry_mode" caBundleKey = "ca_bundle" sdkAppID = "sdk_ua_app_id" ignoreConfiguredEndpoints = "ignore_configured_endpoint_urls" endpointURL = "endpoint_url" servicesSectionKey = "services" disableRequestCompression = "disable_request_compression" requestMinCompressionSizeBytes = "request_min_compression_size_bytes" s3DisableExpressSessionAuthKey = "s3_disable_express_session_auth" accountIDKey = "aws_account_id" accountIDEndpointMode = "account_id_endpoint_mode" requestChecksumCalculationKey = "request_checksum_calculation" responseChecksumValidationKey = "response_checksum_validation" checksumWhenSupported = "when_supported" checksumWhenRequired = "when_required" ) // defaultSharedConfigProfile allows for swapping the default profile for testing var defaultSharedConfigProfile = DefaultSharedConfigProfile // DefaultSharedCredentialsFilename returns the SDK's default file path // for the shared credentials file. // // Builds the shared config file path based on the OS's platform. // // - Linux/Unix: $HOME/.aws/credentials // - Windows: %USERPROFILE%\.aws\credentials func DefaultSharedCredentialsFilename() string { return filepath.Join(shareddefaults.UserHomeDir(), ".aws", "credentials") } // DefaultSharedConfigFilename returns the SDK's default file path for // the shared config file. // // Builds the shared config file path based on the OS's platform. // // - Linux/Unix: $HOME/.aws/config // - Windows: %USERPROFILE%\.aws\config func DefaultSharedConfigFilename() string { return filepath.Join(shareddefaults.UserHomeDir(), ".aws", "config") } // DefaultSharedConfigFiles is a slice of the default shared config files that // the will be used in order to load the SharedConfig. var DefaultSharedConfigFiles = []string{ DefaultSharedConfigFilename(), } // DefaultSharedCredentialsFiles is a slice of the default shared credentials // files that the will be used in order to load the SharedConfig. var DefaultSharedCredentialsFiles = []string{ DefaultSharedCredentialsFilename(), } // SSOSession provides the shared configuration parameters of the sso-session // section. type SSOSession struct { Name string SSORegion string SSOStartURL string } func (s *SSOSession) setFromIniSection(section ini.Section) { updateString(&s.Name, section, ssoSessionNameKey) updateString(&s.SSORegion, section, ssoRegionKey) updateString(&s.SSOStartURL, section, ssoStartURLKey) } // Services contains values configured in the services section // of the AWS configuration file. type Services struct { // Services section values // {"serviceId": {"key": "value"}} // e.g. {"s3": {"endpoint_url": "example.com"}} ServiceValues map[string]map[string]string } func (s *Services) setFromIniSection(section ini.Section) { if s.ServiceValues == nil { s.ServiceValues = make(map[string]map[string]string) } for _, service := range section.List() { s.ServiceValues[service] = section.Map(service) } } // SharedConfig represents the configuration fields of the SDK config files. type SharedConfig struct { Profile string // Credentials values from the config file. Both aws_access_key_id // and aws_secret_access_key must be provided together in the same file // to be considered valid. The values will be ignored if not a complete group. // aws_session_token is an optional field that can be provided if both of the // other two fields are also provided. // // aws_access_key_id // aws_secret_access_key // aws_session_token Credentials aws.Credentials CredentialSource string CredentialProcess string WebIdentityTokenFile string // SSO session options SSOSessionName string SSOSession *SSOSession // Legacy SSO session options SSORegion string SSOStartURL string // SSO fields not used SSOAccountID string SSORoleName string RoleARN string ExternalID string MFASerial string RoleSessionName string RoleDurationSeconds *time.Duration SourceProfileName string Source *SharedConfig // Region is the region the SDK should use for looking up AWS service endpoints // and signing requests. // // region = us-west-2 Region string // EnableEndpointDiscovery can be enabled or disabled in the shared config // by setting endpoint_discovery_enabled to true, or false respectively. // // endpoint_discovery_enabled = true EnableEndpointDiscovery aws.EndpointDiscoveryEnableState // Specifies if the S3 service should allow ARNs to direct the region // the client's requests are sent to. // // s3_use_arn_region=true S3UseARNRegion *bool // Specifies the EC2 Instance Metadata Service default endpoint selection // mode (IPv4 or IPv6) // // ec2_metadata_service_endpoint_mode=IPv6 EC2IMDSEndpointMode imds.EndpointModeState // Specifies the EC2 Instance Metadata Service endpoint to use. If // specified it overrides EC2IMDSEndpointMode. // // ec2_metadata_service_endpoint=http://fd00:ec2::254 EC2IMDSEndpoint string // Specifies that IMDS clients should not fallback to IMDSv1 if token // requests fail. // // ec2_metadata_v1_disabled=true EC2IMDSv1Disabled *bool // Specifies if the S3 service should disable support for Multi-Region // access-points // // s3_disable_multiregion_access_points=true S3DisableMultiRegionAccessPoints *bool // Specifies that SDK clients must resolve a dual-stack endpoint for // services. // // use_dualstack_endpoint=true UseDualStackEndpoint aws.DualStackEndpointState // Specifies that SDK clients must resolve a FIPS endpoint for // services. // // use_fips_endpoint=true UseFIPSEndpoint aws.FIPSEndpointState // Specifies which defaults mode should be used by services. // // defaults_mode=standard DefaultsMode aws.DefaultsMode // Specifies the maximum number attempts an API client will call an // operation that fails with a retryable error. // // max_attempts=3 RetryMaxAttempts int // Specifies the retry model the API client will be created with. // // retry_mode=standard RetryMode aws.RetryMode // Sets the path to a custom Credentials Authority (CA) Bundle PEM file // that the SDK will use instead of the system's root CA bundle. Only use // this if you want to configure the SDK to use a custom set of CAs. // // Enabling this option will attempt to merge the Transport into the SDK's // HTTP client. If the client's Transport is not a http.Transport an error // will be returned. If the Transport's TLS config is set this option will // cause the SDK to overwrite the Transport's TLS config's RootCAs value. // // Setting a custom HTTPClient in the aws.Config options will override this // setting. To use this option and custom HTTP client, the HTTP client // needs to be provided when creating the config. Not the service client. // // ca_bundle=$HOME/my_custom_ca_bundle CustomCABundle string // aws sdk app ID that can be added to user agent header string AppID string // Flag used to disable configured endpoints. IgnoreConfiguredEndpoints *bool // Value to contain configured endpoints to be propagated to // corresponding endpoint resolution field. BaseEndpoint string // Services section config. ServicesSectionName string Services Services // determine if request compression is allowed, default to false // retrieved from config file's profile field disable_request_compression DisableRequestCompression *bool // inclusive threshold request body size to trigger compression, // default to 10240 and must be within 0 and 10485760 bytes inclusive // retrieved from config file's profile field request_min_compression_size_bytes RequestMinCompressSizeBytes *int64 // Whether S3Express auth is disabled. // // This will NOT prevent requests from being made to S3Express buckets, it // will only bypass the modified endpoint routing and signing behaviors // associated with the feature. S3DisableExpressAuth *bool AccountIDEndpointMode aws.AccountIDEndpointMode // RequestChecksumCalculation indicates if the request checksum should be calculated RequestChecksumCalculation aws.RequestChecksumCalculation // ResponseChecksumValidation indicates if the response checksum should be validated ResponseChecksumValidation aws.ResponseChecksumValidation } func (c SharedConfig) getDefaultsMode(ctx context.Context) (value aws.DefaultsMode, ok bool, err error) { if len(c.DefaultsMode) == 0 { return "", false, nil } return c.DefaultsMode, true, nil } // GetRetryMaxAttempts returns the maximum number of attempts an API client // created Retryer should attempt an operation call before failing. func (c SharedConfig) GetRetryMaxAttempts(ctx context.Context) (value int, ok bool, err error) { if c.RetryMaxAttempts == 0 { return 0, false, nil } return c.RetryMaxAttempts, true, nil } // GetRetryMode returns the model the API client should create its Retryer in. func (c SharedConfig) GetRetryMode(ctx context.Context) (value aws.RetryMode, ok bool, err error) { if len(c.RetryMode) == 0 { return "", false, nil } return c.RetryMode, true, nil } // GetS3UseARNRegion returns if the S3 service should allow ARNs to direct the region // the client's requests are sent to. func (c SharedConfig) GetS3UseARNRegion(ctx context.Context) (value, ok bool, err error) { if c.S3UseARNRegion == nil { return false, false, nil } return *c.S3UseARNRegion, true, nil } // GetEnableEndpointDiscovery returns if the enable_endpoint_discovery is set. func (c SharedConfig) GetEnableEndpointDiscovery(ctx context.Context) (value aws.EndpointDiscoveryEnableState, ok bool, err error) { if c.EnableEndpointDiscovery == aws.EndpointDiscoveryUnset { return aws.EndpointDiscoveryUnset, false, nil } return c.EnableEndpointDiscovery, true, nil } // GetS3DisableMultiRegionAccessPoints returns if the S3 service should disable support for Multi-Region // access-points. func (c SharedConfig) GetS3DisableMultiRegionAccessPoints(ctx context.Context) (value, ok bool, err error) { if c.S3DisableMultiRegionAccessPoints == nil { return false, false, nil } return *c.S3DisableMultiRegionAccessPoints, true, nil } // GetRegion returns the region for the profile if a region is set. func (c SharedConfig) getRegion(ctx context.Context) (string, bool, error) { if len(c.Region) == 0 { return "", false, nil } return c.Region, true, nil } // GetCredentialsProvider returns the credentials for a profile if they were set. func (c SharedConfig) getCredentialsProvider() (aws.Credentials, bool, error) { return c.Credentials, true, nil } // GetEC2IMDSEndpointMode implements a EC2IMDSEndpointMode option resolver interface. func (c SharedConfig) GetEC2IMDSEndpointMode() (imds.EndpointModeState, bool, error) { if c.EC2IMDSEndpointMode == imds.EndpointModeStateUnset { return imds.EndpointModeStateUnset, false, nil } return c.EC2IMDSEndpointMode, true, nil } // GetEC2IMDSEndpoint implements a EC2IMDSEndpoint option resolver interface. func (c SharedConfig) GetEC2IMDSEndpoint() (string, bool, error) { if len(c.EC2IMDSEndpoint) == 0 { return "", false, nil } return c.EC2IMDSEndpoint, true, nil } // GetEC2IMDSV1FallbackDisabled implements an EC2IMDSV1FallbackDisabled option // resolver interface. func (c SharedConfig) GetEC2IMDSV1FallbackDisabled() (bool, bool) { if c.EC2IMDSv1Disabled == nil { return false, false } return *c.EC2IMDSv1Disabled, true } // GetUseDualStackEndpoint returns whether the service's dual-stack endpoint should be // used for requests. func (c SharedConfig) GetUseDualStackEndpoint(ctx context.Context) (value aws.DualStackEndpointState, found bool, err error) { if c.UseDualStackEndpoint == aws.DualStackEndpointStateUnset { return aws.DualStackEndpointStateUnset, false, nil } return c.UseDualStackEndpoint, true, nil } // GetUseFIPSEndpoint returns whether the service's FIPS endpoint should be // used for requests. func (c SharedConfig) GetUseFIPSEndpoint(ctx context.Context) (value aws.FIPSEndpointState, found bool, err error) { if c.UseFIPSEndpoint == aws.FIPSEndpointStateUnset { return aws.FIPSEndpointStateUnset, false, nil } return c.UseFIPSEndpoint, true, nil } // GetS3DisableExpressAuth returns the configured value for // [SharedConfig.S3DisableExpressAuth]. func (c SharedConfig) GetS3DisableExpressAuth() (value, ok bool) { if c.S3DisableExpressAuth == nil { return false, false } return *c.S3DisableExpressAuth, true } // GetCustomCABundle returns the custom CA bundle's PEM bytes if the file was func (c SharedConfig) getCustomCABundle(context.Context) (io.Reader, bool, error) { if len(c.CustomCABundle) == 0 { return nil, false, nil } b, err := ioutil.ReadFile(c.CustomCABundle) if err != nil { return nil, false, err } return bytes.NewReader(b), true, nil } // getAppID returns the sdk app ID if set in shared config profile func (c SharedConfig) getAppID(context.Context) (string, bool, error) { return c.AppID, len(c.AppID) > 0, nil } // GetIgnoreConfiguredEndpoints is used in knowing when to disable configured // endpoints feature. func (c SharedConfig) GetIgnoreConfiguredEndpoints(context.Context) (bool, bool, error) { if c.IgnoreConfiguredEndpoints == nil { return false, false, nil } return *c.IgnoreConfiguredEndpoints, true, nil } func (c SharedConfig) getBaseEndpoint(context.Context) (string, bool, error) { return c.BaseEndpoint, len(c.BaseEndpoint) > 0, nil } // GetServiceBaseEndpoint is used to retrieve a normalized SDK ID for use // with configured endpoints. func (c SharedConfig) GetServiceBaseEndpoint(ctx context.Context, sdkID string) (string, bool, error) { if service, ok := c.Services.ServiceValues[normalizeShared(sdkID)]; ok { if endpt, ok := service[endpointURL]; ok { return endpt, true, nil } } return "", false, nil } func normalizeShared(sdkID string) string { lower := strings.ToLower(sdkID) return strings.ReplaceAll(lower, " ", "_") } func (c SharedConfig) getServicesObject(context.Context) (map[string]map[string]string, bool, error) { return c.Services.ServiceValues, c.Services.ServiceValues != nil, nil } // loadSharedConfigIgnoreNotExist is an alias for loadSharedConfig with the // addition of ignoring when none of the files exist or when the profile // is not found in any of the files. func loadSharedConfigIgnoreNotExist(ctx context.Context, configs configs) (Config, error) { cfg, err := loadSharedConfig(ctx, configs) if err != nil { if _, ok := err.(SharedConfigProfileNotExistError); ok { return SharedConfig{}, nil } return nil, err } return cfg, nil } // loadSharedConfig uses the configs passed in to load the SharedConfig from file // The file names and profile name are sourced from the configs. // // If profile name is not provided DefaultSharedConfigProfile (default) will // be used. // // If shared config filenames are not provided DefaultSharedConfigFiles will // be used. // // Config providers used: // * sharedConfigProfileProvider // * sharedConfigFilesProvider func loadSharedConfig(ctx context.Context, configs configs) (Config, error) { var profile string var configFiles []string var credentialsFiles []string var ok bool var err error profile, ok, err = getSharedConfigProfile(ctx, configs) if err != nil { return nil, err } if !ok { profile = defaultSharedConfigProfile } configFiles, ok, err = getSharedConfigFiles(ctx, configs) if err != nil { return nil, err } credentialsFiles, ok, err = getSharedCredentialsFiles(ctx, configs) if err != nil { return nil, err } // setup logger if log configuration warning is seti var logger logging.Logger logWarnings, found, err := getLogConfigurationWarnings(ctx, configs) if err != nil { return SharedConfig{}, err } if found && logWarnings { logger, found, err = getLogger(ctx, configs) if err != nil { return SharedConfig{}, err } if !found { logger = logging.NewStandardLogger(os.Stderr) } } return LoadSharedConfigProfile(ctx, profile, func(o *LoadSharedConfigOptions) { o.Logger = logger o.ConfigFiles = configFiles o.CredentialsFiles = credentialsFiles }, ) } // LoadSharedConfigOptions struct contains optional values that can be used to load the config. type LoadSharedConfigOptions struct { // CredentialsFiles are the shared credentials files CredentialsFiles []string // ConfigFiles are the shared config files ConfigFiles []string // Logger is the logger used to log shared config behavior Logger logging.Logger } // LoadSharedConfigProfile retrieves the configuration from the list of files // using the profile provided. The order the files are listed will determine // precedence. Values in subsequent files will overwrite values defined in // earlier files. // // For example, given two files A and B. Both define credentials. If the order // of the files are A then B, B's credential values will be used instead of A's. // // If config files are not set, SDK will default to using a file at location `.aws/config` if present. // If credentials files are not set, SDK will default to using a file at location `.aws/credentials` if present. // No default files are set, if files set to an empty slice. // // You can read more about shared config and credentials file location at // https://docs.aws.amazon.com/credref/latest/refdocs/file-location.html#file-location func LoadSharedConfigProfile(ctx context.Context, profile string, optFns ...func(*LoadSharedConfigOptions)) (SharedConfig, error) { var option LoadSharedConfigOptions for _, fn := range optFns { fn(&option) } if option.ConfigFiles == nil { option.ConfigFiles = DefaultSharedConfigFiles } if option.CredentialsFiles == nil { option.CredentialsFiles = DefaultSharedCredentialsFiles } // load shared configuration sections from shared configuration INI options configSections, err := loadIniFiles(option.ConfigFiles) if err != nil { return SharedConfig{}, err } // check for profile prefix and drop duplicates or invalid profiles err = processConfigSections(ctx, &configSections, option.Logger) if err != nil { return SharedConfig{}, err } // load shared credentials sections from shared credentials INI options credentialsSections, err := loadIniFiles(option.CredentialsFiles) if err != nil { return SharedConfig{}, err } // check for profile prefix and drop duplicates or invalid profiles err = processCredentialsSections(ctx, &credentialsSections, option.Logger) if err != nil { return SharedConfig{}, err } err = mergeSections(&configSections, credentialsSections) if err != nil { return SharedConfig{}, err } cfg := SharedConfig{} profiles := map[string]struct{}{} if err = cfg.setFromIniSections(profiles, profile, configSections, option.Logger); err != nil { return SharedConfig{}, err } return cfg, nil } func processConfigSections(ctx context.Context, sections *ini.Sections, logger logging.Logger) error { skipSections := map[string]struct{}{} for _, section := range sections.List() { if _, ok := skipSections[section]; ok { continue } // drop sections from config file that do not have expected prefixes. switch { case strings.HasPrefix(section, profilePrefix): // Rename sections to remove "profile " prefixing to match with // credentials file. If default is already present, it will be // dropped. newName, err := renameProfileSection(section, sections, logger) if err != nil { return fmt.Errorf("failed to rename profile section, %w", err) } skipSections[newName] = struct{}{} case strings.HasPrefix(section, ssoSectionPrefix): case strings.HasPrefix(section, servicesPrefix): case strings.EqualFold(section, "default"): default: // drop this section, as invalid profile name sections.DeleteSection(section) if logger != nil { logger.Logf(logging.Debug, "A profile defined with name `%v` is ignored. "+ "For use within a shared configuration file, "+ "a non-default profile must have `profile ` "+ "prefixed to the profile name.", section, ) } } } return nil } func renameProfileSection(section string, sections *ini.Sections, logger logging.Logger) (string, error) { v, ok := sections.GetSection(section) if !ok { return "", fmt.Errorf("error processing profiles within the shared configuration files") } // delete section with profile as prefix sections.DeleteSection(section) // set the value to non-prefixed name in sections. section = strings.TrimPrefix(section, profilePrefix) if sections.HasSection(section) { oldSection, _ := sections.GetSection(section) v.Logs = append(v.Logs, fmt.Sprintf("A non-default profile not prefixed with `profile ` found in %s, "+ "overriding non-default profile from %s", v.SourceFile, oldSection.SourceFile)) sections.DeleteSection(section) } // assign non-prefixed name to section v.Name = section sections.SetSection(section, v) return section, nil } func processCredentialsSections(ctx context.Context, sections *ini.Sections, logger logging.Logger) error { for _, section := range sections.List() { // drop profiles with prefix for credential files if strings.HasPrefix(section, profilePrefix) { // drop this section, as invalid profile name sections.DeleteSection(section) if logger != nil { logger.Logf(logging.Debug, "The profile defined with name `%v` is ignored. A profile with the `profile ` prefix is invalid "+ "for the shared credentials file.\n", section, ) } } } return nil } func loadIniFiles(filenames []string) (ini.Sections, error) { mergedSections := ini.NewSections() for _, filename := range filenames { sections, err := ini.OpenFile(filename) var v *ini.UnableToReadFile if ok := errors.As(err, &v); ok { // Skip files which can't be opened and read for whatever reason. // We treat such files as empty, and do not fall back to other locations. continue } else if err != nil { return ini.Sections{}, SharedConfigLoadError{Filename: filename, Err: err} } // mergeSections into mergedSections err = mergeSections(&mergedSections, sections) if err != nil { return ini.Sections{}, SharedConfigLoadError{Filename: filename, Err: err} } } return mergedSections, nil } // mergeSections merges source section properties into destination section properties func mergeSections(dst *ini.Sections, src ini.Sections) error { for _, sectionName := range src.List() { srcSection, _ := src.GetSection(sectionName) if (!srcSection.Has(accessKeyIDKey) && srcSection.Has(secretAccessKey)) || (srcSection.Has(accessKeyIDKey) && !srcSection.Has(secretAccessKey)) { srcSection.Errors = append(srcSection.Errors, fmt.Errorf("partial credentials found for profile %v", sectionName)) } if !dst.HasSection(sectionName) { dst.SetSection(sectionName, srcSection) continue } // merge with destination srcSection dstSection, _ := dst.GetSection(sectionName) // errors should be overriden if any dstSection.Errors = srcSection.Errors // Access key id update if srcSection.Has(accessKeyIDKey) && srcSection.Has(secretAccessKey) { accessKey := srcSection.String(accessKeyIDKey) secretKey := srcSection.String(secretAccessKey) if dstSection.Has(accessKeyIDKey) { dstSection.Logs = append(dstSection.Logs, newMergeKeyLogMessage(sectionName, accessKeyIDKey, dstSection.SourceFile[accessKeyIDKey], srcSection.SourceFile[accessKeyIDKey])) } // update access key v, err := ini.NewStringValue(accessKey) if err != nil { return fmt.Errorf("error merging access key, %w", err) } dstSection.UpdateValue(accessKeyIDKey, v) // update secret key v, err = ini.NewStringValue(secretKey) if err != nil { return fmt.Errorf("error merging secret key, %w", err) } dstSection.UpdateValue(secretAccessKey, v) // update session token if err = mergeStringKey(&srcSection, &dstSection, sectionName, sessionTokenKey); err != nil { return err } // update source file to reflect where the static creds came from dstSection.UpdateSourceFile(accessKeyIDKey, srcSection.SourceFile[accessKeyIDKey]) dstSection.UpdateSourceFile(secretAccessKey, srcSection.SourceFile[secretAccessKey]) } stringKeys := []string{ roleArnKey, sourceProfileKey, credentialSourceKey, externalIDKey, mfaSerialKey, roleSessionNameKey, regionKey, enableEndpointDiscoveryKey, credentialProcessKey, webIdentityTokenFileKey, s3UseARNRegionKey, s3DisableMultiRegionAccessPointsKey, ec2MetadataServiceEndpointModeKey, ec2MetadataServiceEndpointKey, ec2MetadataV1DisabledKey, useDualStackEndpoint, useFIPSEndpointKey, defaultsModeKey, retryModeKey, caBundleKey, roleDurationSecondsKey, retryMaxAttemptsKey, ssoSessionNameKey, ssoAccountIDKey, ssoRegionKey, ssoRoleNameKey, ssoStartURLKey, } for i := range stringKeys { if err := mergeStringKey(&srcSection, &dstSection, sectionName, stringKeys[i]); err != nil { return err } } // set srcSection on dst srcSection *dst = dst.SetSection(sectionName, dstSection) } return nil } func mergeStringKey(srcSection *ini.Section, dstSection *ini.Section, sectionName, key string) error { if srcSection.Has(key) { srcValue := srcSection.String(key) val, err := ini.NewStringValue(srcValue) if err != nil { return fmt.Errorf("error merging %s, %w", key, err) } if dstSection.Has(key) { dstSection.Logs = append(dstSection.Logs, newMergeKeyLogMessage(sectionName, key, dstSection.SourceFile[key], srcSection.SourceFile[key])) } dstSection.UpdateValue(key, val) dstSection.UpdateSourceFile(key, srcSection.SourceFile[key]) } return nil } func newMergeKeyLogMessage(sectionName, key, dstSourceFile, srcSourceFile string) string { return fmt.Sprintf("For profile: %v, overriding %v value, defined in %v "+ "with a %v value found in a duplicate profile defined at file %v. \n", sectionName, key, dstSourceFile, key, srcSourceFile) } // Returns an error if all of the files fail to load. If at least one file is // successfully loaded and contains the profile, no error will be returned. func (c *SharedConfig) setFromIniSections(profiles map[string]struct{}, profile string, sections ini.Sections, logger logging.Logger) error { c.Profile = profile section, ok := sections.GetSection(profile) if !ok { return SharedConfigProfileNotExistError{ Profile: profile, } } // if logs are appended to the section, log them if section.Logs != nil && logger != nil { for _, log := range section.Logs { logger.Logf(logging.Debug, log) } } // set config from the provided INI section err := c.setFromIniSection(profile, section) if err != nil { return fmt.Errorf("error fetching config from profile, %v, %w", profile, err) } if _, ok := profiles[profile]; ok { // if this is the second instance of the profile the Assume Role // options must be cleared because they are only valid for the // first reference of a profile. The self linked instance of the // profile only have credential provider options. c.clearAssumeRoleOptions() } else { // First time a profile has been seen. Assert if the credential type // requires a role ARN, the ARN is also set if err := c.validateCredentialsConfig(profile); err != nil { return err } } // if not top level profile and has credentials, return with credentials. if len(profiles) != 0 && c.Credentials.HasKeys() { return nil } profiles[profile] = struct{}{} // validate no colliding credentials type are present if err := c.validateCredentialType(); err != nil { return err } // Link source profiles for assume roles if len(c.SourceProfileName) != 0 { // Linked profile via source_profile ignore credential provider // options, the source profile must provide the credentials. c.clearCredentialOptions() srcCfg := &SharedConfig{} err := srcCfg.setFromIniSections(profiles, c.SourceProfileName, sections, logger) if err != nil { // SourceProfileName that doesn't exist is an error in configuration. if _, ok := err.(SharedConfigProfileNotExistError); ok { err = SharedConfigAssumeRoleError{ RoleARN: c.RoleARN, Profile: c.SourceProfileName, Err: err, } } return err } if !srcCfg.hasCredentials() { return SharedConfigAssumeRoleError{ RoleARN: c.RoleARN, Profile: c.SourceProfileName, } } c.Source = srcCfg } // If the profile contains an SSO session parameter, the session MUST exist // as a section in the config file. Load the SSO session using the name // provided. If the session section is not found or incomplete an error // will be returned. if c.hasSSOTokenProviderConfiguration() { section, ok := sections.GetSection(ssoSectionPrefix + strings.TrimSpace(c.SSOSessionName)) if !ok { return fmt.Errorf("failed to find SSO session section, %v", c.SSOSessionName) } var ssoSession SSOSession ssoSession.setFromIniSection(section) ssoSession.Name = c.SSOSessionName c.SSOSession = &ssoSession } if len(c.ServicesSectionName) > 0 { if section, ok := sections.GetSection(servicesPrefix + c.ServicesSectionName); ok { var svcs Services svcs.setFromIniSection(section) c.Services = svcs } } return nil } // setFromIniSection loads the configuration from the profile section defined in // the provided INI file. A SharedConfig pointer type value is used so that // multiple config file loadings can be chained. // // Only loads complete logically grouped values, and will not set fields in cfg // for incomplete grouped values in the config. Such as credentials. For example // if a config file only includes aws_access_key_id but no aws_secret_access_key // the aws_access_key_id will be ignored. func (c *SharedConfig) setFromIniSection(profile string, section ini.Section) error { if len(section.Name) == 0 { sources := make([]string, 0) for _, v := range section.SourceFile { sources = append(sources, v) } return fmt.Errorf("parsing error : could not find profile section name after processing files: %v", sources) } if len(section.Errors) != 0 { var errStatement string for i, e := range section.Errors { errStatement = fmt.Sprintf("%d, %v\n", i+1, e.Error()) } return fmt.Errorf("Error using profile: \n %v", errStatement) } // Assume Role updateString(&c.RoleARN, section, roleArnKey) updateString(&c.ExternalID, section, externalIDKey) updateString(&c.MFASerial, section, mfaSerialKey) updateString(&c.RoleSessionName, section, roleSessionNameKey) updateString(&c.SourceProfileName, section, sourceProfileKey) updateString(&c.CredentialSource, section, credentialSourceKey) updateString(&c.Region, section, regionKey) // AWS Single Sign-On (AWS SSO) // SSO session options updateString(&c.SSOSessionName, section, ssoSessionNameKey) // Legacy SSO session options updateString(&c.SSORegion, section, ssoRegionKey) updateString(&c.SSOStartURL, section, ssoStartURLKey) // SSO fields not used updateString(&c.SSOAccountID, section, ssoAccountIDKey) updateString(&c.SSORoleName, section, ssoRoleNameKey) // we're retaining a behavioral quirk with this field that existed before // the removal of literal parsing for #2276: // - if the key is missing, the config field will not be set // - if the key is set to a non-numeric, the config field will be set to 0 if section.Has(roleDurationSecondsKey) { if v, ok := section.Int(roleDurationSecondsKey); ok { c.RoleDurationSeconds = aws.Duration(time.Duration(v) * time.Second) } else { c.RoleDurationSeconds = aws.Duration(time.Duration(0)) } } updateString(&c.CredentialProcess, section, credentialProcessKey) updateString(&c.WebIdentityTokenFile, section, webIdentityTokenFileKey) updateEndpointDiscoveryType(&c.EnableEndpointDiscovery, section, enableEndpointDiscoveryKey) updateBoolPtr(&c.S3UseARNRegion, section, s3UseARNRegionKey) updateBoolPtr(&c.S3DisableMultiRegionAccessPoints, section, s3DisableMultiRegionAccessPointsKey) updateBoolPtr(&c.S3DisableExpressAuth, section, s3DisableExpressSessionAuthKey) if err := updateEC2MetadataServiceEndpointMode(&c.EC2IMDSEndpointMode, section, ec2MetadataServiceEndpointModeKey); err != nil { return fmt.Errorf("failed to load %s from shared config, %v", ec2MetadataServiceEndpointModeKey, err) } updateString(&c.EC2IMDSEndpoint, section, ec2MetadataServiceEndpointKey) updateBoolPtr(&c.EC2IMDSv1Disabled, section, ec2MetadataV1DisabledKey) updateUseDualStackEndpoint(&c.UseDualStackEndpoint, section, useDualStackEndpoint) updateUseFIPSEndpoint(&c.UseFIPSEndpoint, section, useFIPSEndpointKey) if err := updateDefaultsMode(&c.DefaultsMode, section, defaultsModeKey); err != nil { return fmt.Errorf("failed to load %s from shared config, %w", defaultsModeKey, err) } if err := updateInt(&c.RetryMaxAttempts, section, retryMaxAttemptsKey); err != nil { return fmt.Errorf("failed to load %s from shared config, %w", retryMaxAttemptsKey, err) } if err := updateRetryMode(&c.RetryMode, section, retryModeKey); err != nil { return fmt.Errorf("failed to load %s from shared config, %w", retryModeKey, err) } updateString(&c.CustomCABundle, section, caBundleKey) // user agent app ID added to request User-Agent header updateString(&c.AppID, section, sdkAppID) updateBoolPtr(&c.IgnoreConfiguredEndpoints, section, ignoreConfiguredEndpoints) updateString(&c.BaseEndpoint, section, endpointURL) if err := updateDisableRequestCompression(&c.DisableRequestCompression, section, disableRequestCompression); err != nil { return fmt.Errorf("failed to load %s from shared config, %w", disableRequestCompression, err) } if err := updateRequestMinCompressSizeBytes(&c.RequestMinCompressSizeBytes, section, requestMinCompressionSizeBytes); err != nil { return fmt.Errorf("failed to load %s from shared config, %w", requestMinCompressionSizeBytes, err) } if err := updateAIDEndpointMode(&c.AccountIDEndpointMode, section, accountIDEndpointMode); err != nil { return fmt.Errorf("failed to load %s from shared config, %w", accountIDEndpointMode, err) } if err := updateRequestChecksumCalculation(&c.RequestChecksumCalculation, section, requestChecksumCalculationKey); err != nil { return fmt.Errorf("failed to load %s from shared config, %w", requestChecksumCalculationKey, err) } if err := updateResponseChecksumValidation(&c.ResponseChecksumValidation, section, responseChecksumValidationKey); err != nil { return fmt.Errorf("failed to load %s from shared config, %w", responseChecksumValidationKey, err) } // Shared Credentials creds := aws.Credentials{ AccessKeyID: section.String(accessKeyIDKey), SecretAccessKey: section.String(secretAccessKey), SessionToken: section.String(sessionTokenKey), Source: fmt.Sprintf("SharedConfigCredentials: %s", section.SourceFile[accessKeyIDKey]), AccountID: section.String(accountIDKey), } if creds.HasKeys() { c.Credentials = creds } updateString(&c.ServicesSectionName, section, servicesSectionKey) return nil } func updateRequestMinCompressSizeBytes(bytes **int64, sec ini.Section, key string) error { if !sec.Has(key) { return nil } v, ok := sec.Int(key) if !ok { return fmt.Errorf("invalid value for min request compression size bytes %s, need int64", sec.String(key)) } if v < 0 || v > smithyrequestcompression.MaxRequestMinCompressSizeBytes { return fmt.Errorf("invalid range for min request compression size bytes %d, must be within 0 and 10485760 inclusively", v) } *bytes = new(int64) **bytes = v return nil } func updateDisableRequestCompression(disable **bool, sec ini.Section, key string) error { if !sec.Has(key) { return nil } v := sec.String(key) switch { case v == "true": *disable = new(bool) **disable = true case v == "false": *disable = new(bool) **disable = false default: return fmt.Errorf("invalid value for shared config profile field, %s=%s, need true or false", key, v) } return nil } func updateAIDEndpointMode(m *aws.AccountIDEndpointMode, sec ini.Section, key string) error { if !sec.Has(key) { return nil } v := sec.String(key) switch v { case "preferred": *m = aws.AccountIDEndpointModePreferred case "required": *m = aws.AccountIDEndpointModeRequired case "disabled": *m = aws.AccountIDEndpointModeDisabled default: return fmt.Errorf("invalid value for shared config profile field, %s=%s, must be preferred/required/disabled", key, v) } return nil } func updateRequestChecksumCalculation(m *aws.RequestChecksumCalculation, sec ini.Section, key string) error { if !sec.Has(key) { return nil } v := sec.String(key) switch strings.ToLower(v) { case checksumWhenSupported: *m = aws.RequestChecksumCalculationWhenSupported case checksumWhenRequired: *m = aws.RequestChecksumCalculationWhenRequired default: return fmt.Errorf("invalid value for shared config profile field, %s=%s, must be when_supported/when_required", key, v) } return nil } func updateResponseChecksumValidation(m *aws.ResponseChecksumValidation, sec ini.Section, key string) error { if !sec.Has(key) { return nil } v := sec.String(key) switch strings.ToLower(v) { case checksumWhenSupported: *m = aws.ResponseChecksumValidationWhenSupported case checksumWhenRequired: *m = aws.ResponseChecksumValidationWhenRequired default: return fmt.Errorf("invalid value for shared config profile field, %s=%s, must be when_supported/when_required", key, v) } return nil } func (c SharedConfig) getRequestMinCompressSizeBytes(ctx context.Context) (int64, bool, error) { if c.RequestMinCompressSizeBytes == nil { return 0, false, nil } return *c.RequestMinCompressSizeBytes, true, nil } func (c SharedConfig) getDisableRequestCompression(ctx context.Context) (bool, bool, error) { if c.DisableRequestCompression == nil { return false, false, nil } return *c.DisableRequestCompression, true, nil } func (c SharedConfig) getAccountIDEndpointMode(ctx context.Context) (aws.AccountIDEndpointMode, bool, error) { return c.AccountIDEndpointMode, len(c.AccountIDEndpointMode) > 0, nil } func (c SharedConfig) getRequestChecksumCalculation(ctx context.Context) (aws.RequestChecksumCalculation, bool, error) { return c.RequestChecksumCalculation, c.RequestChecksumCalculation > 0, nil } func (c SharedConfig) getResponseChecksumValidation(ctx context.Context) (aws.ResponseChecksumValidation, bool, error) { return c.ResponseChecksumValidation, c.ResponseChecksumValidation > 0, nil } func updateDefaultsMode(mode *aws.DefaultsMode, section ini.Section, key string) error { if !section.Has(key) { return nil } value := section.String(key) if ok := mode.SetFromString(value); !ok { return fmt.Errorf("invalid value: %s", value) } return nil } func updateRetryMode(mode *aws.RetryMode, section ini.Section, key string) (err error) { if !section.Has(key) { return nil } value := section.String(key) if *mode, err = aws.ParseRetryMode(value); err != nil { return err } return nil } func updateEC2MetadataServiceEndpointMode(endpointMode *imds.EndpointModeState, section ini.Section, key string) error { if !section.Has(key) { return nil } value := section.String(key) return endpointMode.SetFromString(value) } func (c *SharedConfig) validateCredentialsConfig(profile string) error { if err := c.validateCredentialsRequireARN(profile); err != nil { return err } return nil } func (c *SharedConfig) validateCredentialsRequireARN(profile string) error { var credSource string switch { case len(c.SourceProfileName) != 0: credSource = sourceProfileKey case len(c.CredentialSource) != 0: credSource = credentialSourceKey case len(c.WebIdentityTokenFile) != 0: credSource = webIdentityTokenFileKey } if len(credSource) != 0 && len(c.RoleARN) == 0 { return CredentialRequiresARNError{ Type: credSource, Profile: profile, } } return nil } func (c *SharedConfig) validateCredentialType() error { // Only one or no credential type can be defined. if !oneOrNone( len(c.SourceProfileName) != 0, len(c.CredentialSource) != 0, len(c.CredentialProcess) != 0, len(c.WebIdentityTokenFile) != 0, ) { return fmt.Errorf("only one credential type may be specified per profile: source profile, credential source, credential process, web identity token") } return nil } func (c *SharedConfig) validateSSOConfiguration() error { if c.hasSSOTokenProviderConfiguration() { err := c.validateSSOTokenProviderConfiguration() if err != nil { return err } return nil } if c.hasLegacySSOConfiguration() { err := c.validateLegacySSOConfiguration() if err != nil { return err } } return nil } func (c *SharedConfig) validateSSOTokenProviderConfiguration() error { var missing []string if len(c.SSOSessionName) == 0 { missing = append(missing, ssoSessionNameKey) } if c.SSOSession == nil { missing = append(missing, ssoSectionPrefix) } else { if len(c.SSOSession.SSORegion) == 0 { missing = append(missing, ssoRegionKey) } if len(c.SSOSession.SSOStartURL) == 0 { missing = append(missing, ssoStartURLKey) } } if len(missing) > 0 { return fmt.Errorf("profile %q is configured to use SSO but is missing required configuration: %s", c.Profile, strings.Join(missing, ", ")) } if len(c.SSORegion) > 0 && c.SSORegion != c.SSOSession.SSORegion { return fmt.Errorf("%s in profile %q must match %s in %s", ssoRegionKey, c.Profile, ssoRegionKey, ssoSectionPrefix) } if len(c.SSOStartURL) > 0 && c.SSOStartURL != c.SSOSession.SSOStartURL { return fmt.Errorf("%s in profile %q must match %s in %s", ssoStartURLKey, c.Profile, ssoStartURLKey, ssoSectionPrefix) } return nil } func (c *SharedConfig) validateLegacySSOConfiguration() error { var missing []string if len(c.SSORegion) == 0 { missing = append(missing, ssoRegionKey) } if len(c.SSOStartURL) == 0 { missing = append(missing, ssoStartURLKey) } if len(c.SSOAccountID) == 0 { missing = append(missing, ssoAccountIDKey) } if len(c.SSORoleName) == 0 { missing = append(missing, ssoRoleNameKey) } if len(missing) > 0 { return fmt.Errorf("profile %q is configured to use SSO but is missing required configuration: %s", c.Profile, strings.Join(missing, ", ")) } return nil } func (c *SharedConfig) hasCredentials() bool { switch { case len(c.SourceProfileName) != 0: case len(c.CredentialSource) != 0: case len(c.CredentialProcess) != 0: case len(c.WebIdentityTokenFile) != 0: case c.hasSSOConfiguration(): case c.Credentials.HasKeys(): default: return false } return true } func (c *SharedConfig) hasSSOConfiguration() bool { return c.hasSSOTokenProviderConfiguration() || c.hasLegacySSOConfiguration() } func (c *SharedConfig) hasSSOTokenProviderConfiguration() bool { return len(c.SSOSessionName) > 0 } func (c *SharedConfig) hasLegacySSOConfiguration() bool { return len(c.SSORegion) > 0 || len(c.SSOAccountID) > 0 || len(c.SSOStartURL) > 0 || len(c.SSORoleName) > 0 } func (c *SharedConfig) clearAssumeRoleOptions() { c.RoleARN = "" c.ExternalID = "" c.MFASerial = "" c.RoleSessionName = "" c.SourceProfileName = "" } func (c *SharedConfig) clearCredentialOptions() { c.CredentialSource = "" c.CredentialProcess = "" c.WebIdentityTokenFile = "" c.Credentials = aws.Credentials{} c.SSOAccountID = "" c.SSORegion = "" c.SSORoleName = "" c.SSOStartURL = "" } // SharedConfigLoadError is an error for the shared config file failed to load. type SharedConfigLoadError struct { Filename string Err error } // Unwrap returns the underlying error that caused the failure. func (e SharedConfigLoadError) Unwrap() error { return e.Err } func (e SharedConfigLoadError) Error() string { return fmt.Sprintf("failed to load shared config file, %s, %v", e.Filename, e.Err) } // SharedConfigProfileNotExistError is an error for the shared config when // the profile was not find in the config file. type SharedConfigProfileNotExistError struct { Filename []string Profile string Err error } // Unwrap returns the underlying error that caused the failure. func (e SharedConfigProfileNotExistError) Unwrap() error { return e.Err } func (e SharedConfigProfileNotExistError) Error() string { return fmt.Sprintf("failed to get shared config profile, %s", e.Profile) } // SharedConfigAssumeRoleError is an error for the shared config when the // profile contains assume role information, but that information is invalid // or not complete. type SharedConfigAssumeRoleError struct { Profile string RoleARN string Err error } // Unwrap returns the underlying error that caused the failure. func (e SharedConfigAssumeRoleError) Unwrap() error { return e.Err } func (e SharedConfigAssumeRoleError) Error() string { return fmt.Sprintf("failed to load assume role %s, of profile %s, %v", e.RoleARN, e.Profile, e.Err) } // CredentialRequiresARNError provides the error for shared config credentials // that are incorrectly configured in the shared config or credentials file. type CredentialRequiresARNError struct { // type of credentials that were configured. Type string // Profile name the credentials were in. Profile string } // Error satisfies the error interface. func (e CredentialRequiresARNError) Error() string { return fmt.Sprintf( "credential type %s requires role_arn, profile %s", e.Type, e.Profile, ) } func oneOrNone(bs ...bool) bool { var count int for _, b := range bs { if b { count++ if count > 1 { return false } } } return true } // updateString will only update the dst with the value in the section key, key // is present in the section. func updateString(dst *string, section ini.Section, key string) { if !section.Has(key) { return } *dst = section.String(key) } // updateInt will only update the dst with the value in the section key, key // is present in the section. // // Down casts the INI integer value from a int64 to an int, which could be // different bit size depending on platform. func updateInt(dst *int, section ini.Section, key string) error { if !section.Has(key) { return nil } v, ok := section.Int(key) if !ok { return fmt.Errorf("invalid value %s=%s, expect integer", key, section.String(key)) } *dst = int(v) return nil } // updateBool will only update the dst with the value in the section key, key // is present in the section. func updateBool(dst *bool, section ini.Section, key string) { if !section.Has(key) { return } // retains pre-#2276 behavior where non-bool value would resolve to false v, _ := section.Bool(key) *dst = v } // updateBoolPtr will only update the dst with the value in the section key, // key is present in the section. func updateBoolPtr(dst **bool, section ini.Section, key string) { if !section.Has(key) { return } // retains pre-#2276 behavior where non-bool value would resolve to false v, _ := section.Bool(key) *dst = new(bool) **dst = v } // updateEndpointDiscoveryType will only update the dst with the value in the section, if // a valid key and corresponding EndpointDiscoveryType is found. func updateEndpointDiscoveryType(dst *aws.EndpointDiscoveryEnableState, section ini.Section, key string) { if !section.Has(key) { return } value := section.String(key) if len(value) == 0 { return } switch { case strings.EqualFold(value, endpointDiscoveryDisabled): *dst = aws.EndpointDiscoveryDisabled case strings.EqualFold(value, endpointDiscoveryEnabled): *dst = aws.EndpointDiscoveryEnabled case strings.EqualFold(value, endpointDiscoveryAuto): *dst = aws.EndpointDiscoveryAuto } } // updateEndpointDiscoveryType will only update the dst with the value in the section, if // a valid key and corresponding EndpointDiscoveryType is found. func updateUseDualStackEndpoint(dst *aws.DualStackEndpointState, section ini.Section, key string) { if !section.Has(key) { return } // retains pre-#2276 behavior where non-bool value would resolve to false if v, _ := section.Bool(key); v { *dst = aws.DualStackEndpointStateEnabled } else { *dst = aws.DualStackEndpointStateDisabled } return } // updateEndpointDiscoveryType will only update the dst with the value in the section, if // a valid key and corresponding EndpointDiscoveryType is found. func updateUseFIPSEndpoint(dst *aws.FIPSEndpointState, section ini.Section, key string) { if !section.Has(key) { return } // retains pre-#2276 behavior where non-bool value would resolve to false if v, _ := section.Bool(key); v { *dst = aws.FIPSEndpointStateEnabled } else { *dst = aws.FIPSEndpointStateDisabled } return } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md ================================================ # v1.17.67 (2025-04-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.66 (2025-04-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.65 (2025-03-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.64 (2025-03-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.63 (2025-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.62 (2025-03-04.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.61 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.60 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.17.59 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.58 (2025-02-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.57 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.56 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.55 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.17.54 (2025-01-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.53 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.52 (2025-01-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.51 (2025-01-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.50 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.49 (2025-01-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.48 (2024-12-19) * **Bug Fix**: Fix improper use of printf-style functions. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.47 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.46 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.45 (2024-11-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.44 (2024-11-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.43 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.42 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.41 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.40 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.39 (2024-10-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.38 (2024-10-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.37 (2024-09-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.36 (2024-09-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.35 (2024-09-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.34 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.33 (2024-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.32 (2024-09-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.31 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.30 (2024-08-26) * **Bug Fix**: Save SSO cached token expiry in UTC to ensure cross-SDK compatibility. # v1.17.29 (2024-08-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.28 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.27 (2024-07-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.26 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.25 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.24 (2024-07-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.23 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.22 (2024-06-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.21 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.20 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.19 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.18 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.17 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.16 (2024-05-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.15 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.14 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.13 (2024-05-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.12 (2024-05-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.11 (2024-04-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.10 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.9 (2024-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.8 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.7 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.6 (2024-03-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.5 (2024-03-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.4 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.3 (2024-02-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.2 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.1 (2024-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.16.16 (2024-01-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.15 (2024-01-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.14 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.13 (2023-12-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.12 (2023-12-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.11 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.10 (2023-12-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.9 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.8 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.7 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.6 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.5 (2023-11-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.4 (2023-11-21) * **Bug Fix**: Don't expect error responses to have a JSON payload in the endpointcreds provider. # v1.16.3 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.2 (2023-11-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.1 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.0 (2023-11-14) * **Feature**: Add support for dynamic auth token from file and EKS container host in absolute/relative URIs in the HTTP credential provider. # v1.15.2 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.1 (2023-11-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. * **Dependency Update**: Updated to the latest SDK module versions # v1.14.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.13.43 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.42 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.41 (2023-10-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.40 (2023-09-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.39 (2023-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.38 (2023-09-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.37 (2023-09-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.36 (2023-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.35 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.34 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.33 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.32 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.31 (2023-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.30 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.29 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.28 (2023-07-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.27 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.26 (2023-06-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.25 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.24 (2023-05-09) * No change notes available for this release. # v1.13.23 (2023-05-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.22 (2023-05-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.21 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.20 (2023-04-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.19 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.18 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.17 (2023-03-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.16 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.15 (2023-02-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.14 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.13 (2023-02-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.12 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.11 (2023-02-01) * No change notes available for this release. # v1.13.10 (2023-01-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.9 (2023-01-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.8 (2023-01-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.7 (2022-12-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.6 (2022-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.5 (2022-12-15) * **Bug Fix**: Unify logic between shared config and in finding home directory * **Dependency Update**: Updated to the latest SDK module versions # v1.13.4 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.3 (2022-11-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.2 (2022-11-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.1 (2022-11-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.0 (2022-11-11) * **Announcement**: When using the SSOTokenProvider, a previous implementation incorrectly compensated for invalid SSOTokenProvider configurations in the shared profile. This has been fixed via PR #1903 and tracked in issue #1846 * **Feature**: Adds token refresh support (via SSOTokenProvider) when using the SSOCredentialProvider # v1.12.24 (2022-11-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.23 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.22 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.21 (2022-09-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.20 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.19 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.18 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.17 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.16 (2022-08-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.15 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.14 (2022-08-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.13 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.12 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.11 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.10 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.9 (2022-07-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.8 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.7 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.6 (2022-06-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.5 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.4 (2022-05-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.3 (2022-05-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.2 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.1 (2022-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2022-04-25) * **Feature**: Adds Duration and Policy options that can be used when creating stscreds.WebIdentityRoleProvider credentials provider. * **Dependency Update**: Updated to the latest SDK module versions # v1.11.2 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.1 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2022-03-23) * **Feature**: Update `ec2rolecreds` package's `Provider` to implememnt support for CredentialsCache new optional caching strategy interfaces, HandleFailRefreshCredentialsCacheStrategy and AdjustExpiresByCredentialsCacheStrategy. * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.9.0 (2022-02-24) * **Feature**: Adds support for `SourceIdentity` to `stscreds.AssumeRoleProvider` [#1588](https://github.com/aws/aws-sdk-go-v2/pull/1588). Fixes [#1575](https://github.com/aws/aws-sdk-go-v2/issues/1575) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.8.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.7.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.6.5 (2021-12-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.6.4 (2021-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.6.3 (2021-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.6.2 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.6.1 (2021-11-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.6.0 (2021-11-06) * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.5.0 (2021-10-21) * **Feature**: Updated to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.3 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.2 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.1 (2021-09-10) * **Documentation**: Fixes the AssumeRoleProvider's documentation for using custom TokenProviders. # v1.4.0 (2021-08-27) * **Feature**: Adds support for Tags and TransitiveTagKeys to stscreds.AssumeRoleProvider. Closes https://github.com/aws/aws-sdk-go-v2/issues/723 * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.3.3 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.2 (2021-08-04) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2021-07-15) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Bug Fix**: Fixed example usages of aws.CredentialsCache ([#1275](https://github.com/aws/aws-sdk-go-v2/pull/1275)) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.1 (2021-05-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/doc.go ================================================ /* Package credentials provides types for retrieving credentials from credentials sources. */ package credentials ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/doc.go ================================================ // Package ec2rolecreds provides the credentials provider implementation for // retrieving AWS credentials from Amazon EC2 Instance Roles via Amazon EC2 IMDS. // // # Concurrency and caching // // The Provider is not safe to be used concurrently, and does not provide any // caching of credentials retrieved. You should wrap the Provider with a // `aws.CredentialsCache` to provide concurrency safety, and caching of // credentials. // // # Loading credentials with the SDK's AWS Config // // The EC2 Instance role credentials provider will automatically be the resolved // credential provider in the credential chain if no other credential provider is // resolved first. // // To explicitly instruct the SDK's credentials resolving to use the EC2 Instance // role for credentials, you specify a `credentials_source` property in the config // profile the SDK will load. // // [default] // credential_source = Ec2InstanceMetadata // // # Loading credentials with the Provider directly // // Another way to use the EC2 Instance role credentials provider is to create it // directly and assign it as the credentials provider for an API client. // // The following example creates a credentials provider for a command, and wraps // it with the CredentialsCache before assigning the provider to the Amazon S3 API // client's Credentials option. // // provider := imds.New(imds.Options{}) // // // Create the service client value configured for credentials. // svc := s3.New(s3.Options{ // Credentials: aws.NewCredentialsCache(provider), // }) // // If you need more control, you can set the configuration options on the // credentials provider using the imds.Options type to configure the EC2 IMDS // API Client and ExpiryWindow of the retrieved credentials. // // provider := imds.New(imds.Options{ // // See imds.Options type's documentation for more options available. // Client: imds.New(Options{ // HTTPClient: customHTTPClient, // }), // // // Modify how soon credentials expire prior to their original expiry time. // ExpiryWindow: 5 * time.Minute, // }) // // # EC2 IMDS API Client // // See the github.com/aws/aws-sdk-go-v2/feature/ec2/imds module for more details on // configuring the client, and options available. package ec2rolecreds ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/provider.go ================================================ package ec2rolecreds import ( "bufio" "context" "encoding/json" "fmt" "math" "path" "strings" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" sdkrand "github.com/aws/aws-sdk-go-v2/internal/rand" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/middleware" ) // ProviderName provides a name of EC2Role provider const ProviderName = "EC2RoleProvider" // GetMetadataAPIClient provides the interface for an EC2 IMDS API client for the // GetMetadata operation. type GetMetadataAPIClient interface { GetMetadata(context.Context, *imds.GetMetadataInput, ...func(*imds.Options)) (*imds.GetMetadataOutput, error) } // A Provider retrieves credentials from the EC2 service, and keeps track if // those credentials are expired. // // The New function must be used to create the with a custom EC2 IMDS client. // // p := &ec2rolecreds.New(func(o *ec2rolecreds.Options{ // o.Client = imds.New(imds.Options{/* custom options */}) // }) type Provider struct { options Options } // Options is a list of user settable options for setting the behavior of the Provider. type Options struct { // The API client that will be used by the provider to make GetMetadata API // calls to EC2 IMDS. // // If nil, the provider will default to the EC2 IMDS client. Client GetMetadataAPIClient // The chain of providers that was used to create this provider // These values are for reporting purposes and are not meant to be set up directly CredentialSources []aws.CredentialSource } // New returns an initialized Provider value configured to retrieve // credentials from EC2 Instance Metadata service. func New(optFns ...func(*Options)) *Provider { options := Options{} for _, fn := range optFns { fn(&options) } if options.Client == nil { options.Client = imds.New(imds.Options{}) } return &Provider{ options: options, } } // Retrieve retrieves credentials from the EC2 service. Error will be returned // if the request fails, or unable to extract the desired credentials. func (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) { credsList, err := requestCredList(ctx, p.options.Client) if err != nil { return aws.Credentials{Source: ProviderName}, err } if len(credsList) == 0 { return aws.Credentials{Source: ProviderName}, fmt.Errorf("unexpected empty EC2 IMDS role list") } credsName := credsList[0] roleCreds, err := requestCred(ctx, p.options.Client, credsName) if err != nil { return aws.Credentials{Source: ProviderName}, err } creds := aws.Credentials{ AccessKeyID: roleCreds.AccessKeyID, SecretAccessKey: roleCreds.SecretAccessKey, SessionToken: roleCreds.Token, Source: ProviderName, CanExpire: true, Expires: roleCreds.Expiration, } // Cap role credentials Expires to 1 hour so they can be refreshed more // often. Jitter will be applied credentials cache if being used. if anHour := sdk.NowTime().Add(1 * time.Hour); creds.Expires.After(anHour) { creds.Expires = anHour } return creds, nil } // HandleFailToRefresh will extend the credentials Expires time if it it is // expired. If the credentials will not expire within the minimum time, they // will be returned. // // If the credentials cannot expire, the original error will be returned. func (p *Provider) HandleFailToRefresh(ctx context.Context, prevCreds aws.Credentials, err error) ( aws.Credentials, error, ) { if !prevCreds.CanExpire { return aws.Credentials{}, err } if prevCreds.Expires.After(sdk.NowTime().Add(5 * time.Minute)) { return prevCreds, nil } newCreds := prevCreds randFloat64, err := sdkrand.CryptoRandFloat64() if err != nil { return aws.Credentials{}, fmt.Errorf("failed to get random float, %w", err) } // Random distribution of [5,15) minutes. expireOffset := time.Duration(randFloat64*float64(10*time.Minute)) + 5*time.Minute newCreds.Expires = sdk.NowTime().Add(expireOffset) logger := middleware.GetLogger(ctx) logger.Logf(logging.Warn, "Attempting credential expiration extension due to a credential service availability issue. A refresh of these credentials will be attempted again in %v minutes.", math.Floor(expireOffset.Minutes())) return newCreds, nil } // AdjustExpiresBy will adds the passed in duration to the passed in // credential's Expires time, unless the time until Expires is less than 15 // minutes. Returns the credentials, even if not updated. func (p *Provider) AdjustExpiresBy(creds aws.Credentials, dur time.Duration) ( aws.Credentials, error, ) { if !creds.CanExpire { return creds, nil } if creds.Expires.Before(sdk.NowTime().Add(15 * time.Minute)) { return creds, nil } creds.Expires = creds.Expires.Add(dur) return creds, nil } // ec2RoleCredRespBody provides the shape for unmarshaling credential // request responses. type ec2RoleCredRespBody struct { // Success State Expiration time.Time AccessKeyID string SecretAccessKey string Token string // Error state Code string Message string } const iamSecurityCredsPath = "/iam/security-credentials/" // requestCredList requests a list of credentials from the EC2 service. If // there are no credentials, or there is an error making or receiving the // request func requestCredList(ctx context.Context, client GetMetadataAPIClient) ([]string, error) { resp, err := client.GetMetadata(ctx, &imds.GetMetadataInput{ Path: iamSecurityCredsPath, }) if err != nil { return nil, fmt.Errorf("no EC2 IMDS role found, %w", err) } defer resp.Content.Close() credsList := []string{} s := bufio.NewScanner(resp.Content) for s.Scan() { credsList = append(credsList, s.Text()) } if err := s.Err(); err != nil { return nil, fmt.Errorf("failed to read EC2 IMDS role, %w", err) } return credsList, nil } // requestCred requests the credentials for a specific credentials from the EC2 service. // // If the credentials cannot be found, or there is an error reading the response // and error will be returned. func requestCred(ctx context.Context, client GetMetadataAPIClient, credsName string) (ec2RoleCredRespBody, error) { resp, err := client.GetMetadata(ctx, &imds.GetMetadataInput{ Path: path.Join(iamSecurityCredsPath, credsName), }) if err != nil { return ec2RoleCredRespBody{}, fmt.Errorf("failed to get %s EC2 IMDS role credentials, %w", credsName, err) } defer resp.Content.Close() var respCreds ec2RoleCredRespBody if err := json.NewDecoder(resp.Content).Decode(&respCreds); err != nil { return ec2RoleCredRespBody{}, fmt.Errorf("failed to decode %s EC2 IMDS role credentials, %w", credsName, err) } if !strings.EqualFold(respCreds.Code, "Success") { // If an error code was returned something failed requesting the role. return ec2RoleCredRespBody{}, fmt.Errorf("failed to get %s EC2 IMDS role credentials, %w", credsName, &smithy.GenericAPIError{Code: respCreds.Code, Message: respCreds.Message}) } return respCreds, nil } // ProviderSources returns the credential chain that was used to construct this provider func (p *Provider) ProviderSources() []aws.CredentialSource { if p.options.CredentialSources == nil { return []aws.CredentialSource{aws.CredentialSourceIMDS} } // If no source has been set, assume this is used directly which means just call to assume role return p.options.CredentialSources } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/auth.go ================================================ package client import ( "context" "github.com/aws/smithy-go/middleware" ) type getIdentityMiddleware struct { options Options } func (*getIdentityMiddleware) ID() string { return "GetIdentity" } func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { return next.HandleFinalize(ctx, in) } type signRequestMiddleware struct { } func (*signRequestMiddleware) ID() string { return "Signing" } func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { return next.HandleFinalize(ctx, in) } type resolveAuthSchemeMiddleware struct { operation string options Options } func (*resolveAuthSchemeMiddleware) ID() string { return "ResolveAuthScheme" } func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/client.go ================================================ package client import ( "context" "fmt" "net/http" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/retry" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" "github.com/aws/smithy-go" smithymiddleware "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // ServiceID is the client identifer const ServiceID = "endpoint-credentials" // HTTPClient is a client for sending HTTP requests type HTTPClient interface { Do(*http.Request) (*http.Response, error) } // Options is the endpoint client configurable options type Options struct { // The endpoint to retrieve credentials from Endpoint string // The HTTP client to invoke API calls with. Defaults to client's default HTTP // implementation if nil. HTTPClient HTTPClient // Retryer guides how HTTP requests should be retried in case of recoverable // failures. When nil the API client will use a default retryer. Retryer aws.Retryer // Set of options to modify how the credentials operation is invoked. APIOptions []func(*smithymiddleware.Stack) error } // Copy creates a copy of the API options. func (o Options) Copy() Options { to := o to.APIOptions = make([]func(*smithymiddleware.Stack) error, len(o.APIOptions)) copy(to.APIOptions, o.APIOptions) return to } // Client is an client for retrieving AWS credentials from an endpoint type Client struct { options Options } // New constructs a new Client from the given options func New(options Options, optFns ...func(*Options)) *Client { options = options.Copy() if options.HTTPClient == nil { options.HTTPClient = awshttp.NewBuildableClient() } if options.Retryer == nil { // Amazon-owned implementations of this endpoint are known to sometimes // return plaintext responses (i.e. no Code) like normal, add a few // additional status codes options.Retryer = retry.NewStandard(func(o *retry.StandardOptions) { o.Retryables = append(o.Retryables, retry.RetryableHTTPStatusCode{ Codes: map[int]struct{}{ http.StatusTooManyRequests: {}, }, }) }) } for _, fn := range optFns { fn(&options) } client := &Client{ options: options, } return client } // GetCredentialsInput is the input to send with the endpoint service to receive credentials. type GetCredentialsInput struct { AuthorizationToken string } // GetCredentials retrieves credentials from credential endpoint func (c *Client) GetCredentials(ctx context.Context, params *GetCredentialsInput, optFns ...func(*Options)) (*GetCredentialsOutput, error) { stack := smithymiddleware.NewStack("GetCredentials", smithyhttp.NewStackRequest) options := c.options.Copy() for _, fn := range optFns { fn(&options) } stack.Serialize.Add(&serializeOpGetCredential{}, smithymiddleware.After) stack.Build.Add(&buildEndpoint{Endpoint: options.Endpoint}, smithymiddleware.After) stack.Deserialize.Add(&deserializeOpGetCredential{}, smithymiddleware.After) addProtocolFinalizerMiddlewares(stack, options, "GetCredentials") retry.AddRetryMiddlewares(stack, retry.AddRetryMiddlewaresOptions{Retryer: options.Retryer}) middleware.AddSDKAgentKey(middleware.FeatureMetadata, ServiceID) smithyhttp.AddErrorCloseResponseBodyMiddleware(stack) smithyhttp.AddCloseResponseBodyMiddleware(stack) for _, fn := range options.APIOptions { if err := fn(stack); err != nil { return nil, err } } handler := smithymiddleware.DecorateHandler(smithyhttp.NewClientHandler(options.HTTPClient), stack) result, _, err := handler.Handle(ctx, params) if err != nil { return nil, err } return result.(*GetCredentialsOutput), err } // GetCredentialsOutput is the response from the credential endpoint type GetCredentialsOutput struct { Expiration *time.Time AccessKeyID string SecretAccessKey string Token string AccountID string } // EndpointError is an error returned from the endpoint service type EndpointError struct { Code string `json:"code"` Message string `json:"message"` Fault smithy.ErrorFault `json:"-"` statusCode int `json:"-"` } // Error is the error mesage string func (e *EndpointError) Error() string { return fmt.Sprintf("%s: %s", e.Code, e.Message) } // ErrorCode is the error code returned by the endpoint func (e *EndpointError) ErrorCode() string { return e.Code } // ErrorMessage is the error message returned by the endpoint func (e *EndpointError) ErrorMessage() string { return e.Message } // ErrorFault indicates error fault classification func (e *EndpointError) ErrorFault() smithy.ErrorFault { return e.Fault } // HTTPStatusCode implements retry.HTTPStatusCode. func (e *EndpointError) HTTPStatusCode() int { return e.statusCode } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/endpoints.go ================================================ package client import ( "context" "github.com/aws/smithy-go/middleware" ) type resolveEndpointV2Middleware struct { options Options } func (*resolveEndpointV2Middleware) ID() string { return "ResolveEndpointV2" } func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client/middleware.go ================================================ package client import ( "context" "encoding/json" "fmt" "io" "net/url" "github.com/aws/smithy-go" smithymiddleware "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) type buildEndpoint struct { Endpoint string } func (b *buildEndpoint) ID() string { return "BuildEndpoint" } func (b *buildEndpoint) HandleBuild(ctx context.Context, in smithymiddleware.BuildInput, next smithymiddleware.BuildHandler) ( out smithymiddleware.BuildOutput, metadata smithymiddleware.Metadata, err error, ) { request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport, %T", in.Request) } if len(b.Endpoint) == 0 { return out, metadata, fmt.Errorf("endpoint not provided") } parsed, err := url.Parse(b.Endpoint) if err != nil { return out, metadata, fmt.Errorf("failed to parse endpoint, %w", err) } request.URL = parsed return next.HandleBuild(ctx, in) } type serializeOpGetCredential struct{} func (s *serializeOpGetCredential) ID() string { return "OperationSerializer" } func (s *serializeOpGetCredential) HandleSerialize(ctx context.Context, in smithymiddleware.SerializeInput, next smithymiddleware.SerializeHandler) ( out smithymiddleware.SerializeOutput, metadata smithymiddleware.Metadata, err error, ) { request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type, %T", in.Request) } params, ok := in.Parameters.(*GetCredentialsInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters, %T", in.Parameters) } const acceptHeader = "Accept" request.Header[acceptHeader] = append(request.Header[acceptHeader][:0], "application/json") if len(params.AuthorizationToken) > 0 { const authHeader = "Authorization" request.Header[authHeader] = append(request.Header[authHeader][:0], params.AuthorizationToken) } return next.HandleSerialize(ctx, in) } type deserializeOpGetCredential struct{} func (d *deserializeOpGetCredential) ID() string { return "OperationDeserializer" } func (d *deserializeOpGetCredential) HandleDeserialize(ctx context.Context, in smithymiddleware.DeserializeInput, next smithymiddleware.DeserializeHandler) ( out smithymiddleware.DeserializeOutput, metadata smithymiddleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, deserializeError(response) } var shape *GetCredentialsOutput if err = json.NewDecoder(response.Body).Decode(&shape); err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to deserialize json response, %w", err)} } out.Result = shape return out, metadata, err } func deserializeError(response *smithyhttp.Response) error { // we could be talking to anything, json isn't guaranteed // see https://github.com/aws/aws-sdk-go-v2/issues/2316 if response.Header.Get("Content-Type") == "application/json" { return deserializeJSONError(response) } msg, err := io.ReadAll(response.Body) if err != nil { return &smithy.DeserializationError{ Err: fmt.Errorf("read response, %w", err), } } return &EndpointError{ // no sensible value for Code Message: string(msg), Fault: stof(response.StatusCode), statusCode: response.StatusCode, } } func deserializeJSONError(response *smithyhttp.Response) error { var errShape *EndpointError if err := json.NewDecoder(response.Body).Decode(&errShape); err != nil { return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode error message, %w", err), } } errShape.Fault = stof(response.StatusCode) errShape.statusCode = response.StatusCode return errShape } // maps HTTP status code to smithy ErrorFault func stof(code int) smithy.ErrorFault { if code >= 500 { return smithy.FaultServer } return smithy.FaultClient } func addProtocolFinalizerMiddlewares(stack *smithymiddleware.Stack, options Options, operation string) error { if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, smithymiddleware.Before); err != nil { return fmt.Errorf("add ResolveAuthScheme: %w", err) } if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", smithymiddleware.After); err != nil { return fmt.Errorf("add GetIdentity: %w", err) } if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", smithymiddleware.After); err != nil { return fmt.Errorf("add ResolveEndpointV2: %w", err) } if err := stack.Finalize.Insert(&signRequestMiddleware{}, "ResolveEndpointV2", smithymiddleware.After); err != nil { return fmt.Errorf("add Signing: %w", err) } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/provider.go ================================================ // Package endpointcreds provides support for retrieving credentials from an // arbitrary HTTP endpoint. // // The credentials endpoint Provider can receive both static and refreshable // credentials that will expire. Credentials are static when an "Expiration" // value is not provided in the endpoint's response. // // Static credentials will never expire once they have been retrieved. The format // of the static credentials response: // // { // "AccessKeyId" : "MUA...", // "SecretAccessKey" : "/7PC5om....", // } // // Refreshable credentials will expire within the "ExpiryWindow" of the Expiration // value in the response. The format of the refreshable credentials response: // // { // "AccessKeyId" : "MUA...", // "SecretAccessKey" : "/7PC5om....", // "Token" : "AQoDY....=", // "Expiration" : "2016-02-25T06:03:31Z" // } // // Errors should be returned in the following format and only returned with 400 // or 500 HTTP status codes. // // { // "code": "ErrorCode", // "message": "Helpful error message." // } package endpointcreds import ( "context" "fmt" "net/http" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client" "github.com/aws/smithy-go/middleware" ) // ProviderName is the name of the credentials provider. const ProviderName = `CredentialsEndpointProvider` type getCredentialsAPIClient interface { GetCredentials(context.Context, *client.GetCredentialsInput, ...func(*client.Options)) (*client.GetCredentialsOutput, error) } // Provider satisfies the aws.CredentialsProvider interface, and is a client to // retrieve credentials from an arbitrary endpoint. type Provider struct { // The AWS Client to make HTTP requests to the endpoint with. The endpoint // the request will be made to is provided by the aws.Config's // EndpointResolver. client getCredentialsAPIClient options Options } // HTTPClient is a client for sending HTTP requests type HTTPClient interface { Do(*http.Request) (*http.Response, error) } // Options is structure of configurable options for Provider type Options struct { // Endpoint to retrieve credentials from. Required Endpoint string // HTTPClient to handle sending HTTP requests to the target endpoint. HTTPClient HTTPClient // Set of options to modify how the credentials operation is invoked. APIOptions []func(*middleware.Stack) error // The Retryer to be used for determining whether a failed requested should be retried Retryer aws.Retryer // Optional authorization token value if set will be used as the value of // the Authorization header of the endpoint credential request. // // When constructed from environment, the provider will use the value of // AWS_CONTAINER_AUTHORIZATION_TOKEN environment variable as the token // // Will be overridden if AuthorizationTokenProvider is configured AuthorizationToken string // Optional auth provider func to dynamically load the auth token from a file // everytime a credential is retrieved // // When constructed from environment, the provider will read and use the content // of the file pointed to by AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE environment variable // as the auth token everytime credentials are retrieved // // Will override AuthorizationToken if configured AuthorizationTokenProvider AuthTokenProvider // The chain of providers that was used to create this provider // These values are for reporting purposes and are not meant to be set up directly CredentialSources []aws.CredentialSource } // AuthTokenProvider defines an interface to dynamically load a value to be passed // for the Authorization header of a credentials request. type AuthTokenProvider interface { GetToken() (string, error) } // TokenProviderFunc is a func type implementing AuthTokenProvider interface // and enables customizing token provider behavior type TokenProviderFunc func() (string, error) // GetToken func retrieves auth token according to TokenProviderFunc implementation func (p TokenProviderFunc) GetToken() (string, error) { return p() } // New returns a credentials Provider for retrieving AWS credentials // from arbitrary endpoint. func New(endpoint string, optFns ...func(*Options)) *Provider { o := Options{ Endpoint: endpoint, } for _, fn := range optFns { fn(&o) } p := &Provider{ client: client.New(client.Options{ HTTPClient: o.HTTPClient, Endpoint: o.Endpoint, APIOptions: o.APIOptions, Retryer: o.Retryer, }), options: o, } return p } // Retrieve will attempt to request the credentials from the endpoint the Provider // was configured for. And error will be returned if the retrieval fails. func (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) { resp, err := p.getCredentials(ctx) if err != nil { return aws.Credentials{}, fmt.Errorf("failed to load credentials, %w", err) } creds := aws.Credentials{ AccessKeyID: resp.AccessKeyID, SecretAccessKey: resp.SecretAccessKey, SessionToken: resp.Token, Source: ProviderName, AccountID: resp.AccountID, } if resp.Expiration != nil { creds.CanExpire = true creds.Expires = *resp.Expiration } return creds, nil } func (p *Provider) getCredentials(ctx context.Context) (*client.GetCredentialsOutput, error) { authToken, err := p.resolveAuthToken() if err != nil { return nil, fmt.Errorf("resolve auth token: %v", err) } return p.client.GetCredentials(ctx, &client.GetCredentialsInput{ AuthorizationToken: authToken, }) } func (p *Provider) resolveAuthToken() (string, error) { authToken := p.options.AuthorizationToken var err error if p.options.AuthorizationTokenProvider != nil { authToken, err = p.options.AuthorizationTokenProvider.GetToken() if err != nil { return "", err } } if strings.ContainsAny(authToken, "\r\n") { return "", fmt.Errorf("authorization token contains invalid newline sequence") } return authToken, nil } var _ aws.CredentialProviderSource = (*Provider)(nil) // ProviderSources returns the credential chain that was used to construct this provider func (p *Provider) ProviderSources() []aws.CredentialSource { if p.options.CredentialSources == nil { return []aws.CredentialSource{aws.CredentialSourceHTTP} } return p.options.CredentialSources } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package credentials // goModuleVersion is the tagged release for this module const goModuleVersion = "1.17.67" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/doc.go ================================================ // Package processcreds is a credentials provider to retrieve credentials from a // external CLI invoked process. // // WARNING: The following describes a method of sourcing credentials from an external // process. This can potentially be dangerous, so proceed with caution. Other // credential providers should be preferred if at all possible. If using this // option, you should make sure that the config file is as locked down as possible // using security best practices for your operating system. // // # Concurrency and caching // // The Provider is not safe to be used concurrently, and does not provide any // caching of credentials retrieved. You should wrap the Provider with a // `aws.CredentialsCache` to provide concurrency safety, and caching of // credentials. // // # Loading credentials with the SDKs AWS Config // // You can use credentials from a AWS shared config `credential_process` in a // variety of ways. // // One way is to setup your shared config file, located in the default // location, with the `credential_process` key and the command you want to be // called. You also need to set the AWS_SDK_LOAD_CONFIG environment variable // (e.g., `export AWS_SDK_LOAD_CONFIG=1`) to use the shared config file. // // [default] // credential_process = /command/to/call // // Loading configuration using external will use the credential process to // retrieve credentials. NOTE: If there are credentials in the profile you are // using, the credential process will not be used. // // // Initialize a session to load credentials. // cfg, _ := config.LoadDefaultConfig(context.TODO()) // // // Create S3 service client to use the credentials. // svc := s3.NewFromConfig(cfg) // // # Loading credentials with the Provider directly // // Another way to use the credentials process provider is by using the // `NewProvider` constructor to create the provider and providing a it with a // command to be executed to retrieve credentials. // // The following example creates a credentials provider for a command, and wraps // it with the CredentialsCache before assigning the provider to the Amazon S3 API // client's Credentials option. // // // Create credentials using the Provider. // provider := processcreds.NewProvider("/path/to/command") // // // Create the service client value configured for credentials. // svc := s3.New(s3.Options{ // Credentials: aws.NewCredentialsCache(provider), // }) // // If you need more control, you can set any configurable options in the // credentials using one or more option functions. // // provider := processcreds.NewProvider("/path/to/command", // func(o *processcreds.Options) { // // Override the provider's default timeout // o.Timeout = 2 * time.Minute // }) // // You can also use your own `exec.Cmd` value by satisfying a value that satisfies // the `NewCommandBuilder` interface and use the `NewProviderCommand` constructor. // // // Create an exec.Cmd // cmdBuilder := processcreds.NewCommandBuilderFunc( // func(ctx context.Context) (*exec.Cmd, error) { // cmd := exec.CommandContext(ctx, // "customCLICommand", // "-a", "argument", // ) // cmd.Env = []string{ // "ENV_VAR_FOO=value", // "ENV_VAR_BAR=other_value", // } // // return cmd, nil // }, // ) // // // Create credentials using your exec.Cmd and custom timeout // provider := processcreds.NewProviderCommand(cmdBuilder, // func(opt *processcreds.Provider) { // // optionally override the provider's default timeout // opt.Timeout = 1 * time.Second // }) package processcreds ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go ================================================ package processcreds import ( "bytes" "context" "encoding/json" "fmt" "io" "os" "os/exec" "runtime" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/internal/sdkio" ) const ( // ProviderName is the name this credentials provider will label any // returned credentials Value with. ProviderName = `ProcessProvider` // DefaultTimeout default limit on time a process can run. DefaultTimeout = time.Duration(1) * time.Minute ) // ProviderError is an error indicating failure initializing or executing the // process credentials provider type ProviderError struct { Err error } // Error returns the error message. func (e *ProviderError) Error() string { return fmt.Sprintf("process provider error: %v", e.Err) } // Unwrap returns the underlying error the provider error wraps. func (e *ProviderError) Unwrap() error { return e.Err } // Provider satisfies the credentials.Provider interface, and is a // client to retrieve credentials from a process. type Provider struct { // Provides a constructor for exec.Cmd that are invoked by the provider for // retrieving credentials. Use this to provide custom creation of exec.Cmd // with things like environment variables, or other configuration. // // The provider defaults to the DefaultNewCommand function. commandBuilder NewCommandBuilder options Options } // Options is the configuration options for configuring the Provider. type Options struct { // Timeout limits the time a process can run. Timeout time.Duration // The chain of providers that was used to create this provider // These values are for reporting purposes and are not meant to be set up directly CredentialSources []aws.CredentialSource } // NewCommandBuilder provides the interface for specifying how command will be // created that the Provider will use to retrieve credentials with. type NewCommandBuilder interface { NewCommand(context.Context) (*exec.Cmd, error) } // NewCommandBuilderFunc provides a wrapper type around a function pointer to // satisfy the NewCommandBuilder interface. type NewCommandBuilderFunc func(context.Context) (*exec.Cmd, error) // NewCommand calls the underlying function pointer the builder was initialized with. func (fn NewCommandBuilderFunc) NewCommand(ctx context.Context) (*exec.Cmd, error) { return fn(ctx) } // DefaultNewCommandBuilder provides the default NewCommandBuilder // implementation used by the provider. It takes a command and arguments to // invoke. The command will also be initialized with the current process // environment variables, stderr, and stdin pipes. type DefaultNewCommandBuilder struct { Args []string } // NewCommand returns an initialized exec.Cmd with the builder's initialized // Args. The command is also initialized current process environment variables, // stderr, and stdin pipes. func (b DefaultNewCommandBuilder) NewCommand(ctx context.Context) (*exec.Cmd, error) { var cmdArgs []string if runtime.GOOS == "windows" { cmdArgs = []string{"cmd.exe", "/C"} } else { cmdArgs = []string{"sh", "-c"} } if len(b.Args) == 0 { return nil, &ProviderError{ Err: fmt.Errorf("failed to prepare command: command must not be empty"), } } cmdArgs = append(cmdArgs, b.Args...) cmd := exec.CommandContext(ctx, cmdArgs[0], cmdArgs[1:]...) cmd.Env = os.Environ() cmd.Stderr = os.Stderr // display stderr on console for MFA cmd.Stdin = os.Stdin // enable stdin for MFA return cmd, nil } // NewProvider returns a pointer to a new Credentials object wrapping the // Provider. // // The provider defaults to the DefaultNewCommandBuilder for creating command // the Provider will use to retrieve credentials with. func NewProvider(command string, options ...func(*Options)) *Provider { var args []string // Ensure that the command arguments are not set if the provided command is // empty. This will error out when the command is executed since no // arguments are specified. if len(command) > 0 { args = []string{command} } commanBuilder := DefaultNewCommandBuilder{ Args: args, } return NewProviderCommand(commanBuilder, options...) } // NewProviderCommand returns a pointer to a new Credentials object with the // specified command, and default timeout duration. Use this to provide custom // creation of exec.Cmd for options like environment variables, or other // configuration. func NewProviderCommand(builder NewCommandBuilder, options ...func(*Options)) *Provider { p := &Provider{ commandBuilder: builder, options: Options{ Timeout: DefaultTimeout, }, } for _, option := range options { option(&p.options) } return p } // A CredentialProcessResponse is the AWS credentials format that must be // returned when executing an external credential_process. type CredentialProcessResponse struct { // As of this writing, the Version key must be set to 1. This might // increment over time as the structure evolves. Version int // The access key ID that identifies the temporary security credentials. AccessKeyID string `json:"AccessKeyId"` // The secret access key that can be used to sign requests. SecretAccessKey string // The token that users must pass to the service API to use the temporary credentials. SessionToken string // The date on which the current credentials expire. Expiration *time.Time // The ID of the account for credentials AccountID string `json:"AccountId"` } // Retrieve executes the credential process command and returns the // credentials, or error if the command fails. func (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) { out, err := p.executeCredentialProcess(ctx) if err != nil { return aws.Credentials{Source: ProviderName}, err } // Serialize and validate response resp := &CredentialProcessResponse{} if err = json.Unmarshal(out, resp); err != nil { return aws.Credentials{Source: ProviderName}, &ProviderError{ Err: fmt.Errorf("parse failed of process output: %s, error: %w", out, err), } } if resp.Version != 1 { return aws.Credentials{Source: ProviderName}, &ProviderError{ Err: fmt.Errorf("wrong version in process output (not 1)"), } } if len(resp.AccessKeyID) == 0 { return aws.Credentials{Source: ProviderName}, &ProviderError{ Err: fmt.Errorf("missing AccessKeyId in process output"), } } if len(resp.SecretAccessKey) == 0 { return aws.Credentials{Source: ProviderName}, &ProviderError{ Err: fmt.Errorf("missing SecretAccessKey in process output"), } } creds := aws.Credentials{ Source: ProviderName, AccessKeyID: resp.AccessKeyID, SecretAccessKey: resp.SecretAccessKey, SessionToken: resp.SessionToken, AccountID: resp.AccountID, } // Handle expiration if resp.Expiration != nil { creds.CanExpire = true creds.Expires = *resp.Expiration } return creds, nil } // executeCredentialProcess starts the credential process on the OS and // returns the results or an error. func (p *Provider) executeCredentialProcess(ctx context.Context) ([]byte, error) { if p.options.Timeout >= 0 { var cancelFunc func() ctx, cancelFunc = context.WithTimeout(ctx, p.options.Timeout) defer cancelFunc() } cmd, err := p.commandBuilder.NewCommand(ctx) if err != nil { return nil, err } // get creds json on process's stdout output := bytes.NewBuffer(make([]byte, 0, int(8*sdkio.KibiByte))) if cmd.Stdout != nil { cmd.Stdout = io.MultiWriter(cmd.Stdout, output) } else { cmd.Stdout = output } execCh := make(chan error, 1) go executeCommand(cmd, execCh) select { case execError := <-execCh: if execError == nil { break } select { case <-ctx.Done(): return output.Bytes(), &ProviderError{ Err: fmt.Errorf("credential process timed out: %w", execError), } default: return output.Bytes(), &ProviderError{ Err: fmt.Errorf("error in credential_process: %w", execError), } } } out := output.Bytes() if runtime.GOOS == "windows" { // windows adds slashes to quotes out = bytes.ReplaceAll(out, []byte(`\"`), []byte(`"`)) } return out, nil } // ProviderSources returns the credential chain that was used to construct this provider func (p *Provider) ProviderSources() []aws.CredentialSource { if p.options.CredentialSources == nil { return []aws.CredentialSource{aws.CredentialSourceProcess} } return p.options.CredentialSources } func executeCommand(cmd *exec.Cmd, exec chan error) { // Start the command err := cmd.Start() if err == nil { err = cmd.Wait() } exec <- err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/doc.go ================================================ // Package ssocreds provides a credential provider for retrieving temporary AWS // credentials using an SSO access token. // // IMPORTANT: The provider in this package does not initiate or perform the AWS // SSO login flow. The SDK provider expects that you have already performed the // SSO login flow using AWS CLI using the "aws sso login" command, or by some // other mechanism. The provider must find a valid non-expired access token for // the AWS SSO user portal URL in ~/.aws/sso/cache. If a cached token is not // found, it is expired, or the file is malformed an error will be returned. // // # Loading AWS SSO credentials with the AWS shared configuration file // // You can use configure AWS SSO credentials from the AWS shared configuration file by // specifying the required keys in the profile and referencing an sso-session: // // sso_session // sso_account_id // sso_role_name // // For example, the following defines a profile "devsso" and specifies the AWS // SSO parameters that defines the target account, role, sign-on portal, and // the region where the user portal is located. Note: all SSO arguments must be // provided, or an error will be returned. // // [profile devsso] // sso_session = dev-session // sso_role_name = SSOReadOnlyRole // sso_account_id = 123456789012 // // [sso-session dev-session] // sso_start_url = https://my-sso-portal.awsapps.com/start // sso_region = us-east-1 // sso_registration_scopes = sso:account:access // // Using the config module, you can load the AWS SDK shared configuration, and // specify that this profile be used to retrieve credentials. For example: // // config, err := config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile("devsso")) // if err != nil { // return err // } // // # Programmatically loading AWS SSO credentials directly // // You can programmatically construct the AWS SSO Provider in your application, // and provide the necessary information to load and retrieve temporary // credentials using an access token from ~/.aws/sso/cache. // // ssoClient := sso.NewFromConfig(cfg) // ssoOidcClient := ssooidc.NewFromConfig(cfg) // tokenPath, err := ssocreds.StandardCachedTokenFilepath("dev-session") // if err != nil { // return err // } // // var provider aws.CredentialsProvider // provider = ssocreds.New(ssoClient, "123456789012", "SSOReadOnlyRole", "https://my-sso-portal.awsapps.com/start", func(options *ssocreds.Options) { // options.SSOTokenProvider = ssocreds.NewSSOTokenProvider(ssoOidcClient, tokenPath) // }) // // // Wrap the provider with aws.CredentialsCache to cache the credentials until their expire time // provider = aws.NewCredentialsCache(provider) // // credentials, err := provider.Retrieve(context.TODO()) // if err != nil { // return err // } // // It is important that you wrap the Provider with aws.CredentialsCache if you // are programmatically constructing the provider directly. This prevents your // application from accessing the cached access token and requesting new // credentials each time the credentials are used. // // # Additional Resources // // Configuring the AWS CLI to use AWS Single Sign-On: // https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html // // AWS Single Sign-On User Guide: // https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html package ssocreds ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_cached_token.go ================================================ package ssocreds import ( "crypto/sha1" "encoding/hex" "encoding/json" "fmt" "io/ioutil" "os" "path/filepath" "strconv" "strings" "time" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/aws-sdk-go-v2/internal/shareddefaults" ) var osUserHomeDur = shareddefaults.UserHomeDir // StandardCachedTokenFilepath returns the filepath for the cached SSO token file, or // error if unable get derive the path. Key that will be used to compute a SHA1 // value that is hex encoded. // // Derives the filepath using the Key as: // // ~/.aws/sso/cache/.json func StandardCachedTokenFilepath(key string) (string, error) { homeDir := osUserHomeDur() if len(homeDir) == 0 { return "", fmt.Errorf("unable to get USER's home directory for cached token") } hash := sha1.New() if _, err := hash.Write([]byte(key)); err != nil { return "", fmt.Errorf("unable to compute cached token filepath key SHA1 hash, %w", err) } cacheFilename := strings.ToLower(hex.EncodeToString(hash.Sum(nil))) + ".json" return filepath.Join(homeDir, ".aws", "sso", "cache", cacheFilename), nil } type tokenKnownFields struct { AccessToken string `json:"accessToken,omitempty"` ExpiresAt *rfc3339 `json:"expiresAt,omitempty"` RefreshToken string `json:"refreshToken,omitempty"` ClientID string `json:"clientId,omitempty"` ClientSecret string `json:"clientSecret,omitempty"` } type token struct { tokenKnownFields UnknownFields map[string]interface{} `json:"-"` } func (t token) MarshalJSON() ([]byte, error) { fields := map[string]interface{}{} setTokenFieldString(fields, "accessToken", t.AccessToken) setTokenFieldRFC3339(fields, "expiresAt", t.ExpiresAt) setTokenFieldString(fields, "refreshToken", t.RefreshToken) setTokenFieldString(fields, "clientId", t.ClientID) setTokenFieldString(fields, "clientSecret", t.ClientSecret) for k, v := range t.UnknownFields { if _, ok := fields[k]; ok { return nil, fmt.Errorf("unknown token field %v, duplicates known field", k) } fields[k] = v } return json.Marshal(fields) } func setTokenFieldString(fields map[string]interface{}, key, value string) { if value == "" { return } fields[key] = value } func setTokenFieldRFC3339(fields map[string]interface{}, key string, value *rfc3339) { if value == nil { return } fields[key] = value } func (t *token) UnmarshalJSON(b []byte) error { var fields map[string]interface{} if err := json.Unmarshal(b, &fields); err != nil { return nil } t.UnknownFields = map[string]interface{}{} for k, v := range fields { var err error switch k { case "accessToken": err = getTokenFieldString(v, &t.AccessToken) case "expiresAt": err = getTokenFieldRFC3339(v, &t.ExpiresAt) case "refreshToken": err = getTokenFieldString(v, &t.RefreshToken) case "clientId": err = getTokenFieldString(v, &t.ClientID) case "clientSecret": err = getTokenFieldString(v, &t.ClientSecret) default: t.UnknownFields[k] = v } if err != nil { return fmt.Errorf("field %q, %w", k, err) } } return nil } func getTokenFieldString(v interface{}, value *string) error { var ok bool *value, ok = v.(string) if !ok { return fmt.Errorf("expect value to be string, got %T", v) } return nil } func getTokenFieldRFC3339(v interface{}, value **rfc3339) error { var stringValue string if err := getTokenFieldString(v, &stringValue); err != nil { return err } timeValue, err := parseRFC3339(stringValue) if err != nil { return err } *value = &timeValue return nil } func loadCachedToken(filename string) (token, error) { fileBytes, err := ioutil.ReadFile(filename) if err != nil { return token{}, fmt.Errorf("failed to read cached SSO token file, %w", err) } var t token if err := json.Unmarshal(fileBytes, &t); err != nil { return token{}, fmt.Errorf("failed to parse cached SSO token file, %w", err) } if len(t.AccessToken) == 0 || t.ExpiresAt == nil || time.Time(*t.ExpiresAt).IsZero() { return token{}, fmt.Errorf( "cached SSO token must contain accessToken and expiresAt fields") } return t, nil } func storeCachedToken(filename string, t token, fileMode os.FileMode) (err error) { tmpFilename := filename + ".tmp-" + strconv.FormatInt(sdk.NowTime().UnixNano(), 10) if err := writeCacheFile(tmpFilename, fileMode, t); err != nil { return err } if err := os.Rename(tmpFilename, filename); err != nil { return fmt.Errorf("failed to replace old cached SSO token file, %w", err) } return nil } func writeCacheFile(filename string, fileMode os.FileMode, t token) (err error) { var f *os.File f, err = os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_RDWR, fileMode) if err != nil { return fmt.Errorf("failed to create cached SSO token file %w", err) } defer func() { closeErr := f.Close() if err == nil && closeErr != nil { err = fmt.Errorf("failed to close cached SSO token file, %w", closeErr) } }() encoder := json.NewEncoder(f) if err = encoder.Encode(t); err != nil { return fmt.Errorf("failed to serialize cached SSO token, %w", err) } return nil } type rfc3339 time.Time func parseRFC3339(v string) (rfc3339, error) { parsed, err := time.Parse(time.RFC3339, v) if err != nil { return rfc3339{}, fmt.Errorf("expected RFC3339 timestamp: %w", err) } return rfc3339(parsed), nil } func (r *rfc3339) UnmarshalJSON(bytes []byte) (err error) { var value string // Use JSON unmarshal to unescape the quoted value making use of JSON's // unquoting rules. if err = json.Unmarshal(bytes, &value); err != nil { return err } *r, err = parseRFC3339(value) return nil } func (r *rfc3339) MarshalJSON() ([]byte, error) { value := time.Time(*r).UTC().Format(time.RFC3339) // Use JSON unmarshal to unescape the quoted value making use of JSON's // quoting rules. return json.Marshal(value) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_credentials_provider.go ================================================ package ssocreds import ( "context" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/aws-sdk-go-v2/service/sso" ) // ProviderName is the name of the provider used to specify the source of // credentials. const ProviderName = "SSOProvider" // GetRoleCredentialsAPIClient is a API client that implements the // GetRoleCredentials operation. type GetRoleCredentialsAPIClient interface { GetRoleCredentials(context.Context, *sso.GetRoleCredentialsInput, ...func(*sso.Options)) ( *sso.GetRoleCredentialsOutput, error, ) } // Options is the Provider options structure. type Options struct { // The Client which is configured for the AWS Region where the AWS SSO user // portal is located. Client GetRoleCredentialsAPIClient // The AWS account that is assigned to the user. AccountID string // The role name that is assigned to the user. RoleName string // The URL that points to the organization's AWS Single Sign-On (AWS SSO) // user portal. StartURL string // The filepath the cached token will be retrieved from. If unset Provider will // use the startURL to determine the filepath at. // // ~/.aws/sso/cache/.json // // If custom cached token filepath is used, the Provider's startUrl // parameter will be ignored. CachedTokenFilepath string // Used by the SSOCredentialProvider if a token configuration // profile is used in the shared config SSOTokenProvider *SSOTokenProvider // The chain of providers that was used to create this provider. // These values are for reporting purposes and are not meant to be set up directly CredentialSources []aws.CredentialSource } // Provider is an AWS credential provider that retrieves temporary AWS // credentials by exchanging an SSO login token. type Provider struct { options Options cachedTokenFilepath string } // New returns a new AWS Single Sign-On (AWS SSO) credential provider. The // provided client is expected to be configured for the AWS Region where the // AWS SSO user portal is located. func New(client GetRoleCredentialsAPIClient, accountID, roleName, startURL string, optFns ...func(options *Options)) *Provider { options := Options{ Client: client, AccountID: accountID, RoleName: roleName, StartURL: startURL, } for _, fn := range optFns { fn(&options) } return &Provider{ options: options, cachedTokenFilepath: options.CachedTokenFilepath, } } // Retrieve retrieves temporary AWS credentials from the configured Amazon // Single Sign-On (AWS SSO) user portal by exchanging the accessToken present // in ~/.aws/sso/cache. However, if a token provider configuration exists // in the shared config, then we ought to use the token provider rather then // direct access on the cached token. func (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) { var accessToken *string if p.options.SSOTokenProvider != nil { token, err := p.options.SSOTokenProvider.RetrieveBearerToken(ctx) if err != nil { return aws.Credentials{}, err } accessToken = &token.Value } else { if p.cachedTokenFilepath == "" { cachedTokenFilepath, err := StandardCachedTokenFilepath(p.options.StartURL) if err != nil { return aws.Credentials{}, &InvalidTokenError{Err: err} } p.cachedTokenFilepath = cachedTokenFilepath } tokenFile, err := loadCachedToken(p.cachedTokenFilepath) if err != nil { return aws.Credentials{}, &InvalidTokenError{Err: err} } if tokenFile.ExpiresAt == nil || sdk.NowTime().After(time.Time(*tokenFile.ExpiresAt)) { return aws.Credentials{}, &InvalidTokenError{} } accessToken = &tokenFile.AccessToken } output, err := p.options.Client.GetRoleCredentials(ctx, &sso.GetRoleCredentialsInput{ AccessToken: accessToken, AccountId: &p.options.AccountID, RoleName: &p.options.RoleName, }) if err != nil { return aws.Credentials{}, err } return aws.Credentials{ AccessKeyID: aws.ToString(output.RoleCredentials.AccessKeyId), SecretAccessKey: aws.ToString(output.RoleCredentials.SecretAccessKey), SessionToken: aws.ToString(output.RoleCredentials.SessionToken), CanExpire: true, Expires: time.Unix(0, output.RoleCredentials.Expiration*int64(time.Millisecond)).UTC(), Source: ProviderName, AccountID: p.options.AccountID, }, nil } // ProviderSources returns the credential chain that was used to construct this provider func (p *Provider) ProviderSources() []aws.CredentialSource { if p.options.CredentialSources == nil { return []aws.CredentialSource{aws.CredentialSourceSSO} } return p.options.CredentialSources } // InvalidTokenError is the error type that is returned if loaded token has // expired or is otherwise invalid. To refresh the SSO session run AWS SSO // login with the corresponding profile. type InvalidTokenError struct { Err error } func (i *InvalidTokenError) Unwrap() error { return i.Err } func (i *InvalidTokenError) Error() string { const msg = "the SSO session has expired or is invalid" if i.Err == nil { return msg } return msg + ": " + i.Err.Error() } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_token_provider.go ================================================ package ssocreds import ( "context" "fmt" "os" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/aws-sdk-go-v2/service/ssooidc" "github.com/aws/smithy-go/auth/bearer" ) // CreateTokenAPIClient provides the interface for the SSOTokenProvider's API // client for calling CreateToken operation to refresh the SSO token. type CreateTokenAPIClient interface { CreateToken(context.Context, *ssooidc.CreateTokenInput, ...func(*ssooidc.Options)) ( *ssooidc.CreateTokenOutput, error, ) } // SSOTokenProviderOptions provides the options for configuring the // SSOTokenProvider. type SSOTokenProviderOptions struct { // Client that can be overridden Client CreateTokenAPIClient // The set of API Client options to be applied when invoking the // CreateToken operation. ClientOptions []func(*ssooidc.Options) // The path the file containing the cached SSO token will be read from. // Initialized the NewSSOTokenProvider's cachedTokenFilepath parameter. CachedTokenFilepath string } // SSOTokenProvider provides an utility for refreshing SSO AccessTokens for // Bearer Authentication. The SSOTokenProvider can only be used to refresh // already cached SSO Tokens. This utility cannot perform the initial SSO // create token. // // The SSOTokenProvider is not safe to use concurrently. It must be wrapped in // a utility such as smithy-go's auth/bearer#TokenCache. The SDK's // config.LoadDefaultConfig will automatically wrap the SSOTokenProvider with // the smithy-go TokenCache, if the external configuration loaded configured // for an SSO session. // // The initial SSO create token should be preformed with the AWS CLI before the // Go application using the SSOTokenProvider will need to retrieve the SSO // token. If the AWS CLI has not created the token cache file, this provider // will return an error when attempting to retrieve the cached token. // // This provider will attempt to refresh the cached SSO token periodically if // needed when RetrieveBearerToken is called. // // A utility such as the AWS CLI must be used to initially create the SSO // session and cached token file. // https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html type SSOTokenProvider struct { options SSOTokenProviderOptions } var _ bearer.TokenProvider = (*SSOTokenProvider)(nil) // NewSSOTokenProvider returns an initialized SSOTokenProvider that will // periodically refresh the SSO token cached stored in the cachedTokenFilepath. // The cachedTokenFilepath file's content will be rewritten by the token // provider when the token is refreshed. // // The client must be configured for the AWS region the SSO token was created for. func NewSSOTokenProvider(client CreateTokenAPIClient, cachedTokenFilepath string, optFns ...func(o *SSOTokenProviderOptions)) *SSOTokenProvider { options := SSOTokenProviderOptions{ Client: client, CachedTokenFilepath: cachedTokenFilepath, } for _, fn := range optFns { fn(&options) } provider := &SSOTokenProvider{ options: options, } return provider } // RetrieveBearerToken returns the SSO token stored in the cachedTokenFilepath // the SSOTokenProvider was created with. If the token has expired // RetrieveBearerToken will attempt to refresh it. If the token cannot be // refreshed or is not present an error will be returned. // // A utility such as the AWS CLI must be used to initially create the SSO // session and cached token file. https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html func (p SSOTokenProvider) RetrieveBearerToken(ctx context.Context) (bearer.Token, error) { cachedToken, err := loadCachedToken(p.options.CachedTokenFilepath) if err != nil { return bearer.Token{}, err } if cachedToken.ExpiresAt != nil && sdk.NowTime().After(time.Time(*cachedToken.ExpiresAt)) { cachedToken, err = p.refreshToken(ctx, cachedToken) if err != nil { return bearer.Token{}, fmt.Errorf("refresh cached SSO token failed, %w", err) } } expiresAt := aws.ToTime((*time.Time)(cachedToken.ExpiresAt)) return bearer.Token{ Value: cachedToken.AccessToken, CanExpire: !expiresAt.IsZero(), Expires: expiresAt, }, nil } func (p SSOTokenProvider) refreshToken(ctx context.Context, cachedToken token) (token, error) { if cachedToken.ClientSecret == "" || cachedToken.ClientID == "" || cachedToken.RefreshToken == "" { return token{}, fmt.Errorf("cached SSO token is expired, or not present, and cannot be refreshed") } createResult, err := p.options.Client.CreateToken(ctx, &ssooidc.CreateTokenInput{ ClientId: &cachedToken.ClientID, ClientSecret: &cachedToken.ClientSecret, RefreshToken: &cachedToken.RefreshToken, GrantType: aws.String("refresh_token"), }, p.options.ClientOptions...) if err != nil { return token{}, fmt.Errorf("unable to refresh SSO token, %w", err) } expiresAt := sdk.NowTime().Add(time.Duration(createResult.ExpiresIn) * time.Second) cachedToken.AccessToken = aws.ToString(createResult.AccessToken) cachedToken.ExpiresAt = (*rfc3339)(&expiresAt) cachedToken.RefreshToken = aws.ToString(createResult.RefreshToken) fileInfo, err := os.Stat(p.options.CachedTokenFilepath) if err != nil { return token{}, fmt.Errorf("failed to stat cached SSO token file %w", err) } if err = storeCachedToken(p.options.CachedTokenFilepath, cachedToken, fileInfo.Mode()); err != nil { return token{}, fmt.Errorf("unable to cache refreshed SSO token, %w", err) } return cachedToken, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/static_provider.go ================================================ package credentials import ( "context" "github.com/aws/aws-sdk-go-v2/aws" ) const ( // StaticCredentialsName provides a name of Static provider StaticCredentialsName = "StaticCredentials" ) // StaticCredentialsEmptyError is emitted when static credentials are empty. type StaticCredentialsEmptyError struct{} func (*StaticCredentialsEmptyError) Error() string { return "static credentials are empty" } // A StaticCredentialsProvider is a set of credentials which are set, and will // never expire. type StaticCredentialsProvider struct { Value aws.Credentials // These values are for reporting purposes and are not meant to be set up directly Source []aws.CredentialSource } // ProviderSources returns the credential chain that was used to construct this provider func (s StaticCredentialsProvider) ProviderSources() []aws.CredentialSource { if s.Source == nil { return []aws.CredentialSource{aws.CredentialSourceCode} // If no source has been set, assume this is used directly which means hardcoded creds } return s.Source } // NewStaticCredentialsProvider return a StaticCredentialsProvider initialized with the AWS // credentials passed in. func NewStaticCredentialsProvider(key, secret, session string) StaticCredentialsProvider { return StaticCredentialsProvider{ Value: aws.Credentials{ AccessKeyID: key, SecretAccessKey: secret, SessionToken: session, }, } } // Retrieve returns the credentials or error if the credentials are invalid. func (s StaticCredentialsProvider) Retrieve(_ context.Context) (aws.Credentials, error) { v := s.Value if v.AccessKeyID == "" || v.SecretAccessKey == "" { return aws.Credentials{ Source: StaticCredentialsName, }, &StaticCredentialsEmptyError{} } if len(v.Source) == 0 { v.Source = StaticCredentialsName } return v, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/assume_role_provider.go ================================================ // Package stscreds are credential Providers to retrieve STS AWS credentials. // // STS provides multiple ways to retrieve credentials which can be used when making // future AWS service API operation calls. // // The SDK will ensure that per instance of credentials.Credentials all requests // to refresh the credentials will be synchronized. But, the SDK is unable to // ensure synchronous usage of the AssumeRoleProvider if the value is shared // between multiple Credentials or service clients. // // # Assume Role // // To assume an IAM role using STS with the SDK you can create a new Credentials // with the SDKs's stscreds package. // // // Initial credentials loaded from SDK's default credential chain. Such as // // the environment, shared credentials (~/.aws/credentials), or EC2 Instance // // Role. These credentials will be used to to make the STS Assume Role API. // cfg, err := config.LoadDefaultConfig(context.TODO()) // if err != nil { // panic(err) // } // // // Create the credentials from AssumeRoleProvider to assume the role // // referenced by the "myRoleARN" ARN. // stsSvc := sts.NewFromConfig(cfg) // creds := stscreds.NewAssumeRoleProvider(stsSvc, "myRoleArn") // // cfg.Credentials = aws.NewCredentialsCache(creds) // // // Create service client value configured for credentials // // from assumed role. // svc := s3.NewFromConfig(cfg) // // # Assume Role with custom MFA Token provider // // To assume an IAM role with a MFA token you can either specify a custom MFA // token provider or use the SDK's built in StdinTokenProvider that will prompt // the user for a token code each time the credentials need to to be refreshed. // Specifying a custom token provider allows you to control where the token // code is retrieved from, and how it is refreshed. // // With a custom token provider, the provider is responsible for refreshing the // token code when called. // // cfg, err := config.LoadDefaultConfig(context.TODO()) // if err != nil { // panic(err) // } // // staticTokenProvider := func() (string, error) { // return someTokenCode, nil // } // // // Create the credentials from AssumeRoleProvider to assume the role // // referenced by the "myRoleARN" ARN using the MFA token code provided. // creds := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), "myRoleArn", func(o *stscreds.AssumeRoleOptions) { // o.SerialNumber = aws.String("myTokenSerialNumber") // o.TokenProvider = staticTokenProvider // }) // // cfg.Credentials = aws.NewCredentialsCache(creds) // // // Create service client value configured for credentials // // from assumed role. // svc := s3.NewFromConfig(cfg) // // # Assume Role with MFA Token Provider // // To assume an IAM role with MFA for longer running tasks where the credentials // may need to be refreshed setting the TokenProvider field of AssumeRoleProvider // will allow the credential provider to prompt for new MFA token code when the // role's credentials need to be refreshed. // // The StdinTokenProvider function is available to prompt on stdin to retrieve // the MFA token code from the user. You can also implement custom prompts by // satisfying the TokenProvider function signature. // // Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will // have undesirable results as the StdinTokenProvider will not be synchronized. A // single Credentials with an AssumeRoleProvider can be shared safely. // // cfg, err := config.LoadDefaultConfig(context.TODO()) // if err != nil { // panic(err) // } // // // Create the credentials from AssumeRoleProvider to assume the role // // referenced by the "myRoleARN" ARN using the MFA token code provided. // creds := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), "myRoleArn", func(o *stscreds.AssumeRoleOptions) { // o.SerialNumber = aws.String("myTokenSerialNumber") // o.TokenProvider = stscreds.StdinTokenProvider // }) // // cfg.Credentials = aws.NewCredentialsCache(creds) // // // Create service client value configured for credentials // // from assumed role. // svc := s3.NewFromConfig(cfg) package stscreds import ( "context" "fmt" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/sts" "github.com/aws/aws-sdk-go-v2/service/sts/types" ) // StdinTokenProvider will prompt on stdout and read from stdin for a string value. // An error is returned if reading from stdin fails. // // Use this function go read MFA tokens from stdin. The function makes no attempt // to make atomic prompts from stdin across multiple gorouties. // // Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will // have undesirable results as the StdinTokenProvider will not be synchronized. A // single Credentials with an AssumeRoleProvider can be shared safely // // Will wait forever until something is provided on the stdin. func StdinTokenProvider() (string, error) { var v string fmt.Printf("Assume Role MFA token code: ") _, err := fmt.Scanln(&v) return v, err } // ProviderName provides a name of AssumeRole provider const ProviderName = "AssumeRoleProvider" // AssumeRoleAPIClient is a client capable of the STS AssumeRole operation. type AssumeRoleAPIClient interface { AssumeRole(ctx context.Context, params *sts.AssumeRoleInput, optFns ...func(*sts.Options)) (*sts.AssumeRoleOutput, error) } // DefaultDuration is the default amount of time in minutes that the // credentials will be valid for. This value is only used by AssumeRoleProvider // for specifying the default expiry duration of an assume role. // // Other providers such as WebIdentityRoleProvider do not use this value, and // instead rely on STS API's default parameter handing to assign a default // value. var DefaultDuration = time.Duration(15) * time.Minute // AssumeRoleProvider retrieves temporary credentials from the STS service, and // keeps track of their expiration time. // // This credential provider will be used by the SDKs default credential change // when shared configuration is enabled, and the shared config or shared credentials // file configure assume role. See Session docs for how to do this. // // AssumeRoleProvider does not provide any synchronization and it is not safe // to share this value across multiple Credentials, Sessions, or service clients // without also sharing the same Credentials instance. type AssumeRoleProvider struct { options AssumeRoleOptions } // AssumeRoleOptions is the configurable options for AssumeRoleProvider type AssumeRoleOptions struct { // Client implementation of the AssumeRole operation. Required Client AssumeRoleAPIClient // IAM Role ARN to be assumed. Required RoleARN string // Session name, if you wish to uniquely identify this session. RoleSessionName string // Expiry duration of the STS credentials. Defaults to 15 minutes if not set. Duration time.Duration // Optional ExternalID to pass along, defaults to nil if not set. ExternalID *string // The policy plain text must be 2048 bytes or shorter. However, an internal // conversion compresses it into a packed binary format with a separate limit. // The PackedPolicySize response element indicates by percentage how close to // the upper size limit the policy is, with 100% equaling the maximum allowed // size. Policy *string // The ARNs of IAM managed policies you want to use as managed session policies. // The policies must exist in the same account as the role. // // This parameter is optional. You can provide up to 10 managed policy ARNs. // However, the plain text that you use for both inline and managed session // policies can't exceed 2,048 characters. // // An AWS conversion compresses the passed session policies and session tags // into a packed binary format that has a separate limit. Your request can fail // for this limit even if your plain text meets the other requirements. The // PackedPolicySize response element indicates by percentage how close the policies // and tags for your request are to the upper size limit. // // Passing policies to this operation returns new temporary credentials. The // resulting session's permissions are the intersection of the role's identity-based // policy and the session policies. You can use the role's temporary credentials // in subsequent AWS API calls to access resources in the account that owns // the role. You cannot use session policies to grant more permissions than // those allowed by the identity-based policy of the role that is being assumed. // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) // in the IAM User Guide. PolicyARNs []types.PolicyDescriptorType // The identification number of the MFA device that is associated with the user // who is making the AssumeRole call. Specify this value if the trust policy // of the role being assumed includes a condition that requires MFA authentication. // The value is either the serial number for a hardware device (such as GAHT12345678) // or an Amazon Resource Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user). SerialNumber *string // The source identity specified by the principal that is calling the AssumeRole // operation. You can require users to specify a source identity when they assume a // role. You do this by using the sts:SourceIdentity condition key in a role trust // policy. You can use source identity information in CloudTrail logs to determine // who took actions with a role. You can use the aws:SourceIdentity condition key // to further control access to Amazon Web Services resources based on the value of // source identity. For more information about using source identity, see Monitor // and control actions taken with assumed roles // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html) // in the IAM User Guide. SourceIdentity *string // Async method of providing MFA token code for assuming an IAM role with MFA. // The value returned by the function will be used as the TokenCode in the Retrieve // call. See StdinTokenProvider for a provider that prompts and reads from stdin. // // This token provider will be called when ever the assumed role's // credentials need to be refreshed when SerialNumber is set. TokenProvider func() (string, error) // A list of session tags that you want to pass. Each session tag consists of a key // name and an associated value. For more information about session tags, see // Tagging STS Sessions // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) in the // IAM User Guide. This parameter is optional. You can pass up to 50 session tags. Tags []types.Tag // A list of keys for session tags that you want to set as transitive. If you set a // tag key as transitive, the corresponding key and value passes to subsequent // sessions in a role chain. For more information, see Chaining Roles with Session // Tags // (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining) // in the IAM User Guide. This parameter is optional. TransitiveTagKeys []string // The chain of providers that was used to create this provider // These values are for reporting purposes and are not meant to be set up directly CredentialSources []aws.CredentialSource } // NewAssumeRoleProvider constructs and returns a credentials provider that // will retrieve credentials by assuming a IAM role using STS. func NewAssumeRoleProvider(client AssumeRoleAPIClient, roleARN string, optFns ...func(*AssumeRoleOptions)) *AssumeRoleProvider { o := AssumeRoleOptions{ Client: client, RoleARN: roleARN, } for _, fn := range optFns { fn(&o) } return &AssumeRoleProvider{ options: o, } } // Retrieve generates a new set of temporary credentials using STS. func (p *AssumeRoleProvider) Retrieve(ctx context.Context) (aws.Credentials, error) { // Apply defaults where parameters are not set. if len(p.options.RoleSessionName) == 0 { // Try to work out a role name that will hopefully end up unique. p.options.RoleSessionName = fmt.Sprintf("aws-go-sdk-%d", time.Now().UTC().UnixNano()) } if p.options.Duration == 0 { // Expire as often as AWS permits. p.options.Duration = DefaultDuration } input := &sts.AssumeRoleInput{ DurationSeconds: aws.Int32(int32(p.options.Duration / time.Second)), PolicyArns: p.options.PolicyARNs, RoleArn: aws.String(p.options.RoleARN), RoleSessionName: aws.String(p.options.RoleSessionName), ExternalId: p.options.ExternalID, SourceIdentity: p.options.SourceIdentity, Tags: p.options.Tags, TransitiveTagKeys: p.options.TransitiveTagKeys, } if p.options.Policy != nil { input.Policy = p.options.Policy } if p.options.SerialNumber != nil { if p.options.TokenProvider != nil { input.SerialNumber = p.options.SerialNumber code, err := p.options.TokenProvider() if err != nil { return aws.Credentials{}, err } input.TokenCode = aws.String(code) } else { return aws.Credentials{}, fmt.Errorf("assume role with MFA enabled, but TokenProvider is not set") } } resp, err := p.options.Client.AssumeRole(ctx, input) if err != nil { return aws.Credentials{Source: ProviderName}, err } var accountID string if resp.AssumedRoleUser != nil { accountID = getAccountID(resp.AssumedRoleUser) } return aws.Credentials{ AccessKeyID: *resp.Credentials.AccessKeyId, SecretAccessKey: *resp.Credentials.SecretAccessKey, SessionToken: *resp.Credentials.SessionToken, Source: ProviderName, CanExpire: true, Expires: *resp.Credentials.Expiration, AccountID: accountID, }, nil } // ProviderSources returns the credential chain that was used to construct this provider func (p *AssumeRoleProvider) ProviderSources() []aws.CredentialSource { if p.options.CredentialSources == nil { return []aws.CredentialSource{aws.CredentialSourceSTSAssumeRole} } // If no source has been set, assume this is used directly which means just call to assume role return append(p.options.CredentialSources, aws.CredentialSourceSTSAssumeRole) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/web_identity_provider.go ================================================ package stscreds import ( "context" "fmt" "io/ioutil" "strconv" "strings" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/retry" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/aws-sdk-go-v2/service/sts" "github.com/aws/aws-sdk-go-v2/service/sts/types" ) var invalidIdentityTokenExceptionCode = (&types.InvalidIdentityTokenException{}).ErrorCode() const ( // WebIdentityProviderName is the web identity provider name WebIdentityProviderName = "WebIdentityCredentials" ) // AssumeRoleWithWebIdentityAPIClient is a client capable of the STS AssumeRoleWithWebIdentity operation. type AssumeRoleWithWebIdentityAPIClient interface { AssumeRoleWithWebIdentity(ctx context.Context, params *sts.AssumeRoleWithWebIdentityInput, optFns ...func(*sts.Options)) (*sts.AssumeRoleWithWebIdentityOutput, error) } // WebIdentityRoleProvider is used to retrieve credentials using // an OIDC token. type WebIdentityRoleProvider struct { options WebIdentityRoleOptions } // WebIdentityRoleOptions is a structure of configurable options for WebIdentityRoleProvider type WebIdentityRoleOptions struct { // Client implementation of the AssumeRoleWithWebIdentity operation. Required Client AssumeRoleWithWebIdentityAPIClient // JWT Token Provider. Required TokenRetriever IdentityTokenRetriever // IAM Role ARN to assume. Required RoleARN string // Session name, if you wish to uniquely identify this session. RoleSessionName string // Expiry duration of the STS credentials. STS will assign a default expiry // duration if this value is unset. This is different from the Duration // option of AssumeRoleProvider, which automatically assigns 15 minutes if // Duration is unset. // // See the STS AssumeRoleWithWebIdentity API reference guide for more // information on defaults. // https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html Duration time.Duration // An IAM policy in JSON format that you want to use as an inline session policy. Policy *string // The Amazon Resource Names (ARNs) of the IAM managed policies that you // want to use as managed session policies. The policies must exist in the // same account as the role. PolicyARNs []types.PolicyDescriptorType // The chain of providers that was used to create this provider // These values are for reporting purposes and are not meant to be set up directly CredentialSources []aws.CredentialSource } // IdentityTokenRetriever is an interface for retrieving a JWT type IdentityTokenRetriever interface { GetIdentityToken() ([]byte, error) } // IdentityTokenFile is for retrieving an identity token from the given file name type IdentityTokenFile string // GetIdentityToken retrieves the JWT token from the file and returns the contents as a []byte func (j IdentityTokenFile) GetIdentityToken() ([]byte, error) { b, err := ioutil.ReadFile(string(j)) if err != nil { return nil, fmt.Errorf("unable to read file at %s: %v", string(j), err) } return b, nil } // NewWebIdentityRoleProvider will return a new WebIdentityRoleProvider with the // provided stsiface.ClientAPI func NewWebIdentityRoleProvider(client AssumeRoleWithWebIdentityAPIClient, roleARN string, tokenRetriever IdentityTokenRetriever, optFns ...func(*WebIdentityRoleOptions)) *WebIdentityRoleProvider { o := WebIdentityRoleOptions{ Client: client, RoleARN: roleARN, TokenRetriever: tokenRetriever, } for _, fn := range optFns { fn(&o) } return &WebIdentityRoleProvider{options: o} } // Retrieve will attempt to assume a role from a token which is located at // 'WebIdentityTokenFilePath' specified destination and if that is empty an // error will be returned. func (p *WebIdentityRoleProvider) Retrieve(ctx context.Context) (aws.Credentials, error) { b, err := p.options.TokenRetriever.GetIdentityToken() if err != nil { return aws.Credentials{}, fmt.Errorf("failed to retrieve jwt from provide source, %w", err) } sessionName := p.options.RoleSessionName if len(sessionName) == 0 { // session name is used to uniquely identify a session. This simply // uses unix time in nanoseconds to uniquely identify sessions. sessionName = strconv.FormatInt(sdk.NowTime().UnixNano(), 10) } input := &sts.AssumeRoleWithWebIdentityInput{ PolicyArns: p.options.PolicyARNs, RoleArn: &p.options.RoleARN, RoleSessionName: &sessionName, WebIdentityToken: aws.String(string(b)), } if p.options.Duration != 0 { // If set use the value, otherwise STS will assign a default expiration duration. input.DurationSeconds = aws.Int32(int32(p.options.Duration / time.Second)) } if p.options.Policy != nil { input.Policy = p.options.Policy } resp, err := p.options.Client.AssumeRoleWithWebIdentity(ctx, input, func(options *sts.Options) { options.Retryer = retry.AddWithErrorCodes(options.Retryer, invalidIdentityTokenExceptionCode) }) if err != nil { return aws.Credentials{}, fmt.Errorf("failed to retrieve credentials, %w", err) } var accountID string if resp.AssumedRoleUser != nil { accountID = getAccountID(resp.AssumedRoleUser) } // InvalidIdentityToken error is a temporary error that can occur // when assuming an Role with a JWT web identity token. value := aws.Credentials{ AccessKeyID: aws.ToString(resp.Credentials.AccessKeyId), SecretAccessKey: aws.ToString(resp.Credentials.SecretAccessKey), SessionToken: aws.ToString(resp.Credentials.SessionToken), Source: WebIdentityProviderName, CanExpire: true, Expires: *resp.Credentials.Expiration, AccountID: accountID, } return value, nil } // extract accountID from arn with format "arn:partition:service:region:account-id:[resource-section]" func getAccountID(u *types.AssumedRoleUser) string { if u.Arn == nil { return "" } parts := strings.Split(*u.Arn, ":") if len(parts) < 5 { return "" } return parts[4] } // ProviderSources returns the credential chain that was used to construct this provider func (p *WebIdentityRoleProvider) ProviderSources() []aws.CredentialSource { if p.options.CredentialSources == nil { return []aws.CredentialSource{aws.CredentialSourceSTSAssumeRoleWebID} } return p.options.CredentialSources } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md ================================================ # v1.16.30 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.29 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.16.28 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.27 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.26 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.25 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.16.24 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.23 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.22 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.21 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.20 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.16.19 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.18 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.17 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.16 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.15 (2024-10-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.14 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.13 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.12 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.16.11 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.10 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.9 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.8 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.7 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.6 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.5 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.4 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.3 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.2 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.1 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.0 (2024-03-21) * **Feature**: Add config switch `DisableDefaultTimeout` that allows you to disable the default operation timeout (5 seconds) for IMDS calls. # v1.15.4 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.3 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.15.2 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.1 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.14.11 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.10 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.9 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.8 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.7 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.6 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.5 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.4 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.3 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.2 (2023-11-02) * No change notes available for this release. # v1.14.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.13.13 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.12 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.11 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.10 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.9 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.8 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.7 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.6 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.5 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.4 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.3 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.2 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.1 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.0 (2023-03-14) * **Feature**: Add flag to disable IMDSv1 fallback # v1.12.24 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.23 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.22 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.21 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.20 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.19 (2022-10-24) * **Bug Fix**: Fixes an issue that prevented logging of the API request or responses when the respective log modes were enabled. * **Dependency Update**: Updated to the latest SDK module versions # v1.12.18 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.17 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.16 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.15 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.14 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.13 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.12 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.11 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.10 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.9 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.8 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.7 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.6 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.5 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.4 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2022-02-24) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.9.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.8.2 (2021-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.8.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.8.0 (2021-11-06) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.7.0 (2021-10-21) * **Feature**: Updated to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.6.0 (2021-10-11) * **Feature**: Respect passed in Context Deadline/Timeout. Updates the IMDS Client operations to not override the passed in Context's Deadline or Timeout options. If an Client operation is called with a Context with a Deadline or Timeout, the client will no longer override it with the client's default timeout. * **Bug Fix**: Fix IMDS client's response handling and operation timeout race. Fixes #1253 * **Dependency Update**: Updated to the latest SDK module versions # v1.5.1 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.0 (2021-08-27) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.1 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2021-08-04) * **Feature**: adds error handling for defered close calls * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-07-15) * **Feature**: Support has been added for EC2 IPv6-enabled Instance Metadata Service Endpoints. * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.1.1 (2021-05-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_client.go ================================================ package imds import ( "context" "fmt" "net" "net/http" "os" "strings" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/retry" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" internalconfig "github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config" "github.com/aws/smithy-go" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // ServiceID provides the unique name of this API client const ServiceID = "ec2imds" // Client provides the API client for interacting with the Amazon EC2 Instance // Metadata Service API. type Client struct { options Options } // ClientEnableState provides an enumeration if the client is enabled, // disabled, or default behavior. type ClientEnableState = internalconfig.ClientEnableState // Enumeration values for ClientEnableState const ( ClientDefaultEnableState ClientEnableState = internalconfig.ClientDefaultEnableState // default behavior ClientDisabled ClientEnableState = internalconfig.ClientDisabled // client disabled ClientEnabled ClientEnableState = internalconfig.ClientEnabled // client enabled ) // EndpointModeState is an enum configuration variable describing the client endpoint mode. // Not configurable directly, but used when using the NewFromConfig. type EndpointModeState = internalconfig.EndpointModeState // Enumeration values for EndpointModeState const ( EndpointModeStateUnset EndpointModeState = internalconfig.EndpointModeStateUnset EndpointModeStateIPv4 EndpointModeState = internalconfig.EndpointModeStateIPv4 EndpointModeStateIPv6 EndpointModeState = internalconfig.EndpointModeStateIPv6 ) const ( disableClientEnvVar = "AWS_EC2_METADATA_DISABLED" // Client endpoint options endpointEnvVar = "AWS_EC2_METADATA_SERVICE_ENDPOINT" defaultIPv4Endpoint = "http://169.254.169.254" defaultIPv6Endpoint = "http://[fd00:ec2::254]" ) // New returns an initialized Client based on the functional options. Provide // additional functional options to further configure the behavior of the client, // such as changing the client's endpoint or adding custom middleware behavior. func New(options Options, optFns ...func(*Options)) *Client { options = options.Copy() for _, fn := range optFns { fn(&options) } options.HTTPClient = resolveHTTPClient(options.HTTPClient) if options.Retryer == nil { options.Retryer = retry.NewStandard() } options.Retryer = retry.AddWithMaxBackoffDelay(options.Retryer, 1*time.Second) if options.ClientEnableState == ClientDefaultEnableState { if v := os.Getenv(disableClientEnvVar); strings.EqualFold(v, "true") { options.ClientEnableState = ClientDisabled } } if len(options.Endpoint) == 0 { if v := os.Getenv(endpointEnvVar); len(v) != 0 { options.Endpoint = v } } client := &Client{ options: options, } if client.options.tokenProvider == nil && !client.options.disableAPIToken { client.options.tokenProvider = newTokenProvider(client, defaultTokenTTL) } return client } // NewFromConfig returns an initialized Client based the AWS SDK config, and // functional options. Provide additional functional options to further // configure the behavior of the client, such as changing the client's endpoint // or adding custom middleware behavior. func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client { opts := Options{ APIOptions: append([]func(*middleware.Stack) error{}, cfg.APIOptions...), HTTPClient: cfg.HTTPClient, ClientLogMode: cfg.ClientLogMode, Logger: cfg.Logger, } if cfg.Retryer != nil { opts.Retryer = cfg.Retryer() } resolveClientEnableState(cfg, &opts) resolveEndpointConfig(cfg, &opts) resolveEndpointModeConfig(cfg, &opts) resolveEnableFallback(cfg, &opts) return New(opts, optFns...) } // Options provides the fields for configuring the API client's behavior. type Options struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation // call to modify this list for per operation behavior. APIOptions []func(*middleware.Stack) error // The endpoint the client will use to retrieve EC2 instance metadata. // // Specifies the EC2 Instance Metadata Service endpoint to use. If specified it overrides EndpointMode. // // If unset, and the environment variable AWS_EC2_METADATA_SERVICE_ENDPOINT // has a value the client will use the value of the environment variable as // the endpoint for operation calls. // // AWS_EC2_METADATA_SERVICE_ENDPOINT=http://[::1] Endpoint string // The endpoint selection mode the client will use if no explicit endpoint is provided using the Endpoint field. // // Setting EndpointMode to EndpointModeStateIPv4 will configure the client to use the default EC2 IPv4 endpoint. // Setting EndpointMode to EndpointModeStateIPv6 will configure the client to use the default EC2 IPv6 endpoint. // // By default if EndpointMode is not set (EndpointModeStateUnset) than the default endpoint selection mode EndpointModeStateIPv4. EndpointMode EndpointModeState // The HTTP client to invoke API calls with. Defaults to client's default // HTTP implementation if nil. HTTPClient HTTPClient // Retryer guides how HTTP requests should be retried in case of recoverable // failures. When nil the API client will use a default retryer. Retryer aws.Retryer // Changes if the EC2 Instance Metadata client is enabled or not. Client // will default to enabled if not set to ClientDisabled. When the client is // disabled it will return an error for all operation calls. // // If ClientEnableState value is ClientDefaultEnableState (default value), // and the environment variable "AWS_EC2_METADATA_DISABLED" is set to // "true", the client will be disabled. // // AWS_EC2_METADATA_DISABLED=true ClientEnableState ClientEnableState // Configures the events that will be sent to the configured logger. ClientLogMode aws.ClientLogMode // The logger writer interface to write logging messages to. Logger logging.Logger // Configure IMDSv1 fallback behavior. By default, the client will attempt // to fall back to IMDSv1 as needed for backwards compatibility. When set to [aws.FalseTernary] // the client will return any errors encountered from attempting to fetch a token // instead of silently using the insecure data flow of IMDSv1. // // See [configuring IMDS] for more information. // // [configuring IMDS]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html EnableFallback aws.Ternary // By default, all IMDS client operations enforce a 5-second timeout. You // can disable that behavior with this setting. DisableDefaultTimeout bool // provides the caching of API tokens used for operation calls. If unset, // the API token will not be retrieved for the operation. tokenProvider *tokenProvider // option to disable the API token provider for testing. disableAPIToken bool } // HTTPClient provides the interface for a client making HTTP requests with the // API. type HTTPClient interface { Do(*http.Request) (*http.Response, error) } // Copy creates a copy of the API options. func (o Options) Copy() Options { to := o to.APIOptions = append([]func(*middleware.Stack) error{}, o.APIOptions...) return to } // WithAPIOptions wraps the API middleware functions, as a functional option // for the API Client Options. Use this helper to add additional functional // options to the API client, or operation calls. func WithAPIOptions(optFns ...func(*middleware.Stack) error) func(*Options) { return func(o *Options) { o.APIOptions = append(o.APIOptions, optFns...) } } func (c *Client) invokeOperation( ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error, ) ( result interface{}, metadata middleware.Metadata, err error, ) { stack := middleware.NewStack(opID, smithyhttp.NewStackRequest) options := c.options.Copy() for _, fn := range optFns { fn(&options) } if options.ClientEnableState == ClientDisabled { return nil, metadata, &smithy.OperationError{ ServiceID: ServiceID, OperationName: opID, Err: fmt.Errorf( "access disabled to EC2 IMDS via client option, or %q environment variable", disableClientEnvVar), } } for _, fn := range stackFns { if err := fn(stack, options); err != nil { return nil, metadata, err } } for _, fn := range options.APIOptions { if err := fn(stack); err != nil { return nil, metadata, err } } handler := middleware.DecorateHandler(smithyhttp.NewClientHandler(options.HTTPClient), stack) result, metadata, err = handler.Handle(ctx, params) if err != nil { return nil, metadata, &smithy.OperationError{ ServiceID: ServiceID, OperationName: opID, Err: err, } } return result, metadata, err } const ( // HTTP client constants defaultDialerTimeout = 250 * time.Millisecond defaultResponseHeaderTimeout = 500 * time.Millisecond ) func resolveHTTPClient(client HTTPClient) HTTPClient { if client == nil { client = awshttp.NewBuildableClient() } if c, ok := client.(*awshttp.BuildableClient); ok { client = c. WithDialerOptions(func(d *net.Dialer) { // Use a custom Dial timeout for the EC2 Metadata service to account // for the possibility the application might not be running in an // environment with the service present. The client should fail fast in // this case. d.Timeout = defaultDialerTimeout }). WithTransportOptions(func(tr *http.Transport) { // Use a custom Transport timeout for the EC2 Metadata service to // account for the possibility that the application might be running in // a container, and EC2Metadata service drops the connection after a // single IP Hop. The client should fail fast in this case. tr.ResponseHeaderTimeout = defaultResponseHeaderTimeout }) } return client } func resolveClientEnableState(cfg aws.Config, options *Options) error { if options.ClientEnableState != ClientDefaultEnableState { return nil } value, found, err := internalconfig.ResolveClientEnableState(cfg.ConfigSources) if err != nil || !found { return err } options.ClientEnableState = value return nil } func resolveEndpointModeConfig(cfg aws.Config, options *Options) error { if options.EndpointMode != EndpointModeStateUnset { return nil } value, found, err := internalconfig.ResolveEndpointModeConfig(cfg.ConfigSources) if err != nil || !found { return err } options.EndpointMode = value return nil } func resolveEndpointConfig(cfg aws.Config, options *Options) error { if len(options.Endpoint) != 0 { return nil } value, found, err := internalconfig.ResolveEndpointConfig(cfg.ConfigSources) if err != nil || !found { return err } options.Endpoint = value return nil } func resolveEnableFallback(cfg aws.Config, options *Options) { if options.EnableFallback != aws.UnknownTernary { return } disabled, ok := internalconfig.ResolveV1FallbackDisabled(cfg.ConfigSources) if !ok { return } if disabled { options.EnableFallback = aws.FalseTernary } else { options.EnableFallback = aws.TrueTernary } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetDynamicData.go ================================================ package imds import ( "context" "fmt" "io" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const getDynamicDataPath = "/latest/dynamic" // GetDynamicData uses the path provided to request information from the EC2 // instance metadata service for dynamic data. The content will be returned // as a string, or error if the request failed. func (c *Client) GetDynamicData(ctx context.Context, params *GetDynamicDataInput, optFns ...func(*Options)) (*GetDynamicDataOutput, error) { if params == nil { params = &GetDynamicDataInput{} } result, metadata, err := c.invokeOperation(ctx, "GetDynamicData", params, optFns, addGetDynamicDataMiddleware, ) if err != nil { return nil, err } out := result.(*GetDynamicDataOutput) out.ResultMetadata = metadata return out, nil } // GetDynamicDataInput provides the input parameters for the GetDynamicData // operation. type GetDynamicDataInput struct { // The relative dynamic data path to retrieve. Can be empty string to // retrieve a response containing a new line separated list of dynamic data // resources available. // // Must not include the dynamic data base path. // // May include leading slash. If Path includes trailing slash the trailing // slash will be included in the request for the resource. Path string } // GetDynamicDataOutput provides the output parameters for the GetDynamicData // operation. type GetDynamicDataOutput struct { Content io.ReadCloser ResultMetadata middleware.Metadata } func addGetDynamicDataMiddleware(stack *middleware.Stack, options Options) error { return addAPIRequestMiddleware(stack, options, "GetDynamicData", buildGetDynamicDataPath, buildGetDynamicDataOutput) } func buildGetDynamicDataPath(params interface{}) (string, error) { p, ok := params.(*GetDynamicDataInput) if !ok { return "", fmt.Errorf("unknown parameter type %T", params) } return appendURIPath(getDynamicDataPath, p.Path), nil } func buildGetDynamicDataOutput(resp *smithyhttp.Response) (interface{}, error) { return &GetDynamicDataOutput{ Content: resp.Body, }, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetIAMInfo.go ================================================ package imds import ( "context" "encoding/json" "fmt" "io" "strings" "time" "github.com/aws/smithy-go" smithyio "github.com/aws/smithy-go/io" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const getIAMInfoPath = getMetadataPath + "/iam/info" // GetIAMInfo retrieves an identity document describing an // instance. Error is returned if the request fails or is unable to parse // the response. func (c *Client) GetIAMInfo( ctx context.Context, params *GetIAMInfoInput, optFns ...func(*Options), ) ( *GetIAMInfoOutput, error, ) { if params == nil { params = &GetIAMInfoInput{} } result, metadata, err := c.invokeOperation(ctx, "GetIAMInfo", params, optFns, addGetIAMInfoMiddleware, ) if err != nil { return nil, err } out := result.(*GetIAMInfoOutput) out.ResultMetadata = metadata return out, nil } // GetIAMInfoInput provides the input parameters for GetIAMInfo operation. type GetIAMInfoInput struct{} // GetIAMInfoOutput provides the output parameters for GetIAMInfo operation. type GetIAMInfoOutput struct { IAMInfo ResultMetadata middleware.Metadata } func addGetIAMInfoMiddleware(stack *middleware.Stack, options Options) error { return addAPIRequestMiddleware(stack, options, "GetIAMInfo", buildGetIAMInfoPath, buildGetIAMInfoOutput, ) } func buildGetIAMInfoPath(params interface{}) (string, error) { return getIAMInfoPath, nil } func buildGetIAMInfoOutput(resp *smithyhttp.Response) (v interface{}, err error) { defer func() { closeErr := resp.Body.Close() if err == nil { err = closeErr } else if closeErr != nil { err = fmt.Errorf("response body close error: %v, original error: %w", closeErr, err) } }() var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(resp.Body, ringBuffer) imdsResult := &GetIAMInfoOutput{} if err = json.NewDecoder(body).Decode(&imdsResult.IAMInfo); err != nil { return nil, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode instance identity document, %w", err), Snapshot: ringBuffer.Bytes(), } } // Any code other success is an error if !strings.EqualFold(imdsResult.Code, "success") { return nil, fmt.Errorf("failed to get EC2 IMDS IAM info, %s", imdsResult.Code) } return imdsResult, nil } // IAMInfo provides the shape for unmarshaling an IAM info from the metadata // API. type IAMInfo struct { Code string LastUpdated time.Time InstanceProfileArn string InstanceProfileID string } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetInstanceIdentityDocument.go ================================================ package imds import ( "context" "encoding/json" "fmt" "io" "time" "github.com/aws/smithy-go" smithyio "github.com/aws/smithy-go/io" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const getInstanceIdentityDocumentPath = getDynamicDataPath + "/instance-identity/document" // GetInstanceIdentityDocument retrieves an identity document describing an // instance. Error is returned if the request fails or is unable to parse // the response. func (c *Client) GetInstanceIdentityDocument( ctx context.Context, params *GetInstanceIdentityDocumentInput, optFns ...func(*Options), ) ( *GetInstanceIdentityDocumentOutput, error, ) { if params == nil { params = &GetInstanceIdentityDocumentInput{} } result, metadata, err := c.invokeOperation(ctx, "GetInstanceIdentityDocument", params, optFns, addGetInstanceIdentityDocumentMiddleware, ) if err != nil { return nil, err } out := result.(*GetInstanceIdentityDocumentOutput) out.ResultMetadata = metadata return out, nil } // GetInstanceIdentityDocumentInput provides the input parameters for // GetInstanceIdentityDocument operation. type GetInstanceIdentityDocumentInput struct{} // GetInstanceIdentityDocumentOutput provides the output parameters for // GetInstanceIdentityDocument operation. type GetInstanceIdentityDocumentOutput struct { InstanceIdentityDocument ResultMetadata middleware.Metadata } func addGetInstanceIdentityDocumentMiddleware(stack *middleware.Stack, options Options) error { return addAPIRequestMiddleware(stack, options, "GetInstanceIdentityDocument", buildGetInstanceIdentityDocumentPath, buildGetInstanceIdentityDocumentOutput, ) } func buildGetInstanceIdentityDocumentPath(params interface{}) (string, error) { return getInstanceIdentityDocumentPath, nil } func buildGetInstanceIdentityDocumentOutput(resp *smithyhttp.Response) (v interface{}, err error) { defer func() { closeErr := resp.Body.Close() if err == nil { err = closeErr } else if closeErr != nil { err = fmt.Errorf("response body close error: %v, original error: %w", closeErr, err) } }() var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(resp.Body, ringBuffer) output := &GetInstanceIdentityDocumentOutput{} if err = json.NewDecoder(body).Decode(&output.InstanceIdentityDocument); err != nil { return nil, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode instance identity document, %w", err), Snapshot: ringBuffer.Bytes(), } } return output, nil } // InstanceIdentityDocument provides the shape for unmarshaling // an instance identity document type InstanceIdentityDocument struct { DevpayProductCodes []string `json:"devpayProductCodes"` MarketplaceProductCodes []string `json:"marketplaceProductCodes"` AvailabilityZone string `json:"availabilityZone"` PrivateIP string `json:"privateIp"` Version string `json:"version"` Region string `json:"region"` InstanceID string `json:"instanceId"` BillingProducts []string `json:"billingProducts"` InstanceType string `json:"instanceType"` AccountID string `json:"accountId"` PendingTime time.Time `json:"pendingTime"` ImageID string `json:"imageId"` KernelID string `json:"kernelId"` RamdiskID string `json:"ramdiskId"` Architecture string `json:"architecture"` } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetMetadata.go ================================================ package imds import ( "context" "fmt" "io" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const getMetadataPath = "/latest/meta-data" // GetMetadata uses the path provided to request information from the Amazon // EC2 Instance Metadata Service. The content will be returned as a string, or // error if the request failed. func (c *Client) GetMetadata(ctx context.Context, params *GetMetadataInput, optFns ...func(*Options)) (*GetMetadataOutput, error) { if params == nil { params = &GetMetadataInput{} } result, metadata, err := c.invokeOperation(ctx, "GetMetadata", params, optFns, addGetMetadataMiddleware, ) if err != nil { return nil, err } out := result.(*GetMetadataOutput) out.ResultMetadata = metadata return out, nil } // GetMetadataInput provides the input parameters for the GetMetadata // operation. type GetMetadataInput struct { // The relative metadata path to retrieve. Can be empty string to retrieve // a response containing a new line separated list of metadata resources // available. // // Must not include the metadata base path. // // May include leading slash. If Path includes trailing slash the trailing slash // will be included in the request for the resource. Path string } // GetMetadataOutput provides the output parameters for the GetMetadata // operation. type GetMetadataOutput struct { Content io.ReadCloser ResultMetadata middleware.Metadata } func addGetMetadataMiddleware(stack *middleware.Stack, options Options) error { return addAPIRequestMiddleware(stack, options, "GetMetadata", buildGetMetadataPath, buildGetMetadataOutput) } func buildGetMetadataPath(params interface{}) (string, error) { p, ok := params.(*GetMetadataInput) if !ok { return "", fmt.Errorf("unknown parameter type %T", params) } return appendURIPath(getMetadataPath, p.Path), nil } func buildGetMetadataOutput(resp *smithyhttp.Response) (interface{}, error) { return &GetMetadataOutput{ Content: resp.Body, }, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetRegion.go ================================================ package imds import ( "context" "fmt" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // GetRegion retrieves an identity document describing an // instance. Error is returned if the request fails or is unable to parse // the response. func (c *Client) GetRegion( ctx context.Context, params *GetRegionInput, optFns ...func(*Options), ) ( *GetRegionOutput, error, ) { if params == nil { params = &GetRegionInput{} } result, metadata, err := c.invokeOperation(ctx, "GetRegion", params, optFns, addGetRegionMiddleware, ) if err != nil { return nil, err } out := result.(*GetRegionOutput) out.ResultMetadata = metadata return out, nil } // GetRegionInput provides the input parameters for GetRegion operation. type GetRegionInput struct{} // GetRegionOutput provides the output parameters for GetRegion operation. type GetRegionOutput struct { Region string ResultMetadata middleware.Metadata } func addGetRegionMiddleware(stack *middleware.Stack, options Options) error { return addAPIRequestMiddleware(stack, options, "GetRegion", buildGetInstanceIdentityDocumentPath, buildGetRegionOutput, ) } func buildGetRegionOutput(resp *smithyhttp.Response) (interface{}, error) { out, err := buildGetInstanceIdentityDocumentOutput(resp) if err != nil { return nil, err } result, ok := out.(*GetInstanceIdentityDocumentOutput) if !ok { return nil, fmt.Errorf("unexpected instance identity document type, %T", out) } region := result.Region if len(region) == 0 { return "", fmt.Errorf("instance metadata did not return a region value") } return &GetRegionOutput{ Region: region, }, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetToken.go ================================================ package imds import ( "context" "fmt" "io" "strconv" "strings" "time" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const getTokenPath = "/latest/api/token" const tokenTTLHeader = "X-Aws-Ec2-Metadata-Token-Ttl-Seconds" // getToken uses the duration to return a token for EC2 IMDS, or an error if // the request failed. func (c *Client) getToken(ctx context.Context, params *getTokenInput, optFns ...func(*Options)) (*getTokenOutput, error) { if params == nil { params = &getTokenInput{} } result, metadata, err := c.invokeOperation(ctx, "getToken", params, optFns, addGetTokenMiddleware, ) if err != nil { return nil, err } out := result.(*getTokenOutput) out.ResultMetadata = metadata return out, nil } type getTokenInput struct { TokenTTL time.Duration } type getTokenOutput struct { Token string TokenTTL time.Duration ResultMetadata middleware.Metadata } func addGetTokenMiddleware(stack *middleware.Stack, options Options) error { err := addRequestMiddleware(stack, options, "PUT", "GetToken", buildGetTokenPath, buildGetTokenOutput) if err != nil { return err } err = stack.Serialize.Add(&tokenTTLRequestHeader{}, middleware.After) if err != nil { return err } return nil } func buildGetTokenPath(interface{}) (string, error) { return getTokenPath, nil } func buildGetTokenOutput(resp *smithyhttp.Response) (v interface{}, err error) { defer func() { closeErr := resp.Body.Close() if err == nil { err = closeErr } else if closeErr != nil { err = fmt.Errorf("response body close error: %v, original error: %w", closeErr, err) } }() ttlHeader := resp.Header.Get(tokenTTLHeader) tokenTTL, err := strconv.ParseInt(ttlHeader, 10, 64) if err != nil { return nil, fmt.Errorf("unable to parse API token, %w", err) } var token strings.Builder if _, err = io.Copy(&token, resp.Body); err != nil { return nil, fmt.Errorf("unable to read API token, %w", err) } return &getTokenOutput{ Token: token.String(), TokenTTL: time.Duration(tokenTTL) * time.Second, }, nil } type tokenTTLRequestHeader struct{} func (*tokenTTLRequestHeader) ID() string { return "tokenTTLRequestHeader" } func (*tokenTTLRequestHeader) HandleSerialize( ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, ) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("expect HTTP transport, got %T", in.Request) } input, ok := in.Parameters.(*getTokenInput) if !ok { return out, metadata, fmt.Errorf("expect getTokenInput, got %T", in.Parameters) } req.Header.Set(tokenTTLHeader, strconv.Itoa(int(input.TokenTTL/time.Second))) return next.HandleSerialize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/api_op_GetUserData.go ================================================ package imds import ( "context" "io" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const getUserDataPath = "/latest/user-data" // GetUserData uses the path provided to request information from the EC2 // instance metadata service for dynamic data. The content will be returned // as a string, or error if the request failed. func (c *Client) GetUserData(ctx context.Context, params *GetUserDataInput, optFns ...func(*Options)) (*GetUserDataOutput, error) { if params == nil { params = &GetUserDataInput{} } result, metadata, err := c.invokeOperation(ctx, "GetUserData", params, optFns, addGetUserDataMiddleware, ) if err != nil { return nil, err } out := result.(*GetUserDataOutput) out.ResultMetadata = metadata return out, nil } // GetUserDataInput provides the input parameters for the GetUserData // operation. type GetUserDataInput struct{} // GetUserDataOutput provides the output parameters for the GetUserData // operation. type GetUserDataOutput struct { Content io.ReadCloser ResultMetadata middleware.Metadata } func addGetUserDataMiddleware(stack *middleware.Stack, options Options) error { return addAPIRequestMiddleware(stack, options, "GetUserData", buildGetUserDataPath, buildGetUserDataOutput) } func buildGetUserDataPath(params interface{}) (string, error) { return getUserDataPath, nil } func buildGetUserDataOutput(resp *smithyhttp.Response) (interface{}, error) { return &GetUserDataOutput{ Content: resp.Body, }, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/auth.go ================================================ package imds import ( "context" "github.com/aws/smithy-go/middleware" ) type getIdentityMiddleware struct { options Options } func (*getIdentityMiddleware) ID() string { return "GetIdentity" } func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { return next.HandleFinalize(ctx, in) } type signRequestMiddleware struct { } func (*signRequestMiddleware) ID() string { return "Signing" } func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { return next.HandleFinalize(ctx, in) } type resolveAuthSchemeMiddleware struct { operation string options Options } func (*resolveAuthSchemeMiddleware) ID() string { return "ResolveAuthScheme" } func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/doc.go ================================================ // Package imds provides the API client for interacting with the Amazon EC2 // Instance Metadata Service. // // All Client operation calls have a default timeout. If the operation is not // completed before this timeout expires, the operation will be canceled. This // timeout can be overridden through the following: // - Set the options flag DisableDefaultTimeout // - Provide a Context with a timeout or deadline with calling the client's operations. // // See the EC2 IMDS user guide for more information on using the API. // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html package imds ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/endpoints.go ================================================ package imds import ( "context" "github.com/aws/smithy-go/middleware" ) type resolveEndpointV2Middleware struct { options Options } func (*resolveEndpointV2Middleware) ID() string { return "ResolveEndpointV2" } func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package imds // goModuleVersion is the tagged release for this module const goModuleVersion = "1.16.30" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config/resolvers.go ================================================ package config import ( "fmt" "strings" ) // ClientEnableState provides an enumeration if the client is enabled, // disabled, or default behavior. type ClientEnableState uint // Enumeration values for ClientEnableState const ( ClientDefaultEnableState ClientEnableState = iota ClientDisabled ClientEnabled ) // EndpointModeState is the EC2 IMDS Endpoint Configuration Mode type EndpointModeState uint // Enumeration values for ClientEnableState const ( EndpointModeStateUnset EndpointModeState = iota EndpointModeStateIPv4 EndpointModeStateIPv6 ) // SetFromString sets the EndpointModeState based on the provided string value. Unknown values will default to EndpointModeStateUnset func (e *EndpointModeState) SetFromString(v string) error { v = strings.TrimSpace(v) switch { case len(v) == 0: *e = EndpointModeStateUnset case strings.EqualFold(v, "IPv6"): *e = EndpointModeStateIPv6 case strings.EqualFold(v, "IPv4"): *e = EndpointModeStateIPv4 default: return fmt.Errorf("unknown EC2 IMDS endpoint mode, must be either IPv6 or IPv4") } return nil } // ClientEnableStateResolver is a config resolver interface for retrieving whether the IMDS client is disabled. type ClientEnableStateResolver interface { GetEC2IMDSClientEnableState() (ClientEnableState, bool, error) } // EndpointModeResolver is a config resolver interface for retrieving the EndpointModeState configuration. type EndpointModeResolver interface { GetEC2IMDSEndpointMode() (EndpointModeState, bool, error) } // EndpointResolver is a config resolver interface for retrieving the endpoint. type EndpointResolver interface { GetEC2IMDSEndpoint() (string, bool, error) } type v1FallbackDisabledResolver interface { GetEC2IMDSV1FallbackDisabled() (bool, bool) } // ResolveClientEnableState resolves the ClientEnableState from a list of configuration sources. func ResolveClientEnableState(sources []interface{}) (value ClientEnableState, found bool, err error) { for _, source := range sources { if resolver, ok := source.(ClientEnableStateResolver); ok { value, found, err = resolver.GetEC2IMDSClientEnableState() if err != nil || found { return value, found, err } } } return value, found, err } // ResolveEndpointModeConfig resolves the EndpointModeState from a list of configuration sources. func ResolveEndpointModeConfig(sources []interface{}) (value EndpointModeState, found bool, err error) { for _, source := range sources { if resolver, ok := source.(EndpointModeResolver); ok { value, found, err = resolver.GetEC2IMDSEndpointMode() if err != nil || found { return value, found, err } } } return value, found, err } // ResolveEndpointConfig resolves the endpoint from a list of configuration sources. func ResolveEndpointConfig(sources []interface{}) (value string, found bool, err error) { for _, source := range sources { if resolver, ok := source.(EndpointResolver); ok { value, found, err = resolver.GetEC2IMDSEndpoint() if err != nil || found { return value, found, err } } } return value, found, err } // ResolveV1FallbackDisabled ... func ResolveV1FallbackDisabled(sources []interface{}) (bool, bool) { for _, source := range sources { if resolver, ok := source.(v1FallbackDisabledResolver); ok { if v, found := resolver.GetEC2IMDSV1FallbackDisabled(); found { return v, true } } } return false, false } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/request_middleware.go ================================================ package imds import ( "bytes" "context" "fmt" "io/ioutil" "net/url" "path" "time" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/retry" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) func addAPIRequestMiddleware(stack *middleware.Stack, options Options, operation string, getPath func(interface{}) (string, error), getOutput func(*smithyhttp.Response) (interface{}, error), ) (err error) { err = addRequestMiddleware(stack, options, "GET", operation, getPath, getOutput) if err != nil { return err } // Token Serializer build and state management. if !options.disableAPIToken { err = stack.Finalize.Insert(options.tokenProvider, (*retry.Attempt)(nil).ID(), middleware.After) if err != nil { return err } err = stack.Deserialize.Insert(options.tokenProvider, "OperationDeserializer", middleware.Before) if err != nil { return err } } return nil } func addRequestMiddleware(stack *middleware.Stack, options Options, method string, operation string, getPath func(interface{}) (string, error), getOutput func(*smithyhttp.Response) (interface{}, error), ) (err error) { err = awsmiddleware.AddSDKAgentKey(awsmiddleware.FeatureMetadata, "ec2-imds")(stack) if err != nil { return err } // Operation timeout err = stack.Initialize.Add(&operationTimeout{ Disabled: options.DisableDefaultTimeout, DefaultTimeout: defaultOperationTimeout, }, middleware.Before) if err != nil { return err } // Operation Serializer err = stack.Serialize.Add(&serializeRequest{ GetPath: getPath, Method: method, }, middleware.After) if err != nil { return err } // Operation endpoint resolver err = stack.Serialize.Insert(&resolveEndpoint{ Endpoint: options.Endpoint, EndpointMode: options.EndpointMode, }, "OperationSerializer", middleware.Before) if err != nil { return err } // Operation Deserializer err = stack.Deserialize.Add(&deserializeResponse{ GetOutput: getOutput, }, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{ LogRequest: options.ClientLogMode.IsRequest(), LogRequestWithBody: options.ClientLogMode.IsRequestWithBody(), LogResponse: options.ClientLogMode.IsResponse(), LogResponseWithBody: options.ClientLogMode.IsResponseWithBody(), }, middleware.After) if err != nil { return err } err = addSetLoggerMiddleware(stack, options) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, operation); err != nil { return fmt.Errorf("add protocol finalizers: %w", err) } // Retry support return retry.AddRetryMiddlewares(stack, retry.AddRetryMiddlewaresOptions{ Retryer: options.Retryer, LogRetryAttempts: options.ClientLogMode.IsRetries(), }) } func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error { return middleware.AddSetLoggerMiddleware(stack, o.Logger) } type serializeRequest struct { GetPath func(interface{}) (string, error) Method string } func (*serializeRequest) ID() string { return "OperationSerializer" } func (m *serializeRequest) HandleSerialize( ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, ) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } reqPath, err := m.GetPath(in.Parameters) if err != nil { return out, metadata, fmt.Errorf("unable to get request URL path, %w", err) } request.Request.URL.Path = reqPath request.Request.Method = m.Method return next.HandleSerialize(ctx, in) } type deserializeResponse struct { GetOutput func(*smithyhttp.Response) (interface{}, error) } func (*deserializeResponse) ID() string { return "OperationDeserializer" } func (m *deserializeResponse) HandleDeserialize( ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler, ) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } resp, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, fmt.Errorf( "unexpected transport response type, %T, want %T", out.RawResponse, resp) } defer resp.Body.Close() // read the full body so that any operation timeouts cleanup will not race // the body being read. body, err := ioutil.ReadAll(resp.Body) if err != nil { return out, metadata, fmt.Errorf("read response body failed, %w", err) } resp.Body = ioutil.NopCloser(bytes.NewReader(body)) // Anything that's not 200 |< 300 is error if resp.StatusCode < 200 || resp.StatusCode >= 300 { return out, metadata, &smithyhttp.ResponseError{ Response: resp, Err: fmt.Errorf("request to EC2 IMDS failed"), } } result, err := m.GetOutput(resp) if err != nil { return out, metadata, fmt.Errorf( "unable to get deserialized result for response, %w", err, ) } out.Result = result return out, metadata, err } type resolveEndpoint struct { Endpoint string EndpointMode EndpointModeState } func (*resolveEndpoint) ID() string { return "ResolveEndpoint" } func (m *resolveEndpoint) HandleSerialize( ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, ) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } var endpoint string if len(m.Endpoint) > 0 { endpoint = m.Endpoint } else { switch m.EndpointMode { case EndpointModeStateIPv6: endpoint = defaultIPv6Endpoint case EndpointModeStateIPv4: fallthrough case EndpointModeStateUnset: endpoint = defaultIPv4Endpoint default: return out, metadata, fmt.Errorf("unsupported IMDS endpoint mode") } } req.URL, err = url.Parse(endpoint) if err != nil { return out, metadata, fmt.Errorf("failed to parse endpoint URL: %w", err) } return next.HandleSerialize(ctx, in) } const ( defaultOperationTimeout = 5 * time.Second ) // operationTimeout adds a timeout on the middleware stack if the Context the // stack was called with does not have a deadline. The next middleware must // complete before the timeout, or the context will be canceled. // // If DefaultTimeout is zero, no default timeout will be used if the Context // does not have a timeout. // // The next middleware must also ensure that any resources that are also // canceled by the stack's context are completely consumed before returning. // Otherwise the timeout cleanup will race the resource being consumed // upstream. type operationTimeout struct { Disabled bool DefaultTimeout time.Duration } func (*operationTimeout) ID() string { return "OperationTimeout" } func (m *operationTimeout) HandleInitialize( ctx context.Context, input middleware.InitializeInput, next middleware.InitializeHandler, ) ( output middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { if m.Disabled { return next.HandleInitialize(ctx, input) } if _, ok := ctx.Deadline(); !ok && m.DefaultTimeout != 0 { var cancelFn func() ctx, cancelFn = context.WithTimeout(ctx, m.DefaultTimeout) defer cancelFn() } return next.HandleInitialize(ctx, input) } // appendURIPath joins a URI path component to the existing path with `/` // separators between the path components. If the path being added ends with a // trailing `/` that slash will be maintained. func appendURIPath(base, add string) string { reqPath := path.Join(base, add) if len(add) != 0 && add[len(add)-1] == '/' { reqPath += "/" } return reqPath } func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error { if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil { return fmt.Errorf("add ResolveAuthScheme: %w", err) } if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil { return fmt.Errorf("add GetIdentity: %w", err) } if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil { return fmt.Errorf("add ResolveEndpointV2: %w", err) } if err := stack.Finalize.Insert(&signRequestMiddleware{}, "ResolveEndpointV2", middleware.After); err != nil { return fmt.Errorf("add Signing: %w", err) } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/token_provider.go ================================================ package imds import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/smithy-go" "github.com/aws/smithy-go/logging" "net/http" "sync" "sync/atomic" "time" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const ( // Headers for Token and TTL tokenHeader = "x-aws-ec2-metadata-token" defaultTokenTTL = 5 * time.Minute ) type tokenProvider struct { client *Client tokenTTL time.Duration token *apiToken tokenMux sync.RWMutex disabled uint32 // Atomic updated } func newTokenProvider(client *Client, ttl time.Duration) *tokenProvider { return &tokenProvider{ client: client, tokenTTL: ttl, } } // apiToken provides the API token used by all operation calls for th EC2 // Instance metadata service. type apiToken struct { token string expires time.Time } var timeNow = time.Now // Expired returns if the token is expired. func (t *apiToken) Expired() bool { // Calling Round(0) on the current time will truncate the monotonic reading only. Ensures credential expiry // time is always based on reported wall-clock time. return timeNow().Round(0).After(t.expires) } func (t *tokenProvider) ID() string { return "APITokenProvider" } // HandleFinalize is the finalize stack middleware, that if the token provider is // enabled, will attempt to add the cached API token to the request. If the API // token is not cached, it will be retrieved in a separate API call, getToken. // // For retry attempts, handler must be added after attempt retryer. // // If request for getToken fails the token provider may be disabled from future // requests, depending on the response status code. func (t *tokenProvider) HandleFinalize( ctx context.Context, input middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { if t.fallbackEnabled() && !t.enabled() { // short-circuits to insecure data flow if token provider is disabled. return next.HandleFinalize(ctx, input) } req, ok := input.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unexpected transport request type %T", input.Request) } tok, err := t.getToken(ctx) if err != nil { // If the error allows the token to downgrade to insecure flow allow that. var bypassErr *bypassTokenRetrievalError if errors.As(err, &bypassErr) { return next.HandleFinalize(ctx, input) } return out, metadata, fmt.Errorf("failed to get API token, %w", err) } req.Header.Set(tokenHeader, tok.token) return next.HandleFinalize(ctx, input) } // HandleDeserialize is the deserialize stack middleware for determining if the // operation the token provider is decorating failed because of a 401 // unauthorized status code. If the operation failed for that reason the token // provider needs to be re-enabled so that it can start adding the API token to // operation calls. func (t *tokenProvider) HandleDeserialize( ctx context.Context, input middleware.DeserializeInput, next middleware.DeserializeHandler, ) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, input) if err == nil { return out, metadata, err } resp, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, fmt.Errorf("expect HTTP transport, got %T", out.RawResponse) } if resp.StatusCode == http.StatusUnauthorized { // unauthorized t.enable() err = &retryableError{Err: err, isRetryable: true} } return out, metadata, err } func (t *tokenProvider) getToken(ctx context.Context) (tok *apiToken, err error) { if t.fallbackEnabled() && !t.enabled() { return nil, &bypassTokenRetrievalError{ Err: fmt.Errorf("cannot get API token, provider disabled"), } } t.tokenMux.RLock() tok = t.token t.tokenMux.RUnlock() if tok != nil && !tok.Expired() { return tok, nil } tok, err = t.updateToken(ctx) if err != nil { return nil, err } return tok, nil } func (t *tokenProvider) updateToken(ctx context.Context) (*apiToken, error) { t.tokenMux.Lock() defer t.tokenMux.Unlock() // Prevent multiple requests to update retrieving the token. if t.token != nil && !t.token.Expired() { tok := t.token return tok, nil } result, err := t.client.getToken(ctx, &getTokenInput{ TokenTTL: t.tokenTTL, }) if err != nil { var statusErr interface{ HTTPStatusCode() int } if errors.As(err, &statusErr) { switch statusErr.HTTPStatusCode() { // Disable future get token if failed because of 403, 404, or 405 case http.StatusForbidden, http.StatusNotFound, http.StatusMethodNotAllowed: if t.fallbackEnabled() { logger := middleware.GetLogger(ctx) logger.Logf(logging.Warn, "falling back to IMDSv1: %v", err) t.disable() } // 400 errors are terminal, and need to be upstreamed case http.StatusBadRequest: return nil, err } } // Disable if request send failed or timed out getting response var re *smithyhttp.RequestSendError var ce *smithy.CanceledError if errors.As(err, &re) || errors.As(err, &ce) { atomic.StoreUint32(&t.disabled, 1) } if !t.fallbackEnabled() { // NOTE: getToken() is an implementation detail of some outer operation // (e.g. GetMetadata). It has its own retries that have already been exhausted. // Mark the underlying error as a terminal error. err = &retryableError{Err: err, isRetryable: false} return nil, err } // Token couldn't be retrieved, fallback to IMDSv1 insecure flow for this request // and allow the request to proceed. Future requests _may_ re-attempt fetching a // token if not disabled. return nil, &bypassTokenRetrievalError{Err: err} } tok := &apiToken{ token: result.Token, expires: timeNow().Add(result.TokenTTL), } t.token = tok return tok, nil } // enabled returns if the token provider is current enabled or not. func (t *tokenProvider) enabled() bool { return atomic.LoadUint32(&t.disabled) == 0 } // fallbackEnabled returns false if EnableFallback is [aws.FalseTernary], true otherwise func (t *tokenProvider) fallbackEnabled() bool { switch t.client.options.EnableFallback { case aws.FalseTernary: return false default: return true } } // disable disables the token provider and it will no longer attempt to inject // the token, nor request updates. func (t *tokenProvider) disable() { atomic.StoreUint32(&t.disabled, 1) } // enable enables the token provide to start refreshing tokens, and adding them // to the pending request. func (t *tokenProvider) enable() { t.tokenMux.Lock() t.token = nil t.tokenMux.Unlock() atomic.StoreUint32(&t.disabled, 0) } type bypassTokenRetrievalError struct { Err error } func (e *bypassTokenRetrievalError) Error() string { return fmt.Sprintf("bypass token retrieval, %v", e.Err) } func (e *bypassTokenRetrievalError) Unwrap() error { return e.Err } type retryableError struct { Err error isRetryable bool } func (e *retryableError) RetryableError() bool { return e.isRetryable } func (e *retryableError) Error() string { return e.Err.Error() } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md ================================================ # v1.17.75 (2025-05-05) * **Bug Fix**: Enable user to call GetBucketRegion without credential config # v1.17.74 (2025-04-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.73 (2025-04-23) * **Bug Fix**: Abort multi part download if the object is modified during download # v1.17.72 (2025-04-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.71 (2025-04-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.70 (2025-03-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.69 (2025-03-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.68 (2025-03-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.67 (2025-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.66 (2025-03-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.65 (2025-03-04.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.64 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.63 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.17.62 (2025-02-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.61 (2025-02-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.60 (2025-02-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.59 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.58 (2025-02-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.57 (2025-01-31) * **Bug Fix**: Fix incorrect reference to old s3manager in comments. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.56 (2025-01-30) * **Bug Fix**: Fix incorrect reference to old s3manager in comments. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.55 (2025-01-29) * **Bug Fix**: Fix incorrect reference to old s3manager in comments. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.54 (2025-01-24) * **Bug Fix**: Fix incorrect reference to old s3manager in comments. * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.17.53 (2025-01-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.52 (2025-01-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.51 (2025-01-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.50 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.49 (2025-01-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.48 (2025-01-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.47 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.46 (2025-01-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.45 (2025-01-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.44 (2024-12-19) * **Bug Fix**: Fix improper use of printf-style functions. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.43 (2024-12-03.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.42 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.41 (2024-11-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.40 (2024-11-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.39 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.38 (2024-11-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.37 (2024-11-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.36 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.35 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.34 (2024-10-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.33 (2024-10-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.32 (2024-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.31 (2024-10-09) * **Bug Fix**: Fixup some integration tests. # v1.17.30 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.29 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.28 (2024-10-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.27 (2024-10-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.26 (2024-10-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.25 (2024-09-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.24 (2024-09-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.23 (2024-09-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.22 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.21 (2024-09-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.20 (2024-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.19 (2024-09-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.18 (2024-09-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.17 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.16 (2024-08-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.15 (2024-08-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.14 (2024-08-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.13 (2024-08-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.12 (2024-08-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.11 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.10 (2024-08-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.9 (2024-07-24) * **Documentation**: Clarify region hint and credential usage in HeadBucketRegion. # v1.17.8 (2024-07-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.7 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.6 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.5 (2024-07-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.4 (2024-07-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.3 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.2 (2024-06-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.1 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.0 (2024-06-18) * **Feature**: Track usage of various AWS SDK features in user-agent string. * **Dependency Update**: Updated to the latest SDK module versions # v1.16.25 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.24 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.23 (2024-06-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.22 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.21 (2024-05-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.20 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.19 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.18 (2024-05-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.17 (2024-05-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.16 (2024-05-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.15 (2024-04-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.14 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.13 (2024-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.12 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.11 (2024-03-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.10 (2024-03-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.9 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.16.8 (2024-03-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.7 (2024-03-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.6 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.5 (2024-02-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.4 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.3 (2024-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.2 (2024-02-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.1 (2024-02-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.15.15 (2024-01-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.14 (2024-01-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.13 (2024-01-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.12 (2024-01-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.11 (2024-01-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.10 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.9 (2023-12-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.8 (2023-12-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.7 (2023-12-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.6 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.5 (2023-12-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.4 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.3 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.2 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.1 (2023-11-28.3) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.0 (2023-11-28.2) * **Feature**: Add S3Express support. * **Dependency Update**: Updated to the latest SDK module versions # v1.14.4 (2023-11-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.3 (2023-11-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.2 (2023-11-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.1 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.0 (2023-11-17) * **Feature**: **BREAKING CHANGE** Correct nullability of a large number of S3 structure fields. See https://github.com/aws/aws-sdk-go-v2/issues/2162. * **Dependency Update**: Updated to the latest SDK module versions # v1.13.9 (2023-11-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.8 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.7 (2023-11-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.6 (2023-11-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.5 (2023-11-09.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.4 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.3 (2023-11-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.2 (2023-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.1 (2023-11-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.11.92 (2023-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.91 (2023-10-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.90 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.89 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.88 (2023-10-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.87 (2023-09-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.86 (2023-09-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.85 (2023-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.84 (2023-09-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.83 (2023-09-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.82 (2023-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.81 (2023-08-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.80 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.79 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.78 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.77 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.76 (2023-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.75 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.74 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.73 (2023-07-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.72 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.71 (2023-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.70 (2023-06-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.69 (2023-06-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.68 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.67 (2023-05-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.66 (2023-05-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.65 (2023-05-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.64 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.63 (2023-04-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.62 (2023-04-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.61 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.60 (2023-03-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.59 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.58 (2023-03-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.57 (2023-03-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.56 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.55 (2023-02-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.54 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.53 (2023-02-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.52 (2023-02-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.51 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.50 (2023-02-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.49 (2023-01-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.48 (2023-01-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.47 (2023-01-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.46 (2022-12-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.45 (2022-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.44 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.43 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.42 (2022-11-22) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.41 (2022-11-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.40 (2022-11-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.39 (2022-11-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.38 (2022-11-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.37 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.36 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.35 (2022-10-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.34 (2022-09-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.33 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.32 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.31 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.30 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.29 (2022-08-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.28 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.27 (2022-08-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.26 (2022-08-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.25 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.24 (2022-08-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.23 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.22 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.21 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.20 (2022-07-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.19 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.18 (2022-07-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.17 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.16 (2022-06-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.15 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.14 (2022-05-26) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.13 (2022-05-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.12 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.11 (2022-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.10 (2022-05-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.9 (2022-05-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.8 (2022-05-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.7 (2022-04-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.6 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.5 (2022-04-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.4 (2022-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2022-02-24) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.9.1 (2022-01-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.8.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.7.5 (2021-12-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.7.4 (2021-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.7.3 (2021-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.7.2 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.7.1 (2021-11-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.7.0 (2021-11-06) * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.6.0 (2021-10-21) * **Feature**: Updated to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.5.4 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.3 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.2 (2021-09-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.1 (2021-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.0 (2021-08-27) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.1 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2021-08-04) * **Feature**: adds error handling for defered close calls * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.2 (2021-07-15) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2021-07-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.2.3 (2021-06-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.2 (2021-05-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.1 (2021-05-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/api.go ================================================ package manager import ( "context" "github.com/aws/aws-sdk-go-v2/service/s3" ) // DeleteObjectsAPIClient is an S3 API client that can invoke the DeleteObjects operation. type DeleteObjectsAPIClient interface { DeleteObjects(context.Context, *s3.DeleteObjectsInput, ...func(*s3.Options)) (*s3.DeleteObjectsOutput, error) } // DownloadAPIClient is an S3 API client that can invoke the GetObject operation. type DownloadAPIClient interface { GetObject(context.Context, *s3.GetObjectInput, ...func(*s3.Options)) (*s3.GetObjectOutput, error) } // HeadBucketAPIClient is an S3 API client that can invoke the HeadBucket operation. type HeadBucketAPIClient interface { HeadBucket(context.Context, *s3.HeadBucketInput, ...func(*s3.Options)) (*s3.HeadBucketOutput, error) } // ListObjectsV2APIClient is an S3 API client that can invoke the ListObjectV2 operation. type ListObjectsV2APIClient interface { ListObjectsV2(context.Context, *s3.ListObjectsV2Input, ...func(*s3.Options)) (*s3.ListObjectsV2Output, error) } // UploadAPIClient is an S3 API client that can invoke PutObject, UploadPart, CreateMultipartUpload, // CompleteMultipartUpload, and AbortMultipartUpload operations. type UploadAPIClient interface { PutObject(context.Context, *s3.PutObjectInput, ...func(*s3.Options)) (*s3.PutObjectOutput, error) UploadPart(context.Context, *s3.UploadPartInput, ...func(*s3.Options)) (*s3.UploadPartOutput, error) CreateMultipartUpload(context.Context, *s3.CreateMultipartUploadInput, ...func(*s3.Options)) (*s3.CreateMultipartUploadOutput, error) CompleteMultipartUpload(context.Context, *s3.CompleteMultipartUploadInput, ...func(*s3.Options)) (*s3.CompleteMultipartUploadOutput, error) AbortMultipartUpload(context.Context, *s3.AbortMultipartUploadInput, ...func(*s3.Options)) (*s3.AbortMultipartUploadOutput, error) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/arn.go ================================================ package manager import ( "fmt" "github.com/aws/aws-sdk-go-v2/aws/arn" ) func validateSupportedARNType(bucket string) error { if !arn.IsARN(bucket) { return nil } parsedARN, err := arn.Parse(bucket) if err != nil { return err } if parsedARN.Service == "s3-object-lambda" { return fmt.Errorf("manager does not support s3-object-lambda service ARNs") } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/bucket_region.go ================================================ package manager import ( "context" "errors" "fmt" "net/http" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const bucketRegionHeader = "X-Amz-Bucket-Region" // GetBucketRegion will attempt to get the region for a bucket using the // client's configured region to determine which AWS partition to perform the query on. // // A BucketNotFound error will be returned if the bucket does not exist in the // AWS partition the client region belongs to. // // For example to get the region of a bucket which exists in "eu-central-1" // you could provide a region hint of "us-west-2". // // cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-west-2")) // if err != nil { // log.Println("error:", err) // return // } // // bucket := "my-bucket" // region, err := manager.GetBucketRegion(ctx, s3.NewFromConfig(cfg), bucket) // if err != nil { // var bnf manager.BucketNotFound // if errors.As(err, &bnf) { // fmt.Fprintf(os.Stderr, "unable to find bucket %s's region\n", bucket) // } // return // } // fmt.Printf("Bucket %s is in %s region\n", bucket, region) // // By default the request will be made to the Amazon S3 endpoint using the virtual-hosted-style addressing. // // bucketname.s3.us-west-2.amazonaws.com/ // // To configure the GetBucketRegion to make a request via the Amazon // S3 FIPS endpoints directly when a FIPS region name is not available, (e.g. // fips-us-gov-west-1) set the EndpointResolver on the config or client the // utility is called with. // // cfg, err := config.LoadDefaultConfig(context.TODO(), // config.WithEndpointResolver( // aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { // return aws.Endpoint{URL: "https://s3-fips.us-west-2.amazonaws.com"}, nil // }), // ) // if err != nil { // panic(err) // } // // If buckets are public, you may use anonymous credential like so. // // manager.GetBucketRegion(ctx, s3.NewFromConfig(cfg), bucket, func(o *s3.Options) { // o.Credentials = nil // }) // // The request with anonymous credentials will not be signed. // Otherwise credentials would be required for private buckets. func GetBucketRegion(ctx context.Context, client HeadBucketAPIClient, bucket string, optFns ...func(*s3.Options)) (string, error) { var captureBucketRegion deserializeBucketRegion clientOptionFns := make([]func(*s3.Options), len(optFns)+2) clientOptionFns[0] = func(options *s3.Options) { options.APIOptions = append(options.APIOptions, captureBucketRegion.RegisterMiddleware) } clientOptionFns[1] = func(options *s3.Options) { options.Credentials = nil } copy(clientOptionFns[2:], optFns) _, err := client.HeadBucket(ctx, &s3.HeadBucketInput{ Bucket: aws.String(bucket), }, clientOptionFns...) if len(captureBucketRegion.BucketRegion) == 0 && err != nil { var httpStatusErr interface { HTTPStatusCode() int } if !errors.As(err, &httpStatusErr) { return "", err } if httpStatusErr.HTTPStatusCode() == http.StatusNotFound { return "", &bucketNotFound{} } return "", err } return captureBucketRegion.BucketRegion, nil } type deserializeBucketRegion struct { BucketRegion string } func (d *deserializeBucketRegion) RegisterMiddleware(stack *middleware.Stack) error { return stack.Deserialize.Add(d, middleware.After) } func (d *deserializeBucketRegion) ID() string { return "DeserializeBucketRegion" } func (d *deserializeBucketRegion) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } resp, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", out.RawResponse) } d.BucketRegion = resp.Header.Get(bucketRegionHeader) return out, metadata, err } // BucketNotFound indicates the bucket was not found in the partition when calling GetBucketRegion. type BucketNotFound interface { error isBucketNotFound() } type bucketNotFound struct{} func (b *bucketNotFound) Error() string { return "bucket not found" } func (b *bucketNotFound) isBucketNotFound() {} var _ BucketNotFound = (*bucketNotFound)(nil) ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/buffered_read_seeker.go ================================================ package manager import ( "io" ) // BufferedReadSeeker is buffered io.ReadSeeker type BufferedReadSeeker struct { r io.ReadSeeker buffer []byte readIdx, writeIdx int } // NewBufferedReadSeeker returns a new BufferedReadSeeker // if len(b) == 0 then the buffer will be initialized to 64 KiB. func NewBufferedReadSeeker(r io.ReadSeeker, b []byte) *BufferedReadSeeker { if len(b) == 0 { b = make([]byte, 64*1024) } return &BufferedReadSeeker{r: r, buffer: b} } func (b *BufferedReadSeeker) reset(r io.ReadSeeker) { b.r = r b.readIdx, b.writeIdx = 0, 0 } // Read will read up len(p) bytes into p and will return // the number of bytes read and any error that occurred. // If the len(p) > the buffer size then a single read request // will be issued to the underlying io.ReadSeeker for len(p) bytes. // A Read request will at most perform a single Read to the underlying // io.ReadSeeker, and may return < len(p) if serviced from the buffer. func (b *BufferedReadSeeker) Read(p []byte) (n int, err error) { if len(p) == 0 { return n, err } if b.readIdx == b.writeIdx { if len(p) >= len(b.buffer) { n, err = b.r.Read(p) return n, err } b.readIdx, b.writeIdx = 0, 0 n, err = b.r.Read(b.buffer) if n == 0 { return n, err } b.writeIdx += n } n = copy(p, b.buffer[b.readIdx:b.writeIdx]) b.readIdx += n return n, err } // Seek will position then underlying io.ReadSeeker to the given offset // and will clear the buffer. func (b *BufferedReadSeeker) Seek(offset int64, whence int) (int64, error) { n, err := b.r.Seek(offset, whence) b.reset(b.r) return n, err } // ReadAt will read up to len(p) bytes at the given file offset. // This will result in the buffer being cleared. func (b *BufferedReadSeeker) ReadAt(p []byte, off int64) (int, error) { _, err := b.Seek(off, io.SeekStart) if err != nil { return 0, err } return b.Read(p) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/default_read_seeker_write_to.go ================================================ //go:build !windows // +build !windows package manager func defaultUploadBufferProvider() ReadSeekerWriteToProvider { return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/default_read_seeker_write_to_windows.go ================================================ package manager func defaultUploadBufferProvider() ReadSeekerWriteToProvider { return NewBufferedReadSeekerWriteToPool(1024 * 1024) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/default_writer_read_from.go ================================================ //go:build !windows // +build !windows package manager func defaultDownloadBufferProvider() WriterReadFromProvider { return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/default_writer_read_from_windows.go ================================================ package manager func defaultDownloadBufferProvider() WriterReadFromProvider { return NewPooledBufferedWriterReadFromProvider(1024 * 1024) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/doc.go ================================================ // Package manager provides utilities to upload and download objects from // S3 concurrently. Helpful for when working with large objects. package manager ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/download.go ================================================ package manager import ( "context" "errors" "fmt" "io" "net/http" "strconv" "strings" "sync" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/internal/awsutil" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/smithy-go/logging" ) const userAgentKey = "s3-transfer" // DefaultDownloadPartSize is the default range of bytes to get at a time when // using Download(). const DefaultDownloadPartSize = 1024 * 1024 * 5 // DefaultDownloadConcurrency is the default number of goroutines to spin up // when using Download(). const DefaultDownloadConcurrency = 5 // DefaultPartBodyMaxRetries is the default number of retries to make when a part fails to download. const DefaultPartBodyMaxRetries = 3 type errReadingBody struct { err error } func (e *errReadingBody) Error() string { return fmt.Sprintf("failed to read part body: %v", e.err) } func (e *errReadingBody) Unwrap() error { return e.err } // The Downloader structure that calls Download(). It is safe to call Download() // on this structure for multiple objects and across concurrent goroutines. // Mutating the Downloader's properties is not safe to be done concurrently. type Downloader struct { // The size (in bytes) to request from S3 for each part. // The minimum allowed part size is 5MB, and if this value is set to zero, // the DefaultDownloadPartSize value will be used. // // PartSize is ignored if the Range input parameter is provided. PartSize int64 // PartBodyMaxRetries is the number of retry attempts to make for failed part downloads. PartBodyMaxRetries int // Logger to send logging messages to Logger logging.Logger // Enable Logging of part download retry attempts LogInterruptedDownloads bool // The number of goroutines to spin up in parallel when sending parts. // If this is set to zero, the DefaultDownloadConcurrency value will be used. // // Concurrency of 1 will download the parts sequentially. // // Concurrency is ignored if the Range input parameter is provided. Concurrency int // An S3 client to use when performing downloads. S3 DownloadAPIClient // List of client options that will be passed down to individual API // operation requests made by the downloader. ClientOptions []func(*s3.Options) // Defines the buffer strategy used when downloading a part. // // If a WriterReadFromProvider is given the Download manager // will pass the io.WriterAt of the Download request to the provider // and will use the returned WriterReadFrom from the provider as the // destination writer when copying from http response body. BufferProvider WriterReadFromProvider } // WithDownloaderClientOptions appends to the Downloader's API request options. func WithDownloaderClientOptions(opts ...func(*s3.Options)) func(*Downloader) { return func(d *Downloader) { d.ClientOptions = append(d.ClientOptions, opts...) } } // NewDownloader creates a new Downloader instance to downloads objects from // S3 in concurrent chunks. Pass in additional functional options to customize // the downloader behavior. Requires a client.ConfigProvider in order to create // a S3 service client. The session.Session satisfies the client.ConfigProvider // interface. // // Example: // // // Load AWS Config // cfg, err := config.LoadDefaultConfig(context.TODO()) // if err != nil { // panic(err) // } // // // Create an S3 client using the loaded configuration // s3.NewFromConfig(cfg) // // // Create a downloader passing it the S3 client // downloader := manager.NewDownloader(s3.NewFromConfig(cfg)) // // // Create a downloader with the client and custom downloader options // downloader := manager.NewDownloader(client, func(d *manager.Downloader) { // d.PartSize = 64 * 1024 * 1024 // 64MB per part // }) func NewDownloader(c DownloadAPIClient, options ...func(*Downloader)) *Downloader { d := &Downloader{ S3: c, PartSize: DefaultDownloadPartSize, PartBodyMaxRetries: DefaultPartBodyMaxRetries, Concurrency: DefaultDownloadConcurrency, BufferProvider: defaultDownloadBufferProvider(), } for _, option := range options { option(d) } return d } // Download downloads an object in S3 and writes the payload into w // using concurrent GET requests. The n int64 returned is the size of the object downloaded // in bytes. // // DownloadWithContext is the same as Download with the additional support for // Context input parameters. The Context must not be nil. A nil Context will // cause a panic. Use the Context to add deadlining, timeouts, etc. The // DownloadWithContext may create sub-contexts for individual underlying // requests. // // Additional functional options can be provided to configure the individual // download. These options are copies of the Downloader instance Download is // called from. Modifying the options will not impact the original Downloader // instance. Use the WithDownloaderClientOptions helper function to pass in request // options that will be applied to all API operations made with this downloader. // // The w io.WriterAt can be satisfied by an os.File to do multipart concurrent // downloads, or in memory []byte wrapper using aws.WriteAtBuffer. In case you download // files into memory do not forget to pre-allocate memory to avoid additional allocations // and GC runs. // // Example: // // // pre-allocate in memory buffer, where headObject type is *s3.HeadObjectOutput // buf := make([]byte, int(headObject.ContentLength)) // // wrap with aws.WriteAtBuffer // w := manager.NewWriteAtBuffer(buf) // // download file into the memory // numBytesDownloaded, err := downloader.Download(ctx, w, &s3.GetObjectInput{ // Bucket: aws.String(bucket), // Key: aws.String(item), // }) // // Specifying a Downloader.Concurrency of 1 will cause the Downloader to // download the parts from S3 sequentially. // // It is safe to call this method concurrently across goroutines. // // If the GetObjectInput's Range value is provided that will cause the downloader // to perform a single GetObjectInput request for that object's range. This will // caused the part size, and concurrency configurations to be ignored. func (d Downloader) Download(ctx context.Context, w io.WriterAt, input *s3.GetObjectInput, options ...func(*Downloader)) (n int64, err error) { if err := validateSupportedARNType(aws.ToString(input.Bucket)); err != nil { return 0, err } impl := downloader{w: w, in: input, cfg: d, ctx: ctx} // Copy ClientOptions clientOptions := make([]func(*s3.Options), 0, len(impl.cfg.ClientOptions)+1) clientOptions = append(clientOptions, func(o *s3.Options) { o.APIOptions = append(o.APIOptions, middleware.AddSDKAgentKey(middleware.FeatureMetadata, userAgentKey), addFeatureUserAgent, // yes, there are two of these ) }) clientOptions = append(clientOptions, impl.cfg.ClientOptions...) impl.cfg.ClientOptions = clientOptions for _, option := range options { option(&impl.cfg) } // Ensures we don't need nil checks later on impl.cfg.Logger = logging.WithContext(ctx, impl.cfg.Logger) impl.partBodyMaxRetries = d.PartBodyMaxRetries impl.totalBytes = -1 if impl.cfg.Concurrency == 0 { impl.cfg.Concurrency = DefaultDownloadConcurrency } if impl.cfg.PartSize == 0 { impl.cfg.PartSize = DefaultDownloadPartSize } return impl.download() } // downloader is the implementation structure used internally by Downloader. type downloader struct { ctx context.Context cfg Downloader in *s3.GetObjectInput w io.WriterAt wg sync.WaitGroup m sync.Mutex once sync.Once pos int64 totalBytes int64 written int64 err error etag string partBodyMaxRetries int } // download performs the implementation of the object download across ranged // GETs. func (d *downloader) download() (n int64, err error) { // If range is specified fall back to single download of that range // this enables the functionality of ranged gets with the downloader but // at the cost of no multipart downloads. if rng := aws.ToString(d.in.Range); len(rng) > 0 { d.downloadRange(rng) return d.written, d.err } // Spin off first worker to check additional header information d.getChunk() if total := d.getTotalBytes(); total >= 0 { // Spin up workers ch := make(chan dlchunk, d.cfg.Concurrency) for i := 0; i < d.cfg.Concurrency; i++ { d.wg.Add(1) go d.downloadPart(ch) } // Assign work for d.getErr() == nil { if d.pos >= total { break // We're finished queuing chunks } // Queue the next range of bytes to read. ch <- dlchunk{w: d.w, start: d.pos, size: d.cfg.PartSize} d.pos += d.cfg.PartSize } // Wait for completion close(ch) d.wg.Wait() } else { // Checking if we read anything new for d.err == nil { d.getChunk() } // We expect a 416 error letting us know we are done downloading the // total bytes. Since we do not know the content's length, this will // keep grabbing chunks of data until the range of bytes specified in // the request is out of range of the content. Once, this happens, a // 416 should occur. var responseError interface { HTTPStatusCode() int } if errors.As(d.err, &responseError) { if responseError.HTTPStatusCode() == http.StatusRequestedRangeNotSatisfiable { d.err = nil } } } // Return error return d.written, d.err } // downloadPart is an individual goroutine worker reading from the ch channel // and performing a GetObject request on the data with a given byte range. // // If this is the first worker, this operation also resolves the total number // of bytes to be read so that the worker manager knows when it is finished. func (d *downloader) downloadPart(ch chan dlchunk) { defer d.wg.Done() for { chunk, ok := <-ch if !ok { break } if d.getErr() != nil { // Drain the channel if there is an error, to prevent deadlocking // of download producer. continue } if err := d.downloadChunk(chunk); err != nil { d.setErr(err) } } } // getChunk grabs a chunk of data from the body. // Not thread safe. Should only used when grabbing data on a single thread. func (d *downloader) getChunk() { if d.getErr() != nil { return } chunk := dlchunk{w: d.w, start: d.pos, size: d.cfg.PartSize} d.pos += d.cfg.PartSize if err := d.downloadChunk(chunk); err != nil { d.setErr(err) } } // downloadRange downloads an Object given the passed in Byte-Range value. // The chunk used down download the range will be configured for that range. func (d *downloader) downloadRange(rng string) { if d.getErr() != nil { return } chunk := dlchunk{w: d.w, start: d.pos} // Ranges specified will short circuit the multipart download chunk.withRange = rng if err := d.downloadChunk(chunk); err != nil { d.setErr(err) } // Update the position based on the amount of data received. d.pos = d.written } // downloadChunk downloads the chunk from s3 func (d *downloader) downloadChunk(chunk dlchunk) error { var params s3.GetObjectInput awsutil.Copy(¶ms, d.in) // Get the next byte range of data params.Range = aws.String(chunk.ByteRange()) if params.VersionId == nil && d.etag != "" { params.IfMatch = aws.String(d.etag) } var n int64 var err error for retry := 0; retry <= d.partBodyMaxRetries; retry++ { n, err = d.tryDownloadChunk(¶ms, &chunk) if err == nil { break } // Check if the returned error is an errReadingBody. // If err is errReadingBody this indicates that an error // occurred while copying the http response body. // If this occurs we unwrap the err to set the underlying error // and attempt any remaining retries. if bodyErr, ok := err.(*errReadingBody); ok { err = bodyErr.Unwrap() } else { return err } chunk.cur = 0 d.cfg.Logger.Logf(logging.Debug, "object part body download interrupted %s, err, %v, retrying attempt %d", aws.ToString(params.Key), err, retry) } d.incrWritten(n) return err } func (d *downloader) tryDownloadChunk(params *s3.GetObjectInput, w io.Writer) (int64, error) { cleanup := func() {} if d.cfg.BufferProvider != nil { w, cleanup = d.cfg.BufferProvider.GetReadFrom(w) } defer cleanup() resp, err := d.cfg.S3.GetObject(d.ctx, params, d.cfg.ClientOptions...) if err != nil { return 0, err } d.setTotalBytes(resp) // Set total if not yet set. d.once.Do(func() { d.etag = aws.ToString(resp.ETag) }) var src io.Reader = resp.Body if d.cfg.BufferProvider != nil { src = &suppressWriterAt{suppressed: src} } n, err := io.Copy(w, src) resp.Body.Close() if err != nil { return n, &errReadingBody{err: err} } return n, nil } // getTotalBytes is a thread-safe getter for retrieving the total byte status. func (d *downloader) getTotalBytes() int64 { d.m.Lock() defer d.m.Unlock() return d.totalBytes } // setTotalBytes is a thread-safe setter for setting the total byte status. // Will extract the object's total bytes from the Content-Range if the file // will be chunked, or Content-Length. Content-Length is used when the response // does not include a Content-Range. Meaning the object was not chunked. This // occurs when the full file fits within the PartSize directive. func (d *downloader) setTotalBytes(resp *s3.GetObjectOutput) { d.m.Lock() defer d.m.Unlock() if d.totalBytes >= 0 { return } if resp.ContentRange == nil { // ContentRange is nil when the full file contents is provided, and // is not chunked. Use ContentLength instead. if aws.ToInt64(resp.ContentLength) > 0 { d.totalBytes = aws.ToInt64(resp.ContentLength) return } } else { parts := strings.Split(*resp.ContentRange, "/") total := int64(-1) var err error // Checking for whether or not a numbered total exists // If one does not exist, we will assume the total to be -1, undefined, // and sequentially download each chunk until hitting a 416 error totalStr := parts[len(parts)-1] if totalStr != "*" { total, err = strconv.ParseInt(totalStr, 10, 64) if err != nil { d.err = err return } } d.totalBytes = total } } func (d *downloader) incrWritten(n int64) { d.m.Lock() defer d.m.Unlock() d.written += n } // getErr is a thread-safe getter for the error object func (d *downloader) getErr() error { d.m.Lock() defer d.m.Unlock() return d.err } // setErr is a thread-safe setter for the error object func (d *downloader) setErr(e error) { d.m.Lock() defer d.m.Unlock() d.err = e } // dlchunk represents a single chunk of data to write by the worker routine. // This structure also implements an io.SectionReader style interface for // io.WriterAt, effectively making it an io.SectionWriter (which does not // exist). type dlchunk struct { w io.WriterAt start int64 size int64 cur int64 // specifies the byte range the chunk should be downloaded with. withRange string } // Write wraps io.WriterAt for the dlchunk, writing from the dlchunk's start // position to its end (or EOF). // // If a range is specified on the dlchunk the size will be ignored when writing. // as the total size may not of be known ahead of time. func (c *dlchunk) Write(p []byte) (n int, err error) { if c.cur >= c.size && len(c.withRange) == 0 { return 0, io.EOF } n, err = c.w.WriteAt(p, c.start+c.cur) c.cur += int64(n) return } // ByteRange returns a HTTP Byte-Range header value that should be used by the // client to request the chunk's range. func (c *dlchunk) ByteRange() string { if len(c.withRange) != 0 { return c.withRange } return fmt.Sprintf("bytes=%d-%d", c.start, c.start+c.size-1) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package manager // goModuleVersion is the tagged release for this module const goModuleVersion = "1.17.75" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/pool.go ================================================ package manager import ( "context" "fmt" "sync" ) type byteSlicePool interface { Get(context.Context) (*[]byte, error) Put(*[]byte) ModifyCapacity(int) SliceSize() int64 Close() } type maxSlicePool struct { // allocator is defined as a function pointer to allow // for test cases to instrument custom tracers when allocations // occur. allocator sliceAllocator slices chan *[]byte allocations chan struct{} capacityChange chan struct{} max int sliceSize int64 mtx sync.RWMutex } func newMaxSlicePool(sliceSize int64) *maxSlicePool { p := &maxSlicePool{sliceSize: sliceSize} p.allocator = p.newSlice return p } var errZeroCapacity = fmt.Errorf("get called on zero capacity pool") func (p *maxSlicePool) Get(ctx context.Context) (*[]byte, error) { // check if context is canceled before attempting to get a slice // this ensures priority is given to the cancel case first select { case <-ctx.Done(): return nil, ctx.Err() default: } p.mtx.RLock() for { select { case bs, ok := <-p.slices: p.mtx.RUnlock() if !ok { // attempt to get on a zero capacity pool return nil, errZeroCapacity } return bs, nil case <-ctx.Done(): p.mtx.RUnlock() return nil, ctx.Err() default: // pass } select { case _, ok := <-p.allocations: p.mtx.RUnlock() if !ok { // attempt to get on a zero capacity pool return nil, errZeroCapacity } return p.allocator(), nil case <-ctx.Done(): p.mtx.RUnlock() return nil, ctx.Err() default: // In the event that there are no slices or allocations available // This prevents some deadlock situations that can occur around sync.RWMutex // When a lock request occurs on ModifyCapacity, no new readers are allowed to acquire a read lock. // By releasing the read lock here and waiting for a notification, we prevent a deadlock situation where // Get could hold the read lock indefinitely waiting for capacity, ModifyCapacity is waiting for a write lock, // and a Put is blocked trying to get a read-lock which is blocked by ModifyCapacity. // Short-circuit if the pool capacity is zero. if p.max == 0 { p.mtx.RUnlock() return nil, errZeroCapacity } // Since we will be releasing the read-lock we need to take the reference to the channel. // Since channels are references we will still get notified if slices are added, or if // the channel is closed due to a capacity modification. This specifically avoids a data race condition // where ModifyCapacity both closes a channel and initializes a new one while we don't have a read-lock. c := p.capacityChange p.mtx.RUnlock() select { case _ = <-c: p.mtx.RLock() case <-ctx.Done(): return nil, ctx.Err() } } } } func (p *maxSlicePool) Put(bs *[]byte) { p.mtx.RLock() defer p.mtx.RUnlock() if p.max == 0 { return } select { case p.slices <- bs: p.notifyCapacity() default: // If the new channel when attempting to add the slice then we drop the slice. // The logic here is to prevent a deadlock situation if channel is already at max capacity. // Allows us to reap allocations that are returned and are no longer needed. } } func (p *maxSlicePool) ModifyCapacity(delta int) { if delta == 0 { return } p.mtx.Lock() defer p.mtx.Unlock() p.max += delta if p.max == 0 { p.empty() return } if p.capacityChange != nil { close(p.capacityChange) } p.capacityChange = make(chan struct{}, p.max) origAllocations := p.allocations p.allocations = make(chan struct{}, p.max) newAllocs := len(origAllocations) + delta for i := 0; i < newAllocs; i++ { p.allocations <- struct{}{} } if origAllocations != nil { close(origAllocations) } origSlices := p.slices p.slices = make(chan *[]byte, p.max) if origSlices == nil { return } close(origSlices) for bs := range origSlices { select { case p.slices <- bs: default: // If the new channel blocks while adding slices from the old channel // then we drop the slice. The logic here is to prevent a deadlock situation // if the new channel has a smaller capacity then the old. } } } func (p *maxSlicePool) notifyCapacity() { select { case p.capacityChange <- struct{}{}: default: // This *shouldn't* happen as the channel is both buffered to the max pool capacity size and is resized // on capacity modifications. This is just a safety to ensure that a blocking situation can't occur. } } func (p *maxSlicePool) SliceSize() int64 { return p.sliceSize } func (p *maxSlicePool) Close() { p.mtx.Lock() defer p.mtx.Unlock() p.empty() } func (p *maxSlicePool) empty() { p.max = 0 if p.capacityChange != nil { close(p.capacityChange) p.capacityChange = nil } if p.allocations != nil { close(p.allocations) for range p.allocations { // drain channel } p.allocations = nil } if p.slices != nil { close(p.slices) for range p.slices { // drain channel } p.slices = nil } } func (p *maxSlicePool) newSlice() *[]byte { bs := make([]byte, p.sliceSize) return &bs } type returnCapacityPoolCloser struct { byteSlicePool returnCapacity int } func (n *returnCapacityPoolCloser) ModifyCapacity(delta int) { if delta > 0 { n.returnCapacity = -1 * delta } n.byteSlicePool.ModifyCapacity(delta) } func (n *returnCapacityPoolCloser) Close() { if n.returnCapacity < 0 { n.byteSlicePool.ModifyCapacity(n.returnCapacity) } } type sliceAllocator func() *[]byte var newByteSlicePool = func(sliceSize int64) byteSlicePool { return newMaxSlicePool(sliceSize) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/read_seeker_write_to.go ================================================ package manager import ( "io" "sync" ) // ReadSeekerWriteTo defines an interface implementing io.WriteTo and io.ReadSeeker type ReadSeekerWriteTo interface { io.ReadSeeker io.WriterTo } // BufferedReadSeekerWriteTo wraps a BufferedReadSeeker with an io.WriteAt // implementation. type BufferedReadSeekerWriteTo struct { *BufferedReadSeeker } // WriteTo writes to the given io.Writer from BufferedReadSeeker until there's no more data to write or // an error occurs. Returns the number of bytes written and any error encountered during the write. func (b *BufferedReadSeekerWriteTo) WriteTo(writer io.Writer) (int64, error) { return io.Copy(writer, b.BufferedReadSeeker) } // ReadSeekerWriteToProvider provides an implementation of io.WriteTo for an io.ReadSeeker type ReadSeekerWriteToProvider interface { GetWriteTo(seeker io.ReadSeeker) (r ReadSeekerWriteTo, cleanup func()) } // BufferedReadSeekerWriteToPool uses a sync.Pool to create and reuse // []byte slices for buffering parts in memory type BufferedReadSeekerWriteToPool struct { pool sync.Pool } // NewBufferedReadSeekerWriteToPool will return a new BufferedReadSeekerWriteToPool that will create // a pool of reusable buffers . If size is less then < 64 KiB then the buffer // will default to 64 KiB. Reason: io.Copy from writers or readers that don't support io.WriteTo or io.ReadFrom // respectively will default to copying 32 KiB. func NewBufferedReadSeekerWriteToPool(size int) *BufferedReadSeekerWriteToPool { if size < 65536 { size = 65536 } return &BufferedReadSeekerWriteToPool{ pool: sync.Pool{New: func() interface{} { return make([]byte, size) }}, } } // GetWriteTo will wrap the provided io.ReadSeeker with a BufferedReadSeekerWriteTo. // The provided cleanup must be called after operations have been completed on the // returned io.ReadSeekerWriteTo in order to signal the return of resources to the pool. func (p *BufferedReadSeekerWriteToPool) GetWriteTo(seeker io.ReadSeeker) (r ReadSeekerWriteTo, cleanup func()) { buffer := p.pool.Get().([]byte) r = &BufferedReadSeekerWriteTo{BufferedReadSeeker: NewBufferedReadSeeker(seeker, buffer)} cleanup = func() { p.pool.Put(buffer) } return r, cleanup } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/types.go ================================================ package manager import ( "io" "sync" ) // ReadSeekCloser wraps a io.Reader returning a ReaderSeekerCloser. Allows the // SDK to accept an io.Reader that is not also an io.Seeker for unsigned // streaming payload API operations. // // A readSeekCloser wrapping an nonseekable io.Reader used in an API operation's // input will prevent that operation being retried in the case of // network errors, and cause operation requests to fail if yhe operation // requires payload signing. // // Note: If using with S3 PutObject to stream an object upload. The SDK's S3 // Upload Manager(manager.Uploader) provides support for streaming // with the ability to retry network errors. func ReadSeekCloser(r io.Reader) *ReaderSeekerCloser { return &ReaderSeekerCloser{r} } // ReaderSeekerCloser represents a reader that can also delegate io.Seeker and // io.Closer interfaces to the underlying object if they are available. type ReaderSeekerCloser struct { r io.Reader } // seekerLen attempts to get the number of bytes remaining at the seeker's // current position. Returns the number of bytes remaining or error. func seekerLen(s io.Seeker) (int64, error) { // Determine if the seeker is actually seekable. ReaderSeekerCloser // hides the fact that a io.Readers might not actually be seekable. switch v := s.(type) { case *ReaderSeekerCloser: return v.GetLen() } return computeSeekerLength(s) } // GetLen returns the length of the bytes remaining in the underlying reader. // Checks first for Len(), then io.Seeker to determine the size of the // underlying reader. // // Will return -1 if the length cannot be determined. func (r *ReaderSeekerCloser) GetLen() (int64, error) { if l, ok := r.HasLen(); ok { return int64(l), nil } if s, ok := r.r.(io.Seeker); ok { return computeSeekerLength(s) } return -1, nil } func computeSeekerLength(s io.Seeker) (int64, error) { curOffset, err := s.Seek(0, io.SeekCurrent) if err != nil { return 0, err } endOffset, err := s.Seek(0, io.SeekEnd) if err != nil { return 0, err } _, err = s.Seek(curOffset, io.SeekStart) if err != nil { return 0, err } return endOffset - curOffset, nil } // HasLen returns the length of the underlying reader if the value implements // the Len() int method. func (r *ReaderSeekerCloser) HasLen() (int, bool) { type lenner interface { Len() int } if lr, ok := r.r.(lenner); ok { return lr.Len(), true } return 0, false } // Read reads from the reader up to size of p. The number of bytes read, and // error if it occurred will be returned. // // If the reader is not an io.Reader zero bytes read, and nil error will be // returned. // // Performs the same functionality as io.Reader Read func (r *ReaderSeekerCloser) Read(p []byte) (int, error) { switch t := r.r.(type) { case io.Reader: return t.Read(p) } return 0, nil } // Seek sets the offset for the next Read to offset, interpreted according to // whence: 0 means relative to the origin of the file, 1 means relative to the // current offset, and 2 means relative to the end. Seek returns the new offset // and an error, if any. // // If the ReaderSeekerCloser is not an io.Seeker nothing will be done. func (r *ReaderSeekerCloser) Seek(offset int64, whence int) (int64, error) { switch t := r.r.(type) { case io.Seeker: return t.Seek(offset, whence) } return int64(0), nil } // IsSeeker returns if the underlying reader is also a seeker. func (r *ReaderSeekerCloser) IsSeeker() bool { _, ok := r.r.(io.Seeker) return ok } // Close closes the ReaderSeekerCloser. // // If the ReaderSeekerCloser is not an io.Closer nothing will be done. func (r *ReaderSeekerCloser) Close() error { switch t := r.r.(type) { case io.Closer: return t.Close() } return nil } // A WriteAtBuffer provides a in memory buffer supporting the io.WriterAt interface // Can be used with the manager.Downloader to download content to a buffer // in memory. Safe to use concurrently. type WriteAtBuffer struct { buf []byte m sync.Mutex // GrowthCoeff defines the growth rate of the internal buffer. By // default, the growth rate is 1, where expanding the internal // buffer will allocate only enough capacity to fit the new expected // length. GrowthCoeff float64 } // NewWriteAtBuffer creates a WriteAtBuffer with an internal buffer // provided by buf. func NewWriteAtBuffer(buf []byte) *WriteAtBuffer { return &WriteAtBuffer{buf: buf} } // WriteAt writes a slice of bytes to a buffer starting at the position provided // The number of bytes written will be returned, or error. Can overwrite previous // written slices if the write ats overlap. func (b *WriteAtBuffer) WriteAt(p []byte, pos int64) (n int, err error) { pLen := len(p) expLen := pos + int64(pLen) b.m.Lock() defer b.m.Unlock() if int64(len(b.buf)) < expLen { if int64(cap(b.buf)) < expLen { if b.GrowthCoeff < 1 { b.GrowthCoeff = 1 } newBuf := make([]byte, expLen, int64(b.GrowthCoeff*float64(expLen))) copy(newBuf, b.buf) b.buf = newBuf } b.buf = b.buf[:expLen] } copy(b.buf[pos:], p) return pLen, nil } // Bytes returns a slice of bytes written to the buffer. func (b *WriteAtBuffer) Bytes() []byte { b.m.Lock() defer b.m.Unlock() return b.buf } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/upload.go ================================================ package manager import ( "bytes" "context" "errors" "fmt" "io" "net/http" "sort" "sync" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/internal/awsutil" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" smithymiddleware "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // MaxUploadParts is the maximum allowed number of parts in a multi-part upload // on Amazon S3. const MaxUploadParts int32 = 10000 // MinUploadPartSize is the minimum allowed part size when uploading a part to // Amazon S3. const MinUploadPartSize int64 = 1024 * 1024 * 5 // DefaultUploadPartSize is the default part size to buffer chunks of a // payload into. const DefaultUploadPartSize = MinUploadPartSize // DefaultUploadConcurrency is the default number of goroutines to spin up when // using Upload(). const DefaultUploadConcurrency = 5 // A MultiUploadFailure wraps a failed S3 multipart upload. An error returned // will satisfy this interface when a multi part upload failed to upload all // chucks to S3. In the case of a failure the UploadID is needed to operate on // the chunks, if any, which were uploaded. // // Example: // // u := manager.NewUploader(client) // output, err := u.upload(context.Background(), input) // if err != nil { // var multierr manager.MultiUploadFailure // if errors.As(err, &multierr) { // fmt.Printf("upload failure UploadID=%s, %s\n", multierr.UploadID(), multierr.Error()) // } else { // fmt.Printf("upload failure, %s\n", err.Error()) // } // } type MultiUploadFailure interface { error // UploadID returns the upload id for the S3 multipart upload that failed. UploadID() string } // A multiUploadError wraps the upload ID of a failed s3 multipart upload. // Composed of BaseError for code, message, and original error // // Should be used for an error that occurred failing a S3 multipart upload, // and a upload ID is available. If an uploadID is not available a more relevant type multiUploadError struct { err error // ID for multipart upload which failed. uploadID string } // batchItemError returns the string representation of the error. // // # See apierr.BaseError ErrorWithExtra for output format // // Satisfies the error interface. func (m *multiUploadError) Error() string { var extra string if m.err != nil { extra = fmt.Sprintf(", cause: %s", m.err.Error()) } return fmt.Sprintf("upload multipart failed, upload id: %s%s", m.uploadID, extra) } // Unwrap returns the underlying error that cause the upload failure func (m *multiUploadError) Unwrap() error { return m.err } // UploadID returns the id of the S3 upload which failed. func (m *multiUploadError) UploadID() string { return m.uploadID } // UploadOutput represents a response from the Upload() call. type UploadOutput struct { // The URL where the object was uploaded to. Location string // The ID for a multipart upload to S3. In the case of an error the error // can be cast to the MultiUploadFailure interface to extract the upload ID. // Will be empty string if multipart upload was not used, and the object // was uploaded as a single PutObject call. UploadID string // The list of parts that were uploaded and their checksums. Will be empty // if multipart upload was not used, and the object was uploaded as a // single PutObject call. CompletedParts []types.CompletedPart // Indicates whether the uploaded object uses an S3 Bucket Key for server-side // encryption with Amazon Web Services KMS (SSE-KMS). BucketKeyEnabled bool // The base64-encoded, 32-bit CRC32 checksum of the object. ChecksumCRC32 *string // The base64-encoded, 32-bit CRC32C checksum of the object. ChecksumCRC32C *string // The base64-encoded, 64-bit CRC64NVME checksum of the object. ChecksumCRC64NVME *string // The base64-encoded, 160-bit SHA-1 digest of the object. ChecksumSHA1 *string // The base64-encoded, 256-bit SHA-256 digest of the object. ChecksumSHA256 *string // Entity tag for the uploaded object. ETag *string // If the object expiration is configured, this will contain the expiration date // (expiry-date) and rule ID (rule-id). The value of rule-id is URL encoded. Expiration *string // The object key of the newly created object. Key *string // If present, indicates that the requester was successfully charged for the // request. RequestCharged types.RequestCharged // If present, specifies the ID of the Amazon Web Services Key Management Service // (Amazon Web Services KMS) symmetric customer managed customer master key (CMK) // that was used for the object. SSEKMSKeyId *string // If you specified server-side encryption either with an Amazon S3-managed // encryption key or an Amazon Web Services KMS customer master key (CMK) in your // initiate multipart upload request, the response includes this header. It // confirms the encryption algorithm that Amazon S3 used to encrypt the object. ServerSideEncryption types.ServerSideEncryption // The version of the object that was uploaded. Will only be populated if // the S3 Bucket is versioned. If the bucket is not versioned this field // will not be set. VersionID *string } // WithUploaderRequestOptions appends to the Uploader's API client options. func WithUploaderRequestOptions(opts ...func(*s3.Options)) func(*Uploader) { return func(u *Uploader) { u.ClientOptions = append(u.ClientOptions, opts...) } } // The Uploader structure that calls Upload(). It is safe to call Upload() // on this structure for multiple objects and across concurrent goroutines. // Mutating the Uploader's properties is not safe to be done concurrently. // // # Pre-computed Checksums // // Care must be taken when using pre-computed checksums the transfer upload // manager. The format and value of the checksum differs based on if the upload // will preformed as a single or multipart upload. // // Uploads that are smaller than the Uploader's PartSize will be uploaded using // the PutObject API operation. Pre-computed checksum of the uploaded object's // content are valid for these single part uploads. If the checksum provided // does not match the uploaded content the upload will fail. // // Uploads that are larger than the Uploader's PartSize will be uploaded using // multi-part upload. The Pre-computed checksums for these uploads are a // checksum of checksums of each part. Not a checksum of the full uploaded // bytes. With the format of "-", (e.g. // "DUoRhQ==-3"). If a pre-computed checksum is provided that does not match // this format, as matches the content uploaded, the upload will fail. // // ContentMD5 for multipart upload is explicitly ignored for multipart upload, // and its value is suppressed. // // # Automatically Computed Checksums // // When the ChecksumAlgorithm member of Upload's input parameter PutObjectInput // is set to a valid value, the SDK will automatically compute the checksum of // the individual uploaded parts. The UploadOutput result from Upload will // include the checksum of part checksums provided by S3 // CompleteMultipartUpload API call. type Uploader struct { // The buffer size (in bytes) to use when buffering data into chunks and // sending them as parts to S3. The minimum allowed part size is 5MB, and // if this value is set to zero, the DefaultUploadPartSize value will be used. PartSize int64 // The number of goroutines to spin up in parallel per call to Upload when // sending parts. If this is set to zero, the DefaultUploadConcurrency value // will be used. // // The concurrency pool is not shared between calls to Upload. Concurrency int // Setting this value to true will cause the SDK to avoid calling // AbortMultipartUpload on a failure, leaving all successfully uploaded // parts on S3 for manual recovery. // // Note that storing parts of an incomplete multipart upload counts towards // space usage on S3 and will add additional costs if not cleaned up. LeavePartsOnError bool // MaxUploadParts is the max number of parts which will be uploaded to S3. // Will be used to calculate the partsize of the object to be uploaded. // E.g: 5GB file, with MaxUploadParts set to 100, will upload the file // as 100, 50MB parts. With a limited of s3.MaxUploadParts (10,000 parts). // // MaxUploadParts must not be used to limit the total number of bytes uploaded. // Use a type like to io.LimitReader (https://golang.org/pkg/io/#LimitedReader) // instead. An io.LimitReader is helpful when uploading an unbounded reader // to S3, and you know its maximum size. Otherwise the reader's io.EOF returned // error must be used to signal end of stream. // // Defaults to package const's MaxUploadParts value. MaxUploadParts int32 // The client to use when uploading to S3. S3 UploadAPIClient // List of request options that will be passed down to individual API // operation requests made by the uploader. ClientOptions []func(*s3.Options) // Defines the buffer strategy used when uploading a part BufferProvider ReadSeekerWriteToProvider // partPool allows for the re-usage of streaming payload part buffers between upload calls partPool byteSlicePool } // NewUploader creates a new Uploader instance to upload objects to S3. Pass In // additional functional options to customize the uploader's behavior. Requires a // client.ConfigProvider in order to create a S3 service client. The session.Session // satisfies the client.ConfigProvider interface. // // Example: // // // Load AWS Config // cfg, err := config.LoadDefaultConfig(context.TODO()) // if err != nil { // panic(err) // } // // // Create an S3 Client with the config // client := s3.NewFromConfig(cfg) // // // Create an uploader passing it the client // uploader := manager.NewUploader(client) // // // Create an uploader with the client and custom options // uploader := manager.NewUploader(client, func(u *manager.Uploader) { // u.PartSize = 64 * 1024 * 1024 // 64MB per part // }) func NewUploader(client UploadAPIClient, options ...func(*Uploader)) *Uploader { u := &Uploader{ S3: client, PartSize: DefaultUploadPartSize, Concurrency: DefaultUploadConcurrency, LeavePartsOnError: false, MaxUploadParts: MaxUploadParts, BufferProvider: defaultUploadBufferProvider(), } for _, option := range options { option(u) } u.partPool = newByteSlicePool(u.PartSize) return u } // Upload uploads an object to S3, intelligently buffering large // files into smaller chunks and sending them in parallel across multiple // goroutines. You can configure the buffer size and concurrency through the // Uploader parameters. // // Additional functional options can be provided to configure the individual // upload. These options are copies of the Uploader instance Upload is called from. // Modifying the options will not impact the original Uploader instance. // // Use the WithUploaderRequestOptions helper function to pass in request // options that will be applied to all API operations made with this uploader. // // It is safe to call this method concurrently across goroutines. func (u Uploader) Upload(ctx context.Context, input *s3.PutObjectInput, opts ...func(*Uploader)) ( *UploadOutput, error, ) { i := uploader{in: input, cfg: u, ctx: ctx} // Copy ClientOptions clientOptions := make([]func(*s3.Options), 0, len(i.cfg.ClientOptions)+1) clientOptions = append(clientOptions, func(o *s3.Options) { o.APIOptions = append(o.APIOptions, middleware.AddSDKAgentKey(middleware.FeatureMetadata, userAgentKey), addFeatureUserAgent, // yes, there are two of these func(s *smithymiddleware.Stack) error { return s.Finalize.Insert(&setS3ExpressDefaultChecksum{}, "ResolveEndpointV2", smithymiddleware.After) }, ) }) clientOptions = append(clientOptions, i.cfg.ClientOptions...) i.cfg.ClientOptions = clientOptions for _, opt := range opts { opt(&i.cfg) } return i.upload() } // internal structure to manage an upload to S3. type uploader struct { ctx context.Context cfg Uploader in *s3.PutObjectInput readerPos int64 // current reader position totalSize int64 // set to -1 if the size is not known } // internal logic for deciding whether to upload a single part or use a // multipart upload. func (u *uploader) upload() (*UploadOutput, error) { if err := u.init(); err != nil { return nil, fmt.Errorf("unable to initialize upload: %w", err) } defer u.cfg.partPool.Close() if u.cfg.PartSize < MinUploadPartSize { return nil, fmt.Errorf("part size must be at least %d bytes", MinUploadPartSize) } // Do one read to determine if we have more than one part reader, _, cleanup, err := u.nextReader() if err == io.EOF { // single part return u.singlePart(reader, cleanup) } else if err != nil { cleanup() return nil, fmt.Errorf("read upload data failed: %w", err) } mu := multiuploader{uploader: u} return mu.upload(reader, cleanup) } // init will initialize all default options. func (u *uploader) init() error { if err := validateSupportedARNType(aws.ToString(u.in.Bucket)); err != nil { return err } if u.cfg.Concurrency == 0 { u.cfg.Concurrency = DefaultUploadConcurrency } if u.cfg.PartSize == 0 { u.cfg.PartSize = DefaultUploadPartSize } if u.cfg.MaxUploadParts == 0 { u.cfg.MaxUploadParts = MaxUploadParts } // Try to get the total size for some optimizations if err := u.initSize(); err != nil { return err } // If PartSize was changed or partPool was never setup then we need to allocated a new pool // so that we return []byte slices of the correct size poolCap := u.cfg.Concurrency + 1 if u.cfg.partPool == nil || u.cfg.partPool.SliceSize() != u.cfg.PartSize { u.cfg.partPool = newByteSlicePool(u.cfg.PartSize) u.cfg.partPool.ModifyCapacity(poolCap) } else { u.cfg.partPool = &returnCapacityPoolCloser{byteSlicePool: u.cfg.partPool} u.cfg.partPool.ModifyCapacity(poolCap) } return nil } // initSize tries to detect the total stream size, setting u.totalSize. If // the size is not known, totalSize is set to -1. func (u *uploader) initSize() error { u.totalSize = -1 switch r := u.in.Body.(type) { case io.Seeker: n, err := seekerLen(r) if err != nil { return err } u.totalSize = n // Try to adjust partSize if it is too small and account for // integer division truncation. if u.totalSize/u.cfg.PartSize >= int64(u.cfg.MaxUploadParts) { // Add one to the part size to account for remainders // during the size calculation. e.g odd number of bytes. u.cfg.PartSize = (u.totalSize / int64(u.cfg.MaxUploadParts)) + 1 } } return nil } // nextReader returns a seekable reader representing the next packet of data. // This operation increases the shared u.readerPos counter, but note that it // does not need to be wrapped in a mutex because nextReader is only called // from the main thread. func (u *uploader) nextReader() (io.ReadSeeker, int, func(), error) { switch r := u.in.Body.(type) { case readerAtSeeker: var err error n := u.cfg.PartSize if u.totalSize >= 0 { bytesLeft := u.totalSize - u.readerPos if bytesLeft <= u.cfg.PartSize { err = io.EOF n = bytesLeft } } var ( reader io.ReadSeeker cleanup func() ) reader = io.NewSectionReader(r, u.readerPos, n) if u.cfg.BufferProvider != nil { reader, cleanup = u.cfg.BufferProvider.GetWriteTo(reader) } else { cleanup = func() {} } u.readerPos += n return reader, int(n), cleanup, err default: part, err := u.cfg.partPool.Get(u.ctx) if err != nil { return nil, 0, func() {}, err } n, err := readFillBuf(r, *part) u.readerPos += int64(n) cleanup := func() { u.cfg.partPool.Put(part) } return bytes.NewReader((*part)[0:n]), n, cleanup, err } } func readFillBuf(r io.Reader, b []byte) (offset int, err error) { for offset < len(b) && err == nil { var n int n, err = r.Read(b[offset:]) offset += n } return offset, err } // singlePart contains upload logic for uploading a single chunk via // a regular PutObject request. Multipart requests require at least two // parts, or at least 5MB of data. func (u *uploader) singlePart(r io.ReadSeeker, cleanup func()) (*UploadOutput, error) { defer cleanup() var params s3.PutObjectInput awsutil.Copy(¶ms, u.in) params.Body = r // Need to use request form because URL generated in request is // used in return. var locationRecorder recordLocationClient out, err := u.cfg.S3.PutObject(u.ctx, ¶ms, append(u.cfg.ClientOptions, locationRecorder.WrapClient())...) if err != nil { return nil, err } return &UploadOutput{ Location: locationRecorder.location, BucketKeyEnabled: aws.ToBool(out.BucketKeyEnabled), ChecksumCRC32: out.ChecksumCRC32, ChecksumCRC32C: out.ChecksumCRC32C, ChecksumCRC64NVME: out.ChecksumCRC64NVME, ChecksumSHA1: out.ChecksumSHA1, ChecksumSHA256: out.ChecksumSHA256, ETag: out.ETag, Expiration: out.Expiration, Key: params.Key, RequestCharged: out.RequestCharged, SSEKMSKeyId: out.SSEKMSKeyId, ServerSideEncryption: out.ServerSideEncryption, VersionID: out.VersionId, }, nil } type httpClient interface { Do(r *http.Request) (*http.Response, error) } type recordLocationClient struct { httpClient location string } func (c *recordLocationClient) WrapClient() func(o *s3.Options) { return func(o *s3.Options) { c.httpClient = o.HTTPClient o.HTTPClient = c } } func (c *recordLocationClient) Do(r *http.Request) (resp *http.Response, err error) { resp, err = c.httpClient.Do(r) if err != nil { return resp, err } if resp.Request != nil && resp.Request.URL != nil { url := *resp.Request.URL url.RawQuery = "" c.location = url.String() } return resp, err } // internal structure to manage a specific multipart upload to S3. type multiuploader struct { *uploader wg sync.WaitGroup m sync.Mutex err error uploadID string parts completedParts } // keeps track of a single chunk of data being sent to S3. type chunk struct { buf io.ReadSeeker num int32 cleanup func() } // completedParts is a wrapper to make parts sortable by their part number, // since S3 required this list to be sent in sorted order. type completedParts []types.CompletedPart func (a completedParts) Len() int { return len(a) } func (a completedParts) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a completedParts) Less(i, j int) bool { return aws.ToInt32(a[i].PartNumber) < aws.ToInt32(a[j].PartNumber) } // upload will perform a multipart upload using the firstBuf buffer containing // the first chunk of data. func (u *multiuploader) upload(firstBuf io.ReadSeeker, cleanup func()) (*UploadOutput, error) { u.initChecksumAlgorithm() var params s3.CreateMultipartUploadInput awsutil.Copy(¶ms, u.in) // Create the multipart var locationRecorder recordLocationClient resp, err := u.cfg.S3.CreateMultipartUpload(u.ctx, ¶ms, append(u.cfg.ClientOptions, locationRecorder.WrapClient())...) if err != nil { cleanup() return nil, err } u.uploadID = *resp.UploadId // Create the workers ch := make(chan chunk, u.cfg.Concurrency) for i := 0; i < u.cfg.Concurrency; i++ { u.wg.Add(1) go u.readChunk(ch) } // Send part 1 to the workers var num int32 = 1 ch <- chunk{buf: firstBuf, num: num, cleanup: cleanup} // Read and queue the rest of the parts for u.geterr() == nil && err == nil { var ( reader io.ReadSeeker nextChunkLen int ok bool ) reader, nextChunkLen, cleanup, err = u.nextReader() ok, err = u.shouldContinue(num, nextChunkLen, err) if !ok { cleanup() if err != nil { u.seterr(err) } break } num++ ch <- chunk{buf: reader, num: num, cleanup: cleanup} } // Close the channel, wait for workers, and complete upload close(ch) u.wg.Wait() completeOut := u.complete() if err := u.geterr(); err != nil { return nil, &multiUploadError{ err: err, uploadID: u.uploadID, } } return &UploadOutput{ Location: locationRecorder.location, UploadID: u.uploadID, CompletedParts: u.parts, BucketKeyEnabled: aws.ToBool(completeOut.BucketKeyEnabled), ChecksumCRC32: completeOut.ChecksumCRC32, ChecksumCRC32C: completeOut.ChecksumCRC32C, ChecksumCRC64NVME: completeOut.ChecksumCRC64NVME, ChecksumSHA1: completeOut.ChecksumSHA1, ChecksumSHA256: completeOut.ChecksumSHA256, ETag: completeOut.ETag, Expiration: completeOut.Expiration, Key: completeOut.Key, RequestCharged: completeOut.RequestCharged, SSEKMSKeyId: completeOut.SSEKMSKeyId, ServerSideEncryption: completeOut.ServerSideEncryption, VersionID: completeOut.VersionId, }, nil } func (u *multiuploader) shouldContinue(part int32, nextChunkLen int, err error) (bool, error) { if err != nil && err != io.EOF { return false, fmt.Errorf("read multipart upload data failed, %w", err) } if nextChunkLen == 0 { // No need to upload empty part, if file was empty to start // with empty single part would of been created and never // started multipart upload. return false, nil } part++ // This upload exceeded maximum number of supported parts, error now. if part > u.cfg.MaxUploadParts || part > MaxUploadParts { var msg string if part > u.cfg.MaxUploadParts { msg = fmt.Sprintf("exceeded total allowed configured MaxUploadParts (%d). Adjust PartSize to fit in this limit", u.cfg.MaxUploadParts) } else { msg = fmt.Sprintf("exceeded total allowed S3 limit MaxUploadParts (%d). Adjust PartSize to fit in this limit", MaxUploadParts) } return false, errors.New(msg) } return true, err } // readChunk runs in worker goroutines to pull chunks off of the ch channel // and send() them as UploadPart requests. func (u *multiuploader) readChunk(ch chan chunk) { defer u.wg.Done() for { data, ok := <-ch if !ok { break } if u.geterr() == nil { if err := u.send(data); err != nil { u.seterr(err) } } data.cleanup() } } // send performs an UploadPart request and keeps track of the completed // part information. func (u *multiuploader) send(c chunk) error { params := &s3.UploadPartInput{ Bucket: u.in.Bucket, Key: u.in.Key, Body: c.buf, SSECustomerAlgorithm: u.in.SSECustomerAlgorithm, SSECustomerKey: u.in.SSECustomerKey, SSECustomerKeyMD5: u.in.SSECustomerKeyMD5, ExpectedBucketOwner: u.in.ExpectedBucketOwner, RequestPayer: u.in.RequestPayer, ChecksumAlgorithm: u.in.ChecksumAlgorithm, // Invalid to set any of the individual ChecksumXXX members from // PutObject as they are never valid for individual parts of a // multipart upload. PartNumber: aws.Int32(c.num), UploadId: &u.uploadID, } // TODO should do copy then clear? resp, err := u.cfg.S3.UploadPart(u.ctx, params, u.cfg.ClientOptions...) if err != nil { return err } var completed types.CompletedPart awsutil.Copy(&completed, resp) completed.PartNumber = aws.Int32(c.num) u.m.Lock() u.parts = append(u.parts, completed) u.m.Unlock() return nil } func (u *multiuploader) initChecksumAlgorithm() { if u.in.ChecksumAlgorithm != "" { return } switch { case u.in.ChecksumCRC32 != nil: u.in.ChecksumAlgorithm = types.ChecksumAlgorithmCrc32 case u.in.ChecksumCRC32C != nil: u.in.ChecksumAlgorithm = types.ChecksumAlgorithmCrc32c case u.in.ChecksumCRC64NVME != nil: u.in.ChecksumAlgorithm = types.ChecksumAlgorithmCrc64nvme case u.in.ChecksumSHA1 != nil: u.in.ChecksumAlgorithm = types.ChecksumAlgorithmSha1 case u.in.ChecksumSHA256 != nil: u.in.ChecksumAlgorithm = types.ChecksumAlgorithmSha256 default: u.in.ChecksumAlgorithm = types.ChecksumAlgorithmCrc32 } } // geterr is a thread-safe getter for the error object func (u *multiuploader) geterr() error { u.m.Lock() defer u.m.Unlock() return u.err } // seterr is a thread-safe setter for the error object func (u *multiuploader) seterr(e error) { u.m.Lock() defer u.m.Unlock() u.err = e } // fail will abort the multipart unless LeavePartsOnError is set to true. func (u *multiuploader) fail() { if u.cfg.LeavePartsOnError { return } params := &s3.AbortMultipartUploadInput{ Bucket: u.in.Bucket, Key: u.in.Key, UploadId: &u.uploadID, } _, err := u.cfg.S3.AbortMultipartUpload(u.ctx, params, u.cfg.ClientOptions...) if err != nil { // TODO: Add logging //logMessage(u.cfg.S3, aws.LogDebug, fmt.Sprintf("failed to abort multipart upload, %v", err)) _ = err } } // complete successfully completes a multipart upload and returns the response. func (u *multiuploader) complete() *s3.CompleteMultipartUploadOutput { if u.geterr() != nil { u.fail() return nil } // Parts must be sorted in PartNumber order. sort.Sort(u.parts) var params s3.CompleteMultipartUploadInput awsutil.Copy(¶ms, u.in) params.UploadId = &u.uploadID params.MultipartUpload = &types.CompletedMultipartUpload{Parts: u.parts} resp, err := u.cfg.S3.CompleteMultipartUpload(u.ctx, ¶ms, u.cfg.ClientOptions...) if err != nil { u.seterr(err) u.fail() } return resp } type readerAtSeeker interface { io.ReaderAt io.ReadSeeker } // setS3ExpressDefaultChecksum defaults to CRC32 for S3Express buckets, // which is required when uploading to those through transfer manager. type setS3ExpressDefaultChecksum struct{} func (*setS3ExpressDefaultChecksum) ID() string { return "setS3ExpressDefaultChecksum" } func (*setS3ExpressDefaultChecksum) HandleFinalize( ctx context.Context, in smithymiddleware.FinalizeInput, next smithymiddleware.FinalizeHandler, ) ( out smithymiddleware.FinalizeOutput, metadata smithymiddleware.Metadata, err error, ) { const checksumHeader = "x-amz-checksum-algorithm" if internalcontext.GetS3Backend(ctx) != internalcontext.S3BackendS3Express { return next.HandleFinalize(ctx, in) } // If this is CreateMultipartUpload we need to ensure the checksum // algorithm header is present. Otherwise everything is driven off the // context setting and we can let it flow from there. if middleware.GetOperationName(ctx) == "CreateMultipartUpload" { r, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if internalcontext.GetChecksumInputAlgorithm(ctx) == "" { r.Header.Set(checksumHeader, "CRC32") } return next.HandleFinalize(ctx, in) } else if internalcontext.GetChecksumInputAlgorithm(ctx) == "" { ctx = internalcontext.SetChecksumInputAlgorithm(ctx, string(types.ChecksumAlgorithmCrc32)) } return next.HandleFinalize(ctx, in) } func addFeatureUserAgent(stack *smithymiddleware.Stack) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddUserAgentFeature(middleware.UserAgentFeatureS3Transfer) return nil } func getOrAddRequestUserAgent(stack *smithymiddleware.Stack) (*middleware.RequestUserAgent, error) { id := (*middleware.RequestUserAgent)(nil).ID() mw, ok := stack.Build.Get(id) if !ok { mw = middleware.NewRequestUserAgent() if err := stack.Build.Add(mw, smithymiddleware.After); err != nil { return nil, err } } ua, ok := mw.(*middleware.RequestUserAgent) if !ok { return nil, fmt.Errorf("%T for %s middleware did not match expected type", mw, id) } return ua, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/writer_read_from.go ================================================ package manager import ( "bufio" "io" "sync" "github.com/aws/aws-sdk-go-v2/internal/sdkio" ) // WriterReadFrom defines an interface implementing io.Writer and io.ReaderFrom type WriterReadFrom interface { io.Writer io.ReaderFrom } // WriterReadFromProvider provides an implementation of io.ReadFrom for the given io.Writer type WriterReadFromProvider interface { GetReadFrom(writer io.Writer) (w WriterReadFrom, cleanup func()) } type bufferedWriter interface { WriterReadFrom Flush() error Reset(io.Writer) } type bufferedReadFrom struct { bufferedWriter } func (b *bufferedReadFrom) ReadFrom(r io.Reader) (int64, error) { n, err := b.bufferedWriter.ReadFrom(r) if flushErr := b.Flush(); flushErr != nil && err == nil { err = flushErr } return n, err } // PooledBufferedReadFromProvider is a WriterReadFromProvider that uses a sync.Pool // to manage allocation and reuse of *bufio.Writer structures. type PooledBufferedReadFromProvider struct { pool sync.Pool } // NewPooledBufferedWriterReadFromProvider returns a new PooledBufferedReadFromProvider // Size is used to control the size of the underlying *bufio.Writer created for // calls to GetReadFrom. func NewPooledBufferedWriterReadFromProvider(size int) *PooledBufferedReadFromProvider { if size < int(32*sdkio.KibiByte) { size = int(64 * sdkio.KibiByte) } return &PooledBufferedReadFromProvider{ pool: sync.Pool{ New: func() interface{} { return &bufferedReadFrom{bufferedWriter: bufio.NewWriterSize(nil, size)} }, }, } } // GetReadFrom takes an io.Writer and wraps it with a type which satisfies the WriterReadFrom // interface/ Additionally a cleanup function is provided which must be called after usage of the WriterReadFrom // has been completed in order to allow the reuse of the *bufio.Writer func (p *PooledBufferedReadFromProvider) GetReadFrom(writer io.Writer) (r WriterReadFrom, cleanup func()) { buffer := p.pool.Get().(*bufferedReadFrom) buffer.Reset(writer) r = buffer cleanup = func() { buffer.Reset(nil) // Reset to nil writer to release reference p.pool.Put(buffer) } return r, cleanup } type suppressWriterAt struct { suppressed io.Reader } func (s *suppressWriterAt) Read(p []byte) (n int, err error) { return s.suppressed.Read(p) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/auth/auth.go ================================================ package auth import ( "github.com/aws/smithy-go/auth" smithyhttp "github.com/aws/smithy-go/transport/http" ) // HTTPAuthScheme is the SDK's internal implementation of smithyhttp.AuthScheme // for pre-existing implementations where the signer was added to client // config. SDK clients will key off of this type and ensure per-operation // updates to those signers persist on the scheme itself. type HTTPAuthScheme struct { schemeID string signer smithyhttp.Signer } var _ smithyhttp.AuthScheme = (*HTTPAuthScheme)(nil) // NewHTTPAuthScheme returns an auth scheme instance with the given config. func NewHTTPAuthScheme(schemeID string, signer smithyhttp.Signer) *HTTPAuthScheme { return &HTTPAuthScheme{ schemeID: schemeID, signer: signer, } } // SchemeID identifies the auth scheme. func (s *HTTPAuthScheme) SchemeID() string { return s.schemeID } // IdentityResolver gets the identity resolver for the auth scheme. func (s *HTTPAuthScheme) IdentityResolver(o auth.IdentityResolverOptions) auth.IdentityResolver { return o.GetIdentityResolver(s.schemeID) } // Signer gets the signer for the auth scheme. func (s *HTTPAuthScheme) Signer() smithyhttp.Signer { return s.signer } // WithSigner returns a new instance of the auth scheme with the updated signer. func (s *HTTPAuthScheme) WithSigner(signer smithyhttp.Signer) *HTTPAuthScheme { return NewHTTPAuthScheme(s.schemeID, signer) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/auth/scheme.go ================================================ package auth import ( "context" "fmt" smithy "github.com/aws/smithy-go" "github.com/aws/smithy-go/middleware" ) // SigV4 is a constant representing // Authentication Scheme Signature Version 4 const SigV4 = "sigv4" // SigV4A is a constant representing // Authentication Scheme Signature Version 4A const SigV4A = "sigv4a" // SigV4S3Express identifies the S3 S3Express auth scheme. const SigV4S3Express = "sigv4-s3express" // None is a constant representing the // None Authentication Scheme const None = "none" // SupportedSchemes is a data structure // that indicates the list of supported AWS // authentication schemes var SupportedSchemes = map[string]bool{ SigV4: true, SigV4A: true, SigV4S3Express: true, None: true, } // AuthenticationScheme is a representation of // AWS authentication schemes type AuthenticationScheme interface { isAuthenticationScheme() } // AuthenticationSchemeV4 is a AWS SigV4 representation type AuthenticationSchemeV4 struct { Name string SigningName *string SigningRegion *string DisableDoubleEncoding *bool } func (a *AuthenticationSchemeV4) isAuthenticationScheme() {} // AuthenticationSchemeV4A is a AWS SigV4A representation type AuthenticationSchemeV4A struct { Name string SigningName *string SigningRegionSet []string DisableDoubleEncoding *bool } func (a *AuthenticationSchemeV4A) isAuthenticationScheme() {} // AuthenticationSchemeNone is a representation for the none auth scheme type AuthenticationSchemeNone struct{} func (a *AuthenticationSchemeNone) isAuthenticationScheme() {} // NoAuthenticationSchemesFoundError is used in signaling // that no authentication schemes have been specified. type NoAuthenticationSchemesFoundError struct{} func (e *NoAuthenticationSchemesFoundError) Error() string { return fmt.Sprint("No authentication schemes specified.") } // UnSupportedAuthenticationSchemeSpecifiedError is used in // signaling that only unsupported authentication schemes // were specified. type UnSupportedAuthenticationSchemeSpecifiedError struct { UnsupportedSchemes []string } func (e *UnSupportedAuthenticationSchemeSpecifiedError) Error() string { return fmt.Sprint("Unsupported authentication scheme specified.") } // GetAuthenticationSchemes extracts the relevant authentication scheme data // into a custom strongly typed Go data structure. func GetAuthenticationSchemes(p *smithy.Properties) ([]AuthenticationScheme, error) { var result []AuthenticationScheme if !p.Has("authSchemes") { return nil, &NoAuthenticationSchemesFoundError{} } authSchemes, _ := p.Get("authSchemes").([]interface{}) var unsupportedSchemes []string for _, scheme := range authSchemes { authScheme, _ := scheme.(map[string]interface{}) version := authScheme["name"].(string) switch version { case SigV4, SigV4S3Express: v4Scheme := AuthenticationSchemeV4{ Name: version, SigningName: getSigningName(authScheme), SigningRegion: getSigningRegion(authScheme), DisableDoubleEncoding: getDisableDoubleEncoding(authScheme), } result = append(result, AuthenticationScheme(&v4Scheme)) case SigV4A: v4aScheme := AuthenticationSchemeV4A{ Name: SigV4A, SigningName: getSigningName(authScheme), SigningRegionSet: getSigningRegionSet(authScheme), DisableDoubleEncoding: getDisableDoubleEncoding(authScheme), } result = append(result, AuthenticationScheme(&v4aScheme)) case None: noneScheme := AuthenticationSchemeNone{} result = append(result, AuthenticationScheme(&noneScheme)) default: unsupportedSchemes = append(unsupportedSchemes, authScheme["name"].(string)) continue } } if len(result) == 0 { return nil, &UnSupportedAuthenticationSchemeSpecifiedError{ UnsupportedSchemes: unsupportedSchemes, } } return result, nil } type disableDoubleEncoding struct{} // SetDisableDoubleEncoding sets or modifies the disable double encoding option // on the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func SetDisableDoubleEncoding(ctx context.Context, value bool) context.Context { return middleware.WithStackValue(ctx, disableDoubleEncoding{}, value) } // GetDisableDoubleEncoding retrieves the disable double encoding option // from the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetDisableDoubleEncoding(ctx context.Context) (value bool, ok bool) { value, ok = middleware.GetStackValue(ctx, disableDoubleEncoding{}).(bool) return value, ok } func getSigningName(authScheme map[string]interface{}) *string { signingName, ok := authScheme["signingName"].(string) if !ok || signingName == "" { return nil } return &signingName } func getSigningRegionSet(authScheme map[string]interface{}) []string { untypedSigningRegionSet, ok := authScheme["signingRegionSet"].([]interface{}) if !ok { return nil } signingRegionSet := []string{} for _, item := range untypedSigningRegionSet { signingRegionSet = append(signingRegionSet, item.(string)) } return signingRegionSet } func getSigningRegion(authScheme map[string]interface{}) *string { signingRegion, ok := authScheme["signingRegion"].(string) if !ok || signingRegion == "" { return nil } return &signingRegion } func getDisableDoubleEncoding(authScheme map[string]interface{}) *bool { disableDoubleEncoding, ok := authScheme["disableDoubleEncoding"].(bool) if !ok { return nil } return &disableDoubleEncoding } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/bearer_token_adapter.go ================================================ package smithy import ( "context" "fmt" "time" "github.com/aws/smithy-go" "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/auth/bearer" ) // BearerTokenAdapter adapts smithy bearer.Token to smithy auth.Identity. type BearerTokenAdapter struct { Token bearer.Token } var _ auth.Identity = (*BearerTokenAdapter)(nil) // Expiration returns the time of expiration for the token. func (v *BearerTokenAdapter) Expiration() time.Time { return v.Token.Expires } // BearerTokenProviderAdapter adapts smithy bearer.TokenProvider to smithy // auth.IdentityResolver. type BearerTokenProviderAdapter struct { Provider bearer.TokenProvider } var _ (auth.IdentityResolver) = (*BearerTokenProviderAdapter)(nil) // GetIdentity retrieves a bearer token using the underlying provider. func (v *BearerTokenProviderAdapter) GetIdentity(ctx context.Context, _ smithy.Properties) ( auth.Identity, error, ) { token, err := v.Provider.RetrieveBearerToken(ctx) if err != nil { return nil, fmt.Errorf("get token: %w", err) } return &BearerTokenAdapter{Token: token}, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/bearer_token_signer_adapter.go ================================================ package smithy import ( "context" "fmt" "github.com/aws/smithy-go" "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/auth/bearer" smithyhttp "github.com/aws/smithy-go/transport/http" ) // BearerTokenSignerAdapter adapts smithy bearer.Signer to smithy http // auth.Signer. type BearerTokenSignerAdapter struct { Signer bearer.Signer } var _ (smithyhttp.Signer) = (*BearerTokenSignerAdapter)(nil) // SignRequest signs the request with the provided bearer token. func (v *BearerTokenSignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, _ smithy.Properties) error { ca, ok := identity.(*BearerTokenAdapter) if !ok { return fmt.Errorf("unexpected identity type: %T", identity) } signed, err := v.Signer.SignWithBearerToken(ctx, ca.Token, r) if err != nil { return fmt.Errorf("sign request: %w", err) } *r = *signed.(*smithyhttp.Request) return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/credentials_adapter.go ================================================ package smithy import ( "context" "fmt" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/smithy-go" "github.com/aws/smithy-go/auth" ) // CredentialsAdapter adapts aws.Credentials to auth.Identity. type CredentialsAdapter struct { Credentials aws.Credentials } var _ auth.Identity = (*CredentialsAdapter)(nil) // Expiration returns the time of expiration for the credentials. func (v *CredentialsAdapter) Expiration() time.Time { return v.Credentials.Expires } // CredentialsProviderAdapter adapts aws.CredentialsProvider to auth.IdentityResolver. type CredentialsProviderAdapter struct { Provider aws.CredentialsProvider } var _ (auth.IdentityResolver) = (*CredentialsProviderAdapter)(nil) // GetIdentity retrieves AWS credentials using the underlying provider. func (v *CredentialsProviderAdapter) GetIdentity(ctx context.Context, _ smithy.Properties) ( auth.Identity, error, ) { if v.Provider == nil { return &CredentialsAdapter{Credentials: aws.Credentials{}}, nil } creds, err := v.Provider.Retrieve(ctx) if err != nil { return nil, fmt.Errorf("get credentials: %w", err) } return &CredentialsAdapter{Credentials: creds}, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/smithy.go ================================================ // Package smithy adapts concrete AWS auth and signing types to the generic smithy versions. package smithy ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/auth/smithy/v4signer_adapter.go ================================================ package smithy import ( "context" "fmt" v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go" "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/logging" smithyhttp "github.com/aws/smithy-go/transport/http" ) // V4SignerAdapter adapts v4.HTTPSigner to smithy http.Signer. type V4SignerAdapter struct { Signer v4.HTTPSigner Logger logging.Logger LogSigning bool } var _ (smithyhttp.Signer) = (*V4SignerAdapter)(nil) // SignRequest signs the request with the provided identity. func (v *V4SignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithy.Properties) error { ca, ok := identity.(*CredentialsAdapter) if !ok { return fmt.Errorf("unexpected identity type: %T", identity) } name, ok := smithyhttp.GetSigV4SigningName(&props) if !ok { return fmt.Errorf("sigv4 signing name is required") } region, ok := smithyhttp.GetSigV4SigningRegion(&props) if !ok { return fmt.Errorf("sigv4 signing region is required") } hash := v4.GetPayloadHash(ctx) signingTime := sdk.NowTime() skew := internalcontext.GetAttemptSkewContext(ctx) signingTime = signingTime.Add(skew) err := v.Signer.SignHTTP(ctx, ca.Credentials, r.Request, hash, name, region, signingTime, func(o *v4.SignerOptions) { o.DisableURIPathEscaping, _ = smithyhttp.GetDisableDoubleEncoding(&props) o.Logger = v.Logger o.LogSigning = v.LogSigning }) if err != nil { return fmt.Errorf("sign http: %w", err) } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/awsutil/copy.go ================================================ package awsutil import ( "io" "reflect" "time" ) // Copy deeply copies a src structure to dst. Useful for copying request and // response structures. // // Can copy between structs of different type, but will only copy fields which // are assignable, and exist in both structs. Fields which are not assignable, // or do not exist in both structs are ignored. func Copy(dst, src interface{}) { dstval := reflect.ValueOf(dst) if !dstval.IsValid() { panic("Copy dst cannot be nil") } rcopy(dstval, reflect.ValueOf(src), true) } // CopyOf returns a copy of src while also allocating the memory for dst. // src must be a pointer type or this operation will fail. func CopyOf(src interface{}) (dst interface{}) { dsti := reflect.New(reflect.TypeOf(src).Elem()) dst = dsti.Interface() rcopy(dsti, reflect.ValueOf(src), true) return } // rcopy performs a recursive copy of values from the source to destination. // // root is used to skip certain aspects of the copy which are not valid // for the root node of a object. func rcopy(dst, src reflect.Value, root bool) { if !src.IsValid() { return } switch src.Kind() { case reflect.Ptr: if _, ok := src.Interface().(io.Reader); ok { if dst.Kind() == reflect.Ptr && dst.Elem().CanSet() { dst.Elem().Set(src) } else if dst.CanSet() { dst.Set(src) } } else { e := src.Type().Elem() if dst.CanSet() && !src.IsNil() { if _, ok := src.Interface().(*time.Time); !ok { if dst.Kind() == reflect.String { dst.SetString(e.String()) } else { dst.Set(reflect.New(e)) } } else { tempValue := reflect.New(e) tempValue.Elem().Set(src.Elem()) // Sets time.Time's unexported values dst.Set(tempValue) } } if dst.Kind() != reflect.String && src.Elem().IsValid() { // Keep the current root state since the depth hasn't changed rcopy(dst.Elem(), src.Elem(), root) } } case reflect.Struct: t := dst.Type() for i := 0; i < t.NumField(); i++ { name := t.Field(i).Name srcVal := src.FieldByName(name) dstVal := dst.FieldByName(name) if srcVal.IsValid() && dstVal.CanSet() { rcopy(dstVal, srcVal, false) } } case reflect.Slice: if src.IsNil() { break } s := reflect.MakeSlice(src.Type(), src.Len(), src.Cap()) dst.Set(s) for i := 0; i < src.Len(); i++ { rcopy(dst.Index(i), src.Index(i), false) } case reflect.Map: if src.IsNil() { break } s := reflect.MakeMap(src.Type()) dst.Set(s) for _, k := range src.MapKeys() { v := src.MapIndex(k) v2 := reflect.New(v.Type()).Elem() rcopy(v2, v, false) dst.SetMapIndex(k, v2) } default: // Assign the value if possible. If its not assignable, the value would // need to be converted and the impact of that may be unexpected, or is // not compatible with the dst type. if src.Type().AssignableTo(dst.Type()) { dst.Set(src) } } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/awsutil/equal.go ================================================ package awsutil import ( "reflect" ) // DeepEqual returns if the two values are deeply equal like reflect.DeepEqual. // In addition to this, this method will also dereference the input values if // possible so the DeepEqual performed will not fail if one parameter is a // pointer and the other is not. // // DeepEqual will not perform indirection of nested values of the input parameters. func DeepEqual(a, b interface{}) bool { ra := reflect.Indirect(reflect.ValueOf(a)) rb := reflect.Indirect(reflect.ValueOf(b)) if raValid, rbValid := ra.IsValid(), rb.IsValid(); !raValid && !rbValid { // If the elements are both nil, and of the same type the are equal // If they are of different types they are not equal return reflect.TypeOf(a) == reflect.TypeOf(b) } else if raValid != rbValid { // Both values must be valid to be equal return false } // Special casing for strings as typed enumerations are string aliases // but are not deep equal. if ra.Kind() == reflect.String && rb.Kind() == reflect.String { return ra.String() == rb.String() } return reflect.DeepEqual(ra.Interface(), rb.Interface()) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/awsutil/prettify.go ================================================ package awsutil import ( "bytes" "fmt" "io" "reflect" "strings" ) // Prettify returns the string representation of a value. func Prettify(i interface{}) string { var buf bytes.Buffer prettify(reflect.ValueOf(i), 0, &buf) return buf.String() } // prettify will recursively walk value v to build a textual // representation of the value. func prettify(v reflect.Value, indent int, buf *bytes.Buffer) { isPtr := false for v.Kind() == reflect.Ptr { isPtr = true v = v.Elem() } switch v.Kind() { case reflect.Struct: strtype := v.Type().String() if strtype == "time.Time" { fmt.Fprintf(buf, "%s", v.Interface()) break } else if strings.HasPrefix(strtype, "io.") { buf.WriteString("") break } if isPtr { buf.WriteRune('&') } buf.WriteString("{\n") names := []string{} for i := 0; i < v.Type().NumField(); i++ { name := v.Type().Field(i).Name f := v.Field(i) if name[0:1] == strings.ToLower(name[0:1]) { continue // ignore unexported fields } if (f.Kind() == reflect.Ptr || f.Kind() == reflect.Slice || f.Kind() == reflect.Map) && f.IsNil() { continue // ignore unset fields } names = append(names, name) } for i, n := range names { val := v.FieldByName(n) buf.WriteString(strings.Repeat(" ", indent+2)) buf.WriteString(n + ": ") prettify(val, indent+2, buf) if i < len(names)-1 { buf.WriteString(",\n") } } buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") case reflect.Slice: strtype := v.Type().String() if strtype == "[]uint8" { fmt.Fprintf(buf, " len %d", v.Len()) break } nl, id, id2 := "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2) if isPtr { buf.WriteRune('&') } buf.WriteString("[" + nl) for i := 0; i < v.Len(); i++ { buf.WriteString(id2) prettify(v.Index(i), indent+2, buf) if i < v.Len()-1 { buf.WriteString("," + nl) } } buf.WriteString(nl + id + "]") case reflect.Map: if isPtr { buf.WriteRune('&') } buf.WriteString("{\n") for i, k := range v.MapKeys() { buf.WriteString(strings.Repeat(" ", indent+2)) buf.WriteString(k.String() + ": ") prettify(v.MapIndex(k), indent+2, buf) if i < v.Len()-1 { buf.WriteString(",\n") } } buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") default: if !v.IsValid() { fmt.Fprint(buf, "") return } for v.Kind() == reflect.Interface && !v.IsNil() { v = v.Elem() } if v.Kind() == reflect.Ptr || v.Kind() == reflect.Struct || v.Kind() == reflect.Map || v.Kind() == reflect.Slice { prettify(v, indent, buf) return } format := "%v" switch v.Interface().(type) { case string: format = "%q" case io.ReadSeeker, io.Reader: format = "buffer(%p)" } fmt.Fprintf(buf, format, v.Interface()) } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/awsutil/string_value.go ================================================ package awsutil import ( "bytes" "fmt" "reflect" "strings" ) // StringValue returns the string representation of a value. func StringValue(i interface{}) string { var buf bytes.Buffer stringValue(reflect.ValueOf(i), 0, &buf) return buf.String() } func stringValue(v reflect.Value, indent int, buf *bytes.Buffer) { for v.Kind() == reflect.Ptr { v = v.Elem() } switch v.Kind() { case reflect.Struct: buf.WriteString("{\n") for i := 0; i < v.Type().NumField(); i++ { ft := v.Type().Field(i) fv := v.Field(i) if ft.Name[0:1] == strings.ToLower(ft.Name[0:1]) { continue // ignore unexported fields } if (fv.Kind() == reflect.Ptr || fv.Kind() == reflect.Slice) && fv.IsNil() { continue // ignore unset fields } buf.WriteString(strings.Repeat(" ", indent+2)) buf.WriteString(ft.Name + ": ") if tag := ft.Tag.Get("sensitive"); tag == "true" { buf.WriteString("") } else { stringValue(fv, indent+2, buf) } buf.WriteString(",\n") } buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") case reflect.Slice: nl, id, id2 := "", "", "" if v.Len() > 3 { nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2) } buf.WriteString("[" + nl) for i := 0; i < v.Len(); i++ { buf.WriteString(id2) stringValue(v.Index(i), indent+2, buf) if i < v.Len()-1 { buf.WriteString("," + nl) } } buf.WriteString(nl + id + "]") case reflect.Map: buf.WriteString("{\n") for i, k := range v.MapKeys() { buf.WriteString(strings.Repeat(" ", indent+2)) buf.WriteString(k.String() + ": ") stringValue(v.MapIndex(k), indent+2, buf) if i < v.Len()-1 { buf.WriteString(",\n") } } buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") default: format := "%v" switch v.Interface().(type) { case string: format = "%q" } fmt.Fprintf(buf, format, v.Interface()) } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md ================================================ # v1.3.34 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.33 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.3.32 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.31 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.30 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.29 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.3.28 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.27 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.26 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.25 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.24 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.23 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.22 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.21 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.20 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.19 (2024-10-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.18 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.17 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.16 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.15 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.14 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.13 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.12 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.11 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.10 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.9 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.8 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.7 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.6 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.5 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.4 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.3 (2024-03-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.2 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.2.10 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.9 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.8 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.7 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.6 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.5 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.4 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.3 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.2 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.1.43 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.42 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.41 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.40 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.39 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.38 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.37 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.36 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.35 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.34 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.33 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.32 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.31 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.30 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.29 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.28 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.27 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.26 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.25 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.24 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.23 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.22 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.21 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.20 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.19 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.18 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.17 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.16 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.15 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.14 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.13 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.12 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.11 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.10 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.9 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.8 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.7 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.6 (2022-03-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.5 (2022-02-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.4 (2022-01-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.3 (2022-01-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.2 (2021-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.0 (2021-11-06) * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Dependency Update**: Updated to the latest SDK module versions # v1.0.7 (2021-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.6 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.5 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.4 (2021-08-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.3 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.2 (2021-08-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.1 (2021-07-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.0 (2021-06-25) * **Release**: Release new modules * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/config.go ================================================ package configsources import ( "context" "github.com/aws/aws-sdk-go-v2/aws" ) // EnableEndpointDiscoveryProvider is an interface for retrieving external configuration value // for Enable Endpoint Discovery type EnableEndpointDiscoveryProvider interface { GetEnableEndpointDiscovery(ctx context.Context) (value aws.EndpointDiscoveryEnableState, found bool, err error) } // ResolveEnableEndpointDiscovery extracts the first instance of a EnableEndpointDiscoveryProvider from the config slice. // Additionally returns a aws.EndpointDiscoveryEnableState to indicate if the value was found in provided configs, // and error if one is encountered. func ResolveEnableEndpointDiscovery(ctx context.Context, configs []interface{}) (value aws.EndpointDiscoveryEnableState, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(EnableEndpointDiscoveryProvider); ok { value, found, err = p.GetEnableEndpointDiscovery(ctx) if err != nil || found { break } } } return } // UseDualStackEndpointProvider is an interface for retrieving external configuration values for UseDualStackEndpoint type UseDualStackEndpointProvider interface { GetUseDualStackEndpoint(context.Context) (value aws.DualStackEndpointState, found bool, err error) } // ResolveUseDualStackEndpoint extracts the first instance of a UseDualStackEndpoint from the config slice. // Additionally returns a boolean to indicate if the value was found in provided configs, and error if one is encountered. func ResolveUseDualStackEndpoint(ctx context.Context, configs []interface{}) (value aws.DualStackEndpointState, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(UseDualStackEndpointProvider); ok { value, found, err = p.GetUseDualStackEndpoint(ctx) if err != nil || found { break } } } return } // UseFIPSEndpointProvider is an interface for retrieving external configuration values for UseFIPSEndpoint type UseFIPSEndpointProvider interface { GetUseFIPSEndpoint(context.Context) (value aws.FIPSEndpointState, found bool, err error) } // ResolveUseFIPSEndpoint extracts the first instance of a UseFIPSEndpointProvider from the config slice. // Additionally, returns a boolean to indicate if the value was found in provided configs, and error if one is encountered. func ResolveUseFIPSEndpoint(ctx context.Context, configs []interface{}) (value aws.FIPSEndpointState, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(UseFIPSEndpointProvider); ok { value, found, err = p.GetUseFIPSEndpoint(ctx) if err != nil || found { break } } } return } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/endpoints.go ================================================ package configsources import ( "context" ) // ServiceBaseEndpointProvider is needed to search for all providers // that provide a configured service endpoint type ServiceBaseEndpointProvider interface { GetServiceBaseEndpoint(ctx context.Context, sdkID string) (string, bool, error) } // IgnoreConfiguredEndpointsProvider is needed to search for all providers // that provide a flag to disable configured endpoints. // // Currently duplicated from github.com/aws/aws-sdk-go-v2/config because // service packages cannot import github.com/aws/aws-sdk-go-v2/config // due to result import cycle error. type IgnoreConfiguredEndpointsProvider interface { GetIgnoreConfiguredEndpoints(ctx context.Context) (bool, bool, error) } // GetIgnoreConfiguredEndpoints is used in knowing when to disable configured // endpoints feature. // // Currently duplicated from github.com/aws/aws-sdk-go-v2/config because // service packages cannot import github.com/aws/aws-sdk-go-v2/config // due to result import cycle error. func GetIgnoreConfiguredEndpoints(ctx context.Context, configs []interface{}) (value bool, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(IgnoreConfiguredEndpointsProvider); ok { value, found, err = p.GetIgnoreConfiguredEndpoints(ctx) if err != nil || found { break } } } return } // ResolveServiceBaseEndpoint is used to retrieve service endpoints from configured sources // while allowing for configured endpoints to be disabled func ResolveServiceBaseEndpoint(ctx context.Context, sdkID string, configs []interface{}) (value string, found bool, err error) { if val, found, _ := GetIgnoreConfiguredEndpoints(ctx, configs); found && val { return "", false, nil } for _, cs := range configs { if p, ok := cs.(ServiceBaseEndpointProvider); ok { value, found, err = p.GetServiceBaseEndpoint(context.Background(), sdkID) if err != nil || found { break } } } return } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package configsources // goModuleVersion is the tagged release for this module const goModuleVersion = "1.3.34" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/context/context.go ================================================ package context import ( "context" "time" "github.com/aws/smithy-go/middleware" ) type s3BackendKey struct{} type checksumInputAlgorithmKey struct{} type clockSkew struct{} const ( // S3BackendS3Express identifies the S3Express backend S3BackendS3Express = "S3Express" ) // SetS3Backend stores the resolved endpoint backend within the request // context, which is required for a variety of custom S3 behaviors. func SetS3Backend(ctx context.Context, typ string) context.Context { return middleware.WithStackValue(ctx, s3BackendKey{}, typ) } // GetS3Backend retrieves the stored endpoint backend within the context. func GetS3Backend(ctx context.Context) string { v, _ := middleware.GetStackValue(ctx, s3BackendKey{}).(string) return v } // SetChecksumInputAlgorithm sets the request checksum algorithm on the // context. func SetChecksumInputAlgorithm(ctx context.Context, value string) context.Context { return middleware.WithStackValue(ctx, checksumInputAlgorithmKey{}, value) } // GetChecksumInputAlgorithm returns the checksum algorithm from the context. func GetChecksumInputAlgorithm(ctx context.Context) string { v, _ := middleware.GetStackValue(ctx, checksumInputAlgorithmKey{}).(string) return v } // SetAttemptSkewContext sets the clock skew value on the context func SetAttemptSkewContext(ctx context.Context, v time.Duration) context.Context { return middleware.WithStackValue(ctx, clockSkew{}, v) } // GetAttemptSkewContext gets the clock skew value from the context func GetAttemptSkewContext(ctx context.Context) time.Duration { x, _ := middleware.GetStackValue(ctx, clockSkew{}).(time.Duration) return x } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/arn.go ================================================ package awsrulesfn import ( "strings" ) // ARN provides AWS ARN components broken out into a data structure. type ARN struct { Partition string Service string Region string AccountId string ResourceId OptionalStringSlice } const ( arnDelimiters = ":" resourceDelimiters = "/:" arnSections = 6 arnPrefix = "arn:" // zero-indexed sectionPartition = 1 sectionService = 2 sectionRegion = 3 sectionAccountID = 4 sectionResource = 5 ) // ParseARN returns an [ARN] value parsed from the input string provided. If // the ARN cannot be parsed nil will be returned, and error added to // [ErrorCollector]. func ParseARN(input string) *ARN { if !strings.HasPrefix(input, arnPrefix) { return nil } sections := strings.SplitN(input, arnDelimiters, arnSections) if numSections := len(sections); numSections != arnSections { return nil } if sections[sectionPartition] == "" { return nil } if sections[sectionService] == "" { return nil } if sections[sectionResource] == "" { return nil } return &ARN{ Partition: sections[sectionPartition], Service: sections[sectionService], Region: sections[sectionRegion], AccountId: sections[sectionAccountID], ResourceId: splitResource(sections[sectionResource]), } } // splitResource splits the resource components by the ARN resource delimiters. func splitResource(v string) []string { var parts []string var offset int for offset <= len(v) { idx := strings.IndexAny(v[offset:], "/:") if idx < 0 { parts = append(parts, v[offset:]) break } parts = append(parts, v[offset:idx+offset]) offset += idx + 1 } return parts } // OptionalStringSlice provides a helper to safely get the index of a string // slice that may be out of bounds. Returns pointer to string if index is // valid. Otherwise returns nil. type OptionalStringSlice []string // Get returns a string pointer of the string at index i if the index is valid. // Otherwise returns nil. func (s OptionalStringSlice) Get(i int) *string { if i < 0 || i >= len(s) { return nil } v := s[i] return &v } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/doc.go ================================================ // Package awsrulesfn provides AWS focused endpoint rule functions for // evaluating endpoint resolution rules. package awsrulesfn ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/generate.go ================================================ //go:build codegen // +build codegen package awsrulesfn //go:generate go run -tags codegen ./internal/partition/codegen.go -model partitions.json -output partitions.go //go:generate gofmt -w -s . ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/host.go ================================================ package awsrulesfn import ( "net" "strings" smithyhttp "github.com/aws/smithy-go/transport/http" ) // IsVirtualHostableS3Bucket returns if the input is a DNS compatible bucket // name and can be used with Amazon S3 virtual hosted style addressing. Similar // to [rulesfn.IsValidHostLabel] with the added restriction that the length of label // must be [3:63] characters long, all lowercase, and not formatted as an IP // address. func IsVirtualHostableS3Bucket(input string, allowSubDomains bool) bool { // input should not be formatted as an IP address // NOTE: this will technically trip up on IPv6 hosts with zone IDs, but // validation further down will catch that anyway (it's guaranteed to have // unfriendly characters % and : if that's the case) if net.ParseIP(input) != nil { return false } var labels []string if allowSubDomains { labels = strings.Split(input, ".") } else { labels = []string{input} } for _, label := range labels { // validate special length constraints if l := len(label); l < 3 || l > 63 { return false } // Validate no capital letters for _, r := range label { if r >= 'A' && r <= 'Z' { return false } } // Validate valid host label if !smithyhttp.ValidHostLabel(label) { return false } } return true } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partition.go ================================================ package awsrulesfn import "regexp" // Partition provides the metadata describing an AWS partition. type Partition struct { ID string `json:"id"` Regions map[string]RegionOverrides `json:"regions"` RegionRegex string `json:"regionRegex"` DefaultConfig PartitionConfig `json:"outputs"` } // PartitionConfig provides the endpoint metadata for an AWS region or partition. type PartitionConfig struct { Name string `json:"name"` DnsSuffix string `json:"dnsSuffix"` DualStackDnsSuffix string `json:"dualStackDnsSuffix"` SupportsFIPS bool `json:"supportsFIPS"` SupportsDualStack bool `json:"supportsDualStack"` ImplicitGlobalRegion string `json:"implicitGlobalRegion"` } type RegionOverrides struct { Name *string `json:"name"` DnsSuffix *string `json:"dnsSuffix"` DualStackDnsSuffix *string `json:"dualStackDnsSuffix"` SupportsFIPS *bool `json:"supportsFIPS"` SupportsDualStack *bool `json:"supportsDualStack"` } const defaultPartition = "aws" func getPartition(partitions []Partition, region string) *PartitionConfig { for _, partition := range partitions { if v, ok := partition.Regions[region]; ok { p := mergeOverrides(partition.DefaultConfig, v) return &p } } for _, partition := range partitions { regionRegex := regexp.MustCompile(partition.RegionRegex) if regionRegex.MatchString(region) { v := partition.DefaultConfig return &v } } for _, partition := range partitions { if partition.ID == defaultPartition { v := partition.DefaultConfig return &v } } return nil } func mergeOverrides(into PartitionConfig, from RegionOverrides) PartitionConfig { if from.Name != nil { into.Name = *from.Name } if from.DnsSuffix != nil { into.DnsSuffix = *from.DnsSuffix } if from.DualStackDnsSuffix != nil { into.DualStackDnsSuffix = *from.DualStackDnsSuffix } if from.SupportsFIPS != nil { into.SupportsFIPS = *from.SupportsFIPS } if from.SupportsDualStack != nil { into.SupportsDualStack = *from.SupportsDualStack } return into } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.go ================================================ // Code generated by endpoint/awsrulesfn/internal/partition. DO NOT EDIT. package awsrulesfn // GetPartition returns an AWS [Partition] for the region provided. If the // partition cannot be determined nil will be returned. func GetPartition(region string) *PartitionConfig { return getPartition(partitions, region) } var partitions = []Partition{ { ID: "aws", RegionRegex: "^(us|eu|ap|sa|ca|me|af|il)\\-\\w+\\-\\d+$", DefaultConfig: PartitionConfig{ Name: "aws", DnsSuffix: "amazonaws.com", DualStackDnsSuffix: "api.aws", SupportsFIPS: true, SupportsDualStack: true, ImplicitGlobalRegion: "us-east-1", }, Regions: map[string]RegionOverrides{ "af-south-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-east-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-northeast-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-northeast-2": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-northeast-3": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-south-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-south-2": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-southeast-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-southeast-2": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-southeast-3": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ap-southeast-4": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "aws-global": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ca-central-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "ca-west-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "eu-central-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "eu-central-2": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "eu-north-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "eu-south-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "eu-south-2": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "eu-west-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "eu-west-2": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "eu-west-3": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "il-central-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "me-central-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "me-south-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "sa-east-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-east-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-east-2": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-west-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-west-2": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, }, }, { ID: "aws-cn", RegionRegex: "^cn\\-\\w+\\-\\d+$", DefaultConfig: PartitionConfig{ Name: "aws-cn", DnsSuffix: "amazonaws.com.cn", DualStackDnsSuffix: "api.amazonwebservices.com.cn", SupportsFIPS: true, SupportsDualStack: true, ImplicitGlobalRegion: "cn-northwest-1", }, Regions: map[string]RegionOverrides{ "aws-cn-global": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "cn-north-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "cn-northwest-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, }, }, { ID: "aws-us-gov", RegionRegex: "^us\\-gov\\-\\w+\\-\\d+$", DefaultConfig: PartitionConfig{ Name: "aws-us-gov", DnsSuffix: "amazonaws.com", DualStackDnsSuffix: "api.aws", SupportsFIPS: true, SupportsDualStack: true, ImplicitGlobalRegion: "us-gov-west-1", }, Regions: map[string]RegionOverrides{ "aws-us-gov-global": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-gov-east-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-gov-west-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, }, }, { ID: "aws-iso", RegionRegex: "^us\\-iso\\-\\w+\\-\\d+$", DefaultConfig: PartitionConfig{ Name: "aws-iso", DnsSuffix: "c2s.ic.gov", DualStackDnsSuffix: "c2s.ic.gov", SupportsFIPS: true, SupportsDualStack: false, ImplicitGlobalRegion: "us-iso-east-1", }, Regions: map[string]RegionOverrides{ "aws-iso-global": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-iso-east-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-iso-west-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, }, }, { ID: "aws-iso-b", RegionRegex: "^us\\-isob\\-\\w+\\-\\d+$", DefaultConfig: PartitionConfig{ Name: "aws-iso-b", DnsSuffix: "sc2s.sgov.gov", DualStackDnsSuffix: "sc2s.sgov.gov", SupportsFIPS: true, SupportsDualStack: false, ImplicitGlobalRegion: "us-isob-east-1", }, Regions: map[string]RegionOverrides{ "aws-iso-b-global": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, "us-isob-east-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, }, }, { ID: "aws-iso-e", RegionRegex: "^eu\\-isoe\\-\\w+\\-\\d+$", DefaultConfig: PartitionConfig{ Name: "aws-iso-e", DnsSuffix: "cloud.adc-e.uk", DualStackDnsSuffix: "cloud.adc-e.uk", SupportsFIPS: true, SupportsDualStack: false, ImplicitGlobalRegion: "eu-isoe-west-1", }, Regions: map[string]RegionOverrides{ "eu-isoe-west-1": { Name: nil, DnsSuffix: nil, DualStackDnsSuffix: nil, SupportsFIPS: nil, SupportsDualStack: nil, }, }, }, { ID: "aws-iso-f", RegionRegex: "^us\\-isof\\-\\w+\\-\\d+$", DefaultConfig: PartitionConfig{ Name: "aws-iso-f", DnsSuffix: "csp.hci.ic.gov", DualStackDnsSuffix: "csp.hci.ic.gov", SupportsFIPS: true, SupportsDualStack: false, ImplicitGlobalRegion: "us-isof-south-1", }, Regions: map[string]RegionOverrides{}, }, } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json ================================================ { "partitions" : [ { "id" : "aws", "outputs" : { "dnsSuffix" : "amazonaws.com", "dualStackDnsSuffix" : "api.aws", "implicitGlobalRegion" : "us-east-1", "name" : "aws", "supportsDualStack" : true, "supportsFIPS" : true }, "regionRegex" : "^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$", "regions" : { "af-south-1" : { "description" : "Africa (Cape Town)" }, "ap-east-1" : { "description" : "Asia Pacific (Hong Kong)" }, "ap-northeast-1" : { "description" : "Asia Pacific (Tokyo)" }, "ap-northeast-2" : { "description" : "Asia Pacific (Seoul)" }, "ap-northeast-3" : { "description" : "Asia Pacific (Osaka)" }, "ap-south-1" : { "description" : "Asia Pacific (Mumbai)" }, "ap-south-2" : { "description" : "Asia Pacific (Hyderabad)" }, "ap-southeast-1" : { "description" : "Asia Pacific (Singapore)" }, "ap-southeast-2" : { "description" : "Asia Pacific (Sydney)" }, "ap-southeast-3" : { "description" : "Asia Pacific (Jakarta)" }, "ap-southeast-4" : { "description" : "Asia Pacific (Melbourne)" }, "ap-southeast-5" : { "description" : "Asia Pacific (Malaysia)" }, "ap-southeast-7" : { "description" : "Asia Pacific (Thailand)" }, "aws-global" : { "description" : "AWS Standard global region" }, "ca-central-1" : { "description" : "Canada (Central)" }, "ca-west-1" : { "description" : "Canada West (Calgary)" }, "eu-central-1" : { "description" : "Europe (Frankfurt)" }, "eu-central-2" : { "description" : "Europe (Zurich)" }, "eu-north-1" : { "description" : "Europe (Stockholm)" }, "eu-south-1" : { "description" : "Europe (Milan)" }, "eu-south-2" : { "description" : "Europe (Spain)" }, "eu-west-1" : { "description" : "Europe (Ireland)" }, "eu-west-2" : { "description" : "Europe (London)" }, "eu-west-3" : { "description" : "Europe (Paris)" }, "il-central-1" : { "description" : "Israel (Tel Aviv)" }, "me-central-1" : { "description" : "Middle East (UAE)" }, "me-south-1" : { "description" : "Middle East (Bahrain)" }, "mx-central-1" : { "description" : "Mexico (Central)" }, "sa-east-1" : { "description" : "South America (Sao Paulo)" }, "us-east-1" : { "description" : "US East (N. Virginia)" }, "us-east-2" : { "description" : "US East (Ohio)" }, "us-west-1" : { "description" : "US West (N. California)" }, "us-west-2" : { "description" : "US West (Oregon)" } } }, { "id" : "aws-cn", "outputs" : { "dnsSuffix" : "amazonaws.com.cn", "dualStackDnsSuffix" : "api.amazonwebservices.com.cn", "implicitGlobalRegion" : "cn-northwest-1", "name" : "aws-cn", "supportsDualStack" : true, "supportsFIPS" : true }, "regionRegex" : "^cn\\-\\w+\\-\\d+$", "regions" : { "aws-cn-global" : { "description" : "AWS China global region" }, "cn-north-1" : { "description" : "China (Beijing)" }, "cn-northwest-1" : { "description" : "China (Ningxia)" } } }, { "id" : "aws-us-gov", "outputs" : { "dnsSuffix" : "amazonaws.com", "dualStackDnsSuffix" : "api.aws", "implicitGlobalRegion" : "us-gov-west-1", "name" : "aws-us-gov", "supportsDualStack" : true, "supportsFIPS" : true }, "regionRegex" : "^us\\-gov\\-\\w+\\-\\d+$", "regions" : { "aws-us-gov-global" : { "description" : "AWS GovCloud (US) global region" }, "us-gov-east-1" : { "description" : "AWS GovCloud (US-East)" }, "us-gov-west-1" : { "description" : "AWS GovCloud (US-West)" } } }, { "id" : "aws-iso", "outputs" : { "dnsSuffix" : "c2s.ic.gov", "dualStackDnsSuffix" : "c2s.ic.gov", "implicitGlobalRegion" : "us-iso-east-1", "name" : "aws-iso", "supportsDualStack" : false, "supportsFIPS" : true }, "regionRegex" : "^us\\-iso\\-\\w+\\-\\d+$", "regions" : { "aws-iso-global" : { "description" : "AWS ISO (US) global region" }, "us-iso-east-1" : { "description" : "US ISO East" }, "us-iso-west-1" : { "description" : "US ISO WEST" } } }, { "id" : "aws-iso-b", "outputs" : { "dnsSuffix" : "sc2s.sgov.gov", "dualStackDnsSuffix" : "sc2s.sgov.gov", "implicitGlobalRegion" : "us-isob-east-1", "name" : "aws-iso-b", "supportsDualStack" : false, "supportsFIPS" : true }, "regionRegex" : "^us\\-isob\\-\\w+\\-\\d+$", "regions" : { "aws-iso-b-global" : { "description" : "AWS ISOB (US) global region" }, "us-isob-east-1" : { "description" : "US ISOB East (Ohio)" } } }, { "id" : "aws-iso-e", "outputs" : { "dnsSuffix" : "cloud.adc-e.uk", "dualStackDnsSuffix" : "cloud.adc-e.uk", "implicitGlobalRegion" : "eu-isoe-west-1", "name" : "aws-iso-e", "supportsDualStack" : false, "supportsFIPS" : true }, "regionRegex" : "^eu\\-isoe\\-\\w+\\-\\d+$", "regions" : { "eu-isoe-west-1" : { "description" : "EU ISOE West" } } }, { "id" : "aws-iso-f", "outputs" : { "dnsSuffix" : "csp.hci.ic.gov", "dualStackDnsSuffix" : "csp.hci.ic.gov", "implicitGlobalRegion" : "us-isof-south-1", "name" : "aws-iso-f", "supportsDualStack" : false, "supportsFIPS" : true }, "regionRegex" : "^us\\-isof\\-\\w+\\-\\d+$", "regions" : { "aws-iso-f-global" : { "description" : "AWS ISOF global region" }, "us-isof-east-1" : { "description" : "US ISOF EAST" }, "us-isof-south-1" : { "description" : "US ISOF SOUTH" } } } ], "version" : "1.1" } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/endpoints.go ================================================ package endpoints import ( "fmt" "regexp" "strings" "github.com/aws/aws-sdk-go-v2/aws" ) const ( defaultProtocol = "https" defaultSigner = "v4" ) var ( protocolPriority = []string{"https", "http"} signerPriority = []string{"v4"} ) // Options provide configuration needed to direct how endpoints are resolved. type Options struct { // Disable usage of HTTPS (TLS / SSL) DisableHTTPS bool } // Partitions is a slice of partition type Partitions []Partition // ResolveEndpoint resolves a service endpoint for the given region and options. func (ps Partitions) ResolveEndpoint(region string, opts Options) (aws.Endpoint, error) { if len(ps) == 0 { return aws.Endpoint{}, fmt.Errorf("no partitions found") } for i := 0; i < len(ps); i++ { if !ps[i].canResolveEndpoint(region) { continue } return ps[i].ResolveEndpoint(region, opts) } // fallback to first partition format to use when resolving the endpoint. return ps[0].ResolveEndpoint(region, opts) } // Partition is an AWS partition description for a service and its' region endpoints. type Partition struct { ID string RegionRegex *regexp.Regexp PartitionEndpoint string IsRegionalized bool Defaults Endpoint Endpoints Endpoints } func (p Partition) canResolveEndpoint(region string) bool { _, ok := p.Endpoints[region] return ok || p.RegionRegex.MatchString(region) } // ResolveEndpoint resolves and service endpoint for the given region and options. func (p Partition) ResolveEndpoint(region string, options Options) (resolved aws.Endpoint, err error) { if len(region) == 0 && len(p.PartitionEndpoint) != 0 { region = p.PartitionEndpoint } e, _ := p.endpointForRegion(region) return e.resolve(p.ID, region, p.Defaults, options), nil } func (p Partition) endpointForRegion(region string) (Endpoint, bool) { if e, ok := p.Endpoints[region]; ok { return e, true } if !p.IsRegionalized { return p.Endpoints[p.PartitionEndpoint], region == p.PartitionEndpoint } // Unable to find any matching endpoint, return // blank that will be used for generic endpoint creation. return Endpoint{}, false } // Endpoints is a map of service config regions to endpoints type Endpoints map[string]Endpoint // CredentialScope is the credential scope of a region and service type CredentialScope struct { Region string Service string } // Endpoint is a service endpoint description type Endpoint struct { // True if the endpoint cannot be resolved for this partition/region/service Unresolveable aws.Ternary Hostname string Protocols []string CredentialScope CredentialScope SignatureVersions []string `json:"signatureVersions"` } func (e Endpoint) resolve(partition, region string, def Endpoint, options Options) aws.Endpoint { var merged Endpoint merged.mergeIn(def) merged.mergeIn(e) e = merged var u string if e.Unresolveable != aws.TrueTernary { // Only attempt to resolve the endpoint if it can be resolved. hostname := strings.Replace(e.Hostname, "{region}", region, 1) scheme := getEndpointScheme(e.Protocols, options.DisableHTTPS) u = scheme + "://" + hostname } signingRegion := e.CredentialScope.Region if len(signingRegion) == 0 { signingRegion = region } signingName := e.CredentialScope.Service return aws.Endpoint{ URL: u, PartitionID: partition, SigningRegion: signingRegion, SigningName: signingName, SigningMethod: getByPriority(e.SignatureVersions, signerPriority, defaultSigner), } } func (e *Endpoint) mergeIn(other Endpoint) { if other.Unresolveable != aws.UnknownTernary { e.Unresolveable = other.Unresolveable } if len(other.Hostname) > 0 { e.Hostname = other.Hostname } if len(other.Protocols) > 0 { e.Protocols = other.Protocols } if len(other.CredentialScope.Region) > 0 { e.CredentialScope.Region = other.CredentialScope.Region } if len(other.CredentialScope.Service) > 0 { e.CredentialScope.Service = other.CredentialScope.Service } if len(other.SignatureVersions) > 0 { e.SignatureVersions = other.SignatureVersions } } func getEndpointScheme(protocols []string, disableHTTPS bool) string { if disableHTTPS { return "http" } return getByPriority(protocols, protocolPriority, defaultProtocol) } func getByPriority(s []string, p []string, def string) string { if len(s) == 0 { return def } for i := 0; i < len(p); i++ { for j := 0; j < len(s); j++ { if s[j] == p[i] { return s[j] } } } return s[0] } // MapFIPSRegion extracts the intrinsic AWS region from one that may have an // embedded FIPS microformat. func MapFIPSRegion(region string) string { const fipsInfix = "-fips-" const fipsPrefix = "fips-" const fipsSuffix = "-fips" if strings.Contains(region, fipsInfix) || strings.Contains(region, fipsPrefix) || strings.Contains(region, fipsSuffix) { region = strings.ReplaceAll(region, fipsInfix, "-") region = strings.ReplaceAll(region, fipsPrefix, "") region = strings.ReplaceAll(region, fipsSuffix, "") } return region } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md ================================================ # v2.6.34 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.33 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v2.6.32 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.31 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.30 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.29 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v2.6.28 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.27 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.26 (2024-12-19) * **Bug Fix**: Fix improper use of printf-style functions. * **Dependency Update**: Updated to the latest SDK module versions # v2.6.25 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.24 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v2.6.23 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.22 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.21 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.20 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.19 (2024-10-04) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.18 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.17 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.16 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v2.6.15 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.14 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.13 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.12 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.11 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.10 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.9 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.8 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.7 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.6 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.5 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.4 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.3 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v2.6.2 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.1 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v2.6.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v2.5.10 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.9 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.8 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.7 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.6 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.5 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.4 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.3 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.2 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions # v2.5.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v2.4.37 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.36 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.35 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.34 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.33 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.32 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.31 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.30 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.29 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.28 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.27 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.26 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.25 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.24 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.23 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.22 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.21 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.20 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.19 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.18 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.17 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.16 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.15 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.14 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.13 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.12 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.11 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.10 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.9 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.8 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.7 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.6 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.5 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.4 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v2.4.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v2.3.0 (2022-02-24) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v2.2.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v2.1.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v2.0.2 (2021-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v2.0.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v2.0.0 (2021-11-06) * **Release**: Endpoint Variant Model Support * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/endpoints.go ================================================ package endpoints import ( "fmt" "github.com/aws/smithy-go/logging" "regexp" "strings" "github.com/aws/aws-sdk-go-v2/aws" ) // DefaultKey is a compound map key of a variant and other values. type DefaultKey struct { Variant EndpointVariant ServiceVariant ServiceVariant } // EndpointKey is a compound map key of a region and associated variant value. type EndpointKey struct { Region string Variant EndpointVariant ServiceVariant ServiceVariant } // EndpointVariant is a bit field to describe the endpoints attributes. type EndpointVariant uint64 const ( // FIPSVariant indicates that the endpoint is FIPS capable. FIPSVariant EndpointVariant = 1 << (64 - 1 - iota) // DualStackVariant indicates that the endpoint is DualStack capable. DualStackVariant ) // ServiceVariant is a bit field to describe the service endpoint attributes. type ServiceVariant uint64 const ( defaultProtocol = "https" defaultSigner = "v4" ) var ( protocolPriority = []string{"https", "http"} signerPriority = []string{"v4", "s3v4"} ) // Options provide configuration needed to direct how endpoints are resolved. type Options struct { // Logger is a logging implementation that log events should be sent to. Logger logging.Logger // LogDeprecated indicates that deprecated endpoints should be logged to the provided logger. LogDeprecated bool // ResolvedRegion is the resolved region string. If provided (non-zero length) it takes priority // over the region name passed to the ResolveEndpoint call. ResolvedRegion string // Disable usage of HTTPS (TLS / SSL) DisableHTTPS bool // Instruct the resolver to use a service endpoint that supports dual-stack. // If a service does not have a dual-stack endpoint an error will be returned by the resolver. UseDualStackEndpoint aws.DualStackEndpointState // Instruct the resolver to use a service endpoint that supports FIPS. // If a service does not have a FIPS endpoint an error will be returned by the resolver. UseFIPSEndpoint aws.FIPSEndpointState // ServiceVariant is a bitfield of service specified endpoint variant data. ServiceVariant ServiceVariant } // GetEndpointVariant returns the EndpointVariant for the variant associated options. func (o Options) GetEndpointVariant() (v EndpointVariant) { if o.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled { v |= DualStackVariant } if o.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled { v |= FIPSVariant } return v } // Partitions is a slice of partition type Partitions []Partition // ResolveEndpoint resolves a service endpoint for the given region and options. func (ps Partitions) ResolveEndpoint(region string, opts Options) (aws.Endpoint, error) { if len(ps) == 0 { return aws.Endpoint{}, fmt.Errorf("no partitions found") } if opts.Logger == nil { opts.Logger = logging.Nop{} } if len(opts.ResolvedRegion) > 0 { region = opts.ResolvedRegion } for i := 0; i < len(ps); i++ { if !ps[i].canResolveEndpoint(region, opts) { continue } return ps[i].ResolveEndpoint(region, opts) } // fallback to first partition format to use when resolving the endpoint. return ps[0].ResolveEndpoint(region, opts) } // Partition is an AWS partition description for a service and its' region endpoints. type Partition struct { ID string RegionRegex *regexp.Regexp PartitionEndpoint string IsRegionalized bool Defaults map[DefaultKey]Endpoint Endpoints Endpoints } func (p Partition) canResolveEndpoint(region string, opts Options) bool { _, ok := p.Endpoints[EndpointKey{ Region: region, Variant: opts.GetEndpointVariant(), }] return ok || p.RegionRegex.MatchString(region) } // ResolveEndpoint resolves and service endpoint for the given region and options. func (p Partition) ResolveEndpoint(region string, options Options) (resolved aws.Endpoint, err error) { if len(region) == 0 && len(p.PartitionEndpoint) != 0 { region = p.PartitionEndpoint } endpoints := p.Endpoints variant := options.GetEndpointVariant() serviceVariant := options.ServiceVariant defaults := p.Defaults[DefaultKey{ Variant: variant, ServiceVariant: serviceVariant, }] return p.endpointForRegion(region, variant, serviceVariant, endpoints).resolve(p.ID, region, defaults, options) } func (p Partition) endpointForRegion(region string, variant EndpointVariant, serviceVariant ServiceVariant, endpoints Endpoints) Endpoint { key := EndpointKey{ Region: region, Variant: variant, } if e, ok := endpoints[key]; ok { return e } if !p.IsRegionalized { return endpoints[EndpointKey{ Region: p.PartitionEndpoint, Variant: variant, ServiceVariant: serviceVariant, }] } // Unable to find any matching endpoint, return // blank that will be used for generic endpoint creation. return Endpoint{} } // Endpoints is a map of service config regions to endpoints type Endpoints map[EndpointKey]Endpoint // CredentialScope is the credential scope of a region and service type CredentialScope struct { Region string Service string } // Endpoint is a service endpoint description type Endpoint struct { // True if the endpoint cannot be resolved for this partition/region/service Unresolveable aws.Ternary Hostname string Protocols []string CredentialScope CredentialScope SignatureVersions []string // Indicates that this endpoint is deprecated. Deprecated aws.Ternary } // IsZero returns whether the endpoint structure is an empty (zero) value. func (e Endpoint) IsZero() bool { switch { case e.Unresolveable != aws.UnknownTernary: return false case len(e.Hostname) != 0: return false case len(e.Protocols) != 0: return false case e.CredentialScope != (CredentialScope{}): return false case len(e.SignatureVersions) != 0: return false } return true } func (e Endpoint) resolve(partition, region string, def Endpoint, options Options) (aws.Endpoint, error) { var merged Endpoint merged.mergeIn(def) merged.mergeIn(e) e = merged if e.IsZero() { return aws.Endpoint{}, fmt.Errorf("unable to resolve endpoint for region: %v", region) } var u string if e.Unresolveable != aws.TrueTernary { // Only attempt to resolve the endpoint if it can be resolved. hostname := strings.Replace(e.Hostname, "{region}", region, 1) scheme := getEndpointScheme(e.Protocols, options.DisableHTTPS) u = scheme + "://" + hostname } signingRegion := e.CredentialScope.Region if len(signingRegion) == 0 { signingRegion = region } signingName := e.CredentialScope.Service if e.Deprecated == aws.TrueTernary && options.LogDeprecated { options.Logger.Logf(logging.Warn, "endpoint identifier %q, url %q marked as deprecated", region, u) } return aws.Endpoint{ URL: u, PartitionID: partition, SigningRegion: signingRegion, SigningName: signingName, SigningMethod: getByPriority(e.SignatureVersions, signerPriority, defaultSigner), }, nil } func (e *Endpoint) mergeIn(other Endpoint) { if other.Unresolveable != aws.UnknownTernary { e.Unresolveable = other.Unresolveable } if len(other.Hostname) > 0 { e.Hostname = other.Hostname } if len(other.Protocols) > 0 { e.Protocols = other.Protocols } if len(other.CredentialScope.Region) > 0 { e.CredentialScope.Region = other.CredentialScope.Region } if len(other.CredentialScope.Service) > 0 { e.CredentialScope.Service = other.CredentialScope.Service } if len(other.SignatureVersions) > 0 { e.SignatureVersions = other.SignatureVersions } if other.Deprecated != aws.UnknownTernary { e.Deprecated = other.Deprecated } } func getEndpointScheme(protocols []string, disableHTTPS bool) string { if disableHTTPS { return "http" } return getByPriority(protocols, protocolPriority, defaultProtocol) } func getByPriority(s []string, p []string, def string) string { if len(s) == 0 { return def } for i := 0; i < len(p); i++ { for j := 0; j < len(s); j++ { if s[j] == p[i] { return s[j] } } } return s[0] } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package endpoints // goModuleVersion is the tagged release for this module const goModuleVersion = "2.6.34" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md ================================================ # v1.8.3 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 # v1.8.2 (2025-01-24) * **Bug Fix**: Refactor filepath.Walk to filepath.WalkDir # v1.8.1 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. # v1.8.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. # v1.7.3 (2024-01-22) * **Bug Fix**: Remove invalid escaping of shared config values. All values in the shared config file will now be interpreted literally, save for fully-quoted strings which are unwrapped for legacy reasons. # v1.7.2 (2023-12-08) * **Bug Fix**: Correct loading of [services *] sections into shared config. # v1.7.1 (2023-11-16) * **Bug Fix**: Fix recognition of trailing comments in shared config properties. # or ; separators that aren't preceded by whitespace at the end of a property value should be considered part of it. # v1.7.0 (2023-11-13) * **Feature**: Replace the legacy config parser with a modern, less-strict implementation. Parsing failures within a section will now simply ignore the invalid line rather than silently drop the entire section. # v1.6.0 (2023-11-09.2) * **Feature**: BREAKFIX: In order to support subproperty parsing, invalid property definitions must not be ignored # v1.5.2 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.1 (2023-11-07) * **Bug Fix**: Fix subproperty performance regression # v1.5.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.3.45 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.44 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.43 (2023-09-22) * **Bug Fix**: Fixed a bug where merging `max_attempts` or `duration_seconds` fields across shared config files with invalid values would silently default them to 0. * **Bug Fix**: Move type assertion of config values out of the parsing stage, which resolves an issue where the contents of a profile would silently be dropped with certain numeric formats. # v1.3.42 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.41 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.40 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.39 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.38 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.37 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.36 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.35 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.34 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.33 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.32 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.31 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.30 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.29 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.28 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.27 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.26 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.25 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.24 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.23 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.22 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.21 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.20 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.19 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.18 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.17 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.16 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.15 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.14 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.13 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.12 (2022-05-17) * **Bug Fix**: Removes the fuzz testing files from the module, as they are invalid and not used. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.11 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.10 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.9 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.8 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.7 (2022-03-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.6 (2022-02-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.5 (2022-01-28) * **Bug Fix**: Fixes the SDK's handling of `duration_sections` in the shared credentials file or specified in multiple shared config and shared credentials files under the same profile. [#1568](https://github.com/aws/aws-sdk-go-v2/pull/1568). Thanks to [Amir Szekely](https://github.com/kichik) for help reproduce this bug. # v1.3.4 (2022-01-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.3 (2022-01-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.2 (2021-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-11-06) * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Dependency Update**: Updated to the latest SDK module versions # v1.2.5 (2021-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.4 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.3 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.2 (2021-08-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.1 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2021-08-04) * **Feature**: adds error handling for defered close calls * **Dependency Update**: Updated to the latest SDK module versions # v1.1.1 (2021-07-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.0 (2021-07-01) * **Feature**: Support for `:`, `=`, `[`, `]` being present in expression values. # v1.0.1 (2021-06-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.0 (2021-05-20) * **Release**: The `github.com/aws/aws-sdk-go-v2/internal/ini` package is now a Go Module. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/errors.go ================================================ package ini import "fmt" // UnableToReadFile is an error indicating that a ini file could not be read type UnableToReadFile struct { Err error } // Error returns an error message and the underlying error message if present func (e *UnableToReadFile) Error() string { base := "unable to read file" if e.Err == nil { return base } return fmt.Sprintf("%s: %v", base, e.Err) } // Unwrap returns the underlying error func (e *UnableToReadFile) Unwrap() error { return e.Err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package ini // goModuleVersion is the tagged release for this module const goModuleVersion = "1.8.3" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/ini.go ================================================ // Package ini implements parsing of the AWS shared config file. // // Example: // sections, err := ini.OpenFile("/path/to/file") // if err != nil { // panic(err) // } // // profile := "foo" // section, ok := sections.GetSection(profile) // if !ok { // fmt.Printf("section %q could not be found", profile) // } package ini import ( "fmt" "io" "os" "strings" ) // OpenFile parses shared config from the given file path. func OpenFile(path string) (sections Sections, err error) { f, oerr := os.Open(path) if oerr != nil { return Sections{}, &UnableToReadFile{Err: oerr} } defer func() { closeErr := f.Close() if err == nil { err = closeErr } else if closeErr != nil { err = fmt.Errorf("close error: %v, original error: %w", closeErr, err) } }() return Parse(f, path) } // Parse parses shared config from the given reader. func Parse(r io.Reader, path string) (Sections, error) { contents, err := io.ReadAll(r) if err != nil { return Sections{}, fmt.Errorf("read all: %v", err) } lines := strings.Split(string(contents), "\n") tokens, err := tokenize(lines) if err != nil { return Sections{}, fmt.Errorf("tokenize: %v", err) } return parse(tokens, path), nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/parse.go ================================================ package ini import ( "fmt" "strings" ) func parse(tokens []lineToken, path string) Sections { parser := &parser{ path: path, sections: NewSections(), } parser.parse(tokens) return parser.sections } type parser struct { csection, ckey string // current state path string // source file path sections Sections // parse result } func (p *parser) parse(tokens []lineToken) { for _, otok := range tokens { switch tok := otok.(type) { case *lineTokenProfile: p.handleProfile(tok) case *lineTokenProperty: p.handleProperty(tok) case *lineTokenSubProperty: p.handleSubProperty(tok) case *lineTokenContinuation: p.handleContinuation(tok) } } } func (p *parser) handleProfile(tok *lineTokenProfile) { name := tok.Name if tok.Type != "" { name = fmt.Sprintf("%s %s", tok.Type, tok.Name) } p.ckey = "" p.csection = name if _, ok := p.sections.container[name]; !ok { p.sections.container[name] = NewSection(name) } } func (p *parser) handleProperty(tok *lineTokenProperty) { if p.csection == "" { return // LEGACY: don't error on "global" properties } p.ckey = tok.Key if _, ok := p.sections.container[p.csection].values[tok.Key]; ok { section := p.sections.container[p.csection] section.Logs = append(p.sections.container[p.csection].Logs, fmt.Sprintf( "For profile: %v, overriding %v value, with a %v value found in a duplicate profile defined later in the same file %v. \n", p.csection, tok.Key, tok.Key, p.path, ), ) p.sections.container[p.csection] = section } p.sections.container[p.csection].values[tok.Key] = Value{ str: tok.Value, } p.sections.container[p.csection].SourceFile[tok.Key] = p.path } func (p *parser) handleSubProperty(tok *lineTokenSubProperty) { if p.csection == "" { return // LEGACY: don't error on "global" properties } if p.ckey == "" || p.sections.container[p.csection].values[p.ckey].str != "" { // This is an "orphaned" subproperty, either because it's at // the beginning of a section or because the last property's // value isn't empty. Either way we're lenient here and // "promote" this to a normal property. p.handleProperty(&lineTokenProperty{ Key: tok.Key, Value: strings.TrimSpace(trimPropertyComment(tok.Value)), }) return } if p.sections.container[p.csection].values[p.ckey].mp == nil { p.sections.container[p.csection].values[p.ckey] = Value{ mp: map[string]string{}, } } p.sections.container[p.csection].values[p.ckey].mp[tok.Key] = tok.Value } func (p *parser) handleContinuation(tok *lineTokenContinuation) { if p.ckey == "" { return } value, _ := p.sections.container[p.csection].values[p.ckey] if value.str != "" && value.mp == nil { value.str = fmt.Sprintf("%s\n%s", value.str, tok.Value) } p.sections.container[p.csection].values[p.ckey] = value } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/sections.go ================================================ package ini import ( "sort" ) // Sections is a map of Section structures that represent // a configuration. type Sections struct { container map[string]Section } // NewSections returns empty ini Sections func NewSections() Sections { return Sections{ container: make(map[string]Section, 0), } } // GetSection will return section p. If section p does not exist, // false will be returned in the second parameter. func (t Sections) GetSection(p string) (Section, bool) { v, ok := t.container[p] return v, ok } // HasSection denotes if Sections consist of a section with // provided name. func (t Sections) HasSection(p string) bool { _, ok := t.container[p] return ok } // SetSection sets a section value for provided section name. func (t Sections) SetSection(p string, v Section) Sections { t.container[p] = v return t } // DeleteSection deletes a section entry/value for provided section name./ func (t Sections) DeleteSection(p string) { delete(t.container, p) } // values represents a map of union values. type values map[string]Value // List will return a list of all sections that were successfully // parsed. func (t Sections) List() []string { keys := make([]string, len(t.container)) i := 0 for k := range t.container { keys[i] = k i++ } sort.Strings(keys) return keys } // Section contains a name and values. This represent // a sectioned entry in a configuration file. type Section struct { // Name is the Section profile name Name string // values are the values within parsed profile values values // Errors is the list of errors Errors []error // Logs is the list of logs Logs []string // SourceFile is the INI Source file from where this section // was retrieved. They key is the property, value is the // source file the property was retrieved from. SourceFile map[string]string } // NewSection returns an initialize section for the name func NewSection(name string) Section { return Section{ Name: name, values: values{}, SourceFile: map[string]string{}, } } // List will return a list of all // services in values func (t Section) List() []string { keys := make([]string, len(t.values)) i := 0 for k := range t.values { keys[i] = k i++ } sort.Strings(keys) return keys } // UpdateSourceFile updates source file for a property to provided filepath. func (t Section) UpdateSourceFile(property string, filepath string) { t.SourceFile[property] = filepath } // UpdateValue updates value for a provided key with provided value func (t Section) UpdateValue(k string, v Value) error { t.values[k] = v return nil } // Has will return whether or not an entry exists in a given section func (t Section) Has(k string) bool { _, ok := t.values[k] return ok } // ValueType will returned what type the union is set to. If // k was not found, the NoneType will be returned. func (t Section) ValueType(k string) (ValueType, bool) { v, ok := t.values[k] return v.Type, ok } // Bool returns a bool value at k func (t Section) Bool(k string) (bool, bool) { return t.values[k].BoolValue() } // Int returns an integer value at k func (t Section) Int(k string) (int64, bool) { return t.values[k].IntValue() } // Map returns a map value at k func (t Section) Map(k string) map[string]string { return t.values[k].MapValue() } // Float64 returns a float value at k func (t Section) Float64(k string) (float64, bool) { return t.values[k].FloatValue() } // String returns the string value at k func (t Section) String(k string) string { _, ok := t.values[k] if !ok { return "" } return t.values[k].StringValue() } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/strings.go ================================================ package ini import ( "strings" ) func trimProfileComment(s string) string { r, _, _ := strings.Cut(s, "#") r, _, _ = strings.Cut(r, ";") return r } func trimPropertyComment(s string) string { r, _, _ := strings.Cut(s, " #") r, _, _ = strings.Cut(r, " ;") r, _, _ = strings.Cut(r, "\t#") r, _, _ = strings.Cut(r, "\t;") return r } // assumes no surrounding comment func splitProperty(s string) (string, string, bool) { equalsi := strings.Index(s, "=") coloni := strings.Index(s, ":") // LEGACY: also supported for property assignment sep := "=" if equalsi == -1 || coloni != -1 && coloni < equalsi { sep = ":" } k, v, ok := strings.Cut(s, sep) if !ok { return "", "", false } return strings.TrimSpace(k), strings.TrimSpace(v), true } // assumes no surrounding comment, whitespace, or profile brackets func splitProfile(s string) (string, string) { var first int for i, r := range s { if isLineSpace(r) { if first == 0 { first = i } } else { if first != 0 { return s[:first], s[i:] } } } if first == 0 { return "", s // type component is effectively blank } return "", "" } func isLineSpace(r rune) bool { return r == ' ' || r == '\t' } func unquote(s string) string { if isSingleQuoted(s) || isDoubleQuoted(s) { return s[1 : len(s)-1] } return s } // applies various legacy conversions to property values: // - remote wrapping single/doublequotes func legacyStrconv(s string) string { s = unquote(s) return s } func isSingleQuoted(s string) bool { return hasAffixes(s, "'", "'") } func isDoubleQuoted(s string) bool { return hasAffixes(s, `"`, `"`) } func isBracketed(s string) bool { return hasAffixes(s, "[", "]") } func hasAffixes(s, left, right string) bool { return strings.HasPrefix(s, left) && strings.HasSuffix(s, right) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/token.go ================================================ package ini type lineToken interface { isLineToken() } type lineTokenProfile struct { Type string Name string } func (*lineTokenProfile) isLineToken() {} type lineTokenProperty struct { Key string Value string } func (*lineTokenProperty) isLineToken() {} type lineTokenContinuation struct { Value string } func (*lineTokenContinuation) isLineToken() {} type lineTokenSubProperty struct { Key string Value string } func (*lineTokenSubProperty) isLineToken() {} ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/tokenize.go ================================================ package ini import ( "strings" ) func tokenize(lines []string) ([]lineToken, error) { tokens := make([]lineToken, 0, len(lines)) for _, line := range lines { if len(strings.TrimSpace(line)) == 0 || isLineComment(line) { continue } if tok := asProfile(line); tok != nil { tokens = append(tokens, tok) } else if tok := asProperty(line); tok != nil { tokens = append(tokens, tok) } else if tok := asSubProperty(line); tok != nil { tokens = append(tokens, tok) } else if tok := asContinuation(line); tok != nil { tokens = append(tokens, tok) } // unrecognized tokens are effectively ignored } return tokens, nil } func isLineComment(line string) bool { trimmed := strings.TrimLeft(line, " \t") return strings.HasPrefix(trimmed, "#") || strings.HasPrefix(trimmed, ";") } func asProfile(line string) *lineTokenProfile { // " [ type name ] ; comment" trimmed := strings.TrimSpace(trimProfileComment(line)) // "[ type name ]" if !isBracketed(trimmed) { return nil } trimmed = trimmed[1 : len(trimmed)-1] // " type name " (or just " name ") trimmed = strings.TrimSpace(trimmed) // "type name" / "name" typ, name := splitProfile(trimmed) return &lineTokenProfile{ Type: typ, Name: name, } } func asProperty(line string) *lineTokenProperty { if isLineSpace(rune(line[0])) { return nil } trimmed := trimPropertyComment(line) trimmed = strings.TrimRight(trimmed, " \t") k, v, ok := splitProperty(trimmed) if !ok { return nil } return &lineTokenProperty{ Key: strings.ToLower(k), // LEGACY: normalize key case Value: legacyStrconv(v), // LEGACY: see func docs } } func asSubProperty(line string) *lineTokenSubProperty { if !isLineSpace(rune(line[0])) { return nil } // comments on sub-properties are included in the value trimmed := strings.TrimLeft(line, " \t") k, v, ok := splitProperty(trimmed) if !ok { return nil } return &lineTokenSubProperty{ // same LEGACY constraints as in normal property Key: strings.ToLower(k), Value: legacyStrconv(v), } } func asContinuation(line string) *lineTokenContinuation { if !isLineSpace(rune(line[0])) { return nil } // includes comments like sub-properties trimmed := strings.TrimLeft(line, " \t") return &lineTokenContinuation{ Value: trimmed, } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/ini/value.go ================================================ package ini import ( "fmt" "strconv" "strings" ) // ValueType is an enum that will signify what type // the Value is type ValueType int func (v ValueType) String() string { switch v { case NoneType: return "NONE" case StringType: return "STRING" } return "" } // ValueType enums const ( NoneType = ValueType(iota) StringType QuotedStringType ) // Value is a union container type Value struct { Type ValueType str string mp map[string]string } // NewStringValue returns a Value type generated using a string input. func NewStringValue(str string) (Value, error) { return Value{str: str}, nil } func (v Value) String() string { switch v.Type { case StringType: return fmt.Sprintf("string: %s", string(v.str)) case QuotedStringType: return fmt.Sprintf("quoted string: %s", string(v.str)) default: return "union not set" } } // MapValue returns a map value for sub properties func (v Value) MapValue() map[string]string { return v.mp } // IntValue returns an integer value func (v Value) IntValue() (int64, bool) { i, err := strconv.ParseInt(string(v.str), 0, 64) if err != nil { return 0, false } return i, true } // FloatValue returns a float value func (v Value) FloatValue() (float64, bool) { f, err := strconv.ParseFloat(string(v.str), 64) if err != nil { return 0, false } return f, true } // BoolValue returns a bool value func (v Value) BoolValue() (bool, bool) { // we don't use ParseBool as it recognizes more than what we've // historically supported if strings.EqualFold(v.str, "true") { return true, true } else if strings.EqualFold(v.str, "false") { return false, true } return false, false } // StringValue returns the string value func (v Value) StringValue() string { return v.str } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/middleware/middleware.go ================================================ package middleware import ( "context" "sync/atomic" "time" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" "github.com/aws/smithy-go/middleware" ) // AddTimeOffsetMiddleware sets a value representing clock skew on the request context. // This can be read by other operations (such as signing) to correct the date value they send // on the request type AddTimeOffsetMiddleware struct { Offset *atomic.Int64 } // ID the identifier for AddTimeOffsetMiddleware func (m *AddTimeOffsetMiddleware) ID() string { return "AddTimeOffsetMiddleware" } // HandleBuild sets a value for attemptSkew on the request context if one is set on the client. func (m AddTimeOffsetMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { if m.Offset != nil { offset := time.Duration(m.Offset.Load()) ctx = internalcontext.SetAttemptSkewContext(ctx, offset) } return next.HandleBuild(ctx, in) } // HandleDeserialize gets the clock skew context from the context, and if set, sets it on the pointer // held by AddTimeOffsetMiddleware func (m *AddTimeOffsetMiddleware) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { if v := internalcontext.GetAttemptSkewContext(ctx); v != 0 { m.Offset.Store(v.Nanoseconds()) } return next.HandleDeserialize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/rand/rand.go ================================================ package rand import ( "crypto/rand" "fmt" "io" "math/big" ) func init() { Reader = rand.Reader } // Reader provides a random reader that can reset during testing. var Reader io.Reader var floatMaxBigInt = big.NewInt(1 << 53) // Float64 returns a float64 read from an io.Reader source. The returned float will be between [0.0, 1.0). func Float64(reader io.Reader) (float64, error) { bi, err := rand.Int(reader, floatMaxBigInt) if err != nil { return 0, fmt.Errorf("failed to read random value, %v", err) } return float64(bi.Int64()) / (1 << 53), nil } // CryptoRandFloat64 returns a random float64 obtained from the crypto rand // source. func CryptoRandFloat64() (float64, error) { return Float64(Reader) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/sdk/interfaces.go ================================================ package sdk // Invalidator provides access to a type's invalidate method to make it // invalidate it cache. // // e.g aws.SafeCredentialsProvider's Invalidate method. type Invalidator interface { Invalidate() } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/sdk/time.go ================================================ package sdk import ( "context" "time" ) func init() { NowTime = time.Now Sleep = time.Sleep SleepWithContext = sleepWithContext } // NowTime is a value for getting the current time. This value can be overridden // for testing mocking out current time. var NowTime func() time.Time // Sleep is a value for sleeping for a duration. This value can be overridden // for testing and mocking out sleep duration. var Sleep func(time.Duration) // SleepWithContext will wait for the timer duration to expire, or the context // is canceled. Which ever happens first. If the context is canceled the Context's // error will be returned. // // This value can be overridden for testing and mocking out sleep duration. var SleepWithContext func(context.Context, time.Duration) error // sleepWithContext will wait for the timer duration to expire, or the context // is canceled. Which ever happens first. If the context is canceled the // Context's error will be returned. func sleepWithContext(ctx context.Context, dur time.Duration) error { t := time.NewTimer(dur) defer t.Stop() select { case <-t.C: break case <-ctx.Done(): return ctx.Err() } return nil } // noOpSleepWithContext does nothing, returns immediately. func noOpSleepWithContext(context.Context, time.Duration) error { return nil } func noOpSleep(time.Duration) {} // TestingUseNopSleep is a utility for disabling sleep across the SDK for // testing. func TestingUseNopSleep() func() { SleepWithContext = noOpSleepWithContext Sleep = noOpSleep return func() { SleepWithContext = sleepWithContext Sleep = time.Sleep } } // TestingUseReferenceTime is a utility for swapping the time function across the SDK to return a specific reference time // for testing purposes. func TestingUseReferenceTime(referenceTime time.Time) func() { NowTime = func() time.Time { return referenceTime } return func() { NowTime = time.Now } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/sdkio/byte.go ================================================ package sdkio const ( // Byte is 8 bits Byte int64 = 1 // KibiByte (KiB) is 1024 Bytes KibiByte = Byte * 1024 // MebiByte (MiB) is 1024 KiB MebiByte = KibiByte * 1024 // GibiByte (GiB) is 1024 MiB GibiByte = MebiByte * 1024 ) ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/shareddefaults/shared_config.go ================================================ package shareddefaults import ( "os" "os/user" "path/filepath" ) // SharedCredentialsFilename returns the SDK's default file path // for the shared credentials file. // // Builds the shared config file path based on the OS's platform. // // - Linux/Unix: $HOME/.aws/credentials // - Windows: %USERPROFILE%\.aws\credentials func SharedCredentialsFilename() string { return filepath.Join(UserHomeDir(), ".aws", "credentials") } // SharedConfigFilename returns the SDK's default file path for // the shared config file. // // Builds the shared config file path based on the OS's platform. // // - Linux/Unix: $HOME/.aws/config // - Windows: %USERPROFILE%\.aws\config func SharedConfigFilename() string { return filepath.Join(UserHomeDir(), ".aws", "config") } // UserHomeDir returns the home directory for the user the process is // running under. func UserHomeDir() string { // Ignore errors since we only care about Windows and *nix. home, _ := os.UserHomeDir() if len(home) > 0 { return home } currUser, _ := user.Current() if currUser != nil { home = currUser.HomeDir } return home } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/strings/strings.go ================================================ package strings import ( "strings" ) // HasPrefixFold tests whether the string s begins with prefix, interpreted as UTF-8 strings, // under Unicode case-folding. func HasPrefixFold(s, prefix string) bool { return len(s) >= len(prefix) && strings.EqualFold(s[0:len(prefix)], prefix) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/LICENSE ================================================ Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYIGHT 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 OWNER 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. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/docs.go ================================================ // Package singleflight provides a duplicate function call suppression // mechanism. This package is a fork of the Go golang.org/x/sync/singleflight // package. The package is forked, because the package a part of the unstable // and unversioned golang.org/x/sync module. // // https://github.com/golang/sync/tree/67f06af15bc961c363a7260195bcd53487529a21/singleflight package singleflight ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/singleflight.go ================================================ // Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package singleflight import ( "bytes" "errors" "fmt" "runtime" "runtime/debug" "sync" ) // errGoexit indicates the runtime.Goexit was called in // the user given function. var errGoexit = errors.New("runtime.Goexit was called") // A panicError is an arbitrary value recovered from a panic // with the stack trace during the execution of given function. type panicError struct { value interface{} stack []byte } // Error implements error interface. func (p *panicError) Error() string { return fmt.Sprintf("%v\n\n%s", p.value, p.stack) } func newPanicError(v interface{}) error { stack := debug.Stack() // The first line of the stack trace is of the form "goroutine N [status]:" // but by the time the panic reaches Do the goroutine may no longer exist // and its status will have changed. Trim out the misleading line. if line := bytes.IndexByte(stack[:], '\n'); line >= 0 { stack = stack[line+1:] } return &panicError{value: v, stack: stack} } // call is an in-flight or completed singleflight.Do call type call struct { wg sync.WaitGroup // These fields are written once before the WaitGroup is done // and are only read after the WaitGroup is done. val interface{} err error // forgotten indicates whether Forget was called with this call's key // while the call was still in flight. forgotten bool // These fields are read and written with the singleflight // mutex held before the WaitGroup is done, and are read but // not written after the WaitGroup is done. dups int chans []chan<- Result } // Group represents a class of work and forms a namespace in // which units of work can be executed with duplicate suppression. type Group struct { mu sync.Mutex // protects m m map[string]*call // lazily initialized } // Result holds the results of Do, so they can be passed // on a channel. type Result struct { Val interface{} Err error Shared bool } // Do executes and returns the results of the given function, making // sure that only one execution is in-flight for a given key at a // time. If a duplicate comes in, the duplicate caller waits for the // original to complete and receives the same results. // The return value shared indicates whether v was given to multiple callers. func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) { g.mu.Lock() if g.m == nil { g.m = make(map[string]*call) } if c, ok := g.m[key]; ok { c.dups++ g.mu.Unlock() c.wg.Wait() if e, ok := c.err.(*panicError); ok { panic(e) } else if c.err == errGoexit { runtime.Goexit() } return c.val, c.err, true } c := new(call) c.wg.Add(1) g.m[key] = c g.mu.Unlock() g.doCall(c, key, fn) return c.val, c.err, c.dups > 0 } // DoChan is like Do but returns a channel that will receive the // results when they are ready. // // The returned channel will not be closed. func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result { ch := make(chan Result, 1) g.mu.Lock() if g.m == nil { g.m = make(map[string]*call) } if c, ok := g.m[key]; ok { c.dups++ c.chans = append(c.chans, ch) g.mu.Unlock() return ch } c := &call{chans: []chan<- Result{ch}} c.wg.Add(1) g.m[key] = c g.mu.Unlock() go g.doCall(c, key, fn) return ch } // doCall handles the single call for a key. func (g *Group) doCall(c *call, key string, fn func() (interface{}, error)) { normalReturn := false recovered := false // use double-defer to distinguish panic from runtime.Goexit, // more details see https://golang.org/cl/134395 defer func() { // the given function invoked runtime.Goexit if !normalReturn && !recovered { c.err = errGoexit } c.wg.Done() g.mu.Lock() defer g.mu.Unlock() if !c.forgotten { delete(g.m, key) } if e, ok := c.err.(*panicError); ok { // In order to prevent the waiting channels from being blocked forever, // needs to ensure that this panic cannot be recovered. if len(c.chans) > 0 { go panic(e) select {} // Keep this goroutine around so that it will appear in the crash dump. } else { panic(e) } } else if c.err == errGoexit { // Already in the process of goexit, no need to call again } else { // Normal return for _, ch := range c.chans { ch <- Result{c.val, c.err, c.dups > 0} } } }() func() { defer func() { if !normalReturn { // Ideally, we would wait to take a stack trace until we've determined // whether this is a panic or a runtime.Goexit. // // Unfortunately, the only way we can distinguish the two is to see // whether the recover stopped the goroutine from terminating, and by // the time we know that, the part of the stack trace relevant to the // panic has been discarded. if r := recover(); r != nil { c.err = newPanicError(r) } } }() c.val, c.err = fn() normalReturn = true }() if !normalReturn { recovered = true } } // Forget tells the singleflight to forget about a key. Future calls // to Do for this key will call the function rather than waiting for // an earlier call to complete. func (g *Group) Forget(key string) { g.mu.Lock() if c, ok := g.m[key]; ok { c.forgotten = true } delete(g.m, key) g.mu.Unlock() } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/timeconv/duration.go ================================================ package timeconv import "time" // FloatSecondsDur converts a fractional seconds to duration. func FloatSecondsDur(v float64) time.Duration { return time.Duration(v * float64(time.Second)) } // DurSecondsFloat converts a duration into fractional seconds. func DurSecondsFloat(d time.Duration) float64 { return float64(d) / float64(time.Second) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md ================================================ # v1.3.34 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.33 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.3.32 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.31 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.30 (2025-01-30) * **Bug Fix**: Do not sign Transfer-Encoding header in Sigv4[a]. Fixes a signer mismatch issue with S3 Accelerate. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.29 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.3.28 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.27 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.26 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.25 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.24 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.23 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.22 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.21 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.20 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.19 (2024-10-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.18 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.17 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.16 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.15 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.14 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.13 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.12 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.11 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.10 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.9 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.8 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.7 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.6 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.5 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.4 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.3 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.2 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.2.10 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.9 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.8 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.7 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.6 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.5 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.4 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.3 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.2 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.1.6 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.5 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.4 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.3 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.2 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.1 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.0 (2023-07-31) * **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide. * **Dependency Update**: Updated to the latest SDK module versions # v1.0.28 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.27 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.26 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.25 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.24 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.23 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.22 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.21 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.20 (2023-02-14) * No change notes available for this release. # v1.0.19 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.18 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.17 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.16 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.15 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.14 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.13 (2022-09-14) * **Bug Fix**: Fixes an issues where an error from an underlying SigV4 credential provider would not be surfaced from the SigV4a credential provider. Contribution by [sakthipriyan-aqfer](https://github.com/sakthipriyan-aqfer). * **Dependency Update**: Updated to the latest SDK module versions # v1.0.12 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.11 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.10 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.9 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.8 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.7 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.6 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.5 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.4 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.3 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.2 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.1 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.0.0 (2022-04-07) * **Release**: New internal v4a signing module location. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/credentials.go ================================================ package v4a import ( "context" "crypto/ecdsa" "fmt" "sync" "sync/atomic" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/internal/sdk" ) // Credentials is Context, ECDSA, and Optional Session Token that can be used // to sign requests using SigV4a type Credentials struct { Context string PrivateKey *ecdsa.PrivateKey SessionToken string // Time the credentials will expire. CanExpire bool Expires time.Time } // Expired returns if the credentials have expired. func (v Credentials) Expired() bool { if v.CanExpire { return !v.Expires.After(sdk.NowTime()) } return false } // HasKeys returns if the credentials keys are set. func (v Credentials) HasKeys() bool { return len(v.Context) > 0 && v.PrivateKey != nil } // SymmetricCredentialAdaptor wraps a SigV4 AccessKey/SecretKey provider and adapts the credentials // to a ECDSA PrivateKey for signing with SiV4a type SymmetricCredentialAdaptor struct { SymmetricProvider aws.CredentialsProvider asymmetric atomic.Value m sync.Mutex } // Retrieve retrieves symmetric credentials from the underlying provider. func (s *SymmetricCredentialAdaptor) Retrieve(ctx context.Context) (aws.Credentials, error) { symCreds, err := s.retrieveFromSymmetricProvider(ctx) if err != nil { return aws.Credentials{}, err } if asymCreds := s.getCreds(); asymCreds == nil { return symCreds, nil } s.m.Lock() defer s.m.Unlock() asymCreds := s.getCreds() if asymCreds == nil { return symCreds, nil } // if the context does not match the access key id clear it if asymCreds.Context != symCreds.AccessKeyID { s.asymmetric.Store((*Credentials)(nil)) } return symCreds, nil } // RetrievePrivateKey returns credentials suitable for SigV4a signing func (s *SymmetricCredentialAdaptor) RetrievePrivateKey(ctx context.Context) (Credentials, error) { if asymCreds := s.getCreds(); asymCreds != nil { return *asymCreds, nil } s.m.Lock() defer s.m.Unlock() if asymCreds := s.getCreds(); asymCreds != nil { return *asymCreds, nil } symmetricCreds, err := s.retrieveFromSymmetricProvider(ctx) if err != nil { return Credentials{}, fmt.Errorf("failed to retrieve symmetric credentials: %v", err) } privateKey, err := deriveKeyFromAccessKeyPair(symmetricCreds.AccessKeyID, symmetricCreds.SecretAccessKey) if err != nil { return Credentials{}, fmt.Errorf("failed to derive assymetric key from credentials") } creds := Credentials{ Context: symmetricCreds.AccessKeyID, PrivateKey: privateKey, SessionToken: symmetricCreds.SessionToken, CanExpire: symmetricCreds.CanExpire, Expires: symmetricCreds.Expires, } s.asymmetric.Store(&creds) return creds, nil } func (s *SymmetricCredentialAdaptor) getCreds() *Credentials { v := s.asymmetric.Load() if v == nil { return nil } c := v.(*Credentials) if c != nil && c.HasKeys() && !c.Expired() { return c } return nil } func (s *SymmetricCredentialAdaptor) retrieveFromSymmetricProvider(ctx context.Context) (aws.Credentials, error) { credentials, err := s.SymmetricProvider.Retrieve(ctx) if err != nil { return aws.Credentials{}, err } return credentials, nil } // CredentialsProvider is the interface for a provider to retrieve credentials // to sign requests with. type CredentialsProvider interface { RetrievePrivateKey(context.Context) (Credentials, error) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/error.go ================================================ package v4a import "fmt" // SigningError indicates an error condition occurred while performing SigV4a signing type SigningError struct { Err error } func (e *SigningError) Error() string { return fmt.Sprintf("failed to sign request: %v", e.Err) } // Unwrap returns the underlying error cause func (e *SigningError) Unwrap() error { return e.Err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package v4a // goModuleVersion is the tagged release for this module const goModuleVersion = "1.3.34" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/compare.go ================================================ package crypto import "fmt" // ConstantTimeByteCompare is a constant-time byte comparison of x and y. This function performs an absolute comparison // if the two byte slices assuming they represent a big-endian number. // // error if len(x) != len(y) // -1 if x < y // 0 if x == y // +1 if x > y func ConstantTimeByteCompare(x, y []byte) (int, error) { if len(x) != len(y) { return 0, fmt.Errorf("slice lengths do not match") } xLarger, yLarger := 0, 0 for i := 0; i < len(x); i++ { xByte, yByte := int(x[i]), int(y[i]) x := ((yByte - xByte) >> 8) & 1 y := ((xByte - yByte) >> 8) & 1 xLarger |= x &^ yLarger yLarger |= y &^ xLarger } return xLarger - yLarger, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto/ecc.go ================================================ package crypto import ( "bytes" "crypto/ecdsa" "crypto/elliptic" "crypto/hmac" "encoding/asn1" "encoding/binary" "fmt" "hash" "math" "math/big" ) type ecdsaSignature struct { R, S *big.Int } // ECDSAKey takes the given elliptic curve, and private key (d) byte slice // and returns the private ECDSA key. func ECDSAKey(curve elliptic.Curve, d []byte) *ecdsa.PrivateKey { return ECDSAKeyFromPoint(curve, (&big.Int{}).SetBytes(d)) } // ECDSAKeyFromPoint takes the given elliptic curve and point and returns the // private and public keypair func ECDSAKeyFromPoint(curve elliptic.Curve, d *big.Int) *ecdsa.PrivateKey { pX, pY := curve.ScalarBaseMult(d.Bytes()) privKey := &ecdsa.PrivateKey{ PublicKey: ecdsa.PublicKey{ Curve: curve, X: pX, Y: pY, }, D: d, } return privKey } // ECDSAPublicKey takes the provide curve and (x, y) coordinates and returns // *ecdsa.PublicKey. Returns an error if the given points are not on the curve. func ECDSAPublicKey(curve elliptic.Curve, x, y []byte) (*ecdsa.PublicKey, error) { xPoint := (&big.Int{}).SetBytes(x) yPoint := (&big.Int{}).SetBytes(y) if !curve.IsOnCurve(xPoint, yPoint) { return nil, fmt.Errorf("point(%v, %v) is not on the given curve", xPoint.String(), yPoint.String()) } return &ecdsa.PublicKey{ Curve: curve, X: xPoint, Y: yPoint, }, nil } // VerifySignature takes the provided public key, hash, and asn1 encoded signature and returns // whether the given signature is valid. func VerifySignature(key *ecdsa.PublicKey, hash []byte, signature []byte) (bool, error) { var ecdsaSignature ecdsaSignature _, err := asn1.Unmarshal(signature, &ecdsaSignature) if err != nil { return false, err } return ecdsa.Verify(key, hash, ecdsaSignature.R, ecdsaSignature.S), nil } // HMACKeyDerivation provides an implementation of a NIST-800-108 of a KDF (Key Derivation Function) in Counter Mode. // For the purposes of this implantation HMAC is used as the PRF (Pseudorandom function), where the value of // `r` is defined as a 4 byte counter. func HMACKeyDerivation(hash func() hash.Hash, bitLen int, key []byte, label, context []byte) ([]byte, error) { // verify that we won't overflow the counter n := int64(math.Ceil((float64(bitLen) / 8) / float64(hash().Size()))) if n > 0x7FFFFFFF { return nil, fmt.Errorf("unable to derive key of size %d using 32-bit counter", bitLen) } // verify the requested bit length is not larger then the length encoding size if int64(bitLen) > 0x7FFFFFFF { return nil, fmt.Errorf("bitLen is greater than 32-bits") } fixedInput := bytes.NewBuffer(nil) fixedInput.Write(label) fixedInput.WriteByte(0x00) fixedInput.Write(context) if err := binary.Write(fixedInput, binary.BigEndian, int32(bitLen)); err != nil { return nil, fmt.Errorf("failed to write bit length to fixed input string: %v", err) } var output []byte h := hmac.New(hash, key) for i := int64(1); i <= n; i++ { h.Reset() if err := binary.Write(h, binary.BigEndian, int32(i)); err != nil { return nil, err } _, err := h.Write(fixedInput.Bytes()) if err != nil { return nil, err } output = append(output, h.Sum(nil)...) } return output[:bitLen/8], nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/const.go ================================================ package v4 const ( // EmptyStringSHA256 is the hex encoded sha256 value of an empty string EmptyStringSHA256 = `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855` // UnsignedPayload indicates that the request payload body is unsigned UnsignedPayload = "UNSIGNED-PAYLOAD" // AmzAlgorithmKey indicates the signing algorithm AmzAlgorithmKey = "X-Amz-Algorithm" // AmzSecurityTokenKey indicates the security token to be used with temporary credentials AmzSecurityTokenKey = "X-Amz-Security-Token" // AmzDateKey is the UTC timestamp for the request in the format YYYYMMDD'T'HHMMSS'Z' AmzDateKey = "X-Amz-Date" // AmzCredentialKey is the access key ID and credential scope AmzCredentialKey = "X-Amz-Credential" // AmzSignedHeadersKey is the set of headers signed for the request AmzSignedHeadersKey = "X-Amz-SignedHeaders" // AmzSignatureKey is the query parameter to store the SigV4 signature AmzSignatureKey = "X-Amz-Signature" // TimeFormat is the time format to be used in the X-Amz-Date header or query parameter TimeFormat = "20060102T150405Z" // ShortTimeFormat is the shorten time format used in the credential scope ShortTimeFormat = "20060102" // ContentSHAKey is the SHA256 of request body ContentSHAKey = "X-Amz-Content-Sha256" ) ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/header_rules.go ================================================ package v4 import ( sdkstrings "github.com/aws/aws-sdk-go-v2/internal/strings" ) // Rules houses a set of Rule needed for validation of a // string value type Rules []Rule // Rule interface allows for more flexible rules and just simply // checks whether or not a value adheres to that Rule type Rule interface { IsValid(value string) bool } // IsValid will iterate through all rules and see if any rules // apply to the value and supports nested rules func (r Rules) IsValid(value string) bool { for _, rule := range r { if rule.IsValid(value) { return true } } return false } // MapRule generic Rule for maps type MapRule map[string]struct{} // IsValid for the map Rule satisfies whether it exists in the map func (m MapRule) IsValid(value string) bool { _, ok := m[value] return ok } // AllowList is a generic Rule for whitelisting type AllowList struct { Rule } // IsValid for AllowList checks if the value is within the AllowList func (w AllowList) IsValid(value string) bool { return w.Rule.IsValid(value) } // DenyList is a generic Rule for blacklisting type DenyList struct { Rule } // IsValid for AllowList checks if the value is within the AllowList func (b DenyList) IsValid(value string) bool { return !b.Rule.IsValid(value) } // Patterns is a list of strings to match against type Patterns []string // IsValid for Patterns checks each pattern and returns if a match has // been found func (p Patterns) IsValid(value string) bool { for _, pattern := range p { if sdkstrings.HasPrefixFold(value, pattern) { return true } } return false } // InclusiveRules rules allow for rules to depend on one another type InclusiveRules []Rule // IsValid will return true if all rules are true func (r InclusiveRules) IsValid(value string) bool { for _, rule := range r { if !rule.IsValid(value) { return false } } return true } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/headers.go ================================================ package v4 // IgnoredHeaders is a list of headers that are ignored during signing var IgnoredHeaders = Rules{ DenyList{ MapRule{ "Authorization": struct{}{}, "User-Agent": struct{}{}, "X-Amzn-Trace-Id": struct{}{}, "Transfer-Encoding": struct{}{}, }, }, } // RequiredSignedHeaders is a whitelist for Build canonical headers. var RequiredSignedHeaders = Rules{ AllowList{ MapRule{ "Cache-Control": struct{}{}, "Content-Disposition": struct{}{}, "Content-Encoding": struct{}{}, "Content-Language": struct{}{}, "Content-Md5": struct{}{}, "Content-Type": struct{}{}, "Expires": struct{}{}, "If-Match": struct{}{}, "If-Modified-Since": struct{}{}, "If-None-Match": struct{}{}, "If-Unmodified-Since": struct{}{}, "Range": struct{}{}, "X-Amz-Acl": struct{}{}, "X-Amz-Copy-Source": struct{}{}, "X-Amz-Copy-Source-If-Match": struct{}{}, "X-Amz-Copy-Source-If-Modified-Since": struct{}{}, "X-Amz-Copy-Source-If-None-Match": struct{}{}, "X-Amz-Copy-Source-If-Unmodified-Since": struct{}{}, "X-Amz-Copy-Source-Range": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": struct{}{}, "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, "X-Amz-Grant-Full-control": struct{}{}, "X-Amz-Grant-Read": struct{}{}, "X-Amz-Grant-Read-Acp": struct{}{}, "X-Amz-Grant-Write": struct{}{}, "X-Amz-Grant-Write-Acp": struct{}{}, "X-Amz-Metadata-Directive": struct{}{}, "X-Amz-Mfa": struct{}{}, "X-Amz-Request-Payer": struct{}{}, "X-Amz-Server-Side-Encryption": struct{}{}, "X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id": struct{}{}, "X-Amz-Server-Side-Encryption-Customer-Algorithm": struct{}{}, "X-Amz-Server-Side-Encryption-Customer-Key": struct{}{}, "X-Amz-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, "X-Amz-Storage-Class": struct{}{}, "X-Amz-Website-Redirect-Location": struct{}{}, "X-Amz-Content-Sha256": struct{}{}, "X-Amz-Tagging": struct{}{}, }, }, Patterns{"X-Amz-Meta-"}, } // AllowedQueryHoisting is a whitelist for Build query headers. The boolean value // represents whether or not it is a pattern. var AllowedQueryHoisting = InclusiveRules{ DenyList{RequiredSignedHeaders}, Patterns{"X-Amz-"}, } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/hmac.go ================================================ package v4 import ( "crypto/hmac" "crypto/sha256" ) // HMACSHA256 computes a HMAC-SHA256 of data given the provided key. func HMACSHA256(key []byte, data []byte) []byte { hash := hmac.New(sha256.New, key) hash.Write(data) return hash.Sum(nil) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/host.go ================================================ package v4 import ( "net/http" "strings" ) // SanitizeHostForHeader removes default port from host and updates request.Host func SanitizeHostForHeader(r *http.Request) { host := getHost(r) port := portOnly(host) if port != "" && isDefaultPort(r.URL.Scheme, port) { r.Host = stripPort(host) } } // Returns host from request func getHost(r *http.Request) string { if r.Host != "" { return r.Host } return r.URL.Host } // Hostname returns u.Host, without any port number. // // If Host is an IPv6 literal with a port number, Hostname returns the // IPv6 literal without the square brackets. IPv6 literals may include // a zone identifier. // // Copied from the Go 1.8 standard library (net/url) func stripPort(hostport string) string { colon := strings.IndexByte(hostport, ':') if colon == -1 { return hostport } if i := strings.IndexByte(hostport, ']'); i != -1 { return strings.TrimPrefix(hostport[:i], "[") } return hostport[:colon] } // Port returns the port part of u.Host, without the leading colon. // If u.Host doesn't contain a port, Port returns an empty string. // // Copied from the Go 1.8 standard library (net/url) func portOnly(hostport string) string { colon := strings.IndexByte(hostport, ':') if colon == -1 { return "" } if i := strings.Index(hostport, "]:"); i != -1 { return hostport[i+len("]:"):] } if strings.Contains(hostport, "]") { return "" } return hostport[colon+len(":"):] } // Returns true if the specified URI is using the standard port // (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs) func isDefaultPort(scheme, port string) bool { if port == "" { return true } lowerCaseScheme := strings.ToLower(scheme) if (lowerCaseScheme == "http" && port == "80") || (lowerCaseScheme == "https" && port == "443") { return true } return false } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/time.go ================================================ package v4 import "time" // SigningTime provides a wrapper around a time.Time which provides cached values for SigV4 signing. type SigningTime struct { time.Time timeFormat string shortTimeFormat string } // NewSigningTime creates a new SigningTime given a time.Time func NewSigningTime(t time.Time) SigningTime { return SigningTime{ Time: t, } } // TimeFormat provides a time formatted in the X-Amz-Date format. func (m *SigningTime) TimeFormat() string { return m.format(&m.timeFormat, TimeFormat) } // ShortTimeFormat provides a time formatted of 20060102. func (m *SigningTime) ShortTimeFormat() string { return m.format(&m.shortTimeFormat, ShortTimeFormat) } func (m *SigningTime) format(target *string, format string) string { if len(*target) > 0 { return *target } v := m.Time.Format(format) *target = v return v } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4/util.go ================================================ package v4 import ( "net/url" "strings" ) const doubleSpace = " " // StripExcessSpaces will rewrite the passed in slice's string values to not // contain muliple side-by-side spaces. func StripExcessSpaces(str string) string { var j, k, l, m, spaces int // Trim trailing spaces for j = len(str) - 1; j >= 0 && str[j] == ' '; j-- { } // Trim leading spaces for k = 0; k < j && str[k] == ' '; k++ { } str = str[k : j+1] // Strip multiple spaces. j = strings.Index(str, doubleSpace) if j < 0 { return str } buf := []byte(str) for k, m, l = j, j, len(buf); k < l; k++ { if buf[k] == ' ' { if spaces == 0 { // First space. buf[m] = buf[k] m++ } spaces++ } else { // End of multiple spaces. spaces = 0 buf[m] = buf[k] m++ } } return string(buf[:m]) } // GetURIPath returns the escaped URI component from the provided URL func GetURIPath(u *url.URL) string { var uri string if len(u.Opaque) > 0 { uri = "/" + strings.Join(strings.Split(u.Opaque, "/")[3:], "/") } else { uri = u.EscapedPath() } if len(uri) == 0 { uri = "/" } return uri } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/middleware.go ================================================ package v4a import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalauth "github.com/aws/aws-sdk-go-v2/internal/auth" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "net/http" "time" ) // HTTPSigner is SigV4a HTTP signer implementation type HTTPSigner interface { SignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optfns ...func(*SignerOptions)) error } // SignHTTPRequestMiddlewareOptions is the middleware options for constructing a SignHTTPRequestMiddleware. type SignHTTPRequestMiddlewareOptions struct { Credentials CredentialsProvider Signer HTTPSigner LogSigning bool } // SignHTTPRequestMiddleware is a middleware for signing an HTTP request using SigV4a. type SignHTTPRequestMiddleware struct { credentials CredentialsProvider signer HTTPSigner logSigning bool } // NewSignHTTPRequestMiddleware constructs a SignHTTPRequestMiddleware using the given SignHTTPRequestMiddlewareOptions. func NewSignHTTPRequestMiddleware(options SignHTTPRequestMiddlewareOptions) *SignHTTPRequestMiddleware { return &SignHTTPRequestMiddleware{ credentials: options.Credentials, signer: options.Signer, logSigning: options.LogSigning, } } // ID the middleware identifier. func (s *SignHTTPRequestMiddleware) ID() string { return "Signing" } // HandleFinalize signs an HTTP request using SigV4a. func (s *SignHTTPRequestMiddleware) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { if !hasCredentialProvider(s.credentials) { return next.HandleFinalize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unexpected request middleware type %T", in.Request) } signingName, signingRegion := awsmiddleware.GetSigningName(ctx), awsmiddleware.GetSigningRegion(ctx) payloadHash := v4.GetPayloadHash(ctx) if len(payloadHash) == 0 { return out, metadata, &SigningError{Err: fmt.Errorf("computed payload hash missing from context")} } credentials, err := s.credentials.RetrievePrivateKey(ctx) if err != nil { return out, metadata, &SigningError{Err: fmt.Errorf("failed to retrieve credentials: %w", err)} } signerOptions := []func(o *SignerOptions){ func(o *SignerOptions) { o.Logger = middleware.GetLogger(ctx) o.LogSigning = s.logSigning }, } // existing DisableURIPathEscaping is equivalent in purpose // to authentication scheme property DisableDoubleEncoding disableDoubleEncoding, overridden := internalauth.GetDisableDoubleEncoding(ctx) if overridden { signerOptions = append(signerOptions, func(o *SignerOptions) { o.DisableURIPathEscaping = disableDoubleEncoding }) } err = s.signer.SignHTTP(ctx, credentials, req.Request, payloadHash, signingName, []string{signingRegion}, time.Now().UTC(), signerOptions...) if err != nil { return out, metadata, &SigningError{Err: fmt.Errorf("failed to sign http request, %w", err)} } return next.HandleFinalize(ctx, in) } func hasCredentialProvider(p CredentialsProvider) bool { if p == nil { return false } return true } // RegisterSigningMiddleware registers the SigV4a signing middleware to the stack. If a signing middleware is already // present, this provided middleware will be swapped. Otherwise the middleware will be added at the tail of the // finalize step. func RegisterSigningMiddleware(stack *middleware.Stack, signingMiddleware *SignHTTPRequestMiddleware) (err error) { const signedID = "Signing" _, present := stack.Finalize.Get(signedID) if present { _, err = stack.Finalize.Swap(signedID, signingMiddleware) } else { err = stack.Finalize.Add(signingMiddleware, middleware.After) } return err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/presign_middleware.go ================================================ package v4a import ( "context" "fmt" "net/http" "time" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go/middleware" smithyHTTP "github.com/aws/smithy-go/transport/http" ) // HTTPPresigner is an interface to a SigV4a signer that can sign create a // presigned URL for a HTTP requests. type HTTPPresigner interface { PresignHTTP( ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optFns ...func(*SignerOptions), ) (url string, signedHeader http.Header, err error) } // PresignHTTPRequestMiddlewareOptions is the options for the PresignHTTPRequestMiddleware middleware. type PresignHTTPRequestMiddlewareOptions struct { CredentialsProvider CredentialsProvider Presigner HTTPPresigner LogSigning bool } // PresignHTTPRequestMiddleware provides the Finalize middleware for creating a // presigned URL for an HTTP request. // // Will short circuit the middleware stack and not forward onto the next // Finalize handler. type PresignHTTPRequestMiddleware struct { credentialsProvider CredentialsProvider presigner HTTPPresigner logSigning bool } // NewPresignHTTPRequestMiddleware returns a new PresignHTTPRequestMiddleware // initialized with the presigner. func NewPresignHTTPRequestMiddleware(options PresignHTTPRequestMiddlewareOptions) *PresignHTTPRequestMiddleware { return &PresignHTTPRequestMiddleware{ credentialsProvider: options.CredentialsProvider, presigner: options.Presigner, logSigning: options.LogSigning, } } // ID provides the middleware ID. func (*PresignHTTPRequestMiddleware) ID() string { return "PresignHTTPRequest" } // HandleFinalize will take the provided input and create a presigned url for // the http request using the SigV4 presign authentication scheme. func (s *PresignHTTPRequestMiddleware) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyHTTP.Request) if !ok { return out, metadata, &SigningError{ Err: fmt.Errorf("unexpected request middleware type %T", in.Request), } } httpReq := req.Build(ctx) if !hasCredentialProvider(s.credentialsProvider) { out.Result = &v4.PresignedHTTPRequest{ URL: httpReq.URL.String(), Method: httpReq.Method, SignedHeader: http.Header{}, } return out, metadata, nil } signingName := awsmiddleware.GetSigningName(ctx) signingRegion := awsmiddleware.GetSigningRegion(ctx) payloadHash := v4.GetPayloadHash(ctx) if len(payloadHash) == 0 { return out, metadata, &SigningError{ Err: fmt.Errorf("computed payload hash missing from context"), } } credentials, err := s.credentialsProvider.RetrievePrivateKey(ctx) if err != nil { return out, metadata, &SigningError{ Err: fmt.Errorf("failed to retrieve credentials: %w", err), } } u, h, err := s.presigner.PresignHTTP(ctx, credentials, httpReq, payloadHash, signingName, []string{signingRegion}, sdk.NowTime(), func(o *SignerOptions) { o.Logger = middleware.GetLogger(ctx) o.LogSigning = s.logSigning }) if err != nil { return out, metadata, &SigningError{ Err: fmt.Errorf("failed to sign http request, %w", err), } } out.Result = &v4.PresignedHTTPRequest{ URL: u, Method: httpReq.Method, SignedHeader: h, } return out, metadata, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/smithy.go ================================================ package v4a import ( "context" "fmt" "time" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" "github.com/aws/aws-sdk-go-v2/internal/sdk" "github.com/aws/smithy-go" "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/logging" smithyhttp "github.com/aws/smithy-go/transport/http" ) // CredentialsAdapter adapts v4a.Credentials to smithy auth.Identity. type CredentialsAdapter struct { Credentials Credentials } var _ auth.Identity = (*CredentialsAdapter)(nil) // Expiration returns the time of expiration for the credentials. func (v *CredentialsAdapter) Expiration() time.Time { return v.Credentials.Expires } // CredentialsProviderAdapter adapts v4a.CredentialsProvider to // auth.IdentityResolver. type CredentialsProviderAdapter struct { Provider CredentialsProvider } var _ (auth.IdentityResolver) = (*CredentialsProviderAdapter)(nil) // GetIdentity retrieves v4a credentials using the underlying provider. func (v *CredentialsProviderAdapter) GetIdentity(ctx context.Context, _ smithy.Properties) ( auth.Identity, error, ) { creds, err := v.Provider.RetrievePrivateKey(ctx) if err != nil { return nil, fmt.Errorf("get credentials: %w", err) } return &CredentialsAdapter{Credentials: creds}, nil } // SignerAdapter adapts v4a.HTTPSigner to smithy http.Signer. type SignerAdapter struct { Signer HTTPSigner Logger logging.Logger LogSigning bool } var _ (smithyhttp.Signer) = (*SignerAdapter)(nil) // SignRequest signs the request with the provided identity. func (v *SignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithy.Properties) error { ca, ok := identity.(*CredentialsAdapter) if !ok { return fmt.Errorf("unexpected identity type: %T", identity) } name, ok := smithyhttp.GetSigV4SigningName(&props) if !ok { return fmt.Errorf("sigv4a signing name is required") } regions, ok := smithyhttp.GetSigV4ASigningRegions(&props) if !ok { return fmt.Errorf("sigv4a signing region is required") } hash := v4.GetPayloadHash(ctx) signingTime := sdk.NowTime() if skew := internalcontext.GetAttemptSkewContext(ctx); skew != 0 { signingTime.Add(skew) } err := v.Signer.SignHTTP(ctx, ca.Credentials, r.Request, hash, name, regions, signingTime, func(o *SignerOptions) { o.DisableURIPathEscaping, _ = smithyhttp.GetDisableDoubleEncoding(&props) o.Logger = v.Logger o.LogSigning = v.LogSigning }) if err != nil { return fmt.Errorf("sign http: %w", err) } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/v4a.go ================================================ package v4a import ( "bytes" "context" "crypto" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/sha256" "encoding/hex" "fmt" "hash" "math/big" "net/http" "net/textproto" "net/url" "sort" "strconv" "strings" "time" signerCrypto "github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto" v4Internal "github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4" "github.com/aws/smithy-go/encoding/httpbinding" "github.com/aws/smithy-go/logging" ) const ( // AmzRegionSetKey represents the region set header used for sigv4a AmzRegionSetKey = "X-Amz-Region-Set" amzAlgorithmKey = v4Internal.AmzAlgorithmKey amzSecurityTokenKey = v4Internal.AmzSecurityTokenKey amzDateKey = v4Internal.AmzDateKey amzCredentialKey = v4Internal.AmzCredentialKey amzSignedHeadersKey = v4Internal.AmzSignedHeadersKey authorizationHeader = "Authorization" signingAlgorithm = "AWS4-ECDSA-P256-SHA256" timeFormat = "20060102T150405Z" shortTimeFormat = "20060102" // EmptyStringSHA256 is a hex encoded SHA-256 hash of an empty string EmptyStringSHA256 = v4Internal.EmptyStringSHA256 // Version of signing v4a Version = "SigV4A" ) var ( p256 elliptic.Curve nMinusTwoP256 *big.Int one = new(big.Int).SetInt64(1) ) func init() { // Ensure the elliptic curve parameters are initialized on package import rather then on first usage p256 = elliptic.P256() nMinusTwoP256 = new(big.Int).SetBytes(p256.Params().N.Bytes()) nMinusTwoP256 = nMinusTwoP256.Sub(nMinusTwoP256, new(big.Int).SetInt64(2)) } // SignerOptions is the SigV4a signing options for constructing a Signer. type SignerOptions struct { Logger logging.Logger LogSigning bool // Disables the Signer's moving HTTP header key/value pairs from the HTTP // request header to the request's query string. This is most commonly used // with pre-signed requests preventing headers from being added to the // request's query string. DisableHeaderHoisting bool // Disables the automatic escaping of the URI path of the request for the // siganture's canonical string's path. For services that do not need additional // escaping then use this to disable the signer escaping the path. // // S3 is an example of a service that does not need additional escaping. // // http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html DisableURIPathEscaping bool } // Signer is a SigV4a HTTP signing implementation type Signer struct { options SignerOptions } // NewSigner constructs a SigV4a Signer. func NewSigner(optFns ...func(*SignerOptions)) *Signer { options := SignerOptions{} for _, fn := range optFns { fn(&options) } return &Signer{options: options} } // deriveKeyFromAccessKeyPair derives a NIST P-256 PrivateKey from the given // IAM AccessKey and SecretKey pair. // // Based on FIPS.186-4 Appendix B.4.2 func deriveKeyFromAccessKeyPair(accessKey, secretKey string) (*ecdsa.PrivateKey, error) { params := p256.Params() bitLen := params.BitSize // Testing random candidates does not require an additional 64 bits counter := 0x01 buffer := make([]byte, 1+len(accessKey)) // 1 byte counter + len(accessKey) kdfContext := bytes.NewBuffer(buffer) inputKey := append([]byte("AWS4A"), []byte(secretKey)...) d := new(big.Int) for { kdfContext.Reset() kdfContext.WriteString(accessKey) kdfContext.WriteByte(byte(counter)) key, err := signerCrypto.HMACKeyDerivation(sha256.New, bitLen, inputKey, []byte(signingAlgorithm), kdfContext.Bytes()) if err != nil { return nil, err } // Check key first before calling SetBytes if key key is in fact a valid candidate. // This ensures the byte slice is the correct length (32-bytes) to compare in constant-time cmp, err := signerCrypto.ConstantTimeByteCompare(key, nMinusTwoP256.Bytes()) if err != nil { return nil, err } if cmp == -1 { d.SetBytes(key) break } counter++ if counter > 0xFF { return nil, fmt.Errorf("exhausted single byte external counter") } } d = d.Add(d, one) priv := new(ecdsa.PrivateKey) priv.PublicKey.Curve = p256 priv.D = d priv.PublicKey.X, priv.PublicKey.Y = p256.ScalarBaseMult(d.Bytes()) return priv, nil } type httpSigner struct { Request *http.Request ServiceName string RegionSet []string Time time.Time Credentials Credentials IsPreSign bool Logger logging.Logger Debug bool // PayloadHash is the hex encoded SHA-256 hash of the request payload // If len(PayloadHash) == 0 the signer will attempt to send the request // as an unsigned payload. Note: Unsigned payloads only work for a subset of services. PayloadHash string DisableHeaderHoisting bool DisableURIPathEscaping bool } // SignHTTP takes the provided http.Request, payload hash, service, regionSet, and time and signs using SigV4a. // The passed in request will be modified in place. func (s *Signer) SignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optFns ...func(*SignerOptions)) error { options := s.options for _, fn := range optFns { fn(&options) } signer := &httpSigner{ Request: r, PayloadHash: payloadHash, ServiceName: service, RegionSet: regionSet, Credentials: credentials, Time: signingTime.UTC(), DisableHeaderHoisting: options.DisableHeaderHoisting, DisableURIPathEscaping: options.DisableURIPathEscaping, } signedRequest, err := signer.Build() if err != nil { return err } logHTTPSigningInfo(ctx, options, signedRequest) return nil } // PresignHTTP takes the provided http.Request, payload hash, service, regionSet, and time and presigns using SigV4a // Returns the presigned URL along with the headers that were signed with the request. // // PresignHTTP will not set the expires time of the presigned request // automatically. To specify the expire duration for a request add the // "X-Amz-Expires" query parameter on the request with the value as the // duration in seconds the presigned URL should be considered valid for. This // parameter is not used by all AWS services, and is most notable used by // Amazon S3 APIs. func (s *Signer) PresignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optFns ...func(*SignerOptions)) (signedURI string, signedHeaders http.Header, err error) { options := s.options for _, fn := range optFns { fn(&options) } signer := &httpSigner{ Request: r, PayloadHash: payloadHash, ServiceName: service, RegionSet: regionSet, Credentials: credentials, Time: signingTime.UTC(), IsPreSign: true, DisableHeaderHoisting: options.DisableHeaderHoisting, DisableURIPathEscaping: options.DisableURIPathEscaping, } signedRequest, err := signer.Build() if err != nil { return "", nil, err } logHTTPSigningInfo(ctx, options, signedRequest) signedHeaders = make(http.Header) // For the signed headers we canonicalize the header keys in the returned map. // This avoids situations where can standard library double headers like host header. For example the standard // library will set the Host header, even if it is present in lower-case form. for k, v := range signedRequest.SignedHeaders { key := textproto.CanonicalMIMEHeaderKey(k) signedHeaders[key] = append(signedHeaders[key], v...) } return signedRequest.Request.URL.String(), signedHeaders, nil } func (s *httpSigner) setRequiredSigningFields(headers http.Header, query url.Values) { amzDate := s.Time.Format(timeFormat) if s.IsPreSign { query.Set(AmzRegionSetKey, strings.Join(s.RegionSet, ",")) query.Set(amzDateKey, amzDate) query.Set(amzAlgorithmKey, signingAlgorithm) if len(s.Credentials.SessionToken) > 0 { query.Set(amzSecurityTokenKey, s.Credentials.SessionToken) } return } headers.Set(AmzRegionSetKey, strings.Join(s.RegionSet, ",")) headers.Set(amzDateKey, amzDate) if len(s.Credentials.SessionToken) > 0 { headers.Set(amzSecurityTokenKey, s.Credentials.SessionToken) } } func (s *httpSigner) Build() (signedRequest, error) { req := s.Request query := req.URL.Query() headers := req.Header s.setRequiredSigningFields(headers, query) // Sort Each Query Key's Values for key := range query { sort.Strings(query[key]) } v4Internal.SanitizeHostForHeader(req) credentialScope := s.buildCredentialScope() credentialStr := s.Credentials.Context + "/" + credentialScope if s.IsPreSign { query.Set(amzCredentialKey, credentialStr) } unsignedHeaders := headers if s.IsPreSign && !s.DisableHeaderHoisting { urlValues := url.Values{} urlValues, unsignedHeaders = buildQuery(v4Internal.AllowedQueryHoisting, unsignedHeaders) for k := range urlValues { query[k] = urlValues[k] } } host := req.URL.Host if len(req.Host) > 0 { host = req.Host } signedHeaders, signedHeadersStr, canonicalHeaderStr := s.buildCanonicalHeaders(host, v4Internal.IgnoredHeaders, unsignedHeaders, s.Request.ContentLength) if s.IsPreSign { query.Set(amzSignedHeadersKey, signedHeadersStr) } rawQuery := strings.Replace(query.Encode(), "+", "%20", -1) canonicalURI := v4Internal.GetURIPath(req.URL) if !s.DisableURIPathEscaping { canonicalURI = httpbinding.EscapePath(canonicalURI, false) } canonicalString := s.buildCanonicalString( req.Method, canonicalURI, rawQuery, signedHeadersStr, canonicalHeaderStr, ) strToSign := s.buildStringToSign(credentialScope, canonicalString) signingSignature, err := s.buildSignature(strToSign) if err != nil { return signedRequest{}, err } if s.IsPreSign { rawQuery += "&X-Amz-Signature=" + signingSignature } else { headers[authorizationHeader] = append(headers[authorizationHeader][:0], buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature)) } req.URL.RawQuery = rawQuery return signedRequest{ Request: req, SignedHeaders: signedHeaders, CanonicalString: canonicalString, StringToSign: strToSign, PreSigned: s.IsPreSign, }, nil } func buildAuthorizationHeader(credentialStr, signedHeadersStr, signingSignature string) string { const credential = "Credential=" const signedHeaders = "SignedHeaders=" const signature = "Signature=" const commaSpace = ", " var parts strings.Builder parts.Grow(len(signingAlgorithm) + 1 + len(credential) + len(credentialStr) + len(commaSpace) + len(signedHeaders) + len(signedHeadersStr) + len(commaSpace) + len(signature) + len(signingSignature), ) parts.WriteString(signingAlgorithm) parts.WriteRune(' ') parts.WriteString(credential) parts.WriteString(credentialStr) parts.WriteString(commaSpace) parts.WriteString(signedHeaders) parts.WriteString(signedHeadersStr) parts.WriteString(commaSpace) parts.WriteString(signature) parts.WriteString(signingSignature) return parts.String() } func (s *httpSigner) buildCredentialScope() string { return strings.Join([]string{ s.Time.Format(shortTimeFormat), s.ServiceName, "aws4_request", }, "/") } func buildQuery(r v4Internal.Rule, header http.Header) (url.Values, http.Header) { query := url.Values{} unsignedHeaders := http.Header{} for k, h := range header { if r.IsValid(k) { query[k] = h } else { unsignedHeaders[k] = h } } return query, unsignedHeaders } func (s *httpSigner) buildCanonicalHeaders(host string, rule v4Internal.Rule, header http.Header, length int64) (signed http.Header, signedHeaders, canonicalHeadersStr string) { signed = make(http.Header) var headers []string const hostHeader = "host" headers = append(headers, hostHeader) signed[hostHeader] = append(signed[hostHeader], host) if length > 0 { const contentLengthHeader = "content-length" headers = append(headers, contentLengthHeader) signed[contentLengthHeader] = append(signed[contentLengthHeader], strconv.FormatInt(length, 10)) } for k, v := range header { if !rule.IsValid(k) { continue // ignored header } lowerCaseKey := strings.ToLower(k) if _, ok := signed[lowerCaseKey]; ok { // include additional values signed[lowerCaseKey] = append(signed[lowerCaseKey], v...) continue } headers = append(headers, lowerCaseKey) signed[lowerCaseKey] = v } sort.Strings(headers) signedHeaders = strings.Join(headers, ";") var canonicalHeaders strings.Builder n := len(headers) const colon = ':' for i := 0; i < n; i++ { if headers[i] == hostHeader { canonicalHeaders.WriteString(hostHeader) canonicalHeaders.WriteRune(colon) canonicalHeaders.WriteString(v4Internal.StripExcessSpaces(host)) } else { canonicalHeaders.WriteString(headers[i]) canonicalHeaders.WriteRune(colon) // Trim out leading, trailing, and dedup inner spaces from signed header values. values := signed[headers[i]] for j, v := range values { cleanedValue := strings.TrimSpace(v4Internal.StripExcessSpaces(v)) canonicalHeaders.WriteString(cleanedValue) if j < len(values)-1 { canonicalHeaders.WriteRune(',') } } } canonicalHeaders.WriteRune('\n') } canonicalHeadersStr = canonicalHeaders.String() return signed, signedHeaders, canonicalHeadersStr } func (s *httpSigner) buildCanonicalString(method, uri, query, signedHeaders, canonicalHeaders string) string { return strings.Join([]string{ method, uri, query, canonicalHeaders, signedHeaders, s.PayloadHash, }, "\n") } func (s *httpSigner) buildStringToSign(credentialScope, canonicalRequestString string) string { return strings.Join([]string{ signingAlgorithm, s.Time.Format(timeFormat), credentialScope, hex.EncodeToString(makeHash(sha256.New(), []byte(canonicalRequestString))), }, "\n") } func makeHash(hash hash.Hash, b []byte) []byte { hash.Reset() hash.Write(b) return hash.Sum(nil) } func (s *httpSigner) buildSignature(strToSign string) (string, error) { sig, err := s.Credentials.PrivateKey.Sign(rand.Reader, makeHash(sha256.New(), []byte(strToSign)), crypto.SHA256) if err != nil { return "", err } return hex.EncodeToString(sig), nil } const logSignInfoMsg = `Request Signature: ---[ CANONICAL STRING ]----------------------------- %s ---[ STRING TO SIGN ]-------------------------------- %s%s -----------------------------------------------------` const logSignedURLMsg = ` ---[ SIGNED URL ]------------------------------------ %s` func logHTTPSigningInfo(ctx context.Context, options SignerOptions, r signedRequest) { if !options.LogSigning { return } signedURLMsg := "" if r.PreSigned { signedURLMsg = fmt.Sprintf(logSignedURLMsg, r.Request.URL.String()) } logger := logging.WithContext(ctx, options.Logger) logger.Logf(logging.Debug, logSignInfoMsg, r.CanonicalString, r.StringToSign, signedURLMsg) } type signedRequest struct { Request *http.Request SignedHeaders http.Header CanonicalString string StringToSign string PreSigned bool } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/CHANGELOG.md ================================================ # v1.44.0 (2025-04-30) * **Feature**: Adds dualstack support for Amazon Elastic Container Registry (Amazon ECR). # v1.43.3 (2025-04-10) * No change notes available for this release. # v1.43.2 (2025-04-03) * No change notes available for this release. # v1.43.1 (2025-04-02) * **Documentation**: Fix for customer issues related to AWS account ID and size limitation for token. # v1.43.0 (2025-03-11) * **Feature**: This release adds Amazon ECR to Amazon ECR pull through cache rules support. # v1.42.1 (2025-03-04.2) * **Bug Fix**: Add assurance test for operation order. # v1.42.0 (2025-02-27) * **Feature**: Track credential providers via User-Agent Feature ids * **Dependency Update**: Updated to the latest SDK module versions # v1.41.1 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.41.0 (2025-02-07) * **Feature**: Adds support to handle the new basic scanning daily quota. # v1.40.3 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.40.2 (2025-02-04) * No change notes available for this release. # v1.40.1 (2025-01-31) * **Dependency Update**: Switch to code-generated waiter matchers, removing the dependency on go-jmespath. * **Dependency Update**: Updated to the latest SDK module versions # v1.40.0 (2025-01-30) * **Feature**: Temporarily updating dualstack endpoint support * **Dependency Update**: Updated to the latest SDK module versions # v1.39.0 (2025-01-29) * **Feature**: Add support for Dualstack and Dualstack-with-FIPS Endpoints # v1.38.7 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.38.6 (2025-01-17) * **Bug Fix**: Fix bug where credentials weren't refreshed during retry loop. # v1.38.5 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.38.4 (2025-01-14) * **Bug Fix**: Fix issue where waiters were not failing on unmatched errors as they should. This may have breaking behavioral changes for users in fringe cases. See [this announcement](https://github.com/aws/aws-sdk-go-v2/discussions/2954) for more information. # v1.38.3 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.38.2 (2025-01-08) * No change notes available for this release. # v1.38.1 (2025-01-03) * No change notes available for this release. # v1.38.0 (2024-12-28) * **Feature**: Restoring custom endpoint functionality for ECR # v1.37.0 (2024-12-26) * **Feature**: Add support for Dualstack Endpoints # v1.36.9 (2024-12-23) * **Documentation**: Documentation update for ECR GetAccountSetting and PutAccountSetting APIs. # v1.36.8 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.36.7 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.36.6 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.36.5 (2024-11-07) * **Bug Fix**: Adds case-insensitive handling of error message fields in service responses # v1.36.4 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.36.3 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.36.2 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.36.1 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.36.0 (2024-10-04) * **Feature**: Add support for HTTP client metrics. * **Dependency Update**: Updated to the latest SDK module versions # v1.35.4 (2024-10-03) * No change notes available for this release. # v1.35.3 (2024-09-27) * No change notes available for this release. # v1.35.2 (2024-09-25) * No change notes available for this release. # v1.35.1 (2024-09-23) * No change notes available for this release. # v1.35.0 (2024-09-20) * **Feature**: Add tracing and metrics support to service clients. * **Dependency Update**: Updated to the latest SDK module versions # v1.34.0 (2024-09-17) * **Feature**: The `DescribeImageScanning` API now includes `fixAvailable`, `exploitAvailable`, and `fixedInVersion` fields to provide more detailed information about the availability of fixes, exploits, and fixed versions for identified image vulnerabilities. * **Bug Fix**: **BREAKFIX**: Only generate AccountIDEndpointMode config for services that use it. This is a compiler break, but removes no actual functionality, as no services currently use the account ID in endpoint resolution. # v1.33.0 (2024-09-11) * **Feature**: Added KMS_DSSE to EncryptionType # v1.32.4 (2024-09-04) * No change notes available for this release. # v1.32.3 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.32.2 (2024-08-22) * No change notes available for this release. # v1.32.1 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.32.0 (2024-08-05) * **Feature**: Released two new APIs along with documentation updates. The GetAccountSetting API is used to view the current basic scan type version setting for your registry, while the PutAccountSetting API is used to update the basic scan type version for your registry. # v1.31.0 (2024-07-25) * **Feature**: API and documentation updates for Amazon ECR, adding support for creating, updating, describing and deleting ECR Repository Creation Template. # v1.30.3 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.30.2 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.30.1 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.30.0 (2024-06-26) * **Feature**: Support list-of-string endpoint parameter. # v1.29.1 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.0 (2024-06-18) * **Feature**: Track usage of various AWS SDK features in user-agent string. * **Dependency Update**: Updated to the latest SDK module versions # v1.28.6 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.5 (2024-06-07) * **Bug Fix**: Add clock skew correction on all service clients * **Dependency Update**: Updated to the latest SDK module versions # v1.28.4 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.3 (2024-05-23) * No change notes available for this release. # v1.28.2 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.1 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.28.0 (2024-05-08) * **Feature**: This release adds pull through cache rules support for GitLab container registry in Amazon ECR. * **Bug Fix**: GoDoc improvement # v1.27.4 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.3 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.2 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.27.1 (2024-02-23) * **Bug Fix**: Move all common, SDK-side middleware stack ops into the service client module to prevent cross-module compatibility issues in the future. * **Dependency Update**: Updated to the latest SDK module versions # v1.27.0 (2024-02-22) * **Feature**: Add middleware stack snapshot tests. # v1.26.2 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.1 (2024-02-20) * **Bug Fix**: When sourcing values for a service's `EndpointParameters`, the lack of a configured region (i.e. `options.Region == ""`) will now translate to a `nil` value for `EndpointParameters.Region` instead of a pointer to the empty string `""`. This will result in a much more explicit error when calling an operation instead of an obscure hostname lookup failure. # v1.26.0 (2024-02-16) * **Feature**: Add new ClientOptions field to waiter config which allows you to extend the config for operation calls made by waiters. # v1.25.1 (2024-02-15) * **Bug Fix**: Correct failure to determine the error type in awsJson services that could occur when errors were modeled with a non-string `code` field. # v1.25.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.24.7 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.24.6 (2023-12-20) * No change notes available for this release. # v1.24.5 (2023-12-08) * **Bug Fix**: Reinstate presence of default Retryer in functional options, but still respect max attempts set therein. # v1.24.4 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.24.3 (2023-12-06) * **Bug Fix**: Restore pre-refactor auth behavior where all operations could technically be performed anonymously. # v1.24.2 (2023-12-01) * **Bug Fix**: Correct wrapping of errors in authentication workflow. * **Bug Fix**: Correctly recognize cache-wrapped instances of AnonymousCredentials at client construction. * **Dependency Update**: Updated to the latest SDK module versions # v1.24.1 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.24.0 (2023-11-29) * **Feature**: Expose Options() accessor on service clients. * **Dependency Update**: Updated to the latest SDK module versions # v1.23.3 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.23.2 (2023-11-28) * **Bug Fix**: Respect setting RetryMaxAttempts in functional options at client construction. # v1.23.1 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.23.0 (2023-11-17) * **Feature**: Documentation and operational updates for Amazon ECR, adding support for pull through cache rules for upstream registries that require authentication. # v1.22.2 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.22.1 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.22.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. * **Dependency Update**: Updated to the latest SDK module versions # v1.21.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.20.2 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.20.1 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.20.0 (2023-09-11) * **Feature**: This release will have ValidationException be thrown from ECR LifecyclePolicy APIs in regions LifecyclePolicy is not supported, this includes existing Amazon Dedicated Cloud (ADC) regions. This release will also change Tag: TagValue and Tag: TagKey to required. # v1.19.5 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.19.4 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.19.3 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.19.2 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.19.1 (2023-08-01) * No change notes available for this release. # v1.19.0 (2023-07-31) * **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide. * **Dependency Update**: Updated to the latest SDK module versions # v1.18.15 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.14 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.13 (2023-06-15) * No change notes available for this release. # v1.18.12 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.11 (2023-05-04) * No change notes available for this release. # v1.18.10 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.9 (2023-04-10) * No change notes available for this release. # v1.18.8 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.7 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.6 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.5 (2023-02-22) * **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. # v1.18.4 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.3 (2023-02-15) * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. * **Bug Fix**: Correct error type parsing for restJson services. # v1.18.2 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.1 (2023-01-23) * No change notes available for this release. # v1.18.0 (2023-01-05) * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). # v1.17.25 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.24 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.23 (2022-11-22) * No change notes available for this release. # v1.17.22 (2022-11-16) * No change notes available for this release. # v1.17.21 (2022-11-10) * No change notes available for this release. # v1.17.20 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.19 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.18 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.17 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.16 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.15 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.14 (2022-08-30) * No change notes available for this release. # v1.17.13 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.12 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.11 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.10 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.9 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.8 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.7 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.6 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.5 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.4 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.0 (2022-03-21) * **Feature**: This release includes a fix in the DescribeImageScanFindings paginated output. # v1.16.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Feature**: Updated service client model to latest release. * **Dependency Update**: Updated to the latest SDK module versions # v1.15.0 (2022-02-24) * **Feature**: API client updated * **Feature**: Adds RetryMaxAttempts and RetryMod to API client Options. This allows the API clients' default Retryer to be configured from the shared configuration files or environment variables. Adding a new Retry mode of `Adaptive`. `Adaptive` retry mode is an experimental mode, adding client rate limiting when throttles reponses are received from an API. See [retry.AdaptiveMode](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AdaptiveMode) for more details, and configuration options. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.14.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.13.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2021-12-21) * **Feature**: API Paginators now support specifying the initial starting token, and support stopping on empty string tokens. * **Feature**: Updated to latest service endpoints # v1.11.1 (2021-12-02) * **Bug Fix**: Fixes a bug that prevented aws.EndpointResolverWithOptions from being used by the service client. ([#1514](https://github.com/aws/aws-sdk-go-v2/pull/1514)) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2021-11-30) * **Feature**: API client updated # v1.10.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2021-11-12) * **Feature**: Service clients now support custom endpoints that have an initial URI path defined. * **Feature**: Waiters now have a `WaitForOutput` method, which can be used to retrieve the output of the successful wait operation. Thank you to [Andrew Haines](https://github.com/haines) for contributing this feature. # v1.9.0 (2021-11-06) * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Feature**: Updated service to latest API model. * **Dependency Update**: Updated to the latest SDK module versions # v1.8.0 (2021-10-21) * **Feature**: API client updated * **Feature**: Updated to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.7.1 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.7.0 (2021-09-24) * **Feature**: API client updated # v1.6.0 (2021-09-17) * **Feature**: Updated API client and endpoints to latest revision. * **Dependency Update**: Updated to the latest SDK module versions # v1.5.0 (2021-08-27) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.3 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.2 (2021-08-04) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.4.1 (2021-07-15) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2021-05-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_client.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/defaults" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/retry" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" internalauth "github.com/aws/aws-sdk-go-v2/internal/auth" internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy" internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" internalmiddleware "github.com/aws/aws-sdk-go-v2/internal/middleware" smithy "github.com/aws/smithy-go" smithyauth "github.com/aws/smithy-go/auth" smithydocument "github.com/aws/smithy-go/document" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "net" "net/http" "sync/atomic" "time" ) const ServiceID = "ECR" const ServiceAPIVersion = "2015-09-21" type operationMetrics struct { Duration metrics.Float64Histogram SerializeDuration metrics.Float64Histogram ResolveIdentityDuration metrics.Float64Histogram ResolveEndpointDuration metrics.Float64Histogram SignRequestDuration metrics.Float64Histogram DeserializeDuration metrics.Float64Histogram } func (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram { switch name { case "client.call.duration": return m.Duration case "client.call.serialization_duration": return m.SerializeDuration case "client.call.resolve_identity_duration": return m.ResolveIdentityDuration case "client.call.resolve_endpoint_duration": return m.ResolveEndpointDuration case "client.call.signing_duration": return m.SignRequestDuration case "client.call.deserialization_duration": return m.DeserializeDuration default: panic("unrecognized operation metric") } } func timeOperationMetric[T any]( ctx context.Context, metric string, fn func() (T, error), opts ...metrics.RecordMetricOption, ) (T, error) { instr := getOperationMetrics(ctx).histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) start := time.Now() v, err := fn() end := time.Now() elapsed := end.Sub(start) instr.Record(ctx, float64(elapsed)/1e9, opts...) return v, err } func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() { instr := getOperationMetrics(ctx).histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) var ended bool start := time.Now() return func() { if ended { return } ended = true end := time.Now() elapsed := end.Sub(start) instr.Record(ctx, float64(elapsed)/1e9, opts...) } } func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { return func(o *metrics.RecordMetricOptions) { o.Properties.Set("rpc.service", middleware.GetServiceID(ctx)) o.Properties.Set("rpc.method", middleware.GetOperationName(ctx)) } } type operationMetricsKey struct{} func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) { meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/ecr") om := &operationMetrics{} var err error om.Duration, err = operationMetricTimer(meter, "client.call.duration", "Overall call duration (including retries and time to send or receive request and response body)") if err != nil { return nil, err } om.SerializeDuration, err = operationMetricTimer(meter, "client.call.serialization_duration", "The time it takes to serialize a message body") if err != nil { return nil, err } om.ResolveIdentityDuration, err = operationMetricTimer(meter, "client.call.auth.resolve_identity_duration", "The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider") if err != nil { return nil, err } om.ResolveEndpointDuration, err = operationMetricTimer(meter, "client.call.resolve_endpoint_duration", "The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request") if err != nil { return nil, err } om.SignRequestDuration, err = operationMetricTimer(meter, "client.call.auth.signing_duration", "The time it takes to sign a request") if err != nil { return nil, err } om.DeserializeDuration, err = operationMetricTimer(meter, "client.call.deserialization_duration", "The time it takes to deserialize a message body") if err != nil { return nil, err } return context.WithValue(parent, operationMetricsKey{}, om), nil } func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) { return m.Float64Histogram(name, func(o *metrics.InstrumentOptions) { o.UnitLabel = "s" o.Description = desc }) } func getOperationMetrics(ctx context.Context) *operationMetrics { return ctx.Value(operationMetricsKey{}).(*operationMetrics) } func operationTracer(p tracing.TracerProvider) tracing.Tracer { return p.Tracer("github.com/aws/aws-sdk-go-v2/service/ecr") } // Client provides the API client to make operations call for Amazon Elastic // Container Registry. type Client struct { options Options // Difference between the time reported by the server and the client timeOffset *atomic.Int64 } // New returns an initialized Client based on the functional options. Provide // additional functional options to further configure the behavior of the client, // such as changing the client's endpoint or adding custom middleware behavior. func New(options Options, optFns ...func(*Options)) *Client { options = options.Copy() resolveDefaultLogger(&options) setResolvedDefaultsMode(&options) resolveRetryer(&options) resolveHTTPClient(&options) resolveHTTPSignerV4(&options) resolveEndpointResolverV2(&options) resolveTracerProvider(&options) resolveMeterProvider(&options) resolveAuthSchemeResolver(&options) for _, fn := range optFns { fn(&options) } finalizeRetryMaxAttempts(&options) ignoreAnonymousAuth(&options) wrapWithAnonymousAuth(&options) resolveAuthSchemes(&options) client := &Client{ options: options, } initializeTimeOffsetResolver(client) return client } // Options returns a copy of the client configuration. // // Callers SHOULD NOT perform mutations on any inner structures within client // config. Config overrides should instead be made on a per-operation basis through // functional options. func (c *Client) Options() Options { return c.options.Copy() } func (c *Client) invokeOperation( ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error, ) ( result interface{}, metadata middleware.Metadata, err error, ) { ctx = middleware.ClearStackValues(ctx) ctx = middleware.WithServiceID(ctx, ServiceID) ctx = middleware.WithOperationName(ctx, opID) stack := middleware.NewStack(opID, smithyhttp.NewStackRequest) options := c.options.Copy() for _, fn := range optFns { fn(&options) } finalizeOperationRetryMaxAttempts(&options, *c) finalizeClientEndpointResolverOptions(&options) for _, fn := range stackFns { if err := fn(stack, options); err != nil { return nil, metadata, err } } for _, fn := range options.APIOptions { if err := fn(stack); err != nil { return nil, metadata, err } } ctx, err = withOperationMetrics(ctx, options.MeterProvider) if err != nil { return nil, metadata, err } tracer := operationTracer(options.TracerProvider) spanName := fmt.Sprintf("%s.%s", ServiceID, opID) ctx = tracing.WithOperationTracer(ctx, tracer) ctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) { o.Kind = tracing.SpanKindClient o.Properties.Set("rpc.system", "aws-api") o.Properties.Set("rpc.method", opID) o.Properties.Set("rpc.service", ServiceID) }) endTimer := startMetricTimer(ctx, "client.call.duration") defer endTimer() defer span.End() handler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) { o.Meter = options.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/ecr") }) decorated := middleware.DecorateHandler(handler, stack) result, metadata, err = decorated.Handle(ctx, params) if err != nil { span.SetProperty("exception.type", fmt.Sprintf("%T", err)) span.SetProperty("exception.message", err.Error()) var aerr smithy.APIError if errors.As(err, &aerr) { span.SetProperty("api.error_code", aerr.ErrorCode()) span.SetProperty("api.error_message", aerr.ErrorMessage()) span.SetProperty("api.error_fault", aerr.ErrorFault().String()) } err = &smithy.OperationError{ ServiceID: ServiceID, OperationName: opID, Err: err, } } span.SetProperty("error", err != nil) if err == nil { span.SetStatus(tracing.SpanStatusOK) } else { span.SetStatus(tracing.SpanStatusError) } return result, metadata, err } type operationInputKey struct{} func setOperationInput(ctx context.Context, input interface{}) context.Context { return middleware.WithStackValue(ctx, operationInputKey{}, input) } func getOperationInput(ctx context.Context) interface{} { return middleware.GetStackValue(ctx, operationInputKey{}) } type setOperationInputMiddleware struct { } func (*setOperationInputMiddleware) ID() string { return "setOperationInput" } func (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { ctx = setOperationInput(ctx, in.Parameters) return next.HandleSerialize(ctx, in) } func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error { if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil { return fmt.Errorf("add ResolveAuthScheme: %w", err) } if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil { return fmt.Errorf("add GetIdentity: %v", err) } if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil { return fmt.Errorf("add ResolveEndpointV2: %v", err) } if err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, "ResolveEndpointV2", middleware.After); err != nil { return fmt.Errorf("add Signing: %w", err) } return nil } func resolveAuthSchemeResolver(options *Options) { if options.AuthSchemeResolver == nil { options.AuthSchemeResolver = &defaultAuthSchemeResolver{} } } func resolveAuthSchemes(options *Options) { if options.AuthSchemes == nil { options.AuthSchemes = []smithyhttp.AuthScheme{ internalauth.NewHTTPAuthScheme("aws.auth#sigv4", &internalauthsmithy.V4SignerAdapter{ Signer: options.HTTPSignerV4, Logger: options.Logger, LogSigning: options.ClientLogMode.IsSigning(), }), } } } type noSmithyDocumentSerde = smithydocument.NoSerde type legacyEndpointContextSetter struct { LegacyResolver EndpointResolver } func (*legacyEndpointContextSetter) ID() string { return "legacyEndpointContextSetter" } func (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { if m.LegacyResolver != nil { ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true) } return next.HandleInitialize(ctx, in) } func addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error { return stack.Initialize.Add(&legacyEndpointContextSetter{ LegacyResolver: o.EndpointResolver, }, middleware.Before) } func resolveDefaultLogger(o *Options) { if o.Logger != nil { return } o.Logger = logging.Nop{} } func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error { return middleware.AddSetLoggerMiddleware(stack, o.Logger) } func setResolvedDefaultsMode(o *Options) { if len(o.resolvedDefaultsMode) > 0 { return } var mode aws.DefaultsMode mode.SetFromString(string(o.DefaultsMode)) if mode == aws.DefaultsModeAuto { mode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment) } o.resolvedDefaultsMode = mode } // NewFromConfig returns a new client from the provided config. func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client { opts := Options{ Region: cfg.Region, DefaultsMode: cfg.DefaultsMode, RuntimeEnvironment: cfg.RuntimeEnvironment, HTTPClient: cfg.HTTPClient, Credentials: cfg.Credentials, APIOptions: cfg.APIOptions, Logger: cfg.Logger, ClientLogMode: cfg.ClientLogMode, AppID: cfg.AppID, } resolveAWSRetryerProvider(cfg, &opts) resolveAWSRetryMaxAttempts(cfg, &opts) resolveAWSRetryMode(cfg, &opts) resolveAWSEndpointResolver(cfg, &opts) resolveUseDualStackEndpoint(cfg, &opts) resolveUseFIPSEndpoint(cfg, &opts) resolveBaseEndpoint(cfg, &opts) return New(opts, optFns...) } func resolveHTTPClient(o *Options) { var buildable *awshttp.BuildableClient if o.HTTPClient != nil { var ok bool buildable, ok = o.HTTPClient.(*awshttp.BuildableClient) if !ok { return } } else { buildable = awshttp.NewBuildableClient() } modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode) if err == nil { buildable = buildable.WithDialerOptions(func(dialer *net.Dialer) { if dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok { dialer.Timeout = dialerTimeout } }) buildable = buildable.WithTransportOptions(func(transport *http.Transport) { if tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok { transport.TLSHandshakeTimeout = tlsHandshakeTimeout } }) } o.HTTPClient = buildable } func resolveRetryer(o *Options) { if o.Retryer != nil { return } if len(o.RetryMode) == 0 { modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode) if err == nil { o.RetryMode = modeConfig.RetryMode } } if len(o.RetryMode) == 0 { o.RetryMode = aws.RetryModeStandard } var standardOptions []func(*retry.StandardOptions) if v := o.RetryMaxAttempts; v != 0 { standardOptions = append(standardOptions, func(so *retry.StandardOptions) { so.MaxAttempts = v }) } switch o.RetryMode { case aws.RetryModeAdaptive: var adaptiveOptions []func(*retry.AdaptiveModeOptions) if len(standardOptions) != 0 { adaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) { ao.StandardOptions = append(ao.StandardOptions, standardOptions...) }) } o.Retryer = retry.NewAdaptiveMode(adaptiveOptions...) default: o.Retryer = retry.NewStandard(standardOptions...) } } func resolveAWSRetryerProvider(cfg aws.Config, o *Options) { if cfg.Retryer == nil { return } o.Retryer = cfg.Retryer() } func resolveAWSRetryMode(cfg aws.Config, o *Options) { if len(cfg.RetryMode) == 0 { return } o.RetryMode = cfg.RetryMode } func resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) { if cfg.RetryMaxAttempts == 0 { return } o.RetryMaxAttempts = cfg.RetryMaxAttempts } func finalizeRetryMaxAttempts(o *Options) { if o.RetryMaxAttempts == 0 { return } o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts) } func finalizeOperationRetryMaxAttempts(o *Options, client Client) { if v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts { return } o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts) } func resolveAWSEndpointResolver(cfg aws.Config, o *Options) { if cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil { return } o.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions) } func addClientUserAgent(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, "ecr", goModuleVersion) if len(options.AppID) > 0 { ua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID) } return nil } func getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) { id := (*awsmiddleware.RequestUserAgent)(nil).ID() mw, ok := stack.Build.Get(id) if !ok { mw = awsmiddleware.NewRequestUserAgent() if err := stack.Build.Add(mw, middleware.After); err != nil { return nil, err } } ua, ok := mw.(*awsmiddleware.RequestUserAgent) if !ok { return nil, fmt.Errorf("%T for %s middleware did not match expected type", mw, id) } return ua, nil } type HTTPSignerV4 interface { SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error } func resolveHTTPSignerV4(o *Options) { if o.HTTPSignerV4 != nil { return } o.HTTPSignerV4 = newDefaultV4Signer(*o) } func newDefaultV4Signer(o Options) *v4.Signer { return v4.NewSigner(func(so *v4.SignerOptions) { so.Logger = o.Logger so.LogSigning = o.ClientLogMode.IsSigning() }) } func addClientRequestID(stack *middleware.Stack) error { return stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After) } func addComputeContentLength(stack *middleware.Stack) error { return stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After) } func addRawResponseToMetadata(stack *middleware.Stack) error { return stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before) } func addRecordResponseTiming(stack *middleware.Stack) error { return stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After) } func addSpanRetryLoop(stack *middleware.Stack, options Options) error { return stack.Finalize.Insert(&spanRetryLoop{options: options}, "Retry", middleware.Before) } type spanRetryLoop struct { options Options } func (*spanRetryLoop) ID() string { return "spanRetryLoop" } func (m *spanRetryLoop) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( middleware.FinalizeOutput, middleware.Metadata, error, ) { tracer := operationTracer(m.options.TracerProvider) ctx, span := tracer.StartSpan(ctx, "RetryLoop") defer span.End() return next.HandleFinalize(ctx, in) } func addStreamingEventsPayload(stack *middleware.Stack) error { return stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before) } func addUnsignedPayload(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.UnsignedPayload{}, "ResolveEndpointV2", middleware.After) } func addComputePayloadSHA256(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, "ResolveEndpointV2", middleware.After) } func addContentSHA256Header(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After) } func addIsWaiterUserAgent(o *Options) { o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter) return nil }) } func addIsPaginatorUserAgent(o *Options) { o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator) return nil }) } func addRetry(stack *middleware.Stack, o Options) error { attempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) { m.LogAttempts = o.ClientLogMode.IsRetries() m.OperationMeter = o.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/ecr") }) if err := stack.Finalize.Insert(attempt, "ResolveAuthScheme", middleware.Before); err != nil { return err } if err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil { return err } return nil } // resolves dual-stack endpoint configuration func resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error { if len(cfg.ConfigSources) == 0 { return nil } value, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources) if err != nil { return err } if found { o.EndpointOptions.UseDualStackEndpoint = value } return nil } // resolves FIPS endpoint configuration func resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error { if len(cfg.ConfigSources) == 0 { return nil } value, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources) if err != nil { return err } if found { o.EndpointOptions.UseFIPSEndpoint = value } return nil } func resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string { if mode == aws.AccountIDEndpointModeDisabled { return nil } if ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != "" { return aws.String(ca.Credentials.AccountID) } return nil } func addTimeOffsetBuild(stack *middleware.Stack, c *Client) error { mw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset} if err := stack.Build.Add(&mw, middleware.After); err != nil { return err } return stack.Deserialize.Insert(&mw, "RecordResponseTiming", middleware.Before) } func initializeTimeOffsetResolver(c *Client) { c.timeOffset = new(atomic.Int64) } func addUserAgentRetryMode(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } switch options.Retryer.(type) { case *retry.Standard: ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard) case *retry.AdaptiveMode: ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive) } return nil } type setCredentialSourceMiddleware struct { ua *awsmiddleware.RequestUserAgent options Options } func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" } func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource) if !ok { return next.HandleBuild(ctx, in) } providerSources := asProviderSource.ProviderSources() for _, source := range providerSources { m.ua.AddCredentialsSource(source) } return next.HandleBuild(ctx, in) } func addCredentialSource(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } mw := setCredentialSourceMiddleware{ua: ua, options: options} return stack.Build.Insert(&mw, "UserAgent", middleware.Before) } func resolveTracerProvider(options *Options) { if options.TracerProvider == nil { options.TracerProvider = &tracing.NopTracerProvider{} } } func resolveMeterProvider(options *Options) { if options.MeterProvider == nil { options.MeterProvider = metrics.NopMeterProvider{} } } func addRecursionDetection(stack *middleware.Stack) error { return stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After) } func addRequestIDRetrieverMiddleware(stack *middleware.Stack) error { return stack.Deserialize.Insert(&awsmiddleware.RequestIDRetriever{}, "OperationDeserializer", middleware.Before) } func addResponseErrorMiddleware(stack *middleware.Stack) error { return stack.Deserialize.Insert(&awshttp.ResponseErrorWrapper{}, "RequestIDRetriever", middleware.Before) } func addRequestResponseLogging(stack *middleware.Stack, o Options) error { return stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{ LogRequest: o.ClientLogMode.IsRequest(), LogRequestWithBody: o.ClientLogMode.IsRequestWithBody(), LogResponse: o.ClientLogMode.IsResponse(), LogResponseWithBody: o.ClientLogMode.IsResponseWithBody(), }, middleware.After) } type disableHTTPSMiddleware struct { DisableHTTPS bool } func (*disableHTTPSMiddleware) ID() string { return "disableHTTPS" } func (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) { req.URL.Scheme = "http" } return next.HandleFinalize(ctx, in) } func addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error { return stack.Finalize.Insert(&disableHTTPSMiddleware{ DisableHTTPS: o.EndpointOptions.DisableHTTPS, }, "ResolveEndpointV2", middleware.After) } type spanInitializeStart struct { } func (*spanInitializeStart) ID() string { return "spanInitializeStart" } func (m *spanInitializeStart) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( middleware.InitializeOutput, middleware.Metadata, error, ) { ctx, _ = tracing.StartSpan(ctx, "Initialize") return next.HandleInitialize(ctx, in) } type spanInitializeEnd struct { } func (*spanInitializeEnd) ID() string { return "spanInitializeEnd" } func (m *spanInitializeEnd) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( middleware.InitializeOutput, middleware.Metadata, error, ) { ctx, span := tracing.PopSpan(ctx) span.End() return next.HandleInitialize(ctx, in) } type spanBuildRequestStart struct { } func (*spanBuildRequestStart) ID() string { return "spanBuildRequestStart" } func (m *spanBuildRequestStart) HandleSerialize( ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, ) ( middleware.SerializeOutput, middleware.Metadata, error, ) { ctx, _ = tracing.StartSpan(ctx, "BuildRequest") return next.HandleSerialize(ctx, in) } type spanBuildRequestEnd struct { } func (*spanBuildRequestEnd) ID() string { return "spanBuildRequestEnd" } func (m *spanBuildRequestEnd) HandleBuild( ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, ) ( middleware.BuildOutput, middleware.Metadata, error, ) { ctx, span := tracing.PopSpan(ctx) span.End() return next.HandleBuild(ctx, in) } func addSpanInitializeStart(stack *middleware.Stack) error { return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before) } func addSpanInitializeEnd(stack *middleware.Stack) error { return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After) } func addSpanBuildRequestStart(stack *middleware.Stack) error { return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before) } func addSpanBuildRequestEnd(stack *middleware.Stack) error { return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchCheckLayerAvailability.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Checks the availability of one or more image layers in a repository. // // When an image is pushed to a repository, each image layer is checked to verify // if it has been uploaded before. If it has been uploaded, then the image layer is // skipped. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) BatchCheckLayerAvailability(ctx context.Context, params *BatchCheckLayerAvailabilityInput, optFns ...func(*Options)) (*BatchCheckLayerAvailabilityOutput, error) { if params == nil { params = &BatchCheckLayerAvailabilityInput{} } result, metadata, err := c.invokeOperation(ctx, "BatchCheckLayerAvailability", params, optFns, c.addOperationBatchCheckLayerAvailabilityMiddlewares) if err != nil { return nil, err } out := result.(*BatchCheckLayerAvailabilityOutput) out.ResultMetadata = metadata return out, nil } type BatchCheckLayerAvailabilityInput struct { // The digests of the image layers to check. // // This member is required. LayerDigests []string // The name of the repository that is associated with the image layers to check. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the image layers to check. If you do not specify a registry, the default // registry is assumed. RegistryId *string noSmithyDocumentSerde } type BatchCheckLayerAvailabilityOutput struct { // Any failures associated with the call. Failures []types.LayerFailure // A list of image layer objects corresponding to the image layer references in // the request. Layers []types.Layer // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationBatchCheckLayerAvailabilityMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchCheckLayerAvailability{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchCheckLayerAvailability{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "BatchCheckLayerAvailability"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpBatchCheckLayerAvailabilityValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchCheckLayerAvailability(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opBatchCheckLayerAvailability(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "BatchCheckLayerAvailability", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchDeleteImage.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes a list of specified images within a repository. Images are specified // with either an imageTag or imageDigest . // // You can remove a tag from an image by specifying the image's tag in your // request. When you remove the last tag from an image, the image is deleted from // your repository. // // You can completely delete an image (and all of its tags) by specifying the // image's digest in your request. func (c *Client) BatchDeleteImage(ctx context.Context, params *BatchDeleteImageInput, optFns ...func(*Options)) (*BatchDeleteImageOutput, error) { if params == nil { params = &BatchDeleteImageInput{} } result, metadata, err := c.invokeOperation(ctx, "BatchDeleteImage", params, optFns, c.addOperationBatchDeleteImageMiddlewares) if err != nil { return nil, err } out := result.(*BatchDeleteImageOutput) out.ResultMetadata = metadata return out, nil } // Deletes specified images within a specified repository. Images are specified // with either the imageTag or imageDigest . type BatchDeleteImageInput struct { // A list of image ID references that correspond to images to delete. The format // of the imageIds reference is imageTag=tag or imageDigest=digest . // // This member is required. ImageIds []types.ImageIdentifier // The repository that contains the image to delete. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the image to delete. If you do not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type BatchDeleteImageOutput struct { // Any failures associated with the call. Failures []types.ImageFailure // The image IDs of the deleted images. ImageIds []types.ImageIdentifier // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationBatchDeleteImageMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchDeleteImage{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchDeleteImage{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "BatchDeleteImage"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpBatchDeleteImageValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchDeleteImage(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opBatchDeleteImage(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "BatchDeleteImage", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetImage.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Gets detailed information for an image. Images are specified with either an // imageTag or imageDigest . // // When an image is pulled, the BatchGetImage API is called once to retrieve the // image manifest. func (c *Client) BatchGetImage(ctx context.Context, params *BatchGetImageInput, optFns ...func(*Options)) (*BatchGetImageOutput, error) { if params == nil { params = &BatchGetImageInput{} } result, metadata, err := c.invokeOperation(ctx, "BatchGetImage", params, optFns, c.addOperationBatchGetImageMiddlewares) if err != nil { return nil, err } out := result.(*BatchGetImageOutput) out.ResultMetadata = metadata return out, nil } type BatchGetImageInput struct { // A list of image ID references that correspond to images to describe. The format // of the imageIds reference is imageTag=tag or imageDigest=digest . // // This member is required. ImageIds []types.ImageIdentifier // The repository that contains the images to describe. // // This member is required. RepositoryName *string // The accepted media types for the request. // // Valid values: application/vnd.docker.distribution.manifest.v1+json | // application/vnd.docker.distribution.manifest.v2+json | // application/vnd.oci.image.manifest.v1+json AcceptedMediaTypes []string // The Amazon Web Services account ID associated with the registry that contains // the images to describe. If you do not specify a registry, the default registry // is assumed. RegistryId *string noSmithyDocumentSerde } type BatchGetImageOutput struct { // Any failures associated with the call. Failures []types.ImageFailure // A list of image objects corresponding to the image references in the request. Images []types.Image // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationBatchGetImageMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchGetImage{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchGetImage{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "BatchGetImage"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpBatchGetImageValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchGetImage(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opBatchGetImage(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "BatchGetImage", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_BatchGetRepositoryScanningConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Gets the scanning configuration for one or more repositories. func (c *Client) BatchGetRepositoryScanningConfiguration(ctx context.Context, params *BatchGetRepositoryScanningConfigurationInput, optFns ...func(*Options)) (*BatchGetRepositoryScanningConfigurationOutput, error) { if params == nil { params = &BatchGetRepositoryScanningConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "BatchGetRepositoryScanningConfiguration", params, optFns, c.addOperationBatchGetRepositoryScanningConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*BatchGetRepositoryScanningConfigurationOutput) out.ResultMetadata = metadata return out, nil } type BatchGetRepositoryScanningConfigurationInput struct { // One or more repository names to get the scanning configuration for. // // This member is required. RepositoryNames []string noSmithyDocumentSerde } type BatchGetRepositoryScanningConfigurationOutput struct { // Any failures associated with the call. Failures []types.RepositoryScanningConfigurationFailure // The scanning configuration for the requested repositories. ScanningConfigurations []types.RepositoryScanningConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationBatchGetRepositoryScanningConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchGetRepositoryScanningConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchGetRepositoryScanningConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "BatchGetRepositoryScanningConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpBatchGetRepositoryScanningConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchGetRepositoryScanningConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opBatchGetRepositoryScanningConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "BatchGetRepositoryScanningConfiguration", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CompleteLayerUpload.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Informs Amazon ECR that the image layer upload has completed for a specified // registry, repository name, and upload ID. You can optionally provide a sha256 // digest of the image layer for data validation purposes. // // When an image is pushed, the CompleteLayerUpload API is called once per each // new image layer to verify that the upload has completed. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) CompleteLayerUpload(ctx context.Context, params *CompleteLayerUploadInput, optFns ...func(*Options)) (*CompleteLayerUploadOutput, error) { if params == nil { params = &CompleteLayerUploadInput{} } result, metadata, err := c.invokeOperation(ctx, "CompleteLayerUpload", params, optFns, c.addOperationCompleteLayerUploadMiddlewares) if err != nil { return nil, err } out := result.(*CompleteLayerUploadOutput) out.ResultMetadata = metadata return out, nil } type CompleteLayerUploadInput struct { // The sha256 digest of the image layer. // // This member is required. LayerDigests []string // The name of the repository to associate with the image layer. // // This member is required. RepositoryName *string // The upload ID from a previous InitiateLayerUpload operation to associate with the image layer. // // This member is required. UploadId *string // The Amazon Web Services account ID associated with the registry to which to // upload layers. If you do not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type CompleteLayerUploadOutput struct { // The sha256 digest of the image layer. LayerDigest *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // The upload ID associated with the layer. UploadId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCompleteLayerUploadMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpCompleteLayerUpload{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCompleteLayerUpload{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CompleteLayerUpload"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCompleteLayerUploadValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCompleteLayerUpload(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opCompleteLayerUpload(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CompleteLayerUpload", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreatePullThroughCacheRule.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Creates a pull through cache rule. A pull through cache rule provides a way to // cache images from an upstream registry source in your Amazon ECR private // registry. For more information, see [Using pull through cache rules]in the Amazon Elastic Container Registry // User Guide. // // [Using pull through cache rules]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache.html func (c *Client) CreatePullThroughCacheRule(ctx context.Context, params *CreatePullThroughCacheRuleInput, optFns ...func(*Options)) (*CreatePullThroughCacheRuleOutput, error) { if params == nil { params = &CreatePullThroughCacheRuleInput{} } result, metadata, err := c.invokeOperation(ctx, "CreatePullThroughCacheRule", params, optFns, c.addOperationCreatePullThroughCacheRuleMiddlewares) if err != nil { return nil, err } out := result.(*CreatePullThroughCacheRuleOutput) out.ResultMetadata = metadata return out, nil } type CreatePullThroughCacheRuleInput struct { // The repository name prefix to use when caching images from the source registry. // // There is always an assumed / applied to the end of the prefix. If you specify // ecr-public as the prefix, Amazon ECR treats that as ecr-public/ . // // This member is required. EcrRepositoryPrefix *string // The registry URL of the upstream public registry to use as the source for the // pull through cache rule. The following is the syntax to use for each supported // upstream registry. // // - Amazon ECR ( ecr ) – dkr.ecr..amazonaws.com // // - Amazon ECR Public ( ecr-public ) – public.ecr.aws // // - Docker Hub ( docker-hub ) – registry-1.docker.io // // - GitHub Container Registry ( github-container-registry ) – ghcr.io // // - GitLab Container Registry ( gitlab-container-registry ) – // registry.gitlab.com // // - Kubernetes ( k8s ) – registry.k8s.io // // - Microsoft Azure Container Registry ( azure-container-registry ) – // .azurecr.io // // - Quay ( quay ) – quay.io // // This member is required. UpstreamRegistryUrl *string // The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager // secret that identifies the credentials to authenticate to the upstream registry. CredentialArn *string // Amazon Resource Name (ARN) of the IAM role to be assumed by Amazon ECR to // authenticate to the ECR upstream registry. This role must be in the same account // as the registry that you are configuring. CustomRoleArn *string // The Amazon Web Services account ID associated with the registry to create the // pull through cache rule for. If you do not specify a registry, the default // registry is assumed. RegistryId *string // The name of the upstream registry. UpstreamRegistry types.UpstreamRegistry // The repository name prefix of the upstream registry to match with the upstream // repository name. When this field isn't specified, Amazon ECR will use the ROOT . UpstreamRepositoryPrefix *string noSmithyDocumentSerde } type CreatePullThroughCacheRuleOutput struct { // The date and time, in JavaScript date format, when the pull through cache rule // was created. CreatedAt *time.Time // The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager // secret associated with the pull through cache rule. CredentialArn *string // The ARN of the IAM role associated with the pull through cache rule. CustomRoleArn *string // The Amazon ECR repository prefix associated with the pull through cache rule. EcrRepositoryPrefix *string // The registry ID associated with the request. RegistryId *string // The name of the upstream registry associated with the pull through cache rule. UpstreamRegistry types.UpstreamRegistry // The upstream registry URL associated with the pull through cache rule. UpstreamRegistryUrl *string // The upstream repository prefix associated with the pull through cache rule. UpstreamRepositoryPrefix *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCreatePullThroughCacheRuleMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpCreatePullThroughCacheRule{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreatePullThroughCacheRule{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CreatePullThroughCacheRule"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCreatePullThroughCacheRuleValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreatePullThroughCacheRule(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opCreatePullThroughCacheRule(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CreatePullThroughCacheRule", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreateRepository.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates a repository. For more information, see [Amazon ECR repositories] in the Amazon Elastic // Container Registry User Guide. // // [Amazon ECR repositories]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html func (c *Client) CreateRepository(ctx context.Context, params *CreateRepositoryInput, optFns ...func(*Options)) (*CreateRepositoryOutput, error) { if params == nil { params = &CreateRepositoryInput{} } result, metadata, err := c.invokeOperation(ctx, "CreateRepository", params, optFns, c.addOperationCreateRepositoryMiddlewares) if err != nil { return nil, err } out := result.(*CreateRepositoryOutput) out.ResultMetadata = metadata return out, nil } type CreateRepositoryInput struct { // The name to use for the repository. The repository name may be specified on its // own (such as nginx-web-app ) or it can be prepended with a namespace to group // the repository into a category (such as project-a/nginx-web-app ). // // The repository name must start with a letter and can only contain lowercase // letters, numbers, hyphens, underscores, and forward slashes. // // This member is required. RepositoryName *string // The encryption configuration for the repository. This determines how the // contents of your repository are encrypted at rest. EncryptionConfiguration *types.EncryptionConfiguration // The image scanning configuration for the repository. This determines whether // images are scanned for known vulnerabilities after being pushed to the // repository. ImageScanningConfiguration *types.ImageScanningConfiguration // The tag mutability setting for the repository. If this parameter is omitted, // the default setting of MUTABLE will be used which will allow image tags to be // overwritten. If IMMUTABLE is specified, all image tags within the repository // will be immutable which will prevent them from being overwritten. ImageTagMutability types.ImageTagMutability // The Amazon Web Services account ID associated with the registry to create the // repository. If you do not specify a registry, the default registry is assumed. RegistryId *string // The metadata that you apply to the repository to help you categorize and // organize them. Each tag consists of a key and an optional value, both of which // you define. Tag keys can have a maximum character length of 128 characters, and // tag values can have a maximum length of 256 characters. Tags []types.Tag noSmithyDocumentSerde } type CreateRepositoryOutput struct { // The repository that was created. Repository *types.Repository // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCreateRepositoryMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpCreateRepository{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreateRepository{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CreateRepository"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCreateRepositoryValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateRepository(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opCreateRepository(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CreateRepository", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_CreateRepositoryCreationTemplate.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates a repository creation template. This template is used to define the // settings for repositories created by Amazon ECR on your behalf. For example, // repositories created through pull through cache actions. For more information, // see [Private repository creation templates]in the Amazon Elastic Container Registry User Guide. // // [Private repository creation templates]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-creation-templates.html func (c *Client) CreateRepositoryCreationTemplate(ctx context.Context, params *CreateRepositoryCreationTemplateInput, optFns ...func(*Options)) (*CreateRepositoryCreationTemplateOutput, error) { if params == nil { params = &CreateRepositoryCreationTemplateInput{} } result, metadata, err := c.invokeOperation(ctx, "CreateRepositoryCreationTemplate", params, optFns, c.addOperationCreateRepositoryCreationTemplateMiddlewares) if err != nil { return nil, err } out := result.(*CreateRepositoryCreationTemplateOutput) out.ResultMetadata = metadata return out, nil } type CreateRepositoryCreationTemplateInput struct { // A list of enumerable strings representing the Amazon ECR repository creation // scenarios that this template will apply towards. The two supported scenarios are // PULL_THROUGH_CACHE and REPLICATION // // This member is required. AppliedFor []types.RCTAppliedFor // The repository namespace prefix to associate with the template. All // repositories created using this namespace prefix will have the settings defined // in this template applied. For example, a prefix of prod would apply to all // repositories beginning with prod/ . Similarly, a prefix of prod/team would // apply to all repositories beginning with prod/team/ . // // To apply a template to all repositories in your registry that don't have an // associated creation template, you can use ROOT as the prefix. // // There is always an assumed / applied to the end of the prefix. If you specify // ecr-public as the prefix, Amazon ECR treats that as ecr-public/ . When using a // pull through cache rule, the repository prefix you specify during rule creation // is what you should specify as your repository creation template prefix as well. // // This member is required. Prefix *string // The ARN of the role to be assumed by Amazon ECR. This role must be in the same // account as the registry that you are configuring. Amazon ECR will assume your // supplied role when the customRoleArn is specified. When this field isn't // specified, Amazon ECR will use the service-linked role for the repository // creation template. CustomRoleArn *string // A description for the repository creation template. Description *string // The encryption configuration to use for repositories created using the template. EncryptionConfiguration *types.EncryptionConfigurationForRepositoryCreationTemplate // The tag mutability setting for the repository. If this parameter is omitted, // the default setting of MUTABLE will be used which will allow image tags to be // overwritten. If IMMUTABLE is specified, all image tags within the repository // will be immutable which will prevent them from being overwritten. ImageTagMutability types.ImageTagMutability // The lifecycle policy to use for repositories created using the template. LifecyclePolicy *string // The repository policy to apply to repositories created using the template. A // repository policy is a permissions policy associated with a repository to // control access permissions. RepositoryPolicy *string // The metadata to apply to the repository to help you categorize and organize. // Each tag consists of a key and an optional value, both of which you define. Tag // keys can have a maximum character length of 128 characters, and tag values can // have a maximum length of 256 characters. ResourceTags []types.Tag noSmithyDocumentSerde } type CreateRepositoryCreationTemplateOutput struct { // The registry ID associated with the request. RegistryId *string // The details of the repository creation template associated with the request. RepositoryCreationTemplate *types.RepositoryCreationTemplate // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCreateRepositoryCreationTemplateMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpCreateRepositoryCreationTemplate{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreateRepositoryCreationTemplate{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CreateRepositoryCreationTemplate"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCreateRepositoryCreationTemplateValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateRepositoryCreationTemplate(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opCreateRepositoryCreationTemplate(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CreateRepositoryCreationTemplate", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteLifecyclePolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Deletes the lifecycle policy associated with the specified repository. func (c *Client) DeleteLifecyclePolicy(ctx context.Context, params *DeleteLifecyclePolicyInput, optFns ...func(*Options)) (*DeleteLifecyclePolicyOutput, error) { if params == nil { params = &DeleteLifecyclePolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteLifecyclePolicy", params, optFns, c.addOperationDeleteLifecyclePolicyMiddlewares) if err != nil { return nil, err } out := result.(*DeleteLifecyclePolicyOutput) out.ResultMetadata = metadata return out, nil } type DeleteLifecyclePolicyInput struct { // The name of the repository. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the repository. If you do not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type DeleteLifecyclePolicyOutput struct { // The time stamp of the last time that the lifecycle policy was run. LastEvaluatedAt *time.Time // The JSON lifecycle policy text. LifecyclePolicyText *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteLifecyclePolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteLifecyclePolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteLifecyclePolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteLifecyclePolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteLifecyclePolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteLifecyclePolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDeleteLifecyclePolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteLifecyclePolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeletePullThroughCacheRule.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Deletes a pull through cache rule. func (c *Client) DeletePullThroughCacheRule(ctx context.Context, params *DeletePullThroughCacheRuleInput, optFns ...func(*Options)) (*DeletePullThroughCacheRuleOutput, error) { if params == nil { params = &DeletePullThroughCacheRuleInput{} } result, metadata, err := c.invokeOperation(ctx, "DeletePullThroughCacheRule", params, optFns, c.addOperationDeletePullThroughCacheRuleMiddlewares) if err != nil { return nil, err } out := result.(*DeletePullThroughCacheRuleOutput) out.ResultMetadata = metadata return out, nil } type DeletePullThroughCacheRuleInput struct { // The Amazon ECR repository prefix associated with the pull through cache rule to // delete. // // This member is required. EcrRepositoryPrefix *string // The Amazon Web Services account ID associated with the registry that contains // the pull through cache rule. If you do not specify a registry, the default // registry is assumed. RegistryId *string noSmithyDocumentSerde } type DeletePullThroughCacheRuleOutput struct { // The timestamp associated with the pull through cache rule. CreatedAt *time.Time // The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager // secret associated with the pull through cache rule. CredentialArn *string // The ARN of the IAM role associated with the pull through cache rule. CustomRoleArn *string // The Amazon ECR repository prefix associated with the request. EcrRepositoryPrefix *string // The registry ID associated with the request. RegistryId *string // The upstream registry URL associated with the pull through cache rule. UpstreamRegistryUrl *string // The upstream repository prefix associated with the pull through cache rule. UpstreamRepositoryPrefix *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeletePullThroughCacheRuleMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDeletePullThroughCacheRule{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeletePullThroughCacheRule{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeletePullThroughCacheRule"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeletePullThroughCacheRuleValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeletePullThroughCacheRule(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDeletePullThroughCacheRule(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeletePullThroughCacheRule", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRegistryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes the registry permissions policy. func (c *Client) DeleteRegistryPolicy(ctx context.Context, params *DeleteRegistryPolicyInput, optFns ...func(*Options)) (*DeleteRegistryPolicyOutput, error) { if params == nil { params = &DeleteRegistryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteRegistryPolicy", params, optFns, c.addOperationDeleteRegistryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*DeleteRegistryPolicyOutput) out.ResultMetadata = metadata return out, nil } type DeleteRegistryPolicyInput struct { noSmithyDocumentSerde } type DeleteRegistryPolicyOutput struct { // The contents of the registry permissions policy that was deleted. PolicyText *string // The registry ID associated with the request. RegistryId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteRegistryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRegistryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRegistryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteRegistryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRegistryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDeleteRegistryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteRegistryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepository.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes a repository. If the repository isn't empty, you must either delete the // contents of the repository or use the force option to delete the repository and // have Amazon ECR delete all of its contents on your behalf. func (c *Client) DeleteRepository(ctx context.Context, params *DeleteRepositoryInput, optFns ...func(*Options)) (*DeleteRepositoryOutput, error) { if params == nil { params = &DeleteRepositoryInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteRepository", params, optFns, c.addOperationDeleteRepositoryMiddlewares) if err != nil { return nil, err } out := result.(*DeleteRepositoryOutput) out.ResultMetadata = metadata return out, nil } type DeleteRepositoryInput struct { // The name of the repository to delete. // // This member is required. RepositoryName *string // If true, deleting the repository force deletes the contents of the repository. // If false, the repository must be empty before attempting to delete it. Force bool // The Amazon Web Services account ID associated with the registry that contains // the repository to delete. If you do not specify a registry, the default registry // is assumed. RegistryId *string noSmithyDocumentSerde } type DeleteRepositoryOutput struct { // The repository that was deleted. Repository *types.Repository // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteRepositoryMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepository{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepository{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteRepository"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteRepositoryValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepository(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDeleteRepository(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteRepository", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepositoryCreationTemplate.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes a repository creation template. func (c *Client) DeleteRepositoryCreationTemplate(ctx context.Context, params *DeleteRepositoryCreationTemplateInput, optFns ...func(*Options)) (*DeleteRepositoryCreationTemplateOutput, error) { if params == nil { params = &DeleteRepositoryCreationTemplateInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteRepositoryCreationTemplate", params, optFns, c.addOperationDeleteRepositoryCreationTemplateMiddlewares) if err != nil { return nil, err } out := result.(*DeleteRepositoryCreationTemplateOutput) out.ResultMetadata = metadata return out, nil } type DeleteRepositoryCreationTemplateInput struct { // The repository namespace prefix associated with the repository creation // template. // // This member is required. Prefix *string noSmithyDocumentSerde } type DeleteRepositoryCreationTemplateOutput struct { // The registry ID associated with the request. RegistryId *string // The details of the repository creation template that was deleted. RepositoryCreationTemplate *types.RepositoryCreationTemplate // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteRepositoryCreationTemplateMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepositoryCreationTemplate{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepositoryCreationTemplate{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteRepositoryCreationTemplate"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteRepositoryCreationTemplateValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepositoryCreationTemplate(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDeleteRepositoryCreationTemplate(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteRepositoryCreationTemplate", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DeleteRepositoryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes the repository policy associated with the specified repository. func (c *Client) DeleteRepositoryPolicy(ctx context.Context, params *DeleteRepositoryPolicyInput, optFns ...func(*Options)) (*DeleteRepositoryPolicyOutput, error) { if params == nil { params = &DeleteRepositoryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteRepositoryPolicy", params, optFns, c.addOperationDeleteRepositoryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*DeleteRepositoryPolicyOutput) out.ResultMetadata = metadata return out, nil } type DeleteRepositoryPolicyInput struct { // The name of the repository that is associated with the repository policy to // delete. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the repository policy to delete. If you do not specify a registry, the default // registry is assumed. RegistryId *string noSmithyDocumentSerde } type DeleteRepositoryPolicyOutput struct { // The JSON repository policy that was deleted from the repository. PolicyText *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepositoryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepositoryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteRepositoryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteRepositoryPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDeleteRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteRepositoryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageReplicationStatus.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns the replication status for a specified image. func (c *Client) DescribeImageReplicationStatus(ctx context.Context, params *DescribeImageReplicationStatusInput, optFns ...func(*Options)) (*DescribeImageReplicationStatusOutput, error) { if params == nil { params = &DescribeImageReplicationStatusInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeImageReplicationStatus", params, optFns, c.addOperationDescribeImageReplicationStatusMiddlewares) if err != nil { return nil, err } out := result.(*DescribeImageReplicationStatusOutput) out.ResultMetadata = metadata return out, nil } type DescribeImageReplicationStatusInput struct { // An object with identifying information for an image in an Amazon ECR repository. // // This member is required. ImageId *types.ImageIdentifier // The name of the repository that the image is in. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry. If you do not // specify a registry, the default registry is assumed. RegistryId *string noSmithyDocumentSerde } type DescribeImageReplicationStatusOutput struct { // An object with identifying information for an image in an Amazon ECR repository. ImageId *types.ImageIdentifier // The replication status details for the images in the specified repository. ReplicationStatuses []types.ImageReplicationStatus // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeImageReplicationStatusMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImageReplicationStatus{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImageReplicationStatus{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeImageReplicationStatus"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDescribeImageReplicationStatusValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageReplicationStatus(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDescribeImageReplicationStatus(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeImageReplicationStatus", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImageScanFindings.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithytime "github.com/aws/smithy-go/time" smithyhttp "github.com/aws/smithy-go/transport/http" smithywaiter "github.com/aws/smithy-go/waiter" "time" ) // Returns the scan findings for the specified image. func (c *Client) DescribeImageScanFindings(ctx context.Context, params *DescribeImageScanFindingsInput, optFns ...func(*Options)) (*DescribeImageScanFindingsOutput, error) { if params == nil { params = &DescribeImageScanFindingsInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeImageScanFindings", params, optFns, c.addOperationDescribeImageScanFindingsMiddlewares) if err != nil { return nil, err } out := result.(*DescribeImageScanFindingsOutput) out.ResultMetadata = metadata return out, nil } type DescribeImageScanFindingsInput struct { // An object with identifying information for an image in an Amazon ECR repository. // // This member is required. ImageId *types.ImageIdentifier // The repository for the image for which to describe the scan findings. // // This member is required. RepositoryName *string // The maximum number of image scan results returned by DescribeImageScanFindings // in paginated output. When this parameter is used, DescribeImageScanFindings // only returns maxResults results in a single page along with a nextToken // response element. The remaining results of the initial request can be seen by // sending another DescribeImageScanFindings request with the returned nextToken // value. This value can be between 1 and 1000. If this parameter is not used, then // DescribeImageScanFindings returns up to 100 results and a nextToken value, if // applicable. MaxResults *int32 // The nextToken value returned from a previous paginated DescribeImageScanFindings // request where maxResults was used and the results exceeded the value of that // parameter. Pagination continues from the end of the previous results that // returned the nextToken value. This value is null when there are no more results // to return. NextToken *string // The Amazon Web Services account ID associated with the registry that contains // the repository in which to describe the image scan findings for. If you do not // specify a registry, the default registry is assumed. RegistryId *string noSmithyDocumentSerde } type DescribeImageScanFindingsOutput struct { // An object with identifying information for an image in an Amazon ECR repository. ImageId *types.ImageIdentifier // The information contained in the image scan findings. ImageScanFindings *types.ImageScanFindings // The current state of the scan. ImageScanStatus *types.ImageScanStatus // The nextToken value to include in a future DescribeImageScanFindings request. // When the results of a DescribeImageScanFindings request exceed maxResults , this // value can be used to retrieve the next page of results. This value is null when // there are no more results to return. NextToken *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeImageScanFindingsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImageScanFindings{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImageScanFindings{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeImageScanFindings"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDescribeImageScanFindingsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageScanFindings(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // ImageScanCompleteWaiterOptions are waiter options for ImageScanCompleteWaiter type ImageScanCompleteWaiterOptions struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation call to // modify this list for per operation behavior. // // Passing options here is functionally equivalent to passing values to this // config's ClientOptions field that extend the inner client's APIOptions directly. APIOptions []func(*middleware.Stack) error // Functional options to be passed to all operations invoked by this client. // // Function values that modify the inner APIOptions are applied after the waiter // config's own APIOptions modifiers. ClientOptions []func(*Options) // MinDelay is the minimum amount of time to delay between retries. If unset, // ImageScanCompleteWaiter will use default minimum delay of 5 seconds. Note that // MinDelay must resolve to a value lesser than or equal to the MaxDelay. MinDelay time.Duration // MaxDelay is the maximum amount of time to delay between retries. If unset or // set to zero, ImageScanCompleteWaiter will use default max delay of 120 seconds. // Note that MaxDelay must resolve to value greater than or equal to the MinDelay. MaxDelay time.Duration // LogWaitAttempts is used to enable logging for waiter retry attempts LogWaitAttempts bool // Retryable is function that can be used to override the service defined // waiter-behavior based on operation output, or returned error. This function is // used by the waiter to decide if a state is retryable or a terminal state. // // By default service-modeled logic will populate this option. This option can // thus be used to define a custom waiter state with fall-back to service-modeled // waiter state mutators.The function returns an error in case of a failure state. // In case of retry state, this function returns a bool value of true and nil // error, while in case of success it returns a bool value of false and nil error. Retryable func(context.Context, *DescribeImageScanFindingsInput, *DescribeImageScanFindingsOutput, error) (bool, error) } // ImageScanCompleteWaiter defines the waiters for ImageScanComplete type ImageScanCompleteWaiter struct { client DescribeImageScanFindingsAPIClient options ImageScanCompleteWaiterOptions } // NewImageScanCompleteWaiter constructs a ImageScanCompleteWaiter. func NewImageScanCompleteWaiter(client DescribeImageScanFindingsAPIClient, optFns ...func(*ImageScanCompleteWaiterOptions)) *ImageScanCompleteWaiter { options := ImageScanCompleteWaiterOptions{} options.MinDelay = 5 * time.Second options.MaxDelay = 120 * time.Second options.Retryable = imageScanCompleteStateRetryable for _, fn := range optFns { fn(&options) } return &ImageScanCompleteWaiter{ client: client, options: options, } } // Wait calls the waiter function for ImageScanComplete waiter. The maxWaitDur is // the maximum wait duration the waiter will wait. The maxWaitDur is required and // must be greater than zero. func (w *ImageScanCompleteWaiter) Wait(ctx context.Context, params *DescribeImageScanFindingsInput, maxWaitDur time.Duration, optFns ...func(*ImageScanCompleteWaiterOptions)) error { _, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...) return err } // WaitForOutput calls the waiter function for ImageScanComplete waiter and // returns the output of the successful operation. The maxWaitDur is the maximum // wait duration the waiter will wait. The maxWaitDur is required and must be // greater than zero. func (w *ImageScanCompleteWaiter) WaitForOutput(ctx context.Context, params *DescribeImageScanFindingsInput, maxWaitDur time.Duration, optFns ...func(*ImageScanCompleteWaiterOptions)) (*DescribeImageScanFindingsOutput, error) { if maxWaitDur <= 0 { return nil, fmt.Errorf("maximum wait time for waiter must be greater than zero") } options := w.options for _, fn := range optFns { fn(&options) } if options.MaxDelay <= 0 { options.MaxDelay = 120 * time.Second } if options.MinDelay > options.MaxDelay { return nil, fmt.Errorf("minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.", options.MinDelay, options.MaxDelay) } ctx, cancelFn := context.WithTimeout(ctx, maxWaitDur) defer cancelFn() logger := smithywaiter.Logger{} remainingTime := maxWaitDur var attempt int64 for { attempt++ apiOptions := options.APIOptions start := time.Now() if options.LogWaitAttempts { logger.Attempt = attempt apiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...) apiOptions = append(apiOptions, logger.AddLogger) } out, err := w.client.DescribeImageScanFindings(ctx, params, func(o *Options) { baseOpts := []func(*Options){ addIsWaiterUserAgent, } o.APIOptions = append(o.APIOptions, apiOptions...) for _, opt := range baseOpts { opt(o) } for _, opt := range options.ClientOptions { opt(o) } }) retryable, err := options.Retryable(ctx, params, out, err) if err != nil { return nil, err } if !retryable { return out, nil } remainingTime -= time.Since(start) if remainingTime < options.MinDelay || remainingTime <= 0 { break } // compute exponential backoff between waiter retries delay, err := smithywaiter.ComputeDelay( attempt, options.MinDelay, options.MaxDelay, remainingTime, ) if err != nil { return nil, fmt.Errorf("error computing waiter delay, %w", err) } remainingTime -= delay // sleep for the delay amount before invoking a request if err := smithytime.SleepWithContext(ctx, delay); err != nil { return nil, fmt.Errorf("request cancelled while waiting, %w", err) } } return nil, fmt.Errorf("exceeded max wait time for ImageScanComplete waiter") } func imageScanCompleteStateRetryable(ctx context.Context, input *DescribeImageScanFindingsInput, output *DescribeImageScanFindingsOutput, err error) (bool, error) { if err == nil { v1 := output.ImageScanStatus var v2 types.ScanStatus if v1 != nil { v3 := v1.Status v2 = v3 } expectedValue := "COMPLETE" var pathValue string pathValue = string(v2) if pathValue == expectedValue { return false, nil } } if err == nil { v1 := output.ImageScanStatus var v2 types.ScanStatus if v1 != nil { v3 := v1.Status v2 = v3 } expectedValue := "FAILED" var pathValue string pathValue = string(v2) if pathValue == expectedValue { return false, fmt.Errorf("waiter state transitioned to Failure") } } if err != nil { return false, err } return true, nil } // DescribeImageScanFindingsPaginatorOptions is the paginator options for // DescribeImageScanFindings type DescribeImageScanFindingsPaginatorOptions struct { // The maximum number of image scan results returned by DescribeImageScanFindings // in paginated output. When this parameter is used, DescribeImageScanFindings // only returns maxResults results in a single page along with a nextToken // response element. The remaining results of the initial request can be seen by // sending another DescribeImageScanFindings request with the returned nextToken // value. This value can be between 1 and 1000. If this parameter is not used, then // DescribeImageScanFindings returns up to 100 results and a nextToken value, if // applicable. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribeImageScanFindingsPaginator is a paginator for DescribeImageScanFindings type DescribeImageScanFindingsPaginator struct { options DescribeImageScanFindingsPaginatorOptions client DescribeImageScanFindingsAPIClient params *DescribeImageScanFindingsInput nextToken *string firstPage bool } // NewDescribeImageScanFindingsPaginator returns a new // DescribeImageScanFindingsPaginator func NewDescribeImageScanFindingsPaginator(client DescribeImageScanFindingsAPIClient, params *DescribeImageScanFindingsInput, optFns ...func(*DescribeImageScanFindingsPaginatorOptions)) *DescribeImageScanFindingsPaginator { if params == nil { params = &DescribeImageScanFindingsInput{} } options := DescribeImageScanFindingsPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribeImageScanFindingsPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribeImageScanFindingsPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribeImageScanFindings page. func (p *DescribeImageScanFindingsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImageScanFindingsOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribeImageScanFindings(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribeImageScanFindingsAPIClient is a client that implements the // DescribeImageScanFindings operation. type DescribeImageScanFindingsAPIClient interface { DescribeImageScanFindings(context.Context, *DescribeImageScanFindingsInput, ...func(*Options)) (*DescribeImageScanFindingsOutput, error) } var _ DescribeImageScanFindingsAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribeImageScanFindings(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeImageScanFindings", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeImages.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns metadata about the images in a repository. // // Beginning with Docker version 1.9, the Docker client compresses image layers // before pushing them to a V2 Docker registry. The output of the docker images // command shows the uncompressed image size, so it may return a larger image size // than the image sizes returned by DescribeImages. func (c *Client) DescribeImages(ctx context.Context, params *DescribeImagesInput, optFns ...func(*Options)) (*DescribeImagesOutput, error) { if params == nil { params = &DescribeImagesInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeImages", params, optFns, c.addOperationDescribeImagesMiddlewares) if err != nil { return nil, err } out := result.(*DescribeImagesOutput) out.ResultMetadata = metadata return out, nil } type DescribeImagesInput struct { // The repository that contains the images to describe. // // This member is required. RepositoryName *string // The filter key and value with which to filter your DescribeImages results. Filter *types.DescribeImagesFilter // The list of image IDs for the requested repository. ImageIds []types.ImageIdentifier // The maximum number of repository results returned by DescribeImages in // paginated output. When this parameter is used, DescribeImages only returns // maxResults results in a single page along with a nextToken response element. // The remaining results of the initial request can be seen by sending another // DescribeImages request with the returned nextToken value. This value can be // between 1 and 1000. If this parameter is not used, then DescribeImages returns // up to 100 results and a nextToken value, if applicable. This option cannot be // used when you specify images with imageIds . MaxResults *int32 // The nextToken value returned from a previous paginated DescribeImages request // where maxResults was used and the results exceeded the value of that parameter. // Pagination continues from the end of the previous results that returned the // nextToken value. This value is null when there are no more results to return. // This option cannot be used when you specify images with imageIds . NextToken *string // The Amazon Web Services account ID associated with the registry that contains // the repository in which to describe images. If you do not specify a registry, // the default registry is assumed. RegistryId *string noSmithyDocumentSerde } type DescribeImagesOutput struct { // A list of ImageDetail objects that contain data about the image. ImageDetails []types.ImageDetail // The nextToken value to include in a future DescribeImages request. When the // results of a DescribeImages request exceed maxResults , this value can be used // to retrieve the next page of results. This value is null when there are no more // results to return. NextToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeImagesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImages{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImages{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeImages"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDescribeImagesValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImages(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // DescribeImagesPaginatorOptions is the paginator options for DescribeImages type DescribeImagesPaginatorOptions struct { // The maximum number of repository results returned by DescribeImages in // paginated output. When this parameter is used, DescribeImages only returns // maxResults results in a single page along with a nextToken response element. // The remaining results of the initial request can be seen by sending another // DescribeImages request with the returned nextToken value. This value can be // between 1 and 1000. If this parameter is not used, then DescribeImages returns // up to 100 results and a nextToken value, if applicable. This option cannot be // used when you specify images with imageIds . Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribeImagesPaginator is a paginator for DescribeImages type DescribeImagesPaginator struct { options DescribeImagesPaginatorOptions client DescribeImagesAPIClient params *DescribeImagesInput nextToken *string firstPage bool } // NewDescribeImagesPaginator returns a new DescribeImagesPaginator func NewDescribeImagesPaginator(client DescribeImagesAPIClient, params *DescribeImagesInput, optFns ...func(*DescribeImagesPaginatorOptions)) *DescribeImagesPaginator { if params == nil { params = &DescribeImagesInput{} } options := DescribeImagesPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribeImagesPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribeImagesPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribeImages page. func (p *DescribeImagesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImagesOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribeImages(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribeImagesAPIClient is a client that implements the DescribeImages // operation. type DescribeImagesAPIClient interface { DescribeImages(context.Context, *DescribeImagesInput, ...func(*Options)) (*DescribeImagesOutput, error) } var _ DescribeImagesAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribeImages(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeImages", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribePullThroughCacheRules.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns the pull through cache rules for a registry. func (c *Client) DescribePullThroughCacheRules(ctx context.Context, params *DescribePullThroughCacheRulesInput, optFns ...func(*Options)) (*DescribePullThroughCacheRulesOutput, error) { if params == nil { params = &DescribePullThroughCacheRulesInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribePullThroughCacheRules", params, optFns, c.addOperationDescribePullThroughCacheRulesMiddlewares) if err != nil { return nil, err } out := result.(*DescribePullThroughCacheRulesOutput) out.ResultMetadata = metadata return out, nil } type DescribePullThroughCacheRulesInput struct { // The Amazon ECR repository prefixes associated with the pull through cache rules // to return. If no repository prefix value is specified, all pull through cache // rules are returned. EcrRepositoryPrefixes []string // The maximum number of pull through cache rules returned by // DescribePullThroughCacheRulesRequest in paginated output. When this parameter is // used, DescribePullThroughCacheRulesRequest only returns maxResults results in a // single page along with a nextToken response element. The remaining results of // the initial request can be seen by sending another // DescribePullThroughCacheRulesRequest request with the returned nextToken value. // This value can be between 1 and 1000. If this parameter is not used, then // DescribePullThroughCacheRulesRequest returns up to 100 results and a nextToken // value, if applicable. MaxResults *int32 // The nextToken value returned from a previous paginated // DescribePullThroughCacheRulesRequest request where maxResults was used and the // results exceeded the value of that parameter. Pagination continues from the end // of the previous results that returned the nextToken value. This value is null // when there are no more results to return. NextToken *string // The Amazon Web Services account ID associated with the registry to return the // pull through cache rules for. If you do not specify a registry, the default // registry is assumed. RegistryId *string noSmithyDocumentSerde } type DescribePullThroughCacheRulesOutput struct { // The nextToken value to include in a future DescribePullThroughCacheRulesRequest // request. When the results of a DescribePullThroughCacheRulesRequest request // exceed maxResults , this value can be used to retrieve the next page of results. // This value is null when there are no more results to return. NextToken *string // The details of the pull through cache rules. PullThroughCacheRules []types.PullThroughCacheRule // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribePullThroughCacheRulesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribePullThroughCacheRules{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribePullThroughCacheRules{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribePullThroughCacheRules"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribePullThroughCacheRules(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // DescribePullThroughCacheRulesPaginatorOptions is the paginator options for // DescribePullThroughCacheRules type DescribePullThroughCacheRulesPaginatorOptions struct { // The maximum number of pull through cache rules returned by // DescribePullThroughCacheRulesRequest in paginated output. When this parameter is // used, DescribePullThroughCacheRulesRequest only returns maxResults results in a // single page along with a nextToken response element. The remaining results of // the initial request can be seen by sending another // DescribePullThroughCacheRulesRequest request with the returned nextToken value. // This value can be between 1 and 1000. If this parameter is not used, then // DescribePullThroughCacheRulesRequest returns up to 100 results and a nextToken // value, if applicable. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribePullThroughCacheRulesPaginator is a paginator for // DescribePullThroughCacheRules type DescribePullThroughCacheRulesPaginator struct { options DescribePullThroughCacheRulesPaginatorOptions client DescribePullThroughCacheRulesAPIClient params *DescribePullThroughCacheRulesInput nextToken *string firstPage bool } // NewDescribePullThroughCacheRulesPaginator returns a new // DescribePullThroughCacheRulesPaginator func NewDescribePullThroughCacheRulesPaginator(client DescribePullThroughCacheRulesAPIClient, params *DescribePullThroughCacheRulesInput, optFns ...func(*DescribePullThroughCacheRulesPaginatorOptions)) *DescribePullThroughCacheRulesPaginator { if params == nil { params = &DescribePullThroughCacheRulesInput{} } options := DescribePullThroughCacheRulesPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribePullThroughCacheRulesPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribePullThroughCacheRulesPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribePullThroughCacheRules page. func (p *DescribePullThroughCacheRulesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribePullThroughCacheRulesOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribePullThroughCacheRules(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribePullThroughCacheRulesAPIClient is a client that implements the // DescribePullThroughCacheRules operation. type DescribePullThroughCacheRulesAPIClient interface { DescribePullThroughCacheRules(context.Context, *DescribePullThroughCacheRulesInput, ...func(*Options)) (*DescribePullThroughCacheRulesOutput, error) } var _ DescribePullThroughCacheRulesAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribePullThroughCacheRules(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribePullThroughCacheRules", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRegistry.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Describes the settings for a registry. The replication configuration for a // repository can be created or updated with the PutReplicationConfigurationAPI action. func (c *Client) DescribeRegistry(ctx context.Context, params *DescribeRegistryInput, optFns ...func(*Options)) (*DescribeRegistryOutput, error) { if params == nil { params = &DescribeRegistryInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeRegistry", params, optFns, c.addOperationDescribeRegistryMiddlewares) if err != nil { return nil, err } out := result.(*DescribeRegistryOutput) out.ResultMetadata = metadata return out, nil } type DescribeRegistryInput struct { noSmithyDocumentSerde } type DescribeRegistryOutput struct { // The registry ID associated with the request. RegistryId *string // The replication configuration for the registry. ReplicationConfiguration *types.ReplicationConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeRegistryMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRegistry{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRegistry{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeRegistry"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRegistry(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDescribeRegistry(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeRegistry", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRepositories.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Describes image repositories in a registry. func (c *Client) DescribeRepositories(ctx context.Context, params *DescribeRepositoriesInput, optFns ...func(*Options)) (*DescribeRepositoriesOutput, error) { if params == nil { params = &DescribeRepositoriesInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeRepositories", params, optFns, c.addOperationDescribeRepositoriesMiddlewares) if err != nil { return nil, err } out := result.(*DescribeRepositoriesOutput) out.ResultMetadata = metadata return out, nil } type DescribeRepositoriesInput struct { // The maximum number of repository results returned by DescribeRepositories in // paginated output. When this parameter is used, DescribeRepositories only // returns maxResults results in a single page along with a nextToken response // element. The remaining results of the initial request can be seen by sending // another DescribeRepositories request with the returned nextToken value. This // value can be between 1 and 1000. If this parameter is not used, then // DescribeRepositories returns up to 100 results and a nextToken value, if // applicable. This option cannot be used when you specify repositories with // repositoryNames . MaxResults *int32 // The nextToken value returned from a previous paginated DescribeRepositories // request where maxResults was used and the results exceeded the value of that // parameter. Pagination continues from the end of the previous results that // returned the nextToken value. This value is null when there are no more results // to return. This option cannot be used when you specify repositories with // repositoryNames . // // This token should be treated as an opaque identifier that is only used to // retrieve the next items in a list and not for other programmatic purposes. NextToken *string // The Amazon Web Services account ID associated with the registry that contains // the repositories to be described. If you do not specify a registry, the default // registry is assumed. RegistryId *string // A list of repositories to describe. If this parameter is omitted, then all // repositories in a registry are described. RepositoryNames []string noSmithyDocumentSerde } type DescribeRepositoriesOutput struct { // The nextToken value to include in a future DescribeRepositories request. When // the results of a DescribeRepositories request exceed maxResults , this value can // be used to retrieve the next page of results. This value is null when there are // no more results to return. NextToken *string // A list of repository objects corresponding to valid repositories. Repositories []types.Repository // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeRepositoriesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRepositories{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRepositories{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeRepositories"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRepositories(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // DescribeRepositoriesPaginatorOptions is the paginator options for // DescribeRepositories type DescribeRepositoriesPaginatorOptions struct { // The maximum number of repository results returned by DescribeRepositories in // paginated output. When this parameter is used, DescribeRepositories only // returns maxResults results in a single page along with a nextToken response // element. The remaining results of the initial request can be seen by sending // another DescribeRepositories request with the returned nextToken value. This // value can be between 1 and 1000. If this parameter is not used, then // DescribeRepositories returns up to 100 results and a nextToken value, if // applicable. This option cannot be used when you specify repositories with // repositoryNames . Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribeRepositoriesPaginator is a paginator for DescribeRepositories type DescribeRepositoriesPaginator struct { options DescribeRepositoriesPaginatorOptions client DescribeRepositoriesAPIClient params *DescribeRepositoriesInput nextToken *string firstPage bool } // NewDescribeRepositoriesPaginator returns a new DescribeRepositoriesPaginator func NewDescribeRepositoriesPaginator(client DescribeRepositoriesAPIClient, params *DescribeRepositoriesInput, optFns ...func(*DescribeRepositoriesPaginatorOptions)) *DescribeRepositoriesPaginator { if params == nil { params = &DescribeRepositoriesInput{} } options := DescribeRepositoriesPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribeRepositoriesPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribeRepositoriesPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribeRepositories page. func (p *DescribeRepositoriesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeRepositoriesOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribeRepositories(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribeRepositoriesAPIClient is a client that implements the // DescribeRepositories operation. type DescribeRepositoriesAPIClient interface { DescribeRepositories(context.Context, *DescribeRepositoriesInput, ...func(*Options)) (*DescribeRepositoriesOutput, error) } var _ DescribeRepositoriesAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribeRepositories(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeRepositories", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_DescribeRepositoryCreationTemplates.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns details about the repository creation templates in a registry. The // prefixes request parameter can be used to return the details for a specific // repository creation template. func (c *Client) DescribeRepositoryCreationTemplates(ctx context.Context, params *DescribeRepositoryCreationTemplatesInput, optFns ...func(*Options)) (*DescribeRepositoryCreationTemplatesOutput, error) { if params == nil { params = &DescribeRepositoryCreationTemplatesInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeRepositoryCreationTemplates", params, optFns, c.addOperationDescribeRepositoryCreationTemplatesMiddlewares) if err != nil { return nil, err } out := result.(*DescribeRepositoryCreationTemplatesOutput) out.ResultMetadata = metadata return out, nil } type DescribeRepositoryCreationTemplatesInput struct { // The maximum number of repository results returned by // DescribeRepositoryCreationTemplatesRequest in paginated output. When this // parameter is used, DescribeRepositoryCreationTemplatesRequest only returns // maxResults results in a single page along with a nextToken response element. // The remaining results of the initial request can be seen by sending another // DescribeRepositoryCreationTemplatesRequest request with the returned nextToken // value. This value can be between 1 and 1000. If this parameter is not used, then // DescribeRepositoryCreationTemplatesRequest returns up to 100 results and a // nextToken value, if applicable. MaxResults *int32 // The nextToken value returned from a previous paginated // DescribeRepositoryCreationTemplates request where maxResults was used and the // results exceeded the value of that parameter. Pagination continues from the end // of the previous results that returned the nextToken value. This value is null // when there are no more results to return. // // This token should be treated as an opaque identifier that is only used to // retrieve the next items in a list and not for other programmatic purposes. NextToken *string // The repository namespace prefixes associated with the repository creation // templates to describe. If this value is not specified, all repository creation // templates are returned. Prefixes []string noSmithyDocumentSerde } type DescribeRepositoryCreationTemplatesOutput struct { // The nextToken value to include in a future DescribeRepositoryCreationTemplates // request. When the results of a DescribeRepositoryCreationTemplates request // exceed maxResults , this value can be used to retrieve the next page of results. // This value is null when there are no more results to return. NextToken *string // The registry ID associated with the request. RegistryId *string // The details of the repository creation templates. RepositoryCreationTemplates []types.RepositoryCreationTemplate // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeRepositoryCreationTemplatesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRepositoryCreationTemplates{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRepositoryCreationTemplates{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeRepositoryCreationTemplates"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRepositoryCreationTemplates(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // DescribeRepositoryCreationTemplatesPaginatorOptions is the paginator options // for DescribeRepositoryCreationTemplates type DescribeRepositoryCreationTemplatesPaginatorOptions struct { // The maximum number of repository results returned by // DescribeRepositoryCreationTemplatesRequest in paginated output. When this // parameter is used, DescribeRepositoryCreationTemplatesRequest only returns // maxResults results in a single page along with a nextToken response element. // The remaining results of the initial request can be seen by sending another // DescribeRepositoryCreationTemplatesRequest request with the returned nextToken // value. This value can be between 1 and 1000. If this parameter is not used, then // DescribeRepositoryCreationTemplatesRequest returns up to 100 results and a // nextToken value, if applicable. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribeRepositoryCreationTemplatesPaginator is a paginator for // DescribeRepositoryCreationTemplates type DescribeRepositoryCreationTemplatesPaginator struct { options DescribeRepositoryCreationTemplatesPaginatorOptions client DescribeRepositoryCreationTemplatesAPIClient params *DescribeRepositoryCreationTemplatesInput nextToken *string firstPage bool } // NewDescribeRepositoryCreationTemplatesPaginator returns a new // DescribeRepositoryCreationTemplatesPaginator func NewDescribeRepositoryCreationTemplatesPaginator(client DescribeRepositoryCreationTemplatesAPIClient, params *DescribeRepositoryCreationTemplatesInput, optFns ...func(*DescribeRepositoryCreationTemplatesPaginatorOptions)) *DescribeRepositoryCreationTemplatesPaginator { if params == nil { params = &DescribeRepositoryCreationTemplatesInput{} } options := DescribeRepositoryCreationTemplatesPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribeRepositoryCreationTemplatesPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribeRepositoryCreationTemplatesPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribeRepositoryCreationTemplates page. func (p *DescribeRepositoryCreationTemplatesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeRepositoryCreationTemplatesOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribeRepositoryCreationTemplates(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribeRepositoryCreationTemplatesAPIClient is a client that implements the // DescribeRepositoryCreationTemplates operation. type DescribeRepositoryCreationTemplatesAPIClient interface { DescribeRepositoryCreationTemplates(context.Context, *DescribeRepositoryCreationTemplatesInput, ...func(*Options)) (*DescribeRepositoryCreationTemplatesOutput, error) } var _ DescribeRepositoryCreationTemplatesAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribeRepositoryCreationTemplates(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeRepositoryCreationTemplates", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetAccountSetting.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves the account setting value for the specified setting name. func (c *Client) GetAccountSetting(ctx context.Context, params *GetAccountSettingInput, optFns ...func(*Options)) (*GetAccountSettingOutput, error) { if params == nil { params = &GetAccountSettingInput{} } result, metadata, err := c.invokeOperation(ctx, "GetAccountSetting", params, optFns, c.addOperationGetAccountSettingMiddlewares) if err != nil { return nil, err } out := result.(*GetAccountSettingOutput) out.ResultMetadata = metadata return out, nil } type GetAccountSettingInput struct { // The name of the account setting, such as BASIC_SCAN_TYPE_VERSION or // REGISTRY_POLICY_SCOPE . // // This member is required. Name *string noSmithyDocumentSerde } type GetAccountSettingOutput struct { // Retrieves the name of the account setting. Name *string // The setting value for the setting name. The following are valid values for the // basic scan type being used: AWS_NATIVE or CLAIR . The following are valid values // for the registry policy scope being used: V1 or V2 . Value *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetAccountSettingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetAccountSetting{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetAccountSetting{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetAccountSetting"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetAccountSettingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAccountSetting(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetAccountSetting(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetAccountSetting", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetAuthorizationToken.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves an authorization token. An authorization token represents your IAM // authentication credentials and can be used to access any Amazon ECR registry // that your IAM principal has access to. The authorization token is valid for 12 // hours. // // The authorizationToken returned is a base64 encoded string that can be decoded // and used in a docker login command to authenticate to a registry. The CLI // offers an get-login-password command that simplifies the login process. For // more information, see [Registry authentication]in the Amazon Elastic Container Registry User Guide. // // [Registry authentication]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth func (c *Client) GetAuthorizationToken(ctx context.Context, params *GetAuthorizationTokenInput, optFns ...func(*Options)) (*GetAuthorizationTokenOutput, error) { if params == nil { params = &GetAuthorizationTokenInput{} } result, metadata, err := c.invokeOperation(ctx, "GetAuthorizationToken", params, optFns, c.addOperationGetAuthorizationTokenMiddlewares) if err != nil { return nil, err } out := result.(*GetAuthorizationTokenOutput) out.ResultMetadata = metadata return out, nil } type GetAuthorizationTokenInput struct { // A list of Amazon Web Services account IDs that are associated with the // registries for which to get AuthorizationData objects. If you do not specify a // registry, the default registry is assumed. // // Deprecated: This field is deprecated. The returned authorization token can be // used to access any Amazon ECR registry that the IAM principal has access to, // specifying a registry ID doesn't change the permissions scope of the // authorization token. RegistryIds []string noSmithyDocumentSerde } type GetAuthorizationTokenOutput struct { // A list of authorization token data objects that correspond to the registryIds // values in the request. AuthorizationData []types.AuthorizationData // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetAuthorizationTokenMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetAuthorizationToken{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetAuthorizationToken{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetAuthorizationToken"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAuthorizationToken(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetAuthorizationToken(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetAuthorizationToken", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetDownloadUrlForLayer.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves the pre-signed Amazon S3 download URL corresponding to an image // layer. You can only get URLs for image layers that are referenced in an image. // // When an image is pulled, the GetDownloadUrlForLayer API is called once per // image layer that is not already cached. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) GetDownloadUrlForLayer(ctx context.Context, params *GetDownloadUrlForLayerInput, optFns ...func(*Options)) (*GetDownloadUrlForLayerOutput, error) { if params == nil { params = &GetDownloadUrlForLayerInput{} } result, metadata, err := c.invokeOperation(ctx, "GetDownloadUrlForLayer", params, optFns, c.addOperationGetDownloadUrlForLayerMiddlewares) if err != nil { return nil, err } out := result.(*GetDownloadUrlForLayerOutput) out.ResultMetadata = metadata return out, nil } type GetDownloadUrlForLayerInput struct { // The digest of the image layer to download. // // This member is required. LayerDigest *string // The name of the repository that is associated with the image layer to download. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the image layer to download. If you do not specify a registry, the default // registry is assumed. RegistryId *string noSmithyDocumentSerde } type GetDownloadUrlForLayerOutput struct { // The pre-signed Amazon S3 download URL for the requested layer. DownloadUrl *string // The digest of the image layer to download. LayerDigest *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetDownloadUrlForLayerMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetDownloadUrlForLayer{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetDownloadUrlForLayer{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetDownloadUrlForLayer"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetDownloadUrlForLayerValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetDownloadUrlForLayer(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetDownloadUrlForLayer(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetDownloadUrlForLayer", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Retrieves the lifecycle policy for the specified repository. func (c *Client) GetLifecyclePolicy(ctx context.Context, params *GetLifecyclePolicyInput, optFns ...func(*Options)) (*GetLifecyclePolicyOutput, error) { if params == nil { params = &GetLifecyclePolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "GetLifecyclePolicy", params, optFns, c.addOperationGetLifecyclePolicyMiddlewares) if err != nil { return nil, err } out := result.(*GetLifecyclePolicyOutput) out.ResultMetadata = metadata return out, nil } type GetLifecyclePolicyInput struct { // The name of the repository. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the repository. If you do not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type GetLifecyclePolicyOutput struct { // The time stamp of the last time that the lifecycle policy was run. LastEvaluatedAt *time.Time // The JSON lifecycle policy text. LifecyclePolicyText *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetLifecyclePolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetLifecyclePolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetLifecyclePolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetLifecyclePolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetLifecyclePolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetLifecyclePolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetLifecyclePolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetLifecyclePolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetLifecyclePolicyPreview.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithytime "github.com/aws/smithy-go/time" smithyhttp "github.com/aws/smithy-go/transport/http" smithywaiter "github.com/aws/smithy-go/waiter" "time" ) // Retrieves the results of the lifecycle policy preview request for the specified // repository. func (c *Client) GetLifecyclePolicyPreview(ctx context.Context, params *GetLifecyclePolicyPreviewInput, optFns ...func(*Options)) (*GetLifecyclePolicyPreviewOutput, error) { if params == nil { params = &GetLifecyclePolicyPreviewInput{} } result, metadata, err := c.invokeOperation(ctx, "GetLifecyclePolicyPreview", params, optFns, c.addOperationGetLifecyclePolicyPreviewMiddlewares) if err != nil { return nil, err } out := result.(*GetLifecyclePolicyPreviewOutput) out.ResultMetadata = metadata return out, nil } type GetLifecyclePolicyPreviewInput struct { // The name of the repository. // // This member is required. RepositoryName *string // An optional parameter that filters results based on image tag status and all // tags, if tagged. Filter *types.LifecyclePolicyPreviewFilter // The list of imageIDs to be included. ImageIds []types.ImageIdentifier // The maximum number of repository results returned by // GetLifecyclePolicyPreviewRequest in
 paginated output. When this parameter is // used, GetLifecyclePolicyPreviewRequest only returns
 maxResults results in a // single page along with a nextToken 
 response element. The remaining results of // the initial request can be seen by sending
 another // GetLifecyclePolicyPreviewRequest request with the returned nextToken 
 value. // This value can be between 1 and 1000. If this
 parameter is not used, then // GetLifecyclePolicyPreviewRequest returns up to
 100 results and a nextToken // value, if
 applicable. This option cannot be used when you specify images with // imageIds . MaxResults *int32 // The nextToken value returned from a previous paginated // GetLifecyclePolicyPreviewRequest request where maxResults was used and the // results exceeded the value of that parameter. Pagination continues from the end // of the
 previous results that returned the nextToken value. This value is
 null // when there are no more results to return. This option cannot be used when you // specify images with imageIds . NextToken *string // The Amazon Web Services account ID associated with the registry that contains // the repository. If you do not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type GetLifecyclePolicyPreviewOutput struct { // The JSON lifecycle policy text. LifecyclePolicyText *string // The nextToken value to include in a future GetLifecyclePolicyPreview request. // When the results of a GetLifecyclePolicyPreview request exceed maxResults , this // value can be used to retrieve the next page of results. This value is null when // there are no more results to return. NextToken *string // The results of the lifecycle policy preview request. PreviewResults []types.LifecyclePolicyPreviewResult // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // The status of the lifecycle policy preview request. Status types.LifecyclePolicyPreviewStatus // The list of images that is returned as a result of the action. Summary *types.LifecyclePolicyPreviewSummary // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetLifecyclePolicyPreviewMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetLifecyclePolicyPreview{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetLifecyclePolicyPreview{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetLifecyclePolicyPreview"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetLifecyclePolicyPreviewValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetLifecyclePolicyPreview(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // LifecyclePolicyPreviewCompleteWaiterOptions are waiter options for // LifecyclePolicyPreviewCompleteWaiter type LifecyclePolicyPreviewCompleteWaiterOptions struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation call to // modify this list for per operation behavior. // // Passing options here is functionally equivalent to passing values to this // config's ClientOptions field that extend the inner client's APIOptions directly. APIOptions []func(*middleware.Stack) error // Functional options to be passed to all operations invoked by this client. // // Function values that modify the inner APIOptions are applied after the waiter // config's own APIOptions modifiers. ClientOptions []func(*Options) // MinDelay is the minimum amount of time to delay between retries. If unset, // LifecyclePolicyPreviewCompleteWaiter will use default minimum delay of 5 // seconds. Note that MinDelay must resolve to a value lesser than or equal to the // MaxDelay. MinDelay time.Duration // MaxDelay is the maximum amount of time to delay between retries. If unset or // set to zero, LifecyclePolicyPreviewCompleteWaiter will use default max delay of // 120 seconds. Note that MaxDelay must resolve to value greater than or equal to // the MinDelay. MaxDelay time.Duration // LogWaitAttempts is used to enable logging for waiter retry attempts LogWaitAttempts bool // Retryable is function that can be used to override the service defined // waiter-behavior based on operation output, or returned error. This function is // used by the waiter to decide if a state is retryable or a terminal state. // // By default service-modeled logic will populate this option. This option can // thus be used to define a custom waiter state with fall-back to service-modeled // waiter state mutators.The function returns an error in case of a failure state. // In case of retry state, this function returns a bool value of true and nil // error, while in case of success it returns a bool value of false and nil error. Retryable func(context.Context, *GetLifecyclePolicyPreviewInput, *GetLifecyclePolicyPreviewOutput, error) (bool, error) } // LifecyclePolicyPreviewCompleteWaiter defines the waiters for // LifecyclePolicyPreviewComplete type LifecyclePolicyPreviewCompleteWaiter struct { client GetLifecyclePolicyPreviewAPIClient options LifecyclePolicyPreviewCompleteWaiterOptions } // NewLifecyclePolicyPreviewCompleteWaiter constructs a // LifecyclePolicyPreviewCompleteWaiter. func NewLifecyclePolicyPreviewCompleteWaiter(client GetLifecyclePolicyPreviewAPIClient, optFns ...func(*LifecyclePolicyPreviewCompleteWaiterOptions)) *LifecyclePolicyPreviewCompleteWaiter { options := LifecyclePolicyPreviewCompleteWaiterOptions{} options.MinDelay = 5 * time.Second options.MaxDelay = 120 * time.Second options.Retryable = lifecyclePolicyPreviewCompleteStateRetryable for _, fn := range optFns { fn(&options) } return &LifecyclePolicyPreviewCompleteWaiter{ client: client, options: options, } } // Wait calls the waiter function for LifecyclePolicyPreviewComplete waiter. The // maxWaitDur is the maximum wait duration the waiter will wait. The maxWaitDur is // required and must be greater than zero. func (w *LifecyclePolicyPreviewCompleteWaiter) Wait(ctx context.Context, params *GetLifecyclePolicyPreviewInput, maxWaitDur time.Duration, optFns ...func(*LifecyclePolicyPreviewCompleteWaiterOptions)) error { _, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...) return err } // WaitForOutput calls the waiter function for LifecyclePolicyPreviewComplete // waiter and returns the output of the successful operation. The maxWaitDur is the // maximum wait duration the waiter will wait. The maxWaitDur is required and must // be greater than zero. func (w *LifecyclePolicyPreviewCompleteWaiter) WaitForOutput(ctx context.Context, params *GetLifecyclePolicyPreviewInput, maxWaitDur time.Duration, optFns ...func(*LifecyclePolicyPreviewCompleteWaiterOptions)) (*GetLifecyclePolicyPreviewOutput, error) { if maxWaitDur <= 0 { return nil, fmt.Errorf("maximum wait time for waiter must be greater than zero") } options := w.options for _, fn := range optFns { fn(&options) } if options.MaxDelay <= 0 { options.MaxDelay = 120 * time.Second } if options.MinDelay > options.MaxDelay { return nil, fmt.Errorf("minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.", options.MinDelay, options.MaxDelay) } ctx, cancelFn := context.WithTimeout(ctx, maxWaitDur) defer cancelFn() logger := smithywaiter.Logger{} remainingTime := maxWaitDur var attempt int64 for { attempt++ apiOptions := options.APIOptions start := time.Now() if options.LogWaitAttempts { logger.Attempt = attempt apiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...) apiOptions = append(apiOptions, logger.AddLogger) } out, err := w.client.GetLifecyclePolicyPreview(ctx, params, func(o *Options) { baseOpts := []func(*Options){ addIsWaiterUserAgent, } o.APIOptions = append(o.APIOptions, apiOptions...) for _, opt := range baseOpts { opt(o) } for _, opt := range options.ClientOptions { opt(o) } }) retryable, err := options.Retryable(ctx, params, out, err) if err != nil { return nil, err } if !retryable { return out, nil } remainingTime -= time.Since(start) if remainingTime < options.MinDelay || remainingTime <= 0 { break } // compute exponential backoff between waiter retries delay, err := smithywaiter.ComputeDelay( attempt, options.MinDelay, options.MaxDelay, remainingTime, ) if err != nil { return nil, fmt.Errorf("error computing waiter delay, %w", err) } remainingTime -= delay // sleep for the delay amount before invoking a request if err := smithytime.SleepWithContext(ctx, delay); err != nil { return nil, fmt.Errorf("request cancelled while waiting, %w", err) } } return nil, fmt.Errorf("exceeded max wait time for LifecyclePolicyPreviewComplete waiter") } func lifecyclePolicyPreviewCompleteStateRetryable(ctx context.Context, input *GetLifecyclePolicyPreviewInput, output *GetLifecyclePolicyPreviewOutput, err error) (bool, error) { if err == nil { v1 := output.Status expectedValue := "COMPLETE" var pathValue string pathValue = string(v1) if pathValue == expectedValue { return false, nil } } if err == nil { v1 := output.Status expectedValue := "FAILED" var pathValue string pathValue = string(v1) if pathValue == expectedValue { return false, fmt.Errorf("waiter state transitioned to Failure") } } if err != nil { return false, err } return true, nil } // GetLifecyclePolicyPreviewPaginatorOptions is the paginator options for // GetLifecyclePolicyPreview type GetLifecyclePolicyPreviewPaginatorOptions struct { // The maximum number of repository results returned by // GetLifecyclePolicyPreviewRequest in
 paginated output. When this parameter is // used, GetLifecyclePolicyPreviewRequest only returns
 maxResults results in a // single page along with a nextToken 
 response element. The remaining results of // the initial request can be seen by sending
 another // GetLifecyclePolicyPreviewRequest request with the returned nextToken 
 value. // This value can be between 1 and 1000. If this
 parameter is not used, then // GetLifecyclePolicyPreviewRequest returns up to
 100 results and a nextToken // value, if
 applicable. This option cannot be used when you specify images with // imageIds . Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // GetLifecyclePolicyPreviewPaginator is a paginator for GetLifecyclePolicyPreview type GetLifecyclePolicyPreviewPaginator struct { options GetLifecyclePolicyPreviewPaginatorOptions client GetLifecyclePolicyPreviewAPIClient params *GetLifecyclePolicyPreviewInput nextToken *string firstPage bool } // NewGetLifecyclePolicyPreviewPaginator returns a new // GetLifecyclePolicyPreviewPaginator func NewGetLifecyclePolicyPreviewPaginator(client GetLifecyclePolicyPreviewAPIClient, params *GetLifecyclePolicyPreviewInput, optFns ...func(*GetLifecyclePolicyPreviewPaginatorOptions)) *GetLifecyclePolicyPreviewPaginator { if params == nil { params = &GetLifecyclePolicyPreviewInput{} } options := GetLifecyclePolicyPreviewPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &GetLifecyclePolicyPreviewPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *GetLifecyclePolicyPreviewPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next GetLifecyclePolicyPreview page. func (p *GetLifecyclePolicyPreviewPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*GetLifecyclePolicyPreviewOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.GetLifecyclePolicyPreview(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // GetLifecyclePolicyPreviewAPIClient is a client that implements the // GetLifecyclePolicyPreview operation. type GetLifecyclePolicyPreviewAPIClient interface { GetLifecyclePolicyPreview(context.Context, *GetLifecyclePolicyPreviewInput, ...func(*Options)) (*GetLifecyclePolicyPreviewOutput, error) } var _ GetLifecyclePolicyPreviewAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opGetLifecyclePolicyPreview(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetLifecyclePolicyPreview", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves the permissions policy for a registry. func (c *Client) GetRegistryPolicy(ctx context.Context, params *GetRegistryPolicyInput, optFns ...func(*Options)) (*GetRegistryPolicyOutput, error) { if params == nil { params = &GetRegistryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "GetRegistryPolicy", params, optFns, c.addOperationGetRegistryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*GetRegistryPolicyOutput) out.ResultMetadata = metadata return out, nil } type GetRegistryPolicyInput struct { noSmithyDocumentSerde } type GetRegistryPolicyOutput struct { // The JSON text of the permissions policy for a registry. PolicyText *string // The registry ID associated with the request. RegistryId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetRegistryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRegistryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRegistryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetRegistryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetRegistryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetRegistryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRegistryScanningConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves the scanning configuration for a registry. func (c *Client) GetRegistryScanningConfiguration(ctx context.Context, params *GetRegistryScanningConfigurationInput, optFns ...func(*Options)) (*GetRegistryScanningConfigurationOutput, error) { if params == nil { params = &GetRegistryScanningConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetRegistryScanningConfiguration", params, optFns, c.addOperationGetRegistryScanningConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetRegistryScanningConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetRegistryScanningConfigurationInput struct { noSmithyDocumentSerde } type GetRegistryScanningConfigurationOutput struct { // The registry ID associated with the request. RegistryId *string // The scanning configuration for the registry. ScanningConfiguration *types.RegistryScanningConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetRegistryScanningConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRegistryScanningConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRegistryScanningConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetRegistryScanningConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryScanningConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetRegistryScanningConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetRegistryScanningConfiguration", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_GetRepositoryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves the repository policy for the specified repository. func (c *Client) GetRepositoryPolicy(ctx context.Context, params *GetRepositoryPolicyInput, optFns ...func(*Options)) (*GetRepositoryPolicyOutput, error) { if params == nil { params = &GetRepositoryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "GetRepositoryPolicy", params, optFns, c.addOperationGetRepositoryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*GetRepositoryPolicyOutput) out.ResultMetadata = metadata return out, nil } type GetRepositoryPolicyInput struct { // The name of the repository with the policy to retrieve. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the repository. If you do not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type GetRepositoryPolicyOutput struct { // The JSON repository policy text associated with the repository. PolicyText *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRepositoryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRepositoryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetRepositoryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetRepositoryPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetRepositoryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_InitiateLayerUpload.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Notifies Amazon ECR that you intend to upload an image layer. // // When an image is pushed, the InitiateLayerUpload API is called once per image // layer that has not already been uploaded. Whether or not an image layer has been // uploaded is determined by the BatchCheckLayerAvailability API action. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) InitiateLayerUpload(ctx context.Context, params *InitiateLayerUploadInput, optFns ...func(*Options)) (*InitiateLayerUploadOutput, error) { if params == nil { params = &InitiateLayerUploadInput{} } result, metadata, err := c.invokeOperation(ctx, "InitiateLayerUpload", params, optFns, c.addOperationInitiateLayerUploadMiddlewares) if err != nil { return nil, err } out := result.(*InitiateLayerUploadOutput) out.ResultMetadata = metadata return out, nil } type InitiateLayerUploadInput struct { // The name of the repository to which you intend to upload layers. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry to which you // intend to upload layers. If you do not specify a registry, the default registry // is assumed. RegistryId *string noSmithyDocumentSerde } type InitiateLayerUploadOutput struct { // The size, in bytes, that Amazon ECR expects future layer part uploads to be. PartSize *int64 // The upload ID for the layer upload. This parameter is passed to further UploadLayerPart and CompleteLayerUpload // operations. UploadId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationInitiateLayerUploadMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpInitiateLayerUpload{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpInitiateLayerUpload{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "InitiateLayerUpload"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpInitiateLayerUploadValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opInitiateLayerUpload(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opInitiateLayerUpload(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "InitiateLayerUpload", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListImages.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Lists all the image IDs for the specified repository. // // You can filter images based on whether or not they are tagged by using the // tagStatus filter and specifying either TAGGED , UNTAGGED or ANY . For example, // you can filter your results to return only UNTAGGED images and then pipe that // result to a BatchDeleteImageoperation to delete them. Or, you can filter your results to return // only TAGGED images to list all of the tags in your repository. func (c *Client) ListImages(ctx context.Context, params *ListImagesInput, optFns ...func(*Options)) (*ListImagesOutput, error) { if params == nil { params = &ListImagesInput{} } result, metadata, err := c.invokeOperation(ctx, "ListImages", params, optFns, c.addOperationListImagesMiddlewares) if err != nil { return nil, err } out := result.(*ListImagesOutput) out.ResultMetadata = metadata return out, nil } type ListImagesInput struct { // The repository with image IDs to be listed. // // This member is required. RepositoryName *string // The filter key and value with which to filter your ListImages results. Filter *types.ListImagesFilter // The maximum number of image results returned by ListImages in paginated output. // When this parameter is used, ListImages only returns maxResults results in a // single page along with a nextToken response element. The remaining results of // the initial request can be seen by sending another ListImages request with the // returned nextToken value. This value can be between 1 and 1000. If this // parameter is not used, then ListImages returns up to 100 results and a nextToken // value, if applicable. MaxResults *int32 // The nextToken value returned from a previous paginated ListImages request where // maxResults was used and the results exceeded the value of that parameter. // Pagination continues from the end of the previous results that returned the // nextToken value. This value is null when there are no more results to return. // // This token should be treated as an opaque identifier that is only used to // retrieve the next items in a list and not for other programmatic purposes. NextToken *string // The Amazon Web Services account ID associated with the registry that contains // the repository in which to list images. If you do not specify a registry, the // default registry is assumed. RegistryId *string noSmithyDocumentSerde } type ListImagesOutput struct { // The list of image IDs for the requested repository. ImageIds []types.ImageIdentifier // The nextToken value to include in a future ListImages request. When the results // of a ListImages request exceed maxResults , this value can be used to retrieve // the next page of results. This value is null when there are no more results to // return. NextToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListImagesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpListImages{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpListImages{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListImages"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListImagesValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListImages(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // ListImagesPaginatorOptions is the paginator options for ListImages type ListImagesPaginatorOptions struct { // The maximum number of image results returned by ListImages in paginated output. // When this parameter is used, ListImages only returns maxResults results in a // single page along with a nextToken response element. The remaining results of // the initial request can be seen by sending another ListImages request with the // returned nextToken value. This value can be between 1 and 1000. If this // parameter is not used, then ListImages returns up to 100 results and a nextToken // value, if applicable. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // ListImagesPaginator is a paginator for ListImages type ListImagesPaginator struct { options ListImagesPaginatorOptions client ListImagesAPIClient params *ListImagesInput nextToken *string firstPage bool } // NewListImagesPaginator returns a new ListImagesPaginator func NewListImagesPaginator(client ListImagesAPIClient, params *ListImagesInput, optFns ...func(*ListImagesPaginatorOptions)) *ListImagesPaginator { if params == nil { params = &ListImagesInput{} } options := ListImagesPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &ListImagesPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *ListImagesPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next ListImages page. func (p *ListImagesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListImagesOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.ListImages(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // ListImagesAPIClient is a client that implements the ListImages operation. type ListImagesAPIClient interface { ListImages(context.Context, *ListImagesInput, ...func(*Options)) (*ListImagesOutput, error) } var _ ListImagesAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opListImages(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListImages", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ListTagsForResource.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // List the tags for an Amazon ECR resource. func (c *Client) ListTagsForResource(ctx context.Context, params *ListTagsForResourceInput, optFns ...func(*Options)) (*ListTagsForResourceOutput, error) { if params == nil { params = &ListTagsForResourceInput{} } result, metadata, err := c.invokeOperation(ctx, "ListTagsForResource", params, optFns, c.addOperationListTagsForResourceMiddlewares) if err != nil { return nil, err } out := result.(*ListTagsForResourceOutput) out.ResultMetadata = metadata return out, nil } type ListTagsForResourceInput struct { // The Amazon Resource Name (ARN) that identifies the resource for which to list // the tags. Currently, the only supported resource is an Amazon ECR repository. // // This member is required. ResourceArn *string noSmithyDocumentSerde } type ListTagsForResourceOutput struct { // The tags for the resource. Tags []types.Tag // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListTagsForResourceMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpListTagsForResource{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpListTagsForResource{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListTagsForResource"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListTagsForResourceValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListTagsForResource(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opListTagsForResource(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListTagsForResource", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutAccountSetting.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Allows you to change the basic scan type version or registry policy scope. func (c *Client) PutAccountSetting(ctx context.Context, params *PutAccountSettingInput, optFns ...func(*Options)) (*PutAccountSettingOutput, error) { if params == nil { params = &PutAccountSettingInput{} } result, metadata, err := c.invokeOperation(ctx, "PutAccountSetting", params, optFns, c.addOperationPutAccountSettingMiddlewares) if err != nil { return nil, err } out := result.(*PutAccountSettingOutput) out.ResultMetadata = metadata return out, nil } type PutAccountSettingInput struct { // The name of the account setting, such as BASIC_SCAN_TYPE_VERSION or // REGISTRY_POLICY_SCOPE . // // This member is required. Name *string // Setting value that is specified. The following are valid values for the basic // scan type being used: AWS_NATIVE or CLAIR . The following are valid values for // the registry policy scope being used: V1 or V2 . // // This member is required. Value *string noSmithyDocumentSerde } type PutAccountSettingOutput struct { // Retrieves the name of the account setting. Name *string // Retrieves the value of the specified account setting. Value *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutAccountSettingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutAccountSetting{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutAccountSetting{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutAccountSetting"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutAccountSettingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutAccountSetting(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutAccountSetting(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutAccountSetting", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImage.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates or updates the image manifest and tags associated with an image. // // When an image is pushed and all new image layers have been uploaded, the // PutImage API is called once to create or update the image manifest and the tags // associated with the image. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) PutImage(ctx context.Context, params *PutImageInput, optFns ...func(*Options)) (*PutImageOutput, error) { if params == nil { params = &PutImageInput{} } result, metadata, err := c.invokeOperation(ctx, "PutImage", params, optFns, c.addOperationPutImageMiddlewares) if err != nil { return nil, err } out := result.(*PutImageOutput) out.ResultMetadata = metadata return out, nil } type PutImageInput struct { // The image manifest corresponding to the image to be uploaded. // // This member is required. ImageManifest *string // The name of the repository in which to put the image. // // This member is required. RepositoryName *string // The image digest of the image manifest corresponding to the image. ImageDigest *string // The media type of the image manifest. If you push an image manifest that does // not contain the mediaType field, you must specify the imageManifestMediaType in // the request. ImageManifestMediaType *string // The tag to associate with the image. This parameter is required for images that // use the Docker Image Manifest V2 Schema 2 or Open Container Initiative (OCI) // formats. ImageTag *string // The Amazon Web Services account ID associated with the registry that contains // the repository in which to put the image. If you do not specify a registry, the // default registry is assumed. RegistryId *string noSmithyDocumentSerde } type PutImageOutput struct { // Details of the image uploaded. Image *types.Image // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutImageMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutImage{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutImage{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutImage"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutImageValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImage(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutImage(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutImage", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageScanningConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // The PutImageScanningConfiguration API is being deprecated, in favor of // specifying the image scanning configuration at the registry level. For more // information, see PutRegistryScanningConfiguration. // // Updates the image scanning configuration for the specified repository. func (c *Client) PutImageScanningConfiguration(ctx context.Context, params *PutImageScanningConfigurationInput, optFns ...func(*Options)) (*PutImageScanningConfigurationOutput, error) { if params == nil { params = &PutImageScanningConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutImageScanningConfiguration", params, optFns, c.addOperationPutImageScanningConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutImageScanningConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutImageScanningConfigurationInput struct { // The image scanning configuration for the repository. This setting determines // whether images are scanned for known vulnerabilities after being pushed to the // repository. // // This member is required. ImageScanningConfiguration *types.ImageScanningConfiguration // The name of the repository in which to update the image scanning configuration // setting. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the repository in which to update the image scanning configuration setting. If // you do not specify a registry, the default registry is assumed. RegistryId *string noSmithyDocumentSerde } type PutImageScanningConfigurationOutput struct { // The image scanning configuration setting for the repository. ImageScanningConfiguration *types.ImageScanningConfiguration // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutImageScanningConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutImageScanningConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutImageScanningConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutImageScanningConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutImageScanningConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImageScanningConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutImageScanningConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutImageScanningConfiguration", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutImageTagMutability.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Updates the image tag mutability settings for the specified repository. For // more information, see [Image tag mutability]in the Amazon Elastic Container Registry User Guide. // // [Image tag mutability]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html func (c *Client) PutImageTagMutability(ctx context.Context, params *PutImageTagMutabilityInput, optFns ...func(*Options)) (*PutImageTagMutabilityOutput, error) { if params == nil { params = &PutImageTagMutabilityInput{} } result, metadata, err := c.invokeOperation(ctx, "PutImageTagMutability", params, optFns, c.addOperationPutImageTagMutabilityMiddlewares) if err != nil { return nil, err } out := result.(*PutImageTagMutabilityOutput) out.ResultMetadata = metadata return out, nil } type PutImageTagMutabilityInput struct { // The tag mutability setting for the repository. If MUTABLE is specified, image // tags can be overwritten. If IMMUTABLE is specified, all image tags within the // repository will be immutable which will prevent them from being overwritten. // // This member is required. ImageTagMutability types.ImageTagMutability // The name of the repository in which to update the image tag mutability settings. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the repository in which to update the image tag mutability settings. If you do // not specify a registry, the default registry is assumed. RegistryId *string noSmithyDocumentSerde } type PutImageTagMutabilityOutput struct { // The image tag mutability setting for the repository. ImageTagMutability types.ImageTagMutability // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutImageTagMutabilityMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutImageTagMutability{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutImageTagMutability{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutImageTagMutability"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutImageTagMutabilityValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImageTagMutability(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutImageTagMutability(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutImageTagMutability", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutLifecyclePolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates or updates the lifecycle policy for the specified repository. For more // information, see [Lifecycle policy template]. // // [Lifecycle policy template]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html func (c *Client) PutLifecyclePolicy(ctx context.Context, params *PutLifecyclePolicyInput, optFns ...func(*Options)) (*PutLifecyclePolicyOutput, error) { if params == nil { params = &PutLifecyclePolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "PutLifecyclePolicy", params, optFns, c.addOperationPutLifecyclePolicyMiddlewares) if err != nil { return nil, err } out := result.(*PutLifecyclePolicyOutput) out.ResultMetadata = metadata return out, nil } type PutLifecyclePolicyInput struct { // The JSON repository policy text to apply to the repository. // // This member is required. LifecyclePolicyText *string // The name of the repository to receive the policy. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the repository. If you do
 not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type PutLifecyclePolicyOutput struct { // The JSON repository policy text. LifecyclePolicyText *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutLifecyclePolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutLifecyclePolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutLifecyclePolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutLifecyclePolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutLifecyclePolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutLifecyclePolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutLifecyclePolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutLifecyclePolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates or updates the permissions policy for your registry. // // A registry policy is used to specify permissions for another Amazon Web // Services account and is used when configuring cross-account replication. For // more information, see [Registry permissions]in the Amazon Elastic Container Registry User Guide. // // [Registry permissions]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html func (c *Client) PutRegistryPolicy(ctx context.Context, params *PutRegistryPolicyInput, optFns ...func(*Options)) (*PutRegistryPolicyOutput, error) { if params == nil { params = &PutRegistryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "PutRegistryPolicy", params, optFns, c.addOperationPutRegistryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*PutRegistryPolicyOutput) out.ResultMetadata = metadata return out, nil } type PutRegistryPolicyInput struct { // The JSON policy text to apply to your registry. The policy text follows the // same format as IAM policy text. For more information, see [Registry permissions]in the Amazon Elastic // Container Registry User Guide. // // [Registry permissions]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html // // This member is required. PolicyText *string noSmithyDocumentSerde } type PutRegistryPolicyOutput struct { // The JSON policy text for your registry. PolicyText *string // The registry ID associated with the request. RegistryId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutRegistryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutRegistryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutRegistryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutRegistryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutRegistryPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutRegistryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutRegistryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutRegistryScanningConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates or updates the scanning configuration for your private registry. func (c *Client) PutRegistryScanningConfiguration(ctx context.Context, params *PutRegistryScanningConfigurationInput, optFns ...func(*Options)) (*PutRegistryScanningConfigurationOutput, error) { if params == nil { params = &PutRegistryScanningConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutRegistryScanningConfiguration", params, optFns, c.addOperationPutRegistryScanningConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutRegistryScanningConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutRegistryScanningConfigurationInput struct { // The scanning rules to use for the registry. A scanning rule is used to // determine which repository filters are used and at what frequency scanning will // occur. Rules []types.RegistryScanningRule // The scanning type to set for the registry. // // When a registry scanning configuration is not defined, by default the BASIC // scan type is used. When basic scanning is used, you may specify filters to // determine which individual repositories, or all repositories, are scanned when // new images are pushed to those repositories. Alternatively, you can do manual // scans of images with basic scanning. // // When the ENHANCED scan type is set, Amazon Inspector provides automated // vulnerability scanning. You may choose between continuous scanning or scan on // push and you may specify filters to determine which individual repositories, or // all repositories, are scanned. ScanType types.ScanType noSmithyDocumentSerde } type PutRegistryScanningConfigurationOutput struct { // The scanning configuration for your registry. RegistryScanningConfiguration *types.RegistryScanningConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutRegistryScanningConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutRegistryScanningConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutRegistryScanningConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutRegistryScanningConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutRegistryScanningConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryScanningConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutRegistryScanningConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutRegistryScanningConfiguration", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_PutReplicationConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates or updates the replication configuration for a registry. The existing // replication configuration for a repository can be retrieved with the DescribeRegistryAPI // action. The first time the PutReplicationConfiguration API is called, a // service-linked IAM role is created in your account for the replication process. // For more information, see [Using service-linked roles for Amazon ECR]in the Amazon Elastic Container Registry User Guide. // For more information on the custom role for replication, see [Creating an IAM role for replication]. // // When configuring cross-account replication, the destination account must grant // the source account permission to replicate. This permission is controlled using // a registry permissions policy. For more information, see PutRegistryPolicy. // // [Creating an IAM role for replication]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/replication-creation-templates.html#roles-creatingrole-user-console // [Using service-linked roles for Amazon ECR]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/using-service-linked-roles.html func (c *Client) PutReplicationConfiguration(ctx context.Context, params *PutReplicationConfigurationInput, optFns ...func(*Options)) (*PutReplicationConfigurationOutput, error) { if params == nil { params = &PutReplicationConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutReplicationConfiguration", params, optFns, c.addOperationPutReplicationConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutReplicationConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutReplicationConfigurationInput struct { // An object representing the replication configuration for a registry. // // This member is required. ReplicationConfiguration *types.ReplicationConfiguration noSmithyDocumentSerde } type PutReplicationConfigurationOutput struct { // The contents of the replication configuration for the registry. ReplicationConfiguration *types.ReplicationConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutReplicationConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutReplicationConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutReplicationConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutReplicationConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutReplicationConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutReplicationConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutReplicationConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutReplicationConfiguration", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_SetRepositoryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Applies a repository policy to the specified repository to control access // permissions. For more information, see [Amazon ECR Repository policies]in the Amazon Elastic Container Registry // User Guide. // // [Amazon ECR Repository policies]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html func (c *Client) SetRepositoryPolicy(ctx context.Context, params *SetRepositoryPolicyInput, optFns ...func(*Options)) (*SetRepositoryPolicyOutput, error) { if params == nil { params = &SetRepositoryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "SetRepositoryPolicy", params, optFns, c.addOperationSetRepositoryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*SetRepositoryPolicyOutput) out.ResultMetadata = metadata return out, nil } type SetRepositoryPolicyInput struct { // The JSON repository policy text to apply to the repository. For more // information, see [Amazon ECR repository policies]in the Amazon Elastic Container Registry User Guide. // // [Amazon ECR repository policies]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html // // This member is required. PolicyText *string // The name of the repository to receive the policy. // // This member is required. RepositoryName *string // If the policy you are attempting to set on a repository policy would prevent // you from setting another policy in the future, you must force the SetRepositoryPolicyoperation. // This is intended to prevent accidental repository lock outs. Force bool // The Amazon Web Services account ID associated with the registry that contains // the repository. If you do not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type SetRepositoryPolicyOutput struct { // The JSON repository policy text applied to the repository. PolicyText *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationSetRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpSetRepositoryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpSetRepositoryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "SetRepositoryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpSetRepositoryPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opSetRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opSetRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "SetRepositoryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartImageScan.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Starts a basic image vulnerability scan. // // A basic image scan can only be started once per 24 hours on an individual // image. This limit includes if an image was scanned on initial push. You can // start up to 100,000 basic scans per 24 hours. This limit includes both scans on // initial push and scans initiated by the StartImageScan API. For more // information, see [Basic scanning]in the Amazon Elastic Container Registry User Guide. // // [Basic scanning]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning-basic.html func (c *Client) StartImageScan(ctx context.Context, params *StartImageScanInput, optFns ...func(*Options)) (*StartImageScanOutput, error) { if params == nil { params = &StartImageScanInput{} } result, metadata, err := c.invokeOperation(ctx, "StartImageScan", params, optFns, c.addOperationStartImageScanMiddlewares) if err != nil { return nil, err } out := result.(*StartImageScanOutput) out.ResultMetadata = metadata return out, nil } type StartImageScanInput struct { // An object with identifying information for an image in an Amazon ECR repository. // // This member is required. ImageId *types.ImageIdentifier // The name of the repository that contains the images to scan. // // This member is required. RepositoryName *string // The Amazon Web Services account ID associated with the registry that contains // the repository in which to start an image scan request. If you do not specify a // registry, the default registry is assumed. RegistryId *string noSmithyDocumentSerde } type StartImageScanOutput struct { // An object with identifying information for an image in an Amazon ECR repository. ImageId *types.ImageIdentifier // The current state of the scan. ImageScanStatus *types.ImageScanStatus // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationStartImageScanMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpStartImageScan{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpStartImageScan{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "StartImageScan"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpStartImageScanValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opStartImageScan(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opStartImageScan(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "StartImageScan", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_StartLifecyclePolicyPreview.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Starts a preview of a lifecycle policy for the specified repository. This // allows you to see the results before associating the lifecycle policy with the // repository. func (c *Client) StartLifecyclePolicyPreview(ctx context.Context, params *StartLifecyclePolicyPreviewInput, optFns ...func(*Options)) (*StartLifecyclePolicyPreviewOutput, error) { if params == nil { params = &StartLifecyclePolicyPreviewInput{} } result, metadata, err := c.invokeOperation(ctx, "StartLifecyclePolicyPreview", params, optFns, c.addOperationStartLifecyclePolicyPreviewMiddlewares) if err != nil { return nil, err } out := result.(*StartLifecyclePolicyPreviewOutput) out.ResultMetadata = metadata return out, nil } type StartLifecyclePolicyPreviewInput struct { // The name of the repository to be evaluated. // // This member is required. RepositoryName *string // The policy to be evaluated against. If you do not specify a policy, the current // policy for the repository is used. LifecyclePolicyText *string // The Amazon Web Services account ID associated with the registry that contains // the repository. If you do not specify a registry, the default registry is // assumed. RegistryId *string noSmithyDocumentSerde } type StartLifecyclePolicyPreviewOutput struct { // The JSON repository policy text. LifecyclePolicyText *string // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // The status of the lifecycle policy preview request. Status types.LifecyclePolicyPreviewStatus // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationStartLifecyclePolicyPreviewMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpStartLifecyclePolicyPreview{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpStartLifecyclePolicyPreview{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "StartLifecyclePolicyPreview"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpStartLifecyclePolicyPreviewValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opStartLifecyclePolicyPreview(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opStartLifecyclePolicyPreview(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "StartLifecyclePolicyPreview", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_TagResource.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Adds specified tags to a resource with the specified ARN. Existing tags on a // resource are not changed if they are not specified in the request parameters. func (c *Client) TagResource(ctx context.Context, params *TagResourceInput, optFns ...func(*Options)) (*TagResourceOutput, error) { if params == nil { params = &TagResourceInput{} } result, metadata, err := c.invokeOperation(ctx, "TagResource", params, optFns, c.addOperationTagResourceMiddlewares) if err != nil { return nil, err } out := result.(*TagResourceOutput) out.ResultMetadata = metadata return out, nil } type TagResourceInput struct { // The Amazon Resource Name (ARN) of the the resource to which to add tags. // Currently, the only supported resource is an Amazon ECR repository. // // This member is required. ResourceArn *string // The tags to add to the resource. A tag is an array of key-value pairs. Tag keys // can have a maximum character length of 128 characters, and tag values can have a // maximum length of 256 characters. // // This member is required. Tags []types.Tag noSmithyDocumentSerde } type TagResourceOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpTagResource{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpTagResource{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "TagResource"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpTagResourceValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opTagResource(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opTagResource(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "TagResource", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UntagResource.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes specified tags from a resource. func (c *Client) UntagResource(ctx context.Context, params *UntagResourceInput, optFns ...func(*Options)) (*UntagResourceOutput, error) { if params == nil { params = &UntagResourceInput{} } result, metadata, err := c.invokeOperation(ctx, "UntagResource", params, optFns, c.addOperationUntagResourceMiddlewares) if err != nil { return nil, err } out := result.(*UntagResourceOutput) out.ResultMetadata = metadata return out, nil } type UntagResourceInput struct { // The Amazon Resource Name (ARN) of the resource from which to remove tags. // Currently, the only supported resource is an Amazon ECR repository. // // This member is required. ResourceArn *string // The keys of the tags to be removed. // // This member is required. TagKeys []string noSmithyDocumentSerde } type UntagResourceOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationUntagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpUntagResource{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUntagResource{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "UntagResource"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpUntagResourceValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUntagResource(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opUntagResource(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "UntagResource", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UpdatePullThroughCacheRule.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Updates an existing pull through cache rule. func (c *Client) UpdatePullThroughCacheRule(ctx context.Context, params *UpdatePullThroughCacheRuleInput, optFns ...func(*Options)) (*UpdatePullThroughCacheRuleOutput, error) { if params == nil { params = &UpdatePullThroughCacheRuleInput{} } result, metadata, err := c.invokeOperation(ctx, "UpdatePullThroughCacheRule", params, optFns, c.addOperationUpdatePullThroughCacheRuleMiddlewares) if err != nil { return nil, err } out := result.(*UpdatePullThroughCacheRuleOutput) out.ResultMetadata = metadata return out, nil } type UpdatePullThroughCacheRuleInput struct { // The repository name prefix to use when caching images from the source registry. // // This member is required. EcrRepositoryPrefix *string // The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager // secret that identifies the credentials to authenticate to the upstream registry. CredentialArn *string // Amazon Resource Name (ARN) of the IAM role to be assumed by Amazon ECR to // authenticate to the ECR upstream registry. This role must be in the same account // as the registry that you are configuring. CustomRoleArn *string // The Amazon Web Services account ID associated with the registry associated with // the pull through cache rule. If you do not specify a registry, the default // registry is assumed. RegistryId *string noSmithyDocumentSerde } type UpdatePullThroughCacheRuleOutput struct { // The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager // secret associated with the pull through cache rule. CredentialArn *string // The ARN of the IAM role associated with the pull through cache rule. CustomRoleArn *string // The Amazon ECR repository prefix associated with the pull through cache rule. EcrRepositoryPrefix *string // The registry ID associated with the request. RegistryId *string // The date and time, in JavaScript date format, when the pull through cache rule // was updated. UpdatedAt *time.Time // The upstream repository prefix associated with the pull through cache rule. UpstreamRepositoryPrefix *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationUpdatePullThroughCacheRuleMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpUpdatePullThroughCacheRule{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUpdatePullThroughCacheRule{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "UpdatePullThroughCacheRule"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpUpdatePullThroughCacheRuleValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUpdatePullThroughCacheRule(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opUpdatePullThroughCacheRule(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "UpdatePullThroughCacheRule", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UpdateRepositoryCreationTemplate.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecr/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Updates an existing repository creation template. func (c *Client) UpdateRepositoryCreationTemplate(ctx context.Context, params *UpdateRepositoryCreationTemplateInput, optFns ...func(*Options)) (*UpdateRepositoryCreationTemplateOutput, error) { if params == nil { params = &UpdateRepositoryCreationTemplateInput{} } result, metadata, err := c.invokeOperation(ctx, "UpdateRepositoryCreationTemplate", params, optFns, c.addOperationUpdateRepositoryCreationTemplateMiddlewares) if err != nil { return nil, err } out := result.(*UpdateRepositoryCreationTemplateOutput) out.ResultMetadata = metadata return out, nil } type UpdateRepositoryCreationTemplateInput struct { // The repository namespace prefix that matches an existing repository creation // template in the registry. All repositories created using this namespace prefix // will have the settings defined in this template applied. For example, a prefix // of prod would apply to all repositories beginning with prod/ . This includes a // repository named prod/team1 as well as a repository named prod/repository1 . // // To apply a template to all repositories in your registry that don't have an // associated creation template, you can use ROOT as the prefix. // // This member is required. Prefix *string // Updates the list of enumerable strings representing the Amazon ECR repository // creation scenarios that this template will apply towards. The two supported // scenarios are PULL_THROUGH_CACHE and REPLICATION AppliedFor []types.RCTAppliedFor // The ARN of the role to be assumed by Amazon ECR. This role must be in the same // account as the registry that you are configuring. Amazon ECR will assume your // supplied role when the customRoleArn is specified. When this field isn't // specified, Amazon ECR will use the service-linked role for the repository // creation template. CustomRoleArn *string // A description for the repository creation template. Description *string // The encryption configuration to associate with the repository creation template. EncryptionConfiguration *types.EncryptionConfigurationForRepositoryCreationTemplate // Updates the tag mutability setting for the repository. If this parameter is // omitted, the default setting of MUTABLE will be used which will allow image // tags to be overwritten. If IMMUTABLE is specified, all image tags within the // repository will be immutable which will prevent them from being overwritten. ImageTagMutability types.ImageTagMutability // Updates the lifecycle policy associated with the specified repository creation // template. LifecyclePolicy *string // Updates the repository policy created using the template. A repository policy // is a permissions policy associated with a repository to control access // permissions. RepositoryPolicy *string // The metadata to apply to the repository to help you categorize and organize. // Each tag consists of a key and an optional value, both of which you define. Tag // keys can have a maximum character length of 128 characters, and tag values can // have a maximum length of 256 characters. ResourceTags []types.Tag noSmithyDocumentSerde } type UpdateRepositoryCreationTemplateOutput struct { // The registry ID associated with the request. RegistryId *string // The details of the repository creation template associated with the request. RepositoryCreationTemplate *types.RepositoryCreationTemplate // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationUpdateRepositoryCreationTemplateMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpUpdateRepositoryCreationTemplate{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUpdateRepositoryCreationTemplate{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "UpdateRepositoryCreationTemplate"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpUpdateRepositoryCreationTemplateValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUpdateRepositoryCreationTemplate(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opUpdateRepositoryCreationTemplate(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "UpdateRepositoryCreationTemplate", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_UploadLayerPart.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Uploads an image layer part to Amazon ECR. // // When an image is pushed, each new image layer is uploaded in parts. The maximum // size of each image layer part can be 20971520 bytes (or about 20MB). The // UploadLayerPart API is called once per each new image layer part. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) UploadLayerPart(ctx context.Context, params *UploadLayerPartInput, optFns ...func(*Options)) (*UploadLayerPartOutput, error) { if params == nil { params = &UploadLayerPartInput{} } result, metadata, err := c.invokeOperation(ctx, "UploadLayerPart", params, optFns, c.addOperationUploadLayerPartMiddlewares) if err != nil { return nil, err } out := result.(*UploadLayerPartOutput) out.ResultMetadata = metadata return out, nil } type UploadLayerPartInput struct { // The base64-encoded layer part payload. // // This member is required. LayerPartBlob []byte // The position of the first byte of the layer part witin the overall image layer. // // This member is required. PartFirstByte *int64 // The position of the last byte of the layer part within the overall image layer. // // This member is required. PartLastByte *int64 // The name of the repository to which you are uploading layer parts. // // This member is required. RepositoryName *string // The upload ID from a previous InitiateLayerUpload operation to associate with the layer part // upload. // // This member is required. UploadId *string // The Amazon Web Services account ID associated with the registry to which you // are uploading layer parts. If you do not specify a registry, the default // registry is assumed. RegistryId *string noSmithyDocumentSerde } type UploadLayerPartOutput struct { // The integer value of the last byte received in the request. LastByteReceived *int64 // The registry ID associated with the request. RegistryId *string // The repository name associated with the request. RepositoryName *string // The upload ID associated with the request. UploadId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationUploadLayerPartMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpUploadLayerPart{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUploadLayerPart{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "UploadLayerPart"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpUploadLayerPartValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadLayerPart(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opUploadLayerPart(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "UploadLayerPart", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/api_op_ValidatePullThroughCacheRule.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Validates an existing pull through cache rule for an upstream registry that // requires authentication. This will retrieve the contents of the Amazon Web // Services Secrets Manager secret, verify the syntax, and then validate that // authentication to the upstream registry is successful. func (c *Client) ValidatePullThroughCacheRule(ctx context.Context, params *ValidatePullThroughCacheRuleInput, optFns ...func(*Options)) (*ValidatePullThroughCacheRuleOutput, error) { if params == nil { params = &ValidatePullThroughCacheRuleInput{} } result, metadata, err := c.invokeOperation(ctx, "ValidatePullThroughCacheRule", params, optFns, c.addOperationValidatePullThroughCacheRuleMiddlewares) if err != nil { return nil, err } out := result.(*ValidatePullThroughCacheRuleOutput) out.ResultMetadata = metadata return out, nil } type ValidatePullThroughCacheRuleInput struct { // The repository name prefix associated with the pull through cache rule. // // This member is required. EcrRepositoryPrefix *string // The registry ID associated with the pull through cache rule. If you do not // specify a registry, the default registry is assumed. RegistryId *string noSmithyDocumentSerde } type ValidatePullThroughCacheRuleOutput struct { // The Amazon Resource Name (ARN) of the Amazon Web Services Secrets Manager // secret associated with the pull through cache rule. CredentialArn *string // The ARN of the IAM role associated with the pull through cache rule. CustomRoleArn *string // The Amazon ECR repository prefix associated with the pull through cache rule. EcrRepositoryPrefix *string // The reason the validation failed. For more details about possible causes and // how to address them, see [Using pull through cache rules]in the Amazon Elastic Container Registry User Guide. // // [Using pull through cache rules]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache.html Failure *string // Whether or not the pull through cache rule was validated. If true , Amazon ECR // was able to reach the upstream registry and authentication was successful. If // false , there was an issue and validation failed. The failure reason indicates // the cause. IsValid bool // The registry ID associated with the request. RegistryId *string // The upstream registry URL associated with the pull through cache rule. UpstreamRegistryUrl *string // The upstream repository prefix associated with the pull through cache rule. UpstreamRepositoryPrefix *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationValidatePullThroughCacheRuleMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpValidatePullThroughCacheRule{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpValidatePullThroughCacheRule{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ValidatePullThroughCacheRule"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpValidatePullThroughCacheRuleValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opValidatePullThroughCacheRule(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opValidatePullThroughCacheRule(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ValidatePullThroughCacheRule", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/auth.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" smithy "github.com/aws/smithy-go" smithyauth "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" ) func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) { params.Region = options.Region } type setLegacyContextSigningOptionsMiddleware struct { } func (*setLegacyContextSigningOptionsMiddleware) ID() string { return "setLegacyContextSigningOptions" } func (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { rscheme := getResolvedAuthScheme(ctx) schemeID := rscheme.Scheme.SchemeID() if sn := awsmiddleware.GetSigningName(ctx); sn != "" { if schemeID == "aws.auth#sigv4" { smithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn) } else if schemeID == "aws.auth#sigv4a" { smithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn) } } if sr := awsmiddleware.GetSigningRegion(ctx); sr != "" { if schemeID == "aws.auth#sigv4" { smithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr) } else if schemeID == "aws.auth#sigv4a" { smithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr}) } } return next.HandleFinalize(ctx, in) } func addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error { return stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, "Signing", middleware.Before) } type withAnonymous struct { resolver AuthSchemeResolver } var _ AuthSchemeResolver = (*withAnonymous)(nil) func (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) { opts, err := v.resolver.ResolveAuthSchemes(ctx, params) if err != nil { return nil, err } opts = append(opts, &smithyauth.Option{ SchemeID: smithyauth.SchemeIDAnonymous, }) return opts, nil } func wrapWithAnonymousAuth(options *Options) { if _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok { return } options.AuthSchemeResolver = &withAnonymous{ resolver: options.AuthSchemeResolver, } } // AuthResolverParameters contains the set of inputs necessary for auth scheme // resolution. type AuthResolverParameters struct { // The name of the operation being invoked. Operation string // The region in which the operation is being invoked. Region string } func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters { params := &AuthResolverParameters{ Operation: operation, } bindAuthParamsRegion(ctx, params, input, options) return params } // AuthSchemeResolver returns a set of possible authentication options for an // operation. type AuthSchemeResolver interface { ResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error) } type defaultAuthSchemeResolver struct{} var _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil) func (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) { if overrides, ok := operationAuthOptions[params.Operation]; ok { return overrides(params), nil } return serviceAuthOptions(params), nil } var operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{} func serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option { return []*smithyauth.Option{ { SchemeID: smithyauth.SchemeIDSigV4, SignerProperties: func() smithy.Properties { var props smithy.Properties smithyhttp.SetSigV4SigningName(&props, "ecr") smithyhttp.SetSigV4SigningRegion(&props, params.Region) return props }(), }, } } type resolveAuthSchemeMiddleware struct { operation string options Options } func (*resolveAuthSchemeMiddleware) ID() string { return "ResolveAuthScheme" } func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "ResolveAuthScheme") defer span.End() params := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params) if err != nil { return out, metadata, fmt.Errorf("resolve auth scheme: %w", err) } scheme, ok := m.selectScheme(options) if !ok { return out, metadata, fmt.Errorf("could not select an auth scheme") } ctx = setResolvedAuthScheme(ctx, scheme) span.SetProperty("auth.scheme_id", scheme.Scheme.SchemeID()) span.End() return next.HandleFinalize(ctx, in) } func (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) { for _, option := range options { if option.SchemeID == smithyauth.SchemeIDAnonymous { return newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true } for _, scheme := range m.options.AuthSchemes { if scheme.SchemeID() != option.SchemeID { continue } if scheme.IdentityResolver(m.options) != nil { return newResolvedAuthScheme(scheme, option), true } } } return nil, false } type resolvedAuthSchemeKey struct{} type resolvedAuthScheme struct { Scheme smithyhttp.AuthScheme IdentityProperties smithy.Properties SignerProperties smithy.Properties } func newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme { return &resolvedAuthScheme{ Scheme: scheme, IdentityProperties: option.IdentityProperties, SignerProperties: option.SignerProperties, } } func setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context { return middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme) } func getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme { v, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme) return v } type getIdentityMiddleware struct { options Options } func (*getIdentityMiddleware) ID() string { return "GetIdentity" } func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { innerCtx, span := tracing.StartSpan(ctx, "GetIdentity") defer span.End() rscheme := getResolvedAuthScheme(innerCtx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } resolver := rscheme.Scheme.IdentityResolver(m.options) if resolver == nil { return out, metadata, fmt.Errorf("no identity resolver") } identity, err := timeOperationMetric(ctx, "client.call.resolve_identity_duration", func() (smithyauth.Identity, error) { return resolver.GetIdentity(innerCtx, rscheme.IdentityProperties) }, func(o *metrics.RecordMetricOptions) { o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID()) }) if err != nil { return out, metadata, fmt.Errorf("get identity: %w", err) } ctx = setIdentity(ctx, identity) span.End() return next.HandleFinalize(ctx, in) } type identityKey struct{} func setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context { return middleware.WithStackValue(ctx, identityKey{}, identity) } func getIdentity(ctx context.Context) smithyauth.Identity { v, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity) return v } type signRequestMiddleware struct { options Options } func (*signRequestMiddleware) ID() string { return "Signing" } func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "SignRequest") defer span.End() req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unexpected transport type %T", in.Request) } rscheme := getResolvedAuthScheme(ctx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } identity := getIdentity(ctx) if identity == nil { return out, metadata, fmt.Errorf("no identity") } signer := rscheme.Scheme.Signer() if signer == nil { return out, metadata, fmt.Errorf("no signer") } _, err = timeOperationMetric(ctx, "client.call.signing_duration", func() (any, error) { return nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties) }, func(o *metrics.RecordMetricOptions) { o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID()) }) if err != nil { return out, metadata, fmt.Errorf("sign request: %w", err) } span.End() return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/deserializers.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "bytes" "context" "encoding/json" "fmt" "github.com/aws/aws-sdk-go-v2/aws/protocol/restjson" "github.com/aws/aws-sdk-go-v2/service/ecr/types" smithy "github.com/aws/smithy-go" smithyio "github.com/aws/smithy-go/io" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithytime "github.com/aws/smithy-go/time" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "io" "math" "strings" "time" ) func deserializeS3Expires(v string) (*time.Time, error) { t, err := smithytime.ParseHTTPDate(v) if err != nil { return nil, nil } return &t, nil } type awsAwsjson11_deserializeOpBatchCheckLayerAvailability struct { } func (*awsAwsjson11_deserializeOpBatchCheckLayerAvailability) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpBatchCheckLayerAvailability) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response, &metadata) } output := &BatchCheckLayerAvailabilityOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentBatchCheckLayerAvailabilityOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpBatchDeleteImage struct { } func (*awsAwsjson11_deserializeOpBatchDeleteImage) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpBatchDeleteImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorBatchDeleteImage(response, &metadata) } output := &BatchDeleteImageOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentBatchDeleteImageOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpBatchGetImage struct { } func (*awsAwsjson11_deserializeOpBatchGetImage) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpBatchGetImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorBatchGetImage(response, &metadata) } output := &BatchGetImageOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentBatchGetImageOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorBatchGetImage(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnableToGetUpstreamImageException", errorCode): return awsAwsjson11_deserializeErrorUnableToGetUpstreamImageException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpBatchGetRepositoryScanningConfiguration struct { } func (*awsAwsjson11_deserializeOpBatchGetRepositoryScanningConfiguration) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpBatchGetRepositoryScanningConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorBatchGetRepositoryScanningConfiguration(response, &metadata) } output := &BatchGetRepositoryScanningConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentBatchGetRepositoryScanningConfigurationOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorBatchGetRepositoryScanningConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpCompleteLayerUpload struct { } func (*awsAwsjson11_deserializeOpCompleteLayerUpload) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpCompleteLayerUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response, &metadata) } output := &CompleteLayerUploadOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentCompleteLayerUploadOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("EmptyUploadException", errorCode): return awsAwsjson11_deserializeErrorEmptyUploadException(response, errorBody) case strings.EqualFold("InvalidLayerException", errorCode): return awsAwsjson11_deserializeErrorInvalidLayerException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("KmsException", errorCode): return awsAwsjson11_deserializeErrorKmsException(response, errorBody) case strings.EqualFold("LayerAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorLayerAlreadyExistsException(response, errorBody) case strings.EqualFold("LayerPartTooSmallException", errorCode): return awsAwsjson11_deserializeErrorLayerPartTooSmallException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UploadNotFoundException", errorCode): return awsAwsjson11_deserializeErrorUploadNotFoundException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpCreatePullThroughCacheRule struct { } func (*awsAwsjson11_deserializeOpCreatePullThroughCacheRule) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpCreatePullThroughCacheRule) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorCreatePullThroughCacheRule(response, &metadata) } output := &CreatePullThroughCacheRuleOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentCreatePullThroughCacheRuleOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorCreatePullThroughCacheRule(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("PullThroughCacheRuleAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorPullThroughCacheRuleAlreadyExistsException(response, errorBody) case strings.EqualFold("SecretNotFoundException", errorCode): return awsAwsjson11_deserializeErrorSecretNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnableToAccessSecretException", errorCode): return awsAwsjson11_deserializeErrorUnableToAccessSecretException(response, errorBody) case strings.EqualFold("UnableToDecryptSecretValueException", errorCode): return awsAwsjson11_deserializeErrorUnableToDecryptSecretValueException(response, errorBody) case strings.EqualFold("UnsupportedUpstreamRegistryException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedUpstreamRegistryException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpCreateRepository struct { } func (*awsAwsjson11_deserializeOpCreateRepository) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpCreateRepository) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorCreateRepository(response, &metadata) } output := &CreateRepositoryOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentCreateRepositoryOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("InvalidTagParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody) case strings.EqualFold("KmsException", errorCode): return awsAwsjson11_deserializeErrorKmsException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("RepositoryAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorRepositoryAlreadyExistsException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TooManyTagsException", errorCode): return awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpCreateRepositoryCreationTemplate struct { } func (*awsAwsjson11_deserializeOpCreateRepositoryCreationTemplate) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpCreateRepositoryCreationTemplate) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorCreateRepositoryCreationTemplate(response, &metadata) } output := &CreateRepositoryCreationTemplateOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentCreateRepositoryCreationTemplateOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorCreateRepositoryCreationTemplate(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TemplateAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorTemplateAlreadyExistsException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDeleteLifecyclePolicy struct { } func (*awsAwsjson11_deserializeOpDeleteLifecyclePolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDeleteLifecyclePolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDeleteLifecyclePolicy(response, &metadata) } output := &DeleteLifecyclePolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDeleteLifecyclePolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDeleteLifecyclePolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LifecyclePolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorLifecyclePolicyNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDeletePullThroughCacheRule struct { } func (*awsAwsjson11_deserializeOpDeletePullThroughCacheRule) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDeletePullThroughCacheRule) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDeletePullThroughCacheRule(response, &metadata) } output := &DeletePullThroughCacheRuleOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDeletePullThroughCacheRuleOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDeletePullThroughCacheRule(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("PullThroughCacheRuleNotFoundException", errorCode): return awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDeleteRegistryPolicy struct { } func (*awsAwsjson11_deserializeOpDeleteRegistryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDeleteRegistryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDeleteRegistryPolicy(response, &metadata) } output := &DeleteRegistryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDeleteRegistryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDeleteRegistryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RegistryPolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRegistryPolicyNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDeleteRepository struct { } func (*awsAwsjson11_deserializeOpDeleteRepository) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDeleteRepository) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepository(response, &metadata) } output := &DeleteRepositoryOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDeleteRepositoryOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("KmsException", errorCode): return awsAwsjson11_deserializeErrorKmsException(response, errorBody) case strings.EqualFold("RepositoryNotEmptyException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotEmptyException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDeleteRepositoryCreationTemplate struct { } func (*awsAwsjson11_deserializeOpDeleteRepositoryCreationTemplate) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDeleteRepositoryCreationTemplate) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepositoryCreationTemplate(response, &metadata) } output := &DeleteRepositoryCreationTemplateOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDeleteRepositoryCreationTemplateOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDeleteRepositoryCreationTemplate(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TemplateNotFoundException", errorCode): return awsAwsjson11_deserializeErrorTemplateNotFoundException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDeleteRepositoryPolicy struct { } func (*awsAwsjson11_deserializeOpDeleteRepositoryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDeleteRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response, &metadata) } output := &DeleteRepositoryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDeleteRepositoryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryPolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeImageReplicationStatus struct { } func (*awsAwsjson11_deserializeOpDescribeImageReplicationStatus) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeImageReplicationStatus) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeImageReplicationStatus(response, &metadata) } output := &DescribeImageReplicationStatusOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeImageReplicationStatusOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeImageReplicationStatus(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("ImageNotFoundException", errorCode): return awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeImages struct { } func (*awsAwsjson11_deserializeOpDescribeImages) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeImages) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeImages(response, &metadata) } output := &DescribeImagesOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeImagesOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("ImageNotFoundException", errorCode): return awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeImageScanFindings struct { } func (*awsAwsjson11_deserializeOpDescribeImageScanFindings) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeImageScanFindings) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeImageScanFindings(response, &metadata) } output := &DescribeImageScanFindingsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeImageScanFindingsOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeImageScanFindings(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("ImageNotFoundException", errorCode): return awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ScanNotFoundException", errorCode): return awsAwsjson11_deserializeErrorScanNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribePullThroughCacheRules struct { } func (*awsAwsjson11_deserializeOpDescribePullThroughCacheRules) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribePullThroughCacheRules) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribePullThroughCacheRules(response, &metadata) } output := &DescribePullThroughCacheRulesOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribePullThroughCacheRulesOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribePullThroughCacheRules(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("PullThroughCacheRuleNotFoundException", errorCode): return awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeRegistry struct { } func (*awsAwsjson11_deserializeOpDescribeRegistry) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeRegistry) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeRegistry(response, &metadata) } output := &DescribeRegistryOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeRegistryOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeRegistry(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeRepositories struct { } func (*awsAwsjson11_deserializeOpDescribeRepositories) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeRepositories) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeRepositories(response, &metadata) } output := &DescribeRepositoriesOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeRepositoriesOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeRepositoryCreationTemplates struct { } func (*awsAwsjson11_deserializeOpDescribeRepositoryCreationTemplates) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeRepositoryCreationTemplates) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeRepositoryCreationTemplates(response, &metadata) } output := &DescribeRepositoryCreationTemplatesOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeRepositoryCreationTemplatesOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeRepositoryCreationTemplates(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetAccountSetting struct { } func (*awsAwsjson11_deserializeOpGetAccountSetting) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetAccountSetting) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetAccountSetting(response, &metadata) } output := &GetAccountSettingOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetAccountSettingOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetAccountSetting(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetAuthorizationToken struct { } func (*awsAwsjson11_deserializeOpGetAuthorizationToken) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetAuthorizationToken) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response, &metadata) } output := &GetAuthorizationTokenOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetAuthorizationTokenOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetDownloadUrlForLayer struct { } func (*awsAwsjson11_deserializeOpGetDownloadUrlForLayer) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetDownloadUrlForLayer) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetDownloadUrlForLayer(response, &metadata) } output := &GetDownloadUrlForLayerOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetDownloadUrlForLayerOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetDownloadUrlForLayer(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LayerInaccessibleException", errorCode): return awsAwsjson11_deserializeErrorLayerInaccessibleException(response, errorBody) case strings.EqualFold("LayersNotFoundException", errorCode): return awsAwsjson11_deserializeErrorLayersNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnableToGetUpstreamLayerException", errorCode): return awsAwsjson11_deserializeErrorUnableToGetUpstreamLayerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetLifecyclePolicy struct { } func (*awsAwsjson11_deserializeOpGetLifecyclePolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetLifecyclePolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetLifecyclePolicy(response, &metadata) } output := &GetLifecyclePolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetLifecyclePolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetLifecyclePolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LifecyclePolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorLifecyclePolicyNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetLifecyclePolicyPreview struct { } func (*awsAwsjson11_deserializeOpGetLifecyclePolicyPreview) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetLifecyclePolicyPreview) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetLifecyclePolicyPreview(response, &metadata) } output := &GetLifecyclePolicyPreviewOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetLifecyclePolicyPreviewOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetLifecyclePolicyPreview(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LifecyclePolicyPreviewNotFoundException", errorCode): return awsAwsjson11_deserializeErrorLifecyclePolicyPreviewNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetRegistryPolicy struct { } func (*awsAwsjson11_deserializeOpGetRegistryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetRegistryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetRegistryPolicy(response, &metadata) } output := &GetRegistryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetRegistryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetRegistryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RegistryPolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRegistryPolicyNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetRegistryScanningConfiguration struct { } func (*awsAwsjson11_deserializeOpGetRegistryScanningConfiguration) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetRegistryScanningConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetRegistryScanningConfiguration(response, &metadata) } output := &GetRegistryScanningConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetRegistryScanningConfigurationOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetRegistryScanningConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetRepositoryPolicy struct { } func (*awsAwsjson11_deserializeOpGetRepositoryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response, &metadata) } output := &GetRepositoryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetRepositoryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryPolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpInitiateLayerUpload struct { } func (*awsAwsjson11_deserializeOpInitiateLayerUpload) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpInitiateLayerUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response, &metadata) } output := &InitiateLayerUploadOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentInitiateLayerUploadOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("KmsException", errorCode): return awsAwsjson11_deserializeErrorKmsException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpListImages struct { } func (*awsAwsjson11_deserializeOpListImages) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpListImages) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorListImages(response, &metadata) } output := &ListImagesOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentListImagesOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorListImages(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpListTagsForResource struct { } func (*awsAwsjson11_deserializeOpListTagsForResource) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpListTagsForResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorListTagsForResource(response, &metadata) } output := &ListTagsForResourceOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentListTagsForResourceOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutAccountSetting struct { } func (*awsAwsjson11_deserializeOpPutAccountSetting) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutAccountSetting) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutAccountSetting(response, &metadata) } output := &PutAccountSettingOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutAccountSettingOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutAccountSetting(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutImage struct { } func (*awsAwsjson11_deserializeOpPutImage) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutImage(response, &metadata) } output := &PutImageOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutImageOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("ImageAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorImageAlreadyExistsException(response, errorBody) case strings.EqualFold("ImageDigestDoesNotMatchException", errorCode): return awsAwsjson11_deserializeErrorImageDigestDoesNotMatchException(response, errorBody) case strings.EqualFold("ImageTagAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorImageTagAlreadyExistsException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("KmsException", errorCode): return awsAwsjson11_deserializeErrorKmsException(response, errorBody) case strings.EqualFold("LayersNotFoundException", errorCode): return awsAwsjson11_deserializeErrorLayersNotFoundException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("ReferencedImagesNotFoundException", errorCode): return awsAwsjson11_deserializeErrorReferencedImagesNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutImageScanningConfiguration struct { } func (*awsAwsjson11_deserializeOpPutImageScanningConfiguration) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutImageScanningConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutImageScanningConfiguration(response, &metadata) } output := &PutImageScanningConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutImageScanningConfigurationOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutImageScanningConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutImageTagMutability struct { } func (*awsAwsjson11_deserializeOpPutImageTagMutability) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutImageTagMutability) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutImageTagMutability(response, &metadata) } output := &PutImageTagMutabilityOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutImageTagMutabilityOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutImageTagMutability(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutLifecyclePolicy struct { } func (*awsAwsjson11_deserializeOpPutLifecyclePolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutLifecyclePolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutLifecyclePolicy(response, &metadata) } output := &PutLifecyclePolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutLifecyclePolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutLifecyclePolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutRegistryPolicy struct { } func (*awsAwsjson11_deserializeOpPutRegistryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutRegistryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutRegistryPolicy(response, &metadata) } output := &PutRegistryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutRegistryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutRegistryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutRegistryScanningConfiguration struct { } func (*awsAwsjson11_deserializeOpPutRegistryScanningConfiguration) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutRegistryScanningConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutRegistryScanningConfiguration(response, &metadata) } output := &PutRegistryScanningConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutRegistryScanningConfigurationOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutRegistryScanningConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutReplicationConfiguration struct { } func (*awsAwsjson11_deserializeOpPutReplicationConfiguration) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutReplicationConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutReplicationConfiguration(response, &metadata) } output := &PutReplicationConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutReplicationConfigurationOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutReplicationConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpSetRepositoryPolicy struct { } func (*awsAwsjson11_deserializeOpSetRepositoryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpSetRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response, &metadata) } output := &SetRepositoryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentSetRepositoryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpStartImageScan struct { } func (*awsAwsjson11_deserializeOpStartImageScan) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpStartImageScan) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorStartImageScan(response, &metadata) } output := &StartImageScanOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentStartImageScanOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorStartImageScan(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("ImageNotFoundException", errorCode): return awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedImageTypeException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedImageTypeException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpStartLifecyclePolicyPreview struct { } func (*awsAwsjson11_deserializeOpStartLifecyclePolicyPreview) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpStartLifecyclePolicyPreview) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorStartLifecyclePolicyPreview(response, &metadata) } output := &StartLifecyclePolicyPreviewOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentStartLifecyclePolicyPreviewOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorStartLifecyclePolicyPreview(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LifecyclePolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorLifecyclePolicyNotFoundException(response, errorBody) case strings.EqualFold("LifecyclePolicyPreviewInProgressException", errorCode): return awsAwsjson11_deserializeErrorLifecyclePolicyPreviewInProgressException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpTagResource struct { } func (*awsAwsjson11_deserializeOpTagResource) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpTagResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorTagResource(response, &metadata) } output := &TagResourceOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentTagResourceOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("InvalidTagParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TooManyTagsException", errorCode): return awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpUntagResource struct { } func (*awsAwsjson11_deserializeOpUntagResource) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpUntagResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorUntagResource(response, &metadata) } output := &UntagResourceOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentUntagResourceOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("InvalidTagParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TooManyTagsException", errorCode): return awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpUpdatePullThroughCacheRule struct { } func (*awsAwsjson11_deserializeOpUpdatePullThroughCacheRule) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpUpdatePullThroughCacheRule) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorUpdatePullThroughCacheRule(response, &metadata) } output := &UpdatePullThroughCacheRuleOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentUpdatePullThroughCacheRuleOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorUpdatePullThroughCacheRule(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("PullThroughCacheRuleNotFoundException", errorCode): return awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response, errorBody) case strings.EqualFold("SecretNotFoundException", errorCode): return awsAwsjson11_deserializeErrorSecretNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnableToAccessSecretException", errorCode): return awsAwsjson11_deserializeErrorUnableToAccessSecretException(response, errorBody) case strings.EqualFold("UnableToDecryptSecretValueException", errorCode): return awsAwsjson11_deserializeErrorUnableToDecryptSecretValueException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpUpdateRepositoryCreationTemplate struct { } func (*awsAwsjson11_deserializeOpUpdateRepositoryCreationTemplate) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpUpdateRepositoryCreationTemplate) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorUpdateRepositoryCreationTemplate(response, &metadata) } output := &UpdateRepositoryCreationTemplateOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentUpdateRepositoryCreationTemplateOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorUpdateRepositoryCreationTemplate(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TemplateNotFoundException", errorCode): return awsAwsjson11_deserializeErrorTemplateNotFoundException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpUploadLayerPart struct { } func (*awsAwsjson11_deserializeOpUploadLayerPart) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpUploadLayerPart) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorUploadLayerPart(response, &metadata) } output := &UploadLayerPartOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentUploadLayerPartOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidLayerPartException", errorCode): return awsAwsjson11_deserializeErrorInvalidLayerPartException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("KmsException", errorCode): return awsAwsjson11_deserializeErrorKmsException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UploadNotFoundException", errorCode): return awsAwsjson11_deserializeErrorUploadNotFoundException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpValidatePullThroughCacheRule struct { } func (*awsAwsjson11_deserializeOpValidatePullThroughCacheRule) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpValidatePullThroughCacheRule) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorValidatePullThroughCacheRule(response, &metadata) } output := &ValidatePullThroughCacheRuleOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentValidatePullThroughCacheRuleOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorValidatePullThroughCacheRule(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("PullThroughCacheRuleNotFoundException", errorCode): return awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("ValidationException", errorCode): return awsAwsjson11_deserializeErrorValidationException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsAwsjson11_deserializeErrorEmptyUploadException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.EmptyUploadException{} err := awsAwsjson11_deserializeDocumentEmptyUploadException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorImageAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ImageAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentImageAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorImageDigestDoesNotMatchException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ImageDigestDoesNotMatchException{} err := awsAwsjson11_deserializeDocumentImageDigestDoesNotMatchException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorImageNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ImageNotFoundException{} err := awsAwsjson11_deserializeDocumentImageNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorImageTagAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ImageTagAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentImageTagAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorInvalidLayerException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.InvalidLayerException{} err := awsAwsjson11_deserializeDocumentInvalidLayerException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorInvalidLayerPartException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.InvalidLayerPartException{} err := awsAwsjson11_deserializeDocumentInvalidLayerPartException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorInvalidParameterException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.InvalidParameterException{} err := awsAwsjson11_deserializeDocumentInvalidParameterException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorInvalidTagParameterException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.InvalidTagParameterException{} err := awsAwsjson11_deserializeDocumentInvalidTagParameterException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorKmsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.KmsException{} err := awsAwsjson11_deserializeDocumentKmsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLayerAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LayerAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentLayerAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLayerInaccessibleException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LayerInaccessibleException{} err := awsAwsjson11_deserializeDocumentLayerInaccessibleException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLayerPartTooSmallException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LayerPartTooSmallException{} err := awsAwsjson11_deserializeDocumentLayerPartTooSmallException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLayersNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LayersNotFoundException{} err := awsAwsjson11_deserializeDocumentLayersNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLifecyclePolicyNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LifecyclePolicyNotFoundException{} err := awsAwsjson11_deserializeDocumentLifecyclePolicyNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLifecyclePolicyPreviewInProgressException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LifecyclePolicyPreviewInProgressException{} err := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewInProgressException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLifecyclePolicyPreviewNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LifecyclePolicyPreviewNotFoundException{} err := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLimitExceededException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LimitExceededException{} err := awsAwsjson11_deserializeDocumentLimitExceededException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorPullThroughCacheRuleAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.PullThroughCacheRuleAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentPullThroughCacheRuleAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorPullThroughCacheRuleNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.PullThroughCacheRuleNotFoundException{} err := awsAwsjson11_deserializeDocumentPullThroughCacheRuleNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorReferencedImagesNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ReferencedImagesNotFoundException{} err := awsAwsjson11_deserializeDocumentReferencedImagesNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRegistryPolicyNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RegistryPolicyNotFoundException{} err := awsAwsjson11_deserializeDocumentRegistryPolicyNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentRepositoryAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryNotEmptyException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryNotEmptyException{} err := awsAwsjson11_deserializeDocumentRepositoryNotEmptyException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryNotFoundException{} err := awsAwsjson11_deserializeDocumentRepositoryNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryPolicyNotFoundException{} err := awsAwsjson11_deserializeDocumentRepositoryPolicyNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorScanNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ScanNotFoundException{} err := awsAwsjson11_deserializeDocumentScanNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorSecretNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.SecretNotFoundException{} err := awsAwsjson11_deserializeDocumentSecretNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorServerException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ServerException{} err := awsAwsjson11_deserializeDocumentServerException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorTemplateAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.TemplateAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentTemplateAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorTemplateNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.TemplateNotFoundException{} err := awsAwsjson11_deserializeDocumentTemplateNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorTooManyTagsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.TooManyTagsException{} err := awsAwsjson11_deserializeDocumentTooManyTagsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUnableToAccessSecretException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UnableToAccessSecretException{} err := awsAwsjson11_deserializeDocumentUnableToAccessSecretException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUnableToDecryptSecretValueException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UnableToDecryptSecretValueException{} err := awsAwsjson11_deserializeDocumentUnableToDecryptSecretValueException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUnableToGetUpstreamImageException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UnableToGetUpstreamImageException{} err := awsAwsjson11_deserializeDocumentUnableToGetUpstreamImageException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUnableToGetUpstreamLayerException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UnableToGetUpstreamLayerException{} err := awsAwsjson11_deserializeDocumentUnableToGetUpstreamLayerException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUnsupportedImageTypeException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UnsupportedImageTypeException{} err := awsAwsjson11_deserializeDocumentUnsupportedImageTypeException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUnsupportedUpstreamRegistryException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UnsupportedUpstreamRegistryException{} err := awsAwsjson11_deserializeDocumentUnsupportedUpstreamRegistryException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUploadNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UploadNotFoundException{} err := awsAwsjson11_deserializeDocumentUploadNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorValidationException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ValidationException{} err := awsAwsjson11_deserializeDocumentValidationException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeDocumentAttribute(v **types.Attribute, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Attribute if *v == nil { sv = &types.Attribute{} } else { sv = *v } for key, value := range shape { switch key { case "key": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected AttributeKey to be of type string, got %T instead", value) } sv.Key = ptr.String(jtv) } case "value": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected AttributeValue to be of type string, got %T instead", value) } sv.Value = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentAttributeList(v *[]types.Attribute, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Attribute if *v == nil { cv = []types.Attribute{} } else { cv = *v } for _, value := range shape { var col types.Attribute destAddr := &col if err := awsAwsjson11_deserializeDocumentAttribute(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentAuthorizationData(v **types.AuthorizationData, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.AuthorizationData if *v == nil { sv = &types.AuthorizationData{} } else { sv = *v } for key, value := range shape { switch key { case "authorizationToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Base64 to be of type string, got %T instead", value) } sv.AuthorizationToken = ptr.String(jtv) } case "expiresAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.ExpiresAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected ExpirationTimestamp to be a JSON Number, got %T instead", value) } } case "proxyEndpoint": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ProxyEndpoint to be of type string, got %T instead", value) } sv.ProxyEndpoint = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentAuthorizationDataList(v *[]types.AuthorizationData, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.AuthorizationData if *v == nil { cv = []types.AuthorizationData{} } else { cv = *v } for _, value := range shape { var col types.AuthorizationData destAddr := &col if err := awsAwsjson11_deserializeDocumentAuthorizationData(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentAwsEcrContainerImageDetails(v **types.AwsEcrContainerImageDetails, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.AwsEcrContainerImageDetails if *v == nil { sv = &types.AwsEcrContainerImageDetails{} } else { sv = *v } for key, value := range shape { switch key { case "architecture": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Arch to be of type string, got %T instead", value) } sv.Architecture = ptr.String(jtv) } case "author": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Author to be of type string, got %T instead", value) } sv.Author = ptr.String(jtv) } case "imageHash": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageDigest to be of type string, got %T instead", value) } sv.ImageHash = ptr.String(jtv) } case "imageTags": if err := awsAwsjson11_deserializeDocumentImageTagsList(&sv.ImageTags, value); err != nil { return err } case "platform": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Platform to be of type string, got %T instead", value) } sv.Platform = ptr.String(jtv) } case "pushedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.PushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected Date to be a JSON Number, got %T instead", value) } } case "registry": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.Registry = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentCvssScore(v **types.CvssScore, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.CvssScore if *v == nil { sv = &types.CvssScore{} } else { sv = *v } for key, value := range shape { switch key { case "baseScore": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.BaseScore = f64 case string: var f64 float64 switch { case strings.EqualFold(jtv, "NaN"): f64 = math.NaN() case strings.EqualFold(jtv, "Infinity"): f64 = math.Inf(1) case strings.EqualFold(jtv, "-Infinity"): f64 = math.Inf(-1) default: return fmt.Errorf("unknown JSON number value: %s", jtv) } sv.BaseScore = f64 default: return fmt.Errorf("expected BaseScore to be a JSON Number, got %T instead", value) } } case "scoringVector": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScoringVector to be of type string, got %T instead", value) } sv.ScoringVector = ptr.String(jtv) } case "source": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Source to be of type string, got %T instead", value) } sv.Source = ptr.String(jtv) } case "version": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Version to be of type string, got %T instead", value) } sv.Version = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentCvssScoreAdjustment(v **types.CvssScoreAdjustment, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.CvssScoreAdjustment if *v == nil { sv = &types.CvssScoreAdjustment{} } else { sv = *v } for key, value := range shape { switch key { case "metric": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Metric to be of type string, got %T instead", value) } sv.Metric = ptr.String(jtv) } case "reason": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Reason to be of type string, got %T instead", value) } sv.Reason = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentCvssScoreAdjustmentList(v *[]types.CvssScoreAdjustment, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.CvssScoreAdjustment if *v == nil { cv = []types.CvssScoreAdjustment{} } else { cv = *v } for _, value := range shape { var col types.CvssScoreAdjustment destAddr := &col if err := awsAwsjson11_deserializeDocumentCvssScoreAdjustment(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentCvssScoreDetails(v **types.CvssScoreDetails, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.CvssScoreDetails if *v == nil { sv = &types.CvssScoreDetails{} } else { sv = *v } for key, value := range shape { switch key { case "adjustments": if err := awsAwsjson11_deserializeDocumentCvssScoreAdjustmentList(&sv.Adjustments, value); err != nil { return err } case "score": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.Score = f64 case string: var f64 float64 switch { case strings.EqualFold(jtv, "NaN"): f64 = math.NaN() case strings.EqualFold(jtv, "Infinity"): f64 = math.Inf(1) case strings.EqualFold(jtv, "-Infinity"): f64 = math.Inf(-1) default: return fmt.Errorf("unknown JSON number value: %s", jtv) } sv.Score = f64 default: return fmt.Errorf("expected Score to be a JSON Number, got %T instead", value) } } case "scoreSource": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Source to be of type string, got %T instead", value) } sv.ScoreSource = ptr.String(jtv) } case "scoringVector": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScoringVector to be of type string, got %T instead", value) } sv.ScoringVector = ptr.String(jtv) } case "version": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Version to be of type string, got %T instead", value) } sv.Version = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentCvssScoreList(v *[]types.CvssScore, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.CvssScore if *v == nil { cv = []types.CvssScore{} } else { cv = *v } for _, value := range shape { var col types.CvssScore destAddr := &col if err := awsAwsjson11_deserializeDocumentCvssScore(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentEmptyUploadException(v **types.EmptyUploadException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.EmptyUploadException if *v == nil { sv = &types.EmptyUploadException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentEncryptionConfiguration(v **types.EncryptionConfiguration, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.EncryptionConfiguration if *v == nil { sv = &types.EncryptionConfiguration{} } else { sv = *v } for key, value := range shape { switch key { case "encryptionType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected EncryptionType to be of type string, got %T instead", value) } sv.EncryptionType = types.EncryptionType(jtv) } case "kmsKey": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected KmsKey to be of type string, got %T instead", value) } sv.KmsKey = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(v **types.EncryptionConfigurationForRepositoryCreationTemplate, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.EncryptionConfigurationForRepositoryCreationTemplate if *v == nil { sv = &types.EncryptionConfigurationForRepositoryCreationTemplate{} } else { sv = *v } for key, value := range shape { switch key { case "encryptionType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected EncryptionType to be of type string, got %T instead", value) } sv.EncryptionType = types.EncryptionType(jtv) } case "kmsKey": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected KmsKeyForRepositoryCreationTemplate to be of type string, got %T instead", value) } sv.KmsKey = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentEnhancedImageScanFinding(v **types.EnhancedImageScanFinding, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.EnhancedImageScanFinding if *v == nil { sv = &types.EnhancedImageScanFinding{} } else { sv = *v } for key, value := range shape { switch key { case "awsAccountId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.AwsAccountId = ptr.String(jtv) } case "description": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected FindingDescription to be of type string, got %T instead", value) } sv.Description = ptr.String(jtv) } case "exploitAvailable": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExploitAvailable to be of type string, got %T instead", value) } sv.ExploitAvailable = ptr.String(jtv) } case "findingArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected FindingArn to be of type string, got %T instead", value) } sv.FindingArn = ptr.String(jtv) } case "firstObservedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.FirstObservedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected Date to be a JSON Number, got %T instead", value) } } case "fixAvailable": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected FixAvailable to be of type string, got %T instead", value) } sv.FixAvailable = ptr.String(jtv) } case "lastObservedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.LastObservedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected Date to be a JSON Number, got %T instead", value) } } case "packageVulnerabilityDetails": if err := awsAwsjson11_deserializeDocumentPackageVulnerabilityDetails(&sv.PackageVulnerabilityDetails, value); err != nil { return err } case "remediation": if err := awsAwsjson11_deserializeDocumentRemediation(&sv.Remediation, value); err != nil { return err } case "resources": if err := awsAwsjson11_deserializeDocumentResourceList(&sv.Resources, value); err != nil { return err } case "score": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.Score = f64 case string: var f64 float64 switch { case strings.EqualFold(jtv, "NaN"): f64 = math.NaN() case strings.EqualFold(jtv, "Infinity"): f64 = math.Inf(1) case strings.EqualFold(jtv, "-Infinity"): f64 = math.Inf(-1) default: return fmt.Errorf("unknown JSON number value: %s", jtv) } sv.Score = f64 default: return fmt.Errorf("expected Score to be a JSON Number, got %T instead", value) } } case "scoreDetails": if err := awsAwsjson11_deserializeDocumentScoreDetails(&sv.ScoreDetails, value); err != nil { return err } case "severity": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Severity to be of type string, got %T instead", value) } sv.Severity = ptr.String(jtv) } case "status": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Status to be of type string, got %T instead", value) } sv.Status = ptr.String(jtv) } case "title": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Title to be of type string, got %T instead", value) } sv.Title = ptr.String(jtv) } case "type": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Type to be of type string, got %T instead", value) } sv.Type = ptr.String(jtv) } case "updatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.UpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected Date to be a JSON Number, got %T instead", value) } } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentEnhancedImageScanFindingList(v *[]types.EnhancedImageScanFinding, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.EnhancedImageScanFinding if *v == nil { cv = []types.EnhancedImageScanFinding{} } else { cv = *v } for _, value := range shape { var col types.EnhancedImageScanFinding destAddr := &col if err := awsAwsjson11_deserializeDocumentEnhancedImageScanFinding(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentFindingSeverityCounts(v *map[string]int32, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var mv map[string]int32 if *v == nil { mv = map[string]int32{} } else { mv = *v } for key, value := range shape { var parsedVal int32 if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected SeverityCount to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } parsedVal = int32(i64) } mv[key] = parsedVal } *v = mv return nil } func awsAwsjson11_deserializeDocumentImage(v **types.Image, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Image if *v == nil { sv = &types.Image{} } else { sv = *v } for key, value := range shape { switch key { case "imageId": if err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil { return err } case "imageManifest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageManifest to be of type string, got %T instead", value) } sv.ImageManifest = ptr.String(jtv) } case "imageManifestMediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.ImageManifestMediaType = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageAlreadyExistsException(v **types.ImageAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageAlreadyExistsException if *v == nil { sv = &types.ImageAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageDetail(v **types.ImageDetail, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageDetail if *v == nil { sv = &types.ImageDetail{} } else { sv = *v } for key, value := range shape { switch key { case "artifactMediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.ArtifactMediaType = ptr.String(jtv) } case "imageDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageDigest to be of type string, got %T instead", value) } sv.ImageDigest = ptr.String(jtv) } case "imageManifestMediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.ImageManifestMediaType = ptr.String(jtv) } case "imagePushedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.ImagePushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected PushTimestamp to be a JSON Number, got %T instead", value) } } case "imageScanFindingsSummary": if err := awsAwsjson11_deserializeDocumentImageScanFindingsSummary(&sv.ImageScanFindingsSummary, value); err != nil { return err } case "imageScanStatus": if err := awsAwsjson11_deserializeDocumentImageScanStatus(&sv.ImageScanStatus, value); err != nil { return err } case "imageSizeInBytes": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected ImageSizeInBytes to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.ImageSizeInBytes = ptr.Int64(i64) } case "imageTags": if err := awsAwsjson11_deserializeDocumentImageTagList(&sv.ImageTags, value); err != nil { return err } case "lastRecordedPullTime": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.LastRecordedPullTime = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected RecordedPullTimestamp to be a JSON Number, got %T instead", value) } } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageDetailList(v *[]types.ImageDetail, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageDetail if *v == nil { cv = []types.ImageDetail{} } else { cv = *v } for _, value := range shape { var col types.ImageDetail destAddr := &col if err := awsAwsjson11_deserializeDocumentImageDetail(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageDigestDoesNotMatchException(v **types.ImageDigestDoesNotMatchException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageDigestDoesNotMatchException if *v == nil { sv = &types.ImageDigestDoesNotMatchException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageFailure(v **types.ImageFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageFailure if *v == nil { sv = &types.ImageFailure{} } else { sv = *v } for key, value := range shape { switch key { case "failureCode": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageFailureCode to be of type string, got %T instead", value) } sv.FailureCode = types.ImageFailureCode(jtv) } case "failureReason": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageFailureReason to be of type string, got %T instead", value) } sv.FailureReason = ptr.String(jtv) } case "imageId": if err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageFailureList(v *[]types.ImageFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageFailure if *v == nil { cv = []types.ImageFailure{} } else { cv = *v } for _, value := range shape { var col types.ImageFailure destAddr := &col if err := awsAwsjson11_deserializeDocumentImageFailure(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageIdentifier(v **types.ImageIdentifier, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageIdentifier if *v == nil { sv = &types.ImageIdentifier{} } else { sv = *v } for key, value := range shape { switch key { case "imageDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageDigest to be of type string, got %T instead", value) } sv.ImageDigest = ptr.String(jtv) } case "imageTag": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTag to be of type string, got %T instead", value) } sv.ImageTag = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageIdentifierList(v *[]types.ImageIdentifier, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageIdentifier if *v == nil { cv = []types.ImageIdentifier{} } else { cv = *v } for _, value := range shape { var col types.ImageIdentifier destAddr := &col if err := awsAwsjson11_deserializeDocumentImageIdentifier(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageList(v *[]types.Image, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Image if *v == nil { cv = []types.Image{} } else { cv = *v } for _, value := range shape { var col types.Image destAddr := &col if err := awsAwsjson11_deserializeDocumentImage(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageNotFoundException(v **types.ImageNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageNotFoundException if *v == nil { sv = &types.ImageNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageReplicationStatus(v **types.ImageReplicationStatus, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageReplicationStatus if *v == nil { sv = &types.ImageReplicationStatus{} } else { sv = *v } for key, value := range shape { switch key { case "failureCode": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ReplicationError to be of type string, got %T instead", value) } sv.FailureCode = ptr.String(jtv) } case "region": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Region to be of type string, got %T instead", value) } sv.Region = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "status": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ReplicationStatus to be of type string, got %T instead", value) } sv.Status = types.ReplicationStatus(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageReplicationStatusList(v *[]types.ImageReplicationStatus, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageReplicationStatus if *v == nil { cv = []types.ImageReplicationStatus{} } else { cv = *v } for _, value := range shape { var col types.ImageReplicationStatus destAddr := &col if err := awsAwsjson11_deserializeDocumentImageReplicationStatus(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageScanFinding(v **types.ImageScanFinding, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageScanFinding if *v == nil { sv = &types.ImageScanFinding{} } else { sv = *v } for key, value := range shape { switch key { case "attributes": if err := awsAwsjson11_deserializeDocumentAttributeList(&sv.Attributes, value); err != nil { return err } case "description": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected FindingDescription to be of type string, got %T instead", value) } sv.Description = ptr.String(jtv) } case "name": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected FindingName to be of type string, got %T instead", value) } sv.Name = ptr.String(jtv) } case "severity": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected FindingSeverity to be of type string, got %T instead", value) } sv.Severity = types.FindingSeverity(jtv) } case "uri": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.Uri = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageScanFindingList(v *[]types.ImageScanFinding, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageScanFinding if *v == nil { cv = []types.ImageScanFinding{} } else { cv = *v } for _, value := range shape { var col types.ImageScanFinding destAddr := &col if err := awsAwsjson11_deserializeDocumentImageScanFinding(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageScanFindings(v **types.ImageScanFindings, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageScanFindings if *v == nil { sv = &types.ImageScanFindings{} } else { sv = *v } for key, value := range shape { switch key { case "enhancedFindings": if err := awsAwsjson11_deserializeDocumentEnhancedImageScanFindingList(&sv.EnhancedFindings, value); err != nil { return err } case "findings": if err := awsAwsjson11_deserializeDocumentImageScanFindingList(&sv.Findings, value); err != nil { return err } case "findingSeverityCounts": if err := awsAwsjson11_deserializeDocumentFindingSeverityCounts(&sv.FindingSeverityCounts, value); err != nil { return err } case "imageScanCompletedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.ImageScanCompletedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected ScanTimestamp to be a JSON Number, got %T instead", value) } } case "vulnerabilitySourceUpdatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.VulnerabilitySourceUpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected VulnerabilitySourceUpdateTimestamp to be a JSON Number, got %T instead", value) } } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageScanFindingsSummary(v **types.ImageScanFindingsSummary, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageScanFindingsSummary if *v == nil { sv = &types.ImageScanFindingsSummary{} } else { sv = *v } for key, value := range shape { switch key { case "findingSeverityCounts": if err := awsAwsjson11_deserializeDocumentFindingSeverityCounts(&sv.FindingSeverityCounts, value); err != nil { return err } case "imageScanCompletedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.ImageScanCompletedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected ScanTimestamp to be a JSON Number, got %T instead", value) } } case "vulnerabilitySourceUpdatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.VulnerabilitySourceUpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected VulnerabilitySourceUpdateTimestamp to be a JSON Number, got %T instead", value) } } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageScanningConfiguration(v **types.ImageScanningConfiguration, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageScanningConfiguration if *v == nil { sv = &types.ImageScanningConfiguration{} } else { sv = *v } for key, value := range shape { switch key { case "scanOnPush": if value != nil { jtv, ok := value.(bool) if !ok { return fmt.Errorf("expected ScanOnPushFlag to be of type *bool, got %T instead", value) } sv.ScanOnPush = jtv } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageScanStatus(v **types.ImageScanStatus, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageScanStatus if *v == nil { sv = &types.ImageScanStatus{} } else { sv = *v } for key, value := range shape { switch key { case "description": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanStatusDescription to be of type string, got %T instead", value) } sv.Description = ptr.String(jtv) } case "status": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanStatus to be of type string, got %T instead", value) } sv.Status = types.ScanStatus(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageTagAlreadyExistsException(v **types.ImageTagAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageTagAlreadyExistsException if *v == nil { sv = &types.ImageTagAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageTagList(v *[]string, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []string if *v == nil { cv = []string{} } else { cv = *v } for _, value := range shape { var col string if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTag to be of type string, got %T instead", value) } col = jtv } cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageTagsList(v *[]string, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []string if *v == nil { cv = []string{} } else { cv = *v } for _, value := range shape { var col string if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTag to be of type string, got %T instead", value) } col = jtv } cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentInvalidLayerException(v **types.InvalidLayerException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.InvalidLayerException if *v == nil { sv = &types.InvalidLayerException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentInvalidLayerPartException(v **types.InvalidLayerPartException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.InvalidLayerPartException if *v == nil { sv = &types.InvalidLayerPartException{} } else { sv = *v } for key, value := range shape { switch key { case "lastValidByteReceived": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected PartSize to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.LastValidByteReceived = ptr.Int64(i64) } case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "uploadId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UploadId to be of type string, got %T instead", value) } sv.UploadId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentInvalidParameterException(v **types.InvalidParameterException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.InvalidParameterException if *v == nil { sv = &types.InvalidParameterException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentInvalidTagParameterException(v **types.InvalidTagParameterException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.InvalidTagParameterException if *v == nil { sv = &types.InvalidTagParameterException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentKmsException(v **types.KmsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.KmsException if *v == nil { sv = &types.KmsException{} } else { sv = *v } for key, value := range shape { switch key { case "kmsError": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected KmsError to be of type string, got %T instead", value) } sv.KmsError = ptr.String(jtv) } case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayer(v **types.Layer, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Layer if *v == nil { sv = &types.Layer{} } else { sv = *v } for key, value := range shape { switch key { case "layerAvailability": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerAvailability to be of type string, got %T instead", value) } sv.LayerAvailability = types.LayerAvailability(jtv) } case "layerDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerDigest to be of type string, got %T instead", value) } sv.LayerDigest = ptr.String(jtv) } case "layerSize": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected LayerSizeInBytes to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.LayerSize = ptr.Int64(i64) } case "mediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.MediaType = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayerAlreadyExistsException(v **types.LayerAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayerAlreadyExistsException if *v == nil { sv = &types.LayerAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayerFailure(v **types.LayerFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayerFailure if *v == nil { sv = &types.LayerFailure{} } else { sv = *v } for key, value := range shape { switch key { case "failureCode": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerFailureCode to be of type string, got %T instead", value) } sv.FailureCode = types.LayerFailureCode(jtv) } case "failureReason": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerFailureReason to be of type string, got %T instead", value) } sv.FailureReason = ptr.String(jtv) } case "layerDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected BatchedOperationLayerDigest to be of type string, got %T instead", value) } sv.LayerDigest = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayerFailureList(v *[]types.LayerFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.LayerFailure if *v == nil { cv = []types.LayerFailure{} } else { cv = *v } for _, value := range shape { var col types.LayerFailure destAddr := &col if err := awsAwsjson11_deserializeDocumentLayerFailure(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentLayerInaccessibleException(v **types.LayerInaccessibleException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayerInaccessibleException if *v == nil { sv = &types.LayerInaccessibleException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayerList(v *[]types.Layer, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Layer if *v == nil { cv = []types.Layer{} } else { cv = *v } for _, value := range shape { var col types.Layer destAddr := &col if err := awsAwsjson11_deserializeDocumentLayer(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentLayerPartTooSmallException(v **types.LayerPartTooSmallException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayerPartTooSmallException if *v == nil { sv = &types.LayerPartTooSmallException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayersNotFoundException(v **types.LayersNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayersNotFoundException if *v == nil { sv = &types.LayersNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLifecyclePolicyNotFoundException(v **types.LifecyclePolicyNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LifecyclePolicyNotFoundException if *v == nil { sv = &types.LifecyclePolicyNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewInProgressException(v **types.LifecyclePolicyPreviewInProgressException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LifecyclePolicyPreviewInProgressException if *v == nil { sv = &types.LifecyclePolicyPreviewInProgressException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewNotFoundException(v **types.LifecyclePolicyPreviewNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LifecyclePolicyPreviewNotFoundException if *v == nil { sv = &types.LifecyclePolicyPreviewNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewResult(v **types.LifecyclePolicyPreviewResult, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LifecyclePolicyPreviewResult if *v == nil { sv = &types.LifecyclePolicyPreviewResult{} } else { sv = *v } for key, value := range shape { switch key { case "action": if err := awsAwsjson11_deserializeDocumentLifecyclePolicyRuleAction(&sv.Action, value); err != nil { return err } case "appliedRulePriority": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected LifecyclePolicyRulePriority to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.AppliedRulePriority = ptr.Int32(int32(i64)) } case "imageDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageDigest to be of type string, got %T instead", value) } sv.ImageDigest = ptr.String(jtv) } case "imagePushedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.ImagePushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected PushTimestamp to be a JSON Number, got %T instead", value) } } case "imageTags": if err := awsAwsjson11_deserializeDocumentImageTagList(&sv.ImageTags, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewResultList(v *[]types.LifecyclePolicyPreviewResult, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.LifecyclePolicyPreviewResult if *v == nil { cv = []types.LifecyclePolicyPreviewResult{} } else { cv = *v } for _, value := range shape { var col types.LifecyclePolicyPreviewResult destAddr := &col if err := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewResult(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewSummary(v **types.LifecyclePolicyPreviewSummary, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LifecyclePolicyPreviewSummary if *v == nil { sv = &types.LifecyclePolicyPreviewSummary{} } else { sv = *v } for key, value := range shape { switch key { case "expiringImageTotalCount": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected ImageCount to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.ExpiringImageTotalCount = ptr.Int32(int32(i64)) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLifecyclePolicyRuleAction(v **types.LifecyclePolicyRuleAction, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LifecyclePolicyRuleAction if *v == nil { sv = &types.LifecyclePolicyRuleAction{} } else { sv = *v } for key, value := range shape { switch key { case "type": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageActionType to be of type string, got %T instead", value) } sv.Type = types.ImageActionType(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLimitExceededException(v **types.LimitExceededException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LimitExceededException if *v == nil { sv = &types.LimitExceededException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentPackageVulnerabilityDetails(v **types.PackageVulnerabilityDetails, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.PackageVulnerabilityDetails if *v == nil { sv = &types.PackageVulnerabilityDetails{} } else { sv = *v } for key, value := range shape { switch key { case "cvss": if err := awsAwsjson11_deserializeDocumentCvssScoreList(&sv.Cvss, value); err != nil { return err } case "referenceUrls": if err := awsAwsjson11_deserializeDocumentReferenceUrlsList(&sv.ReferenceUrls, value); err != nil { return err } case "relatedVulnerabilities": if err := awsAwsjson11_deserializeDocumentRelatedVulnerabilitiesList(&sv.RelatedVulnerabilities, value); err != nil { return err } case "source": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Source to be of type string, got %T instead", value) } sv.Source = ptr.String(jtv) } case "sourceUrl": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.SourceUrl = ptr.String(jtv) } case "vendorCreatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.VendorCreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected Date to be a JSON Number, got %T instead", value) } } case "vendorSeverity": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Severity to be of type string, got %T instead", value) } sv.VendorSeverity = ptr.String(jtv) } case "vendorUpdatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.VendorUpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected Date to be a JSON Number, got %T instead", value) } } case "vulnerabilityId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected VulnerabilityId to be of type string, got %T instead", value) } sv.VulnerabilityId = ptr.String(jtv) } case "vulnerablePackages": if err := awsAwsjson11_deserializeDocumentVulnerablePackagesList(&sv.VulnerablePackages, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentPullThroughCacheRule(v **types.PullThroughCacheRule, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.PullThroughCacheRule if *v == nil { sv = &types.PullThroughCacheRule{} } else { sv = *v } for key, value := range shape { switch key { case "createdAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected CreationTimestamp to be a JSON Number, got %T instead", value) } } case "credentialArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CredentialArn to be of type string, got %T instead", value) } sv.CredentialArn = ptr.String(jtv) } case "customRoleArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CustomRoleArn to be of type string, got %T instead", value) } sv.CustomRoleArn = ptr.String(jtv) } case "ecrRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.EcrRepositoryPrefix = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "updatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.UpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected UpdatedTimestamp to be a JSON Number, got %T instead", value) } } case "upstreamRegistry": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UpstreamRegistry to be of type string, got %T instead", value) } sv.UpstreamRegistry = types.UpstreamRegistry(jtv) } case "upstreamRegistryUrl": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.UpstreamRegistryUrl = ptr.String(jtv) } case "upstreamRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.UpstreamRepositoryPrefix = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentPullThroughCacheRuleAlreadyExistsException(v **types.PullThroughCacheRuleAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.PullThroughCacheRuleAlreadyExistsException if *v == nil { sv = &types.PullThroughCacheRuleAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentPullThroughCacheRuleList(v *[]types.PullThroughCacheRule, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.PullThroughCacheRule if *v == nil { cv = []types.PullThroughCacheRule{} } else { cv = *v } for _, value := range shape { var col types.PullThroughCacheRule destAddr := &col if err := awsAwsjson11_deserializeDocumentPullThroughCacheRule(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentPullThroughCacheRuleNotFoundException(v **types.PullThroughCacheRuleNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.PullThroughCacheRuleNotFoundException if *v == nil { sv = &types.PullThroughCacheRuleNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRCTAppliedForList(v *[]types.RCTAppliedFor, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.RCTAppliedFor if *v == nil { cv = []types.RCTAppliedFor{} } else { cv = *v } for _, value := range shape { var col types.RCTAppliedFor if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RCTAppliedFor to be of type string, got %T instead", value) } col = types.RCTAppliedFor(jtv) } cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRecommendation(v **types.Recommendation, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Recommendation if *v == nil { sv = &types.Recommendation{} } else { sv = *v } for key, value := range shape { switch key { case "text": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RecommendationText to be of type string, got %T instead", value) } sv.Text = ptr.String(jtv) } case "url": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.Url = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentReferencedImagesNotFoundException(v **types.ReferencedImagesNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ReferencedImagesNotFoundException if *v == nil { sv = &types.ReferencedImagesNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentReferenceUrlsList(v *[]string, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []string if *v == nil { cv = []string{} } else { cv = *v } for _, value := range shape { var col string if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } col = jtv } cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRegistryPolicyNotFoundException(v **types.RegistryPolicyNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RegistryPolicyNotFoundException if *v == nil { sv = &types.RegistryPolicyNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRegistryScanningConfiguration(v **types.RegistryScanningConfiguration, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RegistryScanningConfiguration if *v == nil { sv = &types.RegistryScanningConfiguration{} } else { sv = *v } for key, value := range shape { switch key { case "rules": if err := awsAwsjson11_deserializeDocumentRegistryScanningRuleList(&sv.Rules, value); err != nil { return err } case "scanType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanType to be of type string, got %T instead", value) } sv.ScanType = types.ScanType(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRegistryScanningRule(v **types.RegistryScanningRule, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RegistryScanningRule if *v == nil { sv = &types.RegistryScanningRule{} } else { sv = *v } for key, value := range shape { switch key { case "repositoryFilters": if err := awsAwsjson11_deserializeDocumentScanningRepositoryFilterList(&sv.RepositoryFilters, value); err != nil { return err } case "scanFrequency": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanFrequency to be of type string, got %T instead", value) } sv.ScanFrequency = types.ScanFrequency(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRegistryScanningRuleList(v *[]types.RegistryScanningRule, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.RegistryScanningRule if *v == nil { cv = []types.RegistryScanningRule{} } else { cv = *v } for _, value := range shape { var col types.RegistryScanningRule destAddr := &col if err := awsAwsjson11_deserializeDocumentRegistryScanningRule(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRelatedVulnerabilitiesList(v *[]string, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []string if *v == nil { cv = []string{} } else { cv = *v } for _, value := range shape { var col string if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RelatedVulnerability to be of type string, got %T instead", value) } col = jtv } cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRemediation(v **types.Remediation, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Remediation if *v == nil { sv = &types.Remediation{} } else { sv = *v } for key, value := range shape { switch key { case "recommendation": if err := awsAwsjson11_deserializeDocumentRecommendation(&sv.Recommendation, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentReplicationConfiguration(v **types.ReplicationConfiguration, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ReplicationConfiguration if *v == nil { sv = &types.ReplicationConfiguration{} } else { sv = *v } for key, value := range shape { switch key { case "rules": if err := awsAwsjson11_deserializeDocumentReplicationRuleList(&sv.Rules, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentReplicationDestination(v **types.ReplicationDestination, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ReplicationDestination if *v == nil { sv = &types.ReplicationDestination{} } else { sv = *v } for key, value := range shape { switch key { case "region": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Region to be of type string, got %T instead", value) } sv.Region = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentReplicationDestinationList(v *[]types.ReplicationDestination, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ReplicationDestination if *v == nil { cv = []types.ReplicationDestination{} } else { cv = *v } for _, value := range shape { var col types.ReplicationDestination destAddr := &col if err := awsAwsjson11_deserializeDocumentReplicationDestination(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentReplicationRule(v **types.ReplicationRule, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ReplicationRule if *v == nil { sv = &types.ReplicationRule{} } else { sv = *v } for key, value := range shape { switch key { case "destinations": if err := awsAwsjson11_deserializeDocumentReplicationDestinationList(&sv.Destinations, value); err != nil { return err } case "repositoryFilters": if err := awsAwsjson11_deserializeDocumentRepositoryFilterList(&sv.RepositoryFilters, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentReplicationRuleList(v *[]types.ReplicationRule, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ReplicationRule if *v == nil { cv = []types.ReplicationRule{} } else { cv = *v } for _, value := range shape { var col types.ReplicationRule destAddr := &col if err := awsAwsjson11_deserializeDocumentReplicationRule(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRepository(v **types.Repository, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Repository if *v == nil { sv = &types.Repository{} } else { sv = *v } for key, value := range shape { switch key { case "createdAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected CreationTimestamp to be a JSON Number, got %T instead", value) } } case "encryptionConfiguration": if err := awsAwsjson11_deserializeDocumentEncryptionConfiguration(&sv.EncryptionConfiguration, value); err != nil { return err } case "imageScanningConfiguration": if err := awsAwsjson11_deserializeDocumentImageScanningConfiguration(&sv.ImageScanningConfiguration, value); err != nil { return err } case "imageTagMutability": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTagMutability to be of type string, got %T instead", value) } sv.ImageTagMutability = types.ImageTagMutability(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Arn to be of type string, got %T instead", value) } sv.RepositoryArn = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "repositoryUri": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.RepositoryUri = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryAlreadyExistsException(v **types.RepositoryAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryAlreadyExistsException if *v == nil { sv = &types.RepositoryAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(v **types.RepositoryCreationTemplate, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryCreationTemplate if *v == nil { sv = &types.RepositoryCreationTemplate{} } else { sv = *v } for key, value := range shape { switch key { case "appliedFor": if err := awsAwsjson11_deserializeDocumentRCTAppliedForList(&sv.AppliedFor, value); err != nil { return err } case "createdAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected Date to be a JSON Number, got %T instead", value) } } case "customRoleArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CustomRoleArn to be of type string, got %T instead", value) } sv.CustomRoleArn = ptr.String(jtv) } case "description": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryTemplateDescription to be of type string, got %T instead", value) } sv.Description = ptr.String(jtv) } case "encryptionConfiguration": if err := awsAwsjson11_deserializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(&sv.EncryptionConfiguration, value); err != nil { return err } case "imageTagMutability": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTagMutability to be of type string, got %T instead", value) } sv.ImageTagMutability = types.ImageTagMutability(jtv) } case "lifecyclePolicy": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LifecyclePolicyTextForRepositoryCreationTemplate to be of type string, got %T instead", value) } sv.LifecyclePolicy = ptr.String(jtv) } case "prefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Prefix to be of type string, got %T instead", value) } sv.Prefix = ptr.String(jtv) } case "repositoryPolicy": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryPolicyText to be of type string, got %T instead", value) } sv.RepositoryPolicy = ptr.String(jtv) } case "resourceTags": if err := awsAwsjson11_deserializeDocumentTagList(&sv.ResourceTags, value); err != nil { return err } case "updatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.UpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected Date to be a JSON Number, got %T instead", value) } } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryCreationTemplateList(v *[]types.RepositoryCreationTemplate, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.RepositoryCreationTemplate if *v == nil { cv = []types.RepositoryCreationTemplate{} } else { cv = *v } for _, value := range shape { var col types.RepositoryCreationTemplate destAddr := &col if err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRepositoryFilter(v **types.RepositoryFilter, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryFilter if *v == nil { sv = &types.RepositoryFilter{} } else { sv = *v } for key, value := range shape { switch key { case "filter": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryFilterValue to be of type string, got %T instead", value) } sv.Filter = ptr.String(jtv) } case "filterType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryFilterType to be of type string, got %T instead", value) } sv.FilterType = types.RepositoryFilterType(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryFilterList(v *[]types.RepositoryFilter, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.RepositoryFilter if *v == nil { cv = []types.RepositoryFilter{} } else { cv = *v } for _, value := range shape { var col types.RepositoryFilter destAddr := &col if err := awsAwsjson11_deserializeDocumentRepositoryFilter(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRepositoryList(v *[]types.Repository, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Repository if *v == nil { cv = []types.Repository{} } else { cv = *v } for _, value := range shape { var col types.Repository destAddr := &col if err := awsAwsjson11_deserializeDocumentRepository(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRepositoryNotEmptyException(v **types.RepositoryNotEmptyException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryNotEmptyException if *v == nil { sv = &types.RepositoryNotEmptyException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryNotFoundException(v **types.RepositoryNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryNotFoundException if *v == nil { sv = &types.RepositoryNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryPolicyNotFoundException(v **types.RepositoryPolicyNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryPolicyNotFoundException if *v == nil { sv = &types.RepositoryPolicyNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryScanningConfiguration(v **types.RepositoryScanningConfiguration, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryScanningConfiguration if *v == nil { sv = &types.RepositoryScanningConfiguration{} } else { sv = *v } for key, value := range shape { switch key { case "appliedScanFilters": if err := awsAwsjson11_deserializeDocumentScanningRepositoryFilterList(&sv.AppliedScanFilters, value); err != nil { return err } case "repositoryArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Arn to be of type string, got %T instead", value) } sv.RepositoryArn = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "scanFrequency": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanFrequency to be of type string, got %T instead", value) } sv.ScanFrequency = types.ScanFrequency(jtv) } case "scanOnPush": if value != nil { jtv, ok := value.(bool) if !ok { return fmt.Errorf("expected ScanOnPushFlag to be of type *bool, got %T instead", value) } sv.ScanOnPush = jtv } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationFailure(v **types.RepositoryScanningConfigurationFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryScanningConfigurationFailure if *v == nil { sv = &types.RepositoryScanningConfigurationFailure{} } else { sv = *v } for key, value := range shape { switch key { case "failureCode": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanningConfigurationFailureCode to be of type string, got %T instead", value) } sv.FailureCode = types.ScanningConfigurationFailureCode(jtv) } case "failureReason": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanningConfigurationFailureReason to be of type string, got %T instead", value) } sv.FailureReason = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationFailureList(v *[]types.RepositoryScanningConfigurationFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.RepositoryScanningConfigurationFailure if *v == nil { cv = []types.RepositoryScanningConfigurationFailure{} } else { cv = *v } for _, value := range shape { var col types.RepositoryScanningConfigurationFailure destAddr := &col if err := awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationFailure(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationList(v *[]types.RepositoryScanningConfiguration, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.RepositoryScanningConfiguration if *v == nil { cv = []types.RepositoryScanningConfiguration{} } else { cv = *v } for _, value := range shape { var col types.RepositoryScanningConfiguration destAddr := &col if err := awsAwsjson11_deserializeDocumentRepositoryScanningConfiguration(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentResource(v **types.Resource, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Resource if *v == nil { sv = &types.Resource{} } else { sv = *v } for key, value := range shape { switch key { case "details": if err := awsAwsjson11_deserializeDocumentResourceDetails(&sv.Details, value); err != nil { return err } case "id": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ResourceId to be of type string, got %T instead", value) } sv.Id = ptr.String(jtv) } case "tags": if err := awsAwsjson11_deserializeDocumentTags(&sv.Tags, value); err != nil { return err } case "type": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Type to be of type string, got %T instead", value) } sv.Type = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentResourceDetails(v **types.ResourceDetails, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ResourceDetails if *v == nil { sv = &types.ResourceDetails{} } else { sv = *v } for key, value := range shape { switch key { case "awsEcrContainerImage": if err := awsAwsjson11_deserializeDocumentAwsEcrContainerImageDetails(&sv.AwsEcrContainerImage, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentResourceList(v *[]types.Resource, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Resource if *v == nil { cv = []types.Resource{} } else { cv = *v } for _, value := range shape { var col types.Resource destAddr := &col if err := awsAwsjson11_deserializeDocumentResource(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentScanningRepositoryFilter(v **types.ScanningRepositoryFilter, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ScanningRepositoryFilter if *v == nil { sv = &types.ScanningRepositoryFilter{} } else { sv = *v } for key, value := range shape { switch key { case "filter": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanningRepositoryFilterValue to be of type string, got %T instead", value) } sv.Filter = ptr.String(jtv) } case "filterType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ScanningRepositoryFilterType to be of type string, got %T instead", value) } sv.FilterType = types.ScanningRepositoryFilterType(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentScanningRepositoryFilterList(v *[]types.ScanningRepositoryFilter, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ScanningRepositoryFilter if *v == nil { cv = []types.ScanningRepositoryFilter{} } else { cv = *v } for _, value := range shape { var col types.ScanningRepositoryFilter destAddr := &col if err := awsAwsjson11_deserializeDocumentScanningRepositoryFilter(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentScanNotFoundException(v **types.ScanNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ScanNotFoundException if *v == nil { sv = &types.ScanNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentScoreDetails(v **types.ScoreDetails, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ScoreDetails if *v == nil { sv = &types.ScoreDetails{} } else { sv = *v } for key, value := range shape { switch key { case "cvss": if err := awsAwsjson11_deserializeDocumentCvssScoreDetails(&sv.Cvss, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentSecretNotFoundException(v **types.SecretNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.SecretNotFoundException if *v == nil { sv = &types.SecretNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentServerException(v **types.ServerException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ServerException if *v == nil { sv = &types.ServerException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentTag(v **types.Tag, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Tag if *v == nil { sv = &types.Tag{} } else { sv = *v } for key, value := range shape { switch key { case "Key": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected TagKey to be of type string, got %T instead", value) } sv.Key = ptr.String(jtv) } case "Value": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected TagValue to be of type string, got %T instead", value) } sv.Value = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentTagList(v *[]types.Tag, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Tag if *v == nil { cv = []types.Tag{} } else { cv = *v } for _, value := range shape { var col types.Tag destAddr := &col if err := awsAwsjson11_deserializeDocumentTag(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentTags(v *map[string]string, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var mv map[string]string if *v == nil { mv = map[string]string{} } else { mv = *v } for key, value := range shape { var parsedVal string if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected TagValue to be of type string, got %T instead", value) } parsedVal = jtv } mv[key] = parsedVal } *v = mv return nil } func awsAwsjson11_deserializeDocumentTemplateAlreadyExistsException(v **types.TemplateAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.TemplateAlreadyExistsException if *v == nil { sv = &types.TemplateAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentTemplateNotFoundException(v **types.TemplateNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.TemplateNotFoundException if *v == nil { sv = &types.TemplateNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentTooManyTagsException(v **types.TooManyTagsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.TooManyTagsException if *v == nil { sv = &types.TooManyTagsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUnableToAccessSecretException(v **types.UnableToAccessSecretException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UnableToAccessSecretException if *v == nil { sv = &types.UnableToAccessSecretException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUnableToDecryptSecretValueException(v **types.UnableToDecryptSecretValueException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UnableToDecryptSecretValueException if *v == nil { sv = &types.UnableToDecryptSecretValueException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUnableToGetUpstreamImageException(v **types.UnableToGetUpstreamImageException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UnableToGetUpstreamImageException if *v == nil { sv = &types.UnableToGetUpstreamImageException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUnableToGetUpstreamLayerException(v **types.UnableToGetUpstreamLayerException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UnableToGetUpstreamLayerException if *v == nil { sv = &types.UnableToGetUpstreamLayerException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUnsupportedImageTypeException(v **types.UnsupportedImageTypeException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UnsupportedImageTypeException if *v == nil { sv = &types.UnsupportedImageTypeException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUnsupportedUpstreamRegistryException(v **types.UnsupportedUpstreamRegistryException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UnsupportedUpstreamRegistryException if *v == nil { sv = &types.UnsupportedUpstreamRegistryException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUploadNotFoundException(v **types.UploadNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UploadNotFoundException if *v == nil { sv = &types.UploadNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentValidationException(v **types.ValidationException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ValidationException if *v == nil { sv = &types.ValidationException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentVulnerablePackage(v **types.VulnerablePackage, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.VulnerablePackage if *v == nil { sv = &types.VulnerablePackage{} } else { sv = *v } for key, value := range shape { switch key { case "arch": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Arch to be of type string, got %T instead", value) } sv.Arch = ptr.String(jtv) } case "epoch": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected Epoch to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.Epoch = ptr.Int32(int32(i64)) } case "filePath": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected FilePath to be of type string, got %T instead", value) } sv.FilePath = ptr.String(jtv) } case "fixedInVersion": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected FixedInVersion to be of type string, got %T instead", value) } sv.FixedInVersion = ptr.String(jtv) } case "name": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected VulnerablePackageName to be of type string, got %T instead", value) } sv.Name = ptr.String(jtv) } case "packageManager": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PackageManager to be of type string, got %T instead", value) } sv.PackageManager = ptr.String(jtv) } case "release": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Release to be of type string, got %T instead", value) } sv.Release = ptr.String(jtv) } case "sourceLayerHash": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected SourceLayerHash to be of type string, got %T instead", value) } sv.SourceLayerHash = ptr.String(jtv) } case "version": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Version to be of type string, got %T instead", value) } sv.Version = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentVulnerablePackagesList(v *[]types.VulnerablePackage, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.VulnerablePackage if *v == nil { cv = []types.VulnerablePackage{} } else { cv = *v } for _, value := range shape { var col types.VulnerablePackage destAddr := &col if err := awsAwsjson11_deserializeDocumentVulnerablePackage(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeOpDocumentBatchCheckLayerAvailabilityOutput(v **BatchCheckLayerAvailabilityOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *BatchCheckLayerAvailabilityOutput if *v == nil { sv = &BatchCheckLayerAvailabilityOutput{} } else { sv = *v } for key, value := range shape { switch key { case "failures": if err := awsAwsjson11_deserializeDocumentLayerFailureList(&sv.Failures, value); err != nil { return err } case "layers": if err := awsAwsjson11_deserializeDocumentLayerList(&sv.Layers, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentBatchDeleteImageOutput(v **BatchDeleteImageOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *BatchDeleteImageOutput if *v == nil { sv = &BatchDeleteImageOutput{} } else { sv = *v } for key, value := range shape { switch key { case "failures": if err := awsAwsjson11_deserializeDocumentImageFailureList(&sv.Failures, value); err != nil { return err } case "imageIds": if err := awsAwsjson11_deserializeDocumentImageIdentifierList(&sv.ImageIds, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentBatchGetImageOutput(v **BatchGetImageOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *BatchGetImageOutput if *v == nil { sv = &BatchGetImageOutput{} } else { sv = *v } for key, value := range shape { switch key { case "failures": if err := awsAwsjson11_deserializeDocumentImageFailureList(&sv.Failures, value); err != nil { return err } case "images": if err := awsAwsjson11_deserializeDocumentImageList(&sv.Images, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentBatchGetRepositoryScanningConfigurationOutput(v **BatchGetRepositoryScanningConfigurationOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *BatchGetRepositoryScanningConfigurationOutput if *v == nil { sv = &BatchGetRepositoryScanningConfigurationOutput{} } else { sv = *v } for key, value := range shape { switch key { case "failures": if err := awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationFailureList(&sv.Failures, value); err != nil { return err } case "scanningConfigurations": if err := awsAwsjson11_deserializeDocumentRepositoryScanningConfigurationList(&sv.ScanningConfigurations, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentCompleteLayerUploadOutput(v **CompleteLayerUploadOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *CompleteLayerUploadOutput if *v == nil { sv = &CompleteLayerUploadOutput{} } else { sv = *v } for key, value := range shape { switch key { case "layerDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerDigest to be of type string, got %T instead", value) } sv.LayerDigest = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "uploadId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UploadId to be of type string, got %T instead", value) } sv.UploadId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentCreatePullThroughCacheRuleOutput(v **CreatePullThroughCacheRuleOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *CreatePullThroughCacheRuleOutput if *v == nil { sv = &CreatePullThroughCacheRuleOutput{} } else { sv = *v } for key, value := range shape { switch key { case "createdAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected CreationTimestamp to be a JSON Number, got %T instead", value) } } case "credentialArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CredentialArn to be of type string, got %T instead", value) } sv.CredentialArn = ptr.String(jtv) } case "customRoleArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CustomRoleArn to be of type string, got %T instead", value) } sv.CustomRoleArn = ptr.String(jtv) } case "ecrRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.EcrRepositoryPrefix = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "upstreamRegistry": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UpstreamRegistry to be of type string, got %T instead", value) } sv.UpstreamRegistry = types.UpstreamRegistry(jtv) } case "upstreamRegistryUrl": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.UpstreamRegistryUrl = ptr.String(jtv) } case "upstreamRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.UpstreamRepositoryPrefix = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentCreateRepositoryCreationTemplateOutput(v **CreateRepositoryCreationTemplateOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *CreateRepositoryCreationTemplateOutput if *v == nil { sv = &CreateRepositoryCreationTemplateOutput{} } else { sv = *v } for key, value := range shape { switch key { case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryCreationTemplate": if err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(&sv.RepositoryCreationTemplate, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentCreateRepositoryOutput(v **CreateRepositoryOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *CreateRepositoryOutput if *v == nil { sv = &CreateRepositoryOutput{} } else { sv = *v } for key, value := range shape { switch key { case "repository": if err := awsAwsjson11_deserializeDocumentRepository(&sv.Repository, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDeleteLifecyclePolicyOutput(v **DeleteLifecyclePolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DeleteLifecyclePolicyOutput if *v == nil { sv = &DeleteLifecyclePolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "lastEvaluatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.LastEvaluatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected EvaluationTimestamp to be a JSON Number, got %T instead", value) } } case "lifecyclePolicyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LifecyclePolicyText to be of type string, got %T instead", value) } sv.LifecyclePolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDeletePullThroughCacheRuleOutput(v **DeletePullThroughCacheRuleOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DeletePullThroughCacheRuleOutput if *v == nil { sv = &DeletePullThroughCacheRuleOutput{} } else { sv = *v } for key, value := range shape { switch key { case "createdAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected CreationTimestamp to be a JSON Number, got %T instead", value) } } case "credentialArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CredentialArn to be of type string, got %T instead", value) } sv.CredentialArn = ptr.String(jtv) } case "customRoleArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CustomRoleArn to be of type string, got %T instead", value) } sv.CustomRoleArn = ptr.String(jtv) } case "ecrRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.EcrRepositoryPrefix = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "upstreamRegistryUrl": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.UpstreamRegistryUrl = ptr.String(jtv) } case "upstreamRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.UpstreamRepositoryPrefix = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDeleteRegistryPolicyOutput(v **DeleteRegistryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DeleteRegistryPolicyOutput if *v == nil { sv = &DeleteRegistryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDeleteRepositoryCreationTemplateOutput(v **DeleteRepositoryCreationTemplateOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DeleteRepositoryCreationTemplateOutput if *v == nil { sv = &DeleteRepositoryCreationTemplateOutput{} } else { sv = *v } for key, value := range shape { switch key { case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryCreationTemplate": if err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(&sv.RepositoryCreationTemplate, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDeleteRepositoryOutput(v **DeleteRepositoryOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DeleteRepositoryOutput if *v == nil { sv = &DeleteRepositoryOutput{} } else { sv = *v } for key, value := range shape { switch key { case "repository": if err := awsAwsjson11_deserializeDocumentRepository(&sv.Repository, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDeleteRepositoryPolicyOutput(v **DeleteRepositoryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DeleteRepositoryPolicyOutput if *v == nil { sv = &DeleteRepositoryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeImageReplicationStatusOutput(v **DescribeImageReplicationStatusOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeImageReplicationStatusOutput if *v == nil { sv = &DescribeImageReplicationStatusOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageId": if err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil { return err } case "replicationStatuses": if err := awsAwsjson11_deserializeDocumentImageReplicationStatusList(&sv.ReplicationStatuses, value); err != nil { return err } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeImageScanFindingsOutput(v **DescribeImageScanFindingsOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeImageScanFindingsOutput if *v == nil { sv = &DescribeImageScanFindingsOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageId": if err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil { return err } case "imageScanFindings": if err := awsAwsjson11_deserializeDocumentImageScanFindings(&sv.ImageScanFindings, value); err != nil { return err } case "imageScanStatus": if err := awsAwsjson11_deserializeDocumentImageScanStatus(&sv.ImageScanStatus, value); err != nil { return err } case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeImagesOutput(v **DescribeImagesOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeImagesOutput if *v == nil { sv = &DescribeImagesOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageDetails": if err := awsAwsjson11_deserializeDocumentImageDetailList(&sv.ImageDetails, value); err != nil { return err } case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribePullThroughCacheRulesOutput(v **DescribePullThroughCacheRulesOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribePullThroughCacheRulesOutput if *v == nil { sv = &DescribePullThroughCacheRulesOutput{} } else { sv = *v } for key, value := range shape { switch key { case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } case "pullThroughCacheRules": if err := awsAwsjson11_deserializeDocumentPullThroughCacheRuleList(&sv.PullThroughCacheRules, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeRegistryOutput(v **DescribeRegistryOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeRegistryOutput if *v == nil { sv = &DescribeRegistryOutput{} } else { sv = *v } for key, value := range shape { switch key { case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "replicationConfiguration": if err := awsAwsjson11_deserializeDocumentReplicationConfiguration(&sv.ReplicationConfiguration, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeRepositoriesOutput(v **DescribeRepositoriesOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeRepositoriesOutput if *v == nil { sv = &DescribeRepositoriesOutput{} } else { sv = *v } for key, value := range shape { switch key { case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } case "repositories": if err := awsAwsjson11_deserializeDocumentRepositoryList(&sv.Repositories, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeRepositoryCreationTemplatesOutput(v **DescribeRepositoryCreationTemplatesOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeRepositoryCreationTemplatesOutput if *v == nil { sv = &DescribeRepositoryCreationTemplatesOutput{} } else { sv = *v } for key, value := range shape { switch key { case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryCreationTemplates": if err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplateList(&sv.RepositoryCreationTemplates, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetAccountSettingOutput(v **GetAccountSettingOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetAccountSettingOutput if *v == nil { sv = &GetAccountSettingOutput{} } else { sv = *v } for key, value := range shape { switch key { case "name": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected AccountSettingName to be of type string, got %T instead", value) } sv.Name = ptr.String(jtv) } case "value": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected AccountSettingName to be of type string, got %T instead", value) } sv.Value = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetAuthorizationTokenOutput(v **GetAuthorizationTokenOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetAuthorizationTokenOutput if *v == nil { sv = &GetAuthorizationTokenOutput{} } else { sv = *v } for key, value := range shape { switch key { case "authorizationData": if err := awsAwsjson11_deserializeDocumentAuthorizationDataList(&sv.AuthorizationData, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetDownloadUrlForLayerOutput(v **GetDownloadUrlForLayerOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetDownloadUrlForLayerOutput if *v == nil { sv = &GetDownloadUrlForLayerOutput{} } else { sv = *v } for key, value := range shape { switch key { case "downloadUrl": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.DownloadUrl = ptr.String(jtv) } case "layerDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerDigest to be of type string, got %T instead", value) } sv.LayerDigest = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetLifecyclePolicyOutput(v **GetLifecyclePolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetLifecyclePolicyOutput if *v == nil { sv = &GetLifecyclePolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "lastEvaluatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.LastEvaluatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected EvaluationTimestamp to be a JSON Number, got %T instead", value) } } case "lifecyclePolicyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LifecyclePolicyText to be of type string, got %T instead", value) } sv.LifecyclePolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetLifecyclePolicyPreviewOutput(v **GetLifecyclePolicyPreviewOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetLifecyclePolicyPreviewOutput if *v == nil { sv = &GetLifecyclePolicyPreviewOutput{} } else { sv = *v } for key, value := range shape { switch key { case "lifecyclePolicyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LifecyclePolicyText to be of type string, got %T instead", value) } sv.LifecyclePolicyText = ptr.String(jtv) } case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } case "previewResults": if err := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewResultList(&sv.PreviewResults, value); err != nil { return err } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "status": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LifecyclePolicyPreviewStatus to be of type string, got %T instead", value) } sv.Status = types.LifecyclePolicyPreviewStatus(jtv) } case "summary": if err := awsAwsjson11_deserializeDocumentLifecyclePolicyPreviewSummary(&sv.Summary, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetRegistryPolicyOutput(v **GetRegistryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetRegistryPolicyOutput if *v == nil { sv = &GetRegistryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetRegistryScanningConfigurationOutput(v **GetRegistryScanningConfigurationOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetRegistryScanningConfigurationOutput if *v == nil { sv = &GetRegistryScanningConfigurationOutput{} } else { sv = *v } for key, value := range shape { switch key { case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "scanningConfiguration": if err := awsAwsjson11_deserializeDocumentRegistryScanningConfiguration(&sv.ScanningConfiguration, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetRepositoryPolicyOutput(v **GetRepositoryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetRepositoryPolicyOutput if *v == nil { sv = &GetRepositoryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentInitiateLayerUploadOutput(v **InitiateLayerUploadOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *InitiateLayerUploadOutput if *v == nil { sv = &InitiateLayerUploadOutput{} } else { sv = *v } for key, value := range shape { switch key { case "partSize": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected PartSize to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.PartSize = ptr.Int64(i64) } case "uploadId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UploadId to be of type string, got %T instead", value) } sv.UploadId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentListImagesOutput(v **ListImagesOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *ListImagesOutput if *v == nil { sv = &ListImagesOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageIds": if err := awsAwsjson11_deserializeDocumentImageIdentifierList(&sv.ImageIds, value); err != nil { return err } case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentListTagsForResourceOutput(v **ListTagsForResourceOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *ListTagsForResourceOutput if *v == nil { sv = &ListTagsForResourceOutput{} } else { sv = *v } for key, value := range shape { switch key { case "tags": if err := awsAwsjson11_deserializeDocumentTagList(&sv.Tags, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutAccountSettingOutput(v **PutAccountSettingOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutAccountSettingOutput if *v == nil { sv = &PutAccountSettingOutput{} } else { sv = *v } for key, value := range shape { switch key { case "name": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected AccountSettingName to be of type string, got %T instead", value) } sv.Name = ptr.String(jtv) } case "value": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected AccountSettingValue to be of type string, got %T instead", value) } sv.Value = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutImageOutput(v **PutImageOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutImageOutput if *v == nil { sv = &PutImageOutput{} } else { sv = *v } for key, value := range shape { switch key { case "image": if err := awsAwsjson11_deserializeDocumentImage(&sv.Image, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutImageScanningConfigurationOutput(v **PutImageScanningConfigurationOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutImageScanningConfigurationOutput if *v == nil { sv = &PutImageScanningConfigurationOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageScanningConfiguration": if err := awsAwsjson11_deserializeDocumentImageScanningConfiguration(&sv.ImageScanningConfiguration, value); err != nil { return err } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutImageTagMutabilityOutput(v **PutImageTagMutabilityOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutImageTagMutabilityOutput if *v == nil { sv = &PutImageTagMutabilityOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageTagMutability": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTagMutability to be of type string, got %T instead", value) } sv.ImageTagMutability = types.ImageTagMutability(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutLifecyclePolicyOutput(v **PutLifecyclePolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutLifecyclePolicyOutput if *v == nil { sv = &PutLifecyclePolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "lifecyclePolicyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LifecyclePolicyText to be of type string, got %T instead", value) } sv.LifecyclePolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutRegistryPolicyOutput(v **PutRegistryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutRegistryPolicyOutput if *v == nil { sv = &PutRegistryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutRegistryScanningConfigurationOutput(v **PutRegistryScanningConfigurationOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutRegistryScanningConfigurationOutput if *v == nil { sv = &PutRegistryScanningConfigurationOutput{} } else { sv = *v } for key, value := range shape { switch key { case "registryScanningConfiguration": if err := awsAwsjson11_deserializeDocumentRegistryScanningConfiguration(&sv.RegistryScanningConfiguration, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutReplicationConfigurationOutput(v **PutReplicationConfigurationOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutReplicationConfigurationOutput if *v == nil { sv = &PutReplicationConfigurationOutput{} } else { sv = *v } for key, value := range shape { switch key { case "replicationConfiguration": if err := awsAwsjson11_deserializeDocumentReplicationConfiguration(&sv.ReplicationConfiguration, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentSetRepositoryPolicyOutput(v **SetRepositoryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *SetRepositoryPolicyOutput if *v == nil { sv = &SetRepositoryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentStartImageScanOutput(v **StartImageScanOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *StartImageScanOutput if *v == nil { sv = &StartImageScanOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageId": if err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil { return err } case "imageScanStatus": if err := awsAwsjson11_deserializeDocumentImageScanStatus(&sv.ImageScanStatus, value); err != nil { return err } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentStartLifecyclePolicyPreviewOutput(v **StartLifecyclePolicyPreviewOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *StartLifecyclePolicyPreviewOutput if *v == nil { sv = &StartLifecyclePolicyPreviewOutput{} } else { sv = *v } for key, value := range shape { switch key { case "lifecyclePolicyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LifecyclePolicyText to be of type string, got %T instead", value) } sv.LifecyclePolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "status": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LifecyclePolicyPreviewStatus to be of type string, got %T instead", value) } sv.Status = types.LifecyclePolicyPreviewStatus(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentTagResourceOutput(v **TagResourceOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *TagResourceOutput if *v == nil { sv = &TagResourceOutput{} } else { sv = *v } for key, value := range shape { switch key { default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentUntagResourceOutput(v **UntagResourceOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *UntagResourceOutput if *v == nil { sv = &UntagResourceOutput{} } else { sv = *v } for key, value := range shape { switch key { default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentUpdatePullThroughCacheRuleOutput(v **UpdatePullThroughCacheRuleOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *UpdatePullThroughCacheRuleOutput if *v == nil { sv = &UpdatePullThroughCacheRuleOutput{} } else { sv = *v } for key, value := range shape { switch key { case "credentialArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CredentialArn to be of type string, got %T instead", value) } sv.CredentialArn = ptr.String(jtv) } case "customRoleArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CustomRoleArn to be of type string, got %T instead", value) } sv.CustomRoleArn = ptr.String(jtv) } case "ecrRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.EcrRepositoryPrefix = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "updatedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.UpdatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected UpdatedTimestamp to be a JSON Number, got %T instead", value) } } case "upstreamRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.UpstreamRepositoryPrefix = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentUpdateRepositoryCreationTemplateOutput(v **UpdateRepositoryCreationTemplateOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *UpdateRepositoryCreationTemplateOutput if *v == nil { sv = &UpdateRepositoryCreationTemplateOutput{} } else { sv = *v } for key, value := range shape { switch key { case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryCreationTemplate": if err := awsAwsjson11_deserializeDocumentRepositoryCreationTemplate(&sv.RepositoryCreationTemplate, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentUploadLayerPartOutput(v **UploadLayerPartOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *UploadLayerPartOutput if *v == nil { sv = &UploadLayerPartOutput{} } else { sv = *v } for key, value := range shape { switch key { case "lastByteReceived": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected PartSize to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.LastByteReceived = ptr.Int64(i64) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "uploadId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UploadId to be of type string, got %T instead", value) } sv.UploadId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentValidatePullThroughCacheRuleOutput(v **ValidatePullThroughCacheRuleOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *ValidatePullThroughCacheRuleOutput if *v == nil { sv = &ValidatePullThroughCacheRuleOutput{} } else { sv = *v } for key, value := range shape { switch key { case "credentialArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CredentialArn to be of type string, got %T instead", value) } sv.CredentialArn = ptr.String(jtv) } case "customRoleArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected CustomRoleArn to be of type string, got %T instead", value) } sv.CustomRoleArn = ptr.String(jtv) } case "ecrRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.EcrRepositoryPrefix = ptr.String(jtv) } case "failure": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PTCValidateFailure to be of type string, got %T instead", value) } sv.Failure = ptr.String(jtv) } case "isValid": if value != nil { jtv, ok := value.(bool) if !ok { return fmt.Errorf("expected IsPTCRuleValid to be of type *bool, got %T instead", value) } sv.IsValid = jtv } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "upstreamRegistryUrl": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.UpstreamRegistryUrl = ptr.String(jtv) } case "upstreamRepositoryPrefix": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected PullThroughCacheRuleRepositoryPrefix to be of type string, got %T instead", value) } sv.UpstreamRepositoryPrefix = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } type protocolErrorInfo struct { Type string `json:"__type"` Message string Code any // nonstandard for awsjson but some services do present the type here } func getProtocolErrorInfo(decoder *json.Decoder) (protocolErrorInfo, error) { var errInfo protocolErrorInfo if err := decoder.Decode(&errInfo); err != nil { if err == io.EOF { return errInfo, nil } return errInfo, err } return errInfo, nil } func resolveProtocolErrorType(headerType string, bodyInfo protocolErrorInfo) (string, bool) { if len(headerType) != 0 { return headerType, true } else if len(bodyInfo.Type) != 0 { return bodyInfo.Type, true } else if code, ok := bodyInfo.Code.(string); ok && len(code) != 0 { return code, true } return "", false } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/doc.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. // Package ecr provides the API client, operations, and parameter types for Amazon // Elastic Container Registry. // // # Amazon Elastic Container Registry // // Amazon Elastic Container Registry (Amazon ECR) is a managed container image // registry service. Customers can use the familiar Docker CLI, or their preferred // client, to push, pull, and manage images. Amazon ECR provides a secure, // scalable, and reliable registry for your Docker or Open Container Initiative // (OCI) images. Amazon ECR supports private repositories with resource-based // permissions using IAM so that specific users or Amazon EC2 instances can access // repositories and images. // // Amazon ECR has service endpoints in each supported Region. For more // information, see [Amazon ECR endpoints]in the Amazon Web Services General Reference. // // [Amazon ECR endpoints]: https://docs.aws.amazon.com/general/latest/gr/ecr.html package ecr ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/endpoints.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" "github.com/aws/aws-sdk-go-v2/internal/endpoints" "github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn" internalendpoints "github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints" smithyauth "github.com/aws/smithy-go/auth" smithyendpoints "github.com/aws/smithy-go/endpoints" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "net/http" "net/url" "os" "strings" ) // EndpointResolverOptions is the service endpoint resolver options type EndpointResolverOptions = internalendpoints.Options // EndpointResolver interface for resolving service endpoints. type EndpointResolver interface { ResolveEndpoint(region string, options EndpointResolverOptions) (aws.Endpoint, error) } var _ EndpointResolver = &internalendpoints.Resolver{} // NewDefaultEndpointResolver constructs a new service endpoint resolver func NewDefaultEndpointResolver() *internalendpoints.Resolver { return internalendpoints.New() } // EndpointResolverFunc is a helper utility that wraps a function so it satisfies // the EndpointResolver interface. This is useful when you want to add additional // endpoint resolving logic, or stub out specific endpoints with custom values. type EndpointResolverFunc func(region string, options EndpointResolverOptions) (aws.Endpoint, error) func (fn EndpointResolverFunc) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { return fn(region, options) } // EndpointResolverFromURL returns an EndpointResolver configured using the // provided endpoint url. By default, the resolved endpoint resolver uses the // client region as signing region, and the endpoint source is set to // EndpointSourceCustom.You can provide functional options to configure endpoint // values for the resolved endpoint. func EndpointResolverFromURL(url string, optFns ...func(*aws.Endpoint)) EndpointResolver { e := aws.Endpoint{URL: url, Source: aws.EndpointSourceCustom} for _, fn := range optFns { fn(&e) } return EndpointResolverFunc( func(region string, options EndpointResolverOptions) (aws.Endpoint, error) { if len(e.SigningRegion) == 0 { e.SigningRegion = region } return e, nil }, ) } type ResolveEndpoint struct { Resolver EndpointResolver Options EndpointResolverOptions } func (*ResolveEndpoint) ID() string { return "ResolveEndpoint" } func (m *ResolveEndpoint) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { if !awsmiddleware.GetRequiresLegacyEndpoints(ctx) { return next.HandleSerialize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.Resolver == nil { return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } eo := m.Options eo.Logger = middleware.GetLogger(ctx) var endpoint aws.Endpoint endpoint, err = m.Resolver.ResolveEndpoint(awsmiddleware.GetRegion(ctx), eo) if err != nil { nf := (&aws.EndpointNotFoundError{}) if errors.As(err, &nf) { ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, false) return next.HandleSerialize(ctx, in) } return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) } req.URL, err = url.Parse(endpoint.URL) if err != nil { return out, metadata, fmt.Errorf("failed to parse endpoint URL: %w", err) } if len(awsmiddleware.GetSigningName(ctx)) == 0 { signingName := endpoint.SigningName if len(signingName) == 0 { signingName = "ecr" } ctx = awsmiddleware.SetSigningName(ctx, signingName) } ctx = awsmiddleware.SetEndpointSource(ctx, endpoint.Source) ctx = smithyhttp.SetHostnameImmutable(ctx, endpoint.HostnameImmutable) ctx = awsmiddleware.SetSigningRegion(ctx, endpoint.SigningRegion) ctx = awsmiddleware.SetPartitionID(ctx, endpoint.PartitionID) return next.HandleSerialize(ctx, in) } func addResolveEndpointMiddleware(stack *middleware.Stack, o Options) error { return stack.Serialize.Insert(&ResolveEndpoint{ Resolver: o.EndpointResolver, Options: o.EndpointOptions, }, "OperationSerializer", middleware.Before) } func removeResolveEndpointMiddleware(stack *middleware.Stack) error { _, err := stack.Serialize.Remove((&ResolveEndpoint{}).ID()) return err } type wrappedEndpointResolver struct { awsResolver aws.EndpointResolverWithOptions } func (w *wrappedEndpointResolver) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { return w.awsResolver.ResolveEndpoint(ServiceID, region, options) } type awsEndpointResolverAdaptor func(service, region string) (aws.Endpoint, error) func (a awsEndpointResolverAdaptor) ResolveEndpoint(service, region string, options ...interface{}) (aws.Endpoint, error) { return a(service, region) } var _ aws.EndpointResolverWithOptions = awsEndpointResolverAdaptor(nil) // withEndpointResolver returns an aws.EndpointResolverWithOptions that first delegates endpoint resolution to the awsResolver. // If awsResolver returns aws.EndpointNotFoundError error, the v1 resolver middleware will swallow the error, // and set an appropriate context flag such that fallback will occur when EndpointResolverV2 is invoked // via its middleware. // // If another error (besides aws.EndpointNotFoundError) is returned, then that error will be propagated. func withEndpointResolver(awsResolver aws.EndpointResolver, awsResolverWithOptions aws.EndpointResolverWithOptions) EndpointResolver { var resolver aws.EndpointResolverWithOptions if awsResolverWithOptions != nil { resolver = awsResolverWithOptions } else if awsResolver != nil { resolver = awsEndpointResolverAdaptor(awsResolver.ResolveEndpoint) } return &wrappedEndpointResolver{ awsResolver: resolver, } } func finalizeClientEndpointResolverOptions(options *Options) { options.EndpointOptions.LogDeprecated = options.ClientLogMode.IsDeprecatedUsage() if len(options.EndpointOptions.ResolvedRegion) == 0 { const fipsInfix = "-fips-" const fipsPrefix = "fips-" const fipsSuffix = "-fips" if strings.Contains(options.Region, fipsInfix) || strings.Contains(options.Region, fipsPrefix) || strings.Contains(options.Region, fipsSuffix) { options.EndpointOptions.ResolvedRegion = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll( options.Region, fipsInfix, "-"), fipsPrefix, ""), fipsSuffix, "") options.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled } } } func resolveEndpointResolverV2(options *Options) { if options.EndpointResolverV2 == nil { options.EndpointResolverV2 = NewDefaultEndpointResolverV2() } } func resolveBaseEndpoint(cfg aws.Config, o *Options) { if cfg.BaseEndpoint != nil { o.BaseEndpoint = cfg.BaseEndpoint } _, g := os.LookupEnv("AWS_ENDPOINT_URL") _, s := os.LookupEnv("AWS_ENDPOINT_URL_ECR") if g && !s { return } value, found, err := internalConfig.ResolveServiceBaseEndpoint(context.Background(), "ECR", cfg.ConfigSources) if found && err == nil { o.BaseEndpoint = &value } } func bindRegion(region string) *string { if region == "" { return nil } return aws.String(endpoints.MapFIPSRegion(region)) } // EndpointParameters provides the parameters that influence how endpoints are // resolved. type EndpointParameters struct { // The AWS region used to dispatch the request. // // Parameter is // required. // // AWS::Region Region *string // When true, use the dual-stack endpoint. If the configured endpoint does not // support dual-stack, dispatching the request MAY return an error. // // Defaults to // false if no value is provided. // // AWS::UseDualStack UseDualStack *bool // When true, send this request to the FIPS-compliant regional endpoint. If the // configured endpoint does not have a FIPS compliant endpoint, dispatching the // request will return an error. // // Defaults to false if no value is // provided. // // AWS::UseFIPS UseFIPS *bool // Override the endpoint used to send this request // // Parameter is // required. // // SDK::Endpoint Endpoint *string } // ValidateRequired validates required parameters are set. func (p EndpointParameters) ValidateRequired() error { if p.UseDualStack == nil { return fmt.Errorf("parameter UseDualStack is required") } if p.UseFIPS == nil { return fmt.Errorf("parameter UseFIPS is required") } return nil } // WithDefaults returns a shallow copy of EndpointParameterswith default values // applied to members where applicable. func (p EndpointParameters) WithDefaults() EndpointParameters { if p.UseDualStack == nil { p.UseDualStack = ptr.Bool(false) } if p.UseFIPS == nil { p.UseFIPS = ptr.Bool(false) } return p } type stringSlice []string func (s stringSlice) Get(i int) *string { if i < 0 || i >= len(s) { return nil } v := s[i] return &v } // EndpointResolverV2 provides the interface for resolving service endpoints. type EndpointResolverV2 interface { // ResolveEndpoint attempts to resolve the endpoint with the provided options, // returning the endpoint if found. Otherwise an error is returned. ResolveEndpoint(ctx context.Context, params EndpointParameters) ( smithyendpoints.Endpoint, error, ) } // resolver provides the implementation for resolving endpoints. type resolver struct{} func NewDefaultEndpointResolverV2() EndpointResolverV2 { return &resolver{} } // ResolveEndpoint attempts to resolve the endpoint with the provided options, // returning the endpoint if found. Otherwise an error is returned. func (r *resolver) ResolveEndpoint( ctx context.Context, params EndpointParameters, ) ( endpoint smithyendpoints.Endpoint, err error, ) { params = params.WithDefaults() if err = params.ValidateRequired(); err != nil { return endpoint, fmt.Errorf("endpoint parameters are not valid, %w", err) } _UseDualStack := *params.UseDualStack _UseFIPS := *params.UseFIPS if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if _UseFIPS == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: FIPS and custom endpoint are not supported") } if _UseDualStack == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Dualstack and custom endpoint are not supported") } uriString := _Endpoint uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } if exprVal := params.Region; exprVal != nil { _Region := *exprVal _ = _Region if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _PartitionResult := *exprVal _ = _PartitionResult if _UseFIPS == true { if _UseDualStack == true { if true == _PartitionResult.SupportsFIPS { if true == _PartitionResult.SupportsDualStack { if "aws" == _PartitionResult.Name { uriString := func() string { var out strings.Builder out.WriteString("https://ecr-fips.") out.WriteString(_Region) out.WriteString(".api.aws") return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } if "aws-us-gov" == _PartitionResult.Name { uriString := func() string { var out strings.Builder out.WriteString("https://ecr-fips.") out.WriteString(_Region) out.WriteString(".api.aws") return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://api.ecr-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_PartitionResult.DualStackDnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } } return endpoint, fmt.Errorf("endpoint rule error, %s", "FIPS and DualStack are enabled, but this partition does not support one or both") } } if _UseFIPS == true { if _PartitionResult.SupportsFIPS == true { if _PartitionResult.Name == "aws" { uriString := func() string { var out strings.Builder out.WriteString("https://ecr-fips.") out.WriteString(_Region) out.WriteString(".amazonaws.com") return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } if _PartitionResult.Name == "aws-us-gov" { uriString := func() string { var out strings.Builder out.WriteString("https://ecr-fips.") out.WriteString(_Region) out.WriteString(".amazonaws.com") return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://api.ecr-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_PartitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "FIPS is enabled but this partition does not support FIPS") } if _UseDualStack == true { if true == _PartitionResult.SupportsDualStack { if "aws" == _PartitionResult.Name { uriString := func() string { var out strings.Builder out.WriteString("https://ecr.") out.WriteString(_Region) out.WriteString(".api.aws") return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } if "aws-cn" == _PartitionResult.Name { uriString := func() string { var out strings.Builder out.WriteString("https://ecr.") out.WriteString(_Region) out.WriteString(".api.amazonwebservices.com.cn") return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } if "aws-us-gov" == _PartitionResult.Name { uriString := func() string { var out strings.Builder out.WriteString("https://ecr.") out.WriteString(_Region) out.WriteString(".api.aws") return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://api.ecr.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_PartitionResult.DualStackDnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "DualStack is enabled but this partition does not support DualStack") } uriString := func() string { var out strings.Builder out.WriteString("https://api.ecr.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_PartitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Missing Region") } type endpointParamsBinder interface { bindEndpointParams(*EndpointParameters) } func bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters { params := &EndpointParameters{} params.Region = bindRegion(options.Region) params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) params.Endpoint = options.BaseEndpoint if b, ok := input.(endpointParamsBinder); ok { b.bindEndpointParams(params) } return params } type resolveEndpointV2Middleware struct { options Options } func (*resolveEndpointV2Middleware) ID() string { return "ResolveEndpointV2" } func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "ResolveEndpoint") defer span.End() if awsmiddleware.GetRequiresLegacyEndpoints(ctx) { return next.HandleFinalize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.options.EndpointResolverV2 == nil { return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } params := bindEndpointParams(ctx, getOperationInput(ctx), m.options) endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", func() (smithyendpoints.Endpoint, error) { return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) }) if err != nil { return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) } span.SetProperty("client.call.resolved_endpoint", endpt.URI.String()) if endpt.URI.RawPath == "" && req.URL.RawPath != "" { endpt.URI.RawPath = endpt.URI.Path } req.URL.Scheme = endpt.URI.Scheme req.URL.Host = endpt.URI.Host req.URL.Path = smithyhttp.JoinPath(endpt.URI.Path, req.URL.Path) req.URL.RawPath = smithyhttp.JoinPath(endpt.URI.RawPath, req.URL.RawPath) for k := range endpt.Headers { req.Header.Set(k, endpt.Headers.Get(k)) } rscheme := getResolvedAuthScheme(ctx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } opts, _ := smithyauth.GetAuthOptions(&endpt.Properties) for _, o := range opts { rscheme.SignerProperties.SetAll(&o.SignerProperties) } span.End() return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/generated.json ================================================ { "dependencies": { "github.com/aws/aws-sdk-go-v2": "v1.4.0", "github.com/aws/aws-sdk-go-v2/internal/configsources": "v0.0.0-00010101000000-000000000000", "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2": "v2.0.0-00010101000000-000000000000", "github.com/aws/smithy-go": "v1.4.0" }, "files": [ "api_client.go", "api_client_test.go", "api_op_BatchCheckLayerAvailability.go", "api_op_BatchDeleteImage.go", "api_op_BatchGetImage.go", "api_op_BatchGetRepositoryScanningConfiguration.go", "api_op_CompleteLayerUpload.go", "api_op_CreatePullThroughCacheRule.go", "api_op_CreateRepository.go", "api_op_CreateRepositoryCreationTemplate.go", "api_op_DeleteLifecyclePolicy.go", "api_op_DeletePullThroughCacheRule.go", "api_op_DeleteRegistryPolicy.go", "api_op_DeleteRepository.go", "api_op_DeleteRepositoryCreationTemplate.go", "api_op_DeleteRepositoryPolicy.go", "api_op_DescribeImageReplicationStatus.go", "api_op_DescribeImageScanFindings.go", "api_op_DescribeImages.go", "api_op_DescribePullThroughCacheRules.go", "api_op_DescribeRegistry.go", "api_op_DescribeRepositories.go", "api_op_DescribeRepositoryCreationTemplates.go", "api_op_GetAccountSetting.go", "api_op_GetAuthorizationToken.go", "api_op_GetDownloadUrlForLayer.go", "api_op_GetLifecyclePolicy.go", "api_op_GetLifecyclePolicyPreview.go", "api_op_GetRegistryPolicy.go", "api_op_GetRegistryScanningConfiguration.go", "api_op_GetRepositoryPolicy.go", "api_op_InitiateLayerUpload.go", "api_op_ListImages.go", "api_op_ListTagsForResource.go", "api_op_PutAccountSetting.go", "api_op_PutImage.go", "api_op_PutImageScanningConfiguration.go", "api_op_PutImageTagMutability.go", "api_op_PutLifecyclePolicy.go", "api_op_PutRegistryPolicy.go", "api_op_PutRegistryScanningConfiguration.go", "api_op_PutReplicationConfiguration.go", "api_op_SetRepositoryPolicy.go", "api_op_StartImageScan.go", "api_op_StartLifecyclePolicyPreview.go", "api_op_TagResource.go", "api_op_UntagResource.go", "api_op_UpdatePullThroughCacheRule.go", "api_op_UpdateRepositoryCreationTemplate.go", "api_op_UploadLayerPart.go", "api_op_ValidatePullThroughCacheRule.go", "auth.go", "deserializers.go", "doc.go", "endpoints.go", "endpoints_config_test.go", "endpoints_test.go", "generated.json", "internal/endpoints/endpoints.go", "internal/endpoints/endpoints_test.go", "options.go", "protocol_test.go", "serializers.go", "snapshot_test.go", "sra_operation_order_test.go", "types/enums.go", "types/errors.go", "types/types.go", "validators.go" ], "go": "1.22", "module": "github.com/aws/aws-sdk-go-v2/service/ecr", "unstable": false } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package ecr // goModuleVersion is the tagged release for this module const goModuleVersion = "1.44.0" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/internal/endpoints/endpoints.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package endpoints import ( "github.com/aws/aws-sdk-go-v2/aws" endpoints "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2" "github.com/aws/smithy-go/logging" "regexp" ) // Options is the endpoint resolver configuration options type Options struct { // Logger is a logging implementation that log events should be sent to. Logger logging.Logger // LogDeprecated indicates that deprecated endpoints should be logged to the // provided logger. LogDeprecated bool // ResolvedRegion is used to override the region to be resolved, rather then the // using the value passed to the ResolveEndpoint method. This value is used by the // SDK to translate regions like fips-us-east-1 or us-east-1-fips to an alternative // name. You must not set this value directly in your application. ResolvedRegion string // DisableHTTPS informs the resolver to return an endpoint that does not use the // HTTPS scheme. DisableHTTPS bool // UseDualStackEndpoint specifies the resolver must resolve a dual-stack endpoint. UseDualStackEndpoint aws.DualStackEndpointState // UseFIPSEndpoint specifies the resolver must resolve a FIPS endpoint. UseFIPSEndpoint aws.FIPSEndpointState } func (o Options) GetResolvedRegion() string { return o.ResolvedRegion } func (o Options) GetDisableHTTPS() bool { return o.DisableHTTPS } func (o Options) GetUseDualStackEndpoint() aws.DualStackEndpointState { return o.UseDualStackEndpoint } func (o Options) GetUseFIPSEndpoint() aws.FIPSEndpointState { return o.UseFIPSEndpoint } func transformToSharedOptions(options Options) endpoints.Options { return endpoints.Options{ Logger: options.Logger, LogDeprecated: options.LogDeprecated, ResolvedRegion: options.ResolvedRegion, DisableHTTPS: options.DisableHTTPS, UseDualStackEndpoint: options.UseDualStackEndpoint, UseFIPSEndpoint: options.UseFIPSEndpoint, } } // Resolver ECR endpoint resolver type Resolver struct { partitions endpoints.Partitions } // ResolveEndpoint resolves the service endpoint for the given region and options func (r *Resolver) ResolveEndpoint(region string, options Options) (endpoint aws.Endpoint, err error) { if len(region) == 0 { return endpoint, &aws.MissingRegionError{} } opt := transformToSharedOptions(options) return r.partitions.ResolveEndpoint(region, opt) } // New returns a new Resolver func New() *Resolver { return &Resolver{ partitions: defaultPartitions, } } var partitionRegexp = struct { Aws *regexp.Regexp AwsCn *regexp.Regexp AwsEusc *regexp.Regexp AwsIso *regexp.Regexp AwsIsoB *regexp.Regexp AwsIsoE *regexp.Regexp AwsIsoF *regexp.Regexp AwsUsGov *regexp.Regexp }{ Aws: regexp.MustCompile("^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$"), AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"), AwsEusc: regexp.MustCompile("^eusc\\-(de)\\-\\w+\\-\\d+$"), AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"), AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"), AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"), AwsIsoF: regexp.MustCompile("^us\\-isof\\-\\w+\\-\\d+$"), AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"), } var defaultPartitions = endpoints.Partitions{ { ID: "aws", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.DualStackVariant, }: { Hostname: "api.ecr.{region}.api.aws", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.{region}.amazonaws.com", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "api.ecr-fips.{region}.api.aws", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr.{region}.amazonaws.com", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.Aws, IsRegionalized: true, Endpoints: endpoints.Endpoints{ endpoints.EndpointKey{ Region: "af-south-1", }: endpoints.Endpoint{ Hostname: "api.ecr.af-south-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "af-south-1", }, }, endpoints.EndpointKey{ Region: "af-south-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.af-south-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "af-south-1", }, }, endpoints.EndpointKey{ Region: "ap-east-1", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-east-1", }, }, endpoints.EndpointKey{ Region: "ap-east-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-east-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-east-1", }, }, endpoints.EndpointKey{ Region: "ap-northeast-1", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-northeast-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-northeast-1", }, }, endpoints.EndpointKey{ Region: "ap-northeast-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-northeast-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-northeast-1", }, }, endpoints.EndpointKey{ Region: "ap-northeast-2", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-northeast-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-northeast-2", }, }, endpoints.EndpointKey{ Region: "ap-northeast-2", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-northeast-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-northeast-2", }, }, endpoints.EndpointKey{ Region: "ap-northeast-3", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-northeast-3.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-northeast-3", }, }, endpoints.EndpointKey{ Region: "ap-northeast-3", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-northeast-3.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-northeast-3", }, }, endpoints.EndpointKey{ Region: "ap-south-1", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-south-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-south-1", }, }, endpoints.EndpointKey{ Region: "ap-south-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-south-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-south-1", }, }, endpoints.EndpointKey{ Region: "ap-south-2", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-south-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-south-2", }, }, endpoints.EndpointKey{ Region: "ap-south-2", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-south-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-south-2", }, }, endpoints.EndpointKey{ Region: "ap-southeast-1", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-southeast-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-1", }, }, endpoints.EndpointKey{ Region: "ap-southeast-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-southeast-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-1", }, }, endpoints.EndpointKey{ Region: "ap-southeast-2", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-southeast-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-2", }, }, endpoints.EndpointKey{ Region: "ap-southeast-2", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-southeast-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-2", }, }, endpoints.EndpointKey{ Region: "ap-southeast-3", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-southeast-3.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-3", }, }, endpoints.EndpointKey{ Region: "ap-southeast-3", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-southeast-3.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-3", }, }, endpoints.EndpointKey{ Region: "ap-southeast-4", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-southeast-4.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-4", }, }, endpoints.EndpointKey{ Region: "ap-southeast-4", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-southeast-4.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-4", }, }, endpoints.EndpointKey{ Region: "ap-southeast-5", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-southeast-5.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-5", }, }, endpoints.EndpointKey{ Region: "ap-southeast-5", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-southeast-5.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-5", }, }, endpoints.EndpointKey{ Region: "ap-southeast-7", }: endpoints.Endpoint{ Hostname: "api.ecr.ap-southeast-7.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-7", }, }, endpoints.EndpointKey{ Region: "ap-southeast-7", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ap-southeast-7.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ap-southeast-7", }, }, endpoints.EndpointKey{ Region: "ca-central-1", }: endpoints.Endpoint{ Hostname: "api.ecr.ca-central-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ca-central-1", }, }, endpoints.EndpointKey{ Region: "ca-central-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ca-central-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ca-central-1", }, }, endpoints.EndpointKey{ Region: "ca-west-1", }: endpoints.Endpoint{ Hostname: "api.ecr.ca-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "ca-west-1", }, }, endpoints.EndpointKey{ Region: "ca-west-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.ca-west-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "ca-west-1", }, }, endpoints.EndpointKey{ Region: "dkr-us-east-1", }: endpoints.Endpoint{ CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-east-1", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-east-2", }: endpoints.Endpoint{ CredentialScope: endpoints.CredentialScope{ Region: "us-east-2", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-east-2", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-east-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-2", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-west-1", }: endpoints.Endpoint{ CredentialScope: endpoints.CredentialScope{ Region: "us-west-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-west-1", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-west-2", }: endpoints.Endpoint{ CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-west-2", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-west-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "eu-central-1", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-central-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "eu-central-1", }, }, endpoints.EndpointKey{ Region: "eu-central-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.eu-central-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "eu-central-1", }, }, endpoints.EndpointKey{ Region: "eu-central-2", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-central-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "eu-central-2", }, }, endpoints.EndpointKey{ Region: "eu-central-2", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.eu-central-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "eu-central-2", }, }, endpoints.EndpointKey{ Region: "eu-north-1", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-north-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "eu-north-1", }, }, endpoints.EndpointKey{ Region: "eu-north-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.eu-north-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "eu-north-1", }, }, endpoints.EndpointKey{ Region: "eu-south-1", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-south-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "eu-south-1", }, }, endpoints.EndpointKey{ Region: "eu-south-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.eu-south-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "eu-south-1", }, }, endpoints.EndpointKey{ Region: "eu-south-2", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-south-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "eu-south-2", }, }, endpoints.EndpointKey{ Region: "eu-south-2", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.eu-south-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "eu-south-2", }, }, endpoints.EndpointKey{ Region: "eu-west-1", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "eu-west-1", }, }, endpoints.EndpointKey{ Region: "eu-west-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.eu-west-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "eu-west-1", }, }, endpoints.EndpointKey{ Region: "eu-west-2", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-west-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "eu-west-2", }, }, endpoints.EndpointKey{ Region: "eu-west-2", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.eu-west-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "eu-west-2", }, }, endpoints.EndpointKey{ Region: "eu-west-3", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-west-3.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "eu-west-3", }, }, endpoints.EndpointKey{ Region: "eu-west-3", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.eu-west-3.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "eu-west-3", }, }, endpoints.EndpointKey{ Region: "fips-dkr-us-east-1", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-dkr-us-east-2", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-east-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-2", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-dkr-us-west-1", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-dkr-us-west-2", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-west-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-us-east-1", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-us-east-2", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-east-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-2", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-us-west-1", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-us-west-2", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-west-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "il-central-1", }: endpoints.Endpoint{ Hostname: "api.ecr.il-central-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "il-central-1", }, }, endpoints.EndpointKey{ Region: "il-central-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.il-central-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "il-central-1", }, }, endpoints.EndpointKey{ Region: "me-central-1", }: endpoints.Endpoint{ Hostname: "api.ecr.me-central-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "me-central-1", }, }, endpoints.EndpointKey{ Region: "me-central-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.me-central-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "me-central-1", }, }, endpoints.EndpointKey{ Region: "me-south-1", }: endpoints.Endpoint{ Hostname: "api.ecr.me-south-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "me-south-1", }, }, endpoints.EndpointKey{ Region: "me-south-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.me-south-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "me-south-1", }, }, endpoints.EndpointKey{ Region: "mx-central-1", }: endpoints.Endpoint{ Hostname: "api.ecr.mx-central-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "mx-central-1", }, }, endpoints.EndpointKey{ Region: "mx-central-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.mx-central-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "mx-central-1", }, }, endpoints.EndpointKey{ Region: "sa-east-1", }: endpoints.Endpoint{ Hostname: "api.ecr.sa-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "sa-east-1", }, }, endpoints.EndpointKey{ Region: "sa-east-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.sa-east-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "sa-east-1", }, }, endpoints.EndpointKey{ Region: "us-east-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, }, endpoints.EndpointKey{ Region: "us-east-1", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, }, endpoints.EndpointKey{ Region: "us-east-1", Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "ecr-fips.us-east-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, }, endpoints.EndpointKey{ Region: "us-east-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.us-east-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, }, endpoints.EndpointKey{ Region: "us-east-2", }: endpoints.Endpoint{ Hostname: "api.ecr.us-east-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-2", }, }, endpoints.EndpointKey{ Region: "us-east-2", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-east-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-2", }, }, endpoints.EndpointKey{ Region: "us-east-2", Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "ecr-fips.us-east-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-east-2", }, }, endpoints.EndpointKey{ Region: "us-east-2", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.us-east-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-east-2", }, }, endpoints.EndpointKey{ Region: "us-west-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-1", }, }, endpoints.EndpointKey{ Region: "us-west-1", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-1", }, }, endpoints.EndpointKey{ Region: "us-west-1", Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "ecr-fips.us-west-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-west-1", }, }, endpoints.EndpointKey{ Region: "us-west-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.us-west-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-west-1", }, }, endpoints.EndpointKey{ Region: "us-west-2", }: endpoints.Endpoint{ Hostname: "api.ecr.us-west-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, }, endpoints.EndpointKey{ Region: "us-west-2", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-west-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, }, endpoints.EndpointKey{ Region: "us-west-2", Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "ecr-fips.us-west-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, }, endpoints.EndpointKey{ Region: "us-west-2", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.us-west-2.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, }, }, }, { ID: "aws-cn", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.DualStackVariant, }: { Hostname: "api.ecr.{region}.api.amazonwebservices.com.cn", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-fips.{region}.amazonaws.com.cn", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "api.ecr-fips.{region}.api.amazonwebservices.com.cn", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr.{region}.amazonaws.com.cn", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsCn, IsRegionalized: true, Endpoints: endpoints.Endpoints{ endpoints.EndpointKey{ Region: "cn-north-1", }: endpoints.Endpoint{ Hostname: "api.ecr.cn-north-1.amazonaws.com.cn", CredentialScope: endpoints.CredentialScope{ Region: "cn-north-1", }, }, endpoints.EndpointKey{ Region: "cn-north-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.cn-north-1.api.amazonwebservices.com.cn", CredentialScope: endpoints.CredentialScope{ Region: "cn-north-1", }, }, endpoints.EndpointKey{ Region: "cn-northwest-1", }: endpoints.Endpoint{ Hostname: "api.ecr.cn-northwest-1.amazonaws.com.cn", CredentialScope: endpoints.CredentialScope{ Region: "cn-northwest-1", }, }, endpoints.EndpointKey{ Region: "cn-northwest-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.cn-northwest-1.api.amazonwebservices.com.cn", CredentialScope: endpoints.CredentialScope{ Region: "cn-northwest-1", }, }, }, }, { ID: "aws-eusc", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-fips.{region}.amazonaws.eu", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr.{region}.amazonaws.eu", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsEusc, IsRegionalized: true, }, { ID: "aws-iso", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-fips.{region}.c2s.ic.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr.{region}.c2s.ic.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsIso, IsRegionalized: true, Endpoints: endpoints.Endpoints{ endpoints.EndpointKey{ Region: "us-iso-east-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-iso-east-1.c2s.ic.gov", CredentialScope: endpoints.CredentialScope{ Region: "us-iso-east-1", }, }, endpoints.EndpointKey{ Region: "us-iso-west-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-iso-west-1.c2s.ic.gov", CredentialScope: endpoints.CredentialScope{ Region: "us-iso-west-1", }, }, }, }, { ID: "aws-iso-b", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-fips.{region}.sc2s.sgov.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr.{region}.sc2s.sgov.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsIsoB, IsRegionalized: true, Endpoints: endpoints.Endpoints{ endpoints.EndpointKey{ Region: "us-isob-east-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-isob-east-1.sc2s.sgov.gov", CredentialScope: endpoints.CredentialScope{ Region: "us-isob-east-1", }, }, }, }, { ID: "aws-iso-e", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-fips.{region}.cloud.adc-e.uk", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr.{region}.cloud.adc-e.uk", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsIsoE, IsRegionalized: true, Endpoints: endpoints.Endpoints{ endpoints.EndpointKey{ Region: "eu-isoe-west-1", }: endpoints.Endpoint{ Hostname: "api.ecr.eu-isoe-west-1.cloud.adc-e.uk", CredentialScope: endpoints.CredentialScope{ Region: "eu-isoe-west-1", }, }, }, }, { ID: "aws-iso-f", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-fips.{region}.csp.hci.ic.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr.{region}.csp.hci.ic.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsIsoF, IsRegionalized: true, Endpoints: endpoints.Endpoints{ endpoints.EndpointKey{ Region: "us-isof-east-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-isof-east-1.csp.hci.ic.gov", CredentialScope: endpoints.CredentialScope{ Region: "us-isof-east-1", }, }, endpoints.EndpointKey{ Region: "us-isof-south-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-isof-south-1.csp.hci.ic.gov", CredentialScope: endpoints.CredentialScope{ Region: "us-isof-south-1", }, }, }, }, { ID: "aws-us-gov", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.DualStackVariant, }: { Hostname: "api.ecr.{region}.api.aws", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.{region}.amazonaws.com", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "api.ecr-fips.{region}.api.aws", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr.{region}.amazonaws.com", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsUsGov, IsRegionalized: true, Endpoints: endpoints.Endpoints{ endpoints.EndpointKey{ Region: "dkr-us-gov-east-1", }: endpoints.Endpoint{ CredentialScope: endpoints.CredentialScope{ Region: "us-gov-east-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-gov-east-1", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-gov-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-east-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-gov-west-1", }: endpoints.Endpoint{ CredentialScope: endpoints.CredentialScope{ Region: "us-gov-west-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "dkr-us-gov-west-1", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-gov-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-west-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-dkr-us-gov-east-1", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-gov-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-east-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-dkr-us-gov-west-1", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-gov-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-west-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-us-gov-east-1", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-gov-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-east-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "fips-us-gov-west-1", }: endpoints.Endpoint{ Hostname: "ecr-fips.us-gov-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-west-1", }, Deprecated: aws.TrueTernary, }, endpoints.EndpointKey{ Region: "us-gov-east-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-gov-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-east-1", }, }, endpoints.EndpointKey{ Region: "us-gov-east-1", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-gov-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-east-1", }, }, endpoints.EndpointKey{ Region: "us-gov-east-1", Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "ecr-fips.us-gov-east-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-east-1", }, }, endpoints.EndpointKey{ Region: "us-gov-east-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.us-gov-east-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-east-1", }, }, endpoints.EndpointKey{ Region: "us-gov-west-1", }: endpoints.Endpoint{ Hostname: "api.ecr.us-gov-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-west-1", }, }, endpoints.EndpointKey{ Region: "us-gov-west-1", Variant: endpoints.FIPSVariant, }: { Hostname: "ecr-fips.us-gov-west-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-west-1", }, }, endpoints.EndpointKey{ Region: "us-gov-west-1", Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "ecr-fips.us-gov-west-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-west-1", }, }, endpoints.EndpointKey{ Region: "us-gov-west-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr.us-gov-west-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-gov-west-1", }, }, }, }, } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/options.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy" smithyauth "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "net/http" ) type HTTPClient interface { Do(*http.Request) (*http.Response, error) } type Options struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation call to // modify this list for per operation behavior. APIOptions []func(*middleware.Stack) error // The optional application specific identifier appended to the User-Agent header. AppID string // This endpoint will be given as input to an EndpointResolverV2. It is used for // providing a custom base endpoint that is subject to modifications by the // processing EndpointResolverV2. BaseEndpoint *string // Configures the events that will be sent to the configured logger. ClientLogMode aws.ClientLogMode // The credentials object to use when signing requests. Credentials aws.CredentialsProvider // The configuration DefaultsMode that the SDK should use when constructing the // clients initial default settings. DefaultsMode aws.DefaultsMode // The endpoint options to be used when attempting to resolve an endpoint. EndpointOptions EndpointResolverOptions // The service endpoint resolver. // // Deprecated: Deprecated: EndpointResolver and WithEndpointResolver. Providing a // value for this field will likely prevent you from using any endpoint-related // service features released after the introduction of EndpointResolverV2 and // BaseEndpoint. // // To migrate an EndpointResolver implementation that uses a custom endpoint, set // the client option BaseEndpoint instead. EndpointResolver EndpointResolver // Resolves the endpoint used for a particular service operation. This should be // used over the deprecated EndpointResolver. EndpointResolverV2 EndpointResolverV2 // Signature Version 4 (SigV4) Signer HTTPSignerV4 HTTPSignerV4 // The logger writer interface to write logging messages to. Logger logging.Logger // The client meter provider. MeterProvider metrics.MeterProvider // The region to send requests to. (Required) Region string // RetryMaxAttempts specifies the maximum number attempts an API client will call // an operation that fails with a retryable error. A value of 0 is ignored, and // will not be used to configure the API client created default retryer, or modify // per operation call's retry max attempts. // // If specified in an operation call's functional options with a value that is // different than the constructed client's Options, the Client's Retryer will be // wrapped to use the operation's specific RetryMaxAttempts value. RetryMaxAttempts int // RetryMode specifies the retry mode the API client will be created with, if // Retryer option is not also specified. // // When creating a new API Clients this member will only be used if the Retryer // Options member is nil. This value will be ignored if Retryer is not nil. // // Currently does not support per operation call overrides, may in the future. RetryMode aws.RetryMode // Retryer guides how HTTP requests should be retried in case of recoverable // failures. When nil the API client will use a default retryer. The kind of // default retry created by the API client can be changed with the RetryMode // option. Retryer aws.Retryer // The RuntimeEnvironment configuration, only populated if the DefaultsMode is set // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You // should not populate this structure programmatically, or rely on the values here // within your applications. RuntimeEnvironment aws.RuntimeEnvironment // The client tracer provider. TracerProvider tracing.TracerProvider // The initial DefaultsMode used when the client options were constructed. If the // DefaultsMode was set to aws.DefaultsModeAuto this will store what the resolved // value was at that point in time. // // Currently does not support per operation call overrides, may in the future. resolvedDefaultsMode aws.DefaultsMode // The HTTP client to invoke API calls with. Defaults to client's default HTTP // implementation if nil. HTTPClient HTTPClient // The auth scheme resolver which determines how to authenticate for each // operation. AuthSchemeResolver AuthSchemeResolver // The list of auth schemes supported by the client. AuthSchemes []smithyhttp.AuthScheme } // Copy creates a clone where the APIOptions list is deep copied. func (o Options) Copy() Options { to := o to.APIOptions = make([]func(*middleware.Stack) error, len(o.APIOptions)) copy(to.APIOptions, o.APIOptions) return to } func (o Options) GetIdentityResolver(schemeID string) smithyauth.IdentityResolver { if schemeID == "aws.auth#sigv4" { return getSigV4IdentityResolver(o) } if schemeID == "smithy.api#noAuth" { return &smithyauth.AnonymousIdentityResolver{} } return nil } // WithAPIOptions returns a functional option for setting the Client's APIOptions // option. func WithAPIOptions(optFns ...func(*middleware.Stack) error) func(*Options) { return func(o *Options) { o.APIOptions = append(o.APIOptions, optFns...) } } // Deprecated: EndpointResolver and WithEndpointResolver. Providing a value for // this field will likely prevent you from using any endpoint-related service // features released after the introduction of EndpointResolverV2 and BaseEndpoint. // // To migrate an EndpointResolver implementation that uses a custom endpoint, set // the client option BaseEndpoint instead. func WithEndpointResolver(v EndpointResolver) func(*Options) { return func(o *Options) { o.EndpointResolver = v } } // WithEndpointResolverV2 returns a functional option for setting the Client's // EndpointResolverV2 option. func WithEndpointResolverV2(v EndpointResolverV2) func(*Options) { return func(o *Options) { o.EndpointResolverV2 = v } } func getSigV4IdentityResolver(o Options) smithyauth.IdentityResolver { if o.Credentials != nil { return &internalauthsmithy.CredentialsProviderAdapter{Provider: o.Credentials} } return nil } // WithSigV4SigningName applies an override to the authentication workflow to // use the given signing name for SigV4-authenticated operations. // // This is an advanced setting. The value here is FINAL, taking precedence over // the resolved signing name from both auth scheme resolution and endpoint // resolution. func WithSigV4SigningName(name string) func(*Options) { fn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { return next.HandleInitialize(awsmiddleware.SetSigningName(ctx, name), in) } return func(o *Options) { o.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error { return s.Initialize.Add( middleware.InitializeMiddlewareFunc("withSigV4SigningName", fn), middleware.Before, ) }) } } // WithSigV4SigningRegion applies an override to the authentication workflow to // use the given signing region for SigV4-authenticated operations. // // This is an advanced setting. The value here is FINAL, taking precedence over // the resolved signing region from both auth scheme resolution and endpoint // resolution. func WithSigV4SigningRegion(region string) func(*Options) { fn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { return next.HandleInitialize(awsmiddleware.SetSigningRegion(ctx, region), in) } return func(o *Options) { o.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error { return s.Initialize.Add( middleware.InitializeMiddlewareFunc("withSigV4SigningRegion", fn), middleware.Before, ) }) } } func ignoreAnonymousAuth(options *Options) { if aws.IsCredentialsProvider(options.Credentials, (*aws.AnonymousCredentials)(nil)) { options.Credentials = nil } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/serializers.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "bytes" "context" "fmt" "github.com/aws/aws-sdk-go-v2/service/ecr/types" smithy "github.com/aws/smithy-go" "github.com/aws/smithy-go/encoding/httpbinding" smithyjson "github.com/aws/smithy-go/encoding/json" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "path" ) type awsAwsjson11_serializeOpBatchCheckLayerAvailability struct { } func (*awsAwsjson11_serializeOpBatchCheckLayerAvailability) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpBatchCheckLayerAvailability) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*BatchCheckLayerAvailabilityInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.BatchCheckLayerAvailability") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentBatchCheckLayerAvailabilityInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpBatchDeleteImage struct { } func (*awsAwsjson11_serializeOpBatchDeleteImage) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpBatchDeleteImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*BatchDeleteImageInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.BatchDeleteImage") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentBatchDeleteImageInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpBatchGetImage struct { } func (*awsAwsjson11_serializeOpBatchGetImage) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpBatchGetImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*BatchGetImageInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.BatchGetImage") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentBatchGetImageInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpBatchGetRepositoryScanningConfiguration struct { } func (*awsAwsjson11_serializeOpBatchGetRepositoryScanningConfiguration) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpBatchGetRepositoryScanningConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*BatchGetRepositoryScanningConfigurationInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.BatchGetRepositoryScanningConfiguration") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentBatchGetRepositoryScanningConfigurationInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpCompleteLayerUpload struct { } func (*awsAwsjson11_serializeOpCompleteLayerUpload) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpCompleteLayerUpload) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*CompleteLayerUploadInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.CompleteLayerUpload") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentCompleteLayerUploadInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpCreatePullThroughCacheRule struct { } func (*awsAwsjson11_serializeOpCreatePullThroughCacheRule) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpCreatePullThroughCacheRule) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*CreatePullThroughCacheRuleInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.CreatePullThroughCacheRule") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentCreatePullThroughCacheRuleInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpCreateRepository struct { } func (*awsAwsjson11_serializeOpCreateRepository) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpCreateRepository) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*CreateRepositoryInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.CreateRepository") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentCreateRepositoryInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpCreateRepositoryCreationTemplate struct { } func (*awsAwsjson11_serializeOpCreateRepositoryCreationTemplate) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpCreateRepositoryCreationTemplate) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*CreateRepositoryCreationTemplateInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.CreateRepositoryCreationTemplate") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentCreateRepositoryCreationTemplateInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDeleteLifecyclePolicy struct { } func (*awsAwsjson11_serializeOpDeleteLifecyclePolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDeleteLifecyclePolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DeleteLifecyclePolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DeleteLifecyclePolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDeleteLifecyclePolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDeletePullThroughCacheRule struct { } func (*awsAwsjson11_serializeOpDeletePullThroughCacheRule) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDeletePullThroughCacheRule) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DeletePullThroughCacheRuleInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DeletePullThroughCacheRule") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDeletePullThroughCacheRuleInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDeleteRegistryPolicy struct { } func (*awsAwsjson11_serializeOpDeleteRegistryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDeleteRegistryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DeleteRegistryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DeleteRegistryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDeleteRegistryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDeleteRepository struct { } func (*awsAwsjson11_serializeOpDeleteRepository) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDeleteRepository) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DeleteRepositoryInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DeleteRepository") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDeleteRepositoryInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDeleteRepositoryCreationTemplate struct { } func (*awsAwsjson11_serializeOpDeleteRepositoryCreationTemplate) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDeleteRepositoryCreationTemplate) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DeleteRepositoryCreationTemplateInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DeleteRepositoryCreationTemplate") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDeleteRepositoryCreationTemplateInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDeleteRepositoryPolicy struct { } func (*awsAwsjson11_serializeOpDeleteRepositoryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDeleteRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DeleteRepositoryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DeleteRepositoryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDeleteRepositoryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeImageReplicationStatus struct { } func (*awsAwsjson11_serializeOpDescribeImageReplicationStatus) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeImageReplicationStatus) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeImageReplicationStatusInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DescribeImageReplicationStatus") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeImageReplicationStatusInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeImages struct { } func (*awsAwsjson11_serializeOpDescribeImages) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeImages) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeImagesInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DescribeImages") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeImagesInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeImageScanFindings struct { } func (*awsAwsjson11_serializeOpDescribeImageScanFindings) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeImageScanFindings) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeImageScanFindingsInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DescribeImageScanFindings") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeImageScanFindingsInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribePullThroughCacheRules struct { } func (*awsAwsjson11_serializeOpDescribePullThroughCacheRules) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribePullThroughCacheRules) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribePullThroughCacheRulesInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DescribePullThroughCacheRules") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribePullThroughCacheRulesInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeRegistry struct { } func (*awsAwsjson11_serializeOpDescribeRegistry) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeRegistry) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeRegistryInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DescribeRegistry") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeRegistryInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeRepositories struct { } func (*awsAwsjson11_serializeOpDescribeRepositories) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeRepositories) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeRepositoriesInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DescribeRepositories") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeRepositoriesInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeRepositoryCreationTemplates struct { } func (*awsAwsjson11_serializeOpDescribeRepositoryCreationTemplates) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeRepositoryCreationTemplates) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeRepositoryCreationTemplatesInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.DescribeRepositoryCreationTemplates") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeRepositoryCreationTemplatesInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetAccountSetting struct { } func (*awsAwsjson11_serializeOpGetAccountSetting) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetAccountSetting) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetAccountSettingInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.GetAccountSetting") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetAccountSettingInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetAuthorizationToken struct { } func (*awsAwsjson11_serializeOpGetAuthorizationToken) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetAuthorizationToken) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetAuthorizationTokenInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.GetAuthorizationToken") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetAuthorizationTokenInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetDownloadUrlForLayer struct { } func (*awsAwsjson11_serializeOpGetDownloadUrlForLayer) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetDownloadUrlForLayer) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetDownloadUrlForLayerInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.GetDownloadUrlForLayer") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetDownloadUrlForLayerInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetLifecyclePolicy struct { } func (*awsAwsjson11_serializeOpGetLifecyclePolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetLifecyclePolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetLifecyclePolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.GetLifecyclePolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetLifecyclePolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetLifecyclePolicyPreview struct { } func (*awsAwsjson11_serializeOpGetLifecyclePolicyPreview) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetLifecyclePolicyPreview) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetLifecyclePolicyPreviewInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.GetLifecyclePolicyPreview") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetLifecyclePolicyPreviewInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetRegistryPolicy struct { } func (*awsAwsjson11_serializeOpGetRegistryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetRegistryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetRegistryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.GetRegistryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetRegistryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetRegistryScanningConfiguration struct { } func (*awsAwsjson11_serializeOpGetRegistryScanningConfiguration) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetRegistryScanningConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetRegistryScanningConfigurationInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.GetRegistryScanningConfiguration") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetRegistryScanningConfigurationInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetRepositoryPolicy struct { } func (*awsAwsjson11_serializeOpGetRepositoryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetRepositoryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.GetRepositoryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetRepositoryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpInitiateLayerUpload struct { } func (*awsAwsjson11_serializeOpInitiateLayerUpload) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpInitiateLayerUpload) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*InitiateLayerUploadInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.InitiateLayerUpload") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentInitiateLayerUploadInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpListImages struct { } func (*awsAwsjson11_serializeOpListImages) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpListImages) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*ListImagesInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.ListImages") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentListImagesInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpListTagsForResource struct { } func (*awsAwsjson11_serializeOpListTagsForResource) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpListTagsForResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*ListTagsForResourceInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.ListTagsForResource") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentListTagsForResourceInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutAccountSetting struct { } func (*awsAwsjson11_serializeOpPutAccountSetting) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutAccountSetting) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutAccountSettingInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.PutAccountSetting") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutAccountSettingInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutImage struct { } func (*awsAwsjson11_serializeOpPutImage) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutImageInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.PutImage") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutImageInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutImageScanningConfiguration struct { } func (*awsAwsjson11_serializeOpPutImageScanningConfiguration) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutImageScanningConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutImageScanningConfigurationInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.PutImageScanningConfiguration") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutImageScanningConfigurationInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutImageTagMutability struct { } func (*awsAwsjson11_serializeOpPutImageTagMutability) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutImageTagMutability) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutImageTagMutabilityInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.PutImageTagMutability") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutImageTagMutabilityInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutLifecyclePolicy struct { } func (*awsAwsjson11_serializeOpPutLifecyclePolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutLifecyclePolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutLifecyclePolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.PutLifecyclePolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutLifecyclePolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutRegistryPolicy struct { } func (*awsAwsjson11_serializeOpPutRegistryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutRegistryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutRegistryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.PutRegistryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutRegistryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutRegistryScanningConfiguration struct { } func (*awsAwsjson11_serializeOpPutRegistryScanningConfiguration) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutRegistryScanningConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutRegistryScanningConfigurationInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.PutRegistryScanningConfiguration") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutRegistryScanningConfigurationInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutReplicationConfiguration struct { } func (*awsAwsjson11_serializeOpPutReplicationConfiguration) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutReplicationConfiguration) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutReplicationConfigurationInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.PutReplicationConfiguration") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutReplicationConfigurationInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpSetRepositoryPolicy struct { } func (*awsAwsjson11_serializeOpSetRepositoryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpSetRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*SetRepositoryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.SetRepositoryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentSetRepositoryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpStartImageScan struct { } func (*awsAwsjson11_serializeOpStartImageScan) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpStartImageScan) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*StartImageScanInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.StartImageScan") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentStartImageScanInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpStartLifecyclePolicyPreview struct { } func (*awsAwsjson11_serializeOpStartLifecyclePolicyPreview) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpStartLifecyclePolicyPreview) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*StartLifecyclePolicyPreviewInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.StartLifecyclePolicyPreview") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentStartLifecyclePolicyPreviewInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpTagResource struct { } func (*awsAwsjson11_serializeOpTagResource) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpTagResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*TagResourceInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.TagResource") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentTagResourceInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpUntagResource struct { } func (*awsAwsjson11_serializeOpUntagResource) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpUntagResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*UntagResourceInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.UntagResource") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentUntagResourceInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpUpdatePullThroughCacheRule struct { } func (*awsAwsjson11_serializeOpUpdatePullThroughCacheRule) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpUpdatePullThroughCacheRule) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*UpdatePullThroughCacheRuleInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.UpdatePullThroughCacheRule") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentUpdatePullThroughCacheRuleInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpUpdateRepositoryCreationTemplate struct { } func (*awsAwsjson11_serializeOpUpdateRepositoryCreationTemplate) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpUpdateRepositoryCreationTemplate) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*UpdateRepositoryCreationTemplateInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.UpdateRepositoryCreationTemplate") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentUpdateRepositoryCreationTemplateInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpUploadLayerPart struct { } func (*awsAwsjson11_serializeOpUploadLayerPart) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpUploadLayerPart) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*UploadLayerPartInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.UploadLayerPart") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentUploadLayerPartInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpValidatePullThroughCacheRule struct { } func (*awsAwsjson11_serializeOpValidatePullThroughCacheRule) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpValidatePullThroughCacheRule) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*ValidatePullThroughCacheRuleInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("AmazonEC2ContainerRegistry_V20150921.ValidatePullThroughCacheRule") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentValidatePullThroughCacheRuleInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } func awsAwsjson11_serializeDocumentBatchedOperationLayerDigestList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentDescribeImagesFilter(v *types.DescribeImagesFilter, value smithyjson.Value) error { object := value.Object() defer object.Close() if len(v.TagStatus) > 0 { ok := object.Key("tagStatus") ok.String(string(v.TagStatus)) } return nil } func awsAwsjson11_serializeDocumentEncryptionConfiguration(v *types.EncryptionConfiguration, value smithyjson.Value) error { object := value.Object() defer object.Close() if len(v.EncryptionType) > 0 { ok := object.Key("encryptionType") ok.String(string(v.EncryptionType)) } if v.KmsKey != nil { ok := object.Key("kmsKey") ok.String(*v.KmsKey) } return nil } func awsAwsjson11_serializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(v *types.EncryptionConfigurationForRepositoryCreationTemplate, value smithyjson.Value) error { object := value.Object() defer object.Close() if len(v.EncryptionType) > 0 { ok := object.Key("encryptionType") ok.String(string(v.EncryptionType)) } if v.KmsKey != nil { ok := object.Key("kmsKey") ok.String(*v.KmsKey) } return nil } func awsAwsjson11_serializeDocumentGetAuthorizationTokenRegistryIdList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentImageIdentifier(v *types.ImageIdentifier, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageDigest != nil { ok := object.Key("imageDigest") ok.String(*v.ImageDigest) } if v.ImageTag != nil { ok := object.Key("imageTag") ok.String(*v.ImageTag) } return nil } func awsAwsjson11_serializeDocumentImageIdentifierList(v []types.ImageIdentifier, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentImageIdentifier(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentImageScanningConfiguration(v *types.ImageScanningConfiguration, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ScanOnPush { ok := object.Key("scanOnPush") ok.Boolean(v.ScanOnPush) } return nil } func awsAwsjson11_serializeDocumentLayerDigestList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentLifecyclePolicyPreviewFilter(v *types.LifecyclePolicyPreviewFilter, value smithyjson.Value) error { object := value.Object() defer object.Close() if len(v.TagStatus) > 0 { ok := object.Key("tagStatus") ok.String(string(v.TagStatus)) } return nil } func awsAwsjson11_serializeDocumentListImagesFilter(v *types.ListImagesFilter, value smithyjson.Value) error { object := value.Object() defer object.Close() if len(v.TagStatus) > 0 { ok := object.Key("tagStatus") ok.String(string(v.TagStatus)) } return nil } func awsAwsjson11_serializeDocumentMediaTypeList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentPrefixList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentPullThroughCacheRuleRepositoryPrefixList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentRCTAppliedForList(v []types.RCTAppliedFor, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(string(v[i])) } return nil } func awsAwsjson11_serializeDocumentRegistryScanningRule(v *types.RegistryScanningRule, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RepositoryFilters != nil { ok := object.Key("repositoryFilters") if err := awsAwsjson11_serializeDocumentScanningRepositoryFilterList(v.RepositoryFilters, ok); err != nil { return err } } if len(v.ScanFrequency) > 0 { ok := object.Key("scanFrequency") ok.String(string(v.ScanFrequency)) } return nil } func awsAwsjson11_serializeDocumentRegistryScanningRuleList(v []types.RegistryScanningRule, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentRegistryScanningRule(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentReplicationConfiguration(v *types.ReplicationConfiguration, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Rules != nil { ok := object.Key("rules") if err := awsAwsjson11_serializeDocumentReplicationRuleList(v.Rules, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentReplicationDestination(v *types.ReplicationDestination, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Region != nil { ok := object.Key("region") ok.String(*v.Region) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } return nil } func awsAwsjson11_serializeDocumentReplicationDestinationList(v []types.ReplicationDestination, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentReplicationDestination(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentReplicationRule(v *types.ReplicationRule, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Destinations != nil { ok := object.Key("destinations") if err := awsAwsjson11_serializeDocumentReplicationDestinationList(v.Destinations, ok); err != nil { return err } } if v.RepositoryFilters != nil { ok := object.Key("repositoryFilters") if err := awsAwsjson11_serializeDocumentRepositoryFilterList(v.RepositoryFilters, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentReplicationRuleList(v []types.ReplicationRule, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentReplicationRule(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentRepositoryFilter(v *types.RepositoryFilter, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Filter != nil { ok := object.Key("filter") ok.String(*v.Filter) } if len(v.FilterType) > 0 { ok := object.Key("filterType") ok.String(string(v.FilterType)) } return nil } func awsAwsjson11_serializeDocumentRepositoryFilterList(v []types.RepositoryFilter, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentRepositoryFilter(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentRepositoryNameList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentScanningConfigurationRepositoryNameList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentScanningRepositoryFilter(v *types.ScanningRepositoryFilter, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Filter != nil { ok := object.Key("filter") ok.String(*v.Filter) } if len(v.FilterType) > 0 { ok := object.Key("filterType") ok.String(string(v.FilterType)) } return nil } func awsAwsjson11_serializeDocumentScanningRepositoryFilterList(v []types.ScanningRepositoryFilter, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentScanningRepositoryFilter(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentTag(v *types.Tag, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Key != nil { ok := object.Key("Key") ok.String(*v.Key) } if v.Value != nil { ok := object.Key("Value") ok.String(*v.Value) } return nil } func awsAwsjson11_serializeDocumentTagKeyList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentTagList(v []types.Tag, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentTag(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentBatchCheckLayerAvailabilityInput(v *BatchCheckLayerAvailabilityInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LayerDigests != nil { ok := object.Key("layerDigests") if err := awsAwsjson11_serializeDocumentBatchedOperationLayerDigestList(v.LayerDigests, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentBatchDeleteImageInput(v *BatchDeleteImageInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageIds != nil { ok := object.Key("imageIds") if err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentBatchGetImageInput(v *BatchGetImageInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.AcceptedMediaTypes != nil { ok := object.Key("acceptedMediaTypes") if err := awsAwsjson11_serializeDocumentMediaTypeList(v.AcceptedMediaTypes, ok); err != nil { return err } } if v.ImageIds != nil { ok := object.Key("imageIds") if err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentBatchGetRepositoryScanningConfigurationInput(v *BatchGetRepositoryScanningConfigurationInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RepositoryNames != nil { ok := object.Key("repositoryNames") if err := awsAwsjson11_serializeDocumentScanningConfigurationRepositoryNameList(v.RepositoryNames, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentCompleteLayerUploadInput(v *CompleteLayerUploadInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LayerDigests != nil { ok := object.Key("layerDigests") if err := awsAwsjson11_serializeDocumentLayerDigestList(v.LayerDigests, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } if v.UploadId != nil { ok := object.Key("uploadId") ok.String(*v.UploadId) } return nil } func awsAwsjson11_serializeOpDocumentCreatePullThroughCacheRuleInput(v *CreatePullThroughCacheRuleInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.CredentialArn != nil { ok := object.Key("credentialArn") ok.String(*v.CredentialArn) } if v.CustomRoleArn != nil { ok := object.Key("customRoleArn") ok.String(*v.CustomRoleArn) } if v.EcrRepositoryPrefix != nil { ok := object.Key("ecrRepositoryPrefix") ok.String(*v.EcrRepositoryPrefix) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if len(v.UpstreamRegistry) > 0 { ok := object.Key("upstreamRegistry") ok.String(string(v.UpstreamRegistry)) } if v.UpstreamRegistryUrl != nil { ok := object.Key("upstreamRegistryUrl") ok.String(*v.UpstreamRegistryUrl) } if v.UpstreamRepositoryPrefix != nil { ok := object.Key("upstreamRepositoryPrefix") ok.String(*v.UpstreamRepositoryPrefix) } return nil } func awsAwsjson11_serializeOpDocumentCreateRepositoryCreationTemplateInput(v *CreateRepositoryCreationTemplateInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.AppliedFor != nil { ok := object.Key("appliedFor") if err := awsAwsjson11_serializeDocumentRCTAppliedForList(v.AppliedFor, ok); err != nil { return err } } if v.CustomRoleArn != nil { ok := object.Key("customRoleArn") ok.String(*v.CustomRoleArn) } if v.Description != nil { ok := object.Key("description") ok.String(*v.Description) } if v.EncryptionConfiguration != nil { ok := object.Key("encryptionConfiguration") if err := awsAwsjson11_serializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(v.EncryptionConfiguration, ok); err != nil { return err } } if len(v.ImageTagMutability) > 0 { ok := object.Key("imageTagMutability") ok.String(string(v.ImageTagMutability)) } if v.LifecyclePolicy != nil { ok := object.Key("lifecyclePolicy") ok.String(*v.LifecyclePolicy) } if v.Prefix != nil { ok := object.Key("prefix") ok.String(*v.Prefix) } if v.RepositoryPolicy != nil { ok := object.Key("repositoryPolicy") ok.String(*v.RepositoryPolicy) } if v.ResourceTags != nil { ok := object.Key("resourceTags") if err := awsAwsjson11_serializeDocumentTagList(v.ResourceTags, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentCreateRepositoryInput(v *CreateRepositoryInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.EncryptionConfiguration != nil { ok := object.Key("encryptionConfiguration") if err := awsAwsjson11_serializeDocumentEncryptionConfiguration(v.EncryptionConfiguration, ok); err != nil { return err } } if v.ImageScanningConfiguration != nil { ok := object.Key("imageScanningConfiguration") if err := awsAwsjson11_serializeDocumentImageScanningConfiguration(v.ImageScanningConfiguration, ok); err != nil { return err } } if len(v.ImageTagMutability) > 0 { ok := object.Key("imageTagMutability") ok.String(string(v.ImageTagMutability)) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } if v.Tags != nil { ok := object.Key("tags") if err := awsAwsjson11_serializeDocumentTagList(v.Tags, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentDeleteLifecyclePolicyInput(v *DeleteLifecyclePolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDeletePullThroughCacheRuleInput(v *DeletePullThroughCacheRuleInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.EcrRepositoryPrefix != nil { ok := object.Key("ecrRepositoryPrefix") ok.String(*v.EcrRepositoryPrefix) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } return nil } func awsAwsjson11_serializeOpDocumentDeleteRegistryPolicyInput(v *DeleteRegistryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() return nil } func awsAwsjson11_serializeOpDocumentDeleteRepositoryCreationTemplateInput(v *DeleteRepositoryCreationTemplateInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Prefix != nil { ok := object.Key("prefix") ok.String(*v.Prefix) } return nil } func awsAwsjson11_serializeOpDocumentDeleteRepositoryInput(v *DeleteRepositoryInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Force { ok := object.Key("force") ok.Boolean(v.Force) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDeleteRepositoryPolicyInput(v *DeleteRepositoryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDescribeImageReplicationStatusInput(v *DescribeImageReplicationStatusInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageId != nil { ok := object.Key("imageId") if err := awsAwsjson11_serializeDocumentImageIdentifier(v.ImageId, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDescribeImageScanFindingsInput(v *DescribeImageScanFindingsInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageId != nil { ok := object.Key("imageId") if err := awsAwsjson11_serializeDocumentImageIdentifier(v.ImageId, ok); err != nil { return err } } if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDescribeImagesInput(v *DescribeImagesInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Filter != nil { ok := object.Key("filter") if err := awsAwsjson11_serializeDocumentDescribeImagesFilter(v.Filter, ok); err != nil { return err } } if v.ImageIds != nil { ok := object.Key("imageIds") if err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil { return err } } if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDescribePullThroughCacheRulesInput(v *DescribePullThroughCacheRulesInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.EcrRepositoryPrefixes != nil { ok := object.Key("ecrRepositoryPrefixes") if err := awsAwsjson11_serializeDocumentPullThroughCacheRuleRepositoryPrefixList(v.EcrRepositoryPrefixes, ok); err != nil { return err } } if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } return nil } func awsAwsjson11_serializeOpDocumentDescribeRegistryInput(v *DescribeRegistryInput, value smithyjson.Value) error { object := value.Object() defer object.Close() return nil } func awsAwsjson11_serializeOpDocumentDescribeRepositoriesInput(v *DescribeRepositoriesInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryNames != nil { ok := object.Key("repositoryNames") if err := awsAwsjson11_serializeDocumentRepositoryNameList(v.RepositoryNames, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentDescribeRepositoryCreationTemplatesInput(v *DescribeRepositoryCreationTemplatesInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.Prefixes != nil { ok := object.Key("prefixes") if err := awsAwsjson11_serializeDocumentPrefixList(v.Prefixes, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentGetAccountSettingInput(v *GetAccountSettingInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Name != nil { ok := object.Key("name") ok.String(*v.Name) } return nil } func awsAwsjson11_serializeOpDocumentGetAuthorizationTokenInput(v *GetAuthorizationTokenInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryIds != nil { ok := object.Key("registryIds") if err := awsAwsjson11_serializeDocumentGetAuthorizationTokenRegistryIdList(v.RegistryIds, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentGetDownloadUrlForLayerInput(v *GetDownloadUrlForLayerInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LayerDigest != nil { ok := object.Key("layerDigest") ok.String(*v.LayerDigest) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentGetLifecyclePolicyInput(v *GetLifecyclePolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentGetLifecyclePolicyPreviewInput(v *GetLifecyclePolicyPreviewInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Filter != nil { ok := object.Key("filter") if err := awsAwsjson11_serializeDocumentLifecyclePolicyPreviewFilter(v.Filter, ok); err != nil { return err } } if v.ImageIds != nil { ok := object.Key("imageIds") if err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil { return err } } if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentGetRegistryPolicyInput(v *GetRegistryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() return nil } func awsAwsjson11_serializeOpDocumentGetRegistryScanningConfigurationInput(v *GetRegistryScanningConfigurationInput, value smithyjson.Value) error { object := value.Object() defer object.Close() return nil } func awsAwsjson11_serializeOpDocumentGetRepositoryPolicyInput(v *GetRepositoryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentInitiateLayerUploadInput(v *InitiateLayerUploadInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentListImagesInput(v *ListImagesInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Filter != nil { ok := object.Key("filter") if err := awsAwsjson11_serializeDocumentListImagesFilter(v.Filter, ok); err != nil { return err } } if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentListTagsForResourceInput(v *ListTagsForResourceInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ResourceArn != nil { ok := object.Key("resourceArn") ok.String(*v.ResourceArn) } return nil } func awsAwsjson11_serializeOpDocumentPutAccountSettingInput(v *PutAccountSettingInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Name != nil { ok := object.Key("name") ok.String(*v.Name) } if v.Value != nil { ok := object.Key("value") ok.String(*v.Value) } return nil } func awsAwsjson11_serializeOpDocumentPutImageInput(v *PutImageInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageDigest != nil { ok := object.Key("imageDigest") ok.String(*v.ImageDigest) } if v.ImageManifest != nil { ok := object.Key("imageManifest") ok.String(*v.ImageManifest) } if v.ImageManifestMediaType != nil { ok := object.Key("imageManifestMediaType") ok.String(*v.ImageManifestMediaType) } if v.ImageTag != nil { ok := object.Key("imageTag") ok.String(*v.ImageTag) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentPutImageScanningConfigurationInput(v *PutImageScanningConfigurationInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageScanningConfiguration != nil { ok := object.Key("imageScanningConfiguration") if err := awsAwsjson11_serializeDocumentImageScanningConfiguration(v.ImageScanningConfiguration, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentPutImageTagMutabilityInput(v *PutImageTagMutabilityInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if len(v.ImageTagMutability) > 0 { ok := object.Key("imageTagMutability") ok.String(string(v.ImageTagMutability)) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentPutLifecyclePolicyInput(v *PutLifecyclePolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LifecyclePolicyText != nil { ok := object.Key("lifecyclePolicyText") ok.String(*v.LifecyclePolicyText) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentPutRegistryPolicyInput(v *PutRegistryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.PolicyText != nil { ok := object.Key("policyText") ok.String(*v.PolicyText) } return nil } func awsAwsjson11_serializeOpDocumentPutRegistryScanningConfigurationInput(v *PutRegistryScanningConfigurationInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Rules != nil { ok := object.Key("rules") if err := awsAwsjson11_serializeDocumentRegistryScanningRuleList(v.Rules, ok); err != nil { return err } } if len(v.ScanType) > 0 { ok := object.Key("scanType") ok.String(string(v.ScanType)) } return nil } func awsAwsjson11_serializeOpDocumentPutReplicationConfigurationInput(v *PutReplicationConfigurationInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ReplicationConfiguration != nil { ok := object.Key("replicationConfiguration") if err := awsAwsjson11_serializeDocumentReplicationConfiguration(v.ReplicationConfiguration, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentSetRepositoryPolicyInput(v *SetRepositoryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Force { ok := object.Key("force") ok.Boolean(v.Force) } if v.PolicyText != nil { ok := object.Key("policyText") ok.String(*v.PolicyText) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentStartImageScanInput(v *StartImageScanInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageId != nil { ok := object.Key("imageId") if err := awsAwsjson11_serializeDocumentImageIdentifier(v.ImageId, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentStartLifecyclePolicyPreviewInput(v *StartLifecyclePolicyPreviewInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LifecyclePolicyText != nil { ok := object.Key("lifecyclePolicyText") ok.String(*v.LifecyclePolicyText) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentTagResourceInput(v *TagResourceInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ResourceArn != nil { ok := object.Key("resourceArn") ok.String(*v.ResourceArn) } if v.Tags != nil { ok := object.Key("tags") if err := awsAwsjson11_serializeDocumentTagList(v.Tags, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentUntagResourceInput(v *UntagResourceInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ResourceArn != nil { ok := object.Key("resourceArn") ok.String(*v.ResourceArn) } if v.TagKeys != nil { ok := object.Key("tagKeys") if err := awsAwsjson11_serializeDocumentTagKeyList(v.TagKeys, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentUpdatePullThroughCacheRuleInput(v *UpdatePullThroughCacheRuleInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.CredentialArn != nil { ok := object.Key("credentialArn") ok.String(*v.CredentialArn) } if v.CustomRoleArn != nil { ok := object.Key("customRoleArn") ok.String(*v.CustomRoleArn) } if v.EcrRepositoryPrefix != nil { ok := object.Key("ecrRepositoryPrefix") ok.String(*v.EcrRepositoryPrefix) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } return nil } func awsAwsjson11_serializeOpDocumentUpdateRepositoryCreationTemplateInput(v *UpdateRepositoryCreationTemplateInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.AppliedFor != nil { ok := object.Key("appliedFor") if err := awsAwsjson11_serializeDocumentRCTAppliedForList(v.AppliedFor, ok); err != nil { return err } } if v.CustomRoleArn != nil { ok := object.Key("customRoleArn") ok.String(*v.CustomRoleArn) } if v.Description != nil { ok := object.Key("description") ok.String(*v.Description) } if v.EncryptionConfiguration != nil { ok := object.Key("encryptionConfiguration") if err := awsAwsjson11_serializeDocumentEncryptionConfigurationForRepositoryCreationTemplate(v.EncryptionConfiguration, ok); err != nil { return err } } if len(v.ImageTagMutability) > 0 { ok := object.Key("imageTagMutability") ok.String(string(v.ImageTagMutability)) } if v.LifecyclePolicy != nil { ok := object.Key("lifecyclePolicy") ok.String(*v.LifecyclePolicy) } if v.Prefix != nil { ok := object.Key("prefix") ok.String(*v.Prefix) } if v.RepositoryPolicy != nil { ok := object.Key("repositoryPolicy") ok.String(*v.RepositoryPolicy) } if v.ResourceTags != nil { ok := object.Key("resourceTags") if err := awsAwsjson11_serializeDocumentTagList(v.ResourceTags, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentUploadLayerPartInput(v *UploadLayerPartInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LayerPartBlob != nil { ok := object.Key("layerPartBlob") ok.Base64EncodeBytes(v.LayerPartBlob) } if v.PartFirstByte != nil { ok := object.Key("partFirstByte") ok.Long(*v.PartFirstByte) } if v.PartLastByte != nil { ok := object.Key("partLastByte") ok.Long(*v.PartLastByte) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } if v.UploadId != nil { ok := object.Key("uploadId") ok.String(*v.UploadId) } return nil } func awsAwsjson11_serializeOpDocumentValidatePullThroughCacheRuleInput(v *ValidatePullThroughCacheRuleInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.EcrRepositoryPrefix != nil { ok := object.Key("ecrRepositoryPrefix") ok.String(*v.EcrRepositoryPrefix) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/enums.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package types type EncryptionType string // Enum values for EncryptionType const ( EncryptionTypeAes256 EncryptionType = "AES256" EncryptionTypeKms EncryptionType = "KMS" EncryptionTypeKmsDsse EncryptionType = "KMS_DSSE" ) // Values returns all known values for EncryptionType. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (EncryptionType) Values() []EncryptionType { return []EncryptionType{ "AES256", "KMS", "KMS_DSSE", } } type FindingSeverity string // Enum values for FindingSeverity const ( FindingSeverityInformational FindingSeverity = "INFORMATIONAL" FindingSeverityLow FindingSeverity = "LOW" FindingSeverityMedium FindingSeverity = "MEDIUM" FindingSeverityHigh FindingSeverity = "HIGH" FindingSeverityCritical FindingSeverity = "CRITICAL" FindingSeverityUndefined FindingSeverity = "UNDEFINED" ) // Values returns all known values for FindingSeverity. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (FindingSeverity) Values() []FindingSeverity { return []FindingSeverity{ "INFORMATIONAL", "LOW", "MEDIUM", "HIGH", "CRITICAL", "UNDEFINED", } } type ImageActionType string // Enum values for ImageActionType const ( ImageActionTypeExpire ImageActionType = "EXPIRE" ) // Values returns all known values for ImageActionType. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ImageActionType) Values() []ImageActionType { return []ImageActionType{ "EXPIRE", } } type ImageFailureCode string // Enum values for ImageFailureCode const ( ImageFailureCodeInvalidImageDigest ImageFailureCode = "InvalidImageDigest" ImageFailureCodeInvalidImageTag ImageFailureCode = "InvalidImageTag" ImageFailureCodeImageTagDoesNotMatchDigest ImageFailureCode = "ImageTagDoesNotMatchDigest" ImageFailureCodeImageNotFound ImageFailureCode = "ImageNotFound" ImageFailureCodeMissingDigestAndTag ImageFailureCode = "MissingDigestAndTag" ImageFailureCodeImageReferencedByManifestList ImageFailureCode = "ImageReferencedByManifestList" ImageFailureCodeKmsError ImageFailureCode = "KmsError" ImageFailureCodeUpstreamAccessDenied ImageFailureCode = "UpstreamAccessDenied" ImageFailureCodeUpstreamTooManyRequests ImageFailureCode = "UpstreamTooManyRequests" ImageFailureCodeUpstreamUnavailable ImageFailureCode = "UpstreamUnavailable" ) // Values returns all known values for ImageFailureCode. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ImageFailureCode) Values() []ImageFailureCode { return []ImageFailureCode{ "InvalidImageDigest", "InvalidImageTag", "ImageTagDoesNotMatchDigest", "ImageNotFound", "MissingDigestAndTag", "ImageReferencedByManifestList", "KmsError", "UpstreamAccessDenied", "UpstreamTooManyRequests", "UpstreamUnavailable", } } type ImageTagMutability string // Enum values for ImageTagMutability const ( ImageTagMutabilityMutable ImageTagMutability = "MUTABLE" ImageTagMutabilityImmutable ImageTagMutability = "IMMUTABLE" ) // Values returns all known values for ImageTagMutability. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ImageTagMutability) Values() []ImageTagMutability { return []ImageTagMutability{ "MUTABLE", "IMMUTABLE", } } type LayerAvailability string // Enum values for LayerAvailability const ( LayerAvailabilityAvailable LayerAvailability = "AVAILABLE" LayerAvailabilityUnavailable LayerAvailability = "UNAVAILABLE" ) // Values returns all known values for LayerAvailability. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (LayerAvailability) Values() []LayerAvailability { return []LayerAvailability{ "AVAILABLE", "UNAVAILABLE", } } type LayerFailureCode string // Enum values for LayerFailureCode const ( LayerFailureCodeInvalidLayerDigest LayerFailureCode = "InvalidLayerDigest" LayerFailureCodeMissingLayerDigest LayerFailureCode = "MissingLayerDigest" ) // Values returns all known values for LayerFailureCode. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (LayerFailureCode) Values() []LayerFailureCode { return []LayerFailureCode{ "InvalidLayerDigest", "MissingLayerDigest", } } type LifecyclePolicyPreviewStatus string // Enum values for LifecyclePolicyPreviewStatus const ( LifecyclePolicyPreviewStatusInProgress LifecyclePolicyPreviewStatus = "IN_PROGRESS" LifecyclePolicyPreviewStatusComplete LifecyclePolicyPreviewStatus = "COMPLETE" LifecyclePolicyPreviewStatusExpired LifecyclePolicyPreviewStatus = "EXPIRED" LifecyclePolicyPreviewStatusFailed LifecyclePolicyPreviewStatus = "FAILED" ) // Values returns all known values for LifecyclePolicyPreviewStatus. Note that // this can be expanded in the future, and so it is only as up to date as the // client. // // The ordering of this slice is not guaranteed to be stable across updates. func (LifecyclePolicyPreviewStatus) Values() []LifecyclePolicyPreviewStatus { return []LifecyclePolicyPreviewStatus{ "IN_PROGRESS", "COMPLETE", "EXPIRED", "FAILED", } } type RCTAppliedFor string // Enum values for RCTAppliedFor const ( RCTAppliedForReplication RCTAppliedFor = "REPLICATION" RCTAppliedForPullThroughCache RCTAppliedFor = "PULL_THROUGH_CACHE" ) // Values returns all known values for RCTAppliedFor. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (RCTAppliedFor) Values() []RCTAppliedFor { return []RCTAppliedFor{ "REPLICATION", "PULL_THROUGH_CACHE", } } type ReplicationStatus string // Enum values for ReplicationStatus const ( ReplicationStatusInProgress ReplicationStatus = "IN_PROGRESS" ReplicationStatusComplete ReplicationStatus = "COMPLETE" ReplicationStatusFailed ReplicationStatus = "FAILED" ) // Values returns all known values for ReplicationStatus. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ReplicationStatus) Values() []ReplicationStatus { return []ReplicationStatus{ "IN_PROGRESS", "COMPLETE", "FAILED", } } type RepositoryFilterType string // Enum values for RepositoryFilterType const ( RepositoryFilterTypePrefixMatch RepositoryFilterType = "PREFIX_MATCH" ) // Values returns all known values for RepositoryFilterType. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (RepositoryFilterType) Values() []RepositoryFilterType { return []RepositoryFilterType{ "PREFIX_MATCH", } } type ScanFrequency string // Enum values for ScanFrequency const ( ScanFrequencyScanOnPush ScanFrequency = "SCAN_ON_PUSH" ScanFrequencyContinuousScan ScanFrequency = "CONTINUOUS_SCAN" ScanFrequencyManual ScanFrequency = "MANUAL" ) // Values returns all known values for ScanFrequency. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ScanFrequency) Values() []ScanFrequency { return []ScanFrequency{ "SCAN_ON_PUSH", "CONTINUOUS_SCAN", "MANUAL", } } type ScanningConfigurationFailureCode string // Enum values for ScanningConfigurationFailureCode const ( ScanningConfigurationFailureCodeRepositoryNotFound ScanningConfigurationFailureCode = "REPOSITORY_NOT_FOUND" ) // Values returns all known values for ScanningConfigurationFailureCode. Note that // this can be expanded in the future, and so it is only as up to date as the // client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ScanningConfigurationFailureCode) Values() []ScanningConfigurationFailureCode { return []ScanningConfigurationFailureCode{ "REPOSITORY_NOT_FOUND", } } type ScanningRepositoryFilterType string // Enum values for ScanningRepositoryFilterType const ( ScanningRepositoryFilterTypeWildcard ScanningRepositoryFilterType = "WILDCARD" ) // Values returns all known values for ScanningRepositoryFilterType. Note that // this can be expanded in the future, and so it is only as up to date as the // client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ScanningRepositoryFilterType) Values() []ScanningRepositoryFilterType { return []ScanningRepositoryFilterType{ "WILDCARD", } } type ScanStatus string // Enum values for ScanStatus const ( ScanStatusInProgress ScanStatus = "IN_PROGRESS" ScanStatusComplete ScanStatus = "COMPLETE" ScanStatusFailed ScanStatus = "FAILED" ScanStatusUnsupportedImage ScanStatus = "UNSUPPORTED_IMAGE" ScanStatusActive ScanStatus = "ACTIVE" ScanStatusPending ScanStatus = "PENDING" ScanStatusScanEligibilityExpired ScanStatus = "SCAN_ELIGIBILITY_EXPIRED" ScanStatusFindingsUnavailable ScanStatus = "FINDINGS_UNAVAILABLE" ScanStatusLimitExceeded ScanStatus = "LIMIT_EXCEEDED" ) // Values returns all known values for ScanStatus. Note that this can be expanded // in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ScanStatus) Values() []ScanStatus { return []ScanStatus{ "IN_PROGRESS", "COMPLETE", "FAILED", "UNSUPPORTED_IMAGE", "ACTIVE", "PENDING", "SCAN_ELIGIBILITY_EXPIRED", "FINDINGS_UNAVAILABLE", "LIMIT_EXCEEDED", } } type ScanType string // Enum values for ScanType const ( ScanTypeBasic ScanType = "BASIC" ScanTypeEnhanced ScanType = "ENHANCED" ) // Values returns all known values for ScanType. Note that this can be expanded in // the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ScanType) Values() []ScanType { return []ScanType{ "BASIC", "ENHANCED", } } type TagStatus string // Enum values for TagStatus const ( TagStatusTagged TagStatus = "TAGGED" TagStatusUntagged TagStatus = "UNTAGGED" TagStatusAny TagStatus = "ANY" ) // Values returns all known values for TagStatus. Note that this can be expanded // in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (TagStatus) Values() []TagStatus { return []TagStatus{ "TAGGED", "UNTAGGED", "ANY", } } type UpstreamRegistry string // Enum values for UpstreamRegistry const ( UpstreamRegistryEcr UpstreamRegistry = "ecr" UpstreamRegistryEcrPublic UpstreamRegistry = "ecr-public" UpstreamRegistryQuay UpstreamRegistry = "quay" UpstreamRegistryK8s UpstreamRegistry = "k8s" UpstreamRegistryDockerHub UpstreamRegistry = "docker-hub" UpstreamRegistryGitHubContainerRegistry UpstreamRegistry = "github-container-registry" UpstreamRegistryAzureContainerRegistry UpstreamRegistry = "azure-container-registry" UpstreamRegistryGitLabContainerRegistry UpstreamRegistry = "gitlab-container-registry" ) // Values returns all known values for UpstreamRegistry. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (UpstreamRegistry) Values() []UpstreamRegistry { return []UpstreamRegistry{ "ecr", "ecr-public", "quay", "k8s", "docker-hub", "github-container-registry", "azure-container-registry", "gitlab-container-registry", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/errors.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package types import ( "fmt" smithy "github.com/aws/smithy-go" ) // The specified layer upload does not contain any layer parts. type EmptyUploadException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *EmptyUploadException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *EmptyUploadException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *EmptyUploadException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "EmptyUploadException" } return *e.ErrorCodeOverride } func (e *EmptyUploadException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified image has already been pushed, and there were no changes to the // manifest or image tag after the last push. type ImageAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ImageAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ImageAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ImageAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ImageAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *ImageAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified image digest does not match the digest that Amazon ECR calculated // for the image. type ImageDigestDoesNotMatchException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ImageDigestDoesNotMatchException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ImageDigestDoesNotMatchException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ImageDigestDoesNotMatchException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ImageDigestDoesNotMatchException" } return *e.ErrorCodeOverride } func (e *ImageDigestDoesNotMatchException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The image requested does not exist in the specified repository. type ImageNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ImageNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ImageNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ImageNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ImageNotFoundException" } return *e.ErrorCodeOverride } func (e *ImageNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified image is tagged with a tag that already exists. The repository is // configured for tag immutability. type ImageTagAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ImageTagAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ImageTagAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ImageTagAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ImageTagAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *ImageTagAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The layer digest calculation performed by Amazon ECR upon receipt of the image // layer does not match the digest specified. type InvalidLayerException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *InvalidLayerException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *InvalidLayerException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *InvalidLayerException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "InvalidLayerException" } return *e.ErrorCodeOverride } func (e *InvalidLayerException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The layer part size is not valid, or the first byte specified is not // consecutive to the last byte of a previous layer part upload. type InvalidLayerPartException struct { Message *string ErrorCodeOverride *string RegistryId *string RepositoryName *string UploadId *string LastValidByteReceived *int64 noSmithyDocumentSerde } func (e *InvalidLayerPartException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *InvalidLayerPartException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *InvalidLayerPartException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "InvalidLayerPartException" } return *e.ErrorCodeOverride } func (e *InvalidLayerPartException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified parameter is invalid. Review the available parameters for the API // request. type InvalidParameterException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *InvalidParameterException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *InvalidParameterException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *InvalidParameterException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "InvalidParameterException" } return *e.ErrorCodeOverride } func (e *InvalidParameterException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // An invalid parameter has been specified. Tag keys can have a maximum character // length of 128 characters, and tag values can have a maximum length of 256 // characters. type InvalidTagParameterException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *InvalidTagParameterException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *InvalidTagParameterException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *InvalidTagParameterException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "InvalidTagParameterException" } return *e.ErrorCodeOverride } func (e *InvalidTagParameterException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The operation failed due to a KMS exception. type KmsException struct { Message *string ErrorCodeOverride *string KmsError *string noSmithyDocumentSerde } func (e *KmsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *KmsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *KmsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "KmsException" } return *e.ErrorCodeOverride } func (e *KmsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The image layer already exists in the associated repository. type LayerAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LayerAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LayerAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LayerAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LayerAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *LayerAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified layer is not available because it is not associated with an // image. Unassociated image layers may be cleaned up at any time. type LayerInaccessibleException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LayerInaccessibleException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LayerInaccessibleException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LayerInaccessibleException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LayerInaccessibleException" } return *e.ErrorCodeOverride } func (e *LayerInaccessibleException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // Layer parts must be at least 5 MiB in size. type LayerPartTooSmallException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LayerPartTooSmallException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LayerPartTooSmallException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LayerPartTooSmallException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LayerPartTooSmallException" } return *e.ErrorCodeOverride } func (e *LayerPartTooSmallException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified layers could not be found, or the specified layer is not valid // for this repository. type LayersNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LayersNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LayersNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LayersNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LayersNotFoundException" } return *e.ErrorCodeOverride } func (e *LayersNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The lifecycle policy could not be found, and no policy is set to the repository. type LifecyclePolicyNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LifecyclePolicyNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LifecyclePolicyNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LifecyclePolicyNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LifecyclePolicyNotFoundException" } return *e.ErrorCodeOverride } func (e *LifecyclePolicyNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The previous lifecycle policy preview request has not completed. Wait and try // again. type LifecyclePolicyPreviewInProgressException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LifecyclePolicyPreviewInProgressException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LifecyclePolicyPreviewInProgressException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LifecyclePolicyPreviewInProgressException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LifecyclePolicyPreviewInProgressException" } return *e.ErrorCodeOverride } func (e *LifecyclePolicyPreviewInProgressException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // There is no dry run for this repository. type LifecyclePolicyPreviewNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LifecyclePolicyPreviewNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LifecyclePolicyPreviewNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LifecyclePolicyPreviewNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LifecyclePolicyPreviewNotFoundException" } return *e.ErrorCodeOverride } func (e *LifecyclePolicyPreviewNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The operation did not succeed because it would have exceeded a service limit // for your account. For more information, see [Amazon ECR service quotas]in the Amazon Elastic Container // Registry User Guide. // // [Amazon ECR service quotas]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html type LimitExceededException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LimitExceededException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LimitExceededException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LimitExceededException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LimitExceededException" } return *e.ErrorCodeOverride } func (e *LimitExceededException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // A pull through cache rule with these settings already exists for the private // registry. type PullThroughCacheRuleAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *PullThroughCacheRuleAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *PullThroughCacheRuleAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *PullThroughCacheRuleAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "PullThroughCacheRuleAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *PullThroughCacheRuleAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The pull through cache rule was not found. Specify a valid pull through cache // rule and try again. type PullThroughCacheRuleNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *PullThroughCacheRuleNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *PullThroughCacheRuleNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *PullThroughCacheRuleNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "PullThroughCacheRuleNotFoundException" } return *e.ErrorCodeOverride } func (e *PullThroughCacheRuleNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The manifest list is referencing an image that does not exist. type ReferencedImagesNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ReferencedImagesNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ReferencedImagesNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ReferencedImagesNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ReferencedImagesNotFoundException" } return *e.ErrorCodeOverride } func (e *ReferencedImagesNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The registry doesn't have an associated registry policy. type RegistryPolicyNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RegistryPolicyNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RegistryPolicyNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RegistryPolicyNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RegistryPolicyNotFoundException" } return *e.ErrorCodeOverride } func (e *RegistryPolicyNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository already exists in the specified registry. type RepositoryAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *RepositoryAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository contains images. To delete a repository that contains // images, you must force the deletion with the force parameter. type RepositoryNotEmptyException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryNotEmptyException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryNotEmptyException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryNotEmptyException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryNotEmptyException" } return *e.ErrorCodeOverride } func (e *RepositoryNotEmptyException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository could not be found. Check the spelling of the // specified repository and ensure that you are performing operations on the // correct registry. type RepositoryNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryNotFoundException" } return *e.ErrorCodeOverride } func (e *RepositoryNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository and registry combination does not have an associated // repository policy. type RepositoryPolicyNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryPolicyNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryPolicyNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryPolicyNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryPolicyNotFoundException" } return *e.ErrorCodeOverride } func (e *RepositoryPolicyNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified image scan could not be found. Ensure that image scanning is // enabled on the repository and try again. type ScanNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ScanNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ScanNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ScanNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ScanNotFoundException" } return *e.ErrorCodeOverride } func (e *ScanNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The ARN of the secret specified in the pull through cache rule was not found. // Update the pull through cache rule with a valid secret ARN and try again. type SecretNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *SecretNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *SecretNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *SecretNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "SecretNotFoundException" } return *e.ErrorCodeOverride } func (e *SecretNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // These errors are usually caused by a server-side issue. type ServerException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ServerException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ServerException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ServerException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ServerException" } return *e.ErrorCodeOverride } func (e *ServerException) ErrorFault() smithy.ErrorFault { return smithy.FaultServer } // The repository creation template already exists. Specify a unique prefix and // try again. type TemplateAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *TemplateAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *TemplateAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *TemplateAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "TemplateAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *TemplateAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository creation template can't be found. Verify the registry // ID and prefix and try again. type TemplateNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *TemplateNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *TemplateNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *TemplateNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "TemplateNotFoundException" } return *e.ErrorCodeOverride } func (e *TemplateNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The list of tags on the repository is over the limit. The maximum number of // tags that can be applied to a repository is 50. type TooManyTagsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *TooManyTagsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *TooManyTagsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *TooManyTagsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "TooManyTagsException" } return *e.ErrorCodeOverride } func (e *TooManyTagsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The secret is unable to be accessed. Verify the resource permissions for the // secret and try again. type UnableToAccessSecretException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UnableToAccessSecretException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UnableToAccessSecretException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UnableToAccessSecretException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UnableToAccessSecretException" } return *e.ErrorCodeOverride } func (e *UnableToAccessSecretException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The secret is accessible but is unable to be decrypted. Verify the resource // permisisons and try again. type UnableToDecryptSecretValueException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UnableToDecryptSecretValueException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UnableToDecryptSecretValueException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UnableToDecryptSecretValueException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UnableToDecryptSecretValueException" } return *e.ErrorCodeOverride } func (e *UnableToDecryptSecretValueException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The image or images were unable to be pulled using the pull through cache rule. // This is usually caused because of an issue with the Secrets Manager secret // containing the credentials for the upstream registry. type UnableToGetUpstreamImageException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UnableToGetUpstreamImageException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UnableToGetUpstreamImageException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UnableToGetUpstreamImageException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UnableToGetUpstreamImageException" } return *e.ErrorCodeOverride } func (e *UnableToGetUpstreamImageException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // There was an issue getting the upstream layer matching the pull through cache // rule. type UnableToGetUpstreamLayerException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UnableToGetUpstreamLayerException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UnableToGetUpstreamLayerException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UnableToGetUpstreamLayerException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UnableToGetUpstreamLayerException" } return *e.ErrorCodeOverride } func (e *UnableToGetUpstreamLayerException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The image is of a type that cannot be scanned. type UnsupportedImageTypeException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UnsupportedImageTypeException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UnsupportedImageTypeException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UnsupportedImageTypeException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UnsupportedImageTypeException" } return *e.ErrorCodeOverride } func (e *UnsupportedImageTypeException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified upstream registry isn't supported. type UnsupportedUpstreamRegistryException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UnsupportedUpstreamRegistryException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UnsupportedUpstreamRegistryException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UnsupportedUpstreamRegistryException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UnsupportedUpstreamRegistryException" } return *e.ErrorCodeOverride } func (e *UnsupportedUpstreamRegistryException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The upload could not be found, or the specified upload ID is not valid for this // repository. type UploadNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UploadNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UploadNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UploadNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UploadNotFoundException" } return *e.ErrorCodeOverride } func (e *UploadNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // There was an exception validating this request. type ValidationException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ValidationException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ValidationException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ValidationException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ValidationException" } return *e.ErrorCodeOverride } func (e *ValidationException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/types/types.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package types import ( smithydocument "github.com/aws/smithy-go/document" "time" ) // This data type is used in the ImageScanFinding data type. type Attribute struct { // The attribute key. // // This member is required. Key *string // The value assigned to the attribute key. Value *string noSmithyDocumentSerde } // An object representing authorization data for an Amazon ECR registry. type AuthorizationData struct { // A base64-encoded string that contains authorization data for the specified // Amazon ECR registry. When the string is decoded, it is presented in the format // user:password for private registry authentication using docker login . AuthorizationToken *string // The Unix time in seconds and milliseconds when the authorization token expires. // Authorization tokens are valid for 12 hours. ExpiresAt *time.Time // The registry URL to use for this authorization token in a docker login command. // The Amazon ECR registry URL format is // https://aws_account_id.dkr.ecr.region.amazonaws.com . For example, // https://012345678910.dkr.ecr.us-east-1.amazonaws.com .. ProxyEndpoint *string noSmithyDocumentSerde } // The image details of the Amazon ECR container image. type AwsEcrContainerImageDetails struct { // The architecture of the Amazon ECR container image. Architecture *string // The image author of the Amazon ECR container image. Author *string // The image hash of the Amazon ECR container image. ImageHash *string // The image tags attached to the Amazon ECR container image. ImageTags []string // The platform of the Amazon ECR container image. Platform *string // The date and time the Amazon ECR container image was pushed. PushedAt *time.Time // The registry the Amazon ECR container image belongs to. Registry *string // The name of the repository the Amazon ECR container image resides in. RepositoryName *string noSmithyDocumentSerde } // The CVSS score for a finding. type CvssScore struct { // The base CVSS score used for the finding. BaseScore float64 // The vector string of the CVSS score. ScoringVector *string // The source of the CVSS score. Source *string // The version of CVSS used for the score. Version *string noSmithyDocumentSerde } // Details on adjustments Amazon Inspector made to the CVSS score for a finding. type CvssScoreAdjustment struct { // The metric used to adjust the CVSS score. Metric *string // The reason the CVSS score has been adjustment. Reason *string noSmithyDocumentSerde } // Information about the CVSS score. type CvssScoreDetails struct { // An object that contains details about adjustment Amazon Inspector made to the // CVSS score. Adjustments []CvssScoreAdjustment // The CVSS score. Score float64 // The source for the CVSS score. ScoreSource *string // The vector for the CVSS score. ScoringVector *string // The CVSS version used in scoring. Version *string noSmithyDocumentSerde } // An object representing a filter on a DescribeImages operation. type DescribeImagesFilter struct { // The tag status with which to filter your DescribeImages results. You can filter results based // on whether they are TAGGED or UNTAGGED . TagStatus TagStatus noSmithyDocumentSerde } // The encryption configuration for the repository. This determines how the // contents of your repository are encrypted at rest. // // By default, when no encryption configuration is set or the AES256 encryption // type is used, Amazon ECR uses server-side encryption with Amazon S3-managed // encryption keys which encrypts your data at rest using an AES256 encryption // algorithm. This does not require any action on your part. // // For more control over the encryption of the contents of your repository, you // can use server-side encryption with Key Management Service key stored in Key // Management Service (KMS) to encrypt your images. For more information, see [Amazon ECR encryption at rest]in // the Amazon Elastic Container Registry User Guide. // // [Amazon ECR encryption at rest]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/encryption-at-rest.html type EncryptionConfiguration struct { // The encryption type to use. // // If you use the KMS encryption type, the contents of the repository will be // encrypted using server-side encryption with Key Management Service key stored in // KMS. When you use KMS to encrypt your data, you can either use the default // Amazon Web Services managed KMS key for Amazon ECR, or specify your own KMS key, // which you already created. // // If you use the KMS_DSSE encryption type, the contents of the repository will be // encrypted with two layers of encryption using server-side encryption with the // KMS Management Service key stored in KMS. Similar to the KMS encryption type, // you can either use the default Amazon Web Services managed KMS key for Amazon // ECR, or specify your own KMS key, which you've already created. // // If you use the AES256 encryption type, Amazon ECR uses server-side encryption // with Amazon S3-managed encryption keys which encrypts the images in the // repository using an AES256 encryption algorithm. // // For more information, see [Amazon ECR encryption at rest] in the Amazon Elastic Container Registry User Guide. // // [Amazon ECR encryption at rest]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/encryption-at-rest.html // // This member is required. EncryptionType EncryptionType // If you use the KMS encryption type, specify the KMS key to use for encryption. // The alias, key ID, or full ARN of the KMS key can be specified. The key must // exist in the same Region as the repository. If no key is specified, the default // Amazon Web Services managed KMS key for Amazon ECR will be used. KmsKey *string noSmithyDocumentSerde } // The encryption configuration to associate with the repository creation template. type EncryptionConfigurationForRepositoryCreationTemplate struct { // The encryption type to use. // // If you use the KMS encryption type, the contents of the repository will be // encrypted using server-side encryption with Key Management Service key stored in // KMS. When you use KMS to encrypt your data, you can either use the default // Amazon Web Services managed KMS key for Amazon ECR, or specify your own KMS key, // which you already created. For more information, see [Protecting data using server-side encryption with an KMS key stored in Key Management Service (SSE-KMS)]in the Amazon Simple // Storage Service Console Developer Guide. // // If you use the AES256 encryption type, Amazon ECR uses server-side encryption // with Amazon S3-managed encryption keys which encrypts the images in the // repository using an AES256 encryption algorithm. For more information, see [Protecting data using server-side encryption with Amazon S3-managed encryption keys (SSE-S3)]in // the Amazon Simple Storage Service Console Developer Guide. // // [Protecting data using server-side encryption with Amazon S3-managed encryption keys (SSE-S3)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html // [Protecting data using server-side encryption with an KMS key stored in Key Management Service (SSE-KMS)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html // // This member is required. EncryptionType EncryptionType // If you use the KMS encryption type, specify the KMS key to use for encryption. // The full ARN of the KMS key must be specified. The key must exist in the same // Region as the repository. If no key is specified, the default Amazon Web // Services managed KMS key for Amazon ECR will be used. KmsKey *string noSmithyDocumentSerde } // The details of an enhanced image scan. This is returned when enhanced scanning // is enabled for your private registry. type EnhancedImageScanFinding struct { // The Amazon Web Services account ID associated with the image. AwsAccountId *string // The description of the finding. Description *string // If a finding discovered in your environment has an exploit available. ExploitAvailable *string // The Amazon Resource Number (ARN) of the finding. FindingArn *string // The date and time that the finding was first observed. FirstObservedAt *time.Time // Details on whether a fix is available through a version update. This value can // be YES , NO , or PARTIAL . A PARTIAL fix means that some, but not all, of the // packages identified in the finding have fixes available through updated // versions. FixAvailable *string // The date and time that the finding was last observed. LastObservedAt *time.Time // An object that contains the details of a package vulnerability finding. PackageVulnerabilityDetails *PackageVulnerabilityDetails // An object that contains the details about how to remediate a finding. Remediation *Remediation // Contains information on the resources involved in a finding. Resources []Resource // The Amazon Inspector score given to the finding. Score float64 // An object that contains details of the Amazon Inspector score. ScoreDetails *ScoreDetails // The severity of the finding. Severity *string // The status of the finding. Status *string // The title of the finding. Title *string // The type of the finding. Type *string // The date and time the finding was last updated at. UpdatedAt *time.Time noSmithyDocumentSerde } // An object representing an Amazon ECR image. type Image struct { // An object containing the image tag and image digest associated with an image. ImageId *ImageIdentifier // The image manifest associated with the image. ImageManifest *string // The manifest media type of the image. ImageManifestMediaType *string // The Amazon Web Services account ID associated with the registry containing the // image. RegistryId *string // The name of the repository associated with the image. RepositoryName *string noSmithyDocumentSerde } // An object that describes an image returned by a DescribeImages operation. type ImageDetail struct { // The artifact media type of the image. ArtifactMediaType *string // The sha256 digest of the image manifest. ImageDigest *string // The media type of the image manifest. ImageManifestMediaType *string // The date and time, expressed in standard JavaScript date format, at which the // current image was pushed to the repository. ImagePushedAt *time.Time // A summary of the last completed image scan. ImageScanFindingsSummary *ImageScanFindingsSummary // The current state of the scan. ImageScanStatus *ImageScanStatus // The size, in bytes, of the image in the repository. // // If the image is a manifest list, this will be the max size of all manifests in // the list. // // Starting with Docker version 1.9, the Docker client compresses image layers // before pushing them to a V2 Docker registry. The output of the docker images // command shows the uncompressed image size. Therefore, Docker might return a // larger image than the image sizes returned by DescribeImages. ImageSizeInBytes *int64 // The list of tags associated with this image. ImageTags []string // The date and time, expressed in standard JavaScript date format, when Amazon // ECR recorded the last image pull. // // Amazon ECR refreshes the last image pull timestamp at least once every 24 // hours. For example, if you pull an image once a day then the // lastRecordedPullTime timestamp will indicate the exact time that the image was // last pulled. However, if you pull an image once an hour, because Amazon ECR // refreshes the lastRecordedPullTime timestamp at least once every 24 hours, the // result may not be the exact time that the image was last pulled. LastRecordedPullTime *time.Time // The Amazon Web Services account ID associated with the registry to which this // image belongs. RegistryId *string // The name of the repository to which this image belongs. RepositoryName *string noSmithyDocumentSerde } // An object representing an Amazon ECR image failure. type ImageFailure struct { // The code associated with the failure. FailureCode ImageFailureCode // The reason for the failure. FailureReason *string // The image ID associated with the failure. ImageId *ImageIdentifier noSmithyDocumentSerde } // An object with identifying information for an image in an Amazon ECR repository. type ImageIdentifier struct { // The sha256 digest of the image manifest. ImageDigest *string // The tag used for the image. ImageTag *string noSmithyDocumentSerde } // The status of the replication process for an image. type ImageReplicationStatus struct { // The failure code for a replication that has failed. FailureCode *string // The destination Region for the image replication. Region *string // The Amazon Web Services account ID associated with the registry to which the // image belongs. RegistryId *string // The image replication status. Status ReplicationStatus noSmithyDocumentSerde } // Contains information about an image scan finding. type ImageScanFinding struct { // A collection of attributes of the host from which the finding is generated. Attributes []Attribute // The description of the finding. Description *string // The name associated with the finding, usually a CVE number. Name *string // The finding severity. Severity FindingSeverity // A link containing additional details about the security vulnerability. Uri *string noSmithyDocumentSerde } // The details of an image scan. type ImageScanFindings struct { // Details about the enhanced scan findings from Amazon Inspector. EnhancedFindings []EnhancedImageScanFinding // The image vulnerability counts, sorted by severity. FindingSeverityCounts map[string]int32 // The findings from the image scan. Findings []ImageScanFinding // The time of the last completed image scan. ImageScanCompletedAt *time.Time // The time when the vulnerability data was last scanned. VulnerabilitySourceUpdatedAt *time.Time noSmithyDocumentSerde } // A summary of the last completed image scan. type ImageScanFindingsSummary struct { // The image vulnerability counts, sorted by severity. FindingSeverityCounts map[string]int32 // The time of the last completed image scan. ImageScanCompletedAt *time.Time // The time when the vulnerability data was last scanned. VulnerabilitySourceUpdatedAt *time.Time noSmithyDocumentSerde } // The image scanning configuration for a repository. type ImageScanningConfiguration struct { // The setting that determines whether images are scanned after being pushed to a // repository. If set to true , images will be scanned after being pushed. If this // parameter is not specified, it will default to false and images will not be // scanned unless a scan is manually started with the [API_StartImageScan]API. // // [API_StartImageScan]: https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_StartImageScan.html ScanOnPush bool noSmithyDocumentSerde } // The current status of an image scan. type ImageScanStatus struct { // The description of the image scan status. Description *string // The current state of an image scan. Status ScanStatus noSmithyDocumentSerde } // An object representing an Amazon ECR image layer. type Layer struct { // The availability status of the image layer. LayerAvailability LayerAvailability // The sha256 digest of the image layer. LayerDigest *string // The size, in bytes, of the image layer. LayerSize *int64 // The media type of the layer, such as // application/vnd.docker.image.rootfs.diff.tar.gzip or // application/vnd.oci.image.layer.v1.tar+gzip . MediaType *string noSmithyDocumentSerde } // An object representing an Amazon ECR image layer failure. type LayerFailure struct { // The failure code associated with the failure. FailureCode LayerFailureCode // The reason for the failure. FailureReason *string // The layer digest associated with the failure. LayerDigest *string noSmithyDocumentSerde } // The filter for the lifecycle policy preview. type LifecyclePolicyPreviewFilter struct { // The tag status of the image. TagStatus TagStatus noSmithyDocumentSerde } // The result of the lifecycle policy preview. type LifecyclePolicyPreviewResult struct { // The type of action to be taken. Action *LifecyclePolicyRuleAction // The priority of the applied rule. AppliedRulePriority *int32 // The sha256 digest of the image manifest. ImageDigest *string // The date and time, expressed in standard JavaScript date format, at which the // current image was pushed to the repository. ImagePushedAt *time.Time // The list of tags associated with this image. ImageTags []string noSmithyDocumentSerde } // The summary of the lifecycle policy preview request. type LifecyclePolicyPreviewSummary struct { // The number of expiring images. ExpiringImageTotalCount *int32 noSmithyDocumentSerde } // The type of action to be taken. type LifecyclePolicyRuleAction struct { // The type of action to be taken. Type ImageActionType noSmithyDocumentSerde } // An object representing a filter on a ListImages operation. type ListImagesFilter struct { // The tag status with which to filter your ListImages results. You can filter results based // on whether they are TAGGED or UNTAGGED . TagStatus TagStatus noSmithyDocumentSerde } // Information about a package vulnerability finding. type PackageVulnerabilityDetails struct { // An object that contains details about the CVSS score of a finding. Cvss []CvssScore // One or more URLs that contain details about this vulnerability type. ReferenceUrls []string // One or more vulnerabilities related to the one identified in this finding. RelatedVulnerabilities []string // The source of the vulnerability information. Source *string // A URL to the source of the vulnerability information. SourceUrl *string // The date and time that this vulnerability was first added to the vendor's // database. VendorCreatedAt *time.Time // The severity the vendor has given to this vulnerability type. VendorSeverity *string // The date and time the vendor last updated this vulnerability in their database. VendorUpdatedAt *time.Time // The ID given to this vulnerability. VulnerabilityId *string // The packages impacted by this vulnerability. VulnerablePackages []VulnerablePackage noSmithyDocumentSerde } // The details of a pull through cache rule. type PullThroughCacheRule struct { // The date and time the pull through cache was created. CreatedAt *time.Time // The ARN of the Secrets Manager secret associated with the pull through cache // rule. CredentialArn *string // The ARN of the IAM role associated with the pull through cache rule. CustomRoleArn *string // The Amazon ECR repository prefix associated with the pull through cache rule. EcrRepositoryPrefix *string // The Amazon Web Services account ID associated with the registry the pull // through cache rule is associated with. RegistryId *string // The date and time, in JavaScript date format, when the pull through cache rule // was last updated. UpdatedAt *time.Time // The name of the upstream source registry associated with the pull through cache // rule. UpstreamRegistry UpstreamRegistry // The upstream registry URL associated with the pull through cache rule. UpstreamRegistryUrl *string // The upstream repository prefix associated with the pull through cache rule. UpstreamRepositoryPrefix *string noSmithyDocumentSerde } // Details about the recommended course of action to remediate the finding. type Recommendation struct { // The recommended course of action to remediate the finding. Text *string // The URL address to the CVE remediation recommendations. Url *string noSmithyDocumentSerde } // The scanning configuration for a private registry. type RegistryScanningConfiguration struct { // The scanning rules associated with the registry. Rules []RegistryScanningRule // The type of scanning configured for the registry. ScanType ScanType noSmithyDocumentSerde } // The details of a scanning rule for a private registry. type RegistryScanningRule struct { // The repository filters associated with the scanning configuration for a private // registry. // // This member is required. RepositoryFilters []ScanningRepositoryFilter // The frequency that scans are performed at for a private registry. When the // ENHANCED scan type is specified, the supported scan frequencies are // CONTINUOUS_SCAN and SCAN_ON_PUSH . When the BASIC scan type is specified, the // SCAN_ON_PUSH scan frequency is supported. If scan on push is not specified, then // the MANUAL scan frequency is set by default. // // This member is required. ScanFrequency ScanFrequency noSmithyDocumentSerde } // Information on how to remediate a finding. type Remediation struct { // An object that contains information about the recommended course of action to // remediate the finding. Recommendation *Recommendation noSmithyDocumentSerde } // The replication configuration for a registry. type ReplicationConfiguration struct { // An array of objects representing the replication destinations and repository // filters for a replication configuration. // // This member is required. Rules []ReplicationRule noSmithyDocumentSerde } // An array of objects representing the destination for a replication rule. type ReplicationDestination struct { // The Region to replicate to. // // This member is required. Region *string // The Amazon Web Services account ID of the Amazon ECR private registry to // replicate to. When configuring cross-Region replication within your own // registry, specify your own account ID. // // This member is required. RegistryId *string noSmithyDocumentSerde } // An array of objects representing the replication destinations and repository // filters for a replication configuration. type ReplicationRule struct { // An array of objects representing the destination for a replication rule. // // This member is required. Destinations []ReplicationDestination // An array of objects representing the filters for a replication rule. Specifying // a repository filter for a replication rule provides a method for controlling // which repositories in a private registry are replicated. RepositoryFilters []RepositoryFilter noSmithyDocumentSerde } // An object representing a repository. type Repository struct { // The date and time, in JavaScript date format, when the repository was created. CreatedAt *time.Time // The encryption configuration for the repository. This determines how the // contents of your repository are encrypted at rest. EncryptionConfiguration *EncryptionConfiguration // The image scanning configuration for a repository. ImageScanningConfiguration *ImageScanningConfiguration // The tag mutability setting for the repository. ImageTagMutability ImageTagMutability // The Amazon Web Services account ID associated with the registry that contains // the repository. RegistryId *string // The Amazon Resource Name (ARN) that identifies the repository. The ARN contains // the arn:aws:ecr namespace, followed by the region of the repository, Amazon Web // Services account ID of the repository owner, repository namespace, and // repository name. For example, // arn:aws:ecr:region:012345678910:repository-namespace/repository-name . RepositoryArn *string // The name of the repository. RepositoryName *string // The URI for the repository. You can use this URI for container image push and // pull operations. RepositoryUri *string noSmithyDocumentSerde } // The details of the repository creation template associated with the request. type RepositoryCreationTemplate struct { // A list of enumerable Strings representing the repository creation scenarios // that this template will apply towards. The two supported scenarios are // PULL_THROUGH_CACHE and REPLICATION AppliedFor []RCTAppliedFor // The date and time, in JavaScript date format, when the repository creation // template was created. CreatedAt *time.Time // The ARN of the role to be assumed by Amazon ECR. Amazon ECR will assume your // supplied role when the customRoleArn is specified. When this field isn't // specified, Amazon ECR will use the service-linked role for the repository // creation template. CustomRoleArn *string // The description associated with the repository creation template. Description *string // The encryption configuration associated with the repository creation template. EncryptionConfiguration *EncryptionConfigurationForRepositoryCreationTemplate // The tag mutability setting for the repository. If this parameter is omitted, // the default setting of MUTABLE will be used which will allow image tags to be // overwritten. If IMMUTABLE is specified, all image tags within the repository // will be immutable which will prevent them from being overwritten. ImageTagMutability ImageTagMutability // The lifecycle policy to use for repositories created using the template. LifecyclePolicy *string // The repository namespace prefix associated with the repository creation // template. Prefix *string // The repository policy to apply to repositories created using the template. A // repository policy is a permissions policy associated with a repository to // control access permissions. RepositoryPolicy *string // The metadata to apply to the repository to help you categorize and organize. // Each tag consists of a key and an optional value, both of which you define. Tag // keys can have a maximum character length of 128 characters, and tag values can // have a maximum length of 256 characters. ResourceTags []Tag // The date and time, in JavaScript date format, when the repository creation // template was last updated. UpdatedAt *time.Time noSmithyDocumentSerde } // The filter settings used with image replication. Specifying a repository filter // to a replication rule provides a method for controlling which repositories in a // private registry are replicated. If no filters are added, the contents of all // repositories are replicated. type RepositoryFilter struct { // The repository filter details. When the PREFIX_MATCH filter type is specified, // this value is required and should be the repository name prefix to configure // replication for. // // This member is required. Filter *string // The repository filter type. The only supported value is PREFIX_MATCH , which is // a repository name prefix specified with the filter parameter. // // This member is required. FilterType RepositoryFilterType noSmithyDocumentSerde } // The details of the scanning configuration for a repository. type RepositoryScanningConfiguration struct { // The scan filters applied to the repository. AppliedScanFilters []ScanningRepositoryFilter // The ARN of the repository. RepositoryArn *string // The name of the repository. RepositoryName *string // The scan frequency for the repository. ScanFrequency ScanFrequency // Whether or not scan on push is configured for the repository. ScanOnPush bool noSmithyDocumentSerde } // The details about any failures associated with the scanning configuration of a // repository. type RepositoryScanningConfigurationFailure struct { // The failure code. FailureCode ScanningConfigurationFailureCode // The reason for the failure. FailureReason *string // The name of the repository. RepositoryName *string noSmithyDocumentSerde } // Details about the resource involved in a finding. type Resource struct { // An object that contains details about the resource involved in a finding. Details *ResourceDetails // The ID of the resource. Id *string // The tags attached to the resource. Tags map[string]string // The type of resource. Type *string noSmithyDocumentSerde } // Contains details about the resource involved in the finding. type ResourceDetails struct { // An object that contains details about the Amazon ECR container image involved // in the finding. AwsEcrContainerImage *AwsEcrContainerImageDetails noSmithyDocumentSerde } // The details of a scanning repository filter. For more information on how to use // filters, see [Using filters]in the Amazon Elastic Container Registry User Guide. // // [Using filters]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html#image-scanning-filters type ScanningRepositoryFilter struct { // The filter to use when scanning. // // This member is required. Filter *string // The type associated with the filter. // // This member is required. FilterType ScanningRepositoryFilterType noSmithyDocumentSerde } // Information about the Amazon Inspector score given to a finding. type ScoreDetails struct { // An object that contains details about the CVSS score given to a finding. Cvss *CvssScoreDetails noSmithyDocumentSerde } // The metadata to apply to a resource to help you categorize and organize them. // Each tag consists of a key and a value, both of which you define. Tag keys can // have a maximum character length of 128 characters, and tag values can have a // maximum length of 256 characters. type Tag struct { // One part of a key-value pair that make up a tag. A key is a general label that // acts like a category for more specific tag values. // // This member is required. Key *string // A value acts as a descriptor within a tag category (key). // // This member is required. Value *string noSmithyDocumentSerde } // Information on the vulnerable package identified by a finding. type VulnerablePackage struct { // The architecture of the vulnerable package. Arch *string // The epoch of the vulnerable package. Epoch *int32 // The file path of the vulnerable package. FilePath *string // The version of the package that contains the vulnerability fix. FixedInVersion *string // The name of the vulnerable package. Name *string // The package manager of the vulnerable package. PackageManager *string // The release of the vulnerable package. Release *string // The source layer hash of the vulnerable package. SourceLayerHash *string // The version of the vulnerable package. Version *string noSmithyDocumentSerde } type noSmithyDocumentSerde = smithydocument.NoSerde ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecr/validators.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecr import ( "context" "fmt" "github.com/aws/aws-sdk-go-v2/service/ecr/types" smithy "github.com/aws/smithy-go" "github.com/aws/smithy-go/middleware" ) type validateOpBatchCheckLayerAvailability struct { } func (*validateOpBatchCheckLayerAvailability) ID() string { return "OperationInputValidation" } func (m *validateOpBatchCheckLayerAvailability) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*BatchCheckLayerAvailabilityInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpBatchCheckLayerAvailabilityInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpBatchDeleteImage struct { } func (*validateOpBatchDeleteImage) ID() string { return "OperationInputValidation" } func (m *validateOpBatchDeleteImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*BatchDeleteImageInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpBatchDeleteImageInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpBatchGetImage struct { } func (*validateOpBatchGetImage) ID() string { return "OperationInputValidation" } func (m *validateOpBatchGetImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*BatchGetImageInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpBatchGetImageInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpBatchGetRepositoryScanningConfiguration struct { } func (*validateOpBatchGetRepositoryScanningConfiguration) ID() string { return "OperationInputValidation" } func (m *validateOpBatchGetRepositoryScanningConfiguration) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*BatchGetRepositoryScanningConfigurationInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpBatchGetRepositoryScanningConfigurationInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpCompleteLayerUpload struct { } func (*validateOpCompleteLayerUpload) ID() string { return "OperationInputValidation" } func (m *validateOpCompleteLayerUpload) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*CompleteLayerUploadInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpCompleteLayerUploadInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpCreatePullThroughCacheRule struct { } func (*validateOpCreatePullThroughCacheRule) ID() string { return "OperationInputValidation" } func (m *validateOpCreatePullThroughCacheRule) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*CreatePullThroughCacheRuleInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpCreatePullThroughCacheRuleInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpCreateRepositoryCreationTemplate struct { } func (*validateOpCreateRepositoryCreationTemplate) ID() string { return "OperationInputValidation" } func (m *validateOpCreateRepositoryCreationTemplate) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*CreateRepositoryCreationTemplateInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpCreateRepositoryCreationTemplateInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpCreateRepository struct { } func (*validateOpCreateRepository) ID() string { return "OperationInputValidation" } func (m *validateOpCreateRepository) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*CreateRepositoryInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpCreateRepositoryInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDeleteLifecyclePolicy struct { } func (*validateOpDeleteLifecyclePolicy) ID() string { return "OperationInputValidation" } func (m *validateOpDeleteLifecyclePolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DeleteLifecyclePolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDeleteLifecyclePolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDeletePullThroughCacheRule struct { } func (*validateOpDeletePullThroughCacheRule) ID() string { return "OperationInputValidation" } func (m *validateOpDeletePullThroughCacheRule) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DeletePullThroughCacheRuleInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDeletePullThroughCacheRuleInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDeleteRepositoryCreationTemplate struct { } func (*validateOpDeleteRepositoryCreationTemplate) ID() string { return "OperationInputValidation" } func (m *validateOpDeleteRepositoryCreationTemplate) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DeleteRepositoryCreationTemplateInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDeleteRepositoryCreationTemplateInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDeleteRepository struct { } func (*validateOpDeleteRepository) ID() string { return "OperationInputValidation" } func (m *validateOpDeleteRepository) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DeleteRepositoryInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDeleteRepositoryInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDeleteRepositoryPolicy struct { } func (*validateOpDeleteRepositoryPolicy) ID() string { return "OperationInputValidation" } func (m *validateOpDeleteRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DeleteRepositoryPolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDeleteRepositoryPolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDescribeImageReplicationStatus struct { } func (*validateOpDescribeImageReplicationStatus) ID() string { return "OperationInputValidation" } func (m *validateOpDescribeImageReplicationStatus) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DescribeImageReplicationStatusInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDescribeImageReplicationStatusInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDescribeImageScanFindings struct { } func (*validateOpDescribeImageScanFindings) ID() string { return "OperationInputValidation" } func (m *validateOpDescribeImageScanFindings) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DescribeImageScanFindingsInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDescribeImageScanFindingsInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDescribeImages struct { } func (*validateOpDescribeImages) ID() string { return "OperationInputValidation" } func (m *validateOpDescribeImages) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DescribeImagesInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDescribeImagesInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpGetAccountSetting struct { } func (*validateOpGetAccountSetting) ID() string { return "OperationInputValidation" } func (m *validateOpGetAccountSetting) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*GetAccountSettingInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpGetAccountSettingInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpGetDownloadUrlForLayer struct { } func (*validateOpGetDownloadUrlForLayer) ID() string { return "OperationInputValidation" } func (m *validateOpGetDownloadUrlForLayer) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*GetDownloadUrlForLayerInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpGetDownloadUrlForLayerInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpGetLifecyclePolicy struct { } func (*validateOpGetLifecyclePolicy) ID() string { return "OperationInputValidation" } func (m *validateOpGetLifecyclePolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*GetLifecyclePolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpGetLifecyclePolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpGetLifecyclePolicyPreview struct { } func (*validateOpGetLifecyclePolicyPreview) ID() string { return "OperationInputValidation" } func (m *validateOpGetLifecyclePolicyPreview) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*GetLifecyclePolicyPreviewInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpGetLifecyclePolicyPreviewInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpGetRepositoryPolicy struct { } func (*validateOpGetRepositoryPolicy) ID() string { return "OperationInputValidation" } func (m *validateOpGetRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*GetRepositoryPolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpGetRepositoryPolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpInitiateLayerUpload struct { } func (*validateOpInitiateLayerUpload) ID() string { return "OperationInputValidation" } func (m *validateOpInitiateLayerUpload) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*InitiateLayerUploadInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpInitiateLayerUploadInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpListImages struct { } func (*validateOpListImages) ID() string { return "OperationInputValidation" } func (m *validateOpListImages) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*ListImagesInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpListImagesInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpListTagsForResource struct { } func (*validateOpListTagsForResource) ID() string { return "OperationInputValidation" } func (m *validateOpListTagsForResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*ListTagsForResourceInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpListTagsForResourceInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutAccountSetting struct { } func (*validateOpPutAccountSetting) ID() string { return "OperationInputValidation" } func (m *validateOpPutAccountSetting) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutAccountSettingInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutAccountSettingInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutImage struct { } func (*validateOpPutImage) ID() string { return "OperationInputValidation" } func (m *validateOpPutImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutImageInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutImageInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutImageScanningConfiguration struct { } func (*validateOpPutImageScanningConfiguration) ID() string { return "OperationInputValidation" } func (m *validateOpPutImageScanningConfiguration) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutImageScanningConfigurationInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutImageScanningConfigurationInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutImageTagMutability struct { } func (*validateOpPutImageTagMutability) ID() string { return "OperationInputValidation" } func (m *validateOpPutImageTagMutability) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutImageTagMutabilityInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutImageTagMutabilityInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutLifecyclePolicy struct { } func (*validateOpPutLifecyclePolicy) ID() string { return "OperationInputValidation" } func (m *validateOpPutLifecyclePolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutLifecyclePolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutLifecyclePolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutRegistryPolicy struct { } func (*validateOpPutRegistryPolicy) ID() string { return "OperationInputValidation" } func (m *validateOpPutRegistryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutRegistryPolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutRegistryPolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutRegistryScanningConfiguration struct { } func (*validateOpPutRegistryScanningConfiguration) ID() string { return "OperationInputValidation" } func (m *validateOpPutRegistryScanningConfiguration) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutRegistryScanningConfigurationInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutRegistryScanningConfigurationInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutReplicationConfiguration struct { } func (*validateOpPutReplicationConfiguration) ID() string { return "OperationInputValidation" } func (m *validateOpPutReplicationConfiguration) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutReplicationConfigurationInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutReplicationConfigurationInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpSetRepositoryPolicy struct { } func (*validateOpSetRepositoryPolicy) ID() string { return "OperationInputValidation" } func (m *validateOpSetRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*SetRepositoryPolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpSetRepositoryPolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpStartImageScan struct { } func (*validateOpStartImageScan) ID() string { return "OperationInputValidation" } func (m *validateOpStartImageScan) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*StartImageScanInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpStartImageScanInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpStartLifecyclePolicyPreview struct { } func (*validateOpStartLifecyclePolicyPreview) ID() string { return "OperationInputValidation" } func (m *validateOpStartLifecyclePolicyPreview) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*StartLifecyclePolicyPreviewInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpStartLifecyclePolicyPreviewInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpTagResource struct { } func (*validateOpTagResource) ID() string { return "OperationInputValidation" } func (m *validateOpTagResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*TagResourceInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpTagResourceInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpUntagResource struct { } func (*validateOpUntagResource) ID() string { return "OperationInputValidation" } func (m *validateOpUntagResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*UntagResourceInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpUntagResourceInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpUpdatePullThroughCacheRule struct { } func (*validateOpUpdatePullThroughCacheRule) ID() string { return "OperationInputValidation" } func (m *validateOpUpdatePullThroughCacheRule) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*UpdatePullThroughCacheRuleInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpUpdatePullThroughCacheRuleInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpUpdateRepositoryCreationTemplate struct { } func (*validateOpUpdateRepositoryCreationTemplate) ID() string { return "OperationInputValidation" } func (m *validateOpUpdateRepositoryCreationTemplate) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*UpdateRepositoryCreationTemplateInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpUpdateRepositoryCreationTemplateInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpUploadLayerPart struct { } func (*validateOpUploadLayerPart) ID() string { return "OperationInputValidation" } func (m *validateOpUploadLayerPart) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*UploadLayerPartInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpUploadLayerPartInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpValidatePullThroughCacheRule struct { } func (*validateOpValidatePullThroughCacheRule) ID() string { return "OperationInputValidation" } func (m *validateOpValidatePullThroughCacheRule) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*ValidatePullThroughCacheRuleInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpValidatePullThroughCacheRuleInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } func addOpBatchCheckLayerAvailabilityValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpBatchCheckLayerAvailability{}, middleware.After) } func addOpBatchDeleteImageValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpBatchDeleteImage{}, middleware.After) } func addOpBatchGetImageValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpBatchGetImage{}, middleware.After) } func addOpBatchGetRepositoryScanningConfigurationValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpBatchGetRepositoryScanningConfiguration{}, middleware.After) } func addOpCompleteLayerUploadValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpCompleteLayerUpload{}, middleware.After) } func addOpCreatePullThroughCacheRuleValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpCreatePullThroughCacheRule{}, middleware.After) } func addOpCreateRepositoryCreationTemplateValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpCreateRepositoryCreationTemplate{}, middleware.After) } func addOpCreateRepositoryValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpCreateRepository{}, middleware.After) } func addOpDeleteLifecyclePolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDeleteLifecyclePolicy{}, middleware.After) } func addOpDeletePullThroughCacheRuleValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDeletePullThroughCacheRule{}, middleware.After) } func addOpDeleteRepositoryCreationTemplateValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDeleteRepositoryCreationTemplate{}, middleware.After) } func addOpDeleteRepositoryValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDeleteRepository{}, middleware.After) } func addOpDeleteRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDeleteRepositoryPolicy{}, middleware.After) } func addOpDescribeImageReplicationStatusValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDescribeImageReplicationStatus{}, middleware.After) } func addOpDescribeImageScanFindingsValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDescribeImageScanFindings{}, middleware.After) } func addOpDescribeImagesValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDescribeImages{}, middleware.After) } func addOpGetAccountSettingValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetAccountSetting{}, middleware.After) } func addOpGetDownloadUrlForLayerValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetDownloadUrlForLayer{}, middleware.After) } func addOpGetLifecyclePolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetLifecyclePolicy{}, middleware.After) } func addOpGetLifecyclePolicyPreviewValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetLifecyclePolicyPreview{}, middleware.After) } func addOpGetRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetRepositoryPolicy{}, middleware.After) } func addOpInitiateLayerUploadValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpInitiateLayerUpload{}, middleware.After) } func addOpListImagesValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpListImages{}, middleware.After) } func addOpListTagsForResourceValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpListTagsForResource{}, middleware.After) } func addOpPutAccountSettingValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutAccountSetting{}, middleware.After) } func addOpPutImageValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutImage{}, middleware.After) } func addOpPutImageScanningConfigurationValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutImageScanningConfiguration{}, middleware.After) } func addOpPutImageTagMutabilityValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutImageTagMutability{}, middleware.After) } func addOpPutLifecyclePolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutLifecyclePolicy{}, middleware.After) } func addOpPutRegistryPolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutRegistryPolicy{}, middleware.After) } func addOpPutRegistryScanningConfigurationValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutRegistryScanningConfiguration{}, middleware.After) } func addOpPutReplicationConfigurationValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutReplicationConfiguration{}, middleware.After) } func addOpSetRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpSetRepositoryPolicy{}, middleware.After) } func addOpStartImageScanValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpStartImageScan{}, middleware.After) } func addOpStartLifecyclePolicyPreviewValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpStartLifecyclePolicyPreview{}, middleware.After) } func addOpTagResourceValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpTagResource{}, middleware.After) } func addOpUntagResourceValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpUntagResource{}, middleware.After) } func addOpUpdatePullThroughCacheRuleValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpUpdatePullThroughCacheRule{}, middleware.After) } func addOpUpdateRepositoryCreationTemplateValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpUpdateRepositoryCreationTemplate{}, middleware.After) } func addOpUploadLayerPartValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpUploadLayerPart{}, middleware.After) } func addOpValidatePullThroughCacheRuleValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpValidatePullThroughCacheRule{}, middleware.After) } func validateEncryptionConfiguration(v *types.EncryptionConfiguration) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "EncryptionConfiguration"} if len(v.EncryptionType) == 0 { invalidParams.Add(smithy.NewErrParamRequired("EncryptionType")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateEncryptionConfigurationForRepositoryCreationTemplate(v *types.EncryptionConfigurationForRepositoryCreationTemplate) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "EncryptionConfigurationForRepositoryCreationTemplate"} if len(v.EncryptionType) == 0 { invalidParams.Add(smithy.NewErrParamRequired("EncryptionType")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateRegistryScanningRule(v *types.RegistryScanningRule) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "RegistryScanningRule"} if len(v.ScanFrequency) == 0 { invalidParams.Add(smithy.NewErrParamRequired("ScanFrequency")) } if v.RepositoryFilters == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryFilters")) } else if v.RepositoryFilters != nil { if err := validateScanningRepositoryFilterList(v.RepositoryFilters); err != nil { invalidParams.AddNested("RepositoryFilters", err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateRegistryScanningRuleList(v []types.RegistryScanningRule) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "RegistryScanningRuleList"} for i := range v { if err := validateRegistryScanningRule(&v[i]); err != nil { invalidParams.AddNested(fmt.Sprintf("[%d]", i), err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateReplicationConfiguration(v *types.ReplicationConfiguration) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ReplicationConfiguration"} if v.Rules == nil { invalidParams.Add(smithy.NewErrParamRequired("Rules")) } else if v.Rules != nil { if err := validateReplicationRuleList(v.Rules); err != nil { invalidParams.AddNested("Rules", err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateReplicationDestination(v *types.ReplicationDestination) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ReplicationDestination"} if v.Region == nil { invalidParams.Add(smithy.NewErrParamRequired("Region")) } if v.RegistryId == nil { invalidParams.Add(smithy.NewErrParamRequired("RegistryId")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateReplicationDestinationList(v []types.ReplicationDestination) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ReplicationDestinationList"} for i := range v { if err := validateReplicationDestination(&v[i]); err != nil { invalidParams.AddNested(fmt.Sprintf("[%d]", i), err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateReplicationRule(v *types.ReplicationRule) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ReplicationRule"} if v.Destinations == nil { invalidParams.Add(smithy.NewErrParamRequired("Destinations")) } else if v.Destinations != nil { if err := validateReplicationDestinationList(v.Destinations); err != nil { invalidParams.AddNested("Destinations", err.(smithy.InvalidParamsError)) } } if v.RepositoryFilters != nil { if err := validateRepositoryFilterList(v.RepositoryFilters); err != nil { invalidParams.AddNested("RepositoryFilters", err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateReplicationRuleList(v []types.ReplicationRule) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ReplicationRuleList"} for i := range v { if err := validateReplicationRule(&v[i]); err != nil { invalidParams.AddNested(fmt.Sprintf("[%d]", i), err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateRepositoryFilter(v *types.RepositoryFilter) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "RepositoryFilter"} if v.Filter == nil { invalidParams.Add(smithy.NewErrParamRequired("Filter")) } if len(v.FilterType) == 0 { invalidParams.Add(smithy.NewErrParamRequired("FilterType")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateRepositoryFilterList(v []types.RepositoryFilter) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "RepositoryFilterList"} for i := range v { if err := validateRepositoryFilter(&v[i]); err != nil { invalidParams.AddNested(fmt.Sprintf("[%d]", i), err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateScanningRepositoryFilter(v *types.ScanningRepositoryFilter) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ScanningRepositoryFilter"} if v.Filter == nil { invalidParams.Add(smithy.NewErrParamRequired("Filter")) } if len(v.FilterType) == 0 { invalidParams.Add(smithy.NewErrParamRequired("FilterType")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateScanningRepositoryFilterList(v []types.ScanningRepositoryFilter) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ScanningRepositoryFilterList"} for i := range v { if err := validateScanningRepositoryFilter(&v[i]); err != nil { invalidParams.AddNested(fmt.Sprintf("[%d]", i), err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateTag(v *types.Tag) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "Tag"} if v.Key == nil { invalidParams.Add(smithy.NewErrParamRequired("Key")) } if v.Value == nil { invalidParams.Add(smithy.NewErrParamRequired("Value")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateTagList(v []types.Tag) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "TagList"} for i := range v { if err := validateTag(&v[i]); err != nil { invalidParams.AddNested(fmt.Sprintf("[%d]", i), err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpBatchCheckLayerAvailabilityInput(v *BatchCheckLayerAvailabilityInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "BatchCheckLayerAvailabilityInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.LayerDigests == nil { invalidParams.Add(smithy.NewErrParamRequired("LayerDigests")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpBatchDeleteImageInput(v *BatchDeleteImageInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "BatchDeleteImageInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageIds == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageIds")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpBatchGetImageInput(v *BatchGetImageInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "BatchGetImageInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageIds == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageIds")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpBatchGetRepositoryScanningConfigurationInput(v *BatchGetRepositoryScanningConfigurationInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "BatchGetRepositoryScanningConfigurationInput"} if v.RepositoryNames == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryNames")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpCompleteLayerUploadInput(v *CompleteLayerUploadInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "CompleteLayerUploadInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.UploadId == nil { invalidParams.Add(smithy.NewErrParamRequired("UploadId")) } if v.LayerDigests == nil { invalidParams.Add(smithy.NewErrParamRequired("LayerDigests")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpCreatePullThroughCacheRuleInput(v *CreatePullThroughCacheRuleInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "CreatePullThroughCacheRuleInput"} if v.EcrRepositoryPrefix == nil { invalidParams.Add(smithy.NewErrParamRequired("EcrRepositoryPrefix")) } if v.UpstreamRegistryUrl == nil { invalidParams.Add(smithy.NewErrParamRequired("UpstreamRegistryUrl")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpCreateRepositoryCreationTemplateInput(v *CreateRepositoryCreationTemplateInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "CreateRepositoryCreationTemplateInput"} if v.Prefix == nil { invalidParams.Add(smithy.NewErrParamRequired("Prefix")) } if v.EncryptionConfiguration != nil { if err := validateEncryptionConfigurationForRepositoryCreationTemplate(v.EncryptionConfiguration); err != nil { invalidParams.AddNested("EncryptionConfiguration", err.(smithy.InvalidParamsError)) } } if v.ResourceTags != nil { if err := validateTagList(v.ResourceTags); err != nil { invalidParams.AddNested("ResourceTags", err.(smithy.InvalidParamsError)) } } if v.AppliedFor == nil { invalidParams.Add(smithy.NewErrParamRequired("AppliedFor")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpCreateRepositoryInput(v *CreateRepositoryInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "CreateRepositoryInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.Tags != nil { if err := validateTagList(v.Tags); err != nil { invalidParams.AddNested("Tags", err.(smithy.InvalidParamsError)) } } if v.EncryptionConfiguration != nil { if err := validateEncryptionConfiguration(v.EncryptionConfiguration); err != nil { invalidParams.AddNested("EncryptionConfiguration", err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDeleteLifecyclePolicyInput(v *DeleteLifecyclePolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DeleteLifecyclePolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDeletePullThroughCacheRuleInput(v *DeletePullThroughCacheRuleInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DeletePullThroughCacheRuleInput"} if v.EcrRepositoryPrefix == nil { invalidParams.Add(smithy.NewErrParamRequired("EcrRepositoryPrefix")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDeleteRepositoryCreationTemplateInput(v *DeleteRepositoryCreationTemplateInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DeleteRepositoryCreationTemplateInput"} if v.Prefix == nil { invalidParams.Add(smithy.NewErrParamRequired("Prefix")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDeleteRepositoryInput(v *DeleteRepositoryInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DeleteRepositoryInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDeleteRepositoryPolicyInput(v *DeleteRepositoryPolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DeleteRepositoryPolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDescribeImageReplicationStatusInput(v *DescribeImageReplicationStatusInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DescribeImageReplicationStatusInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageId == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageId")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDescribeImageScanFindingsInput(v *DescribeImageScanFindingsInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DescribeImageScanFindingsInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageId == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageId")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDescribeImagesInput(v *DescribeImagesInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DescribeImagesInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpGetAccountSettingInput(v *GetAccountSettingInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "GetAccountSettingInput"} if v.Name == nil { invalidParams.Add(smithy.NewErrParamRequired("Name")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpGetDownloadUrlForLayerInput(v *GetDownloadUrlForLayerInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "GetDownloadUrlForLayerInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.LayerDigest == nil { invalidParams.Add(smithy.NewErrParamRequired("LayerDigest")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpGetLifecyclePolicyInput(v *GetLifecyclePolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "GetLifecyclePolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpGetLifecyclePolicyPreviewInput(v *GetLifecyclePolicyPreviewInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "GetLifecyclePolicyPreviewInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpGetRepositoryPolicyInput(v *GetRepositoryPolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "GetRepositoryPolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpInitiateLayerUploadInput(v *InitiateLayerUploadInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "InitiateLayerUploadInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpListImagesInput(v *ListImagesInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ListImagesInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpListTagsForResourceInput(v *ListTagsForResourceInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ListTagsForResourceInput"} if v.ResourceArn == nil { invalidParams.Add(smithy.NewErrParamRequired("ResourceArn")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutAccountSettingInput(v *PutAccountSettingInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutAccountSettingInput"} if v.Name == nil { invalidParams.Add(smithy.NewErrParamRequired("Name")) } if v.Value == nil { invalidParams.Add(smithy.NewErrParamRequired("Value")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutImageInput(v *PutImageInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutImageInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageManifest == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageManifest")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutImageScanningConfigurationInput(v *PutImageScanningConfigurationInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutImageScanningConfigurationInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageScanningConfiguration == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageScanningConfiguration")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutImageTagMutabilityInput(v *PutImageTagMutabilityInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutImageTagMutabilityInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if len(v.ImageTagMutability) == 0 { invalidParams.Add(smithy.NewErrParamRequired("ImageTagMutability")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutLifecyclePolicyInput(v *PutLifecyclePolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutLifecyclePolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.LifecyclePolicyText == nil { invalidParams.Add(smithy.NewErrParamRequired("LifecyclePolicyText")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutRegistryPolicyInput(v *PutRegistryPolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutRegistryPolicyInput"} if v.PolicyText == nil { invalidParams.Add(smithy.NewErrParamRequired("PolicyText")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutRegistryScanningConfigurationInput(v *PutRegistryScanningConfigurationInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutRegistryScanningConfigurationInput"} if v.Rules != nil { if err := validateRegistryScanningRuleList(v.Rules); err != nil { invalidParams.AddNested("Rules", err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutReplicationConfigurationInput(v *PutReplicationConfigurationInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutReplicationConfigurationInput"} if v.ReplicationConfiguration == nil { invalidParams.Add(smithy.NewErrParamRequired("ReplicationConfiguration")) } else if v.ReplicationConfiguration != nil { if err := validateReplicationConfiguration(v.ReplicationConfiguration); err != nil { invalidParams.AddNested("ReplicationConfiguration", err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpSetRepositoryPolicyInput(v *SetRepositoryPolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "SetRepositoryPolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.PolicyText == nil { invalidParams.Add(smithy.NewErrParamRequired("PolicyText")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpStartImageScanInput(v *StartImageScanInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "StartImageScanInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageId == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageId")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpStartLifecyclePolicyPreviewInput(v *StartLifecyclePolicyPreviewInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "StartLifecyclePolicyPreviewInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpTagResourceInput(v *TagResourceInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "TagResourceInput"} if v.ResourceArn == nil { invalidParams.Add(smithy.NewErrParamRequired("ResourceArn")) } if v.Tags == nil { invalidParams.Add(smithy.NewErrParamRequired("Tags")) } else if v.Tags != nil { if err := validateTagList(v.Tags); err != nil { invalidParams.AddNested("Tags", err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpUntagResourceInput(v *UntagResourceInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "UntagResourceInput"} if v.ResourceArn == nil { invalidParams.Add(smithy.NewErrParamRequired("ResourceArn")) } if v.TagKeys == nil { invalidParams.Add(smithy.NewErrParamRequired("TagKeys")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpUpdatePullThroughCacheRuleInput(v *UpdatePullThroughCacheRuleInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "UpdatePullThroughCacheRuleInput"} if v.EcrRepositoryPrefix == nil { invalidParams.Add(smithy.NewErrParamRequired("EcrRepositoryPrefix")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpUpdateRepositoryCreationTemplateInput(v *UpdateRepositoryCreationTemplateInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "UpdateRepositoryCreationTemplateInput"} if v.Prefix == nil { invalidParams.Add(smithy.NewErrParamRequired("Prefix")) } if v.EncryptionConfiguration != nil { if err := validateEncryptionConfigurationForRepositoryCreationTemplate(v.EncryptionConfiguration); err != nil { invalidParams.AddNested("EncryptionConfiguration", err.(smithy.InvalidParamsError)) } } if v.ResourceTags != nil { if err := validateTagList(v.ResourceTags); err != nil { invalidParams.AddNested("ResourceTags", err.(smithy.InvalidParamsError)) } } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpUploadLayerPartInput(v *UploadLayerPartInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "UploadLayerPartInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.UploadId == nil { invalidParams.Add(smithy.NewErrParamRequired("UploadId")) } if v.PartFirstByte == nil { invalidParams.Add(smithy.NewErrParamRequired("PartFirstByte")) } if v.PartLastByte == nil { invalidParams.Add(smithy.NewErrParamRequired("PartLastByte")) } if v.LayerPartBlob == nil { invalidParams.Add(smithy.NewErrParamRequired("LayerPartBlob")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpValidatePullThroughCacheRuleInput(v *ValidatePullThroughCacheRuleInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ValidatePullThroughCacheRuleInput"} if v.EcrRepositoryPrefix == nil { invalidParams.Add(smithy.NewErrParamRequired("EcrRepositoryPrefix")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/CHANGELOG.md ================================================ # v1.33.0 (2025-04-30) * **Feature**: Adds dualstack support for Amazon Elastic Container Registry Public (Amazon ECR Public). # v1.32.2 (2025-04-03) * No change notes available for this release. # v1.32.1 (2025-03-04.2) * **Bug Fix**: Add assurance test for operation order. # v1.32.0 (2025-02-27) * **Feature**: Track credential providers via User-Agent Feature ids * **Dependency Update**: Updated to the latest SDK module versions # v1.31.3 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.31.2 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.31.1 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.31.0 (2025-01-30) * **Feature**: Temporarily updating dualstack endpoint support * **Dependency Update**: Updated to the latest SDK module versions # v1.30.0 (2025-01-29) * **Feature**: Add support for Dualstack Endpoints # v1.29.5 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.29.4 (2025-01-17) * **Bug Fix**: Fix bug where credentials weren't refreshed during retry loop. # v1.29.3 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.2 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.1 (2025-01-03) * No change notes available for this release. # v1.29.0 (2024-12-28) * **Feature**: Restoring custom endpoint functionality for ECR Public # v1.28.1 (2024-12-26) * No change notes available for this release. # v1.28.0 (2024-12-23) * **Feature**: Add support for Dualstack endpoints # v1.27.8 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.7 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.6 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.27.5 (2024-11-07) * **Bug Fix**: Adds case-insensitive handling of error message fields in service responses # v1.27.4 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.3 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.2 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.1 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.0 (2024-10-04) * **Feature**: Add support for HTTP client metrics. * **Dependency Update**: Updated to the latest SDK module versions # v1.26.4 (2024-10-03) * No change notes available for this release. # v1.26.3 (2024-09-27) * No change notes available for this release. # v1.26.2 (2024-09-25) * No change notes available for this release. # v1.26.1 (2024-09-23) * No change notes available for this release. # v1.26.0 (2024-09-20) * **Feature**: Add tracing and metrics support to service clients. * **Dependency Update**: Updated to the latest SDK module versions # v1.25.7 (2024-09-17) * **Bug Fix**: **BREAKFIX**: Only generate AccountIDEndpointMode config for services that use it. This is a compiler break, but removes no actual functionality, as no services currently use the account ID in endpoint resolution. # v1.25.6 (2024-09-04) * No change notes available for this release. # v1.25.5 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.4 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.25.3 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.2 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.1 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.25.0 (2024-06-26) * **Feature**: Support list-of-string endpoint parameter. # v1.24.1 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.24.0 (2024-06-18) * **Feature**: Track usage of various AWS SDK features in user-agent string. * **Dependency Update**: Updated to the latest SDK module versions # v1.23.11 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.23.10 (2024-06-07) * **Bug Fix**: Add clock skew correction on all service clients * **Dependency Update**: Updated to the latest SDK module versions # v1.23.9 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.23.8 (2024-05-23) * No change notes available for this release. # v1.23.7 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.23.6 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.23.5 (2024-05-08) * **Bug Fix**: GoDoc improvement # v1.23.4 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.23.3 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.23.2 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.23.1 (2024-02-23) * **Bug Fix**: Move all common, SDK-side middleware stack ops into the service client module to prevent cross-module compatibility issues in the future. * **Dependency Update**: Updated to the latest SDK module versions # v1.23.0 (2024-02-22) * **Feature**: Add middleware stack snapshot tests. # v1.22.3 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.22.2 (2024-02-20) * **Bug Fix**: When sourcing values for a service's `EndpointParameters`, the lack of a configured region (i.e. `options.Region == ""`) will now translate to a `nil` value for `EndpointParameters.Region` instead of a pointer to the empty string `""`. This will result in a much more explicit error when calling an operation instead of an obscure hostname lookup failure. # v1.22.1 (2024-02-15) * **Bug Fix**: Correct failure to determine the error type in awsJson services that could occur when errors were modeled with a non-string `code` field. # v1.22.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.21.6 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.21.5 (2023-12-08) * **Bug Fix**: Reinstate presence of default Retryer in functional options, but still respect max attempts set therein. # v1.21.4 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.21.3 (2023-12-06) * **Bug Fix**: Restore pre-refactor auth behavior where all operations could technically be performed anonymously. # v1.21.2 (2023-12-01) * **Bug Fix**: Correct wrapping of errors in authentication workflow. * **Bug Fix**: Correctly recognize cache-wrapped instances of AnonymousCredentials at client construction. * **Dependency Update**: Updated to the latest SDK module versions # v1.21.1 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.21.0 (2023-11-29) * **Feature**: Expose Options() accessor on service clients. * **Dependency Update**: Updated to the latest SDK module versions # v1.20.5 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.20.4 (2023-11-28) * **Bug Fix**: Respect setting RetryMaxAttempts in functional options at client construction. # v1.20.3 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.20.2 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.20.1 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.20.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. * **Dependency Update**: Updated to the latest SDK module versions # v1.19.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.18.2 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.1 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.0 (2023-09-18) * **Announcement**: [BREAKFIX] Change in MaxResults datatype from value to pointer type in cognito-sync service. * **Feature**: Adds several endpoint ruleset changes across all models: smaller rulesets, removed non-unique regional endpoints, fixes FIPS and DualStack endpoints, and make region not required in SDK::Endpoint. Additional breakfix to cognito-sync field. # v1.17.5 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.4 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.3 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.2 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.1 (2023-08-01) * No change notes available for this release. # v1.17.0 (2023-07-31) * **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide. * **Dependency Update**: Updated to the latest SDK module versions # v1.16.6 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.5 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.4 (2023-06-15) * No change notes available for this release. # v1.16.3 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.2 (2023-05-04) * No change notes available for this release. # v1.16.1 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.0 (2023-04-11) * **Feature**: This release will allow using registry alias as registryId in BatchDeleteImage request. # v1.15.8 (2023-04-10) * No change notes available for this release. # v1.15.7 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.6 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.5 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.4 (2023-02-22) * **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. # v1.15.3 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.2 (2023-02-15) * **Announcement**: When receiving an error response in restJson-based services, an incorrect error type may have been returned based on the content of the response. This has been fixed via PR #2012 tracked in issue #1910. * **Bug Fix**: Correct error type parsing for restJson services. # v1.15.1 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.0 (2023-01-09) * **Feature**: This release for Amazon ECR Public makes several change to bring the SDK into sync with the API. # v1.14.0 (2023-01-05) * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). # v1.13.22 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.21 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.20 (2022-11-30) * No change notes available for this release. # v1.13.19 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.18 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.17 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.16 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.15 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.14 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.13 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.12 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.11 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.10 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.9 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.8 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.7 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.6 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.5 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.4 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2022-02-24) * **Feature**: API client updated * **Feature**: Adds RetryMaxAttempts and RetryMod to API client Options. This allows the API clients' default Retryer to be configured from the shared configuration files or environment variables. Adding a new Retry mode of `Adaptive`. `Adaptive` retry mode is an experimental mode, adding client rate limiting when throttles reponses are received from an API. See [retry.AdaptiveMode](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AdaptiveMode) for more details, and configuration options. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.9.0 (2021-12-21) * **Feature**: API Paginators now support specifying the initial starting token, and support stopping on empty string tokens. # v1.8.2 (2021-12-02) * **Bug Fix**: Fixes a bug that prevented aws.EndpointResolverWithOptions from being used by the service client. ([#1514](https://github.com/aws/aws-sdk-go-v2/pull/1514)) * **Dependency Update**: Updated to the latest SDK module versions # v1.8.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.8.0 (2021-11-12) * **Feature**: Service clients now support custom endpoints that have an initial URI path defined. # v1.7.0 (2021-11-06) * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.6.0 (2021-10-21) * **Feature**: Updated to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.5.2 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.1 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.0 (2021-08-27) * **Feature**: Updated API model to latest revision. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.3 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.2 (2021-08-04) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.4.1 (2021-07-15) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2021-05-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_client.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/defaults" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/retry" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" internalauth "github.com/aws/aws-sdk-go-v2/internal/auth" internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy" internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" internalmiddleware "github.com/aws/aws-sdk-go-v2/internal/middleware" smithy "github.com/aws/smithy-go" smithyauth "github.com/aws/smithy-go/auth" smithydocument "github.com/aws/smithy-go/document" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "net" "net/http" "sync/atomic" "time" ) const ServiceID = "ECR PUBLIC" const ServiceAPIVersion = "2020-10-30" type operationMetrics struct { Duration metrics.Float64Histogram SerializeDuration metrics.Float64Histogram ResolveIdentityDuration metrics.Float64Histogram ResolveEndpointDuration metrics.Float64Histogram SignRequestDuration metrics.Float64Histogram DeserializeDuration metrics.Float64Histogram } func (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram { switch name { case "client.call.duration": return m.Duration case "client.call.serialization_duration": return m.SerializeDuration case "client.call.resolve_identity_duration": return m.ResolveIdentityDuration case "client.call.resolve_endpoint_duration": return m.ResolveEndpointDuration case "client.call.signing_duration": return m.SignRequestDuration case "client.call.deserialization_duration": return m.DeserializeDuration default: panic("unrecognized operation metric") } } func timeOperationMetric[T any]( ctx context.Context, metric string, fn func() (T, error), opts ...metrics.RecordMetricOption, ) (T, error) { instr := getOperationMetrics(ctx).histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) start := time.Now() v, err := fn() end := time.Now() elapsed := end.Sub(start) instr.Record(ctx, float64(elapsed)/1e9, opts...) return v, err } func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() { instr := getOperationMetrics(ctx).histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) var ended bool start := time.Now() return func() { if ended { return } ended = true end := time.Now() elapsed := end.Sub(start) instr.Record(ctx, float64(elapsed)/1e9, opts...) } } func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { return func(o *metrics.RecordMetricOptions) { o.Properties.Set("rpc.service", middleware.GetServiceID(ctx)) o.Properties.Set("rpc.method", middleware.GetOperationName(ctx)) } } type operationMetricsKey struct{} func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) { meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/ecrpublic") om := &operationMetrics{} var err error om.Duration, err = operationMetricTimer(meter, "client.call.duration", "Overall call duration (including retries and time to send or receive request and response body)") if err != nil { return nil, err } om.SerializeDuration, err = operationMetricTimer(meter, "client.call.serialization_duration", "The time it takes to serialize a message body") if err != nil { return nil, err } om.ResolveIdentityDuration, err = operationMetricTimer(meter, "client.call.auth.resolve_identity_duration", "The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider") if err != nil { return nil, err } om.ResolveEndpointDuration, err = operationMetricTimer(meter, "client.call.resolve_endpoint_duration", "The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request") if err != nil { return nil, err } om.SignRequestDuration, err = operationMetricTimer(meter, "client.call.auth.signing_duration", "The time it takes to sign a request") if err != nil { return nil, err } om.DeserializeDuration, err = operationMetricTimer(meter, "client.call.deserialization_duration", "The time it takes to deserialize a message body") if err != nil { return nil, err } return context.WithValue(parent, operationMetricsKey{}, om), nil } func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) { return m.Float64Histogram(name, func(o *metrics.InstrumentOptions) { o.UnitLabel = "s" o.Description = desc }) } func getOperationMetrics(ctx context.Context) *operationMetrics { return ctx.Value(operationMetricsKey{}).(*operationMetrics) } func operationTracer(p tracing.TracerProvider) tracing.Tracer { return p.Tracer("github.com/aws/aws-sdk-go-v2/service/ecrpublic") } // Client provides the API client to make operations call for Amazon Elastic // Container Registry Public. type Client struct { options Options // Difference between the time reported by the server and the client timeOffset *atomic.Int64 } // New returns an initialized Client based on the functional options. Provide // additional functional options to further configure the behavior of the client, // such as changing the client's endpoint or adding custom middleware behavior. func New(options Options, optFns ...func(*Options)) *Client { options = options.Copy() resolveDefaultLogger(&options) setResolvedDefaultsMode(&options) resolveRetryer(&options) resolveHTTPClient(&options) resolveHTTPSignerV4(&options) resolveEndpointResolverV2(&options) resolveTracerProvider(&options) resolveMeterProvider(&options) resolveAuthSchemeResolver(&options) for _, fn := range optFns { fn(&options) } finalizeRetryMaxAttempts(&options) ignoreAnonymousAuth(&options) wrapWithAnonymousAuth(&options) resolveAuthSchemes(&options) client := &Client{ options: options, } initializeTimeOffsetResolver(client) return client } // Options returns a copy of the client configuration. // // Callers SHOULD NOT perform mutations on any inner structures within client // config. Config overrides should instead be made on a per-operation basis through // functional options. func (c *Client) Options() Options { return c.options.Copy() } func (c *Client) invokeOperation( ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error, ) ( result interface{}, metadata middleware.Metadata, err error, ) { ctx = middleware.ClearStackValues(ctx) ctx = middleware.WithServiceID(ctx, ServiceID) ctx = middleware.WithOperationName(ctx, opID) stack := middleware.NewStack(opID, smithyhttp.NewStackRequest) options := c.options.Copy() for _, fn := range optFns { fn(&options) } finalizeOperationRetryMaxAttempts(&options, *c) finalizeClientEndpointResolverOptions(&options) for _, fn := range stackFns { if err := fn(stack, options); err != nil { return nil, metadata, err } } for _, fn := range options.APIOptions { if err := fn(stack); err != nil { return nil, metadata, err } } ctx, err = withOperationMetrics(ctx, options.MeterProvider) if err != nil { return nil, metadata, err } tracer := operationTracer(options.TracerProvider) spanName := fmt.Sprintf("%s.%s", ServiceID, opID) ctx = tracing.WithOperationTracer(ctx, tracer) ctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) { o.Kind = tracing.SpanKindClient o.Properties.Set("rpc.system", "aws-api") o.Properties.Set("rpc.method", opID) o.Properties.Set("rpc.service", ServiceID) }) endTimer := startMetricTimer(ctx, "client.call.duration") defer endTimer() defer span.End() handler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) { o.Meter = options.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/ecrpublic") }) decorated := middleware.DecorateHandler(handler, stack) result, metadata, err = decorated.Handle(ctx, params) if err != nil { span.SetProperty("exception.type", fmt.Sprintf("%T", err)) span.SetProperty("exception.message", err.Error()) var aerr smithy.APIError if errors.As(err, &aerr) { span.SetProperty("api.error_code", aerr.ErrorCode()) span.SetProperty("api.error_message", aerr.ErrorMessage()) span.SetProperty("api.error_fault", aerr.ErrorFault().String()) } err = &smithy.OperationError{ ServiceID: ServiceID, OperationName: opID, Err: err, } } span.SetProperty("error", err != nil) if err == nil { span.SetStatus(tracing.SpanStatusOK) } else { span.SetStatus(tracing.SpanStatusError) } return result, metadata, err } type operationInputKey struct{} func setOperationInput(ctx context.Context, input interface{}) context.Context { return middleware.WithStackValue(ctx, operationInputKey{}, input) } func getOperationInput(ctx context.Context) interface{} { return middleware.GetStackValue(ctx, operationInputKey{}) } type setOperationInputMiddleware struct { } func (*setOperationInputMiddleware) ID() string { return "setOperationInput" } func (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { ctx = setOperationInput(ctx, in.Parameters) return next.HandleSerialize(ctx, in) } func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error { if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil { return fmt.Errorf("add ResolveAuthScheme: %w", err) } if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil { return fmt.Errorf("add GetIdentity: %v", err) } if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil { return fmt.Errorf("add ResolveEndpointV2: %v", err) } if err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, "ResolveEndpointV2", middleware.After); err != nil { return fmt.Errorf("add Signing: %w", err) } return nil } func resolveAuthSchemeResolver(options *Options) { if options.AuthSchemeResolver == nil { options.AuthSchemeResolver = &defaultAuthSchemeResolver{} } } func resolveAuthSchemes(options *Options) { if options.AuthSchemes == nil { options.AuthSchemes = []smithyhttp.AuthScheme{ internalauth.NewHTTPAuthScheme("aws.auth#sigv4", &internalauthsmithy.V4SignerAdapter{ Signer: options.HTTPSignerV4, Logger: options.Logger, LogSigning: options.ClientLogMode.IsSigning(), }), } } } type noSmithyDocumentSerde = smithydocument.NoSerde type legacyEndpointContextSetter struct { LegacyResolver EndpointResolver } func (*legacyEndpointContextSetter) ID() string { return "legacyEndpointContextSetter" } func (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { if m.LegacyResolver != nil { ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true) } return next.HandleInitialize(ctx, in) } func addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error { return stack.Initialize.Add(&legacyEndpointContextSetter{ LegacyResolver: o.EndpointResolver, }, middleware.Before) } func resolveDefaultLogger(o *Options) { if o.Logger != nil { return } o.Logger = logging.Nop{} } func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error { return middleware.AddSetLoggerMiddleware(stack, o.Logger) } func setResolvedDefaultsMode(o *Options) { if len(o.resolvedDefaultsMode) > 0 { return } var mode aws.DefaultsMode mode.SetFromString(string(o.DefaultsMode)) if mode == aws.DefaultsModeAuto { mode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment) } o.resolvedDefaultsMode = mode } // NewFromConfig returns a new client from the provided config. func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client { opts := Options{ Region: cfg.Region, DefaultsMode: cfg.DefaultsMode, RuntimeEnvironment: cfg.RuntimeEnvironment, HTTPClient: cfg.HTTPClient, Credentials: cfg.Credentials, APIOptions: cfg.APIOptions, Logger: cfg.Logger, ClientLogMode: cfg.ClientLogMode, AppID: cfg.AppID, } resolveAWSRetryerProvider(cfg, &opts) resolveAWSRetryMaxAttempts(cfg, &opts) resolveAWSRetryMode(cfg, &opts) resolveAWSEndpointResolver(cfg, &opts) resolveUseDualStackEndpoint(cfg, &opts) resolveUseFIPSEndpoint(cfg, &opts) resolveBaseEndpoint(cfg, &opts) return New(opts, optFns...) } func resolveHTTPClient(o *Options) { var buildable *awshttp.BuildableClient if o.HTTPClient != nil { var ok bool buildable, ok = o.HTTPClient.(*awshttp.BuildableClient) if !ok { return } } else { buildable = awshttp.NewBuildableClient() } modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode) if err == nil { buildable = buildable.WithDialerOptions(func(dialer *net.Dialer) { if dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok { dialer.Timeout = dialerTimeout } }) buildable = buildable.WithTransportOptions(func(transport *http.Transport) { if tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok { transport.TLSHandshakeTimeout = tlsHandshakeTimeout } }) } o.HTTPClient = buildable } func resolveRetryer(o *Options) { if o.Retryer != nil { return } if len(o.RetryMode) == 0 { modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode) if err == nil { o.RetryMode = modeConfig.RetryMode } } if len(o.RetryMode) == 0 { o.RetryMode = aws.RetryModeStandard } var standardOptions []func(*retry.StandardOptions) if v := o.RetryMaxAttempts; v != 0 { standardOptions = append(standardOptions, func(so *retry.StandardOptions) { so.MaxAttempts = v }) } switch o.RetryMode { case aws.RetryModeAdaptive: var adaptiveOptions []func(*retry.AdaptiveModeOptions) if len(standardOptions) != 0 { adaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) { ao.StandardOptions = append(ao.StandardOptions, standardOptions...) }) } o.Retryer = retry.NewAdaptiveMode(adaptiveOptions...) default: o.Retryer = retry.NewStandard(standardOptions...) } } func resolveAWSRetryerProvider(cfg aws.Config, o *Options) { if cfg.Retryer == nil { return } o.Retryer = cfg.Retryer() } func resolveAWSRetryMode(cfg aws.Config, o *Options) { if len(cfg.RetryMode) == 0 { return } o.RetryMode = cfg.RetryMode } func resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) { if cfg.RetryMaxAttempts == 0 { return } o.RetryMaxAttempts = cfg.RetryMaxAttempts } func finalizeRetryMaxAttempts(o *Options) { if o.RetryMaxAttempts == 0 { return } o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts) } func finalizeOperationRetryMaxAttempts(o *Options, client Client) { if v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts { return } o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts) } func resolveAWSEndpointResolver(cfg aws.Config, o *Options) { if cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil { return } o.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions) } func addClientUserAgent(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, "ecrpublic", goModuleVersion) if len(options.AppID) > 0 { ua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID) } return nil } func getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) { id := (*awsmiddleware.RequestUserAgent)(nil).ID() mw, ok := stack.Build.Get(id) if !ok { mw = awsmiddleware.NewRequestUserAgent() if err := stack.Build.Add(mw, middleware.After); err != nil { return nil, err } } ua, ok := mw.(*awsmiddleware.RequestUserAgent) if !ok { return nil, fmt.Errorf("%T for %s middleware did not match expected type", mw, id) } return ua, nil } type HTTPSignerV4 interface { SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error } func resolveHTTPSignerV4(o *Options) { if o.HTTPSignerV4 != nil { return } o.HTTPSignerV4 = newDefaultV4Signer(*o) } func newDefaultV4Signer(o Options) *v4.Signer { return v4.NewSigner(func(so *v4.SignerOptions) { so.Logger = o.Logger so.LogSigning = o.ClientLogMode.IsSigning() }) } func addClientRequestID(stack *middleware.Stack) error { return stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After) } func addComputeContentLength(stack *middleware.Stack) error { return stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After) } func addRawResponseToMetadata(stack *middleware.Stack) error { return stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before) } func addRecordResponseTiming(stack *middleware.Stack) error { return stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After) } func addSpanRetryLoop(stack *middleware.Stack, options Options) error { return stack.Finalize.Insert(&spanRetryLoop{options: options}, "Retry", middleware.Before) } type spanRetryLoop struct { options Options } func (*spanRetryLoop) ID() string { return "spanRetryLoop" } func (m *spanRetryLoop) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( middleware.FinalizeOutput, middleware.Metadata, error, ) { tracer := operationTracer(m.options.TracerProvider) ctx, span := tracer.StartSpan(ctx, "RetryLoop") defer span.End() return next.HandleFinalize(ctx, in) } func addStreamingEventsPayload(stack *middleware.Stack) error { return stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before) } func addUnsignedPayload(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.UnsignedPayload{}, "ResolveEndpointV2", middleware.After) } func addComputePayloadSHA256(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, "ResolveEndpointV2", middleware.After) } func addContentSHA256Header(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After) } func addIsWaiterUserAgent(o *Options) { o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter) return nil }) } func addIsPaginatorUserAgent(o *Options) { o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator) return nil }) } func addRetry(stack *middleware.Stack, o Options) error { attempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) { m.LogAttempts = o.ClientLogMode.IsRetries() m.OperationMeter = o.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/ecrpublic") }) if err := stack.Finalize.Insert(attempt, "ResolveAuthScheme", middleware.Before); err != nil { return err } if err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil { return err } return nil } // resolves dual-stack endpoint configuration func resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error { if len(cfg.ConfigSources) == 0 { return nil } value, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources) if err != nil { return err } if found { o.EndpointOptions.UseDualStackEndpoint = value } return nil } // resolves FIPS endpoint configuration func resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error { if len(cfg.ConfigSources) == 0 { return nil } value, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources) if err != nil { return err } if found { o.EndpointOptions.UseFIPSEndpoint = value } return nil } func resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string { if mode == aws.AccountIDEndpointModeDisabled { return nil } if ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != "" { return aws.String(ca.Credentials.AccountID) } return nil } func addTimeOffsetBuild(stack *middleware.Stack, c *Client) error { mw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset} if err := stack.Build.Add(&mw, middleware.After); err != nil { return err } return stack.Deserialize.Insert(&mw, "RecordResponseTiming", middleware.Before) } func initializeTimeOffsetResolver(c *Client) { c.timeOffset = new(atomic.Int64) } func addUserAgentRetryMode(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } switch options.Retryer.(type) { case *retry.Standard: ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard) case *retry.AdaptiveMode: ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive) } return nil } type setCredentialSourceMiddleware struct { ua *awsmiddleware.RequestUserAgent options Options } func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" } func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource) if !ok { return next.HandleBuild(ctx, in) } providerSources := asProviderSource.ProviderSources() for _, source := range providerSources { m.ua.AddCredentialsSource(source) } return next.HandleBuild(ctx, in) } func addCredentialSource(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } mw := setCredentialSourceMiddleware{ua: ua, options: options} return stack.Build.Insert(&mw, "UserAgent", middleware.Before) } func resolveTracerProvider(options *Options) { if options.TracerProvider == nil { options.TracerProvider = &tracing.NopTracerProvider{} } } func resolveMeterProvider(options *Options) { if options.MeterProvider == nil { options.MeterProvider = metrics.NopMeterProvider{} } } func addRecursionDetection(stack *middleware.Stack) error { return stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After) } func addRequestIDRetrieverMiddleware(stack *middleware.Stack) error { return stack.Deserialize.Insert(&awsmiddleware.RequestIDRetriever{}, "OperationDeserializer", middleware.Before) } func addResponseErrorMiddleware(stack *middleware.Stack) error { return stack.Deserialize.Insert(&awshttp.ResponseErrorWrapper{}, "RequestIDRetriever", middleware.Before) } func addRequestResponseLogging(stack *middleware.Stack, o Options) error { return stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{ LogRequest: o.ClientLogMode.IsRequest(), LogRequestWithBody: o.ClientLogMode.IsRequestWithBody(), LogResponse: o.ClientLogMode.IsResponse(), LogResponseWithBody: o.ClientLogMode.IsResponseWithBody(), }, middleware.After) } type disableHTTPSMiddleware struct { DisableHTTPS bool } func (*disableHTTPSMiddleware) ID() string { return "disableHTTPS" } func (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) { req.URL.Scheme = "http" } return next.HandleFinalize(ctx, in) } func addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error { return stack.Finalize.Insert(&disableHTTPSMiddleware{ DisableHTTPS: o.EndpointOptions.DisableHTTPS, }, "ResolveEndpointV2", middleware.After) } type spanInitializeStart struct { } func (*spanInitializeStart) ID() string { return "spanInitializeStart" } func (m *spanInitializeStart) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( middleware.InitializeOutput, middleware.Metadata, error, ) { ctx, _ = tracing.StartSpan(ctx, "Initialize") return next.HandleInitialize(ctx, in) } type spanInitializeEnd struct { } func (*spanInitializeEnd) ID() string { return "spanInitializeEnd" } func (m *spanInitializeEnd) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( middleware.InitializeOutput, middleware.Metadata, error, ) { ctx, span := tracing.PopSpan(ctx) span.End() return next.HandleInitialize(ctx, in) } type spanBuildRequestStart struct { } func (*spanBuildRequestStart) ID() string { return "spanBuildRequestStart" } func (m *spanBuildRequestStart) HandleSerialize( ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, ) ( middleware.SerializeOutput, middleware.Metadata, error, ) { ctx, _ = tracing.StartSpan(ctx, "BuildRequest") return next.HandleSerialize(ctx, in) } type spanBuildRequestEnd struct { } func (*spanBuildRequestEnd) ID() string { return "spanBuildRequestEnd" } func (m *spanBuildRequestEnd) HandleBuild( ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, ) ( middleware.BuildOutput, middleware.Metadata, error, ) { ctx, span := tracing.PopSpan(ctx) span.End() return next.HandleBuild(ctx, in) } func addSpanInitializeStart(stack *middleware.Stack) error { return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before) } func addSpanInitializeEnd(stack *middleware.Stack) error { return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After) } func addSpanBuildRequestStart(stack *middleware.Stack) error { return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before) } func addSpanBuildRequestEnd(stack *middleware.Stack) error { return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchCheckLayerAvailability.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Checks the availability of one or more image layers that are within a // repository in a public registry. When an image is pushed to a repository, each // image layer is checked to verify if it has been uploaded before. If it has been // uploaded, then the image layer is skipped. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) BatchCheckLayerAvailability(ctx context.Context, params *BatchCheckLayerAvailabilityInput, optFns ...func(*Options)) (*BatchCheckLayerAvailabilityOutput, error) { if params == nil { params = &BatchCheckLayerAvailabilityInput{} } result, metadata, err := c.invokeOperation(ctx, "BatchCheckLayerAvailability", params, optFns, c.addOperationBatchCheckLayerAvailabilityMiddlewares) if err != nil { return nil, err } out := result.(*BatchCheckLayerAvailabilityOutput) out.ResultMetadata = metadata return out, nil } type BatchCheckLayerAvailabilityInput struct { // The digests of the image layers to check. // // This member is required. LayerDigests []string // The name of the repository that's associated with the image layers to check. // // This member is required. RepositoryName *string // The Amazon Web Services account ID, or registry alias, associated with the // public registry that contains the image layers to check. If you do not specify a // registry, the default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type BatchCheckLayerAvailabilityOutput struct { // Any failures associated with the call. Failures []types.LayerFailure // A list of image layer objects that correspond to the image layer references in // the request. Layers []types.Layer // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationBatchCheckLayerAvailabilityMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchCheckLayerAvailability{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchCheckLayerAvailability{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "BatchCheckLayerAvailability"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpBatchCheckLayerAvailabilityValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchCheckLayerAvailability(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opBatchCheckLayerAvailability(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "BatchCheckLayerAvailability", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_BatchDeleteImage.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes a list of specified images that are within a repository in a public // registry. Images are specified with either an imageTag or imageDigest . // // You can remove a tag from an image by specifying the image's tag in your // request. When you remove the last tag from an image, the image is deleted from // your repository. // // You can completely delete an image (and all of its tags) by specifying the // digest of the image in your request. func (c *Client) BatchDeleteImage(ctx context.Context, params *BatchDeleteImageInput, optFns ...func(*Options)) (*BatchDeleteImageOutput, error) { if params == nil { params = &BatchDeleteImageInput{} } result, metadata, err := c.invokeOperation(ctx, "BatchDeleteImage", params, optFns, c.addOperationBatchDeleteImageMiddlewares) if err != nil { return nil, err } out := result.(*BatchDeleteImageOutput) out.ResultMetadata = metadata return out, nil } type BatchDeleteImageInput struct { // A list of image ID references that correspond to images to delete. The format // of the imageIds reference is imageTag=tag or imageDigest=digest . // // This member is required. ImageIds []types.ImageIdentifier // The repository in a public registry that contains the image to delete. // // This member is required. RepositoryName *string // The Amazon Web Services account ID, or registry alias, that's associated with // the registry that contains the image to delete. If you do not specify a // registry, the default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type BatchDeleteImageOutput struct { // Any failures associated with the call. Failures []types.ImageFailure // The image IDs of the deleted images. ImageIds []types.ImageIdentifier // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationBatchDeleteImageMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpBatchDeleteImage{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpBatchDeleteImage{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "BatchDeleteImage"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpBatchDeleteImageValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opBatchDeleteImage(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opBatchDeleteImage(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "BatchDeleteImage", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CompleteLayerUpload.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Informs Amazon ECR that the image layer upload is complete for a specified // public registry, repository name, and upload ID. You can optionally provide a // sha256 digest of the image layer for data validation purposes. // // When an image is pushed, the CompleteLayerUpload API is called once for each // new image layer to verify that the upload is complete. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) CompleteLayerUpload(ctx context.Context, params *CompleteLayerUploadInput, optFns ...func(*Options)) (*CompleteLayerUploadOutput, error) { if params == nil { params = &CompleteLayerUploadInput{} } result, metadata, err := c.invokeOperation(ctx, "CompleteLayerUpload", params, optFns, c.addOperationCompleteLayerUploadMiddlewares) if err != nil { return nil, err } out := result.(*CompleteLayerUploadOutput) out.ResultMetadata = metadata return out, nil } type CompleteLayerUploadInput struct { // The sha256 digest of the image layer. // // This member is required. LayerDigests []string // The name of the repository in a public registry to associate with the image // layer. // // This member is required. RepositoryName *string // The upload ID from a previous InitiateLayerUpload operation to associate with the image layer. // // This member is required. UploadId *string // The Amazon Web Services account ID, or registry alias, associated with the // registry where layers are uploaded. If you do not specify a registry, the // default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type CompleteLayerUploadOutput struct { // The sha256 digest of the image layer. LayerDigest *string // The public registry ID that's associated with the request. RegistryId *string // The repository name that's associated with the request. RepositoryName *string // The upload ID that's associated with the layer. UploadId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCompleteLayerUploadMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpCompleteLayerUpload{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCompleteLayerUpload{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CompleteLayerUpload"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCompleteLayerUploadValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCompleteLayerUpload(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opCompleteLayerUpload(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CompleteLayerUpload", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_CreateRepository.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates a repository in a public registry. For more information, see [Amazon ECR repositories] in the // Amazon Elastic Container Registry User Guide. // // [Amazon ECR repositories]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html func (c *Client) CreateRepository(ctx context.Context, params *CreateRepositoryInput, optFns ...func(*Options)) (*CreateRepositoryOutput, error) { if params == nil { params = &CreateRepositoryInput{} } result, metadata, err := c.invokeOperation(ctx, "CreateRepository", params, optFns, c.addOperationCreateRepositoryMiddlewares) if err != nil { return nil, err } out := result.(*CreateRepositoryOutput) out.ResultMetadata = metadata return out, nil } type CreateRepositoryInput struct { // The name to use for the repository. This appears publicly in the Amazon ECR // Public Gallery. The repository name can be specified on its own (for example // nginx-web-app ) or prepended with a namespace to group the repository into a // category (for example project-a/nginx-web-app ). // // This member is required. RepositoryName *string // The details about the repository that are publicly visible in the Amazon ECR // Public Gallery. CatalogData *types.RepositoryCatalogDataInput // The metadata that you apply to each repository to help categorize and organize // your repositories. Each tag consists of a key and an optional value. You define // both of them. Tag keys can have a maximum character length of 128 characters, // and tag values can have a maximum length of 256 characters. Tags []types.Tag noSmithyDocumentSerde } type CreateRepositoryOutput struct { // The catalog data for a repository. This data is publicly visible in the Amazon // ECR Public Gallery. CatalogData *types.RepositoryCatalogData // The repository that was created. Repository *types.Repository // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCreateRepositoryMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpCreateRepository{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpCreateRepository{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CreateRepository"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCreateRepositoryValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateRepository(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opCreateRepository(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CreateRepository", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepository.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes a repository in a public registry. If the repository contains images, // you must either manually delete all images in the repository or use the force // option. This option deletes all images on your behalf before deleting the // repository. func (c *Client) DeleteRepository(ctx context.Context, params *DeleteRepositoryInput, optFns ...func(*Options)) (*DeleteRepositoryOutput, error) { if params == nil { params = &DeleteRepositoryInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteRepository", params, optFns, c.addOperationDeleteRepositoryMiddlewares) if err != nil { return nil, err } out := result.(*DeleteRepositoryOutput) out.ResultMetadata = metadata return out, nil } type DeleteRepositoryInput struct { // The name of the repository to delete. // // This member is required. RepositoryName *string // The force option can be used to delete a repository that contains images. If // the force option is not used, the repository must be empty prior to deletion. Force bool // The Amazon Web Services account ID that's associated with the public registry // that contains the repository to delete. If you do not specify a registry, the // default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type DeleteRepositoryOutput struct { // The repository that was deleted. Repository *types.Repository // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteRepositoryMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepository{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepository{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteRepository"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteRepositoryValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepository(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDeleteRepository(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteRepository", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DeleteRepositoryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes the repository policy that's associated with the specified repository. func (c *Client) DeleteRepositoryPolicy(ctx context.Context, params *DeleteRepositoryPolicyInput, optFns ...func(*Options)) (*DeleteRepositoryPolicyOutput, error) { if params == nil { params = &DeleteRepositoryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteRepositoryPolicy", params, optFns, c.addOperationDeleteRepositoryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*DeleteRepositoryPolicyOutput) out.ResultMetadata = metadata return out, nil } type DeleteRepositoryPolicyInput struct { // The name of the repository that's associated with the repository policy to // delete. // // This member is required. RepositoryName *string // The Amazon Web Services account ID that's associated with the public registry // that contains the repository policy to delete. If you do not specify a registry, // the default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type DeleteRepositoryPolicyOutput struct { // The JSON repository policy that was deleted from the repository. PolicyText *string // The registry ID that's associated with the request. RegistryId *string // The repository name that's associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDeleteRepositoryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDeleteRepositoryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteRepositoryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteRepositoryPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opDeleteRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteRepositoryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImageTags.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns the image tag details for a repository in a public registry. func (c *Client) DescribeImageTags(ctx context.Context, params *DescribeImageTagsInput, optFns ...func(*Options)) (*DescribeImageTagsOutput, error) { if params == nil { params = &DescribeImageTagsInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeImageTags", params, optFns, c.addOperationDescribeImageTagsMiddlewares) if err != nil { return nil, err } out := result.(*DescribeImageTagsOutput) out.ResultMetadata = metadata return out, nil } type DescribeImageTagsInput struct { // The name of the repository that contains the image tag details to describe. // // This member is required. RepositoryName *string // The maximum number of repository results that's returned by DescribeImageTags // in paginated output. When this parameter is used, DescribeImageTags only // returns maxResults results in a single page along with a nextToken response // element. You can see the remaining results of the initial request by sending // another DescribeImageTags request with the returned nextToken value. This value // can be between 1 and 1000. If this parameter isn't used, then DescribeImageTags // returns up to 100 results and a nextToken value, if applicable. If you specify // images with imageIds , you can't use this option. MaxResults *int32 // The nextToken value that's returned from a previous paginated DescribeImageTags // request where maxResults was used and the results exceeded the value of that // parameter. Pagination continues from the end of the previous results that // returned the nextToken value. If there are no more results to return, this // value is null . If you specify images with imageIds , you can't use this option. NextToken *string // The Amazon Web Services account ID that's associated with the public registry // that contains the repository where images are described. If you do not specify a // registry, the default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type DescribeImageTagsOutput struct { // The image tag details for the images in the requested repository. ImageTagDetails []types.ImageTagDetail // The nextToken value to include in a future DescribeImageTags request. When the // results of a DescribeImageTags request exceed maxResults , you can use this // value to retrieve the next page of results. If there are no more results to // return, this value is null . NextToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeImageTagsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImageTags{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImageTags{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeImageTags"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDescribeImageTagsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImageTags(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // DescribeImageTagsPaginatorOptions is the paginator options for DescribeImageTags type DescribeImageTagsPaginatorOptions struct { // The maximum number of repository results that's returned by DescribeImageTags // in paginated output. When this parameter is used, DescribeImageTags only // returns maxResults results in a single page along with a nextToken response // element. You can see the remaining results of the initial request by sending // another DescribeImageTags request with the returned nextToken value. This value // can be between 1 and 1000. If this parameter isn't used, then DescribeImageTags // returns up to 100 results and a nextToken value, if applicable. If you specify // images with imageIds , you can't use this option. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribeImageTagsPaginator is a paginator for DescribeImageTags type DescribeImageTagsPaginator struct { options DescribeImageTagsPaginatorOptions client DescribeImageTagsAPIClient params *DescribeImageTagsInput nextToken *string firstPage bool } // NewDescribeImageTagsPaginator returns a new DescribeImageTagsPaginator func NewDescribeImageTagsPaginator(client DescribeImageTagsAPIClient, params *DescribeImageTagsInput, optFns ...func(*DescribeImageTagsPaginatorOptions)) *DescribeImageTagsPaginator { if params == nil { params = &DescribeImageTagsInput{} } options := DescribeImageTagsPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribeImageTagsPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribeImageTagsPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribeImageTags page. func (p *DescribeImageTagsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImageTagsOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribeImageTags(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribeImageTagsAPIClient is a client that implements the DescribeImageTags // operation. type DescribeImageTagsAPIClient interface { DescribeImageTags(context.Context, *DescribeImageTagsInput, ...func(*Options)) (*DescribeImageTagsOutput, error) } var _ DescribeImageTagsAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribeImageTags(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeImageTags", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeImages.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns metadata that's related to the images in a repository in a public // registry. // // Beginning with Docker version 1.9, the Docker client compresses image layers // before pushing them to a V2 Docker registry. The output of the docker images // command shows the uncompressed image size. Therefore, it might return a larger // image size than the image sizes that are returned by DescribeImages. func (c *Client) DescribeImages(ctx context.Context, params *DescribeImagesInput, optFns ...func(*Options)) (*DescribeImagesOutput, error) { if params == nil { params = &DescribeImagesInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeImages", params, optFns, c.addOperationDescribeImagesMiddlewares) if err != nil { return nil, err } out := result.(*DescribeImagesOutput) out.ResultMetadata = metadata return out, nil } type DescribeImagesInput struct { // The repository that contains the images to describe. // // This member is required. RepositoryName *string // The list of image IDs for the requested repository. ImageIds []types.ImageIdentifier // The maximum number of repository results that's returned by DescribeImages in // paginated output. When this parameter is used, DescribeImages only returns // maxResults results in a single page along with a nextToken response element. // You can see the remaining results of the initial request by sending another // DescribeImages request with the returned nextToken value. This value can be // between 1 and 1000. If this parameter isn't used, then DescribeImages returns // up to 100 results and a nextToken value, if applicable. If you specify images // with imageIds , you can't use this option. MaxResults *int32 // The nextToken value that's returned from a previous paginated DescribeImages // request where maxResults was used and the results exceeded the value of that // parameter. Pagination continues from the end of the previous results that // returned the nextToken value. If there are no more results to return, this // value is null . If you specify images with imageIds , you can't use this option. NextToken *string // The Amazon Web Services account ID that's associated with the public registry // that contains the repository where images are described. If you do not specify a // registry, the default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type DescribeImagesOutput struct { // A list of ImageDetail objects that contain data about the image. ImageDetails []types.ImageDetail // The nextToken value to include in a future DescribeImages request. When the // results of a DescribeImages request exceed maxResults , you can use this value // to retrieve the next page of results. If there are no more results to return, // this value is null . NextToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeImagesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeImages{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeImages{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeImages"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDescribeImagesValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeImages(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // DescribeImagesPaginatorOptions is the paginator options for DescribeImages type DescribeImagesPaginatorOptions struct { // The maximum number of repository results that's returned by DescribeImages in // paginated output. When this parameter is used, DescribeImages only returns // maxResults results in a single page along with a nextToken response element. // You can see the remaining results of the initial request by sending another // DescribeImages request with the returned nextToken value. This value can be // between 1 and 1000. If this parameter isn't used, then DescribeImages returns // up to 100 results and a nextToken value, if applicable. If you specify images // with imageIds , you can't use this option. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribeImagesPaginator is a paginator for DescribeImages type DescribeImagesPaginator struct { options DescribeImagesPaginatorOptions client DescribeImagesAPIClient params *DescribeImagesInput nextToken *string firstPage bool } // NewDescribeImagesPaginator returns a new DescribeImagesPaginator func NewDescribeImagesPaginator(client DescribeImagesAPIClient, params *DescribeImagesInput, optFns ...func(*DescribeImagesPaginatorOptions)) *DescribeImagesPaginator { if params == nil { params = &DescribeImagesInput{} } options := DescribeImagesPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribeImagesPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribeImagesPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribeImages page. func (p *DescribeImagesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeImagesOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribeImages(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribeImagesAPIClient is a client that implements the DescribeImages // operation. type DescribeImagesAPIClient interface { DescribeImages(context.Context, *DescribeImagesInput, ...func(*Options)) (*DescribeImagesOutput, error) } var _ DescribeImagesAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribeImages(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeImages", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRegistries.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns details for a public registry. func (c *Client) DescribeRegistries(ctx context.Context, params *DescribeRegistriesInput, optFns ...func(*Options)) (*DescribeRegistriesOutput, error) { if params == nil { params = &DescribeRegistriesInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeRegistries", params, optFns, c.addOperationDescribeRegistriesMiddlewares) if err != nil { return nil, err } out := result.(*DescribeRegistriesOutput) out.ResultMetadata = metadata return out, nil } type DescribeRegistriesInput struct { // The maximum number of repository results that's returned by DescribeRegistries // in paginated output. When this parameter is used, DescribeRegistries only // returns maxResults results in a single page along with a nextToken response // element. The remaining results of the initial request can be seen by sending // another DescribeRegistries request with the returned nextToken value. This // value can be between 1 and 1000. If this parameter isn't used, then // DescribeRegistries returns up to 100 results and a nextToken value, if // applicable. MaxResults *int32 // The nextToken value that's returned from a previous paginated DescribeRegistries // request where maxResults was used and the results exceeded the value of that // parameter. Pagination continues from the end of the previous results that // returned the nextToken value. If there are no more results to return, this // value is null . // // This token should be treated as an opaque identifier that is only used to // retrieve the next items in a list and not for other programmatic purposes. NextToken *string noSmithyDocumentSerde } type DescribeRegistriesOutput struct { // An object that contains the details for a public registry. // // This member is required. Registries []types.Registry // The nextToken value to include in a future DescribeRepositories request. If the // results of a DescribeRepositories request exceed maxResults , you can use this // value to retrieve the next page of results. If there are no more results, this // value is null . NextToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeRegistriesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRegistries{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRegistries{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeRegistries"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRegistries(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // DescribeRegistriesPaginatorOptions is the paginator options for // DescribeRegistries type DescribeRegistriesPaginatorOptions struct { // The maximum number of repository results that's returned by DescribeRegistries // in paginated output. When this parameter is used, DescribeRegistries only // returns maxResults results in a single page along with a nextToken response // element. The remaining results of the initial request can be seen by sending // another DescribeRegistries request with the returned nextToken value. This // value can be between 1 and 1000. If this parameter isn't used, then // DescribeRegistries returns up to 100 results and a nextToken value, if // applicable. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribeRegistriesPaginator is a paginator for DescribeRegistries type DescribeRegistriesPaginator struct { options DescribeRegistriesPaginatorOptions client DescribeRegistriesAPIClient params *DescribeRegistriesInput nextToken *string firstPage bool } // NewDescribeRegistriesPaginator returns a new DescribeRegistriesPaginator func NewDescribeRegistriesPaginator(client DescribeRegistriesAPIClient, params *DescribeRegistriesInput, optFns ...func(*DescribeRegistriesPaginatorOptions)) *DescribeRegistriesPaginator { if params == nil { params = &DescribeRegistriesInput{} } options := DescribeRegistriesPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribeRegistriesPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribeRegistriesPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribeRegistries page. func (p *DescribeRegistriesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeRegistriesOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribeRegistries(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribeRegistriesAPIClient is a client that implements the DescribeRegistries // operation. type DescribeRegistriesAPIClient interface { DescribeRegistries(context.Context, *DescribeRegistriesInput, ...func(*Options)) (*DescribeRegistriesOutput, error) } var _ DescribeRegistriesAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribeRegistries(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeRegistries", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_DescribeRepositories.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Describes repositories that are in a public registry. func (c *Client) DescribeRepositories(ctx context.Context, params *DescribeRepositoriesInput, optFns ...func(*Options)) (*DescribeRepositoriesOutput, error) { if params == nil { params = &DescribeRepositoriesInput{} } result, metadata, err := c.invokeOperation(ctx, "DescribeRepositories", params, optFns, c.addOperationDescribeRepositoriesMiddlewares) if err != nil { return nil, err } out := result.(*DescribeRepositoriesOutput) out.ResultMetadata = metadata return out, nil } type DescribeRepositoriesInput struct { // The maximum number of repository results that's returned by DescribeRepositories // in paginated output. When this parameter is used, DescribeRepositories only // returns maxResults results in a single page along with a nextToken response // element. You can see the remaining results of the initial request by sending // another DescribeRepositories request with the returned nextToken value. This // value can be between 1 and 1000. If this parameter isn't used, then // DescribeRepositories returns up to 100 results and a nextToken value, if // applicable. If you specify repositories with repositoryNames , you can't use // this option. MaxResults *int32 // The nextToken value that's returned from a previous paginated // DescribeRepositories request where maxResults was used and the results exceeded // the value of that parameter. Pagination continues from the end of the previous // results that returned the nextToken value. If there are no more results to // return, this value is null . If you specify repositories with repositoryNames , // you can't use this option. // // This token should be treated as an opaque identifier that is only used to // retrieve the next items in a list and not for other programmatic purposes. NextToken *string // The Amazon Web Services account ID that's associated with the registry that // contains the repositories to be described. If you do not specify a registry, the // default public registry is assumed. RegistryId *string // A list of repositories to describe. If this parameter is omitted, then all // repositories in a registry are described. RepositoryNames []string noSmithyDocumentSerde } type DescribeRepositoriesOutput struct { // The nextToken value to include in a future DescribeRepositories request. When // the results of a DescribeRepositories request exceed maxResults , this value can // be used to retrieve the next page of results. If there are no more results to // return, this value is null . NextToken *string // A list of repository objects corresponding to valid repositories. Repositories []types.Repository // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDescribeRepositoriesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpDescribeRepositories{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpDescribeRepositories{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeRepositories"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRepositories(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // DescribeRepositoriesPaginatorOptions is the paginator options for // DescribeRepositories type DescribeRepositoriesPaginatorOptions struct { // The maximum number of repository results that's returned by DescribeRepositories // in paginated output. When this parameter is used, DescribeRepositories only // returns maxResults results in a single page along with a nextToken response // element. You can see the remaining results of the initial request by sending // another DescribeRepositories request with the returned nextToken value. This // value can be between 1 and 1000. If this parameter isn't used, then // DescribeRepositories returns up to 100 results and a nextToken value, if // applicable. If you specify repositories with repositoryNames , you can't use // this option. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // DescribeRepositoriesPaginator is a paginator for DescribeRepositories type DescribeRepositoriesPaginator struct { options DescribeRepositoriesPaginatorOptions client DescribeRepositoriesAPIClient params *DescribeRepositoriesInput nextToken *string firstPage bool } // NewDescribeRepositoriesPaginator returns a new DescribeRepositoriesPaginator func NewDescribeRepositoriesPaginator(client DescribeRepositoriesAPIClient, params *DescribeRepositoriesInput, optFns ...func(*DescribeRepositoriesPaginatorOptions)) *DescribeRepositoriesPaginator { if params == nil { params = &DescribeRepositoriesInput{} } options := DescribeRepositoriesPaginatorOptions{} if params.MaxResults != nil { options.Limit = *params.MaxResults } for _, fn := range optFns { fn(&options) } return &DescribeRepositoriesPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.NextToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *DescribeRepositoriesPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next DescribeRepositories page. func (p *DescribeRepositoriesPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*DescribeRepositoriesOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.NextToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxResults = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.DescribeRepositories(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.NextToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // DescribeRepositoriesAPIClient is a client that implements the // DescribeRepositories operation. type DescribeRepositoriesAPIClient interface { DescribeRepositories(context.Context, *DescribeRepositoriesInput, ...func(*Options)) (*DescribeRepositoriesOutput, error) } var _ DescribeRepositoriesAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opDescribeRepositories(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DescribeRepositories", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetAuthorizationToken.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves an authorization token. An authorization token represents your IAM // authentication credentials. You can use it to access any Amazon ECR registry // that your IAM principal has access to. The authorization token is valid for 12 // hours. This API requires the ecr-public:GetAuthorizationToken and // sts:GetServiceBearerToken permissions. func (c *Client) GetAuthorizationToken(ctx context.Context, params *GetAuthorizationTokenInput, optFns ...func(*Options)) (*GetAuthorizationTokenOutput, error) { if params == nil { params = &GetAuthorizationTokenInput{} } result, metadata, err := c.invokeOperation(ctx, "GetAuthorizationToken", params, optFns, c.addOperationGetAuthorizationTokenMiddlewares) if err != nil { return nil, err } out := result.(*GetAuthorizationTokenOutput) out.ResultMetadata = metadata return out, nil } type GetAuthorizationTokenInput struct { noSmithyDocumentSerde } type GetAuthorizationTokenOutput struct { // An authorization token data object that corresponds to a public registry. AuthorizationData *types.AuthorizationData // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetAuthorizationTokenMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetAuthorizationToken{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetAuthorizationToken{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetAuthorizationToken"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetAuthorizationToken(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetAuthorizationToken(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetAuthorizationToken", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRegistryCatalogData.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves catalog metadata for a public registry. func (c *Client) GetRegistryCatalogData(ctx context.Context, params *GetRegistryCatalogDataInput, optFns ...func(*Options)) (*GetRegistryCatalogDataOutput, error) { if params == nil { params = &GetRegistryCatalogDataInput{} } result, metadata, err := c.invokeOperation(ctx, "GetRegistryCatalogData", params, optFns, c.addOperationGetRegistryCatalogDataMiddlewares) if err != nil { return nil, err } out := result.(*GetRegistryCatalogDataOutput) out.ResultMetadata = metadata return out, nil } type GetRegistryCatalogDataInput struct { noSmithyDocumentSerde } type GetRegistryCatalogDataOutput struct { // The catalog metadata for the public registry. // // This member is required. RegistryCatalogData *types.RegistryCatalogData // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetRegistryCatalogDataMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRegistryCatalogData{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRegistryCatalogData{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetRegistryCatalogData"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRegistryCatalogData(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetRegistryCatalogData(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetRegistryCatalogData", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryCatalogData.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieve catalog metadata for a repository in a public registry. This metadata // is displayed publicly in the Amazon ECR Public Gallery. func (c *Client) GetRepositoryCatalogData(ctx context.Context, params *GetRepositoryCatalogDataInput, optFns ...func(*Options)) (*GetRepositoryCatalogDataOutput, error) { if params == nil { params = &GetRepositoryCatalogDataInput{} } result, metadata, err := c.invokeOperation(ctx, "GetRepositoryCatalogData", params, optFns, c.addOperationGetRepositoryCatalogDataMiddlewares) if err != nil { return nil, err } out := result.(*GetRepositoryCatalogDataOutput) out.ResultMetadata = metadata return out, nil } type GetRepositoryCatalogDataInput struct { // The name of the repository to retrieve the catalog metadata for. // // This member is required. RepositoryName *string // The Amazon Web Services account ID that's associated with the registry that // contains the repositories to be described. If you do not specify a registry, the // default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type GetRepositoryCatalogDataOutput struct { // The catalog metadata for the repository. CatalogData *types.RepositoryCatalogData // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetRepositoryCatalogDataMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRepositoryCatalogData{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRepositoryCatalogData{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetRepositoryCatalogData"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetRepositoryCatalogDataValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryCatalogData(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetRepositoryCatalogData(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetRepositoryCatalogData", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_GetRepositoryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves the repository policy for the specified repository. func (c *Client) GetRepositoryPolicy(ctx context.Context, params *GetRepositoryPolicyInput, optFns ...func(*Options)) (*GetRepositoryPolicyOutput, error) { if params == nil { params = &GetRepositoryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "GetRepositoryPolicy", params, optFns, c.addOperationGetRepositoryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*GetRepositoryPolicyOutput) out.ResultMetadata = metadata return out, nil } type GetRepositoryPolicyInput struct { // The name of the repository with the policy to retrieve. // // This member is required. RepositoryName *string // The Amazon Web Services account ID that's associated with the public registry // that contains the repository. If you do not specify a registry, the default // public registry is assumed. RegistryId *string noSmithyDocumentSerde } type GetRepositoryPolicyOutput struct { // The repository policy text that's associated with the repository. The policy // text will be in JSON format. PolicyText *string // The registry ID that's associated with the request. RegistryId *string // The repository name that's associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpGetRepositoryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpGetRepositoryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetRepositoryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetRepositoryPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opGetRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetRepositoryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_InitiateLayerUpload.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Notifies Amazon ECR that you intend to upload an image layer. // // When an image is pushed, the InitiateLayerUpload API is called once for each // image layer that hasn't already been uploaded. Whether an image layer uploads is // determined by the BatchCheckLayerAvailability API action. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) InitiateLayerUpload(ctx context.Context, params *InitiateLayerUploadInput, optFns ...func(*Options)) (*InitiateLayerUploadOutput, error) { if params == nil { params = &InitiateLayerUploadInput{} } result, metadata, err := c.invokeOperation(ctx, "InitiateLayerUpload", params, optFns, c.addOperationInitiateLayerUploadMiddlewares) if err != nil { return nil, err } out := result.(*InitiateLayerUploadOutput) out.ResultMetadata = metadata return out, nil } type InitiateLayerUploadInput struct { // The name of the repository that you want to upload layers to. // // This member is required. RepositoryName *string // The Amazon Web Services account ID, or registry alias, that's associated with // the registry to which you intend to upload layers. If you do not specify a // registry, the default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type InitiateLayerUploadOutput struct { // The size, in bytes, that Amazon ECR expects future layer part uploads to be. PartSize *int64 // The upload ID for the layer upload. This parameter is passed to further UploadLayerPart and CompleteLayerUpload // operations. UploadId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationInitiateLayerUploadMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpInitiateLayerUpload{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpInitiateLayerUpload{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "InitiateLayerUpload"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpInitiateLayerUploadValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opInitiateLayerUpload(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opInitiateLayerUpload(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "InitiateLayerUpload", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_ListTagsForResource.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // List the tags for an Amazon ECR Public resource. func (c *Client) ListTagsForResource(ctx context.Context, params *ListTagsForResourceInput, optFns ...func(*Options)) (*ListTagsForResourceOutput, error) { if params == nil { params = &ListTagsForResourceInput{} } result, metadata, err := c.invokeOperation(ctx, "ListTagsForResource", params, optFns, c.addOperationListTagsForResourceMiddlewares) if err != nil { return nil, err } out := result.(*ListTagsForResourceOutput) out.ResultMetadata = metadata return out, nil } type ListTagsForResourceInput struct { // The Amazon Resource Name (ARN) that identifies the resource to list the tags // for. Currently, the supported resource is an Amazon ECR Public repository. // // This member is required. ResourceArn *string noSmithyDocumentSerde } type ListTagsForResourceOutput struct { // The tags for the resource. Tags []types.Tag // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListTagsForResourceMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpListTagsForResource{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpListTagsForResource{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListTagsForResource"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListTagsForResourceValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListTagsForResource(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opListTagsForResource(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListTagsForResource", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutImage.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates or updates the image manifest and tags that are associated with an // image. // // When an image is pushed and all new image layers have been uploaded, the // PutImage API is called once to create or update the image manifest and the tags // that are associated with the image. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) PutImage(ctx context.Context, params *PutImageInput, optFns ...func(*Options)) (*PutImageOutput, error) { if params == nil { params = &PutImageInput{} } result, metadata, err := c.invokeOperation(ctx, "PutImage", params, optFns, c.addOperationPutImageMiddlewares) if err != nil { return nil, err } out := result.(*PutImageOutput) out.ResultMetadata = metadata return out, nil } type PutImageInput struct { // The image manifest that corresponds to the image to be uploaded. // // This member is required. ImageManifest *string // The name of the repository where the image is put. // // This member is required. RepositoryName *string // The image digest of the image manifest that corresponds to the image. ImageDigest *string // The media type of the image manifest. If you push an image manifest that // doesn't contain the mediaType field, you must specify the imageManifestMediaType // in the request. ImageManifestMediaType *string // The tag to associate with the image. This parameter is required for images that // use the Docker Image Manifest V2 Schema 2 or Open Container Initiative (OCI) // formats. ImageTag *string // The Amazon Web Services account ID, or registry alias, that's associated with // the public registry that contains the repository where the image is put. If you // do not specify a registry, the default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type PutImageOutput struct { // Details of the image uploaded. Image *types.Image // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutImageMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutImage{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutImage{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutImage"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutImageValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutImage(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutImage(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutImage", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRegistryCatalogData.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Create or update the catalog data for a public registry. func (c *Client) PutRegistryCatalogData(ctx context.Context, params *PutRegistryCatalogDataInput, optFns ...func(*Options)) (*PutRegistryCatalogDataOutput, error) { if params == nil { params = &PutRegistryCatalogDataInput{} } result, metadata, err := c.invokeOperation(ctx, "PutRegistryCatalogData", params, optFns, c.addOperationPutRegistryCatalogDataMiddlewares) if err != nil { return nil, err } out := result.(*PutRegistryCatalogDataOutput) out.ResultMetadata = metadata return out, nil } type PutRegistryCatalogDataInput struct { // The display name for a public registry. The display name is shown as the // repository author in the Amazon ECR Public Gallery. // // The registry display name is only publicly visible in the Amazon ECR Public // Gallery for verified accounts. DisplayName *string noSmithyDocumentSerde } type PutRegistryCatalogDataOutput struct { // The catalog data for the public registry. // // This member is required. RegistryCatalogData *types.RegistryCatalogData // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutRegistryCatalogDataMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutRegistryCatalogData{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutRegistryCatalogData{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutRegistryCatalogData"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRegistryCatalogData(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutRegistryCatalogData(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutRegistryCatalogData", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_PutRepositoryCatalogData.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates or updates the catalog data for a repository in a public registry. func (c *Client) PutRepositoryCatalogData(ctx context.Context, params *PutRepositoryCatalogDataInput, optFns ...func(*Options)) (*PutRepositoryCatalogDataOutput, error) { if params == nil { params = &PutRepositoryCatalogDataInput{} } result, metadata, err := c.invokeOperation(ctx, "PutRepositoryCatalogData", params, optFns, c.addOperationPutRepositoryCatalogDataMiddlewares) if err != nil { return nil, err } out := result.(*PutRepositoryCatalogDataOutput) out.ResultMetadata = metadata return out, nil } type PutRepositoryCatalogDataInput struct { // An object containing the catalog data for a repository. This data is publicly // visible in the Amazon ECR Public Gallery. // // This member is required. CatalogData *types.RepositoryCatalogDataInput // The name of the repository to create or update the catalog data for. // // This member is required. RepositoryName *string // The Amazon Web Services account ID that's associated with the public registry // the repository is in. If you do not specify a registry, the default public // registry is assumed. RegistryId *string noSmithyDocumentSerde } type PutRepositoryCatalogDataOutput struct { // The catalog data for the repository. CatalogData *types.RepositoryCatalogData // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutRepositoryCatalogDataMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutRepositoryCatalogData{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutRepositoryCatalogData{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutRepositoryCatalogData"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutRepositoryCatalogDataValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutRepositoryCatalogData(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opPutRepositoryCatalogData(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutRepositoryCatalogData", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_SetRepositoryPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Applies a repository policy to the specified public repository to control // access permissions. For more information, see [Amazon ECR Repository Policies]in the Amazon Elastic Container // Registry User Guide. // // [Amazon ECR Repository Policies]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html func (c *Client) SetRepositoryPolicy(ctx context.Context, params *SetRepositoryPolicyInput, optFns ...func(*Options)) (*SetRepositoryPolicyOutput, error) { if params == nil { params = &SetRepositoryPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "SetRepositoryPolicy", params, optFns, c.addOperationSetRepositoryPolicyMiddlewares) if err != nil { return nil, err } out := result.(*SetRepositoryPolicyOutput) out.ResultMetadata = metadata return out, nil } type SetRepositoryPolicyInput struct { // The JSON repository policy text to apply to the repository. For more // information, see [Amazon ECR Repository Policies]in the Amazon Elastic Container Registry User Guide. // // [Amazon ECR Repository Policies]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html // // This member is required. PolicyText *string // The name of the repository to receive the policy. // // This member is required. RepositoryName *string // If the policy that you want to set on a repository policy would prevent you // from setting another policy in the future, you must force the SetRepositoryPolicyoperation. This // prevents accidental repository lockouts. Force bool // The Amazon Web Services account ID that's associated with the registry that // contains the repository. If you do not specify a registry, the default public // registry is assumed. RegistryId *string noSmithyDocumentSerde } type SetRepositoryPolicyOutput struct { // The JSON repository policy text that's applied to the repository. PolicyText *string // The registry ID that's associated with the request. RegistryId *string // The repository name that's associated with the request. RepositoryName *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationSetRepositoryPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpSetRepositoryPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpSetRepositoryPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "SetRepositoryPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpSetRepositoryPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opSetRepositoryPolicy(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opSetRepositoryPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "SetRepositoryPolicy", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_TagResource.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Associates the specified tags to a resource with the specified resourceArn . If // existing tags on a resource aren't specified in the request parameters, they // aren't changed. When a resource is deleted, the tags associated with that // resource are also deleted. func (c *Client) TagResource(ctx context.Context, params *TagResourceInput, optFns ...func(*Options)) (*TagResourceOutput, error) { if params == nil { params = &TagResourceInput{} } result, metadata, err := c.invokeOperation(ctx, "TagResource", params, optFns, c.addOperationTagResourceMiddlewares) if err != nil { return nil, err } out := result.(*TagResourceOutput) out.ResultMetadata = metadata return out, nil } type TagResourceInput struct { // The Amazon Resource Name (ARN) of the resource to add tags to. Currently, the // supported resource is an Amazon ECR Public repository. // // This member is required. ResourceArn *string // The tags to add to the resource. A tag is an array of key-value pairs. Tag keys // can have a maximum character length of 128 characters, and tag values can have a // maximum length of 256 characters. // // This member is required. Tags []types.Tag noSmithyDocumentSerde } type TagResourceOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpTagResource{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpTagResource{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "TagResource"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpTagResourceValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opTagResource(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opTagResource(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "TagResource", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UntagResource.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes specified tags from a resource. func (c *Client) UntagResource(ctx context.Context, params *UntagResourceInput, optFns ...func(*Options)) (*UntagResourceOutput, error) { if params == nil { params = &UntagResourceInput{} } result, metadata, err := c.invokeOperation(ctx, "UntagResource", params, optFns, c.addOperationUntagResourceMiddlewares) if err != nil { return nil, err } out := result.(*UntagResourceOutput) out.ResultMetadata = metadata return out, nil } type UntagResourceInput struct { // The Amazon Resource Name (ARN) of the resource to delete tags from. Currently, // the supported resource is an Amazon ECR Public repository. // // This member is required. ResourceArn *string // The keys of the tags to be removed. // // This member is required. TagKeys []string noSmithyDocumentSerde } type UntagResourceOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationUntagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpUntagResource{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUntagResource{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "UntagResource"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpUntagResourceValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUntagResource(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opUntagResource(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "UntagResource", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/api_op_UploadLayerPart.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Uploads an image layer part to Amazon ECR. // // When an image is pushed, each new image layer is uploaded in parts. The maximum // size of each image layer part can be 20971520 bytes (about 20MB). The // UploadLayerPart API is called once for each new image layer part. // // This operation is used by the Amazon ECR proxy and is not generally used by // customers for pulling and pushing images. In most cases, you should use the // docker CLI to pull, tag, and push images. func (c *Client) UploadLayerPart(ctx context.Context, params *UploadLayerPartInput, optFns ...func(*Options)) (*UploadLayerPartOutput, error) { if params == nil { params = &UploadLayerPartInput{} } result, metadata, err := c.invokeOperation(ctx, "UploadLayerPart", params, optFns, c.addOperationUploadLayerPartMiddlewares) if err != nil { return nil, err } out := result.(*UploadLayerPartOutput) out.ResultMetadata = metadata return out, nil } type UploadLayerPartInput struct { // The base64-encoded layer part payload. // // This member is required. LayerPartBlob []byte // The position of the first byte of the layer part witin the overall image layer. // // This member is required. PartFirstByte *int64 // The position of the last byte of the layer part within the overall image layer. // // This member is required. PartLastByte *int64 // The name of the repository that you're uploading layer parts to. // // This member is required. RepositoryName *string // The upload ID from a previous InitiateLayerUpload operation to associate with the layer part // upload. // // This member is required. UploadId *string // The Amazon Web Services account ID, or registry alias, that's associated with // the registry that you're uploading layer parts to. If you do not specify a // registry, the default public registry is assumed. RegistryId *string noSmithyDocumentSerde } type UploadLayerPartOutput struct { // The integer value of the last byte that's received in the request. LastByteReceived *int64 // The registry ID that's associated with the request. RegistryId *string // The repository name that's associated with the request. RepositoryName *string // The upload ID that's associated with the request. UploadId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationUploadLayerPartMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsAwsjson11_serializeOpUploadLayerPart{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUploadLayerPart{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "UploadLayerPart"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpUploadLayerPartValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadLayerPart(options.Region), middleware.Before); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRequestIDRetrieverMiddleware(stack); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func newServiceMetadataMiddleware_opUploadLayerPart(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "UploadLayerPart", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/auth.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" smithy "github.com/aws/smithy-go" smithyauth "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" ) func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) { params.Region = options.Region } type setLegacyContextSigningOptionsMiddleware struct { } func (*setLegacyContextSigningOptionsMiddleware) ID() string { return "setLegacyContextSigningOptions" } func (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { rscheme := getResolvedAuthScheme(ctx) schemeID := rscheme.Scheme.SchemeID() if sn := awsmiddleware.GetSigningName(ctx); sn != "" { if schemeID == "aws.auth#sigv4" { smithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn) } else if schemeID == "aws.auth#sigv4a" { smithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn) } } if sr := awsmiddleware.GetSigningRegion(ctx); sr != "" { if schemeID == "aws.auth#sigv4" { smithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr) } else if schemeID == "aws.auth#sigv4a" { smithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr}) } } return next.HandleFinalize(ctx, in) } func addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error { return stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, "Signing", middleware.Before) } type withAnonymous struct { resolver AuthSchemeResolver } var _ AuthSchemeResolver = (*withAnonymous)(nil) func (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) { opts, err := v.resolver.ResolveAuthSchemes(ctx, params) if err != nil { return nil, err } opts = append(opts, &smithyauth.Option{ SchemeID: smithyauth.SchemeIDAnonymous, }) return opts, nil } func wrapWithAnonymousAuth(options *Options) { if _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok { return } options.AuthSchemeResolver = &withAnonymous{ resolver: options.AuthSchemeResolver, } } // AuthResolverParameters contains the set of inputs necessary for auth scheme // resolution. type AuthResolverParameters struct { // The name of the operation being invoked. Operation string // The region in which the operation is being invoked. Region string } func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters { params := &AuthResolverParameters{ Operation: operation, } bindAuthParamsRegion(ctx, params, input, options) return params } // AuthSchemeResolver returns a set of possible authentication options for an // operation. type AuthSchemeResolver interface { ResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error) } type defaultAuthSchemeResolver struct{} var _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil) func (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) { if overrides, ok := operationAuthOptions[params.Operation]; ok { return overrides(params), nil } return serviceAuthOptions(params), nil } var operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{} func serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option { return []*smithyauth.Option{ { SchemeID: smithyauth.SchemeIDSigV4, SignerProperties: func() smithy.Properties { var props smithy.Properties smithyhttp.SetSigV4SigningName(&props, "ecr-public") smithyhttp.SetSigV4SigningRegion(&props, params.Region) return props }(), }, } } type resolveAuthSchemeMiddleware struct { operation string options Options } func (*resolveAuthSchemeMiddleware) ID() string { return "ResolveAuthScheme" } func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "ResolveAuthScheme") defer span.End() params := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params) if err != nil { return out, metadata, fmt.Errorf("resolve auth scheme: %w", err) } scheme, ok := m.selectScheme(options) if !ok { return out, metadata, fmt.Errorf("could not select an auth scheme") } ctx = setResolvedAuthScheme(ctx, scheme) span.SetProperty("auth.scheme_id", scheme.Scheme.SchemeID()) span.End() return next.HandleFinalize(ctx, in) } func (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) { for _, option := range options { if option.SchemeID == smithyauth.SchemeIDAnonymous { return newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true } for _, scheme := range m.options.AuthSchemes { if scheme.SchemeID() != option.SchemeID { continue } if scheme.IdentityResolver(m.options) != nil { return newResolvedAuthScheme(scheme, option), true } } } return nil, false } type resolvedAuthSchemeKey struct{} type resolvedAuthScheme struct { Scheme smithyhttp.AuthScheme IdentityProperties smithy.Properties SignerProperties smithy.Properties } func newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme { return &resolvedAuthScheme{ Scheme: scheme, IdentityProperties: option.IdentityProperties, SignerProperties: option.SignerProperties, } } func setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context { return middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme) } func getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme { v, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme) return v } type getIdentityMiddleware struct { options Options } func (*getIdentityMiddleware) ID() string { return "GetIdentity" } func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { innerCtx, span := tracing.StartSpan(ctx, "GetIdentity") defer span.End() rscheme := getResolvedAuthScheme(innerCtx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } resolver := rscheme.Scheme.IdentityResolver(m.options) if resolver == nil { return out, metadata, fmt.Errorf("no identity resolver") } identity, err := timeOperationMetric(ctx, "client.call.resolve_identity_duration", func() (smithyauth.Identity, error) { return resolver.GetIdentity(innerCtx, rscheme.IdentityProperties) }, func(o *metrics.RecordMetricOptions) { o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID()) }) if err != nil { return out, metadata, fmt.Errorf("get identity: %w", err) } ctx = setIdentity(ctx, identity) span.End() return next.HandleFinalize(ctx, in) } type identityKey struct{} func setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context { return middleware.WithStackValue(ctx, identityKey{}, identity) } func getIdentity(ctx context.Context) smithyauth.Identity { v, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity) return v } type signRequestMiddleware struct { options Options } func (*signRequestMiddleware) ID() string { return "Signing" } func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "SignRequest") defer span.End() req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unexpected transport type %T", in.Request) } rscheme := getResolvedAuthScheme(ctx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } identity := getIdentity(ctx) if identity == nil { return out, metadata, fmt.Errorf("no identity") } signer := rscheme.Scheme.Signer() if signer == nil { return out, metadata, fmt.Errorf("no signer") } _, err = timeOperationMetric(ctx, "client.call.signing_duration", func() (any, error) { return nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties) }, func(o *metrics.RecordMetricOptions) { o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID()) }) if err != nil { return out, metadata, fmt.Errorf("sign request: %w", err) } span.End() return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/deserializers.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "bytes" "context" "encoding/json" "fmt" "github.com/aws/aws-sdk-go-v2/aws/protocol/restjson" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" smithy "github.com/aws/smithy-go" smithyio "github.com/aws/smithy-go/io" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithytime "github.com/aws/smithy-go/time" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "io" "strings" "time" ) func deserializeS3Expires(v string) (*time.Time, error) { t, err := smithytime.ParseHTTPDate(v) if err != nil { return nil, nil } return &t, nil } type awsAwsjson11_deserializeOpBatchCheckLayerAvailability struct { } func (*awsAwsjson11_deserializeOpBatchCheckLayerAvailability) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpBatchCheckLayerAvailability) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response, &metadata) } output := &BatchCheckLayerAvailabilityOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentBatchCheckLayerAvailabilityOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorBatchCheckLayerAvailability(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RegistryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpBatchDeleteImage struct { } func (*awsAwsjson11_deserializeOpBatchDeleteImage) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpBatchDeleteImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorBatchDeleteImage(response, &metadata) } output := &BatchDeleteImageOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentBatchDeleteImageOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorBatchDeleteImage(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpCompleteLayerUpload struct { } func (*awsAwsjson11_deserializeOpCompleteLayerUpload) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpCompleteLayerUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response, &metadata) } output := &CompleteLayerUploadOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentCompleteLayerUploadOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorCompleteLayerUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("EmptyUploadException", errorCode): return awsAwsjson11_deserializeErrorEmptyUploadException(response, errorBody) case strings.EqualFold("InvalidLayerException", errorCode): return awsAwsjson11_deserializeErrorInvalidLayerException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LayerAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorLayerAlreadyExistsException(response, errorBody) case strings.EqualFold("LayerPartTooSmallException", errorCode): return awsAwsjson11_deserializeErrorLayerPartTooSmallException(response, errorBody) case strings.EqualFold("RegistryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) case strings.EqualFold("UploadNotFoundException", errorCode): return awsAwsjson11_deserializeErrorUploadNotFoundException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpCreateRepository struct { } func (*awsAwsjson11_deserializeOpCreateRepository) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpCreateRepository) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorCreateRepository(response, &metadata) } output := &CreateRepositoryOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentCreateRepositoryOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorCreateRepository(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("InvalidTagParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("RepositoryAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorRepositoryAlreadyExistsException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TooManyTagsException", errorCode): return awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDeleteRepository struct { } func (*awsAwsjson11_deserializeOpDeleteRepository) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDeleteRepository) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepository(response, &metadata) } output := &DeleteRepositoryOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDeleteRepositoryOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDeleteRepository(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotEmptyException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotEmptyException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDeleteRepositoryPolicy struct { } func (*awsAwsjson11_deserializeOpDeleteRepositoryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDeleteRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response, &metadata) } output := &DeleteRepositoryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDeleteRepositoryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDeleteRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryPolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeImages struct { } func (*awsAwsjson11_deserializeOpDescribeImages) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeImages) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeImages(response, &metadata) } output := &DescribeImagesOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeImagesOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeImages(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("ImageNotFoundException", errorCode): return awsAwsjson11_deserializeErrorImageNotFoundException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeImageTags struct { } func (*awsAwsjson11_deserializeOpDescribeImageTags) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeImageTags) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeImageTags(response, &metadata) } output := &DescribeImageTagsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeImageTagsOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeImageTags(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeRegistries struct { } func (*awsAwsjson11_deserializeOpDescribeRegistries) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeRegistries) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeRegistries(response, &metadata) } output := &DescribeRegistriesOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeRegistriesOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeRegistries(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpDescribeRepositories struct { } func (*awsAwsjson11_deserializeOpDescribeRepositories) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpDescribeRepositories) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorDescribeRepositories(response, &metadata) } output := &DescribeRepositoriesOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentDescribeRepositoriesOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorDescribeRepositories(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetAuthorizationToken struct { } func (*awsAwsjson11_deserializeOpGetAuthorizationToken) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetAuthorizationToken) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response, &metadata) } output := &GetAuthorizationTokenOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetAuthorizationTokenOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetAuthorizationToken(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetRegistryCatalogData struct { } func (*awsAwsjson11_deserializeOpGetRegistryCatalogData) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetRegistryCatalogData) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetRegistryCatalogData(response, &metadata) } output := &GetRegistryCatalogDataOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetRegistryCatalogDataOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetRegistryCatalogData(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetRepositoryCatalogData struct { } func (*awsAwsjson11_deserializeOpGetRepositoryCatalogData) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetRepositoryCatalogData) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetRepositoryCatalogData(response, &metadata) } output := &GetRepositoryCatalogDataOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetRepositoryCatalogDataOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetRepositoryCatalogData(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryCatalogDataNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryCatalogDataNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpGetRepositoryPolicy struct { } func (*awsAwsjson11_deserializeOpGetRepositoryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpGetRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response, &metadata) } output := &GetRepositoryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentGetRepositoryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorGetRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryPolicyNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpInitiateLayerUpload struct { } func (*awsAwsjson11_deserializeOpInitiateLayerUpload) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpInitiateLayerUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response, &metadata) } output := &InitiateLayerUploadOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentInitiateLayerUploadOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorInitiateLayerUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RegistryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpListTagsForResource struct { } func (*awsAwsjson11_deserializeOpListTagsForResource) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpListTagsForResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorListTagsForResource(response, &metadata) } output := &ListTagsForResourceOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentListTagsForResourceOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorListTagsForResource(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutImage struct { } func (*awsAwsjson11_deserializeOpPutImage) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutImage) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutImage(response, &metadata) } output := &PutImageOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutImageOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutImage(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("ImageAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorImageAlreadyExistsException(response, errorBody) case strings.EqualFold("ImageDigestDoesNotMatchException", errorCode): return awsAwsjson11_deserializeErrorImageDigestDoesNotMatchException(response, errorBody) case strings.EqualFold("ImageTagAlreadyExistsException", errorCode): return awsAwsjson11_deserializeErrorImageTagAlreadyExistsException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LayersNotFoundException", errorCode): return awsAwsjson11_deserializeErrorLayersNotFoundException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("ReferencedImagesNotFoundException", errorCode): return awsAwsjson11_deserializeErrorReferencedImagesNotFoundException(response, errorBody) case strings.EqualFold("RegistryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutRegistryCatalogData struct { } func (*awsAwsjson11_deserializeOpPutRegistryCatalogData) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutRegistryCatalogData) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutRegistryCatalogData(response, &metadata) } output := &PutRegistryCatalogDataOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutRegistryCatalogDataOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutRegistryCatalogData(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpPutRepositoryCatalogData struct { } func (*awsAwsjson11_deserializeOpPutRepositoryCatalogData) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpPutRepositoryCatalogData) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorPutRepositoryCatalogData(response, &metadata) } output := &PutRepositoryCatalogDataOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentPutRepositoryCatalogDataOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorPutRepositoryCatalogData(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpSetRepositoryPolicy struct { } func (*awsAwsjson11_deserializeOpSetRepositoryPolicy) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpSetRepositoryPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response, &metadata) } output := &SetRepositoryPolicyOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentSetRepositoryPolicyOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorSetRepositoryPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpTagResource struct { } func (*awsAwsjson11_deserializeOpTagResource) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpTagResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorTagResource(response, &metadata) } output := &TagResourceOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentTagResourceOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorTagResource(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("InvalidTagParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TooManyTagsException", errorCode): return awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpUntagResource struct { } func (*awsAwsjson11_deserializeOpUntagResource) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpUntagResource) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorUntagResource(response, &metadata) } output := &UntagResourceOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentUntagResourceOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorUntagResource(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("InvalidTagParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidTagParameterException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("TooManyTagsException", errorCode): return awsAwsjson11_deserializeErrorTooManyTagsException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsAwsjson11_deserializeOpUploadLayerPart struct { } func (*awsAwsjson11_deserializeOpUploadLayerPart) ID() string { return "OperationDeserializer" } func (m *awsAwsjson11_deserializeOpUploadLayerPart) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsAwsjson11_deserializeOpErrorUploadLayerPart(response, &metadata) } output := &UploadLayerPartOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } err = awsAwsjson11_deserializeOpDocumentUploadLayerPartOutput(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return out, metadata, err } return out, metadata, err } func awsAwsjson11_deserializeOpErrorUploadLayerPart(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode headerCode := response.Header.Get("X-Amzn-ErrorType") var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() bodyInfo, err := getProtocolErrorInfo(decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) if typ, ok := resolveProtocolErrorType(headerCode, bodyInfo); ok { errorCode = restjson.SanitizeErrorCode(typ) } if len(bodyInfo.Message) != 0 { errorMessage = bodyInfo.Message } switch { case strings.EqualFold("InvalidLayerPartException", errorCode): return awsAwsjson11_deserializeErrorInvalidLayerPartException(response, errorBody) case strings.EqualFold("InvalidParameterException", errorCode): return awsAwsjson11_deserializeErrorInvalidParameterException(response, errorBody) case strings.EqualFold("LimitExceededException", errorCode): return awsAwsjson11_deserializeErrorLimitExceededException(response, errorBody) case strings.EqualFold("RegistryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRegistryNotFoundException(response, errorBody) case strings.EqualFold("RepositoryNotFoundException", errorCode): return awsAwsjson11_deserializeErrorRepositoryNotFoundException(response, errorBody) case strings.EqualFold("ServerException", errorCode): return awsAwsjson11_deserializeErrorServerException(response, errorBody) case strings.EqualFold("UnsupportedCommandException", errorCode): return awsAwsjson11_deserializeErrorUnsupportedCommandException(response, errorBody) case strings.EqualFold("UploadNotFoundException", errorCode): return awsAwsjson11_deserializeErrorUploadNotFoundException(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsAwsjson11_deserializeErrorEmptyUploadException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.EmptyUploadException{} err := awsAwsjson11_deserializeDocumentEmptyUploadException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorImageAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ImageAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentImageAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorImageDigestDoesNotMatchException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ImageDigestDoesNotMatchException{} err := awsAwsjson11_deserializeDocumentImageDigestDoesNotMatchException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorImageNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ImageNotFoundException{} err := awsAwsjson11_deserializeDocumentImageNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorImageTagAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ImageTagAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentImageTagAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorInvalidLayerException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.InvalidLayerException{} err := awsAwsjson11_deserializeDocumentInvalidLayerException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorInvalidLayerPartException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.InvalidLayerPartException{} err := awsAwsjson11_deserializeDocumentInvalidLayerPartException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorInvalidParameterException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.InvalidParameterException{} err := awsAwsjson11_deserializeDocumentInvalidParameterException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorInvalidTagParameterException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.InvalidTagParameterException{} err := awsAwsjson11_deserializeDocumentInvalidTagParameterException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLayerAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LayerAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentLayerAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLayerPartTooSmallException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LayerPartTooSmallException{} err := awsAwsjson11_deserializeDocumentLayerPartTooSmallException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLayersNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LayersNotFoundException{} err := awsAwsjson11_deserializeDocumentLayersNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorLimitExceededException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.LimitExceededException{} err := awsAwsjson11_deserializeDocumentLimitExceededException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorReferencedImagesNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ReferencedImagesNotFoundException{} err := awsAwsjson11_deserializeDocumentReferencedImagesNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRegistryNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RegistryNotFoundException{} err := awsAwsjson11_deserializeDocumentRegistryNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryAlreadyExistsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryAlreadyExistsException{} err := awsAwsjson11_deserializeDocumentRepositoryAlreadyExistsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryCatalogDataNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryCatalogDataNotFoundException{} err := awsAwsjson11_deserializeDocumentRepositoryCatalogDataNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryNotEmptyException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryNotEmptyException{} err := awsAwsjson11_deserializeDocumentRepositoryNotEmptyException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryNotFoundException{} err := awsAwsjson11_deserializeDocumentRepositoryNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorRepositoryPolicyNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.RepositoryPolicyNotFoundException{} err := awsAwsjson11_deserializeDocumentRepositoryPolicyNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorServerException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.ServerException{} err := awsAwsjson11_deserializeDocumentServerException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorTooManyTagsException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.TooManyTagsException{} err := awsAwsjson11_deserializeDocumentTooManyTagsException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUnsupportedCommandException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UnsupportedCommandException{} err := awsAwsjson11_deserializeDocumentUnsupportedCommandException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeErrorUploadNotFoundException(response *smithyhttp.Response, errorBody *bytes.Reader) error { var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() var shape interface{} if err := decoder.Decode(&shape); err != nil && err != io.EOF { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } output := &types.UploadNotFoundException{} err := awsAwsjson11_deserializeDocumentUploadNotFoundException(&output, shape) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) err = &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } return err } errorBody.Seek(0, io.SeekStart) return output } func awsAwsjson11_deserializeDocumentArchitectureList(v *[]string, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []string if *v == nil { cv = []string{} } else { cv = *v } for _, value := range shape { var col string if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Architecture to be of type string, got %T instead", value) } col = jtv } cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentAuthorizationData(v **types.AuthorizationData, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.AuthorizationData if *v == nil { sv = &types.AuthorizationData{} } else { sv = *v } for key, value := range shape { switch key { case "authorizationToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Base64 to be of type string, got %T instead", value) } sv.AuthorizationToken = ptr.String(jtv) } case "expiresAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.ExpiresAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected ExpirationTimestamp to be a JSON Number, got %T instead", value) } } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentEmptyUploadException(v **types.EmptyUploadException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.EmptyUploadException if *v == nil { sv = &types.EmptyUploadException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImage(v **types.Image, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Image if *v == nil { sv = &types.Image{} } else { sv = *v } for key, value := range shape { switch key { case "imageId": if err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil { return err } case "imageManifest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageManifest to be of type string, got %T instead", value) } sv.ImageManifest = ptr.String(jtv) } case "imageManifestMediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.ImageManifestMediaType = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryIdOrAlias to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageAlreadyExistsException(v **types.ImageAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageAlreadyExistsException if *v == nil { sv = &types.ImageAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageDetail(v **types.ImageDetail, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageDetail if *v == nil { sv = &types.ImageDetail{} } else { sv = *v } for key, value := range shape { switch key { case "artifactMediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.ArtifactMediaType = ptr.String(jtv) } case "imageDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageDigest to be of type string, got %T instead", value) } sv.ImageDigest = ptr.String(jtv) } case "imageManifestMediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.ImageManifestMediaType = ptr.String(jtv) } case "imagePushedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.ImagePushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected PushTimestamp to be a JSON Number, got %T instead", value) } } case "imageSizeInBytes": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected ImageSizeInBytes to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.ImageSizeInBytes = ptr.Int64(i64) } case "imageTags": if err := awsAwsjson11_deserializeDocumentImageTagList(&sv.ImageTags, value); err != nil { return err } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageDetailList(v *[]types.ImageDetail, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageDetail if *v == nil { cv = []types.ImageDetail{} } else { cv = *v } for _, value := range shape { var col types.ImageDetail destAddr := &col if err := awsAwsjson11_deserializeDocumentImageDetail(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageDigestDoesNotMatchException(v **types.ImageDigestDoesNotMatchException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageDigestDoesNotMatchException if *v == nil { sv = &types.ImageDigestDoesNotMatchException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageFailure(v **types.ImageFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageFailure if *v == nil { sv = &types.ImageFailure{} } else { sv = *v } for key, value := range shape { switch key { case "failureCode": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageFailureCode to be of type string, got %T instead", value) } sv.FailureCode = types.ImageFailureCode(jtv) } case "failureReason": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageFailureReason to be of type string, got %T instead", value) } sv.FailureReason = ptr.String(jtv) } case "imageId": if err := awsAwsjson11_deserializeDocumentImageIdentifier(&sv.ImageId, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageFailureList(v *[]types.ImageFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageFailure if *v == nil { cv = []types.ImageFailure{} } else { cv = *v } for _, value := range shape { var col types.ImageFailure destAddr := &col if err := awsAwsjson11_deserializeDocumentImageFailure(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageIdentifier(v **types.ImageIdentifier, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageIdentifier if *v == nil { sv = &types.ImageIdentifier{} } else { sv = *v } for key, value := range shape { switch key { case "imageDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageDigest to be of type string, got %T instead", value) } sv.ImageDigest = ptr.String(jtv) } case "imageTag": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTag to be of type string, got %T instead", value) } sv.ImageTag = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageIdentifierList(v *[]types.ImageIdentifier, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageIdentifier if *v == nil { cv = []types.ImageIdentifier{} } else { cv = *v } for _, value := range shape { var col types.ImageIdentifier destAddr := &col if err := awsAwsjson11_deserializeDocumentImageIdentifier(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageNotFoundException(v **types.ImageNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageNotFoundException if *v == nil { sv = &types.ImageNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageTagAlreadyExistsException(v **types.ImageTagAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageTagAlreadyExistsException if *v == nil { sv = &types.ImageTagAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageTagDetail(v **types.ImageTagDetail, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ImageTagDetail if *v == nil { sv = &types.ImageTagDetail{} } else { sv = *v } for key, value := range shape { switch key { case "createdAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected CreationTimestamp to be a JSON Number, got %T instead", value) } } case "imageDetail": if err := awsAwsjson11_deserializeDocumentReferencedImageDetail(&sv.ImageDetail, value); err != nil { return err } case "imageTag": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTag to be of type string, got %T instead", value) } sv.ImageTag = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentImageTagDetailList(v *[]types.ImageTagDetail, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.ImageTagDetail if *v == nil { cv = []types.ImageTagDetail{} } else { cv = *v } for _, value := range shape { var col types.ImageTagDetail destAddr := &col if err := awsAwsjson11_deserializeDocumentImageTagDetail(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentImageTagList(v *[]string, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []string if *v == nil { cv = []string{} } else { cv = *v } for _, value := range shape { var col string if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageTag to be of type string, got %T instead", value) } col = jtv } cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentInvalidLayerException(v **types.InvalidLayerException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.InvalidLayerException if *v == nil { sv = &types.InvalidLayerException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentInvalidLayerPartException(v **types.InvalidLayerPartException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.InvalidLayerPartException if *v == nil { sv = &types.InvalidLayerPartException{} } else { sv = *v } for key, value := range shape { switch key { case "lastValidByteReceived": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected PartSize to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.LastValidByteReceived = ptr.Int64(i64) } case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "uploadId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UploadId to be of type string, got %T instead", value) } sv.UploadId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentInvalidParameterException(v **types.InvalidParameterException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.InvalidParameterException if *v == nil { sv = &types.InvalidParameterException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentInvalidTagParameterException(v **types.InvalidTagParameterException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.InvalidTagParameterException if *v == nil { sv = &types.InvalidTagParameterException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayer(v **types.Layer, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Layer if *v == nil { sv = &types.Layer{} } else { sv = *v } for key, value := range shape { switch key { case "layerAvailability": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerAvailability to be of type string, got %T instead", value) } sv.LayerAvailability = types.LayerAvailability(jtv) } case "layerDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerDigest to be of type string, got %T instead", value) } sv.LayerDigest = ptr.String(jtv) } case "layerSize": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected LayerSizeInBytes to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.LayerSize = ptr.Int64(i64) } case "mediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.MediaType = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayerAlreadyExistsException(v **types.LayerAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayerAlreadyExistsException if *v == nil { sv = &types.LayerAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayerFailure(v **types.LayerFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayerFailure if *v == nil { sv = &types.LayerFailure{} } else { sv = *v } for key, value := range shape { switch key { case "failureCode": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerFailureCode to be of type string, got %T instead", value) } sv.FailureCode = types.LayerFailureCode(jtv) } case "failureReason": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerFailureReason to be of type string, got %T instead", value) } sv.FailureReason = ptr.String(jtv) } case "layerDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected BatchedOperationLayerDigest to be of type string, got %T instead", value) } sv.LayerDigest = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayerFailureList(v *[]types.LayerFailure, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.LayerFailure if *v == nil { cv = []types.LayerFailure{} } else { cv = *v } for _, value := range shape { var col types.LayerFailure destAddr := &col if err := awsAwsjson11_deserializeDocumentLayerFailure(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentLayerList(v *[]types.Layer, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Layer if *v == nil { cv = []types.Layer{} } else { cv = *v } for _, value := range shape { var col types.Layer destAddr := &col if err := awsAwsjson11_deserializeDocumentLayer(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentLayerPartTooSmallException(v **types.LayerPartTooSmallException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayerPartTooSmallException if *v == nil { sv = &types.LayerPartTooSmallException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLayersNotFoundException(v **types.LayersNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LayersNotFoundException if *v == nil { sv = &types.LayersNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentLimitExceededException(v **types.LimitExceededException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.LimitExceededException if *v == nil { sv = &types.LimitExceededException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentOperatingSystemList(v *[]string, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []string if *v == nil { cv = []string{} } else { cv = *v } for _, value := range shape { var col string if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected OperatingSystem to be of type string, got %T instead", value) } col = jtv } cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentReferencedImageDetail(v **types.ReferencedImageDetail, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ReferencedImageDetail if *v == nil { sv = &types.ReferencedImageDetail{} } else { sv = *v } for key, value := range shape { switch key { case "artifactMediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.ArtifactMediaType = ptr.String(jtv) } case "imageDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ImageDigest to be of type string, got %T instead", value) } sv.ImageDigest = ptr.String(jtv) } case "imageManifestMediaType": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected MediaType to be of type string, got %T instead", value) } sv.ImageManifestMediaType = ptr.String(jtv) } case "imagePushedAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.ImagePushedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected PushTimestamp to be a JSON Number, got %T instead", value) } } case "imageSizeInBytes": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected ImageSizeInBytes to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.ImageSizeInBytes = ptr.Int64(i64) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentReferencedImagesNotFoundException(v **types.ReferencedImagesNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ReferencedImagesNotFoundException if *v == nil { sv = &types.ReferencedImagesNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRegistry(v **types.Registry, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Registry if *v == nil { sv = &types.Registry{} } else { sv = *v } for key, value := range shape { switch key { case "aliases": if err := awsAwsjson11_deserializeDocumentRegistryAliasList(&sv.Aliases, value); err != nil { return err } case "registryArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Arn to be of type string, got %T instead", value) } sv.RegistryArn = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "registryUri": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.RegistryUri = ptr.String(jtv) } case "verified": if value != nil { jtv, ok := value.(bool) if !ok { return fmt.Errorf("expected RegistryVerified to be of type *bool, got %T instead", value) } sv.Verified = ptr.Bool(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRegistryAlias(v **types.RegistryAlias, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RegistryAlias if *v == nil { sv = &types.RegistryAlias{} } else { sv = *v } for key, value := range shape { switch key { case "defaultRegistryAlias": if value != nil { jtv, ok := value.(bool) if !ok { return fmt.Errorf("expected DefaultRegistryAliasFlag to be of type *bool, got %T instead", value) } sv.DefaultRegistryAlias = jtv } case "name": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryAliasName to be of type string, got %T instead", value) } sv.Name = ptr.String(jtv) } case "primaryRegistryAlias": if value != nil { jtv, ok := value.(bool) if !ok { return fmt.Errorf("expected PrimaryRegistryAliasFlag to be of type *bool, got %T instead", value) } sv.PrimaryRegistryAlias = jtv } case "status": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryAliasStatus to be of type string, got %T instead", value) } sv.Status = types.RegistryAliasStatus(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRegistryAliasList(v *[]types.RegistryAlias, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.RegistryAlias if *v == nil { cv = []types.RegistryAlias{} } else { cv = *v } for _, value := range shape { var col types.RegistryAlias destAddr := &col if err := awsAwsjson11_deserializeDocumentRegistryAlias(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRegistryCatalogData(v **types.RegistryCatalogData, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RegistryCatalogData if *v == nil { sv = &types.RegistryCatalogData{} } else { sv = *v } for key, value := range shape { switch key { case "displayName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryDisplayName to be of type string, got %T instead", value) } sv.DisplayName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRegistryList(v *[]types.Registry, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Registry if *v == nil { cv = []types.Registry{} } else { cv = *v } for _, value := range shape { var col types.Registry destAddr := &col if err := awsAwsjson11_deserializeDocumentRegistry(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRegistryNotFoundException(v **types.RegistryNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RegistryNotFoundException if *v == nil { sv = &types.RegistryNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepository(v **types.Repository, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Repository if *v == nil { sv = &types.Repository{} } else { sv = *v } for key, value := range shape { switch key { case "createdAt": if value != nil { switch jtv := value.(type) { case json.Number: f64, err := jtv.Float64() if err != nil { return err } sv.CreatedAt = ptr.Time(smithytime.ParseEpochSeconds(f64)) default: return fmt.Errorf("expected CreationTimestamp to be a JSON Number, got %T instead", value) } } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryArn": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Arn to be of type string, got %T instead", value) } sv.RepositoryArn = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "repositoryUri": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected Url to be of type string, got %T instead", value) } sv.RepositoryUri = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryAlreadyExistsException(v **types.RepositoryAlreadyExistsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryAlreadyExistsException if *v == nil { sv = &types.RepositoryAlreadyExistsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryCatalogData(v **types.RepositoryCatalogData, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryCatalogData if *v == nil { sv = &types.RepositoryCatalogData{} } else { sv = *v } for key, value := range shape { switch key { case "aboutText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected AboutText to be of type string, got %T instead", value) } sv.AboutText = ptr.String(jtv) } case "architectures": if err := awsAwsjson11_deserializeDocumentArchitectureList(&sv.Architectures, value); err != nil { return err } case "description": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryDescription to be of type string, got %T instead", value) } sv.Description = ptr.String(jtv) } case "logoUrl": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ResourceUrl to be of type string, got %T instead", value) } sv.LogoUrl = ptr.String(jtv) } case "marketplaceCertified": if value != nil { jtv, ok := value.(bool) if !ok { return fmt.Errorf("expected MarketplaceCertified to be of type *bool, got %T instead", value) } sv.MarketplaceCertified = ptr.Bool(jtv) } case "operatingSystems": if err := awsAwsjson11_deserializeDocumentOperatingSystemList(&sv.OperatingSystems, value); err != nil { return err } case "usageText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UsageText to be of type string, got %T instead", value) } sv.UsageText = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryCatalogDataNotFoundException(v **types.RepositoryCatalogDataNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryCatalogDataNotFoundException if *v == nil { sv = &types.RepositoryCatalogDataNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryList(v *[]types.Repository, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Repository if *v == nil { cv = []types.Repository{} } else { cv = *v } for _, value := range shape { var col types.Repository destAddr := &col if err := awsAwsjson11_deserializeDocumentRepository(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentRepositoryNotEmptyException(v **types.RepositoryNotEmptyException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryNotEmptyException if *v == nil { sv = &types.RepositoryNotEmptyException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryNotFoundException(v **types.RepositoryNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryNotFoundException if *v == nil { sv = &types.RepositoryNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentRepositoryPolicyNotFoundException(v **types.RepositoryPolicyNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.RepositoryPolicyNotFoundException if *v == nil { sv = &types.RepositoryPolicyNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentServerException(v **types.ServerException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.ServerException if *v == nil { sv = &types.ServerException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentTag(v **types.Tag, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.Tag if *v == nil { sv = &types.Tag{} } else { sv = *v } for key, value := range shape { switch key { case "Key": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected TagKey to be of type string, got %T instead", value) } sv.Key = ptr.String(jtv) } case "Value": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected TagValue to be of type string, got %T instead", value) } sv.Value = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentTagList(v *[]types.Tag, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.([]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var cv []types.Tag if *v == nil { cv = []types.Tag{} } else { cv = *v } for _, value := range shape { var col types.Tag destAddr := &col if err := awsAwsjson11_deserializeDocumentTag(&destAddr, value); err != nil { return err } col = *destAddr cv = append(cv, col) } *v = cv return nil } func awsAwsjson11_deserializeDocumentTooManyTagsException(v **types.TooManyTagsException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.TooManyTagsException if *v == nil { sv = &types.TooManyTagsException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUnsupportedCommandException(v **types.UnsupportedCommandException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UnsupportedCommandException if *v == nil { sv = &types.UnsupportedCommandException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeDocumentUploadNotFoundException(v **types.UploadNotFoundException, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *types.UploadNotFoundException if *v == nil { sv = &types.UploadNotFoundException{} } else { sv = *v } for key, value := range shape { switch key { case "message", "Message": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected ExceptionMessage to be of type string, got %T instead", value) } sv.Message = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentBatchCheckLayerAvailabilityOutput(v **BatchCheckLayerAvailabilityOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *BatchCheckLayerAvailabilityOutput if *v == nil { sv = &BatchCheckLayerAvailabilityOutput{} } else { sv = *v } for key, value := range shape { switch key { case "failures": if err := awsAwsjson11_deserializeDocumentLayerFailureList(&sv.Failures, value); err != nil { return err } case "layers": if err := awsAwsjson11_deserializeDocumentLayerList(&sv.Layers, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentBatchDeleteImageOutput(v **BatchDeleteImageOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *BatchDeleteImageOutput if *v == nil { sv = &BatchDeleteImageOutput{} } else { sv = *v } for key, value := range shape { switch key { case "failures": if err := awsAwsjson11_deserializeDocumentImageFailureList(&sv.Failures, value); err != nil { return err } case "imageIds": if err := awsAwsjson11_deserializeDocumentImageIdentifierList(&sv.ImageIds, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentCompleteLayerUploadOutput(v **CompleteLayerUploadOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *CompleteLayerUploadOutput if *v == nil { sv = &CompleteLayerUploadOutput{} } else { sv = *v } for key, value := range shape { switch key { case "layerDigest": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected LayerDigest to be of type string, got %T instead", value) } sv.LayerDigest = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "uploadId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UploadId to be of type string, got %T instead", value) } sv.UploadId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentCreateRepositoryOutput(v **CreateRepositoryOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *CreateRepositoryOutput if *v == nil { sv = &CreateRepositoryOutput{} } else { sv = *v } for key, value := range shape { switch key { case "catalogData": if err := awsAwsjson11_deserializeDocumentRepositoryCatalogData(&sv.CatalogData, value); err != nil { return err } case "repository": if err := awsAwsjson11_deserializeDocumentRepository(&sv.Repository, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDeleteRepositoryOutput(v **DeleteRepositoryOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DeleteRepositoryOutput if *v == nil { sv = &DeleteRepositoryOutput{} } else { sv = *v } for key, value := range shape { switch key { case "repository": if err := awsAwsjson11_deserializeDocumentRepository(&sv.Repository, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDeleteRepositoryPolicyOutput(v **DeleteRepositoryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DeleteRepositoryPolicyOutput if *v == nil { sv = &DeleteRepositoryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeImagesOutput(v **DescribeImagesOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeImagesOutput if *v == nil { sv = &DescribeImagesOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageDetails": if err := awsAwsjson11_deserializeDocumentImageDetailList(&sv.ImageDetails, value); err != nil { return err } case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeImageTagsOutput(v **DescribeImageTagsOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeImageTagsOutput if *v == nil { sv = &DescribeImageTagsOutput{} } else { sv = *v } for key, value := range shape { switch key { case "imageTagDetails": if err := awsAwsjson11_deserializeDocumentImageTagDetailList(&sv.ImageTagDetails, value); err != nil { return err } case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeRegistriesOutput(v **DescribeRegistriesOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeRegistriesOutput if *v == nil { sv = &DescribeRegistriesOutput{} } else { sv = *v } for key, value := range shape { switch key { case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } case "registries": if err := awsAwsjson11_deserializeDocumentRegistryList(&sv.Registries, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentDescribeRepositoriesOutput(v **DescribeRepositoriesOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *DescribeRepositoriesOutput if *v == nil { sv = &DescribeRepositoriesOutput{} } else { sv = *v } for key, value := range shape { switch key { case "nextToken": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected NextToken to be of type string, got %T instead", value) } sv.NextToken = ptr.String(jtv) } case "repositories": if err := awsAwsjson11_deserializeDocumentRepositoryList(&sv.Repositories, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetAuthorizationTokenOutput(v **GetAuthorizationTokenOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetAuthorizationTokenOutput if *v == nil { sv = &GetAuthorizationTokenOutput{} } else { sv = *v } for key, value := range shape { switch key { case "authorizationData": if err := awsAwsjson11_deserializeDocumentAuthorizationData(&sv.AuthorizationData, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetRegistryCatalogDataOutput(v **GetRegistryCatalogDataOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetRegistryCatalogDataOutput if *v == nil { sv = &GetRegistryCatalogDataOutput{} } else { sv = *v } for key, value := range shape { switch key { case "registryCatalogData": if err := awsAwsjson11_deserializeDocumentRegistryCatalogData(&sv.RegistryCatalogData, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetRepositoryCatalogDataOutput(v **GetRepositoryCatalogDataOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetRepositoryCatalogDataOutput if *v == nil { sv = &GetRepositoryCatalogDataOutput{} } else { sv = *v } for key, value := range shape { switch key { case "catalogData": if err := awsAwsjson11_deserializeDocumentRepositoryCatalogData(&sv.CatalogData, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentGetRepositoryPolicyOutput(v **GetRepositoryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *GetRepositoryPolicyOutput if *v == nil { sv = &GetRepositoryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentInitiateLayerUploadOutput(v **InitiateLayerUploadOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *InitiateLayerUploadOutput if *v == nil { sv = &InitiateLayerUploadOutput{} } else { sv = *v } for key, value := range shape { switch key { case "partSize": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected PartSize to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.PartSize = ptr.Int64(i64) } case "uploadId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UploadId to be of type string, got %T instead", value) } sv.UploadId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentListTagsForResourceOutput(v **ListTagsForResourceOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *ListTagsForResourceOutput if *v == nil { sv = &ListTagsForResourceOutput{} } else { sv = *v } for key, value := range shape { switch key { case "tags": if err := awsAwsjson11_deserializeDocumentTagList(&sv.Tags, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutImageOutput(v **PutImageOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutImageOutput if *v == nil { sv = &PutImageOutput{} } else { sv = *v } for key, value := range shape { switch key { case "image": if err := awsAwsjson11_deserializeDocumentImage(&sv.Image, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutRegistryCatalogDataOutput(v **PutRegistryCatalogDataOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutRegistryCatalogDataOutput if *v == nil { sv = &PutRegistryCatalogDataOutput{} } else { sv = *v } for key, value := range shape { switch key { case "registryCatalogData": if err := awsAwsjson11_deserializeDocumentRegistryCatalogData(&sv.RegistryCatalogData, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentPutRepositoryCatalogDataOutput(v **PutRepositoryCatalogDataOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *PutRepositoryCatalogDataOutput if *v == nil { sv = &PutRepositoryCatalogDataOutput{} } else { sv = *v } for key, value := range shape { switch key { case "catalogData": if err := awsAwsjson11_deserializeDocumentRepositoryCatalogData(&sv.CatalogData, value); err != nil { return err } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentSetRepositoryPolicyOutput(v **SetRepositoryPolicyOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *SetRepositoryPolicyOutput if *v == nil { sv = &SetRepositoryPolicyOutput{} } else { sv = *v } for key, value := range shape { switch key { case "policyText": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryPolicyText to be of type string, got %T instead", value) } sv.PolicyText = ptr.String(jtv) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentTagResourceOutput(v **TagResourceOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *TagResourceOutput if *v == nil { sv = &TagResourceOutput{} } else { sv = *v } for key, value := range shape { switch key { default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentUntagResourceOutput(v **UntagResourceOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *UntagResourceOutput if *v == nil { sv = &UntagResourceOutput{} } else { sv = *v } for key, value := range shape { switch key { default: _, _ = key, value } } *v = sv return nil } func awsAwsjson11_deserializeOpDocumentUploadLayerPartOutput(v **UploadLayerPartOutput, value interface{}) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } if value == nil { return nil } shape, ok := value.(map[string]interface{}) if !ok { return fmt.Errorf("unexpected JSON type %v", value) } var sv *UploadLayerPartOutput if *v == nil { sv = &UploadLayerPartOutput{} } else { sv = *v } for key, value := range shape { switch key { case "lastByteReceived": if value != nil { jtv, ok := value.(json.Number) if !ok { return fmt.Errorf("expected PartSize to be json.Number, got %T instead", value) } i64, err := jtv.Int64() if err != nil { return err } sv.LastByteReceived = ptr.Int64(i64) } case "registryId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RegistryId to be of type string, got %T instead", value) } sv.RegistryId = ptr.String(jtv) } case "repositoryName": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected RepositoryName to be of type string, got %T instead", value) } sv.RepositoryName = ptr.String(jtv) } case "uploadId": if value != nil { jtv, ok := value.(string) if !ok { return fmt.Errorf("expected UploadId to be of type string, got %T instead", value) } sv.UploadId = ptr.String(jtv) } default: _, _ = key, value } } *v = sv return nil } type protocolErrorInfo struct { Type string `json:"__type"` Message string Code any // nonstandard for awsjson but some services do present the type here } func getProtocolErrorInfo(decoder *json.Decoder) (protocolErrorInfo, error) { var errInfo protocolErrorInfo if err := decoder.Decode(&errInfo); err != nil { if err == io.EOF { return errInfo, nil } return errInfo, err } return errInfo, nil } func resolveProtocolErrorType(headerType string, bodyInfo protocolErrorInfo) (string, bool) { if len(headerType) != 0 { return headerType, true } else if len(bodyInfo.Type) != 0 { return bodyInfo.Type, true } else if code, ok := bodyInfo.Code.(string); ok && len(code) != 0 { return code, true } return "", false } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/doc.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. // Package ecrpublic provides the API client, operations, and parameter types for // Amazon Elastic Container Registry Public. // // # Amazon Elastic Container Registry Public // // Amazon Elastic Container Registry Public (Amazon ECR Public) is a managed // container image registry service. Amazon ECR provides both public and private // registries to host your container images. You can use the Docker CLI or your // preferred client to push, pull, and manage images. Amazon ECR provides a secure, // scalable, and reliable registry for your Docker or Open Container Initiative // (OCI) images. Amazon ECR supports public repositories with this API. For // information about the Amazon ECR API for private repositories, see [Amazon Elastic Container Registry API Reference]. // // [Amazon Elastic Container Registry API Reference]: https://docs.aws.amazon.com/AmazonECR/latest/APIReference/Welcome.html package ecrpublic ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/endpoints.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" "github.com/aws/aws-sdk-go-v2/internal/endpoints" "github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn" internalendpoints "github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints" smithyauth "github.com/aws/smithy-go/auth" smithyendpoints "github.com/aws/smithy-go/endpoints" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "net/http" "net/url" "os" "strings" ) // EndpointResolverOptions is the service endpoint resolver options type EndpointResolverOptions = internalendpoints.Options // EndpointResolver interface for resolving service endpoints. type EndpointResolver interface { ResolveEndpoint(region string, options EndpointResolverOptions) (aws.Endpoint, error) } var _ EndpointResolver = &internalendpoints.Resolver{} // NewDefaultEndpointResolver constructs a new service endpoint resolver func NewDefaultEndpointResolver() *internalendpoints.Resolver { return internalendpoints.New() } // EndpointResolverFunc is a helper utility that wraps a function so it satisfies // the EndpointResolver interface. This is useful when you want to add additional // endpoint resolving logic, or stub out specific endpoints with custom values. type EndpointResolverFunc func(region string, options EndpointResolverOptions) (aws.Endpoint, error) func (fn EndpointResolverFunc) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { return fn(region, options) } // EndpointResolverFromURL returns an EndpointResolver configured using the // provided endpoint url. By default, the resolved endpoint resolver uses the // client region as signing region, and the endpoint source is set to // EndpointSourceCustom.You can provide functional options to configure endpoint // values for the resolved endpoint. func EndpointResolverFromURL(url string, optFns ...func(*aws.Endpoint)) EndpointResolver { e := aws.Endpoint{URL: url, Source: aws.EndpointSourceCustom} for _, fn := range optFns { fn(&e) } return EndpointResolverFunc( func(region string, options EndpointResolverOptions) (aws.Endpoint, error) { if len(e.SigningRegion) == 0 { e.SigningRegion = region } return e, nil }, ) } type ResolveEndpoint struct { Resolver EndpointResolver Options EndpointResolverOptions } func (*ResolveEndpoint) ID() string { return "ResolveEndpoint" } func (m *ResolveEndpoint) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { if !awsmiddleware.GetRequiresLegacyEndpoints(ctx) { return next.HandleSerialize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.Resolver == nil { return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } eo := m.Options eo.Logger = middleware.GetLogger(ctx) var endpoint aws.Endpoint endpoint, err = m.Resolver.ResolveEndpoint(awsmiddleware.GetRegion(ctx), eo) if err != nil { nf := (&aws.EndpointNotFoundError{}) if errors.As(err, &nf) { ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, false) return next.HandleSerialize(ctx, in) } return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) } req.URL, err = url.Parse(endpoint.URL) if err != nil { return out, metadata, fmt.Errorf("failed to parse endpoint URL: %w", err) } if len(awsmiddleware.GetSigningName(ctx)) == 0 { signingName := endpoint.SigningName if len(signingName) == 0 { signingName = "ecr-public" } ctx = awsmiddleware.SetSigningName(ctx, signingName) } ctx = awsmiddleware.SetEndpointSource(ctx, endpoint.Source) ctx = smithyhttp.SetHostnameImmutable(ctx, endpoint.HostnameImmutable) ctx = awsmiddleware.SetSigningRegion(ctx, endpoint.SigningRegion) ctx = awsmiddleware.SetPartitionID(ctx, endpoint.PartitionID) return next.HandleSerialize(ctx, in) } func addResolveEndpointMiddleware(stack *middleware.Stack, o Options) error { return stack.Serialize.Insert(&ResolveEndpoint{ Resolver: o.EndpointResolver, Options: o.EndpointOptions, }, "OperationSerializer", middleware.Before) } func removeResolveEndpointMiddleware(stack *middleware.Stack) error { _, err := stack.Serialize.Remove((&ResolveEndpoint{}).ID()) return err } type wrappedEndpointResolver struct { awsResolver aws.EndpointResolverWithOptions } func (w *wrappedEndpointResolver) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { return w.awsResolver.ResolveEndpoint(ServiceID, region, options) } type awsEndpointResolverAdaptor func(service, region string) (aws.Endpoint, error) func (a awsEndpointResolverAdaptor) ResolveEndpoint(service, region string, options ...interface{}) (aws.Endpoint, error) { return a(service, region) } var _ aws.EndpointResolverWithOptions = awsEndpointResolverAdaptor(nil) // withEndpointResolver returns an aws.EndpointResolverWithOptions that first delegates endpoint resolution to the awsResolver. // If awsResolver returns aws.EndpointNotFoundError error, the v1 resolver middleware will swallow the error, // and set an appropriate context flag such that fallback will occur when EndpointResolverV2 is invoked // via its middleware. // // If another error (besides aws.EndpointNotFoundError) is returned, then that error will be propagated. func withEndpointResolver(awsResolver aws.EndpointResolver, awsResolverWithOptions aws.EndpointResolverWithOptions) EndpointResolver { var resolver aws.EndpointResolverWithOptions if awsResolverWithOptions != nil { resolver = awsResolverWithOptions } else if awsResolver != nil { resolver = awsEndpointResolverAdaptor(awsResolver.ResolveEndpoint) } return &wrappedEndpointResolver{ awsResolver: resolver, } } func finalizeClientEndpointResolverOptions(options *Options) { options.EndpointOptions.LogDeprecated = options.ClientLogMode.IsDeprecatedUsage() if len(options.EndpointOptions.ResolvedRegion) == 0 { const fipsInfix = "-fips-" const fipsPrefix = "fips-" const fipsSuffix = "-fips" if strings.Contains(options.Region, fipsInfix) || strings.Contains(options.Region, fipsPrefix) || strings.Contains(options.Region, fipsSuffix) { options.EndpointOptions.ResolvedRegion = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll( options.Region, fipsInfix, "-"), fipsPrefix, ""), fipsSuffix, "") options.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled } } } func resolveEndpointResolverV2(options *Options) { if options.EndpointResolverV2 == nil { options.EndpointResolverV2 = NewDefaultEndpointResolverV2() } } func resolveBaseEndpoint(cfg aws.Config, o *Options) { if cfg.BaseEndpoint != nil { o.BaseEndpoint = cfg.BaseEndpoint } _, g := os.LookupEnv("AWS_ENDPOINT_URL") _, s := os.LookupEnv("AWS_ENDPOINT_URL_ECR_PUBLIC") if g && !s { return } value, found, err := internalConfig.ResolveServiceBaseEndpoint(context.Background(), "ECR PUBLIC", cfg.ConfigSources) if found && err == nil { o.BaseEndpoint = &value } } func bindRegion(region string) *string { if region == "" { return nil } return aws.String(endpoints.MapFIPSRegion(region)) } // EndpointParameters provides the parameters that influence how endpoints are // resolved. type EndpointParameters struct { // The AWS region used to dispatch the request. // // Parameter is // required. // // AWS::Region Region *string // When true, use the dual-stack endpoint. If the configured endpoint does not // support dual-stack, dispatching the request MAY return an error. // // Defaults to // false if no value is provided. // // AWS::UseDualStack UseDualStack *bool // When true, send this request to the FIPS-compliant regional endpoint. If the // configured endpoint does not have a FIPS compliant endpoint, dispatching the // request will return an error. // // Defaults to false if no value is // provided. // // AWS::UseFIPS UseFIPS *bool // Override the endpoint used to send this request // // Parameter is // required. // // SDK::Endpoint Endpoint *string } // ValidateRequired validates required parameters are set. func (p EndpointParameters) ValidateRequired() error { if p.UseDualStack == nil { return fmt.Errorf("parameter UseDualStack is required") } if p.UseFIPS == nil { return fmt.Errorf("parameter UseFIPS is required") } return nil } // WithDefaults returns a shallow copy of EndpointParameterswith default values // applied to members where applicable. func (p EndpointParameters) WithDefaults() EndpointParameters { if p.UseDualStack == nil { p.UseDualStack = ptr.Bool(false) } if p.UseFIPS == nil { p.UseFIPS = ptr.Bool(false) } return p } type stringSlice []string func (s stringSlice) Get(i int) *string { if i < 0 || i >= len(s) { return nil } v := s[i] return &v } // EndpointResolverV2 provides the interface for resolving service endpoints. type EndpointResolverV2 interface { // ResolveEndpoint attempts to resolve the endpoint with the provided options, // returning the endpoint if found. Otherwise an error is returned. ResolveEndpoint(ctx context.Context, params EndpointParameters) ( smithyendpoints.Endpoint, error, ) } // resolver provides the implementation for resolving endpoints. type resolver struct{} func NewDefaultEndpointResolverV2() EndpointResolverV2 { return &resolver{} } // ResolveEndpoint attempts to resolve the endpoint with the provided options, // returning the endpoint if found. Otherwise an error is returned. func (r *resolver) ResolveEndpoint( ctx context.Context, params EndpointParameters, ) ( endpoint smithyendpoints.Endpoint, err error, ) { params = params.WithDefaults() if err = params.ValidateRequired(); err != nil { return endpoint, fmt.Errorf("endpoint parameters are not valid, %w", err) } _UseDualStack := *params.UseDualStack _UseFIPS := *params.UseFIPS if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if _UseFIPS == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: FIPS and custom endpoint are not supported") } if _UseDualStack == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Dualstack and custom endpoint are not supported") } uriString := _Endpoint uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } if exprVal := params.Region; exprVal != nil { _Region := *exprVal _ = _Region if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _PartitionResult := *exprVal _ = _PartitionResult if _UseFIPS == true { if _UseDualStack == true { if true == _PartitionResult.SupportsFIPS { if true == _PartitionResult.SupportsDualStack { uriString := func() string { var out strings.Builder out.WriteString("https://api.ecr-public-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_PartitionResult.DualStackDnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } } return endpoint, fmt.Errorf("endpoint rule error, %s", "FIPS and DualStack are enabled, but this partition does not support one or both") } } if _UseFIPS == true { if _PartitionResult.SupportsFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://api.ecr-public-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_PartitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "FIPS is enabled but this partition does not support FIPS") } if _UseDualStack == true { if true == _PartitionResult.SupportsDualStack { if "aws" == _PartitionResult.Name { uriString := func() string { var out strings.Builder out.WriteString("https://ecr-public.") out.WriteString(_Region) out.WriteString(".api.aws") return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://api.ecr-public.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_PartitionResult.DualStackDnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "DualStack is enabled but this partition does not support DualStack") } uriString := func() string { var out strings.Builder out.WriteString("https://api.ecr-public.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_PartitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, }, nil } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Missing Region") } type endpointParamsBinder interface { bindEndpointParams(*EndpointParameters) } func bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters { params := &EndpointParameters{} params.Region = bindRegion(options.Region) params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) params.Endpoint = options.BaseEndpoint if b, ok := input.(endpointParamsBinder); ok { b.bindEndpointParams(params) } return params } type resolveEndpointV2Middleware struct { options Options } func (*resolveEndpointV2Middleware) ID() string { return "ResolveEndpointV2" } func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "ResolveEndpoint") defer span.End() if awsmiddleware.GetRequiresLegacyEndpoints(ctx) { return next.HandleFinalize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.options.EndpointResolverV2 == nil { return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } params := bindEndpointParams(ctx, getOperationInput(ctx), m.options) endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", func() (smithyendpoints.Endpoint, error) { return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) }) if err != nil { return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) } span.SetProperty("client.call.resolved_endpoint", endpt.URI.String()) if endpt.URI.RawPath == "" && req.URL.RawPath != "" { endpt.URI.RawPath = endpt.URI.Path } req.URL.Scheme = endpt.URI.Scheme req.URL.Host = endpt.URI.Host req.URL.Path = smithyhttp.JoinPath(endpt.URI.Path, req.URL.Path) req.URL.RawPath = smithyhttp.JoinPath(endpt.URI.RawPath, req.URL.RawPath) for k := range endpt.Headers { req.Header.Set(k, endpt.Headers.Get(k)) } rscheme := getResolvedAuthScheme(ctx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } opts, _ := smithyauth.GetAuthOptions(&endpt.Properties) for _, o := range opts { rscheme.SignerProperties.SetAll(&o.SignerProperties) } span.End() return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/generated.json ================================================ { "dependencies": { "github.com/aws/aws-sdk-go-v2": "v1.4.0", "github.com/aws/aws-sdk-go-v2/internal/configsources": "v0.0.0-00010101000000-000000000000", "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2": "v2.0.0-00010101000000-000000000000", "github.com/aws/smithy-go": "v1.4.0" }, "files": [ "api_client.go", "api_client_test.go", "api_op_BatchCheckLayerAvailability.go", "api_op_BatchDeleteImage.go", "api_op_CompleteLayerUpload.go", "api_op_CreateRepository.go", "api_op_DeleteRepository.go", "api_op_DeleteRepositoryPolicy.go", "api_op_DescribeImageTags.go", "api_op_DescribeImages.go", "api_op_DescribeRegistries.go", "api_op_DescribeRepositories.go", "api_op_GetAuthorizationToken.go", "api_op_GetRegistryCatalogData.go", "api_op_GetRepositoryCatalogData.go", "api_op_GetRepositoryPolicy.go", "api_op_InitiateLayerUpload.go", "api_op_ListTagsForResource.go", "api_op_PutImage.go", "api_op_PutRegistryCatalogData.go", "api_op_PutRepositoryCatalogData.go", "api_op_SetRepositoryPolicy.go", "api_op_TagResource.go", "api_op_UntagResource.go", "api_op_UploadLayerPart.go", "auth.go", "deserializers.go", "doc.go", "endpoints.go", "endpoints_config_test.go", "endpoints_test.go", "generated.json", "internal/endpoints/endpoints.go", "internal/endpoints/endpoints_test.go", "options.go", "protocol_test.go", "serializers.go", "snapshot_test.go", "sra_operation_order_test.go", "types/enums.go", "types/errors.go", "types/types.go", "validators.go" ], "go": "1.22", "module": "github.com/aws/aws-sdk-go-v2/service/ecrpublic", "unstable": false } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package ecrpublic // goModuleVersion is the tagged release for this module const goModuleVersion = "1.33.0" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/internal/endpoints/endpoints.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package endpoints import ( "github.com/aws/aws-sdk-go-v2/aws" endpoints "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2" "github.com/aws/smithy-go/logging" "regexp" ) // Options is the endpoint resolver configuration options type Options struct { // Logger is a logging implementation that log events should be sent to. Logger logging.Logger // LogDeprecated indicates that deprecated endpoints should be logged to the // provided logger. LogDeprecated bool // ResolvedRegion is used to override the region to be resolved, rather then the // using the value passed to the ResolveEndpoint method. This value is used by the // SDK to translate regions like fips-us-east-1 or us-east-1-fips to an alternative // name. You must not set this value directly in your application. ResolvedRegion string // DisableHTTPS informs the resolver to return an endpoint that does not use the // HTTPS scheme. DisableHTTPS bool // UseDualStackEndpoint specifies the resolver must resolve a dual-stack endpoint. UseDualStackEndpoint aws.DualStackEndpointState // UseFIPSEndpoint specifies the resolver must resolve a FIPS endpoint. UseFIPSEndpoint aws.FIPSEndpointState } func (o Options) GetResolvedRegion() string { return o.ResolvedRegion } func (o Options) GetDisableHTTPS() bool { return o.DisableHTTPS } func (o Options) GetUseDualStackEndpoint() aws.DualStackEndpointState { return o.UseDualStackEndpoint } func (o Options) GetUseFIPSEndpoint() aws.FIPSEndpointState { return o.UseFIPSEndpoint } func transformToSharedOptions(options Options) endpoints.Options { return endpoints.Options{ Logger: options.Logger, LogDeprecated: options.LogDeprecated, ResolvedRegion: options.ResolvedRegion, DisableHTTPS: options.DisableHTTPS, UseDualStackEndpoint: options.UseDualStackEndpoint, UseFIPSEndpoint: options.UseFIPSEndpoint, } } // Resolver ECR PUBLIC endpoint resolver type Resolver struct { partitions endpoints.Partitions } // ResolveEndpoint resolves the service endpoint for the given region and options func (r *Resolver) ResolveEndpoint(region string, options Options) (endpoint aws.Endpoint, err error) { if len(region) == 0 { return endpoint, &aws.MissingRegionError{} } opt := transformToSharedOptions(options) return r.partitions.ResolveEndpoint(region, opt) } // New returns a new Resolver func New() *Resolver { return &Resolver{ partitions: defaultPartitions, } } var partitionRegexp = struct { Aws *regexp.Regexp AwsCn *regexp.Regexp AwsEusc *regexp.Regexp AwsIso *regexp.Regexp AwsIsoB *regexp.Regexp AwsIsoE *regexp.Regexp AwsIsoF *regexp.Regexp AwsUsGov *regexp.Regexp }{ Aws: regexp.MustCompile("^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$"), AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"), AwsEusc: regexp.MustCompile("^eusc\\-(de)\\-\\w+\\-\\d+$"), AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"), AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"), AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"), AwsIsoF: regexp.MustCompile("^us\\-isof\\-\\w+\\-\\d+$"), AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"), } var defaultPartitions = endpoints.Partitions{ { ID: "aws", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.DualStackVariant, }: { Hostname: "api.ecr-public.{region}.api.aws", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-public-fips.{region}.amazonaws.com", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "api.ecr-public-fips.{region}.api.aws", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr-public.{region}.amazonaws.com", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.Aws, IsRegionalized: true, Endpoints: endpoints.Endpoints{ endpoints.EndpointKey{ Region: "us-east-1", }: endpoints.Endpoint{ Hostname: "api.ecr-public.us-east-1.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, }, endpoints.EndpointKey{ Region: "us-east-1", Variant: endpoints.DualStackVariant, }: { Hostname: "ecr-public.us-east-1.api.aws", CredentialScope: endpoints.CredentialScope{ Region: "us-east-1", }, }, endpoints.EndpointKey{ Region: "us-west-2", }: endpoints.Endpoint{ Hostname: "api.ecr-public.us-west-2.amazonaws.com", CredentialScope: endpoints.CredentialScope{ Region: "us-west-2", }, }, }, }, { ID: "aws-cn", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.DualStackVariant, }: { Hostname: "api.ecr-public.{region}.api.amazonwebservices.com.cn", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-public-fips.{region}.amazonaws.com.cn", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "api.ecr-public-fips.{region}.api.amazonwebservices.com.cn", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr-public.{region}.amazonaws.com.cn", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsCn, IsRegionalized: true, }, { ID: "aws-eusc", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-public-fips.{region}.amazonaws.eu", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr-public.{region}.amazonaws.eu", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsEusc, IsRegionalized: true, }, { ID: "aws-iso", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-public-fips.{region}.c2s.ic.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr-public.{region}.c2s.ic.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsIso, IsRegionalized: true, }, { ID: "aws-iso-b", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-public-fips.{region}.sc2s.sgov.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr-public.{region}.sc2s.sgov.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsIsoB, IsRegionalized: true, }, { ID: "aws-iso-e", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-public-fips.{region}.cloud.adc-e.uk", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr-public.{region}.cloud.adc-e.uk", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsIsoE, IsRegionalized: true, }, { ID: "aws-iso-f", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-public-fips.{region}.csp.hci.ic.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr-public.{region}.csp.hci.ic.gov", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsIsoF, IsRegionalized: true, }, { ID: "aws-us-gov", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ { Variant: endpoints.DualStackVariant, }: { Hostname: "api.ecr-public.{region}.api.aws", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant, }: { Hostname: "api.ecr-public-fips.{region}.amazonaws.com", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, }: { Hostname: "api.ecr-public-fips.{region}.api.aws", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, { Variant: 0, }: { Hostname: "api.ecr-public.{region}.amazonaws.com", Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, }, RegionRegex: partitionRegexp.AwsUsGov, IsRegionalized: true, }, } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/options.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy" smithyauth "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "net/http" ) type HTTPClient interface { Do(*http.Request) (*http.Response, error) } type Options struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation call to // modify this list for per operation behavior. APIOptions []func(*middleware.Stack) error // The optional application specific identifier appended to the User-Agent header. AppID string // This endpoint will be given as input to an EndpointResolverV2. It is used for // providing a custom base endpoint that is subject to modifications by the // processing EndpointResolverV2. BaseEndpoint *string // Configures the events that will be sent to the configured logger. ClientLogMode aws.ClientLogMode // The credentials object to use when signing requests. Credentials aws.CredentialsProvider // The configuration DefaultsMode that the SDK should use when constructing the // clients initial default settings. DefaultsMode aws.DefaultsMode // The endpoint options to be used when attempting to resolve an endpoint. EndpointOptions EndpointResolverOptions // The service endpoint resolver. // // Deprecated: Deprecated: EndpointResolver and WithEndpointResolver. Providing a // value for this field will likely prevent you from using any endpoint-related // service features released after the introduction of EndpointResolverV2 and // BaseEndpoint. // // To migrate an EndpointResolver implementation that uses a custom endpoint, set // the client option BaseEndpoint instead. EndpointResolver EndpointResolver // Resolves the endpoint used for a particular service operation. This should be // used over the deprecated EndpointResolver. EndpointResolverV2 EndpointResolverV2 // Signature Version 4 (SigV4) Signer HTTPSignerV4 HTTPSignerV4 // The logger writer interface to write logging messages to. Logger logging.Logger // The client meter provider. MeterProvider metrics.MeterProvider // The region to send requests to. (Required) Region string // RetryMaxAttempts specifies the maximum number attempts an API client will call // an operation that fails with a retryable error. A value of 0 is ignored, and // will not be used to configure the API client created default retryer, or modify // per operation call's retry max attempts. // // If specified in an operation call's functional options with a value that is // different than the constructed client's Options, the Client's Retryer will be // wrapped to use the operation's specific RetryMaxAttempts value. RetryMaxAttempts int // RetryMode specifies the retry mode the API client will be created with, if // Retryer option is not also specified. // // When creating a new API Clients this member will only be used if the Retryer // Options member is nil. This value will be ignored if Retryer is not nil. // // Currently does not support per operation call overrides, may in the future. RetryMode aws.RetryMode // Retryer guides how HTTP requests should be retried in case of recoverable // failures. When nil the API client will use a default retryer. The kind of // default retry created by the API client can be changed with the RetryMode // option. Retryer aws.Retryer // The RuntimeEnvironment configuration, only populated if the DefaultsMode is set // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You // should not populate this structure programmatically, or rely on the values here // within your applications. RuntimeEnvironment aws.RuntimeEnvironment // The client tracer provider. TracerProvider tracing.TracerProvider // The initial DefaultsMode used when the client options were constructed. If the // DefaultsMode was set to aws.DefaultsModeAuto this will store what the resolved // value was at that point in time. // // Currently does not support per operation call overrides, may in the future. resolvedDefaultsMode aws.DefaultsMode // The HTTP client to invoke API calls with. Defaults to client's default HTTP // implementation if nil. HTTPClient HTTPClient // The auth scheme resolver which determines how to authenticate for each // operation. AuthSchemeResolver AuthSchemeResolver // The list of auth schemes supported by the client. AuthSchemes []smithyhttp.AuthScheme } // Copy creates a clone where the APIOptions list is deep copied. func (o Options) Copy() Options { to := o to.APIOptions = make([]func(*middleware.Stack) error, len(o.APIOptions)) copy(to.APIOptions, o.APIOptions) return to } func (o Options) GetIdentityResolver(schemeID string) smithyauth.IdentityResolver { if schemeID == "aws.auth#sigv4" { return getSigV4IdentityResolver(o) } if schemeID == "smithy.api#noAuth" { return &smithyauth.AnonymousIdentityResolver{} } return nil } // WithAPIOptions returns a functional option for setting the Client's APIOptions // option. func WithAPIOptions(optFns ...func(*middleware.Stack) error) func(*Options) { return func(o *Options) { o.APIOptions = append(o.APIOptions, optFns...) } } // Deprecated: EndpointResolver and WithEndpointResolver. Providing a value for // this field will likely prevent you from using any endpoint-related service // features released after the introduction of EndpointResolverV2 and BaseEndpoint. // // To migrate an EndpointResolver implementation that uses a custom endpoint, set // the client option BaseEndpoint instead. func WithEndpointResolver(v EndpointResolver) func(*Options) { return func(o *Options) { o.EndpointResolver = v } } // WithEndpointResolverV2 returns a functional option for setting the Client's // EndpointResolverV2 option. func WithEndpointResolverV2(v EndpointResolverV2) func(*Options) { return func(o *Options) { o.EndpointResolverV2 = v } } func getSigV4IdentityResolver(o Options) smithyauth.IdentityResolver { if o.Credentials != nil { return &internalauthsmithy.CredentialsProviderAdapter{Provider: o.Credentials} } return nil } // WithSigV4SigningName applies an override to the authentication workflow to // use the given signing name for SigV4-authenticated operations. // // This is an advanced setting. The value here is FINAL, taking precedence over // the resolved signing name from both auth scheme resolution and endpoint // resolution. func WithSigV4SigningName(name string) func(*Options) { fn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { return next.HandleInitialize(awsmiddleware.SetSigningName(ctx, name), in) } return func(o *Options) { o.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error { return s.Initialize.Add( middleware.InitializeMiddlewareFunc("withSigV4SigningName", fn), middleware.Before, ) }) } } // WithSigV4SigningRegion applies an override to the authentication workflow to // use the given signing region for SigV4-authenticated operations. // // This is an advanced setting. The value here is FINAL, taking precedence over // the resolved signing region from both auth scheme resolution and endpoint // resolution. func WithSigV4SigningRegion(region string) func(*Options) { fn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { return next.HandleInitialize(awsmiddleware.SetSigningRegion(ctx, region), in) } return func(o *Options) { o.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error { return s.Initialize.Add( middleware.InitializeMiddlewareFunc("withSigV4SigningRegion", fn), middleware.Before, ) }) } } func ignoreAnonymousAuth(options *Options) { if aws.IsCredentialsProvider(options.Credentials, (*aws.AnonymousCredentials)(nil)) { options.Credentials = nil } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/serializers.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "bytes" "context" "fmt" "github.com/aws/aws-sdk-go-v2/service/ecrpublic/types" smithy "github.com/aws/smithy-go" "github.com/aws/smithy-go/encoding/httpbinding" smithyjson "github.com/aws/smithy-go/encoding/json" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "path" ) type awsAwsjson11_serializeOpBatchCheckLayerAvailability struct { } func (*awsAwsjson11_serializeOpBatchCheckLayerAvailability) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpBatchCheckLayerAvailability) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*BatchCheckLayerAvailabilityInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.BatchCheckLayerAvailability") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentBatchCheckLayerAvailabilityInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpBatchDeleteImage struct { } func (*awsAwsjson11_serializeOpBatchDeleteImage) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpBatchDeleteImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*BatchDeleteImageInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.BatchDeleteImage") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentBatchDeleteImageInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpCompleteLayerUpload struct { } func (*awsAwsjson11_serializeOpCompleteLayerUpload) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpCompleteLayerUpload) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*CompleteLayerUploadInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.CompleteLayerUpload") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentCompleteLayerUploadInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpCreateRepository struct { } func (*awsAwsjson11_serializeOpCreateRepository) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpCreateRepository) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*CreateRepositoryInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.CreateRepository") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentCreateRepositoryInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDeleteRepository struct { } func (*awsAwsjson11_serializeOpDeleteRepository) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDeleteRepository) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DeleteRepositoryInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.DeleteRepository") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDeleteRepositoryInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDeleteRepositoryPolicy struct { } func (*awsAwsjson11_serializeOpDeleteRepositoryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDeleteRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DeleteRepositoryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.DeleteRepositoryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDeleteRepositoryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeImages struct { } func (*awsAwsjson11_serializeOpDescribeImages) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeImages) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeImagesInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.DescribeImages") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeImagesInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeImageTags struct { } func (*awsAwsjson11_serializeOpDescribeImageTags) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeImageTags) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeImageTagsInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.DescribeImageTags") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeImageTagsInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeRegistries struct { } func (*awsAwsjson11_serializeOpDescribeRegistries) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeRegistries) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeRegistriesInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.DescribeRegistries") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeRegistriesInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpDescribeRepositories struct { } func (*awsAwsjson11_serializeOpDescribeRepositories) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpDescribeRepositories) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*DescribeRepositoriesInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.DescribeRepositories") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentDescribeRepositoriesInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetAuthorizationToken struct { } func (*awsAwsjson11_serializeOpGetAuthorizationToken) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetAuthorizationToken) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetAuthorizationTokenInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.GetAuthorizationToken") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetAuthorizationTokenInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetRegistryCatalogData struct { } func (*awsAwsjson11_serializeOpGetRegistryCatalogData) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetRegistryCatalogData) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetRegistryCatalogDataInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.GetRegistryCatalogData") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetRegistryCatalogDataInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetRepositoryCatalogData struct { } func (*awsAwsjson11_serializeOpGetRepositoryCatalogData) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetRepositoryCatalogData) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetRepositoryCatalogDataInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.GetRepositoryCatalogData") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetRepositoryCatalogDataInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpGetRepositoryPolicy struct { } func (*awsAwsjson11_serializeOpGetRepositoryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpGetRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*GetRepositoryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.GetRepositoryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentGetRepositoryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpInitiateLayerUpload struct { } func (*awsAwsjson11_serializeOpInitiateLayerUpload) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpInitiateLayerUpload) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*InitiateLayerUploadInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.InitiateLayerUpload") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentInitiateLayerUploadInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpListTagsForResource struct { } func (*awsAwsjson11_serializeOpListTagsForResource) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpListTagsForResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*ListTagsForResourceInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.ListTagsForResource") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentListTagsForResourceInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutImage struct { } func (*awsAwsjson11_serializeOpPutImage) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutImage) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutImageInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.PutImage") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutImageInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutRegistryCatalogData struct { } func (*awsAwsjson11_serializeOpPutRegistryCatalogData) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutRegistryCatalogData) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutRegistryCatalogDataInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.PutRegistryCatalogData") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutRegistryCatalogDataInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpPutRepositoryCatalogData struct { } func (*awsAwsjson11_serializeOpPutRepositoryCatalogData) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpPutRepositoryCatalogData) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*PutRepositoryCatalogDataInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.PutRepositoryCatalogData") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentPutRepositoryCatalogDataInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpSetRepositoryPolicy struct { } func (*awsAwsjson11_serializeOpSetRepositoryPolicy) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpSetRepositoryPolicy) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*SetRepositoryPolicyInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.SetRepositoryPolicy") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentSetRepositoryPolicyInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpTagResource struct { } func (*awsAwsjson11_serializeOpTagResource) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpTagResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*TagResourceInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.TagResource") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentTagResourceInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpUntagResource struct { } func (*awsAwsjson11_serializeOpUntagResource) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpUntagResource) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*UntagResourceInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.UntagResource") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentUntagResourceInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } type awsAwsjson11_serializeOpUploadLayerPart struct { } func (*awsAwsjson11_serializeOpUploadLayerPart) ID() string { return "OperationSerializer" } func (m *awsAwsjson11_serializeOpUploadLayerPart) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "OperationSerializer") endTimer := startMetricTimer(ctx, "client.call.serialization_duration") defer endTimer() defer span.End() request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} } input, ok := in.Parameters.(*UploadLayerPartInput) _ = input if !ok { return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} } operationPath := "/" if len(request.Request.URL.Path) == 0 { request.Request.URL.Path = operationPath } else { request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { request.Request.URL.Path += "/" } } request.Request.Method = "POST" httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) if err != nil { return out, metadata, &smithy.SerializationError{Err: err} } httpBindingEncoder.SetHeader("Content-Type").String("application/x-amz-json-1.1") httpBindingEncoder.SetHeader("X-Amz-Target").String("SpencerFrontendService.UploadLayerPart") jsonEncoder := smithyjson.NewEncoder() if err := awsAwsjson11_serializeOpDocumentUploadLayerPartInput(input, jsonEncoder.Value); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request, err = request.SetStream(bytes.NewReader(jsonEncoder.Bytes())); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { return out, metadata, &smithy.SerializationError{Err: err} } in.Request = request endTimer() span.End() return next.HandleSerialize(ctx, in) } func awsAwsjson11_serializeDocumentArchitectureList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentBatchedOperationLayerDigestList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentImageIdentifier(v *types.ImageIdentifier, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageDigest != nil { ok := object.Key("imageDigest") ok.String(*v.ImageDigest) } if v.ImageTag != nil { ok := object.Key("imageTag") ok.String(*v.ImageTag) } return nil } func awsAwsjson11_serializeDocumentImageIdentifierList(v []types.ImageIdentifier, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentImageIdentifier(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeDocumentLayerDigestList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentOperatingSystemList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentRepositoryCatalogDataInput(v *types.RepositoryCatalogDataInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.AboutText != nil { ok := object.Key("aboutText") ok.String(*v.AboutText) } if v.Architectures != nil { ok := object.Key("architectures") if err := awsAwsjson11_serializeDocumentArchitectureList(v.Architectures, ok); err != nil { return err } } if v.Description != nil { ok := object.Key("description") ok.String(*v.Description) } if v.LogoImageBlob != nil { ok := object.Key("logoImageBlob") ok.Base64EncodeBytes(v.LogoImageBlob) } if v.OperatingSystems != nil { ok := object.Key("operatingSystems") if err := awsAwsjson11_serializeDocumentOperatingSystemList(v.OperatingSystems, ok); err != nil { return err } } if v.UsageText != nil { ok := object.Key("usageText") ok.String(*v.UsageText) } return nil } func awsAwsjson11_serializeDocumentRepositoryNameList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentTag(v *types.Tag, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Key != nil { ok := object.Key("Key") ok.String(*v.Key) } if v.Value != nil { ok := object.Key("Value") ok.String(*v.Value) } return nil } func awsAwsjson11_serializeDocumentTagKeyList(v []string, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() av.String(v[i]) } return nil } func awsAwsjson11_serializeDocumentTagList(v []types.Tag, value smithyjson.Value) error { array := value.Array() defer array.Close() for i := range v { av := array.Value() if err := awsAwsjson11_serializeDocumentTag(&v[i], av); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentBatchCheckLayerAvailabilityInput(v *BatchCheckLayerAvailabilityInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LayerDigests != nil { ok := object.Key("layerDigests") if err := awsAwsjson11_serializeDocumentBatchedOperationLayerDigestList(v.LayerDigests, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentBatchDeleteImageInput(v *BatchDeleteImageInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageIds != nil { ok := object.Key("imageIds") if err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentCompleteLayerUploadInput(v *CompleteLayerUploadInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LayerDigests != nil { ok := object.Key("layerDigests") if err := awsAwsjson11_serializeDocumentLayerDigestList(v.LayerDigests, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } if v.UploadId != nil { ok := object.Key("uploadId") ok.String(*v.UploadId) } return nil } func awsAwsjson11_serializeOpDocumentCreateRepositoryInput(v *CreateRepositoryInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.CatalogData != nil { ok := object.Key("catalogData") if err := awsAwsjson11_serializeDocumentRepositoryCatalogDataInput(v.CatalogData, ok); err != nil { return err } } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } if v.Tags != nil { ok := object.Key("tags") if err := awsAwsjson11_serializeDocumentTagList(v.Tags, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentDeleteRepositoryInput(v *DeleteRepositoryInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Force { ok := object.Key("force") ok.Boolean(v.Force) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDeleteRepositoryPolicyInput(v *DeleteRepositoryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDescribeImagesInput(v *DescribeImagesInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageIds != nil { ok := object.Key("imageIds") if err := awsAwsjson11_serializeDocumentImageIdentifierList(v.ImageIds, ok); err != nil { return err } } if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDescribeImageTagsInput(v *DescribeImageTagsInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentDescribeRegistriesInput(v *DescribeRegistriesInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } return nil } func awsAwsjson11_serializeOpDocumentDescribeRepositoriesInput(v *DescribeRepositoriesInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.MaxResults != nil { ok := object.Key("maxResults") ok.Integer(*v.MaxResults) } if v.NextToken != nil { ok := object.Key("nextToken") ok.String(*v.NextToken) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryNames != nil { ok := object.Key("repositoryNames") if err := awsAwsjson11_serializeDocumentRepositoryNameList(v.RepositoryNames, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentGetAuthorizationTokenInput(v *GetAuthorizationTokenInput, value smithyjson.Value) error { object := value.Object() defer object.Close() return nil } func awsAwsjson11_serializeOpDocumentGetRegistryCatalogDataInput(v *GetRegistryCatalogDataInput, value smithyjson.Value) error { object := value.Object() defer object.Close() return nil } func awsAwsjson11_serializeOpDocumentGetRepositoryCatalogDataInput(v *GetRepositoryCatalogDataInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentGetRepositoryPolicyInput(v *GetRepositoryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentInitiateLayerUploadInput(v *InitiateLayerUploadInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentListTagsForResourceInput(v *ListTagsForResourceInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ResourceArn != nil { ok := object.Key("resourceArn") ok.String(*v.ResourceArn) } return nil } func awsAwsjson11_serializeOpDocumentPutImageInput(v *PutImageInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ImageDigest != nil { ok := object.Key("imageDigest") ok.String(*v.ImageDigest) } if v.ImageManifest != nil { ok := object.Key("imageManifest") ok.String(*v.ImageManifest) } if v.ImageManifestMediaType != nil { ok := object.Key("imageManifestMediaType") ok.String(*v.ImageManifestMediaType) } if v.ImageTag != nil { ok := object.Key("imageTag") ok.String(*v.ImageTag) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentPutRegistryCatalogDataInput(v *PutRegistryCatalogDataInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.DisplayName != nil { ok := object.Key("displayName") ok.String(*v.DisplayName) } return nil } func awsAwsjson11_serializeOpDocumentPutRepositoryCatalogDataInput(v *PutRepositoryCatalogDataInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.CatalogData != nil { ok := object.Key("catalogData") if err := awsAwsjson11_serializeDocumentRepositoryCatalogDataInput(v.CatalogData, ok); err != nil { return err } } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentSetRepositoryPolicyInput(v *SetRepositoryPolicyInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.Force { ok := object.Key("force") ok.Boolean(v.Force) } if v.PolicyText != nil { ok := object.Key("policyText") ok.String(*v.PolicyText) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } return nil } func awsAwsjson11_serializeOpDocumentTagResourceInput(v *TagResourceInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ResourceArn != nil { ok := object.Key("resourceArn") ok.String(*v.ResourceArn) } if v.Tags != nil { ok := object.Key("tags") if err := awsAwsjson11_serializeDocumentTagList(v.Tags, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentUntagResourceInput(v *UntagResourceInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.ResourceArn != nil { ok := object.Key("resourceArn") ok.String(*v.ResourceArn) } if v.TagKeys != nil { ok := object.Key("tagKeys") if err := awsAwsjson11_serializeDocumentTagKeyList(v.TagKeys, ok); err != nil { return err } } return nil } func awsAwsjson11_serializeOpDocumentUploadLayerPartInput(v *UploadLayerPartInput, value smithyjson.Value) error { object := value.Object() defer object.Close() if v.LayerPartBlob != nil { ok := object.Key("layerPartBlob") ok.Base64EncodeBytes(v.LayerPartBlob) } if v.PartFirstByte != nil { ok := object.Key("partFirstByte") ok.Long(*v.PartFirstByte) } if v.PartLastByte != nil { ok := object.Key("partLastByte") ok.Long(*v.PartLastByte) } if v.RegistryId != nil { ok := object.Key("registryId") ok.String(*v.RegistryId) } if v.RepositoryName != nil { ok := object.Key("repositoryName") ok.String(*v.RepositoryName) } if v.UploadId != nil { ok := object.Key("uploadId") ok.String(*v.UploadId) } return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/enums.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package types type ImageFailureCode string // Enum values for ImageFailureCode const ( ImageFailureCodeInvalidImageDigest ImageFailureCode = "InvalidImageDigest" ImageFailureCodeInvalidImageTag ImageFailureCode = "InvalidImageTag" ImageFailureCodeImageTagDoesNotMatchDigest ImageFailureCode = "ImageTagDoesNotMatchDigest" ImageFailureCodeImageNotFound ImageFailureCode = "ImageNotFound" ImageFailureCodeMissingDigestAndTag ImageFailureCode = "MissingDigestAndTag" ImageFailureCodeImageReferencedByManifestList ImageFailureCode = "ImageReferencedByManifestList" ImageFailureCodeKmsError ImageFailureCode = "KmsError" ) // Values returns all known values for ImageFailureCode. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (ImageFailureCode) Values() []ImageFailureCode { return []ImageFailureCode{ "InvalidImageDigest", "InvalidImageTag", "ImageTagDoesNotMatchDigest", "ImageNotFound", "MissingDigestAndTag", "ImageReferencedByManifestList", "KmsError", } } type LayerAvailability string // Enum values for LayerAvailability const ( LayerAvailabilityAvailable LayerAvailability = "AVAILABLE" LayerAvailabilityUnavailable LayerAvailability = "UNAVAILABLE" ) // Values returns all known values for LayerAvailability. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (LayerAvailability) Values() []LayerAvailability { return []LayerAvailability{ "AVAILABLE", "UNAVAILABLE", } } type LayerFailureCode string // Enum values for LayerFailureCode const ( LayerFailureCodeInvalidLayerDigest LayerFailureCode = "InvalidLayerDigest" LayerFailureCodeMissingLayerDigest LayerFailureCode = "MissingLayerDigest" ) // Values returns all known values for LayerFailureCode. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (LayerFailureCode) Values() []LayerFailureCode { return []LayerFailureCode{ "InvalidLayerDigest", "MissingLayerDigest", } } type RegistryAliasStatus string // Enum values for RegistryAliasStatus const ( RegistryAliasStatusActive RegistryAliasStatus = "ACTIVE" RegistryAliasStatusPending RegistryAliasStatus = "PENDING" RegistryAliasStatusRejected RegistryAliasStatus = "REJECTED" ) // Values returns all known values for RegistryAliasStatus. Note that this can be // expanded in the future, and so it is only as up to date as the client. // // The ordering of this slice is not guaranteed to be stable across updates. func (RegistryAliasStatus) Values() []RegistryAliasStatus { return []RegistryAliasStatus{ "ACTIVE", "PENDING", "REJECTED", } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/errors.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package types import ( "fmt" smithy "github.com/aws/smithy-go" ) // The specified layer upload doesn't contain any layer parts. type EmptyUploadException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *EmptyUploadException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *EmptyUploadException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *EmptyUploadException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "EmptyUploadException" } return *e.ErrorCodeOverride } func (e *EmptyUploadException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified image has already been pushed, and there were no changes to the // manifest or image tag after the last push. type ImageAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ImageAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ImageAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ImageAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ImageAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *ImageAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified image digest doesn't match the digest that Amazon ECR calculated // for the image. type ImageDigestDoesNotMatchException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ImageDigestDoesNotMatchException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ImageDigestDoesNotMatchException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ImageDigestDoesNotMatchException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ImageDigestDoesNotMatchException" } return *e.ErrorCodeOverride } func (e *ImageDigestDoesNotMatchException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The image requested doesn't exist in the specified repository. type ImageNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ImageNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ImageNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ImageNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ImageNotFoundException" } return *e.ErrorCodeOverride } func (e *ImageNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified image is tagged with a tag that already exists. The repository is // configured for tag immutability. type ImageTagAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ImageTagAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ImageTagAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ImageTagAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ImageTagAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *ImageTagAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The layer digest calculation performed by Amazon ECR when the image layer // doesn't match the digest specified. type InvalidLayerException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *InvalidLayerException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *InvalidLayerException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *InvalidLayerException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "InvalidLayerException" } return *e.ErrorCodeOverride } func (e *InvalidLayerException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The layer part size isn't valid, or the first byte specified isn't consecutive // to the last byte of a previous layer part upload. type InvalidLayerPartException struct { Message *string ErrorCodeOverride *string RegistryId *string RepositoryName *string UploadId *string LastValidByteReceived *int64 noSmithyDocumentSerde } func (e *InvalidLayerPartException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *InvalidLayerPartException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *InvalidLayerPartException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "InvalidLayerPartException" } return *e.ErrorCodeOverride } func (e *InvalidLayerPartException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified parameter is invalid. Review the available parameters for the API // request. type InvalidParameterException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *InvalidParameterException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *InvalidParameterException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *InvalidParameterException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "InvalidParameterException" } return *e.ErrorCodeOverride } func (e *InvalidParameterException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // An invalid parameter has been specified. Tag keys can have a maximum character // length of 128 characters, and tag values can have a maximum length of 256 // characters. type InvalidTagParameterException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *InvalidTagParameterException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *InvalidTagParameterException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *InvalidTagParameterException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "InvalidTagParameterException" } return *e.ErrorCodeOverride } func (e *InvalidTagParameterException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The image layer already exists in the associated repository. type LayerAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LayerAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LayerAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LayerAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LayerAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *LayerAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // Layer parts must be at least 5 MiB in size. type LayerPartTooSmallException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LayerPartTooSmallException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LayerPartTooSmallException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LayerPartTooSmallException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LayerPartTooSmallException" } return *e.ErrorCodeOverride } func (e *LayerPartTooSmallException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified layers can't be found, or the specified layer isn't valid for // this repository. type LayersNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LayersNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LayersNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LayersNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LayersNotFoundException" } return *e.ErrorCodeOverride } func (e *LayersNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The operation didn't succeed because it would have exceeded a service limit for // your account. For more information, see [Amazon ECR Service Quotas]in the Amazon Elastic Container // Registry User Guide. // // [Amazon ECR Service Quotas]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/service-quotas.html type LimitExceededException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *LimitExceededException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *LimitExceededException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *LimitExceededException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "LimitExceededException" } return *e.ErrorCodeOverride } func (e *LimitExceededException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The manifest list is referencing an image that doesn't exist. type ReferencedImagesNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ReferencedImagesNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ReferencedImagesNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ReferencedImagesNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ReferencedImagesNotFoundException" } return *e.ErrorCodeOverride } func (e *ReferencedImagesNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The registry doesn't exist. type RegistryNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RegistryNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RegistryNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RegistryNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RegistryNotFoundException" } return *e.ErrorCodeOverride } func (e *RegistryNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository already exists in the specified registry. type RepositoryAlreadyExistsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryAlreadyExistsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryAlreadyExistsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryAlreadyExistsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryAlreadyExistsException" } return *e.ErrorCodeOverride } func (e *RepositoryAlreadyExistsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The repository catalog data doesn't exist. type RepositoryCatalogDataNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryCatalogDataNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryCatalogDataNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryCatalogDataNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryCatalogDataNotFoundException" } return *e.ErrorCodeOverride } func (e *RepositoryCatalogDataNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository contains images. To delete a repository that contains // images, you must force the deletion with the force parameter. type RepositoryNotEmptyException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryNotEmptyException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryNotEmptyException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryNotEmptyException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryNotEmptyException" } return *e.ErrorCodeOverride } func (e *RepositoryNotEmptyException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository can't be found. Check the spelling of the specified // repository and ensure that you're performing operations on the correct registry. type RepositoryNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryNotFoundException" } return *e.ErrorCodeOverride } func (e *RepositoryNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The specified repository and registry combination doesn't have an associated // repository policy. type RepositoryPolicyNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *RepositoryPolicyNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *RepositoryPolicyNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *RepositoryPolicyNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "RepositoryPolicyNotFoundException" } return *e.ErrorCodeOverride } func (e *RepositoryPolicyNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // These errors are usually caused by a server-side issue. type ServerException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *ServerException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *ServerException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *ServerException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "ServerException" } return *e.ErrorCodeOverride } func (e *ServerException) ErrorFault() smithy.ErrorFault { return smithy.FaultServer } // The list of tags on the repository is over the limit. The maximum number of // tags that can be applied to a repository is 50. type TooManyTagsException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *TooManyTagsException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *TooManyTagsException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *TooManyTagsException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "TooManyTagsException" } return *e.ErrorCodeOverride } func (e *TooManyTagsException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The action isn't supported in this Region. type UnsupportedCommandException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UnsupportedCommandException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UnsupportedCommandException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UnsupportedCommandException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UnsupportedCommandException" } return *e.ErrorCodeOverride } func (e *UnsupportedCommandException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } // The upload can't be found, or the specified upload ID isn't valid for this // repository. type UploadNotFoundException struct { Message *string ErrorCodeOverride *string noSmithyDocumentSerde } func (e *UploadNotFoundException) Error() string { return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) } func (e *UploadNotFoundException) ErrorMessage() string { if e.Message == nil { return "" } return *e.Message } func (e *UploadNotFoundException) ErrorCode() string { if e == nil || e.ErrorCodeOverride == nil { return "UploadNotFoundException" } return *e.ErrorCodeOverride } func (e *UploadNotFoundException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/types/types.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package types import ( smithydocument "github.com/aws/smithy-go/document" "time" ) // An authorization token data object that corresponds to a public registry. type AuthorizationData struct { // A base64-encoded string that contains authorization data for a public Amazon // ECR registry. When the string is decoded, it's presented in the format // user:password for public registry authentication using docker login . AuthorizationToken *string // The Unix time in seconds and milliseconds when the authorization token expires. // Authorization tokens are valid for 12 hours. ExpiresAt *time.Time noSmithyDocumentSerde } // An object that represents an Amazon ECR image. type Image struct { // An object that contains the image tag and image digest associated with an image. ImageId *ImageIdentifier // The image manifest that's associated with the image. ImageManifest *string // The manifest media type of the image. ImageManifestMediaType *string // The Amazon Web Services account ID that's associated with the registry // containing the image. RegistryId *string // The name of the repository that's associated with the image. RepositoryName *string noSmithyDocumentSerde } // An object that describes an image that's returned by a DescribeImages operation. type ImageDetail struct { // The artifact media type of the image. ArtifactMediaType *string // The sha256 digest of the image manifest. ImageDigest *string // The media type of the image manifest. ImageManifestMediaType *string // The date and time, expressed in standard JavaScript date format, that the // current image was pushed to the repository at. ImagePushedAt *time.Time // The size, in bytes, of the image in the repository. // // If the image is a manifest list, this is the max size of all manifests in the // list. // // Beginning with Docker version 1.9, the Docker client compresses image layers // before pushing them to a V2 Docker registry. The output of the docker images // command shows the uncompressed image size, so it might return a larger image // size than the image sizes that are returned by DescribeImages. ImageSizeInBytes *int64 // The list of tags that's associated with this image. ImageTags []string // The Amazon Web Services account ID that's associated with the public registry // where this image belongs. RegistryId *string // The name of the repository where this image belongs. RepositoryName *string noSmithyDocumentSerde } // An object that represents an Amazon ECR image failure. type ImageFailure struct { // The code that's associated with the failure. FailureCode ImageFailureCode // The reason for the failure. FailureReason *string // The image ID that's associated with the failure. ImageId *ImageIdentifier noSmithyDocumentSerde } // An object with identifying information for an Amazon ECR image. type ImageIdentifier struct { // The sha256 digest of the image manifest. ImageDigest *string // The tag that's used for the image. ImageTag *string noSmithyDocumentSerde } // An object that represents the image tag details for an image. type ImageTagDetail struct { // The time stamp that indicates when the image tag was created. CreatedAt *time.Time // An object that describes the details of an image. ImageDetail *ReferencedImageDetail // The tag that's associated with the image. ImageTag *string noSmithyDocumentSerde } // An object that represents an Amazon ECR image layer. type Layer struct { // The availability status of the image layer. LayerAvailability LayerAvailability // The sha256 digest of the image layer. LayerDigest *string // The size, in bytes, of the image layer. LayerSize *int64 // The media type of the layer, such as // application/vnd.docker.image.rootfs.diff.tar.gzip or // application/vnd.oci.image.layer.v1.tar+gzip . MediaType *string noSmithyDocumentSerde } // An object that represents an Amazon ECR image layer failure. type LayerFailure struct { // The failure code that's associated with the failure. FailureCode LayerFailureCode // The reason for the failure. FailureReason *string // The layer digest that's associated with the failure. LayerDigest *string noSmithyDocumentSerde } // An object that describes the image tag details that are returned by a DescribeImageTags action. type ReferencedImageDetail struct { // The artifact media type of the image. ArtifactMediaType *string // The sha256 digest of the image manifest. ImageDigest *string // The media type of the image manifest. ImageManifestMediaType *string // The date and time, expressed in standard JavaScript date format, which the // current image tag was pushed to the repository at. ImagePushedAt *time.Time // The size, in bytes, of the image in the repository. // // If the image is a manifest list, this is the max size of all manifests in the // list. // // Beginning with Docker version 1.9, the Docker client compresses image layers // before pushing them to a V2 Docker registry. The output of the docker images // command shows the uncompressed image size, so it might return a larger image // size than the image sizes that are returned by DescribeImages. ImageSizeInBytes *int64 noSmithyDocumentSerde } // The details of a public registry. type Registry struct { // An array of objects that represents the aliases for a public registry. // // This member is required. Aliases []RegistryAlias // The Amazon Resource Name (ARN) of the public registry. // // This member is required. RegistryArn *string // The Amazon Web Services account ID that's associated with the registry. If you // do not specify a registry, the default public registry is assumed. // // This member is required. RegistryId *string // The URI of a public registry. The URI contains a universal prefix and the // registry alias. // // This member is required. RegistryUri *string // Indicates whether the account is a verified Amazon Web Services Marketplace // vendor. If an account is verified, each public repository receives a verified // account badge on the Amazon ECR Public Gallery. // // This member is required. Verified *bool noSmithyDocumentSerde } // An object representing the aliases for a public registry. A public registry is // given an alias when it's created. However, a custom alias can be set using the // Amazon ECR console. For more information, see [Registries]in the Amazon Elastic Container // Registry User Guide. // // [Registries]: https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html type RegistryAlias struct { // Indicates whether the registry alias is the default alias for the registry. // When the first public repository is created, your public registry is assigned a // default registry alias. // // This member is required. DefaultRegistryAlias bool // The name of the registry alias. // // This member is required. Name *string // Indicates whether the registry alias is the primary alias for the registry. If // true, the alias is the primary registry alias and is displayed in both the // repository URL and the image URI used in the docker pull commands on the Amazon // ECR Public Gallery. // // A registry alias that isn't the primary registry alias can be used in the // repository URI in a docker pull command. // // This member is required. PrimaryRegistryAlias bool // The status of the registry alias. // // This member is required. Status RegistryAliasStatus noSmithyDocumentSerde } // The metadata for a public registry. type RegistryCatalogData struct { // The display name for a public registry. This appears on the Amazon ECR Public // Gallery. // // Only accounts that have the verified account badge can have a registry display // name. DisplayName *string noSmithyDocumentSerde } // An object representing a repository. type Repository struct { // The date and time, in JavaScript date format, when the repository was created. CreatedAt *time.Time // The Amazon Web Services account ID that's associated with the public registry // that contains the repository. RegistryId *string // The Amazon Resource Name (ARN) that identifies the repository. The ARN contains // the arn:aws:ecr namespace, followed by the region of the repository, Amazon Web // Services account ID of the repository owner, repository namespace, and // repository name. For example, arn:aws:ecr:region:012345678910:repository/test . RepositoryArn *string // The name of the repository. RepositoryName *string // The URI for the repository. You can use this URI for container image push and // pull operations. RepositoryUri *string noSmithyDocumentSerde } // The catalog data for a repository. This data is publicly visible in the Amazon // ECR Public Gallery. type RepositoryCatalogData struct { // The longform description of the contents of the repository. This text appears // in the repository details on the Amazon ECR Public Gallery. AboutText *string // The architecture tags that are associated with the repository. // // Only supported operating system tags appear publicly in the Amazon ECR Public // Gallery. For more information, see RepositoryCatalogDataInput. Architectures []string // The short description of the repository. Description *string // The URL that contains the logo that's associated with the repository. LogoUrl *string // Indicates whether the repository is certified by Amazon Web Services // Marketplace. MarketplaceCertified *bool // The operating system tags that are associated with the repository. // // Only supported operating system tags appear publicly in the Amazon ECR Public // Gallery. For more information, see RepositoryCatalogDataInput. OperatingSystems []string // The longform usage details of the contents of the repository. The usage text // provides context for users of the repository. UsageText *string noSmithyDocumentSerde } // An object that contains the catalog data for a repository. This data is // publicly visible in the Amazon ECR Public Gallery. type RepositoryCatalogDataInput struct { // A detailed description of the contents of the repository. It's publicly visible // in the Amazon ECR Public Gallery. The text must be in markdown format. AboutText *string // The system architecture that the images in the repository are compatible with. // On the Amazon ECR Public Gallery, the following supported architectures appear // as badges on the repository and are used as search filters. // // If an unsupported tag is added to your repository catalog data, it's associated // with the repository and can be retrieved using the API but isn't discoverable in // the Amazon ECR Public Gallery. // // - ARM // // - ARM 64 // // - x86 // // - x86-64 Architectures []string // A short description of the contents of the repository. This text appears in // both the image details and also when searching for repositories on the Amazon // ECR Public Gallery. Description *string // The base64-encoded repository logo payload. // // The repository logo is only publicly visible in the Amazon ECR Public Gallery // for verified accounts. LogoImageBlob []byte // The operating systems that the images in the repository are compatible with. On // the Amazon ECR Public Gallery, the following supported operating systems appear // as badges on the repository and are used as search filters. // // If an unsupported tag is added to your repository catalog data, it's associated // with the repository and can be retrieved using the API but isn't discoverable in // the Amazon ECR Public Gallery. // // - Linux // // - Windows OperatingSystems []string // Detailed information about how to use the contents of the repository. It's // publicly visible in the Amazon ECR Public Gallery. The usage text provides // context, support information, and additional usage details for users of the // repository. The text must be in markdown format. UsageText *string noSmithyDocumentSerde } // The metadata that you apply to a resource to help you categorize and organize // them. Each tag consists of a key and an optional value. You define both. Tag // keys can have a maximum character length of 128 characters, and tag values can // have a maximum length of 256 characters. type Tag struct { // One part of a key-value pair that make up a tag. A key is a general label that // acts like a category for more specific tag values. Key *string // The optional part of a key-value pair that make up a tag. A value acts as a // descriptor within a tag category (key). Value *string noSmithyDocumentSerde } type noSmithyDocumentSerde = smithydocument.NoSerde ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/validators.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package ecrpublic import ( "context" "fmt" smithy "github.com/aws/smithy-go" "github.com/aws/smithy-go/middleware" ) type validateOpBatchCheckLayerAvailability struct { } func (*validateOpBatchCheckLayerAvailability) ID() string { return "OperationInputValidation" } func (m *validateOpBatchCheckLayerAvailability) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*BatchCheckLayerAvailabilityInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpBatchCheckLayerAvailabilityInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpBatchDeleteImage struct { } func (*validateOpBatchDeleteImage) ID() string { return "OperationInputValidation" } func (m *validateOpBatchDeleteImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*BatchDeleteImageInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpBatchDeleteImageInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpCompleteLayerUpload struct { } func (*validateOpCompleteLayerUpload) ID() string { return "OperationInputValidation" } func (m *validateOpCompleteLayerUpload) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*CompleteLayerUploadInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpCompleteLayerUploadInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpCreateRepository struct { } func (*validateOpCreateRepository) ID() string { return "OperationInputValidation" } func (m *validateOpCreateRepository) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*CreateRepositoryInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpCreateRepositoryInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDeleteRepository struct { } func (*validateOpDeleteRepository) ID() string { return "OperationInputValidation" } func (m *validateOpDeleteRepository) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DeleteRepositoryInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDeleteRepositoryInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDeleteRepositoryPolicy struct { } func (*validateOpDeleteRepositoryPolicy) ID() string { return "OperationInputValidation" } func (m *validateOpDeleteRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DeleteRepositoryPolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDeleteRepositoryPolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDescribeImages struct { } func (*validateOpDescribeImages) ID() string { return "OperationInputValidation" } func (m *validateOpDescribeImages) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DescribeImagesInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDescribeImagesInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpDescribeImageTags struct { } func (*validateOpDescribeImageTags) ID() string { return "OperationInputValidation" } func (m *validateOpDescribeImageTags) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*DescribeImageTagsInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpDescribeImageTagsInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpGetRepositoryCatalogData struct { } func (*validateOpGetRepositoryCatalogData) ID() string { return "OperationInputValidation" } func (m *validateOpGetRepositoryCatalogData) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*GetRepositoryCatalogDataInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpGetRepositoryCatalogDataInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpGetRepositoryPolicy struct { } func (*validateOpGetRepositoryPolicy) ID() string { return "OperationInputValidation" } func (m *validateOpGetRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*GetRepositoryPolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpGetRepositoryPolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpInitiateLayerUpload struct { } func (*validateOpInitiateLayerUpload) ID() string { return "OperationInputValidation" } func (m *validateOpInitiateLayerUpload) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*InitiateLayerUploadInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpInitiateLayerUploadInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpListTagsForResource struct { } func (*validateOpListTagsForResource) ID() string { return "OperationInputValidation" } func (m *validateOpListTagsForResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*ListTagsForResourceInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpListTagsForResourceInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutImage struct { } func (*validateOpPutImage) ID() string { return "OperationInputValidation" } func (m *validateOpPutImage) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutImageInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutImageInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpPutRepositoryCatalogData struct { } func (*validateOpPutRepositoryCatalogData) ID() string { return "OperationInputValidation" } func (m *validateOpPutRepositoryCatalogData) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*PutRepositoryCatalogDataInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpPutRepositoryCatalogDataInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpSetRepositoryPolicy struct { } func (*validateOpSetRepositoryPolicy) ID() string { return "OperationInputValidation" } func (m *validateOpSetRepositoryPolicy) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*SetRepositoryPolicyInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpSetRepositoryPolicyInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpTagResource struct { } func (*validateOpTagResource) ID() string { return "OperationInputValidation" } func (m *validateOpTagResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*TagResourceInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpTagResourceInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpUntagResource struct { } func (*validateOpUntagResource) ID() string { return "OperationInputValidation" } func (m *validateOpUntagResource) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*UntagResourceInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpUntagResourceInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } type validateOpUploadLayerPart struct { } func (*validateOpUploadLayerPart) ID() string { return "OperationInputValidation" } func (m *validateOpUploadLayerPart) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*UploadLayerPartInput) if !ok { return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) } if err := validateOpUploadLayerPartInput(input); err != nil { return out, metadata, err } return next.HandleInitialize(ctx, in) } func addOpBatchCheckLayerAvailabilityValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpBatchCheckLayerAvailability{}, middleware.After) } func addOpBatchDeleteImageValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpBatchDeleteImage{}, middleware.After) } func addOpCompleteLayerUploadValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpCompleteLayerUpload{}, middleware.After) } func addOpCreateRepositoryValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpCreateRepository{}, middleware.After) } func addOpDeleteRepositoryValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDeleteRepository{}, middleware.After) } func addOpDeleteRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDeleteRepositoryPolicy{}, middleware.After) } func addOpDescribeImagesValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDescribeImages{}, middleware.After) } func addOpDescribeImageTagsValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpDescribeImageTags{}, middleware.After) } func addOpGetRepositoryCatalogDataValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetRepositoryCatalogData{}, middleware.After) } func addOpGetRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetRepositoryPolicy{}, middleware.After) } func addOpInitiateLayerUploadValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpInitiateLayerUpload{}, middleware.After) } func addOpListTagsForResourceValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpListTagsForResource{}, middleware.After) } func addOpPutImageValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutImage{}, middleware.After) } func addOpPutRepositoryCatalogDataValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpPutRepositoryCatalogData{}, middleware.After) } func addOpSetRepositoryPolicyValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpSetRepositoryPolicy{}, middleware.After) } func addOpTagResourceValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpTagResource{}, middleware.After) } func addOpUntagResourceValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpUntagResource{}, middleware.After) } func addOpUploadLayerPartValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpUploadLayerPart{}, middleware.After) } func validateOpBatchCheckLayerAvailabilityInput(v *BatchCheckLayerAvailabilityInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "BatchCheckLayerAvailabilityInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.LayerDigests == nil { invalidParams.Add(smithy.NewErrParamRequired("LayerDigests")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpBatchDeleteImageInput(v *BatchDeleteImageInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "BatchDeleteImageInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageIds == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageIds")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpCompleteLayerUploadInput(v *CompleteLayerUploadInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "CompleteLayerUploadInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.UploadId == nil { invalidParams.Add(smithy.NewErrParamRequired("UploadId")) } if v.LayerDigests == nil { invalidParams.Add(smithy.NewErrParamRequired("LayerDigests")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpCreateRepositoryInput(v *CreateRepositoryInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "CreateRepositoryInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDeleteRepositoryInput(v *DeleteRepositoryInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DeleteRepositoryInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDeleteRepositoryPolicyInput(v *DeleteRepositoryPolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DeleteRepositoryPolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDescribeImagesInput(v *DescribeImagesInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DescribeImagesInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpDescribeImageTagsInput(v *DescribeImageTagsInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "DescribeImageTagsInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpGetRepositoryCatalogDataInput(v *GetRepositoryCatalogDataInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "GetRepositoryCatalogDataInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpGetRepositoryPolicyInput(v *GetRepositoryPolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "GetRepositoryPolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpInitiateLayerUploadInput(v *InitiateLayerUploadInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "InitiateLayerUploadInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpListTagsForResourceInput(v *ListTagsForResourceInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "ListTagsForResourceInput"} if v.ResourceArn == nil { invalidParams.Add(smithy.NewErrParamRequired("ResourceArn")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutImageInput(v *PutImageInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutImageInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.ImageManifest == nil { invalidParams.Add(smithy.NewErrParamRequired("ImageManifest")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpPutRepositoryCatalogDataInput(v *PutRepositoryCatalogDataInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "PutRepositoryCatalogDataInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.CatalogData == nil { invalidParams.Add(smithy.NewErrParamRequired("CatalogData")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpSetRepositoryPolicyInput(v *SetRepositoryPolicyInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "SetRepositoryPolicyInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.PolicyText == nil { invalidParams.Add(smithy.NewErrParamRequired("PolicyText")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpTagResourceInput(v *TagResourceInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "TagResourceInput"} if v.ResourceArn == nil { invalidParams.Add(smithy.NewErrParamRequired("ResourceArn")) } if v.Tags == nil { invalidParams.Add(smithy.NewErrParamRequired("Tags")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpUntagResourceInput(v *UntagResourceInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "UntagResourceInput"} if v.ResourceArn == nil { invalidParams.Add(smithy.NewErrParamRequired("ResourceArn")) } if v.TagKeys == nil { invalidParams.Add(smithy.NewErrParamRequired("TagKeys")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } func validateOpUploadLayerPartInput(v *UploadLayerPartInput) error { if v == nil { return nil } invalidParams := smithy.InvalidParamsError{Context: "UploadLayerPartInput"} if v.RepositoryName == nil { invalidParams.Add(smithy.NewErrParamRequired("RepositoryName")) } if v.UploadId == nil { invalidParams.Add(smithy.NewErrParamRequired("UploadId")) } if v.PartFirstByte == nil { invalidParams.Add(smithy.NewErrParamRequired("PartFirstByte")) } if v.PartLastByte == nil { invalidParams.Add(smithy.NewErrParamRequired("PartLastByte")) } if v.LayerPartBlob == nil { invalidParams.Add(smithy.NewErrParamRequired("LayerPartBlob")) } if invalidParams.Len() > 0 { return invalidParams } else { return nil } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md ================================================ # v1.12.3 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 # v1.12.2 (2025-01-24) * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.12.1 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. # v1.12.0 (2024-10-04) * **Feature**: Add support for HTTP client metrics. # v1.11.5 (2024-09-20) * No change notes available for this release. # v1.11.4 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. # v1.11.3 (2024-06-28) * No change notes available for this release. # v1.11.2 (2024-03-29) * No change notes available for this release. # v1.11.1 (2024-02-21) * No change notes available for this release. # v1.11.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. # v1.10.4 (2023-12-07) * No change notes available for this release. # v1.10.3 (2023-11-30) * No change notes available for this release. # v1.10.2 (2023-11-29) * No change notes available for this release. # v1.10.1 (2023-11-15) * No change notes available for this release. # v1.10.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). # v1.9.15 (2023-10-06) * No change notes available for this release. # v1.9.14 (2023-08-18) * No change notes available for this release. # v1.9.13 (2023-08-07) * No change notes available for this release. # v1.9.12 (2023-07-31) * No change notes available for this release. # v1.9.11 (2022-12-02) * No change notes available for this release. # v1.9.10 (2022-10-24) * No change notes available for this release. # v1.9.9 (2022-09-14) * No change notes available for this release. # v1.9.8 (2022-09-02) * No change notes available for this release. # v1.9.7 (2022-08-31) * No change notes available for this release. # v1.9.6 (2022-08-29) * No change notes available for this release. # v1.9.5 (2022-08-11) * No change notes available for this release. # v1.9.4 (2022-08-09) * No change notes available for this release. # v1.9.3 (2022-06-29) * No change notes available for this release. # v1.9.2 (2022-06-07) * No change notes available for this release. # v1.9.1 (2022-03-24) * No change notes available for this release. # v1.9.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.8.0 (2022-02-24) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.7.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.6.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.5.0 (2021-11-06) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.4.0 (2021-10-21) * **Feature**: Updated to latest version # v1.3.0 (2021-08-27) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.2.2 (2021-08-04) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. # v1.2.1 (2021-07-15) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version # v1.2.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version # v1.1.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/accept_encoding_gzip.go ================================================ package acceptencoding import ( "compress/gzip" "context" "fmt" "io" "github.com/aws/smithy-go" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const acceptEncodingHeaderKey = "Accept-Encoding" const contentEncodingHeaderKey = "Content-Encoding" // AddAcceptEncodingGzipOptions provides the options for the // AddAcceptEncodingGzip middleware setup. type AddAcceptEncodingGzipOptions struct { Enable bool } // AddAcceptEncodingGzip explicitly adds handling for accept-encoding GZIP // middleware to the operation stack. This allows checksums to be correctly // computed without disabling GZIP support. func AddAcceptEncodingGzip(stack *middleware.Stack, options AddAcceptEncodingGzipOptions) error { if options.Enable { if err := stack.Finalize.Add(&EnableGzip{}, middleware.Before); err != nil { return err } if err := stack.Deserialize.Insert(&DecompressGzip{}, "OperationDeserializer", middleware.After); err != nil { return err } return nil } return stack.Finalize.Add(&DisableGzip{}, middleware.Before) } // DisableGzip provides the middleware that will // disable the underlying http client automatically enabling for gzip // decompress content-encoding support. type DisableGzip struct{} // ID returns the id for the middleware. func (*DisableGzip) ID() string { return "DisableAcceptEncodingGzip" } // HandleFinalize implements the FinalizeMiddleware interface. func (*DisableGzip) HandleFinalize( ctx context.Context, input middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( output middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := input.Request.(*smithyhttp.Request) if !ok { return output, metadata, &smithy.SerializationError{ Err: fmt.Errorf("unknown request type %T", input.Request), } } // Explicitly enable gzip support, this will prevent the http client from // auto extracting the zipped content. req.Header.Set(acceptEncodingHeaderKey, "identity") return next.HandleFinalize(ctx, input) } // EnableGzip provides a middleware to enable support for // gzip responses, with manual decompression. This prevents the underlying HTTP // client from performing the gzip decompression automatically. type EnableGzip struct{} // ID returns the id for the middleware. func (*EnableGzip) ID() string { return "AcceptEncodingGzip" } // HandleFinalize implements the FinalizeMiddleware interface. func (*EnableGzip) HandleFinalize( ctx context.Context, input middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( output middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := input.Request.(*smithyhttp.Request) if !ok { return output, metadata, &smithy.SerializationError{ Err: fmt.Errorf("unknown request type %T", input.Request), } } // Explicitly enable gzip support, this will prevent the http client from // auto extracting the zipped content. req.Header.Set(acceptEncodingHeaderKey, "gzip") return next.HandleFinalize(ctx, input) } // DecompressGzip provides the middleware for decompressing a gzip // response from the service. type DecompressGzip struct{} // ID returns the id for the middleware. func (*DecompressGzip) ID() string { return "DecompressGzip" } // HandleDeserialize implements the DeserializeMiddlware interface. func (*DecompressGzip) HandleDeserialize( ctx context.Context, input middleware.DeserializeInput, next middleware.DeserializeHandler, ) ( output middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { output, metadata, err = next.HandleDeserialize(ctx, input) if err != nil { return output, metadata, err } resp, ok := output.RawResponse.(*smithyhttp.Response) if !ok { return output, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("unknown response type %T", output.RawResponse), } } if v := resp.Header.Get(contentEncodingHeaderKey); v != "gzip" { return output, metadata, err } // Clear content length since it will no longer be valid once the response // body is decompressed. resp.Header.Del("Content-Length") resp.ContentLength = -1 resp.Body = wrapGzipReader(resp.Body) return output, metadata, err } type gzipReader struct { reader io.ReadCloser gzip *gzip.Reader } func wrapGzipReader(reader io.ReadCloser) *gzipReader { return &gzipReader{ reader: reader, } } // Read wraps the gzip reader around the underlying io.Reader to extract the // response bytes on the fly. func (g *gzipReader) Read(b []byte) (n int, err error) { if g.gzip == nil { g.gzip, err = gzip.NewReader(g.reader) if err != nil { g.gzip = nil // ensure uninitialized gzip value isn't used in close. return 0, fmt.Errorf("failed to decompress gzip response, %w", err) } } return g.gzip.Read(b) } func (g *gzipReader) Close() error { if g.gzip == nil { return nil } if err := g.gzip.Close(); err != nil { g.reader.Close() return fmt.Errorf("failed to decompress gzip response, %w", err) } return g.reader.Close() } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/doc.go ================================================ /* Package acceptencoding provides customizations associated with Accept Encoding Header. # Accept encoding gzip The Go HTTP client automatically supports accept-encoding and content-encoding gzip by default. This default behavior is not desired by the SDK, and prevents validating the response body's checksum. To prevent this the SDK must manually control usage of content-encoding gzip. To control content-encoding, the SDK must always set the `Accept-Encoding` header to a value. This prevents the HTTP client from using gzip automatically. When gzip is enabled on the API client, the SDK's customization will control decompressing the gzip data in order to not break the checksum validation. When gzip is disabled, the API client will disable gzip, preventing the HTTP client's default behavior. An `EnableAcceptEncodingGzip` option may or may not be present depending on the client using the below middleware. The option if present can be used to enable auto decompressing gzip by the SDK. */ package acceptencoding ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package acceptencoding // goModuleVersion is the tagged release for this module const goModuleVersion = "1.12.3" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md ================================================ # v1.7.1 (2025-04-28) * **Bug Fix**: Don't emit warnings about lack of checksum validation for non-200 responses. # v1.7.0 (2025-03-11) * **Feature**: Add extra check during output checksum validation so the validation skip warning would not be logged if object is not fetched from s3 # v1.6.2 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.6.1 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.6.0 (2025-02-10) * **Feature**: Support CRC64NVME flex checksums. # v1.5.6 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.5 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.4 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.3 (2025-01-24) * **Bug Fix**: Enable request checksum validation mode by default * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.5.2 (2025-01-17) * **Bug Fix**: Fix bug where credentials weren't refreshed during retry loop. # v1.5.1 (2025-01-16) * **Bug Fix**: Fix nil dereference panic for operations that require checksums, but do not have an input setting for which algorithm to use. # v1.5.0 (2025-01-15) * **Feature**: S3 client behavior is updated to always calculate a checksum by default for operations that support it (such as PutObject or UploadPart), or require it (such as DeleteObjects). The checksum algorithm used by default now becomes CRC32. Checksum behavior can be configured using `when_supported` and `when_required` options - in code using RequestChecksumCalculation, in shared config using request_checksum_calculation, or as env variable using AWS_REQUEST_CHECKSUM_CALCULATION. The S3 client attempts to validate response checksums for all S3 API operations that support checksums. However, if the SDK has not implemented the specified checksum algorithm then this validation is skipped. Checksum validation behavior can be configured using `when_supported` and `when_required` options - in code using ResponseChecksumValidation, in shared config using response_checksum_validation, or as env variable using AWS_RESPONSE_CHECKSUM_VALIDATION. * **Dependency Update**: Updated to the latest SDK module versions # v1.4.8 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.7 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.6 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.5 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.4.4 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.3 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.2 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.1 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2024-10-04) * **Feature**: Add support for HTTP client metrics. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.20 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.19 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.18 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.17 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.16 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.15 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.14 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.13 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.12 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.11 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.10 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.9 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.8 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.7 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.6 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.5 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.3.4 (2024-03-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.3 (2024-03-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.2 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.2.10 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.9 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.8 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.7 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.6 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.5 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.4 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.3 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.2 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.1.38 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.37 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.36 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.35 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.34 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.33 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.32 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.31 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.30 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.29 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.28 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.27 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.26 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.25 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.24 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.23 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.22 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.21 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.20 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.19 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.18 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.17 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.16 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.15 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.14 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.13 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.12 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.11 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.10 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.9 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.8 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.7 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.6 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.5 (2022-04-27) * **Bug Fix**: Fixes a bug that could cause the SigV4 payload hash to be incorrectly encoded, leading to signing errors. # v1.1.4 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.0 (2022-03-08) * **Feature**: Updates the SDK's checksum validation logic to require opt-in to output response payload validation. The SDK was always preforming output response payload checksum validation, not respecting the output validation model option. Fixes [#1606](https://github.com/aws/aws-sdk-go-v2/issues/1606) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.0.0 (2022-02-24) * **Release**: New module for computing checksums * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/algorithms.go ================================================ package checksum import ( "crypto/md5" "crypto/sha1" "crypto/sha256" "encoding/base64" "encoding/hex" "fmt" "hash" "hash/crc32" "hash/crc64" "io" "strings" "sync" ) // Algorithm represents the checksum algorithms supported type Algorithm string // Enumeration values for supported checksum Algorithms. const ( // AlgorithmCRC32C represents CRC32C hash algorithm AlgorithmCRC32C Algorithm = "CRC32C" // AlgorithmCRC32 represents CRC32 hash algorithm AlgorithmCRC32 Algorithm = "CRC32" // AlgorithmSHA1 represents SHA1 hash algorithm AlgorithmSHA1 Algorithm = "SHA1" // AlgorithmSHA256 represents SHA256 hash algorithm AlgorithmSHA256 Algorithm = "SHA256" // AlgorithmCRC64NVME represents CRC64NVME hash algorithm AlgorithmCRC64NVME Algorithm = "CRC64NVME" ) // inverted NVME polynomial as required by crc64.MakeTable const crc64NVME = 0x9a6c_9329_ac4b_c9b5 var supportedAlgorithms = []Algorithm{ AlgorithmCRC32C, AlgorithmCRC32, AlgorithmSHA1, AlgorithmSHA256, AlgorithmCRC64NVME, } func (a Algorithm) String() string { return string(a) } // ParseAlgorithm attempts to parse the provided value into a checksum // algorithm, matching without case. Returns the algorithm matched, or an error // if the algorithm wasn't matched. func ParseAlgorithm(v string) (Algorithm, error) { for _, a := range supportedAlgorithms { if strings.EqualFold(string(a), v) { return a, nil } } return "", fmt.Errorf("unknown checksum algorithm, %v", v) } // FilterSupportedAlgorithms filters the set of algorithms, returning a slice // of algorithms that are supported. func FilterSupportedAlgorithms(vs []string) []Algorithm { found := map[Algorithm]struct{}{} supported := make([]Algorithm, 0, len(supportedAlgorithms)) for _, v := range vs { for _, a := range supportedAlgorithms { // Only consider algorithms that are supported if !strings.EqualFold(v, string(a)) { continue } // Ignore duplicate algorithms in list. if _, ok := found[a]; ok { continue } supported = append(supported, a) found[a] = struct{}{} } } return supported } // NewAlgorithmHash returns a hash.Hash for the checksum algorithm. Error is // returned if the algorithm is unknown. func NewAlgorithmHash(v Algorithm) (hash.Hash, error) { switch v { case AlgorithmSHA1: return sha1.New(), nil case AlgorithmSHA256: return sha256.New(), nil case AlgorithmCRC32: return crc32.NewIEEE(), nil case AlgorithmCRC32C: return crc32.New(crc32.MakeTable(crc32.Castagnoli)), nil case AlgorithmCRC64NVME: return crc64.New(crc64.MakeTable(crc64NVME)), nil default: return nil, fmt.Errorf("unknown checksum algorithm, %v", v) } } // AlgorithmChecksumLength returns the length of the algorithm's checksum in // bytes. If the algorithm is not known, an error is returned. func AlgorithmChecksumLength(v Algorithm) (int, error) { switch v { case AlgorithmSHA1: return sha1.Size, nil case AlgorithmSHA256: return sha256.Size, nil case AlgorithmCRC32: return crc32.Size, nil case AlgorithmCRC32C: return crc32.Size, nil case AlgorithmCRC64NVME: return crc64.Size, nil default: return 0, fmt.Errorf("unknown checksum algorithm, %v", v) } } const awsChecksumHeaderPrefix = "x-amz-checksum-" // AlgorithmHTTPHeader returns the HTTP header for the algorithm's hash. func AlgorithmHTTPHeader(v Algorithm) string { return awsChecksumHeaderPrefix + strings.ToLower(string(v)) } // base64EncodeHashSum computes base64 encoded checksum of a given running // hash. The running hash must already have content written to it. Returns the // byte slice of checksum and an error func base64EncodeHashSum(h hash.Hash) []byte { sum := h.Sum(nil) sum64 := make([]byte, base64.StdEncoding.EncodedLen(len(sum))) base64.StdEncoding.Encode(sum64, sum) return sum64 } // hexEncodeHashSum computes hex encoded checksum of a given running hash. The // running hash must already have content written to it. Returns the byte slice // of checksum and an error func hexEncodeHashSum(h hash.Hash) []byte { sum := h.Sum(nil) sumHex := make([]byte, hex.EncodedLen(len(sum))) hex.Encode(sumHex, sum) return sumHex } // computeMD5Checksum computes base64 MD5 checksum of an io.Reader's contents. // Returns the byte slice of MD5 checksum and an error. func computeMD5Checksum(r io.Reader) ([]byte, error) { h := md5.New() // Copy errors may be assumed to be from the body. if _, err := io.Copy(h, r); err != nil { return nil, fmt.Errorf("failed compute MD5 hash of reader, %w", err) } // Encode the MD5 checksum in base64. return base64EncodeHashSum(h), nil } // computeChecksumReader provides a reader wrapping an underlying io.Reader to // compute the checksum of the stream's bytes. type computeChecksumReader struct { stream io.Reader algorithm Algorithm hasher hash.Hash base64ChecksumLen int mux sync.RWMutex lockedChecksum string lockedErr error } // newComputeChecksumReader returns a computeChecksumReader for the stream and // algorithm specified. Returns error if unable to create the reader, or // algorithm is unknown. func newComputeChecksumReader(stream io.Reader, algorithm Algorithm) (*computeChecksumReader, error) { hasher, err := NewAlgorithmHash(algorithm) if err != nil { return nil, err } checksumLength, err := AlgorithmChecksumLength(algorithm) if err != nil { return nil, err } return &computeChecksumReader{ stream: io.TeeReader(stream, hasher), algorithm: algorithm, hasher: hasher, base64ChecksumLen: base64.StdEncoding.EncodedLen(checksumLength), }, nil } // Read wraps the underlying reader. When the underlying reader returns EOF, // the checksum of the reader will be computed, and can be retrieved with // ChecksumBase64String. func (r *computeChecksumReader) Read(p []byte) (int, error) { n, err := r.stream.Read(p) if err == nil { return n, nil } else if err != io.EOF { r.mux.Lock() defer r.mux.Unlock() r.lockedErr = err return n, err } b := base64EncodeHashSum(r.hasher) r.mux.Lock() defer r.mux.Unlock() r.lockedChecksum = string(b) return n, err } func (r *computeChecksumReader) Algorithm() Algorithm { return r.algorithm } // Base64ChecksumLength returns the base64 encoded length of the checksum for // algorithm. func (r *computeChecksumReader) Base64ChecksumLength() int { return r.base64ChecksumLen } // Base64Checksum returns the base64 checksum for the algorithm, or error if // the underlying reader returned a non-EOF error. // // Safe to be called concurrently, but will return an error until after the // underlying reader is returns EOF. func (r *computeChecksumReader) Base64Checksum() (string, error) { r.mux.RLock() defer r.mux.RUnlock() if r.lockedErr != nil { return "", r.lockedErr } if r.lockedChecksum == "" { return "", fmt.Errorf( "checksum not available yet, called before reader returns EOF", ) } return r.lockedChecksum, nil } // validateChecksumReader implements io.ReadCloser interface. The wrapper // performs checksum validation when the underlying reader has been fully read. type validateChecksumReader struct { originalBody io.ReadCloser body io.Reader hasher hash.Hash algorithm Algorithm expectChecksum string } // newValidateChecksumReader returns a configured io.ReadCloser that performs // checksum validation when the underlying reader has been fully read. func newValidateChecksumReader( body io.ReadCloser, algorithm Algorithm, expectChecksum string, ) (*validateChecksumReader, error) { hasher, err := NewAlgorithmHash(algorithm) if err != nil { return nil, err } return &validateChecksumReader{ originalBody: body, body: io.TeeReader(body, hasher), hasher: hasher, algorithm: algorithm, expectChecksum: expectChecksum, }, nil } // Read attempts to read from the underlying stream while also updating the // running hash. If the underlying stream returns with an EOF error, the // checksum of the stream will be collected, and compared against the expected // checksum. If the checksums do not match, an error will be returned. // // If a non-EOF error occurs when reading the underlying stream, that error // will be returned and the checksum for the stream will be discarded. func (c *validateChecksumReader) Read(p []byte) (n int, err error) { n, err = c.body.Read(p) if err == io.EOF { if checksumErr := c.validateChecksum(); checksumErr != nil { return n, checksumErr } } return n, err } // Close closes the underlying reader, returning any error that occurred in the // underlying reader. func (c *validateChecksumReader) Close() (err error) { return c.originalBody.Close() } func (c *validateChecksumReader) validateChecksum() error { // Compute base64 encoded checksum hash of the payload's read bytes. v := base64EncodeHashSum(c.hasher) if e, a := c.expectChecksum, string(v); !strings.EqualFold(e, a) { return validationError{ Algorithm: c.algorithm, Expect: e, Actual: a, } } return nil } type validationError struct { Algorithm Algorithm Expect string Actual string } func (v validationError) Error() string { return fmt.Sprintf("checksum did not match: algorithm %v, expect %v, actual %v", v.Algorithm, v.Expect, v.Actual) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/aws_chunked_encoding.go ================================================ package checksum import ( "bytes" "fmt" "io" "strconv" "strings" ) const ( crlf = "\r\n" // https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html defaultChunkLength = 1024 * 64 awsTrailerHeaderName = "x-amz-trailer" decodedContentLengthHeaderName = "x-amz-decoded-content-length" contentEncodingHeaderName = "content-encoding" awsChunkedContentEncodingHeaderValue = "aws-chunked" trailerKeyValueSeparator = ":" ) var ( crlfBytes = []byte(crlf) finalChunkBytes = []byte("0" + crlf) ) type awsChunkedEncodingOptions struct { // The total size of the stream. For unsigned encoding this implies that // there will only be a single chunk containing the underlying payload, // unless ChunkLength is also specified. StreamLength int64 // Set of trailer key:value pairs that will be appended to the end of the // payload after the end chunk has been written. Trailers map[string]awsChunkedTrailerValue // The maximum size of each chunk to be sent. Default value of -1, signals // that optimal chunk length will be used automatically. ChunkSize must be // at least 8KB. // // If ChunkLength and StreamLength are both specified, the stream will be // broken up into ChunkLength chunks. The encoded length of the aws-chunked // encoding can still be determined as long as all trailers, if any, have a // fixed length. ChunkLength int } type awsChunkedTrailerValue struct { // Function to retrieve the value of the trailer. Will only be called after // the underlying stream returns EOF error. Get func() (string, error) // If the length of the value can be pre-determined, and is constant // specify the length. A value of -1 means the length is unknown, or // cannot be pre-determined. Length int } // awsChunkedEncoding provides a reader that wraps the payload such that // payload is read as a single aws-chunk payload. This reader can only be used // if the content length of payload is known. Content-Length is used as size of // the single payload chunk. The final chunk and trailing checksum is appended // at the end. // // https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#sigv4-chunked-body-definition // // Here is the aws-chunked payload stream as read from the awsChunkedEncoding // if original request stream is "Hello world", and checksum hash used is SHA256 // // \r\n // Hello world\r\n // 0\r\n // x-amz-checksum-sha256:ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\r\n // \r\n type awsChunkedEncoding struct { options awsChunkedEncodingOptions encodedStream io.Reader trailerEncodedLength int } // newUnsignedAWSChunkedEncoding returns a new awsChunkedEncoding configured // for unsigned aws-chunked content encoding. Any additional trailers that need // to be appended after the end chunk must be included as via Trailer // callbacks. func newUnsignedAWSChunkedEncoding( stream io.Reader, optFns ...func(*awsChunkedEncodingOptions), ) *awsChunkedEncoding { options := awsChunkedEncodingOptions{ Trailers: map[string]awsChunkedTrailerValue{}, StreamLength: -1, ChunkLength: -1, } for _, fn := range optFns { fn(&options) } var chunkReader io.Reader if options.ChunkLength != -1 || options.StreamLength == -1 { if options.ChunkLength == -1 { options.ChunkLength = defaultChunkLength } chunkReader = newBufferedAWSChunkReader(stream, options.ChunkLength) } else { chunkReader = newUnsignedChunkReader(stream, options.StreamLength) } trailerReader := newAWSChunkedTrailerReader(options.Trailers) return &awsChunkedEncoding{ options: options, encodedStream: io.MultiReader(chunkReader, trailerReader, bytes.NewBuffer(crlfBytes), ), trailerEncodedLength: trailerReader.EncodedLength(), } } // EncodedLength returns the final length of the aws-chunked content encoded // stream if it can be determined without reading the underlying stream or lazy // header values, otherwise -1 is returned. func (e *awsChunkedEncoding) EncodedLength() int64 { var length int64 if e.options.StreamLength == -1 || e.trailerEncodedLength == -1 { return -1 } if e.options.StreamLength != 0 { // If the stream length is known, and there is no chunk length specified, // only a single chunk will be used. Otherwise the stream length needs to // include the multiple chunk padding content. if e.options.ChunkLength == -1 { length += getUnsignedChunkBytesLength(e.options.StreamLength) } else { // Compute chunk header and payload length numChunks := e.options.StreamLength / int64(e.options.ChunkLength) length += numChunks * getUnsignedChunkBytesLength(int64(e.options.ChunkLength)) if remainder := e.options.StreamLength % int64(e.options.ChunkLength); remainder != 0 { length += getUnsignedChunkBytesLength(remainder) } } } // End chunk length += int64(len(finalChunkBytes)) // Trailers length += int64(e.trailerEncodedLength) // Encoding terminator length += int64(len(crlf)) return length } func getUnsignedChunkBytesLength(payloadLength int64) int64 { payloadLengthStr := strconv.FormatInt(payloadLength, 16) return int64(len(payloadLengthStr)) + int64(len(crlf)) + payloadLength + int64(len(crlf)) } // HTTPHeaders returns the set of headers that must be included the request for // aws-chunked to work. This includes the content-encoding: aws-chunked header. // // If there are multiple layered content encoding, the aws-chunked encoding // must be appended to the previous layers the stream's encoding. The best way // to do this is to append all header values returned to the HTTP request's set // of headers. func (e *awsChunkedEncoding) HTTPHeaders() map[string][]string { headers := map[string][]string{ contentEncodingHeaderName: { awsChunkedContentEncodingHeaderValue, }, } if len(e.options.Trailers) != 0 { trailers := make([]string, 0, len(e.options.Trailers)) for name := range e.options.Trailers { trailers = append(trailers, strings.ToLower(name)) } headers[awsTrailerHeaderName] = trailers } return headers } func (e *awsChunkedEncoding) Read(b []byte) (n int, err error) { return e.encodedStream.Read(b) } // awsChunkedTrailerReader provides a lazy reader for reading of aws-chunked // content encoded trailers. The trailer values will not be retrieved until the // reader is read from. type awsChunkedTrailerReader struct { reader *bytes.Buffer trailers map[string]awsChunkedTrailerValue trailerEncodedLength int } // newAWSChunkedTrailerReader returns an initialized awsChunkedTrailerReader to // lazy reading aws-chunk content encoded trailers. func newAWSChunkedTrailerReader(trailers map[string]awsChunkedTrailerValue) *awsChunkedTrailerReader { return &awsChunkedTrailerReader{ trailers: trailers, trailerEncodedLength: trailerEncodedLength(trailers), } } func trailerEncodedLength(trailers map[string]awsChunkedTrailerValue) (length int) { for name, trailer := range trailers { length += len(name) + len(trailerKeyValueSeparator) l := trailer.Length if l == -1 { return -1 } length += l + len(crlf) } return length } // EncodedLength returns the length of the encoded trailers if the length could // be determined without retrieving the header values. Returns -1 if length is // unknown. func (r *awsChunkedTrailerReader) EncodedLength() (length int) { return r.trailerEncodedLength } // Read populates the passed in byte slice with bytes from the encoded // trailers. Will lazy read header values first time Read is called. func (r *awsChunkedTrailerReader) Read(p []byte) (int, error) { if r.trailerEncodedLength == 0 { return 0, io.EOF } if r.reader == nil { trailerLen := r.trailerEncodedLength if r.trailerEncodedLength == -1 { trailerLen = 0 } r.reader = bytes.NewBuffer(make([]byte, 0, trailerLen)) for name, trailer := range r.trailers { r.reader.WriteString(name) r.reader.WriteString(trailerKeyValueSeparator) v, err := trailer.Get() if err != nil { return 0, fmt.Errorf("failed to get trailer value, %w", err) } r.reader.WriteString(v) r.reader.WriteString(crlf) } } return r.reader.Read(p) } // newUnsignedChunkReader returns an io.Reader encoding the underlying reader // as unsigned aws-chunked chunks. The returned reader will also include the // end chunk, but not the aws-chunked final `crlf` segment so trailers can be // added. // // If the payload size is -1 for unknown length the content will be buffered in // defaultChunkLength chunks before wrapped in aws-chunked chunk encoding. func newUnsignedChunkReader(reader io.Reader, payloadSize int64) io.Reader { if payloadSize == -1 { return newBufferedAWSChunkReader(reader, defaultChunkLength) } var endChunk bytes.Buffer if payloadSize == 0 { endChunk.Write(finalChunkBytes) return &endChunk } endChunk.WriteString(crlf) endChunk.Write(finalChunkBytes) var header bytes.Buffer header.WriteString(strconv.FormatInt(payloadSize, 16)) header.WriteString(crlf) return io.MultiReader( &header, reader, &endChunk, ) } // Provides a buffered aws-chunked chunk encoder of an underlying io.Reader. // Will include end chunk, but not the aws-chunked final `crlf` segment so // trailers can be added. // // Note does not implement support for chunk extensions, e.g. chunk signing. type bufferedAWSChunkReader struct { reader io.Reader chunkSize int chunkSizeStr string headerBuffer *bytes.Buffer chunkBuffer *bytes.Buffer multiReader io.Reader multiReaderLen int endChunkDone bool } // newBufferedAWSChunkReader returns an bufferedAWSChunkReader for reading // aws-chunked encoded chunks. func newBufferedAWSChunkReader(reader io.Reader, chunkSize int) *bufferedAWSChunkReader { return &bufferedAWSChunkReader{ reader: reader, chunkSize: chunkSize, chunkSizeStr: strconv.FormatInt(int64(chunkSize), 16), headerBuffer: bytes.NewBuffer(make([]byte, 0, 64)), chunkBuffer: bytes.NewBuffer(make([]byte, 0, chunkSize+len(crlf))), } } // Read attempts to read from the underlying io.Reader writing aws-chunked // chunk encoded bytes to p. When the underlying io.Reader has been completed // read the end chunk will be available. Once the end chunk is read, the reader // will return EOF. func (r *bufferedAWSChunkReader) Read(p []byte) (n int, err error) { if r.multiReaderLen == 0 && r.endChunkDone { return 0, io.EOF } if r.multiReader == nil || r.multiReaderLen == 0 { r.multiReader, r.multiReaderLen, err = r.newMultiReader() if err != nil { return 0, err } } n, err = r.multiReader.Read(p) r.multiReaderLen -= n if err == io.EOF && !r.endChunkDone { // Edge case handling when the multi-reader has been completely read, // and returned an EOF, make sure that EOF only gets returned if the // end chunk was included in the multi-reader. Otherwise, the next call // to read will initialize the next chunk's multi-reader. err = nil } return n, err } // newMultiReader returns a new io.Reader for wrapping the next chunk. Will // return an error if the underlying reader can not be read from. Will never // return io.EOF. func (r *bufferedAWSChunkReader) newMultiReader() (io.Reader, int, error) { // io.Copy eats the io.EOF returned by io.LimitReader. Any error that // occurs here is due to an actual read error. n, err := io.Copy(r.chunkBuffer, io.LimitReader(r.reader, int64(r.chunkSize))) if err != nil { return nil, 0, err } if n == 0 { // Early exit writing out only the end chunk. This does not include // aws-chunk's final `crlf` so that trailers can still be added by // upstream reader. r.headerBuffer.Reset() r.headerBuffer.WriteString("0") r.headerBuffer.WriteString(crlf) r.endChunkDone = true return r.headerBuffer, r.headerBuffer.Len(), nil } r.chunkBuffer.WriteString(crlf) chunkSizeStr := r.chunkSizeStr if int(n) != r.chunkSize { chunkSizeStr = strconv.FormatInt(n, 16) } r.headerBuffer.Reset() r.headerBuffer.WriteString(chunkSizeStr) r.headerBuffer.WriteString(crlf) return io.MultiReader( r.headerBuffer, r.chunkBuffer, ), r.headerBuffer.Len() + r.chunkBuffer.Len(), nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package checksum // goModuleVersion is the tagged release for this module const goModuleVersion = "1.7.1" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_add.go ================================================ package checksum import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/smithy-go/middleware" ) // InputMiddlewareOptions provides the options for the request // checksum middleware setup. type InputMiddlewareOptions struct { // GetAlgorithm is a function to get the checksum algorithm of the // input payload from the input parameters. // // Given the input parameter value, the function must return the algorithm // and true, or false if no algorithm is specified. GetAlgorithm func(interface{}) (string, bool) // RequireChecksum indicates whether operation model forces middleware to compute the input payload's checksum. // If RequireChecksum is set to true, checksum will be calculated and RequestChecksumCalculation will be ignored, // otherwise RequestChecksumCalculation will be used to indicate if checksum will be calculated RequireChecksum bool // RequestChecksumCalculation is the user config to opt-in/out request checksum calculation. If RequireChecksum is // set to true, checksum will be calculated and this field will be ignored, otherwise // RequestChecksumCalculation will be used to indicate if checksum will be calculated RequestChecksumCalculation aws.RequestChecksumCalculation // Enables support for wrapping the serialized input payload with a // content-encoding: aws-check wrapper, and including a trailer for the // algorithm's checksum value. // // The checksum will not be computed, nor added as trailing checksum, if // the Algorithm's header is already set on the request. EnableTrailingChecksum bool // Enables support for computing the SHA256 checksum of input payloads // along with the algorithm specified checksum. Prevents downstream // middleware handlers (computePayloadSHA256) re-reading the payload. // // The SHA256 payload checksum will only be used for computed for requests // that are not TLS, or do not enable trailing checksums. // // The SHA256 payload hash will not be computed, if the Algorithm's header // is already set on the request. EnableComputeSHA256PayloadHash bool // Enables support for setting the aws-chunked decoded content length // header for the decoded length of the underlying stream. Will only be set // when used with trailing checksums, and aws-chunked content-encoding. EnableDecodedContentLengthHeader bool } // AddInputMiddleware adds the middleware for performing checksum computing // of request payloads, and checksum validation of response payloads. // // Deprecated: This internal-only runtime API is frozen. Do not call or modify // it in new code. Checksum-enabled service operations now generate this // middleware setup code inline per #2507. func AddInputMiddleware(stack *middleware.Stack, options InputMiddlewareOptions) (err error) { // Initial checksum configuration look up middleware err = stack.Initialize.Add(&SetupInputContext{ GetAlgorithm: options.GetAlgorithm, RequireChecksum: options.RequireChecksum, RequestChecksumCalculation: options.RequestChecksumCalculation, }, middleware.Before) if err != nil { return err } stack.Build.Remove("ContentChecksum") inputChecksum := &ComputeInputPayloadChecksum{ EnableTrailingChecksum: options.EnableTrailingChecksum, EnableComputePayloadHash: options.EnableComputeSHA256PayloadHash, EnableDecodedContentLengthHeader: options.EnableDecodedContentLengthHeader, } if err := stack.Finalize.Insert(inputChecksum, "ResolveEndpointV2", middleware.After); err != nil { return err } // If trailing checksum is not supported no need for finalize handler to be added. if options.EnableTrailingChecksum { trailerMiddleware := &AddInputChecksumTrailer{ EnableTrailingChecksum: inputChecksum.EnableTrailingChecksum, EnableComputePayloadHash: inputChecksum.EnableComputePayloadHash, EnableDecodedContentLengthHeader: inputChecksum.EnableDecodedContentLengthHeader, } if err := stack.Finalize.Insert(trailerMiddleware, "Retry", middleware.After); err != nil { return err } } return nil } // RemoveInputMiddleware Removes the compute input payload checksum middleware // handlers from the stack. func RemoveInputMiddleware(stack *middleware.Stack) { id := (*SetupInputContext)(nil).ID() stack.Initialize.Remove(id) id = (*ComputeInputPayloadChecksum)(nil).ID() stack.Finalize.Remove(id) } // OutputMiddlewareOptions provides options for configuring output checksum // validation middleware. type OutputMiddlewareOptions struct { // GetValidationMode is a function to get the checksum validation // mode of the output payload from the input parameters. // // Given the input parameter value, the function must return the validation // mode and true, or false if no mode is specified. GetValidationMode func(interface{}) (string, bool) // SetValidationMode is a function to set the checksum validation mode of input parameters SetValidationMode func(interface{}, string) // ResponseChecksumValidation is the user config to opt-in/out response checksum validation ResponseChecksumValidation aws.ResponseChecksumValidation // The set of checksum algorithms that should be used for response payload // checksum validation. The algorithm(s) used will be a union of the // output's returned algorithms and this set. // // Only the first algorithm in the union is currently used. ValidationAlgorithms []string // If set the middleware will ignore output multipart checksums. Otherwise // a checksum format error will be returned by the middleware. IgnoreMultipartValidation bool // When set the middleware will log when output does not have checksum or // algorithm to validate. LogValidationSkipped bool // When set the middleware will log when the output contains a multipart // checksum that was, skipped and not validated. LogMultipartValidationSkipped bool } // AddOutputMiddleware adds the middleware for validating response payload's // checksum. func AddOutputMiddleware(stack *middleware.Stack, options OutputMiddlewareOptions) error { err := stack.Initialize.Add(&setupOutputContext{ GetValidationMode: options.GetValidationMode, SetValidationMode: options.SetValidationMode, ResponseChecksumValidation: options.ResponseChecksumValidation, }, middleware.Before) if err != nil { return err } // Resolve a supported priority order list of algorithms to validate. algorithms := FilterSupportedAlgorithms(options.ValidationAlgorithms) m := &validateOutputPayloadChecksum{ Algorithms: algorithms, IgnoreMultipartValidation: options.IgnoreMultipartValidation, LogMultipartValidationSkipped: options.LogMultipartValidationSkipped, LogValidationSkipped: options.LogValidationSkipped, } return stack.Deserialize.Add(m, middleware.After) } // RemoveOutputMiddleware Removes the compute input payload checksum middleware // handlers from the stack. func RemoveOutputMiddleware(stack *middleware.Stack) { id := (*setupOutputContext)(nil).ID() stack.Initialize.Remove(id) id = (*validateOutputPayloadChecksum)(nil).ID() stack.Deserialize.Remove(id) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_checksum_metrics_tracking.go ================================================ package checksum import ( "context" "fmt" "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) var supportedChecksumFeatures = map[Algorithm]awsmiddleware.UserAgentFeature{ AlgorithmCRC32: awsmiddleware.UserAgentFeatureRequestChecksumCRC32, AlgorithmCRC32C: awsmiddleware.UserAgentFeatureRequestChecksumCRC32C, AlgorithmSHA1: awsmiddleware.UserAgentFeatureRequestChecksumSHA1, AlgorithmSHA256: awsmiddleware.UserAgentFeatureRequestChecksumSHA256, AlgorithmCRC64NVME: awsmiddleware.UserAgentFeatureRequestChecksumCRC64, } // RequestChecksumMetricsTracking is the middleware to track operation request's checksum usage type RequestChecksumMetricsTracking struct { RequestChecksumCalculation aws.RequestChecksumCalculation UserAgent *awsmiddleware.RequestUserAgent } // ID provides the middleware identifier func (m *RequestChecksumMetricsTracking) ID() string { return "AWSChecksum:RequestMetricsTracking" } // HandleBuild checks request checksum config and checksum value sent // and sends corresponding feature id to user agent func (m *RequestChecksumMetricsTracking) HandleBuild( ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, ) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown request type %T", req) } switch m.RequestChecksumCalculation { case aws.RequestChecksumCalculationWhenSupported: m.UserAgent.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRequestChecksumWhenSupported) case aws.RequestChecksumCalculationWhenRequired: m.UserAgent.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRequestChecksumWhenRequired) } for algo, feat := range supportedChecksumFeatures { checksumHeader := AlgorithmHTTPHeader(algo) if checksum := req.Header.Get(checksumHeader); checksum != "" { m.UserAgent.AddUserAgentFeature(feat) } } return next.HandleBuild(ctx, in) } // ResponseChecksumMetricsTracking is the middleware to track operation response's checksum usage type ResponseChecksumMetricsTracking struct { ResponseChecksumValidation aws.ResponseChecksumValidation UserAgent *awsmiddleware.RequestUserAgent } // ID provides the middleware identifier func (m *ResponseChecksumMetricsTracking) ID() string { return "AWSChecksum:ResponseMetricsTracking" } // HandleBuild checks the response checksum config and sends corresponding feature id to user agent func (m *ResponseChecksumMetricsTracking) HandleBuild( ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, ) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown request type %T", req) } switch m.ResponseChecksumValidation { case aws.ResponseChecksumValidationWhenSupported: m.UserAgent.AddUserAgentFeature(awsmiddleware.UserAgentFeatureResponseChecksumWhenSupported) case aws.ResponseChecksumValidationWhenRequired: m.UserAgent.AddUserAgentFeature(awsmiddleware.UserAgentFeatureResponseChecksumWhenRequired) } return next.HandleBuild(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_compute_input_checksum.go ================================================ package checksum import ( "context" "crypto/sha256" "fmt" "hash" "io" "strconv" "strings" v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" presignedurlcust "github.com/aws/aws-sdk-go-v2/service/internal/presigned-url" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const ( streamingUnsignedPayloadTrailerPayloadHash = "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ) // computedInputChecksumsKey is the metadata key for recording the algorithm the // checksum was computed for and the checksum value. type computedInputChecksumsKey struct{} // GetComputedInputChecksums returns the map of checksum algorithm to their // computed value stored in the middleware Metadata. Returns false if no values // were stored in the Metadata. func GetComputedInputChecksums(m middleware.Metadata) (map[string]string, bool) { vs, ok := m.Get(computedInputChecksumsKey{}).(map[string]string) return vs, ok } // SetComputedInputChecksums stores the map of checksum algorithm to their // computed value in the middleware Metadata. Overwrites any values that // currently exist in the metadata. func SetComputedInputChecksums(m *middleware.Metadata, vs map[string]string) { m.Set(computedInputChecksumsKey{}, vs) } // ComputeInputPayloadChecksum middleware computes payload checksum type ComputeInputPayloadChecksum struct { // Enables support for wrapping the serialized input payload with a // content-encoding: aws-check wrapper, and including a trailer for the // algorithm's checksum value. // // The checksum will not be computed, nor added as trailing checksum, if // the Algorithm's header is already set on the request. EnableTrailingChecksum bool // Enables support for computing the SHA256 checksum of input payloads // along with the algorithm specified checksum. Prevents downstream // middleware handlers (computePayloadSHA256) re-reading the payload. // // The SHA256 payload hash will only be used for computed for requests // that are not TLS, or do not enable trailing checksums. // // The SHA256 payload hash will not be computed, if the Algorithm's header // is already set on the request. EnableComputePayloadHash bool // Enables support for setting the aws-chunked decoded content length // header for the decoded length of the underlying stream. Will only be set // when used with trailing checksums, and aws-chunked content-encoding. EnableDecodedContentLengthHeader bool useTrailer bool } type useTrailer struct{} // ID provides the middleware's identifier. func (m *ComputeInputPayloadChecksum) ID() string { return "AWSChecksum:ComputeInputPayloadChecksum" } type computeInputHeaderChecksumError struct { Msg string Err error } func (e computeInputHeaderChecksumError) Error() string { const intro = "compute input header checksum failed" if e.Err != nil { return fmt.Sprintf("%s, %s, %v", intro, e.Msg, e.Err) } return fmt.Sprintf("%s, %s", intro, e.Msg) } func (e computeInputHeaderChecksumError) Unwrap() error { return e.Err } // HandleFinalize handles computing the payload's checksum, in the following cases: // - Is HTTP, not HTTPS // - RequireChecksum is true, and no checksums were specified via the Input // - Trailing checksums are not supported // // The build handler must be inserted in the stack before ContentPayloadHash // and after ComputeContentLength. func (m *ComputeInputPayloadChecksum) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { var checksum string algorithm, ok, err := getInputAlgorithm(ctx) if err != nil { return out, metadata, err } if !ok { return next.HandleFinalize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, computeInputHeaderChecksumError{ Msg: fmt.Sprintf("unknown request type %T", req), } } defer func() { if algorithm == "" || checksum == "" || err != nil { return } // Record the checksum and algorithm that was computed SetComputedInputChecksums(&metadata, map[string]string{ string(algorithm): checksum, }) }() // If any checksum header is already set nothing to do. for header := range req.Header { h := strings.ToUpper(header) if strings.HasPrefix(h, "X-AMZ-CHECKSUM-") { algorithm = Algorithm(strings.TrimPrefix(h, "X-AMZ-CHECKSUM-")) checksum = req.Header.Get(header) return next.HandleFinalize(ctx, in) } } computePayloadHash := m.EnableComputePayloadHash if v := v4.GetPayloadHash(ctx); v != "" { computePayloadHash = false } stream := req.GetStream() streamLength, err := getRequestStreamLength(req) if err != nil { return out, metadata, computeInputHeaderChecksumError{ Msg: "failed to determine stream length", Err: err, } } // If trailing checksums are supported, the request is HTTPS, and the // stream is not nil or empty, instead switch to a trailing checksum. // // Nil and empty streams will always be handled as a request header, // regardless if the operation supports trailing checksums or not. if req.IsHTTPS() && !presignedurlcust.GetIsPresigning(ctx) { if stream != nil && streamLength != 0 && m.EnableTrailingChecksum { if m.EnableComputePayloadHash { // ContentSHA256Header middleware handles the header ctx = v4.SetPayloadHash(ctx, streamingUnsignedPayloadTrailerPayloadHash) } m.useTrailer = true ctx = middleware.WithStackValue(ctx, useTrailer{}, true) return next.HandleFinalize(ctx, in) } // If trailing checksums are not enabled but protocol is still HTTPS // disabling computing the payload hash. Downstream middleware handler // (ComputetPayloadHash) will set the payload hash to unsigned payload, // if signing was used. computePayloadHash = false } // Only seekable streams are supported for non-trailing checksums, because // the stream needs to be rewound before the handler can continue. if stream != nil && !req.IsStreamSeekable() { return out, metadata, computeInputHeaderChecksumError{ Msg: "unseekable stream is not supported without TLS and trailing checksum", } } var sha256Checksum string checksum, sha256Checksum, err = computeStreamChecksum( algorithm, stream, computePayloadHash) if err != nil { return out, metadata, computeInputHeaderChecksumError{ Msg: "failed to compute stream checksum", Err: err, } } if err := req.RewindStream(); err != nil { return out, metadata, computeInputHeaderChecksumError{ Msg: "failed to rewind stream", Err: err, } } checksumHeader := AlgorithmHTTPHeader(algorithm) req.Header.Set(checksumHeader, checksum) if computePayloadHash { ctx = v4.SetPayloadHash(ctx, sha256Checksum) } return next.HandleFinalize(ctx, in) } type computeInputTrailingChecksumError struct { Msg string Err error } func (e computeInputTrailingChecksumError) Error() string { const intro = "compute input trailing checksum failed" if e.Err != nil { return fmt.Sprintf("%s, %s, %v", intro, e.Msg, e.Err) } return fmt.Sprintf("%s, %s", intro, e.Msg) } func (e computeInputTrailingChecksumError) Unwrap() error { return e.Err } // AddInputChecksumTrailer adds HTTP checksum when // - Is HTTPS, not HTTP // - A checksum was specified via the Input // - Trailing checksums are supported. type AddInputChecksumTrailer struct { EnableTrailingChecksum bool EnableComputePayloadHash bool EnableDecodedContentLengthHeader bool } // ID identifies this middleware. func (*AddInputChecksumTrailer) ID() string { return "addInputChecksumTrailer" } // HandleFinalize wraps the request body to write the trailing checksum. func (m *AddInputChecksumTrailer) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { algorithm, ok, err := getInputAlgorithm(ctx) if err != nil { return out, metadata, computeInputTrailingChecksumError{ Msg: "failed to get algorithm", Err: err, } } else if !ok { return next.HandleFinalize(ctx, in) } if enabled, _ := middleware.GetStackValue(ctx, useTrailer{}).(bool); !enabled { return next.HandleFinalize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, computeInputTrailingChecksumError{ Msg: fmt.Sprintf("unknown request type %T", req), } } // Trailing checksums are only supported when TLS is enabled. if !req.IsHTTPS() { return out, metadata, computeInputTrailingChecksumError{ Msg: "HTTPS required", } } // If any checksum header is already set nothing to do. for header := range req.Header { if strings.HasPrefix(strings.ToLower(header), "x-amz-checksum-") { return next.HandleFinalize(ctx, in) } } stream := req.GetStream() streamLength, err := getRequestStreamLength(req) if err != nil { return out, metadata, computeInputTrailingChecksumError{ Msg: "failed to determine stream length", Err: err, } } if stream == nil || streamLength == 0 { // Nil and empty streams are handled by the Build handler. They are not // supported by the trailing checksums finalize handler. There is no // benefit to sending them as trailers compared to headers. return out, metadata, computeInputTrailingChecksumError{ Msg: "nil or empty streams are not supported", } } checksumReader, err := newComputeChecksumReader(stream, algorithm) if err != nil { return out, metadata, computeInputTrailingChecksumError{ Msg: "failed to created checksum reader", Err: err, } } awsChunkedReader := newUnsignedAWSChunkedEncoding(checksumReader, func(o *awsChunkedEncodingOptions) { o.Trailers[AlgorithmHTTPHeader(checksumReader.Algorithm())] = awsChunkedTrailerValue{ Get: checksumReader.Base64Checksum, Length: checksumReader.Base64ChecksumLength(), } o.StreamLength = streamLength }) for key, values := range awsChunkedReader.HTTPHeaders() { for _, value := range values { req.Header.Add(key, value) } } // Setting the stream on the request will create a copy. The content length // is not updated until after the request is copied to prevent impacting // upstream middleware. req, err = req.SetStream(awsChunkedReader) if err != nil { return out, metadata, computeInputTrailingChecksumError{ Msg: "failed updating request to trailing checksum wrapped stream", Err: err, } } req.ContentLength = awsChunkedReader.EncodedLength() in.Request = req // Add decoded content length header if original stream's content length is known. if streamLength != -1 && m.EnableDecodedContentLengthHeader { req.Header.Set(decodedContentLengthHeaderName, strconv.FormatInt(streamLength, 10)) } out, metadata, err = next.HandleFinalize(ctx, in) if err == nil { checksum, err := checksumReader.Base64Checksum() if err != nil { return out, metadata, fmt.Errorf("failed to get computed checksum, %w", err) } // Record the checksum and algorithm that was computed SetComputedInputChecksums(&metadata, map[string]string{ string(algorithm): checksum, }) } return out, metadata, err } func getInputAlgorithm(ctx context.Context) (Algorithm, bool, error) { ctxAlgorithm := internalcontext.GetChecksumInputAlgorithm(ctx) if ctxAlgorithm == "" { return "", false, nil } algorithm, err := ParseAlgorithm(ctxAlgorithm) if err != nil { return "", false, fmt.Errorf( "failed to parse algorithm, %w", err) } return algorithm, true, nil } func computeStreamChecksum(algorithm Algorithm, stream io.Reader, computePayloadHash bool) ( checksum string, sha256Checksum string, err error, ) { hasher, err := NewAlgorithmHash(algorithm) if err != nil { return "", "", fmt.Errorf( "failed to get hasher for checksum algorithm, %w", err) } var sha256Hasher hash.Hash var batchHasher io.Writer = hasher // Compute payload hash for the protocol. To prevent another handler // (computePayloadSHA256) re-reading body also compute the SHA256 for // request signing. If configured checksum algorithm is SHA256, don't // double wrap stream with another SHA256 hasher. if computePayloadHash && algorithm != AlgorithmSHA256 { sha256Hasher = sha256.New() batchHasher = io.MultiWriter(hasher, sha256Hasher) } if stream != nil { if _, err = io.Copy(batchHasher, stream); err != nil { return "", "", fmt.Errorf( "failed to read stream to compute hash, %w", err) } } checksum = string(base64EncodeHashSum(hasher)) if computePayloadHash { if algorithm != AlgorithmSHA256 { sha256Checksum = string(hexEncodeHashSum(sha256Hasher)) } else { sha256Checksum = string(hexEncodeHashSum(hasher)) } } return checksum, sha256Checksum, nil } func getRequestStreamLength(req *smithyhttp.Request) (int64, error) { if v := req.ContentLength; v > 0 { return v, nil } if length, ok, err := req.StreamLength(); err != nil { return 0, fmt.Errorf("failed getting request stream's length, %w", err) } else if ok { return length, nil } return -1, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_setup_context.go ================================================ package checksum import ( "context" "github.com/aws/aws-sdk-go-v2/aws" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" "github.com/aws/smithy-go/middleware" ) const ( checksumValidationModeEnabled = "ENABLED" ) // SetupInputContext is the initial middleware that looks up the input // used to configure checksum behavior. This middleware must be executed before // input validation step or any other checksum middleware. type SetupInputContext struct { // GetAlgorithm is a function to get the checksum algorithm of the // input payload from the input parameters. // // Given the input parameter value, the function must return the algorithm // and true, or false if no algorithm is specified. GetAlgorithm func(interface{}) (string, bool) // RequireChecksum indicates whether operation model forces middleware to compute the input payload's checksum. // If RequireChecksum is set to true, checksum will be calculated and RequestChecksumCalculation will be ignored, // otherwise RequestChecksumCalculation will be used to indicate if checksum will be calculated RequireChecksum bool // RequestChecksumCalculation is the user config to opt-in/out request checksum calculation. If RequireChecksum is // set to true, checksum will be calculated and this field will be ignored, otherwise // RequestChecksumCalculation will be used to indicate if checksum will be calculated RequestChecksumCalculation aws.RequestChecksumCalculation } // ID for the middleware func (m *SetupInputContext) ID() string { return "AWSChecksum:SetupInputContext" } // HandleInitialize initialization middleware that setups up the checksum // context based on the input parameters provided in the stack. func (m *SetupInputContext) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { // nil check here is for operations that require checksum but do not have input algorithm setting if m.GetAlgorithm != nil { if algorithm, ok := m.GetAlgorithm(in.Parameters); ok { ctx = internalcontext.SetChecksumInputAlgorithm(ctx, algorithm) return next.HandleInitialize(ctx, in) } } if m.RequireChecksum || m.RequestChecksumCalculation == aws.RequestChecksumCalculationWhenSupported { ctx = internalcontext.SetChecksumInputAlgorithm(ctx, string(AlgorithmCRC32)) } return next.HandleInitialize(ctx, in) } type setupOutputContext struct { // GetValidationMode is a function to get the checksum validation // mode of the output payload from the input parameters. // // Given the input parameter value, the function must return the validation // mode and true, or false if no mode is specified. GetValidationMode func(interface{}) (string, bool) // SetValidationMode is a function to set the checksum validation mode of input parameters SetValidationMode func(interface{}, string) // ResponseChecksumValidation states user config to opt-in/out checksum validation ResponseChecksumValidation aws.ResponseChecksumValidation } // ID for the middleware func (m *setupOutputContext) ID() string { return "AWSChecksum:SetupOutputContext" } // HandleInitialize initialization middleware that setups up the checksum // context based on the input parameters provided in the stack. func (m *setupOutputContext) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { mode, _ := m.GetValidationMode(in.Parameters) if m.ResponseChecksumValidation == aws.ResponseChecksumValidationWhenSupported || mode == checksumValidationModeEnabled { m.SetValidationMode(in.Parameters, checksumValidationModeEnabled) ctx = setContextOutputValidationMode(ctx, checksumValidationModeEnabled) } return next.HandleInitialize(ctx, in) } // outputValidationModeKey is the key set on context used to identify if // output checksum validation is enabled. type outputValidationModeKey struct{} // setContextOutputValidationMode sets the request checksum // algorithm on the context. // // Scoped to stack values. func setContextOutputValidationMode(ctx context.Context, value string) context.Context { return middleware.WithStackValue(ctx, outputValidationModeKey{}, value) } // getContextOutputValidationMode returns response checksum validation state, // if one was specified. Empty string is returned if one is not specified. // // Scoped to stack values. func getContextOutputValidationMode(ctx context.Context) (v string) { v, _ = middleware.GetStackValue(ctx, outputValidationModeKey{}).(string) return v } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/middleware_validate_output.go ================================================ package checksum import ( "context" "fmt" "net/http" "strings" "github.com/aws/smithy-go" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // outputValidationAlgorithmsUsedKey is the metadata key for indexing the algorithms // that were used, by the middleware's validation. type outputValidationAlgorithmsUsedKey struct{} // GetOutputValidationAlgorithmsUsed returns the checksum algorithms used // stored in the middleware Metadata. Returns false if no algorithms were // stored in the Metadata. func GetOutputValidationAlgorithmsUsed(m middleware.Metadata) ([]string, bool) { vs, ok := m.Get(outputValidationAlgorithmsUsedKey{}).([]string) return vs, ok } // SetOutputValidationAlgorithmsUsed stores the checksum algorithms used in the // middleware Metadata. func SetOutputValidationAlgorithmsUsed(m *middleware.Metadata, vs []string) { m.Set(outputValidationAlgorithmsUsedKey{}, vs) } // validateOutputPayloadChecksum middleware computes payload checksum of the // received response and validates with checksum returned by the service. type validateOutputPayloadChecksum struct { // Algorithms represents a priority-ordered list of valid checksum // algorithm that should be validated when present in HTTP response // headers. Algorithms []Algorithm // IgnoreMultipartValidation indicates multipart checksums ending with "-#" // will be ignored. IgnoreMultipartValidation bool // When set the middleware will log when output does not have checksum or // algorithm to validate. LogValidationSkipped bool // When set the middleware will log when the output contains a multipart // checksum that was, skipped and not validated. LogMultipartValidationSkipped bool } func (m *validateOutputPayloadChecksum) ID() string { return "AWSChecksum:ValidateOutputPayloadChecksum" } // HandleDeserialize is a Deserialize middleware that wraps the HTTP response // body with an io.ReadCloser that will validate its checksum. func (m *validateOutputPayloadChecksum) HandleDeserialize( ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler, ) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } if mode := getContextOutputValidationMode(ctx); mode != checksumValidationModeEnabled { return out, metadata, err } response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("unknown transport type %T", out.RawResponse), } } // this runs BEFORE the deserializer, so we have to preemptively check for // non-200, in which case there is no checksum to validate if response.StatusCode != 200 { return out, metadata, err } var expectedChecksum string var algorithmToUse Algorithm for _, algorithm := range m.Algorithms { value := response.Header.Get(AlgorithmHTTPHeader(algorithm)) if len(value) == 0 { continue } expectedChecksum = value algorithmToUse = algorithm } logger := middleware.GetLogger(ctx) // Skip validation if no checksum algorithm or checksum is available. if len(expectedChecksum) == 0 || len(algorithmToUse) == 0 { if response.Body != http.NoBody && m.LogValidationSkipped { // TODO this probably should have more information about the // operation output that won't be validated. logger.Logf(logging.Warn, "Response has no supported checksum. Not validating response payload.") } return out, metadata, nil } // Ignore multipart validation if m.IgnoreMultipartValidation && strings.Contains(expectedChecksum, "-") { if m.LogMultipartValidationSkipped { // TODO this probably should have more information about the // operation output that won't be validated. logger.Logf(logging.Warn, "Skipped validation of multipart checksum.") } return out, metadata, nil } body, err := newValidateChecksumReader(response.Body, algorithmToUse, expectedChecksum) if err != nil { return out, metadata, fmt.Errorf("failed to create checksum validation reader, %w", err) } response.Body = body // Update the metadata to include the set of the checksum algorithms that // will be validated. SetOutputValidationAlgorithmsUsed(&metadata, []string{ string(algorithmToUse), }) return out, metadata, nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md ================================================ # v1.12.15 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.14 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.12.13 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.12 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.11 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.10 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.12.9 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.8 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.7 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.6 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.5 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.12.4 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.3 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.2 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.1 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2024-10-04) * **Feature**: Add support for HTTP client metrics. * **Dependency Update**: Updated to the latest SDK module versions # v1.11.20 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.19 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.18 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.11.17 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.16 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.15 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.14 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.13 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.12 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.11 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.10 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.9 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.8 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.7 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.6 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.5 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.11.4 (2024-03-05) * **Bug Fix**: Restore typo'd API `AddAsIsInternalPresigingMiddleware` as an alias for backwards compatibility. # v1.11.3 (2024-03-04) * **Bug Fix**: Correct a typo in internal AddAsIsPresigningMiddleware API. # v1.11.2 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.1 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.10.10 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.9 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.8 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.7 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.6 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.5 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.4 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.3 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.2 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.9.37 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.36 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.35 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.34 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.33 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.32 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.31 (2023-07-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.30 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.29 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.28 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.27 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.26 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.25 (2023-03-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.24 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.23 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.22 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.21 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.20 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.19 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.18 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.17 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.16 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.15 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.14 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.13 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.12 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.11 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.10 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.9 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.8 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.7 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.6 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.5 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.4 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.8.0 (2022-02-24) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.7.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.6.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.5.2 (2021-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.0 (2021-11-06) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2021-10-21) * **Feature**: Updated to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.3.2 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.1 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-08-27) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.2.3 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.2.2 (2021-08-04) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.2.1 (2021-07-15) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.2.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.1.1 (2021-05-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.1.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/context.go ================================================ package presignedurl import ( "context" "github.com/aws/smithy-go/middleware" ) // WithIsPresigning adds the isPresigning sentinel value to a context to signal // that the middleware stack is using the presign flow. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func WithIsPresigning(ctx context.Context) context.Context { return middleware.WithStackValue(ctx, isPresigningKey{}, true) } // GetIsPresigning returns if the context contains the isPresigning sentinel // value for presigning flows. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetIsPresigning(ctx context.Context) bool { v, _ := middleware.GetStackValue(ctx, isPresigningKey{}).(bool) return v } type isPresigningKey struct{} // AddAsIsPresigningMiddleware adds a middleware to the head of the stack that // will update the stack's context to be flagged as being invoked for the // purpose of presigning. func AddAsIsPresigningMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(asIsPresigningMiddleware{}, middleware.Before) } // AddAsIsPresigingMiddleware is an alias for backwards compatibility. // // Deprecated: This API was released with a typo. Use // [AddAsIsPresigningMiddleware] instead. func AddAsIsPresigingMiddleware(stack *middleware.Stack) error { return AddAsIsPresigningMiddleware(stack) } type asIsPresigningMiddleware struct{} func (asIsPresigningMiddleware) ID() string { return "AsIsPresigningMiddleware" } func (asIsPresigningMiddleware) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { ctx = WithIsPresigning(ctx) return next.HandleInitialize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/doc.go ================================================ // Package presignedurl provides the customizations for API clients to fill in // presigned URLs into input parameters. package presignedurl ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package presignedurl // goModuleVersion is the tagged release for this module const goModuleVersion = "1.12.15" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/middleware.go ================================================ package presignedurl import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" "github.com/aws/smithy-go/middleware" ) // URLPresigner provides the interface to presign the input parameters in to a // presigned URL. type URLPresigner interface { // PresignURL presigns a URL. PresignURL(ctx context.Context, srcRegion string, params interface{}) (*v4.PresignedHTTPRequest, error) } // ParameterAccessor provides an collection of accessor to for retrieving and // setting the values needed to PresignedURL generation type ParameterAccessor struct { // GetPresignedURL accessor points to a function that retrieves a presigned url if present GetPresignedURL func(interface{}) (string, bool, error) // GetSourceRegion accessor points to a function that retrieves source region for presigned url GetSourceRegion func(interface{}) (string, bool, error) // CopyInput accessor points to a function that takes in an input, and returns a copy. CopyInput func(interface{}) (interface{}, error) // SetDestinationRegion accessor points to a function that sets destination region on api input struct SetDestinationRegion func(interface{}, string) error // SetPresignedURL accessor points to a function that sets presigned url on api input struct SetPresignedURL func(interface{}, string) error } // Options provides the set of options needed by the presigned URL middleware. type Options struct { // Accessor are the parameter accessors used by this middleware Accessor ParameterAccessor // Presigner is the URLPresigner used by the middleware Presigner URLPresigner } // AddMiddleware adds the Presign URL middleware to the middleware stack. func AddMiddleware(stack *middleware.Stack, opts Options) error { return stack.Initialize.Add(&presign{options: opts}, middleware.Before) } // RemoveMiddleware removes the Presign URL middleware from the stack. func RemoveMiddleware(stack *middleware.Stack) error { _, err := stack.Initialize.Remove((*presign)(nil).ID()) return err } type presign struct { options Options } func (m *presign) ID() string { return "Presign" } func (m *presign) HandleInitialize( ctx context.Context, input middleware.InitializeInput, next middleware.InitializeHandler, ) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { // If PresignedURL is already set ignore middleware. if _, ok, err := m.options.Accessor.GetPresignedURL(input.Parameters); err != nil { return out, metadata, fmt.Errorf("presign middleware failed, %w", err) } else if ok { return next.HandleInitialize(ctx, input) } // If have source region is not set ignore middleware. srcRegion, ok, err := m.options.Accessor.GetSourceRegion(input.Parameters) if err != nil { return out, metadata, fmt.Errorf("presign middleware failed, %w", err) } else if !ok || len(srcRegion) == 0 { return next.HandleInitialize(ctx, input) } // Create a copy of the original input so the destination region value can // be added. This ensures that value does not leak into the original // request parameters. paramCpy, err := m.options.Accessor.CopyInput(input.Parameters) if err != nil { return out, metadata, fmt.Errorf("unable to create presigned URL, %w", err) } // Destination region is the API client's configured region. dstRegion := awsmiddleware.GetRegion(ctx) if err = m.options.Accessor.SetDestinationRegion(paramCpy, dstRegion); err != nil { return out, metadata, fmt.Errorf("presign middleware failed, %w", err) } presignedReq, err := m.options.Presigner.PresignURL(ctx, srcRegion, paramCpy) if err != nil { return out, metadata, fmt.Errorf("unable to create presigned URL, %w", err) } // Update the original input with the presigned URL value. if err = m.options.Accessor.SetPresignedURL(input.Parameters, presignedReq.URL); err != nil { return out, metadata, fmt.Errorf("presign middleware failed, %w", err) } return next.HandleInitialize(ctx, input) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md ================================================ # v1.18.15 (2025-02-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.14 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.18.13 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.12 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.11 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.10 (2025-01-24) * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.18.9 (2025-01-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.8 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.7 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.6 (2024-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.5 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.18.4 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.3 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.2 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.1 (2024-10-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.18.0 (2024-10-04) * **Feature**: Add support for HTTP client metrics. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.18 (2024-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.17 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.16 (2024-08-15) * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.15 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.14 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.13 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.12 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.11 (2024-06-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.10 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.9 (2024-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.8 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.7 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.6 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.5 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.4 (2024-03-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.3 (2024-03-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.2 (2024-02-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.1 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.17.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.16.10 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.9 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.8 (2023-12-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.7 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.6 (2023-11-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.5 (2023-11-28.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.4 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.3 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.2 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.1 (2023-11-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.15.6 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.5 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.4 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.3 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.2 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.1 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.15.0 (2023-07-31) * **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide. * **Dependency Update**: Updated to the latest SDK module versions # v1.14.5 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.4 (2023-07-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.3 (2023-06-13) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.2 (2023-04-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.1 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.14.0 (2023-03-21) * **Feature**: port v1 sdk 100-continue http header customization for s3 PutObject/UploadPart request and enable user config * **Dependency Update**: Updated to the latest SDK module versions # v1.13.24 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.23 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.22 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.21 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.20 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.19 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.18 (2022-10-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.17 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.16 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.15 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.14 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.13 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.12 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.11 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.10 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.9 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.8 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.7 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.6 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.5 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.4 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.13.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2022-02-24) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.9.2 (2021-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.9.0 (2021-11-06) * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.8.0 (2021-10-21) * **Feature**: Updated to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.7.2 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.7.1 (2021-09-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.7.0 (2021-09-02) * **Feature**: Add support for S3 Multi-Region Access Point ARNs. # v1.6.0 (2021-08-27) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.5.3 (2021-08-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.5.2 (2021-08-04) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.5.1 (2021-07-15) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.5.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.4.0 (2021-06-04) * **Feature**: The handling of AccessPoint and Outpost ARNs have been updated. # v1.3.1 (2021-05-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.3.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/accesspoint_arn.go ================================================ package arn import ( "strings" "github.com/aws/aws-sdk-go-v2/aws/arn" ) // AccessPointARN provides representation type AccessPointARN struct { arn.ARN AccessPointName string } // GetARN returns the base ARN for the Access Point resource func (a AccessPointARN) GetARN() arn.ARN { return a.ARN } // ParseAccessPointResource attempts to parse the ARN's resource as an // AccessPoint resource. // // Supported Access point resource format: // - Access point format: arn:{partition}:s3:{region}:{accountId}:accesspoint/{accesspointName} // - example: arn:aws:s3:us-west-2:012345678901:accesspoint/myaccesspoint func ParseAccessPointResource(a arn.ARN, resParts []string) (AccessPointARN, error) { if isFIPS(a.Region) { return AccessPointARN{}, InvalidARNError{ARN: a, Reason: "FIPS region not allowed in ARN"} } if len(a.AccountID) == 0 { return AccessPointARN{}, InvalidARNError{ARN: a, Reason: "account-id not set"} } if len(resParts) == 0 { return AccessPointARN{}, InvalidARNError{ARN: a, Reason: "resource-id not set"} } if len(resParts) > 1 { return AccessPointARN{}, InvalidARNError{ARN: a, Reason: "sub resource not supported"} } resID := resParts[0] if len(strings.TrimSpace(resID)) == 0 { return AccessPointARN{}, InvalidARNError{ARN: a, Reason: "resource-id not set"} } return AccessPointARN{ ARN: a, AccessPointName: resID, }, nil } func isFIPS(region string) bool { return strings.HasPrefix(region, "fips-") || strings.HasSuffix(region, "-fips") } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/arn.go ================================================ package arn import ( "fmt" "strings" "github.com/aws/aws-sdk-go-v2/aws/arn" ) var supportedServiceARN = []string{ "s3", "s3-outposts", "s3-object-lambda", } func isSupportedServiceARN(service string) bool { for _, name := range supportedServiceARN { if name == service { return true } } return false } // Resource provides the interfaces abstracting ARNs of specific resource // types. type Resource interface { GetARN() arn.ARN String() string } // ResourceParser provides the function for parsing an ARN's resource // component into a typed resource. type ResourceParser func(arn.ARN) (Resource, error) // ParseResource parses an AWS ARN into a typed resource for the S3 API. func ParseResource(a arn.ARN, resParser ResourceParser) (resARN Resource, err error) { if len(a.Partition) == 0 { return nil, InvalidARNError{ARN: a, Reason: "partition not set"} } if !isSupportedServiceARN(a.Service) { return nil, InvalidARNError{ARN: a, Reason: "service is not supported"} } if len(a.Resource) == 0 { return nil, InvalidARNError{ARN: a, Reason: "resource not set"} } return resParser(a) } // SplitResource splits the resource components by the ARN resource delimiters. func SplitResource(v string) []string { var parts []string var offset int for offset <= len(v) { idx := strings.IndexAny(v[offset:], "/:") if idx < 0 { parts = append(parts, v[offset:]) break } parts = append(parts, v[offset:idx+offset]) offset += idx + 1 } return parts } // IsARN returns whether the given string is an ARN func IsARN(s string) bool { return arn.IsARN(s) } // InvalidARNError provides the error for an invalid ARN error. type InvalidARNError struct { ARN arn.ARN Reason string } // Error returns a string denoting the occurred InvalidARNError func (e InvalidARNError) Error() string { return fmt.Sprintf("invalid Amazon %s ARN, %s, %s", e.ARN.Service, e.Reason, e.ARN.String()) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/arn_member.go ================================================ package arn import "fmt" // arnable is implemented by the relevant S3/S3Control // operations which have members that may need ARN // processing. type arnable interface { SetARNMember(string) error GetARNMember() (*string, bool) } // GetARNField would be called during middleware execution // to retrieve a member value that is an ARN in need of // processing. func GetARNField(input interface{}) (*string, bool) { v, ok := input.(arnable) if !ok { return nil, false } return v.GetARNMember() } // SetARNField would called during middleware exeuction // to set a member value that required ARN processing. func SetARNField(input interface{}, v string) error { params, ok := input.(arnable) if !ok { return fmt.Errorf("Params does not contain arn field member") } return params.SetARNMember(v) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/outpost_arn.go ================================================ package arn import ( "strings" "github.com/aws/aws-sdk-go-v2/aws/arn" ) // OutpostARN interface that should be satisfied by outpost ARNs type OutpostARN interface { Resource GetOutpostID() string } // ParseOutpostARNResource will parse a provided ARNs resource using the appropriate ARN format // and return a specific OutpostARN type // // Currently supported outpost ARN formats: // * Outpost AccessPoint ARN format: // - ARN format: arn:{partition}:s3-outposts:{region}:{accountId}:outpost/{outpostId}/accesspoint/{accesspointName} // - example: arn:aws:s3-outposts:us-west-2:012345678901:outpost/op-1234567890123456/accesspoint/myaccesspoint // // * Outpost Bucket ARN format: // - ARN format: arn:{partition}:s3-outposts:{region}:{accountId}:outpost/{outpostId}/bucket/{bucketName} // - example: arn:aws:s3-outposts:us-west-2:012345678901:outpost/op-1234567890123456/bucket/mybucket // // Other outpost ARN formats may be supported and added in the future. func ParseOutpostARNResource(a arn.ARN, resParts []string) (OutpostARN, error) { if len(a.Region) == 0 { return nil, InvalidARNError{ARN: a, Reason: "region not set"} } if isFIPS(a.Region) { return nil, InvalidARNError{ARN: a, Reason: "FIPS region not allowed in ARN"} } if len(a.AccountID) == 0 { return nil, InvalidARNError{ARN: a, Reason: "account-id not set"} } // verify if outpost id is present and valid if len(resParts) == 0 || len(strings.TrimSpace(resParts[0])) == 0 { return nil, InvalidARNError{ARN: a, Reason: "outpost resource-id not set"} } // verify possible resource type exists if len(resParts) < 3 { return nil, InvalidARNError{ ARN: a, Reason: "incomplete outpost resource type. Expected bucket or access-point resource to be present", } } // Since we know this is a OutpostARN fetch outpostID outpostID := strings.TrimSpace(resParts[0]) switch resParts[1] { case "accesspoint": accesspointARN, err := ParseAccessPointResource(a, resParts[2:]) if err != nil { return OutpostAccessPointARN{}, err } return OutpostAccessPointARN{ AccessPointARN: accesspointARN, OutpostID: outpostID, }, nil case "bucket": bucketName, err := parseBucketResource(a, resParts[2:]) if err != nil { return nil, err } return OutpostBucketARN{ ARN: a, BucketName: bucketName, OutpostID: outpostID, }, nil default: return nil, InvalidARNError{ARN: a, Reason: "unknown resource set for outpost ARN"} } } // OutpostAccessPointARN represents outpost access point ARN. type OutpostAccessPointARN struct { AccessPointARN OutpostID string } // GetOutpostID returns the outpost id of outpost access point arn func (o OutpostAccessPointARN) GetOutpostID() string { return o.OutpostID } // OutpostBucketARN represents the outpost bucket ARN. type OutpostBucketARN struct { arn.ARN BucketName string OutpostID string } // GetOutpostID returns the outpost id of outpost bucket arn func (o OutpostBucketARN) GetOutpostID() string { return o.OutpostID } // GetARN retrives the base ARN from outpost bucket ARN resource func (o OutpostBucketARN) GetARN() arn.ARN { return o.ARN } // parseBucketResource attempts to parse the ARN's bucket resource and retrieve the // bucket resource id. // // parseBucketResource only parses the bucket resource id. func parseBucketResource(a arn.ARN, resParts []string) (bucketName string, err error) { if len(resParts) == 0 { return bucketName, InvalidARNError{ARN: a, Reason: "bucket resource-id not set"} } if len(resParts) > 1 { return bucketName, InvalidARNError{ARN: a, Reason: "sub resource not supported"} } bucketName = strings.TrimSpace(resParts[0]) if len(bucketName) == 0 { return bucketName, InvalidARNError{ARN: a, Reason: "bucket resource-id not set"} } return bucketName, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn/s3_object_lambda_arn.go ================================================ package arn // S3ObjectLambdaARN represents an ARN for the s3-object-lambda service type S3ObjectLambdaARN interface { Resource isS3ObjectLambdasARN() } // S3ObjectLambdaAccessPointARN is an S3ObjectLambdaARN for the Access Point resource type type S3ObjectLambdaAccessPointARN struct { AccessPointARN } func (s S3ObjectLambdaAccessPointARN) isS3ObjectLambdasARN() {} ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn_lookup.go ================================================ package s3shared import ( "context" "fmt" "github.com/aws/smithy-go/middleware" "github.com/aws/aws-sdk-go-v2/aws/arn" ) // ARNLookup is the initial middleware that looks up if an arn is provided. // This middleware is responsible for fetching ARN from a arnable field, and registering the ARN on // middleware context. This middleware must be executed before input validation step or any other // arn processing middleware. type ARNLookup struct { // GetARNValue takes in a input interface and returns a ptr to string and a bool GetARNValue func(interface{}) (*string, bool) } // ID for the middleware func (m *ARNLookup) ID() string { return "S3Shared:ARNLookup" } // HandleInitialize handles the behavior of this initialize step func (m *ARNLookup) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { // check if GetARNValue is supported if m.GetARNValue == nil { return next.HandleInitialize(ctx, in) } // check is input resource is an ARN; if not go to next v, ok := m.GetARNValue(in.Parameters) if !ok || v == nil || !arn.IsARN(*v) { return next.HandleInitialize(ctx, in) } // if ARN process ResourceRequest and put it on ctx av, err := arn.Parse(*v) if err != nil { return out, metadata, fmt.Errorf("error parsing arn: %w", err) } // set parsed arn on context ctx = setARNResourceOnContext(ctx, av) return next.HandleInitialize(ctx, in) } // arnResourceKey is the key set on context used to identify, retrive an ARN resource // if present on the context. type arnResourceKey struct{} // SetARNResourceOnContext sets the S3 ARN on the context. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func setARNResourceOnContext(ctx context.Context, value arn.ARN) context.Context { return middleware.WithStackValue(ctx, arnResourceKey{}, value) } // GetARNResourceFromContext returns an ARN from context and a bool indicating // presence of ARN on ctx. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func GetARNResourceFromContext(ctx context.Context) (arn.ARN, bool) { v, ok := middleware.GetStackValue(ctx, arnResourceKey{}).(arn.ARN) return v, ok } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config/config.go ================================================ package config import "context" // UseARNRegionProvider is an interface for retrieving external configuration value for UseARNRegion type UseARNRegionProvider interface { GetS3UseARNRegion(ctx context.Context) (value bool, found bool, err error) } // DisableMultiRegionAccessPointsProvider is an interface for retrieving external configuration value for DisableMultiRegionAccessPoints type DisableMultiRegionAccessPointsProvider interface { GetS3DisableMultiRegionAccessPoints(ctx context.Context) (value bool, found bool, err error) } // ResolveUseARNRegion extracts the first instance of a UseARNRegion from the config slice. // Additionally returns a boolean to indicate if the value was found in provided configs, and error if one is encountered. func ResolveUseARNRegion(ctx context.Context, configs []interface{}) (value bool, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(UseARNRegionProvider); ok { value, found, err = p.GetS3UseARNRegion(ctx) if err != nil || found { break } } } return } // ResolveDisableMultiRegionAccessPoints extracts the first instance of a DisableMultiRegionAccessPoints from the config slice. // Additionally returns a boolean to indicate if the value was found in provided configs, and error if one is encountered. func ResolveDisableMultiRegionAccessPoints(ctx context.Context, configs []interface{}) (value bool, found bool, err error) { for _, cfg := range configs { if p, ok := cfg.(DisableMultiRegionAccessPointsProvider); ok { value, found, err = p.GetS3DisableMultiRegionAccessPoints(ctx) if err != nil || found { break } } } return } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/endpoint_error.go ================================================ package s3shared import ( "fmt" "github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn" ) // TODO: fix these error statements to be relevant to v2 sdk const ( invalidARNErrorErrCode = "InvalidARNError" configurationErrorErrCode = "ConfigurationError" ) // InvalidARNError denotes the error for Invalid ARN type InvalidARNError struct { message string resource arn.Resource origErr error } // Error returns the InvalidARN error string func (e InvalidARNError) Error() string { var extra string if e.resource != nil { extra = "ARN: " + e.resource.String() } msg := invalidARNErrorErrCode + " : " + e.message if extra != "" { msg = msg + "\n\t" + extra } return msg } // OrigErr is the original error wrapped by Invalid ARN Error func (e InvalidARNError) Unwrap() error { return e.origErr } // NewInvalidARNError denotes invalid arn error func NewInvalidARNError(resource arn.Resource, err error) InvalidARNError { return InvalidARNError{ message: "invalid ARN", origErr: err, resource: resource, } } // NewInvalidARNWithUnsupportedPartitionError ARN not supported for the target partition func NewInvalidARNWithUnsupportedPartitionError(resource arn.Resource, err error) InvalidARNError { return InvalidARNError{ message: "resource ARN not supported for the target ARN partition", origErr: err, resource: resource, } } // NewInvalidARNWithFIPSError ARN not supported for FIPS region // // Deprecated: FIPS will not appear in the ARN region component. func NewInvalidARNWithFIPSError(resource arn.Resource, err error) InvalidARNError { return InvalidARNError{ message: "resource ARN not supported for FIPS region", resource: resource, origErr: err, } } // ConfigurationError is used to denote a client configuration error type ConfigurationError struct { message string resource arn.Resource clientPartitionID string clientRegion string origErr error } // Error returns the Configuration error string func (e ConfigurationError) Error() string { extra := fmt.Sprintf("ARN: %s, client partition: %s, client region: %s", e.resource, e.clientPartitionID, e.clientRegion) msg := configurationErrorErrCode + " : " + e.message if extra != "" { msg = msg + "\n\t" + extra } return msg } // OrigErr is the original error wrapped by Configuration Error func (e ConfigurationError) Unwrap() error { return e.origErr } // NewClientPartitionMismatchError stub func NewClientPartitionMismatchError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { return ConfigurationError{ message: "client partition does not match provided ARN partition", origErr: err, resource: resource, clientPartitionID: clientPartitionID, clientRegion: clientRegion, } } // NewClientRegionMismatchError denotes cross region access error func NewClientRegionMismatchError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { return ConfigurationError{ message: "client region does not match provided ARN region", origErr: err, resource: resource, clientPartitionID: clientPartitionID, clientRegion: clientRegion, } } // NewFailedToResolveEndpointError denotes endpoint resolving error func NewFailedToResolveEndpointError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { return ConfigurationError{ message: "endpoint resolver failed to find an endpoint for the provided ARN region", origErr: err, resource: resource, clientPartitionID: clientPartitionID, clientRegion: clientRegion, } } // NewClientConfiguredForFIPSError denotes client config error for unsupported cross region FIPS access func NewClientConfiguredForFIPSError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { return ConfigurationError{ message: "client configured for fips but cross-region resource ARN provided", origErr: err, resource: resource, clientPartitionID: clientPartitionID, clientRegion: clientRegion, } } // NewFIPSConfigurationError denotes a configuration error when a client or request is configured for FIPS func NewFIPSConfigurationError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { return ConfigurationError{ message: "use of ARN is not supported when client or request is configured for FIPS", origErr: err, resource: resource, clientPartitionID: clientPartitionID, clientRegion: clientRegion, } } // NewClientConfiguredForAccelerateError denotes client config error for unsupported S3 accelerate func NewClientConfiguredForAccelerateError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { return ConfigurationError{ message: "client configured for S3 Accelerate but is not supported with resource ARN", origErr: err, resource: resource, clientPartitionID: clientPartitionID, clientRegion: clientRegion, } } // NewClientConfiguredForCrossRegionFIPSError denotes client config error for unsupported cross region FIPS request func NewClientConfiguredForCrossRegionFIPSError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { return ConfigurationError{ message: "client configured for FIPS with cross-region enabled but is supported with cross-region resource ARN", origErr: err, resource: resource, clientPartitionID: clientPartitionID, clientRegion: clientRegion, } } // NewClientConfiguredForDualStackError denotes client config error for unsupported S3 Dual-stack func NewClientConfiguredForDualStackError(resource arn.Resource, clientPartitionID, clientRegion string, err error) ConfigurationError { return ConfigurationError{ message: "client configured for S3 Dual-stack but is not supported with resource ARN", origErr: err, resource: resource, clientPartitionID: clientPartitionID, clientRegion: clientRegion, } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go ================================================ // Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. package s3shared // goModuleVersion is the tagged release for this module const goModuleVersion = "1.18.15" ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/host_id.go ================================================ package s3shared import ( "github.com/aws/smithy-go/middleware" ) // hostID is used to retrieve host id from response metadata type hostID struct { } // SetHostIDMetadata sets the provided host id over middleware metadata func SetHostIDMetadata(metadata *middleware.Metadata, id string) { metadata.Set(hostID{}, id) } // GetHostIDMetadata retrieves the host id from middleware metadata // returns host id as string along with a boolean indicating presence of // hostId on middleware metadata. func GetHostIDMetadata(metadata middleware.Metadata) (string, bool) { if !metadata.Has(hostID{}) { return "", false } v, ok := metadata.Get(hostID{}).(string) if !ok { return "", true } return v, true } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/metadata.go ================================================ package s3shared import ( "context" "github.com/aws/smithy-go/middleware" ) // clonedInputKey used to denote if request input was cloned. type clonedInputKey struct{} // SetClonedInputKey sets a key on context to denote input was cloned previously. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func SetClonedInputKey(ctx context.Context, value bool) context.Context { return middleware.WithStackValue(ctx, clonedInputKey{}, value) } // IsClonedInput retrieves if context key for cloned input was set. // If set, we can infer that the reuqest input was cloned previously. // // Scoped to stack values. Use github.com/aws/smithy-go/middleware#ClearStackValues // to clear all stack values. func IsClonedInput(ctx context.Context) bool { v, _ := middleware.GetStackValue(ctx, clonedInputKey{}).(bool) return v } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/metadata_retriever.go ================================================ package s3shared import ( "context" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" ) const metadataRetrieverID = "S3MetadataRetriever" // AddMetadataRetrieverMiddleware adds request id, host id retriever middleware func AddMetadataRetrieverMiddleware(stack *middleware.Stack) error { // add metadata retriever middleware before operation deserializers so that it can retrieve metadata such as // host id, request id from response header returned by operation deserializers return stack.Deserialize.Insert(&metadataRetriever{}, "OperationDeserializer", middleware.Before) } type metadataRetriever struct { } // ID returns the middleware identifier func (m *metadataRetriever) ID() string { return metadataRetrieverID } func (m *metadataRetriever) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) span, _ := tracing.GetSpan(ctx) resp, ok := out.RawResponse.(*smithyhttp.Response) if !ok { // No raw response to wrap with. return out, metadata, err } // check for header for Request id if v := resp.Header.Get("X-Amz-Request-Id"); len(v) != 0 { // set reqID on metadata for successful responses. awsmiddleware.SetRequestIDMetadata(&metadata, v) span.SetProperty("aws.request_id", v) } // look up host-id if v := resp.Header.Get("X-Amz-Id-2"); len(v) != 0 { // set reqID on metadata for successful responses. SetHostIDMetadata(&metadata, v) span.SetProperty("aws.extended_request_id", v) } return out, metadata, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/resource_request.go ================================================ package s3shared import ( "fmt" "strings" awsarn "github.com/aws/aws-sdk-go-v2/aws/arn" "github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn" ) // ResourceRequest represents an ARN resource and api request metadata type ResourceRequest struct { Resource arn.Resource // RequestRegion is the region configured on the request config RequestRegion string // SigningRegion is the signing region resolved for the request SigningRegion string // PartitionID is the resolved partition id for the provided request region PartitionID string // UseARNRegion indicates if client should use the region provided in an ARN resource UseARNRegion bool // UseFIPS indicates if te client is configured for FIPS UseFIPS bool } // ARN returns the resource ARN func (r ResourceRequest) ARN() awsarn.ARN { return r.Resource.GetARN() } // ResourceConfiguredForFIPS returns true if resource ARNs region is FIPS // // Deprecated: FIPS will not be present in the ARN region func (r ResourceRequest) ResourceConfiguredForFIPS() bool { return IsFIPS(r.ARN().Region) } // AllowCrossRegion returns a bool value to denote if S3UseARNRegion flag is set func (r ResourceRequest) AllowCrossRegion() bool { return r.UseARNRegion } // IsCrossPartition returns true if request is configured for region of another partition, than // the partition that resource ARN region resolves to. IsCrossPartition will not return an error, // if request is not configured with a specific partition id. This might happen if customer provides // custom endpoint url, but does not associate a partition id with it. func (r ResourceRequest) IsCrossPartition() (bool, error) { rv := r.PartitionID if len(rv) == 0 { return false, nil } av := r.Resource.GetARN().Partition if len(av) == 0 { return false, fmt.Errorf("no partition id for provided ARN") } return !strings.EqualFold(rv, av), nil } // IsCrossRegion returns true if request signing region is not same as arn region func (r ResourceRequest) IsCrossRegion() bool { v := r.SigningRegion return !strings.EqualFold(v, r.Resource.GetARN().Region) } // IsFIPS returns true if region is a fips pseudo-region // // Deprecated: FIPS should be specified via EndpointOptions. func IsFIPS(region string) bool { return strings.HasPrefix(region, "fips-") || strings.HasSuffix(region, "-fips") } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/response_error.go ================================================ package s3shared import ( "errors" "fmt" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" ) // ResponseError provides the HTTP centric error type wrapping the underlying error // with the HTTP response value and the deserialized RequestID. type ResponseError struct { *awshttp.ResponseError // HostID associated with response error HostID string } // ServiceHostID returns the host id associated with Response Error func (e *ResponseError) ServiceHostID() string { return e.HostID } // Error returns the formatted error func (e *ResponseError) Error() string { return fmt.Sprintf( "https response error StatusCode: %d, RequestID: %s, HostID: %s, %v", e.Response.StatusCode, e.RequestID, e.HostID, e.Err) } // As populates target and returns true if the type of target is a error type that // the ResponseError embeds, (e.g.S3 HTTP ResponseError) func (e *ResponseError) As(target interface{}) bool { return errors.As(e.ResponseError, target) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/response_error_middleware.go ================================================ package s3shared import ( "context" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // AddResponseErrorMiddleware adds response error wrapper middleware func AddResponseErrorMiddleware(stack *middleware.Stack) error { // add error wrapper middleware before request id retriever middleware so that it can wrap the error response // returned by operation deserializers return stack.Deserialize.Insert(&errorWrapper{}, metadataRetrieverID, middleware.Before) } type errorWrapper struct { } // ID returns the middleware identifier func (m *errorWrapper) ID() string { return "ResponseErrorWrapper" } func (m *errorWrapper) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err == nil { // Nothing to do when there is no error. return out, metadata, err } resp, ok := out.RawResponse.(*smithyhttp.Response) if !ok { // No raw response to wrap with. return out, metadata, err } // look for request id in metadata reqID, _ := awsmiddleware.GetRequestIDMetadata(metadata) // look for host id in metadata hostID, _ := GetHostIDMetadata(metadata) // Wrap the returned smithy error with the request id retrieved from the metadata err = &ResponseError{ ResponseError: &awshttp.ResponseError{ ResponseError: &smithyhttp.ResponseError{ Response: resp, Err: err, }, RequestID: reqID, }, HostID: hostID, } return out, metadata, err } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/s3100continue.go ================================================ package s3shared import ( "context" "fmt" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) const s3100ContinueID = "S3100Continue" const default100ContinueThresholdBytes int64 = 1024 * 1024 * 2 // Add100Continue add middleware, which adds {Expect: 100-continue} header for s3 client HTTP PUT request larger than 2MB // or with unknown size streaming bodies, during operation builder step func Add100Continue(stack *middleware.Stack, continueHeaderThresholdBytes int64) error { return stack.Build.Add(&s3100Continue{ continueHeaderThresholdBytes: continueHeaderThresholdBytes, }, middleware.After) } type s3100Continue struct { continueHeaderThresholdBytes int64 } // ID returns the middleware identifier func (m *s3100Continue) ID() string { return s3100ContinueID } func (m *s3100Continue) HandleBuild( ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, ) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { sizeLimit := default100ContinueThresholdBytes switch { case m.continueHeaderThresholdBytes == -1: return next.HandleBuild(ctx, in) case m.continueHeaderThresholdBytes > 0: sizeLimit = m.continueHeaderThresholdBytes default: } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown request type %T", req) } if req.ContentLength == -1 || (req.ContentLength == 0 && req.Body != nil) || req.ContentLength >= sizeLimit { req.Header.Set("Expect", "100-continue") } return next.HandleBuild(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/update_endpoint.go ================================================ package s3shared import ( "context" "fmt" "strings" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" awsmiddle "github.com/aws/aws-sdk-go-v2/aws/middleware" ) // EnableDualstack represents middleware struct for enabling dualstack support // // Deprecated: See EndpointResolverOptions' UseDualStackEndpoint support type EnableDualstack struct { // UseDualstack indicates if dualstack endpoint resolving is to be enabled UseDualstack bool // DefaultServiceID is the service id prefix used in endpoint resolving // by default service-id is 's3' and 's3-control' for service s3, s3control. DefaultServiceID string } // ID returns the middleware ID. func (*EnableDualstack) ID() string { return "EnableDualstack" } // HandleSerialize handles serializer middleware behavior when middleware is executed func (u *EnableDualstack) HandleSerialize( ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, ) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { // check for host name immutable property if smithyhttp.GetHostnameImmutable(ctx) { return next.HandleSerialize(ctx, in) } serviceID := awsmiddle.GetServiceID(ctx) // s3-control may be represented as `S3 Control` as in model if serviceID == "S3 Control" { serviceID = "s3-control" } if len(serviceID) == 0 { // default service id serviceID = u.DefaultServiceID } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown request type %T", req) } if u.UseDualstack { parts := strings.Split(req.URL.Host, ".") if len(parts) < 3 { return out, metadata, fmt.Errorf("unable to update endpoint host for dualstack, hostname invalid, %s", req.URL.Host) } for i := 0; i+1 < len(parts); i++ { if strings.EqualFold(parts[i], serviceID) { parts[i] = parts[i] + ".dualstack" break } } // construct the url host req.URL.Host = strings.Join(parts, ".") } return next.HandleSerialize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/xml_utils.go ================================================ package s3shared import ( "encoding/xml" "fmt" "io" "net/http" "strings" ) // ErrorComponents represents the error response fields // that will be deserialized from an xml error response body type ErrorComponents struct { Code string `xml:"Code"` Message string `xml:"Message"` RequestID string `xml:"RequestId"` HostID string `xml:"HostId"` } // GetUnwrappedErrorResponseComponents returns the error fields from an xml error response body func GetUnwrappedErrorResponseComponents(r io.Reader) (ErrorComponents, error) { var errComponents ErrorComponents if err := xml.NewDecoder(r).Decode(&errComponents); err != nil && err != io.EOF { return ErrorComponents{}, fmt.Errorf("error while deserializing xml error response : %w", err) } return errComponents, nil } // GetWrappedErrorResponseComponents returns the error fields from an xml error response body // in which error code, and message are wrapped by a tag func GetWrappedErrorResponseComponents(r io.Reader) (ErrorComponents, error) { var errComponents struct { Code string `xml:"Error>Code"` Message string `xml:"Error>Message"` RequestID string `xml:"RequestId"` HostID string `xml:"HostId"` } if err := xml.NewDecoder(r).Decode(&errComponents); err != nil && err != io.EOF { return ErrorComponents{}, fmt.Errorf("error while deserializing xml error response : %w", err) } return ErrorComponents{ Code: errComponents.Code, Message: errComponents.Message, RequestID: errComponents.RequestID, HostID: errComponents.HostID, }, nil } // GetErrorResponseComponents retrieves error components according to passed in options func GetErrorResponseComponents(r io.Reader, options ErrorResponseDeserializerOptions) (ErrorComponents, error) { var errComponents ErrorComponents var err error if options.IsWrappedWithErrorTag { errComponents, err = GetWrappedErrorResponseComponents(r) } else { errComponents, err = GetUnwrappedErrorResponseComponents(r) } if err != nil { return ErrorComponents{}, err } // If an error code or message is not retrieved, it is derived from the http status code // eg, for S3 service, we derive err code and message, if none is found if options.UseStatusCode && len(errComponents.Code) == 0 && len(errComponents.Message) == 0 { // derive code and message from status code statusText := http.StatusText(options.StatusCode) errComponents.Code = strings.Replace(statusText, " ", "", -1) errComponents.Message = statusText } return errComponents, nil } // ErrorResponseDeserializerOptions represents error response deserializer options for s3 and s3-control service type ErrorResponseDeserializerOptions struct { // UseStatusCode denotes if status code should be used to retrieve error code, msg UseStatusCode bool // StatusCode is status code of error response StatusCode int //IsWrappedWithErrorTag represents if error response's code, msg is wrapped within an // additional tag IsWrappedWithErrorTag bool } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md ================================================ # v1.79.3 (2025-04-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.79.2 (2025-04-10) * No change notes available for this release. # v1.79.1 (2025-04-03) * No change notes available for this release. # v1.79.0 (2025-03-31) * **Feature**: Amazon S3 adds support for S3 Access Points for directory buckets in AWS Dedicated Local Zones # v1.78.2 (2025-03-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.78.1 (2025-03-04.2) * **Bug Fix**: Add assurance test for operation order. # v1.78.0 (2025-02-27) * **Feature**: Track credential providers via User-Agent Feature ids * **Dependency Update**: Updated to the latest SDK module versions # v1.77.1 (2025-02-18) * **Bug Fix**: Bump go version to 1.22 * **Dependency Update**: Updated to the latest SDK module versions # v1.77.0 (2025-02-14) * **Feature**: Added support for Content-Range header in HeadObject response. * **Dependency Update**: Updated to the latest SDK module versions # v1.76.1 (2025-02-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.76.0 (2025-02-06) * **Feature**: Updated list of the valid AWS Region values for the LocationConstraint parameter for general purpose buckets. # v1.75.4 (2025-02-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.75.3 (2025-02-04) * No change notes available for this release. # v1.75.2 (2025-01-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.75.1 (2025-01-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.75.0 (2025-01-29) * **Feature**: Change the type of MpuObjectSize in CompleteMultipartUploadRequest from int to long. # v1.74.1 (2025-01-24) * **Bug Fix**: Enable request checksum validation mode by default * **Dependency Update**: Updated to the latest SDK module versions * **Dependency Update**: Upgrade to smithy-go v1.22.2. # v1.74.0 (2025-01-22) * **Feature**: Add a client config option to disable logging when output checksum validation is skipped due to an unsupported algorithm. # v1.73.2 (2025-01-17) * **Bug Fix**: Fix bug where credentials weren't refreshed during retry loop. * **Dependency Update**: Updated to the latest SDK module versions # v1.73.1 (2025-01-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.73.0 (2025-01-15) * **Feature**: S3 client behavior is updated to always calculate a checksum by default for operations that support it (such as PutObject or UploadPart), or require it (such as DeleteObjects). The checksum algorithm used by default now becomes CRC32. Checksum behavior can be configured using `when_supported` and `when_required` options - in code using RequestChecksumCalculation, in shared config using request_checksum_calculation, or as env variable using AWS_REQUEST_CHECKSUM_CALCULATION. The S3 client attempts to validate response checksums for all S3 API operations that support checksums. However, if the SDK has not implemented the specified checksum algorithm then this validation is skipped. Checksum validation behavior can be configured using `when_supported` and `when_required` options - in code using ResponseChecksumValidation, in shared config using response_checksum_validation, or as env variable using AWS_RESPONSE_CHECKSUM_VALIDATION. * **Feature**: This change enhances integrity protections for new SDK requests to S3. S3 SDKs now support the CRC64NVME checksum algorithm, full object checksums for multipart S3 objects, and new default integrity protections for S3 requests. * **Dependency Update**: Updated to the latest SDK module versions # v1.72.3 (2025-01-14) * **Bug Fix**: Fix issue where waiters were not failing on unmatched errors as they should. This may have breaking behavioral changes for users in fringe cases. See [this announcement](https://github.com/aws/aws-sdk-go-v2/discussions/2954) for more information. # v1.72.2 (2025-01-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.72.1 (2025-01-08) * No change notes available for this release. # v1.72.0 (2025-01-03) * **Feature**: This change is only for updating the model regexp of CopySource which is not for validation but only for documentation and user guide change. # v1.71.1 (2024-12-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.71.0 (2024-12-03.2) * **Feature**: Amazon S3 Metadata stores object metadata in read-only, fully managed Apache Iceberg metadata tables that you can query. You can create metadata table configurations for S3 general purpose buckets. # v1.70.0 (2024-12-02) * **Feature**: Amazon S3 introduces support for AWS Dedicated Local Zones * **Dependency Update**: Updated to the latest SDK module versions # v1.69.0 (2024-11-25) * **Feature**: Amazon Simple Storage Service / Features: Add support for ETag based conditional writes in PutObject and CompleteMultiPartUpload APIs to prevent unintended object modifications. # v1.68.0 (2024-11-21) * **Feature**: Add support for conditional deletes for the S3 DeleteObject and DeleteObjects APIs. Add support for write offset bytes option used to append to objects with the S3 PutObject API. # v1.67.1 (2024-11-18) * **Dependency Update**: Update to smithy-go v1.22.1. * **Dependency Update**: Updated to the latest SDK module versions # v1.67.0 (2024-11-14) * **Feature**: This release updates the ListBuckets API Reference documentation in support of the new 10,000 general purpose bucket default quota on all AWS accounts. To increase your bucket quota from 10,000 to up to 1 million buckets, simply request a quota increase via Service Quotas. # v1.66.3 (2024-11-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.66.2 (2024-10-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.66.1 (2024-10-25) * **Bug Fix**: Update presign post URL resolution to use the exact result from EndpointResolverV2 # v1.66.0 (2024-10-16) * **Feature**: Add support for the new optional bucket-region and prefix query parameters in the ListBuckets API. For ListBuckets requests that express pagination, Amazon S3 will now return both the bucket names and associated AWS regions in the response. # v1.65.3 (2024-10-11) * **Bug Fix**: **BREAKING CHANGE**: S3 ReplicationRuleFilter and LifecycleRuleFilter shapes are being changed from union to structure types # v1.65.2 (2024-10-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.65.1 (2024-10-07) * **Bug Fix**: **CHANGE IN BEHAVIOR**: Allow serialization of headers with empty string for prefix headers. We are deploying this fix because the behavior is actively preventing users from transmitting keys with empty values to the service. If you were setting metadata keys with empty values before this change, they will now actually be sent to the service. * **Dependency Update**: Updated to the latest SDK module versions # v1.65.0 (2024-10-04) * **Feature**: Add support for HTTP client metrics. * **Dependency Update**: Updated to the latest SDK module versions # v1.64.1 (2024-10-03) * No change notes available for this release. # v1.64.0 (2024-10-02) * **Feature**: This release introduces a header representing the minimum object size limit for Lifecycle transitions. # v1.63.3 (2024-09-27) * No change notes available for this release. # v1.63.2 (2024-09-25) * No change notes available for this release. # v1.63.1 (2024-09-23) * No change notes available for this release. # v1.63.0 (2024-09-20) * **Feature**: Add tracing and metrics support to service clients. * **Dependency Update**: Updated to the latest SDK module versions # v1.62.0 (2024-09-18) * **Feature**: Added SSE-KMS support for directory buckets. # v1.61.3 (2024-09-17) * **Bug Fix**: **BREAKFIX**: Only generate AccountIDEndpointMode config for services that use it. This is a compiler break, but removes no actual functionality, as no services currently use the account ID in endpoint resolution. # v1.61.2 (2024-09-04) * No change notes available for this release. # v1.61.1 (2024-09-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.61.0 (2024-08-28) * **Feature**: Add presignPost for s3 PutObject # v1.60.1 (2024-08-22) * No change notes available for this release. # v1.60.0 (2024-08-20) * **Feature**: Amazon Simple Storage Service / Features : Add support for conditional writes for PutObject and CompleteMultipartUpload APIs. # v1.59.0 (2024-08-15) * **Feature**: Amazon Simple Storage Service / Features : Adds support for pagination in the S3 ListBuckets API. * **Dependency Update**: Bump minimum Go version to 1.21. * **Dependency Update**: Updated to the latest SDK module versions # v1.58.3 (2024-08-02) * **Bug Fix**: Add assurance tests for auth scheme selection logic. # v1.58.2 (2024-07-10.2) * **Dependency Update**: Updated to the latest SDK module versions # v1.58.1 (2024-07-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.58.0 (2024-07-02) * **Feature**: Added response overrides to Head Object requests. # v1.57.1 (2024-06-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.57.0 (2024-06-26) * **Feature**: Support list-of-string endpoint parameter. # v1.56.1 (2024-06-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.56.0 (2024-06-18) * **Feature**: Track usage of various AWS SDK features in user-agent string. * **Dependency Update**: Updated to the latest SDK module versions # v1.55.2 (2024-06-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.55.1 (2024-06-07) * **Bug Fix**: Add clock skew correction on all service clients * **Dependency Update**: Updated to the latest SDK module versions # v1.55.0 (2024-06-05) * **Feature**: Added new params copySource and key to copyObject API for supporting S3 Access Grants plugin. These changes will not change any of the existing S3 API functionality. * **Bug Fix**: Add S3-specific smithy protocol tests. # v1.54.4 (2024-06-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.54.3 (2024-05-23) * **Bug Fix**: Prevent parsing failures for nonstandard `Expires` values in responses. If the SDK cannot parse the value set in the response header for this field it will now be returned as `nil`. A new field, `ExpiresString`, has been added that will retain the unparsed value from the response (regardless of whether it came back in a format recognized by the SDK). # v1.54.2 (2024-05-16) * **Dependency Update**: Updated to the latest SDK module versions # v1.54.1 (2024-05-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.54.0 (2024-05-14) * **Feature**: Updated a few x-id in the http uri traits # v1.53.2 (2024-05-08) * **Bug Fix**: GoDoc improvement # v1.53.1 (2024-03-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.53.0 (2024-03-18) * **Feature**: Fix two issues with response root node names. * **Dependency Update**: Updated to the latest SDK module versions # v1.52.1 (2024-03-15) * **Documentation**: Documentation updates for Amazon S3. # v1.52.0 (2024-03-13) * **Feature**: This release makes the default option for S3 on Outposts request signing to use the SigV4A algorithm when using AWS Common Runtime (CRT). # v1.51.4 (2024-03-07) * **Bug Fix**: Remove dependency on go-cmp. * **Dependency Update**: Updated to the latest SDK module versions # v1.51.3 (2024-03-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.51.2 (2024-03-04) * **Bug Fix**: Update internal/presigned-url dependency for corrected API name. * **Dependency Update**: Updated to the latest SDK module versions # v1.51.1 (2024-02-23) * **Bug Fix**: Move all common, SDK-side middleware stack ops into the service client module to prevent cross-module compatibility issues in the future. * **Dependency Update**: Updated to the latest SDK module versions # v1.51.0 (2024-02-22) * **Feature**: Add middleware stack snapshot tests. # v1.50.3 (2024-02-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.50.2 (2024-02-20) * **Bug Fix**: When sourcing values for a service's `EndpointParameters`, the lack of a configured region (i.e. `options.Region == ""`) will now translate to a `nil` value for `EndpointParameters.Region` instead of a pointer to the empty string `""`. This will result in a much more explicit error when calling an operation instead of an obscure hostname lookup failure. # v1.50.1 (2024-02-19) * **Bug Fix**: Prevent potential panic caused by invalid comparison of credentials. # v1.50.0 (2024-02-16) * **Feature**: Add new ClientOptions field to waiter config which allows you to extend the config for operation calls made by waiters. # v1.49.0 (2024-02-13) * **Feature**: Bump minimum Go version to 1.20 per our language support policy. * **Dependency Update**: Updated to the latest SDK module versions # v1.48.1 (2024-01-24) * No change notes available for this release. # v1.48.0 (2024-01-05) * **Feature**: Support smithy sigv4a trait for codegen. # v1.47.8 (2024-01-04) * **Dependency Update**: Updated to the latest SDK module versions # v1.47.7 (2023-12-20) * No change notes available for this release. # v1.47.6 (2023-12-18) * No change notes available for this release. # v1.47.5 (2023-12-08) * **Bug Fix**: Add non-vhostable buckets to request path when using legacy V1 endpoint resolver. * **Bug Fix**: Improve uniqueness of default S3Express sesssion credentials cache keying to prevent collision in multi-credential scenarios. * **Bug Fix**: Reinstate presence of default Retryer in functional options, but still respect max attempts set therein. # v1.47.4 (2023-12-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.47.3 (2023-12-06) * **Bug Fix**: Restore pre-refactor auth behavior where all operations could technically be performed anonymously. # v1.47.2 (2023-12-01) * **Bug Fix**: Correct wrapping of errors in authentication workflow. * **Bug Fix**: Correctly recognize cache-wrapped instances of AnonymousCredentials at client construction. * **Dependency Update**: Updated to the latest SDK module versions # v1.47.1 (2023-11-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.47.0 (2023-11-29) * **Feature**: Expose Options() accessor on service clients. * **Dependency Update**: Updated to the latest SDK module versions # v1.46.0 (2023-11-28.2) * **Feature**: Add S3Express support. * **Feature**: Adds support for S3 Express One Zone. * **Dependency Update**: Updated to the latest SDK module versions # v1.45.1 (2023-11-28) * **Bug Fix**: Respect setting RetryMaxAttempts in functional options at client construction. # v1.45.0 (2023-11-27) * **Feature**: Adding new params - Key and Prefix, to S3 API operations for supporting S3 Access Grants. Note - These updates will not change any of the existing S3 API functionality. # v1.44.0 (2023-11-21) * **Feature**: Add support for automatic date based partitioning in S3 Server Access Logs. * **Bug Fix**: Don't send MaxKeys/MaxUploads=0 when unspecified in ListObjectVersions and ListMultipartUploads paginators. # v1.43.1 (2023-11-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.43.0 (2023-11-17) * **Feature**: **BREAKING CHANGE** Correct nullability of a large number of S3 structure fields. See https://github.com/aws/aws-sdk-go-v2/issues/2162. * **Feature**: Removes all default 0 values for numbers and false values for booleans # v1.42.2 (2023-11-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.42.1 (2023-11-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.42.0 (2023-11-01) * **Feature**: Adds support for configured endpoints via environment variables and the AWS shared configuration file. * **Dependency Update**: Updated to the latest SDK module versions # v1.41.0 (2023-10-31) * **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/). * **Dependency Update**: Updated to the latest SDK module versions # v1.40.2 (2023-10-12) * **Dependency Update**: Updated to the latest SDK module versions # v1.40.1 (2023-10-06) * **Dependency Update**: Updated to the latest SDK module versions # v1.40.0 (2023-09-26) * **Feature**: This release adds a new field COMPLETED to the ReplicationStatus Enum. You can now use this field to validate the replication status of S3 objects using the AWS SDK. # v1.39.0 (2023-09-20) * **Feature**: Fix an issue where the SDK can fail to unmarshall response due to NumberFormatException # v1.38.5 (2023-08-21) * **Dependency Update**: Updated to the latest SDK module versions # v1.38.4 (2023-08-18) * **Dependency Update**: Updated to the latest SDK module versions # v1.38.3 (2023-08-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.38.2 (2023-08-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.38.1 (2023-08-01) * No change notes available for this release. # v1.38.0 (2023-07-31) * **Feature**: Adds support for smithy-modeled endpoint resolution. A new rules-based endpoint resolution will be added to the SDK which will supercede and deprecate existing endpoint resolution. Specifically, EndpointResolver will be deprecated while BaseEndpoint and EndpointResolverV2 will take its place. For more information, please see the Endpoints section in our Developer Guide. * **Dependency Update**: Updated to the latest SDK module versions # v1.37.1 (2023-07-28) * **Dependency Update**: Updated to the latest SDK module versions # v1.37.0 (2023-07-13) * **Feature**: S3 Inventory now supports Object Access Control List and Object Owner as available object metadata fields in inventory reports. * **Dependency Update**: Updated to the latest SDK module versions # v1.36.0 (2023-06-28) * **Feature**: The S3 LISTObjects, ListObjectsV2 and ListObjectVersions API now supports a new optional header x-amz-optional-object-attributes. If header contains RestoreStatus as the value, then S3 will include Glacier restore status i.e. isRestoreInProgress and RestoreExpiryDate in List response. # v1.35.0 (2023-06-16) * **Feature**: This release adds SDK support for request-payer request header and request-charged response header in the "GetBucketAccelerateConfiguration", "ListMultipartUploads", "ListObjects", "ListObjectsV2" and "ListObjectVersions" S3 APIs. # v1.34.1 (2023-06-15) * No change notes available for this release. # v1.34.0 (2023-06-13) * **Feature**: Integrate double encryption feature to SDKs. * **Bug Fix**: Fix HeadObject to return types.Nound when an object does not exist. Fixes [2084](https://github.com/aws/aws-sdk-go-v2/issues/2084) * **Dependency Update**: Updated to the latest SDK module versions # v1.33.1 (2023-05-04) * **Documentation**: Documentation updates for Amazon S3 # v1.33.0 (2023-04-24) * **Feature**: added custom paginators for listMultipartUploads and ListObjectVersions * **Dependency Update**: Updated to the latest SDK module versions # v1.32.0 (2023-04-19) * **Feature**: Provides support for "Snow" Storage class. # v1.31.3 (2023-04-10) * No change notes available for this release. # v1.31.2 (2023-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.31.1 (2023-03-31) * **Documentation**: Documentation updates for Amazon S3 # v1.31.0 (2023-03-21) * **Feature**: port v1 sdk 100-continue http header customization for s3 PutObject/UploadPart request and enable user config * **Dependency Update**: Updated to the latest SDK module versions # v1.30.6 (2023-03-10) * **Dependency Update**: Updated to the latest SDK module versions # v1.30.5 (2023-02-22) * **Bug Fix**: Prevent nil pointer dereference when retrieving error codes. # v1.30.4 (2023-02-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.30.3 (2023-02-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.30.2 (2023-02-03) * **Dependency Update**: Updated to the latest SDK module versions # v1.30.1 (2023-01-23) * No change notes available for this release. # v1.30.0 (2023-01-05) * **Feature**: Add `ErrorCodeOverride` field to all error structs (aws/smithy-go#401). # v1.29.6 (2022-12-15) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.5 (2022-12-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.4 (2022-11-22) * No change notes available for this release. # v1.29.3 (2022-11-16) * No change notes available for this release. # v1.29.2 (2022-11-10) * No change notes available for this release. # v1.29.1 (2022-10-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.29.0 (2022-10-21) * **Feature**: S3 on Outposts launches support for automatic bucket-style alias. You can use the automatic access point alias instead of an access point ARN for any object-level operation in an Outposts bucket. * **Bug Fix**: The SDK client has been updated to utilize the `aws.IsCredentialsProvider` function for determining if `aws.AnonymousCredentials` has been configured for the `CredentialProvider`. * **Dependency Update**: Updated to the latest SDK module versions # v1.28.0 (2022-10-19) * **Feature**: Updates internal logic for constructing API endpoints. We have added rule-based endpoints and internal model parameters. # v1.27.11 (2022-09-20) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.10 (2022-09-14) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.9 (2022-09-02) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.8 (2022-08-31) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.7 (2022-08-30) * No change notes available for this release. # v1.27.6 (2022-08-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.5 (2022-08-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.4 (2022-08-09) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.3 (2022-08-08) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.2 (2022-08-01) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.1 (2022-07-05) * **Dependency Update**: Updated to the latest SDK module versions # v1.27.0 (2022-07-01) * **Feature**: Add presign support for HeadBucket, DeleteObject, and DeleteBucket. Fixes [#1076](https://github.com/aws/aws-sdk-go-v2/issues/1076). # v1.26.12 (2022-06-29) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.11 (2022-06-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.10 (2022-05-17) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.9 (2022-05-06) * No change notes available for this release. # v1.26.8 (2022-05-03) * **Documentation**: Documentation only update for doc bug fixes for the S3 API docs. # v1.26.7 (2022-04-27) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.6 (2022-04-25) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.5 (2022-04-12) * **Bug Fix**: Fixes an issue that caused the unexported constructor function names for EventStream types to be swapped for the event reader and writer respectivly. # v1.26.4 (2022-04-07) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.3 (2022-03-30) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.2 (2022-03-24) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.1 (2022-03-23) * **Dependency Update**: Updated to the latest SDK module versions # v1.26.0 (2022-03-08) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.25.0 (2022-02-24) * **Feature**: API client updated * **Feature**: Adds RetryMaxAttempts and RetryMod to API client Options. This allows the API clients' default Retryer to be configured from the shared configuration files or environment variables. Adding a new Retry mode of `Adaptive`. `Adaptive` retry mode is an experimental mode, adding client rate limiting when throttles reponses are received from an API. See [retry.AdaptiveMode](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AdaptiveMode) for more details, and configuration options. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Bug Fix**: Fixes the AWS Sigv4 signer to trim header value's whitespace when computing the canonical headers block of the string to sign. * **Dependency Update**: Updated to the latest SDK module versions # v1.24.1 (2022-01-28) * **Bug Fix**: Updates SDK API client deserialization to pre-allocate byte slice and string response payloads, [#1565](https://github.com/aws/aws-sdk-go-v2/pull/1565). Thanks to [Tyson Mote](https://github.com/tysonmote) for submitting this PR. # v1.24.0 (2022-01-14) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.23.0 (2022-01-07) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Documentation**: API client updated * **Dependency Update**: Updated to the latest SDK module versions # v1.22.0 (2021-12-21) * **Feature**: API Paginators now support specifying the initial starting token, and support stopping on empty string tokens. * **Feature**: Updated to latest service endpoints # v1.21.0 (2021-12-02) * **Feature**: API client updated * **Bug Fix**: Fixes a bug that prevented aws.EndpointResolverWithOptions from being used by the service client. ([#1514](https://github.com/aws/aws-sdk-go-v2/pull/1514)) * **Dependency Update**: Updated to the latest SDK module versions # v1.20.0 (2021-11-30) * **Feature**: API client updated # v1.19.1 (2021-11-19) * **Dependency Update**: Updated to the latest SDK module versions # v1.19.0 (2021-11-12) * **Feature**: Waiters now have a `WaitForOutput` method, which can be used to retrieve the output of the successful wait operation. Thank you to [Andrew Haines](https://github.com/haines) for contributing this feature. # v1.18.0 (2021-11-06) * **Feature**: Support has been added for the SelectObjectContent API. * **Feature**: The SDK now supports configuration of FIPS and DualStack endpoints using environment variables, shared configuration, or programmatically. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Feature**: Updated service to latest API model. * **Dependency Update**: Updated to the latest SDK module versions # v1.17.0 (2021-10-21) * **Feature**: Updated to latest version * **Feature**: Updates S3 streaming operations - PutObject, UploadPart, WriteGetObjectResponse to use unsigned payload signing auth when TLS is enabled. * **Dependency Update**: Updated to the latest SDK module versions # v1.16.1 (2021-10-11) * **Dependency Update**: Updated to the latest SDK module versions # v1.16.0 (2021-09-17) * **Feature**: Updated API client and endpoints to latest revision. * **Dependency Update**: Updated to the latest SDK module versions # v1.15.1 (2021-09-10) * No change notes available for this release. # v1.15.0 (2021-09-02) * **Feature**: API client updated * **Feature**: Add support for S3 Multi-Region Access Point ARNs. * **Dependency Update**: Updated to the latest SDK module versions # v1.14.0 (2021-08-27) * **Feature**: Updated API model to latest revision. * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.13.0 (2021-08-19) * **Feature**: API client updated * **Dependency Update**: Updated to the latest SDK module versions # v1.12.0 (2021-08-04) * **Feature**: Add `HeadObject` presign support. ([#1346](https://github.com/aws/aws-sdk-go-v2/pull/1346)) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version. * **Dependency Update**: Updated to the latest SDK module versions # v1.11.1 (2021-07-15) * **Dependency Update**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.11.0 (2021-06-25) * **Feature**: Updated `github.com/aws/smithy-go` to latest version * **Dependency Update**: Updated to the latest SDK module versions # v1.10.0 (2021-06-04) * **Feature**: The handling of AccessPoint and Outpost ARNs have been updated. * **Feature**: Updated service client to latest API model. * **Dependency Update**: Updated to the latest SDK module versions # v1.9.0 (2021-05-25) * **Feature**: API client updated # v1.8.0 (2021-05-20) * **Feature**: API client updated * **Dependency Update**: Updated to the latest SDK module versions # v1.7.0 (2021-05-14) * **Feature**: Constant has been added to modules to enable runtime version inspection for reporting. * **Feature**: Updated to latest service API model. * **Dependency Update**: Updated to the latest SDK module versions ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/LICENSE.txt ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "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. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "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. "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). "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. "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." "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. 2. 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. 3. 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. 4. 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: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (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 (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. You 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To 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. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_client.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/defaults" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/retry" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" internalauth "github.com/aws/aws-sdk-go-v2/internal/auth" internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy" internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" internalmiddleware "github.com/aws/aws-sdk-go-v2/internal/middleware" "github.com/aws/aws-sdk-go-v2/internal/v4a" acceptencodingcust "github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" presignedurlcust "github.com/aws/aws-sdk-go-v2/service/internal/presigned-url" "github.com/aws/aws-sdk-go-v2/service/internal/s3shared" s3sharedconfig "github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" smithy "github.com/aws/smithy-go" smithyauth "github.com/aws/smithy-go/auth" smithydocument "github.com/aws/smithy-go/document" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "net" "net/http" "sync/atomic" "time" ) const ServiceID = "S3" const ServiceAPIVersion = "2006-03-01" type operationMetrics struct { Duration metrics.Float64Histogram SerializeDuration metrics.Float64Histogram ResolveIdentityDuration metrics.Float64Histogram ResolveEndpointDuration metrics.Float64Histogram SignRequestDuration metrics.Float64Histogram DeserializeDuration metrics.Float64Histogram } func (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram { switch name { case "client.call.duration": return m.Duration case "client.call.serialization_duration": return m.SerializeDuration case "client.call.resolve_identity_duration": return m.ResolveIdentityDuration case "client.call.resolve_endpoint_duration": return m.ResolveEndpointDuration case "client.call.signing_duration": return m.SignRequestDuration case "client.call.deserialization_duration": return m.DeserializeDuration default: panic("unrecognized operation metric") } } func timeOperationMetric[T any]( ctx context.Context, metric string, fn func() (T, error), opts ...metrics.RecordMetricOption, ) (T, error) { instr := getOperationMetrics(ctx).histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) start := time.Now() v, err := fn() end := time.Now() elapsed := end.Sub(start) instr.Record(ctx, float64(elapsed)/1e9, opts...) return v, err } func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() { instr := getOperationMetrics(ctx).histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) var ended bool start := time.Now() return func() { if ended { return } ended = true end := time.Now() elapsed := end.Sub(start) instr.Record(ctx, float64(elapsed)/1e9, opts...) } } func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { return func(o *metrics.RecordMetricOptions) { o.Properties.Set("rpc.service", middleware.GetServiceID(ctx)) o.Properties.Set("rpc.method", middleware.GetOperationName(ctx)) } } type operationMetricsKey struct{} func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) { meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/s3") om := &operationMetrics{} var err error om.Duration, err = operationMetricTimer(meter, "client.call.duration", "Overall call duration (including retries and time to send or receive request and response body)") if err != nil { return nil, err } om.SerializeDuration, err = operationMetricTimer(meter, "client.call.serialization_duration", "The time it takes to serialize a message body") if err != nil { return nil, err } om.ResolveIdentityDuration, err = operationMetricTimer(meter, "client.call.auth.resolve_identity_duration", "The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider") if err != nil { return nil, err } om.ResolveEndpointDuration, err = operationMetricTimer(meter, "client.call.resolve_endpoint_duration", "The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request") if err != nil { return nil, err } om.SignRequestDuration, err = operationMetricTimer(meter, "client.call.auth.signing_duration", "The time it takes to sign a request") if err != nil { return nil, err } om.DeserializeDuration, err = operationMetricTimer(meter, "client.call.deserialization_duration", "The time it takes to deserialize a message body") if err != nil { return nil, err } return context.WithValue(parent, operationMetricsKey{}, om), nil } func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) { return m.Float64Histogram(name, func(o *metrics.InstrumentOptions) { o.UnitLabel = "s" o.Description = desc }) } func getOperationMetrics(ctx context.Context) *operationMetrics { return ctx.Value(operationMetricsKey{}).(*operationMetrics) } func operationTracer(p tracing.TracerProvider) tracing.Tracer { return p.Tracer("github.com/aws/aws-sdk-go-v2/service/s3") } // Client provides the API client to make operations call for Amazon Simple // Storage Service. type Client struct { options Options // Difference between the time reported by the server and the client timeOffset *atomic.Int64 } // New returns an initialized Client based on the functional options. Provide // additional functional options to further configure the behavior of the client, // such as changing the client's endpoint or adding custom middleware behavior. func New(options Options, optFns ...func(*Options)) *Client { options = options.Copy() resolveDefaultLogger(&options) setResolvedDefaultsMode(&options) resolveRetryer(&options) resolveHTTPClient(&options) resolveHTTPSignerV4(&options) resolveEndpointResolverV2(&options) resolveHTTPSignerV4a(&options) resolveTracerProvider(&options) resolveMeterProvider(&options) resolveAuthSchemeResolver(&options) for _, fn := range optFns { fn(&options) } finalizeRetryMaxAttempts(&options) ignoreAnonymousAuth(&options) resolveExpressCredentials(&options) finalizeServiceEndpointAuthResolver(&options) resolveAuthSchemes(&options) client := &Client{ options: options, } finalizeExpressCredentials(&options, client) initializeTimeOffsetResolver(client) return client } // Options returns a copy of the client configuration. // // Callers SHOULD NOT perform mutations on any inner structures within client // config. Config overrides should instead be made on a per-operation basis through // functional options. func (c *Client) Options() Options { return c.options.Copy() } func (c *Client) invokeOperation( ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error, ) ( result interface{}, metadata middleware.Metadata, err error, ) { ctx = middleware.ClearStackValues(ctx) ctx = middleware.WithServiceID(ctx, ServiceID) ctx = middleware.WithOperationName(ctx, opID) stack := middleware.NewStack(opID, smithyhttp.NewStackRequest) options := c.options.Copy() for _, fn := range optFns { fn(&options) } setSafeEventStreamClientLogMode(&options, opID) finalizeOperationRetryMaxAttempts(&options, *c) finalizeClientEndpointResolverOptions(&options) finalizeOperationExpressCredentials(&options, *c) finalizeOperationEndpointAuthResolver(&options) for _, fn := range stackFns { if err := fn(stack, options); err != nil { return nil, metadata, err } } for _, fn := range options.APIOptions { if err := fn(stack); err != nil { return nil, metadata, err } } ctx, err = withOperationMetrics(ctx, options.MeterProvider) if err != nil { return nil, metadata, err } tracer := operationTracer(options.TracerProvider) spanName := fmt.Sprintf("%s.%s", ServiceID, opID) ctx = tracing.WithOperationTracer(ctx, tracer) ctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) { o.Kind = tracing.SpanKindClient o.Properties.Set("rpc.system", "aws-api") o.Properties.Set("rpc.method", opID) o.Properties.Set("rpc.service", ServiceID) }) endTimer := startMetricTimer(ctx, "client.call.duration") defer endTimer() defer span.End() handler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) { o.Meter = options.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/s3") }) decorated := middleware.DecorateHandler(handler, stack) result, metadata, err = decorated.Handle(ctx, params) if err != nil { span.SetProperty("exception.type", fmt.Sprintf("%T", err)) span.SetProperty("exception.message", err.Error()) var aerr smithy.APIError if errors.As(err, &aerr) { span.SetProperty("api.error_code", aerr.ErrorCode()) span.SetProperty("api.error_message", aerr.ErrorMessage()) span.SetProperty("api.error_fault", aerr.ErrorFault().String()) } err = &smithy.OperationError{ ServiceID: ServiceID, OperationName: opID, Err: err, } } span.SetProperty("error", err != nil) if err == nil { span.SetStatus(tracing.SpanStatusOK) } else { span.SetStatus(tracing.SpanStatusError) } return result, metadata, err } type operationInputKey struct{} func setOperationInput(ctx context.Context, input interface{}) context.Context { return middleware.WithStackValue(ctx, operationInputKey{}, input) } func getOperationInput(ctx context.Context) interface{} { return middleware.GetStackValue(ctx, operationInputKey{}) } type setOperationInputMiddleware struct { } func (*setOperationInputMiddleware) ID() string { return "setOperationInput" } func (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { ctx = setOperationInput(ctx, in.Parameters) return next.HandleSerialize(ctx, in) } func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error { if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil { return fmt.Errorf("add ResolveAuthScheme: %w", err) } if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil { return fmt.Errorf("add GetIdentity: %v", err) } if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil { return fmt.Errorf("add ResolveEndpointV2: %v", err) } if err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, "ResolveEndpointV2", middleware.After); err != nil { return fmt.Errorf("add Signing: %w", err) } return nil } func resolveAuthSchemeResolver(options *Options) { if options.AuthSchemeResolver == nil { options.AuthSchemeResolver = &defaultAuthSchemeResolver{} } } func resolveAuthSchemes(options *Options) { if options.AuthSchemes == nil { options.AuthSchemes = []smithyhttp.AuthScheme{ internalauth.NewHTTPAuthScheme("aws.auth#sigv4", &internalauthsmithy.V4SignerAdapter{ Signer: options.HTTPSignerV4, Logger: options.Logger, LogSigning: options.ClientLogMode.IsSigning(), }), internalauth.NewHTTPAuthScheme("com.amazonaws.s3#sigv4express", &s3cust.ExpressSigner{ Signer: options.HTTPSignerV4, Logger: options.Logger, LogSigning: options.ClientLogMode.IsSigning(), }), internalauth.NewHTTPAuthScheme("aws.auth#sigv4a", &v4a.SignerAdapter{ Signer: options.httpSignerV4a, Logger: options.Logger, LogSigning: options.ClientLogMode.IsSigning(), }), } } } type noSmithyDocumentSerde = smithydocument.NoSerde type legacyEndpointContextSetter struct { LegacyResolver EndpointResolver } func (*legacyEndpointContextSetter) ID() string { return "legacyEndpointContextSetter" } func (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( out middleware.InitializeOutput, metadata middleware.Metadata, err error, ) { if m.LegacyResolver != nil { ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true) } return next.HandleInitialize(ctx, in) } func addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error { return stack.Initialize.Add(&legacyEndpointContextSetter{ LegacyResolver: o.EndpointResolver, }, middleware.Before) } func resolveDefaultLogger(o *Options) { if o.Logger != nil { return } o.Logger = logging.Nop{} } func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error { return middleware.AddSetLoggerMiddleware(stack, o.Logger) } func setResolvedDefaultsMode(o *Options) { if len(o.resolvedDefaultsMode) > 0 { return } var mode aws.DefaultsMode mode.SetFromString(string(o.DefaultsMode)) if mode == aws.DefaultsModeAuto { mode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment) } o.resolvedDefaultsMode = mode } // NewFromConfig returns a new client from the provided config. func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client { opts := Options{ Region: cfg.Region, DefaultsMode: cfg.DefaultsMode, RuntimeEnvironment: cfg.RuntimeEnvironment, HTTPClient: cfg.HTTPClient, Credentials: cfg.Credentials, APIOptions: cfg.APIOptions, Logger: cfg.Logger, ClientLogMode: cfg.ClientLogMode, AppID: cfg.AppID, RequestChecksumCalculation: cfg.RequestChecksumCalculation, ResponseChecksumValidation: cfg.ResponseChecksumValidation, } resolveAWSRetryerProvider(cfg, &opts) resolveAWSRetryMaxAttempts(cfg, &opts) resolveAWSRetryMode(cfg, &opts) resolveAWSEndpointResolver(cfg, &opts) resolveUseARNRegion(cfg, &opts) resolveDisableMultiRegionAccessPoints(cfg, &opts) resolveDisableExpressAuth(cfg, &opts) resolveUseDualStackEndpoint(cfg, &opts) resolveUseFIPSEndpoint(cfg, &opts) resolveBaseEndpoint(cfg, &opts) return New(opts, optFns...) } func resolveHTTPClient(o *Options) { var buildable *awshttp.BuildableClient if o.HTTPClient != nil { var ok bool buildable, ok = o.HTTPClient.(*awshttp.BuildableClient) if !ok { return } } else { buildable = awshttp.NewBuildableClient() } modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode) if err == nil { buildable = buildable.WithDialerOptions(func(dialer *net.Dialer) { if dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok { dialer.Timeout = dialerTimeout } }) buildable = buildable.WithTransportOptions(func(transport *http.Transport) { if tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok { transport.TLSHandshakeTimeout = tlsHandshakeTimeout } }) } o.HTTPClient = buildable } func resolveRetryer(o *Options) { if o.Retryer != nil { return } if len(o.RetryMode) == 0 { modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode) if err == nil { o.RetryMode = modeConfig.RetryMode } } if len(o.RetryMode) == 0 { o.RetryMode = aws.RetryModeStandard } var standardOptions []func(*retry.StandardOptions) if v := o.RetryMaxAttempts; v != 0 { standardOptions = append(standardOptions, func(so *retry.StandardOptions) { so.MaxAttempts = v }) } switch o.RetryMode { case aws.RetryModeAdaptive: var adaptiveOptions []func(*retry.AdaptiveModeOptions) if len(standardOptions) != 0 { adaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) { ao.StandardOptions = append(ao.StandardOptions, standardOptions...) }) } o.Retryer = retry.NewAdaptiveMode(adaptiveOptions...) default: o.Retryer = retry.NewStandard(standardOptions...) } } func resolveAWSRetryerProvider(cfg aws.Config, o *Options) { if cfg.Retryer == nil { return } o.Retryer = cfg.Retryer() } func resolveAWSRetryMode(cfg aws.Config, o *Options) { if len(cfg.RetryMode) == 0 { return } o.RetryMode = cfg.RetryMode } func resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) { if cfg.RetryMaxAttempts == 0 { return } o.RetryMaxAttempts = cfg.RetryMaxAttempts } func finalizeRetryMaxAttempts(o *Options) { if o.RetryMaxAttempts == 0 { return } o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts) } func finalizeOperationRetryMaxAttempts(o *Options, client Client) { if v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts { return } o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts) } func resolveAWSEndpointResolver(cfg aws.Config, o *Options) { if cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil { return } o.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions) } func addClientUserAgent(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, "s3", goModuleVersion) if len(options.AppID) > 0 { ua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID) } return nil } func getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) { id := (*awsmiddleware.RequestUserAgent)(nil).ID() mw, ok := stack.Build.Get(id) if !ok { mw = awsmiddleware.NewRequestUserAgent() if err := stack.Build.Add(mw, middleware.After); err != nil { return nil, err } } ua, ok := mw.(*awsmiddleware.RequestUserAgent) if !ok { return nil, fmt.Errorf("%T for %s middleware did not match expected type", mw, id) } return ua, nil } type HTTPSignerV4 interface { SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error } func resolveHTTPSignerV4(o *Options) { if o.HTTPSignerV4 != nil { return } o.HTTPSignerV4 = newDefaultV4Signer(*o) } func newDefaultV4Signer(o Options) *v4.Signer { return v4.NewSigner(func(so *v4.SignerOptions) { so.Logger = o.Logger so.LogSigning = o.ClientLogMode.IsSigning() so.DisableURIPathEscaping = true }) } func addClientRequestID(stack *middleware.Stack) error { return stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After) } func addComputeContentLength(stack *middleware.Stack) error { return stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After) } func addRawResponseToMetadata(stack *middleware.Stack) error { return stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before) } func addRecordResponseTiming(stack *middleware.Stack) error { return stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After) } func addSpanRetryLoop(stack *middleware.Stack, options Options) error { return stack.Finalize.Insert(&spanRetryLoop{options: options}, "Retry", middleware.Before) } type spanRetryLoop struct { options Options } func (*spanRetryLoop) ID() string { return "spanRetryLoop" } func (m *spanRetryLoop) HandleFinalize( ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, ) ( middleware.FinalizeOutput, middleware.Metadata, error, ) { tracer := operationTracer(m.options.TracerProvider) ctx, span := tracer.StartSpan(ctx, "RetryLoop") defer span.End() return next.HandleFinalize(ctx, in) } func addStreamingEventsPayload(stack *middleware.Stack) error { return stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before) } func addUnsignedPayload(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.UnsignedPayload{}, "ResolveEndpointV2", middleware.After) } func addComputePayloadSHA256(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, "ResolveEndpointV2", middleware.After) } func addContentSHA256Header(stack *middleware.Stack) error { return stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After) } func addIsWaiterUserAgent(o *Options) { o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter) return nil }) } func addIsPaginatorUserAgent(o *Options) { o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } ua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator) return nil }) } func addRetry(stack *middleware.Stack, o Options) error { attempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) { m.LogAttempts = o.ClientLogMode.IsRetries() m.OperationMeter = o.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/s3") }) if err := stack.Finalize.Insert(attempt, "ResolveAuthScheme", middleware.Before); err != nil { return err } if err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil { return err } return nil } // resolves UseARNRegion S3 configuration func resolveUseARNRegion(cfg aws.Config, o *Options) error { if len(cfg.ConfigSources) == 0 { return nil } value, found, err := s3sharedconfig.ResolveUseARNRegion(context.Background(), cfg.ConfigSources) if err != nil { return err } if found { o.UseARNRegion = value } return nil } // resolves DisableMultiRegionAccessPoints S3 configuration func resolveDisableMultiRegionAccessPoints(cfg aws.Config, o *Options) error { if len(cfg.ConfigSources) == 0 { return nil } value, found, err := s3sharedconfig.ResolveDisableMultiRegionAccessPoints(context.Background(), cfg.ConfigSources) if err != nil { return err } if found { o.DisableMultiRegionAccessPoints = value } return nil } // resolves dual-stack endpoint configuration func resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error { if len(cfg.ConfigSources) == 0 { return nil } value, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources) if err != nil { return err } if found { o.EndpointOptions.UseDualStackEndpoint = value } return nil } // resolves FIPS endpoint configuration func resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error { if len(cfg.ConfigSources) == 0 { return nil } value, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources) if err != nil { return err } if found { o.EndpointOptions.UseFIPSEndpoint = value } return nil } func resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string { if mode == aws.AccountIDEndpointModeDisabled { return nil } if ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != "" { return aws.String(ca.Credentials.AccountID) } return nil } type httpSignerV4a interface { SignHTTP(ctx context.Context, credentials v4a.Credentials, r *http.Request, payloadHash, service string, regionSet []string, signingTime time.Time, optFns ...func(*v4a.SignerOptions)) error } func resolveHTTPSignerV4a(o *Options) { if o.httpSignerV4a != nil { return } o.httpSignerV4a = newDefaultV4aSigner(*o) } func newDefaultV4aSigner(o Options) *v4a.Signer { return v4a.NewSigner(func(so *v4a.SignerOptions) { so.Logger = o.Logger so.LogSigning = o.ClientLogMode.IsSigning() }) } func addTimeOffsetBuild(stack *middleware.Stack, c *Client) error { mw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset} if err := stack.Build.Add(&mw, middleware.After); err != nil { return err } return stack.Deserialize.Insert(&mw, "RecordResponseTiming", middleware.Before) } func initializeTimeOffsetResolver(c *Client) { c.timeOffset = new(atomic.Int64) } func addUserAgentRetryMode(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } switch options.Retryer.(type) { case *retry.Standard: ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard) case *retry.AdaptiveMode: ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive) } return nil } func addRequestChecksumMetricsTracking(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } return stack.Build.Insert(&internalChecksum.RequestChecksumMetricsTracking{ RequestChecksumCalculation: options.RequestChecksumCalculation, UserAgent: ua, }, "UserAgent", middleware.Before) } func addResponseChecksumMetricsTracking(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } return stack.Build.Insert(&internalChecksum.ResponseChecksumMetricsTracking{ ResponseChecksumValidation: options.ResponseChecksumValidation, UserAgent: ua, }, "UserAgent", middleware.Before) } type setCredentialSourceMiddleware struct { ua *awsmiddleware.RequestUserAgent options Options } func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" } func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) ( out middleware.BuildOutput, metadata middleware.Metadata, err error, ) { asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource) if !ok { return next.HandleBuild(ctx, in) } providerSources := asProviderSource.ProviderSources() for _, source := range providerSources { m.ua.AddCredentialsSource(source) } return next.HandleBuild(ctx, in) } func addCredentialSource(stack *middleware.Stack, options Options) error { ua, err := getOrAddRequestUserAgent(stack) if err != nil { return err } mw := setCredentialSourceMiddleware{ua: ua, options: options} return stack.Build.Insert(&mw, "UserAgent", middleware.Before) } func resolveTracerProvider(options *Options) { if options.TracerProvider == nil { options.TracerProvider = &tracing.NopTracerProvider{} } } func resolveMeterProvider(options *Options) { if options.MeterProvider == nil { options.MeterProvider = metrics.NopMeterProvider{} } } func addMetadataRetrieverMiddleware(stack *middleware.Stack) error { return s3shared.AddMetadataRetrieverMiddleware(stack) } func add100Continue(stack *middleware.Stack, options Options) error { return s3shared.Add100Continue(stack, options.ContinueHeaderThresholdBytes) } func addRecursionDetection(stack *middleware.Stack) error { return stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After) } // ComputedInputChecksumsMetadata provides information about the algorithms used // to compute the checksum(s) of the input payload. type ComputedInputChecksumsMetadata struct { // ComputedChecksums is a map of algorithm name to checksum value of the computed // input payload's checksums. ComputedChecksums map[string]string } // GetComputedInputChecksumsMetadata retrieves from the result metadata the map of // algorithms and input payload checksums values. func GetComputedInputChecksumsMetadata(m middleware.Metadata) (ComputedInputChecksumsMetadata, bool) { values, ok := internalChecksum.GetComputedInputChecksums(m) if !ok { return ComputedInputChecksumsMetadata{}, false } return ComputedInputChecksumsMetadata{ ComputedChecksums: values, }, true } func addInputChecksumMiddleware(stack *middleware.Stack, options internalChecksum.InputMiddlewareOptions) (err error) { err = stack.Initialize.Add(&internalChecksum.SetupInputContext{ GetAlgorithm: options.GetAlgorithm, RequireChecksum: options.RequireChecksum, RequestChecksumCalculation: options.RequestChecksumCalculation, }, middleware.Before) if err != nil { return err } stack.Build.Remove("ContentChecksum") inputChecksum := &internalChecksum.ComputeInputPayloadChecksum{ EnableTrailingChecksum: options.EnableTrailingChecksum, EnableComputePayloadHash: options.EnableComputeSHA256PayloadHash, EnableDecodedContentLengthHeader: options.EnableDecodedContentLengthHeader, } if err := stack.Finalize.Insert(inputChecksum, "ResolveEndpointV2", middleware.After); err != nil { return err } if options.EnableTrailingChecksum { trailerMiddleware := &internalChecksum.AddInputChecksumTrailer{ EnableTrailingChecksum: inputChecksum.EnableTrailingChecksum, EnableComputePayloadHash: inputChecksum.EnableComputePayloadHash, EnableDecodedContentLengthHeader: inputChecksum.EnableDecodedContentLengthHeader, } if err := stack.Finalize.Insert(trailerMiddleware, inputChecksum.ID(), middleware.After); err != nil { return err } } return nil } // ChecksumValidationMetadata contains metadata such as the checksum algorithm // used for data integrity validation. type ChecksumValidationMetadata struct { // AlgorithmsUsed is the set of the checksum algorithms used to validate the // response payload. The response payload must be completely read in order for the // checksum validation to be performed. An error is returned by the operation // output's response io.ReadCloser if the computed checksums are invalid. AlgorithmsUsed []string } // GetChecksumValidationMetadata returns the set of algorithms that will be used // to validate the response payload with. The response payload must be completely // read in order for the checksum validation to be performed. An error is returned // by the operation output's response io.ReadCloser if the computed checksums are // invalid. Returns false if no checksum algorithm used metadata was found. func GetChecksumValidationMetadata(m middleware.Metadata) (ChecksumValidationMetadata, bool) { values, ok := internalChecksum.GetOutputValidationAlgorithmsUsed(m) if !ok { return ChecksumValidationMetadata{}, false } return ChecksumValidationMetadata{ AlgorithmsUsed: append(make([]string, 0, len(values)), values...), }, true } // nopGetBucketAccessor is no-op accessor for operation that don't support bucket // member as input func nopGetBucketAccessor(input interface{}) (*string, bool) { return nil, false } func addResponseErrorMiddleware(stack *middleware.Stack) error { return s3shared.AddResponseErrorMiddleware(stack) } func disableAcceptEncodingGzip(stack *middleware.Stack) error { return acceptencodingcust.AddAcceptEncodingGzip(stack, acceptencodingcust.AddAcceptEncodingGzipOptions{}) } // ResponseError provides the HTTP centric error type wrapping the underlying // error with the HTTP response value and the deserialized RequestID. type ResponseError interface { error ServiceHostID() string ServiceRequestID() string } var _ ResponseError = (*s3shared.ResponseError)(nil) // GetHostIDMetadata retrieves the host id from middleware metadata returns host // id as string along with a boolean indicating presence of hostId on middleware // metadata. func GetHostIDMetadata(metadata middleware.Metadata) (string, bool) { return s3shared.GetHostIDMetadata(metadata) } // HTTPPresignerV4 represents presigner interface used by presign url client type HTTPPresignerV4 interface { PresignHTTP( ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions), ) (url string, signedHeader http.Header, err error) } // httpPresignerV4a represents sigv4a presigner interface used by presign url // client type httpPresignerV4a interface { PresignHTTP( ctx context.Context, credentials v4a.Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optFns ...func(*v4a.SignerOptions), ) (url string, signedHeader http.Header, err error) } // PresignOptions represents the presign client options type PresignOptions struct { // ClientOptions are list of functional options to mutate client options used by // the presign client. ClientOptions []func(*Options) // Presigner is the presigner used by the presign url client Presigner HTTPPresignerV4 // Expires sets the expiration duration for the generated presign url. This should // be the duration in seconds the presigned URL should be considered valid for. If // not set or set to zero, presign url would default to expire after 900 seconds. Expires time.Duration // presignerV4a is the presigner used by the presign url client presignerV4a httpPresignerV4a } func (o PresignOptions) copy() PresignOptions { clientOptions := make([]func(*Options), len(o.ClientOptions)) copy(clientOptions, o.ClientOptions) o.ClientOptions = clientOptions return o } // WithPresignClientFromClientOptions is a helper utility to retrieve a function // that takes PresignOption as input func WithPresignClientFromClientOptions(optFns ...func(*Options)) func(*PresignOptions) { return withPresignClientFromClientOptions(optFns).options } type withPresignClientFromClientOptions []func(*Options) func (w withPresignClientFromClientOptions) options(o *PresignOptions) { o.ClientOptions = append(o.ClientOptions, w...) } // WithPresignExpires is a helper utility to append Expires value on presign // options optional function func WithPresignExpires(dur time.Duration) func(*PresignOptions) { return withPresignExpires(dur).options } type withPresignExpires time.Duration func (w withPresignExpires) options(o *PresignOptions) { o.Expires = time.Duration(w) } // PresignClient represents the presign url client type PresignClient struct { client *Client options PresignOptions } // NewPresignClient generates a presign client using provided API Client and // presign options func NewPresignClient(c *Client, optFns ...func(*PresignOptions)) *PresignClient { var options PresignOptions for _, fn := range optFns { fn(&options) } if len(options.ClientOptions) != 0 { c = New(c.options, options.ClientOptions...) } if options.Presigner == nil { options.Presigner = newDefaultV4Signer(c.options) } if options.presignerV4a == nil { options.presignerV4a = newDefaultV4aSigner(c.options) } return &PresignClient{ client: c, options: options, } } func withNopHTTPClientAPIOption(o *Options) { o.HTTPClient = smithyhttp.NopClient{} } type presignContextPolyfillMiddleware struct { } func (*presignContextPolyfillMiddleware) ID() string { return "presignContextPolyfill" } func (m *presignContextPolyfillMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { rscheme := getResolvedAuthScheme(ctx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } schemeID := rscheme.Scheme.SchemeID() ctx = s3cust.SetSignerVersion(ctx, schemeID) if schemeID == "aws.auth#sigv4" || schemeID == "com.amazonaws.s3#sigv4express" { if sn, ok := smithyhttp.GetSigV4SigningName(&rscheme.SignerProperties); ok { ctx = awsmiddleware.SetSigningName(ctx, sn) } if sr, ok := smithyhttp.GetSigV4SigningRegion(&rscheme.SignerProperties); ok { ctx = awsmiddleware.SetSigningRegion(ctx, sr) } } else if schemeID == "aws.auth#sigv4a" { if sn, ok := smithyhttp.GetSigV4ASigningName(&rscheme.SignerProperties); ok { ctx = awsmiddleware.SetSigningName(ctx, sn) } if sr, ok := smithyhttp.GetSigV4ASigningRegions(&rscheme.SignerProperties); ok { ctx = awsmiddleware.SetSigningRegion(ctx, sr[0]) } } return next.HandleFinalize(ctx, in) } type presignConverter PresignOptions func (c presignConverter) convertToPresignMiddleware(stack *middleware.Stack, options Options) (err error) { if _, ok := stack.Finalize.Get((*acceptencodingcust.DisableGzip)(nil).ID()); ok { stack.Finalize.Remove((*acceptencodingcust.DisableGzip)(nil).ID()) } if _, ok := stack.Finalize.Get((*retry.Attempt)(nil).ID()); ok { stack.Finalize.Remove((*retry.Attempt)(nil).ID()) } if _, ok := stack.Finalize.Get((*retry.MetricsHeader)(nil).ID()); ok { stack.Finalize.Remove((*retry.MetricsHeader)(nil).ID()) } stack.Deserialize.Clear() stack.Build.Remove((*awsmiddleware.ClientRequestID)(nil).ID()) stack.Build.Remove("UserAgent") if err := stack.Finalize.Insert(&presignContextPolyfillMiddleware{}, "Signing", middleware.Before); err != nil { return err } pmw := v4.NewPresignHTTPRequestMiddleware(v4.PresignHTTPRequestMiddlewareOptions{ CredentialsProvider: options.Credentials, Presigner: c.Presigner, LogSigning: options.ClientLogMode.IsSigning(), }) if _, err := stack.Finalize.Swap("Signing", pmw); err != nil { return err } if err = smithyhttp.AddNoPayloadDefaultContentTypeRemover(stack); err != nil { return err } // extended s3 presigning signermv := s3cust.NewPresignHTTPRequestMiddleware(s3cust.PresignHTTPRequestMiddlewareOptions{ CredentialsProvider: options.Credentials, ExpressCredentials: options.ExpressCredentials, V4Presigner: c.Presigner, V4aPresigner: c.presignerV4a, LogSigning: options.ClientLogMode.IsSigning(), }) err = s3cust.RegisterPreSigningMiddleware(stack, signermv) if err != nil { return err } if c.Expires < 0 { return fmt.Errorf("presign URL duration must be 0 or greater, %v", c.Expires) } // add middleware to set expiration for s3 presigned url, if expiration is set to // 0, this middleware sets a default expiration of 900 seconds err = stack.Build.Add(&s3cust.AddExpiresOnPresignedURL{Expires: c.Expires}, middleware.After) if err != nil { return err } err = presignedurlcust.AddAsIsPresigningMiddleware(stack) if err != nil { return err } return nil } func withNoDefaultChecksumAPIOption(options *Options) { options.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired } func addRequestResponseLogging(stack *middleware.Stack, o Options) error { return stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{ LogRequest: o.ClientLogMode.IsRequest(), LogRequestWithBody: o.ClientLogMode.IsRequestWithBody(), LogResponse: o.ClientLogMode.IsResponse(), LogResponseWithBody: o.ClientLogMode.IsResponseWithBody(), }, middleware.After) } type disableHTTPSMiddleware struct { DisableHTTPS bool } func (*disableHTTPSMiddleware) ID() string { return "disableHTTPS" } func (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) { req.URL.Scheme = "http" } return next.HandleFinalize(ctx, in) } func addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error { return stack.Finalize.Insert(&disableHTTPSMiddleware{ DisableHTTPS: o.EndpointOptions.DisableHTTPS, }, "ResolveEndpointV2", middleware.After) } type spanInitializeStart struct { } func (*spanInitializeStart) ID() string { return "spanInitializeStart" } func (m *spanInitializeStart) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( middleware.InitializeOutput, middleware.Metadata, error, ) { ctx, _ = tracing.StartSpan(ctx, "Initialize") return next.HandleInitialize(ctx, in) } type spanInitializeEnd struct { } func (*spanInitializeEnd) ID() string { return "spanInitializeEnd" } func (m *spanInitializeEnd) HandleInitialize( ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, ) ( middleware.InitializeOutput, middleware.Metadata, error, ) { ctx, span := tracing.PopSpan(ctx) span.End() return next.HandleInitialize(ctx, in) } type spanBuildRequestStart struct { } func (*spanBuildRequestStart) ID() string { return "spanBuildRequestStart" } func (m *spanBuildRequestStart) HandleSerialize( ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, ) ( middleware.SerializeOutput, middleware.Metadata, error, ) { ctx, _ = tracing.StartSpan(ctx, "BuildRequest") return next.HandleSerialize(ctx, in) } type spanBuildRequestEnd struct { } func (*spanBuildRequestEnd) ID() string { return "spanBuildRequestEnd" } func (m *spanBuildRequestEnd) HandleBuild( ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, ) ( middleware.BuildOutput, middleware.Metadata, error, ) { ctx, span := tracing.PopSpan(ctx) span.End() return next.HandleBuild(ctx, in) } func addSpanInitializeStart(stack *middleware.Stack) error { return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before) } func addSpanInitializeEnd(stack *middleware.Stack) error { return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After) } func addSpanBuildRequestStart(stack *middleware.Stack) error { return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before) } func addSpanBuildRequestEnd(stack *middleware.Stack) error { return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_AbortMultipartUpload.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // This operation aborts a multipart upload. After a multipart upload is aborted, // no additional parts can be uploaded using that upload ID. The storage consumed // by any previously uploaded parts will be freed. However, if any part uploads are // currently in progress, those part uploads might or might not succeed. As a // result, it might be necessary to abort a given multipart upload multiple times // in order to completely free all storage consumed by all parts. // // To verify that all parts have been removed and prevent getting charged for the // part storage, you should call the [ListParts]API operation and ensure that the parts list // is empty. // // - Directory buckets - If multipart uploads in a directory bucket are in // progress, you can't delete the bucket until all the in-progress multipart // uploads are aborted or completed. To delete these in-progress multipart uploads, // use the ListMultipartUploads operation to list the in-progress multipart // uploads in the bucket and use the AbortMultipartUpload operation to abort all // the in-progress multipart uploads. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Zonal endpoint. These endpoints support // virtual-hosted-style requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // // - General purpose bucket permissions - For information about permissions // required to use the multipart upload, see [Multipart Upload and Permissions]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to AbortMultipartUpload : // // [CreateMultipartUpload] // // [UploadPart] // // [CompleteMultipartUpload] // // [ListParts] // // [ListMultipartUploads] // // [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html // [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [Multipart Upload and Permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html // [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html func (c *Client) AbortMultipartUpload(ctx context.Context, params *AbortMultipartUploadInput, optFns ...func(*Options)) (*AbortMultipartUploadOutput, error) { if params == nil { params = &AbortMultipartUploadInput{} } result, metadata, err := c.invokeOperation(ctx, "AbortMultipartUpload", params, optFns, c.addOperationAbortMultipartUploadMiddlewares) if err != nil { return nil, err } out := result.(*AbortMultipartUploadOutput) out.ResultMetadata = metadata return out, nil } type AbortMultipartUploadInput struct { // The bucket name to which the upload was taking place. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Key of the object for which the multipart upload was initiated. // // This member is required. Key *string // Upload ID that identifies the multipart upload. // // This member is required. UploadId *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // If present, this header aborts an in progress multipart upload only if it was // initiated on the provided timestamp. If the initiated timestamp of the multipart // upload does not match the provided value, the operation returns a 412 // Precondition Failed error. If the initiated timestamp matches or if the // multipart upload doesn’t exist, the operation returns a 204 Success (No Content) // response. // // This functionality is only supported for directory buckets. IfMatchInitiatedTime *time.Time // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer noSmithyDocumentSerde } func (in *AbortMultipartUploadInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type AbortMultipartUploadOutput struct { // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationAbortMultipartUploadMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpAbortMultipartUpload{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpAbortMultipartUpload{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "AbortMultipartUpload"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpAbortMultipartUploadValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opAbortMultipartUpload(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addAbortMultipartUploadUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *AbortMultipartUploadInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opAbortMultipartUpload(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "AbortMultipartUpload", } } // getAbortMultipartUploadBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getAbortMultipartUploadBucketMember(input interface{}) (*string, bool) { in := input.(*AbortMultipartUploadInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addAbortMultipartUploadUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getAbortMultipartUploadBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CompleteMultipartUpload.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Completes a multipart upload by assembling previously uploaded parts. // // You first initiate the multipart upload and then upload all parts using the [UploadPart] // operation or the [UploadPartCopy]operation. After successfully uploading all relevant parts of // an upload, you call this CompleteMultipartUpload operation to complete the // upload. Upon receiving this request, Amazon S3 concatenates all the parts in // ascending order by part number to create a new object. In the // CompleteMultipartUpload request, you must provide the parts list and ensure that // the parts list is complete. The CompleteMultipartUpload API operation // concatenates the parts that you provide in the list. For each part in the list, // you must provide the PartNumber value and the ETag value that are returned // after that part was uploaded. // // The processing of a CompleteMultipartUpload request could take several minutes // to finalize. After Amazon S3 begins processing the request, it sends an HTTP // response header that specifies a 200 OK response. While processing is in // progress, Amazon S3 periodically sends white space characters to keep the // connection from timing out. A request could fail after the initial 200 OK // response has been sent. This means that a 200 OK response can contain either a // success or an error. The error response might be embedded in the 200 OK // response. If you call this API operation directly, make sure to design your // application to parse the contents of the response and handle it appropriately. // If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect // the embedded error and apply error handling per your configuration settings // (including automatically retrying the request as appropriate). If the condition // persists, the SDKs throw an exception (or, for the SDKs that don't use // exceptions, they return an error). // // Note that if CompleteMultipartUpload fails, applications should be prepared to // retry any failed requests (including 500 error responses). For more information, // see [Amazon S3 Error Best Practices]. // // You can't use Content-Type: application/x-www-form-urlencoded for the // CompleteMultipartUpload requests. Also, if you don't provide a Content-Type // header, CompleteMultipartUpload can still return a 200 OK response. // // For more information about multipart uploads, see [Uploading Objects Using Multipart Upload] in the Amazon S3 User Guide. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Zonal endpoint. These endpoints support virtual-hosted-style // requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // - General purpose bucket permissions - For information about permissions // required to use the multipart upload API, see [Multipart Upload and Permissions]in the Amazon S3 User Guide. // // If you provide an [additional checksum value]in your MultipartUpload requests and the object is encrypted // // with Key Management Service, you must have permission to use the kms:Decrypt // action for the CompleteMultipartUpload request to succeed. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // If the object is encrypted with SSE-KMS, you must also have the // // kms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies // and KMS key policies for the KMS key. // // Special errors // // - Error Code: EntityTooSmall // // - Description: Your proposed upload is smaller than the minimum allowed // object size. Each part must be at least 5 MB in size, except the last part. // // - HTTP Status Code: 400 Bad Request // // - Error Code: InvalidPart // // - Description: One or more of the specified parts could not be found. The // part might not have been uploaded, or the specified ETag might not have matched // the uploaded part's ETag. // // - HTTP Status Code: 400 Bad Request // // - Error Code: InvalidPartOrder // // - Description: The list of parts was not in ascending order. The parts list // must be specified in order by part number. // // - HTTP Status Code: 400 Bad Request // // - Error Code: NoSuchUpload // // - Description: The specified multipart upload does not exist. The upload ID // might be invalid, or the multipart upload might have been aborted or completed. // // - HTTP Status Code: 404 Not Found // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to CompleteMultipartUpload : // // [CreateMultipartUpload] // // [UploadPart] // // [AbortMultipartUpload] // // [ListParts] // // [ListMultipartUploads] // // [Uploading Objects Using Multipart Upload]: https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html // [Amazon S3 Error Best Practices]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ErrorBestPractices.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html // [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html // [additional checksum value]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_Checksum.html // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html // [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html // [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html // [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html // [Multipart Upload and Permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html func (c *Client) CompleteMultipartUpload(ctx context.Context, params *CompleteMultipartUploadInput, optFns ...func(*Options)) (*CompleteMultipartUploadOutput, error) { if params == nil { params = &CompleteMultipartUploadInput{} } result, metadata, err := c.invokeOperation(ctx, "CompleteMultipartUpload", params, optFns, c.addOperationCompleteMultipartUploadMiddlewares) if err != nil { return nil, err } out := result.(*CompleteMultipartUploadOutput) out.ResultMetadata = metadata return out, nil } type CompleteMultipartUploadInput struct { // Name of the bucket to which the multipart upload was initiated. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Object key for which the multipart upload was initiated. // // This member is required. Key *string // ID for the initiated multipart upload. // // This member is required. UploadId *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 32-bit CRC32 checksum of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC32 *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 32-bit CRC32C checksum of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC32C *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 64-bit CRC64NVME checksum of the object. The CRC64NVME checksum // is always a full object checksum. For more information, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC64NVME *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 160-bit SHA1 digest of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumSHA1 *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 256-bit SHA256 digest of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumSHA256 *string // This header specifies the checksum type of the object, which determines how // part-level checksums are combined to create an object-level checksum for // multipart objects. You can use this header as a data integrity check to verify // that the checksum type that is received is the same checksum that was specified. // If the checksum type doesn’t match the checksum type that was specified for the // object during the CreateMultipartUpload request, it’ll result in a BadDigest // error. For more information, see Checking object integrity in the Amazon S3 User // Guide. ChecksumType types.ChecksumType // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Uploads the object only if the ETag (entity tag) value provided during the // WRITE operation matches the ETag of the object in S3. If the ETag values do not // match, the operation returns a 412 Precondition Failed error. // // If a conflicting operation occurs during the upload S3 returns a 409 // ConditionalRequestConflict response. On a 409 failure you should fetch the // object's ETag, re-initiate the multipart upload with CreateMultipartUpload , and // re-upload each part. // // Expects the ETag value as a string. // // For more information about conditional requests, see [RFC 7232], or [Conditional requests] in the Amazon S3 // User Guide. // // [Conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfMatch *string // Uploads the object only if the object key name does not already exist in the // bucket specified. Otherwise, Amazon S3 returns a 412 Precondition Failed error. // // If a conflicting operation occurs during the upload S3 returns a 409 // ConditionalRequestConflict response. On a 409 failure you should re-initiate the // multipart upload with CreateMultipartUpload and re-upload each part. // // Expects the '*' (asterisk) character. // // For more information about conditional requests, see [RFC 7232], or [Conditional requests] in the Amazon S3 // User Guide. // // [Conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfNoneMatch *string // The expected total object size of the multipart upload request. If there’s a // mismatch between the specified object size value and the actual object size // value, it results in an HTTP 400 InvalidRequest error. MpuObjectSize *int64 // The container for the multipart upload request information. MultipartUpload *types.CompletedMultipartUpload // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // The server-side encryption (SSE) algorithm used to encrypt the object. This // parameter is required only when the object was created using a checksum // algorithm or if your bucket policy requires the use of SSE-C. For more // information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html#ssec-require-condition-key SSECustomerAlgorithm *string // The server-side encryption (SSE) customer managed key. This parameter is needed // only when the object was created using a checksum algorithm. For more // information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerKey *string // The MD5 server-side encryption (SSE) customer managed key. This parameter is // needed only when the object was created using a checksum algorithm. For more // information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerKeyMD5 *string noSmithyDocumentSerde } func (in *CompleteMultipartUploadInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type CompleteMultipartUploadOutput struct { // The name of the bucket that contains the newly created object. Does not return // the access point ARN or access point alias if used. // // Access points are not supported by directory buckets. Bucket *string // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Key Management Service (KMS) keys (SSE-KMS). BucketKeyEnabled *bool // The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only // be present if the checksum was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumCRC32 *string // The Base64 encoded, 32-bit CRC32C checksum of the object. This checksum is only // present if the checksum was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumCRC32C *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 64-bit CRC64NVME checksum of the object. The CRC64NVME checksum // is always a full object checksum. For more information, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC64NVME *string // The Base64 encoded, 160-bit SHA1 digest of the object. This will only be // present if the object was uploaded with the object. When you use the API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumSHA1 *string // The Base64 encoded, 256-bit SHA256 digest of the object. This will only be // present if the object was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumSHA256 *string // The checksum type, which determines how part-level checksums are combined to // create an object-level checksum for multipart objects. You can use this header // as a data integrity check to verify that the checksum type that is received is // the same checksum type that was specified during the CreateMultipartUpload // request. For more information, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumType types.ChecksumType // Entity tag that identifies the newly created object's data. Objects with // different object data will have different entity tags. The entity tag is an // opaque string. The entity tag may or may not be an MD5 digest of the object // data. If the entity tag is not an MD5 digest of the object data, it will contain // one or more nonhexadecimal characters and/or will consist of less than 32 or // more than 32 hexadecimal digits. For more information about how the entity tag // is calculated, see [Checking object integrity]in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ETag *string // If the object expiration is configured, this will contain the expiration date ( // expiry-date ) and rule ID ( rule-id ). The value of rule-id is URL-encoded. // // This functionality is not supported for directory buckets. Expiration *string // The object key of the newly created object. Key *string // The URI that identifies the newly created object. Location *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // If present, indicates the ID of the KMS key that was used for object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when storing this object in Amazon S3 // (for example, AES256 , aws:kms ). ServerSideEncryption types.ServerSideEncryption // Version ID of the newly created object, in case the bucket has versioning // turned on. // // This functionality is not supported for directory buckets. VersionId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCompleteMultipartUploadMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpCompleteMultipartUpload{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpCompleteMultipartUpload{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CompleteMultipartUpload"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCompleteMultipartUploadValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCompleteMultipartUpload(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addCompleteMultipartUploadUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = s3cust.HandleResponseErrorWith200Status(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *CompleteMultipartUploadInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opCompleteMultipartUpload(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CompleteMultipartUpload", } } // getCompleteMultipartUploadBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getCompleteMultipartUploadBucketMember(input interface{}) (*string, bool) { in := input.(*CompleteMultipartUploadInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addCompleteMultipartUploadUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getCompleteMultipartUploadBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CopyObject.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Creates a copy of an object that is already stored in Amazon S3. // // You can store individual objects of up to 5 TB in Amazon S3. You create a copy // of your object up to 5 GB in size in a single atomic action using this API. // However, to copy an object greater than 5 GB, you must use the multipart upload // Upload Part - Copy (UploadPartCopy) API. For more information, see [Copy Object Using the REST Multipart Upload API]. // // You can copy individual objects between general purpose buckets, between // directory buckets, and between general purpose buckets and directory buckets. // // - Amazon S3 supports copy operations using Multi-Region Access Points only as // a destination when using the Multi-Region Access Point ARN. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Zonal endpoint. These endpoints support // virtual-hosted-style requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // - VPC endpoints don't support cross-Region requests (including copies). If // you're using VPC endpoints, your source and destination buckets should be in the // same Amazon Web Services Region as your VPC endpoint. // // Both the Region that you want to copy the object from and the Region that you // want to copy the object to must be enabled for your account. For more // information about how to enable a Region for your account, see [Enable or disable a Region for standalone accounts]in the Amazon // Web Services Account Management Guide. // // Amazon S3 transfer acceleration does not support cross-Region copies. If you // request a cross-Region copy using a transfer acceleration endpoint, you get a // 400 Bad Request error. For more information, see [Transfer Acceleration]. // // Authentication and authorization All CopyObject requests must be authenticated // and signed by using IAM credentials (access key ID and secret access key for the // IAM identities). All headers with the x-amz- prefix, including x-amz-copy-source // , must be signed. For more information, see [REST Authentication]. // // Directory buckets - You must use the IAM credentials to authenticate and // authorize your access to the CopyObject API operation, instead of using the // temporary security credentials through the CreateSession API operation. // // Amazon Web Services CLI or SDKs handles authentication and authorization on // your behalf. // // Permissions You must have read access to the source object and write access to // the destination bucket. // // - General purpose bucket permissions - You must have permissions in an IAM // policy based on the source and destination bucket types in a CopyObject // operation. // // - If the source object is in a general purpose bucket, you must have // s3:GetObject permission to read the source object that is being copied. // // - If the destination bucket is a general purpose bucket, you must have // s3:PutObject permission to write the object copy to the destination bucket. // // - Directory bucket permissions - You must have permissions in a bucket policy // or an IAM identity-based policy based on the source and destination bucket types // in a CopyObject operation. // // - If the source object that you want to copy is in a directory bucket, you // must have the s3express:CreateSession permission in the Action element of a // policy to read the object. By default, the session is in the ReadWrite mode. // If you want to restrict the access, you can explicitly set the // s3express:SessionMode condition key to ReadOnly on the copy source bucket. // // - If the copy destination is a directory bucket, you must have the // s3express:CreateSession permission in the Action element of a policy to write // the object to the destination. The s3express:SessionMode condition key can't // be set to ReadOnly on the copy destination bucket. // // If the object is encrypted with SSE-KMS, you must also have the // // kms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies // and KMS key policies for the KMS key. // // For example policies, see [Example bucket policies for S3 Express One Zone]and [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]in the Amazon S3 User Guide. // // Response and special errors When the request is an HTTP 1.1 request, the // response is chunk encoded. When the request is not an HTTP 1.1 request, the // response would not contain the Content-Length . You always need to read the // entire response body to check if the copy succeeds. // // - If the copy is successful, you receive a response with information about // the copied object. // // - A copy request might return an error when Amazon S3 receives the copy // request or while Amazon S3 is copying the files. A 200 OK response can contain // either a success or an error. // // - If the error occurs before the copy action starts, you receive a standard // Amazon S3 error. // // - If the error occurs during the copy operation, the error response is // embedded in the 200 OK response. For example, in a cross-region copy, you may // encounter throttling and receive a 200 OK response. For more information, see [Resolve the Error 200 response when copying objects to Amazon S3] // . The 200 OK status code means the copy was accepted, but it doesn't mean the // copy is complete. Another example is when you disconnect from Amazon S3 before // the copy is complete, Amazon S3 might cancel the copy and you may receive a // 200 OK response. You must stay connected to Amazon S3 until the entire // response is successfully received and processed. // // If you call this API operation directly, make sure to design your application // // to parse the content of the response and handle it appropriately. If you use // Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the // embedded error and apply error handling per your configuration settings // (including automatically retrying the request as appropriate). If the condition // persists, the SDKs throw an exception (or, for the SDKs that don't use // exceptions, they return an error). // // Charge The copy request charge is based on the storage class and Region that // you specify for the destination object. The request can also result in a data // retrieval charge for the source if the source storage class bills for data // retrieval. If the copy source is in a different region, the data transfer is // billed to the copy source account. For pricing information, see [Amazon S3 pricing]. // // HTTP Host header syntax // // - Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // - Amazon S3 on Outposts - When you use this action with S3 on Outposts // through the REST API, you must direct requests to the S3 on Outposts hostname. // The S3 on Outposts hostname takes the form // AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . The // hostname isn't required when you use the Amazon Web Services CLI or SDKs. // // The following operations are related to CopyObject : // // [PutObject] // // [GetObject] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html // [Resolve the Error 200 response when copying objects to Amazon S3]: https://repost.aws/knowledge-center/s3-resolve-200-internalerror // [Copy Object Using the REST Multipart Upload API]: https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjctsUsingRESTMPUapi.html // [REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html // [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html // [Enable or disable a Region for standalone accounts]: https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html#manage-acct-regions-enable-standalone // [Transfer Acceleration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [Amazon S3 pricing]: http://aws.amazon.com/s3/pricing/ func (c *Client) CopyObject(ctx context.Context, params *CopyObjectInput, optFns ...func(*Options)) (*CopyObjectOutput, error) { if params == nil { params = &CopyObjectInput{} } result, metadata, err := c.invokeOperation(ctx, "CopyObject", params, optFns, c.addOperationCopyObjectMiddlewares) if err != nil { return nil, err } out := result.(*CopyObjectOutput) out.ResultMetadata = metadata return out, nil } type CopyObjectInput struct { // The name of the destination bucket. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Copying objects across different Amazon Web Services Regions isn't supported // when the source or destination bucket is in Amazon Web Services Local Zones. The // source and destination buckets must have the same parent Amazon Web Services // Region. Otherwise, you get an HTTP 400 Bad Request error with the error code // InvalidRequest . // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must use the // Outpost bucket access point ARN or the access point alias for the destination // bucket. // // You can only copy objects within the same Outpost bucket. It's not supported to // copy objects across different Amazon Web Services Outposts, between buckets on // the same Outposts, or between Outposts buckets and any other bucket types. For // more information about S3 on Outposts, see [What is S3 on Outposts?]in the S3 on Outposts guide. When // you use this action with S3 on Outposts through the REST API, you must direct // requests to the S3 on Outposts hostname, in the format // AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . The // hostname isn't required when you use the Amazon Web Services CLI or SDKs. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Specifies the source object for the copy operation. The source object can be up // to 5 GB. If the source object is an object that was uploaded by using a // multipart upload, the object copy will be a single part object after the source // object is copied to the destination bucket. // // You specify the value of the copy source in one of two formats, depending on // whether you want to access the source object through an [access point]: // // - For objects not accessed through an access point, specify the name of the // source bucket and the key of the source object, separated by a slash (/). For // example, to copy the object reports/january.pdf from the general purpose // bucket awsexamplebucket , use awsexamplebucket/reports/january.pdf . The value // must be URL-encoded. To copy the object reports/january.pdf from the directory // bucket awsexamplebucket--use1-az5--x-s3 , use // awsexamplebucket--use1-az5--x-s3/reports/january.pdf . The value must be // URL-encoded. // // - For objects accessed through access points, specify the Amazon Resource // Name (ARN) of the object as accessed through the access point, in the format // arn:aws:s3:::accesspoint//object/ . For example, to copy the object // reports/january.pdf through access point my-access-point owned by account // 123456789012 in Region us-west-2 , use the URL encoding of // arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf // . The value must be URL encoded. // // - Amazon S3 supports copy operations using Access points only when the source // and destination buckets are in the same Amazon Web Services Region. // // - Access points are not supported by directory buckets. // // Alternatively, for objects accessed through Amazon S3 on Outposts, specify the // ARN of the object as accessed in the format // arn:aws:s3-outposts:::outpost//object/ . For example, to copy the object // reports/january.pdf through outpost my-outpost owned by account 123456789012 // in Region us-west-2 , use the URL encoding of // arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf // . The value must be URL-encoded. // // If your source bucket versioning is enabled, the x-amz-copy-source header by // default identifies the current version of an object to copy. If the current // version is a delete marker, Amazon S3 behaves as if the object was deleted. To // copy a different version, use the versionId query parameter. Specifically, // append ?versionId= to the value (for example, // awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893 // ). If you don't specify a version ID, Amazon S3 copies the latest version of the // source object. // // If you enable versioning on the destination bucket, Amazon S3 generates a // unique version ID for the copied object. This version ID is different from the // version ID of the source object. Amazon S3 returns the version ID of the copied // object in the x-amz-version-id response header in the response. // // If you do not enable versioning or suspend it on the destination bucket, the // version ID that Amazon S3 generates in the x-amz-version-id response header is // always null. // // Directory buckets - S3 Versioning isn't enabled and supported for directory // buckets. // // [access point]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html // // This member is required. CopySource *string // The key of the destination object. // // This member is required. Key *string // The canned access control list (ACL) to apply to the object. // // When you copy an object, the ACL metadata is not preserved and is set to private // by default. Only the owner has full access control. To override the default ACL // setting, specify a new ACL when you generate a copy request. For more // information, see [Using ACLs]. // // If the destination bucket that you're copying objects to uses the bucket owner // enforced setting for S3 Object Ownership, ACLs are disabled and no longer affect // permissions. Buckets that use this setting only accept PUT requests that don't // specify an ACL or PUT requests that specify bucket owner full control ACLs, // such as the bucket-owner-full-control canned ACL or an equivalent form of this // ACL expressed in the XML format. For more information, see [Controlling ownership of objects and disabling ACLs]in the Amazon S3 // User Guide. // // - If your destination bucket uses the bucket owner enforced setting for // Object Ownership, all objects written to the bucket by any account will be owned // by the bucket owner. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. // // [Using ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html // [Controlling ownership of objects and disabling ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html ACL types.ObjectCannedACL // Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption // with server-side encryption using Key Management Service (KMS) keys (SSE-KMS). // If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the object. // // Setting this header to true causes Amazon S3 to use an S3 Bucket Key for object // encryption with SSE-KMS. Specifying this header with a COPY action doesn’t // affect bucket-level settings for S3 Bucket Key. // // For more information, see [Amazon S3 Bucket Keys] in the Amazon S3 User Guide. // // Directory buckets - S3 Bucket Keys aren't supported, when you copy SSE-KMS // encrypted objects from general purpose buckets to directory buckets, from // directory buckets to general purpose buckets, or between directory buckets, // through [CopyObject]. In this case, Amazon S3 makes a call to KMS every time a copy request // is made for a KMS-encrypted object. // // [Amazon S3 Bucket Keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html BucketKeyEnabled *bool // Specifies the caching behavior along the request/reply chain. CacheControl *string // Indicates the algorithm that you want Amazon S3 to use to create the checksum // for the object. For more information, see [Checking object integrity]in the Amazon S3 User Guide. // // When you copy an object, if the source object has a checksum, that checksum // value will be copied to the new object by default. If the CopyObject request // does not include this x-amz-checksum-algorithm header, the checksum algorithm // will be copied from the source object to the destination object (if it's present // on the source object). You can optionally specify a different checksum algorithm // to use with the x-amz-checksum-algorithm header. Unrecognized or unsupported // values will respond with the HTTP status code 400 Bad Request . // // For directory buckets, when you use Amazon Web Services SDKs, CRC32 is the // default checksum algorithm that's used for performance. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // Specifies presentational information for the object. Indicates whether an // object should be displayed in a web browser or downloaded as a file. It allows // specifying the desired filename for the downloaded file. ContentDisposition *string // Specifies what content encodings have been applied to the object and thus what // decoding mechanisms must be applied to obtain the media-type referenced by the // Content-Type header field. // // For directory buckets, only the aws-chunked value is supported in this header // field. ContentEncoding *string // The language the content is in. ContentLanguage *string // A standard MIME type that describes the format of the object data. ContentType *string // Copies the object if its entity tag (ETag) matches the specified tag. // // If both the x-amz-copy-source-if-match and x-amz-copy-source-if-unmodified-since // headers are present in the request and evaluate as follows, Amazon S3 returns // 200 OK and copies the data: // // - x-amz-copy-source-if-match condition evaluates to true // // - x-amz-copy-source-if-unmodified-since condition evaluates to false CopySourceIfMatch *string // Copies the object if it has been modified since the specified time. // // If both the x-amz-copy-source-if-none-match and // x-amz-copy-source-if-modified-since headers are present in the request and // evaluate as follows, Amazon S3 returns the 412 Precondition Failed response // code: // // - x-amz-copy-source-if-none-match condition evaluates to false // // - x-amz-copy-source-if-modified-since condition evaluates to true CopySourceIfModifiedSince *time.Time // Copies the object if its entity tag (ETag) is different than the specified ETag. // // If both the x-amz-copy-source-if-none-match and // x-amz-copy-source-if-modified-since headers are present in the request and // evaluate as follows, Amazon S3 returns the 412 Precondition Failed response // code: // // - x-amz-copy-source-if-none-match condition evaluates to false // // - x-amz-copy-source-if-modified-since condition evaluates to true CopySourceIfNoneMatch *string // Copies the object if it hasn't been modified since the specified time. // // If both the x-amz-copy-source-if-match and x-amz-copy-source-if-unmodified-since // headers are present in the request and evaluate as follows, Amazon S3 returns // 200 OK and copies the data: // // - x-amz-copy-source-if-match condition evaluates to true // // - x-amz-copy-source-if-unmodified-since condition evaluates to false CopySourceIfUnmodifiedSince *time.Time // Specifies the algorithm to use when decrypting the source object (for example, // AES256 ). // // If the source object for the copy is stored in Amazon S3 using SSE-C, you must // provide the necessary encryption information in your request so that Amazon S3 // can decrypt the object for copying. // // This functionality is not supported when the source object is in a directory // bucket. CopySourceSSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use to decrypt // the source object. The encryption key provided in this header must be the same // one that was used when the source object was created. // // If the source object for the copy is stored in Amazon S3 using SSE-C, you must // provide the necessary encryption information in your request so that Amazon S3 // can decrypt the object for copying. // // This functionality is not supported when the source object is in a directory // bucket. CopySourceSSECustomerKey *string // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. // Amazon S3 uses this header for a message integrity check to ensure that the // encryption key was transmitted without error. // // If the source object for the copy is stored in Amazon S3 using SSE-C, you must // provide the necessary encryption information in your request so that Amazon S3 // can decrypt the object for copying. // // This functionality is not supported when the source object is in a directory // bucket. CopySourceSSECustomerKeyMD5 *string // The account ID of the expected destination bucket owner. If the account ID that // you provide does not match the actual owner of the destination bucket, the // request fails with the HTTP status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The account ID of the expected source bucket owner. If the account ID that you // provide does not match the actual owner of the source bucket, the request fails // with the HTTP status code 403 Forbidden (access denied). ExpectedSourceBucketOwner *string // The date and time at which the object is no longer cacheable. Expires *time.Time // Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. GrantFullControl *string // Allows grantee to read the object data and its metadata. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. GrantRead *string // Allows grantee to read the object ACL. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. GrantReadACP *string // Allows grantee to write the ACL for the applicable object. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. GrantWriteACP *string // A map of metadata to store with the object in S3. Metadata map[string]string // Specifies whether the metadata is copied from the source object or replaced // with metadata that's provided in the request. When copying an object, you can // preserve all metadata (the default) or specify new metadata. If this header // isn’t specified, COPY is the default behavior. // // General purpose bucket - For general purpose buckets, when you grant // permissions, you can use the s3:x-amz-metadata-directive condition key to // enforce certain metadata behavior when objects are uploaded. For more // information, see [Amazon S3 condition key examples]in the Amazon S3 User Guide. // // x-amz-website-redirect-location is unique to each object and is not copied when // using the x-amz-metadata-directive header. To copy the value, you must specify // x-amz-website-redirect-location in the request header. // // [Amazon S3 condition key examples]: https://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html MetadataDirective types.MetadataDirective // Specifies whether you want to apply a legal hold to the object copy. // // This functionality is not supported for directory buckets. ObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus // The Object Lock mode that you want to apply to the object copy. // // This functionality is not supported for directory buckets. ObjectLockMode types.ObjectLockMode // The date and time when you want the Object Lock of the object copy to expire. // // This functionality is not supported for directory buckets. ObjectLockRetainUntilDate *time.Time // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Specifies the algorithm to use when encrypting the object (for example, AES256 ). // // When you perform a CopyObject operation, if you want to use a different type of // encryption setting for the target object, you can specify appropriate // encryption-related headers to encrypt the target object with an Amazon S3 // managed key, a KMS key, or a customer-provided key. If the encryption setting in // your request is different from the default encryption configuration of the // destination bucket, the encryption setting in your request takes precedence. // // This functionality is not supported when the destination bucket is a directory // bucket. SSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use in // encrypting data. This value is used to store the object and then it is // discarded. Amazon S3 does not store the encryption key. The key must be // appropriate for use with the algorithm specified in the // x-amz-server-side-encryption-customer-algorithm header. // // This functionality is not supported when the destination bucket is a directory // bucket. SSECustomerKey *string // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. // Amazon S3 uses this header for a message integrity check to ensure that the // encryption key was transmitted without error. // // This functionality is not supported when the destination bucket is a directory // bucket. SSECustomerKeyMD5 *string // Specifies the Amazon Web Services KMS Encryption Context as an additional // encryption context to use for the destination object encryption. The value of // this header is a base64-encoded UTF-8 string holding JSON with the encryption // context key-value pairs. // // General purpose buckets - This value must be explicitly added to specify // encryption context for CopyObject requests if you want an additional encryption // context for your destination object. The additional encryption context of the // source object won't be copied to the destination object. For more information, // see [Encryption context]in the Amazon S3 User Guide. // // Directory buckets - You can optionally provide an explicit encryption context // value. The value must match the default encryption context - the bucket Amazon // Resource Name (ARN). An additional encryption context value is not supported. // // [Encryption context]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context SSEKMSEncryptionContext *string // Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object // encryption. All GET and PUT requests for an object protected by KMS will fail if // they're not made via SSL or using SigV4. For information about configuring any // of the officially supported Amazon Web Services SDKs and Amazon Web Services // CLI, see [Specifying the Signature Version in Request Authentication]in the Amazon S3 User Guide. // // Directory buckets - To encrypt data using SSE-KMS, it's recommended to specify // the x-amz-server-side-encryption header to aws:kms . Then, the // x-amz-server-side-encryption-aws-kms-key-id header implicitly uses the bucket's // default KMS customer managed key ID. If you want to explicitly set the // x-amz-server-side-encryption-aws-kms-key-id header, it must match the bucket's // default customer managed key (using key ID or ARN, not alias). Your SSE-KMS // configuration can only support 1 [customer managed key]per directory bucket's lifetime. The [Amazon Web Services managed key] ( aws/s3 // ) isn't supported. // // Incorrect key specification results in an HTTP 400 Bad Request error. // // [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk // [Specifying the Signature Version in Request Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version // [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk SSEKMSKeyId *string // The server-side encryption algorithm used when storing this object in Amazon // S3. Unrecognized or unsupported values won’t write a destination object and will // receive a 400 Bad Request response. // // Amazon S3 automatically encrypts all new objects that are copied to an S3 // bucket. When copying an object, if you don't specify encryption information in // your copy request, the encryption setting of the target object is set to the // default encryption configuration of the destination bucket. By default, all // buckets have a base level of encryption configuration that uses server-side // encryption with Amazon S3 managed keys (SSE-S3). If the destination bucket has a // different default encryption configuration, Amazon S3 uses the corresponding // encryption key to encrypt the target object copy. // // With server-side encryption, Amazon S3 encrypts your data as it writes your // data to disks in its data centers and decrypts the data when you access it. For // more information about server-side encryption, see [Using Server-Side Encryption]in the Amazon S3 User Guide. // // General purpose buckets // // - For general purpose buckets, there are the following supported options for // server-side encryption: server-side encryption with Key Management Service (KMS) // keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS // keys (DSSE-KMS), and server-side encryption with customer-provided encryption // keys (SSE-C). Amazon S3 uses the corresponding KMS key, or a customer-provided // key to encrypt the target object copy. // // - When you perform a CopyObject operation, if you want to use a different type // of encryption setting for the target object, you can specify appropriate // encryption-related headers to encrypt the target object with an Amazon S3 // managed key, a KMS key, or a customer-provided key. If the encryption setting in // your request is different from the default encryption configuration of the // destination bucket, the encryption setting in your request takes precedence. // // Directory buckets // // - For directory buckets, there are only two supported options for server-side // encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) ( // AES256 ) and server-side encryption with KMS keys (SSE-KMS) ( aws:kms ). We // recommend that the bucket's default encryption uses the desired encryption // configuration and you don't override the bucket default encryption in your // CreateSession requests or PUT object requests. Then, new objects are // automatically encrypted with the desired encryption settings. For more // information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about the // encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads]. // // - To encrypt new object copies to a directory bucket with SSE-KMS, we // recommend you specify SSE-KMS as the directory bucket's default encryption // configuration with a KMS key (specifically, a [customer managed key]). The [Amazon Web Services managed key]( aws/s3 ) isn't // supported. Your SSE-KMS configuration can only support 1 [customer managed key]per directory bucket // for the lifetime of the bucket. After you specify a customer managed key for // SSE-KMS, you can't override the customer managed key for the bucket's SSE-KMS // configuration. Then, when you perform a CopyObject operation and want to // specify server-side encryption settings for new object copies with SSE-KMS in // the encryption-related request headers, you must ensure the encryption key is // the same customer managed key that you specified for the directory bucket's // default encryption configuration. // // [Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html // [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html // [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html // [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk ServerSideEncryption types.ServerSideEncryption // If the x-amz-storage-class header is not used, the copied object will be stored // in the STANDARD Storage Class by default. The STANDARD storage class provides // high durability and high availability. Depending on performance needs, you can // specify a different Storage Class. // // - Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3 // Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3 // One Zone-Infrequent Access storage class) in Dedicated Local Zones. Unsupported // storage class values won't write a destination object and will respond with the // HTTP status code 400 Bad Request . // // - Amazon S3 on Outposts - S3 on Outposts only uses the OUTPOSTS Storage Class. // // You can use the CopyObject action to change the storage class of an object that // is already stored in Amazon S3 by using the x-amz-storage-class header. For // more information, see [Storage Classes]in the Amazon S3 User Guide. // // Before using an object as a source object for the copy operation, you must // restore a copy of it if it meets any of the following conditions: // // - The storage class of the source object is GLACIER or DEEP_ARCHIVE . // // - The storage class of the source object is INTELLIGENT_TIERING and it's [S3 Intelligent-Tiering access tier]is // Archive Access or Deep Archive Access . // // For more information, see [RestoreObject] and [Copying Objects] in the Amazon S3 User Guide. // // [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html // [RestoreObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html // [Copying Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectsExamples.html // [S3 Intelligent-Tiering access tier]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/intelligent-tiering-overview.html#intel-tiering-tier-definition StorageClass types.StorageClass // The tag-set for the object copy in the destination bucket. This value must be // used in conjunction with the x-amz-tagging-directive if you choose REPLACE for // the x-amz-tagging-directive . If you choose COPY for the x-amz-tagging-directive // , you don't need to set the x-amz-tagging header, because the tag-set will be // copied from the source object directly. The tag-set must be encoded as URL Query // parameters. // // The default value is the empty value. // // Directory buckets - For directory buckets in a CopyObject operation, only the // empty tag-set is supported. Any requests that attempt to write non-empty tags // into directory buckets will receive a 501 Not Implemented status code. When the // destination bucket is a directory bucket, you will receive a 501 Not Implemented // response in any of the following situations: // // - When you attempt to COPY the tag-set from an S3 source object that has // non-empty tags. // // - When you attempt to REPLACE the tag-set of a source object and set a // non-empty value to x-amz-tagging . // // - When you don't set the x-amz-tagging-directive header and the source object // has non-empty tags. This is because the default value of // x-amz-tagging-directive is COPY . // // Because only the empty tag-set is supported for directory buckets in a // CopyObject operation, the following situations are allowed: // // - When you attempt to COPY the tag-set from a directory bucket source object // that has no tags to a general purpose bucket. It copies an empty tag-set to the // destination object. // // - When you attempt to REPLACE the tag-set of a directory bucket source object // and set the x-amz-tagging value of the directory bucket destination object to // empty. // // - When you attempt to REPLACE the tag-set of a general purpose bucket source // object that has non-empty tags and set the x-amz-tagging value of the // directory bucket destination object to empty. // // - When you attempt to REPLACE the tag-set of a directory bucket source object // and don't set the x-amz-tagging value of the directory bucket destination // object. This is because the default value of x-amz-tagging is the empty value. Tagging *string // Specifies whether the object tag-set is copied from the source object or // replaced with the tag-set that's provided in the request. // // The default value is COPY . // // Directory buckets - For directory buckets in a CopyObject operation, only the // empty tag-set is supported. Any requests that attempt to write non-empty tags // into directory buckets will receive a 501 Not Implemented status code. When the // destination bucket is a directory bucket, you will receive a 501 Not Implemented // response in any of the following situations: // // - When you attempt to COPY the tag-set from an S3 source object that has // non-empty tags. // // - When you attempt to REPLACE the tag-set of a source object and set a // non-empty value to x-amz-tagging . // // - When you don't set the x-amz-tagging-directive header and the source object // has non-empty tags. This is because the default value of // x-amz-tagging-directive is COPY . // // Because only the empty tag-set is supported for directory buckets in a // CopyObject operation, the following situations are allowed: // // - When you attempt to COPY the tag-set from a directory bucket source object // that has no tags to a general purpose bucket. It copies an empty tag-set to the // destination object. // // - When you attempt to REPLACE the tag-set of a directory bucket source object // and set the x-amz-tagging value of the directory bucket destination object to // empty. // // - When you attempt to REPLACE the tag-set of a general purpose bucket source // object that has non-empty tags and set the x-amz-tagging value of the // directory bucket destination object to empty. // // - When you attempt to REPLACE the tag-set of a directory bucket source object // and don't set the x-amz-tagging value of the directory bucket destination // object. This is because the default value of x-amz-tagging is the empty value. TaggingDirective types.TaggingDirective // If the destination bucket is configured as a website, redirects requests for // this object copy to another object in the same bucket or to an external URL. // Amazon S3 stores the value of this header in the object metadata. This value is // unique to each object and is not copied when using the x-amz-metadata-directive // header. Instead, you may opt to provide this header in combination with the // x-amz-metadata-directive header. // // This functionality is not supported for directory buckets. WebsiteRedirectLocation *string noSmithyDocumentSerde } func (in *CopyObjectInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.CopySource = in.CopySource p.Key = in.Key p.DisableS3ExpressSessionAuth = ptr.Bool(true) } type CopyObjectOutput struct { // Indicates whether the copied object uses an S3 Bucket Key for server-side // encryption with Key Management Service (KMS) keys (SSE-KMS). BucketKeyEnabled *bool // Container for all response elements. CopyObjectResult *types.CopyObjectResult // Version ID of the source object that was copied. // // This functionality is not supported when the source object is in a directory // bucket. CopySourceVersionId *string // If the object expiration is configured, the response includes this header. // // Object expiration information is not returned in directory buckets and this // header returns the value " NotImplemented " in all responses for directory // buckets. Expiration *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to confirm the encryption // algorithm that's used. // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to provide the round-trip // message integrity verification of the customer-provided encryption key. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // If present, indicates the Amazon Web Services KMS Encryption Context to use for // object encryption. The value of this header is a Base64 encoded UTF-8 string // holding JSON with the encryption context key-value pairs. SSEKMSEncryptionContext *string // If present, indicates the ID of the KMS key that was used for object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when you store this object in Amazon // S3 (for example, AES256 , aws:kms , aws:kms:dsse ). ServerSideEncryption types.ServerSideEncryption // Version ID of the newly created copy. // // This functionality is not supported for directory buckets. VersionId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCopyObjectMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpCopyObject{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpCopyObject{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CopyObject"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCopyObjectValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCopyObject(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addCopyObjectUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = s3cust.HandleResponseErrorWith200Status(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *CopyObjectInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opCopyObject(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CopyObject", } } // getCopyObjectBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getCopyObjectBucketMember(input interface{}) (*string, bool) { in := input.(*CopyObjectInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addCopyObjectUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getCopyObjectBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CreateBucket.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This action creates an Amazon S3 bucket. To create an Amazon S3 on Outposts // bucket, see [CreateBucket]CreateBucket . // // Creates a new S3 bucket. To create a bucket, you must set up Amazon S3 and have // a valid Amazon Web Services Access Key ID to authenticate requests. Anonymous // requests are never allowed to create buckets. By creating the bucket, you become // the bucket owner. // // There are two types of buckets: general purpose buckets and directory buckets. // For more information about these bucket types, see [Creating, configuring, and working with Amazon S3 buckets]in the Amazon S3 User Guide. // // - General purpose buckets - If you send your CreateBucket request to the // s3.amazonaws.com global endpoint, the request goes to the us-east-1 Region. So // the signature calculations in Signature Version 4 must use us-east-1 as the // Region, even if the location constraint in the request specifies another Region // where the bucket is to be created. If you create a bucket in a Region other than // US East (N. Virginia), your application must be able to handle 307 redirect. For // more information, see [Virtual hosting of buckets]in the Amazon S3 User Guide. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Regional endpoint. These endpoints support path-style // requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // // - General purpose bucket permissions - In addition to the s3:CreateBucket // permission, the following permissions are required in a policy when your // CreateBucket request includes specific headers: // // - Access control lists (ACLs) - In your CreateBucket request, if you specify // an access control list (ACL) and set it to public-read , public-read-write , // authenticated-read , or if you explicitly specify any other custom ACLs, both // s3:CreateBucket and s3:PutBucketAcl permissions are required. In your // CreateBucket request, if you set the ACL to private , or if you don't specify // any ACLs, only the s3:CreateBucket permission is required. // // - Object Lock - In your CreateBucket request, if you set // x-amz-bucket-object-lock-enabled to true, the // s3:PutBucketObjectLockConfiguration and s3:PutBucketVersioning permissions are // required. // // - S3 Object Ownership - If your CreateBucket request includes the // x-amz-object-ownership header, then the s3:PutBucketOwnershipControls // permission is required. // // To set an ACL on a bucket as part of a CreateBucket request, you must explicitly // // set S3 Object Ownership for the bucket to a different value than the default, // BucketOwnerEnforced . Additionally, if your desired bucket ACL grants public // access, you must first create the bucket (without the bucket ACL) and then // explicitly disable Block Public Access on the bucket before using PutBucketAcl // to set the ACL. If you try to create a bucket with a public ACL, the request // will fail. // // For the majority of modern use cases in S3, we recommend that you keep all // // Block Public Access settings enabled and keep ACLs disabled. If you would like // to share data with users outside of your account, you can use bucket policies as // needed. For more information, see [Controlling ownership of objects and disabling ACLs for your bucket]and [Blocking public access to your Amazon S3 storage]in the Amazon S3 User Guide. // // - S3 Block Public Access - If your specific use case requires granting public // access to your S3 resources, you can disable Block Public Access. Specifically, // you can create a new bucket with Block Public Access enabled, then separately // call the [DeletePublicAccessBlock]DeletePublicAccessBlock API. To use this operation, you must have the // s3:PutBucketPublicAccessBlock permission. For more information about S3 Block // Public Access, see [Blocking public access to your Amazon S3 storage]in the Amazon S3 User Guide. // // - Directory bucket permissions - You must have the s3express:CreateBucket // permission in an IAM identity-based policy instead of a bucket policy. // Cross-account access to this API operation isn't supported. This operation can // only be performed by the Amazon Web Services account that owns the resource. For // more information about directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the // Amazon S3 User Guide. // // The permissions for ACLs, Object Lock, S3 Object Ownership, and S3 Block Public // // Access are not supported for directory buckets. For directory buckets, all Block // Public Access settings are enabled at the bucket level and S3 Object Ownership // is set to Bucket owner enforced (ACLs disabled). These settings can't be // modified. // // For more information about permissions for creating and working with directory // // buckets, see [Directory buckets]in the Amazon S3 User Guide. For more information about // supported S3 features for directory buckets, see [Features of S3 Express One Zone]in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region-code.amazonaws.com . // // The following operations are related to CreateBucket : // // [PutObject] // // [DeleteBucket] // // [Creating, configuring, and working with Amazon S3 buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateBucket.html // [Virtual hosting of buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // // [DeletePublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html // [Directory buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html // [Features of S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone.html#s3-express-features // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html // [Controlling ownership of objects and disabling ACLs for your bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html // [Blocking public access to your Amazon S3 storage]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html func (c *Client) CreateBucket(ctx context.Context, params *CreateBucketInput, optFns ...func(*Options)) (*CreateBucketOutput, error) { if params == nil { params = &CreateBucketInput{} } result, metadata, err := c.invokeOperation(ctx, "CreateBucket", params, optFns, c.addOperationCreateBucketMiddlewares) if err != nil { return nil, err } out := result.(*CreateBucketOutput) out.ResultMetadata = metadata return out, nil } type CreateBucketInput struct { // The name of the bucket to create. // // General purpose buckets - For information about bucket naming restrictions, see [Bucket naming rules] // in the Amazon S3 User Guide. // // Directory buckets - When you use this operation with a directory bucket, you // must use path-style requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. Directory bucket names must be // unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must // also follow the format bucket-base-name--zone-id--x-s3 (for example, // DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [Bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html // // This member is required. Bucket *string // The canned ACL to apply to the bucket. // // This functionality is not supported for directory buckets. ACL types.BucketCannedACL // The configuration information for the bucket. CreateBucketConfiguration *types.CreateBucketConfiguration // Allows grantee the read, write, read ACP, and write ACP permissions on the // bucket. // // This functionality is not supported for directory buckets. GrantFullControl *string // Allows grantee to list the objects in the bucket. // // This functionality is not supported for directory buckets. GrantRead *string // Allows grantee to read the bucket ACL. // // This functionality is not supported for directory buckets. GrantReadACP *string // Allows grantee to create new objects in the bucket. // // For the bucket and object owners of existing objects, also allows deletions and // overwrites of those objects. // // This functionality is not supported for directory buckets. GrantWrite *string // Allows grantee to write the ACL for the applicable bucket. // // This functionality is not supported for directory buckets. GrantWriteACP *string // Specifies whether you want S3 Object Lock to be enabled for the new bucket. // // This functionality is not supported for directory buckets. ObjectLockEnabledForBucket *bool // The container element for object ownership for a bucket's ownership controls. // // BucketOwnerPreferred - Objects uploaded to the bucket change ownership to the // bucket owner if the objects are uploaded with the bucket-owner-full-control // canned ACL. // // ObjectWriter - The uploading account will own the object if the object is // uploaded with the bucket-owner-full-control canned ACL. // // BucketOwnerEnforced - Access control lists (ACLs) are disabled and no longer // affect permissions. The bucket owner automatically owns and has full control // over every object in the bucket. The bucket only accepts PUT requests that don't // specify an ACL or specify bucket owner full control ACLs (such as the predefined // bucket-owner-full-control canned ACL or a custom ACL in XML format that grants // the same permissions). // // By default, ObjectOwnership is set to BucketOwnerEnforced and ACLs are // disabled. We recommend keeping ACLs disabled, except in uncommon use cases where // you must control access for each object individually. For more information about // S3 Object Ownership, see [Controlling ownership of objects and disabling ACLs for your bucket]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. Directory buckets // use the bucket owner enforced setting for S3 Object Ownership. // // [Controlling ownership of objects and disabling ACLs for your bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html ObjectOwnership types.ObjectOwnership noSmithyDocumentSerde } func (in *CreateBucketInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) p.DisableAccessPoints = ptr.Bool(true) } type CreateBucketOutput struct { // A forward slash followed by the name of the bucket. Location *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCreateBucketMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpCreateBucket{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpCreateBucket{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CreateBucket"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCreateBucketValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateBucket(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addCreateBucketUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *CreateBucketInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opCreateBucket(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CreateBucket", } } // getCreateBucketBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getCreateBucketBucketMember(input interface{}) (*string, bool) { in := input.(*CreateBucketInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addCreateBucketUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getCreateBucketBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: false, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CreateBucketMetadataTableConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates a metadata table configuration for a general purpose bucket. For more // information, see [Accelerating data discovery with S3 Metadata]in the Amazon S3 User Guide. // // Permissions To use this operation, you must have the following permissions. For // more information, see [Setting up permissions for configuring metadata tables]in the Amazon S3 User Guide. // // If you also want to integrate your table bucket with Amazon Web Services // analytics services so that you can query your metadata table, you need // additional permissions. For more information, see [Integrating Amazon S3 Tables with Amazon Web Services analytics services]in the Amazon S3 User Guide. // // - s3:CreateBucketMetadataTableConfiguration // // - s3tables:CreateNamespace // // - s3tables:GetTable // // - s3tables:CreateTable // // - s3tables:PutTablePolicy // // The following operations are related to CreateBucketMetadataTableConfiguration : // // [DeleteBucketMetadataTableConfiguration] // // [GetBucketMetadataTableConfiguration] // // [Setting up permissions for configuring metadata tables]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html // [GetBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html // [DeleteBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataTableConfiguration.html // [Accelerating data discovery with S3 Metadata]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html // [Integrating Amazon S3 Tables with Amazon Web Services analytics services]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html func (c *Client) CreateBucketMetadataTableConfiguration(ctx context.Context, params *CreateBucketMetadataTableConfigurationInput, optFns ...func(*Options)) (*CreateBucketMetadataTableConfigurationOutput, error) { if params == nil { params = &CreateBucketMetadataTableConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "CreateBucketMetadataTableConfiguration", params, optFns, c.addOperationCreateBucketMetadataTableConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*CreateBucketMetadataTableConfigurationOutput) out.ResultMetadata = metadata return out, nil } type CreateBucketMetadataTableConfigurationInput struct { // The general purpose bucket that you want to create the metadata table // configuration in. // // This member is required. Bucket *string // The contents of your metadata table configuration. // // This member is required. MetadataTableConfiguration *types.MetadataTableConfiguration // The checksum algorithm to use with your metadata table configuration. ChecksumAlgorithm types.ChecksumAlgorithm // The Content-MD5 header for the metadata table configuration. ContentMD5 *string // The expected owner of the general purpose bucket that contains your metadata // table configuration. ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *CreateBucketMetadataTableConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type CreateBucketMetadataTableConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCreateBucketMetadataTableConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpCreateBucketMetadataTableConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpCreateBucketMetadataTableConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CreateBucketMetadataTableConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCreateBucketMetadataTableConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateBucketMetadataTableConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addCreateBucketMetadataTableConfigurationInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addCreateBucketMetadataTableConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *CreateBucketMetadataTableConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opCreateBucketMetadataTableConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CreateBucketMetadataTableConfiguration", } } // getCreateBucketMetadataTableConfigurationRequestAlgorithmMember gets the // request checksum algorithm value provided as input. func getCreateBucketMetadataTableConfigurationRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*CreateBucketMetadataTableConfigurationInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addCreateBucketMetadataTableConfigurationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getCreateBucketMetadataTableConfigurationRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getCreateBucketMetadataTableConfigurationBucketMember returns a pointer to // string denoting a provided bucket member valueand a boolean indicating if the // input has a modeled bucket name, func getCreateBucketMetadataTableConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*CreateBucketMetadataTableConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addCreateBucketMetadataTableConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getCreateBucketMetadataTableConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CreateMultipartUpload.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // This action initiates a multipart upload and returns an upload ID. This upload // ID is used to associate all of the parts in the specific multipart upload. You // specify this upload ID in each of your subsequent upload part requests (see [UploadPart]). // You also include this upload ID in the final request to either complete or abort // the multipart upload request. For more information about multipart uploads, see [Multipart Upload Overview] // in the Amazon S3 User Guide. // // After you initiate a multipart upload and upload one or more parts, to stop // being charged for storing the uploaded parts, you must either complete or abort // the multipart upload. Amazon S3 frees up the space used to store the parts and // stops charging you for storing them only after you either complete or abort a // multipart upload. // // If you have configured a lifecycle rule to abort incomplete multipart uploads, // the created multipart upload must be completed within the number of days // specified in the bucket lifecycle configuration. Otherwise, the incomplete // multipart upload becomes eligible for an abort action and Amazon S3 aborts the // multipart upload. For more information, see [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]. // // - Directory buckets - S3 Lifecycle is not supported by directory buckets. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Zonal endpoint. These endpoints support // virtual-hosted-style requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Request signing For request signing, multipart upload is just a series of // regular requests. You initiate a multipart upload, send one or more requests to // upload parts, and then complete the multipart upload process. You sign each // request individually. There is nothing special about signing multipart upload // requests. For more information about signing, see [Authenticating Requests (Amazon Web Services Signature Version 4)]in the Amazon S3 User Guide. // // Permissions // // - General purpose bucket permissions - To perform a multipart upload with // encryption using an Key Management Service (KMS) KMS key, the requester must // have permission to the kms:Decrypt and kms:GenerateDataKey actions on the key. // The requester must also have permissions for the kms:GenerateDataKey action // for the CreateMultipartUpload API. Then, the requester needs permissions for // the kms:Decrypt action on the UploadPart and UploadPartCopy APIs. These // permissions are required because Amazon S3 must decrypt and read data from the // encrypted file parts before it completes the multipart upload. For more // information, see [Multipart upload API and permissions]and [Protecting data using server-side encryption with Amazon Web Services KMS]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // Encryption // // - General purpose buckets - Server-side encryption is for data encryption at // rest. Amazon S3 encrypts your data as it writes it to disks in its data centers // and decrypts it when you access it. Amazon S3 automatically encrypts all new // objects that are uploaded to an S3 bucket. When doing a multipart upload, if you // don't specify encryption information in your request, the encryption setting of // the uploaded parts is set to the default encryption configuration of the // destination bucket. By default, all buckets have a base level of encryption // configuration that uses server-side encryption with Amazon S3 managed keys // (SSE-S3). If the destination bucket has a default encryption configuration that // uses server-side encryption with an Key Management Service (KMS) key (SSE-KMS), // or a customer-provided encryption key (SSE-C), Amazon S3 uses the corresponding // KMS key, or a customer-provided key to encrypt the uploaded parts. When you // perform a CreateMultipartUpload operation, if you want to use a different type // of encryption setting for the uploaded parts, you can request that Amazon S3 // encrypts the object with a different encryption key (such as an Amazon S3 // managed key, a KMS key, or a customer-provided key). When the encryption setting // in your request is different from the default encryption configuration of the // destination bucket, the encryption setting in your request takes precedence. If // you choose to provide your own encryption key, the request headers you provide // in [UploadPart]and [UploadPartCopy]requests must match the headers you used in the CreateMultipartUpload // request. // // - Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key ( // aws/s3 ) and KMS customer managed keys stored in Key Management Service (KMS) // – If you want Amazon Web Services to manage the keys used to encrypt data, // specify the following headers in the request. // // - x-amz-server-side-encryption // // - x-amz-server-side-encryption-aws-kms-key-id // // - x-amz-server-side-encryption-context // // - If you specify x-amz-server-side-encryption:aws:kms , but don't provide // x-amz-server-side-encryption-aws-kms-key-id , Amazon S3 uses the Amazon Web // Services managed key ( aws/s3 key) in KMS to protect the data. // // - To perform a multipart upload with encryption by using an Amazon Web // Services KMS key, the requester must have permission to the kms:Decrypt and // kms:GenerateDataKey* actions on the key. These permissions are required // because Amazon S3 must decrypt and read data from the encrypted file parts // before it completes the multipart upload. For more information, see [Multipart upload API and permissions]and [Protecting data using server-side encryption with Amazon Web Services KMS]in // the Amazon S3 User Guide. // // - If your Identity and Access Management (IAM) user or role is in the same // Amazon Web Services account as the KMS key, then you must have these permissions // on the key policy. If your IAM user or role is in a different account from the // key, then you must have the permissions on both the key policy and your IAM user // or role. // // - All GET and PUT requests for an object protected by KMS fail if you don't // make them by using Secure Sockets Layer (SSL), Transport Layer Security (TLS), // or Signature Version 4. For information about configuring any of the officially // supported Amazon Web Services SDKs and Amazon Web Services CLI, see [Specifying the Signature Version in Request Authentication]in the // Amazon S3 User Guide. // // For more information about server-side encryption with KMS keys (SSE-KMS), see [Protecting Data Using Server-Side Encryption with KMS keys] // // in the Amazon S3 User Guide. // // - Use customer-provided encryption keys (SSE-C) – If you want to manage your // own encryption keys, provide all the following headers in the request. // // - x-amz-server-side-encryption-customer-algorithm // // - x-amz-server-side-encryption-customer-key // // - x-amz-server-side-encryption-customer-key-MD5 // // For more information about server-side encryption with customer-provided // // encryption keys (SSE-C), see [Protecting data using server-side encryption with customer-provided encryption keys (SSE-C)]in the Amazon S3 User Guide. // // - Directory buckets - For directory buckets, there are only two supported // options for server-side encryption: server-side encryption with Amazon S3 // managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys // (SSE-KMS) ( aws:kms ). We recommend that the bucket's default encryption uses // the desired encryption configuration and you don't override the bucket default // encryption in your CreateSession requests or PUT object requests. Then, new // objects are automatically encrypted with the desired encryption settings. For // more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about // the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads]. // // In the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]) using the REST API, the // // encryption request headers must match the encryption settings that are specified // in the CreateSession request. You can't override the values of the encryption // settings ( x-amz-server-side-encryption , // x-amz-server-side-encryption-aws-kms-key-id , // x-amz-server-side-encryption-context , and // x-amz-server-side-encryption-bucket-key-enabled ) that are specified in the // CreateSession request. You don't need to explicitly specify these encryption // settings values in Zonal endpoint API calls, and Amazon S3 will use the // encryption settings values from the CreateSession request to protect new // objects in the directory bucket. // // When you use the CLI or the Amazon Web Services SDKs, for CreateSession , the // // session token refreshes automatically to avoid service interruptions when a // session expires. The CLI or the Amazon Web Services SDKs use the bucket's // default encryption configuration for the CreateSession request. It's not // supported to override the encryption settings values in the CreateSession // request. So in the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]), the encryption // request headers must match the default encryption configuration of the directory // bucket. // // For directory buckets, when you perform a CreateMultipartUpload operation and an // // UploadPartCopy operation, the request headers you provide in the // CreateMultipartUpload request must match the default encryption configuration // of the destination bucket. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to CreateMultipartUpload : // // [UploadPart] // // [CompleteMultipartUpload] // // [AbortMultipartUpload] // // [ListParts] // // [ListMultipartUploads] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html // [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html // [Protecting Data Using Server-Side Encryption with KMS keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html // [Specifying the Signature Version in Request Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version // [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [Multipart upload API and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html // [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html // [Authenticating Requests (Amazon Web Services Signature Version 4)]: https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html // [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html // [Multipart Upload Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html // [Protecting data using server-side encryption with Amazon Web Services KMS]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html // [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // // [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html // [Protecting data using server-side encryption with customer-provided encryption keys (SSE-C)]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html func (c *Client) CreateMultipartUpload(ctx context.Context, params *CreateMultipartUploadInput, optFns ...func(*Options)) (*CreateMultipartUploadOutput, error) { if params == nil { params = &CreateMultipartUploadInput{} } result, metadata, err := c.invokeOperation(ctx, "CreateMultipartUpload", params, optFns, c.addOperationCreateMultipartUploadMiddlewares) if err != nil { return nil, err } out := result.(*CreateMultipartUploadOutput) out.ResultMetadata = metadata return out, nil } type CreateMultipartUploadInput struct { // The name of the bucket where the multipart upload is initiated and where the // object is uploaded. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Object key for which the multipart upload is to be initiated. // // This member is required. Key *string // The canned ACL to apply to the object. Amazon S3 supports a set of predefined // ACLs, known as canned ACLs. Each canned ACL has a predefined set of grantees and // permissions. For more information, see [Canned ACL]in the Amazon S3 User Guide. // // By default, all objects are private. Only the owner has full access control. // When uploading an object, you can grant access permissions to individual Amazon // Web Services accounts or to predefined groups defined by Amazon S3. These // permissions are then added to the access control list (ACL) on the new object. // For more information, see [Using ACLs]. One way to grant the permissions using the request // headers is to specify a canned ACL with the x-amz-acl request header. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. // // [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL // [Using ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html ACL types.ObjectCannedACL // Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption // with server-side encryption using Key Management Service (KMS) keys (SSE-KMS). // // General purpose buckets - Setting this header to true causes Amazon S3 to use // an S3 Bucket Key for object encryption with SSE-KMS. Also, specifying this // header with a PUT action doesn't affect bucket-level settings for S3 Bucket Key. // // Directory buckets - S3 Bucket Keys are always enabled for GET and PUT // operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't // supported, when you copy SSE-KMS encrypted objects from general purpose buckets // to directory buckets, from directory buckets to general purpose buckets, or // between directory buckets, through [CopyObject], [UploadPartCopy], [the Copy operation in Batch Operations], or [the import jobs]. In this case, Amazon S3 makes a // call to KMS every time a copy request is made for a KMS-encrypted object. // // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [the import jobs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html // [the Copy operation in Batch Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops BucketKeyEnabled *bool // Specifies caching behavior along the request/reply chain. CacheControl *string // Indicates the algorithm that you want Amazon S3 to use to create the checksum // for the object. For more information, see [Checking object integrity]in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // Indicates the checksum type that you want Amazon S3 to use to calculate the // object’s checksum value. For more information, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumType types.ChecksumType // Specifies presentational information for the object. ContentDisposition *string // Specifies what content encodings have been applied to the object and thus what // decoding mechanisms must be applied to obtain the media-type referenced by the // Content-Type header field. // // For directory buckets, only the aws-chunked value is supported in this header // field. ContentEncoding *string // The language that the content is in. ContentLanguage *string // A standard MIME type describing the format of the object data. ContentType *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The date and time at which the object is no longer cacheable. Expires *time.Time // Specify access permissions explicitly to give the grantee READ, READ_ACP, and // WRITE_ACP permissions on the object. // // By default, all objects are private. Only the owner has full access control. // When uploading an object, you can use this header to explicitly grant access // permissions to specific Amazon Web Services accounts or groups. This header maps // to specific permissions that Amazon S3 supports in an ACL. For more information, // see [Access Control List (ACL) Overview]in the Amazon S3 User Guide. // // You specify each grantee as a type=value pair, where the type is one of the // following: // // - id – if the value specified is the canonical user ID of an Amazon Web // Services account // // - uri – if you are granting permissions to a predefined group // // - emailAddress – if the value specified is the email address of an Amazon Web // Services account // // Using email addresses to specify a grantee is only supported in the following // Amazon Web Services Regions: // // - US East (N. Virginia) // // - US West (N. California) // // - US West (Oregon) // // - Asia Pacific (Singapore) // // - Asia Pacific (Sydney) // // - Asia Pacific (Tokyo) // // - Europe (Ireland) // // - South America (São Paulo) // // For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the // Amazon Web Services General Reference. // // For example, the following x-amz-grant-read header grants the Amazon Web // Services accounts identified by account IDs permissions to read object data and // its metadata: // // x-amz-grant-read: id="11112222333", id="444455556666" // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. // // [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region // [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html GrantFullControl *string // Specify access permissions explicitly to allow grantee to read the object data // and its metadata. // // By default, all objects are private. Only the owner has full access control. // When uploading an object, you can use this header to explicitly grant access // permissions to specific Amazon Web Services accounts or groups. This header maps // to specific permissions that Amazon S3 supports in an ACL. For more information, // see [Access Control List (ACL) Overview]in the Amazon S3 User Guide. // // You specify each grantee as a type=value pair, where the type is one of the // following: // // - id – if the value specified is the canonical user ID of an Amazon Web // Services account // // - uri – if you are granting permissions to a predefined group // // - emailAddress – if the value specified is the email address of an Amazon Web // Services account // // Using email addresses to specify a grantee is only supported in the following // Amazon Web Services Regions: // // - US East (N. Virginia) // // - US West (N. California) // // - US West (Oregon) // // - Asia Pacific (Singapore) // // - Asia Pacific (Sydney) // // - Asia Pacific (Tokyo) // // - Europe (Ireland) // // - South America (São Paulo) // // For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the // Amazon Web Services General Reference. // // For example, the following x-amz-grant-read header grants the Amazon Web // Services accounts identified by account IDs permissions to read object data and // its metadata: // // x-amz-grant-read: id="11112222333", id="444455556666" // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. // // [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region // [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html GrantRead *string // Specify access permissions explicitly to allows grantee to read the object ACL. // // By default, all objects are private. Only the owner has full access control. // When uploading an object, you can use this header to explicitly grant access // permissions to specific Amazon Web Services accounts or groups. This header maps // to specific permissions that Amazon S3 supports in an ACL. For more information, // see [Access Control List (ACL) Overview]in the Amazon S3 User Guide. // // You specify each grantee as a type=value pair, where the type is one of the // following: // // - id – if the value specified is the canonical user ID of an Amazon Web // Services account // // - uri – if you are granting permissions to a predefined group // // - emailAddress – if the value specified is the email address of an Amazon Web // Services account // // Using email addresses to specify a grantee is only supported in the following // Amazon Web Services Regions: // // - US East (N. Virginia) // // - US West (N. California) // // - US West (Oregon) // // - Asia Pacific (Singapore) // // - Asia Pacific (Sydney) // // - Asia Pacific (Tokyo) // // - Europe (Ireland) // // - South America (São Paulo) // // For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the // Amazon Web Services General Reference. // // For example, the following x-amz-grant-read header grants the Amazon Web // Services accounts identified by account IDs permissions to read object data and // its metadata: // // x-amz-grant-read: id="11112222333", id="444455556666" // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. // // [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region // [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html GrantReadACP *string // Specify access permissions explicitly to allows grantee to allow grantee to // write the ACL for the applicable object. // // By default, all objects are private. Only the owner has full access control. // When uploading an object, you can use this header to explicitly grant access // permissions to specific Amazon Web Services accounts or groups. This header maps // to specific permissions that Amazon S3 supports in an ACL. For more information, // see [Access Control List (ACL) Overview]in the Amazon S3 User Guide. // // You specify each grantee as a type=value pair, where the type is one of the // following: // // - id – if the value specified is the canonical user ID of an Amazon Web // Services account // // - uri – if you are granting permissions to a predefined group // // - emailAddress – if the value specified is the email address of an Amazon Web // Services account // // Using email addresses to specify a grantee is only supported in the following // Amazon Web Services Regions: // // - US East (N. Virginia) // // - US West (N. California) // // - US West (Oregon) // // - Asia Pacific (Singapore) // // - Asia Pacific (Sydney) // // - Asia Pacific (Tokyo) // // - Europe (Ireland) // // - South America (São Paulo) // // For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the // Amazon Web Services General Reference. // // For example, the following x-amz-grant-read header grants the Amazon Web // Services accounts identified by account IDs permissions to read object data and // its metadata: // // x-amz-grant-read: id="11112222333", id="444455556666" // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. // // [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region // [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html GrantWriteACP *string // A map of metadata to store with the object in S3. Metadata map[string]string // Specifies whether you want to apply a legal hold to the uploaded object. // // This functionality is not supported for directory buckets. ObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus // Specifies the Object Lock mode that you want to apply to the uploaded object. // // This functionality is not supported for directory buckets. ObjectLockMode types.ObjectLockMode // Specifies the date and time when you want the Object Lock to expire. // // This functionality is not supported for directory buckets. ObjectLockRetainUntilDate *time.Time // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Specifies the algorithm to use when encrypting the object (for example, AES256). // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use in // encrypting data. This value is used to store the object and then it is // discarded; Amazon S3 does not store the encryption key. The key must be // appropriate for use with the algorithm specified in the // x-amz-server-side-encryption-customer-algorithm header. // // This functionality is not supported for directory buckets. SSECustomerKey *string // Specifies the 128-bit MD5 digest of the customer-provided encryption key // according to RFC 1321. Amazon S3 uses this header for a message integrity check // to ensure that the encryption key was transmitted without error. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // Specifies the Amazon Web Services KMS Encryption Context to use for object // encryption. The value of this header is a Base64 encoded string of a UTF-8 // encoded JSON, which contains the encryption context as key-value pairs. // // Directory buckets - You can optionally provide an explicit encryption context // value. The value must match the default encryption context - the bucket Amazon // Resource Name (ARN). An additional encryption context value is not supported. SSEKMSEncryptionContext *string // Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object // encryption. If the KMS key doesn't exist in the same account that's issuing the // command, you must use the full Key ARN not the Key ID. // // General purpose buckets - If you specify x-amz-server-side-encryption with // aws:kms or aws:kms:dsse , this header specifies the ID (Key ID, Key ARN, or Key // Alias) of the KMS key to use. If you specify // x-amz-server-side-encryption:aws:kms or // x-amz-server-side-encryption:aws:kms:dsse , but do not provide // x-amz-server-side-encryption-aws-kms-key-id , Amazon S3 uses the Amazon Web // Services managed key ( aws/s3 ) to protect the data. // // Directory buckets - To encrypt data using SSE-KMS, it's recommended to specify // the x-amz-server-side-encryption header to aws:kms . Then, the // x-amz-server-side-encryption-aws-kms-key-id header implicitly uses the bucket's // default KMS customer managed key ID. If you want to explicitly set the // x-amz-server-side-encryption-aws-kms-key-id header, it must match the bucket's // default customer managed key (using key ID or ARN, not alias). Your SSE-KMS // configuration can only support 1 [customer managed key]per directory bucket's lifetime. The [Amazon Web Services managed key] ( aws/s3 // ) isn't supported. // // Incorrect key specification results in an HTTP 400 Bad Request error. // // [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk // [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk SSEKMSKeyId *string // The server-side encryption algorithm used when you store this object in Amazon // S3 (for example, AES256 , aws:kms ). // // - Directory buckets - For directory buckets, there are only two supported // options for server-side encryption: server-side encryption with Amazon S3 // managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys // (SSE-KMS) ( aws:kms ). We recommend that the bucket's default encryption uses // the desired encryption configuration and you don't override the bucket default // encryption in your CreateSession requests or PUT object requests. Then, new // objects are automatically encrypted with the desired encryption settings. For // more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about // the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads]. // // In the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]) using the REST API, the // encryption request headers must match the encryption settings that are specified // in the CreateSession request. You can't override the values of the encryption // settings ( x-amz-server-side-encryption , // x-amz-server-side-encryption-aws-kms-key-id , // x-amz-server-side-encryption-context , and // x-amz-server-side-encryption-bucket-key-enabled ) that are specified in the // CreateSession request. You don't need to explicitly specify these encryption // settings values in Zonal endpoint API calls, and Amazon S3 will use the // encryption settings values from the CreateSession request to protect new // objects in the directory bucket. // // When you use the CLI or the Amazon Web Services SDKs, for CreateSession , the // session token refreshes automatically to avoid service interruptions when a // session expires. The CLI or the Amazon Web Services SDKs use the bucket's // default encryption configuration for the CreateSession request. It's not // supported to override the encryption settings values in the CreateSession // request. So in the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]), the encryption // request headers must match the default encryption configuration of the directory // bucket. // // [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html ServerSideEncryption types.ServerSideEncryption // By default, Amazon S3 uses the STANDARD Storage Class to store newly created // objects. The STANDARD storage class provides high durability and high // availability. Depending on performance needs, you can specify a different // Storage Class. For more information, see [Storage Classes]in the Amazon S3 User Guide. // // - Directory buckets only support EXPRESS_ONEZONE (the S3 Express One Zone // storage class) in Availability Zones and ONEZONE_IA (the S3 One // Zone-Infrequent Access storage class) in Dedicated Local Zones. // // - Amazon S3 on Outposts only uses the OUTPOSTS Storage Class. // // [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html StorageClass types.StorageClass // The tag-set for the object. The tag-set must be encoded as URL Query parameters. // // This functionality is not supported for directory buckets. Tagging *string // If the bucket is configured as a website, redirects requests for this object to // another object in the same bucket or to an external URL. Amazon S3 stores the // value of this header in the object metadata. // // This functionality is not supported for directory buckets. WebsiteRedirectLocation *string noSmithyDocumentSerde } func (in *CreateMultipartUploadInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type CreateMultipartUploadOutput struct { // If the bucket has a lifecycle rule configured with an action to abort // incomplete multipart uploads and the prefix in the lifecycle rule matches the // object name in the request, the response includes this header. The header // indicates when the initiated multipart upload becomes eligible for an abort // operation. For more information, see [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]in the Amazon S3 User Guide. // // The response also includes the x-amz-abort-rule-id header that provides the ID // of the lifecycle configuration rule that defines the abort action. // // This functionality is not supported for directory buckets. // // [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config AbortDate *time.Time // This header is returned along with the x-amz-abort-date header. It identifies // the applicable lifecycle configuration rule that defines the action to abort // incomplete multipart uploads. // // This functionality is not supported for directory buckets. AbortRuleId *string // The name of the bucket to which the multipart upload was initiated. Does not // return the access point ARN or access point alias if used. // // Access points are not supported by directory buckets. Bucket *string // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Key Management Service (KMS) keys (SSE-KMS). BucketKeyEnabled *bool // The algorithm that was used to create a checksum of the object. ChecksumAlgorithm types.ChecksumAlgorithm // Indicates the checksum type that you want Amazon S3 to use to calculate the // object’s checksum value. For more information, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumType types.ChecksumType // Object key for which the multipart upload was initiated. Key *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to confirm the encryption // algorithm that's used. // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to provide the round-trip // message integrity verification of the customer-provided encryption key. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // If present, indicates the Amazon Web Services KMS Encryption Context to use for // object encryption. The value of this header is a Base64 encoded string of a // UTF-8 encoded JSON, which contains the encryption context as key-value pairs. SSEKMSEncryptionContext *string // If present, indicates the ID of the KMS key that was used for object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when you store this object in Amazon // S3 (for example, AES256 , aws:kms ). ServerSideEncryption types.ServerSideEncryption // ID for the initiated multipart upload. UploadId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCreateMultipartUploadMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpCreateMultipartUpload{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpCreateMultipartUpload{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CreateMultipartUpload"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCreateMultipartUploadValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateMultipartUpload(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addCreateMultipartUploadUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSetCreateMPUChecksumAlgorithm(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *CreateMultipartUploadInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opCreateMultipartUpload(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CreateMultipartUpload", } } // getCreateMultipartUploadBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getCreateMultipartUploadBucketMember(input interface{}) (*string, bool) { in := input.(*CreateMultipartUploadInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addCreateMultipartUploadUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getCreateMultipartUploadBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_CreateSession.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates a session that establishes temporary security credentials to support // fast authentication and authorization for the Zonal endpoint API operations on // directory buckets. For more information about Zonal endpoint API operations that // include the Availability Zone in the request endpoint, see [S3 Express One Zone APIs]in the Amazon S3 // User Guide. // // To make Zonal endpoint API requests on a directory bucket, use the CreateSession // API operation. Specifically, you grant s3express:CreateSession permission to a // bucket in a bucket policy or an IAM identity-based policy. Then, you use IAM // credentials to make the CreateSession API request on the bucket, which returns // temporary security credentials that include the access key ID, secret access // key, session token, and expiration. These credentials have associated // permissions to access the Zonal endpoint API operations. After the session is // created, you don’t need to use other policies to grant permissions to each Zonal // endpoint API individually. Instead, in your Zonal endpoint API requests, you // sign your requests by applying the temporary security credentials of the session // to the request headers and following the SigV4 protocol for authentication. You // also apply the session token to the x-amz-s3session-token request header for // authorization. Temporary security credentials are scoped to the bucket and // expire after 5 minutes. After the expiration time, any calls that you make with // those credentials will fail. You must use IAM credentials again to make a // CreateSession API request that generates a new set of temporary credentials for // use. Temporary credentials cannot be extended or refreshed beyond the original // specified interval. // // If you use Amazon Web Services SDKs, SDKs handle the session token refreshes // automatically to avoid service interruptions when a session expires. We // recommend that you use the Amazon Web Services SDKs to initiate and manage // requests to the CreateSession API. For more information, see [Performance guidelines and design patterns]in the Amazon S3 // User Guide. // // - You must make requests for this API operation to the Zonal endpoint. These // endpoints support virtual-hosted-style requests in the format // https://bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style // requests are not supported. For more information about endpoints in Availability // Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information about endpoints // in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // - CopyObject API operation - Unlike other Zonal endpoint API operations, the // CopyObject API operation doesn't use the temporary security credentials // returned from the CreateSession API operation for authentication and // authorization. For information about authentication and authorization of the // CopyObject API operation on directory buckets, see [CopyObject]. // // - HeadBucket API operation - Unlike other Zonal endpoint API operations, the // HeadBucket API operation doesn't use the temporary security credentials // returned from the CreateSession API operation for authentication and // authorization. For information about authentication and authorization of the // HeadBucket API operation on directory buckets, see [HeadBucket]. // // Permissions To obtain temporary security credentials, you must create a bucket // policy or an IAM identity-based policy that grants s3express:CreateSession // permission to the bucket. In a policy, you can have the s3express:SessionMode // condition key to control who can create a ReadWrite or ReadOnly session. For // more information about ReadWrite or ReadOnly sessions, see [x-amz-create-session-mode] // x-amz-create-session-mode . For example policies, see [Example bucket policies for S3 Express One Zone] and [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone] in the Amazon S3 // User Guide. // // To grant cross-account access to Zonal endpoint API operations, the bucket // policy should also grant both accounts the s3express:CreateSession permission. // // If you want to encrypt objects with SSE-KMS, you must also have the // kms:GenerateDataKey and the kms:Decrypt permissions in IAM identity-based // policies and KMS key policies for the target KMS key. // // Encryption For directory buckets, there are only two supported options for // server-side encryption: server-side encryption with Amazon S3 managed keys // (SSE-S3) ( AES256 ) and server-side encryption with KMS keys (SSE-KMS) ( aws:kms // ). We recommend that the bucket's default encryption uses the desired encryption // configuration and you don't override the bucket default encryption in your // CreateSession requests or PUT object requests. Then, new objects are // automatically encrypted with the desired encryption settings. For more // information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about the // encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads]. // // For [Zonal endpoint (object-level) API operations] except [CopyObject] and [UploadPartCopy], you authenticate and authorize requests through [CreateSession] for low // latency. To encrypt new objects in a directory bucket with SSE-KMS, you must // specify SSE-KMS as the directory bucket's default encryption configuration with // a KMS key (specifically, a [customer managed key]). Then, when a session is created for Zonal // endpoint API operations, new objects are automatically encrypted and decrypted // with SSE-KMS and S3 Bucket Keys during the session. // // Only 1 [customer managed key] is supported per directory bucket for the lifetime of the bucket. The [Amazon Web Services managed key] ( // aws/s3 ) isn't supported. After you specify SSE-KMS as your bucket's default // encryption configuration with a customer managed key, you can't change the // customer managed key for the bucket's SSE-KMS configuration. // // In the Zonal endpoint API calls (except [CopyObject] and [UploadPartCopy]) using the REST API, you can't // override the values of the encryption settings ( x-amz-server-side-encryption , // x-amz-server-side-encryption-aws-kms-key-id , // x-amz-server-side-encryption-context , and // x-amz-server-side-encryption-bucket-key-enabled ) from the CreateSession // request. You don't need to explicitly specify these encryption settings values // in Zonal endpoint API calls, and Amazon S3 will use the encryption settings // values from the CreateSession request to protect new objects in the directory // bucket. // // When you use the CLI or the Amazon Web Services SDKs, for CreateSession , the // session token refreshes automatically to avoid service interruptions when a // session expires. The CLI or the Amazon Web Services SDKs use the bucket's // default encryption configuration for the CreateSession request. It's not // supported to override the encryption settings values in the CreateSession // request. Also, in the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]), it's not // supported to override the values of the encryption settings from the // CreateSession request. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Performance guidelines and design patterns]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-optimizing-performance-guidelines-design-patterns.html#s3-express-optimizing-performance-session-authentication // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [S3 Express One Zone APIs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-APIs.html // [HeadBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html // [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk // [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html // [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html // [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html // [x-amz-create-session-mode]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html#API_CreateSession_RequestParameters // [Zonal endpoint (object-level) API operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-differences.html#s3-express-differences-api-operations // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html func (c *Client) CreateSession(ctx context.Context, params *CreateSessionInput, optFns ...func(*Options)) (*CreateSessionOutput, error) { if params == nil { params = &CreateSessionInput{} } result, metadata, err := c.invokeOperation(ctx, "CreateSession", params, optFns, c.addOperationCreateSessionMiddlewares) if err != nil { return nil, err } out := result.(*CreateSessionOutput) out.ResultMetadata = metadata return out, nil } type CreateSessionInput struct { // The name of the bucket that you create a session for. // // This member is required. Bucket *string // Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption // with server-side encryption using KMS keys (SSE-KMS). // // S3 Bucket Keys are always enabled for GET and PUT operations in a directory // bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy // SSE-KMS encrypted objects from general purpose buckets to directory buckets, // from directory buckets to general purpose buckets, or between directory buckets, // through [CopyObject], [UploadPartCopy], [the Copy operation in Batch Operations], or [the import jobs]. In this case, Amazon S3 makes a call to KMS every time a // copy request is made for a KMS-encrypted object. // // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [the import jobs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html // [the Copy operation in Batch Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops BucketKeyEnabled *bool // Specifies the Amazon Web Services KMS Encryption Context as an additional // encryption context to use for object encryption. The value of this header is a // Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption // context as key-value pairs. This value is stored as object metadata and // automatically gets passed on to Amazon Web Services KMS for future GetObject // operations on this object. // // General purpose buckets - This value must be explicitly added during CopyObject // operations if you want an additional encryption context for your object. For // more information, see [Encryption context]in the Amazon S3 User Guide. // // Directory buckets - You can optionally provide an explicit encryption context // value. The value must match the default encryption context - the bucket Amazon // Resource Name (ARN). An additional encryption context value is not supported. // // [Encryption context]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context SSEKMSEncryptionContext *string // If you specify x-amz-server-side-encryption with aws:kms , you must specify the // x-amz-server-side-encryption-aws-kms-key-id header with the ID (Key ID or Key // ARN) of the KMS symmetric encryption customer managed key to use. Otherwise, you // get an HTTP 400 Bad Request error. Only use the key ID or key ARN. The key // alias format of the KMS key isn't supported. Also, if the KMS key doesn't exist // in the same account that't issuing the command, you must use the full Key ARN // not the Key ID. // // Your SSE-KMS configuration can only support 1 [customer managed key] per directory bucket's lifetime. // The [Amazon Web Services managed key]( aws/s3 ) isn't supported. // // [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk // [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk SSEKMSKeyId *string // The server-side encryption algorithm to use when you store objects in the // directory bucket. // // For directory buckets, there are only two supported options for server-side // encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) ( AES256 // ) and server-side encryption with KMS keys (SSE-KMS) ( aws:kms ). By default, // Amazon S3 encrypts data with SSE-S3. For more information, see [Protecting data with server-side encryption]in the Amazon S3 // User Guide. // // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html ServerSideEncryption types.ServerSideEncryption // Specifies the mode of the session that will be created, either ReadWrite or // ReadOnly . By default, a ReadWrite session is created. A ReadWrite session is // capable of executing all the Zonal endpoint API operations on a directory // bucket. A ReadOnly session is constrained to execute the following Zonal // endpoint API operations: GetObject , HeadObject , ListObjectsV2 , // GetObjectAttributes , ListParts , and ListMultipartUploads . SessionMode types.SessionMode noSmithyDocumentSerde } func (in *CreateSessionInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.DisableS3ExpressSessionAuth = ptr.Bool(true) } type CreateSessionOutput struct { // The established temporary security credentials for the created session. // // This member is required. Credentials *types.SessionCredentials // Indicates whether to use an S3 Bucket Key for server-side encryption with KMS // keys (SSE-KMS). BucketKeyEnabled *bool // If present, indicates the Amazon Web Services KMS Encryption Context to use for // object encryption. The value of this header is a Base64 encoded string of a // UTF-8 encoded JSON, which contains the encryption context as key-value pairs. // This value is stored as object metadata and automatically gets passed on to // Amazon Web Services KMS for future GetObject operations on this object. SSEKMSEncryptionContext *string // If you specify x-amz-server-side-encryption with aws:kms , this header indicates // the ID of the KMS symmetric encryption customer managed key that was used for // object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when you store objects in the // directory bucket. ServerSideEncryption types.ServerSideEncryption // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationCreateSessionMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpCreateSession{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpCreateSession{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "CreateSession"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpCreateSessionValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateSession(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addCreateSessionUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *CreateSessionInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opCreateSession(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "CreateSession", } } // getCreateSessionBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getCreateSessionBucketMember(input interface{}) (*string, bool) { in := input.(*CreateSessionInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addCreateSessionUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getCreateSessionBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucket.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes the S3 bucket. All objects (including all object versions and delete // markers) in the bucket must be deleted before the bucket itself can be deleted. // // - Directory buckets - If multipart uploads in a directory bucket are in // progress, you can't delete the bucket until all the in-progress multipart // uploads are aborted or completed. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Regional endpoint. These endpoints support path-style // requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // // - General purpose bucket permissions - You must have the s3:DeleteBucket // permission on the specified bucket in a policy. // // - Directory bucket permissions - You must have the s3express:DeleteBucket // permission in an IAM identity-based policy instead of a bucket policy. // Cross-account access to this API operation isn't supported. This operation can // only be performed by the Amazon Web Services account that owns the resource. For // more information about directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the // Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region-code.amazonaws.com . // // The following operations are related to DeleteBucket : // // [CreateBucket] // // [DeleteObject] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html func (c *Client) DeleteBucket(ctx context.Context, params *DeleteBucketInput, optFns ...func(*Options)) (*DeleteBucketOutput, error) { if params == nil { params = &DeleteBucketInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucket", params, optFns, c.addOperationDeleteBucketMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketInput struct { // Specifies the bucket being deleted. // // Directory buckets - When you use this operation with a directory bucket, you // must use path-style requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. Directory bucket names must be // unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must // also follow the format bucket-base-name--zone-id--x-s3 (for example, // DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // For directory buckets, this header is not supported in this API operation. If // you specify this header, the request fails with the HTTP status code 501 Not // Implemented . ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucket{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucket{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucket"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucket(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucket(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucket", } } // getDeleteBucketBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getDeleteBucketBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: false, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } // PresignDeleteBucket is used to generate a presigned HTTP Request which contains // presigned URL, signed headers and HTTP method used. func (c *PresignClient) PresignDeleteBucket(ctx context.Context, params *DeleteBucketInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) { if params == nil { params = &DeleteBucketInput{} } options := c.options.copy() for _, fn := range optFns { fn(&options) } clientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption) result, _, err := c.client.invokeOperation(ctx, "DeleteBucket", params, clientOptFns, c.client.addOperationDeleteBucketMiddlewares, presignConverter(options).convertToPresignMiddleware, addDeleteBucketPayloadAsUnsigned, ) if err != nil { return nil, err } out := result.(*v4.PresignedHTTPRequest) return out, nil } func addDeleteBucketPayloadAsUnsigned(stack *middleware.Stack, options Options) error { v4.RemoveContentSHA256HeaderMiddleware(stack) v4.RemoveComputePayloadSHA256Middleware(stack) return v4.AddUnsignedPayloadMiddleware(stack) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketAnalyticsConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Deletes an analytics configuration for the bucket (specified by the analytics // configuration ID). // // To use this operation, you must have permissions to perform the // s3:PutAnalyticsConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For information about the Amazon S3 analytics feature, see [Amazon S3 Analytics – Storage Class Analysis]. // // The following operations are related to DeleteBucketAnalyticsConfiguration : // // [GetBucketAnalyticsConfiguration] // // [ListBucketAnalyticsConfigurations] // // [PutBucketAnalyticsConfiguration] // // [Amazon S3 Analytics – Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [GetBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html // [ListBucketAnalyticsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html // [PutBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) DeleteBucketAnalyticsConfiguration(ctx context.Context, params *DeleteBucketAnalyticsConfigurationInput, optFns ...func(*Options)) (*DeleteBucketAnalyticsConfigurationOutput, error) { if params == nil { params = &DeleteBucketAnalyticsConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketAnalyticsConfiguration", params, optFns, c.addOperationDeleteBucketAnalyticsConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketAnalyticsConfigurationOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketAnalyticsConfigurationInput struct { // The name of the bucket from which an analytics configuration is deleted. // // This member is required. Bucket *string // The ID that identifies the analytics configuration. // // This member is required. Id *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketAnalyticsConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketAnalyticsConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketAnalyticsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketAnalyticsConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketAnalyticsConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketAnalyticsConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketAnalyticsConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketAnalyticsConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketAnalyticsConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketAnalyticsConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketAnalyticsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketAnalyticsConfiguration", } } // getDeleteBucketAnalyticsConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getDeleteBucketAnalyticsConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketAnalyticsConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketAnalyticsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketAnalyticsConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketCors.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Deletes the cors configuration information set for the bucket. // // To use this operation, you must have permission to perform the s3:PutBucketCORS // action. The bucket owner has this permission by default and can grant this // permission to others. // // For information about cors , see [Enabling Cross-Origin Resource Sharing] in the Amazon S3 User Guide. // // # Related Resources // // [PutBucketCors] // // [RESTOPTIONSobject] // // [PutBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketCors.html // [Enabling Cross-Origin Resource Sharing]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html // [RESTOPTIONSobject]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTOPTIONSobject.html func (c *Client) DeleteBucketCors(ctx context.Context, params *DeleteBucketCorsInput, optFns ...func(*Options)) (*DeleteBucketCorsOutput, error) { if params == nil { params = &DeleteBucketCorsInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketCors", params, optFns, c.addOperationDeleteBucketCorsMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketCorsOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketCorsInput struct { // Specifies the bucket whose cors configuration is being deleted. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketCorsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketCorsOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketCorsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketCors{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketCors{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketCors"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketCorsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketCors(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketCorsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketCorsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketCors(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketCors", } } // getDeleteBucketCorsBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getDeleteBucketCorsBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketCorsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketCorsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketCorsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketEncryption.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This implementation of the DELETE action resets the default encryption for the // bucket as server-side encryption with Amazon S3 managed keys (SSE-S3). // // - General purpose buckets - For information about the bucket default // encryption feature, see [Amazon S3 Bucket Default Encryption]in the Amazon S3 User Guide. // // - Directory buckets - For directory buckets, there are only two supported // options for server-side encryption: SSE-S3 and SSE-KMS. For information about // the default encryption configuration in directory buckets, see [Setting default server-side encryption behavior for directory buckets]. // // Permissions // // - General purpose bucket permissions - The s3:PutEncryptionConfiguration // permission is required in a policy. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // - Directory bucket permissions - To grant access to this API operation, you // must have the s3express:PutEncryptionConfiguration permission in an IAM // identity-based policy instead of a bucket policy. Cross-account access to this // API operation isn't supported. This operation can only be performed by the // Amazon Web Services account that owns the resource. For more information about // directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region-code.amazonaws.com . // // The following operations are related to DeleteBucketEncryption : // // [PutBucketEncryption] // // [GetBucketEncryption] // // [GetBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html // [PutBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html // [Setting default server-side encryption behavior for directory buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-bucket-encryption.html // [Amazon S3 Bucket Default Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [Permissions Related to Bucket Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html func (c *Client) DeleteBucketEncryption(ctx context.Context, params *DeleteBucketEncryptionInput, optFns ...func(*Options)) (*DeleteBucketEncryptionOutput, error) { if params == nil { params = &DeleteBucketEncryptionInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketEncryption", params, optFns, c.addOperationDeleteBucketEncryptionMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketEncryptionOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketEncryptionInput struct { // The name of the bucket containing the server-side encryption configuration to // delete. // // Directory buckets - When you use this operation with a directory bucket, you // must use path-style requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. Directory bucket names must be // unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must // also follow the format bucket-base-name--zone-id--x-s3 (for example, // DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // For directory buckets, this header is not supported in this API operation. If // you specify this header, the request fails with the HTTP status code 501 Not // Implemented . ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketEncryptionInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketEncryptionOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketEncryptionMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketEncryption{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketEncryption{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketEncryption"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketEncryptionValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketEncryption(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketEncryptionUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketEncryptionInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketEncryption(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketEncryption", } } // getDeleteBucketEncryptionBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getDeleteBucketEncryptionBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketEncryptionInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketEncryptionUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketEncryptionBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketIntelligentTieringConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Deletes the S3 Intelligent-Tiering configuration from the specified bucket. // // The S3 Intelligent-Tiering storage class is designed to optimize storage costs // by automatically moving data to the most cost-effective storage access tier, // without performance impact or operational overhead. S3 Intelligent-Tiering // delivers automatic cost savings in three low latency and high throughput access // tiers. To get the lowest storage cost on data that can be accessed in minutes to // hours, you can choose to activate additional archiving capabilities. // // The S3 Intelligent-Tiering storage class is the ideal storage class for data // with unknown, changing, or unpredictable access patterns, independent of object // size or retention period. If the size of an object is less than 128 KB, it is // not monitored and not eligible for auto-tiering. Smaller objects can be stored, // but they are always charged at the Frequent Access tier rates in the S3 // Intelligent-Tiering storage class. // // For more information, see [Storage class for automatically optimizing frequently and infrequently accessed objects]. // // Operations related to DeleteBucketIntelligentTieringConfiguration include: // // [GetBucketIntelligentTieringConfiguration] // // [PutBucketIntelligentTieringConfiguration] // // [ListBucketIntelligentTieringConfigurations] // // [ListBucketIntelligentTieringConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html // [GetBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html // [PutBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html // [Storage class for automatically optimizing frequently and infrequently accessed objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access func (c *Client) DeleteBucketIntelligentTieringConfiguration(ctx context.Context, params *DeleteBucketIntelligentTieringConfigurationInput, optFns ...func(*Options)) (*DeleteBucketIntelligentTieringConfigurationOutput, error) { if params == nil { params = &DeleteBucketIntelligentTieringConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketIntelligentTieringConfiguration", params, optFns, c.addOperationDeleteBucketIntelligentTieringConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketIntelligentTieringConfigurationOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketIntelligentTieringConfigurationInput struct { // The name of the Amazon S3 bucket whose configuration you want to modify or // retrieve. // // This member is required. Bucket *string // The ID used to identify the S3 Intelligent-Tiering configuration. // // This member is required. Id *string noSmithyDocumentSerde } func (in *DeleteBucketIntelligentTieringConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketIntelligentTieringConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketIntelligentTieringConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketIntelligentTieringConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketIntelligentTieringConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketIntelligentTieringConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketIntelligentTieringConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketIntelligentTieringConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketIntelligentTieringConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketIntelligentTieringConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketIntelligentTieringConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketIntelligentTieringConfiguration", } } // getDeleteBucketIntelligentTieringConfigurationBucketMember returns a pointer to // string denoting a provided bucket member valueand a boolean indicating if the // input has a modeled bucket name, func getDeleteBucketIntelligentTieringConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketIntelligentTieringConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketIntelligentTieringConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketIntelligentTieringConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketInventoryConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Deletes an inventory configuration (identified by the inventory ID) from the // bucket. // // To use this operation, you must have permissions to perform the // s3:PutInventoryConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For information about the Amazon S3 inventory feature, see [Amazon S3 Inventory]. // // Operations related to DeleteBucketInventoryConfiguration include: // // [GetBucketInventoryConfiguration] // // [PutBucketInventoryConfiguration] // // [ListBucketInventoryConfigurations] // // [Amazon S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html // [ListBucketInventoryConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [PutBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html // [GetBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html func (c *Client) DeleteBucketInventoryConfiguration(ctx context.Context, params *DeleteBucketInventoryConfigurationInput, optFns ...func(*Options)) (*DeleteBucketInventoryConfigurationOutput, error) { if params == nil { params = &DeleteBucketInventoryConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketInventoryConfiguration", params, optFns, c.addOperationDeleteBucketInventoryConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketInventoryConfigurationOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketInventoryConfigurationInput struct { // The name of the bucket containing the inventory configuration to delete. // // This member is required. Bucket *string // The ID used to identify the inventory configuration. // // This member is required. Id *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketInventoryConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketInventoryConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketInventoryConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketInventoryConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketInventoryConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketInventoryConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketInventoryConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketInventoryConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketInventoryConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketInventoryConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketInventoryConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketInventoryConfiguration", } } // getDeleteBucketInventoryConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getDeleteBucketInventoryConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketInventoryConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketInventoryConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketInventoryConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketLifecycle.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes the lifecycle configuration from the specified bucket. Amazon S3 // removes all the lifecycle configuration rules in the lifecycle subresource // associated with the bucket. Your objects never expire, and Amazon S3 no longer // automatically deletes any objects on the basis of rules contained in the deleted // lifecycle configuration. // // Permissions // - General purpose bucket permissions - By default, all Amazon S3 resources // are private, including buckets, objects, and related subresources (for example, // lifecycle configuration and website configuration). Only the resource owner // (that is, the Amazon Web Services account that created it) can access the // resource. The resource owner can optionally grant access permissions to others // by writing an access policy. For this operation, a user must have the // s3:PutLifecycleConfiguration permission. // // For more information about permissions, see [Managing Access Permissions to Your Amazon S3 Resources]. // // - Directory bucket permissions - You must have the // s3express:PutLifecycleConfiguration permission in an IAM identity-based policy // to use this operation. Cross-account access to this API operation isn't // supported. The resource owner can optionally grant access permissions to others // by creating a role or user for them as long as they are within the same account // as the owner and resource. // // For more information about directory bucket policies and permissions, see [Authorizing Regional endpoint APIs with IAM]in // // the Amazon S3 User Guide. // // Directory buckets - For directory buckets, you must make requests for this API // // operation to the Regional endpoint. These endpoints support path-style requests // in the format https://s3express-control.region-code.amazonaws.com/bucket-name // . Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region.amazonaws.com . // // For more information about the object expiration, see [Elements to Describe Lifecycle Actions]. // // Related actions include: // // [PutBucketLifecycleConfiguration] // // [GetBucketLifecycleConfiguration] // // [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html // [Elements to Describe Lifecycle Actions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#intro-lifecycle-rules-actions // [GetBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html // [Authorizing Regional endpoint APIs with IAM]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html func (c *Client) DeleteBucketLifecycle(ctx context.Context, params *DeleteBucketLifecycleInput, optFns ...func(*Options)) (*DeleteBucketLifecycleOutput, error) { if params == nil { params = &DeleteBucketLifecycleInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketLifecycle", params, optFns, c.addOperationDeleteBucketLifecycleMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketLifecycleOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketLifecycleInput struct { // The bucket name of the lifecycle to delete. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // This parameter applies to general purpose buckets only. It is not supported for // directory bucket lifecycle configurations. ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketLifecycleInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketLifecycleOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketLifecycleMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketLifecycle{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketLifecycle{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketLifecycle"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketLifecycleValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketLifecycle(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketLifecycleUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketLifecycleInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketLifecycle(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketLifecycle", } } // getDeleteBucketLifecycleBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getDeleteBucketLifecycleBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketLifecycleInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketLifecycleUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketLifecycleBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketMetadataTableConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes a metadata table configuration from a general purpose bucket. For more // // information, see [Accelerating data discovery with S3 Metadata]in the Amazon S3 User Guide. // // Permissions To use this operation, you must have the // s3:DeleteBucketMetadataTableConfiguration permission. For more information, see [Setting up permissions for configuring metadata tables] // in the Amazon S3 User Guide. // // The following operations are related to DeleteBucketMetadataTableConfiguration : // // [CreateBucketMetadataTableConfiguration] // // [GetBucketMetadataTableConfiguration] // // [Setting up permissions for configuring metadata tables]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html // [GetBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html // [CreateBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataTableConfiguration.html // [Accelerating data discovery with S3 Metadata]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html func (c *Client) DeleteBucketMetadataTableConfiguration(ctx context.Context, params *DeleteBucketMetadataTableConfigurationInput, optFns ...func(*Options)) (*DeleteBucketMetadataTableConfigurationOutput, error) { if params == nil { params = &DeleteBucketMetadataTableConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketMetadataTableConfiguration", params, optFns, c.addOperationDeleteBucketMetadataTableConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketMetadataTableConfigurationOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketMetadataTableConfigurationInput struct { // The general purpose bucket that you want to remove the metadata table // configuration from. // // This member is required. Bucket *string // The expected bucket owner of the general purpose bucket that you want to // remove the metadata table configuration from. ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketMetadataTableConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketMetadataTableConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketMetadataTableConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketMetadataTableConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketMetadataTableConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketMetadataTableConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketMetadataTableConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketMetadataTableConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketMetadataTableConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketMetadataTableConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketMetadataTableConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketMetadataTableConfiguration", } } // getDeleteBucketMetadataTableConfigurationBucketMember returns a pointer to // string denoting a provided bucket member valueand a boolean indicating if the // input has a modeled bucket name, func getDeleteBucketMetadataTableConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketMetadataTableConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketMetadataTableConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketMetadataTableConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketMetricsConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Deletes a metrics configuration for the Amazon CloudWatch request metrics // (specified by the metrics configuration ID) from the bucket. Note that this // doesn't include the daily storage metrics. // // To use this operation, you must have permissions to perform the // s3:PutMetricsConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For information about CloudWatch request metrics for Amazon S3, see [Monitoring Metrics with Amazon CloudWatch]. // // The following operations are related to DeleteBucketMetricsConfiguration : // // [GetBucketMetricsConfiguration] // // [PutBucketMetricsConfiguration] // // [ListBucketMetricsConfigurations] // // [Monitoring Metrics with Amazon CloudWatch] // // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Monitoring Metrics with Amazon CloudWatch]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html // [GetBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html // [ListBucketMetricsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html // [PutBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) DeleteBucketMetricsConfiguration(ctx context.Context, params *DeleteBucketMetricsConfigurationInput, optFns ...func(*Options)) (*DeleteBucketMetricsConfigurationOutput, error) { if params == nil { params = &DeleteBucketMetricsConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketMetricsConfiguration", params, optFns, c.addOperationDeleteBucketMetricsConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketMetricsConfigurationOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketMetricsConfigurationInput struct { // The name of the bucket containing the metrics configuration to delete. // // This member is required. Bucket *string // The ID used to identify the metrics configuration. The ID has a 64 character // limit and can only contain letters, numbers, periods, dashes, and underscores. // // This member is required. Id *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketMetricsConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketMetricsConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketMetricsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketMetricsConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketMetricsConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketMetricsConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketMetricsConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketMetricsConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketMetricsConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketMetricsConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketMetricsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketMetricsConfiguration", } } // getDeleteBucketMetricsConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getDeleteBucketMetricsConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketMetricsConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketMetricsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketMetricsConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketOwnershipControls.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Removes OwnershipControls for an Amazon S3 bucket. To use this operation, you // must have the s3:PutBucketOwnershipControls permission. For more information // about Amazon S3 permissions, see [Specifying Permissions in a Policy]. // // For information about Amazon S3 Object Ownership, see [Using Object Ownership]. // // The following operations are related to DeleteBucketOwnershipControls : // // # GetBucketOwnershipControls // // # PutBucketOwnershipControls // // [Using Object Ownership]: https://docs.aws.amazon.com/AmazonS3/latest/dev/about-object-ownership.html // [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html func (c *Client) DeleteBucketOwnershipControls(ctx context.Context, params *DeleteBucketOwnershipControlsInput, optFns ...func(*Options)) (*DeleteBucketOwnershipControlsOutput, error) { if params == nil { params = &DeleteBucketOwnershipControlsInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketOwnershipControls", params, optFns, c.addOperationDeleteBucketOwnershipControlsMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketOwnershipControlsOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketOwnershipControlsInput struct { // The Amazon S3 bucket whose OwnershipControls you want to delete. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketOwnershipControlsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketOwnershipControlsOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketOwnershipControlsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketOwnershipControls{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketOwnershipControls{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketOwnershipControls"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketOwnershipControlsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketOwnershipControls(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketOwnershipControlsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketOwnershipControlsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketOwnershipControls(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketOwnershipControls", } } // getDeleteBucketOwnershipControlsBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getDeleteBucketOwnershipControlsBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketOwnershipControlsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketOwnershipControlsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketOwnershipControlsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Deletes the policy of a specified bucket. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Regional endpoint. These endpoints support path-style requests // in the format https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions If you are using an identity other than the root user of the Amazon // Web Services account that owns the bucket, the calling identity must both have // the DeleteBucketPolicy permissions on the specified bucket and belong to the // bucket owner's account in order to use this operation. // // If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403 // Access Denied error. If you have the correct permissions, but you're not using // an identity that belongs to the bucket owner's account, Amazon S3 returns a 405 // Method Not Allowed error. // // To ensure that bucket owners don't inadvertently lock themselves out of their // own buckets, the root principal in a bucket owner's Amazon Web Services account // can perform the GetBucketPolicy , PutBucketPolicy , and DeleteBucketPolicy API // actions, even if their bucket policy explicitly denies the root principal's // access. Bucket owner root principals can only be blocked from performing these // API actions by VPC endpoint policies and Amazon Web Services Organizations // policies. // // - General purpose bucket permissions - The s3:DeleteBucketPolicy permission is // required in a policy. For more information about general purpose buckets bucket // policies, see [Using Bucket Policies and User Policies]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation, you // must have the s3express:DeleteBucketPolicy permission in an IAM identity-based // policy instead of a bucket policy. Cross-account access to this API operation // isn't supported. This operation can only be performed by the Amazon Web Services // account that owns the resource. For more information about directory bucket // policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region-code.amazonaws.com . // // # The following operations are related to DeleteBucketPolicy // // [CreateBucket] // // [DeleteObject] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html // [Using Bucket Policies and User Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html func (c *Client) DeleteBucketPolicy(ctx context.Context, params *DeleteBucketPolicyInput, optFns ...func(*Options)) (*DeleteBucketPolicyOutput, error) { if params == nil { params = &DeleteBucketPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketPolicy", params, optFns, c.addOperationDeleteBucketPolicyMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketPolicyOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketPolicyInput struct { // The bucket name. // // Directory buckets - When you use this operation with a directory bucket, you // must use path-style requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. Directory bucket names must be // unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must // also follow the format bucket-base-name--zone-id--x-s3 (for example, // DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // For directory buckets, this header is not supported in this API operation. If // you specify this header, the request fails with the HTTP status code 501 Not // Implemented . ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketPolicyInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketPolicyOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketPolicy(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketPolicyUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketPolicyInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketPolicy", } } // getDeleteBucketPolicyBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getDeleteBucketPolicyBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketPolicyInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketPolicyUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketPolicyBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketReplication.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Deletes the replication configuration from the bucket. // // To use this operation, you must have permissions to perform the // s3:PutReplicationConfiguration action. The bucket owner has these permissions by // default and can grant it to others. For more information about permissions, see [Permissions Related to Bucket Subresource Operations] // and [Managing Access Permissions to Your Amazon S3 Resources]. // // It can take a while for the deletion of a replication configuration to fully // propagate. // // For information about replication configuration, see [Replication] in the Amazon S3 User // Guide. // // The following operations are related to DeleteBucketReplication : // // [PutBucketReplication] // // [GetBucketReplication] // // [GetBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [PutBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html // [Replication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) DeleteBucketReplication(ctx context.Context, params *DeleteBucketReplicationInput, optFns ...func(*Options)) (*DeleteBucketReplicationOutput, error) { if params == nil { params = &DeleteBucketReplicationInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketReplication", params, optFns, c.addOperationDeleteBucketReplicationMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketReplicationOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketReplicationInput struct { // The bucket name. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketReplicationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketReplicationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketReplicationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketReplication{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketReplication{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketReplication"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketReplicationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketReplication(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketReplicationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketReplicationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketReplication(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketReplication", } } // getDeleteBucketReplicationBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getDeleteBucketReplicationBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketReplicationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketReplicationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketReplicationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketTagging.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Deletes the tags from the bucket. // // To use this operation, you must have permission to perform the // s3:PutBucketTagging action. By default, the bucket owner has this permission and // can grant this permission to others. // // The following operations are related to DeleteBucketTagging : // // [GetBucketTagging] // // [PutBucketTagging] // // [GetBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html // [PutBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html func (c *Client) DeleteBucketTagging(ctx context.Context, params *DeleteBucketTaggingInput, optFns ...func(*Options)) (*DeleteBucketTaggingOutput, error) { if params == nil { params = &DeleteBucketTaggingInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketTagging", params, optFns, c.addOperationDeleteBucketTaggingMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketTaggingOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketTaggingInput struct { // The bucket that has the tag set to be removed. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketTaggingInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketTaggingOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketTagging{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketTagging{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketTagging"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketTaggingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketTagging(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketTaggingUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketTaggingInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketTagging(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketTagging", } } // getDeleteBucketTaggingBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getDeleteBucketTaggingBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketTaggingInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketTaggingBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteBucketWebsite.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // This action removes the website configuration for a bucket. Amazon S3 returns a // 200 OK response upon successfully deleting a website configuration on the // specified bucket. You will get a 200 OK response if the website configuration // you are trying to delete does not exist on the bucket. Amazon S3 returns a 404 // response if the bucket specified in the request does not exist. // // This DELETE action requires the S3:DeleteBucketWebsite permission. By default, // only the bucket owner can delete the website configuration attached to a bucket. // However, bucket owners can grant other users permission to delete the website // configuration by writing a bucket policy granting them the // S3:DeleteBucketWebsite permission. // // For more information about hosting websites, see [Hosting Websites on Amazon S3]. // // The following operations are related to DeleteBucketWebsite : // // [GetBucketWebsite] // // [PutBucketWebsite] // // [GetBucketWebsite]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketWebsite.html // [PutBucketWebsite]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketWebsite.html // [Hosting Websites on Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html func (c *Client) DeleteBucketWebsite(ctx context.Context, params *DeleteBucketWebsiteInput, optFns ...func(*Options)) (*DeleteBucketWebsiteOutput, error) { if params == nil { params = &DeleteBucketWebsiteInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteBucketWebsite", params, optFns, c.addOperationDeleteBucketWebsiteMiddlewares) if err != nil { return nil, err } out := result.(*DeleteBucketWebsiteOutput) out.ResultMetadata = metadata return out, nil } type DeleteBucketWebsiteInput struct { // The bucket name for which you want to remove the website configuration. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeleteBucketWebsiteInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeleteBucketWebsiteOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteBucketWebsiteMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteBucketWebsite{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteBucketWebsite{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteBucketWebsite"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteBucketWebsiteValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteBucketWebsite(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteBucketWebsiteUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteBucketWebsiteInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteBucketWebsite(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteBucketWebsite", } } // getDeleteBucketWebsiteBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getDeleteBucketWebsiteBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteBucketWebsiteInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteBucketWebsiteUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteBucketWebsiteBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteObject.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Removes an object from a bucket. The behavior depends on the bucket's // versioning state: // // - If bucket versioning is not enabled, the operation permanently deletes the // object. // // - If bucket versioning is enabled, the operation inserts a delete marker, // which becomes the current version of the object. To permanently delete an object // in a versioned bucket, you must include the object’s versionId in the request. // For more information about versioning-enabled buckets, see [Deleting object versions from a versioning-enabled bucket]. // // - If bucket versioning is suspended, the operation removes the object that // has a null versionId , if there is one, and inserts a delete marker that // becomes the current version of the object. If there isn't an object with a null // versionId , and all versions of the object have a versionId , Amazon S3 does // not remove the object and only inserts a delete marker. To permanently delete an // object that has a versionId , you must include the object’s versionId in the // request. For more information about versioning-suspended buckets, see [Deleting objects from versioning-suspended buckets]. // // - Directory buckets - S3 Versioning isn't enabled and supported for directory // buckets. For this API operation, only the null value of the version ID is // supported by directory buckets. You can only specify null to the versionId // query parameter in the request. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Zonal endpoint. These endpoints support // virtual-hosted-style requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // To remove a specific version, you must use the versionId query parameter. Using // this query parameter permanently deletes the version. If the object deleted is a // delete marker, Amazon S3 sets the response header x-amz-delete-marker to true. // // If the object you want to delete is in a bucket where the bucket versioning // configuration is MFA Delete enabled, you must include the x-amz-mfa request // header in the DELETE versionId request. Requests that include x-amz-mfa must // use HTTPS. For more information about MFA Delete, see [Using MFA Delete]in the Amazon S3 User // Guide. To see sample requests that use versioning, see [Sample Request]. // // Directory buckets - MFA delete is not supported by directory buckets. // // You can delete objects by explicitly calling DELETE Object or calling ([PutBucketLifecycle] ) to // enable Amazon S3 to remove them for you. If you want to block users or accounts // from removing or deleting objects from your bucket, you must deny them the // s3:DeleteObject , s3:DeleteObjectVersion , and s3:PutLifeCycleConfiguration // actions. // // Directory buckets - S3 Lifecycle is not supported by directory buckets. // // Permissions // // - General purpose bucket permissions - The following permissions are required // in your policies when your DeleteObjects request includes specific headers. // // - s3:DeleteObject - To delete an object from a bucket, you must always have // the s3:DeleteObject permission. // // - s3:DeleteObjectVersion - To delete a specific version of an object from a // versioning-enabled bucket, you must have the s3:DeleteObjectVersion permission. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following action is related to DeleteObject : // // [PutObject] // // [Sample Request]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html#ExampleVersionObjectDelete // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Deleting objects from versioning-suspended buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjectsfromVersioningSuspendedBuckets.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [PutBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [Deleting object versions from a versioning-enabled bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjectVersions.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [Using MFA Delete]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMFADelete.html func (c *Client) DeleteObject(ctx context.Context, params *DeleteObjectInput, optFns ...func(*Options)) (*DeleteObjectOutput, error) { if params == nil { params = &DeleteObjectInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteObject", params, optFns, c.addOperationDeleteObjectMiddlewares) if err != nil { return nil, err } out := result.(*DeleteObjectOutput) out.ResultMetadata = metadata return out, nil } type DeleteObjectInput struct { // The bucket name of the bucket containing the object. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Key name of the object to delete. // // This member is required. Key *string // Indicates whether S3 Object Lock should bypass Governance-mode restrictions to // process this operation. To use this header, you must have the // s3:BypassGovernanceRetention permission. // // This functionality is not supported for directory buckets. BypassGovernanceRetention *bool // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The If-Match header field makes the request method conditional on ETags. If the // ETag value does not match, the operation returns a 412 Precondition Failed // error. If the ETag matches or if the object doesn't exist, the operation will // return a 204 Success (No Content) response . // // For more information about conditional requests, see [RFC 7232]. // // This functionality is only supported for directory buckets. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfMatch *string // If present, the object is deleted only if its modification times matches the // provided Timestamp . If the Timestamp values do not match, the operation // returns a 412 Precondition Failed error. If the Timestamp matches or if the // object doesn’t exist, the operation returns a 204 Success (No Content) response. // // This functionality is only supported for directory buckets. IfMatchLastModifiedTime *time.Time // If present, the object is deleted only if its size matches the provided size in // bytes. If the Size value does not match, the operation returns a 412 // Precondition Failed error. If the Size matches or if the object doesn’t exist, // the operation returns a 204 Success (No Content) response. // // This functionality is only supported for directory buckets. // // You can use the If-Match , x-amz-if-match-last-modified-time and // x-amz-if-match-size conditional headers in conjunction with each-other or // individually. IfMatchSize *int64 // The concatenation of the authentication device's serial number, a space, and // the value that is displayed on your authentication device. Required to // permanently delete a versioned object if versioning is configured with MFA // delete enabled. // // This functionality is not supported for directory buckets. MFA *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Version ID used to reference a specific version of the object. // // For directory buckets in this API operation, only the null value of the version // ID is supported. VersionId *string noSmithyDocumentSerde } func (in *DeleteObjectInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type DeleteObjectOutput struct { // Indicates whether the specified object version that was permanently deleted was // (true) or was not (false) a delete marker before deletion. In a simple DELETE, // this header indicates whether (true) or not (false) the current version of the // object is a delete marker. To learn more about delete markers, see [Working with delete markers]. // // This functionality is not supported for directory buckets. // // [Working with delete markers]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html DeleteMarker *bool // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Returns the version ID of the delete marker created as a result of the DELETE // operation. // // This functionality is not supported for directory buckets. VersionId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteObjectMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteObject{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteObject{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteObject"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteObjectValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteObject(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteObjectUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteObjectInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteObject(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteObject", } } // getDeleteObjectBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getDeleteObjectBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteObjectInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteObjectUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteObjectBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } // PresignDeleteObject is used to generate a presigned HTTP Request which contains // presigned URL, signed headers and HTTP method used. func (c *PresignClient) PresignDeleteObject(ctx context.Context, params *DeleteObjectInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) { if params == nil { params = &DeleteObjectInput{} } options := c.options.copy() for _, fn := range optFns { fn(&options) } clientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption) result, _, err := c.client.invokeOperation(ctx, "DeleteObject", params, clientOptFns, c.client.addOperationDeleteObjectMiddlewares, presignConverter(options).convertToPresignMiddleware, addDeleteObjectPayloadAsUnsigned, ) if err != nil { return nil, err } out := result.(*v4.PresignedHTTPRequest) return out, nil } func addDeleteObjectPayloadAsUnsigned(stack *middleware.Stack, options Options) error { v4.RemoveContentSHA256HeaderMiddleware(stack) v4.RemoveComputePayloadSHA256Middleware(stack) return v4.AddUnsignedPayloadMiddleware(stack) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteObjectTagging.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Removes the entire tag set from the specified object. For more information // about managing object tags, see [Object Tagging]. // // To use this operation, you must have permission to perform the // s3:DeleteObjectTagging action. // // To delete tags of a specific object version, add the versionId query parameter // in the request. You will need permission for the s3:DeleteObjectVersionTagging // action. // // The following operations are related to DeleteObjectTagging : // // [PutObjectTagging] // // [GetObjectTagging] // // [PutObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html // [Object Tagging]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html // [GetObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html func (c *Client) DeleteObjectTagging(ctx context.Context, params *DeleteObjectTaggingInput, optFns ...func(*Options)) (*DeleteObjectTaggingOutput, error) { if params == nil { params = &DeleteObjectTaggingInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteObjectTagging", params, optFns, c.addOperationDeleteObjectTaggingMiddlewares) if err != nil { return nil, err } out := result.(*DeleteObjectTaggingOutput) out.ResultMetadata = metadata return out, nil } type DeleteObjectTaggingInput struct { // The bucket name containing the objects from which to remove the tags. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The key that identifies the object in the bucket from which to remove all tags. // // This member is required. Key *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The versionId of the object that the tag-set will be removed from. VersionId *string noSmithyDocumentSerde } func (in *DeleteObjectTaggingInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type DeleteObjectTaggingOutput struct { // The versionId of the object the tag-set was removed from. VersionId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteObjectTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteObjectTagging{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteObjectTagging{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteObjectTagging"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteObjectTaggingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteObjectTagging(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteObjectTaggingUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteObjectTaggingInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteObjectTagging(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteObjectTagging", } } // getDeleteObjectTaggingBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getDeleteObjectTaggingBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteObjectTaggingInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteObjectTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteObjectTaggingBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeleteObjects.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation enables you to delete multiple objects from a bucket using a // single HTTP request. If you know the object keys that you want to delete, then // this operation provides a suitable alternative to sending individual delete // requests, reducing per-request overhead. // // The request can contain a list of up to 1,000 keys that you want to delete. In // the XML, you provide the object key names, and optionally, version IDs if you // want to delete a specific version of the object from a versioning-enabled // bucket. For each key, Amazon S3 performs a delete operation and returns the // result of that delete, success or failure, in the response. If the object // specified in the request isn't found, Amazon S3 confirms the deletion by // returning the result as deleted. // // - Directory buckets - S3 Versioning isn't enabled and supported for directory // buckets. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Zonal endpoint. These endpoints support // virtual-hosted-style requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // The operation supports two modes for the response: verbose and quiet. By // default, the operation uses verbose mode in which the response includes the // result of deletion of each key in your request. In quiet mode the response // includes only keys where the delete operation encountered an error. For a // successful deletion in a quiet mode, the operation does not return any // information about the delete in the response body. // // When performing this action on an MFA Delete enabled bucket, that attempts to // delete any versioned objects, you must include an MFA token. If you do not // provide one, the entire request will fail, even if there are non-versioned // objects you are trying to delete. If you provide an invalid token, whether there // are versioned keys in the request or not, the entire Multi-Object Delete request // will fail. For information about MFA Delete, see [MFA Delete]in the Amazon S3 User Guide. // // Directory buckets - MFA delete is not supported by directory buckets. // // Permissions // // - General purpose bucket permissions - The following permissions are required // in your policies when your DeleteObjects request includes specific headers. // // - s3:DeleteObject - To delete an object from a bucket, you must always specify // the s3:DeleteObject permission. // // - s3:DeleteObjectVersion - To delete a specific version of an object from a // versioning-enabled bucket, you must specify the s3:DeleteObjectVersion // permission. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // Content-MD5 request header // // - General purpose bucket - The Content-MD5 request header is required for all // Multi-Object Delete requests. Amazon S3 uses the header value to ensure that // your request body has not been altered in transit. // // - Directory bucket - The Content-MD5 request header or a additional checksum // request header (including x-amz-checksum-crc32 , x-amz-checksum-crc32c , // x-amz-checksum-sha1 , or x-amz-checksum-sha256 ) is required for all // Multi-Object Delete requests. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to DeleteObjects : // // [CreateMultipartUpload] // // [UploadPart] // // [CompleteMultipartUpload] // // [ListParts] // // [AbortMultipartUpload] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html // [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html // [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [MFA Delete]: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html#MultiFactorAuthenticationDelete // [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html func (c *Client) DeleteObjects(ctx context.Context, params *DeleteObjectsInput, optFns ...func(*Options)) (*DeleteObjectsOutput, error) { if params == nil { params = &DeleteObjectsInput{} } result, metadata, err := c.invokeOperation(ctx, "DeleteObjects", params, optFns, c.addOperationDeleteObjectsMiddlewares) if err != nil { return nil, err } out := result.(*DeleteObjectsOutput) out.ResultMetadata = metadata return out, nil } type DeleteObjectsInput struct { // The bucket name containing the objects to delete. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Container for the request. // // This member is required. Delete *types.Delete // Specifies whether you want to delete this object even if it has a // Governance-type Object Lock in place. To use this header, you must have the // s3:BypassGovernanceRetention permission. // // This functionality is not supported for directory buckets. BypassGovernanceRetention *bool // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum-algorithm or x-amz-trailer header sent. Otherwise, Amazon S3 // fails the request with the HTTP status code 400 Bad Request . // // For the x-amz-checksum-algorithm header, replace algorithm with the // supported algorithm from the following list: // // - CRC32 // // - CRC32C // // - CRC64NVME // // - SHA1 // // - SHA256 // // For more information, see [Checking object integrity] in the Amazon S3 User Guide. // // If the individual checksum value you provide through x-amz-checksum-algorithm // doesn't match the checksum algorithm you set through // x-amz-sdk-checksum-algorithm , Amazon S3 fails the request with a BadDigest // error. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The concatenation of the authentication device's serial number, a space, and // the value that is displayed on your authentication device. Required to // permanently delete a versioned object if versioning is configured with MFA // delete enabled. // // When performing the DeleteObjects operation on an MFA delete enabled bucket, // which attempts to delete the specified versioned objects, you must include an // MFA token. If you don't provide an MFA token, the entire request will fail, even // if there are non-versioned objects that you are trying to delete. If you provide // an invalid token, whether there are versioned object keys in the request or not, // the entire Multi-Object Delete request will fail. For information about MFA // Delete, see [MFA Delete]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [MFA Delete]: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html#MultiFactorAuthenticationDelete MFA *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer noSmithyDocumentSerde } func (in *DeleteObjectsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type DeleteObjectsOutput struct { // Container element for a successful delete. It identifies the object that was // successfully deleted. Deleted []types.DeletedObject // Container for a failed delete action that describes the object that Amazon S3 // attempted to delete and the error it encountered. Errors []types.Error // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeleteObjectsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeleteObjects{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeleteObjects{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeleteObjects"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeleteObjectsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeleteObjects(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeleteObjectsInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addDeleteObjectsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeleteObjectsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeleteObjects(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeleteObjects", } } // getDeleteObjectsRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getDeleteObjectsRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*DeleteObjectsInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addDeleteObjectsInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getDeleteObjectsRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getDeleteObjectsBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getDeleteObjectsBucketMember(input interface{}) (*string, bool) { in := input.(*DeleteObjectsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeleteObjectsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeleteObjectsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_DeletePublicAccessBlock.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Removes the PublicAccessBlock configuration for an Amazon S3 bucket. To use // this operation, you must have the s3:PutBucketPublicAccessBlock permission. For // more information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // The following operations are related to DeletePublicAccessBlock : // // [Using Amazon S3 Block Public Access] // // [GetPublicAccessBlock] // // [PutPublicAccessBlock] // // [GetBucketPolicyStatus] // // [GetPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html // [PutPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Using Amazon S3 Block Public Access]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [GetBucketPolicyStatus]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicyStatus.html func (c *Client) DeletePublicAccessBlock(ctx context.Context, params *DeletePublicAccessBlockInput, optFns ...func(*Options)) (*DeletePublicAccessBlockOutput, error) { if params == nil { params = &DeletePublicAccessBlockInput{} } result, metadata, err := c.invokeOperation(ctx, "DeletePublicAccessBlock", params, optFns, c.addOperationDeletePublicAccessBlockMiddlewares) if err != nil { return nil, err } out := result.(*DeletePublicAccessBlockOutput) out.ResultMetadata = metadata return out, nil } type DeletePublicAccessBlockInput struct { // The Amazon S3 bucket whose PublicAccessBlock configuration you want to delete. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *DeletePublicAccessBlockInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type DeletePublicAccessBlockOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationDeletePublicAccessBlockMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpDeletePublicAccessBlock{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpDeletePublicAccessBlock{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "DeletePublicAccessBlock"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpDeletePublicAccessBlockValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDeletePublicAccessBlock(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addDeletePublicAccessBlockUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *DeletePublicAccessBlockInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opDeletePublicAccessBlock(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "DeletePublicAccessBlock", } } // getDeletePublicAccessBlockBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getDeletePublicAccessBlockBucketMember(input interface{}) (*string, bool) { in := input.(*DeletePublicAccessBlockInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addDeletePublicAccessBlockUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getDeletePublicAccessBlockBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketAccelerateConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // This implementation of the GET action uses the accelerate subresource to return // the Transfer Acceleration state of a bucket, which is either Enabled or // Suspended . Amazon S3 Transfer Acceleration is a bucket-level feature that // enables you to perform faster data transfers to and from Amazon S3. // // To use this operation, you must have permission to perform the // s3:GetAccelerateConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to your Amazon S3 Resources] in the Amazon S3 User Guide. // // You set the Transfer Acceleration state of an existing bucket to Enabled or // Suspended by using the [PutBucketAccelerateConfiguration] operation. // // A GET accelerate request does not return a state value for a bucket that has no // transfer acceleration state. A bucket has no Transfer Acceleration state if a // state has never been set on the bucket. // // For more information about transfer acceleration, see [Transfer Acceleration] in the Amazon S3 User // Guide. // // The following operations are related to GetBucketAccelerateConfiguration : // // [PutBucketAccelerateConfiguration] // // [PutBucketAccelerateConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAccelerateConfiguration.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Managing Access Permissions to your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [Transfer Acceleration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html func (c *Client) GetBucketAccelerateConfiguration(ctx context.Context, params *GetBucketAccelerateConfigurationInput, optFns ...func(*Options)) (*GetBucketAccelerateConfigurationOutput, error) { if params == nil { params = &GetBucketAccelerateConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketAccelerateConfiguration", params, optFns, c.addOperationGetBucketAccelerateConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketAccelerateConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketAccelerateConfigurationInput struct { // The name of the bucket for which the accelerate configuration is retrieved. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer noSmithyDocumentSerde } func (in *GetBucketAccelerateConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketAccelerateConfigurationOutput struct { // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // The accelerate configuration of the bucket. Status types.BucketAccelerateStatus // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketAccelerateConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketAccelerateConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketAccelerateConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketAccelerateConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketAccelerateConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketAccelerateConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketAccelerateConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketAccelerateConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketAccelerateConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketAccelerateConfiguration", } } // getGetBucketAccelerateConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getGetBucketAccelerateConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketAccelerateConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketAccelerateConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketAccelerateConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketAcl.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // This implementation of the GET action uses the acl subresource to return the // access control list (ACL) of a bucket. To use GET to return the ACL of the // bucket, you must have the READ_ACP access to the bucket. If READ_ACP permission // is granted to the anonymous user, you can return the ACL of the bucket without // using an authorization header. // // When you use this API operation with an access point, provide the alias of the // access point in place of the bucket name. // // When you use this API operation with an Object Lambda access point, provide the // alias of the Object Lambda access point in place of the bucket name. If the // Object Lambda access point alias in a request is not valid, the error code // InvalidAccessPointAliasError is returned. For more information about // InvalidAccessPointAliasError , see [List of Error Codes]. // // If your bucket uses the bucket owner enforced setting for S3 Object Ownership, // requests to read ACLs are still supported and return the // bucket-owner-full-control ACL with the owner being the account that created the // bucket. For more information, see [Controlling object ownership and disabling ACLs]in the Amazon S3 User Guide. // // The following operations are related to GetBucketAcl : // // [ListObjects] // // [ListObjects]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // [Controlling object ownership and disabling ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html func (c *Client) GetBucketAcl(ctx context.Context, params *GetBucketAclInput, optFns ...func(*Options)) (*GetBucketAclOutput, error) { if params == nil { params = &GetBucketAclInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketAcl", params, optFns, c.addOperationGetBucketAclMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketAclOutput) out.ResultMetadata = metadata return out, nil } type GetBucketAclInput struct { // Specifies the S3 bucket whose ACL is being requested. // // When you use this API operation with an access point, provide the alias of the // access point in place of the bucket name. // // When you use this API operation with an Object Lambda access point, provide the // alias of the Object Lambda access point in place of the bucket name. If the // Object Lambda access point alias in a request is not valid, the error code // InvalidAccessPointAliasError is returned. For more information about // InvalidAccessPointAliasError , see [List of Error Codes]. // // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketAclInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketAclOutput struct { // A list of grants. Grants []types.Grant // Container for the bucket owner's display name and ID. Owner *types.Owner // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketAclMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketAcl{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketAcl{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketAcl"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketAclValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketAcl(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketAclUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketAclInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketAcl(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketAcl", } } // getGetBucketAclBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetBucketAclBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketAclInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketAclUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketAclBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketAnalyticsConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // This implementation of the GET action returns an analytics configuration // (identified by the analytics configuration ID) from the bucket. // // To use this operation, you must have permissions to perform the // s3:GetAnalyticsConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources] in the Amazon S3 User Guide. // // For information about Amazon S3 analytics feature, see [Amazon S3 Analytics – Storage Class Analysis] in the Amazon S3 User // Guide. // // The following operations are related to GetBucketAnalyticsConfiguration : // // [DeleteBucketAnalyticsConfiguration] // // [ListBucketAnalyticsConfigurations] // // [PutBucketAnalyticsConfiguration] // // [Amazon S3 Analytics – Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html // [DeleteBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [ListBucketAnalyticsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html // [PutBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) GetBucketAnalyticsConfiguration(ctx context.Context, params *GetBucketAnalyticsConfigurationInput, optFns ...func(*Options)) (*GetBucketAnalyticsConfigurationOutput, error) { if params == nil { params = &GetBucketAnalyticsConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketAnalyticsConfiguration", params, optFns, c.addOperationGetBucketAnalyticsConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketAnalyticsConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketAnalyticsConfigurationInput struct { // The name of the bucket from which an analytics configuration is retrieved. // // This member is required. Bucket *string // The ID that identifies the analytics configuration. // // This member is required. Id *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketAnalyticsConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketAnalyticsConfigurationOutput struct { // The configuration and any analyses for the analytics filter. AnalyticsConfiguration *types.AnalyticsConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketAnalyticsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketAnalyticsConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketAnalyticsConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketAnalyticsConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketAnalyticsConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketAnalyticsConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketAnalyticsConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketAnalyticsConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketAnalyticsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketAnalyticsConfiguration", } } // getGetBucketAnalyticsConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getGetBucketAnalyticsConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketAnalyticsConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketAnalyticsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketAnalyticsConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketCors.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the Cross-Origin Resource Sharing (CORS) configuration information set // for the bucket. // // To use this operation, you must have permission to perform the s3:GetBucketCORS // action. By default, the bucket owner has this permission and can grant it to // others. // // When you use this API operation with an access point, provide the alias of the // access point in place of the bucket name. // // When you use this API operation with an Object Lambda access point, provide the // alias of the Object Lambda access point in place of the bucket name. If the // Object Lambda access point alias in a request is not valid, the error code // InvalidAccessPointAliasError is returned. For more information about // InvalidAccessPointAliasError , see [List of Error Codes]. // // For more information about CORS, see [Enabling Cross-Origin Resource Sharing]. // // The following operations are related to GetBucketCors : // // [PutBucketCors] // // [DeleteBucketCors] // // [PutBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketCors.html // [Enabling Cross-Origin Resource Sharing]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // [DeleteBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketCors.html func (c *Client) GetBucketCors(ctx context.Context, params *GetBucketCorsInput, optFns ...func(*Options)) (*GetBucketCorsOutput, error) { if params == nil { params = &GetBucketCorsInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketCors", params, optFns, c.addOperationGetBucketCorsMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketCorsOutput) out.ResultMetadata = metadata return out, nil } type GetBucketCorsInput struct { // The bucket name for which to get the cors configuration. // // When you use this API operation with an access point, provide the alias of the // access point in place of the bucket name. // // When you use this API operation with an Object Lambda access point, provide the // alias of the Object Lambda access point in place of the bucket name. If the // Object Lambda access point alias in a request is not valid, the error code // InvalidAccessPointAliasError is returned. For more information about // InvalidAccessPointAliasError , see [List of Error Codes]. // // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketCorsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketCorsOutput struct { // A set of origins and methods (cross-origin access that you want to allow). You // can add up to 100 rules to the configuration. CORSRules []types.CORSRule // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketCorsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketCors{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketCors{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketCors"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketCorsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketCors(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketCorsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketCorsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketCors(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketCors", } } // getGetBucketCorsBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetBucketCorsBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketCorsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketCorsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketCorsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketEncryption.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns the default encryption configuration for an Amazon S3 bucket. By // default, all buckets have a default encryption configuration that uses // server-side encryption with Amazon S3 managed keys (SSE-S3). // // - General purpose buckets - For information about the bucket default // encryption feature, see [Amazon S3 Bucket Default Encryption]in the Amazon S3 User Guide. // // - Directory buckets - For directory buckets, there are only two supported // options for server-side encryption: SSE-S3 and SSE-KMS. For information about // the default encryption configuration in directory buckets, see [Setting default server-side encryption behavior for directory buckets]. // // Permissions // // - General purpose bucket permissions - The s3:GetEncryptionConfiguration // permission is required in a policy. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // - Directory bucket permissions - To grant access to this API operation, you // must have the s3express:GetEncryptionConfiguration permission in an IAM // identity-based policy instead of a bucket policy. Cross-account access to this // API operation isn't supported. This operation can only be performed by the // Amazon Web Services account that owns the resource. For more information about // directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region-code.amazonaws.com . // // The following operations are related to GetBucketEncryption : // // [PutBucketEncryption] // // [DeleteBucketEncryption] // // [DeleteBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketEncryption.html // [PutBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html // [Setting default server-side encryption behavior for directory buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-bucket-encryption.html // [Amazon S3 Bucket Default Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [Permissions Related to Bucket Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html func (c *Client) GetBucketEncryption(ctx context.Context, params *GetBucketEncryptionInput, optFns ...func(*Options)) (*GetBucketEncryptionOutput, error) { if params == nil { params = &GetBucketEncryptionInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketEncryption", params, optFns, c.addOperationGetBucketEncryptionMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketEncryptionOutput) out.ResultMetadata = metadata return out, nil } type GetBucketEncryptionInput struct { // The name of the bucket from which the server-side encryption configuration is // retrieved. // // Directory buckets - When you use this operation with a directory bucket, you // must use path-style requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. Directory bucket names must be // unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must // also follow the format bucket-base-name--zone-id--x-s3 (for example, // DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // For directory buckets, this header is not supported in this API operation. If // you specify this header, the request fails with the HTTP status code 501 Not // Implemented . ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketEncryptionInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketEncryptionOutput struct { // Specifies the default server-side-encryption configuration. ServerSideEncryptionConfiguration *types.ServerSideEncryptionConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketEncryptionMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketEncryption{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketEncryption{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketEncryption"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketEncryptionValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketEncryption(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketEncryptionUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketEncryptionInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketEncryption(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketEncryption", } } // getGetBucketEncryptionBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetBucketEncryptionBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketEncryptionInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketEncryptionUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketEncryptionBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketIntelligentTieringConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Gets the S3 Intelligent-Tiering configuration from the specified bucket. // // The S3 Intelligent-Tiering storage class is designed to optimize storage costs // by automatically moving data to the most cost-effective storage access tier, // without performance impact or operational overhead. S3 Intelligent-Tiering // delivers automatic cost savings in three low latency and high throughput access // tiers. To get the lowest storage cost on data that can be accessed in minutes to // hours, you can choose to activate additional archiving capabilities. // // The S3 Intelligent-Tiering storage class is the ideal storage class for data // with unknown, changing, or unpredictable access patterns, independent of object // size or retention period. If the size of an object is less than 128 KB, it is // not monitored and not eligible for auto-tiering. Smaller objects can be stored, // but they are always charged at the Frequent Access tier rates in the S3 // Intelligent-Tiering storage class. // // For more information, see [Storage class for automatically optimizing frequently and infrequently accessed objects]. // // Operations related to GetBucketIntelligentTieringConfiguration include: // // [DeleteBucketIntelligentTieringConfiguration] // // [PutBucketIntelligentTieringConfiguration] // // [ListBucketIntelligentTieringConfigurations] // // [ListBucketIntelligentTieringConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html // [PutBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html // [Storage class for automatically optimizing frequently and infrequently accessed objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access // [DeleteBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html func (c *Client) GetBucketIntelligentTieringConfiguration(ctx context.Context, params *GetBucketIntelligentTieringConfigurationInput, optFns ...func(*Options)) (*GetBucketIntelligentTieringConfigurationOutput, error) { if params == nil { params = &GetBucketIntelligentTieringConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketIntelligentTieringConfiguration", params, optFns, c.addOperationGetBucketIntelligentTieringConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketIntelligentTieringConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketIntelligentTieringConfigurationInput struct { // The name of the Amazon S3 bucket whose configuration you want to modify or // retrieve. // // This member is required. Bucket *string // The ID used to identify the S3 Intelligent-Tiering configuration. // // This member is required. Id *string noSmithyDocumentSerde } func (in *GetBucketIntelligentTieringConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketIntelligentTieringConfigurationOutput struct { // Container for S3 Intelligent-Tiering configuration. IntelligentTieringConfiguration *types.IntelligentTieringConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketIntelligentTieringConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketIntelligentTieringConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketIntelligentTieringConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketIntelligentTieringConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketIntelligentTieringConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketIntelligentTieringConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketIntelligentTieringConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketIntelligentTieringConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketIntelligentTieringConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketIntelligentTieringConfiguration", } } // getGetBucketIntelligentTieringConfigurationBucketMember returns a pointer to // string denoting a provided bucket member valueand a boolean indicating if the // input has a modeled bucket name, func getGetBucketIntelligentTieringConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketIntelligentTieringConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketIntelligentTieringConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketIntelligentTieringConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketInventoryConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns an inventory configuration (identified by the inventory configuration // ID) from the bucket. // // To use this operation, you must have permissions to perform the // s3:GetInventoryConfiguration action. The bucket owner has this permission by // default and can grant this permission to others. For more information about // permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For information about the Amazon S3 inventory feature, see [Amazon S3 Inventory]. // // The following operations are related to GetBucketInventoryConfiguration : // // [DeleteBucketInventoryConfiguration] // // [ListBucketInventoryConfigurations] // // [PutBucketInventoryConfiguration] // // [Amazon S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html // [ListBucketInventoryConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [DeleteBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [PutBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html func (c *Client) GetBucketInventoryConfiguration(ctx context.Context, params *GetBucketInventoryConfigurationInput, optFns ...func(*Options)) (*GetBucketInventoryConfigurationOutput, error) { if params == nil { params = &GetBucketInventoryConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketInventoryConfiguration", params, optFns, c.addOperationGetBucketInventoryConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketInventoryConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketInventoryConfigurationInput struct { // The name of the bucket containing the inventory configuration to retrieve. // // This member is required. Bucket *string // The ID used to identify the inventory configuration. // // This member is required. Id *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketInventoryConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketInventoryConfigurationOutput struct { // Specifies the inventory configuration. InventoryConfiguration *types.InventoryConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketInventoryConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketInventoryConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketInventoryConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketInventoryConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketInventoryConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketInventoryConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketInventoryConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketInventoryConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketInventoryConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketInventoryConfiguration", } } // getGetBucketInventoryConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getGetBucketInventoryConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketInventoryConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketInventoryConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketInventoryConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketLifecycleConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns the lifecycle configuration information set on the bucket. For // information about lifecycle configuration, see [Object Lifecycle Management]. // // Bucket lifecycle configuration now supports specifying a lifecycle rule using // an object key name prefix, one or more object tags, object size, or any // combination of these. Accordingly, this section describes the latest API, which // is compatible with the new functionality. The previous version of the API // supported filtering based only on an object key name prefix, which is supported // for general purpose buckets for backward compatibility. For the related API // description, see [GetBucketLifecycle]. // // Lifecyle configurations for directory buckets only support expiring objects and // cancelling multipart uploads. Expiring of versioned objects, transitions and tag // filters are not supported. // // Permissions // - General purpose bucket permissions - By default, all Amazon S3 resources // are private, including buckets, objects, and related subresources (for example, // lifecycle configuration and website configuration). Only the resource owner // (that is, the Amazon Web Services account that created it) can access the // resource. The resource owner can optionally grant access permissions to others // by writing an access policy. For this operation, a user must have the // s3:GetLifecycleConfiguration permission. // // For more information about permissions, see [Managing Access Permissions to Your Amazon S3 Resources]. // // - Directory bucket permissions - You must have the // s3express:GetLifecycleConfiguration permission in an IAM identity-based policy // to use this operation. Cross-account access to this API operation isn't // supported. The resource owner can optionally grant access permissions to others // by creating a role or user for them as long as they are within the same account // as the owner and resource. // // For more information about directory bucket policies and permissions, see [Authorizing Regional endpoint APIs with IAM]in // // the Amazon S3 User Guide. // // Directory buckets - For directory buckets, you must make requests for this API // // operation to the Regional endpoint. These endpoints support path-style requests // in the format https://s3express-control.region-code.amazonaws.com/bucket-name // . Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region.amazonaws.com . // // GetBucketLifecycleConfiguration has the following special error: // // - Error code: NoSuchLifecycleConfiguration // // - Description: The lifecycle configuration does not exist. // // - HTTP Status Code: 404 Not Found // // - SOAP Fault Code Prefix: Client // // The following operations are related to GetBucketLifecycleConfiguration : // // [GetBucketLifecycle] // // [PutBucketLifecycle] // // [DeleteBucketLifecycle] // // [GetBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycle.html // [Object Lifecycle Management]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html // [Authorizing Regional endpoint APIs with IAM]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html // [PutBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [DeleteBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html func (c *Client) GetBucketLifecycleConfiguration(ctx context.Context, params *GetBucketLifecycleConfigurationInput, optFns ...func(*Options)) (*GetBucketLifecycleConfigurationOutput, error) { if params == nil { params = &GetBucketLifecycleConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketLifecycleConfiguration", params, optFns, c.addOperationGetBucketLifecycleConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketLifecycleConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketLifecycleConfigurationInput struct { // The name of the bucket for which to get the lifecycle information. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // This parameter applies to general purpose buckets only. It is not supported for // directory bucket lifecycle configurations. ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketLifecycleConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketLifecycleConfigurationOutput struct { // Container for a lifecycle rule. Rules []types.LifecycleRule // Indicates which default minimum object size behavior is applied to the // lifecycle configuration. // // This parameter applies to general purpose buckets only. It isn't supported for // directory bucket lifecycle configurations. // // - all_storage_classes_128K - Objects smaller than 128 KB will not transition // to any storage class by default. // // - varies_by_storage_class - Objects smaller than 128 KB will transition to // Glacier Flexible Retrieval or Glacier Deep Archive storage classes. By default, // all other storage classes will prevent transitions smaller than 128 KB. // // To customize the minimum object size for any transition you can add a filter // that specifies a custom ObjectSizeGreaterThan or ObjectSizeLessThan in the body // of your transition rule. Custom filters always take precedence over the default // transition behavior. TransitionDefaultMinimumObjectSize types.TransitionDefaultMinimumObjectSize // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketLifecycleConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketLifecycleConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketLifecycleConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketLifecycleConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketLifecycleConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketLifecycleConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketLifecycleConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketLifecycleConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketLifecycleConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketLifecycleConfiguration", } } // getGetBucketLifecycleConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getGetBucketLifecycleConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketLifecycleConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketLifecycleConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketLifecycleConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketLocation.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "bytes" "context" "encoding/xml" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" smithy "github.com/aws/smithy-go" smithyxml "github.com/aws/smithy-go/encoding/xml" smithyio "github.com/aws/smithy-go/io" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" "io" ) // This operation is not supported for directory buckets. // // Returns the Region the bucket resides in. You set the bucket's Region using the // LocationConstraint request parameter in a CreateBucket request. For more // information, see [CreateBucket]. // // When you use this API operation with an access point, provide the alias of the // access point in place of the bucket name. // // When you use this API operation with an Object Lambda access point, provide the // alias of the Object Lambda access point in place of the bucket name. If the // Object Lambda access point alias in a request is not valid, the error code // InvalidAccessPointAliasError is returned. For more information about // InvalidAccessPointAliasError , see [List of Error Codes]. // // We recommend that you use [HeadBucket] to return the Region that a bucket resides in. For // backward compatibility, Amazon S3 continues to support GetBucketLocation. // // The following operations are related to GetBucketLocation : // // [GetObject] // // [CreateBucket] // // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [HeadBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html func (c *Client) GetBucketLocation(ctx context.Context, params *GetBucketLocationInput, optFns ...func(*Options)) (*GetBucketLocationOutput, error) { if params == nil { params = &GetBucketLocationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketLocation", params, optFns, c.addOperationGetBucketLocationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketLocationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketLocationInput struct { // The name of the bucket for which to get the location. // // When you use this API operation with an access point, provide the alias of the // access point in place of the bucket name. // // When you use this API operation with an Object Lambda access point, provide the // alias of the Object Lambda access point in place of the bucket name. If the // Object Lambda access point alias in a request is not valid, the error code // InvalidAccessPointAliasError is returned. For more information about // InvalidAccessPointAliasError , see [List of Error Codes]. // // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketLocationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketLocationOutput struct { // Specifies the Region where the bucket resides. For a list of all the Amazon S3 // supported location constraints by Region, see [Regions and Endpoints]. // // Buckets in Region us-east-1 have a LocationConstraint of null . Buckets with a // LocationConstraint of EU reside in eu-west-1 . // // [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region LocationConstraint types.BucketLocationConstraint // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketLocationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketLocation{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketLocation{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketLocation"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = swapDeserializerHelper(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketLocationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketLocation(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketLocationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } type awsRestxml_deserializeOpGetBucketLocation_custom struct { } func (*awsRestxml_deserializeOpGetBucketLocation_custom) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketLocation_custom) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketLocation(response, &metadata) } output := &GetBucketLocationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) decoder := smithyxml.WrapNodeDecoder(rootDecoder, xml.StartElement{}) err = awsRestxml_deserializeOpDocumentGetBucketLocationOutput(&output, decoder) if err == io.EOF { err = nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } return out, metadata, err } // Helper to swap in a custom deserializer func swapDeserializerHelper(stack *middleware.Stack) error { _, err := stack.Deserialize.Swap("OperationDeserializer", &awsRestxml_deserializeOpGetBucketLocation_custom{}) if err != nil { return err } return nil } func (v *GetBucketLocationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketLocation(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketLocation", } } // getGetBucketLocationBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetBucketLocationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketLocationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketLocationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketLocationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketLogging.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the logging status of a bucket and the permissions users have to view // and modify that status. // // The following operations are related to GetBucketLogging : // // [CreateBucket] // // [PutBucketLogging] // // [PutBucketLogging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html func (c *Client) GetBucketLogging(ctx context.Context, params *GetBucketLoggingInput, optFns ...func(*Options)) (*GetBucketLoggingOutput, error) { if params == nil { params = &GetBucketLoggingInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketLogging", params, optFns, c.addOperationGetBucketLoggingMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketLoggingOutput) out.ResultMetadata = metadata return out, nil } type GetBucketLoggingInput struct { // The bucket name for which to get the logging information. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketLoggingInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketLoggingOutput struct { // Describes where logs are stored and the prefix that Amazon S3 assigns to all // log object keys for a bucket. For more information, see [PUT Bucket logging]in the Amazon S3 API // Reference. // // [PUT Bucket logging]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlogging.html LoggingEnabled *types.LoggingEnabled // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketLoggingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketLogging{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketLogging{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketLogging"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketLoggingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketLogging(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketLoggingUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketLoggingInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketLogging(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketLogging", } } // getGetBucketLoggingBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetBucketLoggingBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketLoggingInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketLoggingUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketLoggingBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketMetadataTableConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Retrieves the metadata table configuration for a general purpose bucket. For // // more information, see [Accelerating data discovery with S3 Metadata]in the Amazon S3 User Guide. // // Permissions To use this operation, you must have the // s3:GetBucketMetadataTableConfiguration permission. For more information, see [Setting up permissions for configuring metadata tables] // in the Amazon S3 User Guide. // // The following operations are related to GetBucketMetadataTableConfiguration : // // [CreateBucketMetadataTableConfiguration] // // [DeleteBucketMetadataTableConfiguration] // // [Setting up permissions for configuring metadata tables]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html // [CreateBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataTableConfiguration.html // [DeleteBucketMetadataTableConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataTableConfiguration.html // [Accelerating data discovery with S3 Metadata]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html func (c *Client) GetBucketMetadataTableConfiguration(ctx context.Context, params *GetBucketMetadataTableConfigurationInput, optFns ...func(*Options)) (*GetBucketMetadataTableConfigurationOutput, error) { if params == nil { params = &GetBucketMetadataTableConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketMetadataTableConfiguration", params, optFns, c.addOperationGetBucketMetadataTableConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketMetadataTableConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketMetadataTableConfigurationInput struct { // The general purpose bucket that contains the metadata table configuration that // you want to retrieve. // // This member is required. Bucket *string // The expected owner of the general purpose bucket that you want to retrieve the // metadata table configuration from. ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketMetadataTableConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketMetadataTableConfigurationOutput struct { // The metadata table configuration for the general purpose bucket. GetBucketMetadataTableConfigurationResult *types.GetBucketMetadataTableConfigurationResult // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketMetadataTableConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketMetadataTableConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketMetadataTableConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketMetadataTableConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketMetadataTableConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketMetadataTableConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketMetadataTableConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketMetadataTableConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketMetadataTableConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketMetadataTableConfiguration", } } // getGetBucketMetadataTableConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getGetBucketMetadataTableConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketMetadataTableConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketMetadataTableConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketMetadataTableConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketMetricsConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Gets a metrics configuration (specified by the metrics configuration ID) from // the bucket. Note that this doesn't include the daily storage metrics. // // To use this operation, you must have permissions to perform the // s3:GetMetricsConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For information about CloudWatch request metrics for Amazon S3, see [Monitoring Metrics with Amazon CloudWatch]. // // The following operations are related to GetBucketMetricsConfiguration : // // [PutBucketMetricsConfiguration] // // [DeleteBucketMetricsConfiguration] // // [ListBucketMetricsConfigurations] // // [Monitoring Metrics with Amazon CloudWatch] // // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Monitoring Metrics with Amazon CloudWatch]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html // [ListBucketMetricsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html // [PutBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html // [DeleteBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) GetBucketMetricsConfiguration(ctx context.Context, params *GetBucketMetricsConfigurationInput, optFns ...func(*Options)) (*GetBucketMetricsConfigurationOutput, error) { if params == nil { params = &GetBucketMetricsConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketMetricsConfiguration", params, optFns, c.addOperationGetBucketMetricsConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketMetricsConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketMetricsConfigurationInput struct { // The name of the bucket containing the metrics configuration to retrieve. // // This member is required. Bucket *string // The ID used to identify the metrics configuration. The ID has a 64 character // limit and can only contain letters, numbers, periods, dashes, and underscores. // // This member is required. Id *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketMetricsConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketMetricsConfigurationOutput struct { // Specifies the metrics configuration. MetricsConfiguration *types.MetricsConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketMetricsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketMetricsConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketMetricsConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketMetricsConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketMetricsConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketMetricsConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketMetricsConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketMetricsConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketMetricsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketMetricsConfiguration", } } // getGetBucketMetricsConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getGetBucketMetricsConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketMetricsConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketMetricsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketMetricsConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketNotificationConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the notification configuration of a bucket. // // If notifications are not enabled on the bucket, the action returns an empty // NotificationConfiguration element. // // By default, you must be the bucket owner to read the notification configuration // of a bucket. However, the bucket owner can use a bucket policy to grant // permission to other users to read this configuration with the // s3:GetBucketNotification permission. // // When you use this API operation with an access point, provide the alias of the // access point in place of the bucket name. // // When you use this API operation with an Object Lambda access point, provide the // alias of the Object Lambda access point in place of the bucket name. If the // Object Lambda access point alias in a request is not valid, the error code // InvalidAccessPointAliasError is returned. For more information about // InvalidAccessPointAliasError , see [List of Error Codes]. // // For more information about setting and reading the notification configuration // on a bucket, see [Setting Up Notification of Bucket Events]. For more information about bucket policies, see [Using Bucket Policies]. // // The following action is related to GetBucketNotification : // // [PutBucketNotification] // // [Using Bucket Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html // [Setting Up Notification of Bucket Events]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // [PutBucketNotification]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketNotification.html func (c *Client) GetBucketNotificationConfiguration(ctx context.Context, params *GetBucketNotificationConfigurationInput, optFns ...func(*Options)) (*GetBucketNotificationConfigurationOutput, error) { if params == nil { params = &GetBucketNotificationConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketNotificationConfiguration", params, optFns, c.addOperationGetBucketNotificationConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketNotificationConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketNotificationConfigurationInput struct { // The name of the bucket for which to get the notification configuration. // // When you use this API operation with an access point, provide the alias of the // access point in place of the bucket name. // // When you use this API operation with an Object Lambda access point, provide the // alias of the Object Lambda access point in place of the bucket name. If the // Object Lambda access point alias in a request is not valid, the error code // InvalidAccessPointAliasError is returned. For more information about // InvalidAccessPointAliasError , see [List of Error Codes]. // // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketNotificationConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } // A container for specifying the notification configuration of the bucket. If // this element is empty, notifications are turned off for the bucket. type GetBucketNotificationConfigurationOutput struct { // Enables delivery of events to Amazon EventBridge. EventBridgeConfiguration *types.EventBridgeConfiguration // Describes the Lambda functions to invoke and the events for which to invoke // them. LambdaFunctionConfigurations []types.LambdaFunctionConfiguration // The Amazon Simple Queue Service queues to publish messages to and the events // for which to publish messages. QueueConfigurations []types.QueueConfiguration // The topic to which notifications are sent and the events for which // notifications are generated. TopicConfigurations []types.TopicConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketNotificationConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketNotificationConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketNotificationConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketNotificationConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketNotificationConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketNotificationConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketNotificationConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketNotificationConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketNotificationConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketNotificationConfiguration", } } // getGetBucketNotificationConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getGetBucketNotificationConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketNotificationConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketNotificationConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketNotificationConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketOwnershipControls.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Retrieves OwnershipControls for an Amazon S3 bucket. To use this operation, you // must have the s3:GetBucketOwnershipControls permission. For more information // about Amazon S3 permissions, see [Specifying permissions in a policy]. // // For information about Amazon S3 Object Ownership, see [Using Object Ownership]. // // The following operations are related to GetBucketOwnershipControls : // // # PutBucketOwnershipControls // // # DeleteBucketOwnershipControls // // [Using Object Ownership]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html // [Specifying permissions in a policy]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html func (c *Client) GetBucketOwnershipControls(ctx context.Context, params *GetBucketOwnershipControlsInput, optFns ...func(*Options)) (*GetBucketOwnershipControlsOutput, error) { if params == nil { params = &GetBucketOwnershipControlsInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketOwnershipControls", params, optFns, c.addOperationGetBucketOwnershipControlsMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketOwnershipControlsOutput) out.ResultMetadata = metadata return out, nil } type GetBucketOwnershipControlsInput struct { // The name of the Amazon S3 bucket whose OwnershipControls you want to retrieve. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketOwnershipControlsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketOwnershipControlsOutput struct { // The OwnershipControls (BucketOwnerEnforced, BucketOwnerPreferred, or // ObjectWriter) currently in effect for this Amazon S3 bucket. OwnershipControls *types.OwnershipControls // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketOwnershipControlsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketOwnershipControls{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketOwnershipControls{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketOwnershipControls"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketOwnershipControlsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketOwnershipControls(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketOwnershipControlsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketOwnershipControlsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketOwnershipControls(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketOwnershipControls", } } // getGetBucketOwnershipControlsBucketMember returns a pointer to string denoting // a provided bucket member valueand a boolean indicating if the input has a // modeled bucket name, func getGetBucketOwnershipControlsBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketOwnershipControlsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketOwnershipControlsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketOwnershipControlsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns the policy of a specified bucket. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Regional endpoint. These endpoints support path-style requests // in the format https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions If you are using an identity other than the root user of the Amazon // Web Services account that owns the bucket, the calling identity must both have // the GetBucketPolicy permissions on the specified bucket and belong to the // bucket owner's account in order to use this operation. // // If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403 Access // Denied error. If you have the correct permissions, but you're not using an // identity that belongs to the bucket owner's account, Amazon S3 returns a 405 // Method Not Allowed error. // // To ensure that bucket owners don't inadvertently lock themselves out of their // own buckets, the root principal in a bucket owner's Amazon Web Services account // can perform the GetBucketPolicy , PutBucketPolicy , and DeleteBucketPolicy API // actions, even if their bucket policy explicitly denies the root principal's // access. Bucket owner root principals can only be blocked from performing these // API actions by VPC endpoint policies and Amazon Web Services Organizations // policies. // // - General purpose bucket permissions - The s3:GetBucketPolicy permission is // required in a policy. For more information about general purpose buckets bucket // policies, see [Using Bucket Policies and User Policies]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation, you // must have the s3express:GetBucketPolicy permission in an IAM identity-based // policy instead of a bucket policy. Cross-account access to this API operation // isn't supported. This operation can only be performed by the Amazon Web Services // account that owns the resource. For more information about directory bucket // policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide. // // Example bucket policies General purpose buckets example bucket policies - See [Bucket policy examples] // in the Amazon S3 User Guide. // // Directory bucket example bucket policies - See [Example bucket policies for S3 Express One Zone] in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region-code.amazonaws.com . // // The following action is related to GetBucketPolicy : // // [GetObject] // // [Bucket policy examples]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html // [Using Bucket Policies and User Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html func (c *Client) GetBucketPolicy(ctx context.Context, params *GetBucketPolicyInput, optFns ...func(*Options)) (*GetBucketPolicyOutput, error) { if params == nil { params = &GetBucketPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketPolicy", params, optFns, c.addOperationGetBucketPolicyMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketPolicyOutput) out.ResultMetadata = metadata return out, nil } type GetBucketPolicyInput struct { // The bucket name to get the bucket policy for. // // Directory buckets - When you use this operation with a directory bucket, you // must use path-style requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. Directory bucket names must be // unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must // also follow the format bucket-base-name--zone-id--x-s3 (for example, // DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide // // Access points - When you use this API operation with an access point, provide // the alias of the access point in place of the bucket name. // // Object Lambda access points - When you use this API operation with an Object // Lambda access point, provide the alias of the Object Lambda access point in // place of the bucket name. If the Object Lambda access point alias in a request // is not valid, the error code InvalidAccessPointAliasError is returned. For more // information about InvalidAccessPointAliasError , see [List of Error Codes]. // // Object Lambda access points are not supported by directory buckets. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // For directory buckets, this header is not supported in this API operation. If // you specify this header, the request fails with the HTTP status code 501 Not // Implemented . ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketPolicyInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketPolicyOutput struct { // The bucket policy as a JSON document. Policy *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketPolicy(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketPolicyUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketPolicyInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketPolicy", } } // getGetBucketPolicyBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetBucketPolicyBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketPolicyInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketPolicyUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketPolicyBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketPolicyStatus.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Retrieves the policy status for an Amazon S3 bucket, indicating whether the // bucket is public. In order to use this operation, you must have the // s3:GetBucketPolicyStatus permission. For more information about Amazon S3 // permissions, see [Specifying Permissions in a Policy]. // // For more information about when Amazon S3 considers a bucket public, see [The Meaning of "Public"]. // // The following operations are related to GetBucketPolicyStatus : // // [Using Amazon S3 Block Public Access] // // [GetPublicAccessBlock] // // [PutPublicAccessBlock] // // [DeletePublicAccessBlock] // // [GetPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html // [PutPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html // [DeletePublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html // [Using Amazon S3 Block Public Access]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html // [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html // [The Meaning of "Public"]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status func (c *Client) GetBucketPolicyStatus(ctx context.Context, params *GetBucketPolicyStatusInput, optFns ...func(*Options)) (*GetBucketPolicyStatusOutput, error) { if params == nil { params = &GetBucketPolicyStatusInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketPolicyStatus", params, optFns, c.addOperationGetBucketPolicyStatusMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketPolicyStatusOutput) out.ResultMetadata = metadata return out, nil } type GetBucketPolicyStatusInput struct { // The name of the Amazon S3 bucket whose policy status you want to retrieve. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketPolicyStatusInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketPolicyStatusOutput struct { // The policy status for the specified bucket. PolicyStatus *types.PolicyStatus // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketPolicyStatusMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketPolicyStatus{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketPolicyStatus{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketPolicyStatus"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketPolicyStatusValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketPolicyStatus(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketPolicyStatusUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketPolicyStatusInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketPolicyStatus(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketPolicyStatus", } } // getGetBucketPolicyStatusBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetBucketPolicyStatusBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketPolicyStatusInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketPolicyStatusUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketPolicyStatusBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketReplication.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the replication configuration of a bucket. // // It can take a while to propagate the put or delete a replication configuration // to all Amazon S3 systems. Therefore, a get request soon after put or delete can // return a wrong result. // // For information about replication configuration, see [Replication] in the Amazon S3 User // Guide. // // This action requires permissions for the s3:GetReplicationConfiguration action. // For more information about permissions, see [Using Bucket Policies and User Policies]. // // If you include the Filter element in a replication configuration, you must also // include the DeleteMarkerReplication and Priority elements. The response also // returns those elements. // // For information about GetBucketReplication errors, see [List of replication-related error codes] // // The following operations are related to GetBucketReplication : // // [PutBucketReplication] // // [DeleteBucketReplication] // // [PutBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html // [Using Bucket Policies and User Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html // [Replication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html // [List of replication-related error codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ReplicationErrorCodeList // [DeleteBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html func (c *Client) GetBucketReplication(ctx context.Context, params *GetBucketReplicationInput, optFns ...func(*Options)) (*GetBucketReplicationOutput, error) { if params == nil { params = &GetBucketReplicationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketReplication", params, optFns, c.addOperationGetBucketReplicationMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketReplicationOutput) out.ResultMetadata = metadata return out, nil } type GetBucketReplicationInput struct { // The bucket name for which to get the replication information. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketReplicationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketReplicationOutput struct { // A container for replication rules. You can add up to 1,000 rules. The maximum // size of a replication configuration is 2 MB. ReplicationConfiguration *types.ReplicationConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketReplicationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketReplication{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketReplication{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketReplication"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketReplicationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketReplication(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketReplicationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketReplicationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketReplication(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketReplication", } } // getGetBucketReplicationBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetBucketReplicationBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketReplicationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketReplicationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketReplicationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketRequestPayment.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the request payment configuration of a bucket. To use this version of // the operation, you must be the bucket owner. For more information, see [Requester Pays Buckets]. // // The following operations are related to GetBucketRequestPayment : // // [ListObjects] // // [ListObjects]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html // [Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html func (c *Client) GetBucketRequestPayment(ctx context.Context, params *GetBucketRequestPaymentInput, optFns ...func(*Options)) (*GetBucketRequestPaymentOutput, error) { if params == nil { params = &GetBucketRequestPaymentInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketRequestPayment", params, optFns, c.addOperationGetBucketRequestPaymentMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketRequestPaymentOutput) out.ResultMetadata = metadata return out, nil } type GetBucketRequestPaymentInput struct { // The name of the bucket for which to get the payment request configuration // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketRequestPaymentInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketRequestPaymentOutput struct { // Specifies who pays for the download and request fees. Payer types.Payer // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketRequestPaymentMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketRequestPayment{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketRequestPayment{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketRequestPayment"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketRequestPaymentValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketRequestPayment(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketRequestPaymentUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketRequestPaymentInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketRequestPayment(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketRequestPayment", } } // getGetBucketRequestPaymentBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetBucketRequestPaymentBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketRequestPaymentInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketRequestPaymentUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketRequestPaymentBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketTagging.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the tag set associated with the bucket. // // To use this operation, you must have permission to perform the // s3:GetBucketTagging action. By default, the bucket owner has this permission and // can grant this permission to others. // // GetBucketTagging has the following special error: // // - Error code: NoSuchTagSet // // - Description: There is no tag set associated with the bucket. // // The following operations are related to GetBucketTagging : // // [PutBucketTagging] // // [DeleteBucketTagging] // // [PutBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html // [DeleteBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html func (c *Client) GetBucketTagging(ctx context.Context, params *GetBucketTaggingInput, optFns ...func(*Options)) (*GetBucketTaggingOutput, error) { if params == nil { params = &GetBucketTaggingInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketTagging", params, optFns, c.addOperationGetBucketTaggingMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketTaggingOutput) out.ResultMetadata = metadata return out, nil } type GetBucketTaggingInput struct { // The name of the bucket for which to get the tagging information. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketTaggingInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketTaggingOutput struct { // Contains the tag set. // // This member is required. TagSet []types.Tag // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketTagging{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketTagging{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketTagging"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketTaggingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketTagging(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketTaggingUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketTaggingInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketTagging(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketTagging", } } // getGetBucketTaggingBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetBucketTaggingBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketTaggingInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketTaggingBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketVersioning.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the versioning state of a bucket. // // To retrieve the versioning state of a bucket, you must be the bucket owner. // // This implementation also returns the MFA Delete status of the versioning state. // If the MFA Delete status is enabled , the bucket owner must use an // authentication device to change the versioning state of the bucket. // // The following operations are related to GetBucketVersioning : // // [GetObject] // // [PutObject] // // [DeleteObject] // // [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html func (c *Client) GetBucketVersioning(ctx context.Context, params *GetBucketVersioningInput, optFns ...func(*Options)) (*GetBucketVersioningOutput, error) { if params == nil { params = &GetBucketVersioningInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketVersioning", params, optFns, c.addOperationGetBucketVersioningMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketVersioningOutput) out.ResultMetadata = metadata return out, nil } type GetBucketVersioningInput struct { // The name of the bucket for which to get the versioning information. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketVersioningInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketVersioningOutput struct { // Specifies whether MFA delete is enabled in the bucket versioning configuration. // This element is only returned if the bucket has been configured with MFA delete. // If the bucket has never been so configured, this element is not returned. MFADelete types.MFADeleteStatus // The versioning state of the bucket. Status types.BucketVersioningStatus // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketVersioningMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketVersioning{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketVersioning{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketVersioning"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketVersioningValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketVersioning(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketVersioningUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketVersioningInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketVersioning(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketVersioning", } } // getGetBucketVersioningBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetBucketVersioningBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketVersioningInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketVersioningUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketVersioningBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetBucketWebsite.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the website configuration for a bucket. To host website on Amazon S3, // you can configure a bucket as website by adding a website configuration. For // more information about hosting websites, see [Hosting Websites on Amazon S3]. // // This GET action requires the S3:GetBucketWebsite permission. By default, only // the bucket owner can read the bucket website configuration. However, bucket // owners can allow other users to read the website configuration by writing a // bucket policy granting them the S3:GetBucketWebsite permission. // // The following operations are related to GetBucketWebsite : // // [DeleteBucketWebsite] // // [PutBucketWebsite] // // [PutBucketWebsite]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketWebsite.html // [Hosting Websites on Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html // [DeleteBucketWebsite]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketWebsite.html func (c *Client) GetBucketWebsite(ctx context.Context, params *GetBucketWebsiteInput, optFns ...func(*Options)) (*GetBucketWebsiteOutput, error) { if params == nil { params = &GetBucketWebsiteInput{} } result, metadata, err := c.invokeOperation(ctx, "GetBucketWebsite", params, optFns, c.addOperationGetBucketWebsiteMiddlewares) if err != nil { return nil, err } out := result.(*GetBucketWebsiteOutput) out.ResultMetadata = metadata return out, nil } type GetBucketWebsiteInput struct { // The bucket name for which to get the website configuration. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetBucketWebsiteInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetBucketWebsiteOutput struct { // The object key name of the website error document to use for 4XX class errors. ErrorDocument *types.ErrorDocument // The name of the index document for the website (for example index.html ). IndexDocument *types.IndexDocument // Specifies the redirect behavior of all requests to a website endpoint of an // Amazon S3 bucket. RedirectAllRequestsTo *types.RedirectAllRequestsTo // Rules that define when a redirect is applied and the redirect behavior. RoutingRules []types.RoutingRule // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetBucketWebsiteMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetBucketWebsite{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetBucketWebsite{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetBucketWebsite"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetBucketWebsiteValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetBucketWebsite(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetBucketWebsiteUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetBucketWebsiteInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetBucketWebsite(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetBucketWebsite", } } // getGetBucketWebsiteBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetBucketWebsiteBucketMember(input interface{}) (*string, bool) { in := input.(*GetBucketWebsiteInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetBucketWebsiteUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetBucketWebsiteBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObject.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "io" "time" ) // Retrieves an object from Amazon S3. // // In the GetObject request, specify the full key name for the object. // // General purpose buckets - Both the virtual-hosted-style requests and the // path-style requests are supported. For a virtual hosted-style request example, // if you have the object photos/2006/February/sample.jpg , specify the object key // name as /photos/2006/February/sample.jpg . For a path-style request example, if // you have the object photos/2006/February/sample.jpg in the bucket named // examplebucket , specify the object key name as // /examplebucket/photos/2006/February/sample.jpg . For more information about // request types, see [HTTP Host Header Bucket Specification]in the Amazon S3 User Guide. // // Directory buckets - Only virtual-hosted-style requests are supported. For a // virtual hosted-style request example, if you have the object // photos/2006/February/sample.jpg in the bucket named // amzn-s3-demo-bucket--usw2-az1--x-s3 , specify the object key name as // /photos/2006/February/sample.jpg . Also, when you make requests to this API // operation, your requests are sent to the Zonal endpoint. These endpoints support // virtual-hosted-style requests in the format // https://bucket-name.s3express-zone-id.region-code.amazonaws.com/key-name . // Path-style requests are not supported. For more information about endpoints in // Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information about // endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // - General purpose bucket permissions - You must have the required permissions // in a policy. To use GetObject , you must have the READ access to the object // (or version). If you grant READ access to the anonymous user, the GetObject // operation returns the object without using an authorization header. For more // information, see [Specifying permissions in a policy]in the Amazon S3 User Guide. // // If you include a versionId in your request header, you must have the // // s3:GetObjectVersion permission to access a specific version of an object. The // s3:GetObject permission is not required in this scenario. // // If you request the current version of an object without a specific versionId in // // the request header, only the s3:GetObject permission is required. The // s3:GetObjectVersion permission is not required in this scenario. // // If the object that you request doesn’t exist, the error that Amazon S3 returns // // depends on whether you also have the s3:ListBucket permission. // // - If you have the s3:ListBucket permission on the bucket, Amazon S3 returns an // HTTP status code 404 Not Found error. // // - If you don’t have the s3:ListBucket permission, Amazon S3 returns an HTTP // status code 403 Access Denied error. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // If the object is encrypted using SSE-KMS, you must also have the // // kms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies // and KMS key policies for the KMS key. // // Storage classes If the object you are retrieving is stored in the S3 Glacier // Flexible Retrieval storage class, the S3 Glacier Deep Archive storage class, the // S3 Intelligent-Tiering Archive Access tier, or the S3 Intelligent-Tiering Deep // Archive Access tier, before you can retrieve the object you must first restore a // copy using [RestoreObject]. Otherwise, this operation returns an InvalidObjectState error. For // information about restoring archived objects, see [Restoring Archived Objects]in the Amazon S3 User Guide. // // Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3 // Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3 // One Zone-Infrequent Access storage class) in Dedicated Local Zones. Unsupported // storage class values won't write a destination object and will respond with the // HTTP status code 400 Bad Request . // // Encryption Encryption request headers, like x-amz-server-side-encryption , // should not be sent for the GetObject requests, if your object uses server-side // encryption with Amazon S3 managed encryption keys (SSE-S3), server-side // encryption with Key Management Service (KMS) keys (SSE-KMS), or dual-layer // server-side encryption with Amazon Web Services KMS keys (DSSE-KMS). If you // include the header in your GetObject requests for the object that uses these // types of keys, you’ll get an HTTP 400 Bad Request error. // // Directory buckets - For directory buckets, there are only two supported options // for server-side encryption: SSE-S3 and SSE-KMS. SSE-C isn't supported. For more // information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. // // Overriding response header values through the request There are times when you // want to override certain response header values of a GetObject response. For // example, you might override the Content-Disposition response header value // through your GetObject request. // // You can override values for a set of response headers. These modified response // header values are included only in a successful response, that is, when the HTTP // status code 200 OK is returned. The headers you can override using the // following query parameters in the request are a subset of the headers that // Amazon S3 accepts when you create an object. // // The response headers that you can override for the GetObject response are // Cache-Control , Content-Disposition , Content-Encoding , Content-Language , // Content-Type , and Expires . // // To override values for a set of response headers in the GetObject response, you // can use the following query parameters in the request. // // - response-cache-control // // - response-content-disposition // // - response-content-encoding // // - response-content-language // // - response-content-type // // - response-expires // // When you use these parameters, you must sign the request by using either an // Authorization header or a presigned URL. These parameters cannot be used with an // unsigned (anonymous) request. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to GetObject : // // [ListBuckets] // // [GetObjectAcl] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [RestoreObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html // [ListBuckets]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html // [HTTP Host Header Bucket Specification]: https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html#VirtualHostingSpecifyBucket // [Restoring Archived Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html // [GetObjectAcl]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html // [Specifying permissions in a policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html func (c *Client) GetObject(ctx context.Context, params *GetObjectInput, optFns ...func(*Options)) (*GetObjectOutput, error) { if params == nil { params = &GetObjectInput{} } result, metadata, err := c.invokeOperation(ctx, "GetObject", params, optFns, c.addOperationGetObjectMiddlewares) if err != nil { return nil, err } out := result.(*GetObjectOutput) out.ResultMetadata = metadata return out, nil } type GetObjectInput struct { // The bucket name containing the object. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points - When you use this action with an Object Lambda // access point, you must direct requests to the Object Lambda access point // hostname. The Object Lambda access point hostname takes the form // AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Key of the object to get. // // This member is required. Key *string // To retrieve the checksum, this mode must be enabled. ChecksumMode types.ChecksumMode // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Return the object only if its entity tag (ETag) is the same as the one // specified in this header; otherwise, return a 412 Precondition Failed error. // // If both of the If-Match and If-Unmodified-Since headers are present in the // request as follows: If-Match condition evaluates to true , and; // If-Unmodified-Since condition evaluates to false ; then, S3 returns 200 OK and // the data requested. // // For more information about conditional requests, see [RFC 7232]. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfMatch *string // Return the object only if it has been modified since the specified time; // otherwise, return a 304 Not Modified error. // // If both of the If-None-Match and If-Modified-Since headers are present in the // request as follows: If-None-Match condition evaluates to false , and; // If-Modified-Since condition evaluates to true ; then, S3 returns 304 Not // Modified status code. // // For more information about conditional requests, see [RFC 7232]. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfModifiedSince *time.Time // Return the object only if its entity tag (ETag) is different from the one // specified in this header; otherwise, return a 304 Not Modified error. // // If both of the If-None-Match and If-Modified-Since headers are present in the // request as follows: If-None-Match condition evaluates to false , and; // If-Modified-Since condition evaluates to true ; then, S3 returns 304 Not // Modified HTTP status code. // // For more information about conditional requests, see [RFC 7232]. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfNoneMatch *string // Return the object only if it has not been modified since the specified time; // otherwise, return a 412 Precondition Failed error. // // If both of the If-Match and If-Unmodified-Since headers are present in the // request as follows: If-Match condition evaluates to true , and; // If-Unmodified-Since condition evaluates to false ; then, S3 returns 200 OK and // the data requested. // // For more information about conditional requests, see [RFC 7232]. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfUnmodifiedSince *time.Time // Part number of the object being read. This is a positive integer between 1 and // 10,000. Effectively performs a 'ranged' GET request for the part specified. // Useful for downloading just a part of an object. PartNumber *int32 // Downloads the specified byte range of an object. For more information about the // HTTP Range header, see [https://www.rfc-editor.org/rfc/rfc9110.html#name-range]. // // Amazon S3 doesn't support retrieving multiple ranges of data per GET request. // // [https://www.rfc-editor.org/rfc/rfc9110.html#name-range]: https://www.rfc-editor.org/rfc/rfc9110.html#name-range Range *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Sets the Cache-Control header of the response. ResponseCacheControl *string // Sets the Content-Disposition header of the response. ResponseContentDisposition *string // Sets the Content-Encoding header of the response. ResponseContentEncoding *string // Sets the Content-Language header of the response. ResponseContentLanguage *string // Sets the Content-Type header of the response. ResponseContentType *string // Sets the Expires header of the response. ResponseExpires *time.Time // Specifies the algorithm to use when decrypting the object (for example, AES256 ). // // If you encrypt an object by using server-side encryption with customer-provided // encryption keys (SSE-C) when you store the object in Amazon S3, then when you // GET the object, you must use the following headers: // // - x-amz-server-side-encryption-customer-algorithm // // - x-amz-server-side-encryption-customer-key // // - x-amz-server-side-encryption-customer-key-MD5 // // For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerAlgorithm *string // Specifies the customer-provided encryption key that you originally provided for // Amazon S3 to encrypt the data before storing it. This value is used to decrypt // the object when recovering it and must match the one used when storing the data. // The key must be appropriate for use with the algorithm specified in the // x-amz-server-side-encryption-customer-algorithm header. // // If you encrypt an object by using server-side encryption with customer-provided // encryption keys (SSE-C) when you store the object in Amazon S3, then when you // GET the object, you must use the following headers: // // - x-amz-server-side-encryption-customer-algorithm // // - x-amz-server-side-encryption-customer-key // // - x-amz-server-side-encryption-customer-key-MD5 // // For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerKey *string // Specifies the 128-bit MD5 digest of the customer-provided encryption key // according to RFC 1321. Amazon S3 uses this header for a message integrity check // to ensure that the encryption key was transmitted without error. // // If you encrypt an object by using server-side encryption with customer-provided // encryption keys (SSE-C) when you store the object in Amazon S3, then when you // GET the object, you must use the following headers: // // - x-amz-server-side-encryption-customer-algorithm // // - x-amz-server-side-encryption-customer-key // // - x-amz-server-side-encryption-customer-key-MD5 // // For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerKeyMD5 *string // Version ID used to reference a specific version of the object. // // By default, the GetObject operation returns the current version of an object. // To return a different version, use the versionId subresource. // // - If you include a versionId in your request header, you must have the // s3:GetObjectVersion permission to access a specific version of an object. The // s3:GetObject permission is not required in this scenario. // // - If you request the current version of an object without a specific versionId // in the request header, only the s3:GetObject permission is required. The // s3:GetObjectVersion permission is not required in this scenario. // // - Directory buckets - S3 Versioning isn't enabled and supported for directory // buckets. For this API operation, only the null value of the version ID is // supported by directory buckets. You can only specify null to the versionId // query parameter in the request. // // For more information about versioning, see [PutBucketVersioning]. // // [PutBucketVersioning]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html VersionId *string noSmithyDocumentSerde } func (in *GetObjectInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type GetObjectOutput struct { // Indicates that a range of bytes was specified in the request. AcceptRanges *string // Object data. Body io.ReadCloser // Indicates whether the object uses an S3 Bucket Key for server-side encryption // with Key Management Service (KMS) keys (SSE-KMS). BucketKeyEnabled *bool // Specifies caching behavior along the request/reply chain. CacheControl *string // The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only // present if the object was uploaded with the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC32 *string // The Base64 encoded, 32-bit CRC32C checksum of the object. This will only be // present if the object was uploaded with the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC32C *string // The Base64 encoded, 64-bit CRC64NVME checksum of the object. For more // information, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC64NVME *string // The Base64 encoded, 160-bit SHA1 digest of the object. This will only be // present if the object was uploaded with the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumSHA1 *string // The Base64 encoded, 256-bit SHA256 digest of the object. This will only be // present if the object was uploaded with the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumSHA256 *string // The checksum type, which determines how part-level checksums are combined to // create an object-level checksum for multipart objects. You can use this header // response to verify that the checksum type that is received is the same checksum // type that was specified in the CreateMultipartUpload request. For more // information, see [Checking object integrity]in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumType types.ChecksumType // Specifies presentational information for the object. ContentDisposition *string // Indicates what content encodings have been applied to the object and thus what // decoding mechanisms must be applied to obtain the media-type referenced by the // Content-Type header field. ContentEncoding *string // The language the content is in. ContentLanguage *string // Size of the body in bytes. ContentLength *int64 // The portion of the object returned in the response. ContentRange *string // A standard MIME type describing the format of the object data. ContentType *string // Indicates whether the object retrieved was (true) or was not (false) a Delete // Marker. If false, this response header does not appear in the response. // // - If the current version of the object is a delete marker, Amazon S3 behaves // as if the object was deleted and includes x-amz-delete-marker: true in the // response. // // - If the specified version in the request is a delete marker, the response // returns a 405 Method Not Allowed error and the Last-Modified: timestamp // response header. DeleteMarker *bool // An entity tag (ETag) is an opaque identifier assigned by a web server to a // specific version of a resource found at a URL. ETag *string // If the object expiration is configured (see [PutBucketLifecycleConfiguration]PutBucketLifecycleConfiguration ), // the response includes this header. It includes the expiry-date and rule-id // key-value pairs providing object expiration information. The value of the // rule-id is URL-encoded. // // Object expiration information is not returned in directory buckets and this // header returns the value " NotImplemented " in all responses for directory // buckets. // // [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html Expiration *string // The date and time at which the object is no longer cacheable. // // Deprecated: This field is handled inconsistently across AWS SDKs. Prefer using // the ExpiresString field which contains the unparsed value from the service // response. Expires *time.Time // The unparsed value of the Expires field from the service response. Prefer use // of this value over the normal Expires response field where possible. ExpiresString *string // Date and time when the object was last modified. // // General purpose buckets - When you specify a versionId of the object in your // request, if the specified version in the request is a delete marker, the // response returns a 405 Method Not Allowed error and the Last-Modified: timestamp // response header. LastModified *time.Time // A map of metadata to store with the object in S3. // // Map keys will be normalized to lower-case. Metadata map[string]string // This is set to the number of metadata entries not returned in the headers that // are prefixed with x-amz-meta- . This can happen if you create metadata using an // API like SOAP that supports more flexible metadata than the REST API. For // example, using SOAP, you can create metadata whose values are not legal HTTP // headers. // // This functionality is not supported for directory buckets. MissingMeta *int32 // Indicates whether this object has an active legal hold. This field is only // returned if you have permission to view an object's legal hold status. // // This functionality is not supported for directory buckets. ObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus // The Object Lock mode that's currently in place for this object. // // This functionality is not supported for directory buckets. ObjectLockMode types.ObjectLockMode // The date and time when this object's Object Lock will expire. // // This functionality is not supported for directory buckets. ObjectLockRetainUntilDate *time.Time // The count of parts this object has. This value is only returned if you specify // partNumber in your request and the object was uploaded as a multipart upload. PartsCount *int32 // Amazon S3 can return this if your request involves a bucket that is either a // source or destination in a replication rule. // // This functionality is not supported for directory buckets. ReplicationStatus types.ReplicationStatus // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Provides information about object restoration action and expiration time of the // restored object copy. // // This functionality is not supported for directory buckets. Directory buckets // only support EXPRESS_ONEZONE (the S3 Express One Zone storage class) in // Availability Zones and ONEZONE_IA (the S3 One Zone-Infrequent Access storage // class) in Dedicated Local Zones. Restore *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to confirm the encryption // algorithm that's used. // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to provide the round-trip // message integrity verification of the customer-provided encryption key. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // If present, indicates the ID of the KMS key that was used for object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when you store this object in Amazon // S3. ServerSideEncryption types.ServerSideEncryption // Provides storage class information of the object. Amazon S3 returns this header // for all objects except for S3 Standard storage class objects. // // Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3 // Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3 // One Zone-Infrequent Access storage class) in Dedicated Local Zones. StorageClass types.StorageClass // The number of tags, if any, on the object, when you have the relevant // permission to read object tags. // // You can use [GetObjectTagging] to retrieve the tag set associated with an object. // // This functionality is not supported for directory buckets. // // [GetObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html TagCount *int32 // Version ID of the object. // // This functionality is not supported for directory buckets. VersionId *string // If the bucket is configured as a website, redirects requests for this object to // another object in the same bucket or to an external URL. Amazon S3 stores the // value of this header in the object metadata. // // This functionality is not supported for directory buckets. WebsiteRedirectLocation *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetObjectMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetObject{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObject{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetObject"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addResponseChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetObjectValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObject(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetObjectOutputChecksumMiddlewares(stack, options); err != nil { return err } if err = addGetObjectUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetObjectInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetObject(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetObject", } } // getGetObjectRequestValidationModeMember gets the request checksum validation // mode provided as input. func getGetObjectRequestValidationModeMember(input interface{}) (string, bool) { in := input.(*GetObjectInput) if len(in.ChecksumMode) == 0 { return "", false } return string(in.ChecksumMode), true } func setGetObjectRequestValidationModeMember(input interface{}, mode string) { in := input.(*GetObjectInput) in.ChecksumMode = types.ChecksumMode(mode) } func addGetObjectOutputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return internalChecksum.AddOutputMiddleware(stack, internalChecksum.OutputMiddlewareOptions{ GetValidationMode: getGetObjectRequestValidationModeMember, SetValidationMode: setGetObjectRequestValidationModeMember, ResponseChecksumValidation: options.ResponseChecksumValidation, ValidationAlgorithms: []string{"CRC64NVME", "CRC32", "CRC32C", "SHA256", "SHA1"}, IgnoreMultipartValidation: true, LogValidationSkipped: !options.DisableLogOutputChecksumValidationSkipped, LogMultipartValidationSkipped: !options.DisableLogOutputChecksumValidationSkipped, }) } // getGetObjectBucketMember returns a pointer to string denoting a provided bucket // member valueand a boolean indicating if the input has a modeled bucket name, func getGetObjectBucketMember(input interface{}) (*string, bool) { in := input.(*GetObjectInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetObjectUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetObjectBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } // PresignGetObject is used to generate a presigned HTTP Request which contains // presigned URL, signed headers and HTTP method used. func (c *PresignClient) PresignGetObject(ctx context.Context, params *GetObjectInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) { if params == nil { params = &GetObjectInput{} } options := c.options.copy() for _, fn := range optFns { fn(&options) } clientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption) result, _, err := c.client.invokeOperation(ctx, "GetObject", params, clientOptFns, c.client.addOperationGetObjectMiddlewares, presignConverter(options).convertToPresignMiddleware, addGetObjectPayloadAsUnsigned, ) if err != nil { return nil, err } out := result.(*v4.PresignedHTTPRequest) return out, nil } func addGetObjectPayloadAsUnsigned(stack *middleware.Stack, options Options) error { v4.RemoveContentSHA256HeaderMiddleware(stack) v4.RemoveComputePayloadSHA256Middleware(stack) return v4.AddUnsignedPayloadMiddleware(stack) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectAcl.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the access control list (ACL) of an object. To use this operation, you // must have s3:GetObjectAcl permissions or READ_ACP access to the object. For // more information, see [Mapping of ACL permissions and access policy permissions]in the Amazon S3 User Guide // // This functionality is not supported for Amazon S3 on Outposts. // // By default, GET returns ACL information about the current version of an object. // To return ACL information about a different version, use the versionId // subresource. // // If your bucket uses the bucket owner enforced setting for S3 Object Ownership, // requests to read ACLs are still supported and return the // bucket-owner-full-control ACL with the owner being the account that created the // bucket. For more information, see [Controlling object ownership and disabling ACLs]in the Amazon S3 User Guide. // // The following operations are related to GetObjectAcl : // // [GetObject] // // [GetObjectAttributes] // // [DeleteObject] // // [PutObject] // // [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html // [Mapping of ACL permissions and access policy permissions]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#acl-access-policy-permission-mapping // [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [Controlling object ownership and disabling ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html func (c *Client) GetObjectAcl(ctx context.Context, params *GetObjectAclInput, optFns ...func(*Options)) (*GetObjectAclOutput, error) { if params == nil { params = &GetObjectAclInput{} } result, metadata, err := c.invokeOperation(ctx, "GetObjectAcl", params, optFns, c.addOperationGetObjectAclMiddlewares) if err != nil { return nil, err } out := result.(*GetObjectAclOutput) out.ResultMetadata = metadata return out, nil } type GetObjectAclInput struct { // The bucket name that contains the object for which to get the ACL information. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The key of the object for which to get the ACL information. // // This member is required. Key *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Version ID used to reference a specific version of the object. // // This functionality is not supported for directory buckets. VersionId *string noSmithyDocumentSerde } func (in *GetObjectAclInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type GetObjectAclOutput struct { // A list of grants. Grants []types.Grant // Container for the bucket owner's display name and ID. Owner *types.Owner // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetObjectAclMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectAcl{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectAcl{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetObjectAcl"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetObjectAclValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectAcl(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetObjectAclUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetObjectAclInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetObjectAcl(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetObjectAcl", } } // getGetObjectAclBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetObjectAclBucketMember(input interface{}) (*string, bool) { in := input.(*GetObjectAclInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetObjectAclUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetObjectAclBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectAttributes.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Retrieves all the metadata from an object without returning the object itself. // This operation is useful if you're interested only in an object's metadata. // // GetObjectAttributes combines the functionality of HeadObject and ListParts . All // of the data returned with each of those individual calls can be returned with a // single call to GetObjectAttributes . // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Zonal endpoint. These endpoints support virtual-hosted-style // requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // // - General purpose bucket permissions - To use GetObjectAttributes , you must // have READ access to the object. The permissions that you need to use this // operation depend on whether the bucket is versioned. If the bucket is versioned, // you need both the s3:GetObjectVersion and s3:GetObjectVersionAttributes // permissions for this operation. If the bucket is not versioned, you need the // s3:GetObject and s3:GetObjectAttributes permissions. For more information, see [Specifying Permissions in a Policy] // in the Amazon S3 User Guide. If the object that you request does not exist, the // error Amazon S3 returns depends on whether you also have the s3:ListBucket // permission. // // - If you have the s3:ListBucket permission on the bucket, Amazon S3 returns an // HTTP status code 404 Not Found ("no such key") error. // // - If you don't have the s3:ListBucket permission, Amazon S3 returns an HTTP // status code 403 Forbidden ("access denied") error. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // If the object is encrypted with SSE-KMS, you must also have the // // kms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies // and KMS key policies for the KMS key. // // Encryption Encryption request headers, like x-amz-server-side-encryption , // should not be sent for HEAD requests if your object uses server-side encryption // with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side // encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side // encryption with Amazon S3 managed encryption keys (SSE-S3). The // x-amz-server-side-encryption header is used when you PUT an object to S3 and // want to specify the encryption method. If you include this header in a GET // request for an object that uses these types of keys, you’ll get an HTTP 400 Bad // Request error. It's because the encryption method can't be changed when you // retrieve the object. // // If you encrypt an object by using server-side encryption with customer-provided // encryption keys (SSE-C) when you store the object in Amazon S3, then when you // retrieve the metadata from the object, you must use the following headers to // provide the encryption key for the server to be able to retrieve the object's // metadata. The headers are: // // - x-amz-server-side-encryption-customer-algorithm // // - x-amz-server-side-encryption-customer-key // // - x-amz-server-side-encryption-customer-key-MD5 // // For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide. // // Directory bucket permissions - For directory buckets, there are only two // supported options for server-side encryption: server-side encryption with Amazon // S3 managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys // (SSE-KMS) ( aws:kms ). We recommend that the bucket's default encryption uses // the desired encryption configuration and you don't override the bucket default // encryption in your CreateSession requests or PUT object requests. Then, new // objects are automatically encrypted with the desired encryption settings. For // more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about // the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads]. // // Versioning Directory buckets - S3 Versioning isn't enabled and supported for // directory buckets. For this API operation, only the null value of the version // ID is supported by directory buckets. You can only specify null to the versionId // query parameter in the request. // // Conditional request headers Consider the following when using request headers: // // - If both of the If-Match and If-Unmodified-Since headers are present in the // request as follows, then Amazon S3 returns the HTTP status code 200 OK and the // data requested: // // - If-Match condition evaluates to true . // // - If-Unmodified-Since condition evaluates to false . // // For more information about conditional requests, see [RFC 7232]. // // - If both of the If-None-Match and If-Modified-Since headers are present in // the request as follows, then Amazon S3 returns the HTTP status code 304 Not // Modified : // // - If-None-Match condition evaluates to false . // // - If-Modified-Since condition evaluates to true . // // For more information about conditional requests, see [RFC 7232]. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following actions are related to GetObjectAttributes : // // [GetObject] // // [GetObjectAcl] // // [GetObjectLegalHold] // // [GetObjectLockConfiguration] // // [GetObjectRetention] // // [GetObjectTagging] // // [HeadObject] // // [ListParts] // // [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html // [GetObjectLegalHold]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectLegalHold.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html // [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [GetObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html // [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html // [RFC 7232]: https://tools.ietf.org/html/rfc7232 // [HeadObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html // [GetObjectLockConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectLockConfiguration.html // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html // [GetObjectAcl]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html // [GetObjectRetention]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectRetention.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html func (c *Client) GetObjectAttributes(ctx context.Context, params *GetObjectAttributesInput, optFns ...func(*Options)) (*GetObjectAttributesOutput, error) { if params == nil { params = &GetObjectAttributesInput{} } result, metadata, err := c.invokeOperation(ctx, "GetObjectAttributes", params, optFns, c.addOperationGetObjectAttributesMiddlewares) if err != nil { return nil, err } out := result.(*GetObjectAttributesOutput) out.ResultMetadata = metadata return out, nil } type GetObjectAttributesInput struct { // The name of the bucket that contains the object. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The object key. // // This member is required. Key *string // Specifies the fields at the root level that you want returned in the response. // Fields that you do not specify are not returned. // // This member is required. ObjectAttributes []types.ObjectAttributes // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Sets the maximum number of parts to return. MaxParts *int32 // Specifies the part after which listing should begin. Only parts with higher // part numbers will be listed. PartNumberMarker *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Specifies the algorithm to use when encrypting the object (for example, AES256). // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use in // encrypting data. This value is used to store the object and then it is // discarded; Amazon S3 does not store the encryption key. The key must be // appropriate for use with the algorithm specified in the // x-amz-server-side-encryption-customer-algorithm header. // // This functionality is not supported for directory buckets. SSECustomerKey *string // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. // Amazon S3 uses this header for a message integrity check to ensure that the // encryption key was transmitted without error. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // The version ID used to reference a specific version of the object. // // S3 Versioning isn't enabled and supported for directory buckets. For this API // operation, only the null value of the version ID is supported by directory // buckets. You can only specify null to the versionId query parameter in the // request. VersionId *string noSmithyDocumentSerde } func (in *GetObjectAttributesInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type GetObjectAttributesOutput struct { // The checksum or digest of the object. Checksum *types.Checksum // Specifies whether the object retrieved was ( true ) or was not ( false ) a // delete marker. If false , this response header does not appear in the response. // To learn more about delete markers, see [Working with delete markers]. // // This functionality is not supported for directory buckets. // // [Working with delete markers]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html DeleteMarker *bool // An ETag is an opaque identifier assigned by a web server to a specific version // of a resource found at a URL. ETag *string // Date and time when the object was last modified. LastModified *time.Time // A collection of parts associated with a multipart upload. ObjectParts *types.GetObjectAttributesParts // The size of the object in bytes. ObjectSize *int64 // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Provides the storage class information of the object. Amazon S3 returns this // header for all objects except for S3 Standard storage class objects. // // For more information, see [Storage Classes]. // // Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3 // Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3 // One Zone-Infrequent Access storage class) in Dedicated Local Zones. // // [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html StorageClass types.StorageClass // The version ID of the object. // // This functionality is not supported for directory buckets. VersionId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetObjectAttributesMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectAttributes{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectAttributes{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetObjectAttributes"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetObjectAttributesValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectAttributes(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetObjectAttributesUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetObjectAttributesInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetObjectAttributes(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetObjectAttributes", } } // getGetObjectAttributesBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetObjectAttributesBucketMember(input interface{}) (*string, bool) { in := input.(*GetObjectAttributesInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetObjectAttributesUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetObjectAttributesBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectLegalHold.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Gets an object's current legal hold status. For more information, see [Locking Objects]. // // This functionality is not supported for Amazon S3 on Outposts. // // The following action is related to GetObjectLegalHold : // // [GetObjectAttributes] // // [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html // [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html func (c *Client) GetObjectLegalHold(ctx context.Context, params *GetObjectLegalHoldInput, optFns ...func(*Options)) (*GetObjectLegalHoldOutput, error) { if params == nil { params = &GetObjectLegalHoldInput{} } result, metadata, err := c.invokeOperation(ctx, "GetObjectLegalHold", params, optFns, c.addOperationGetObjectLegalHoldMiddlewares) if err != nil { return nil, err } out := result.(*GetObjectLegalHoldOutput) out.ResultMetadata = metadata return out, nil } type GetObjectLegalHoldInput struct { // The bucket name containing the object whose legal hold status you want to // retrieve. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The key name for the object whose legal hold status you want to retrieve. // // This member is required. Key *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // The version ID of the object whose legal hold status you want to retrieve. VersionId *string noSmithyDocumentSerde } func (in *GetObjectLegalHoldInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type GetObjectLegalHoldOutput struct { // The current legal hold status for the specified object. LegalHold *types.ObjectLockLegalHold // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetObjectLegalHoldMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectLegalHold{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectLegalHold{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetObjectLegalHold"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetObjectLegalHoldValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectLegalHold(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetObjectLegalHoldUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetObjectLegalHoldInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetObjectLegalHold(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetObjectLegalHold", } } // getGetObjectLegalHoldBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetObjectLegalHoldBucketMember(input interface{}) (*string, bool) { in := input.(*GetObjectLegalHoldInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetObjectLegalHoldUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetObjectLegalHoldBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectLockConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Gets the Object Lock configuration for a bucket. The rule specified in the // Object Lock configuration will be applied by default to every new object placed // in the specified bucket. For more information, see [Locking Objects]. // // The following action is related to GetObjectLockConfiguration : // // [GetObjectAttributes] // // [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html // [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html func (c *Client) GetObjectLockConfiguration(ctx context.Context, params *GetObjectLockConfigurationInput, optFns ...func(*Options)) (*GetObjectLockConfigurationOutput, error) { if params == nil { params = &GetObjectLockConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "GetObjectLockConfiguration", params, optFns, c.addOperationGetObjectLockConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*GetObjectLockConfigurationOutput) out.ResultMetadata = metadata return out, nil } type GetObjectLockConfigurationInput struct { // The bucket whose Object Lock configuration you want to retrieve. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetObjectLockConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type GetObjectLockConfigurationOutput struct { // The specified bucket's Object Lock configuration. ObjectLockConfiguration *types.ObjectLockConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetObjectLockConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectLockConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectLockConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetObjectLockConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetObjectLockConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectLockConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetObjectLockConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetObjectLockConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetObjectLockConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetObjectLockConfiguration", } } // getGetObjectLockConfigurationBucketMember returns a pointer to string denoting // a provided bucket member valueand a boolean indicating if the input has a // modeled bucket name, func getGetObjectLockConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*GetObjectLockConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetObjectLockConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetObjectLockConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectRetention.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Retrieves an object's retention settings. For more information, see [Locking Objects]. // // This functionality is not supported for Amazon S3 on Outposts. // // The following action is related to GetObjectRetention : // // [GetObjectAttributes] // // [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html // [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html func (c *Client) GetObjectRetention(ctx context.Context, params *GetObjectRetentionInput, optFns ...func(*Options)) (*GetObjectRetentionOutput, error) { if params == nil { params = &GetObjectRetentionInput{} } result, metadata, err := c.invokeOperation(ctx, "GetObjectRetention", params, optFns, c.addOperationGetObjectRetentionMiddlewares) if err != nil { return nil, err } out := result.(*GetObjectRetentionOutput) out.ResultMetadata = metadata return out, nil } type GetObjectRetentionInput struct { // The bucket name containing the object whose retention settings you want to // retrieve. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The key name for the object whose retention settings you want to retrieve. // // This member is required. Key *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // The version ID for the object whose retention settings you want to retrieve. VersionId *string noSmithyDocumentSerde } func (in *GetObjectRetentionInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type GetObjectRetentionOutput struct { // The container element for an object's retention settings. Retention *types.ObjectLockRetention // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetObjectRetentionMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectRetention{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectRetention{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetObjectRetention"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetObjectRetentionValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectRetention(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetObjectRetentionUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetObjectRetentionInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetObjectRetention(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetObjectRetention", } } // getGetObjectRetentionBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetObjectRetentionBucketMember(input interface{}) (*string, bool) { in := input.(*GetObjectRetentionInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetObjectRetentionUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetObjectRetentionBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectTagging.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns the tag-set of an object. You send the GET request against the tagging // subresource associated with the object. // // To use this operation, you must have permission to perform the // s3:GetObjectTagging action. By default, the GET action returns information about // current version of an object. For a versioned bucket, you can have multiple // versions of an object in your bucket. To retrieve tags of any other version, use // the versionId query parameter. You also need permission for the // s3:GetObjectVersionTagging action. // // By default, the bucket owner has this permission and can grant this permission // to others. // // For information about the Amazon S3 object tagging feature, see [Object Tagging]. // // The following actions are related to GetObjectTagging : // // [DeleteObjectTagging] // // [GetObjectAttributes] // // [PutObjectTagging] // // [DeleteObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html // [PutObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html // [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html // [Object Tagging]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html func (c *Client) GetObjectTagging(ctx context.Context, params *GetObjectTaggingInput, optFns ...func(*Options)) (*GetObjectTaggingOutput, error) { if params == nil { params = &GetObjectTaggingInput{} } result, metadata, err := c.invokeOperation(ctx, "GetObjectTagging", params, optFns, c.addOperationGetObjectTaggingMiddlewares) if err != nil { return nil, err } out := result.(*GetObjectTaggingOutput) out.ResultMetadata = metadata return out, nil } type GetObjectTaggingInput struct { // The bucket name containing the object for which to get the tagging information. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Object key for which to get the tagging information. // // This member is required. Key *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // The versionId of the object for which to get the tagging information. VersionId *string noSmithyDocumentSerde } func (in *GetObjectTaggingInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type GetObjectTaggingOutput struct { // Contains the tag set. // // This member is required. TagSet []types.Tag // The versionId of the object for which you got the tagging information. VersionId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetObjectTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectTagging{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectTagging{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetObjectTagging"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetObjectTaggingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectTagging(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetObjectTaggingUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetObjectTaggingInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetObjectTagging(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetObjectTagging", } } // getGetObjectTaggingBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetObjectTaggingBucketMember(input interface{}) (*string, bool) { in := input.(*GetObjectTaggingInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetObjectTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetObjectTaggingBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetObjectTorrent.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "io" ) // This operation is not supported for directory buckets. // // Returns torrent files from a bucket. BitTorrent can save you bandwidth when // you're distributing large files. // // You can get torrent only for objects that are less than 5 GB in size, and that // are not encrypted using server-side encryption with a customer-provided // encryption key. // // To use GET, you must have READ access to the object. // // This functionality is not supported for Amazon S3 on Outposts. // // The following action is related to GetObjectTorrent : // // [GetObject] // // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html func (c *Client) GetObjectTorrent(ctx context.Context, params *GetObjectTorrentInput, optFns ...func(*Options)) (*GetObjectTorrentOutput, error) { if params == nil { params = &GetObjectTorrentInput{} } result, metadata, err := c.invokeOperation(ctx, "GetObjectTorrent", params, optFns, c.addOperationGetObjectTorrentMiddlewares) if err != nil { return nil, err } out := result.(*GetObjectTorrentOutput) out.ResultMetadata = metadata return out, nil } type GetObjectTorrentInput struct { // The name of the bucket containing the object for which to get the torrent files. // // This member is required. Bucket *string // The object key for which to get the information. // // This member is required. Key *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer noSmithyDocumentSerde } func (in *GetObjectTorrentInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type GetObjectTorrentOutput struct { // A Bencoded dictionary as defined by the BitTorrent specification Body io.ReadCloser // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetObjectTorrentMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetObjectTorrent{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetObjectTorrent{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetObjectTorrent"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetObjectTorrentValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObjectTorrent(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetObjectTorrentUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetObjectTorrentInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetObjectTorrent(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetObjectTorrent", } } // getGetObjectTorrentBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getGetObjectTorrentBucketMember(input interface{}) (*string, bool) { in := input.(*GetObjectTorrentInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetObjectTorrentUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetObjectTorrentBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_GetPublicAccessBlock.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Retrieves the PublicAccessBlock configuration for an Amazon S3 bucket. To use // this operation, you must have the s3:GetBucketPublicAccessBlock permission. For // more information about Amazon S3 permissions, see [Specifying Permissions in a Policy]. // // When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or an // object, it checks the PublicAccessBlock configuration for both the bucket (or // the bucket that contains the object) and the bucket owner's account. If the // PublicAccessBlock settings are different between the bucket and the account, // Amazon S3 uses the most restrictive combination of the bucket-level and // account-level settings. // // For more information about when Amazon S3 considers a bucket or an object // public, see [The Meaning of "Public"]. // // The following operations are related to GetPublicAccessBlock : // // [Using Amazon S3 Block Public Access] // // [PutPublicAccessBlock] // // [GetPublicAccessBlock] // // [DeletePublicAccessBlock] // // [GetPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html // [PutPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html // [DeletePublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html // [Using Amazon S3 Block Public Access]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html // [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html // [The Meaning of "Public"]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status func (c *Client) GetPublicAccessBlock(ctx context.Context, params *GetPublicAccessBlockInput, optFns ...func(*Options)) (*GetPublicAccessBlockOutput, error) { if params == nil { params = &GetPublicAccessBlockInput{} } result, metadata, err := c.invokeOperation(ctx, "GetPublicAccessBlock", params, optFns, c.addOperationGetPublicAccessBlockMiddlewares) if err != nil { return nil, err } out := result.(*GetPublicAccessBlockOutput) out.ResultMetadata = metadata return out, nil } type GetPublicAccessBlockInput struct { // The name of the Amazon S3 bucket whose PublicAccessBlock configuration you want // to retrieve. // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *GetPublicAccessBlockInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type GetPublicAccessBlockOutput struct { // The PublicAccessBlock configuration currently in effect for this Amazon S3 // bucket. PublicAccessBlockConfiguration *types.PublicAccessBlockConfiguration // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationGetPublicAccessBlockMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpGetPublicAccessBlock{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpGetPublicAccessBlock{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "GetPublicAccessBlock"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpGetPublicAccessBlockValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetPublicAccessBlock(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addGetPublicAccessBlockUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *GetPublicAccessBlockInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opGetPublicAccessBlock(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "GetPublicAccessBlock", } } // getGetPublicAccessBlockBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getGetPublicAccessBlockBucketMember(input interface{}) (*string, bool) { in := input.(*GetPublicAccessBlockInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addGetPublicAccessBlockUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getGetPublicAccessBlockBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_HeadBucket.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "errors" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithytime "github.com/aws/smithy-go/time" smithyhttp "github.com/aws/smithy-go/transport/http" smithywaiter "github.com/aws/smithy-go/waiter" "time" ) // You can use this operation to determine if a bucket exists and if you have // permission to access it. The action returns a 200 OK if the bucket exists and // you have permission to access it. // // If the bucket does not exist or you do not have permission to access it, the // HEAD request returns a generic 400 Bad Request , 403 Forbidden or 404 Not Found // code. A message body is not included, so you cannot determine the exception // beyond these HTTP response codes. // // Authentication and authorization General purpose buckets - Request to public // buckets that grant the s3:ListBucket permission publicly do not need to be // signed. All other HeadBucket requests must be authenticated and signed by using // IAM credentials (access key ID and secret access key for the IAM identities). // All headers with the x-amz- prefix, including x-amz-copy-source , must be // signed. For more information, see [REST Authentication]. // // Directory buckets - You must use IAM credentials to authenticate and authorize // your access to the HeadBucket API operation, instead of using the temporary // security credentials through the CreateSession API operation. // // Amazon Web Services CLI or SDKs handles authentication and authorization on // your behalf. // // Permissions // // - General purpose bucket permissions - To use this operation, you must have // permissions to perform the s3:ListBucket action. The bucket owner has this // permission by default and can grant this permission to others. For more // information about permissions, see [Managing access permissions to your Amazon S3 resources]in the Amazon S3 User Guide. // // - Directory bucket permissions - You must have the s3express:CreateSession // permission in the Action element of a policy. By default, the session is in // the ReadWrite mode. If you want to restrict the access, you can explicitly set // the s3express:SessionMode condition key to ReadOnly on the bucket. // // For more information about example bucket policies, see [Example bucket policies for S3 Express One Zone]and [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]in the Amazon S3 // // User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // You must make requests for this API operation to the Zonal endpoint. These // endpoints support virtual-hosted-style requests in the format // https://bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style // requests are not supported. For more information about endpoints in Availability // Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information about endpoints in // Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html // [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html // [Managing access permissions to your Amazon S3 resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html func (c *Client) HeadBucket(ctx context.Context, params *HeadBucketInput, optFns ...func(*Options)) (*HeadBucketOutput, error) { if params == nil { params = &HeadBucketInput{} } result, metadata, err := c.invokeOperation(ctx, "HeadBucket", params, optFns, c.addOperationHeadBucketMiddlewares) if err != nil { return nil, err } out := result.(*HeadBucketOutput) out.ResultMetadata = metadata return out, nil } type HeadBucketInput struct { // The bucket name. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points - When you use this API operation with an Object // Lambda access point, provide the alias of the Object Lambda access point in // place of the bucket name. If the Object Lambda access point alias in a request // is not valid, the error code InvalidAccessPointAliasError is returned. For more // information about InvalidAccessPointAliasError , see [List of Error Codes]. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // [List of Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList // // This member is required. Bucket *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *HeadBucketInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type HeadBucketOutput struct { // Indicates whether the bucket name used in the request is an access point alias. // // For directory buckets, the value of this field is false . AccessPointAlias *bool // The name of the location where the bucket will be created. // // For directory buckets, the Zone ID of the Availability Zone or the Local Zone // where the bucket is created. An example Zone ID value for an Availability Zone // is usw2-az1 . // // This functionality is only supported by directory buckets. BucketLocationName *string // The type of location where the bucket is created. // // This functionality is only supported by directory buckets. BucketLocationType types.LocationType // The Region that the bucket is located. BucketRegion *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationHeadBucketMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpHeadBucket{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpHeadBucket{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "HeadBucket"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpHeadBucketValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opHeadBucket(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addHeadBucketUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // BucketExistsWaiterOptions are waiter options for BucketExistsWaiter type BucketExistsWaiterOptions struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation call to // modify this list for per operation behavior. // // Passing options here is functionally equivalent to passing values to this // config's ClientOptions field that extend the inner client's APIOptions directly. APIOptions []func(*middleware.Stack) error // Functional options to be passed to all operations invoked by this client. // // Function values that modify the inner APIOptions are applied after the waiter // config's own APIOptions modifiers. ClientOptions []func(*Options) // MinDelay is the minimum amount of time to delay between retries. If unset, // BucketExistsWaiter will use default minimum delay of 5 seconds. Note that // MinDelay must resolve to a value lesser than or equal to the MaxDelay. MinDelay time.Duration // MaxDelay is the maximum amount of time to delay between retries. If unset or // set to zero, BucketExistsWaiter will use default max delay of 120 seconds. Note // that MaxDelay must resolve to value greater than or equal to the MinDelay. MaxDelay time.Duration // LogWaitAttempts is used to enable logging for waiter retry attempts LogWaitAttempts bool // Retryable is function that can be used to override the service defined // waiter-behavior based on operation output, or returned error. This function is // used by the waiter to decide if a state is retryable or a terminal state. // // By default service-modeled logic will populate this option. This option can // thus be used to define a custom waiter state with fall-back to service-modeled // waiter state mutators.The function returns an error in case of a failure state. // In case of retry state, this function returns a bool value of true and nil // error, while in case of success it returns a bool value of false and nil error. Retryable func(context.Context, *HeadBucketInput, *HeadBucketOutput, error) (bool, error) } // BucketExistsWaiter defines the waiters for BucketExists type BucketExistsWaiter struct { client HeadBucketAPIClient options BucketExistsWaiterOptions } // NewBucketExistsWaiter constructs a BucketExistsWaiter. func NewBucketExistsWaiter(client HeadBucketAPIClient, optFns ...func(*BucketExistsWaiterOptions)) *BucketExistsWaiter { options := BucketExistsWaiterOptions{} options.MinDelay = 5 * time.Second options.MaxDelay = 120 * time.Second options.Retryable = bucketExistsStateRetryable for _, fn := range optFns { fn(&options) } return &BucketExistsWaiter{ client: client, options: options, } } // Wait calls the waiter function for BucketExists waiter. The maxWaitDur is the // maximum wait duration the waiter will wait. The maxWaitDur is required and must // be greater than zero. func (w *BucketExistsWaiter) Wait(ctx context.Context, params *HeadBucketInput, maxWaitDur time.Duration, optFns ...func(*BucketExistsWaiterOptions)) error { _, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...) return err } // WaitForOutput calls the waiter function for BucketExists waiter and returns the // output of the successful operation. The maxWaitDur is the maximum wait duration // the waiter will wait. The maxWaitDur is required and must be greater than zero. func (w *BucketExistsWaiter) WaitForOutput(ctx context.Context, params *HeadBucketInput, maxWaitDur time.Duration, optFns ...func(*BucketExistsWaiterOptions)) (*HeadBucketOutput, error) { if maxWaitDur <= 0 { return nil, fmt.Errorf("maximum wait time for waiter must be greater than zero") } options := w.options for _, fn := range optFns { fn(&options) } if options.MaxDelay <= 0 { options.MaxDelay = 120 * time.Second } if options.MinDelay > options.MaxDelay { return nil, fmt.Errorf("minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.", options.MinDelay, options.MaxDelay) } ctx, cancelFn := context.WithTimeout(ctx, maxWaitDur) defer cancelFn() logger := smithywaiter.Logger{} remainingTime := maxWaitDur var attempt int64 for { attempt++ apiOptions := options.APIOptions start := time.Now() if options.LogWaitAttempts { logger.Attempt = attempt apiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...) apiOptions = append(apiOptions, logger.AddLogger) } out, err := w.client.HeadBucket(ctx, params, func(o *Options) { baseOpts := []func(*Options){ addIsWaiterUserAgent, } o.APIOptions = append(o.APIOptions, apiOptions...) for _, opt := range baseOpts { opt(o) } for _, opt := range options.ClientOptions { opt(o) } }) retryable, err := options.Retryable(ctx, params, out, err) if err != nil { return nil, err } if !retryable { return out, nil } remainingTime -= time.Since(start) if remainingTime < options.MinDelay || remainingTime <= 0 { break } // compute exponential backoff between waiter retries delay, err := smithywaiter.ComputeDelay( attempt, options.MinDelay, options.MaxDelay, remainingTime, ) if err != nil { return nil, fmt.Errorf("error computing waiter delay, %w", err) } remainingTime -= delay // sleep for the delay amount before invoking a request if err := smithytime.SleepWithContext(ctx, delay); err != nil { return nil, fmt.Errorf("request cancelled while waiting, %w", err) } } return nil, fmt.Errorf("exceeded max wait time for BucketExists waiter") } func bucketExistsStateRetryable(ctx context.Context, input *HeadBucketInput, output *HeadBucketOutput, err error) (bool, error) { if err == nil { return false, nil } if err != nil { var errorType *types.NotFound if errors.As(err, &errorType) { return true, nil } } if err != nil { return false, err } return true, nil } // BucketNotExistsWaiterOptions are waiter options for BucketNotExistsWaiter type BucketNotExistsWaiterOptions struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation call to // modify this list for per operation behavior. // // Passing options here is functionally equivalent to passing values to this // config's ClientOptions field that extend the inner client's APIOptions directly. APIOptions []func(*middleware.Stack) error // Functional options to be passed to all operations invoked by this client. // // Function values that modify the inner APIOptions are applied after the waiter // config's own APIOptions modifiers. ClientOptions []func(*Options) // MinDelay is the minimum amount of time to delay between retries. If unset, // BucketNotExistsWaiter will use default minimum delay of 5 seconds. Note that // MinDelay must resolve to a value lesser than or equal to the MaxDelay. MinDelay time.Duration // MaxDelay is the maximum amount of time to delay between retries. If unset or // set to zero, BucketNotExistsWaiter will use default max delay of 120 seconds. // Note that MaxDelay must resolve to value greater than or equal to the MinDelay. MaxDelay time.Duration // LogWaitAttempts is used to enable logging for waiter retry attempts LogWaitAttempts bool // Retryable is function that can be used to override the service defined // waiter-behavior based on operation output, or returned error. This function is // used by the waiter to decide if a state is retryable or a terminal state. // // By default service-modeled logic will populate this option. This option can // thus be used to define a custom waiter state with fall-back to service-modeled // waiter state mutators.The function returns an error in case of a failure state. // In case of retry state, this function returns a bool value of true and nil // error, while in case of success it returns a bool value of false and nil error. Retryable func(context.Context, *HeadBucketInput, *HeadBucketOutput, error) (bool, error) } // BucketNotExistsWaiter defines the waiters for BucketNotExists type BucketNotExistsWaiter struct { client HeadBucketAPIClient options BucketNotExistsWaiterOptions } // NewBucketNotExistsWaiter constructs a BucketNotExistsWaiter. func NewBucketNotExistsWaiter(client HeadBucketAPIClient, optFns ...func(*BucketNotExistsWaiterOptions)) *BucketNotExistsWaiter { options := BucketNotExistsWaiterOptions{} options.MinDelay = 5 * time.Second options.MaxDelay = 120 * time.Second options.Retryable = bucketNotExistsStateRetryable for _, fn := range optFns { fn(&options) } return &BucketNotExistsWaiter{ client: client, options: options, } } // Wait calls the waiter function for BucketNotExists waiter. The maxWaitDur is // the maximum wait duration the waiter will wait. The maxWaitDur is required and // must be greater than zero. func (w *BucketNotExistsWaiter) Wait(ctx context.Context, params *HeadBucketInput, maxWaitDur time.Duration, optFns ...func(*BucketNotExistsWaiterOptions)) error { _, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...) return err } // WaitForOutput calls the waiter function for BucketNotExists waiter and returns // the output of the successful operation. The maxWaitDur is the maximum wait // duration the waiter will wait. The maxWaitDur is required and must be greater // than zero. func (w *BucketNotExistsWaiter) WaitForOutput(ctx context.Context, params *HeadBucketInput, maxWaitDur time.Duration, optFns ...func(*BucketNotExistsWaiterOptions)) (*HeadBucketOutput, error) { if maxWaitDur <= 0 { return nil, fmt.Errorf("maximum wait time for waiter must be greater than zero") } options := w.options for _, fn := range optFns { fn(&options) } if options.MaxDelay <= 0 { options.MaxDelay = 120 * time.Second } if options.MinDelay > options.MaxDelay { return nil, fmt.Errorf("minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.", options.MinDelay, options.MaxDelay) } ctx, cancelFn := context.WithTimeout(ctx, maxWaitDur) defer cancelFn() logger := smithywaiter.Logger{} remainingTime := maxWaitDur var attempt int64 for { attempt++ apiOptions := options.APIOptions start := time.Now() if options.LogWaitAttempts { logger.Attempt = attempt apiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...) apiOptions = append(apiOptions, logger.AddLogger) } out, err := w.client.HeadBucket(ctx, params, func(o *Options) { baseOpts := []func(*Options){ addIsWaiterUserAgent, } o.APIOptions = append(o.APIOptions, apiOptions...) for _, opt := range baseOpts { opt(o) } for _, opt := range options.ClientOptions { opt(o) } }) retryable, err := options.Retryable(ctx, params, out, err) if err != nil { return nil, err } if !retryable { return out, nil } remainingTime -= time.Since(start) if remainingTime < options.MinDelay || remainingTime <= 0 { break } // compute exponential backoff between waiter retries delay, err := smithywaiter.ComputeDelay( attempt, options.MinDelay, options.MaxDelay, remainingTime, ) if err != nil { return nil, fmt.Errorf("error computing waiter delay, %w", err) } remainingTime -= delay // sleep for the delay amount before invoking a request if err := smithytime.SleepWithContext(ctx, delay); err != nil { return nil, fmt.Errorf("request cancelled while waiting, %w", err) } } return nil, fmt.Errorf("exceeded max wait time for BucketNotExists waiter") } func bucketNotExistsStateRetryable(ctx context.Context, input *HeadBucketInput, output *HeadBucketOutput, err error) (bool, error) { if err != nil { var errorType *types.NotFound if errors.As(err, &errorType) { return false, nil } } if err != nil { return false, err } return true, nil } func (v *HeadBucketInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } // HeadBucketAPIClient is a client that implements the HeadBucket operation. type HeadBucketAPIClient interface { HeadBucket(context.Context, *HeadBucketInput, ...func(*Options)) (*HeadBucketOutput, error) } var _ HeadBucketAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opHeadBucket(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "HeadBucket", } } // getHeadBucketBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getHeadBucketBucketMember(input interface{}) (*string, bool) { in := input.(*HeadBucketInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addHeadBucketUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getHeadBucketBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } // PresignHeadBucket is used to generate a presigned HTTP Request which contains // presigned URL, signed headers and HTTP method used. func (c *PresignClient) PresignHeadBucket(ctx context.Context, params *HeadBucketInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) { if params == nil { params = &HeadBucketInput{} } options := c.options.copy() for _, fn := range optFns { fn(&options) } clientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption) result, _, err := c.client.invokeOperation(ctx, "HeadBucket", params, clientOptFns, c.client.addOperationHeadBucketMiddlewares, presignConverter(options).convertToPresignMiddleware, addHeadBucketPayloadAsUnsigned, ) if err != nil { return nil, err } out := result.(*v4.PresignedHTTPRequest) return out, nil } func addHeadBucketPayloadAsUnsigned(stack *middleware.Stack, options Options) error { v4.RemoveContentSHA256HeaderMiddleware(stack) v4.RemoveComputePayloadSHA256Middleware(stack) return v4.AddUnsignedPayloadMiddleware(stack) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_HeadObject.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "errors" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithytime "github.com/aws/smithy-go/time" smithyhttp "github.com/aws/smithy-go/transport/http" smithywaiter "github.com/aws/smithy-go/waiter" "time" ) // The HEAD operation retrieves metadata from an object without returning the // object itself. This operation is useful if you're interested only in an object's // metadata. // // A HEAD request has the same options as a GET operation on an object. The // response is identical to the GET response except that there is no response // body. Because of this, if the HEAD request generates an error, it returns a // generic code, such as 400 Bad Request , 403 Forbidden , 404 Not Found , 405 // Method Not Allowed , 412 Precondition Failed , or 304 Not Modified . It's not // possible to retrieve the exact exception of these error codes. // // Request headers are limited to 8 KB in size. For more information, see [Common Request Headers]. // // Permissions // // - General purpose bucket permissions - To use HEAD , you must have the // s3:GetObject permission. You need the relevant read object (or version) // permission for this operation. For more information, see [Actions, resources, and condition keys for Amazon S3]in the Amazon S3 // User Guide. For more information about the permissions to S3 API operations by // S3 resource types, see Required permissions for Amazon S3 API operationsin the Amazon S3 User Guide. // // If the object you request doesn't exist, the error that Amazon S3 returns // // depends on whether you also have the s3:ListBucket permission. // // - If you have the s3:ListBucket permission on the bucket, Amazon S3 returns an // HTTP status code 404 Not Found error. // // - If you don’t have the s3:ListBucket permission, Amazon S3 returns an HTTP // status code 403 Forbidden error. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // If you enable x-amz-checksum-mode in the request and the object is encrypted // // with Amazon Web Services Key Management Service (Amazon Web Services KMS), you // must also have the kms:GenerateDataKey and kms:Decrypt permissions in IAM // identity-based policies and KMS key policies for the KMS key to retrieve the // checksum of the object. // // Encryption Encryption request headers, like x-amz-server-side-encryption , // should not be sent for HEAD requests if your object uses server-side encryption // with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side // encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side // encryption with Amazon S3 managed encryption keys (SSE-S3). The // x-amz-server-side-encryption header is used when you PUT an object to S3 and // want to specify the encryption method. If you include this header in a HEAD // request for an object that uses these types of keys, you’ll get an HTTP 400 Bad // Request error. It's because the encryption method can't be changed when you // retrieve the object. // // If you encrypt an object by using server-side encryption with customer-provided // encryption keys (SSE-C) when you store the object in Amazon S3, then when you // retrieve the metadata from the object, you must use the following headers to // provide the encryption key for the server to be able to retrieve the object's // metadata. The headers are: // // - x-amz-server-side-encryption-customer-algorithm // // - x-amz-server-side-encryption-customer-key // // - x-amz-server-side-encryption-customer-key-MD5 // // For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)] in the Amazon S3 User Guide. // // Directory bucket - For directory buckets, there are only two supported options // for server-side encryption: SSE-S3 and SSE-KMS. SSE-C isn't supported. For more // information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. // // Versioning // // - If the current version of the object is a delete marker, Amazon S3 behaves // as if the object was deleted and includes x-amz-delete-marker: true in the // response. // // - If the specified version is a delete marker, the response returns a 405 // Method Not Allowed error and the Last-Modified: timestamp response header. // // - Directory buckets - Delete marker is not supported for directory buckets. // // - Directory buckets - S3 Versioning isn't enabled and supported for directory // buckets. For this API operation, only the null value of the version ID is // supported by directory buckets. You can only specify null to the versionId // query parameter in the request. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // For directory buckets, you must make requests for this API operation to the // Zonal endpoint. These endpoints support virtual-hosted-style requests in the // format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // The following actions are related to HeadObject : // // [GetObject] // // [GetObjectAttributes] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html // [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html // [Actions, resources, and condition keys for Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/list_amazons3.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [Common Request Headers]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html func (c *Client) HeadObject(ctx context.Context, params *HeadObjectInput, optFns ...func(*Options)) (*HeadObjectOutput, error) { if params == nil { params = &HeadObjectInput{} } result, metadata, err := c.invokeOperation(ctx, "HeadObject", params, optFns, c.addOperationHeadObjectMiddlewares) if err != nil { return nil, err } out := result.(*HeadObjectOutput) out.ResultMetadata = metadata return out, nil } type HeadObjectInput struct { // The name of the bucket that contains the object. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The object key. // // This member is required. Key *string // To retrieve the checksum, this parameter must be enabled. // // General purpose buckets - If you enable checksum mode and the object is // uploaded with a [checksum]and encrypted with an Key Management Service (KMS) key, you // must have permission to use the kms:Decrypt action to retrieve the checksum. // // Directory buckets - If you enable ChecksumMode and the object is encrypted with // Amazon Web Services Key Management Service (Amazon Web Services KMS), you must // also have the kms:GenerateDataKey and kms:Decrypt permissions in IAM // identity-based policies and KMS key policies for the KMS key to retrieve the // checksum of the object. // // [checksum]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_Checksum.html ChecksumMode types.ChecksumMode // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Return the object only if its entity tag (ETag) is the same as the one // specified; otherwise, return a 412 (precondition failed) error. // // If both of the If-Match and If-Unmodified-Since headers are present in the // request as follows: // // - If-Match condition evaluates to true , and; // // - If-Unmodified-Since condition evaluates to false ; // // Then Amazon S3 returns 200 OK and the data requested. // // For more information about conditional requests, see [RFC 7232]. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfMatch *string // Return the object only if it has been modified since the specified time; // otherwise, return a 304 (not modified) error. // // If both of the If-None-Match and If-Modified-Since headers are present in the // request as follows: // // - If-None-Match condition evaluates to false , and; // // - If-Modified-Since condition evaluates to true ; // // Then Amazon S3 returns the 304 Not Modified response code. // // For more information about conditional requests, see [RFC 7232]. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfModifiedSince *time.Time // Return the object only if its entity tag (ETag) is different from the one // specified; otherwise, return a 304 (not modified) error. // // If both of the If-None-Match and If-Modified-Since headers are present in the // request as follows: // // - If-None-Match condition evaluates to false , and; // // - If-Modified-Since condition evaluates to true ; // // Then Amazon S3 returns the 304 Not Modified response code. // // For more information about conditional requests, see [RFC 7232]. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfNoneMatch *string // Return the object only if it has not been modified since the specified time; // otherwise, return a 412 (precondition failed) error. // // If both of the If-Match and If-Unmodified-Since headers are present in the // request as follows: // // - If-Match condition evaluates to true , and; // // - If-Unmodified-Since condition evaluates to false ; // // Then Amazon S3 returns 200 OK and the data requested. // // For more information about conditional requests, see [RFC 7232]. // // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfUnmodifiedSince *time.Time // Part number of the object being read. This is a positive integer between 1 and // 10,000. Effectively performs a 'ranged' HEAD request for the part specified. // Useful querying about the size of the part and the number of parts in this // object. PartNumber *int32 // HeadObject returns only the metadata for an object. If the Range is // satisfiable, only the ContentLength is affected in the response. If the Range // is not satisfiable, S3 returns a 416 - Requested Range Not Satisfiable error. Range *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Sets the Cache-Control header of the response. ResponseCacheControl *string // Sets the Content-Disposition header of the response. ResponseContentDisposition *string // Sets the Content-Encoding header of the response. ResponseContentEncoding *string // Sets the Content-Language header of the response. ResponseContentLanguage *string // Sets the Content-Type header of the response. ResponseContentType *string // Sets the Expires header of the response. ResponseExpires *time.Time // Specifies the algorithm to use when encrypting the object (for example, AES256). // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use in // encrypting data. This value is used to store the object and then it is // discarded; Amazon S3 does not store the encryption key. The key must be // appropriate for use with the algorithm specified in the // x-amz-server-side-encryption-customer-algorithm header. // // This functionality is not supported for directory buckets. SSECustomerKey *string // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. // Amazon S3 uses this header for a message integrity check to ensure that the // encryption key was transmitted without error. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // Version ID used to reference a specific version of the object. // // For directory buckets in this API operation, only the null value of the version // ID is supported. VersionId *string noSmithyDocumentSerde } func (in *HeadObjectInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type HeadObjectOutput struct { // Indicates that a range of bytes was specified. AcceptRanges *string // The archive state of the head object. // // This functionality is not supported for directory buckets. ArchiveStatus types.ArchiveStatus // Indicates whether the object uses an S3 Bucket Key for server-side encryption // with Key Management Service (KMS) keys (SSE-KMS). BucketKeyEnabled *bool // Specifies caching behavior along the request/reply chain. CacheControl *string // The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only // be present if the checksum was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumCRC32 *string // The Base64 encoded, 32-bit CRC32C checksum of the object. This checksum is only // present if the checksum was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumCRC32C *string // The Base64 encoded, 64-bit CRC64NVME checksum of the object. For more // information, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC64NVME *string // The Base64 encoded, 160-bit SHA1 digest of the object. This will only be // present if the object was uploaded with the object. When you use the API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumSHA1 *string // The Base64 encoded, 256-bit SHA256 digest of the object. This will only be // present if the object was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumSHA256 *string // The checksum type, which determines how part-level checksums are combined to // create an object-level checksum for multipart objects. You can use this header // response to verify that the checksum type that is received is the same checksum // type that was specified in CreateMultipartUpload request. For more information, // see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumType types.ChecksumType // Specifies presentational information for the object. ContentDisposition *string // Indicates what content encodings have been applied to the object and thus what // decoding mechanisms must be applied to obtain the media-type referenced by the // Content-Type header field. ContentEncoding *string // The language the content is in. ContentLanguage *string // Size of the body in bytes. ContentLength *int64 // The portion of the object returned in the response for a GET request. ContentRange *string // A standard MIME type describing the format of the object data. ContentType *string // Specifies whether the object retrieved was (true) or was not (false) a Delete // Marker. If false, this response header does not appear in the response. // // This functionality is not supported for directory buckets. DeleteMarker *bool // An entity tag (ETag) is an opaque identifier assigned by a web server to a // specific version of a resource found at a URL. ETag *string // If the object expiration is configured (see [PutBucketLifecycleConfiguration]PutBucketLifecycleConfiguration ), // the response includes this header. It includes the expiry-date and rule-id // key-value pairs providing object expiration information. The value of the // rule-id is URL-encoded. // // Object expiration information is not returned in directory buckets and this // header returns the value " NotImplemented " in all responses for directory // buckets. // // [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html Expiration *string // The date and time at which the object is no longer cacheable. // // Deprecated: This field is handled inconsistently across AWS SDKs. Prefer using // the ExpiresString field which contains the unparsed value from the service // response. Expires *time.Time // The unparsed value of the Expires field from the service response. Prefer use // of this value over the normal Expires response field where possible. ExpiresString *string // Date and time when the object was last modified. LastModified *time.Time // A map of metadata to store with the object in S3. // // Map keys will be normalized to lower-case. Metadata map[string]string // This is set to the number of metadata entries not returned in x-amz-meta // headers. This can happen if you create metadata using an API like SOAP that // supports more flexible metadata than the REST API. For example, using SOAP, you // can create metadata whose values are not legal HTTP headers. // // This functionality is not supported for directory buckets. MissingMeta *int32 // Specifies whether a legal hold is in effect for this object. This header is // only returned if the requester has the s3:GetObjectLegalHold permission. This // header is not returned if the specified version of this object has never had a // legal hold applied. For more information about S3 Object Lock, see [Object Lock]. // // This functionality is not supported for directory buckets. // // [Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html ObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus // The Object Lock mode, if any, that's in effect for this object. This header is // only returned if the requester has the s3:GetObjectRetention permission. For // more information about S3 Object Lock, see [Object Lock]. // // This functionality is not supported for directory buckets. // // [Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html ObjectLockMode types.ObjectLockMode // The date and time when the Object Lock retention period expires. This header is // only returned if the requester has the s3:GetObjectRetention permission. // // This functionality is not supported for directory buckets. ObjectLockRetainUntilDate *time.Time // The count of parts this object has. This value is only returned if you specify // partNumber in your request and the object was uploaded as a multipart upload. PartsCount *int32 // Amazon S3 can return this header if your request involves a bucket that is // either a source or a destination in a replication rule. // // In replication, you have a source bucket on which you configure replication and // destination bucket or buckets where Amazon S3 stores object replicas. When you // request an object ( GetObject ) or object metadata ( HeadObject ) from these // buckets, Amazon S3 will return the x-amz-replication-status header in the // response as follows: // // - If requesting an object from the source bucket, Amazon S3 will return the // x-amz-replication-status header if the object in your request is eligible for // replication. // // For example, suppose that in your replication configuration, you specify object // prefix TaxDocs requesting Amazon S3 to replicate objects with key prefix // TaxDocs . Any objects you upload with this key name prefix, for example // TaxDocs/document1.pdf , are eligible for replication. For any object request // with this key name prefix, Amazon S3 will return the x-amz-replication-status // header with value PENDING, COMPLETED or FAILED indicating object replication // status. // // - If requesting an object from a destination bucket, Amazon S3 will return // the x-amz-replication-status header with value REPLICA if the object in your // request is a replica that Amazon S3 created and there is no replica modification // replication in progress. // // - When replicating objects to multiple destination buckets, the // x-amz-replication-status header acts differently. The header of the source // object will only return a value of COMPLETED when replication is successful to // all destinations. The header will remain at value PENDING until replication has // completed for all destinations. If one or more destinations fails replication // the header will return FAILED. // // For more information, see [Replication]. // // This functionality is not supported for directory buckets. // // [Replication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html ReplicationStatus types.ReplicationStatus // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // If the object is an archived object (an object whose storage class is GLACIER), // the response includes this header if either the archive restoration is in // progress (see [RestoreObject]or an archive copy is already restored. // // If an archive copy is already restored, the header value indicates when Amazon // S3 is scheduled to delete the object copy. For example: // // x-amz-restore: ongoing-request="false", expiry-date="Fri, 21 Dec 2012 00:00:00 // GMT" // // If the object restoration is in progress, the header returns the value // ongoing-request="true" . // // For more information about archiving objects, see [Transitioning Objects: General Considerations]. // // This functionality is not supported for directory buckets. Directory buckets // only support EXPRESS_ONEZONE (the S3 Express One Zone storage class) in // Availability Zones and ONEZONE_IA (the S3 One Zone-Infrequent Access storage // class) in Dedicated Local Zones. // // [Transitioning Objects: General Considerations]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html#lifecycle-transition-general-considerations // [RestoreObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html Restore *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to confirm the encryption // algorithm that's used. // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to provide the round-trip // message integrity verification of the customer-provided encryption key. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // If present, indicates the ID of the KMS key that was used for object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when you store this object in Amazon // S3 (for example, AES256 , aws:kms , aws:kms:dsse ). ServerSideEncryption types.ServerSideEncryption // Provides storage class information of the object. Amazon S3 returns this header // for all objects except for S3 Standard storage class objects. // // For more information, see [Storage Classes]. // // Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3 // Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3 // One Zone-Infrequent Access storage class) in Dedicated Local Zones. // // [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html StorageClass types.StorageClass // Version ID of the object. // // This functionality is not supported for directory buckets. VersionId *string // If the bucket is configured as a website, redirects requests for this object to // another object in the same bucket or to an external URL. Amazon S3 stores the // value of this header in the object metadata. // // This functionality is not supported for directory buckets. WebsiteRedirectLocation *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationHeadObjectMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpHeadObject{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpHeadObject{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "HeadObject"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpHeadObjectValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opHeadObject(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addHeadObjectUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // ObjectExistsWaiterOptions are waiter options for ObjectExistsWaiter type ObjectExistsWaiterOptions struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation call to // modify this list for per operation behavior. // // Passing options here is functionally equivalent to passing values to this // config's ClientOptions field that extend the inner client's APIOptions directly. APIOptions []func(*middleware.Stack) error // Functional options to be passed to all operations invoked by this client. // // Function values that modify the inner APIOptions are applied after the waiter // config's own APIOptions modifiers. ClientOptions []func(*Options) // MinDelay is the minimum amount of time to delay between retries. If unset, // ObjectExistsWaiter will use default minimum delay of 5 seconds. Note that // MinDelay must resolve to a value lesser than or equal to the MaxDelay. MinDelay time.Duration // MaxDelay is the maximum amount of time to delay between retries. If unset or // set to zero, ObjectExistsWaiter will use default max delay of 120 seconds. Note // that MaxDelay must resolve to value greater than or equal to the MinDelay. MaxDelay time.Duration // LogWaitAttempts is used to enable logging for waiter retry attempts LogWaitAttempts bool // Retryable is function that can be used to override the service defined // waiter-behavior based on operation output, or returned error. This function is // used by the waiter to decide if a state is retryable or a terminal state. // // By default service-modeled logic will populate this option. This option can // thus be used to define a custom waiter state with fall-back to service-modeled // waiter state mutators.The function returns an error in case of a failure state. // In case of retry state, this function returns a bool value of true and nil // error, while in case of success it returns a bool value of false and nil error. Retryable func(context.Context, *HeadObjectInput, *HeadObjectOutput, error) (bool, error) } // ObjectExistsWaiter defines the waiters for ObjectExists type ObjectExistsWaiter struct { client HeadObjectAPIClient options ObjectExistsWaiterOptions } // NewObjectExistsWaiter constructs a ObjectExistsWaiter. func NewObjectExistsWaiter(client HeadObjectAPIClient, optFns ...func(*ObjectExistsWaiterOptions)) *ObjectExistsWaiter { options := ObjectExistsWaiterOptions{} options.MinDelay = 5 * time.Second options.MaxDelay = 120 * time.Second options.Retryable = objectExistsStateRetryable for _, fn := range optFns { fn(&options) } return &ObjectExistsWaiter{ client: client, options: options, } } // Wait calls the waiter function for ObjectExists waiter. The maxWaitDur is the // maximum wait duration the waiter will wait. The maxWaitDur is required and must // be greater than zero. func (w *ObjectExistsWaiter) Wait(ctx context.Context, params *HeadObjectInput, maxWaitDur time.Duration, optFns ...func(*ObjectExistsWaiterOptions)) error { _, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...) return err } // WaitForOutput calls the waiter function for ObjectExists waiter and returns the // output of the successful operation. The maxWaitDur is the maximum wait duration // the waiter will wait. The maxWaitDur is required and must be greater than zero. func (w *ObjectExistsWaiter) WaitForOutput(ctx context.Context, params *HeadObjectInput, maxWaitDur time.Duration, optFns ...func(*ObjectExistsWaiterOptions)) (*HeadObjectOutput, error) { if maxWaitDur <= 0 { return nil, fmt.Errorf("maximum wait time for waiter must be greater than zero") } options := w.options for _, fn := range optFns { fn(&options) } if options.MaxDelay <= 0 { options.MaxDelay = 120 * time.Second } if options.MinDelay > options.MaxDelay { return nil, fmt.Errorf("minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.", options.MinDelay, options.MaxDelay) } ctx, cancelFn := context.WithTimeout(ctx, maxWaitDur) defer cancelFn() logger := smithywaiter.Logger{} remainingTime := maxWaitDur var attempt int64 for { attempt++ apiOptions := options.APIOptions start := time.Now() if options.LogWaitAttempts { logger.Attempt = attempt apiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...) apiOptions = append(apiOptions, logger.AddLogger) } out, err := w.client.HeadObject(ctx, params, func(o *Options) { baseOpts := []func(*Options){ addIsWaiterUserAgent, } o.APIOptions = append(o.APIOptions, apiOptions...) for _, opt := range baseOpts { opt(o) } for _, opt := range options.ClientOptions { opt(o) } }) retryable, err := options.Retryable(ctx, params, out, err) if err != nil { return nil, err } if !retryable { return out, nil } remainingTime -= time.Since(start) if remainingTime < options.MinDelay || remainingTime <= 0 { break } // compute exponential backoff between waiter retries delay, err := smithywaiter.ComputeDelay( attempt, options.MinDelay, options.MaxDelay, remainingTime, ) if err != nil { return nil, fmt.Errorf("error computing waiter delay, %w", err) } remainingTime -= delay // sleep for the delay amount before invoking a request if err := smithytime.SleepWithContext(ctx, delay); err != nil { return nil, fmt.Errorf("request cancelled while waiting, %w", err) } } return nil, fmt.Errorf("exceeded max wait time for ObjectExists waiter") } func objectExistsStateRetryable(ctx context.Context, input *HeadObjectInput, output *HeadObjectOutput, err error) (bool, error) { if err == nil { return false, nil } if err != nil { var errorType *types.NotFound if errors.As(err, &errorType) { return true, nil } } if err != nil { return false, err } return true, nil } // ObjectNotExistsWaiterOptions are waiter options for ObjectNotExistsWaiter type ObjectNotExistsWaiterOptions struct { // Set of options to modify how an operation is invoked. These apply to all // operations invoked for this client. Use functional options on operation call to // modify this list for per operation behavior. // // Passing options here is functionally equivalent to passing values to this // config's ClientOptions field that extend the inner client's APIOptions directly. APIOptions []func(*middleware.Stack) error // Functional options to be passed to all operations invoked by this client. // // Function values that modify the inner APIOptions are applied after the waiter // config's own APIOptions modifiers. ClientOptions []func(*Options) // MinDelay is the minimum amount of time to delay between retries. If unset, // ObjectNotExistsWaiter will use default minimum delay of 5 seconds. Note that // MinDelay must resolve to a value lesser than or equal to the MaxDelay. MinDelay time.Duration // MaxDelay is the maximum amount of time to delay between retries. If unset or // set to zero, ObjectNotExistsWaiter will use default max delay of 120 seconds. // Note that MaxDelay must resolve to value greater than or equal to the MinDelay. MaxDelay time.Duration // LogWaitAttempts is used to enable logging for waiter retry attempts LogWaitAttempts bool // Retryable is function that can be used to override the service defined // waiter-behavior based on operation output, or returned error. This function is // used by the waiter to decide if a state is retryable or a terminal state. // // By default service-modeled logic will populate this option. This option can // thus be used to define a custom waiter state with fall-back to service-modeled // waiter state mutators.The function returns an error in case of a failure state. // In case of retry state, this function returns a bool value of true and nil // error, while in case of success it returns a bool value of false and nil error. Retryable func(context.Context, *HeadObjectInput, *HeadObjectOutput, error) (bool, error) } // ObjectNotExistsWaiter defines the waiters for ObjectNotExists type ObjectNotExistsWaiter struct { client HeadObjectAPIClient options ObjectNotExistsWaiterOptions } // NewObjectNotExistsWaiter constructs a ObjectNotExistsWaiter. func NewObjectNotExistsWaiter(client HeadObjectAPIClient, optFns ...func(*ObjectNotExistsWaiterOptions)) *ObjectNotExistsWaiter { options := ObjectNotExistsWaiterOptions{} options.MinDelay = 5 * time.Second options.MaxDelay = 120 * time.Second options.Retryable = objectNotExistsStateRetryable for _, fn := range optFns { fn(&options) } return &ObjectNotExistsWaiter{ client: client, options: options, } } // Wait calls the waiter function for ObjectNotExists waiter. The maxWaitDur is // the maximum wait duration the waiter will wait. The maxWaitDur is required and // must be greater than zero. func (w *ObjectNotExistsWaiter) Wait(ctx context.Context, params *HeadObjectInput, maxWaitDur time.Duration, optFns ...func(*ObjectNotExistsWaiterOptions)) error { _, err := w.WaitForOutput(ctx, params, maxWaitDur, optFns...) return err } // WaitForOutput calls the waiter function for ObjectNotExists waiter and returns // the output of the successful operation. The maxWaitDur is the maximum wait // duration the waiter will wait. The maxWaitDur is required and must be greater // than zero. func (w *ObjectNotExistsWaiter) WaitForOutput(ctx context.Context, params *HeadObjectInput, maxWaitDur time.Duration, optFns ...func(*ObjectNotExistsWaiterOptions)) (*HeadObjectOutput, error) { if maxWaitDur <= 0 { return nil, fmt.Errorf("maximum wait time for waiter must be greater than zero") } options := w.options for _, fn := range optFns { fn(&options) } if options.MaxDelay <= 0 { options.MaxDelay = 120 * time.Second } if options.MinDelay > options.MaxDelay { return nil, fmt.Errorf("minimum waiter delay %v must be lesser than or equal to maximum waiter delay of %v.", options.MinDelay, options.MaxDelay) } ctx, cancelFn := context.WithTimeout(ctx, maxWaitDur) defer cancelFn() logger := smithywaiter.Logger{} remainingTime := maxWaitDur var attempt int64 for { attempt++ apiOptions := options.APIOptions start := time.Now() if options.LogWaitAttempts { logger.Attempt = attempt apiOptions = append([]func(*middleware.Stack) error{}, options.APIOptions...) apiOptions = append(apiOptions, logger.AddLogger) } out, err := w.client.HeadObject(ctx, params, func(o *Options) { baseOpts := []func(*Options){ addIsWaiterUserAgent, } o.APIOptions = append(o.APIOptions, apiOptions...) for _, opt := range baseOpts { opt(o) } for _, opt := range options.ClientOptions { opt(o) } }) retryable, err := options.Retryable(ctx, params, out, err) if err != nil { return nil, err } if !retryable { return out, nil } remainingTime -= time.Since(start) if remainingTime < options.MinDelay || remainingTime <= 0 { break } // compute exponential backoff between waiter retries delay, err := smithywaiter.ComputeDelay( attempt, options.MinDelay, options.MaxDelay, remainingTime, ) if err != nil { return nil, fmt.Errorf("error computing waiter delay, %w", err) } remainingTime -= delay // sleep for the delay amount before invoking a request if err := smithytime.SleepWithContext(ctx, delay); err != nil { return nil, fmt.Errorf("request cancelled while waiting, %w", err) } } return nil, fmt.Errorf("exceeded max wait time for ObjectNotExists waiter") } func objectNotExistsStateRetryable(ctx context.Context, input *HeadObjectInput, output *HeadObjectOutput, err error) (bool, error) { if err != nil { var errorType *types.NotFound if errors.As(err, &errorType) { return false, nil } } if err != nil { return false, err } return true, nil } func (v *HeadObjectInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } // HeadObjectAPIClient is a client that implements the HeadObject operation. type HeadObjectAPIClient interface { HeadObject(context.Context, *HeadObjectInput, ...func(*Options)) (*HeadObjectOutput, error) } var _ HeadObjectAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opHeadObject(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "HeadObject", } } // getHeadObjectBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getHeadObjectBucketMember(input interface{}) (*string, bool) { in := input.(*HeadObjectInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addHeadObjectUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getHeadObjectBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } // PresignHeadObject is used to generate a presigned HTTP Request which contains // presigned URL, signed headers and HTTP method used. func (c *PresignClient) PresignHeadObject(ctx context.Context, params *HeadObjectInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) { if params == nil { params = &HeadObjectInput{} } options := c.options.copy() for _, fn := range optFns { fn(&options) } clientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption) result, _, err := c.client.invokeOperation(ctx, "HeadObject", params, clientOptFns, c.client.addOperationHeadObjectMiddlewares, presignConverter(options).convertToPresignMiddleware, addHeadObjectPayloadAsUnsigned, ) if err != nil { return nil, err } out := result.(*v4.PresignedHTTPRequest) return out, nil } func addHeadObjectPayloadAsUnsigned(stack *middleware.Stack, options Options) error { v4.RemoveContentSHA256HeaderMiddleware(stack) v4.RemoveComputePayloadSHA256Middleware(stack) return v4.AddUnsignedPayloadMiddleware(stack) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBucketAnalyticsConfigurations.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Lists the analytics configurations for the bucket. You can have up to 1,000 // analytics configurations per bucket. // // This action supports list pagination and does not return more than 100 // configurations at a time. You should always check the IsTruncated element in // the response. If there are no more configurations to list, IsTruncated is set // to false. If there are more configurations to list, IsTruncated is set to true, // and there will be a value in NextContinuationToken . You use the // NextContinuationToken value to continue the pagination of the list by passing // the value in continuation-token in the request to GET the next page. // // To use this operation, you must have permissions to perform the // s3:GetAnalyticsConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For information about Amazon S3 analytics feature, see [Amazon S3 Analytics – Storage Class Analysis]. // // The following operations are related to ListBucketAnalyticsConfigurations : // // [GetBucketAnalyticsConfiguration] // // [DeleteBucketAnalyticsConfiguration] // // [PutBucketAnalyticsConfiguration] // // [Amazon S3 Analytics – Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html // [DeleteBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [GetBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html // [PutBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) ListBucketAnalyticsConfigurations(ctx context.Context, params *ListBucketAnalyticsConfigurationsInput, optFns ...func(*Options)) (*ListBucketAnalyticsConfigurationsOutput, error) { if params == nil { params = &ListBucketAnalyticsConfigurationsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListBucketAnalyticsConfigurations", params, optFns, c.addOperationListBucketAnalyticsConfigurationsMiddlewares) if err != nil { return nil, err } out := result.(*ListBucketAnalyticsConfigurationsOutput) out.ResultMetadata = metadata return out, nil } type ListBucketAnalyticsConfigurationsInput struct { // The name of the bucket from which analytics configurations are retrieved. // // This member is required. Bucket *string // The ContinuationToken that represents a placeholder from where this request // should begin. ContinuationToken *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *ListBucketAnalyticsConfigurationsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type ListBucketAnalyticsConfigurationsOutput struct { // The list of analytics configurations for a bucket. AnalyticsConfigurationList []types.AnalyticsConfiguration // The marker that is used as a starting point for this analytics configuration // list response. This value is present if it was sent in the request. ContinuationToken *string // Indicates whether the returned list of analytics configurations is complete. A // value of true indicates that the list is not complete and the // NextContinuationToken will be provided for a subsequent request. IsTruncated *bool // NextContinuationToken is sent when isTruncated is true, which indicates that // there are more analytics configurations to list. The next request must include // this NextContinuationToken . The token is obfuscated and is not a usable value. NextContinuationToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListBucketAnalyticsConfigurationsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListBucketAnalyticsConfigurations{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListBucketAnalyticsConfigurations{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListBucketAnalyticsConfigurations"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListBucketAnalyticsConfigurationsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBucketAnalyticsConfigurations(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListBucketAnalyticsConfigurationsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *ListBucketAnalyticsConfigurationsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opListBucketAnalyticsConfigurations(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListBucketAnalyticsConfigurations", } } // getListBucketAnalyticsConfigurationsBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getListBucketAnalyticsConfigurationsBucketMember(input interface{}) (*string, bool) { in := input.(*ListBucketAnalyticsConfigurationsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListBucketAnalyticsConfigurationsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListBucketAnalyticsConfigurationsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBucketIntelligentTieringConfigurations.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Lists the S3 Intelligent-Tiering configuration from the specified bucket. // // The S3 Intelligent-Tiering storage class is designed to optimize storage costs // by automatically moving data to the most cost-effective storage access tier, // without performance impact or operational overhead. S3 Intelligent-Tiering // delivers automatic cost savings in three low latency and high throughput access // tiers. To get the lowest storage cost on data that can be accessed in minutes to // hours, you can choose to activate additional archiving capabilities. // // The S3 Intelligent-Tiering storage class is the ideal storage class for data // with unknown, changing, or unpredictable access patterns, independent of object // size or retention period. If the size of an object is less than 128 KB, it is // not monitored and not eligible for auto-tiering. Smaller objects can be stored, // but they are always charged at the Frequent Access tier rates in the S3 // Intelligent-Tiering storage class. // // For more information, see [Storage class for automatically optimizing frequently and infrequently accessed objects]. // // Operations related to ListBucketIntelligentTieringConfigurations include: // // [DeleteBucketIntelligentTieringConfiguration] // // [PutBucketIntelligentTieringConfiguration] // // [GetBucketIntelligentTieringConfiguration] // // [GetBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html // [PutBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html // [Storage class for automatically optimizing frequently and infrequently accessed objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access // [DeleteBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html func (c *Client) ListBucketIntelligentTieringConfigurations(ctx context.Context, params *ListBucketIntelligentTieringConfigurationsInput, optFns ...func(*Options)) (*ListBucketIntelligentTieringConfigurationsOutput, error) { if params == nil { params = &ListBucketIntelligentTieringConfigurationsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListBucketIntelligentTieringConfigurations", params, optFns, c.addOperationListBucketIntelligentTieringConfigurationsMiddlewares) if err != nil { return nil, err } out := result.(*ListBucketIntelligentTieringConfigurationsOutput) out.ResultMetadata = metadata return out, nil } type ListBucketIntelligentTieringConfigurationsInput struct { // The name of the Amazon S3 bucket whose configuration you want to modify or // retrieve. // // This member is required. Bucket *string // The ContinuationToken that represents a placeholder from where this request // should begin. ContinuationToken *string noSmithyDocumentSerde } func (in *ListBucketIntelligentTieringConfigurationsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type ListBucketIntelligentTieringConfigurationsOutput struct { // The ContinuationToken that represents a placeholder from where this request // should begin. ContinuationToken *string // The list of S3 Intelligent-Tiering configurations for a bucket. IntelligentTieringConfigurationList []types.IntelligentTieringConfiguration // Indicates whether the returned list of analytics configurations is complete. A // value of true indicates that the list is not complete and the // NextContinuationToken will be provided for a subsequent request. IsTruncated *bool // The marker used to continue this inventory configuration listing. Use the // NextContinuationToken from this response to continue the listing in a subsequent // request. The continuation token is an opaque value that Amazon S3 understands. NextContinuationToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListBucketIntelligentTieringConfigurationsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListBucketIntelligentTieringConfigurations{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListBucketIntelligentTieringConfigurations{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListBucketIntelligentTieringConfigurations"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListBucketIntelligentTieringConfigurationsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBucketIntelligentTieringConfigurations(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListBucketIntelligentTieringConfigurationsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *ListBucketIntelligentTieringConfigurationsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opListBucketIntelligentTieringConfigurations(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListBucketIntelligentTieringConfigurations", } } // getListBucketIntelligentTieringConfigurationsBucketMember returns a pointer to // string denoting a provided bucket member valueand a boolean indicating if the // input has a modeled bucket name, func getListBucketIntelligentTieringConfigurationsBucketMember(input interface{}) (*string, bool) { in := input.(*ListBucketIntelligentTieringConfigurationsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListBucketIntelligentTieringConfigurationsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListBucketIntelligentTieringConfigurationsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBucketInventoryConfigurations.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns a list of inventory configurations for the bucket. You can have up to // 1,000 analytics configurations per bucket. // // This action supports list pagination and does not return more than 100 // configurations at a time. Always check the IsTruncated element in the response. // If there are no more configurations to list, IsTruncated is set to false. If // there are more configurations to list, IsTruncated is set to true, and there is // a value in NextContinuationToken . You use the NextContinuationToken value to // continue the pagination of the list by passing the value in continuation-token // in the request to GET the next page. // // To use this operation, you must have permissions to perform the // s3:GetInventoryConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For information about the Amazon S3 inventory feature, see [Amazon S3 Inventory] // // The following operations are related to ListBucketInventoryConfigurations : // // [GetBucketInventoryConfiguration] // // [DeleteBucketInventoryConfiguration] // // [PutBucketInventoryConfiguration] // // [Amazon S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [DeleteBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [PutBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html // [GetBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html func (c *Client) ListBucketInventoryConfigurations(ctx context.Context, params *ListBucketInventoryConfigurationsInput, optFns ...func(*Options)) (*ListBucketInventoryConfigurationsOutput, error) { if params == nil { params = &ListBucketInventoryConfigurationsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListBucketInventoryConfigurations", params, optFns, c.addOperationListBucketInventoryConfigurationsMiddlewares) if err != nil { return nil, err } out := result.(*ListBucketInventoryConfigurationsOutput) out.ResultMetadata = metadata return out, nil } type ListBucketInventoryConfigurationsInput struct { // The name of the bucket containing the inventory configurations to retrieve. // // This member is required. Bucket *string // The marker used to continue an inventory configuration listing that has been // truncated. Use the NextContinuationToken from a previously truncated list // response to continue the listing. The continuation token is an opaque value that // Amazon S3 understands. ContinuationToken *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *ListBucketInventoryConfigurationsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type ListBucketInventoryConfigurationsOutput struct { // If sent in the request, the marker that is used as a starting point for this // inventory configuration list response. ContinuationToken *string // The list of inventory configurations for a bucket. InventoryConfigurationList []types.InventoryConfiguration // Tells whether the returned list of inventory configurations is complete. A // value of true indicates that the list is not complete and the // NextContinuationToken is provided for a subsequent request. IsTruncated *bool // The marker used to continue this inventory configuration listing. Use the // NextContinuationToken from this response to continue the listing in a subsequent // request. The continuation token is an opaque value that Amazon S3 understands. NextContinuationToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListBucketInventoryConfigurationsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListBucketInventoryConfigurations{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListBucketInventoryConfigurations{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListBucketInventoryConfigurations"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListBucketInventoryConfigurationsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBucketInventoryConfigurations(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListBucketInventoryConfigurationsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *ListBucketInventoryConfigurationsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opListBucketInventoryConfigurations(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListBucketInventoryConfigurations", } } // getListBucketInventoryConfigurationsBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getListBucketInventoryConfigurationsBucketMember(input interface{}) (*string, bool) { in := input.(*ListBucketInventoryConfigurationsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListBucketInventoryConfigurationsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListBucketInventoryConfigurationsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBucketMetricsConfigurations.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Lists the metrics configurations for the bucket. The metrics configurations are // only for the request metrics of the bucket and do not provide information on // daily storage metrics. You can have up to 1,000 configurations per bucket. // // This action supports list pagination and does not return more than 100 // configurations at a time. Always check the IsTruncated element in the response. // If there are no more configurations to list, IsTruncated is set to false. If // there are more configurations to list, IsTruncated is set to true, and there is // a value in NextContinuationToken . You use the NextContinuationToken value to // continue the pagination of the list by passing the value in continuation-token // in the request to GET the next page. // // To use this operation, you must have permissions to perform the // s3:GetMetricsConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For more information about metrics configurations and CloudWatch request // metrics, see [Monitoring Metrics with Amazon CloudWatch]. // // The following operations are related to ListBucketMetricsConfigurations : // // [PutBucketMetricsConfiguration] // // [GetBucketMetricsConfiguration] // // [DeleteBucketMetricsConfiguration] // // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Monitoring Metrics with Amazon CloudWatch]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html // [GetBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html // [PutBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html // [DeleteBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) ListBucketMetricsConfigurations(ctx context.Context, params *ListBucketMetricsConfigurationsInput, optFns ...func(*Options)) (*ListBucketMetricsConfigurationsOutput, error) { if params == nil { params = &ListBucketMetricsConfigurationsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListBucketMetricsConfigurations", params, optFns, c.addOperationListBucketMetricsConfigurationsMiddlewares) if err != nil { return nil, err } out := result.(*ListBucketMetricsConfigurationsOutput) out.ResultMetadata = metadata return out, nil } type ListBucketMetricsConfigurationsInput struct { // The name of the bucket containing the metrics configurations to retrieve. // // This member is required. Bucket *string // The marker that is used to continue a metrics configuration listing that has // been truncated. Use the NextContinuationToken from a previously truncated list // response to continue the listing. The continuation token is an opaque value that // Amazon S3 understands. ContinuationToken *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *ListBucketMetricsConfigurationsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type ListBucketMetricsConfigurationsOutput struct { // The marker that is used as a starting point for this metrics configuration list // response. This value is present if it was sent in the request. ContinuationToken *string // Indicates whether the returned list of metrics configurations is complete. A // value of true indicates that the list is not complete and the // NextContinuationToken will be provided for a subsequent request. IsTruncated *bool // The list of metrics configurations for a bucket. MetricsConfigurationList []types.MetricsConfiguration // The marker used to continue a metrics configuration listing that has been // truncated. Use the NextContinuationToken from a previously truncated list // response to continue the listing. The continuation token is an opaque value that // Amazon S3 understands. NextContinuationToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListBucketMetricsConfigurationsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListBucketMetricsConfigurations{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListBucketMetricsConfigurations{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListBucketMetricsConfigurations"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListBucketMetricsConfigurationsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBucketMetricsConfigurations(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListBucketMetricsConfigurationsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *ListBucketMetricsConfigurationsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opListBucketMetricsConfigurations(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListBucketMetricsConfigurations", } } // getListBucketMetricsConfigurationsBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getListBucketMetricsConfigurationsBucketMember(input interface{}) (*string, bool) { in := input.(*ListBucketMetricsConfigurationsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListBucketMetricsConfigurationsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListBucketMetricsConfigurationsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListBuckets.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns a list of all buckets owned by the authenticated sender of the request. // To grant IAM permission to use this operation, you must add the // s3:ListAllMyBuckets policy action. // // For information about Amazon S3 buckets, see [Creating, configuring, and working with Amazon S3 buckets]. // // We strongly recommend using only paginated ListBuckets requests. Unpaginated // ListBuckets requests are only supported for Amazon Web Services accounts set to // the default general purpose bucket quota of 10,000. If you have an approved // general purpose bucket quota above 10,000, you must send paginated ListBuckets // requests to list your account’s buckets. All unpaginated ListBuckets requests // will be rejected for Amazon Web Services accounts with a general purpose bucket // quota greater than 10,000. // // [Creating, configuring, and working with Amazon S3 buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html func (c *Client) ListBuckets(ctx context.Context, params *ListBucketsInput, optFns ...func(*Options)) (*ListBucketsOutput, error) { if params == nil { params = &ListBucketsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListBuckets", params, optFns, c.addOperationListBucketsMiddlewares) if err != nil { return nil, err } out := result.(*ListBucketsOutput) out.ResultMetadata = metadata return out, nil } type ListBucketsInput struct { // Limits the response to buckets that are located in the specified Amazon Web // Services Region. The Amazon Web Services Region must be expressed according to // the Amazon Web Services Region code, such as us-west-2 for the US West (Oregon) // Region. For a list of the valid values for all of the Amazon Web Services // Regions, see [Regions and Endpoints]. // // Requests made to a Regional endpoint that is different from the bucket-region // parameter are not supported. For example, if you want to limit the response to // your buckets in Region us-west-2 , the request must be made to an endpoint in // Region us-west-2 . // // [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region BucketRegion *string // ContinuationToken indicates to Amazon S3 that the list is being continued on // this bucket with a token. ContinuationToken is obfuscated and is not a real // key. You can use this ContinuationToken for pagination of the list results. // // Length Constraints: Minimum length of 0. Maximum length of 1024. // // Required: No. // // If you specify the bucket-region , prefix , or continuation-token query // parameters without using max-buckets to set the maximum number of buckets // returned in the response, Amazon S3 applies a default page size of 10,000 and // provides a continuation token if there are more buckets. ContinuationToken *string // Maximum number of buckets to be returned in response. When the number is more // than the count of buckets that are owned by an Amazon Web Services account, // return all the buckets in response. MaxBuckets *int32 // Limits the response to bucket names that begin with the specified bucket name // prefix. Prefix *string noSmithyDocumentSerde } type ListBucketsOutput struct { // The list of buckets owned by the requester. Buckets []types.Bucket // ContinuationToken is included in the response when there are more buckets that // can be listed with pagination. The next ListBuckets request to Amazon S3 can be // continued with this ContinuationToken . ContinuationToken is obfuscated and is // not a real bucket. ContinuationToken *string // The owner of the buckets listed. Owner *types.Owner // If Prefix was sent with the request, it is included in the response. // // All bucket names in the response begin with the specified bucket name prefix. Prefix *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListBucketsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListBuckets{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListBuckets{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListBuckets"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListBuckets(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListBucketsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // ListBucketsPaginatorOptions is the paginator options for ListBuckets type ListBucketsPaginatorOptions struct { // Maximum number of buckets to be returned in response. When the number is more // than the count of buckets that are owned by an Amazon Web Services account, // return all the buckets in response. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // ListBucketsPaginator is a paginator for ListBuckets type ListBucketsPaginator struct { options ListBucketsPaginatorOptions client ListBucketsAPIClient params *ListBucketsInput nextToken *string firstPage bool } // NewListBucketsPaginator returns a new ListBucketsPaginator func NewListBucketsPaginator(client ListBucketsAPIClient, params *ListBucketsInput, optFns ...func(*ListBucketsPaginatorOptions)) *ListBucketsPaginator { if params == nil { params = &ListBucketsInput{} } options := ListBucketsPaginatorOptions{} if params.MaxBuckets != nil { options.Limit = *params.MaxBuckets } for _, fn := range optFns { fn(&options) } return &ListBucketsPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.ContinuationToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *ListBucketsPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next ListBuckets page. func (p *ListBucketsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListBucketsOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.ContinuationToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxBuckets = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.ListBuckets(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.ContinuationToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // ListBucketsAPIClient is a client that implements the ListBuckets operation. type ListBucketsAPIClient interface { ListBuckets(context.Context, *ListBucketsInput, ...func(*Options)) (*ListBucketsOutput, error) } var _ ListBucketsAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opListBuckets(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListBuckets", } } func addListBucketsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: nopGetBucketAccessor, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: false, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListDirectoryBuckets.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns a list of all Amazon S3 directory buckets owned by the authenticated // sender of the request. For more information about directory buckets, see [Directory buckets]in the // Amazon S3 User Guide. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Regional endpoint. These endpoints support path-style requests // in the format https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions You must have the s3express:ListAllMyDirectoryBuckets permission in // an IAM identity-based policy instead of a bucket policy. Cross-account access to // this API operation isn't supported. This operation can only be performed by the // Amazon Web Services account that owns the resource. For more information about // directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region.amazonaws.com . // // The BucketRegion response element is not part of the ListDirectoryBuckets // Response Syntax. // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Directory buckets]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html func (c *Client) ListDirectoryBuckets(ctx context.Context, params *ListDirectoryBucketsInput, optFns ...func(*Options)) (*ListDirectoryBucketsOutput, error) { if params == nil { params = &ListDirectoryBucketsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListDirectoryBuckets", params, optFns, c.addOperationListDirectoryBucketsMiddlewares) if err != nil { return nil, err } out := result.(*ListDirectoryBucketsOutput) out.ResultMetadata = metadata return out, nil } type ListDirectoryBucketsInput struct { // ContinuationToken indicates to Amazon S3 that the list is being continued on // buckets in this account with a token. ContinuationToken is obfuscated and is // not a real bucket name. You can use this ContinuationToken for the pagination // of the list results. ContinuationToken *string // Maximum number of buckets to be returned in response. When the number is more // than the count of buckets that are owned by an Amazon Web Services account, // return all the buckets in response. MaxDirectoryBuckets *int32 noSmithyDocumentSerde } func (in *ListDirectoryBucketsInput) bindEndpointParams(p *EndpointParameters) { p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type ListDirectoryBucketsOutput struct { // The list of buckets owned by the requester. Buckets []types.Bucket // If ContinuationToken was sent with the request, it is included in the response. // You can use the returned ContinuationToken for pagination of the list response. ContinuationToken *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListDirectoryBucketsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListDirectoryBuckets{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListDirectoryBuckets{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListDirectoryBuckets"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListDirectoryBuckets(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListDirectoryBucketsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // ListDirectoryBucketsPaginatorOptions is the paginator options for // ListDirectoryBuckets type ListDirectoryBucketsPaginatorOptions struct { // Maximum number of buckets to be returned in response. When the number is more // than the count of buckets that are owned by an Amazon Web Services account, // return all the buckets in response. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // ListDirectoryBucketsPaginator is a paginator for ListDirectoryBuckets type ListDirectoryBucketsPaginator struct { options ListDirectoryBucketsPaginatorOptions client ListDirectoryBucketsAPIClient params *ListDirectoryBucketsInput nextToken *string firstPage bool } // NewListDirectoryBucketsPaginator returns a new ListDirectoryBucketsPaginator func NewListDirectoryBucketsPaginator(client ListDirectoryBucketsAPIClient, params *ListDirectoryBucketsInput, optFns ...func(*ListDirectoryBucketsPaginatorOptions)) *ListDirectoryBucketsPaginator { if params == nil { params = &ListDirectoryBucketsInput{} } options := ListDirectoryBucketsPaginatorOptions{} if params.MaxDirectoryBuckets != nil { options.Limit = *params.MaxDirectoryBuckets } for _, fn := range optFns { fn(&options) } return &ListDirectoryBucketsPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.ContinuationToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *ListDirectoryBucketsPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next ListDirectoryBuckets page. func (p *ListDirectoryBucketsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListDirectoryBucketsOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.ContinuationToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxDirectoryBuckets = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.ListDirectoryBuckets(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = result.ContinuationToken if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } // ListDirectoryBucketsAPIClient is a client that implements the // ListDirectoryBuckets operation. type ListDirectoryBucketsAPIClient interface { ListDirectoryBuckets(context.Context, *ListDirectoryBucketsInput, ...func(*Options)) (*ListDirectoryBucketsOutput, error) } var _ ListDirectoryBucketsAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opListDirectoryBuckets(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListDirectoryBuckets", } } func addListDirectoryBucketsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: nopGetBucketAccessor, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListMultipartUploads.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation lists in-progress multipart uploads in a bucket. An in-progress // multipart upload is a multipart upload that has been initiated by the // CreateMultipartUpload request, but has not yet been completed or aborted. // // Directory buckets - If multipart uploads in a directory bucket are in progress, // you can't delete the bucket until all the in-progress multipart uploads are // aborted or completed. To delete these in-progress multipart uploads, use the // ListMultipartUploads operation to list the in-progress multipart uploads in the // bucket and use the AbortMultipartUpload operation to abort all the in-progress // multipart uploads. // // The ListMultipartUploads operation returns a maximum of 1,000 multipart uploads // in the response. The limit of 1,000 multipart uploads is also the default value. // You can further limit the number of uploads in a response by specifying the // max-uploads request parameter. If there are more than 1,000 multipart uploads // that satisfy your ListMultipartUploads request, the response returns an // IsTruncated element with the value of true , a NextKeyMarker element, and a // NextUploadIdMarker element. To list the remaining multipart uploads, you need to // make subsequent ListMultipartUploads requests. In these requests, include two // query parameters: key-marker and upload-id-marker . Set the value of key-marker // to the NextKeyMarker value from the previous response. Similarly, set the value // of upload-id-marker to the NextUploadIdMarker value from the previous response. // // Directory buckets - The upload-id-marker element and the NextUploadIdMarker // element aren't supported by directory buckets. To list the additional multipart // uploads, you only need to set the value of key-marker to the NextKeyMarker // value from the previous response. // // For more information about multipart uploads, see [Uploading Objects Using Multipart Upload] in the Amazon S3 User Guide. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Zonal endpoint. These endpoints support virtual-hosted-style // requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // // - General purpose bucket permissions - For information about permissions // required to use the multipart upload API, see [Multipart Upload and Permissions]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // Sorting of multipart uploads in response // // - General purpose bucket - In the ListMultipartUploads response, the multipart // uploads are sorted based on two criteria: // // - Key-based sorting - Multipart uploads are initially sorted in ascending // order based on their object keys. // // - Time-based sorting - For uploads that share the same object key, they are // further sorted in ascending order based on the upload initiation time. Among // uploads with the same key, the one that was initiated first will appear before // the ones that were initiated later. // // - Directory bucket - In the ListMultipartUploads response, the multipart // uploads aren't sorted lexicographically based on the object keys. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to ListMultipartUploads : // // [CreateMultipartUpload] // // [UploadPart] // // [CompleteMultipartUpload] // // [ListParts] // // [AbortMultipartUpload] // // [Uploading Objects Using Multipart Upload]: https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html // [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html // [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [Multipart Upload and Permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html // [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html func (c *Client) ListMultipartUploads(ctx context.Context, params *ListMultipartUploadsInput, optFns ...func(*Options)) (*ListMultipartUploadsOutput, error) { if params == nil { params = &ListMultipartUploadsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListMultipartUploads", params, optFns, c.addOperationListMultipartUploadsMiddlewares) if err != nil { return nil, err } out := result.(*ListMultipartUploadsOutput) out.ResultMetadata = metadata return out, nil } type ListMultipartUploadsInput struct { // The name of the bucket to which the multipart upload was initiated. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Character you use to group keys. // // All keys that contain the same string between the prefix, if specified, and the // first occurrence of the delimiter after the prefix are grouped under a single // result element, CommonPrefixes . If you don't specify the prefix parameter, then // the substring starts at the beginning of the key. The keys that are grouped // under CommonPrefixes result element are not returned elsewhere in the response. // // Directory buckets - For directory buckets, / is the only supported delimiter. Delimiter *string // Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are // encoded only in UTF-8. An object key can contain any Unicode character. However, // the XML 1.0 parser can't parse certain characters, such as characters with an // ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you // can add this parameter to request that Amazon S3 encode the keys in the // response. For more information about characters to avoid in object key names, // see [Object key naming guidelines]. // // When using the URL encoding type, non-ASCII characters that are used in an // object's key name will be percent-encoded according to UTF-8 code values. For // example, the object test_file(3).png will appear as test_file%283%29.png . // // [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines // [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html EncodingType types.EncodingType // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Specifies the multipart upload after which listing should begin. // // - General purpose buckets - For general purpose buckets, key-marker is an // object key. Together with upload-id-marker , this parameter specifies the // multipart upload after which listing should begin. // // If upload-id-marker is not specified, only the keys lexicographically greater // than the specified key-marker will be included in the list. // // If upload-id-marker is specified, any multipart uploads for a key equal to the // key-marker might also be included, provided those multipart uploads have // upload IDs lexicographically greater than the specified upload-id-marker . // // - Directory buckets - For directory buckets, key-marker is obfuscated and // isn't a real object key. The upload-id-marker parameter isn't supported by // directory buckets. To list the additional multipart uploads, you only need to // set the value of key-marker to the NextKeyMarker value from the previous // response. // // In the ListMultipartUploads response, the multipart uploads aren't sorted // lexicographically based on the object keys. KeyMarker *string // Sets the maximum number of multipart uploads, from 1 to 1,000, to return in the // response body. 1,000 is the maximum number of uploads that can be returned in a // response. MaxUploads *int32 // Lists in-progress uploads only for those keys that begin with the specified // prefix. You can use prefixes to separate a bucket into different grouping of // keys. (You can think of using prefix to make groups in the same way that you'd // use a folder in a file system.) // // Directory buckets - For directory buckets, only prefixes that end in a // delimiter ( / ) are supported. Prefix *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Together with key-marker, specifies the multipart upload after which listing // should begin. If key-marker is not specified, the upload-id-marker parameter is // ignored. Otherwise, any multipart uploads for a key equal to the key-marker // might be included in the list only if they have an upload ID lexicographically // greater than the specified upload-id-marker . // // This functionality is not supported for directory buckets. UploadIdMarker *string noSmithyDocumentSerde } func (in *ListMultipartUploadsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Prefix = in.Prefix } type ListMultipartUploadsOutput struct { // The name of the bucket to which the multipart upload was initiated. Does not // return the access point ARN or access point alias if used. Bucket *string // If you specify a delimiter in the request, then the result returns each // distinct key prefix containing the delimiter in a CommonPrefixes element. The // distinct key prefixes are returned in the Prefix child element. // // Directory buckets - For directory buckets, only prefixes that end in a // delimiter ( / ) are supported. CommonPrefixes []types.CommonPrefix // Contains the delimiter you specified in the request. If you don't specify a // delimiter in your request, this element is absent from the response. // // Directory buckets - For directory buckets, / is the only supported delimiter. Delimiter *string // Encoding type used by Amazon S3 to encode object keys in the response. // // If you specify the encoding-type request parameter, Amazon S3 includes this // element in the response, and returns encoded key name values in the following // response elements: // // Delimiter , KeyMarker , Prefix , NextKeyMarker , Key . EncodingType types.EncodingType // Indicates whether the returned list of multipart uploads is truncated. A value // of true indicates that the list was truncated. The list can be truncated if the // number of multipart uploads exceeds the limit allowed or specified by max // uploads. IsTruncated *bool // The key at or after which the listing began. KeyMarker *string // Maximum number of multipart uploads that could have been included in the // response. MaxUploads *int32 // When a list is truncated, this element specifies the value that should be used // for the key-marker request parameter in a subsequent request. NextKeyMarker *string // When a list is truncated, this element specifies the value that should be used // for the upload-id-marker request parameter in a subsequent request. // // This functionality is not supported for directory buckets. NextUploadIdMarker *string // When a prefix is provided in the request, this field contains the specified // prefix. The result contains only keys starting with the specified prefix. // // Directory buckets - For directory buckets, only prefixes that end in a // delimiter ( / ) are supported. Prefix *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Together with key-marker, specifies the multipart upload after which listing // should begin. If key-marker is not specified, the upload-id-marker parameter is // ignored. Otherwise, any multipart uploads for a key equal to the key-marker // might be included in the list only if they have an upload ID lexicographically // greater than the specified upload-id-marker . // // This functionality is not supported for directory buckets. UploadIdMarker *string // Container for elements related to a particular multipart upload. A response can // contain zero or more Upload elements. Uploads []types.MultipartUpload // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListMultipartUploadsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListMultipartUploads{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListMultipartUploads{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListMultipartUploads"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListMultipartUploadsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListMultipartUploads(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListMultipartUploadsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *ListMultipartUploadsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opListMultipartUploads(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListMultipartUploads", } } // getListMultipartUploadsBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getListMultipartUploadsBucketMember(input interface{}) (*string, bool) { in := input.(*ListMultipartUploadsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListMultipartUploadsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListMultipartUploadsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListObjectVersions.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns metadata about all versions of the objects in a bucket. You can also // use request parameters as selection criteria to return metadata about a subset // of all the object versions. // // To use this operation, you must have permission to perform the // s3:ListBucketVersions action. Be aware of the name difference. // // A 200 OK response can contain valid or invalid XML. Make sure to design your // application to parse the contents of the response and handle it appropriately. // // To use this operation, you must have READ access to the bucket. // // The following operations are related to ListObjectVersions : // // [ListObjectsV2] // // [GetObject] // // [PutObject] // // [DeleteObject] // // [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [ListObjectsV2]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html func (c *Client) ListObjectVersions(ctx context.Context, params *ListObjectVersionsInput, optFns ...func(*Options)) (*ListObjectVersionsOutput, error) { if params == nil { params = &ListObjectVersionsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListObjectVersions", params, optFns, c.addOperationListObjectVersionsMiddlewares) if err != nil { return nil, err } out := result.(*ListObjectVersionsOutput) out.ResultMetadata = metadata return out, nil } type ListObjectVersionsInput struct { // The bucket name that contains the objects. // // This member is required. Bucket *string // A delimiter is a character that you specify to group keys. All keys that // contain the same string between the prefix and the first occurrence of the // delimiter are grouped under a single result element in CommonPrefixes . These // groups are counted as one result against the max-keys limitation. These keys // are not returned elsewhere in the response. Delimiter *string // Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are // encoded only in UTF-8. An object key can contain any Unicode character. However, // the XML 1.0 parser can't parse certain characters, such as characters with an // ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you // can add this parameter to request that Amazon S3 encode the keys in the // response. For more information about characters to avoid in object key names, // see [Object key naming guidelines]. // // When using the URL encoding type, non-ASCII characters that are used in an // object's key name will be percent-encoded according to UTF-8 code values. For // example, the object test_file(3).png will appear as test_file%283%29.png . // // [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines // [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html EncodingType types.EncodingType // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Specifies the key to start with when listing objects in a bucket. KeyMarker *string // Sets the maximum number of keys returned in the response. By default, the // action returns up to 1,000 key names. The response might contain fewer keys but // will never contain more. If additional keys satisfy the search criteria, but // were not returned because max-keys was exceeded, the response contains true . To // return the additional keys, see key-marker and version-id-marker . MaxKeys *int32 // Specifies the optional fields that you want returned in the response. Fields // that you do not specify are not returned. OptionalObjectAttributes []types.OptionalObjectAttributes // Use this parameter to select only those keys that begin with the specified // prefix. You can use prefixes to separate a bucket into different groupings of // keys. (You can think of using prefix to make groups in the same way that you'd // use a folder in a file system.) You can use prefix with delimiter to roll up // numerous objects into a single result under CommonPrefixes . Prefix *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Specifies the object version you want to start listing from. VersionIdMarker *string noSmithyDocumentSerde } func (in *ListObjectVersionsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Prefix = in.Prefix } type ListObjectVersionsOutput struct { // All of the keys rolled up into a common prefix count as a single return when // calculating the number of returns. CommonPrefixes []types.CommonPrefix // Container for an object that is a delete marker. To learn more about delete // markers, see [Working with delete markers]. // // [Working with delete markers]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html DeleteMarkers []types.DeleteMarkerEntry // The delimiter grouping the included keys. A delimiter is a character that you // specify to group keys. All keys that contain the same string between the prefix // and the first occurrence of the delimiter are grouped under a single result // element in CommonPrefixes . These groups are counted as one result against the // max-keys limitation. These keys are not returned elsewhere in the response. Delimiter *string // Encoding type used by Amazon S3 to encode object key names in the XML response. // // If you specify the encoding-type request parameter, Amazon S3 includes this // element in the response, and returns encoded key name values in the following // response elements: // // KeyMarker, NextKeyMarker, Prefix, Key , and Delimiter . EncodingType types.EncodingType // A flag that indicates whether Amazon S3 returned all of the results that // satisfied the search criteria. If your results were truncated, you can make a // follow-up paginated request by using the NextKeyMarker and NextVersionIdMarker // response parameters as a starting place in another request to return the rest of // the results. IsTruncated *bool // Marks the last key returned in a truncated response. KeyMarker *string // Specifies the maximum number of objects to return. MaxKeys *int32 // The bucket name. Name *string // When the number of responses exceeds the value of MaxKeys , NextKeyMarker // specifies the first key not returned that satisfies the search criteria. Use // this value for the key-marker request parameter in a subsequent request. NextKeyMarker *string // When the number of responses exceeds the value of MaxKeys , NextVersionIdMarker // specifies the first object version not returned that satisfies the search // criteria. Use this value for the version-id-marker request parameter in a // subsequent request. NextVersionIdMarker *string // Selects objects that start with the value supplied by this parameter. Prefix *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Marks the last version of the key returned in a truncated response. VersionIdMarker *string // Container for version information. Versions []types.ObjectVersion // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListObjectVersionsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListObjectVersions{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListObjectVersions{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListObjectVersions"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListObjectVersionsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListObjectVersions(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListObjectVersionsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *ListObjectVersionsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opListObjectVersions(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListObjectVersions", } } // getListObjectVersionsBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getListObjectVersionsBucketMember(input interface{}) (*string, bool) { in := input.(*ListObjectVersionsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListObjectVersionsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListObjectVersionsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListObjects.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Returns some or all (up to 1,000) of the objects in a bucket. You can use the // request parameters as selection criteria to return a subset of the objects in a // bucket. A 200 OK response can contain valid or invalid XML. Be sure to design // your application to parse the contents of the response and handle it // appropriately. // // This action has been revised. We recommend that you use the newer version, [ListObjectsV2], // when developing applications. For backward compatibility, Amazon S3 continues to // support ListObjects . // // The following operations are related to ListObjects : // // [ListObjectsV2] // // [GetObject] // // [PutObject] // // [CreateBucket] // // [ListBuckets] // // [ListBuckets]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html // [ListObjectsV2]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html func (c *Client) ListObjects(ctx context.Context, params *ListObjectsInput, optFns ...func(*Options)) (*ListObjectsOutput, error) { if params == nil { params = &ListObjectsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListObjects", params, optFns, c.addOperationListObjectsMiddlewares) if err != nil { return nil, err } out := result.(*ListObjectsOutput) out.ResultMetadata = metadata return out, nil } type ListObjectsInput struct { // The name of the bucket containing the objects. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // A delimiter is a character that you use to group keys. Delimiter *string // Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are // encoded only in UTF-8. An object key can contain any Unicode character. However, // the XML 1.0 parser can't parse certain characters, such as characters with an // ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you // can add this parameter to request that Amazon S3 encode the keys in the // response. For more information about characters to avoid in object key names, // see [Object key naming guidelines]. // // When using the URL encoding type, non-ASCII characters that are used in an // object's key name will be percent-encoded according to UTF-8 code values. For // example, the object test_file(3).png will appear as test_file%283%29.png . // // [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines // [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html EncodingType types.EncodingType // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Marker is where you want Amazon S3 to start listing from. Amazon S3 starts // listing after this specified key. Marker can be any key in the bucket. Marker *string // Sets the maximum number of keys returned in the response. By default, the // action returns up to 1,000 key names. The response might contain fewer keys but // will never contain more. MaxKeys *int32 // Specifies the optional fields that you want returned in the response. Fields // that you do not specify are not returned. OptionalObjectAttributes []types.OptionalObjectAttributes // Limits the response to keys that begin with the specified prefix. Prefix *string // Confirms that the requester knows that she or he will be charged for the list // objects request. Bucket owners need not specify this parameter in their // requests. RequestPayer types.RequestPayer noSmithyDocumentSerde } func (in *ListObjectsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Prefix = in.Prefix } type ListObjectsOutput struct { // All of the keys (up to 1,000) rolled up in a common prefix count as a single // return when calculating the number of returns. // // A response can contain CommonPrefixes only if you specify a delimiter. // // CommonPrefixes contains all (if there are any) keys between Prefix and the next // occurrence of the string specified by the delimiter. // // CommonPrefixes lists keys that act like subdirectories in the directory // specified by Prefix . // // For example, if the prefix is notes/ and the delimiter is a slash ( / ), as in // notes/summer/july , the common prefix is notes/summer/ . All of the keys that // roll up into a common prefix count as a single return when calculating the // number of returns. CommonPrefixes []types.CommonPrefix // Metadata about each object returned. Contents []types.Object // Causes keys that contain the same string between the prefix and the first // occurrence of the delimiter to be rolled up into a single result element in the // CommonPrefixes collection. These rolled-up keys are not returned elsewhere in // the response. Each rolled-up result counts as only one return against the // MaxKeys value. Delimiter *string // Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are // encoded only in UTF-8. An object key can contain any Unicode character. However, // the XML 1.0 parser can't parse certain characters, such as characters with an // ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you // can add this parameter to request that Amazon S3 encode the keys in the // response. For more information about characters to avoid in object key names, // see [Object key naming guidelines]. // // When using the URL encoding type, non-ASCII characters that are used in an // object's key name will be percent-encoded according to UTF-8 code values. For // example, the object test_file(3).png will appear as test_file%283%29.png . // // [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines // [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html EncodingType types.EncodingType // A flag that indicates whether Amazon S3 returned all of the results that // satisfied the search criteria. IsTruncated *bool // Indicates where in the bucket listing begins. Marker is included in the // response if it was sent with the request. Marker *string // The maximum number of keys returned in the response body. MaxKeys *int32 // The bucket name. Name *string // When the response is truncated (the IsTruncated element value in the response // is true ), you can use the key name in this field as the marker parameter in // the subsequent request to get the next set of objects. Amazon S3 lists objects // in alphabetical order. // // This element is returned only if you have the delimiter request parameter // specified. If the response does not include the NextMarker element and it is // truncated, you can use the value of the last Key element in the response as the // marker parameter in the subsequent request to get the next set of object keys. NextMarker *string // Keys that begin with the indicated prefix. Prefix *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListObjectsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListObjects{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListObjects{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListObjects"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListObjectsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListObjects(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListObjectsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *ListObjectsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opListObjects(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListObjects", } } // getListObjectsBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getListObjectsBucketMember(input interface{}) (*string, bool) { in := input.(*ListObjectsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListObjectsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListObjectsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListObjectsV2.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Returns some or all (up to 1,000) of the objects in a bucket with each request. // You can use the request parameters as selection criteria to return a subset of // the objects in a bucket. A 200 OK response can contain valid or invalid XML. // Make sure to design your application to parse the contents of the response and // handle it appropriately. For more information about listing objects, see [Listing object keys programmatically]in the // Amazon S3 User Guide. To get a list of your buckets, see [ListBuckets]. // // - General purpose bucket - For general purpose buckets, ListObjectsV2 doesn't // return prefixes that are related only to in-progress multipart uploads. // // - Directory buckets - For directory buckets, ListObjectsV2 response includes // the prefixes that are related only to in-progress multipart uploads. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Zonal endpoint. These endpoints support // virtual-hosted-style requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // // - General purpose bucket permissions - To use this operation, you must have // READ access to the bucket. You must have permission to perform the // s3:ListBucket action. The bucket owner has this permission by default and can // grant this permission to others. For more information about permissions, see [Permissions Related to Bucket Subresource Operations] // and [Managing Access Permissions to Your Amazon S3 Resources]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // Sorting order of returned objects // // - General purpose bucket - For general purpose buckets, ListObjectsV2 returns // objects in lexicographical order based on their key names. // // - Directory bucket - For directory buckets, ListObjectsV2 does not return // objects in lexicographical order. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // This section describes the latest revision of this action. We recommend that // you use this revised API operation for application development. For backward // compatibility, Amazon S3 continues to support the prior version of this API // operation, [ListObjects]. // // The following operations are related to ListObjectsV2 : // // [GetObject] // // [PutObject] // // [CreateBucket] // // [ListObjects]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Listing object keys programmatically]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/ListingKeysUsingAPIs.html // [ListBuckets]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html func (c *Client) ListObjectsV2(ctx context.Context, params *ListObjectsV2Input, optFns ...func(*Options)) (*ListObjectsV2Output, error) { if params == nil { params = &ListObjectsV2Input{} } result, metadata, err := c.invokeOperation(ctx, "ListObjectsV2", params, optFns, c.addOperationListObjectsV2Middlewares) if err != nil { return nil, err } out := result.(*ListObjectsV2Output) out.ResultMetadata = metadata return out, nil } type ListObjectsV2Input struct { // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // ContinuationToken indicates to Amazon S3 that the list is being continued on // this bucket with a token. ContinuationToken is obfuscated and is not a real // key. You can use this ContinuationToken for pagination of the list results. ContinuationToken *string // A delimiter is a character that you use to group keys. // // - Directory buckets - For directory buckets, / is the only supported delimiter. // // - Directory buckets - When you query ListObjectsV2 with a delimiter during // in-progress multipart uploads, the CommonPrefixes response parameter contains // the prefixes that are associated with the in-progress multipart uploads. For // more information about multipart uploads, see [Multipart Upload Overview]in the Amazon S3 User Guide. // // [Multipart Upload Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html Delimiter *string // Encoding type used by Amazon S3 to encode the [object keys] in the response. Responses are // encoded only in UTF-8. An object key can contain any Unicode character. However, // the XML 1.0 parser can't parse certain characters, such as characters with an // ASCII value from 0 to 10. For characters that aren't supported in XML 1.0, you // can add this parameter to request that Amazon S3 encode the keys in the // response. For more information about characters to avoid in object key names, // see [Object key naming guidelines]. // // When using the URL encoding type, non-ASCII characters that are used in an // object's key name will be percent-encoded according to UTF-8 code values. For // example, the object test_file(3).png will appear as test_file%283%29.png . // // [Object key naming guidelines]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines // [object keys]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html EncodingType types.EncodingType // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The owner field is not present in ListObjectsV2 by default. If you want to // return the owner field with each key in the result, then set the FetchOwner // field to true . // // Directory buckets - For directory buckets, the bucket owner is returned as the // object owner for all objects. FetchOwner *bool // Sets the maximum number of keys returned in the response. By default, the // action returns up to 1,000 key names. The response might contain fewer keys but // will never contain more. MaxKeys *int32 // Specifies the optional fields that you want returned in the response. Fields // that you do not specify are not returned. // // This functionality is not supported for directory buckets. OptionalObjectAttributes []types.OptionalObjectAttributes // Limits the response to keys that begin with the specified prefix. // // Directory buckets - For directory buckets, only prefixes that end in a // delimiter ( / ) are supported. Prefix *string // Confirms that the requester knows that she or he will be charged for the list // objects request in V2 style. Bucket owners need not specify this parameter in // their requests. // // This functionality is not supported for directory buckets. RequestPayer types.RequestPayer // StartAfter is where you want Amazon S3 to start listing from. Amazon S3 starts // listing after this specified key. StartAfter can be any key in the bucket. // // This functionality is not supported for directory buckets. StartAfter *string noSmithyDocumentSerde } func (in *ListObjectsV2Input) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Prefix = in.Prefix } type ListObjectsV2Output struct { // All of the keys (up to 1,000) that share the same prefix are grouped together. // When counting the total numbers of returns by this API operation, this group of // keys is considered as one item. // // A response can contain CommonPrefixes only if you specify a delimiter. // // CommonPrefixes contains all (if there are any) keys between Prefix and the next // occurrence of the string specified by a delimiter. // // CommonPrefixes lists keys that act like subdirectories in the directory // specified by Prefix . // // For example, if the prefix is notes/ and the delimiter is a slash ( / ) as in // notes/summer/july , the common prefix is notes/summer/ . All of the keys that // roll up into a common prefix count as a single return when calculating the // number of returns. // // - Directory buckets - For directory buckets, only prefixes that end in a // delimiter ( / ) are supported. // // - Directory buckets - When you query ListObjectsV2 with a delimiter during // in-progress multipart uploads, the CommonPrefixes response parameter contains // the prefixes that are associated with the in-progress multipart uploads. For // more information about multipart uploads, see [Multipart Upload Overview]in the Amazon S3 User Guide. // // [Multipart Upload Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html CommonPrefixes []types.CommonPrefix // Metadata about each object returned. Contents []types.Object // If ContinuationToken was sent with the request, it is included in the // response. You can use the returned ContinuationToken for pagination of the list // response. You can use this ContinuationToken for pagination of the list // results. ContinuationToken *string // Causes keys that contain the same string between the prefix and the first // occurrence of the delimiter to be rolled up into a single result element in the // CommonPrefixes collection. These rolled-up keys are not returned elsewhere in // the response. Each rolled-up result counts as only one return against the // MaxKeys value. // // Directory buckets - For directory buckets, / is the only supported delimiter. Delimiter *string // Encoding type used by Amazon S3 to encode object key names in the XML response. // // If you specify the encoding-type request parameter, Amazon S3 includes this // element in the response, and returns encoded key name values in the following // response elements: // // Delimiter, Prefix, Key, and StartAfter . EncodingType types.EncodingType // Set to false if all of the results were returned. Set to true if more keys are // available to return. If the number of results exceeds that specified by MaxKeys // , all of the results might not be returned. IsTruncated *bool // KeyCount is the number of keys returned with this request. KeyCount will always // be less than or equal to the MaxKeys field. For example, if you ask for 50 // keys, your result will include 50 keys or fewer. KeyCount *int32 // Sets the maximum number of keys returned in the response. By default, the // action returns up to 1,000 key names. The response might contain fewer keys but // will never contain more. MaxKeys *int32 // The bucket name. Name *string // NextContinuationToken is sent when isTruncated is true, which means there are // more keys in the bucket that can be listed. The next list requests to Amazon S3 // can be continued with this NextContinuationToken . NextContinuationToken is // obfuscated and is not a real key NextContinuationToken *string // Keys that begin with the indicated prefix. // // Directory buckets - For directory buckets, only prefixes that end in a // delimiter ( / ) are supported. Prefix *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // If StartAfter was sent with the request, it is included in the response. // // This functionality is not supported for directory buckets. StartAfter *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListObjectsV2Middlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListObjectsV2{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListObjectsV2{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListObjectsV2"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListObjectsV2ValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListObjectsV2(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListObjectsV2UpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // ListObjectsV2PaginatorOptions is the paginator options for ListObjectsV2 type ListObjectsV2PaginatorOptions struct { // Sets the maximum number of keys returned in the response. By default, the // action returns up to 1,000 key names. The response might contain fewer keys but // will never contain more. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // ListObjectsV2Paginator is a paginator for ListObjectsV2 type ListObjectsV2Paginator struct { options ListObjectsV2PaginatorOptions client ListObjectsV2APIClient params *ListObjectsV2Input nextToken *string firstPage bool } // NewListObjectsV2Paginator returns a new ListObjectsV2Paginator func NewListObjectsV2Paginator(client ListObjectsV2APIClient, params *ListObjectsV2Input, optFns ...func(*ListObjectsV2PaginatorOptions)) *ListObjectsV2Paginator { if params == nil { params = &ListObjectsV2Input{} } options := ListObjectsV2PaginatorOptions{} if params.MaxKeys != nil { options.Limit = *params.MaxKeys } for _, fn := range optFns { fn(&options) } return &ListObjectsV2Paginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.ContinuationToken, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *ListObjectsV2Paginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next ListObjectsV2 page. func (p *ListObjectsV2Paginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListObjectsV2Output, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.ContinuationToken = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxKeys = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.ListObjectsV2(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = nil if result.IsTruncated != nil && *result.IsTruncated { p.nextToken = result.NextContinuationToken } if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } func (v *ListObjectsV2Input) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } // ListObjectsV2APIClient is a client that implements the ListObjectsV2 operation. type ListObjectsV2APIClient interface { ListObjectsV2(context.Context, *ListObjectsV2Input, ...func(*Options)) (*ListObjectsV2Output, error) } var _ ListObjectsV2APIClient = (*Client)(nil) func newServiceMetadataMiddleware_opListObjectsV2(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListObjectsV2", } } // getListObjectsV2BucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getListObjectsV2BucketMember(input interface{}) (*string, bool) { in := input.(*ListObjectsV2Input) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListObjectsV2UpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListObjectsV2BucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_ListParts.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Lists the parts that have been uploaded for a specific multipart upload. // // To use this operation, you must provide the upload ID in the request. You // obtain this uploadID by sending the initiate multipart upload request through [CreateMultipartUpload]. // // The ListParts request returns a maximum of 1,000 uploaded parts. The limit of // 1,000 parts is also the default value. You can restrict the number of parts in a // response by specifying the max-parts request parameter. If your multipart // upload consists of more than 1,000 parts, the response returns an IsTruncated // field with the value of true , and a NextPartNumberMarker element. To list // remaining uploaded parts, in subsequent ListParts requests, include the // part-number-marker query string parameter and set its value to the // NextPartNumberMarker field value from the previous response. // // For more information on multipart uploads, see [Uploading Objects Using Multipart Upload] in the Amazon S3 User Guide. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Zonal endpoint. These endpoints support virtual-hosted-style // requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // - General purpose bucket permissions - For information about permissions // required to use the multipart upload API, see [Multipart Upload and Permissions]in the Amazon S3 User Guide. // // If the upload was created using server-side encryption with Key Management // // Service (KMS) keys (SSE-KMS) or dual-layer server-side encryption with Amazon // Web Services KMS keys (DSSE-KMS), you must have permission to the kms:Decrypt // action for the ListParts request to succeed. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to ListParts : // // [CreateMultipartUpload] // // [UploadPart] // // [CompleteMultipartUpload] // // [AbortMultipartUpload] // // [GetObjectAttributes] // // [ListMultipartUploads] // // [Uploading Objects Using Multipart Upload]: https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html // [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html // [GetObjectAttributes]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html // [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html // [Multipart Upload and Permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html // [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html // [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html func (c *Client) ListParts(ctx context.Context, params *ListPartsInput, optFns ...func(*Options)) (*ListPartsOutput, error) { if params == nil { params = &ListPartsInput{} } result, metadata, err := c.invokeOperation(ctx, "ListParts", params, optFns, c.addOperationListPartsMiddlewares) if err != nil { return nil, err } out := result.(*ListPartsOutput) out.ResultMetadata = metadata return out, nil } type ListPartsInput struct { // The name of the bucket to which the parts are being uploaded. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Object key for which the multipart upload was initiated. // // This member is required. Key *string // Upload ID identifying the multipart upload whose parts are being listed. // // This member is required. UploadId *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Sets the maximum number of parts to return. MaxParts *int32 // Specifies the part after which listing should begin. Only parts with higher // part numbers will be listed. PartNumberMarker *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // The server-side encryption (SSE) algorithm used to encrypt the object. This // parameter is needed only when the object was created using a checksum algorithm. // For more information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerAlgorithm *string // The server-side encryption (SSE) customer managed key. This parameter is needed // only when the object was created using a checksum algorithm. For more // information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerKey *string // The MD5 server-side encryption (SSE) customer managed key. This parameter is // needed only when the object was created using a checksum algorithm. For more // information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerKeyMD5 *string noSmithyDocumentSerde } func (in *ListPartsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type ListPartsOutput struct { // If the bucket has a lifecycle rule configured with an action to abort // incomplete multipart uploads and the prefix in the lifecycle rule matches the // object name in the request, then the response includes this header indicating // when the initiated multipart upload will become eligible for abort operation. // For more information, see [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]. // // The response will also include the x-amz-abort-rule-id header that will provide // the ID of the lifecycle configuration rule that defines this action. // // This functionality is not supported for directory buckets. // // [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config AbortDate *time.Time // This header is returned along with the x-amz-abort-date header. It identifies // applicable lifecycle configuration rule that defines the action to abort // incomplete multipart uploads. // // This functionality is not supported for directory buckets. AbortRuleId *string // The name of the bucket to which the multipart upload was initiated. Does not // return the access point ARN or access point alias if used. Bucket *string // The algorithm that was used to create a checksum of the object. ChecksumAlgorithm types.ChecksumAlgorithm // The checksum type, which determines how part-level checksums are combined to // create an object-level checksum for multipart objects. You can use this header // response to verify that the checksum type that is received is the same checksum // type that was specified in CreateMultipartUpload request. For more information, // see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumType types.ChecksumType // Container element that identifies who initiated the multipart upload. If the // initiator is an Amazon Web Services account, this element provides the same // information as the Owner element. If the initiator is an IAM User, this element // provides the user ARN and display name. Initiator *types.Initiator // Indicates whether the returned list of parts is truncated. A true value // indicates that the list was truncated. A list can be truncated if the number of // parts exceeds the limit returned in the MaxParts element. IsTruncated *bool // Object key for which the multipart upload was initiated. Key *string // Maximum number of parts that were allowed in the response. MaxParts *int32 // When a list is truncated, this element specifies the last part in the list, as // well as the value to use for the part-number-marker request parameter in a // subsequent request. NextPartNumberMarker *string // Container element that identifies the object owner, after the object is // created. If multipart upload is initiated by an IAM user, this element provides // the parent account ID and display name. // // Directory buckets - The bucket owner is returned as the object owner for all // the parts. Owner *types.Owner // Specifies the part after which listing should begin. Only parts with higher // part numbers will be listed. PartNumberMarker *string // Container for elements related to a particular part. A response can contain // zero or more Part elements. Parts []types.Part // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // The class of storage used to store the uploaded object. // // Directory buckets - Directory buckets only support EXPRESS_ONEZONE (the S3 // Express One Zone storage class) in Availability Zones and ONEZONE_IA (the S3 // One Zone-Infrequent Access storage class) in Dedicated Local Zones. StorageClass types.StorageClass // Upload ID identifying the multipart upload whose parts are being listed. UploadId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationListPartsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpListParts{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpListParts{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "ListParts"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpListPartsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListParts(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addListPartsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } // ListPartsPaginatorOptions is the paginator options for ListParts type ListPartsPaginatorOptions struct { // Sets the maximum number of parts to return. Limit int32 // Set to true if pagination should stop if the service returns a pagination token // that matches the most recent token provided to the service. StopOnDuplicateToken bool } // ListPartsPaginator is a paginator for ListParts type ListPartsPaginator struct { options ListPartsPaginatorOptions client ListPartsAPIClient params *ListPartsInput nextToken *string firstPage bool } // NewListPartsPaginator returns a new ListPartsPaginator func NewListPartsPaginator(client ListPartsAPIClient, params *ListPartsInput, optFns ...func(*ListPartsPaginatorOptions)) *ListPartsPaginator { if params == nil { params = &ListPartsInput{} } options := ListPartsPaginatorOptions{} if params.MaxParts != nil { options.Limit = *params.MaxParts } for _, fn := range optFns { fn(&options) } return &ListPartsPaginator{ options: options, client: client, params: params, firstPage: true, nextToken: params.PartNumberMarker, } } // HasMorePages returns a boolean indicating whether more pages are available func (p *ListPartsPaginator) HasMorePages() bool { return p.firstPage || (p.nextToken != nil && len(*p.nextToken) != 0) } // NextPage retrieves the next ListParts page. func (p *ListPartsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListPartsOutput, error) { if !p.HasMorePages() { return nil, fmt.Errorf("no more pages available") } params := *p.params params.PartNumberMarker = p.nextToken var limit *int32 if p.options.Limit > 0 { limit = &p.options.Limit } params.MaxParts = limit optFns = append([]func(*Options){ addIsPaginatorUserAgent, }, optFns...) result, err := p.client.ListParts(ctx, ¶ms, optFns...) if err != nil { return nil, err } p.firstPage = false prevToken := p.nextToken p.nextToken = nil if result.IsTruncated != nil && *result.IsTruncated { p.nextToken = result.NextPartNumberMarker } if p.options.StopOnDuplicateToken && prevToken != nil && p.nextToken != nil && *prevToken == *p.nextToken { p.nextToken = nil } return result, nil } func (v *ListPartsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } // ListPartsAPIClient is a client that implements the ListParts operation. type ListPartsAPIClient interface { ListParts(context.Context, *ListPartsInput, ...func(*Options)) (*ListPartsOutput, error) } var _ ListPartsAPIClient = (*Client)(nil) func newServiceMetadataMiddleware_opListParts(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "ListParts", } } // getListPartsBucketMember returns a pointer to string denoting a provided bucket // member valueand a boolean indicating if the input has a modeled bucket name, func getListPartsBucketMember(input interface{}) (*string, bool) { in := input.(*ListPartsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addListPartsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getListPartsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketAccelerateConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets the accelerate configuration of an existing bucket. Amazon S3 Transfer // Acceleration is a bucket-level feature that enables you to perform faster data // transfers to Amazon S3. // // To use this operation, you must have permission to perform the // s3:PutAccelerateConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // The Transfer Acceleration state of a bucket can be set to one of the following // two values: // // - Enabled – Enables accelerated data transfers to the bucket. // // - Suspended – Disables accelerated data transfers to the bucket. // // The [GetBucketAccelerateConfiguration] action returns the transfer acceleration state of a bucket. // // After setting the Transfer Acceleration state of a bucket to Enabled, it might // take up to thirty minutes before the data transfer rates to the bucket increase. // // The name of the bucket used for Transfer Acceleration must be DNS-compliant and // must not contain periods ("."). // // For more information about transfer acceleration, see [Transfer Acceleration]. // // The following operations are related to PutBucketAccelerateConfiguration : // // [GetBucketAccelerateConfiguration] // // [CreateBucket] // // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Transfer Acceleration]: https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html // [GetBucketAccelerateConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAccelerateConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html func (c *Client) PutBucketAccelerateConfiguration(ctx context.Context, params *PutBucketAccelerateConfigurationInput, optFns ...func(*Options)) (*PutBucketAccelerateConfigurationOutput, error) { if params == nil { params = &PutBucketAccelerateConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketAccelerateConfiguration", params, optFns, c.addOperationPutBucketAccelerateConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketAccelerateConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutBucketAccelerateConfigurationInput struct { // Container for setting the transfer acceleration state. // // This member is required. AccelerateConfiguration *types.AccelerateConfiguration // The name of the bucket for which the accelerate configuration is set. // // This member is required. Bucket *string // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketAccelerateConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketAccelerateConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketAccelerateConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketAccelerateConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketAccelerateConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketAccelerateConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketAccelerateConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketAccelerateConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketAccelerateConfigurationInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketAccelerateConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketAccelerateConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketAccelerateConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketAccelerateConfiguration", } } // getPutBucketAccelerateConfigurationRequestAlgorithmMember gets the request // checksum algorithm value provided as input. func getPutBucketAccelerateConfigurationRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketAccelerateConfigurationInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketAccelerateConfigurationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketAccelerateConfigurationRequestAlgorithmMember, RequireChecksum: false, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketAccelerateConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getPutBucketAccelerateConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketAccelerateConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketAccelerateConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketAccelerateConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketAcl.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets the permissions on an existing bucket using access control lists (ACL). // For more information, see [Using ACLs]. To set the ACL of a bucket, you must have the // WRITE_ACP permission. // // You can use one of the following two ways to set a bucket's permissions: // // - Specify the ACL in the request body // // - Specify permissions using request headers // // You cannot specify access permission using both the body and the request // headers. // // Depending on your application needs, you may choose to set the ACL on a bucket // using either the request body or the headers. For example, if you have an // existing application that updates a bucket ACL using the request body, then you // can continue to use that approach. // // If your bucket uses the bucket owner enforced setting for S3 Object Ownership, // ACLs are disabled and no longer affect permissions. You must use policies to // grant access to your bucket and the objects in it. Requests to set ACLs or // update ACLs fail and return the AccessControlListNotSupported error code. // Requests to read ACLs are still supported. For more information, see [Controlling object ownership]in the // Amazon S3 User Guide. // // Permissions You can set access permissions by using one of the following // methods: // // - Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports a // set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined // set of grantees and permissions. Specify the canned ACL name as the value of // x-amz-acl . If you use this header, you cannot use other access // control-specific headers in your request. For more information, see [Canned ACL]. // // - Specify access permissions explicitly with the x-amz-grant-read , // x-amz-grant-read-acp , x-amz-grant-write-acp , and x-amz-grant-full-control // headers. When using these headers, you specify explicit access permissions and // grantees (Amazon Web Services accounts or Amazon S3 groups) who will receive the // permission. If you use these ACL-specific headers, you cannot use the // x-amz-acl header to set a canned ACL. These parameters map to the set of // permissions that Amazon S3 supports in an ACL. For more information, see [Access Control List (ACL) Overview]. // // You specify each grantee as a type=value pair, where the type is one of the // // following: // // - id – if the value specified is the canonical user ID of an Amazon Web // Services account // // - uri – if you are granting permissions to a predefined group // // - emailAddress – if the value specified is the email address of an Amazon Web // Services account // // Using email addresses to specify a grantee is only supported in the following // // Amazon Web Services Regions: // // - US East (N. Virginia) // // - US West (N. California) // // - US West (Oregon) // // - Asia Pacific (Singapore) // // - Asia Pacific (Sydney) // // - Asia Pacific (Tokyo) // // - Europe (Ireland) // // - South America (São Paulo) // // For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the // // Amazon Web Services General Reference. // // For example, the following x-amz-grant-write header grants create, overwrite, // // and delete objects permission to LogDelivery group predefined by Amazon S3 and // two Amazon Web Services accounts identified by their email addresses. // // x-amz-grant-write: uri="http://acs.amazonaws.com/groups/s3/LogDelivery", // // id="111122223333", id="555566667777" // // You can use either a canned ACL or specify access permissions explicitly. You // cannot do both. // // Grantee Values You can specify the person (grantee) to whom you're assigning // access rights (using request elements) in the following ways: // // - By the person's ID: // // <>ID<><>GranteesEmail<> // // DisplayName is optional and ignored in the request // // - By URI: // // <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<> // // - By Email address: // // <>Grantees@email.com<>& // // The grantee is resolved to the CanonicalUser and, in a response to a GET Object // // acl request, appears as the CanonicalUser. // // Using email addresses to specify a grantee is only supported in the following // // Amazon Web Services Regions: // // - US East (N. Virginia) // // - US West (N. California) // // - US West (Oregon) // // - Asia Pacific (Singapore) // // - Asia Pacific (Sydney) // // - Asia Pacific (Tokyo) // // - Europe (Ireland) // // - South America (São Paulo) // // For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the // // Amazon Web Services General Reference. // // The following operations are related to PutBucketAcl : // // [CreateBucket] // // [DeleteBucket] // // [GetObjectAcl] // // [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region // [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html // [Controlling object ownership]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html // [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html // [Using ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html // [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL // [GetObjectAcl]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html func (c *Client) PutBucketAcl(ctx context.Context, params *PutBucketAclInput, optFns ...func(*Options)) (*PutBucketAclOutput, error) { if params == nil { params = &PutBucketAclInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketAcl", params, optFns, c.addOperationPutBucketAclMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketAclOutput) out.ResultMetadata = metadata return out, nil } type PutBucketAclInput struct { // The bucket to which to apply the ACL. // // This member is required. Bucket *string // The canned ACL to apply to the bucket. ACL types.BucketCannedACL // Contains the elements that set the ACL permissions for an object per grantee. AccessControlPolicy *types.AccessControlPolicy // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The Base64 encoded 128-bit MD5 digest of the data. This header must be used as // a message integrity check to verify that the request body was not corrupted in // transit. For more information, go to [RFC 1864.] // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // [RFC 1864.]: http://www.ietf.org/rfc/rfc1864.txt ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Allows grantee the read, write, read ACP, and write ACP permissions on the // bucket. GrantFullControl *string // Allows grantee to list the objects in the bucket. GrantRead *string // Allows grantee to read the bucket ACL. GrantReadACP *string // Allows grantee to create new objects in the bucket. // // For the bucket and object owners of existing objects, also allows deletions and // overwrites of those objects. GrantWrite *string // Allows grantee to write the ACL for the applicable bucket. GrantWriteACP *string noSmithyDocumentSerde } func (in *PutBucketAclInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketAclOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketAclMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketAcl{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketAcl{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketAcl"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketAclValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketAcl(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketAclInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketAclUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketAclInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketAcl(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketAcl", } } // getPutBucketAclRequestAlgorithmMember gets the request checksum algorithm value // provided as input. func getPutBucketAclRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketAclInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketAclInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketAclRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketAclBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getPutBucketAclBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketAclInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketAclUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketAclBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketAnalyticsConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets an analytics configuration for the bucket (specified by the analytics // configuration ID). You can have up to 1,000 analytics configurations per bucket. // // You can choose to have storage class analysis export analysis reports sent to a // comma-separated values (CSV) flat file. See the DataExport request element. // Reports are updated daily and are based on the object filters that you // configure. When selecting data export, you specify a destination bucket and an // optional destination prefix where the file is written. You can export the data // to a destination bucket in a different account. However, the destination bucket // must be in the same Region as the bucket that you are making the PUT analytics // configuration to. For more information, see [Amazon S3 Analytics – Storage Class Analysis]. // // You must create a bucket policy on the destination bucket where the exported // file is written to grant permissions to Amazon S3 to write objects to the // bucket. For an example policy, see [Granting Permissions for Amazon S3 Inventory and Storage Class Analysis]. // // To use this operation, you must have permissions to perform the // s3:PutAnalyticsConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // PutBucketAnalyticsConfiguration has the following special errors: // // - HTTP Error: HTTP 400 Bad Request // // - Code: InvalidArgument // // - Cause: Invalid argument. // // - HTTP Error: HTTP 400 Bad Request // // - Code: TooManyConfigurations // // - Cause: You are attempting to create a new configuration but have already // reached the 1,000-configuration limit. // // - HTTP Error: HTTP 403 Forbidden // // - Code: AccessDenied // // - Cause: You are not the owner of the specified bucket, or you do not have // the s3:PutAnalyticsConfiguration bucket permission to set the configuration on // the bucket. // // The following operations are related to PutBucketAnalyticsConfiguration : // // [GetBucketAnalyticsConfiguration] // // [DeleteBucketAnalyticsConfiguration] // // [ListBucketAnalyticsConfigurations] // // [Amazon S3 Analytics – Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html // [Granting Permissions for Amazon S3 Inventory and Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-9 // [DeleteBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [GetBucketAnalyticsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html // [ListBucketAnalyticsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) PutBucketAnalyticsConfiguration(ctx context.Context, params *PutBucketAnalyticsConfigurationInput, optFns ...func(*Options)) (*PutBucketAnalyticsConfigurationOutput, error) { if params == nil { params = &PutBucketAnalyticsConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketAnalyticsConfiguration", params, optFns, c.addOperationPutBucketAnalyticsConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketAnalyticsConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutBucketAnalyticsConfigurationInput struct { // The configuration and any analyses for the analytics filter. // // This member is required. AnalyticsConfiguration *types.AnalyticsConfiguration // The name of the bucket to which an analytics configuration is stored. // // This member is required. Bucket *string // The ID that identifies the analytics configuration. // // This member is required. Id *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketAnalyticsConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketAnalyticsConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketAnalyticsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketAnalyticsConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketAnalyticsConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketAnalyticsConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketAnalyticsConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketAnalyticsConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketAnalyticsConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketAnalyticsConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketAnalyticsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketAnalyticsConfiguration", } } // getPutBucketAnalyticsConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getPutBucketAnalyticsConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketAnalyticsConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketAnalyticsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketAnalyticsConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketCors.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets the cors configuration for your bucket. If the configuration exists, // Amazon S3 replaces it. // // To use this operation, you must be allowed to perform the s3:PutBucketCORS // action. By default, the bucket owner has this permission and can grant it to // others. // // You set this configuration on a bucket so that the bucket can service // cross-origin requests. For example, you might want to enable a request whose // origin is http://www.example.com to access your Amazon S3 bucket at // my.example.bucket.com by using the browser's XMLHttpRequest capability. // // To enable cross-origin resource sharing (CORS) on a bucket, you add the cors // subresource to the bucket. The cors subresource is an XML document in which you // configure rules that identify origins and the HTTP methods that can be executed // on your bucket. The document is limited to 64 KB in size. // // When Amazon S3 receives a cross-origin request (or a pre-flight OPTIONS // request) against a bucket, it evaluates the cors configuration on the bucket // and uses the first CORSRule rule that matches the incoming browser request to // enable a cross-origin request. For a rule to match, the following conditions // must be met: // // - The request's Origin header must match AllowedOrigin elements. // // - The request method (for example, GET, PUT, HEAD, and so on) or the // Access-Control-Request-Method header in case of a pre-flight OPTIONS request // must be one of the AllowedMethod elements. // // - Every header specified in the Access-Control-Request-Headers request header // of a pre-flight request must match an AllowedHeader element. // // For more information about CORS, go to [Enabling Cross-Origin Resource Sharing] in the Amazon S3 User Guide. // // The following operations are related to PutBucketCors : // // [GetBucketCors] // // [DeleteBucketCors] // // [RESTOPTIONSobject] // // [GetBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketCors.html // [Enabling Cross-Origin Resource Sharing]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html // [RESTOPTIONSobject]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTOPTIONSobject.html // [DeleteBucketCors]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketCors.html func (c *Client) PutBucketCors(ctx context.Context, params *PutBucketCorsInput, optFns ...func(*Options)) (*PutBucketCorsOutput, error) { if params == nil { params = &PutBucketCorsInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketCors", params, optFns, c.addOperationPutBucketCorsMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketCorsOutput) out.ResultMetadata = metadata return out, nil } type PutBucketCorsInput struct { // Specifies the bucket impacted by the cors configuration. // // This member is required. Bucket *string // Describes the cross-origin access configuration for objects in an Amazon S3 // bucket. For more information, see [Enabling Cross-Origin Resource Sharing]in the Amazon S3 User Guide. // // [Enabling Cross-Origin Resource Sharing]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html // // This member is required. CORSConfiguration *types.CORSConfiguration // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The Base64 encoded 128-bit MD5 digest of the data. This header must be used as // a message integrity check to verify that the request body was not corrupted in // transit. For more information, go to [RFC 1864.] // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // [RFC 1864.]: http://www.ietf.org/rfc/rfc1864.txt ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketCorsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketCorsOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketCorsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketCors{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketCors{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketCors"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketCorsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketCors(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketCorsInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketCorsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketCorsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketCors(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketCors", } } // getPutBucketCorsRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getPutBucketCorsRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketCorsInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketCorsInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketCorsRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketCorsBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getPutBucketCorsBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketCorsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketCorsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketCorsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketEncryption.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation configures default encryption and Amazon S3 Bucket Keys for an // existing bucket. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Regional endpoint. These endpoints support path-style requests // in the format https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // By default, all buckets have a default encryption configuration that uses // server-side encryption with Amazon S3 managed keys (SSE-S3). // // - General purpose buckets // // - You can optionally configure default encryption for a bucket by using // server-side encryption with Key Management Service (KMS) keys (SSE-KMS) or // dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS). // If you specify default encryption by using SSE-KMS, you can also configure [Amazon S3 Bucket Keys]. // For information about the bucket default encryption feature, see [Amazon S3 Bucket Default Encryption]in the // Amazon S3 User Guide. // // - If you use PutBucketEncryption to set your [default bucket encryption]to SSE-KMS, you should verify // that your KMS key ID is correct. Amazon S3 doesn't validate the KMS key ID // provided in PutBucketEncryption requests. // // - Directory buckets - You can optionally configure default encryption for a // bucket by using server-side encryption with Key Management Service (KMS) keys // (SSE-KMS). // // - We recommend that the bucket's default encryption uses the desired // encryption configuration and you don't override the bucket default encryption in // your CreateSession requests or PUT object requests. Then, new objects are // automatically encrypted with the desired encryption settings. For more // information about the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads] // . // // - Your SSE-KMS configuration can only support 1 [customer managed key]per directory bucket's // lifetime. The [Amazon Web Services managed key]( aws/s3 ) isn't supported. // // - S3 Bucket Keys are always enabled for GET and PUT operations in a directory // bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy // SSE-KMS encrypted objects from general purpose buckets to directory buckets, // from directory buckets to general purpose buckets, or between directory buckets, // through [CopyObject], [UploadPartCopy], [the Copy operation in Batch Operations], or [the import jobs]. In this case, Amazon S3 makes a call to KMS every time a // copy request is made for a KMS-encrypted object. // // - When you specify an [KMS customer managed key]for encryption in your directory bucket, only use the // key ID or key ARN. The key alias format of the KMS key isn't supported. // // - For directory buckets, if you use PutBucketEncryption to set your [default bucket encryption]to // SSE-KMS, Amazon S3 validates the KMS key ID provided in PutBucketEncryption // requests. // // If you're specifying a customer managed KMS key, we recommend using a fully // qualified KMS key ARN. If you use a KMS key alias instead, then KMS resolves the // key within the requester’s account. This behavior can result in data that's // encrypted with a KMS key that belongs to the requester, and not the bucket // owner. // // Also, this action requires Amazon Web Services Signature Version 4. For more // information, see [Authenticating Requests (Amazon Web Services Signature Version 4)]. // // Permissions // // - General purpose bucket permissions - The s3:PutEncryptionConfiguration // permission is required in a policy. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Operations]and [Managing Access Permissions to Your Amazon S3 Resources]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation, you // must have the s3express:PutEncryptionConfiguration permission in an IAM // identity-based policy instead of a bucket policy. Cross-account access to this // API operation isn't supported. This operation can only be performed by the // Amazon Web Services account that owns the resource. For more information about // directory bucket policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide. // // To set a directory bucket default encryption with SSE-KMS, you must also have // // the kms:GenerateDataKey and the kms:Decrypt permissions in IAM identity-based // policies and KMS key policies for the target KMS key. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region-code.amazonaws.com . // // The following operations are related to PutBucketEncryption : // // [GetBucketEncryption] // // [DeleteBucketEncryption] // // [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [KMS customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk // [Amazon S3 Bucket Default Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [Permissions Related to Bucket Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html // [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk // [Authenticating Requests (Amazon Web Services Signature Version 4)]: https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html // [Amazon S3 Bucket Keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html // [GetBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html // [DeleteBucketEncryption]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketEncryption.html // [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk // [default bucket encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html // [the import jobs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job // [the Copy operation in Batch Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html func (c *Client) PutBucketEncryption(ctx context.Context, params *PutBucketEncryptionInput, optFns ...func(*Options)) (*PutBucketEncryptionOutput, error) { if params == nil { params = &PutBucketEncryptionInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketEncryption", params, optFns, c.addOperationPutBucketEncryptionMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketEncryptionOutput) out.ResultMetadata = metadata return out, nil } type PutBucketEncryptionInput struct { // Specifies default encryption for a bucket using server-side encryption with // different key options. // // Directory buckets - When you use this operation with a directory bucket, you // must use path-style requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. Directory bucket names must be // unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must // also follow the format bucket-base-name--zone-id--x-s3 (for example, // DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // // This member is required. Bucket *string // Specifies the default server-side-encryption configuration. // // This member is required. ServerSideEncryptionConfiguration *types.ServerSideEncryptionConfiguration // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // For directory buckets, when you use Amazon Web Services SDKs, CRC32 is the // default checksum algorithm that's used for performance. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The Base64 encoded 128-bit MD5 digest of the server-side encryption // configuration. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // This functionality is not supported for directory buckets. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // For directory buckets, this header is not supported in this API operation. If // you specify this header, the request fails with the HTTP status code 501 Not // Implemented . ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketEncryptionInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketEncryptionOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketEncryptionMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketEncryption{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketEncryption{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketEncryption"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketEncryptionValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketEncryption(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketEncryptionInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketEncryptionUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketEncryptionInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketEncryption(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketEncryption", } } // getPutBucketEncryptionRequestAlgorithmMember gets the request checksum // algorithm value provided as input. func getPutBucketEncryptionRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketEncryptionInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketEncryptionInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketEncryptionRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketEncryptionBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getPutBucketEncryptionBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketEncryptionInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketEncryptionUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketEncryptionBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketIntelligentTieringConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can // have up to 1,000 S3 Intelligent-Tiering configurations per bucket. // // The S3 Intelligent-Tiering storage class is designed to optimize storage costs // by automatically moving data to the most cost-effective storage access tier, // without performance impact or operational overhead. S3 Intelligent-Tiering // delivers automatic cost savings in three low latency and high throughput access // tiers. To get the lowest storage cost on data that can be accessed in minutes to // hours, you can choose to activate additional archiving capabilities. // // The S3 Intelligent-Tiering storage class is the ideal storage class for data // with unknown, changing, or unpredictable access patterns, independent of object // size or retention period. If the size of an object is less than 128 KB, it is // not monitored and not eligible for auto-tiering. Smaller objects can be stored, // but they are always charged at the Frequent Access tier rates in the S3 // Intelligent-Tiering storage class. // // For more information, see [Storage class for automatically optimizing frequently and infrequently accessed objects]. // // Operations related to PutBucketIntelligentTieringConfiguration include: // // [DeleteBucketIntelligentTieringConfiguration] // // [GetBucketIntelligentTieringConfiguration] // // [ListBucketIntelligentTieringConfigurations] // // You only need S3 Intelligent-Tiering enabled on a bucket if you want to // automatically move objects stored in the S3 Intelligent-Tiering storage class to // the Archive Access or Deep Archive Access tier. // // PutBucketIntelligentTieringConfiguration has the following special errors: // // HTTP 400 Bad Request Error Code: InvalidArgument // // Cause: Invalid Argument // // HTTP 400 Bad Request Error Code: TooManyConfigurations // // Cause: You are attempting to create a new configuration but have already // reached the 1,000-configuration limit. // // HTTP 403 Forbidden Error Cause: You are not the owner of the specified bucket, // or you do not have the s3:PutIntelligentTieringConfiguration bucket permission // to set the configuration on the bucket. // // [ListBucketIntelligentTieringConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html // [GetBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html // [Storage class for automatically optimizing frequently and infrequently accessed objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access // [DeleteBucketIntelligentTieringConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html func (c *Client) PutBucketIntelligentTieringConfiguration(ctx context.Context, params *PutBucketIntelligentTieringConfigurationInput, optFns ...func(*Options)) (*PutBucketIntelligentTieringConfigurationOutput, error) { if params == nil { params = &PutBucketIntelligentTieringConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketIntelligentTieringConfiguration", params, optFns, c.addOperationPutBucketIntelligentTieringConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketIntelligentTieringConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutBucketIntelligentTieringConfigurationInput struct { // The name of the Amazon S3 bucket whose configuration you want to modify or // retrieve. // // This member is required. Bucket *string // The ID used to identify the S3 Intelligent-Tiering configuration. // // This member is required. Id *string // Container for S3 Intelligent-Tiering configuration. // // This member is required. IntelligentTieringConfiguration *types.IntelligentTieringConfiguration noSmithyDocumentSerde } func (in *PutBucketIntelligentTieringConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketIntelligentTieringConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketIntelligentTieringConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketIntelligentTieringConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketIntelligentTieringConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketIntelligentTieringConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketIntelligentTieringConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketIntelligentTieringConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketIntelligentTieringConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketIntelligentTieringConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketIntelligentTieringConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketIntelligentTieringConfiguration", } } // getPutBucketIntelligentTieringConfigurationBucketMember returns a pointer to // string denoting a provided bucket member valueand a boolean indicating if the // input has a modeled bucket name, func getPutBucketIntelligentTieringConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketIntelligentTieringConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketIntelligentTieringConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketIntelligentTieringConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketInventoryConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // This implementation of the PUT action adds an inventory configuration // (identified by the inventory ID) to the bucket. You can have up to 1,000 // inventory configurations per bucket. // // Amazon S3 inventory generates inventories of the objects in the bucket on a // daily or weekly basis, and the results are published to a flat file. The bucket // that is inventoried is called the source bucket, and the bucket where the // inventory flat file is stored is called the destination bucket. The destination // bucket must be in the same Amazon Web Services Region as the source bucket. // // When you configure an inventory for a source bucket, you specify the // destination bucket where you want the inventory to be stored, and whether to // generate the inventory daily or weekly. You can also configure what object // metadata to include and whether to inventory all object versions or only current // versions. For more information, see [Amazon S3 Inventory]in the Amazon S3 User Guide. // // You must create a bucket policy on the destination bucket to grant permissions // to Amazon S3 to write objects to the bucket in the defined location. For an // example policy, see [Granting Permissions for Amazon S3 Inventory and Storage Class Analysis]. // // Permissions To use this operation, you must have permission to perform the // s3:PutInventoryConfiguration action. The bucket owner has this permission by // default and can grant this permission to others. // // The s3:PutInventoryConfiguration permission allows a user to create an [S3 Inventory] report // that includes all object metadata fields available and to specify the // destination bucket to store the inventory. A user with read access to objects in // the destination bucket can also access all object metadata fields that are // available in the inventory report. // // To restrict access to an inventory report, see [Restricting access to an Amazon S3 Inventory report] in the Amazon S3 User Guide. // For more information about the metadata fields available in S3 Inventory, see [Amazon S3 Inventory lists] // in the Amazon S3 User Guide. For more information about permissions, see [Permissions related to bucket subresource operations]and [Identity and access management in Amazon S3] // in the Amazon S3 User Guide. // // PutBucketInventoryConfiguration has the following special errors: // // HTTP 400 Bad Request Error Code: InvalidArgument // // Cause: Invalid Argument // // HTTP 400 Bad Request Error Code: TooManyConfigurations // // Cause: You are attempting to create a new configuration but have already // reached the 1,000-configuration limit. // // HTTP 403 Forbidden Error Cause: You are not the owner of the specified bucket, // or you do not have the s3:PutInventoryConfiguration bucket permission to set // the configuration on the bucket. // // The following operations are related to PutBucketInventoryConfiguration : // // [GetBucketInventoryConfiguration] // // [DeleteBucketInventoryConfiguration] // // [ListBucketInventoryConfigurations] // // [Granting Permissions for Amazon S3 Inventory and Storage Class Analysis]: https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-9 // [Amazon S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html // [ListBucketInventoryConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html // [S3 Inventory]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html // [Permissions related to bucket subresource operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [DeleteBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html // [Identity and access management in Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [Restricting access to an Amazon S3 Inventory report]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-10 // [Amazon S3 Inventory lists]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html#storage-inventory-contents // [GetBucketInventoryConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html func (c *Client) PutBucketInventoryConfiguration(ctx context.Context, params *PutBucketInventoryConfigurationInput, optFns ...func(*Options)) (*PutBucketInventoryConfigurationOutput, error) { if params == nil { params = &PutBucketInventoryConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketInventoryConfiguration", params, optFns, c.addOperationPutBucketInventoryConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketInventoryConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutBucketInventoryConfigurationInput struct { // The name of the bucket where the inventory configuration will be stored. // // This member is required. Bucket *string // The ID used to identify the inventory configuration. // // This member is required. Id *string // Specifies the inventory configuration. // // This member is required. InventoryConfiguration *types.InventoryConfiguration // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketInventoryConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketInventoryConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketInventoryConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketInventoryConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketInventoryConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketInventoryConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketInventoryConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketInventoryConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketInventoryConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketInventoryConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketInventoryConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketInventoryConfiguration", } } // getPutBucketInventoryConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getPutBucketInventoryConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketInventoryConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketInventoryConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketInventoryConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketLifecycleConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Creates a new lifecycle configuration for the bucket or replaces an existing // lifecycle configuration. Keep in mind that this will overwrite an existing // lifecycle configuration, so if you want to retain any configuration details, // they must be included in the new lifecycle configuration. For information about // lifecycle configuration, see [Managing your storage lifecycle]. // // Bucket lifecycle configuration now supports specifying a lifecycle rule using // an object key name prefix, one or more object tags, object size, or any // combination of these. Accordingly, this section describes the latest API. The // previous version of the API supported filtering based only on an object key name // prefix, which is supported for backward compatibility. For the related API // description, see [PutBucketLifecycle]. // // Rules Permissions HTTP Host header syntax You specify the lifecycle // configuration in your request body. The lifecycle configuration is specified as // XML consisting of one or more rules. An Amazon S3 Lifecycle configuration can // have up to 1,000 rules. This limit is not adjustable. // // Bucket lifecycle configuration supports specifying a lifecycle rule using an // object key name prefix, one or more object tags, object size, or any combination // of these. Accordingly, this section describes the latest API. The previous // version of the API supported filtering based only on an object key name prefix, // which is supported for backward compatibility for general purpose buckets. For // the related API description, see [PutBucketLifecycle]. // // Lifecyle configurations for directory buckets only support expiring objects and // cancelling multipart uploads. Expiring of versioned objects,transitions and tag // filters are not supported. // // A lifecycle rule consists of the following: // // - A filter identifying a subset of objects to which the rule applies. The // filter can be based on a key name prefix, object tags, object size, or any // combination of these. // // - A status indicating whether the rule is in effect. // // - One or more lifecycle transition and expiration actions that you want // Amazon S3 to perform on the objects identified by the filter. If the state of // your bucket is versioning-enabled or versioning-suspended, you can have many // versions of the same object (one current version and zero or more noncurrent // versions). Amazon S3 provides predefined actions that you can specify for // current and noncurrent object versions. // // For more information, see [Object Lifecycle Management] and [Lifecycle Configuration Elements]. // // - General purpose bucket permissions - By default, all Amazon S3 resources // are private, including buckets, objects, and related subresources (for example, // lifecycle configuration and website configuration). Only the resource owner // (that is, the Amazon Web Services account that created it) can access the // resource. The resource owner can optionally grant access permissions to others // by writing an access policy. For this operation, a user must have the // s3:PutLifecycleConfiguration permission. // // You can also explicitly deny permissions. An explicit deny also supersedes any // // other permissions. If you want to block users or accounts from removing or // deleting objects from your bucket, you must deny them permissions for the // following actions: // // - s3:DeleteObject // // - s3:DeleteObjectVersion // // - s3:PutLifecycleConfiguration // // For more information about permissions, see [Managing Access Permissions to Your Amazon S3 Resources]. // // - Directory bucket permissions - You must have the // s3express:PutLifecycleConfiguration permission in an IAM identity-based policy // to use this operation. Cross-account access to this API operation isn't // supported. The resource owner can optionally grant access permissions to others // by creating a role or user for them as long as they are within the same account // as the owner and resource. // // For more information about directory bucket policies and permissions, see [Authorizing Regional endpoint APIs with IAM]in // // the Amazon S3 User Guide. // // Directory buckets - For directory buckets, you must make requests for this API // // operation to the Regional endpoint. These endpoints support path-style requests // in the format https://s3express-control.region-code.amazonaws.com/bucket-name // . Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Directory buckets - The HTTP Host header syntax is // s3express-control.region.amazonaws.com . // // The following operations are related to PutBucketLifecycleConfiguration : // // [GetBucketLifecycleConfiguration] // // [DeleteBucketLifecycle] // // [Object Lifecycle Management]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html // [Lifecycle Configuration Elements]: https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html // [GetBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html // [Authorizing Regional endpoint APIs with IAM]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html // [PutBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [DeleteBucketLifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html // [Managing your storage lifecycle]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html func (c *Client) PutBucketLifecycleConfiguration(ctx context.Context, params *PutBucketLifecycleConfigurationInput, optFns ...func(*Options)) (*PutBucketLifecycleConfigurationOutput, error) { if params == nil { params = &PutBucketLifecycleConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketLifecycleConfiguration", params, optFns, c.addOperationPutBucketLifecycleConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketLifecycleConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutBucketLifecycleConfigurationInput struct { // The name of the bucket for which to set the configuration. // // This member is required. Bucket *string // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // This parameter applies to general purpose buckets only. It is not supported for // directory bucket lifecycle configurations. ExpectedBucketOwner *string // Container for lifecycle rules. You can add as many as 1,000 rules. LifecycleConfiguration *types.BucketLifecycleConfiguration // Indicates which default minimum object size behavior is applied to the // lifecycle configuration. // // This parameter applies to general purpose buckets only. It is not supported for // directory bucket lifecycle configurations. // // - all_storage_classes_128K - Objects smaller than 128 KB will not transition // to any storage class by default. // // - varies_by_storage_class - Objects smaller than 128 KB will transition to // Glacier Flexible Retrieval or Glacier Deep Archive storage classes. By default, // all other storage classes will prevent transitions smaller than 128 KB. // // To customize the minimum object size for any transition you can add a filter // that specifies a custom ObjectSizeGreaterThan or ObjectSizeLessThan in the body // of your transition rule. Custom filters always take precedence over the default // transition behavior. TransitionDefaultMinimumObjectSize types.TransitionDefaultMinimumObjectSize noSmithyDocumentSerde } func (in *PutBucketLifecycleConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketLifecycleConfigurationOutput struct { // Indicates which default minimum object size behavior is applied to the // lifecycle configuration. // // This parameter applies to general purpose buckets only. It is not supported for // directory bucket lifecycle configurations. // // - all_storage_classes_128K - Objects smaller than 128 KB will not transition // to any storage class by default. // // - varies_by_storage_class - Objects smaller than 128 KB will transition to // Glacier Flexible Retrieval or Glacier Deep Archive storage classes. By default, // all other storage classes will prevent transitions smaller than 128 KB. // // To customize the minimum object size for any transition you can add a filter // that specifies a custom ObjectSizeGreaterThan or ObjectSizeLessThan in the body // of your transition rule. Custom filters always take precedence over the default // transition behavior. TransitionDefaultMinimumObjectSize types.TransitionDefaultMinimumObjectSize // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketLifecycleConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketLifecycleConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketLifecycleConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketLifecycleConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketLifecycleConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketLifecycleConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketLifecycleConfigurationInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketLifecycleConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketLifecycleConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketLifecycleConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketLifecycleConfiguration", } } // getPutBucketLifecycleConfigurationRequestAlgorithmMember gets the request // checksum algorithm value provided as input. func getPutBucketLifecycleConfigurationRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketLifecycleConfigurationInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketLifecycleConfigurationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketLifecycleConfigurationRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketLifecycleConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getPutBucketLifecycleConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketLifecycleConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketLifecycleConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketLifecycleConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketLogging.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Set the logging parameters for a bucket and to specify permissions for who can // view and modify the logging parameters. All logs are saved to buckets in the // same Amazon Web Services Region as the source bucket. To set the logging status // of a bucket, you must be the bucket owner. // // The bucket owner is automatically granted FULL_CONTROL to all logs. You use the // Grantee request element to grant access to other people. The Permissions // request element specifies the kind of access the grantee has to the logs. // // If the target bucket for log delivery uses the bucket owner enforced setting // for S3 Object Ownership, you can't use the Grantee request element to grant // access to others. Permissions can only be granted using policies. For more // information, see [Permissions for server access log delivery]in the Amazon S3 User Guide. // // Grantee Values You can specify the person (grantee) to whom you're assigning // access rights (by using request elements) in the following ways: // // - By the person's ID: // // <>ID<><>GranteesEmail<> // // DisplayName is optional and ignored in the request. // // - By Email address: // // <>Grantees@email.com<> // // The grantee is resolved to the CanonicalUser and, in a response to a // // GETObjectAcl request, appears as the CanonicalUser. // // - By URI: // // <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<> // // To enable logging, you use LoggingEnabled and its children request elements. To // disable logging, you use an empty BucketLoggingStatus request element: // // For more information about server access logging, see [Server Access Logging] in the Amazon S3 User // Guide. // // For more information about creating a bucket, see [CreateBucket]. For more information about // returning the logging status of a bucket, see [GetBucketLogging]. // // The following operations are related to PutBucketLogging : // // [PutObject] // // [DeleteBucket] // // [CreateBucket] // // [GetBucketLogging] // // [Permissions for server access log delivery]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html#grant-log-delivery-permissions-general // [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html // [GetBucketLogging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLogging.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html // [Server Access Logging]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html func (c *Client) PutBucketLogging(ctx context.Context, params *PutBucketLoggingInput, optFns ...func(*Options)) (*PutBucketLoggingOutput, error) { if params == nil { params = &PutBucketLoggingInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketLogging", params, optFns, c.addOperationPutBucketLoggingMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketLoggingOutput) out.ResultMetadata = metadata return out, nil } type PutBucketLoggingInput struct { // The name of the bucket for which to set the logging parameters. // // This member is required. Bucket *string // Container for logging status information. // // This member is required. BucketLoggingStatus *types.BucketLoggingStatus // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The MD5 hash of the PutBucketLogging request body. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketLoggingInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketLoggingOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketLoggingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketLogging{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketLogging{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketLogging"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketLoggingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketLogging(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketLoggingInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketLoggingUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketLoggingInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketLogging(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketLogging", } } // getPutBucketLoggingRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getPutBucketLoggingRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketLoggingInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketLoggingInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketLoggingRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketLoggingBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getPutBucketLoggingBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketLoggingInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketLoggingUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketLoggingBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketMetricsConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets a metrics configuration (specified by the metrics configuration ID) for // the bucket. You can have up to 1,000 metrics configurations per bucket. If // you're updating an existing metrics configuration, note that this is a full // replacement of the existing metrics configuration. If you don't include the // elements you want to keep, they are erased. // // To use this operation, you must have permissions to perform the // s3:PutMetricsConfiguration action. The bucket owner has this permission by // default. The bucket owner can grant this permission to others. For more // information about permissions, see [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // For information about CloudWatch request metrics for Amazon S3, see [Monitoring Metrics with Amazon CloudWatch]. // // The following operations are related to PutBucketMetricsConfiguration : // // [DeleteBucketMetricsConfiguration] // // [GetBucketMetricsConfiguration] // // [ListBucketMetricsConfigurations] // // PutBucketMetricsConfiguration has the following special error: // // - Error code: TooManyConfigurations // // - Description: You are attempting to create a new configuration but have // already reached the 1,000-configuration limit. // // - HTTP Status Code: HTTP 400 Bad Request // // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Monitoring Metrics with Amazon CloudWatch]: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html // [GetBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html // [ListBucketMetricsConfigurations]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html // [DeleteBucketMetricsConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) PutBucketMetricsConfiguration(ctx context.Context, params *PutBucketMetricsConfigurationInput, optFns ...func(*Options)) (*PutBucketMetricsConfigurationOutput, error) { if params == nil { params = &PutBucketMetricsConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketMetricsConfiguration", params, optFns, c.addOperationPutBucketMetricsConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketMetricsConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutBucketMetricsConfigurationInput struct { // The name of the bucket for which the metrics configuration is set. // // This member is required. Bucket *string // The ID used to identify the metrics configuration. The ID has a 64 character // limit and can only contain letters, numbers, periods, dashes, and underscores. // // This member is required. Id *string // Specifies the metrics configuration. // // This member is required. MetricsConfiguration *types.MetricsConfiguration // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketMetricsConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketMetricsConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketMetricsConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketMetricsConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketMetricsConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketMetricsConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketMetricsConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketMetricsConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketMetricsConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketMetricsConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketMetricsConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketMetricsConfiguration", } } // getPutBucketMetricsConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getPutBucketMetricsConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketMetricsConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketMetricsConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketMetricsConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketNotificationConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Enables notifications of specified events for a bucket. For more information // about event notifications, see [Configuring Event Notifications]. // // Using this API, you can replace an existing notification configuration. The // configuration is an XML file that defines the event types that you want Amazon // S3 to publish and the destination where you want Amazon S3 to publish an event // notification when it detects an event of the specified type. // // By default, your bucket has no event notifications configured. That is, the // notification configuration will be an empty NotificationConfiguration . // // This action replaces the existing notification configuration with the // configuration you include in the request body. // // After Amazon S3 receives this request, it first verifies that any Amazon Simple // Notification Service (Amazon SNS) or Amazon Simple Queue Service (Amazon SQS) // destination exists, and that the bucket owner has permission to publish to it by // sending a test notification. In the case of Lambda destinations, Amazon S3 // verifies that the Lambda function permissions grant Amazon S3 permission to // invoke the function from the Amazon S3 bucket. For more information, see [Configuring Notifications for Amazon S3 Events]. // // You can disable notifications by adding the empty NotificationConfiguration // element. // // For more information about the number of event notification configurations that // you can create per bucket, see [Amazon S3 service quotas]in Amazon Web Services General Reference. // // By default, only the bucket owner can configure notifications on a bucket. // However, bucket owners can use a bucket policy to grant permission to other // users to set this configuration with the required s3:PutBucketNotification // permission. // // The PUT notification is an atomic operation. For example, suppose your // notification configuration includes SNS topic, SQS queue, and Lambda function // configurations. When you send a PUT request with this configuration, Amazon S3 // sends test messages to your SNS topic. If the message fails, the entire PUT // action will fail, and Amazon S3 will not add the configuration to your bucket. // // If the configuration in the request body includes only one TopicConfiguration // specifying only the s3:ReducedRedundancyLostObject event type, the response // will also include the x-amz-sns-test-message-id header containing the message // ID of the test notification sent to the topic. // // The following action is related to PutBucketNotificationConfiguration : // // [GetBucketNotificationConfiguration] // // [Configuring Notifications for Amazon S3 Events]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html // [Amazon S3 service quotas]: https://docs.aws.amazon.com/general/latest/gr/s3.html#limits_s3 // [GetBucketNotificationConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketNotificationConfiguration.html // [Configuring Event Notifications]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html func (c *Client) PutBucketNotificationConfiguration(ctx context.Context, params *PutBucketNotificationConfigurationInput, optFns ...func(*Options)) (*PutBucketNotificationConfigurationOutput, error) { if params == nil { params = &PutBucketNotificationConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketNotificationConfiguration", params, optFns, c.addOperationPutBucketNotificationConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketNotificationConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutBucketNotificationConfigurationInput struct { // The name of the bucket. // // This member is required. Bucket *string // A container for specifying the notification configuration of the bucket. If // this element is empty, notifications are turned off for the bucket. // // This member is required. NotificationConfiguration *types.NotificationConfiguration // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Skips validation of Amazon SQS, Amazon SNS, and Lambda destinations. True or // false value. SkipDestinationValidation *bool noSmithyDocumentSerde } func (in *PutBucketNotificationConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketNotificationConfigurationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketNotificationConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketNotificationConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketNotificationConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketNotificationConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketNotificationConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketNotificationConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketNotificationConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketNotificationConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketNotificationConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketNotificationConfiguration", } } // getPutBucketNotificationConfigurationBucketMember returns a pointer to string // denoting a provided bucket member valueand a boolean indicating if the input has // a modeled bucket name, func getPutBucketNotificationConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketNotificationConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketNotificationConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketNotificationConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketOwnershipControls.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Creates or modifies OwnershipControls for an Amazon S3 bucket. To use this // operation, you must have the s3:PutBucketOwnershipControls permission. For more // information about Amazon S3 permissions, see [Specifying permissions in a policy]. // // For information about Amazon S3 Object Ownership, see [Using object ownership]. // // The following operations are related to PutBucketOwnershipControls : // // # GetBucketOwnershipControls // // # DeleteBucketOwnershipControls // // [Specifying permissions in a policy]: https://docs.aws.amazon.com/AmazonS3/latest/user-guide/using-with-s3-actions.html // [Using object ownership]: https://docs.aws.amazon.com/AmazonS3/latest/user-guide/about-object-ownership.html func (c *Client) PutBucketOwnershipControls(ctx context.Context, params *PutBucketOwnershipControlsInput, optFns ...func(*Options)) (*PutBucketOwnershipControlsOutput, error) { if params == nil { params = &PutBucketOwnershipControlsInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketOwnershipControls", params, optFns, c.addOperationPutBucketOwnershipControlsMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketOwnershipControlsOutput) out.ResultMetadata = metadata return out, nil } type PutBucketOwnershipControlsInput struct { // The name of the Amazon S3 bucket whose OwnershipControls you want to set. // // This member is required. Bucket *string // The OwnershipControls (BucketOwnerEnforced, BucketOwnerPreferred, or // ObjectWriter) that you want to apply to this Amazon S3 bucket. // // This member is required. OwnershipControls *types.OwnershipControls // The MD5 hash of the OwnershipControls request body. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketOwnershipControlsInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketOwnershipControlsOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketOwnershipControlsMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketOwnershipControls{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketOwnershipControls{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketOwnershipControls"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketOwnershipControlsValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketOwnershipControls(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketOwnershipControlsInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketOwnershipControlsUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketOwnershipControlsInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketOwnershipControls(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketOwnershipControls", } } func addPutBucketOwnershipControlsInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: nil, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketOwnershipControlsBucketMember returns a pointer to string denoting // a provided bucket member valueand a boolean indicating if the input has a // modeled bucket name, func getPutBucketOwnershipControlsBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketOwnershipControlsInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketOwnershipControlsUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketOwnershipControlsBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketPolicy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // Applies an Amazon S3 bucket policy to an Amazon S3 bucket. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Regional endpoint. These endpoints support path-style requests // in the format https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. For more information about // endpoints in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more // information about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions If you are using an identity other than the root user of the Amazon // Web Services account that owns the bucket, the calling identity must both have // the PutBucketPolicy permissions on the specified bucket and belong to the // bucket owner's account in order to use this operation. // // If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403 Access // Denied error. If you have the correct permissions, but you're not using an // identity that belongs to the bucket owner's account, Amazon S3 returns a 405 // Method Not Allowed error. // // To ensure that bucket owners don't inadvertently lock themselves out of their // own buckets, the root principal in a bucket owner's Amazon Web Services account // can perform the GetBucketPolicy , PutBucketPolicy , and DeleteBucketPolicy API // actions, even if their bucket policy explicitly denies the root principal's // access. Bucket owner root principals can only be blocked from performing these // API actions by VPC endpoint policies and Amazon Web Services Organizations // policies. // // - General purpose bucket permissions - The s3:PutBucketPolicy permission is // required in a policy. For more information about general purpose buckets bucket // policies, see [Using Bucket Policies and User Policies]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation, you // must have the s3express:PutBucketPolicy permission in an IAM identity-based // policy instead of a bucket policy. Cross-account access to this API operation // isn't supported. This operation can only be performed by the Amazon Web Services // account that owns the resource. For more information about directory bucket // policies and permissions, see [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]in the Amazon S3 User Guide. // // Example bucket policies General purpose buckets example bucket policies - See [Bucket policy examples] // in the Amazon S3 User Guide. // // Directory bucket example bucket policies - See [Example bucket policies for S3 Express One Zone] in the Amazon S3 User Guide. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // s3express-control.region-code.amazonaws.com . // // The following operations are related to PutBucketPolicy : // // [CreateBucket] // // [DeleteBucket] // // [Bucket policy examples]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html // [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html // [Using Bucket Policies and User Policies]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html func (c *Client) PutBucketPolicy(ctx context.Context, params *PutBucketPolicyInput, optFns ...func(*Options)) (*PutBucketPolicyOutput, error) { if params == nil { params = &PutBucketPolicyInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketPolicy", params, optFns, c.addOperationPutBucketPolicyMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketPolicyOutput) out.ResultMetadata = metadata return out, nil } type PutBucketPolicyInput struct { // The name of the bucket. // // Directory buckets - When you use this operation with a directory bucket, you // must use path-style requests in the format // https://s3express-control.region-code.amazonaws.com/bucket-name . // Virtual-hosted-style requests aren't supported. Directory bucket names must be // unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must // also follow the format bucket-base-name--zone-id--x-s3 (for example, // DOC-EXAMPLE-BUCKET--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // // This member is required. Bucket *string // The bucket policy as a JSON document. // // For directory buckets, the only IAM action supported in the bucket policy is // s3express:CreateSession . // // This member is required. Policy *string // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum-algorithm or x-amz-trailer header sent. Otherwise, Amazon S3 // fails the request with the HTTP status code 400 Bad Request . // // For the x-amz-checksum-algorithm header, replace algorithm with the // supported algorithm from the following list: // // - CRC32 // // - CRC32C // // - CRC64NVME // // - SHA1 // // - SHA256 // // For more information, see [Checking object integrity] in the Amazon S3 User Guide. // // If the individual checksum value you provide through x-amz-checksum-algorithm // doesn't match the checksum algorithm you set through // x-amz-sdk-checksum-algorithm , Amazon S3 fails the request with a BadDigest // error. // // For directory buckets, when you use Amazon Web Services SDKs, CRC32 is the // default checksum algorithm that's used for performance. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // Set this parameter to true to confirm that you want to remove your permissions // to change this bucket policy in the future. // // This functionality is not supported for directory buckets. ConfirmRemoveSelfBucketAccess *bool // The MD5 hash of the request body. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // This functionality is not supported for directory buckets. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). // // For directory buckets, this header is not supported in this API operation. If // you specify this header, the request fails with the HTTP status code 501 Not // Implemented . ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketPolicyInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketPolicyOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketPolicyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketPolicy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketPolicy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketPolicy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketPolicyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketPolicy(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketPolicyInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketPolicyUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketPolicyInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketPolicy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketPolicy", } } // getPutBucketPolicyRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getPutBucketPolicyRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketPolicyInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketPolicyInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketPolicyRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketPolicyBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getPutBucketPolicyBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketPolicyInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketPolicyUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketPolicyBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketReplication.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Creates a replication configuration or replaces an existing one. For more // information, see [Replication]in the Amazon S3 User Guide. // // Specify the replication configuration in the request body. In the replication // configuration, you provide the name of the destination bucket or buckets where // you want Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume // to replicate objects on your behalf, and other relevant information. You can // invoke this request for a specific Amazon Web Services Region by using the [aws:RequestedRegion] // aws:RequestedRegion condition key. // // A replication configuration must include at least one rule, and can contain a // maximum of 1,000. Each rule identifies a subset of objects to replicate by // filtering the objects in the source bucket. To choose additional subsets of // objects to replicate, add a rule for each subset. // // To specify a subset of the objects in the source bucket to apply a replication // rule to, add the Filter element as a child of the Rule element. You can filter // objects based on an object key prefix, one or more object tags, or both. When // you add the Filter element in the configuration, you must also add the following // elements: DeleteMarkerReplication , Status , and Priority . // // If you are using an earlier version of the replication configuration, Amazon S3 // handles replication of delete markers differently. For more information, see [Backward Compatibility]. // // For information about enabling versioning on a bucket, see [Using Versioning]. // // Handling Replication of Encrypted Objects By default, Amazon S3 doesn't // replicate objects that are stored at rest using server-side encryption with KMS // keys. To replicate Amazon Web Services KMS-encrypted objects, add the following: // SourceSelectionCriteria , SseKmsEncryptedObjects , Status , // EncryptionConfiguration , and ReplicaKmsKeyID . For information about // replication configuration, see [Replicating Objects Created with SSE Using KMS keys]. // // For information on PutBucketReplication errors, see [List of replication-related error codes] // // Permissions To create a PutBucketReplication request, you must have // s3:PutReplicationConfiguration permissions for the bucket. // // By default, a resource owner, in this case the Amazon Web Services account that // created the bucket, can perform this operation. The resource owner can also // grant others permissions to perform the operation. For more information about // permissions, see [Specifying Permissions in a Policy]and [Managing Access Permissions to Your Amazon S3 Resources]. // // To perform this operation, the user or role performing the action must have the [iam:PassRole] // permission. // // The following operations are related to PutBucketReplication : // // [GetBucketReplication] // // [DeleteBucketReplication] // // [iam:PassRole]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html // [GetBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html // [aws:RequestedRegion]: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion // [Replicating Objects Created with SSE Using KMS keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-config-for-kms-objects.html // [Using Versioning]: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html // [Replication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html // [List of replication-related error codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ReplicationErrorCodeList // [Backward Compatibility]: https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-backward-compat-considerations // [DeleteBucketReplication]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html func (c *Client) PutBucketReplication(ctx context.Context, params *PutBucketReplicationInput, optFns ...func(*Options)) (*PutBucketReplicationOutput, error) { if params == nil { params = &PutBucketReplicationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketReplication", params, optFns, c.addOperationPutBucketReplicationMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketReplicationOutput) out.ResultMetadata = metadata return out, nil } type PutBucketReplicationInput struct { // The name of the bucket // // This member is required. Bucket *string // A container for replication rules. You can add up to 1,000 rules. The maximum // size of a replication configuration is 2 MB. // // This member is required. ReplicationConfiguration *types.ReplicationConfiguration // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The Base64 encoded 128-bit MD5 digest of the data. You must use this header as // a message integrity check to verify that the request body was not corrupted in // transit. For more information, see [RFC 1864]. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // A token to allow Object Lock to be enabled for an existing bucket. Token *string noSmithyDocumentSerde } func (in *PutBucketReplicationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketReplicationOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketReplicationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketReplication{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketReplication{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketReplication"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketReplicationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketReplication(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketReplicationInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketReplicationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketReplicationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketReplication(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketReplication", } } // getPutBucketReplicationRequestAlgorithmMember gets the request checksum // algorithm value provided as input. func getPutBucketReplicationRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketReplicationInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketReplicationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketReplicationRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketReplicationBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getPutBucketReplicationBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketReplicationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketReplicationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketReplicationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketRequestPayment.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets the request payment configuration for a bucket. By default, the bucket // owner pays for downloads from the bucket. This configuration parameter enables // the bucket owner (only) to specify that the person requesting the download will // be charged for the download. For more information, see [Requester Pays Buckets]. // // The following operations are related to PutBucketRequestPayment : // // [CreateBucket] // // [GetBucketRequestPayment] // // [GetBucketRequestPayment]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketRequestPayment.html // [Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html func (c *Client) PutBucketRequestPayment(ctx context.Context, params *PutBucketRequestPaymentInput, optFns ...func(*Options)) (*PutBucketRequestPaymentOutput, error) { if params == nil { params = &PutBucketRequestPaymentInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketRequestPayment", params, optFns, c.addOperationPutBucketRequestPaymentMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketRequestPaymentOutput) out.ResultMetadata = metadata return out, nil } type PutBucketRequestPaymentInput struct { // The bucket name. // // This member is required. Bucket *string // Container for Payer. // // This member is required. RequestPaymentConfiguration *types.RequestPaymentConfiguration // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The Base64 encoded 128-bit MD5 digest of the data. You must use this header as // a message integrity check to verify that the request body was not corrupted in // transit. For more information, see [RFC 1864]. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketRequestPaymentInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketRequestPaymentOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketRequestPaymentMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketRequestPayment{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketRequestPayment{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketRequestPayment"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketRequestPaymentValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketRequestPayment(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketRequestPaymentInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketRequestPaymentUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketRequestPaymentInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketRequestPayment(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketRequestPayment", } } // getPutBucketRequestPaymentRequestAlgorithmMember gets the request checksum // algorithm value provided as input. func getPutBucketRequestPaymentRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketRequestPaymentInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketRequestPaymentInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketRequestPaymentRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketRequestPaymentBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getPutBucketRequestPaymentBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketRequestPaymentInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketRequestPaymentUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketRequestPaymentBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketTagging.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets the tags for a bucket. // // Use tags to organize your Amazon Web Services bill to reflect your own cost // structure. To do this, sign up to get your Amazon Web Services account bill with // tag key values included. Then, to see the cost of combined resources, organize // your billing information according to resources with the same tag key values. // For example, you can tag several resources with a specific application name, and // then organize your billing information to see the total cost of that application // across several services. For more information, see [Cost Allocation and Tagging]and [Using Cost Allocation in Amazon S3 Bucket Tags]. // // When this operation sets the tags for a bucket, it will overwrite any current // tags the bucket already has. You cannot use this operation to add tags to an // existing list of tags. // // To use this operation, you must have permissions to perform the // s3:PutBucketTagging action. The bucket owner has this permission by default and // can grant this permission to others. For more information about permissions, see // [Permissions Related to Bucket Subresource Operations]and [Managing Access Permissions to Your Amazon S3 Resources]. // // PutBucketTagging has the following special errors. For more Amazon S3 errors // see, [Error Responses]. // // - InvalidTag - The tag provided was not a valid tag. This error can occur if // the tag did not pass input validation. For more information, see [Using Cost Allocation in Amazon S3 Bucket Tags]. // // - MalformedXML - The XML provided does not match the schema. // // - OperationAborted - A conflicting conditional action is currently in progress // against this resource. Please try again. // // - InternalError - The service was unable to apply the provided tag to the // bucket. // // The following operations are related to PutBucketTagging : // // [GetBucketTagging] // // [DeleteBucketTagging] // // [Error Responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html // [GetBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html // [Cost Allocation and Tagging]: https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [DeleteBucketTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html // [Using Cost Allocation in Amazon S3 Bucket Tags]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/CostAllocTagging.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html func (c *Client) PutBucketTagging(ctx context.Context, params *PutBucketTaggingInput, optFns ...func(*Options)) (*PutBucketTaggingOutput, error) { if params == nil { params = &PutBucketTaggingInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketTagging", params, optFns, c.addOperationPutBucketTaggingMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketTaggingOutput) out.ResultMetadata = metadata return out, nil } type PutBucketTaggingInput struct { // The bucket name. // // This member is required. Bucket *string // Container for the TagSet and Tag elements. // // This member is required. Tagging *types.Tagging // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The Base64 encoded 128-bit MD5 digest of the data. You must use this header as // a message integrity check to verify that the request body was not corrupted in // transit. For more information, see [RFC 1864]. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketTaggingInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketTaggingOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketTagging{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketTagging{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketTagging"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketTaggingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketTagging(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketTaggingInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketTaggingUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketTaggingInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketTagging(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketTagging", } } // getPutBucketTaggingRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getPutBucketTaggingRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketTaggingInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketTaggingInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketTaggingRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketTaggingBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getPutBucketTaggingBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketTaggingInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketTaggingBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketVersioning.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // When you enable versioning on a bucket for the first time, it might take a // short amount of time for the change to be fully propagated. While this change is // propagating, you might encounter intermittent HTTP 404 NoSuchKey errors for // requests to objects created or updated after enabling versioning. We recommend // that you wait for 15 minutes after enabling versioning before issuing write // operations ( PUT or DELETE ) on objects in the bucket. // // Sets the versioning state of an existing bucket. // // You can set the versioning state with one of the following values: // // Enabled—Enables versioning for the objects in the bucket. All objects added to // the bucket receive a unique version ID. // // Suspended—Disables versioning for the objects in the bucket. All objects added // to the bucket receive the version ID null. // // If the versioning state has never been set on a bucket, it has no versioning // state; a [GetBucketVersioning]request does not return a versioning state value. // // In order to enable MFA Delete, you must be the bucket owner. If you are the // bucket owner and want to enable MFA Delete in the bucket versioning // configuration, you must include the x-amz-mfa request header and the Status and // the MfaDelete request elements in a request to set the versioning state of the // bucket. // // If you have an object expiration lifecycle configuration in your non-versioned // bucket and you want to maintain the same permanent delete behavior when you // enable versioning, you must add a noncurrent expiration policy. The noncurrent // expiration lifecycle configuration will manage the deletes of the noncurrent // object versions in the version-enabled bucket. (A version-enabled bucket // maintains one current and zero or more noncurrent object versions.) For more // information, see [Lifecycle and Versioning]. // // The following operations are related to PutBucketVersioning : // // [CreateBucket] // // [DeleteBucket] // // [GetBucketVersioning] // // [DeleteBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html // [CreateBucket]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html // [Lifecycle and Versioning]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html#lifecycle-and-other-bucket-config // [GetBucketVersioning]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html func (c *Client) PutBucketVersioning(ctx context.Context, params *PutBucketVersioningInput, optFns ...func(*Options)) (*PutBucketVersioningOutput, error) { if params == nil { params = &PutBucketVersioningInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketVersioning", params, optFns, c.addOperationPutBucketVersioningMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketVersioningOutput) out.ResultMetadata = metadata return out, nil } type PutBucketVersioningInput struct { // The bucket name. // // This member is required. Bucket *string // Container for setting the versioning state. // // This member is required. VersioningConfiguration *types.VersioningConfiguration // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // >The Base64 encoded 128-bit MD5 digest of the data. You must use this header as // a message integrity check to verify that the request body was not corrupted in // transit. For more information, see [RFC 1864]. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The concatenation of the authentication device's serial number, a space, and // the value that is displayed on your authentication device. MFA *string noSmithyDocumentSerde } func (in *PutBucketVersioningInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketVersioningOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketVersioningMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketVersioning{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketVersioning{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketVersioning"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketVersioningValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketVersioning(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketVersioningInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketVersioningUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketVersioningInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketVersioning(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketVersioning", } } // getPutBucketVersioningRequestAlgorithmMember gets the request checksum // algorithm value provided as input. func getPutBucketVersioningRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketVersioningInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketVersioningInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketVersioningRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketVersioningBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getPutBucketVersioningBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketVersioningInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketVersioningUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketVersioningBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutBucketWebsite.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets the configuration of the website that is specified in the website // subresource. To configure a bucket as a website, you can add this subresource on // the bucket with website configuration information such as the file name of the // index document and any redirect rules. For more information, see [Hosting Websites on Amazon S3]. // // This PUT action requires the S3:PutBucketWebsite permission. By default, only // the bucket owner can configure the website attached to a bucket; however, bucket // owners can allow other users to set the website configuration by writing a // bucket policy that grants them the S3:PutBucketWebsite permission. // // To redirect all website requests sent to the bucket's website endpoint, you add // a website configuration with the following elements. Because all requests are // sent to another website, you don't need to provide index document name for the // bucket. // // - WebsiteConfiguration // // - RedirectAllRequestsTo // // - HostName // // - Protocol // // If you want granular control over redirects, you can use the following elements // to add routing rules that describe conditions for redirecting requests and // information about the redirect destination. In this case, the website // configuration must provide an index document for the bucket, because some // requests might not be redirected. // // - WebsiteConfiguration // // - IndexDocument // // - Suffix // // - ErrorDocument // // - Key // // - RoutingRules // // - RoutingRule // // - Condition // // - HttpErrorCodeReturnedEquals // // - KeyPrefixEquals // // - Redirect // // - Protocol // // - HostName // // - ReplaceKeyPrefixWith // // - ReplaceKeyWith // // - HttpRedirectCode // // Amazon S3 has a limitation of 50 routing rules per website configuration. If // you require more than 50 routing rules, you can use object redirect. For more // information, see [Configuring an Object Redirect]in the Amazon S3 User Guide. // // The maximum request length is limited to 128 KB. // // [Hosting Websites on Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html // [Configuring an Object Redirect]: https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html func (c *Client) PutBucketWebsite(ctx context.Context, params *PutBucketWebsiteInput, optFns ...func(*Options)) (*PutBucketWebsiteOutput, error) { if params == nil { params = &PutBucketWebsiteInput{} } result, metadata, err := c.invokeOperation(ctx, "PutBucketWebsite", params, optFns, c.addOperationPutBucketWebsiteMiddlewares) if err != nil { return nil, err } out := result.(*PutBucketWebsiteOutput) out.ResultMetadata = metadata return out, nil } type PutBucketWebsiteInput struct { // The bucket name. // // This member is required. Bucket *string // Container for the request. // // This member is required. WebsiteConfiguration *types.WebsiteConfiguration // Indicates the algorithm used to create the checksum for the request when you // use the SDK. This header will not provide any additional functionality if you // don't use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The Base64 encoded 128-bit MD5 digest of the data. You must use this header as // a message integrity check to verify that the request body was not corrupted in // transit. For more information, see [RFC 1864]. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // [RFC 1864]: http://www.ietf.org/rfc/rfc1864.txt ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutBucketWebsiteInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutBucketWebsiteOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutBucketWebsiteMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutBucketWebsite{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutBucketWebsite{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutBucketWebsite"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutBucketWebsiteValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBucketWebsite(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutBucketWebsiteInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutBucketWebsiteUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutBucketWebsiteInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutBucketWebsite(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutBucketWebsite", } } // getPutBucketWebsiteRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getPutBucketWebsiteRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutBucketWebsiteInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutBucketWebsiteInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutBucketWebsiteRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutBucketWebsiteBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getPutBucketWebsiteBucketMember(input interface{}) (*string, bool) { in := input.(*PutBucketWebsiteInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutBucketWebsiteUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutBucketWebsiteBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObject.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "io" "time" ) // Adds an object to a bucket. // // - Amazon S3 never adds partial objects; if you receive a success response, // Amazon S3 added the entire object to the bucket. You cannot use PutObject to // only update a single piece of metadata for an existing object. You must put the // entire object with updated metadata if you want to update some values. // // - If your bucket uses the bucket owner enforced setting for Object Ownership, // ACLs are disabled and no longer affect permissions. All objects written to the // bucket by any account will be owned by the bucket owner. // // - Directory buckets - For directory buckets, you must make requests for this // API operation to the Zonal endpoint. These endpoints support // virtual-hosted-style requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Amazon S3 is a distributed system. If it receives multiple write requests for // the same object simultaneously, it overwrites all but the last object written. // However, Amazon S3 provides features that can modify this behavior: // // - S3 Object Lock - To prevent objects from being deleted or overwritten, you // can use [Amazon S3 Object Lock]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // - If-None-Match - Uploads the object only if the object key name does not // already exist in the specified bucket. Otherwise, Amazon S3 returns a 412 // Precondition Failed error. If a conflicting operation occurs during the // upload, S3 returns a 409 ConditionalRequestConflict response. On a 409 // failure, retry the upload. // // Expects the * character (asterisk). // // For more information, see [Add preconditions to S3 operations with conditional requests]in the Amazon S3 User Guide or [RFC 7232]. // // This functionality is not supported for S3 on Outposts. // // - S3 Versioning - When you enable versioning for a bucket, if Amazon S3 // receives multiple write requests for the same object simultaneously, it stores // all versions of the objects. For each write request that is made to the same // object, Amazon S3 automatically generates a unique version ID of that object // being stored in Amazon S3. You can retrieve, replace, or delete any version of // the object. For more information about versioning, see [Adding Objects to Versioning-Enabled Buckets]in the Amazon S3 User // Guide. For information about returning the versioning state of a bucket, see [GetBucketVersioning] // . // // This functionality is not supported for directory buckets. // // Permissions // // - General purpose bucket permissions - The following permissions are required // in your policies when your PutObject request includes specific headers. // // - s3:PutObject - To successfully complete the PutObject request, you must // always have the s3:PutObject permission on a bucket to add an object to it. // // - s3:PutObjectAcl - To successfully change the objects ACL of your PutObject // request, you must have the s3:PutObjectAcl . // // - s3:PutObjectTagging - To successfully set the tag-set with your PutObject // request, you must have the s3:PutObjectTagging . // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // If the object is encrypted with SSE-KMS, you must also have the // // kms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies // and KMS key policies for the KMS key. // // Data integrity with Content-MD5 // // - General purpose bucket - To ensure that data is not corrupted traversing // the network, use the Content-MD5 header. When you use this header, Amazon S3 // checks the object against the provided MD5 value and, if they do not match, // Amazon S3 returns an error. Alternatively, when the object's ETag is its MD5 // digest, you can calculate the MD5 while putting the object to Amazon S3 and // compare the returned ETag to the calculated MD5 value. // // - Directory bucket - This functionality is not supported for directory // buckets. // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // For more information about related Amazon S3 APIs, see the following: // // [CopyObject] // // [DeleteObject] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [Amazon S3 Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html // [DeleteObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html // [Adding Objects to Versioning-Enabled Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/AddingObjectstoVersioningEnabledBuckets.html // [Add preconditions to S3 operations with conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [RFC 7232]: https://datatracker.ietf.org/doc/rfc7232/ // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // [GetBucketVersioning]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html func (c *Client) PutObject(ctx context.Context, params *PutObjectInput, optFns ...func(*Options)) (*PutObjectOutput, error) { if params == nil { params = &PutObjectInput{} } result, metadata, err := c.invokeOperation(ctx, "PutObject", params, optFns, c.addOperationPutObjectMiddlewares) if err != nil { return nil, err } out := result.(*PutObjectOutput) out.ResultMetadata = metadata return out, nil } type PutObjectInput struct { // The bucket name to which the PUT action was initiated. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Object key for which the PUT action was initiated. // // This member is required. Key *string // The canned ACL to apply to the object. For more information, see [Canned ACL] in the Amazon // S3 User Guide. // // When adding a new object, you can use headers to grant ACL-based permissions to // individual Amazon Web Services accounts or to predefined groups defined by // Amazon S3. These permissions are then added to the ACL on the object. By // default, all objects are private. Only the owner has full access control. For // more information, see [Access Control List (ACL) Overview]and [Managing ACLs Using the REST API] in the Amazon S3 User Guide. // // If the bucket that you're uploading objects to uses the bucket owner enforced // setting for S3 Object Ownership, ACLs are disabled and no longer affect // permissions. Buckets that use this setting only accept PUT requests that don't // specify an ACL or PUT requests that specify bucket owner full control ACLs, such // as the bucket-owner-full-control canned ACL or an equivalent form of this ACL // expressed in the XML format. PUT requests that contain other ACLs (for example, // custom grants to certain Amazon Web Services accounts) fail and return a 400 // error with the error code AccessControlListNotSupported . For more information, // see [Controlling ownership of objects and disabling ACLs]in the Amazon S3 User Guide. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. // // [Managing ACLs Using the REST API]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-using-rest-api.html // [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html // [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL // [Controlling ownership of objects and disabling ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html ACL types.ObjectCannedACL // Object data. Body io.Reader // Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption // with server-side encryption using Key Management Service (KMS) keys (SSE-KMS). // // General purpose buckets - Setting this header to true causes Amazon S3 to use // an S3 Bucket Key for object encryption with SSE-KMS. Also, specifying this // header with a PUT action doesn't affect bucket-level settings for S3 Bucket Key. // // Directory buckets - S3 Bucket Keys are always enabled for GET and PUT // operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't // supported, when you copy SSE-KMS encrypted objects from general purpose buckets // to directory buckets, from directory buckets to general purpose buckets, or // between directory buckets, through [CopyObject], [UploadPartCopy], [the Copy operation in Batch Operations], or [the import jobs]. In this case, Amazon S3 makes a // call to KMS every time a copy request is made for a KMS-encrypted object. // // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [the import jobs]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html // [the Copy operation in Batch Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops BucketKeyEnabled *bool // Can be used to specify caching behavior along the request/reply chain. For more // information, see [http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9]. // // [http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 CacheControl *string // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum-algorithm or x-amz-trailer header sent. Otherwise, Amazon S3 // fails the request with the HTTP status code 400 Bad Request . // // For the x-amz-checksum-algorithm header, replace algorithm with the // supported algorithm from the following list: // // - CRC32 // // - CRC32C // // - CRC64NVME // // - SHA1 // // - SHA256 // // For more information, see [Checking object integrity] in the Amazon S3 User Guide. // // If the individual checksum value you provide through x-amz-checksum-algorithm // doesn't match the checksum algorithm you set through // x-amz-sdk-checksum-algorithm , Amazon S3 fails the request with a BadDigest // error. // // The Content-MD5 or x-amz-sdk-checksum-algorithm header is required for any // request to upload an object with a retention period configured using Amazon S3 // Object Lock. For more information, see [Uploading objects to an Object Lock enabled bucket]in the Amazon S3 User Guide. // // For directory buckets, when you use Amazon Web Services SDKs, CRC32 is the // default checksum algorithm that's used for performance. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html // [Uploading objects to an Object Lock enabled bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-put-object ChecksumAlgorithm types.ChecksumAlgorithm // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 32-bit CRC32 checksum of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC32 *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 32-bit CRC32C checksum of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC32C *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 64-bit CRC64NVME checksum of the object. The CRC64NVME checksum // is always a full object checksum. For more information, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC64NVME *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 160-bit SHA1 digest of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumSHA1 *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 256-bit SHA256 digest of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumSHA256 *string // Specifies presentational information for the object. For more information, see [https://www.rfc-editor.org/rfc/rfc6266#section-4]. // // [https://www.rfc-editor.org/rfc/rfc6266#section-4]: https://www.rfc-editor.org/rfc/rfc6266#section-4 ContentDisposition *string // Specifies what content encodings have been applied to the object and thus what // decoding mechanisms must be applied to obtain the media-type referenced by the // Content-Type header field. For more information, see [https://www.rfc-editor.org/rfc/rfc9110.html#field.content-encoding]. // // [https://www.rfc-editor.org/rfc/rfc9110.html#field.content-encoding]: https://www.rfc-editor.org/rfc/rfc9110.html#field.content-encoding ContentEncoding *string // The language the content is in. ContentLanguage *string // Size of the body in bytes. This parameter is useful when the size of the body // cannot be determined automatically. For more information, see [https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length]. // // [https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length]: https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length ContentLength *int64 // The Base64 encoded 128-bit MD5 digest of the message (without the headers) // according to RFC 1864. This header can be used as a message integrity check to // verify that the data is the same data that was originally sent. Although it is // optional, we recommend using the Content-MD5 mechanism as an end-to-end // integrity check. For more information about REST request authentication, see [REST Authentication]. // // The Content-MD5 or x-amz-sdk-checksum-algorithm header is required for any // request to upload an object with a retention period configured using Amazon S3 // Object Lock. For more information, see [Uploading objects to an Object Lock enabled bucket]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html // [Uploading objects to an Object Lock enabled bucket]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-put-object ContentMD5 *string // A standard MIME type describing the format of the contents. For more // information, see [https://www.rfc-editor.org/rfc/rfc9110.html#name-content-type]. // // [https://www.rfc-editor.org/rfc/rfc9110.html#name-content-type]: https://www.rfc-editor.org/rfc/rfc9110.html#name-content-type ContentType *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The date and time at which the object is no longer cacheable. For more // information, see [https://www.rfc-editor.org/rfc/rfc7234#section-5.3]. // // [https://www.rfc-editor.org/rfc/rfc7234#section-5.3]: https://www.rfc-editor.org/rfc/rfc7234#section-5.3 Expires *time.Time // Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. GrantFullControl *string // Allows grantee to read the object data and its metadata. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. GrantRead *string // Allows grantee to read the object ACL. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. GrantReadACP *string // Allows grantee to write the ACL for the applicable object. // // - This functionality is not supported for directory buckets. // // - This functionality is not supported for Amazon S3 on Outposts. GrantWriteACP *string // Uploads the object only if the ETag (entity tag) value provided during the // WRITE operation matches the ETag of the object in S3. If the ETag values do not // match, the operation returns a 412 Precondition Failed error. // // If a conflicting operation occurs during the upload S3 returns a 409 // ConditionalRequestConflict response. On a 409 failure you should fetch the // object's ETag and retry the upload. // // Expects the ETag value as a string. // // For more information about conditional requests, see [RFC 7232], or [Conditional requests] in the Amazon S3 // User Guide. // // [Conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfMatch *string // Uploads the object only if the object key name does not already exist in the // bucket specified. Otherwise, Amazon S3 returns a 412 Precondition Failed error. // // If a conflicting operation occurs during the upload S3 returns a 409 // ConditionalRequestConflict response. On a 409 failure you should retry the // upload. // // Expects the '*' (asterisk) character. // // For more information about conditional requests, see [RFC 7232], or [Conditional requests] in the Amazon S3 // User Guide. // // [Conditional requests]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html // [RFC 7232]: https://tools.ietf.org/html/rfc7232 IfNoneMatch *string // A map of metadata to store with the object in S3. Metadata map[string]string // Specifies whether a legal hold will be applied to this object. For more // information about S3 Object Lock, see [Object Lock]in the Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html ObjectLockLegalHoldStatus types.ObjectLockLegalHoldStatus // The Object Lock mode that you want to apply to this object. // // This functionality is not supported for directory buckets. ObjectLockMode types.ObjectLockMode // The date and time when you want this object's Object Lock to expire. Must be // formatted as a timestamp parameter. // // This functionality is not supported for directory buckets. ObjectLockRetainUntilDate *time.Time // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Specifies the algorithm to use when encrypting the object (for example, AES256 ). // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use in // encrypting data. This value is used to store the object and then it is // discarded; Amazon S3 does not store the encryption key. The key must be // appropriate for use with the algorithm specified in the // x-amz-server-side-encryption-customer-algorithm header. // // This functionality is not supported for directory buckets. SSECustomerKey *string // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. // Amazon S3 uses this header for a message integrity check to ensure that the // encryption key was transmitted without error. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // Specifies the Amazon Web Services KMS Encryption Context as an additional // encryption context to use for object encryption. The value of this header is a // Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption // context as key-value pairs. This value is stored as object metadata and // automatically gets passed on to Amazon Web Services KMS for future GetObject // operations on this object. // // General purpose buckets - This value must be explicitly added during CopyObject // operations if you want an additional encryption context for your object. For // more information, see [Encryption context]in the Amazon S3 User Guide. // // Directory buckets - You can optionally provide an explicit encryption context // value. The value must match the default encryption context - the bucket Amazon // Resource Name (ARN). An additional encryption context value is not supported. // // [Encryption context]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context SSEKMSEncryptionContext *string // Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object // encryption. If the KMS key doesn't exist in the same account that's issuing the // command, you must use the full Key ARN not the Key ID. // // General purpose buckets - If you specify x-amz-server-side-encryption with // aws:kms or aws:kms:dsse , this header specifies the ID (Key ID, Key ARN, or Key // Alias) of the KMS key to use. If you specify // x-amz-server-side-encryption:aws:kms or // x-amz-server-side-encryption:aws:kms:dsse , but do not provide // x-amz-server-side-encryption-aws-kms-key-id , Amazon S3 uses the Amazon Web // Services managed key ( aws/s3 ) to protect the data. // // Directory buckets - To encrypt data using SSE-KMS, it's recommended to specify // the x-amz-server-side-encryption header to aws:kms . Then, the // x-amz-server-side-encryption-aws-kms-key-id header implicitly uses the bucket's // default KMS customer managed key ID. If you want to explicitly set the // x-amz-server-side-encryption-aws-kms-key-id header, it must match the bucket's // default customer managed key (using key ID or ARN, not alias). Your SSE-KMS // configuration can only support 1 [customer managed key]per directory bucket's lifetime. The [Amazon Web Services managed key] ( aws/s3 // ) isn't supported. // // Incorrect key specification results in an HTTP 400 Bad Request error. // // [customer managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk // [Amazon Web Services managed key]: https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk SSEKMSKeyId *string // The server-side encryption algorithm that was used when you store this object // in Amazon S3 (for example, AES256 , aws:kms , aws:kms:dsse ). // // - General purpose buckets - You have four mutually exclusive options to // protect data using server-side encryption in Amazon S3, depending on how you // choose to manage the encryption keys. Specifically, the encryption key options // are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS or // DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with // server-side encryption by using Amazon S3 managed keys (SSE-S3) by default. You // can optionally tell Amazon S3 to encrypt data at rest by using server-side // encryption with other key options. For more information, see [Using Server-Side Encryption]in the Amazon S3 // User Guide. // // - Directory buckets - For directory buckets, there are only two supported // options for server-side encryption: server-side encryption with Amazon S3 // managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys // (SSE-KMS) ( aws:kms ). We recommend that the bucket's default encryption uses // the desired encryption configuration and you don't override the bucket default // encryption in your CreateSession requests or PUT object requests. Then, new // objects are automatically encrypted with the desired encryption settings. For // more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. For more information about // the encryption overriding behaviors in directory buckets, see [Specifying server-side encryption with KMS for new object uploads]. // // In the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]) using the REST API, the // encryption request headers must match the encryption settings that are specified // in the CreateSession request. You can't override the values of the encryption // settings ( x-amz-server-side-encryption , // x-amz-server-side-encryption-aws-kms-key-id , // x-amz-server-side-encryption-context , and // x-amz-server-side-encryption-bucket-key-enabled ) that are specified in the // CreateSession request. You don't need to explicitly specify these encryption // settings values in Zonal endpoint API calls, and Amazon S3 will use the // encryption settings values from the CreateSession request to protect new // objects in the directory bucket. // // When you use the CLI or the Amazon Web Services SDKs, for CreateSession , the // session token refreshes automatically to avoid service interruptions when a // session expires. The CLI or the Amazon Web Services SDKs use the bucket's // default encryption configuration for the CreateSession request. It's not // supported to override the encryption settings values in the CreateSession // request. So in the Zonal endpoint API calls (except [CopyObject]and [UploadPartCopy]), the encryption // request headers must match the default encryption configuration of the directory // bucket. // // [Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html // [Specifying server-side encryption with KMS for new object uploads]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html ServerSideEncryption types.ServerSideEncryption // By default, Amazon S3 uses the STANDARD Storage Class to store newly created // objects. The STANDARD storage class provides high durability and high // availability. Depending on performance needs, you can specify a different // Storage Class. For more information, see [Storage Classes]in the Amazon S3 User Guide. // // - Directory buckets only support EXPRESS_ONEZONE (the S3 Express One Zone // storage class) in Availability Zones and ONEZONE_IA (the S3 One // Zone-Infrequent Access storage class) in Dedicated Local Zones. // // - Amazon S3 on Outposts only uses the OUTPOSTS Storage Class. // // [Storage Classes]: https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html StorageClass types.StorageClass // The tag-set for the object. The tag-set must be encoded as URL Query // parameters. (For example, "Key1=Value1") // // This functionality is not supported for directory buckets. Tagging *string // If the bucket is configured as a website, redirects requests for this object to // another object in the same bucket or to an external URL. Amazon S3 stores the // value of this header in the object metadata. For information about object // metadata, see [Object Key and Metadata]in the Amazon S3 User Guide. // // In the following example, the request header sets the redirect to an object // (anotherPage.html) in the same bucket: // // x-amz-website-redirect-location: /anotherPage.html // // In the following example, the request header sets the object redirect to // another website: // // x-amz-website-redirect-location: http://www.example.com/ // // For more information about website hosting in Amazon S3, see [Hosting Websites on Amazon S3] and [How to Configure Website Page Redirects] in the // Amazon S3 User Guide. // // This functionality is not supported for directory buckets. // // [How to Configure Website Page Redirects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html // [Hosting Websites on Amazon S3]: https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html // [Object Key and Metadata]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html WebsiteRedirectLocation *string // Specifies the offset for appending data to existing objects in bytes. The // offset must be equal to the size of the existing object being appended to. If no // object exists, setting this header to 0 will create a new object. // // This functionality is only supported for objects in the Amazon S3 Express One // Zone storage class in directory buckets. WriteOffsetBytes *int64 noSmithyDocumentSerde } func (in *PutObjectInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type PutObjectOutput struct { // Indicates whether the uploaded object uses an S3 Bucket Key for server-side // encryption with Key Management Service (KMS) keys (SSE-KMS). BucketKeyEnabled *bool // The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only // be present if the checksum was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumCRC32 *string // The Base64 encoded, 32-bit CRC32C checksum of the object. This checksum is only // present if the checksum was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumCRC32C *string // The Base64 encoded, 64-bit CRC64NVME checksum of the object. This header is // present if the object was uploaded with the CRC64NVME checksum algorithm, or if // it was uploaded without a checksum (and Amazon S3 added the default checksum, // CRC64NVME , to the uploaded object). For more information about how checksums // are calculated with multipart uploads, see [Checking object integrity in the Amazon S3 User Guide]. // // [Checking object integrity in the Amazon S3 User Guide]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC64NVME *string // The Base64 encoded, 160-bit SHA1 digest of the object. This will only be // present if the object was uploaded with the object. When you use the API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumSHA1 *string // The Base64 encoded, 256-bit SHA256 digest of the object. This will only be // present if the object was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumSHA256 *string // This header specifies the checksum type of the object, which determines how // part-level checksums are combined to create an object-level checksum for // multipart objects. For PutObject uploads, the checksum type is always // FULL_OBJECT . You can use this header as a data integrity check to verify that // the checksum type that is received is the same checksum that was specified. For // more information, see [Checking object integrity]in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumType types.ChecksumType // Entity tag for the uploaded object. // // General purpose buckets - To ensure that data is not corrupted traversing the // network, for objects where the ETag is the MD5 digest of the object, you can // calculate the MD5 while putting an object to Amazon S3 and compare the returned // ETag to the calculated MD5 value. // // Directory buckets - The ETag for the object in a directory bucket isn't the MD5 // digest of the object. ETag *string // If the expiration is configured for the object (see [PutBucketLifecycleConfiguration]) in the Amazon S3 User // Guide, the response includes this header. It includes the expiry-date and // rule-id key-value pairs that provide information about object expiration. The // value of the rule-id is URL-encoded. // // Object expiration information is not returned in directory buckets and this // header returns the value " NotImplemented " in all responses for directory // buckets. // // [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html Expiration *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to confirm the encryption // algorithm that's used. // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to provide the round-trip // message integrity verification of the customer-provided encryption key. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // If present, indicates the Amazon Web Services KMS Encryption Context to use for // object encryption. The value of this header is a Base64 encoded string of a // UTF-8 encoded JSON, which contains the encryption context as key-value pairs. // This value is stored as object metadata and automatically gets passed on to // Amazon Web Services KMS for future GetObject operations on this object. SSEKMSEncryptionContext *string // If present, indicates the ID of the KMS key that was used for object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when you store this object in Amazon // S3. ServerSideEncryption types.ServerSideEncryption // The size of the object in bytes. This value is only be present if you append // to an object. // // This functionality is only supported for objects in the Amazon S3 Express One // Zone storage class in directory buckets. Size *int64 // Version ID of the object. // // If you enable versioning for a bucket, Amazon S3 automatically generates a // unique version ID for the object being stored. Amazon S3 returns this ID in the // response. When you enable versioning for a bucket, if Amazon S3 receives // multiple write requests for the same object simultaneously, it stores all of the // objects. For more information about versioning, see [Adding Objects to Versioning-Enabled Buckets]in the Amazon S3 User // Guide. For information about returning the versioning state of a bucket, see [GetBucketVersioning]. // // This functionality is not supported for directory buckets. // // [Adding Objects to Versioning-Enabled Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/AddingObjectstoVersioningEnabledBuckets.html // [GetBucketVersioning]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html VersionId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutObjectMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutObject{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObject{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutObject"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutObjectValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObject(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = add100Continue(stack, options); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutObjectInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutObjectUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = v4.UseDynamicPayloadSigningMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutObjectInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutObject(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutObject", } } // getPutObjectRequestAlgorithmMember gets the request checksum algorithm value // provided as input. func getPutObjectRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutObjectInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutObjectInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutObjectRequestAlgorithmMember, RequireChecksum: false, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: true, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutObjectBucketMember returns a pointer to string denoting a provided bucket // member valueand a boolean indicating if the input has a modeled bucket name, func getPutObjectBucketMember(input interface{}) (*string, bool) { in := input.(*PutObjectInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutObjectUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutObjectBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } // PresignPutObject is used to generate a presigned HTTP Request which contains // presigned URL, signed headers and HTTP method used. func (c *PresignClient) PresignPutObject(ctx context.Context, params *PutObjectInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) { if params == nil { params = &PutObjectInput{} } options := c.options.copy() for _, fn := range optFns { fn(&options) } clientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption) clientOptFns = append(options.ClientOptions, withNoDefaultChecksumAPIOption) result, _, err := c.client.invokeOperation(ctx, "PutObject", params, clientOptFns, c.client.addOperationPutObjectMiddlewares, presignConverter(options).convertToPresignMiddleware, func(stack *middleware.Stack, options Options) error { return awshttp.RemoveContentTypeHeader(stack) }, addPutObjectPayloadAsUnsigned, ) if err != nil { return nil, err } out := result.(*v4.PresignedHTTPRequest) return out, nil } func addPutObjectPayloadAsUnsigned(stack *middleware.Stack, options Options) error { v4.RemoveContentSHA256HeaderMiddleware(stack) v4.RemoveComputePayloadSHA256Middleware(stack) return v4.AddUnsignedPayloadMiddleware(stack) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectAcl.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Uses the acl subresource to set the access control list (ACL) permissions for a // new or existing object in an S3 bucket. You must have the WRITE_ACP permission // to set the ACL of an object. For more information, see [What permissions can I grant?]in the Amazon S3 User // Guide. // // This functionality is not supported for Amazon S3 on Outposts. // // Depending on your application needs, you can choose to set the ACL on an object // using either the request body or the headers. For example, if you have an // existing application that updates a bucket ACL using the request body, you can // continue to use that approach. For more information, see [Access Control List (ACL) Overview]in the Amazon S3 User // Guide. // // If your bucket uses the bucket owner enforced setting for S3 Object Ownership, // ACLs are disabled and no longer affect permissions. You must use policies to // grant access to your bucket and the objects in it. Requests to set ACLs or // update ACLs fail and return the AccessControlListNotSupported error code. // Requests to read ACLs are still supported. For more information, see [Controlling object ownership]in the // Amazon S3 User Guide. // // Permissions You can set access permissions using one of the following methods: // // - Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports a // set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined // set of grantees and permissions. Specify the canned ACL name as the value of // x-amz-ac l. If you use this header, you cannot use other access // control-specific headers in your request. For more information, see [Canned ACL]. // // - Specify access permissions explicitly with the x-amz-grant-read , // x-amz-grant-read-acp , x-amz-grant-write-acp , and x-amz-grant-full-control // headers. When using these headers, you specify explicit access permissions and // grantees (Amazon Web Services accounts or Amazon S3 groups) who will receive the // permission. If you use these ACL-specific headers, you cannot use x-amz-acl // header to set a canned ACL. These parameters map to the set of permissions that // Amazon S3 supports in an ACL. For more information, see [Access Control List (ACL) Overview]. // // You specify each grantee as a type=value pair, where the type is one of the // // following: // // - id – if the value specified is the canonical user ID of an Amazon Web // Services account // // - uri – if you are granting permissions to a predefined group // // - emailAddress – if the value specified is the email address of an Amazon Web // Services account // // Using email addresses to specify a grantee is only supported in the following // // Amazon Web Services Regions: // // - US East (N. Virginia) // // - US West (N. California) // // - US West (Oregon) // // - Asia Pacific (Singapore) // // - Asia Pacific (Sydney) // // - Asia Pacific (Tokyo) // // - Europe (Ireland) // // - South America (São Paulo) // // For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the // // Amazon Web Services General Reference. // // For example, the following x-amz-grant-read header grants list objects // // permission to the two Amazon Web Services accounts identified by their email // addresses. // // x-amz-grant-read: emailAddress="xyz@amazon.com", emailAddress="abc@amazon.com" // // You can use either a canned ACL or specify access permissions explicitly. You // cannot do both. // // Grantee Values You can specify the person (grantee) to whom you're assigning // access rights (using request elements) in the following ways: // // - By the person's ID: // // <>ID<><>GranteesEmail<> // // DisplayName is optional and ignored in the request. // // - By URI: // // <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<> // // - By Email address: // // <>Grantees@email.com<>lt;/Grantee> // // The grantee is resolved to the CanonicalUser and, in a response to a GET Object // // acl request, appears as the CanonicalUser. // // Using email addresses to specify a grantee is only supported in the following // // Amazon Web Services Regions: // // - US East (N. Virginia) // // - US West (N. California) // // - US West (Oregon) // // - Asia Pacific (Singapore) // // - Asia Pacific (Sydney) // // - Asia Pacific (Tokyo) // // - Europe (Ireland) // // - South America (São Paulo) // // For a list of all the Amazon S3 supported Regions and endpoints, see [Regions and Endpoints]in the // // Amazon Web Services General Reference. // // Versioning The ACL of an object is set at the object version level. By default, // PUT sets the ACL of the current version of an object. To set the ACL of a // different version, use the versionId subresource. // // The following operations are related to PutObjectAcl : // // [CopyObject] // // [GetObject] // // [Regions and Endpoints]: https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region // [Access Control List (ACL) Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html // [Controlling object ownership]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html // [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [What permissions can I grant?]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#permissions // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html func (c *Client) PutObjectAcl(ctx context.Context, params *PutObjectAclInput, optFns ...func(*Options)) (*PutObjectAclOutput, error) { if params == nil { params = &PutObjectAclInput{} } result, metadata, err := c.invokeOperation(ctx, "PutObjectAcl", params, optFns, c.addOperationPutObjectAclMiddlewares) if err != nil { return nil, err } out := result.(*PutObjectAclOutput) out.ResultMetadata = metadata return out, nil } type PutObjectAclInput struct { // The bucket name that contains the object to which you want to attach the ACL. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Key for which the PUT action was initiated. // // This member is required. Key *string // The canned ACL to apply to the object. For more information, see [Canned ACL]. // // [Canned ACL]: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL ACL types.ObjectCannedACL // Contains the elements that set the ACL permissions for an object per grantee. AccessControlPolicy *types.AccessControlPolicy // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The Base64 encoded 128-bit MD5 digest of the data. This header must be used as // a message integrity check to verify that the request body was not corrupted in // transit. For more information, go to [RFC 1864.>] // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. // // [RFC 1864.>]: http://www.ietf.org/rfc/rfc1864.txt ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Allows grantee the read, write, read ACP, and write ACP permissions on the // bucket. // // This functionality is not supported for Amazon S3 on Outposts. GrantFullControl *string // Allows grantee to list the objects in the bucket. // // This functionality is not supported for Amazon S3 on Outposts. GrantRead *string // Allows grantee to read the bucket ACL. // // This functionality is not supported for Amazon S3 on Outposts. GrantReadACP *string // Allows grantee to create new objects in the bucket. // // For the bucket and object owners of existing objects, also allows deletions and // overwrites of those objects. GrantWrite *string // Allows grantee to write the ACL for the applicable bucket. // // This functionality is not supported for Amazon S3 on Outposts. GrantWriteACP *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Version ID used to reference a specific version of the object. // // This functionality is not supported for directory buckets. VersionId *string noSmithyDocumentSerde } func (in *PutObjectAclInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type PutObjectAclOutput struct { // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutObjectAclMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectAcl{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectAcl{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutObjectAcl"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutObjectAclValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectAcl(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutObjectAclInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutObjectAclUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutObjectAclInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutObjectAcl(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutObjectAcl", } } // getPutObjectAclRequestAlgorithmMember gets the request checksum algorithm value // provided as input. func getPutObjectAclRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutObjectAclInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutObjectAclInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutObjectAclRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutObjectAclBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getPutObjectAclBucketMember(input interface{}) (*string, bool) { in := input.(*PutObjectAclInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutObjectAclUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutObjectAclBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectLegalHold.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Applies a legal hold configuration to the specified object. For more // information, see [Locking Objects]. // // This functionality is not supported for Amazon S3 on Outposts. // // [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html func (c *Client) PutObjectLegalHold(ctx context.Context, params *PutObjectLegalHoldInput, optFns ...func(*Options)) (*PutObjectLegalHoldOutput, error) { if params == nil { params = &PutObjectLegalHoldInput{} } result, metadata, err := c.invokeOperation(ctx, "PutObjectLegalHold", params, optFns, c.addOperationPutObjectLegalHoldMiddlewares) if err != nil { return nil, err } out := result.(*PutObjectLegalHoldOutput) out.ResultMetadata = metadata return out, nil } type PutObjectLegalHoldInput struct { // The bucket name containing the object that you want to place a legal hold on. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The key name for the object that you want to place a legal hold on. // // This member is required. Key *string // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The MD5 hash for the request body. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Container element for the legal hold configuration you want to apply to the // specified object. LegalHold *types.ObjectLockLegalHold // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // The version ID of the object that you want to place a legal hold on. VersionId *string noSmithyDocumentSerde } func (in *PutObjectLegalHoldInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type PutObjectLegalHoldOutput struct { // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutObjectLegalHoldMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectLegalHold{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectLegalHold{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutObjectLegalHold"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutObjectLegalHoldValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectLegalHold(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutObjectLegalHoldInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutObjectLegalHoldUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutObjectLegalHoldInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutObjectLegalHold(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutObjectLegalHold", } } // getPutObjectLegalHoldRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getPutObjectLegalHoldRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutObjectLegalHoldInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutObjectLegalHoldInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutObjectLegalHoldRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutObjectLegalHoldBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getPutObjectLegalHoldBucketMember(input interface{}) (*string, bool) { in := input.(*PutObjectLegalHoldInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutObjectLegalHoldUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutObjectLegalHoldBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectLockConfiguration.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Places an Object Lock configuration on the specified bucket. The rule specified // in the Object Lock configuration will be applied by default to every new object // placed in the specified bucket. For more information, see [Locking Objects]. // // - The DefaultRetention settings require both a mode and a period. // // - The DefaultRetention period can be either Days or Years but you must select // one. You cannot specify Days and Years at the same time. // // - You can enable Object Lock for new or existing buckets. For more // information, see [Configuring Object Lock]. // // [Configuring Object Lock]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-configure.html // [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html func (c *Client) PutObjectLockConfiguration(ctx context.Context, params *PutObjectLockConfigurationInput, optFns ...func(*Options)) (*PutObjectLockConfigurationOutput, error) { if params == nil { params = &PutObjectLockConfigurationInput{} } result, metadata, err := c.invokeOperation(ctx, "PutObjectLockConfiguration", params, optFns, c.addOperationPutObjectLockConfigurationMiddlewares) if err != nil { return nil, err } out := result.(*PutObjectLockConfigurationOutput) out.ResultMetadata = metadata return out, nil } type PutObjectLockConfigurationInput struct { // The bucket whose Object Lock configuration you want to create or replace. // // This member is required. Bucket *string // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The MD5 hash for the request body. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The Object Lock configuration that you want to apply to the specified bucket. ObjectLockConfiguration *types.ObjectLockConfiguration // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // A token to allow Object Lock to be enabled for an existing bucket. Token *string noSmithyDocumentSerde } func (in *PutObjectLockConfigurationInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type PutObjectLockConfigurationOutput struct { // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutObjectLockConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectLockConfiguration{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectLockConfiguration{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutObjectLockConfiguration"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutObjectLockConfigurationValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectLockConfiguration(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutObjectLockConfigurationInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutObjectLockConfigurationUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutObjectLockConfigurationInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutObjectLockConfiguration(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutObjectLockConfiguration", } } // getPutObjectLockConfigurationRequestAlgorithmMember gets the request checksum // algorithm value provided as input. func getPutObjectLockConfigurationRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutObjectLockConfigurationInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutObjectLockConfigurationInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutObjectLockConfigurationRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutObjectLockConfigurationBucketMember returns a pointer to string denoting // a provided bucket member valueand a boolean indicating if the input has a // modeled bucket name, func getPutObjectLockConfigurationBucketMember(input interface{}) (*string, bool) { in := input.(*PutObjectLockConfigurationInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutObjectLockConfigurationUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutObjectLockConfigurationBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectRetention.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Places an Object Retention configuration on an object. For more information, // see [Locking Objects]. Users or accounts require the s3:PutObjectRetention permission in order // to place an Object Retention configuration on objects. Bypassing a Governance // Retention configuration requires the s3:BypassGovernanceRetention permission. // // This functionality is not supported for Amazon S3 on Outposts. // // [Locking Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html func (c *Client) PutObjectRetention(ctx context.Context, params *PutObjectRetentionInput, optFns ...func(*Options)) (*PutObjectRetentionOutput, error) { if params == nil { params = &PutObjectRetentionInput{} } result, metadata, err := c.invokeOperation(ctx, "PutObjectRetention", params, optFns, c.addOperationPutObjectRetentionMiddlewares) if err != nil { return nil, err } out := result.(*PutObjectRetentionOutput) out.ResultMetadata = metadata return out, nil } type PutObjectRetentionInput struct { // The bucket name that contains the object you want to apply this Object // Retention configuration to. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // The key name for the object that you want to apply this Object Retention // configuration to. // // This member is required. Key *string // Indicates whether this action should bypass Governance-mode restrictions. BypassGovernanceRetention *bool // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The MD5 hash for the request body. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // The container element for the Object Retention configuration. Retention *types.ObjectLockRetention // The version ID for the object that you want to apply this Object Retention // configuration to. VersionId *string noSmithyDocumentSerde } func (in *PutObjectRetentionInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type PutObjectRetentionOutput struct { // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutObjectRetentionMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectRetention{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectRetention{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutObjectRetention"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutObjectRetentionValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectRetention(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutObjectRetentionInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutObjectRetentionUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutObjectRetentionInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutObjectRetention(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutObjectRetention", } } // getPutObjectRetentionRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getPutObjectRetentionRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutObjectRetentionInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutObjectRetentionInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutObjectRetentionRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutObjectRetentionBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getPutObjectRetentionBucketMember(input interface{}) (*string, bool) { in := input.(*PutObjectRetentionInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutObjectRetentionUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutObjectRetentionBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutObjectTagging.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Sets the supplied tag-set to an object that already exists in a bucket. A tag // is a key-value pair. For more information, see [Object Tagging]. // // You can associate tags with an object by sending a PUT request against the // tagging subresource that is associated with the object. You can retrieve tags by // sending a GET request. For more information, see [GetObjectTagging]. // // For tagging-related restrictions related to characters and encodings, see [Tag Restrictions]. // Note that Amazon S3 limits the maximum number of tags to 10 tags per object. // // To use this operation, you must have permission to perform the // s3:PutObjectTagging action. By default, the bucket owner has this permission and // can grant this permission to others. // // To put tags of any other version, use the versionId query parameter. You also // need permission for the s3:PutObjectVersionTagging action. // // PutObjectTagging has the following special errors. For more Amazon S3 errors // see, [Error Responses]. // // - InvalidTag - The tag provided was not a valid tag. This error can occur if // the tag did not pass input validation. For more information, see [Object Tagging]. // // - MalformedXML - The XML provided does not match the schema. // // - OperationAborted - A conflicting conditional action is currently in progress // against this resource. Please try again. // // - InternalError - The service was unable to apply the provided tag to the // object. // // The following operations are related to PutObjectTagging : // // [GetObjectTagging] // // [DeleteObjectTagging] // // [Error Responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html // [DeleteObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html // [Object Tagging]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html // [Tag Restrictions]: https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html // [GetObjectTagging]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html func (c *Client) PutObjectTagging(ctx context.Context, params *PutObjectTaggingInput, optFns ...func(*Options)) (*PutObjectTaggingOutput, error) { if params == nil { params = &PutObjectTaggingInput{} } result, metadata, err := c.invokeOperation(ctx, "PutObjectTagging", params, optFns, c.addOperationPutObjectTaggingMiddlewares) if err != nil { return nil, err } out := result.(*PutObjectTaggingOutput) out.ResultMetadata = metadata return out, nil } type PutObjectTaggingInput struct { // The bucket name containing the object. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Name of the object key. // // This member is required. Key *string // Container for the TagSet and Tag elements // // This member is required. Tagging *types.Tagging // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The MD5 hash for the request body. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // The versionId of the object that the tag-set will be added to. VersionId *string noSmithyDocumentSerde } func (in *PutObjectTaggingInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type PutObjectTaggingOutput struct { // The versionId of the object the tag-set was added to. VersionId *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutObjectTaggingMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutObjectTagging{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutObjectTagging{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutObjectTagging"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutObjectTaggingValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutObjectTagging(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutObjectTaggingInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutObjectTaggingUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutObjectTaggingInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutObjectTagging(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutObjectTagging", } } // getPutObjectTaggingRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getPutObjectTaggingRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutObjectTaggingInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutObjectTaggingInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutObjectTaggingRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutObjectTaggingBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getPutObjectTaggingBucketMember(input interface{}) (*string, bool) { in := input.(*PutObjectTaggingInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutObjectTaggingUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutObjectTaggingBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_PutPublicAccessBlock.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // Creates or modifies the PublicAccessBlock configuration for an Amazon S3 // bucket. To use this operation, you must have the s3:PutBucketPublicAccessBlock // permission. For more information about Amazon S3 permissions, see [Specifying Permissions in a Policy]. // // When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or an // object, it checks the PublicAccessBlock configuration for both the bucket (or // the bucket that contains the object) and the bucket owner's account. If the // PublicAccessBlock configurations are different between the bucket and the // account, Amazon S3 uses the most restrictive combination of the bucket-level and // account-level settings. // // For more information about when Amazon S3 considers a bucket or an object // public, see [The Meaning of "Public"]. // // The following operations are related to PutPublicAccessBlock : // // [GetPublicAccessBlock] // // [DeletePublicAccessBlock] // // [GetBucketPolicyStatus] // // [Using Amazon S3 Block Public Access] // // [GetPublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html // [DeletePublicAccessBlock]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html // [Using Amazon S3 Block Public Access]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html // [GetBucketPolicyStatus]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicyStatus.html // [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html // [The Meaning of "Public"]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status func (c *Client) PutPublicAccessBlock(ctx context.Context, params *PutPublicAccessBlockInput, optFns ...func(*Options)) (*PutPublicAccessBlockOutput, error) { if params == nil { params = &PutPublicAccessBlockInput{} } result, metadata, err := c.invokeOperation(ctx, "PutPublicAccessBlock", params, optFns, c.addOperationPutPublicAccessBlockMiddlewares) if err != nil { return nil, err } out := result.(*PutPublicAccessBlockOutput) out.ResultMetadata = metadata return out, nil } type PutPublicAccessBlockInput struct { // The name of the Amazon S3 bucket whose PublicAccessBlock configuration you want // to set. // // This member is required. Bucket *string // The PublicAccessBlock configuration that you want to apply to this Amazon S3 // bucket. You can enable the configuration options in any combination. For more // information about when Amazon S3 considers a bucket or object public, see [The Meaning of "Public"]in // the Amazon S3 User Guide. // // [The Meaning of "Public"]: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status // // This member is required. PublicAccessBlockConfiguration *types.PublicAccessBlockConfiguration // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The MD5 hash of the PutPublicAccessBlock request body. // // For requests made using the Amazon Web Services Command Line Interface (CLI) or // Amazon Web Services SDKs, this field is calculated automatically. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string noSmithyDocumentSerde } func (in *PutPublicAccessBlockInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.UseS3ExpressControlEndpoint = ptr.Bool(true) } type PutPublicAccessBlockOutput struct { // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationPutPublicAccessBlockMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpPutPublicAccessBlock{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpPutPublicAccessBlock{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "PutPublicAccessBlock"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpPutPublicAccessBlockValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutPublicAccessBlock(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addPutPublicAccessBlockInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addPutPublicAccessBlockUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = s3cust.AddExpressDefaultChecksumMiddleware(stack); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *PutPublicAccessBlockInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opPutPublicAccessBlock(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "PutPublicAccessBlock", } } // getPutPublicAccessBlockRequestAlgorithmMember gets the request checksum // algorithm value provided as input. func getPutPublicAccessBlockRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*PutPublicAccessBlockInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addPutPublicAccessBlockInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getPutPublicAccessBlockRequestAlgorithmMember, RequireChecksum: true, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getPutPublicAccessBlockBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getPutPublicAccessBlockBucketMember(input interface{}) (*string, bool) { in := input.(*PutPublicAccessBlockInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addPutPublicAccessBlockUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getPutPublicAccessBlockBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_RestoreObject.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" ) // This operation is not supported for directory buckets. // // # Restores an archived copy of an object back into Amazon S3 // // This functionality is not supported for Amazon S3 on Outposts. // // This action performs the following types of requests: // // - restore an archive - Restore an archived object // // For more information about the S3 structure in the request body, see the // following: // // [PutObject] // // [Managing Access with ACLs] // - in the Amazon S3 User Guide // // [Protecting Data Using Server-Side Encryption] // - in the Amazon S3 User Guide // // Permissions To use this operation, you must have permissions to perform the // s3:RestoreObject action. The bucket owner has this permission by default and can // grant this permission to others. For more information about permissions, see [Permissions Related to Bucket Subresource Operations] // and [Managing Access Permissions to Your Amazon S3 Resources]in the Amazon S3 User Guide. // // Restoring objects Objects that you archive to the S3 Glacier Flexible Retrieval // or S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or // S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For // objects in the S3 Glacier Flexible Retrieval or S3 Glacier Deep Archive storage // classes, you must first initiate a restore request, and then wait until a // temporary copy of the object is available. If you want a permanent copy of the // object, create a copy of it in the Amazon S3 Standard storage class in your S3 // bucket. To access an archived object, you must restore the object for the // duration (number of days) that you specify. For objects in the Archive Access or // Deep Archive Access tiers of S3 Intelligent-Tiering, you must first initiate a // restore request, and then wait until the object is moved into the Frequent // Access tier. // // To restore a specific object version, you can provide a version ID. If you // don't provide a version ID, Amazon S3 restores the current version. // // When restoring an archived object, you can specify one of the following data // access tier options in the Tier element of the request body: // // - Expedited - Expedited retrievals allow you to quickly access your data // stored in the S3 Glacier Flexible Retrieval storage class or S3 // Intelligent-Tiering Archive tier when occasional urgent requests for restoring // archives are required. For all but the largest archived objects (250 MB+), data // accessed using Expedited retrievals is typically made available within 1–5 // minutes. Provisioned capacity ensures that retrieval capacity for Expedited // retrievals is available when you need it. Expedited retrievals and provisioned // capacity are not available for objects stored in the S3 Glacier Deep Archive // storage class or S3 Intelligent-Tiering Deep Archive tier. // // - Standard - Standard retrievals allow you to access any of your archived // objects within several hours. This is the default option for retrieval requests // that do not specify the retrieval option. Standard retrievals typically finish // within 3–5 hours for objects stored in the S3 Glacier Flexible Retrieval storage // class or S3 Intelligent-Tiering Archive tier. They typically finish within 12 // hours for objects stored in the S3 Glacier Deep Archive storage class or S3 // Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects // stored in S3 Intelligent-Tiering. // // - Bulk - Bulk retrievals free for objects stored in the S3 Glacier Flexible // Retrieval and S3 Intelligent-Tiering storage classes, enabling you to retrieve // large amounts, even petabytes, of data at no cost. Bulk retrievals typically // finish within 5–12 hours for objects stored in the S3 Glacier Flexible Retrieval // storage class or S3 Intelligent-Tiering Archive tier. Bulk retrievals are also // the lowest-cost retrieval option when restoring objects from S3 Glacier Deep // Archive. They typically finish within 48 hours for objects stored in the S3 // Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive tier. // // For more information about archive retrieval options and provisioned capacity // for Expedited data access, see [Restoring Archived Objects] in the Amazon S3 User Guide. // // You can use Amazon S3 restore speed upgrade to change the restore speed to a // faster speed while it is in progress. For more information, see [Upgrading the speed of an in-progress restore]in the Amazon // S3 User Guide. // // To get the status of object restoration, you can send a HEAD request. // Operations return the x-amz-restore header, which provides information about // the restoration status, in the response. You can use Amazon S3 event // notifications to notify you when a restore is initiated or completed. For more // information, see [Configuring Amazon S3 Event Notifications]in the Amazon S3 User Guide. // // After restoring an archived object, you can update the restoration period by // reissuing the request with a new period. Amazon S3 updates the restoration // period relative to the current time and charges only for the request-there are // no data transfer charges. You cannot update the restoration period when Amazon // S3 is actively processing your current restore request for the object. // // If your bucket has a lifecycle configuration with a rule that includes an // expiration action, the object expiration overrides the life span that you // specify in a restore request. For example, if you restore an object copy for 10 // days, but the object is scheduled to expire in 3 days, Amazon S3 deletes the // object in 3 days. For more information about lifecycle configuration, see [PutBucketLifecycleConfiguration]and [Object Lifecycle Management] // in Amazon S3 User Guide. // // Responses A successful action returns either the 200 OK or 202 Accepted status // code. // // - If the object is not previously restored, then Amazon S3 returns 202 // Accepted in the response. // // - If the object is previously restored, Amazon S3 returns 200 OK in the // response. // // - Special errors: // // - Code: RestoreAlreadyInProgress // // - Cause: Object restore is already in progress. // // - HTTP Status Code: 409 Conflict // // - SOAP Fault Code Prefix: Client // // - Code: GlacierExpeditedRetrievalNotAvailable // // - Cause: expedited retrievals are currently not available. Try again later. // (Returned if there is insufficient capacity to process the Expedited request. // This error applies only to Expedited retrievals and not to S3 Standard or Bulk // retrievals.) // // - HTTP Status Code: 503 // // - SOAP Fault Code Prefix: N/A // // The following operations are related to RestoreObject : // // [PutBucketLifecycleConfiguration] // // [GetBucketNotificationConfiguration] // // [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html // [Object Lifecycle Management]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html // [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources // [Configuring Amazon S3 Event Notifications]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html // [Managing Access with ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html // [Protecting Data Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html // [GetBucketNotificationConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketNotificationConfiguration.html // [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html // [Restoring Archived Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html // [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html // [Upgrading the speed of an in-progress restore]: https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html#restoring-objects-upgrade-tier.title.html func (c *Client) RestoreObject(ctx context.Context, params *RestoreObjectInput, optFns ...func(*Options)) (*RestoreObjectOutput, error) { if params == nil { params = &RestoreObjectInput{} } result, metadata, err := c.invokeOperation(ctx, "RestoreObject", params, optFns, c.addOperationRestoreObjectMiddlewares) if err != nil { return nil, err } out := result.(*RestoreObjectOutput) out.ResultMetadata = metadata return out, nil } type RestoreObjectInput struct { // The bucket name containing the object to restore. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Object key for which the action was initiated. // // This member is required. Key *string // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Container for restore job parameters. RestoreRequest *types.RestoreRequest // VersionId used to reference a specific version of the object. VersionId *string noSmithyDocumentSerde } func (in *RestoreObjectInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type RestoreObjectOutput struct { // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // Indicates the path in the provided S3 output location where Select results will // be restored to. RestoreOutputPath *string // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationRestoreObjectMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpRestoreObject{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpRestoreObject{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "RestoreObject"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpRestoreObjectValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opRestoreObject(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addRestoreObjectInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addRestoreObjectUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *RestoreObjectInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opRestoreObject(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "RestoreObject", } } // getRestoreObjectRequestAlgorithmMember gets the request checksum algorithm // value provided as input. func getRestoreObjectRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*RestoreObjectInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addRestoreObjectInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getRestoreObjectRequestAlgorithmMember, RequireChecksum: false, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: false, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getRestoreObjectBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getRestoreObjectBucketMember(input interface{}) (*string, bool) { in := input.(*RestoreObjectInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addRestoreObjectUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getRestoreObjectBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_SelectObjectContent.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithysync "github.com/aws/smithy-go/sync" "sync" ) // This operation is not supported for directory buckets. // // This action filters the contents of an Amazon S3 object based on a simple // structured query language (SQL) statement. In the request, along with the SQL // expression, you must also specify a data serialization format (JSON, CSV, or // Apache Parquet) of the object. Amazon S3 uses this format to parse object data // into records, and returns only records that match the specified SQL expression. // You must also specify the data serialization format for the response. // // This functionality is not supported for Amazon S3 on Outposts. // // For more information about Amazon S3 Select, see [Selecting Content from Objects] and [SELECT Command] in the Amazon S3 User // Guide. // // Permissions You must have the s3:GetObject permission for this operation. // Amazon S3 Select does not support anonymous access. For more information about // permissions, see [Specifying Permissions in a Policy]in the Amazon S3 User Guide. // // Object Data Formats You can use Amazon S3 Select to query objects that have the // following format properties: // // - CSV, JSON, and Parquet - Objects must be in CSV, JSON, or Parquet format. // // - UTF-8 - UTF-8 is the only encoding type Amazon S3 Select supports. // // - GZIP or BZIP2 - CSV and JSON files can be compressed using GZIP or BZIP2. // GZIP and BZIP2 are the only compression formats that Amazon S3 Select supports // for CSV and JSON files. Amazon S3 Select supports columnar compression for // Parquet using GZIP or Snappy. Amazon S3 Select does not support whole-object // compression for Parquet objects. // // - Server-side encryption - Amazon S3 Select supports querying objects that // are protected with server-side encryption. // // For objects that are encrypted with customer-provided encryption keys (SSE-C), // // you must use HTTPS, and you must use the headers that are documented in the [GetObject]. // For more information about SSE-C, see [Server-Side Encryption (Using Customer-Provided Encryption Keys)]in the Amazon S3 User Guide. // // For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and Amazon // // Web Services KMS keys (SSE-KMS), server-side encryption is handled // transparently, so you don't need to specify anything. For more information about // server-side encryption, including SSE-S3 and SSE-KMS, see [Protecting Data Using Server-Side Encryption]in the Amazon S3 // User Guide. // // Working with the Response Body Given the response size is unknown, Amazon S3 // Select streams the response as a series of messages and includes a // Transfer-Encoding header with chunked as its value in the response. For more // information, see [Appendix: SelectObjectContent Response]. // // GetObject Support The SelectObjectContent action does not support the following // GetObject functionality. For more information, see [GetObject]. // // - Range : Although you can specify a scan range for an Amazon S3 Select // request (see [SelectObjectContentRequest - ScanRange]in the request parameters), you cannot specify the range of // bytes of an object to return. // // - The GLACIER , DEEP_ARCHIVE , and REDUCED_REDUNDANCY storage classes, or the // ARCHIVE_ACCESS and DEEP_ARCHIVE_ACCESS access tiers of the INTELLIGENT_TIERING // storage class: You cannot query objects in the GLACIER , DEEP_ARCHIVE , or // REDUCED_REDUNDANCY storage classes, nor objects in the ARCHIVE_ACCESS or // DEEP_ARCHIVE_ACCESS access tiers of the INTELLIGENT_TIERING storage class. For // more information about storage classes, see [Using Amazon S3 storage classes]in the Amazon S3 User Guide. // // Special Errors For a list of special errors for this operation, see [List of SELECT Object Content Error Codes] // // The following operations are related to SelectObjectContent : // // [GetObject] // // [GetBucketLifecycleConfiguration] // // [PutBucketLifecycleConfiguration] // // [Appendix: SelectObjectContent Response]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTSelectObjectAppendix.html // [Selecting Content from Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/selecting-content-from-objects.html // [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html // [SelectObjectContentRequest - ScanRange]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html#AmazonS3-SelectObjectContent-request-ScanRange // [List of SELECT Object Content Error Codes]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#SelectObjectContentErrorCodeList // [GetBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html // [Using Amazon S3 storage classes]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html // [SELECT Command]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-select.html // [GetObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html // [Specifying Permissions in a Policy]: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html // // [Server-Side Encryption (Using Customer-Provided Encryption Keys)]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html // [Protecting Data Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html func (c *Client) SelectObjectContent(ctx context.Context, params *SelectObjectContentInput, optFns ...func(*Options)) (*SelectObjectContentOutput, error) { if params == nil { params = &SelectObjectContentInput{} } result, metadata, err := c.invokeOperation(ctx, "SelectObjectContent", params, optFns, c.addOperationSelectObjectContentMiddlewares) if err != nil { return nil, err } out := result.(*SelectObjectContentOutput) out.ResultMetadata = metadata return out, nil } // Learn Amazon S3 Select is no longer available to new customers. Existing // customers of Amazon S3 Select can continue to use the feature as usual. [Learn more] // // Request to filter the contents of an Amazon S3 object based on a simple // Structured Query Language (SQL) statement. In the request, along with the SQL // expression, you must specify a data serialization format (JSON or CSV) of the // object. Amazon S3 uses this to parse object data into records. It returns only // records that match the specified SQL expression. You must also specify the data // serialization format for the response. For more information, see [S3Select API Documentation]. // // [Learn more]: http://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/ // [S3Select API Documentation]: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectSELECTContent.html type SelectObjectContentInput struct { // The S3 bucket. // // This member is required. Bucket *string // The expression that is used to query the object. // // This member is required. Expression *string // The type of the provided expression (for example, SQL). // // This member is required. ExpressionType types.ExpressionType // Describes the format of the data in the object that is being queried. // // This member is required. InputSerialization *types.InputSerialization // The object key. // // This member is required. Key *string // Describes the format of the data that you want Amazon S3 to return in response. // // This member is required. OutputSerialization *types.OutputSerialization // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Specifies if periodic request progress information should be enabled. RequestProgress *types.RequestProgress // The server-side encryption (SSE) algorithm used to encrypt the object. This // parameter is needed only when the object was created using a checksum algorithm. // For more information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerAlgorithm *string // The server-side encryption (SSE) customer managed key. This parameter is needed // only when the object was created using a checksum algorithm. For more // information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerKey *string // The MD5 server-side encryption (SSE) customer managed key. This parameter is // needed only when the object was created using a checksum algorithm. For more // information, see [Protecting data using SSE-C keys]in the Amazon S3 User Guide. // // [Protecting data using SSE-C keys]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html SSECustomerKeyMD5 *string // Specifies the byte range of the object to get the records from. A record is // processed when its first byte is contained by the range. This parameter is // optional, but when specified, it must not be empty. See RFC 2616, Section // 14.35.1 about how to specify the start and end of the range. // // ScanRange may be used in the following ways: // // - 50100 - process only the records starting between the bytes 50 and 100 // (inclusive, counting from zero) // // - 50 - process only the records starting after the byte 50 // // - 50 - process only the records within the last 50 bytes of the file. ScanRange *types.ScanRange noSmithyDocumentSerde } func (in *SelectObjectContentInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket } type SelectObjectContentOutput struct { eventStream *SelectObjectContentEventStream // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } // GetStream returns the type to interact with the event stream. func (o *SelectObjectContentOutput) GetStream() *SelectObjectContentEventStream { return o.eventStream } func (c *Client) addOperationSelectObjectContentMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpSelectObjectContent{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpSelectObjectContent{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "SelectObjectContent"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addEventStreamSelectObjectContentMiddleware(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpSelectObjectContentValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opSelectObjectContent(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addSelectObjectContentUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *SelectObjectContentInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opSelectObjectContent(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "SelectObjectContent", } } // getSelectObjectContentBucketMember returns a pointer to string denoting a // provided bucket member valueand a boolean indicating if the input has a modeled // bucket name, func getSelectObjectContentBucketMember(input interface{}) (*string, bool) { in := input.(*SelectObjectContentInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addSelectObjectContentUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getSelectObjectContentBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } // SelectObjectContentEventStream provides the event stream handling for the SelectObjectContent operation. // // For testing and mocking the event stream this type should be initialized via // the NewSelectObjectContentEventStream constructor function. Using the functional options // to pass in nested mock behavior. type SelectObjectContentEventStream struct { // SelectObjectContentEventStreamReader is the EventStream reader for the // SelectObjectContentEventStream events. This value is automatically set by the // SDK when the API call is made Use this member when unit testing your code with // the SDK to mock out the EventStream Reader. // // Must not be nil. Reader SelectObjectContentEventStreamReader done chan struct{} closeOnce sync.Once err *smithysync.OnceErr } // NewSelectObjectContentEventStream initializes an SelectObjectContentEventStream. // This function should only be used for testing and mocking the SelectObjectContentEventStream // stream within your application. // // The Reader member must be set before reading events from the stream. func NewSelectObjectContentEventStream(optFns ...func(*SelectObjectContentEventStream)) *SelectObjectContentEventStream { es := &SelectObjectContentEventStream{ done: make(chan struct{}), err: smithysync.NewOnceErr(), } for _, fn := range optFns { fn(es) } return es } // Events returns a channel to read events from. func (es *SelectObjectContentEventStream) Events() <-chan types.SelectObjectContentEventStream { return es.Reader.Events() } // Close closes the stream. This will also cause the stream to be closed. // Close must be called when done using the stream API. Not calling Close // may result in resource leaks. // // Will close the underlying EventStream writer and reader, and no more events can be // sent or received. func (es *SelectObjectContentEventStream) Close() error { es.closeOnce.Do(es.safeClose) return es.Err() } func (es *SelectObjectContentEventStream) safeClose() { close(es.done) es.Reader.Close() } // Err returns any error that occurred while reading or writing EventStream Events // from the service API's response. Returns nil if there were no errors. func (es *SelectObjectContentEventStream) Err() error { if err := es.err.Err(); err != nil { return err } if err := es.Reader.Err(); err != nil { return err } return nil } func (es *SelectObjectContentEventStream) waitStreamClose() { type errorSet interface { ErrorSet() <-chan struct{} } var outputErrCh <-chan struct{} if v, ok := es.Reader.(errorSet); ok { outputErrCh = v.ErrorSet() } var outputClosedCh <-chan struct{} if v, ok := es.Reader.(interface{ Closed() <-chan struct{} }); ok { outputClosedCh = v.Closed() } select { case <-es.done: case <-outputErrCh: es.err.SetError(es.Reader.Err()) es.Close() case <-outputClosedCh: if err := es.Reader.Err(); err != nil { es.err.SetError(es.Reader.Err()) } es.Close() } } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_UploadPart.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" "io" ) // Uploads a part in a multipart upload. // // In this operation, you provide new data as a part of an object in your request. // However, you have an option to specify your existing Amazon S3 object as a data // source for the part you are uploading. To upload a part from an existing object, // you use the [UploadPartCopy]operation. // // You must initiate a multipart upload (see [CreateMultipartUpload]) before you can upload any part. In // response to your initiate request, Amazon S3 returns an upload ID, a unique // identifier that you must include in your upload part request. // // Part numbers can be any number from 1 to 10,000, inclusive. A part number // uniquely identifies a part and also defines its position within the object being // created. If you upload a new part using the same part number that was used with // a previous part, the previously uploaded part is overwritten. // // For information about maximum and minimum part sizes and other multipart upload // specifications, see [Multipart upload limits]in the Amazon S3 User Guide. // // After you initiate multipart upload and upload one or more parts, you must // either complete or abort multipart upload in order to stop getting charged for // storage of the uploaded parts. Only after you either complete or abort multipart // upload, Amazon S3 frees up the parts storage and stops charging you for the // parts storage. // // For more information on multipart uploads, go to [Multipart Upload Overview] in the Amazon S3 User Guide . // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Zonal endpoint. These endpoints support virtual-hosted-style // requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Permissions // - General purpose bucket permissions - To perform a multipart upload with // encryption using an Key Management Service key, the requester must have // permission to the kms:Decrypt and kms:GenerateDataKey actions on the key. The // requester must also have permissions for the kms:GenerateDataKey action for // the CreateMultipartUpload API. Then, the requester needs permissions for the // kms:Decrypt action on the UploadPart and UploadPartCopy APIs. // // These permissions are required because Amazon S3 must decrypt and read data // // from the encrypted file parts before it completes the multipart upload. For more // information about KMS permissions, see [Protecting data using server-side encryption with KMS]in the Amazon S3 User Guide. For // information about the permissions required to use the multipart upload API, see [Multipart upload and permissions] // and [Multipart upload API and permissions]in the Amazon S3 User Guide. // // - Directory bucket permissions - To grant access to this API operation on a // directory bucket, we recommend that you use the [CreateSession]CreateSession API operation // for session-based authorization. Specifically, you grant the // s3express:CreateSession permission to the directory bucket in a bucket policy // or an IAM identity-based policy. Then, you make the CreateSession API call on // the bucket to obtain a session token. With the session token in your request // header, you can make API requests to this operation. After the session token // expires, you make another CreateSession API call to generate a new session // token for use. Amazon Web Services CLI or SDKs create session and refresh the // session token automatically to avoid service interruptions when a session // expires. For more information about authorization, see [CreateSession]CreateSession . // // If the object is encrypted with SSE-KMS, you must also have the // // kms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies // and KMS key policies for the KMS key. // // Data integrity General purpose bucket - To ensure that data is not corrupted // traversing the network, specify the Content-MD5 header in the upload part // request. Amazon S3 checks the part data against the provided MD5 value. If they // do not match, Amazon S3 returns an error. If the upload request is signed with // Signature Version 4, then Amazon Web Services S3 uses the x-amz-content-sha256 // header as a checksum instead of Content-MD5 . For more information see [Authenticating Requests: Using the Authorization Header (Amazon Web Services Signature Version 4)]. // // Directory buckets - MD5 is not supported by directory buckets. You can use // checksum algorithms to check object integrity. // // Encryption // - General purpose bucket - Server-side encryption is for data encryption at // rest. Amazon S3 encrypts your data as it writes it to disks in its data centers // and decrypts it when you access it. You have mutually exclusive options to // protect data using server-side encryption in Amazon S3, depending on how you // choose to manage the encryption keys. Specifically, the encryption key options // are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS), and // Customer-Provided Keys (SSE-C). Amazon S3 encrypts data with server-side // encryption using Amazon S3 managed keys (SSE-S3) by default. You can optionally // tell Amazon S3 to encrypt data at rest using server-side encryption with other // key options. The option you use depends on whether you want to use KMS keys // (SSE-KMS) or provide your own encryption key (SSE-C). // // Server-side encryption is supported by the S3 Multipart Upload operations. // // Unless you are using a customer-provided encryption key (SSE-C), you don't need // to specify the encryption parameters in each UploadPart request. Instead, you // only need to specify the server-side encryption parameters in the initial // Initiate Multipart request. For more information, see [CreateMultipartUpload]. // // If you request server-side encryption using a customer-provided encryption key // // (SSE-C) in your initiate multipart upload request, you must provide identical // encryption information in each part upload using the following request headers. // // - x-amz-server-side-encryption-customer-algorithm // // - x-amz-server-side-encryption-customer-key // // - x-amz-server-side-encryption-customer-key-MD5 // // For more information, see [Using Server-Side Encryption]in the Amazon S3 User Guide. // // - Directory buckets - For directory buckets, there are only two supported // options for server-side encryption: server-side encryption with Amazon S3 // managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys // (SSE-KMS) ( aws:kms ). // // Special errors // // - Error Code: NoSuchUpload // // - Description: The specified multipart upload does not exist. The upload ID // might be invalid, or the multipart upload might have been aborted or completed. // // - HTTP Status Code: 404 Not Found // // - SOAP Fault Code Prefix: Client // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to UploadPart : // // [CreateMultipartUpload] // // [CompleteMultipartUpload] // // [AbortMultipartUpload] // // [ListParts] // // [ListMultipartUploads] // // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html // [Authenticating Requests: Using the Authorization Header (Amazon Web Services Signature Version 4)]: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html // [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html // [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html // [Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html // [Multipart upload limits]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html // [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html // [Multipart Upload Overview]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html // [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // // [Protecting data using server-side encryption with KMS]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html // [Multipart upload and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html // [CreateSession]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html // [Multipart upload API and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions func (c *Client) UploadPart(ctx context.Context, params *UploadPartInput, optFns ...func(*Options)) (*UploadPartOutput, error) { if params == nil { params = &UploadPartInput{} } result, metadata, err := c.invokeOperation(ctx, "UploadPart", params, optFns, c.addOperationUploadPartMiddlewares) if err != nil { return nil, err } out := result.(*UploadPartOutput) out.ResultMetadata = metadata return out, nil } type UploadPartInput struct { // The name of the bucket to which the multipart upload was initiated. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Object key for which the multipart upload was initiated. // // This member is required. Key *string // Part number of part being uploaded. This is a positive integer between 1 and // 10,000. // // This member is required. PartNumber *int32 // Upload ID identifying the multipart upload whose part is being uploaded. // // This member is required. UploadId *string // Object data. Body io.Reader // Indicates the algorithm used to create the checksum for the object when you use // the SDK. This header will not provide any additional functionality if you don't // use the SDK. When you send this header, there must be a corresponding // x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the // request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // If you provide an individual checksum, Amazon S3 ignores any provided // ChecksumAlgorithm parameter. // // This checksum algorithm must be the same for all parts and it match the // checksum value supplied in the CreateMultipartUpload request. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumAlgorithm types.ChecksumAlgorithm // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 32-bit CRC32 checksum of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC32 *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 32-bit CRC32C checksum of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC32C *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 64-bit CRC64NVME checksum of the part. For more information, // see [Checking object integrity]in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC64NVME *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 160-bit SHA1 digest of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumSHA1 *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 256-bit SHA256 digest of the object. For more information, see [Checking object integrity] // in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumSHA256 *string // Size of the body in bytes. This parameter is useful when the size of the body // cannot be determined automatically. ContentLength *int64 // The Base64 encoded 128-bit MD5 digest of the part data. This parameter is // auto-populated when using the command from the CLI. This parameter is required // if object lock parameters are specified. // // This functionality is not supported for directory buckets. ContentMD5 *string // The account ID of the expected bucket owner. If the account ID that you provide // does not match the actual owner of the bucket, the request fails with the HTTP // status code 403 Forbidden (access denied). ExpectedBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Specifies the algorithm to use when encrypting the object (for example, AES256). // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use in // encrypting data. This value is used to store the object and then it is // discarded; Amazon S3 does not store the encryption key. The key must be // appropriate for use with the algorithm specified in the // x-amz-server-side-encryption-customer-algorithm header . This must be the same // encryption key specified in the initiate multipart upload request. // // This functionality is not supported for directory buckets. SSECustomerKey *string // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. // Amazon S3 uses this header for a message integrity check to ensure that the // encryption key was transmitted without error. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string noSmithyDocumentSerde } func (in *UploadPartInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.Key = in.Key } type UploadPartOutput struct { // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Key Management Service (KMS) keys (SSE-KMS). BucketKeyEnabled *bool // The Base64 encoded, 32-bit CRC32 checksum of the object. This checksum is only // be present if the checksum was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumCRC32 *string // The Base64 encoded, 32-bit CRC32C checksum of the object. This checksum is only // present if the checksum was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumCRC32C *string // This header can be used as a data integrity check to verify that the data // received is the same data that was originally sent. This header specifies the // Base64 encoded, 64-bit CRC64NVME checksum of the part. For more information, // see [Checking object integrity]in the Amazon S3 User Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html ChecksumCRC64NVME *string // The Base64 encoded, 160-bit SHA1 digest of the object. This will only be // present if the object was uploaded with the object. When you use the API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumSHA1 *string // The Base64 encoded, 256-bit SHA256 digest of the object. This will only be // present if the object was uploaded with the object. When you use an API // operation on an object that was uploaded using multipart uploads, this value may // not be a direct checksum value of the full object. Instead, it's a calculation // based on the checksum values of each individual part. For more information about // how checksums are calculated with multipart uploads, see [Checking object integrity]in the Amazon S3 User // Guide. // // [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums ChecksumSHA256 *string // Entity tag for the uploaded object. ETag *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to confirm the encryption // algorithm that's used. // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to provide the round-trip // message integrity verification of the customer-provided encryption key. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // If present, indicates the ID of the KMS key that was used for object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when you store this object in Amazon // S3 (for example, AES256 , aws:kms ). ServerSideEncryption types.ServerSideEncryption // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationUploadPartMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpUploadPart{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpUploadPart{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "UploadPart"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addRequestChecksumMetricsTracking(stack, options); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpUploadPartValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadPart(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = add100Continue(stack, options); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addUploadPartInputChecksumMiddlewares(stack, options); err != nil { return err } if err = addUploadPartUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = v4.UseDynamicPayloadSigningMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *UploadPartInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opUploadPart(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "UploadPart", } } // getUploadPartRequestAlgorithmMember gets the request checksum algorithm value // provided as input. func getUploadPartRequestAlgorithmMember(input interface{}) (string, bool) { in := input.(*UploadPartInput) if len(in.ChecksumAlgorithm) == 0 { return "", false } return string(in.ChecksumAlgorithm), true } func addUploadPartInputChecksumMiddlewares(stack *middleware.Stack, options Options) error { return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{ GetAlgorithm: getUploadPartRequestAlgorithmMember, RequireChecksum: false, RequestChecksumCalculation: options.RequestChecksumCalculation, EnableTrailingChecksum: true, EnableComputeSHA256PayloadHash: true, EnableDecodedContentLengthHeader: true, }) } // getUploadPartBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getUploadPartBucketMember(input interface{}) (*string, bool) { in := input.(*UploadPartInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addUploadPartUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getUploadPartBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } // PresignUploadPart is used to generate a presigned HTTP Request which contains // presigned URL, signed headers and HTTP method used. func (c *PresignClient) PresignUploadPart(ctx context.Context, params *UploadPartInput, optFns ...func(*PresignOptions)) (*v4.PresignedHTTPRequest, error) { if params == nil { params = &UploadPartInput{} } options := c.options.copy() for _, fn := range optFns { fn(&options) } clientOptFns := append(options.ClientOptions, withNopHTTPClientAPIOption) clientOptFns = append(options.ClientOptions, withNoDefaultChecksumAPIOption) result, _, err := c.client.invokeOperation(ctx, "UploadPart", params, clientOptFns, c.client.addOperationUploadPartMiddlewares, presignConverter(options).convertToPresignMiddleware, func(stack *middleware.Stack, options Options) error { return awshttp.RemoveContentTypeHeader(stack) }, addUploadPartPayloadAsUnsigned, ) if err != nil { return nil, err } out := result.(*v4.PresignedHTTPRequest) return out, nil } func addUploadPartPayloadAsUnsigned(stack *middleware.Stack, options Options) error { v4.RemoveContentSHA256HeaderMiddleware(stack) v4.RemoveComputePayloadSHA256Middleware(stack) return v4.AddUnsignedPayloadMiddleware(stack) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_UploadPartCopy.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/signer/v4" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithyhttp "github.com/aws/smithy-go/transport/http" "time" ) // Uploads a part by copying data from an existing object as data source. To // specify the data source, you add the request header x-amz-copy-source in your // request. To specify a byte range, you add the request header // x-amz-copy-source-range in your request. // // For information about maximum and minimum part sizes and other multipart upload // specifications, see [Multipart upload limits]in the Amazon S3 User Guide. // // Instead of copying data from an existing object as part data, you might use the [UploadPart] // action to upload new data as a part of an object in your request. // // You must initiate a multipart upload before you can upload any part. In // response to your initiate request, Amazon S3 returns the upload ID, a unique // identifier that you must include in your upload part request. // // For conceptual information about multipart uploads, see [Uploading Objects Using Multipart Upload] in the Amazon S3 User // Guide. For information about copying objects using a single atomic action vs. a // multipart upload, see [Operations on Objects]in the Amazon S3 User Guide. // // Directory buckets - For directory buckets, you must make requests for this API // operation to the Zonal endpoint. These endpoints support virtual-hosted-style // requests in the format // https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name // . Path-style requests are not supported. For more information about endpoints // in Availability Zones, see [Regional and Zonal endpoints for directory buckets in Availability Zones]in the Amazon S3 User Guide. For more information // about endpoints in Local Zones, see [Concepts for directory buckets in Local Zones]in the Amazon S3 User Guide. // // Authentication and authorization All UploadPartCopy requests must be // authenticated and signed by using IAM credentials (access key ID and secret // access key for the IAM identities). All headers with the x-amz- prefix, // including x-amz-copy-source , must be signed. For more information, see [REST Authentication]. // // Directory buckets - You must use IAM credentials to authenticate and authorize // your access to the UploadPartCopy API operation, instead of using the temporary // security credentials through the CreateSession API operation. // // Amazon Web Services CLI or SDKs handles authentication and authorization on // your behalf. // // Permissions You must have READ access to the source object and WRITE access to // the destination bucket. // // - General purpose bucket permissions - You must have the permissions in a // policy based on the bucket types of your source bucket and destination bucket in // an UploadPartCopy operation. // // - If the source object is in a general purpose bucket, you must have the // s3:GetObject permission to read the source object that is being copied. // // - If the destination bucket is a general purpose bucket, you must have the // s3:PutObject permission to write the object copy to the destination bucket. // // - To perform a multipart upload with encryption using an Key Management // Service key, the requester must have permission to the kms:Decrypt and // kms:GenerateDataKey actions on the key. The requester must also have // permissions for the kms:GenerateDataKey action for the CreateMultipartUpload // API. Then, the requester needs permissions for the kms:Decrypt action on the // UploadPart and UploadPartCopy APIs. These permissions are required because // Amazon S3 must decrypt and read data from the encrypted file parts before it // completes the multipart upload. For more information about KMS permissions, see [Protecting data using server-side encryption with KMS] // in the Amazon S3 User Guide. For information about the permissions required to // use the multipart upload API, see [Multipart upload and permissions]and [Multipart upload API and permissions]in the Amazon S3 User Guide. // // - Directory bucket permissions - You must have permissions in a bucket policy // or an IAM identity-based policy based on the source and destination bucket types // in an UploadPartCopy operation. // // - If the source object that you want to copy is in a directory bucket, you // must have the s3express:CreateSession permission in the Action element of a // policy to read the object. By default, the session is in the ReadWrite mode. // If you want to restrict the access, you can explicitly set the // s3express:SessionMode condition key to ReadOnly on the copy source bucket. // // - If the copy destination is a directory bucket, you must have the // s3express:CreateSession permission in the Action element of a policy to write // the object to the destination. The s3express:SessionMode condition key cannot // be set to ReadOnly on the copy destination. // // If the object is encrypted with SSE-KMS, you must also have the // // kms:GenerateDataKey and kms:Decrypt permissions in IAM identity-based policies // and KMS key policies for the KMS key. // // For example policies, see [Example bucket policies for S3 Express One Zone]and [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]in the Amazon S3 User Guide. // // Encryption // // - General purpose buckets - For information about using server-side // encryption with customer-provided encryption keys with the UploadPartCopy // operation, see [CopyObject]and [UploadPart]. // // - Directory buckets - For directory buckets, there are only two supported // options for server-side encryption: server-side encryption with Amazon S3 // managed keys (SSE-S3) ( AES256 ) and server-side encryption with KMS keys // (SSE-KMS) ( aws:kms ). For more information, see [Protecting data with server-side encryption]in the Amazon S3 User Guide. // // For directory buckets, when you perform a CreateMultipartUpload operation and an // // UploadPartCopy operation, the request headers you provide in the // CreateMultipartUpload request must match the default encryption configuration // of the destination bucket. // // S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from // // general purpose buckets to directory buckets, from directory buckets to general // purpose buckets, or between directory buckets, through [UploadPartCopy]. In this case, Amazon // S3 makes a call to KMS every time a copy request is made for a KMS-encrypted // object. // // Special errors // // - Error Code: NoSuchUpload // // - Description: The specified multipart upload does not exist. The upload ID // might be invalid, or the multipart upload might have been aborted or completed. // // - HTTP Status Code: 404 Not Found // // - Error Code: InvalidRequest // // - Description: The specified copy source is not supported as a byte-range // copy source. // // - HTTP Status Code: 400 Bad Request // // HTTP Host header syntax Directory buckets - The HTTP Host header syntax is // Bucket-name.s3express-zone-id.region-code.amazonaws.com . // // The following operations are related to UploadPartCopy : // // [CreateMultipartUpload] // // [UploadPart] // // [CompleteMultipartUpload] // // [AbortMultipartUpload] // // [ListParts] // // [ListMultipartUploads] // // [Uploading Objects Using Multipart Upload]: https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html // [Concepts for directory buckets in Local Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html // [ListParts]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html // [UploadPart]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html // [Protecting data using server-side encryption with KMS]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html // [CopyObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html // [Multipart upload and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html // [Multipart upload API and permissions]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions // [CompleteMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html // [CreateMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html // [Multipart upload limits]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html // [Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html // [AbortMultipartUpload]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html // [REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html // [Example bucket policies for S3 Express One Zone]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html // [Operations on Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectOperations.html // [Protecting data with server-side encryption]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html // [ListMultipartUploads]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html // [Regional and Zonal endpoints for directory buckets in Availability Zones]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html // // [UploadPartCopy]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html func (c *Client) UploadPartCopy(ctx context.Context, params *UploadPartCopyInput, optFns ...func(*Options)) (*UploadPartCopyOutput, error) { if params == nil { params = &UploadPartCopyInput{} } result, metadata, err := c.invokeOperation(ctx, "UploadPartCopy", params, optFns, c.addOperationUploadPartCopyMiddlewares) if err != nil { return nil, err } out := result.(*UploadPartCopyOutput) out.ResultMetadata = metadata return out, nil } type UploadPartCopyInput struct { // The bucket name. // // Directory buckets - When you use this operation with a directory bucket, you // must use virtual-hosted-style requests in the format // Bucket-name.s3express-zone-id.region-code.amazonaws.com . Path-style requests // are not supported. Directory bucket names must be unique in the chosen Zone // (Availability Zone or Local Zone). Bucket names must follow the format // bucket-base-name--zone-id--x-s3 (for example, // amzn-s3-demo-bucket--usw2-az1--x-s3 ). For information about bucket naming // restrictions, see [Directory bucket naming rules]in the Amazon S3 User Guide. // // Copying objects across different Amazon Web Services Regions isn't supported // when the source or destination bucket is in Amazon Web Services Local Zones. The // source and destination buckets must have the same parent Amazon Web Services // Region. Otherwise, you get an HTTP 400 Bad Request error with the error code // InvalidRequest . // // Access points - When you use this action with an access point for general // purpose buckets, you must provide the alias of the access point in place of the // bucket name or specify the access point ARN. When you use this action with an // access point for directory buckets, you must provide the access point name in // place of the bucket name. When using the access point ARN, you must direct // requests to the access point hostname. The access point hostname takes the form // AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this // action with an access point through the Amazon Web Services SDKs, you provide // the access point ARN in place of the bucket name. For more information about // access point ARNs, see [Using access points]in the Amazon S3 User Guide. // // Object Lambda access points are not supported by directory buckets. // // S3 on Outposts - When you use this action with S3 on Outposts, you must direct // requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the // form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When // you use this action with S3 on Outposts, the destination bucket must be the // Outposts access point ARN or the access point alias. For more information about // S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide. // // [Directory bucket naming rules]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html // [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html // [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html // // This member is required. Bucket *string // Specifies the source object for the copy operation. You specify the value in // one of two formats, depending on whether you want to access the source object // through an [access point]: // // - For objects not accessed through an access point, specify the name of the // source bucket and key of the source object, separated by a slash (/). For // example, to copy the object reports/january.pdf from the bucket // awsexamplebucket , use awsexamplebucket/reports/january.pdf . The value must // be URL-encoded. // // - For objects accessed through access points, specify the Amazon Resource // Name (ARN) of the object as accessed through the access point, in the format // arn:aws:s3:::accesspoint//object/ . For example, to copy the object // reports/january.pdf through access point my-access-point owned by account // 123456789012 in Region us-west-2 , use the URL encoding of // arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf // . The value must be URL encoded. // // - Amazon S3 supports copy operations using Access points only when the source // and destination buckets are in the same Amazon Web Services Region. // // - Access points are not supported by directory buckets. // // Alternatively, for objects accessed through Amazon S3 on Outposts, specify the // ARN of the object as accessed in the format // arn:aws:s3-outposts:::outpost//object/ . For example, to copy the object // reports/january.pdf through outpost my-outpost owned by account 123456789012 // in Region us-west-2 , use the URL encoding of // arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf // . The value must be URL-encoded. // // If your bucket has versioning enabled, you could have multiple versions of the // same object. By default, x-amz-copy-source identifies the current version of // the source object to copy. To copy a specific version of the source object to // copy, append ?versionId= to the x-amz-copy-source request header (for example, // x-amz-copy-source: // /awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893 // ). // // If the current version is a delete marker and you don't specify a versionId in // the x-amz-copy-source request header, Amazon S3 returns a 404 Not Found error, // because the object does not exist. If you specify versionId in the // x-amz-copy-source and the versionId is a delete marker, Amazon S3 returns an // HTTP 400 Bad Request error, because you are not allowed to specify a delete // marker as a version for the x-amz-copy-source . // // Directory buckets - S3 Versioning isn't enabled and supported for directory // buckets. // // [access point]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html // // This member is required. CopySource *string // Object key for which the multipart upload was initiated. // // This member is required. Key *string // Part number of part being copied. This is a positive integer between 1 and // 10,000. // // This member is required. PartNumber *int32 // Upload ID identifying the multipart upload whose part is being copied. // // This member is required. UploadId *string // Copies the object if its entity tag (ETag) matches the specified tag. // // If both of the x-amz-copy-source-if-match and // x-amz-copy-source-if-unmodified-since headers are present in the request as // follows: // // x-amz-copy-source-if-match condition evaluates to true , and; // // x-amz-copy-source-if-unmodified-since condition evaluates to false ; // // Amazon S3 returns 200 OK and copies the data. CopySourceIfMatch *string // Copies the object if it has been modified since the specified time. // // If both of the x-amz-copy-source-if-none-match and // x-amz-copy-source-if-modified-since headers are present in the request as // follows: // // x-amz-copy-source-if-none-match condition evaluates to false , and; // // x-amz-copy-source-if-modified-since condition evaluates to true ; // // Amazon S3 returns 412 Precondition Failed response code. CopySourceIfModifiedSince *time.Time // Copies the object if its entity tag (ETag) is different than the specified ETag. // // If both of the x-amz-copy-source-if-none-match and // x-amz-copy-source-if-modified-since headers are present in the request as // follows: // // x-amz-copy-source-if-none-match condition evaluates to false , and; // // x-amz-copy-source-if-modified-since condition evaluates to true ; // // Amazon S3 returns 412 Precondition Failed response code. CopySourceIfNoneMatch *string // Copies the object if it hasn't been modified since the specified time. // // If both of the x-amz-copy-source-if-match and // x-amz-copy-source-if-unmodified-since headers are present in the request as // follows: // // x-amz-copy-source-if-match condition evaluates to true , and; // // x-amz-copy-source-if-unmodified-since condition evaluates to false ; // // Amazon S3 returns 200 OK and copies the data. CopySourceIfUnmodifiedSince *time.Time // The range of bytes to copy from the source object. The range value must use the // form bytes=first-last, where the first and last are the zero-based byte offsets // to copy. For example, bytes=0-9 indicates that you want to copy the first 10 // bytes of the source. You can copy a range only if the source object is greater // than 5 MB. CopySourceRange *string // Specifies the algorithm to use when decrypting the source object (for example, // AES256 ). // // This functionality is not supported when the source object is in a directory // bucket. CopySourceSSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use to decrypt // the source object. The encryption key provided in this header must be one that // was used when the source object was created. // // This functionality is not supported when the source object is in a directory // bucket. CopySourceSSECustomerKey *string // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. // Amazon S3 uses this header for a message integrity check to ensure that the // encryption key was transmitted without error. // // This functionality is not supported when the source object is in a directory // bucket. CopySourceSSECustomerKeyMD5 *string // The account ID of the expected destination bucket owner. If the account ID that // you provide does not match the actual owner of the destination bucket, the // request fails with the HTTP status code 403 Forbidden (access denied). ExpectedBucketOwner *string // The account ID of the expected source bucket owner. If the account ID that you // provide does not match the actual owner of the source bucket, the request fails // with the HTTP status code 403 Forbidden (access denied). ExpectedSourceBucketOwner *string // Confirms that the requester knows that they will be charged for the request. // Bucket owners need not specify this parameter in their requests. If either the // source or destination S3 bucket has Requester Pays enabled, the requester will // pay for corresponding charges to copy the object. For information about // downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User // Guide. // // This functionality is not supported for directory buckets. // // [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html RequestPayer types.RequestPayer // Specifies the algorithm to use when encrypting the object (for example, AES256). // // This functionality is not supported when the destination bucket is a directory // bucket. SSECustomerAlgorithm *string // Specifies the customer-provided encryption key for Amazon S3 to use in // encrypting data. This value is used to store the object and then it is // discarded; Amazon S3 does not store the encryption key. The key must be // appropriate for use with the algorithm specified in the // x-amz-server-side-encryption-customer-algorithm header. This must be the same // encryption key specified in the initiate multipart upload request. // // This functionality is not supported when the destination bucket is a directory // bucket. SSECustomerKey *string // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. // Amazon S3 uses this header for a message integrity check to ensure that the // encryption key was transmitted without error. // // This functionality is not supported when the destination bucket is a directory // bucket. SSECustomerKeyMD5 *string noSmithyDocumentSerde } func (in *UploadPartCopyInput) bindEndpointParams(p *EndpointParameters) { p.Bucket = in.Bucket p.DisableS3ExpressSessionAuth = ptr.Bool(true) } type UploadPartCopyOutput struct { // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Key Management Service (KMS) keys (SSE-KMS). BucketKeyEnabled *bool // Container for all response elements. CopyPartResult *types.CopyPartResult // The version of the source object that was copied, if you have enabled // versioning on the source bucket. // // This functionality is not supported when the source object is in a directory // bucket. CopySourceVersionId *string // If present, indicates that the requester was successfully charged for the // request. // // This functionality is not supported for directory buckets. RequestCharged types.RequestCharged // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to confirm the encryption // algorithm that's used. // // This functionality is not supported for directory buckets. SSECustomerAlgorithm *string // If server-side encryption with a customer-provided encryption key was // requested, the response will include this header to provide the round-trip // message integrity verification of the customer-provided encryption key. // // This functionality is not supported for directory buckets. SSECustomerKeyMD5 *string // If present, indicates the ID of the KMS key that was used for object encryption. SSEKMSKeyId *string // The server-side encryption algorithm used when you store this object in Amazon // S3 (for example, AES256 , aws:kms ). ServerSideEncryption types.ServerSideEncryption // Metadata pertaining to the operation's result. ResultMetadata middleware.Metadata noSmithyDocumentSerde } func (c *Client) addOperationUploadPartCopyMiddlewares(stack *middleware.Stack, options Options) (err error) { if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { return err } err = stack.Serialize.Add(&awsRestxml_serializeOpUploadPartCopy{}, middleware.After) if err != nil { return err } err = stack.Deserialize.Add(&awsRestxml_deserializeOpUploadPartCopy{}, middleware.After) if err != nil { return err } if err := addProtocolFinalizerMiddlewares(stack, options, "UploadPartCopy"); err != nil { return fmt.Errorf("add protocol finalizers: %v", err) } if err = addlegacyEndpointContextSetter(stack, options); err != nil { return err } if err = addSetLoggerMiddleware(stack, options); err != nil { return err } if err = addClientRequestID(stack); err != nil { return err } if err = addComputeContentLength(stack); err != nil { return err } if err = addResolveEndpointMiddleware(stack, options); err != nil { return err } if err = addComputePayloadSHA256(stack); err != nil { return err } if err = addRetry(stack, options); err != nil { return err } if err = addRawResponseToMetadata(stack); err != nil { return err } if err = addRecordResponseTiming(stack); err != nil { return err } if err = addSpanRetryLoop(stack, options); err != nil { return err } if err = addClientUserAgent(stack, options); err != nil { return err } if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { return err } if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { return err } if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { return err } if err = addPutBucketContextMiddleware(stack); err != nil { return err } if err = addTimeOffsetBuild(stack, c); err != nil { return err } if err = addUserAgentRetryMode(stack, options); err != nil { return err } if err = addIsExpressUserAgent(stack); err != nil { return err } if err = addCredentialSource(stack, options); err != nil { return err } if err = addOpUploadPartCopyValidationMiddleware(stack); err != nil { return err } if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUploadPartCopy(options.Region), middleware.Before); err != nil { return err } if err = addMetadataRetrieverMiddleware(stack); err != nil { return err } if err = addRecursionDetection(stack); err != nil { return err } if err = addUploadPartCopyUpdateEndpoint(stack, options); err != nil { return err } if err = addResponseErrorMiddleware(stack); err != nil { return err } if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil { return err } if err = disableAcceptEncodingGzip(stack); err != nil { return err } if err = s3cust.HandleResponseErrorWith200Status(stack); err != nil { return err } if err = addRequestResponseLogging(stack, options); err != nil { return err } if err = addDisableHTTPSMiddleware(stack, options); err != nil { return err } if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil { return err } if err = addSpanInitializeStart(stack); err != nil { return err } if err = addSpanInitializeEnd(stack); err != nil { return err } if err = addSpanBuildRequestStart(stack); err != nil { return err } if err = addSpanBuildRequestEnd(stack); err != nil { return err } return nil } func (v *UploadPartCopyInput) bucket() (string, bool) { if v.Bucket == nil { return "", false } return *v.Bucket, true } func newServiceMetadataMiddleware_opUploadPartCopy(region string) *awsmiddleware.RegisterServiceMetadata { return &awsmiddleware.RegisterServiceMetadata{ Region: region, ServiceID: ServiceID, OperationName: "UploadPartCopy", } } // getUploadPartCopyBucketMember returns a pointer to string denoting a provided // bucket member valueand a boolean indicating if the input has a modeled bucket // name, func getUploadPartCopyBucketMember(input interface{}) (*string, bool) { in := input.(*UploadPartCopyInput) if in.Bucket == nil { return nil, false } return in.Bucket, true } func addUploadPartCopyUpdateEndpoint(stack *middleware.Stack, options Options) error { return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{ Accessor: s3cust.UpdateEndpointParameterAccessor{ GetBucketFromInput: getUploadPartCopyBucketMember, }, UsePathStyle: options.UsePathStyle, UseAccelerate: options.UseAccelerate, SupportsAccelerate: true, TargetS3ObjectLambda: false, EndpointResolver: options.EndpointResolver, EndpointResolverOptions: options.EndpointOptions, UseARNRegion: options.UseARNRegion, DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints, }) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/api_op_WriteGetObjectResponse.go ================================================ [File too large to display: 20.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/auth.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" smithy "github.com/aws/smithy-go" smithyauth "github.com/aws/smithy-go/auth" "github.com/aws/smithy-go/metrics" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" ) func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) { params.Region = options.Region } func bindAuthEndpointParams(ctx context.Context, params *AuthResolverParameters, input interface{}, options Options) { params.endpointParams = bindEndpointParams(ctx, input, options) } type setLegacyContextSigningOptionsMiddleware struct { } func (*setLegacyContextSigningOptionsMiddleware) ID() string { return "setLegacyContextSigningOptions" } func (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { rscheme := getResolvedAuthScheme(ctx) schemeID := rscheme.Scheme.SchemeID() if sn := awsmiddleware.GetSigningName(ctx); sn != "" { if schemeID == "aws.auth#sigv4" { smithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn) } else if schemeID == "aws.auth#sigv4a" { smithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn) } } if sr := awsmiddleware.GetSigningRegion(ctx); sr != "" { if schemeID == "aws.auth#sigv4" { smithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr) } else if schemeID == "aws.auth#sigv4a" { smithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr}) } } return next.HandleFinalize(ctx, in) } func addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error { return stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, "Signing", middleware.Before) } type withAnonymous struct { resolver AuthSchemeResolver } var _ AuthSchemeResolver = (*withAnonymous)(nil) func (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) { opts, err := v.resolver.ResolveAuthSchemes(ctx, params) if err != nil { return nil, err } opts = append(opts, &smithyauth.Option{ SchemeID: smithyauth.SchemeIDAnonymous, }) return opts, nil } func wrapWithAnonymousAuth(options *Options) { if _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok { return } options.AuthSchemeResolver = &withAnonymous{ resolver: options.AuthSchemeResolver, } } // AuthResolverParameters contains the set of inputs necessary for auth scheme // resolution. type AuthResolverParameters struct { // The name of the operation being invoked. Operation string // The endpoint resolver parameters for this operation. This service's default // resolver delegates to endpoint rules. endpointParams *EndpointParameters // The region in which the operation is being invoked. Region string } func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters { params := &AuthResolverParameters{ Operation: operation, } bindAuthEndpointParams(ctx, params, input, options) bindAuthParamsRegion(ctx, params, input, options) return params } // AuthSchemeResolver returns a set of possible authentication options for an // operation. type AuthSchemeResolver interface { ResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error) } type defaultAuthSchemeResolver struct{} var _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil) func (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) { if overrides, ok := operationAuthOptions[params.Operation]; ok { return overrides(params), nil } return serviceAuthOptions(params), nil } var operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{ "WriteGetObjectResponse": func(params *AuthResolverParameters) []*smithyauth.Option { return []*smithyauth.Option{ { SchemeID: smithyauth.SchemeIDSigV4, SignerProperties: func() smithy.Properties { var props smithy.Properties smithyhttp.SetSigV4SigningName(&props, "s3") smithyhttp.SetSigV4SigningRegion(&props, params.Region) smithyhttp.SetIsUnsignedPayload(&props, true) return props }(), }, } }, } func serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option { return []*smithyauth.Option{ { SchemeID: smithyauth.SchemeIDSigV4, SignerProperties: func() smithy.Properties { var props smithy.Properties smithyhttp.SetSigV4SigningName(&props, "s3") smithyhttp.SetSigV4SigningRegion(&props, params.Region) return props }(), }, { SchemeID: smithyauth.SchemeIDSigV4A, SignerProperties: func() smithy.Properties { var props smithy.Properties smithyhttp.SetSigV4ASigningName(&props, "s3") smithyhttp.SetSigV4ASigningRegions(&props, []string{params.Region}) return props }(), }, } } type resolveAuthSchemeMiddleware struct { operation string options Options } func (*resolveAuthSchemeMiddleware) ID() string { return "ResolveAuthScheme" } func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "ResolveAuthScheme") defer span.End() params := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params) if err != nil { return out, metadata, fmt.Errorf("resolve auth scheme: %w", err) } scheme, ok := m.selectScheme(options) if !ok { return out, metadata, fmt.Errorf("could not select an auth scheme") } ctx = setResolvedAuthScheme(ctx, scheme) span.SetProperty("auth.scheme_id", scheme.Scheme.SchemeID()) span.End() return next.HandleFinalize(ctx, in) } func (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) { for _, option := range options { if option.SchemeID == smithyauth.SchemeIDAnonymous { return newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true } for _, scheme := range m.options.AuthSchemes { if scheme.SchemeID() != option.SchemeID { continue } if scheme.IdentityResolver(m.options) != nil { return newResolvedAuthScheme(scheme, option), true } } } return nil, false } type resolvedAuthSchemeKey struct{} type resolvedAuthScheme struct { Scheme smithyhttp.AuthScheme IdentityProperties smithy.Properties SignerProperties smithy.Properties } func newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme { return &resolvedAuthScheme{ Scheme: scheme, IdentityProperties: option.IdentityProperties, SignerProperties: option.SignerProperties, } } func setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context { return middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme) } func getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme { v, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme) return v } type getIdentityMiddleware struct { options Options } func (*getIdentityMiddleware) ID() string { return "GetIdentity" } func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { innerCtx, span := tracing.StartSpan(ctx, "GetIdentity") defer span.End() rscheme := getResolvedAuthScheme(innerCtx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } resolver := rscheme.Scheme.IdentityResolver(m.options) if resolver == nil { return out, metadata, fmt.Errorf("no identity resolver") } identity, err := timeOperationMetric(ctx, "client.call.resolve_identity_duration", func() (smithyauth.Identity, error) { return resolver.GetIdentity(innerCtx, rscheme.IdentityProperties) }, func(o *metrics.RecordMetricOptions) { o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID()) }) if err != nil { return out, metadata, fmt.Errorf("get identity: %w", err) } ctx = setIdentity(ctx, identity) span.End() return next.HandleFinalize(ctx, in) } type identityKey struct{} func setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context { return middleware.WithStackValue(ctx, identityKey{}, identity) } func getIdentity(ctx context.Context) smithyauth.Identity { v, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity) return v } type signRequestMiddleware struct { options Options } func (*signRequestMiddleware) ID() string { return "Signing" } func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "SignRequest") defer span.End() req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unexpected transport type %T", in.Request) } rscheme := getResolvedAuthScheme(ctx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } identity := getIdentity(ctx) if identity == nil { return out, metadata, fmt.Errorf("no identity") } signer := rscheme.Scheme.Signer() if signer == nil { return out, metadata, fmt.Errorf("no signer") } _, err = timeOperationMetric(ctx, "client.call.signing_duration", func() (any, error) { return nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties) }, func(o *metrics.RecordMetricOptions) { o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID()) }) if err != nil { return out, metadata, fmt.Errorf("sign request: %w", err) } span.End() return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/bucket_context.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/bucketer.go ================================================ package s3 // implemented by all S3 input structures type bucketer interface { bucket() (string, bool) } func bucketFromInput(params interface{}) (string, bool) { v, ok := params.(bucketer) if !ok { return "", false } return v.bucket() } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/create_mpu_checksum.go ================================================ package s3 import ( "context" "fmt" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" "github.com/aws/smithy-go/middleware" ) // backfills checksum algorithm onto the context for CreateMultipart upload so // transfer manager can set a checksum header on the request accordingly for // s3express requests type setCreateMPUChecksumAlgorithm struct{} func (*setCreateMPUChecksumAlgorithm) ID() string { return "setCreateMPUChecksumAlgorithm" } func (*setCreateMPUChecksumAlgorithm) HandleSerialize( ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, ) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { input, ok := in.Parameters.(*CreateMultipartUploadInput) if !ok { return out, metadata, fmt.Errorf("unexpected input type %T", in.Parameters) } ctx = internalcontext.SetChecksumInputAlgorithm(ctx, string(input.ChecksumAlgorithm)) return next.HandleSerialize(ctx, in) } func addSetCreateMPUChecksumAlgorithm(s *middleware.Stack) error { return s.Serialize.Add(&setCreateMPUChecksumAlgorithm{}, middleware.Before) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/deserializers.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "bytes" "context" "encoding/json" "encoding/xml" "fmt" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream" "github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi" awsxml "github.com/aws/aws-sdk-go-v2/aws/protocol/xml" "github.com/aws/aws-sdk-go-v2/service/internal/s3shared" "github.com/aws/aws-sdk-go-v2/service/s3/types" smithy "github.com/aws/smithy-go" smithyxml "github.com/aws/smithy-go/encoding/xml" smithyio "github.com/aws/smithy-go/io" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" smithytime "github.com/aws/smithy-go/time" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "io" "io/ioutil" "strconv" "strings" "time" ) func deserializeS3Expires(v string) (*time.Time, error) { t, err := smithytime.ParseHTTPDate(v) if err != nil { return nil, nil } return &t, nil } type awsRestxml_deserializeOpAbortMultipartUpload struct { } func (*awsRestxml_deserializeOpAbortMultipartUpload) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpAbortMultipartUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorAbortMultipartUpload(response, &metadata) } output := &AbortMultipartUploadOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsAbortMultipartUploadOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorAbortMultipartUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NoSuchUpload", errorCode): return awsRestxml_deserializeErrorNoSuchUpload(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsAbortMultipartUploadOutput(v *AbortMultipartUploadOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } type awsRestxml_deserializeOpCompleteMultipartUpload struct { } func (*awsRestxml_deserializeOpCompleteMultipartUpload) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpCompleteMultipartUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorCompleteMultipartUpload(response, &metadata) } output := &CompleteMultipartUploadOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsCompleteMultipartUploadOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentCompleteMultipartUploadOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorCompleteMultipartUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsCompleteMultipartUploadOutput(v *CompleteMultipartUploadOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-expiration"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.Expiration = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentCompleteMultipartUploadOutput(v **CompleteMultipartUploadOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *CompleteMultipartUploadOutput if *v == nil { sv = &CompleteMultipartUploadOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Bucket", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Bucket = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC32", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32 = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC32C", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32C = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC64NVME", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC64NVME = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA1", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA1 = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA256", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA256 = ptr.String(xtv) } case strings.EqualFold("ChecksumType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumType = types.ChecksumType(xtv) } case strings.EqualFold("ETag", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ETag = ptr.String(xtv) } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("Location", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Location = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpCopyObject struct { } func (*awsRestxml_deserializeOpCopyObject) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpCopyObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorCopyObject(response, &metadata) } output := &CopyObjectOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsCopyObjectOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentCopyObjectResult(&output.CopyObjectResult, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorCopyObject(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("ObjectNotInActiveTierError", errorCode): return awsRestxml_deserializeErrorObjectNotInActiveTierError(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsCopyObjectOutput(v *CopyObjectOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-copy-source-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.CopySourceVersionId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-expiration"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.Expiration = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-algorithm"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerAlgorithm = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-key-MD5"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerKeyMD5 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-context"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSEncryptionContext = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentCopyObjectOutput(v **CopyObjectOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *CopyObjectOutput if *v == nil { sv = &CopyObjectOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("CopyObjectResult", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentCopyObjectResult(&sv.CopyObjectResult, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpCreateBucket struct { } func (*awsRestxml_deserializeOpCreateBucket) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpCreateBucket) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorCreateBucket(response, &metadata) } output := &CreateBucketOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsCreateBucketOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorCreateBucket(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("BucketAlreadyExists", errorCode): return awsRestxml_deserializeErrorBucketAlreadyExists(response, errorBody) case strings.EqualFold("BucketAlreadyOwnedByYou", errorCode): return awsRestxml_deserializeErrorBucketAlreadyOwnedByYou(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsCreateBucketOutput(v *CreateBucketOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("Location"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.Location = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpCreateBucketMetadataTableConfiguration struct { } func (*awsRestxml_deserializeOpCreateBucketMetadataTableConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpCreateBucketMetadataTableConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorCreateBucketMetadataTableConfiguration(response, &metadata) } output := &CreateBucketMetadataTableConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorCreateBucketMetadataTableConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpCreateMultipartUpload struct { } func (*awsRestxml_deserializeOpCreateMultipartUpload) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpCreateMultipartUpload) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorCreateMultipartUpload(response, &metadata) } output := &CreateMultipartUploadOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsCreateMultipartUploadOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentCreateMultipartUploadOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorCreateMultipartUpload(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsCreateMultipartUploadOutput(v *CreateMultipartUploadOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-abort-date"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) t, err := smithytime.ParseHTTPDate(headerValues[0]) if err != nil { return err } v.AbortDate = ptr.Time(t) } if headerValues := response.Header.Values("x-amz-abort-rule-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.AbortRuleId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-checksum-algorithm"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumAlgorithm = types.ChecksumAlgorithm(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-type"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumType = types.ChecksumType(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-algorithm"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerAlgorithm = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-key-MD5"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerKeyMD5 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-context"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSEncryptionContext = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentCreateMultipartUploadOutput(v **CreateMultipartUploadOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *CreateMultipartUploadOutput if *v == nil { sv = &CreateMultipartUploadOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Bucket", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Bucket = ptr.String(xtv) } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("UploadId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.UploadId = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpCreateSession struct { } func (*awsRestxml_deserializeOpCreateSession) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpCreateSession) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorCreateSession(response, &metadata) } output := &CreateSessionOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsCreateSessionOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentCreateSessionOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorCreateSession(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NoSuchBucket", errorCode): return awsRestxml_deserializeErrorNoSuchBucket(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsCreateSessionOutput(v *CreateSessionOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-context"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSEncryptionContext = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentCreateSessionOutput(v **CreateSessionOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *CreateSessionOutput if *v == nil { sv = &CreateSessionOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Credentials", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentSessionCredentials(&sv.Credentials, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpDeleteBucket struct { } func (*awsRestxml_deserializeOpDeleteBucket) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucket) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucket(response, &metadata) } output := &DeleteBucketOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucket(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketAnalyticsConfiguration struct { } func (*awsRestxml_deserializeOpDeleteBucketAnalyticsConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketAnalyticsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketAnalyticsConfiguration(response, &metadata) } output := &DeleteBucketAnalyticsConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketAnalyticsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketCors struct { } func (*awsRestxml_deserializeOpDeleteBucketCors) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketCors) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketCors(response, &metadata) } output := &DeleteBucketCorsOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketCors(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketEncryption struct { } func (*awsRestxml_deserializeOpDeleteBucketEncryption) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketEncryption) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketEncryption(response, &metadata) } output := &DeleteBucketEncryptionOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketEncryption(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketIntelligentTieringConfiguration struct { } func (*awsRestxml_deserializeOpDeleteBucketIntelligentTieringConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketIntelligentTieringConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketIntelligentTieringConfiguration(response, &metadata) } output := &DeleteBucketIntelligentTieringConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketIntelligentTieringConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketInventoryConfiguration struct { } func (*awsRestxml_deserializeOpDeleteBucketInventoryConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketInventoryConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketInventoryConfiguration(response, &metadata) } output := &DeleteBucketInventoryConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketInventoryConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketLifecycle struct { } func (*awsRestxml_deserializeOpDeleteBucketLifecycle) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketLifecycle) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketLifecycle(response, &metadata) } output := &DeleteBucketLifecycleOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketLifecycle(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketMetadataTableConfiguration struct { } func (*awsRestxml_deserializeOpDeleteBucketMetadataTableConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketMetadataTableConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketMetadataTableConfiguration(response, &metadata) } output := &DeleteBucketMetadataTableConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketMetadataTableConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketMetricsConfiguration struct { } func (*awsRestxml_deserializeOpDeleteBucketMetricsConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketMetricsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketMetricsConfiguration(response, &metadata) } output := &DeleteBucketMetricsConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketMetricsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketOwnershipControls struct { } func (*awsRestxml_deserializeOpDeleteBucketOwnershipControls) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketOwnershipControls) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketOwnershipControls(response, &metadata) } output := &DeleteBucketOwnershipControlsOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketOwnershipControls(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketPolicy struct { } func (*awsRestxml_deserializeOpDeleteBucketPolicy) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketPolicy(response, &metadata) } output := &DeleteBucketPolicyOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketReplication struct { } func (*awsRestxml_deserializeOpDeleteBucketReplication) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketReplication) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketReplication(response, &metadata) } output := &DeleteBucketReplicationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketReplication(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketTagging struct { } func (*awsRestxml_deserializeOpDeleteBucketTagging) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketTagging(response, &metadata) } output := &DeleteBucketTaggingOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteBucketWebsite struct { } func (*awsRestxml_deserializeOpDeleteBucketWebsite) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteBucketWebsite) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteBucketWebsite(response, &metadata) } output := &DeleteBucketWebsiteOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteBucketWebsite(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpDeleteObject struct { } func (*awsRestxml_deserializeOpDeleteObject) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteObject(response, &metadata) } output := &DeleteObjectOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsDeleteObjectOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteObject(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsDeleteObjectOutput(v *DeleteObjectOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-delete-marker"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.DeleteMarker = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpDeleteObjects struct { } func (*awsRestxml_deserializeOpDeleteObjects) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteObjects) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteObjects(response, &metadata) } output := &DeleteObjectsOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsDeleteObjectsOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentDeleteObjectsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteObjects(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsDeleteObjectsOutput(v *DeleteObjectsOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentDeleteObjectsOutput(v **DeleteObjectsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *DeleteObjectsOutput if *v == nil { sv = &DeleteObjectsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Deleted", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentDeletedObjectsUnwrapped(&sv.Deleted, nodeDecoder); err != nil { return err } case strings.EqualFold("Error", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentErrorsUnwrapped(&sv.Errors, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpDeleteObjectTagging struct { } func (*awsRestxml_deserializeOpDeleteObjectTagging) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeleteObjectTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeleteObjectTagging(response, &metadata) } output := &DeleteObjectTaggingOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsDeleteObjectTaggingOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeleteObjectTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsDeleteObjectTaggingOutput(v *DeleteObjectTaggingOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpDeletePublicAccessBlock struct { } func (*awsRestxml_deserializeOpDeletePublicAccessBlock) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpDeletePublicAccessBlock) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorDeletePublicAccessBlock(response, &metadata) } output := &DeletePublicAccessBlockOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorDeletePublicAccessBlock(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpGetBucketAccelerateConfiguration struct { } func (*awsRestxml_deserializeOpGetBucketAccelerateConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketAccelerateConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketAccelerateConfiguration(response, &metadata) } output := &GetBucketAccelerateConfigurationOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsGetBucketAccelerateConfigurationOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketAccelerateConfigurationOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketAccelerateConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsGetBucketAccelerateConfigurationOutput(v *GetBucketAccelerateConfigurationOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentGetBucketAccelerateConfigurationOutput(v **GetBucketAccelerateConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketAccelerateConfigurationOutput if *v == nil { sv = &GetBucketAccelerateConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.BucketAccelerateStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketAcl struct { } func (*awsRestxml_deserializeOpGetBucketAcl) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketAcl) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketAcl(response, &metadata) } output := &GetBucketAclOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketAclOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketAcl(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketAclOutput(v **GetBucketAclOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketAclOutput if *v == nil { sv = &GetBucketAclOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccessControlList", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentGrants(&sv.Grants, nodeDecoder); err != nil { return err } case strings.EqualFold("Owner", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketAnalyticsConfiguration struct { } func (*awsRestxml_deserializeOpGetBucketAnalyticsConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketAnalyticsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketAnalyticsConfiguration(response, &metadata) } output := &GetBucketAnalyticsConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentAnalyticsConfiguration(&output.AnalyticsConfiguration, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketAnalyticsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketAnalyticsConfigurationOutput(v **GetBucketAnalyticsConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketAnalyticsConfigurationOutput if *v == nil { sv = &GetBucketAnalyticsConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AnalyticsConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAnalyticsConfiguration(&sv.AnalyticsConfiguration, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketCors struct { } func (*awsRestxml_deserializeOpGetBucketCors) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketCors) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketCors(response, &metadata) } output := &GetBucketCorsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketCorsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketCors(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketCorsOutput(v **GetBucketCorsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketCorsOutput if *v == nil { sv = &GetBucketCorsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("CORSRule", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentCORSRulesUnwrapped(&sv.CORSRules, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketEncryption struct { } func (*awsRestxml_deserializeOpGetBucketEncryption) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketEncryption) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketEncryption(response, &metadata) } output := &GetBucketEncryptionOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentServerSideEncryptionConfiguration(&output.ServerSideEncryptionConfiguration, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketEncryption(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketEncryptionOutput(v **GetBucketEncryptionOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketEncryptionOutput if *v == nil { sv = &GetBucketEncryptionOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ServerSideEncryptionConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentServerSideEncryptionConfiguration(&sv.ServerSideEncryptionConfiguration, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketIntelligentTieringConfiguration struct { } func (*awsRestxml_deserializeOpGetBucketIntelligentTieringConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketIntelligentTieringConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketIntelligentTieringConfiguration(response, &metadata) } output := &GetBucketIntelligentTieringConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentIntelligentTieringConfiguration(&output.IntelligentTieringConfiguration, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketIntelligentTieringConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketIntelligentTieringConfigurationOutput(v **GetBucketIntelligentTieringConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketIntelligentTieringConfigurationOutput if *v == nil { sv = &GetBucketIntelligentTieringConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("IntelligentTieringConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentIntelligentTieringConfiguration(&sv.IntelligentTieringConfiguration, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketInventoryConfiguration struct { } func (*awsRestxml_deserializeOpGetBucketInventoryConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketInventoryConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketInventoryConfiguration(response, &metadata) } output := &GetBucketInventoryConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentInventoryConfiguration(&output.InventoryConfiguration, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketInventoryConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketInventoryConfigurationOutput(v **GetBucketInventoryConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketInventoryConfigurationOutput if *v == nil { sv = &GetBucketInventoryConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("InventoryConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInventoryConfiguration(&sv.InventoryConfiguration, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketLifecycleConfiguration struct { } func (*awsRestxml_deserializeOpGetBucketLifecycleConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketLifecycleConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketLifecycleConfiguration(response, &metadata) } output := &GetBucketLifecycleConfigurationOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsGetBucketLifecycleConfigurationOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketLifecycleConfigurationOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketLifecycleConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsGetBucketLifecycleConfigurationOutput(v *GetBucketLifecycleConfigurationOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-transition-default-minimum-object-size"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.TransitionDefaultMinimumObjectSize = types.TransitionDefaultMinimumObjectSize(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentGetBucketLifecycleConfigurationOutput(v **GetBucketLifecycleConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketLifecycleConfigurationOutput if *v == nil { sv = &GetBucketLifecycleConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Rule", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentLifecycleRulesUnwrapped(&sv.Rules, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketLocation struct { } func (*awsRestxml_deserializeOpGetBucketLocation) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketLocation) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketLocation(response, &metadata) } output := &GetBucketLocationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketLocationOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketLocation(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketLocationOutput(v **GetBucketLocationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketLocationOutput if *v == nil { sv = &GetBucketLocationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("LocationConstraint", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.LocationConstraint = types.BucketLocationConstraint(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketLogging struct { } func (*awsRestxml_deserializeOpGetBucketLogging) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketLogging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketLogging(response, &metadata) } output := &GetBucketLoggingOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketLoggingOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketLogging(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketLoggingOutput(v **GetBucketLoggingOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketLoggingOutput if *v == nil { sv = &GetBucketLoggingOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("LoggingEnabled", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentLoggingEnabled(&sv.LoggingEnabled, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketMetadataTableConfiguration struct { } func (*awsRestxml_deserializeOpGetBucketMetadataTableConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketMetadataTableConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketMetadataTableConfiguration(response, &metadata) } output := &GetBucketMetadataTableConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentGetBucketMetadataTableConfigurationResult(&output.GetBucketMetadataTableConfigurationResult, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketMetadataTableConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketMetadataTableConfigurationOutput(v **GetBucketMetadataTableConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketMetadataTableConfigurationOutput if *v == nil { sv = &GetBucketMetadataTableConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("GetBucketMetadataTableConfigurationResult", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentGetBucketMetadataTableConfigurationResult(&sv.GetBucketMetadataTableConfigurationResult, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketMetricsConfiguration struct { } func (*awsRestxml_deserializeOpGetBucketMetricsConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketMetricsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketMetricsConfiguration(response, &metadata) } output := &GetBucketMetricsConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentMetricsConfiguration(&output.MetricsConfiguration, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketMetricsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketMetricsConfigurationOutput(v **GetBucketMetricsConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketMetricsConfigurationOutput if *v == nil { sv = &GetBucketMetricsConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("MetricsConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentMetricsConfiguration(&sv.MetricsConfiguration, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketNotificationConfiguration struct { } func (*awsRestxml_deserializeOpGetBucketNotificationConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketNotificationConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketNotificationConfiguration(response, &metadata) } output := &GetBucketNotificationConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketNotificationConfigurationOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketNotificationConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketNotificationConfigurationOutput(v **GetBucketNotificationConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketNotificationConfigurationOutput if *v == nil { sv = &GetBucketNotificationConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("EventBridgeConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentEventBridgeConfiguration(&sv.EventBridgeConfiguration, nodeDecoder); err != nil { return err } case strings.EqualFold("CloudFunctionConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentLambdaFunctionConfigurationListUnwrapped(&sv.LambdaFunctionConfigurations, nodeDecoder); err != nil { return err } case strings.EqualFold("QueueConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentQueueConfigurationListUnwrapped(&sv.QueueConfigurations, nodeDecoder); err != nil { return err } case strings.EqualFold("TopicConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTopicConfigurationListUnwrapped(&sv.TopicConfigurations, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketOwnershipControls struct { } func (*awsRestxml_deserializeOpGetBucketOwnershipControls) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketOwnershipControls) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketOwnershipControls(response, &metadata) } output := &GetBucketOwnershipControlsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentOwnershipControls(&output.OwnershipControls, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketOwnershipControls(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketOwnershipControlsOutput(v **GetBucketOwnershipControlsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketOwnershipControlsOutput if *v == nil { sv = &GetBucketOwnershipControlsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("OwnershipControls", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwnershipControls(&sv.OwnershipControls, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketPolicy struct { } func (*awsRestxml_deserializeOpGetBucketPolicy) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketPolicy(response, &metadata) } output := &GetBucketPolicyOutput{} out.Result = output err = awsRestxml_deserializeOpDocumentGetBucketPolicyOutput(output, response.Body, response.ContentLength) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to deserialize response payload, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketPolicyOutput(v *GetBucketPolicyOutput, body io.ReadCloser, contentLength int64) error { if v == nil { return fmt.Errorf("unsupported deserialization of nil %T", v) } var buf bytes.Buffer if contentLength > 0 { buf.Grow(int(contentLength)) } else { buf.Grow(512) } _, err := buf.ReadFrom(body) if err != nil { return err } if buf.Len() > 0 { v.Policy = ptr.String(buf.String()) } return nil } type awsRestxml_deserializeOpGetBucketPolicyStatus struct { } func (*awsRestxml_deserializeOpGetBucketPolicyStatus) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketPolicyStatus) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketPolicyStatus(response, &metadata) } output := &GetBucketPolicyStatusOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentPolicyStatus(&output.PolicyStatus, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketPolicyStatus(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketPolicyStatusOutput(v **GetBucketPolicyStatusOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketPolicyStatusOutput if *v == nil { sv = &GetBucketPolicyStatusOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("PolicyStatus", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentPolicyStatus(&sv.PolicyStatus, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketReplication struct { } func (*awsRestxml_deserializeOpGetBucketReplication) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketReplication) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketReplication(response, &metadata) } output := &GetBucketReplicationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentReplicationConfiguration(&output.ReplicationConfiguration, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketReplication(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketReplicationOutput(v **GetBucketReplicationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketReplicationOutput if *v == nil { sv = &GetBucketReplicationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ReplicationConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentReplicationConfiguration(&sv.ReplicationConfiguration, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketRequestPayment struct { } func (*awsRestxml_deserializeOpGetBucketRequestPayment) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketRequestPayment) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketRequestPayment(response, &metadata) } output := &GetBucketRequestPaymentOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketRequestPaymentOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketRequestPayment(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketRequestPaymentOutput(v **GetBucketRequestPaymentOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketRequestPaymentOutput if *v == nil { sv = &GetBucketRequestPaymentOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Payer", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Payer = types.Payer(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketTagging struct { } func (*awsRestxml_deserializeOpGetBucketTagging) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketTagging(response, &metadata) } output := &GetBucketTaggingOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketTaggingOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketTaggingOutput(v **GetBucketTaggingOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketTaggingOutput if *v == nil { sv = &GetBucketTaggingOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("TagSet", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTagSet(&sv.TagSet, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketVersioning struct { } func (*awsRestxml_deserializeOpGetBucketVersioning) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketVersioning) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketVersioning(response, &metadata) } output := &GetBucketVersioningOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketVersioningOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketVersioning(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketVersioningOutput(v **GetBucketVersioningOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketVersioningOutput if *v == nil { sv = &GetBucketVersioningOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("MfaDelete", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.MFADelete = types.MFADeleteStatus(xtv) } case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.BucketVersioningStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetBucketWebsite struct { } func (*awsRestxml_deserializeOpGetBucketWebsite) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetBucketWebsite) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetBucketWebsite(response, &metadata) } output := &GetBucketWebsiteOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetBucketWebsiteOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetBucketWebsite(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetBucketWebsiteOutput(v **GetBucketWebsiteOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetBucketWebsiteOutput if *v == nil { sv = &GetBucketWebsiteOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ErrorDocument", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentErrorDocument(&sv.ErrorDocument, nodeDecoder); err != nil { return err } case strings.EqualFold("IndexDocument", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentIndexDocument(&sv.IndexDocument, nodeDecoder); err != nil { return err } case strings.EqualFold("RedirectAllRequestsTo", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentRedirectAllRequestsTo(&sv.RedirectAllRequestsTo, nodeDecoder); err != nil { return err } case strings.EqualFold("RoutingRules", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentRoutingRules(&sv.RoutingRules, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetObject struct { } func (*awsRestxml_deserializeOpGetObject) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetObject(response, &metadata) } output := &GetObjectOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsGetObjectOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } err = awsRestxml_deserializeOpDocumentGetObjectOutput(output, response.Body) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to deserialize response payload, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetObject(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("InvalidObjectState", errorCode): return awsRestxml_deserializeErrorInvalidObjectState(response, errorBody) case strings.EqualFold("NoSuchKey", errorCode): return awsRestxml_deserializeErrorNoSuchKey(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsGetObjectOutput(v *GetObjectOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("accept-ranges"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.AcceptRanges = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("Cache-Control"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.CacheControl = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc32"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC32 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc32c"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC32C = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc64nvme"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC64NVME = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-sha1"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumSHA1 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-sha256"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumSHA256 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-type"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumType = types.ChecksumType(headerValues[0]) } if headerValues := response.Header.Values("Content-Disposition"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentDisposition = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Content-Encoding"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentEncoding = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Content-Language"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentLanguage = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Content-Length"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseInt(headerValues[0], 0, 64) if err != nil { return err } v.ContentLength = ptr.Int64(vv) } if headerValues := response.Header.Values("Content-Range"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentRange = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Content-Type"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentType = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-delete-marker"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.DeleteMarker = ptr.Bool(vv) } if headerValues := response.Header.Values("ETag"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ETag = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-expiration"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.Expiration = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Expires"); len(headerValues) != 0 { deserOverride, err := deserializeS3Expires(headerValues[0]) if err != nil { return err } v.Expires = deserOverride } if headerValues := response.Header.Values("Expires"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ExpiresString = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Last-Modified"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) t, err := smithytime.ParseHTTPDate(headerValues[0]) if err != nil { return err } v.LastModified = ptr.Time(t) } for headerKey, headerValues := range response.Header { if lenPrefix := len("x-amz-meta-"); len(headerKey) >= lenPrefix && strings.EqualFold(headerKey[:lenPrefix], "x-amz-meta-") { if v.Metadata == nil { v.Metadata = map[string]string{} } headerValues[0] = strings.TrimSpace(headerValues[0]) v.Metadata[strings.ToLower(headerKey[lenPrefix:])] = headerValues[0] } } if headerValues := response.Header.Values("x-amz-missing-meta"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseInt(headerValues[0], 0, 32) if err != nil { return err } v.MissingMeta = ptr.Int32(int32(vv)) } if headerValues := response.Header.Values("x-amz-object-lock-legal-hold"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ObjectLockLegalHoldStatus = types.ObjectLockLegalHoldStatus(headerValues[0]) } if headerValues := response.Header.Values("x-amz-object-lock-mode"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ObjectLockMode = types.ObjectLockMode(headerValues[0]) } if headerValues := response.Header.Values("x-amz-object-lock-retain-until-date"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) t, err := smithytime.ParseDateTime(headerValues[0]) if err != nil { return err } v.ObjectLockRetainUntilDate = ptr.Time(t) } if headerValues := response.Header.Values("x-amz-mp-parts-count"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseInt(headerValues[0], 0, 32) if err != nil { return err } v.PartsCount = ptr.Int32(int32(vv)) } if headerValues := response.Header.Values("x-amz-replication-status"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ReplicationStatus = types.ReplicationStatus(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-restore"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.Restore = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-algorithm"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerAlgorithm = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-key-MD5"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerKeyMD5 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-storage-class"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.StorageClass = types.StorageClass(headerValues[0]) } if headerValues := response.Header.Values("x-amz-tagging-count"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseInt(headerValues[0], 0, 32) if err != nil { return err } v.TagCount = ptr.Int32(int32(vv)) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-website-redirect-location"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.WebsiteRedirectLocation = ptr.String(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentGetObjectOutput(v *GetObjectOutput, body io.ReadCloser) error { if v == nil { return fmt.Errorf("unsupported deserialization of nil %T", v) } v.Body = body return nil } type awsRestxml_deserializeOpGetObjectAcl struct { } func (*awsRestxml_deserializeOpGetObjectAcl) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetObjectAcl) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetObjectAcl(response, &metadata) } output := &GetObjectAclOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsGetObjectAclOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetObjectAclOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetObjectAcl(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NoSuchKey", errorCode): return awsRestxml_deserializeErrorNoSuchKey(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsGetObjectAclOutput(v *GetObjectAclOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentGetObjectAclOutput(v **GetObjectAclOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetObjectAclOutput if *v == nil { sv = &GetObjectAclOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccessControlList", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentGrants(&sv.Grants, nodeDecoder); err != nil { return err } case strings.EqualFold("Owner", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetObjectAttributes struct { } func (*awsRestxml_deserializeOpGetObjectAttributes) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetObjectAttributes) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetObjectAttributes(response, &metadata) } output := &GetObjectAttributesOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsGetObjectAttributesOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetObjectAttributesOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetObjectAttributes(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NoSuchKey", errorCode): return awsRestxml_deserializeErrorNoSuchKey(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsGetObjectAttributesOutput(v *GetObjectAttributesOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-delete-marker"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.DeleteMarker = ptr.Bool(vv) } if headerValues := response.Header.Values("Last-Modified"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) t, err := smithytime.ParseHTTPDate(headerValues[0]) if err != nil { return err } v.LastModified = ptr.Time(t) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentGetObjectAttributesOutput(v **GetObjectAttributesOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetObjectAttributesOutput if *v == nil { sv = &GetObjectAttributesOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Checksum", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentChecksum(&sv.Checksum, nodeDecoder); err != nil { return err } case strings.EqualFold("ETag", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ETag = ptr.String(xtv) } case strings.EqualFold("ObjectParts", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentGetObjectAttributesParts(&sv.ObjectParts, nodeDecoder); err != nil { return err } case strings.EqualFold("ObjectSize", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.ObjectSize = ptr.Int64(i64) } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.StorageClass(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetObjectLegalHold struct { } func (*awsRestxml_deserializeOpGetObjectLegalHold) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetObjectLegalHold) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetObjectLegalHold(response, &metadata) } output := &GetObjectLegalHoldOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentObjectLockLegalHold(&output.LegalHold, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetObjectLegalHold(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetObjectLegalHoldOutput(v **GetObjectLegalHoldOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetObjectLegalHoldOutput if *v == nil { sv = &GetObjectLegalHoldOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("LegalHold", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentObjectLockLegalHold(&sv.LegalHold, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetObjectLockConfiguration struct { } func (*awsRestxml_deserializeOpGetObjectLockConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetObjectLockConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetObjectLockConfiguration(response, &metadata) } output := &GetObjectLockConfigurationOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentObjectLockConfiguration(&output.ObjectLockConfiguration, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetObjectLockConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetObjectLockConfigurationOutput(v **GetObjectLockConfigurationOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetObjectLockConfigurationOutput if *v == nil { sv = &GetObjectLockConfigurationOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ObjectLockConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentObjectLockConfiguration(&sv.ObjectLockConfiguration, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetObjectRetention struct { } func (*awsRestxml_deserializeOpGetObjectRetention) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetObjectRetention) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetObjectRetention(response, &metadata) } output := &GetObjectRetentionOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentObjectLockRetention(&output.Retention, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetObjectRetention(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetObjectRetentionOutput(v **GetObjectRetentionOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetObjectRetentionOutput if *v == nil { sv = &GetObjectRetentionOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Retention", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentObjectLockRetention(&sv.Retention, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetObjectTagging struct { } func (*awsRestxml_deserializeOpGetObjectTagging) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetObjectTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetObjectTagging(response, &metadata) } output := &GetObjectTaggingOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsGetObjectTaggingOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentGetObjectTaggingOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetObjectTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsGetObjectTaggingOutput(v *GetObjectTaggingOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentGetObjectTaggingOutput(v **GetObjectTaggingOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetObjectTaggingOutput if *v == nil { sv = &GetObjectTaggingOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("TagSet", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTagSet(&sv.TagSet, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpGetObjectTorrent struct { } func (*awsRestxml_deserializeOpGetObjectTorrent) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetObjectTorrent) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetObjectTorrent(response, &metadata) } output := &GetObjectTorrentOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsGetObjectTorrentOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } err = awsRestxml_deserializeOpDocumentGetObjectTorrentOutput(output, response.Body) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to deserialize response payload, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetObjectTorrent(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsGetObjectTorrentOutput(v *GetObjectTorrentOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentGetObjectTorrentOutput(v *GetObjectTorrentOutput, body io.ReadCloser) error { if v == nil { return fmt.Errorf("unsupported deserialization of nil %T", v) } v.Body = body return nil } type awsRestxml_deserializeOpGetPublicAccessBlock struct { } func (*awsRestxml_deserializeOpGetPublicAccessBlock) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpGetPublicAccessBlock) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorGetPublicAccessBlock(response, &metadata) } output := &GetPublicAccessBlockOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(&output.PublicAccessBlockConfiguration, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorGetPublicAccessBlock(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentGetPublicAccessBlockOutput(v **GetPublicAccessBlockOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *GetPublicAccessBlockOutput if *v == nil { sv = &GetPublicAccessBlockOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("PublicAccessBlockConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(&sv.PublicAccessBlockConfiguration, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpHeadBucket struct { } func (*awsRestxml_deserializeOpHeadBucket) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpHeadBucket) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorHeadBucket(response, &metadata) } output := &HeadBucketOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsHeadBucketOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorHeadBucket(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NotFound", errorCode): return awsRestxml_deserializeErrorNotFound(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsHeadBucketOutput(v *HeadBucketOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-access-point-alias"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.AccessPointAlias = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-bucket-location-name"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.BucketLocationName = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-bucket-location-type"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.BucketLocationType = types.LocationType(headerValues[0]) } if headerValues := response.Header.Values("x-amz-bucket-region"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.BucketRegion = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpHeadObject struct { } func (*awsRestxml_deserializeOpHeadObject) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpHeadObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorHeadObject(response, &metadata) } output := &HeadObjectOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsHeadObjectOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorHeadObject(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NotFound", errorCode): return awsRestxml_deserializeErrorNotFound(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsHeadObjectOutput(v *HeadObjectOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("accept-ranges"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.AcceptRanges = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-archive-status"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ArchiveStatus = types.ArchiveStatus(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("Cache-Control"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.CacheControl = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc32"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC32 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc32c"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC32C = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc64nvme"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC64NVME = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-sha1"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumSHA1 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-sha256"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumSHA256 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-type"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumType = types.ChecksumType(headerValues[0]) } if headerValues := response.Header.Values("Content-Disposition"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentDisposition = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Content-Encoding"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentEncoding = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Content-Language"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentLanguage = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Content-Length"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseInt(headerValues[0], 0, 64) if err != nil { return err } v.ContentLength = ptr.Int64(vv) } if headerValues := response.Header.Values("Content-Range"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentRange = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Content-Type"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ContentType = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-delete-marker"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.DeleteMarker = ptr.Bool(vv) } if headerValues := response.Header.Values("ETag"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ETag = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-expiration"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.Expiration = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Expires"); len(headerValues) != 0 { deserOverride, err := deserializeS3Expires(headerValues[0]) if err != nil { return err } v.Expires = deserOverride } if headerValues := response.Header.Values("Expires"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ExpiresString = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("Last-Modified"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) t, err := smithytime.ParseHTTPDate(headerValues[0]) if err != nil { return err } v.LastModified = ptr.Time(t) } for headerKey, headerValues := range response.Header { if lenPrefix := len("x-amz-meta-"); len(headerKey) >= lenPrefix && strings.EqualFold(headerKey[:lenPrefix], "x-amz-meta-") { if v.Metadata == nil { v.Metadata = map[string]string{} } headerValues[0] = strings.TrimSpace(headerValues[0]) v.Metadata[strings.ToLower(headerKey[lenPrefix:])] = headerValues[0] } } if headerValues := response.Header.Values("x-amz-missing-meta"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseInt(headerValues[0], 0, 32) if err != nil { return err } v.MissingMeta = ptr.Int32(int32(vv)) } if headerValues := response.Header.Values("x-amz-object-lock-legal-hold"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ObjectLockLegalHoldStatus = types.ObjectLockLegalHoldStatus(headerValues[0]) } if headerValues := response.Header.Values("x-amz-object-lock-mode"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ObjectLockMode = types.ObjectLockMode(headerValues[0]) } if headerValues := response.Header.Values("x-amz-object-lock-retain-until-date"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) t, err := smithytime.ParseDateTime(headerValues[0]) if err != nil { return err } v.ObjectLockRetainUntilDate = ptr.Time(t) } if headerValues := response.Header.Values("x-amz-mp-parts-count"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseInt(headerValues[0], 0, 32) if err != nil { return err } v.PartsCount = ptr.Int32(int32(vv)) } if headerValues := response.Header.Values("x-amz-replication-status"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ReplicationStatus = types.ReplicationStatus(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-restore"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.Restore = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-algorithm"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerAlgorithm = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-key-MD5"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerKeyMD5 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-storage-class"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.StorageClass = types.StorageClass(headerValues[0]) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-website-redirect-location"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.WebsiteRedirectLocation = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpListBucketAnalyticsConfigurations struct { } func (*awsRestxml_deserializeOpListBucketAnalyticsConfigurations) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListBucketAnalyticsConfigurations) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListBucketAnalyticsConfigurations(response, &metadata) } output := &ListBucketAnalyticsConfigurationsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListBucketAnalyticsConfigurationsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListBucketAnalyticsConfigurations(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentListBucketAnalyticsConfigurationsOutput(v **ListBucketAnalyticsConfigurationsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListBucketAnalyticsConfigurationsOutput if *v == nil { sv = &ListBucketAnalyticsConfigurationsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AnalyticsConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAnalyticsConfigurationListUnwrapped(&sv.AnalyticsConfigurationList, nodeDecoder); err != nil { return err } case strings.EqualFold("ContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ContinuationToken = ptr.String(xtv) } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("NextContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextContinuationToken = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListBucketIntelligentTieringConfigurations struct { } func (*awsRestxml_deserializeOpListBucketIntelligentTieringConfigurations) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListBucketIntelligentTieringConfigurations) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListBucketIntelligentTieringConfigurations(response, &metadata) } output := &ListBucketIntelligentTieringConfigurationsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListBucketIntelligentTieringConfigurationsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListBucketIntelligentTieringConfigurations(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentListBucketIntelligentTieringConfigurationsOutput(v **ListBucketIntelligentTieringConfigurationsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListBucketIntelligentTieringConfigurationsOutput if *v == nil { sv = &ListBucketIntelligentTieringConfigurationsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ContinuationToken = ptr.String(xtv) } case strings.EqualFold("IntelligentTieringConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentIntelligentTieringConfigurationListUnwrapped(&sv.IntelligentTieringConfigurationList, nodeDecoder); err != nil { return err } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("NextContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextContinuationToken = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListBucketInventoryConfigurations struct { } func (*awsRestxml_deserializeOpListBucketInventoryConfigurations) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListBucketInventoryConfigurations) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListBucketInventoryConfigurations(response, &metadata) } output := &ListBucketInventoryConfigurationsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListBucketInventoryConfigurationsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListBucketInventoryConfigurations(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentListBucketInventoryConfigurationsOutput(v **ListBucketInventoryConfigurationsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListBucketInventoryConfigurationsOutput if *v == nil { sv = &ListBucketInventoryConfigurationsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ContinuationToken = ptr.String(xtv) } case strings.EqualFold("InventoryConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInventoryConfigurationListUnwrapped(&sv.InventoryConfigurationList, nodeDecoder); err != nil { return err } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("NextContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextContinuationToken = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListBucketMetricsConfigurations struct { } func (*awsRestxml_deserializeOpListBucketMetricsConfigurations) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListBucketMetricsConfigurations) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListBucketMetricsConfigurations(response, &metadata) } output := &ListBucketMetricsConfigurationsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListBucketMetricsConfigurationsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListBucketMetricsConfigurations(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentListBucketMetricsConfigurationsOutput(v **ListBucketMetricsConfigurationsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListBucketMetricsConfigurationsOutput if *v == nil { sv = &ListBucketMetricsConfigurationsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ContinuationToken = ptr.String(xtv) } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("MetricsConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentMetricsConfigurationListUnwrapped(&sv.MetricsConfigurationList, nodeDecoder); err != nil { return err } case strings.EqualFold("NextContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextContinuationToken = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListBuckets struct { } func (*awsRestxml_deserializeOpListBuckets) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListBuckets) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListBuckets(response, &metadata) } output := &ListBucketsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListBucketsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListBuckets(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentListBucketsOutput(v **ListBucketsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListBucketsOutput if *v == nil { sv = &ListBucketsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Buckets", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentBuckets(&sv.Buckets, nodeDecoder); err != nil { return err } case strings.EqualFold("ContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ContinuationToken = ptr.String(xtv) } case strings.EqualFold("Owner", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil { return err } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListDirectoryBuckets struct { } func (*awsRestxml_deserializeOpListDirectoryBuckets) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListDirectoryBuckets) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListDirectoryBuckets(response, &metadata) } output := &ListDirectoryBucketsOutput{} out.Result = output var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListDirectoryBucketsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListDirectoryBuckets(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpDocumentListDirectoryBucketsOutput(v **ListDirectoryBucketsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListDirectoryBucketsOutput if *v == nil { sv = &ListDirectoryBucketsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Buckets", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentBuckets(&sv.Buckets, nodeDecoder); err != nil { return err } case strings.EqualFold("ContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ContinuationToken = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListMultipartUploads struct { } func (*awsRestxml_deserializeOpListMultipartUploads) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListMultipartUploads) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListMultipartUploads(response, &metadata) } output := &ListMultipartUploadsOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsListMultipartUploadsOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListMultipartUploadsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListMultipartUploads(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsListMultipartUploadsOutput(v *ListMultipartUploadsOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentListMultipartUploadsOutput(v **ListMultipartUploadsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListMultipartUploadsOutput if *v == nil { sv = &ListMultipartUploadsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Bucket", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Bucket = ptr.String(xtv) } case strings.EqualFold("CommonPrefixes", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(&sv.CommonPrefixes, nodeDecoder); err != nil { return err } case strings.EqualFold("Delimiter", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Delimiter = ptr.String(xtv) } case strings.EqualFold("EncodingType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.EncodingType = types.EncodingType(xtv) } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("KeyMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.KeyMarker = ptr.String(xtv) } case strings.EqualFold("MaxUploads", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.MaxUploads = ptr.Int32(int32(i64)) } case strings.EqualFold("NextKeyMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextKeyMarker = ptr.String(xtv) } case strings.EqualFold("NextUploadIdMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextUploadIdMarker = ptr.String(xtv) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("UploadIdMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.UploadIdMarker = ptr.String(xtv) } case strings.EqualFold("Upload", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentMultipartUploadListUnwrapped(&sv.Uploads, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListObjects struct { } func (*awsRestxml_deserializeOpListObjects) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListObjects) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListObjects(response, &metadata) } output := &ListObjectsOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsListObjectsOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListObjectsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListObjects(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NoSuchBucket", errorCode): return awsRestxml_deserializeErrorNoSuchBucket(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsListObjectsOutput(v *ListObjectsOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentListObjectsOutput(v **ListObjectsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListObjectsOutput if *v == nil { sv = &ListObjectsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("CommonPrefixes", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(&sv.CommonPrefixes, nodeDecoder); err != nil { return err } case strings.EqualFold("Contents", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentObjectListUnwrapped(&sv.Contents, nodeDecoder); err != nil { return err } case strings.EqualFold("Delimiter", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Delimiter = ptr.String(xtv) } case strings.EqualFold("EncodingType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.EncodingType = types.EncodingType(xtv) } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("Marker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Marker = ptr.String(xtv) } case strings.EqualFold("MaxKeys", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.MaxKeys = ptr.Int32(int32(i64)) } case strings.EqualFold("Name", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Name = ptr.String(xtv) } case strings.EqualFold("NextMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextMarker = ptr.String(xtv) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListObjectsV2 struct { } func (*awsRestxml_deserializeOpListObjectsV2) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListObjectsV2) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListObjectsV2(response, &metadata) } output := &ListObjectsV2Output{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsListObjectsV2Output(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListObjectsV2Output(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListObjectsV2(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NoSuchBucket", errorCode): return awsRestxml_deserializeErrorNoSuchBucket(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsListObjectsV2Output(v *ListObjectsV2Output, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentListObjectsV2Output(v **ListObjectsV2Output, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListObjectsV2Output if *v == nil { sv = &ListObjectsV2Output{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("CommonPrefixes", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(&sv.CommonPrefixes, nodeDecoder); err != nil { return err } case strings.EqualFold("Contents", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentObjectListUnwrapped(&sv.Contents, nodeDecoder); err != nil { return err } case strings.EqualFold("ContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ContinuationToken = ptr.String(xtv) } case strings.EqualFold("Delimiter", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Delimiter = ptr.String(xtv) } case strings.EqualFold("EncodingType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.EncodingType = types.EncodingType(xtv) } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("KeyCount", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.KeyCount = ptr.Int32(int32(i64)) } case strings.EqualFold("MaxKeys", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.MaxKeys = ptr.Int32(int32(i64)) } case strings.EqualFold("Name", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Name = ptr.String(xtv) } case strings.EqualFold("NextContinuationToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextContinuationToken = ptr.String(xtv) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("StartAfter", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StartAfter = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListObjectVersions struct { } func (*awsRestxml_deserializeOpListObjectVersions) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListObjectVersions) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListObjectVersions(response, &metadata) } output := &ListObjectVersionsOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsListObjectVersionsOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListObjectVersionsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListObjectVersions(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsListObjectVersionsOutput(v *ListObjectVersionsOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentListObjectVersionsOutput(v **ListObjectVersionsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListObjectVersionsOutput if *v == nil { sv = &ListObjectVersionsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("CommonPrefixes", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(&sv.CommonPrefixes, nodeDecoder); err != nil { return err } case strings.EqualFold("DeleteMarker", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentDeleteMarkersUnwrapped(&sv.DeleteMarkers, nodeDecoder); err != nil { return err } case strings.EqualFold("Delimiter", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Delimiter = ptr.String(xtv) } case strings.EqualFold("EncodingType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.EncodingType = types.EncodingType(xtv) } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("KeyMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.KeyMarker = ptr.String(xtv) } case strings.EqualFold("MaxKeys", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.MaxKeys = ptr.Int32(int32(i64)) } case strings.EqualFold("Name", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Name = ptr.String(xtv) } case strings.EqualFold("NextKeyMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextKeyMarker = ptr.String(xtv) } case strings.EqualFold("NextVersionIdMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextVersionIdMarker = ptr.String(xtv) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("VersionIdMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.VersionIdMarker = ptr.String(xtv) } case strings.EqualFold("Version", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentObjectVersionListUnwrapped(&sv.Versions, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpListParts struct { } func (*awsRestxml_deserializeOpListParts) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpListParts) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorListParts(response, &metadata) } output := &ListPartsOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsListPartsOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeOpDocumentListPartsOutput(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorListParts(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsListPartsOutput(v *ListPartsOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-abort-date"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) t, err := smithytime.ParseHTTPDate(headerValues[0]) if err != nil { return err } v.AbortDate = ptr.Time(t) } if headerValues := response.Header.Values("x-amz-abort-rule-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.AbortRuleId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentListPartsOutput(v **ListPartsOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *ListPartsOutput if *v == nil { sv = &ListPartsOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Bucket", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Bucket = ptr.String(xtv) } case strings.EqualFold("ChecksumAlgorithm", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumAlgorithm = types.ChecksumAlgorithm(xtv) } case strings.EqualFold("ChecksumType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumType = types.ChecksumType(xtv) } case strings.EqualFold("Initiator", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInitiator(&sv.Initiator, nodeDecoder); err != nil { return err } case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("MaxParts", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.MaxParts = ptr.Int32(int32(i64)) } case strings.EqualFold("NextPartNumberMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextPartNumberMarker = ptr.String(xtv) } case strings.EqualFold("Owner", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil { return err } case strings.EqualFold("PartNumberMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.PartNumberMarker = ptr.String(xtv) } case strings.EqualFold("Part", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentPartsUnwrapped(&sv.Parts, nodeDecoder); err != nil { return err } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.StorageClass(xtv) } case strings.EqualFold("UploadId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.UploadId = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpPutBucketAccelerateConfiguration struct { } func (*awsRestxml_deserializeOpPutBucketAccelerateConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketAccelerateConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketAccelerateConfiguration(response, &metadata) } output := &PutBucketAccelerateConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketAccelerateConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketAcl struct { } func (*awsRestxml_deserializeOpPutBucketAcl) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketAcl) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketAcl(response, &metadata) } output := &PutBucketAclOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketAcl(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketAnalyticsConfiguration struct { } func (*awsRestxml_deserializeOpPutBucketAnalyticsConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketAnalyticsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketAnalyticsConfiguration(response, &metadata) } output := &PutBucketAnalyticsConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketAnalyticsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketCors struct { } func (*awsRestxml_deserializeOpPutBucketCors) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketCors) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketCors(response, &metadata) } output := &PutBucketCorsOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketCors(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketEncryption struct { } func (*awsRestxml_deserializeOpPutBucketEncryption) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketEncryption) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketEncryption(response, &metadata) } output := &PutBucketEncryptionOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketEncryption(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketIntelligentTieringConfiguration struct { } func (*awsRestxml_deserializeOpPutBucketIntelligentTieringConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketIntelligentTieringConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketIntelligentTieringConfiguration(response, &metadata) } output := &PutBucketIntelligentTieringConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketIntelligentTieringConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketInventoryConfiguration struct { } func (*awsRestxml_deserializeOpPutBucketInventoryConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketInventoryConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketInventoryConfiguration(response, &metadata) } output := &PutBucketInventoryConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketInventoryConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketLifecycleConfiguration struct { } func (*awsRestxml_deserializeOpPutBucketLifecycleConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketLifecycleConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketLifecycleConfiguration(response, &metadata) } output := &PutBucketLifecycleConfigurationOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsPutBucketLifecycleConfigurationOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketLifecycleConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsPutBucketLifecycleConfigurationOutput(v *PutBucketLifecycleConfigurationOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-transition-default-minimum-object-size"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.TransitionDefaultMinimumObjectSize = types.TransitionDefaultMinimumObjectSize(headerValues[0]) } return nil } type awsRestxml_deserializeOpPutBucketLogging struct { } func (*awsRestxml_deserializeOpPutBucketLogging) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketLogging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketLogging(response, &metadata) } output := &PutBucketLoggingOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketLogging(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketMetricsConfiguration struct { } func (*awsRestxml_deserializeOpPutBucketMetricsConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketMetricsConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketMetricsConfiguration(response, &metadata) } output := &PutBucketMetricsConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketMetricsConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketNotificationConfiguration struct { } func (*awsRestxml_deserializeOpPutBucketNotificationConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketNotificationConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketNotificationConfiguration(response, &metadata) } output := &PutBucketNotificationConfigurationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketNotificationConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketOwnershipControls struct { } func (*awsRestxml_deserializeOpPutBucketOwnershipControls) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketOwnershipControls) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketOwnershipControls(response, &metadata) } output := &PutBucketOwnershipControlsOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketOwnershipControls(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketPolicy struct { } func (*awsRestxml_deserializeOpPutBucketPolicy) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketPolicy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketPolicy(response, &metadata) } output := &PutBucketPolicyOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketPolicy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketReplication struct { } func (*awsRestxml_deserializeOpPutBucketReplication) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketReplication) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketReplication(response, &metadata) } output := &PutBucketReplicationOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketReplication(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketRequestPayment struct { } func (*awsRestxml_deserializeOpPutBucketRequestPayment) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketRequestPayment) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketRequestPayment(response, &metadata) } output := &PutBucketRequestPaymentOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketRequestPayment(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketTagging struct { } func (*awsRestxml_deserializeOpPutBucketTagging) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketTagging(response, &metadata) } output := &PutBucketTaggingOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketVersioning struct { } func (*awsRestxml_deserializeOpPutBucketVersioning) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketVersioning) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketVersioning(response, &metadata) } output := &PutBucketVersioningOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketVersioning(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutBucketWebsite struct { } func (*awsRestxml_deserializeOpPutBucketWebsite) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutBucketWebsite) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutBucketWebsite(response, &metadata) } output := &PutBucketWebsiteOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutBucketWebsite(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpPutObject struct { } func (*awsRestxml_deserializeOpPutObject) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutObject(response, &metadata) } output := &PutObjectOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsPutObjectOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutObject(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("EncryptionTypeMismatch", errorCode): return awsRestxml_deserializeErrorEncryptionTypeMismatch(response, errorBody) case strings.EqualFold("InvalidRequest", errorCode): return awsRestxml_deserializeErrorInvalidRequest(response, errorBody) case strings.EqualFold("InvalidWriteOffset", errorCode): return awsRestxml_deserializeErrorInvalidWriteOffset(response, errorBody) case strings.EqualFold("TooManyParts", errorCode): return awsRestxml_deserializeErrorTooManyParts(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsPutObjectOutput(v *PutObjectOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-checksum-crc32"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC32 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc32c"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC32C = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc64nvme"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC64NVME = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-sha1"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumSHA1 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-sha256"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumSHA256 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-type"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumType = types.ChecksumType(headerValues[0]) } if headerValues := response.Header.Values("ETag"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ETag = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-expiration"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.Expiration = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-object-size"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseInt(headerValues[0], 0, 64) if err != nil { return err } v.Size = ptr.Int64(vv) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-algorithm"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerAlgorithm = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-key-MD5"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerKeyMD5 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-context"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSEncryptionContext = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpPutObjectAcl struct { } func (*awsRestxml_deserializeOpPutObjectAcl) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutObjectAcl) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutObjectAcl(response, &metadata) } output := &PutObjectAclOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsPutObjectAclOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutObjectAcl(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("NoSuchKey", errorCode): return awsRestxml_deserializeErrorNoSuchKey(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsPutObjectAclOutput(v *PutObjectAclOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } type awsRestxml_deserializeOpPutObjectLegalHold struct { } func (*awsRestxml_deserializeOpPutObjectLegalHold) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutObjectLegalHold) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutObjectLegalHold(response, &metadata) } output := &PutObjectLegalHoldOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsPutObjectLegalHoldOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutObjectLegalHold(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsPutObjectLegalHoldOutput(v *PutObjectLegalHoldOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } type awsRestxml_deserializeOpPutObjectLockConfiguration struct { } func (*awsRestxml_deserializeOpPutObjectLockConfiguration) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutObjectLockConfiguration) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutObjectLockConfiguration(response, &metadata) } output := &PutObjectLockConfigurationOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsPutObjectLockConfigurationOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutObjectLockConfiguration(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsPutObjectLockConfigurationOutput(v *PutObjectLockConfigurationOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } type awsRestxml_deserializeOpPutObjectRetention struct { } func (*awsRestxml_deserializeOpPutObjectRetention) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutObjectRetention) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutObjectRetention(response, &metadata) } output := &PutObjectRetentionOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsPutObjectRetentionOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutObjectRetention(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsPutObjectRetentionOutput(v *PutObjectRetentionOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } return nil } type awsRestxml_deserializeOpPutObjectTagging struct { } func (*awsRestxml_deserializeOpPutObjectTagging) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutObjectTagging) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutObjectTagging(response, &metadata) } output := &PutObjectTaggingOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsPutObjectTaggingOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutObjectTagging(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsPutObjectTaggingOutput(v *PutObjectTaggingOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.VersionId = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpPutPublicAccessBlock struct { } func (*awsRestxml_deserializeOpPutPublicAccessBlock) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpPutPublicAccessBlock) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorPutPublicAccessBlock(response, &metadata) } output := &PutPublicAccessBlockOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorPutPublicAccessBlock(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpRestoreObject struct { } func (*awsRestxml_deserializeOpRestoreObject) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpRestoreObject) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorRestoreObject(response, &metadata) } output := &RestoreObjectOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsRestoreObjectOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorRestoreObject(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { case strings.EqualFold("ObjectAlreadyInActiveTierError", errorCode): return awsRestxml_deserializeErrorObjectAlreadyInActiveTierError(response, errorBody) default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsRestoreObjectOutput(v *RestoreObjectOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-restore-output-path"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RestoreOutputPath = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpSelectObjectContent struct { } func (*awsRestxml_deserializeOpSelectObjectContent) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpSelectObjectContent) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorSelectObjectContent(response, &metadata) } output := &SelectObjectContentOutput{} out.Result = output span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorSelectObjectContent(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } type awsRestxml_deserializeOpUploadPart struct { } func (*awsRestxml_deserializeOpUploadPart) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpUploadPart) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorUploadPart(response, &metadata) } output := &UploadPartOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsUploadPartOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorUploadPart(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsUploadPartOutput(v *UploadPartOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-checksum-crc32"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC32 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc32c"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC32C = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-crc64nvme"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumCRC64NVME = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-sha1"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumSHA1 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-checksum-sha256"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ChecksumSHA256 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("ETag"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ETag = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-algorithm"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerAlgorithm = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-key-MD5"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerKeyMD5 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } return nil } type awsRestxml_deserializeOpUploadPartCopy struct { } func (*awsRestxml_deserializeOpUploadPartCopy) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpUploadPartCopy) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorUploadPartCopy(response, &metadata) } output := &UploadPartCopyOutput{} out.Result = output err = awsRestxml_deserializeOpHttpBindingsUploadPartCopyOutput(output, response) if err != nil { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to decode response with invalid Http bindings, %w", err)} } var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(response.Body, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return out, metadata, nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentCopyPartResult(&output.CopyPartResult, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorUploadPartCopy(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeOpHttpBindingsUploadPartCopyOutput(v *UploadPartCopyOutput, response *smithyhttp.Response) error { if v == nil { return fmt.Errorf("unsupported deserialization for nil %T", v) } if headerValues := response.Header.Values("x-amz-server-side-encryption-bucket-key-enabled"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) vv, err := strconv.ParseBool(headerValues[0]) if err != nil { return err } v.BucketKeyEnabled = ptr.Bool(vv) } if headerValues := response.Header.Values("x-amz-copy-source-version-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.CopySourceVersionId = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-request-charged"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.RequestCharged = types.RequestCharged(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.ServerSideEncryption = types.ServerSideEncryption(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-algorithm"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerAlgorithm = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-customer-key-MD5"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSECustomerKeyMD5 = ptr.String(headerValues[0]) } if headerValues := response.Header.Values("x-amz-server-side-encryption-aws-kms-key-id"); len(headerValues) != 0 { headerValues[0] = strings.TrimSpace(headerValues[0]) v.SSEKMSKeyId = ptr.String(headerValues[0]) } return nil } func awsRestxml_deserializeOpDocumentUploadPartCopyOutput(v **UploadPartCopyOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *UploadPartCopyOutput if *v == nil { sv = &UploadPartCopyOutput{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("CopyPartResult", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentCopyPartResult(&sv.CopyPartResult, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } type awsRestxml_deserializeOpWriteGetObjectResponse struct { } func (*awsRestxml_deserializeOpWriteGetObjectResponse) ID() string { return "OperationDeserializer" } func (m *awsRestxml_deserializeOpWriteGetObjectResponse) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } _, span := tracing.StartSpan(ctx, "OperationDeserializer") endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") defer endTimer() defer span.End() response, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} } if response.StatusCode < 200 || response.StatusCode >= 300 { return out, metadata, awsRestxml_deserializeOpErrorWriteGetObjectResponse(response, &metadata) } output := &WriteGetObjectResponseOutput{} out.Result = output if _, err = io.Copy(ioutil.Discard, response.Body); err != nil { return out, metadata, &smithy.DeserializationError{ Err: fmt.Errorf("failed to discard response body, %w", err), } } span.End() return out, metadata, err } func awsRestxml_deserializeOpErrorWriteGetObjectResponse(response *smithyhttp.Response, metadata *middleware.Metadata) error { var errorBuffer bytes.Buffer if _, err := io.Copy(&errorBuffer, response.Body); err != nil { return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} } errorBody := bytes.NewReader(errorBuffer.Bytes()) errorCode := "UnknownError" errorMessage := errorCode errorComponents, err := s3shared.GetErrorResponseComponents(errorBody, s3shared.ErrorResponseDeserializerOptions{ UseStatusCode: true, StatusCode: response.StatusCode, }) if err != nil { return err } if hostID := errorComponents.HostID; len(hostID) != 0 { s3shared.SetHostIDMetadata(metadata, hostID) } if reqID := errorComponents.RequestID; len(reqID) != 0 { awsmiddleware.SetRequestIDMetadata(metadata, reqID) } if len(errorComponents.Code) != 0 { errorCode = errorComponents.Code } if len(errorComponents.Message) != 0 { errorMessage = errorComponents.Message } errorBody.Seek(0, io.SeekStart) switch { default: genericError := &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } return genericError } } func awsRestxml_deserializeEventStreamSelectObjectContentEventStream(v *types.SelectObjectContentEventStream, msg *eventstream.Message) error { if v == nil { return fmt.Errorf("unexpected serialization of nil %T", v) } eventType := msg.Headers.Get(eventstreamapi.EventTypeHeader) if eventType == nil { return fmt.Errorf("%s event header not present", eventstreamapi.EventTypeHeader) } switch { case strings.EqualFold("Cont", eventType.String()): vv := &types.SelectObjectContentEventStreamMemberCont{} if err := awsRestxml_deserializeEventMessageContinuationEvent(&vv.Value, msg); err != nil { return err } *v = vv return nil case strings.EqualFold("End", eventType.String()): vv := &types.SelectObjectContentEventStreamMemberEnd{} if err := awsRestxml_deserializeEventMessageEndEvent(&vv.Value, msg); err != nil { return err } *v = vv return nil case strings.EqualFold("Progress", eventType.String()): vv := &types.SelectObjectContentEventStreamMemberProgress{} if err := awsRestxml_deserializeEventMessageProgressEvent(&vv.Value, msg); err != nil { return err } *v = vv return nil case strings.EqualFold("Records", eventType.String()): vv := &types.SelectObjectContentEventStreamMemberRecords{} if err := awsRestxml_deserializeEventMessageRecordsEvent(&vv.Value, msg); err != nil { return err } *v = vv return nil case strings.EqualFold("Stats", eventType.String()): vv := &types.SelectObjectContentEventStreamMemberStats{} if err := awsRestxml_deserializeEventMessageStatsEvent(&vv.Value, msg); err != nil { return err } *v = vv return nil default: buffer := bytes.NewBuffer(nil) eventstream.NewEncoder().Encode(buffer, *msg) *v = &types.UnknownUnionMember{ Tag: eventType.String(), Value: buffer.Bytes(), } return nil } } func awsRestxml_deserializeEventStreamExceptionSelectObjectContentEventStream(msg *eventstream.Message) error { exceptionType := msg.Headers.Get(eventstreamapi.ExceptionTypeHeader) if exceptionType == nil { return fmt.Errorf("%s event header not present", eventstreamapi.ExceptionTypeHeader) } switch { default: br := bytes.NewReader(msg.Payload) var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(br, ringBuffer) decoder := json.NewDecoder(body) decoder.UseNumber() errorComponents, err := awsxml.GetErrorResponseComponents(br, true) if err != nil { return err } errorCode := "UnknownError" errorMessage := errorCode if ev := exceptionType.String(); len(ev) > 0 { errorCode = ev } else if ev := errorComponents.Code; len(ev) > 0 { errorCode = ev } if ev := errorComponents.Message; len(ev) > 0 { errorMessage = ev } return &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } } } func awsRestxml_deserializeEventMessageRecordsEvent(v *types.RecordsEvent, msg *eventstream.Message) error { if v == nil { return fmt.Errorf("unexpected serialization of nil %T", v) } if msg.Payload != nil { bsv := make([]byte, len(msg.Payload)) copy(bsv, msg.Payload) v.Payload = bsv } return nil } func awsRestxml_deserializeEventMessageStatsEvent(v *types.StatsEvent, msg *eventstream.Message) error { if v == nil { return fmt.Errorf("unexpected serialization of nil %T", v) } br := bytes.NewReader(msg.Payload) var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(br, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentStats(&v.Details, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } return nil } func awsRestxml_deserializeEventMessageProgressEvent(v *types.ProgressEvent, msg *eventstream.Message) error { if v == nil { return fmt.Errorf("unexpected serialization of nil %T", v) } br := bytes.NewReader(msg.Payload) var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(br, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentProgress(&v.Details, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } return nil } func awsRestxml_deserializeEventMessageContinuationEvent(v *types.ContinuationEvent, msg *eventstream.Message) error { if v == nil { return fmt.Errorf("unexpected serialization of nil %T", v) } br := bytes.NewReader(msg.Payload) var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(br, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentContinuationEvent(&v, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } return nil } func awsRestxml_deserializeEventMessageEndEvent(v *types.EndEvent, msg *eventstream.Message) error { if v == nil { return fmt.Errorf("unexpected serialization of nil %T", v) } br := bytes.NewReader(msg.Payload) var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(br, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return nil } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentEndEvent(&v, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } return nil } func awsRestxml_deserializeDocumentContinuationEvent(v **types.ContinuationEvent, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ContinuationEvent if *v == nil { sv = &types.ContinuationEvent{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentEndEvent(v **types.EndEvent, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.EndEvent if *v == nil { sv = &types.EndEvent{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentProgress(v **types.Progress, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Progress if *v == nil { sv = &types.Progress{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("BytesProcessed", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.BytesProcessed = ptr.Int64(i64) } case strings.EqualFold("BytesReturned", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.BytesReturned = ptr.Int64(i64) } case strings.EqualFold("BytesScanned", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.BytesScanned = ptr.Int64(i64) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentStats(v **types.Stats, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Stats if *v == nil { sv = &types.Stats{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("BytesProcessed", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.BytesProcessed = ptr.Int64(i64) } case strings.EqualFold("BytesReturned", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.BytesReturned = ptr.Int64(i64) } case strings.EqualFold("BytesScanned", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.BytesScanned = ptr.Int64(i64) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeErrorBucketAlreadyExists(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.BucketAlreadyExists{} return output } func awsRestxml_deserializeErrorBucketAlreadyOwnedByYou(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.BucketAlreadyOwnedByYou{} return output } func awsRestxml_deserializeErrorEncryptionTypeMismatch(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.EncryptionTypeMismatch{} return output } func awsRestxml_deserializeErrorInvalidObjectState(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.InvalidObjectState{} var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) rootDecoder := xml.NewDecoder(body) t, err := smithyxml.FetchRootElement(rootDecoder) if err == io.EOF { return output } if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) err = awsRestxml_deserializeDocumentInvalidObjectState(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) return &smithy.DeserializationError{ Err: fmt.Errorf("failed to decode response body, %w", err), Snapshot: snapshot.Bytes(), } } return output } func awsRestxml_deserializeErrorInvalidRequest(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.InvalidRequest{} return output } func awsRestxml_deserializeErrorInvalidWriteOffset(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.InvalidWriteOffset{} return output } func awsRestxml_deserializeErrorNoSuchBucket(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.NoSuchBucket{} return output } func awsRestxml_deserializeErrorNoSuchKey(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.NoSuchKey{} return output } func awsRestxml_deserializeErrorNoSuchUpload(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.NoSuchUpload{} return output } func awsRestxml_deserializeErrorNotFound(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.NotFound{} return output } func awsRestxml_deserializeErrorObjectAlreadyInActiveTierError(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.ObjectAlreadyInActiveTierError{} return output } func awsRestxml_deserializeErrorObjectNotInActiveTierError(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.ObjectNotInActiveTierError{} return output } func awsRestxml_deserializeErrorTooManyParts(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.TooManyParts{} return output } func awsRestxml_deserializeDocumentAbortIncompleteMultipartUpload(v **types.AbortIncompleteMultipartUpload, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.AbortIncompleteMultipartUpload if *v == nil { sv = &types.AbortIncompleteMultipartUpload{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("DaysAfterInitiation", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.DaysAfterInitiation = ptr.Int32(int32(i64)) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAccessControlTranslation(v **types.AccessControlTranslation, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.AccessControlTranslation if *v == nil { sv = &types.AccessControlTranslation{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Owner", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Owner = types.OwnerOverride(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAllowedHeaders(v *[]string, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []string if *v == nil { sv = make([]string, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } memberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) decoder = memberDecoder switch { case strings.EqualFold("member", t.Name.Local): var col string val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) col = xtv } sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAllowedHeadersUnwrapped(v *[]string, decoder smithyxml.NodeDecoder) error { var sv []string if *v == nil { sv = make([]string, 0) } else { sv = *v } switch { default: var mv string t := decoder.StartEl _ = t val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = xtv } sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentAllowedMethods(v *[]string, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []string if *v == nil { sv = make([]string, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } memberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) decoder = memberDecoder switch { case strings.EqualFold("member", t.Name.Local): var col string val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) col = xtv } sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAllowedMethodsUnwrapped(v *[]string, decoder smithyxml.NodeDecoder) error { var sv []string if *v == nil { sv = make([]string, 0) } else { sv = *v } switch { default: var mv string t := decoder.StartEl _ = t val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = xtv } sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentAllowedOrigins(v *[]string, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []string if *v == nil { sv = make([]string, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } memberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) decoder = memberDecoder switch { case strings.EqualFold("member", t.Name.Local): var col string val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) col = xtv } sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAllowedOriginsUnwrapped(v *[]string, decoder smithyxml.NodeDecoder) error { var sv []string if *v == nil { sv = make([]string, 0) } else { sv = *v } switch { default: var mv string t := decoder.StartEl _ = t val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = xtv } sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentAnalyticsAndOperator(v **types.AnalyticsAndOperator, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.AnalyticsAndOperator if *v == nil { sv = &types.AnalyticsAndOperator{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Tag", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAnalyticsConfiguration(v **types.AnalyticsConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.AnalyticsConfiguration if *v == nil { sv = &types.AnalyticsConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAnalyticsFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("Id", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Id = ptr.String(xtv) } case strings.EqualFold("StorageClassAnalysis", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentStorageClassAnalysis(&sv.StorageClassAnalysis, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAnalyticsConfigurationList(v *[]types.AnalyticsConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.AnalyticsConfiguration if *v == nil { sv = make([]types.AnalyticsConfiguration, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.AnalyticsConfiguration nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentAnalyticsConfiguration(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAnalyticsConfigurationListUnwrapped(v *[]types.AnalyticsConfiguration, decoder smithyxml.NodeDecoder) error { var sv []types.AnalyticsConfiguration if *v == nil { sv = make([]types.AnalyticsConfiguration, 0) } else { sv = *v } switch { default: var mv types.AnalyticsConfiguration t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentAnalyticsConfiguration(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentAnalyticsExportDestination(v **types.AnalyticsExportDestination, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.AnalyticsExportDestination if *v == nil { sv = &types.AnalyticsExportDestination{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("S3BucketDestination", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAnalyticsS3BucketDestination(&sv.S3BucketDestination, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentAnalyticsFilter(v *types.AnalyticsFilter, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var uv types.AnalyticsFilter var memberFound bool for { t, done, err := decoder.Token() if err != nil { return err } if done { break } if memberFound { if err = decoder.Decoder.Skip(); err != nil { return err } } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("And", t.Name.Local): var mv types.AnalyticsAndOperator nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentAnalyticsAndOperator(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr uv = &types.AnalyticsFilterMemberAnd{Value: mv} memberFound = true case strings.EqualFold("Prefix", t.Name.Local): var mv string val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = xtv } uv = &types.AnalyticsFilterMemberPrefix{Value: mv} memberFound = true case strings.EqualFold("Tag", t.Name.Local): var mv types.Tag nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentTag(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr uv = &types.AnalyticsFilterMemberTag{Value: mv} memberFound = true default: uv = &types.UnknownUnionMember{Tag: t.Name.Local} memberFound = true } decoder = originalDecoder } *v = uv return nil } func awsRestxml_deserializeDocumentAnalyticsS3BucketDestination(v **types.AnalyticsS3BucketDestination, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.AnalyticsS3BucketDestination if *v == nil { sv = &types.AnalyticsS3BucketDestination{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Bucket", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Bucket = ptr.String(xtv) } case strings.EqualFold("BucketAccountId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.BucketAccountId = ptr.String(xtv) } case strings.EqualFold("Format", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Format = types.AnalyticsS3ExportFileFormat(xtv) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentBucket(v **types.Bucket, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Bucket if *v == nil { sv = &types.Bucket{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("BucketRegion", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.BucketRegion = ptr.String(xtv) } case strings.EqualFold("CreationDate", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.CreationDate = ptr.Time(t) } case strings.EqualFold("Name", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Name = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentBucketAlreadyExists(v **types.BucketAlreadyExists, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.BucketAlreadyExists if *v == nil { sv = &types.BucketAlreadyExists{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentBucketAlreadyOwnedByYou(v **types.BucketAlreadyOwnedByYou, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.BucketAlreadyOwnedByYou if *v == nil { sv = &types.BucketAlreadyOwnedByYou{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentBuckets(v *[]types.Bucket, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Bucket if *v == nil { sv = make([]types.Bucket, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("Bucket", t.Name.Local): var col types.Bucket nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentBucket(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentBucketsUnwrapped(v *[]types.Bucket, decoder smithyxml.NodeDecoder) error { var sv []types.Bucket if *v == nil { sv = make([]types.Bucket, 0) } else { sv = *v } switch { default: var mv types.Bucket t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentBucket(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentChecksum(v **types.Checksum, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Checksum if *v == nil { sv = &types.Checksum{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ChecksumCRC32", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32 = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC32C", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32C = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC64NVME", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC64NVME = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA1", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA1 = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA256", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA256 = ptr.String(xtv) } case strings.EqualFold("ChecksumType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumType = types.ChecksumType(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentChecksumAlgorithmList(v *[]types.ChecksumAlgorithm, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.ChecksumAlgorithm if *v == nil { sv = make([]types.ChecksumAlgorithm, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } memberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) decoder = memberDecoder switch { case strings.EqualFold("member", t.Name.Local): var col types.ChecksumAlgorithm val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) col = types.ChecksumAlgorithm(xtv) } sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentChecksumAlgorithmListUnwrapped(v *[]types.ChecksumAlgorithm, decoder smithyxml.NodeDecoder) error { var sv []types.ChecksumAlgorithm if *v == nil { sv = make([]types.ChecksumAlgorithm, 0) } else { sv = *v } switch { default: var mv types.ChecksumAlgorithm t := decoder.StartEl _ = t val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = types.ChecksumAlgorithm(xtv) } sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentCommonPrefix(v **types.CommonPrefix, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.CommonPrefix if *v == nil { sv = &types.CommonPrefix{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentCommonPrefixList(v *[]types.CommonPrefix, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.CommonPrefix if *v == nil { sv = make([]types.CommonPrefix, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.CommonPrefix nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentCommonPrefix(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentCommonPrefixListUnwrapped(v *[]types.CommonPrefix, decoder smithyxml.NodeDecoder) error { var sv []types.CommonPrefix if *v == nil { sv = make([]types.CommonPrefix, 0) } else { sv = *v } switch { default: var mv types.CommonPrefix t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentCommonPrefix(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentCondition(v **types.Condition, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Condition if *v == nil { sv = &types.Condition{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("HttpErrorCodeReturnedEquals", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.HttpErrorCodeReturnedEquals = ptr.String(xtv) } case strings.EqualFold("KeyPrefixEquals", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.KeyPrefixEquals = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentCopyObjectResult(v **types.CopyObjectResult, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.CopyObjectResult if *v == nil { sv = &types.CopyObjectResult{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ChecksumCRC32", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32 = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC32C", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32C = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC64NVME", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC64NVME = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA1", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA1 = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA256", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA256 = ptr.String(xtv) } case strings.EqualFold("ChecksumType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumType = types.ChecksumType(xtv) } case strings.EqualFold("ETag", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ETag = ptr.String(xtv) } case strings.EqualFold("LastModified", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.LastModified = ptr.Time(t) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentCopyPartResult(v **types.CopyPartResult, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.CopyPartResult if *v == nil { sv = &types.CopyPartResult{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ChecksumCRC32", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32 = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC32C", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32C = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC64NVME", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC64NVME = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA1", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA1 = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA256", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA256 = ptr.String(xtv) } case strings.EqualFold("ETag", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ETag = ptr.String(xtv) } case strings.EqualFold("LastModified", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.LastModified = ptr.Time(t) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentCORSRule(v **types.CORSRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.CORSRule if *v == nil { sv = &types.CORSRule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AllowedHeader", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAllowedHeadersUnwrapped(&sv.AllowedHeaders, nodeDecoder); err != nil { return err } case strings.EqualFold("AllowedMethod", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAllowedMethodsUnwrapped(&sv.AllowedMethods, nodeDecoder); err != nil { return err } case strings.EqualFold("AllowedOrigin", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAllowedOriginsUnwrapped(&sv.AllowedOrigins, nodeDecoder); err != nil { return err } case strings.EqualFold("ExposeHeader", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentExposeHeadersUnwrapped(&sv.ExposeHeaders, nodeDecoder); err != nil { return err } case strings.EqualFold("ID", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ID = ptr.String(xtv) } case strings.EqualFold("MaxAgeSeconds", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.MaxAgeSeconds = ptr.Int32(int32(i64)) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentCORSRules(v *[]types.CORSRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.CORSRule if *v == nil { sv = make([]types.CORSRule, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.CORSRule nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentCORSRule(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentCORSRulesUnwrapped(v *[]types.CORSRule, decoder smithyxml.NodeDecoder) error { var sv []types.CORSRule if *v == nil { sv = make([]types.CORSRule, 0) } else { sv = *v } switch { default: var mv types.CORSRule t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentCORSRule(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentDefaultRetention(v **types.DefaultRetention, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.DefaultRetention if *v == nil { sv = &types.DefaultRetention{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Days", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Days = ptr.Int32(int32(i64)) } case strings.EqualFold("Mode", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Mode = types.ObjectLockRetentionMode(xtv) } case strings.EqualFold("Years", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Years = ptr.Int32(int32(i64)) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentDeletedObject(v **types.DeletedObject, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.DeletedObject if *v == nil { sv = &types.DeletedObject{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("DeleteMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected DeleteMarker to be of type *bool, got %T instead", val) } sv.DeleteMarker = ptr.Bool(xtv) } case strings.EqualFold("DeleteMarkerVersionId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.DeleteMarkerVersionId = ptr.String(xtv) } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("VersionId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.VersionId = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentDeletedObjects(v *[]types.DeletedObject, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.DeletedObject if *v == nil { sv = make([]types.DeletedObject, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.DeletedObject nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentDeletedObject(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentDeletedObjectsUnwrapped(v *[]types.DeletedObject, decoder smithyxml.NodeDecoder) error { var sv []types.DeletedObject if *v == nil { sv = make([]types.DeletedObject, 0) } else { sv = *v } switch { default: var mv types.DeletedObject t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentDeletedObject(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentDeleteMarkerEntry(v **types.DeleteMarkerEntry, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.DeleteMarkerEntry if *v == nil { sv = &types.DeleteMarkerEntry{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("IsLatest", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsLatest to be of type *bool, got %T instead", val) } sv.IsLatest = ptr.Bool(xtv) } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("LastModified", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.LastModified = ptr.Time(t) } case strings.EqualFold("Owner", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil { return err } case strings.EqualFold("VersionId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.VersionId = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentDeleteMarkerReplication(v **types.DeleteMarkerReplication, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.DeleteMarkerReplication if *v == nil { sv = &types.DeleteMarkerReplication{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.DeleteMarkerReplicationStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentDeleteMarkers(v *[]types.DeleteMarkerEntry, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.DeleteMarkerEntry if *v == nil { sv = make([]types.DeleteMarkerEntry, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.DeleteMarkerEntry nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentDeleteMarkerEntry(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentDeleteMarkersUnwrapped(v *[]types.DeleteMarkerEntry, decoder smithyxml.NodeDecoder) error { var sv []types.DeleteMarkerEntry if *v == nil { sv = make([]types.DeleteMarkerEntry, 0) } else { sv = *v } switch { default: var mv types.DeleteMarkerEntry t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentDeleteMarkerEntry(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentDestination(v **types.Destination, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Destination if *v == nil { sv = &types.Destination{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccessControlTranslation", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAccessControlTranslation(&sv.AccessControlTranslation, nodeDecoder); err != nil { return err } case strings.EqualFold("Account", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Account = ptr.String(xtv) } case strings.EqualFold("Bucket", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Bucket = ptr.String(xtv) } case strings.EqualFold("EncryptionConfiguration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentEncryptionConfiguration(&sv.EncryptionConfiguration, nodeDecoder); err != nil { return err } case strings.EqualFold("Metrics", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentMetrics(&sv.Metrics, nodeDecoder); err != nil { return err } case strings.EqualFold("ReplicationTime", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentReplicationTime(&sv.ReplicationTime, nodeDecoder); err != nil { return err } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.StorageClass(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentEncryptionConfiguration(v **types.EncryptionConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.EncryptionConfiguration if *v == nil { sv = &types.EncryptionConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ReplicaKmsKeyID", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ReplicaKmsKeyID = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentEncryptionTypeMismatch(v **types.EncryptionTypeMismatch, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.EncryptionTypeMismatch if *v == nil { sv = &types.EncryptionTypeMismatch{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentError(v **types.Error, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Error if *v == nil { sv = &types.Error{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Code", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Code = ptr.String(xtv) } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("Message", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Message = ptr.String(xtv) } case strings.EqualFold("VersionId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.VersionId = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentErrorDetails(v **types.ErrorDetails, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ErrorDetails if *v == nil { sv = &types.ErrorDetails{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ErrorCode", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ErrorCode = ptr.String(xtv) } case strings.EqualFold("ErrorMessage", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ErrorMessage = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentErrorDocument(v **types.ErrorDocument, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ErrorDocument if *v == nil { sv = &types.ErrorDocument{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentErrors(v *[]types.Error, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Error if *v == nil { sv = make([]types.Error, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.Error nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentError(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentErrorsUnwrapped(v *[]types.Error, decoder smithyxml.NodeDecoder) error { var sv []types.Error if *v == nil { sv = make([]types.Error, 0) } else { sv = *v } switch { default: var mv types.Error t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentError(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentEventBridgeConfiguration(v **types.EventBridgeConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.EventBridgeConfiguration if *v == nil { sv = &types.EventBridgeConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentEventList(v *[]types.Event, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Event if *v == nil { sv = make([]types.Event, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } memberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) decoder = memberDecoder switch { case strings.EqualFold("member", t.Name.Local): var col types.Event val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) col = types.Event(xtv) } sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentEventListUnwrapped(v *[]types.Event, decoder smithyxml.NodeDecoder) error { var sv []types.Event if *v == nil { sv = make([]types.Event, 0) } else { sv = *v } switch { default: var mv types.Event t := decoder.StartEl _ = t val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = types.Event(xtv) } sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentExistingObjectReplication(v **types.ExistingObjectReplication, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ExistingObjectReplication if *v == nil { sv = &types.ExistingObjectReplication{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.ExistingObjectReplicationStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentExposeHeaders(v *[]string, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []string if *v == nil { sv = make([]string, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } memberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) decoder = memberDecoder switch { case strings.EqualFold("member", t.Name.Local): var col string val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) col = xtv } sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentExposeHeadersUnwrapped(v *[]string, decoder smithyxml.NodeDecoder) error { var sv []string if *v == nil { sv = make([]string, 0) } else { sv = *v } switch { default: var mv string t := decoder.StartEl _ = t val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = xtv } sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentFilterRule(v **types.FilterRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.FilterRule if *v == nil { sv = &types.FilterRule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Name", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Name = types.FilterRuleName(xtv) } case strings.EqualFold("Value", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Value = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentFilterRuleList(v *[]types.FilterRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.FilterRule if *v == nil { sv = make([]types.FilterRule, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.FilterRule nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentFilterRule(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentFilterRuleListUnwrapped(v *[]types.FilterRule, decoder smithyxml.NodeDecoder) error { var sv []types.FilterRule if *v == nil { sv = make([]types.FilterRule, 0) } else { sv = *v } switch { default: var mv types.FilterRule t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentFilterRule(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentGetBucketMetadataTableConfigurationResult(v **types.GetBucketMetadataTableConfigurationResult, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.GetBucketMetadataTableConfigurationResult if *v == nil { sv = &types.GetBucketMetadataTableConfigurationResult{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Error", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentErrorDetails(&sv.Error, nodeDecoder); err != nil { return err } case strings.EqualFold("MetadataTableConfigurationResult", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentMetadataTableConfigurationResult(&sv.MetadataTableConfigurationResult, nodeDecoder); err != nil { return err } case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentGetObjectAttributesParts(v **types.GetObjectAttributesParts, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.GetObjectAttributesParts if *v == nil { sv = &types.GetObjectAttributesParts{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("IsTruncated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsTruncated to be of type *bool, got %T instead", val) } sv.IsTruncated = ptr.Bool(xtv) } case strings.EqualFold("MaxParts", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.MaxParts = ptr.Int32(int32(i64)) } case strings.EqualFold("NextPartNumberMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.NextPartNumberMarker = ptr.String(xtv) } case strings.EqualFold("PartNumberMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.PartNumberMarker = ptr.String(xtv) } case strings.EqualFold("Part", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentPartsListUnwrapped(&sv.Parts, nodeDecoder); err != nil { return err } case strings.EqualFold("PartsCount", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.TotalPartsCount = ptr.Int32(int32(i64)) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentGrant(v **types.Grant, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Grant if *v == nil { sv = &types.Grant{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Grantee", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentGrantee(&sv.Grantee, nodeDecoder); err != nil { return err } case strings.EqualFold("Permission", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Permission = types.Permission(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentGrantee(v **types.Grantee, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Grantee if *v == nil { sv = &types.Grantee{} } else { sv = *v } for _, attr := range decoder.StartEl.Attr { name := attr.Name.Local if len(attr.Name.Space) != 0 { name = attr.Name.Space + `:` + attr.Name.Local } switch { case strings.EqualFold("xsi:type", name): val := []byte(attr.Value) { xtv := string(val) sv.Type = types.Type(xtv) } } } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("DisplayName", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.DisplayName = ptr.String(xtv) } case strings.EqualFold("EmailAddress", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.EmailAddress = ptr.String(xtv) } case strings.EqualFold("ID", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ID = ptr.String(xtv) } case strings.EqualFold("URI", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.URI = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentGrants(v *[]types.Grant, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Grant if *v == nil { sv = make([]types.Grant, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("Grant", t.Name.Local): var col types.Grant nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentGrant(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentGrantsUnwrapped(v *[]types.Grant, decoder smithyxml.NodeDecoder) error { var sv []types.Grant if *v == nil { sv = make([]types.Grant, 0) } else { sv = *v } switch { default: var mv types.Grant t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentGrant(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentIndexDocument(v **types.IndexDocument, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.IndexDocument if *v == nil { sv = &types.IndexDocument{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Suffix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Suffix = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInitiator(v **types.Initiator, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Initiator if *v == nil { sv = &types.Initiator{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("DisplayName", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.DisplayName = ptr.String(xtv) } case strings.EqualFold("ID", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ID = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentIntelligentTieringAndOperator(v **types.IntelligentTieringAndOperator, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.IntelligentTieringAndOperator if *v == nil { sv = &types.IntelligentTieringAndOperator{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Tag", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentIntelligentTieringConfiguration(v **types.IntelligentTieringConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.IntelligentTieringConfiguration if *v == nil { sv = &types.IntelligentTieringConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentIntelligentTieringFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("Id", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Id = ptr.String(xtv) } case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.IntelligentTieringStatus(xtv) } case strings.EqualFold("Tiering", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTieringListUnwrapped(&sv.Tierings, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentIntelligentTieringConfigurationList(v *[]types.IntelligentTieringConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.IntelligentTieringConfiguration if *v == nil { sv = make([]types.IntelligentTieringConfiguration, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.IntelligentTieringConfiguration nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentIntelligentTieringConfiguration(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentIntelligentTieringConfigurationListUnwrapped(v *[]types.IntelligentTieringConfiguration, decoder smithyxml.NodeDecoder) error { var sv []types.IntelligentTieringConfiguration if *v == nil { sv = make([]types.IntelligentTieringConfiguration, 0) } else { sv = *v } switch { default: var mv types.IntelligentTieringConfiguration t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentIntelligentTieringConfiguration(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentIntelligentTieringFilter(v **types.IntelligentTieringFilter, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.IntelligentTieringFilter if *v == nil { sv = &types.IntelligentTieringFilter{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("And", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentIntelligentTieringAndOperator(&sv.And, nodeDecoder); err != nil { return err } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Tag", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTag(&sv.Tag, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInvalidObjectState(v **types.InvalidObjectState, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InvalidObjectState if *v == nil { sv = &types.InvalidObjectState{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccessTier", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.AccessTier = types.IntelligentTieringAccessTier(xtv) } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.StorageClass(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInvalidRequest(v **types.InvalidRequest, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InvalidRequest if *v == nil { sv = &types.InvalidRequest{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInvalidWriteOffset(v **types.InvalidWriteOffset, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InvalidWriteOffset if *v == nil { sv = &types.InvalidWriteOffset{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryConfiguration(v **types.InventoryConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InventoryConfiguration if *v == nil { sv = &types.InventoryConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Destination", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInventoryDestination(&sv.Destination, nodeDecoder); err != nil { return err } case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInventoryFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("Id", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Id = ptr.String(xtv) } case strings.EqualFold("IncludedObjectVersions", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.IncludedObjectVersions = types.InventoryIncludedObjectVersions(xtv) } case strings.EqualFold("IsEnabled", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsEnabled to be of type *bool, got %T instead", val) } sv.IsEnabled = ptr.Bool(xtv) } case strings.EqualFold("OptionalFields", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInventoryOptionalFields(&sv.OptionalFields, nodeDecoder); err != nil { return err } case strings.EqualFold("Schedule", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInventorySchedule(&sv.Schedule, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryConfigurationList(v *[]types.InventoryConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.InventoryConfiguration if *v == nil { sv = make([]types.InventoryConfiguration, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.InventoryConfiguration nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentInventoryConfiguration(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryConfigurationListUnwrapped(v *[]types.InventoryConfiguration, decoder smithyxml.NodeDecoder) error { var sv []types.InventoryConfiguration if *v == nil { sv = make([]types.InventoryConfiguration, 0) } else { sv = *v } switch { default: var mv types.InventoryConfiguration t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentInventoryConfiguration(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryDestination(v **types.InventoryDestination, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InventoryDestination if *v == nil { sv = &types.InventoryDestination{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("S3BucketDestination", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInventoryS3BucketDestination(&sv.S3BucketDestination, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryEncryption(v **types.InventoryEncryption, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InventoryEncryption if *v == nil { sv = &types.InventoryEncryption{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("SSE-KMS", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentSSEKMS(&sv.SSEKMS, nodeDecoder); err != nil { return err } case strings.EqualFold("SSE-S3", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentSSES3(&sv.SSES3, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryFilter(v **types.InventoryFilter, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InventoryFilter if *v == nil { sv = &types.InventoryFilter{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryOptionalFields(v *[]types.InventoryOptionalField, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.InventoryOptionalField if *v == nil { sv = make([]types.InventoryOptionalField, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } memberDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) decoder = memberDecoder switch { case strings.EqualFold("Field", t.Name.Local): var col types.InventoryOptionalField val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) col = types.InventoryOptionalField(xtv) } sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryOptionalFieldsUnwrapped(v *[]types.InventoryOptionalField, decoder smithyxml.NodeDecoder) error { var sv []types.InventoryOptionalField if *v == nil { sv = make([]types.InventoryOptionalField, 0) } else { sv = *v } switch { default: var mv types.InventoryOptionalField t := decoder.StartEl _ = t val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = types.InventoryOptionalField(xtv) } sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentInventoryS3BucketDestination(v **types.InventoryS3BucketDestination, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InventoryS3BucketDestination if *v == nil { sv = &types.InventoryS3BucketDestination{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccountId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.AccountId = ptr.String(xtv) } case strings.EqualFold("Bucket", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Bucket = ptr.String(xtv) } case strings.EqualFold("Encryption", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInventoryEncryption(&sv.Encryption, nodeDecoder); err != nil { return err } case strings.EqualFold("Format", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Format = types.InventoryFormat(xtv) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentInventorySchedule(v **types.InventorySchedule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.InventorySchedule if *v == nil { sv = &types.InventorySchedule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Frequency", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Frequency = types.InventoryFrequency(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentLambdaFunctionConfiguration(v **types.LambdaFunctionConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.LambdaFunctionConfiguration if *v == nil { sv = &types.LambdaFunctionConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Event", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentEventListUnwrapped(&sv.Events, nodeDecoder); err != nil { return err } case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentNotificationConfigurationFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("Id", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Id = ptr.String(xtv) } case strings.EqualFold("CloudFunction", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.LambdaFunctionArn = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentLambdaFunctionConfigurationList(v *[]types.LambdaFunctionConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.LambdaFunctionConfiguration if *v == nil { sv = make([]types.LambdaFunctionConfiguration, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.LambdaFunctionConfiguration nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentLambdaFunctionConfiguration(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentLambdaFunctionConfigurationListUnwrapped(v *[]types.LambdaFunctionConfiguration, decoder smithyxml.NodeDecoder) error { var sv []types.LambdaFunctionConfiguration if *v == nil { sv = make([]types.LambdaFunctionConfiguration, 0) } else { sv = *v } switch { default: var mv types.LambdaFunctionConfiguration t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentLambdaFunctionConfiguration(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentLifecycleExpiration(v **types.LifecycleExpiration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.LifecycleExpiration if *v == nil { sv = &types.LifecycleExpiration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Date", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.Date = ptr.Time(t) } case strings.EqualFold("Days", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Days = ptr.Int32(int32(i64)) } case strings.EqualFold("ExpiredObjectDeleteMarker", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected ExpiredObjectDeleteMarker to be of type *bool, got %T instead", val) } sv.ExpiredObjectDeleteMarker = ptr.Bool(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentLifecycleRule(v **types.LifecycleRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.LifecycleRule if *v == nil { sv = &types.LifecycleRule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AbortIncompleteMultipartUpload", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAbortIncompleteMultipartUpload(&sv.AbortIncompleteMultipartUpload, nodeDecoder); err != nil { return err } case strings.EqualFold("Expiration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentLifecycleExpiration(&sv.Expiration, nodeDecoder); err != nil { return err } case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentLifecycleRuleFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("ID", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ID = ptr.String(xtv) } case strings.EqualFold("NoncurrentVersionExpiration", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentNoncurrentVersionExpiration(&sv.NoncurrentVersionExpiration, nodeDecoder); err != nil { return err } case strings.EqualFold("NoncurrentVersionTransition", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentNoncurrentVersionTransitionListUnwrapped(&sv.NoncurrentVersionTransitions, nodeDecoder); err != nil { return err } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.ExpirationStatus(xtv) } case strings.EqualFold("Transition", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTransitionListUnwrapped(&sv.Transitions, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentLifecycleRuleAndOperator(v **types.LifecycleRuleAndOperator, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.LifecycleRuleAndOperator if *v == nil { sv = &types.LifecycleRuleAndOperator{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ObjectSizeGreaterThan", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.ObjectSizeGreaterThan = ptr.Int64(i64) } case strings.EqualFold("ObjectSizeLessThan", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.ObjectSizeLessThan = ptr.Int64(i64) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Tag", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentLifecycleRuleFilter(v **types.LifecycleRuleFilter, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.LifecycleRuleFilter if *v == nil { sv = &types.LifecycleRuleFilter{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("And", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentLifecycleRuleAndOperator(&sv.And, nodeDecoder); err != nil { return err } case strings.EqualFold("ObjectSizeGreaterThan", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.ObjectSizeGreaterThan = ptr.Int64(i64) } case strings.EqualFold("ObjectSizeLessThan", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.ObjectSizeLessThan = ptr.Int64(i64) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Tag", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTag(&sv.Tag, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentLifecycleRules(v *[]types.LifecycleRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.LifecycleRule if *v == nil { sv = make([]types.LifecycleRule, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.LifecycleRule nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentLifecycleRule(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentLifecycleRulesUnwrapped(v *[]types.LifecycleRule, decoder smithyxml.NodeDecoder) error { var sv []types.LifecycleRule if *v == nil { sv = make([]types.LifecycleRule, 0) } else { sv = *v } switch { default: var mv types.LifecycleRule t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentLifecycleRule(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentLoggingEnabled(v **types.LoggingEnabled, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.LoggingEnabled if *v == nil { sv = &types.LoggingEnabled{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("TargetBucket", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.TargetBucket = ptr.String(xtv) } case strings.EqualFold("TargetGrants", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTargetGrants(&sv.TargetGrants, nodeDecoder); err != nil { return err } case strings.EqualFold("TargetObjectKeyFormat", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTargetObjectKeyFormat(&sv.TargetObjectKeyFormat, nodeDecoder); err != nil { return err } case strings.EqualFold("TargetPrefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.TargetPrefix = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentMetadataTableConfigurationResult(v **types.MetadataTableConfigurationResult, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.MetadataTableConfigurationResult if *v == nil { sv = &types.MetadataTableConfigurationResult{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("S3TablesDestinationResult", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentS3TablesDestinationResult(&sv.S3TablesDestinationResult, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentMetrics(v **types.Metrics, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Metrics if *v == nil { sv = &types.Metrics{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("EventThreshold", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentReplicationTimeValue(&sv.EventThreshold, nodeDecoder); err != nil { return err } case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.MetricsStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentMetricsAndOperator(v **types.MetricsAndOperator, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.MetricsAndOperator if *v == nil { sv = &types.MetricsAndOperator{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccessPointArn", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.AccessPointArn = ptr.String(xtv) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Tag", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentMetricsConfiguration(v **types.MetricsConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.MetricsConfiguration if *v == nil { sv = &types.MetricsConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentMetricsFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("Id", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Id = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentMetricsConfigurationList(v *[]types.MetricsConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.MetricsConfiguration if *v == nil { sv = make([]types.MetricsConfiguration, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.MetricsConfiguration nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentMetricsConfiguration(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentMetricsConfigurationListUnwrapped(v *[]types.MetricsConfiguration, decoder smithyxml.NodeDecoder) error { var sv []types.MetricsConfiguration if *v == nil { sv = make([]types.MetricsConfiguration, 0) } else { sv = *v } switch { default: var mv types.MetricsConfiguration t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentMetricsConfiguration(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentMetricsFilter(v *types.MetricsFilter, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var uv types.MetricsFilter var memberFound bool for { t, done, err := decoder.Token() if err != nil { return err } if done { break } if memberFound { if err = decoder.Decoder.Skip(); err != nil { return err } } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccessPointArn", t.Name.Local): var mv string val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = xtv } uv = &types.MetricsFilterMemberAccessPointArn{Value: mv} memberFound = true case strings.EqualFold("And", t.Name.Local): var mv types.MetricsAndOperator nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentMetricsAndOperator(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr uv = &types.MetricsFilterMemberAnd{Value: mv} memberFound = true case strings.EqualFold("Prefix", t.Name.Local): var mv string val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) mv = xtv } uv = &types.MetricsFilterMemberPrefix{Value: mv} memberFound = true case strings.EqualFold("Tag", t.Name.Local): var mv types.Tag nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentTag(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr uv = &types.MetricsFilterMemberTag{Value: mv} memberFound = true default: uv = &types.UnknownUnionMember{Tag: t.Name.Local} memberFound = true } decoder = originalDecoder } *v = uv return nil } func awsRestxml_deserializeDocumentMultipartUpload(v **types.MultipartUpload, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.MultipartUpload if *v == nil { sv = &types.MultipartUpload{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ChecksumAlgorithm", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumAlgorithm = types.ChecksumAlgorithm(xtv) } case strings.EqualFold("ChecksumType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumType = types.ChecksumType(xtv) } case strings.EqualFold("Initiated", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.Initiated = ptr.Time(t) } case strings.EqualFold("Initiator", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentInitiator(&sv.Initiator, nodeDecoder); err != nil { return err } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("Owner", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil { return err } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.StorageClass(xtv) } case strings.EqualFold("UploadId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.UploadId = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentMultipartUploadList(v *[]types.MultipartUpload, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.MultipartUpload if *v == nil { sv = make([]types.MultipartUpload, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.MultipartUpload nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentMultipartUpload(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentMultipartUploadListUnwrapped(v *[]types.MultipartUpload, decoder smithyxml.NodeDecoder) error { var sv []types.MultipartUpload if *v == nil { sv = make([]types.MultipartUpload, 0) } else { sv = *v } switch { default: var mv types.MultipartUpload t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentMultipartUpload(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentNoncurrentVersionExpiration(v **types.NoncurrentVersionExpiration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.NoncurrentVersionExpiration if *v == nil { sv = &types.NoncurrentVersionExpiration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("NewerNoncurrentVersions", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.NewerNoncurrentVersions = ptr.Int32(int32(i64)) } case strings.EqualFold("NoncurrentDays", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.NoncurrentDays = ptr.Int32(int32(i64)) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentNoncurrentVersionTransition(v **types.NoncurrentVersionTransition, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.NoncurrentVersionTransition if *v == nil { sv = &types.NoncurrentVersionTransition{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("NewerNoncurrentVersions", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.NewerNoncurrentVersions = ptr.Int32(int32(i64)) } case strings.EqualFold("NoncurrentDays", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.NoncurrentDays = ptr.Int32(int32(i64)) } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.TransitionStorageClass(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentNoncurrentVersionTransitionList(v *[]types.NoncurrentVersionTransition, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.NoncurrentVersionTransition if *v == nil { sv = make([]types.NoncurrentVersionTransition, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.NoncurrentVersionTransition nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentNoncurrentVersionTransition(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentNoncurrentVersionTransitionListUnwrapped(v *[]types.NoncurrentVersionTransition, decoder smithyxml.NodeDecoder) error { var sv []types.NoncurrentVersionTransition if *v == nil { sv = make([]types.NoncurrentVersionTransition, 0) } else { sv = *v } switch { default: var mv types.NoncurrentVersionTransition t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentNoncurrentVersionTransition(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentNoSuchBucket(v **types.NoSuchBucket, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.NoSuchBucket if *v == nil { sv = &types.NoSuchBucket{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentNoSuchKey(v **types.NoSuchKey, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.NoSuchKey if *v == nil { sv = &types.NoSuchKey{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentNoSuchUpload(v **types.NoSuchUpload, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.NoSuchUpload if *v == nil { sv = &types.NoSuchUpload{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentNotFound(v **types.NotFound, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.NotFound if *v == nil { sv = &types.NotFound{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentNotificationConfigurationFilter(v **types.NotificationConfigurationFilter, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.NotificationConfigurationFilter if *v == nil { sv = &types.NotificationConfigurationFilter{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("S3Key", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentS3KeyFilter(&sv.Key, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObject(v **types.Object, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Object if *v == nil { sv = &types.Object{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ChecksumAlgorithm", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentChecksumAlgorithmListUnwrapped(&sv.ChecksumAlgorithm, nodeDecoder); err != nil { return err } case strings.EqualFold("ChecksumType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumType = types.ChecksumType(xtv) } case strings.EqualFold("ETag", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ETag = ptr.String(xtv) } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("LastModified", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.LastModified = ptr.Time(t) } case strings.EqualFold("Owner", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil { return err } case strings.EqualFold("RestoreStatus", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentRestoreStatus(&sv.RestoreStatus, nodeDecoder); err != nil { return err } case strings.EqualFold("Size", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Size = ptr.Int64(i64) } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.ObjectStorageClass(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectAlreadyInActiveTierError(v **types.ObjectAlreadyInActiveTierError, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ObjectAlreadyInActiveTierError if *v == nil { sv = &types.ObjectAlreadyInActiveTierError{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectList(v *[]types.Object, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Object if *v == nil { sv = make([]types.Object, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.Object nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentObject(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectListUnwrapped(v *[]types.Object, decoder smithyxml.NodeDecoder) error { var sv []types.Object if *v == nil { sv = make([]types.Object, 0) } else { sv = *v } switch { default: var mv types.Object t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentObject(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentObjectLockConfiguration(v **types.ObjectLockConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ObjectLockConfiguration if *v == nil { sv = &types.ObjectLockConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ObjectLockEnabled", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ObjectLockEnabled = types.ObjectLockEnabled(xtv) } case strings.EqualFold("Rule", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentObjectLockRule(&sv.Rule, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectLockLegalHold(v **types.ObjectLockLegalHold, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ObjectLockLegalHold if *v == nil { sv = &types.ObjectLockLegalHold{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.ObjectLockLegalHoldStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectLockRetention(v **types.ObjectLockRetention, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ObjectLockRetention if *v == nil { sv = &types.ObjectLockRetention{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Mode", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Mode = types.ObjectLockRetentionMode(xtv) } case strings.EqualFold("RetainUntilDate", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.RetainUntilDate = ptr.Time(t) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectLockRule(v **types.ObjectLockRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ObjectLockRule if *v == nil { sv = &types.ObjectLockRule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("DefaultRetention", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentDefaultRetention(&sv.DefaultRetention, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectNotInActiveTierError(v **types.ObjectNotInActiveTierError, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ObjectNotInActiveTierError if *v == nil { sv = &types.ObjectNotInActiveTierError{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectPart(v **types.ObjectPart, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ObjectPart if *v == nil { sv = &types.ObjectPart{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ChecksumCRC32", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32 = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC32C", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32C = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC64NVME", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC64NVME = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA1", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA1 = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA256", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA256 = ptr.String(xtv) } case strings.EqualFold("PartNumber", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.PartNumber = ptr.Int32(int32(i64)) } case strings.EqualFold("Size", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Size = ptr.Int64(i64) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectVersion(v **types.ObjectVersion, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ObjectVersion if *v == nil { sv = &types.ObjectVersion{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ChecksumAlgorithm", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentChecksumAlgorithmListUnwrapped(&sv.ChecksumAlgorithm, nodeDecoder); err != nil { return err } case strings.EqualFold("ChecksumType", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumType = types.ChecksumType(xtv) } case strings.EqualFold("ETag", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ETag = ptr.String(xtv) } case strings.EqualFold("IsLatest", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsLatest to be of type *bool, got %T instead", val) } sv.IsLatest = ptr.Bool(xtv) } case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("LastModified", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.LastModified = ptr.Time(t) } case strings.EqualFold("Owner", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwner(&sv.Owner, nodeDecoder); err != nil { return err } case strings.EqualFold("RestoreStatus", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentRestoreStatus(&sv.RestoreStatus, nodeDecoder); err != nil { return err } case strings.EqualFold("Size", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Size = ptr.Int64(i64) } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.ObjectVersionStorageClass(xtv) } case strings.EqualFold("VersionId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.VersionId = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectVersionList(v *[]types.ObjectVersion, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.ObjectVersion if *v == nil { sv = make([]types.ObjectVersion, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.ObjectVersion nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentObjectVersion(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentObjectVersionListUnwrapped(v *[]types.ObjectVersion, decoder smithyxml.NodeDecoder) error { var sv []types.ObjectVersion if *v == nil { sv = make([]types.ObjectVersion, 0) } else { sv = *v } switch { default: var mv types.ObjectVersion t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentObjectVersion(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentOwner(v **types.Owner, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Owner if *v == nil { sv = &types.Owner{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("DisplayName", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.DisplayName = ptr.String(xtv) } case strings.EqualFold("ID", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ID = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentOwnershipControls(v **types.OwnershipControls, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.OwnershipControls if *v == nil { sv = &types.OwnershipControls{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Rule", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentOwnershipControlsRulesUnwrapped(&sv.Rules, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentOwnershipControlsRule(v **types.OwnershipControlsRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.OwnershipControlsRule if *v == nil { sv = &types.OwnershipControlsRule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ObjectOwnership", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ObjectOwnership = types.ObjectOwnership(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentOwnershipControlsRules(v *[]types.OwnershipControlsRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.OwnershipControlsRule if *v == nil { sv = make([]types.OwnershipControlsRule, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.OwnershipControlsRule nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentOwnershipControlsRule(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentOwnershipControlsRulesUnwrapped(v *[]types.OwnershipControlsRule, decoder smithyxml.NodeDecoder) error { var sv []types.OwnershipControlsRule if *v == nil { sv = make([]types.OwnershipControlsRule, 0) } else { sv = *v } switch { default: var mv types.OwnershipControlsRule t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentOwnershipControlsRule(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentPart(v **types.Part, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Part if *v == nil { sv = &types.Part{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ChecksumCRC32", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32 = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC32C", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC32C = ptr.String(xtv) } case strings.EqualFold("ChecksumCRC64NVME", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumCRC64NVME = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA1", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA1 = ptr.String(xtv) } case strings.EqualFold("ChecksumSHA256", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ChecksumSHA256 = ptr.String(xtv) } case strings.EqualFold("ETag", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ETag = ptr.String(xtv) } case strings.EqualFold("LastModified", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.LastModified = ptr.Time(t) } case strings.EqualFold("PartNumber", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.PartNumber = ptr.Int32(int32(i64)) } case strings.EqualFold("Size", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Size = ptr.Int64(i64) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentPartitionedPrefix(v **types.PartitionedPrefix, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.PartitionedPrefix if *v == nil { sv = &types.PartitionedPrefix{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("PartitionDateSource", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.PartitionDateSource = types.PartitionDateSource(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentParts(v *[]types.Part, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Part if *v == nil { sv = make([]types.Part, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.Part nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentPart(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentPartsUnwrapped(v *[]types.Part, decoder smithyxml.NodeDecoder) error { var sv []types.Part if *v == nil { sv = make([]types.Part, 0) } else { sv = *v } switch { default: var mv types.Part t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentPart(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentPartsList(v *[]types.ObjectPart, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.ObjectPart if *v == nil { sv = make([]types.ObjectPart, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.ObjectPart nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentObjectPart(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentPartsListUnwrapped(v *[]types.ObjectPart, decoder smithyxml.NodeDecoder) error { var sv []types.ObjectPart if *v == nil { sv = make([]types.ObjectPart, 0) } else { sv = *v } switch { default: var mv types.ObjectPart t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentObjectPart(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentPolicyStatus(v **types.PolicyStatus, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.PolicyStatus if *v == nil { sv = &types.PolicyStatus{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("IsPublic", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsPublic to be of type *bool, got %T instead", val) } sv.IsPublic = ptr.Bool(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentPublicAccessBlockConfiguration(v **types.PublicAccessBlockConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.PublicAccessBlockConfiguration if *v == nil { sv = &types.PublicAccessBlockConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("BlockPublicAcls", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected Setting to be of type *bool, got %T instead", val) } sv.BlockPublicAcls = ptr.Bool(xtv) } case strings.EqualFold("BlockPublicPolicy", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected Setting to be of type *bool, got %T instead", val) } sv.BlockPublicPolicy = ptr.Bool(xtv) } case strings.EqualFold("IgnorePublicAcls", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected Setting to be of type *bool, got %T instead", val) } sv.IgnorePublicAcls = ptr.Bool(xtv) } case strings.EqualFold("RestrictPublicBuckets", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected Setting to be of type *bool, got %T instead", val) } sv.RestrictPublicBuckets = ptr.Bool(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentQueueConfiguration(v **types.QueueConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.QueueConfiguration if *v == nil { sv = &types.QueueConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Event", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentEventListUnwrapped(&sv.Events, nodeDecoder); err != nil { return err } case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentNotificationConfigurationFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("Id", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Id = ptr.String(xtv) } case strings.EqualFold("Queue", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.QueueArn = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentQueueConfigurationList(v *[]types.QueueConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.QueueConfiguration if *v == nil { sv = make([]types.QueueConfiguration, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.QueueConfiguration nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentQueueConfiguration(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentQueueConfigurationListUnwrapped(v *[]types.QueueConfiguration, decoder smithyxml.NodeDecoder) error { var sv []types.QueueConfiguration if *v == nil { sv = make([]types.QueueConfiguration, 0) } else { sv = *v } switch { default: var mv types.QueueConfiguration t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentQueueConfiguration(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentRedirect(v **types.Redirect, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Redirect if *v == nil { sv = &types.Redirect{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("HostName", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.HostName = ptr.String(xtv) } case strings.EqualFold("HttpRedirectCode", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.HttpRedirectCode = ptr.String(xtv) } case strings.EqualFold("Protocol", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Protocol = types.Protocol(xtv) } case strings.EqualFold("ReplaceKeyPrefixWith", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ReplaceKeyPrefixWith = ptr.String(xtv) } case strings.EqualFold("ReplaceKeyWith", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ReplaceKeyWith = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentRedirectAllRequestsTo(v **types.RedirectAllRequestsTo, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.RedirectAllRequestsTo if *v == nil { sv = &types.RedirectAllRequestsTo{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("HostName", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.HostName = ptr.String(xtv) } case strings.EqualFold("Protocol", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Protocol = types.Protocol(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentReplicaModifications(v **types.ReplicaModifications, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ReplicaModifications if *v == nil { sv = &types.ReplicaModifications{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.ReplicaModificationsStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentReplicationConfiguration(v **types.ReplicationConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ReplicationConfiguration if *v == nil { sv = &types.ReplicationConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Role", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Role = ptr.String(xtv) } case strings.EqualFold("Rule", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentReplicationRulesUnwrapped(&sv.Rules, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentReplicationRule(v **types.ReplicationRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ReplicationRule if *v == nil { sv = &types.ReplicationRule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("DeleteMarkerReplication", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentDeleteMarkerReplication(&sv.DeleteMarkerReplication, nodeDecoder); err != nil { return err } case strings.EqualFold("Destination", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentDestination(&sv.Destination, nodeDecoder); err != nil { return err } case strings.EqualFold("ExistingObjectReplication", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentExistingObjectReplication(&sv.ExistingObjectReplication, nodeDecoder); err != nil { return err } case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentReplicationRuleFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("ID", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.ID = ptr.String(xtv) } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Priority", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Priority = ptr.Int32(int32(i64)) } case strings.EqualFold("SourceSelectionCriteria", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentSourceSelectionCriteria(&sv.SourceSelectionCriteria, nodeDecoder); err != nil { return err } case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.ReplicationRuleStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentReplicationRuleAndOperator(v **types.ReplicationRuleAndOperator, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ReplicationRuleAndOperator if *v == nil { sv = &types.ReplicationRuleAndOperator{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Tag", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTagSetUnwrapped(&sv.Tags, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentReplicationRuleFilter(v **types.ReplicationRuleFilter, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ReplicationRuleFilter if *v == nil { sv = &types.ReplicationRuleFilter{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("And", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentReplicationRuleAndOperator(&sv.And, nodeDecoder); err != nil { return err } case strings.EqualFold("Prefix", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Prefix = ptr.String(xtv) } case strings.EqualFold("Tag", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentTag(&sv.Tag, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentReplicationRules(v *[]types.ReplicationRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.ReplicationRule if *v == nil { sv = make([]types.ReplicationRule, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.ReplicationRule nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentReplicationRule(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentReplicationRulesUnwrapped(v *[]types.ReplicationRule, decoder smithyxml.NodeDecoder) error { var sv []types.ReplicationRule if *v == nil { sv = make([]types.ReplicationRule, 0) } else { sv = *v } switch { default: var mv types.ReplicationRule t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentReplicationRule(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentReplicationTime(v **types.ReplicationTime, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ReplicationTime if *v == nil { sv = &types.ReplicationTime{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.ReplicationTimeStatus(xtv) } case strings.EqualFold("Time", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentReplicationTimeValue(&sv.Time, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentReplicationTimeValue(v **types.ReplicationTimeValue, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ReplicationTimeValue if *v == nil { sv = &types.ReplicationTimeValue{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Minutes", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Minutes = ptr.Int32(int32(i64)) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentRestoreStatus(v **types.RestoreStatus, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.RestoreStatus if *v == nil { sv = &types.RestoreStatus{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("IsRestoreInProgress", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected IsRestoreInProgress to be of type *bool, got %T instead", val) } sv.IsRestoreInProgress = ptr.Bool(xtv) } case strings.EqualFold("RestoreExpiryDate", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.RestoreExpiryDate = ptr.Time(t) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentRoutingRule(v **types.RoutingRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.RoutingRule if *v == nil { sv = &types.RoutingRule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Condition", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentCondition(&sv.Condition, nodeDecoder); err != nil { return err } case strings.EqualFold("Redirect", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentRedirect(&sv.Redirect, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentRoutingRules(v *[]types.RoutingRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.RoutingRule if *v == nil { sv = make([]types.RoutingRule, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("RoutingRule", t.Name.Local): var col types.RoutingRule nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentRoutingRule(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentRoutingRulesUnwrapped(v *[]types.RoutingRule, decoder smithyxml.NodeDecoder) error { var sv []types.RoutingRule if *v == nil { sv = make([]types.RoutingRule, 0) } else { sv = *v } switch { default: var mv types.RoutingRule t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentRoutingRule(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentS3KeyFilter(v **types.S3KeyFilter, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.S3KeyFilter if *v == nil { sv = &types.S3KeyFilter{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("FilterRule", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentFilterRuleListUnwrapped(&sv.FilterRules, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentS3TablesDestinationResult(v **types.S3TablesDestinationResult, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.S3TablesDestinationResult if *v == nil { sv = &types.S3TablesDestinationResult{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("TableArn", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.TableArn = ptr.String(xtv) } case strings.EqualFold("TableBucketArn", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.TableBucketArn = ptr.String(xtv) } case strings.EqualFold("TableName", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.TableName = ptr.String(xtv) } case strings.EqualFold("TableNamespace", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.TableNamespace = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentServerSideEncryptionByDefault(v **types.ServerSideEncryptionByDefault, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ServerSideEncryptionByDefault if *v == nil { sv = &types.ServerSideEncryptionByDefault{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("KMSMasterKeyID", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.KMSMasterKeyID = ptr.String(xtv) } case strings.EqualFold("SSEAlgorithm", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.SSEAlgorithm = types.ServerSideEncryption(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentServerSideEncryptionConfiguration(v **types.ServerSideEncryptionConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ServerSideEncryptionConfiguration if *v == nil { sv = &types.ServerSideEncryptionConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Rule", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentServerSideEncryptionRulesUnwrapped(&sv.Rules, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentServerSideEncryptionRule(v **types.ServerSideEncryptionRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.ServerSideEncryptionRule if *v == nil { sv = &types.ServerSideEncryptionRule{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ApplyServerSideEncryptionByDefault", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentServerSideEncryptionByDefault(&sv.ApplyServerSideEncryptionByDefault, nodeDecoder); err != nil { return err } case strings.EqualFold("BucketKeyEnabled", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv, err := strconv.ParseBool(string(val)) if err != nil { return fmt.Errorf("expected BucketKeyEnabled to be of type *bool, got %T instead", val) } sv.BucketKeyEnabled = ptr.Bool(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentServerSideEncryptionRules(v *[]types.ServerSideEncryptionRule, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.ServerSideEncryptionRule if *v == nil { sv = make([]types.ServerSideEncryptionRule, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.ServerSideEncryptionRule nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentServerSideEncryptionRule(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentServerSideEncryptionRulesUnwrapped(v *[]types.ServerSideEncryptionRule, decoder smithyxml.NodeDecoder) error { var sv []types.ServerSideEncryptionRule if *v == nil { sv = make([]types.ServerSideEncryptionRule, 0) } else { sv = *v } switch { default: var mv types.ServerSideEncryptionRule t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentServerSideEncryptionRule(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentSessionCredentials(v **types.SessionCredentials, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.SessionCredentials if *v == nil { sv = &types.SessionCredentials{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccessKeyId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.AccessKeyId = ptr.String(xtv) } case strings.EqualFold("Expiration", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.Expiration = ptr.Time(t) } case strings.EqualFold("SecretAccessKey", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.SecretAccessKey = ptr.String(xtv) } case strings.EqualFold("SessionToken", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.SessionToken = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentSimplePrefix(v **types.SimplePrefix, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.SimplePrefix if *v == nil { sv = &types.SimplePrefix{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentSourceSelectionCriteria(v **types.SourceSelectionCriteria, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.SourceSelectionCriteria if *v == nil { sv = &types.SourceSelectionCriteria{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("ReplicaModifications", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentReplicaModifications(&sv.ReplicaModifications, nodeDecoder); err != nil { return err } case strings.EqualFold("SseKmsEncryptedObjects", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentSseKmsEncryptedObjects(&sv.SseKmsEncryptedObjects, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentSSEKMS(v **types.SSEKMS, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.SSEKMS if *v == nil { sv = &types.SSEKMS{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("KeyId", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.KeyId = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentSseKmsEncryptedObjects(v **types.SseKmsEncryptedObjects, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.SseKmsEncryptedObjects if *v == nil { sv = &types.SseKmsEncryptedObjects{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Status", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Status = types.SseKmsEncryptedObjectsStatus(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentSSES3(v **types.SSES3, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.SSES3 if *v == nil { sv = &types.SSES3{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentStorageClassAnalysis(v **types.StorageClassAnalysis, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.StorageClassAnalysis if *v == nil { sv = &types.StorageClassAnalysis{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("DataExport", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentStorageClassAnalysisDataExport(&sv.DataExport, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentStorageClassAnalysisDataExport(v **types.StorageClassAnalysisDataExport, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.StorageClassAnalysisDataExport if *v == nil { sv = &types.StorageClassAnalysisDataExport{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Destination", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentAnalyticsExportDestination(&sv.Destination, nodeDecoder); err != nil { return err } case strings.EqualFold("OutputSchemaVersion", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.OutputSchemaVersion = types.StorageClassAnalysisSchemaVersion(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTag(v **types.Tag, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Tag if *v == nil { sv = &types.Tag{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Key", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Key = ptr.String(xtv) } case strings.EqualFold("Value", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Value = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTagSet(v *[]types.Tag, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Tag if *v == nil { sv = make([]types.Tag, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("Tag", t.Name.Local): var col types.Tag nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentTag(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTagSetUnwrapped(v *[]types.Tag, decoder smithyxml.NodeDecoder) error { var sv []types.Tag if *v == nil { sv = make([]types.Tag, 0) } else { sv = *v } switch { default: var mv types.Tag t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentTag(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentTargetGrant(v **types.TargetGrant, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.TargetGrant if *v == nil { sv = &types.TargetGrant{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Grantee", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentGrantee(&sv.Grantee, nodeDecoder); err != nil { return err } case strings.EqualFold("Permission", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Permission = types.BucketLogsPermission(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTargetGrants(v *[]types.TargetGrant, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.TargetGrant if *v == nil { sv = make([]types.TargetGrant, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("Grant", t.Name.Local): var col types.TargetGrant nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentTargetGrant(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTargetGrantsUnwrapped(v *[]types.TargetGrant, decoder smithyxml.NodeDecoder) error { var sv []types.TargetGrant if *v == nil { sv = make([]types.TargetGrant, 0) } else { sv = *v } switch { default: var mv types.TargetGrant t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentTargetGrant(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentTargetObjectKeyFormat(v **types.TargetObjectKeyFormat, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.TargetObjectKeyFormat if *v == nil { sv = &types.TargetObjectKeyFormat{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("PartitionedPrefix", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentPartitionedPrefix(&sv.PartitionedPrefix, nodeDecoder); err != nil { return err } case strings.EqualFold("SimplePrefix", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentSimplePrefix(&sv.SimplePrefix, nodeDecoder); err != nil { return err } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTiering(v **types.Tiering, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Tiering if *v == nil { sv = &types.Tiering{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("AccessTier", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.AccessTier = types.IntelligentTieringAccessTier(xtv) } case strings.EqualFold("Days", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Days = ptr.Int32(int32(i64)) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTieringList(v *[]types.Tiering, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Tiering if *v == nil { sv = make([]types.Tiering, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.Tiering nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentTiering(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTieringListUnwrapped(v *[]types.Tiering, decoder smithyxml.NodeDecoder) error { var sv []types.Tiering if *v == nil { sv = make([]types.Tiering, 0) } else { sv = *v } switch { default: var mv types.Tiering t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentTiering(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentTooManyParts(v **types.TooManyParts, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.TooManyParts if *v == nil { sv = &types.TooManyParts{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTopicConfiguration(v **types.TopicConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.TopicConfiguration if *v == nil { sv = &types.TopicConfiguration{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Event", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentEventListUnwrapped(&sv.Events, nodeDecoder); err != nil { return err } case strings.EqualFold("Filter", t.Name.Local): nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) if err := awsRestxml_deserializeDocumentNotificationConfigurationFilter(&sv.Filter, nodeDecoder); err != nil { return err } case strings.EqualFold("Id", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.Id = ptr.String(xtv) } case strings.EqualFold("Topic", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.TopicArn = ptr.String(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTopicConfigurationList(v *[]types.TopicConfiguration, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.TopicConfiguration if *v == nil { sv = make([]types.TopicConfiguration, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.TopicConfiguration nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentTopicConfiguration(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTopicConfigurationListUnwrapped(v *[]types.TopicConfiguration, decoder smithyxml.NodeDecoder) error { var sv []types.TopicConfiguration if *v == nil { sv = make([]types.TopicConfiguration, 0) } else { sv = *v } switch { default: var mv types.TopicConfiguration t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentTopicConfiguration(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } func awsRestxml_deserializeDocumentTransition(v **types.Transition, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv *types.Transition if *v == nil { sv = &types.Transition{} } else { sv = *v } for { t, done, err := decoder.Token() if err != nil { return err } if done { break } originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { case strings.EqualFold("Date", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) t, err := smithytime.ParseDateTime(xtv) if err != nil { return err } sv.Date = ptr.Time(t) } case strings.EqualFold("Days", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) i64, err := strconv.ParseInt(xtv, 10, 64) if err != nil { return err } sv.Days = ptr.Int32(int32(i64)) } case strings.EqualFold("StorageClass", t.Name.Local): val, err := decoder.Value() if err != nil { return err } if val == nil { break } { xtv := string(val) sv.StorageClass = types.TransitionStorageClass(xtv) } default: // Do nothing and ignore the unexpected tag element err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTransitionList(v *[]types.Transition, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } var sv []types.Transition if *v == nil { sv = make([]types.Transition, 0) } else { sv = *v } originalDecoder := decoder for { t, done, err := decoder.Token() if err != nil { return err } if done { break } switch { case strings.EqualFold("member", t.Name.Local): var col types.Transition nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &col if err := awsRestxml_deserializeDocumentTransition(&destAddr, nodeDecoder); err != nil { return err } col = *destAddr sv = append(sv, col) default: err = decoder.Decoder.Skip() if err != nil { return err } } decoder = originalDecoder } *v = sv return nil } func awsRestxml_deserializeDocumentTransitionListUnwrapped(v *[]types.Transition, decoder smithyxml.NodeDecoder) error { var sv []types.Transition if *v == nil { sv = make([]types.Transition, 0) } else { sv = *v } switch { default: var mv types.Transition t := decoder.StartEl _ = t nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) destAddr := &mv if err := awsRestxml_deserializeDocumentTransition(&destAddr, nodeDecoder); err != nil { return err } mv = *destAddr sv = append(sv, mv) } *v = sv return nil } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/doc.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. // Package s3 provides the API client, operations, and parameter types for Amazon // Simple Storage Service. package s3 ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/endpoint_auth_resolver.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/endpoints.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" internalcontext "github.com/aws/aws-sdk-go-v2/internal/context" "github.com/aws/aws-sdk-go-v2/internal/endpoints" "github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn" s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" internalendpoints "github.com/aws/aws-sdk-go-v2/service/s3/internal/endpoints" smithy "github.com/aws/smithy-go" smithyauth "github.com/aws/smithy-go/auth" smithyendpoints "github.com/aws/smithy-go/endpoints" "github.com/aws/smithy-go/endpoints/private/rulesfn" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" "github.com/aws/smithy-go/tracing" smithyhttp "github.com/aws/smithy-go/transport/http" "net/http" "net/url" "os" "strings" ) // EndpointResolverOptions is the service endpoint resolver options type EndpointResolverOptions = internalendpoints.Options // EndpointResolver interface for resolving service endpoints. type EndpointResolver interface { ResolveEndpoint(region string, options EndpointResolverOptions) (aws.Endpoint, error) } var _ EndpointResolver = &internalendpoints.Resolver{} // NewDefaultEndpointResolver constructs a new service endpoint resolver func NewDefaultEndpointResolver() *internalendpoints.Resolver { return internalendpoints.New() } // EndpointResolverFunc is a helper utility that wraps a function so it satisfies // the EndpointResolver interface. This is useful when you want to add additional // endpoint resolving logic, or stub out specific endpoints with custom values. type EndpointResolverFunc func(region string, options EndpointResolverOptions) (aws.Endpoint, error) func (fn EndpointResolverFunc) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { return fn(region, options) } // EndpointResolverFromURL returns an EndpointResolver configured using the // provided endpoint url. By default, the resolved endpoint resolver uses the // client region as signing region, and the endpoint source is set to // EndpointSourceCustom.You can provide functional options to configure endpoint // values for the resolved endpoint. func EndpointResolverFromURL(url string, optFns ...func(*aws.Endpoint)) EndpointResolver { e := aws.Endpoint{URL: url, Source: aws.EndpointSourceCustom} for _, fn := range optFns { fn(&e) } return EndpointResolverFunc( func(region string, options EndpointResolverOptions) (aws.Endpoint, error) { if len(e.SigningRegion) == 0 { e.SigningRegion = region } return e, nil }, ) } type ResolveEndpoint struct { Resolver EndpointResolver Options EndpointResolverOptions } func (*ResolveEndpoint) ID() string { return "ResolveEndpoint" } func (m *ResolveEndpoint) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( out middleware.SerializeOutput, metadata middleware.Metadata, err error, ) { if !awsmiddleware.GetRequiresLegacyEndpoints(ctx) { return next.HandleSerialize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.Resolver == nil { return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } eo := m.Options eo.Logger = middleware.GetLogger(ctx) var endpoint aws.Endpoint endpoint, err = m.Resolver.ResolveEndpoint(awsmiddleware.GetRegion(ctx), eo) if err != nil { nf := (&aws.EndpointNotFoundError{}) if errors.As(err, &nf) { ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, false) return next.HandleSerialize(ctx, in) } return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) } req.URL, err = url.Parse(endpoint.URL) if err != nil { return out, metadata, fmt.Errorf("failed to parse endpoint URL: %w", err) } if len(awsmiddleware.GetSigningName(ctx)) == 0 { signingName := endpoint.SigningName if len(signingName) == 0 { signingName = "s3" } ctx = awsmiddleware.SetSigningName(ctx, signingName) } ctx = awsmiddleware.SetEndpointSource(ctx, endpoint.Source) ctx = smithyhttp.SetHostnameImmutable(ctx, endpoint.HostnameImmutable) ctx = awsmiddleware.SetSigningRegion(ctx, endpoint.SigningRegion) ctx = awsmiddleware.SetPartitionID(ctx, endpoint.PartitionID) return next.HandleSerialize(ctx, in) } func addResolveEndpointMiddleware(stack *middleware.Stack, o Options) error { return stack.Serialize.Insert(&ResolveEndpoint{ Resolver: o.EndpointResolver, Options: o.EndpointOptions, }, "OperationSerializer", middleware.Before) } func removeResolveEndpointMiddleware(stack *middleware.Stack) error { _, err := stack.Serialize.Remove((&ResolveEndpoint{}).ID()) return err } type wrappedEndpointResolver struct { awsResolver aws.EndpointResolverWithOptions } func (w *wrappedEndpointResolver) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { return w.awsResolver.ResolveEndpoint(ServiceID, region, options) } type awsEndpointResolverAdaptor func(service, region string) (aws.Endpoint, error) func (a awsEndpointResolverAdaptor) ResolveEndpoint(service, region string, options ...interface{}) (aws.Endpoint, error) { return a(service, region) } var _ aws.EndpointResolverWithOptions = awsEndpointResolverAdaptor(nil) // withEndpointResolver returns an aws.EndpointResolverWithOptions that first delegates endpoint resolution to the awsResolver. // If awsResolver returns aws.EndpointNotFoundError error, the v1 resolver middleware will swallow the error, // and set an appropriate context flag such that fallback will occur when EndpointResolverV2 is invoked // via its middleware. // // If another error (besides aws.EndpointNotFoundError) is returned, then that error will be propagated. func withEndpointResolver(awsResolver aws.EndpointResolver, awsResolverWithOptions aws.EndpointResolverWithOptions) EndpointResolver { var resolver aws.EndpointResolverWithOptions if awsResolverWithOptions != nil { resolver = awsResolverWithOptions } else if awsResolver != nil { resolver = awsEndpointResolverAdaptor(awsResolver.ResolveEndpoint) } return &wrappedEndpointResolver{ awsResolver: resolver, } } func finalizeClientEndpointResolverOptions(options *Options) { options.EndpointOptions.LogDeprecated = options.ClientLogMode.IsDeprecatedUsage() if len(options.EndpointOptions.ResolvedRegion) == 0 { const fipsInfix = "-fips-" const fipsPrefix = "fips-" const fipsSuffix = "-fips" if strings.Contains(options.Region, fipsInfix) || strings.Contains(options.Region, fipsPrefix) || strings.Contains(options.Region, fipsSuffix) { options.EndpointOptions.ResolvedRegion = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll( options.Region, fipsInfix, "-"), fipsPrefix, ""), fipsSuffix, "") options.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled } } if options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateUnset { if options.UseDualstack { options.EndpointOptions.UseDualStackEndpoint = aws.DualStackEndpointStateEnabled } else { options.EndpointOptions.UseDualStackEndpoint = aws.DualStackEndpointStateDisabled } } } func resolveEndpointResolverV2(options *Options) { if options.EndpointResolverV2 == nil { options.EndpointResolverV2 = NewDefaultEndpointResolverV2() } } func resolveBaseEndpoint(cfg aws.Config, o *Options) { if cfg.BaseEndpoint != nil { o.BaseEndpoint = cfg.BaseEndpoint } _, g := os.LookupEnv("AWS_ENDPOINT_URL") _, s := os.LookupEnv("AWS_ENDPOINT_URL_S3") if g && !s { return } value, found, err := internalConfig.ResolveServiceBaseEndpoint(context.Background(), "S3", cfg.ConfigSources) if found && err == nil { o.BaseEndpoint = &value } } func bindRegion(region string) *string { if region == "" { return nil } return aws.String(endpoints.MapFIPSRegion(region)) } // EndpointParameters provides the parameters that influence how endpoints are // resolved. type EndpointParameters struct { // The S3 bucket used to send the request. This is an optional parameter that will // be set automatically for operations that are scoped to an S3 bucket. // // Parameter // is required. Bucket *string // The AWS region used to dispatch the request. // // Parameter is // required. // // AWS::Region Region *string // When true, send this request to the FIPS-compliant regional endpoint. If the // configured endpoint does not have a FIPS compliant endpoint, dispatching the // request will return an error. // // Defaults to false if no value is // provided. // // AWS::UseFIPS UseFIPS *bool // When true, use the dual-stack endpoint. If the configured endpoint does not // support dual-stack, dispatching the request MAY return an error. // // Defaults to // false if no value is provided. // // AWS::UseDualStack UseDualStack *bool // Override the endpoint used to send this request // // Parameter is // required. // // SDK::Endpoint Endpoint *string // When true, force a path-style endpoint to be used where the bucket name is part // of the path. // // Defaults to false if no value is // provided. // // AWS::S3::ForcePathStyle ForcePathStyle *bool // When true, use S3 Accelerate. NOTE: Not all regions support S3 // accelerate. // // Defaults to false if no value is provided. // // AWS::S3::Accelerate Accelerate *bool // Whether the global endpoint should be used, rather then the regional endpoint // for us-east-1. // // Defaults to false if no value is // provided. // // AWS::S3::UseGlobalEndpoint UseGlobalEndpoint *bool // Internal parameter to use object lambda endpoint for an operation (eg: // WriteGetObjectResponse) // // Parameter is required. UseObjectLambdaEndpoint *bool // The S3 Key used to send the request. This is an optional parameter that will be // set automatically for operations that are scoped to an S3 Key. // // Parameter is // required. Key *string // The S3 Prefix used to send the request. This is an optional parameter that will // be set automatically for operations that are scoped to an S3 Prefix. // // Parameter // is required. Prefix *string // The Copy Source used for Copy Object request. This is an optional parameter that // will be set automatically for operations that are scoped to Copy // Source. // // Parameter is required. CopySource *string // Internal parameter to disable Access Point Buckets // // Parameter is required. DisableAccessPoints *bool // Whether multi-region access points (MRAP) should be disabled. // // Defaults to false // if no value is provided. // // AWS::S3::DisableMultiRegionAccessPoints DisableMultiRegionAccessPoints *bool // When an Access Point ARN is provided and this flag is enabled, the SDK MUST use // the ARN's region when constructing the endpoint instead of the client's // configured region. // // Parameter is required. // // AWS::S3::UseArnRegion UseArnRegion *bool // Internal parameter to indicate whether S3Express operation should use control // plane, (ex. CreateBucket) // // Parameter is required. UseS3ExpressControlEndpoint *bool // Parameter to indicate whether S3Express session auth should be // disabled // // Parameter is required. DisableS3ExpressSessionAuth *bool } // ValidateRequired validates required parameters are set. func (p EndpointParameters) ValidateRequired() error { if p.Accelerate == nil { return fmt.Errorf("parameter Accelerate is required") } if p.DisableMultiRegionAccessPoints == nil { return fmt.Errorf("parameter DisableMultiRegionAccessPoints is required") } if p.ForcePathStyle == nil { return fmt.Errorf("parameter ForcePathStyle is required") } if p.UseDualStack == nil { return fmt.Errorf("parameter UseDualStack is required") } if p.UseFIPS == nil { return fmt.Errorf("parameter UseFIPS is required") } if p.UseGlobalEndpoint == nil { return fmt.Errorf("parameter UseGlobalEndpoint is required") } return nil } // WithDefaults returns a shallow copy of EndpointParameterswith default values // applied to members where applicable. func (p EndpointParameters) WithDefaults() EndpointParameters { if p.Accelerate == nil { p.Accelerate = ptr.Bool(false) } if p.DisableMultiRegionAccessPoints == nil { p.DisableMultiRegionAccessPoints = ptr.Bool(false) } if p.ForcePathStyle == nil { p.ForcePathStyle = ptr.Bool(false) } if p.UseDualStack == nil { p.UseDualStack = ptr.Bool(false) } if p.UseFIPS == nil { p.UseFIPS = ptr.Bool(false) } if p.UseGlobalEndpoint == nil { p.UseGlobalEndpoint = ptr.Bool(false) } return p } type stringSlice []string func (s stringSlice) Get(i int) *string { if i < 0 || i >= len(s) { return nil } v := s[i] return &v } // EndpointResolverV2 provides the interface for resolving service endpoints. type EndpointResolverV2 interface { // ResolveEndpoint attempts to resolve the endpoint with the provided options, // returning the endpoint if found. Otherwise an error is returned. ResolveEndpoint(ctx context.Context, params EndpointParameters) ( smithyendpoints.Endpoint, error, ) } // resolver provides the implementation for resolving endpoints. type resolver struct{} func NewDefaultEndpointResolverV2() EndpointResolverV2 { return &resolver{} } // ResolveEndpoint attempts to resolve the endpoint with the provided options, // returning the endpoint if found. Otherwise an error is returned. func (r *resolver) ResolveEndpoint( ctx context.Context, params EndpointParameters, ) ( endpoint smithyendpoints.Endpoint, err error, ) { params = params.WithDefaults() if err = params.ValidateRequired(); err != nil { return endpoint, fmt.Errorf("endpoint parameters are not valid, %w", err) } _UseFIPS := *params.UseFIPS _UseDualStack := *params.UseDualStack _ForcePathStyle := *params.ForcePathStyle _Accelerate := *params.Accelerate _UseGlobalEndpoint := *params.UseGlobalEndpoint _DisableMultiRegionAccessPoints := *params.DisableMultiRegionAccessPoints if exprVal := params.Region; exprVal != nil { _Region := *exprVal _ = _Region if _Accelerate == true { if _UseFIPS == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Accelerate cannot be used with FIPS") } } if _UseDualStack == true { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint return endpoint, fmt.Errorf("endpoint rule error, %s", "Cannot set dual-stack in combination with a custom endpoint.") } } if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if _UseFIPS == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "A custom endpoint cannot be combined with FIPS") } } if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if _Accelerate == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "A custom endpoint cannot be combined with S3 Accelerate") } } if _UseFIPS == true { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if _partitionResult.Name == "aws-cn" { return endpoint, fmt.Errorf("endpoint rule error, %s", "Partition does not support FIPS") } } } if exprVal := params.Bucket; exprVal != nil { _Bucket := *exprVal _ = _Bucket if exprVal := rulesfn.SubString(_Bucket, 0, 6, true); exprVal != nil { _bucketSuffix := *exprVal _ = _bucketSuffix if _bucketSuffix == "--x-s3" { if _UseDualStack == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express does not support Dual-stack.") } if _Accelerate == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express does not support S3 Accelerate.") } if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if exprVal := params.DisableS3ExpressSessionAuth; exprVal != nil { _DisableS3ExpressSessionAuth := *exprVal _ = _DisableS3ExpressSessionAuth if _DisableS3ExpressSessionAuth == true { if _url.IsIp == true { _uri_encoded_bucket := rulesfn.URIEncode(_Bucket) _ = _uri_encoded_bucket uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString("/") out.WriteString(_uri_encoded_bucket) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } if awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express bucket name is not a valid virtual hostable name.") } } if _url.IsIp == true { _uri_encoded_bucket := rulesfn.URIEncode(_Bucket) _ = _uri_encoded_bucket uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString("/") out.WriteString(_uri_encoded_bucket) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } if awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express bucket name is not a valid virtual hostable name.") } } if exprVal := params.UseS3ExpressControlEndpoint; exprVal != nil { _UseS3ExpressControlEndpoint := *exprVal _ = _UseS3ExpressControlEndpoint if _UseS3ExpressControlEndpoint == true { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult _uri_encoded_bucket := rulesfn.URIEncode(_Bucket) _ = _uri_encoded_bucket if !(params.Endpoint != nil) { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3express-control-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://s3express-control.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } } if awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if exprVal := params.DisableS3ExpressSessionAuth; exprVal != nil { _DisableS3ExpressSessionAuth := *exprVal _ = _DisableS3ExpressSessionAuth if _DisableS3ExpressSessionAuth == true { if exprVal := rulesfn.SubString(_Bucket, 6, 14, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 14, 16, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 6, 15, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 15, 17, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 6, 19, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 19, 21, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 6, 20, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 20, 22, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 6, 26, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 26, 28, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } return endpoint, fmt.Errorf("endpoint rule error, %s", "Unrecognized S3Express bucket name format.") } } if exprVal := rulesfn.SubString(_Bucket, 6, 14, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 14, 16, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 6, 15, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 15, 17, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 6, 19, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 19, 21, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 6, 20, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 20, 22, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 6, 26, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 26, 28, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } return endpoint, fmt.Errorf("endpoint rule error, %s", "Unrecognized S3Express bucket name format.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express bucket name is not a valid virtual hostable name.") } } } if exprVal := params.Bucket; exprVal != nil { _Bucket := *exprVal _ = _Bucket if exprVal := rulesfn.SubString(_Bucket, 0, 7, true); exprVal != nil { _accessPointSuffix := *exprVal _ = _accessPointSuffix if _accessPointSuffix == "--xa-s3" { if _UseDualStack == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express does not support Dual-stack.") } if _Accelerate == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express does not support S3 Accelerate.") } if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if exprVal := params.DisableS3ExpressSessionAuth; exprVal != nil { _DisableS3ExpressSessionAuth := *exprVal _ = _DisableS3ExpressSessionAuth if _DisableS3ExpressSessionAuth == true { if _url.IsIp == true { _uri_encoded_bucket := rulesfn.URIEncode(_Bucket) _ = _uri_encoded_bucket uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString("/") out.WriteString(_uri_encoded_bucket) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } if awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express bucket name is not a valid virtual hostable name.") } } if _url.IsIp == true { _uri_encoded_bucket := rulesfn.URIEncode(_Bucket) _ = _uri_encoded_bucket uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString("/") out.WriteString(_uri_encoded_bucket) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } if awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express bucket name is not a valid virtual hostable name.") } } if awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if exprVal := params.DisableS3ExpressSessionAuth; exprVal != nil { _DisableS3ExpressSessionAuth := *exprVal _ = _DisableS3ExpressSessionAuth if _DisableS3ExpressSessionAuth == true { if exprVal := rulesfn.SubString(_Bucket, 7, 15, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 15, 17, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 7, 16, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 16, 18, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 7, 20, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 20, 22, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 7, 21, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 21, 23, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 7, 27, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 27, 29, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } return endpoint, fmt.Errorf("endpoint rule error, %s", "Unrecognized S3Express bucket name format.") } } if exprVal := rulesfn.SubString(_Bucket, 7, 15, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 15, 17, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 7, 16, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 16, 18, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 7, 20, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 20, 22, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 7, 21, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 21, 23, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } if exprVal := rulesfn.SubString(_Bucket, 7, 27, true); exprVal != nil { _s3expressAvailabilityZoneId := *exprVal _ = _s3expressAvailabilityZoneId if exprVal := rulesfn.SubString(_Bucket, 27, 29, true); exprVal != nil { _s3expressAvailabilityZoneDelim := *exprVal _ = _s3expressAvailabilityZoneDelim if _s3expressAvailabilityZoneDelim == "--" { if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-fips-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3express-") out.WriteString(_s3expressAvailabilityZoneId) out.WriteString(".") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "sigv4-s3express", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } return endpoint, fmt.Errorf("endpoint rule error, %s", "Unrecognized S3Express bucket name format.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "S3Express bucket name is not a valid virtual hostable name.") } } } if !(params.Bucket != nil) { if exprVal := params.UseS3ExpressControlEndpoint; exprVal != nil { _UseS3ExpressControlEndpoint := *exprVal _ = _UseS3ExpressControlEndpoint if _UseS3ExpressControlEndpoint == true { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3express-control-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://s3express-control.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties out.Set("backend", "S3Express") smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3express") smithyhttp.SetSigV4ASigningName(&sp, "s3express") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } } } if exprVal := params.Bucket; exprVal != nil { _Bucket := *exprVal _ = _Bucket if exprVal := rulesfn.SubString(_Bucket, 49, 50, true); exprVal != nil { _hardwareType := *exprVal _ = _hardwareType if exprVal := rulesfn.SubString(_Bucket, 8, 12, true); exprVal != nil { _regionPrefix := *exprVal _ = _regionPrefix if exprVal := rulesfn.SubString(_Bucket, 0, 7, true); exprVal != nil { _bucketAliasSuffix := *exprVal _ = _bucketAliasSuffix if exprVal := rulesfn.SubString(_Bucket, 32, 49, true); exprVal != nil { _outpostId := *exprVal _ = _outpostId if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _regionPartition := *exprVal _ = _regionPartition if _bucketAliasSuffix == "--op-s3" { if rulesfn.IsValidHostLabel(_outpostId, false) { if _hardwareType == "e" { if _regionPrefix == "beta" { if !(params.Endpoint != nil) { return endpoint, fmt.Errorf("endpoint rule error, %s", "Expected a endpoint to be specified but no endpoint was found") } if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".ec2.") out.WriteString(_url.Authority) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4a", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningRegions(&sp, []string{"*"}) return sp }(), }, { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".ec2.s3-outposts.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_regionPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4a", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningRegions(&sp, []string{"*"}) return sp }(), }, { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } if _hardwareType == "o" { if _regionPrefix == "beta" { if !(params.Endpoint != nil) { return endpoint, fmt.Errorf("endpoint rule error, %s", "Expected a endpoint to be specified but no endpoint was found") } if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".op-") out.WriteString(_outpostId) out.WriteString(".") out.WriteString(_url.Authority) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4a", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningRegions(&sp, []string{"*"}) return sp }(), }, { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".op-") out.WriteString(_outpostId) out.WriteString(".s3-outposts.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_regionPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4a", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningRegions(&sp, []string{"*"}) return sp }(), }, { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Unrecognized hardware type: \"Expected hardware type o or e but got ") out.WriteString(_hardwareType) out.WriteString("\"") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.") } } } } } } } if exprVal := params.Bucket; exprVal != nil { _Bucket := *exprVal _ = _Bucket if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if !(rulesfn.ParseURL(_Endpoint) != nil) { return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Custom endpoint `") out.WriteString(_Endpoint) out.WriteString("` was not a valid URI") return out.String() }()) } } if _ForcePathStyle == false { if awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, false) { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if rulesfn.IsValidHostLabel(_Region, false) { if _Accelerate == true { if _partitionResult.Name == "aws-cn" { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 Accelerate cannot be used in this region") } } if _UseDualStack == true { if _UseFIPS == true { if _Accelerate == false { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-fips.dualstack.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == true { if _UseFIPS == true { if _Accelerate == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-fips.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == true { if _UseFIPS == true { if _Accelerate == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-fips.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == false { if _UseFIPS == true { if _Accelerate == false { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-fips.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == false { if _UseFIPS == true { if _Accelerate == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == false { if _UseFIPS == true { if _Accelerate == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == true { if _UseFIPS == false { if _Accelerate == true { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-accelerate.dualstack.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == true { if _UseFIPS == false { if _Accelerate == true { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-accelerate.dualstack.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == true { if _UseFIPS == false { if _Accelerate == true { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-accelerate.dualstack.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == true { if _UseFIPS == false { if _Accelerate == false { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3.dualstack.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == true { if _UseFIPS == false { if _Accelerate == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == true { if _UseFIPS == false { if _Accelerate == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _url.IsIp == true { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.NormalizedPath) out.WriteString(_Bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _url.IsIp == false { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _url.IsIp == true { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { if _Region == "us-east-1" { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.NormalizedPath) out.WriteString(_Bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.NormalizedPath) out.WriteString(_Bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _url.IsIp == false { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { if _Region == "us-east-1" { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _url.IsIp == true { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.NormalizedPath) out.WriteString(_Bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _url.IsIp == false { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == true { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-accelerate.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == true { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { if _Region == "us-east-1" { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-accelerate.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-accelerate.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == true { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3-accelerate.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { if _Region == "us-east-1" { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == false { if _UseFIPS == false { if _Accelerate == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_Bucket) out.WriteString(".s3.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid region: region was not a valid DNS name.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } } if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _url.Scheme == "http" { if awsrulesfn.IsVirtualHostableS3Bucket(_Bucket, true) { if _ForcePathStyle == false { if _UseFIPS == false { if _UseDualStack == false { if _Accelerate == false { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if rulesfn.IsValidHostLabel(_Region, false) { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_Bucket) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid region: region was not a valid DNS name.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } } } } } } } } if _ForcePathStyle == false { if exprVal := awsrulesfn.ParseARN(_Bucket); exprVal != nil { _bucketArn := *exprVal _ = _bucketArn if exprVal := _bucketArn.ResourceId.Get(0); exprVal != nil { _arnType := *exprVal _ = _arnType if !(_arnType == "") { if _bucketArn.Service == "s3-object-lambda" { if _arnType == "accesspoint" { if exprVal := _bucketArn.ResourceId.Get(1); exprVal != nil { _accessPointName := *exprVal _ = _accessPointName if !(_accessPointName == "") { if _UseDualStack == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 Object Lambda does not support Dual-stack") } if _Accelerate == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 Object Lambda does not support S3 Accelerate") } if !(_bucketArn.Region == "") { if exprVal := params.DisableAccessPoints; exprVal != nil { _DisableAccessPoints := *exprVal _ = _DisableAccessPoints if _DisableAccessPoints == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Access points are not supported for this operation") } } if !(_bucketArn.ResourceId.Get(2) != nil) { if exprVal := params.UseArnRegion; exprVal != nil { _UseArnRegion := *exprVal _ = _UseArnRegion if _UseArnRegion == false { if !(_bucketArn.Region == _Region) { return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid configuration: region from ARN `") out.WriteString(_bucketArn.Region) out.WriteString("` does not match client region `") out.WriteString(_Region) out.WriteString("` and UseArnRegion is `false`") return out.String() }()) } } } if exprVal := awsrulesfn.GetPartition(_bucketArn.Region); exprVal != nil { _bucketPartition := *exprVal _ = _bucketPartition if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if _bucketPartition.Name == _partitionResult.Name { if rulesfn.IsValidHostLabel(_bucketArn.Region, true) { if _bucketArn.AccountId == "" { return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: Missing account id") } if rulesfn.IsValidHostLabel(_bucketArn.AccountId, false) { if rulesfn.IsValidHostLabel(_accessPointName, false) { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4ASigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } } if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".s3-object-lambda-fips.") out.WriteString(_bucketArn.Region) out.WriteString(".") out.WriteString(_bucketPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4ASigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".s3-object-lambda.") out.WriteString(_bucketArn.Region) out.WriteString(".") out.WriteString(_bucketPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4ASigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `") out.WriteString(_accessPointName) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `") out.WriteString(_bucketArn.AccountId) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid region in ARN: `") out.WriteString(_bucketArn.Region) out.WriteString("` (invalid DNS name)") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Client was configured for partition `") out.WriteString(_partitionResult.Name) out.WriteString("` but ARN (`") out.WriteString(_Bucket) out.WriteString("`) has `") out.WriteString(_bucketPartition.Name) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: bucket ARN is missing a region") } } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided") } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `") out.WriteString(_arnType) out.WriteString("`") return out.String() }()) } if _arnType == "accesspoint" { if exprVal := _bucketArn.ResourceId.Get(1); exprVal != nil { _accessPointName := *exprVal _ = _accessPointName if !(_accessPointName == "") { if !(_bucketArn.Region == "") { if _arnType == "accesspoint" { if !(_bucketArn.Region == "") { if exprVal := params.DisableAccessPoints; exprVal != nil { _DisableAccessPoints := *exprVal _ = _DisableAccessPoints if _DisableAccessPoints == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Access points are not supported for this operation") } } if !(_bucketArn.ResourceId.Get(2) != nil) { if exprVal := params.UseArnRegion; exprVal != nil { _UseArnRegion := *exprVal _ = _UseArnRegion if _UseArnRegion == false { if !(_bucketArn.Region == _Region) { return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid configuration: region from ARN `") out.WriteString(_bucketArn.Region) out.WriteString("` does not match client region `") out.WriteString(_Region) out.WriteString("` and UseArnRegion is `false`") return out.String() }()) } } } if exprVal := awsrulesfn.GetPartition(_bucketArn.Region); exprVal != nil { _bucketPartition := *exprVal _ = _bucketPartition if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if _bucketPartition.Name == _partitionResult.Name { if rulesfn.IsValidHostLabel(_bucketArn.Region, true) { if _bucketArn.Service == "s3" { if rulesfn.IsValidHostLabel(_bucketArn.AccountId, false) { if rulesfn.IsValidHostLabel(_accessPointName, false) { if _Accelerate == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Access Points do not support S3 Accelerate") } if _UseFIPS == true { if _UseDualStack == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".s3-accesspoint-fips.dualstack.") out.WriteString(_bucketArn.Region) out.WriteString(".") out.WriteString(_bucketPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } } if _UseFIPS == true { if _UseDualStack == false { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".s3-accesspoint-fips.") out.WriteString(_bucketArn.Region) out.WriteString(".") out.WriteString(_bucketPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } } if _UseFIPS == false { if _UseDualStack == true { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".s3-accesspoint.dualstack.") out.WriteString(_bucketArn.Region) out.WriteString(".") out.WriteString(_bucketPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } } if _UseFIPS == false { if _UseDualStack == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } } } } if _UseFIPS == false { if _UseDualStack == false { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".s3-accesspoint.") out.WriteString(_bucketArn.Region) out.WriteString(".") out.WriteString(_bucketPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `") out.WriteString(_accessPointName) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `") out.WriteString(_bucketArn.AccountId) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: The ARN was not for the S3 service, found: ") out.WriteString(_bucketArn.Service) return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid region in ARN: `") out.WriteString(_bucketArn.Region) out.WriteString("` (invalid DNS name)") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Client was configured for partition `") out.WriteString(_partitionResult.Name) out.WriteString("` but ARN (`") out.WriteString(_Bucket) out.WriteString("`) has `") out.WriteString(_bucketPartition.Name) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } if rulesfn.IsValidHostLabel(_accessPointName, true) { if _UseDualStack == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 MRAP does not support dual-stack") } if _UseFIPS == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 MRAP does not support FIPS") } if _Accelerate == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 MRAP does not support S3 Accelerate") } if _DisableMultiRegionAccessPoints == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid configuration: Multi-Region Access Point ARNs are disabled.") } if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _mrapPartition := *exprVal _ = _mrapPartition if _mrapPartition.Name == _bucketArn.Partition { uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString(".accesspoint.s3-global.") out.WriteString(_mrapPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4a", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4ASigningRegions(&sp, []string{"*"}) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Client was configured for partition `") out.WriteString(_mrapPartition.Name) out.WriteString("` but bucket referred to partition `") out.WriteString(_bucketArn.Partition) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Access Point Name") } } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided") } if _bucketArn.Service == "s3-outposts" { if _UseDualStack == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 Outposts does not support Dual-stack") } if _UseFIPS == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 Outposts does not support FIPS") } if _Accelerate == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 Outposts does not support S3 Accelerate") } if exprVal := _bucketArn.ResourceId.Get(4); exprVal != nil { _var_321 := *exprVal _ = _var_321 return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Arn: Outpost Access Point ARN contains sub resources") } if exprVal := _bucketArn.ResourceId.Get(1); exprVal != nil { _outpostId := *exprVal _ = _outpostId if rulesfn.IsValidHostLabel(_outpostId, false) { if exprVal := params.UseArnRegion; exprVal != nil { _UseArnRegion := *exprVal _ = _UseArnRegion if _UseArnRegion == false { if !(_bucketArn.Region == _Region) { return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid configuration: region from ARN `") out.WriteString(_bucketArn.Region) out.WriteString("` does not match client region `") out.WriteString(_Region) out.WriteString("` and UseArnRegion is `false`") return out.String() }()) } } } if exprVal := awsrulesfn.GetPartition(_bucketArn.Region); exprVal != nil { _bucketPartition := *exprVal _ = _bucketPartition if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if _bucketPartition.Name == _partitionResult.Name { if rulesfn.IsValidHostLabel(_bucketArn.Region, true) { if rulesfn.IsValidHostLabel(_bucketArn.AccountId, false) { if exprVal := _bucketArn.ResourceId.Get(2); exprVal != nil { _outpostType := *exprVal _ = _outpostType if exprVal := _bucketArn.ResourceId.Get(3); exprVal != nil { _accessPointName := *exprVal _ = _accessPointName if _outpostType == "accesspoint" { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".") out.WriteString(_outpostId) out.WriteString(".") out.WriteString(_url.Authority) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4a", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningRegions(&sp, []string{"*"}) return sp }(), }, { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } } uriString := func() string { var out strings.Builder out.WriteString("https://") out.WriteString(_accessPointName) out.WriteString("-") out.WriteString(_bucketArn.AccountId) out.WriteString(".") out.WriteString(_outpostId) out.WriteString(".s3-outposts.") out.WriteString(_bucketArn.Region) out.WriteString(".") out.WriteString(_bucketPartition.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4a", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningRegions(&sp, []string{"*"}) return sp }(), }, { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-outposts") smithyhttp.SetSigV4ASigningName(&sp, "s3-outposts") smithyhttp.SetSigV4SigningRegion(&sp, _bucketArn.Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Expected an outpost type `accesspoint`, found ") out.WriteString(_outpostType) return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: expected an access point name") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: Expected a 4-component resource") } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `") out.WriteString(_bucketArn.AccountId) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid region in ARN: `") out.WriteString(_bucketArn.Region) out.WriteString("` (invalid DNS name)") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Client was configured for partition `") out.WriteString(_partitionResult.Name) out.WriteString("` but ARN (`") out.WriteString(_Bucket) out.WriteString("`) has `") out.WriteString(_bucketPartition.Name) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `") out.WriteString(_outpostId) out.WriteString("`") return out.String() }()) } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: The Outpost Id was not set") } return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: Unrecognized format: ") out.WriteString(_Bucket) out.WriteString(" (type: ") out.WriteString(_arnType) out.WriteString(")") return out.String() }()) } } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid ARN: No ARN type specified") } } if exprVal := rulesfn.SubString(_Bucket, 0, 4, false); exprVal != nil { _arnPrefix := *exprVal _ = _arnPrefix if _arnPrefix == "arn:" { if !(awsrulesfn.ParseARN(_Bucket) != nil) { return endpoint, fmt.Errorf("endpoint rule error, %s", func() string { var out strings.Builder out.WriteString("Invalid ARN: `") out.WriteString(_Bucket) out.WriteString("` was not a valid ARN") return out.String() }()) } } } if _ForcePathStyle == true { if exprVal := awsrulesfn.ParseARN(_Bucket); exprVal != nil { _var_334 := *exprVal _ = _var_334 return endpoint, fmt.Errorf("endpoint rule error, %s", "Path-style addressing cannot be used with ARN buckets") } } _uri_encoded_bucket := rulesfn.URIEncode(_Bucket) _ = _uri_encoded_bucket if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if _Accelerate == false { if _UseDualStack == true { if !(params.Endpoint != nil) { if _UseFIPS == true { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.dualstack.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } if _UseDualStack == true { if !(params.Endpoint != nil) { if _UseFIPS == true { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == true { if !(params.Endpoint != nil) { if _UseFIPS == true { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == false { if !(params.Endpoint != nil) { if _UseFIPS == true { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } if _UseDualStack == false { if !(params.Endpoint != nil) { if _UseFIPS == true { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == false { if !(params.Endpoint != nil) { if _UseFIPS == true { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == true { if !(params.Endpoint != nil) { if _UseFIPS == false { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://s3.dualstack.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } if _UseDualStack == true { if !(params.Endpoint != nil) { if _UseFIPS == false { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == true { if !(params.Endpoint != nil) { if _UseFIPS == false { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://s3.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _UseFIPS == false { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.NormalizedPath) out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _UseFIPS == false { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { if _Region == "us-east-1" { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.NormalizedPath) out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.NormalizedPath) out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _UseFIPS == false { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.NormalizedPath) out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseDualStack == false { if !(params.Endpoint != nil) { if _UseFIPS == false { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://s3.") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } if _UseDualStack == false { if !(params.Endpoint != nil) { if _UseFIPS == false { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { if _Region == "us-east-1" { uriString := func() string { var out strings.Builder out.WriteString("https://s3.") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://s3.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseDualStack == false { if !(params.Endpoint != nil) { if _UseFIPS == false { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://s3.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) out.WriteString("/") out.WriteString(_uri_encoded_bucket) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Path-style addressing cannot be used with S3 Accelerate") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } if exprVal := params.UseObjectLambdaEndpoint; exprVal != nil { _UseObjectLambdaEndpoint := *exprVal _ = _UseObjectLambdaEndpoint if _UseObjectLambdaEndpoint == true { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if rulesfn.IsValidHostLabel(_Region, true) { if _UseDualStack == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 Object Lambda does not support Dual-stack") } if _Accelerate == true { return endpoint, fmt.Errorf("endpoint rule error, %s", "S3 Object Lambda does not support S3 Accelerate") } if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4ASigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } if _UseFIPS == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3-object-lambda-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4ASigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://s3-object-lambda.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4ASigningName(&sp, "s3-object-lambda") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid region: region was not a valid DNS name.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } } if !(params.Bucket != nil) { if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { _partitionResult := *exprVal _ = _partitionResult if rulesfn.IsValidHostLabel(_Region, true) { if _UseFIPS == true { if _UseDualStack == true { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.dualstack.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } if _UseFIPS == true { if _UseDualStack == true { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseFIPS == true { if _UseDualStack == true { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseFIPS == true { if _UseDualStack == false { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } if _UseFIPS == true { if _UseDualStack == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseFIPS == true { if _UseDualStack == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://s3-fips.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseFIPS == false { if _UseDualStack == true { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://s3.dualstack.us-east-1.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } if _UseFIPS == false { if _UseDualStack == true { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { uriString := func() string { var out strings.Builder out.WriteString("https://s3.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseFIPS == false { if _UseDualStack == true { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://s3.dualstack.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseFIPS == false { if _UseDualStack == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } } if _UseFIPS == false { if _UseDualStack == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { if _Region == "us-east-1" { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseFIPS == false { if _UseDualStack == false { if exprVal := params.Endpoint; exprVal != nil { _Endpoint := *exprVal _ = _Endpoint if exprVal := rulesfn.ParseURL(_Endpoint); exprVal != nil { _url := *exprVal _ = _url if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString(_url.Scheme) out.WriteString("://") out.WriteString(_url.Authority) out.WriteString(_url.Path) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } } if _UseFIPS == false { if _UseDualStack == false { if !(params.Endpoint != nil) { if _Region == "aws-global" { uriString := func() string { var out strings.Builder out.WriteString("https://s3.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") return sp }(), }, }) return out }(), }, nil } } } } if _UseFIPS == false { if _UseDualStack == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == true { if _Region == "us-east-1" { uriString := func() string { var out strings.Builder out.WriteString("https://s3.") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } uriString := func() string { var out strings.Builder out.WriteString("https://s3.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } if _UseFIPS == false { if _UseDualStack == false { if !(params.Endpoint != nil) { if !(_Region == "aws-global") { if _UseGlobalEndpoint == false { uriString := func() string { var out strings.Builder out.WriteString("https://s3.") out.WriteString(_Region) out.WriteString(".") out.WriteString(_partitionResult.DnsSuffix) return out.String() }() uri, err := url.Parse(uriString) if err != nil { return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) } return smithyendpoints.Endpoint{ URI: *uri, Headers: http.Header{}, Properties: func() smithy.Properties { var out smithy.Properties smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ { SchemeID: "aws.auth#sigv4", SignerProperties: func() smithy.Properties { var sp smithy.Properties smithyhttp.SetDisableDoubleEncoding(&sp, true) smithyhttp.SetSigV4SigningName(&sp, "s3") smithyhttp.SetSigV4ASigningName(&sp, "s3") smithyhttp.SetSigV4SigningRegion(&sp, _Region) return sp }(), }, }) return out }(), }, nil } } } } } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid region: region was not a valid DNS name.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") } return endpoint, fmt.Errorf("endpoint rule error, %s", "A region must be set when sending requests to S3.") } type endpointParamsBinder interface { bindEndpointParams(*EndpointParameters) } func bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters { params := &EndpointParameters{} params.Region = bindRegion(options.Region) params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) params.Endpoint = options.BaseEndpoint params.ForcePathStyle = aws.Bool(options.UsePathStyle) params.Accelerate = aws.Bool(options.UseAccelerate) params.DisableMultiRegionAccessPoints = aws.Bool(options.DisableMultiRegionAccessPoints) params.UseArnRegion = aws.Bool(options.UseARNRegion) params.DisableS3ExpressSessionAuth = options.DisableS3ExpressSessionAuth if b, ok := input.(endpointParamsBinder); ok { b.bindEndpointParams(params) } return params } type resolveEndpointV2Middleware struct { options Options } func (*resolveEndpointV2Middleware) ID() string { return "ResolveEndpointV2" } func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( out middleware.FinalizeOutput, metadata middleware.Metadata, err error, ) { _, span := tracing.StartSpan(ctx, "ResolveEndpoint") defer span.End() if awsmiddleware.GetRequiresLegacyEndpoints(ctx) { return next.HandleFinalize(ctx, in) } req, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) } if m.options.EndpointResolverV2 == nil { return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } params := bindEndpointParams(ctx, getOperationInput(ctx), m.options) endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", func() (smithyendpoints.Endpoint, error) { return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) }) if err != nil { return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) } span.SetProperty("client.call.resolved_endpoint", endpt.URI.String()) if endpt.URI.RawPath == "" && req.URL.RawPath != "" { endpt.URI.RawPath = endpt.URI.Path } req.URL.Scheme = endpt.URI.Scheme req.URL.Host = endpt.URI.Host req.URL.Path = smithyhttp.JoinPath(endpt.URI.Path, req.URL.Path) req.URL.RawPath = smithyhttp.JoinPath(endpt.URI.RawPath, req.URL.RawPath) for k := range endpt.Headers { req.Header.Set(k, endpt.Headers.Get(k)) } rscheme := getResolvedAuthScheme(ctx) if rscheme == nil { return out, metadata, fmt.Errorf("no resolved auth scheme") } opts, _ := smithyauth.GetAuthOptions(&endpt.Properties) for _, o := range opts { rscheme.SignerProperties.SetAll(&o.SignerProperties) } ctx = setS3ResolvedURI(ctx, endpt.URI.String()) backend := s3cust.GetPropertiesBackend(&endpt.Properties) ctx = internalcontext.SetS3Backend(ctx, backend) span.End() return next.HandleFinalize(ctx, in) } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/eventstream.go ================================================ // Code generated by smithy-go-codegen DO NOT EDIT. package s3 import ( "context" "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream" "github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi" "github.com/aws/aws-sdk-go-v2/service/s3/types" smithy "github.com/aws/smithy-go" "github.com/aws/smithy-go/middleware" smithysync "github.com/aws/smithy-go/sync" smithyhttp "github.com/aws/smithy-go/transport/http" "io" "io/ioutil" "sync" ) // SelectObjectContentEventStreamReader provides the interface for reading events // from a stream. // // The writer's Close method must allow multiple concurrent calls. type SelectObjectContentEventStreamReader interface { Events() <-chan types.SelectObjectContentEventStream Close() error Err() error } type selectObjectContentEventStreamReader struct { stream chan types.SelectObjectContentEventStream decoder *eventstream.Decoder eventStream io.ReadCloser err *smithysync.OnceErr payloadBuf []byte done chan struct{} closeOnce sync.Once } func newSelectObjectContentEventStreamReader(readCloser io.ReadCloser, decoder *eventstream.Decoder) *selectObjectContentEventStreamReader { w := &selectObjectContentEventStreamReader{ stream: make(chan types.SelectObjectContentEventStream), decoder: decoder, eventStream: readCloser, err: smithysync.NewOnceErr(), done: make(chan struct{}), payloadBuf: make([]byte, 10*1024), } go w.readEventStream() return w } func (r *selectObjectContentEventStreamReader) Events() <-chan types.SelectObjectContentEventStream { return r.stream } func (r *selectObjectContentEventStreamReader) readEventStream() { defer r.Close() defer close(r.stream) for { r.payloadBuf = r.payloadBuf[0:0] decodedMessage, err := r.decoder.Decode(r.eventStream, r.payloadBuf) if err != nil { if err == io.EOF { return } select { case <-r.done: return default: r.err.SetError(err) return } } event, err := r.deserializeEventMessage(&decodedMessage) if err != nil { r.err.SetError(err) return } select { case r.stream <- event: case <-r.done: return } } } func (r *selectObjectContentEventStreamReader) deserializeEventMessage(msg *eventstream.Message) (types.SelectObjectContentEventStream, error) { messageType := msg.Headers.Get(eventstreamapi.MessageTypeHeader) if messageType == nil { return nil, fmt.Errorf("%s event header not present", eventstreamapi.MessageTypeHeader) } switch messageType.String() { case eventstreamapi.EventMessageType: var v types.SelectObjectContentEventStream if err := awsRestxml_deserializeEventStreamSelectObjectContentEventStream(&v, msg); err != nil { return nil, err } return v, nil case eventstreamapi.ExceptionMessageType: return nil, awsRestxml_deserializeEventStreamExceptionSelectObjectContentEventStream(msg) case eventstreamapi.ErrorMessageType: errorCode := "UnknownError" errorMessage := errorCode if header := msg.Headers.Get(eventstreamapi.ErrorCodeHeader); header != nil { errorCode = header.String() } if header := msg.Headers.Get(eventstreamapi.ErrorMessageHeader); header != nil { errorMessage = header.String() } return nil, &smithy.GenericAPIError{ Code: errorCode, Message: errorMessage, } default: mc := msg.Clone() return nil, &UnknownEventMessageError{ Type: messageType.String(), Message: &mc, } } } func (r *selectObjectContentEventStreamReader) ErrorSet() <-chan struct{} { return r.err.ErrorSet() } func (r *selectObjectContentEventStreamReader) Close() error { r.closeOnce.Do(r.safeClose) return r.Err() } func (r *selectObjectContentEventStreamReader) safeClose() { close(r.done) r.eventStream.Close() } func (r *selectObjectContentEventStreamReader) Err() error { return r.err.Err() } func (r *selectObjectContentEventStreamReader) Closed() <-chan struct{} { return r.done } type awsRestxml_deserializeOpEventStreamSelectObjectContent struct { LogEventStreamWrites bool LogEventStreamReads bool } func (*awsRestxml_deserializeOpEventStreamSelectObjectContent) ID() string { return "OperationEventStreamDeserializer" } func (m *awsRestxml_deserializeOpEventStreamSelectObjectContent) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( out middleware.DeserializeOutput, metadata middleware.Metadata, err error, ) { defer func() { if err == nil { return } m.closeResponseBody(out) }() logger := middleware.GetLogger(ctx) request, ok := in.Request.(*smithyhttp.Request) if !ok { return out, metadata, fmt.Errorf("unknown transport type: %T", in.Request) } _ = request out, metadata, err = next.HandleDeserialize(ctx, in) if err != nil { return out, metadata, err } deserializeOutput, ok := out.RawResponse.(*smithyhttp.Response) if !ok { return out, metadata, fmt.Errorf("unknown transport type: %T", out.RawResponse) } _ = deserializeOutput output, ok := out.Result.(*SelectObjectContentOutput) if out.Result != nil && !ok { return out, metadata, fmt.Errorf("unexpected output result type: %T", out.Result) } else if out.Result == nil { output = &SelectObjectContentOutput{} out.Result = output } eventReader := newSelectObjectContentEventStreamReader( deserializeOutput.Body, eventstream.NewDecoder(func(options *eventstream.DecoderOptions) { options.Logger = logger options.LogMessages = m.LogEventStreamReads }), ) defer func() { if err == nil { return } _ = eventReader.Close() }() output.eventStream = NewSelectObjectContentEventStream(func(stream *SelectObjectContentEventStream) { stream.Reader = eventReader }) go output.eventStream.waitStreamClose() return out, metadata, nil } func (*awsRestxml_deserializeOpEventStreamSelectObjectContent) closeResponseBody(out middleware.DeserializeOutput) { if resp, ok := out.RawResponse.(*smithyhttp.Response); ok && resp != nil && resp.Body != nil { _, _ = io.Copy(ioutil.Discard, resp.Body) _ = resp.Body.Close() } } func addEventStreamSelectObjectContentMiddleware(stack *middleware.Stack, options Options) error { if err := stack.Deserialize.Insert(&awsRestxml_deserializeOpEventStreamSelectObjectContent{ LogEventStreamWrites: options.ClientLogMode.IsRequestEventMessage(), LogEventStreamReads: options.ClientLogMode.IsResponseEventMessage(), }, "OperationDeserializer", middleware.Before); err != nil { return err } return nil } // UnknownEventMessageError provides an error when a message is received from the stream, // but the reader is unable to determine what kind of message it is. type UnknownEventMessageError struct { Type string Message *eventstream.Message } // Error retruns the error message string. func (e *UnknownEventMessageError) Error() string { return "unknown event stream message type, " + e.Type } func setSafeEventStreamClientLogMode(o *Options, operation string) { switch operation { case "SelectObjectContent": toggleEventStreamClientLogMode(o, false, true) return default: return } } func toggleEventStreamClientLogMode(o *Options, request, response bool) { mode := o.ClientLogMode if request && mode.IsRequestWithBody() { mode.ClearRequestWithBody() mode |= aws.LogRequest } if response && mode.IsResponseWithBody() { mode.ClearResponseWithBody() mode |= aws.LogResponse } o.ClientLogMode = mode } ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/express.go ================================================ package s3 import ( "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations" ) // ExpressCredentialsProvider retrieves credentials for operations against the // S3Express storage class. type ExpressCredentialsProvider = customizations.S3ExpressCredentialsProvider ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/express_default.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/express_resolve.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/express_user_agent.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/generated.json ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go ================================================ [File too large to display: 177 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/handwritten_paginators.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/arn/arn_parser.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/context.go ================================================ [File too large to display: 545 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/doc.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/express.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/express_config.go ================================================ [File too large to display: 461 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/express_default_checksum.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/express_properties.go ================================================ [File too large to display: 636 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/express_signer.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/express_signer_smithy.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/handle_200_error.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/host.go ================================================ [File too large to display: 603 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/presigned_expires.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/process_arn_resource.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/remove_bucket_middleware.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/s3_object_lambda.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/signer_wrapper.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations/update_endpoint.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/internal/endpoints/endpoints.go ================================================ [File too large to display: 30.9 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/options.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/presign_post.go ================================================ [File too large to display: 13.6 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/serialize_immutable_hostname_bucket.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/serializers.go ================================================ [File too large to display: 424.0 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/types/enums.go ================================================ [File too large to display: 46.6 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/types/errors.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/types/types.go ================================================ [File too large to display: 159.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/uri_context.go ================================================ [File too large to display: 696 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/s3/validators.go ================================================ [File too large to display: 165.2 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/LICENSE.txt ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go ================================================ [File too large to display: 26.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/auth.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/deserializers.go ================================================ [File too large to display: 29.6 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/doc.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/endpoints.go ================================================ [File too large to display: 16.9 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/generated.json ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go ================================================ [File too large to display: 178 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go ================================================ [File too large to display: 16.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/options.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/serializers.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/errors.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/types/types.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sso/validators.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md ================================================ [File too large to display: 16.9 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/LICENSE.txt ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go ================================================ [File too large to display: 26.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/auth.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go ================================================ [File too large to display: 56.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/doc.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go ================================================ [File too large to display: 16.8 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/generated.json ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go ================================================ [File too large to display: 182 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go ================================================ [File too large to display: 15.8 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/options.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/serializers.go ================================================ [File too large to display: 14.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/errors.go ================================================ [File too large to display: 10.9 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/types.go ================================================ [File too large to display: 677 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/validators.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md ================================================ [File too large to display: 17.9 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/LICENSE.txt ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go ================================================ [File too large to display: 31.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go ================================================ [File too large to display: 27.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go ================================================ [File too large to display: 21.9 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go ================================================ [File too large to display: 25.2 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go ================================================ [File too large to display: 19.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go ================================================ [File too large to display: 9.8 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/deserializers.go ================================================ [File too large to display: 69.4 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/doc.go ================================================ [File too large to display: 567 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/endpoints.go ================================================ [File too large to display: 34.1 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go ================================================ [File too large to display: 179 B] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go ================================================ [File too large to display: 14.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/options.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go ================================================ [File too large to display: 29.8 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/types.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/aws/aws-sdk-go-v2/service/sts/validators.go ================================================ [File too large to display: 9.8 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/.gitignore ================================================ [File too large to display: 217 B] ================================================ FILE: vendor/github.com/aws/smithy-go/.travis.yml ================================================ [File too large to display: 377 B] ================================================ FILE: vendor/github.com/aws/smithy-go/CHANGELOG.md ================================================ [File too large to display: 10.9 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/CODE_OF_CONDUCT.md ================================================ [File too large to display: 309 B] ================================================ FILE: vendor/github.com/aws/smithy-go/CONTRIBUTING.md ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/LICENSE ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/Makefile ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/NOTICE ================================================ [File too large to display: 67 B] ================================================ FILE: vendor/github.com/aws/smithy-go/README.md ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/auth/auth.go ================================================ [File too large to display: 99 B] ================================================ FILE: vendor/github.com/aws/smithy-go/auth/bearer/docs.go ================================================ [File too large to display: 130 B] ================================================ FILE: vendor/github.com/aws/smithy-go/auth/bearer/middleware.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/auth/bearer/token.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/auth/bearer/token_cache.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/auth/identity.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/auth/option.go ================================================ [File too large to display: 611 B] ================================================ FILE: vendor/github.com/aws/smithy-go/auth/scheme_id.go ================================================ [File too large to display: 411 B] ================================================ FILE: vendor/github.com/aws/smithy-go/changelog-template.json ================================================ [File too large to display: 203 B] ================================================ FILE: vendor/github.com/aws/smithy-go/container/private/cache/cache.go ================================================ [File too large to display: 741 B] ================================================ FILE: vendor/github.com/aws/smithy-go/container/private/cache/lru/lru.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/context/suppress_expired.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/doc.go ================================================ [File too large to display: 80 B] ================================================ FILE: vendor/github.com/aws/smithy-go/document/doc.go ================================================ [File too large to display: 699 B] ================================================ FILE: vendor/github.com/aws/smithy-go/document/document.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/document/errors.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/document.go ================================================ [File too large to display: 269 B] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/doc.go ================================================ [File too large to display: 113 B] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/encoding.go ================================================ [File too large to display: 983 B] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/httpbinding/encode.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/httpbinding/header.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/httpbinding/path_replace.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/httpbinding/query.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/httpbinding/uri.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/json/array.go ================================================ [File too large to display: 657 B] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/json/constants.go ================================================ [File too large to display: 157 B] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/json/decoder_util.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/json/encoder.go ================================================ [File too large to display: 594 B] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/json/escape.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/json/object.go ================================================ [File too large to display: 810 B] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/json/value.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/array.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/constants.go ================================================ [File too large to display: 173 B] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/doc.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/element.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/encoder.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/error_utils.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/escape.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/map.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/value.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/encoding/xml/xml_decoder.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/endpoints/endpoint.go ================================================ [File too large to display: 582 B] ================================================ FILE: vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/doc.go ================================================ [File too large to display: 114 B] ================================================ FILE: vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/strings.go ================================================ [File too large to display: 609 B] ================================================ FILE: vendor/github.com/aws/smithy-go/endpoints/private/rulesfn/uri.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/errors.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/go_module_metadata.go ================================================ [File too large to display: 181 B] ================================================ FILE: vendor/github.com/aws/smithy-go/internal/sync/singleflight/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/internal/sync/singleflight/docs.go ================================================ [File too large to display: 390 B] ================================================ FILE: vendor/github.com/aws/smithy-go/internal/sync/singleflight/singleflight.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/io/byte.go ================================================ [File too large to display: 232 B] ================================================ FILE: vendor/github.com/aws/smithy-go/io/doc.go ================================================ [File too large to display: 78 B] ================================================ FILE: vendor/github.com/aws/smithy-go/io/reader.go ================================================ [File too large to display: 256 B] ================================================ FILE: vendor/github.com/aws/smithy-go/io/ringbuffer.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/local-mod-replace.sh ================================================ [File too large to display: 791 B] ================================================ FILE: vendor/github.com/aws/smithy-go/logging/logger.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/metrics/metrics.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/metrics/nop.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/context.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/doc.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/logging.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/metadata.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/middleware.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/ordered_group.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/stack.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/stack_values.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/step_build.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/step_deserialize.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/step_finalize.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/step_initialize.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/middleware/step_serialize.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/modman.toml ================================================ [File too large to display: 215 B] ================================================ FILE: vendor/github.com/aws/smithy-go/private/requestcompression/gzip.go ================================================ [File too large to display: 690 B] ================================================ FILE: vendor/github.com/aws/smithy-go/private/requestcompression/middleware_capture_request_compression.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/private/requestcompression/request_compression.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/properties.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/ptr/doc.go ================================================ [File too large to display: 193 B] ================================================ FILE: vendor/github.com/aws/smithy-go/ptr/from_ptr.go ================================================ [File too large to display: 14.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/ptr/gen_scalars.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/ptr/to_ptr.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/rand/doc.go ================================================ [File too large to display: 106 B] ================================================ FILE: vendor/github.com/aws/smithy-go/rand/rand.go ================================================ [File too large to display: 690 B] ================================================ FILE: vendor/github.com/aws/smithy-go/rand/uuid.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/sync/error.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/time/time.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/tracing/context.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/tracing/nop.go ================================================ [File too large to display: 901 B] ================================================ FILE: vendor/github.com/aws/smithy-go/tracing/tracing.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/auth.go ================================================ [File too large to display: 500 B] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/auth_schemes.go ================================================ [File too large to display: 923 B] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/checksum_middleware.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/client.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/doc.go ================================================ [File too large to display: 152 B] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/headerlist.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/host.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/internal/io/safe.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/md5_checksum.go ================================================ [File too large to display: 615 B] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/metrics.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/middleware_close_response_body.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/middleware_content_length.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/middleware_header_comment.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/middleware_headers.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/middleware_http_logging.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/middleware_metadata.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/middleware_min_proto.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/properties.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/request.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/response.go ================================================ [File too large to display: 977 B] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/time.go ================================================ [File too large to display: 324 B] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/url.go ================================================ [File too large to display: 885 B] ================================================ FILE: vendor/github.com/aws/smithy-go/transport/http/user_agent.go ================================================ [File too large to display: 885 B] ================================================ FILE: vendor/github.com/aws/smithy-go/validation.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/waiter/logger.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/aws/smithy-go/waiter/waiter.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/LICENSE ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/api/client.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/api/factory.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cache/build.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cache/credentials.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cache/file.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cache/null.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login/main.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/config/cache_dir.go ================================================ [File too large to display: 731 B] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/config/log.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/ecr.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/version/version.go ================================================ [File too large to display: 205 B] ================================================ FILE: vendor/github.com/beorn7/perks/LICENSE ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/beorn7/perks/quantile/exampledata.txt ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/beorn7/perks/quantile/stream.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/LICENSE.txt ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/README.md ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/testall.sh ================================================ [File too large to display: 282 B] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/xxhash.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/xxhash_asm.go ================================================ [File too large to display: 318 B] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/xxhash_other.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/xxhash_safe.go ================================================ [File too large to display: 430 B] ================================================ FILE: vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/.gitignore ================================================ [File too large to display: 47 B] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/.goreleaser.yml ================================================ [File too large to display: 611 B] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/Makefile ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/README.md ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/cmd/get.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/cmd/root.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/main.go ================================================ [File too large to display: 697 B] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/pkg/credhelper/helper.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/pkg/registry/const.go ================================================ [File too large to display: 715 B] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/pkg/registry/registry.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/chrismellard/docker-credential-acr-env/pkg/token/token.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/LICENSE ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/curve.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.go ================================================ [File too large to display: 674 B] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.h ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.s ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/curve_generic.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/curve_noasm.go ================================================ [File too large to display: 376 B] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/doc.go ================================================ [File too large to display: 777 B] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/key.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x25519/table.go ================================================ [File too large to display: 52.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/curve.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.go ================================================ [File too large to display: 670 B] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.h ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.s ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/curve_generic.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/curve_noasm.go ================================================ [File too large to display: 372 B] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/doc.go ================================================ [File too large to display: 773 B] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/key.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/dh/x448/table.go ================================================ [File too large to display: 154.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/constants.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/curve.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/isogeny.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/point.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/scalar.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/twist.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/twistPoint.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/twistTables.go ================================================ [File too large to display: 42.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/ecc/goldilocks/twist_basemult.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/conv/conv.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/doc.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/hashes.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/keccakf.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/rc.go ================================================ [File too large to display: 598 B] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/sha3.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/sha3_s390x.s ================================================ [File too large to display: 960 B] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/shake.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/xor.go ================================================ [File too large to display: 432 B] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/xor_generic.go ================================================ [File too large to display: 817 B] ================================================ FILE: vendor/github.com/cloudflare/circl/internal/sha3/xor_unaligned.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp25519/fp.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.go ================================================ [File too large to display: 938 B] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.h ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.s ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp25519/fp_generic.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp25519/fp_noasm.go ================================================ [File too large to display: 497 B] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp448/fp.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.go ================================================ [File too large to display: 890 B] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.h ================================================ [File too large to display: 22.1 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.s ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp448/fp_generic.go ================================================ [File too large to display: 10.4 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp448/fp_noasm.go ================================================ [File too large to display: 446 B] ================================================ FILE: vendor/github.com/cloudflare/circl/math/fp448/fuzzer.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/integer.go ================================================ [File too large to display: 360 B] ================================================ FILE: vendor/github.com/cloudflare/circl/math/mlsbset/mlsbset.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/mlsbset/power.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/math/primes.go ================================================ [File too large to display: 954 B] ================================================ FILE: vendor/github.com/cloudflare/circl/math/wnaf.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed25519/ed25519.go ================================================ [File too large to display: 14.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed25519/modular.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed25519/mult.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed25519/point.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed25519/pubkey.go ================================================ [File too large to display: 180 B] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed25519/pubkey112.go ================================================ [File too large to display: 126 B] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed25519/signapi.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed25519/tables.go ================================================ [File too large to display: 25.3 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed448/ed448.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/ed448/signapi.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/cloudflare/circl/sign/sign.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/migrate.pb.go ================================================ [File too large to display: 16.8 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/migrate.pb.validate.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/security.pb.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/security.pb.validate.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/sensitive.pb.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/sensitive.pb.validate.go ================================================ [File too large to display: 574 B] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/status.pb.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/status.pb.validate.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/versioning.pb.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/annotations/versioning.pb.validate.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/type/v1/typed_struct.pb.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/udpa/type/v1/typed_struct.pb.validate.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/migrate.pb.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/migrate.pb.validate.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/security.pb.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/security.pb.validate.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/sensitive.pb.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/sensitive.pb.validate.go ================================================ [File too large to display: 567 B] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/status.pb.go ================================================ [File too large to display: 19.4 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/status.pb.validate.go ================================================ [File too large to display: 12.0 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/versioning.pb.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/annotations/v3/versioning.pb.validate.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/authority.pb.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/authority.pb.validate.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/cidr.pb.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/cidr.pb.validate.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/collection_entry.pb.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/collection_entry.pb.validate.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/context_params.pb.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/context_params.pb.validate.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/extension.pb.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/extension.pb.validate.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/resource.pb.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/resource.pb.validate.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/resource_locator.pb.go ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/resource_locator.pb.validate.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/resource_name.pb.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/core/v3/resource_name.pb.validate.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/data/orca/v3/orca_load_report.pb.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/data/orca/v3/orca_load_report.pb.validate.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca.pb.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca.pb.validate.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/service/orca/v3/orca_grpc.pb.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/cel.pb.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/cel.pb.validate.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/domain.pb.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/domain.pb.validate.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/http_inputs.pb.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/http_inputs.pb.validate.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/ip.pb.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/ip.pb.validate.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/matcher.pb.go ================================================ [File too large to display: 44.3 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/matcher.pb.validate.go ================================================ [File too large to display: 52.7 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/range.pb.go ================================================ [File too large to display: 20.9 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/range.pb.validate.go ================================================ [File too large to display: 27.1 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/regex.pb.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/regex.pb.validate.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/string.pb.go ================================================ [File too large to display: 13.0 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/matcher/v3/string.pb.validate.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/v3/cel.pb.go ================================================ [File too large to display: 14.0 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/v3/cel.pb.validate.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/v3/range.pb.go ================================================ [File too large to display: 8.8 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/v3/range.pb.validate.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/v3/typed_struct.pb.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/cncf/xds/go/xds/type/v3/typed_struct.pb.validate.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/containerd/cgroups/v3/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/containerd/cgroups/v3/cgroup1/stats/doc.go ================================================ [File too large to display: 610 B] ================================================ FILE: vendor/github.com/containerd/cgroups/v3/cgroup1/stats/metrics.pb.go ================================================ [File too large to display: 74.7 KB] ================================================ FILE: vendor/github.com/containerd/cgroups/v3/cgroup1/stats/metrics.pb.txt ================================================ [File too large to display: 15.9 KB] ================================================ FILE: vendor/github.com/containerd/cgroups/v3/cgroup1/stats/metrics.proto ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/NOTICE ================================================ [File too large to display: 519 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/doc.go ================================================ [File too large to display: 612 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.pb.go ================================================ [File too large to display: 67.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox.proto ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_grpc.pb.go ================================================ [File too large to display: 16.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/runtime/sandbox/v1/sandbox_ttrpc.pb.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go ================================================ [File too large to display: 51.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/containers/v1/containers.proto ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/containers/v1/containers_grpc.pb.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/containers/v1/containers_ttrpc.pb.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/containers/v1/doc.go ================================================ [File too large to display: 615 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/content/v1/content.pb.go ================================================ [File too large to display: 71.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/content/v1/content.proto ================================================ [File too large to display: 10.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/content/v1/content_grpc.pb.go ================================================ [File too large to display: 19.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/content/v1/content_ttrpc.pb.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/content/v1/doc.go ================================================ [File too large to display: 612 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/diff/v1/diff.pb.go ================================================ [File too large to display: 23.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/diff/v1/diff.proto ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/diff/v1/diff_grpc.pb.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/diff/v1/diff_ttrpc.pb.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/diff/v1/doc.go ================================================ [File too large to display: 609 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/events/v1/doc.go ================================================ [File too large to display: 809 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/events/v1/events.pb.go ================================================ [File too large to display: 14.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/events/v1/events.proto ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/events/v1/events_grpc.pb.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/events/v1/events_ttrpc.pb.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/images/v1/docs.go ================================================ [File too large to display: 611 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/images/v1/images.pb.go ================================================ [File too large to display: 40.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/images/v1/images.proto ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/images/v1/images_grpc.pb.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/images/v1/images_ttrpc.pb.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/introspection/v1/doc.go ================================================ [File too large to display: 618 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/introspection/v1/introspection.pb.go ================================================ [File too large to display: 34.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/introspection/v1/introspection.proto ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/introspection/v1/introspection_grpc.pb.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/introspection/v1/introspection_ttrpc.pb.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/leases/v1/doc.go ================================================ [File too large to display: 611 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/leases/v1/leases.pb.go ================================================ [File too large to display: 38.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/leases/v1/leases.proto ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/leases/v1/leases_grpc.pb.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/leases/v1/leases_ttrpc.pb.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/namespaces/v1/doc.go ================================================ [File too large to display: 615 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/namespaces/v1/namespace.pb.go ================================================ [File too large to display: 37.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/namespaces/v1/namespace.proto ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/namespaces/v1/namespace_grpc.pb.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/namespaces/v1/namespace_ttrpc.pb.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/sandbox/v1/doc.go ================================================ [File too large to display: 612 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/sandbox/v1/sandbox.pb.go ================================================ [File too large to display: 100.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/sandbox/v1/sandbox.proto ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/sandbox/v1/sandbox_grpc.pb.go ================================================ [File too large to display: 23.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/sandbox/v1/sandbox_ttrpc.pb.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/snapshots/v1/doc.go ================================================ [File too large to display: 614 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/snapshots/v1/snapshots.pb.go ================================================ [File too large to display: 70.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/snapshots/v1/snapshots.proto ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/snapshots/v1/snapshots_grpc.pb.go ================================================ [File too large to display: 16.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/snapshots/v1/snapshots_ttrpc.pb.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/streaming/v1/doc.go ================================================ [File too large to display: 614 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/streaming/v1/streaming.pb.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/streaming/v1/streaming.proto ================================================ [File too large to display: 906 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/streaming/v1/streaming_grpc.pb.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/streaming/v1/streaming_ttrpc.pb.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/tasks/v1/doc.go ================================================ [File too large to display: 610 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go ================================================ [File too large to display: 92.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.proto ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks_grpc.pb.go ================================================ [File too large to display: 24.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks_ttrpc.pb.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/transfer/v1/doc.go ================================================ [File too large to display: 613 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/transfer/v1/transfer.pb.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/transfer/v1/transfer.proto ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/transfer/v1/transfer_grpc.pb.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/transfer/v1/transfer_ttrpc.pb.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/version/v1/doc.go ================================================ [File too large to display: 660 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/version/v1/version.proto ================================================ [File too large to display: 982 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/version/v1/version_grpc.pb.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/services/version/v1/version_ttrpc.pb.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/descriptor.pb.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/descriptor.proto ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/doc.go ================================================ [File too large to display: 610 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/event.pb.go ================================================ [File too large to display: 8.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/event.proto ================================================ [File too large to display: 1023 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/fieldpath.pb.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/fieldpath.proto ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/introspection.pb.go ================================================ [File too large to display: 15.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/introspection.proto ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/metrics.pb.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/metrics.proto ================================================ [File too large to display: 880 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/mount.pb.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/mount.proto ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/platform.pb.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/platform.proto ================================================ [File too large to display: 891 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/platform_helpers.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/runc/options/doc.go ================================================ [File too large to display: 612 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/runc/options/next.pb.txt ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/runc/options/oci.pb.go ================================================ [File too large to display: 18.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/runc/options/oci.proto ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/sandbox.pb.go ================================================ [File too large to display: 15.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/sandbox.proto ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/task/doc.go ================================================ [File too large to display: 651 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/task/task.pb.go ================================================ [File too large to display: 15.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/task/task.proto ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/doc.go ================================================ [File too large to display: 661 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/imagestore.pb.go ================================================ [File too large to display: 19.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/imagestore.proto ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/importexport.pb.go ================================================ [File too large to display: 13.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/importexport.proto ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/progress.pb.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/progress.proto ================================================ [File too large to display: 942 B] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/registry.pb.go ================================================ [File too large to display: 24.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/registry.proto ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/streaming.pb.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/api/types/transfer/streaming.proto ================================================ [File too large to display: 784 B] ================================================ FILE: vendor/github.com/containerd/containerd/platforms/platforms_deprecated.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/platforms/platforms_deprecated_other.go ================================================ [File too large to display: 685 B] ================================================ FILE: vendor/github.com/containerd/containerd/platforms/platforms_deprecated_windows.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/NOTICE ================================================ [File too large to display: 519 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/client.go ================================================ [File too large to display: 29.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/client_opts.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/container.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/container_checkpoint_opts.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/container_opts.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/container_opts_unix.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/container_restore_opts.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/containerstore.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/diff.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/events.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/export.go ================================================ [File too large to display: 1009 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/grpc.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/image.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/image_store.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/import.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/install.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/install_opts.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/lease.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/namespaces.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/process.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/pull.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/sandbox.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/services.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/signals.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/snapshotter_opts_unix.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/snapshotter_opts_windows.go ================================================ [File too large to display: 892 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/task.go ================================================ [File too large to display: 21.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/task_opts.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/task_opts_unix.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/client/transfer.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/containers/containers.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/content/adaptor.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/content/content.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/content/helpers.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/content/proxy/content_reader.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/content/proxy/content_store.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/content/proxy/content_writer.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/diff/diff.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/diff/proxy/differ.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/diff/stream.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/diff/stream_unix.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/diff/stream_windows.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/events/events.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/events/proxy/remote_events.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/annotations.go ================================================ [File too large to display: 807 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/archive/exporter.go ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/archive/importer.go ================================================ [File too large to display: 12.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/archive/reference.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/diffid.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/handlers.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/image.go ================================================ [File too large to display: 14.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/importexport.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/mediatypes.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/images/usage/calculator.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/introspection/introspection.go ================================================ [File too large to display: 1007 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/introspection/proxy/remote.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/leases/context.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/leases/grpc.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/leases/id.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/leases/lease.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/leases/proxy/manager.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/fuse_linux.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/fuse_unsupported.go ================================================ [File too large to display: 858 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/lookup_unix.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/lookup_unsupported.go ================================================ [File too large to display: 862 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/losetup_linux.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_darwin.go ================================================ [File too large to display: 765 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_freebsd.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_idmapped_linux.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_idmapped_utils_linux.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_idmapped_utils_linux_go122.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_linux.go ================================================ [File too large to display: 15.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_unix.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_unsupported.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mount_windows.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/mountinfo.go ================================================ [File too large to display: 825 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/temp.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/temp_unix.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/mount/temp_unsupported.go ================================================ [File too large to display: 887 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/auth/fetch.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/auth/parse.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/authorizer.go ================================================ [File too large to display: 10.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/converter.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/errcode.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/errdesc.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/fetcher.go ================================================ [File too large to display: 16.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/handler.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/httpreadseeker.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/pusher.go ================================================ [File too large to display: 15.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/registry.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/resolver.go ================================================ [File too large to display: 24.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/resolver_unix.go ================================================ [File too large to display: 748 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/resolver_windows.go ================================================ [File too large to display: 819 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/scope.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/docker/status.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/errors/errors.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/handlers.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/remotes/resolver.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/sandbox/bridge.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/sandbox/controller.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/sandbox/helpers.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/sandbox/proxy/controller.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/sandbox/proxy/store.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/sandbox/store.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/snapshots/proxy/convert.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/snapshots/proxy/proxy.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/snapshots/snapshotter.go ================================================ [File too large to display: 14.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/streaming/proxy/streaming.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/streaming/streaming.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/transfer/proxy/transfer.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/transfer/streaming/reader.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/transfer/streaming/stream.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/transfer/streaming/writer.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/transfer/transfer.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/core/unpack/unpacker.go ================================================ [File too large to display: 15.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/defaults/defaults.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/defaults/defaults_darwin.go ================================================ [File too large to display: 707 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/defaults/defaults_freebsd.go ================================================ [File too large to display: 710 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/defaults/defaults_linux.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/defaults/defaults_unix.go ================================================ [File too large to display: 873 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/defaults/defaults_unix_nolinux.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/defaults/defaults_windows.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/defaults/doc.go ================================================ [File too large to display: 755 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/internal/cleanup/context.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/internal/kmutex/kmutex.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/internal/kmutex/noop.go ================================================ [File too large to display: 824 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/internal/lazyregexp/lazyregexp.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/internal/randutil/randutil.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/internal/userns/idmap.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/compression/compression.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/link_default.go ================================================ [File too large to display: 726 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/link_freebsd.go ================================================ [File too large to display: 965 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tar.go ================================================ [File too large to display: 22.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tar_freebsd.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tar_mostunix.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tar_opts.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tar_opts_linux.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tar_opts_windows.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tar_unix.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tar_windows.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tarheader/tarheader.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/tarheader/tarheader_unix.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/time.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/time_unix.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/archive/time_windows.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/cap/cap_linux.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/cio/io.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/cio/io_unix.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/cio/io_windows.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/dialer/dialer.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/dialer/dialer_unix.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/dialer/dialer_windows.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/epoch/context.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/epoch/epoch.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/filters/adaptor.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/filters/filter.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/filters/parser.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/filters/quote.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/filters/scanner.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/identifiers/validate.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/kernelversion/kernel_linux.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/labels/labels.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/labels/validate.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/namespaces/context.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/namespaces/grpc.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/namespaces/store.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/namespaces/ttrpc.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/client.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/mounts.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/mounts_freebsd.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/spec.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/spec_opts.go ================================================ [File too large to display: 47.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/spec_opts_linux.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/spec_opts_nonlinux.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/spec_opts_nonwindows.go ================================================ [File too large to display: 997 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/spec_opts_unix.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/spec_opts_windows.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/oci/utils_unix.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/protobuf/compare.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/protobuf/proto/proto.go ================================================ [File too large to display: 954 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/protobuf/timestamp.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/protobuf/types/types.go ================================================ [File too large to display: 972 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/reference/reference.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/rootfs/apply.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/rootfs/diff.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/rootfs/init.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/rootfs/init_linux.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/rootfs/init_other.go ================================================ [File too large to display: 666 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/eintr_unix.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/filesys_unix.go ================================================ [File too large to display: 802 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/filesys_windows.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/namespace_linux.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/oom_linux.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/oom_unsupported.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/pidfd_linux.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/socket_unix.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/socket_windows.go ================================================ [File too large to display: 964 B] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/sys/unshare_linux.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/tracing/helpers.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/tracing/log.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/pkg/tracing/tracing.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/plugins/services/services.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/plugins/types.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/containerd/containerd/v2/version/version.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/continuity/AUTHORS ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/containerd/continuity/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/continuity/devices/devices.go ================================================ [File too large to display: 677 B] ================================================ FILE: vendor/github.com/containerd/continuity/devices/devices_unix.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/continuity/devices/devices_windows.go ================================================ [File too large to display: 781 B] ================================================ FILE: vendor/github.com/containerd/continuity/devices/mknod_freebsd.go ================================================ [File too large to display: 779 B] ================================================ FILE: vendor/github.com/containerd/continuity/devices/mknod_unix.go ================================================ [File too large to display: 785 B] ================================================ FILE: vendor/github.com/containerd/continuity/driver/driver.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/containerd/continuity/driver/driver_unix.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/containerd/continuity/driver/driver_windows.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/continuity/driver/lchmod_linux.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/continuity/driver/lchmod_unix.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/continuity/driver/utils.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/copy.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/copy_darwin.go ================================================ [File too large to display: 966 B] ================================================ FILE: vendor/github.com/containerd/continuity/fs/copy_irregular_freebsd.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/copy_irregular_unix.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/copy_linux.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/copy_nondarwin.go ================================================ [File too large to display: 659 B] ================================================ FILE: vendor/github.com/containerd/continuity/fs/copy_unix.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/copy_windows.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/diff.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/diff_linux.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/diff_nonlinux.go ================================================ [File too large to display: 785 B] ================================================ FILE: vendor/github.com/containerd/continuity/fs/diff_unix.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/diff_windows.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/dir.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/dtype_linux.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/du.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/du_unix.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/du_windows.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/hardlink.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/hardlink_unix.go ================================================ [File too large to display: 905 B] ================================================ FILE: vendor/github.com/containerd/continuity/fs/hardlink_windows.go ================================================ [File too large to display: 690 B] ================================================ FILE: vendor/github.com/containerd/continuity/fs/magic_linux.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/path.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/stat_darwinbsd.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/stat_unix.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/stat_windows.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/continuity/fs/time.go ================================================ [File too large to display: 1012 B] ================================================ FILE: vendor/github.com/containerd/continuity/fs/utimesnanoat.go ================================================ [File too large to display: 962 B] ================================================ FILE: vendor/github.com/containerd/continuity/sysx/README.md ================================================ [File too large to display: 173 B] ================================================ FILE: vendor/github.com/containerd/continuity/sysx/nodata_linux.go ================================================ [File too large to display: 665 B] ================================================ FILE: vendor/github.com/containerd/continuity/sysx/nodata_solaris.go ================================================ [File too large to display: 728 B] ================================================ FILE: vendor/github.com/containerd/continuity/sysx/nodata_unix.go ================================================ [File too large to display: 708 B] ================================================ FILE: vendor/github.com/containerd/continuity/sysx/xattr.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/containerd/errdefs/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/errdefs/README.md ================================================ [File too large to display: 597 B] ================================================ FILE: vendor/github.com/containerd/errdefs/errors.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/containerd/errdefs/pkg/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/errdefs/pkg/errgrpc/grpc.go ================================================ [File too large to display: 10.8 KB] ================================================ FILE: vendor/github.com/containerd/errdefs/pkg/internal/cause/cause.go ================================================ [File too large to display: 985 B] ================================================ FILE: vendor/github.com/containerd/errdefs/pkg/internal/types/collapsible.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/containerd/errdefs/resolve.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/containerd/log/.golangci.yml ================================================ [File too large to display: 558 B] ================================================ FILE: vendor/github.com/containerd/log/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/log/README.md ================================================ [File too large to display: 942 B] ================================================ FILE: vendor/github.com/containerd/log/context.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/containerd/platforms/.gitattributes ================================================ [File too large to display: 16 B] ================================================ FILE: vendor/github.com/containerd/platforms/.golangci.yml ================================================ [File too large to display: 520 B] ================================================ FILE: vendor/github.com/containerd/platforms/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/platforms/README.md ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/containerd/platforms/compare.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/containerd/platforms/cpuinfo.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/platforms/cpuinfo_linux.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/containerd/platforms/cpuinfo_other.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/containerd/platforms/database.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/containerd/platforms/defaults.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/platforms/defaults_darwin.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/platforms/defaults_freebsd.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/platforms/defaults_unix.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/platforms/defaults_windows.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/containerd/platforms/errors.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/platforms/platform_windows_compat.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/containerd/platforms/platforms.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/containerd/plugin/.golangci.yml ================================================ [File too large to display: 520 B] ================================================ FILE: vendor/github.com/containerd/plugin/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/plugin/README.md ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/plugin/context.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/containerd/plugin/plugin.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/containerd/stargz-snapshotter/estargz/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/containerd/stargz-snapshotter/estargz/build.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/containerd/stargz-snapshotter/estargz/errorutil/errors.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/stargz-snapshotter/estargz/estargz.go ================================================ [File too large to display: 32.4 KB] ================================================ FILE: vendor/github.com/containerd/stargz-snapshotter/estargz/gzip.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/containerd/stargz-snapshotter/estargz/testutil.go ================================================ [File too large to display: 68.1 KB] ================================================ FILE: vendor/github.com/containerd/stargz-snapshotter/estargz/types.go ================================================ [File too large to display: 12.5 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/.gitattributes ================================================ [File too large to display: 17 B] ================================================ FILE: vendor/github.com/containerd/ttrpc/.gitignore ================================================ [File too large to display: 204 B] ================================================ FILE: vendor/github.com/containerd/ttrpc/.golangci.yml ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/Makefile ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/PROTOCOL.md ================================================ [File too large to display: 12.5 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/Protobuild.toml ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/README.md ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/channel.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/client.go ================================================ [File too large to display: 12.8 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/codec.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/config.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/doc.go ================================================ [File too large to display: 876 B] ================================================ FILE: vendor/github.com/containerd/ttrpc/errors.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/handshake.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/interceptor.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/metadata.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/request.pb.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/request.proto ================================================ [File too large to display: 428 B] ================================================ FILE: vendor/github.com/containerd/ttrpc/server.go ================================================ [File too large to display: 12.7 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/services.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/stream.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/containerd/ttrpc/stream_server.go ================================================ [File too large to display: 703 B] ================================================ FILE: vendor/github.com/containerd/ttrpc/test.proto ================================================ [File too large to display: 239 B] ================================================ FILE: vendor/github.com/containerd/ttrpc/unixcreds_linux.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/containerd/typeurl/v2/.gitignore ================================================ [File too large to display: 20 B] ================================================ FILE: vendor/github.com/containerd/typeurl/v2/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/containerd/typeurl/v2/README.md ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/containerd/typeurl/v2/doc.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/containerd/typeurl/v2/types.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/containerd/typeurl/v2/types_gogo.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/CHANGELOG.md ================================================ [File too large to display: 11.8 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/LICENSE ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/README.md ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/VERSION ================================================ [File too large to display: 6 B] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/doc.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/gocompat_errors_go120.go ================================================ [File too large to display: 530 B] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/gocompat_errors_unsupported.go ================================================ [File too large to display: 850 B] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/gocompat_generics_go121.go ================================================ [File too large to display: 710 B] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/gocompat_generics_unsupported.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/join.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/lookup_linux.go ================================================ [File too large to display: 12.5 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/mkdir_linux.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/open_linux.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/openat2_linux.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/openat_linux.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/procfs_linux.go ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/github.com/cyphar/filepath-securejoin/vfs.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/dimchansky/utfbom/.gitignore ================================================ [File too large to display: 474 B] ================================================ FILE: vendor/github.com/dimchansky/utfbom/.travis.yml ================================================ [File too large to display: 771 B] ================================================ FILE: vendor/github.com/dimchansky/utfbom/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/dimchansky/utfbom/README.md ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/dimchansky/utfbom/utfbom.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/distribution/reference/.gitattributes ================================================ [File too large to display: 17 B] ================================================ FILE: vendor/github.com/distribution/reference/.gitignore ================================================ [File too large to display: 23 B] ================================================ FILE: vendor/github.com/distribution/reference/.golangci.yml ================================================ [File too large to display: 275 B] ================================================ FILE: vendor/github.com/distribution/reference/CODE-OF-CONDUCT.md ================================================ [File too large to display: 253 B] ================================================ FILE: vendor/github.com/distribution/reference/CONTRIBUTING.md ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/distribution/reference/GOVERNANCE.md ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/distribution/reference/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/distribution/reference/MAINTAINERS ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/distribution/reference/Makefile ================================================ [File too large to display: 694 B] ================================================ FILE: vendor/github.com/distribution/reference/README.md ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/distribution/reference/SECURITY.md ================================================ [File too large to display: 287 B] ================================================ FILE: vendor/github.com/distribution/reference/helpers.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/distribution/reference/normalize.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/github.com/distribution/reference/reference.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/distribution/reference/regexp.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/distribution/reference/sort.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/docker/cli/AUTHORS ================================================ [File too large to display: 34.0 KB] ================================================ FILE: vendor/github.com/docker/cli/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/docker/cli/NOTICE ================================================ [File too large to display: 635 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/config.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/docker/cli/cli/config/configfile/file.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/github.com/docker/cli/cli/config/configfile/file_unix.go ================================================ [File too large to display: 604 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/configfile/file_windows.go ================================================ [File too large to display: 97 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/credentials/credentials.go ================================================ [File too large to display: 575 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/credentials/default_store.go ================================================ [File too large to display: 515 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/credentials/default_store_darwin.go ================================================ [File too large to display: 85 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/credentials/default_store_linux.go ================================================ [File too large to display: 180 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.go ================================================ [File too large to display: 116 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/credentials/default_store_windows.go ================================================ [File too large to display: 81 B] ================================================ FILE: vendor/github.com/docker/cli/cli/config/credentials/file_store.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/docker/cli/cli/config/credentials/native_store.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/docker/cli/cli/config/types/authconfig.go ================================================ [File too large to display: 761 B] ================================================ FILE: vendor/github.com/docker/distribution/.dockerignore ================================================ [File too large to display: 5 B] ================================================ FILE: vendor/github.com/docker/distribution/.gitignore ================================================ [File too large to display: 441 B] ================================================ FILE: vendor/github.com/docker/distribution/.golangci.yml ================================================ [File too large to display: 718 B] ================================================ FILE: vendor/github.com/docker/distribution/.mailmap ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/docker/distribution/BUILDING.md ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/docker/distribution/CONTRIBUTING.md ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/github.com/docker/distribution/Dockerfile ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/docker/distribution/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/docker/distribution/MAINTAINERS ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/github.com/docker/distribution/Makefile ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/docker/distribution/README.md ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/docker/distribution/ROADMAP.md ================================================ [File too large to display: 13.1 KB] ================================================ FILE: vendor/github.com/docker/distribution/blobs.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/docker/distribution/doc.go ================================================ [File too large to display: 310 B] ================================================ FILE: vendor/github.com/docker/distribution/docker-bake.hcl ================================================ [File too large to display: 970 B] ================================================ FILE: vendor/github.com/docker/distribution/errors.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/distribution/manifests.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/docker/distribution/registry/client/auth/challenge/addr.go ================================================ [File too large to display: 703 B] ================================================ FILE: vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/docker/distribution/registry.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/docker/distribution/tags.go ================================================ [File too large to display: 959 B] ================================================ FILE: vendor/github.com/docker/distribution/vendor.conf ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/docker/docker/AUTHORS ================================================ [File too large to display: 91.4 KB] ================================================ FILE: vendor/github.com/docker/docker/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/docker/docker/NOTICE ================================================ [File too large to display: 642 B] ================================================ FILE: vendor/github.com/docker/docker/api/README.md ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/docker/docker/api/common.go ================================================ [File too large to display: 739 B] ================================================ FILE: vendor/github.com/docker/docker/api/swagger-gen.yaml ================================================ [File too large to display: 371 B] ================================================ FILE: vendor/github.com/docker/docker/api/swagger.yaml ================================================ [File too large to display: 448.0 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/backend/backend.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/backend/build.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/blkiodev/blkio.go ================================================ [File too large to display: 520 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/checkpoint/list.go ================================================ [File too large to display: 171 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/checkpoint/options.go ================================================ [File too large to display: 459 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/client.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/common/id_response.go ================================================ [File too large to display: 350 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/change_type.go ================================================ [File too large to display: 330 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/change_types.go ================================================ [File too large to display: 433 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/commit.go ================================================ [File too large to display: 216 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/config.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/container.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/create_request.go ================================================ [File too large to display: 511 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/create_response.go ================================================ [File too large to display: 494 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/errors.go ================================================ [File too large to display: 179 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/exec.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/filesystem_change.go ================================================ [File too large to display: 440 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/health.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/hostconfig.go ================================================ [File too large to display: 19.2 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/network_settings.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/options.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/port.go ================================================ [File too large to display: 547 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/stats.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/top_response.go ================================================ [File too large to display: 496 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/update_response.go ================================================ [File too large to display: 400 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/wait_exit_error.go ================================================ [File too large to display: 331 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/wait_response.go ================================================ [File too large to display: 442 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/container/waitcondition.go ================================================ [File too large to display: 866 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/error_response.go ================================================ [File too large to display: 324 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/error_response_ext.go ================================================ [File too large to display: 110 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/events/events.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/filters/errors.go ================================================ [File too large to display: 487 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/filters/parse.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/image/delete_response.go ================================================ [File too large to display: 429 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/image/image.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/image/image_history.go ================================================ [File too large to display: 865 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/image/image_inspect.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/image/manifest.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/image/opts.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/image/summary.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/mount/mount.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/network/create_response.go ================================================ [File too large to display: 483 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/network/endpoint.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/network/ipam.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/network/network.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugin.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugin_device.go ================================================ [File too large to display: 498 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugin_env.go ================================================ [File too large to display: 489 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugin_interface_type.go ================================================ [File too large to display: 468 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugin_mount.go ================================================ [File too large to display: 700 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugin_responses.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugins/logdriver/entry.pb.go ================================================ [File too large to display: 17.5 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugins/logdriver/entry.proto ================================================ [File too large to display: 260 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugins/logdriver/gen.go ================================================ [File too large to display: 201 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/plugins/logdriver/io.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/registry/authconfig.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/registry/authenticate.go ================================================ [File too large to display: 699 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/registry/registry.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/registry/search.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/storage/driver_data.go ================================================ [File too large to display: 662 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/strslice/strslice.go ================================================ [File too large to display: 828 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/common.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/config.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/container.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/network.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/node.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go ================================================ [File too large to display: 192 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go ================================================ [File too large to display: 18.8 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto ================================================ [File too large to display: 479 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/runtime.go ================================================ [File too large to display: 925 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/secret.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/service.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/service_create_response.go ================================================ [File too large to display: 556 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/service_update_response.go ================================================ [File too large to display: 343 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/swarm.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/swarm/task.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/system/info.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/system/runtime.go ================================================ [File too large to display: 594 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/system/security_opts.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/time/timestamp.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/types.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/types_deprecated.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/versions/compare.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/volume/cluster_volume.go ================================================ [File too large to display: 16.5 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/volume/create_options.go ================================================ [File too large to display: 836 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/volume/list_response.go ================================================ [File too large to display: 432 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/volume/options.go ================================================ [File too large to display: 377 B] ================================================ FILE: vendor/github.com/docker/docker/api/types/volume/volume.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/docker/docker/api/types/volume/volume_update.go ================================================ [File too large to display: 267 B] ================================================ FILE: vendor/github.com/docker/docker/builder/builder.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/buildargs.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/builder.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/builder_unix.go ================================================ [File too large to display: 178 B] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/builder_windows.go ================================================ [File too large to display: 217 B] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/containerbackend.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/copy.go ================================================ [File too large to display: 15.7 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/copy_unix.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/copy_windows.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go ================================================ [File too large to display: 20.4 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/evaluator.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/imagecontext.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/imageprobe.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/internals.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/internals_linux.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/internals_windows.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/dockerfile/metrics.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/archive.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/detect.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/filehash.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/git/gitutils.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/git.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/lazycontext.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/mimetype.go ================================================ [File too large to display: 815 B] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/remote.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/docker/docker/builder/remotecontext/urlutil/urlutil.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/docker/docker/client/README.md ================================================ [File too large to display: 958 B] ================================================ FILE: vendor/github.com/docker/docker/client/build_cancel.go ================================================ [File too large to display: 384 B] ================================================ FILE: vendor/github.com/docker/docker/client/build_prune.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/client/checkpoint.go ================================================ [File too large to display: 717 B] ================================================ FILE: vendor/github.com/docker/docker/client/checkpoint_create.go ================================================ [File too large to display: 556 B] ================================================ FILE: vendor/github.com/docker/docker/client/checkpoint_delete.go ================================================ [File too large to display: 689 B] ================================================ FILE: vendor/github.com/docker/docker/client/checkpoint_list.go ================================================ [File too large to display: 765 B] ================================================ FILE: vendor/github.com/docker/docker/client/client.go ================================================ [File too large to display: 16.1 KB] ================================================ FILE: vendor/github.com/docker/docker/client/client_deprecated.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/client/client_interfaces.go ================================================ [File too large to display: 13.6 KB] ================================================ FILE: vendor/github.com/docker/docker/client/client_unix.go ================================================ [File too large to display: 271 B] ================================================ FILE: vendor/github.com/docker/docker/client/client_windows.go ================================================ [File too large to display: 253 B] ================================================ FILE: vendor/github.com/docker/docker/client/config_create.go ================================================ [File too large to display: 696 B] ================================================ FILE: vendor/github.com/docker/docker/client/config_inspect.go ================================================ [File too large to display: 892 B] ================================================ FILE: vendor/github.com/docker/docker/client/config_list.go ================================================ [File too large to display: 901 B] ================================================ FILE: vendor/github.com/docker/docker/client/config_remove.go ================================================ [File too large to display: 443 B] ================================================ FILE: vendor/github.com/docker/docker/client/config_update.go ================================================ [File too large to display: 637 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_attach.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_commit.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_copy.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_create.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_diff.go ================================================ [File too large to display: 760 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_exec.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_export.go ================================================ [File too large to display: 590 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_inspect.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_kill.go ================================================ [File too large to display: 575 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_list.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_logs.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_pause.go ================================================ [File too large to display: 456 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_prune.go ================================================ [File too large to display: 972 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_remove.go ================================================ [File too large to display: 716 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_rename.go ================================================ [File too large to display: 525 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_resize.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_restart.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_start.go ================================================ [File too large to display: 751 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_stats.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_stop.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/client/container_top.go ================================================ [File too large to display: 859 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_unpause.go ================================================ [File too large to display: 442 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_update.go ================================================ [File too large to display: 770 B] ================================================ FILE: vendor/github.com/docker/docker/client/container_wait.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/docker/docker/client/disk_usage.go ================================================ [File too large to display: 803 B] ================================================ FILE: vendor/github.com/docker/docker/client/distribution_inspect.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/client/envvars.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/docker/docker/client/errors.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/docker/docker/client/events.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/docker/docker/client/hijack.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_build.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_create.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_history.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_history_opts.go ================================================ [File too large to display: 451 B] ================================================ FILE: vendor/github.com/docker/docker/client/image_import.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_inspect.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_inspect_opts.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_list.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_load.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_load_opts.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_prune.go ================================================ [File too large to display: 928 B] ================================================ FILE: vendor/github.com/docker/docker/client/image_pull.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_push.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_remove.go ================================================ [File too large to display: 709 B] ================================================ FILE: vendor/github.com/docker/docker/client/image_save.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_save_opts.go ================================================ [File too large to display: 790 B] ================================================ FILE: vendor/github.com/docker/docker/client/image_search.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/docker/docker/client/image_tag.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker/client/info.go ================================================ [File too large to display: 588 B] ================================================ FILE: vendor/github.com/docker/docker/client/login.go ================================================ [File too large to display: 698 B] ================================================ FILE: vendor/github.com/docker/docker/client/network_connect.go ================================================ [File too large to display: 717 B] ================================================ FILE: vendor/github.com/docker/docker/client/network_create.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/client/network_disconnect.go ================================================ [File too large to display: 701 B] ================================================ FILE: vendor/github.com/docker/docker/client/network_inspect.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/client/network_list.go ================================================ [File too large to display: 922 B] ================================================ FILE: vendor/github.com/docker/docker/client/network_prune.go ================================================ [File too large to display: 964 B] ================================================ FILE: vendor/github.com/docker/docker/client/network_remove.go ================================================ [File too large to display: 416 B] ================================================ FILE: vendor/github.com/docker/docker/client/node_inspect.go ================================================ [File too large to display: 767 B] ================================================ FILE: vendor/github.com/docker/docker/client/node_list.go ================================================ [File too large to display: 787 B] ================================================ FILE: vendor/github.com/docker/docker/client/node_remove.go ================================================ [File too large to display: 522 B] ================================================ FILE: vendor/github.com/docker/docker/client/node_update.go ================================================ [File too large to display: 537 B] ================================================ FILE: vendor/github.com/docker/docker/client/options.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/github.com/docker/docker/client/ping.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_create.go ================================================ [File too large to display: 601 B] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_disable.go ================================================ [File too large to display: 535 B] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_enable.go ================================================ [File too large to display: 546 B] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_inspect.go ================================================ [File too large to display: 724 B] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_install.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_list.go ================================================ [File too large to display: 840 B] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_push.go ================================================ [File too large to display: 561 B] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_remove.go ================================================ [File too large to display: 525 B] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_set.go ================================================ [File too large to display: 403 B] ================================================ FILE: vendor/github.com/docker/docker/client/plugin_upgrade.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/client/request.go ================================================ [File too large to display: 11.8 KB] ================================================ FILE: vendor/github.com/docker/docker/client/secret_create.go ================================================ [File too large to display: 736 B] ================================================ FILE: vendor/github.com/docker/docker/client/secret_inspect.go ================================================ [File too large to display: 892 B] ================================================ FILE: vendor/github.com/docker/docker/client/secret_list.go ================================================ [File too large to display: 901 B] ================================================ FILE: vendor/github.com/docker/docker/client/secret_remove.go ================================================ [File too large to display: 443 B] ================================================ FILE: vendor/github.com/docker/docker/client/secret_update.go ================================================ [File too large to display: 638 B] ================================================ FILE: vendor/github.com/docker/docker/client/service_create.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/docker/docker/client/service_inspect.go ================================================ [File too large to display: 1011 B] ================================================ FILE: vendor/github.com/docker/docker/client/service_list.go ================================================ [File too large to display: 872 B] ================================================ FILE: vendor/github.com/docker/docker/client/service_logs.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/client/service_remove.go ================================================ [File too large to display: 396 B] ================================================ FILE: vendor/github.com/docker/docker/client/service_update.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/docker/docker/client/swarm_get_unlock_key.go ================================================ [File too large to display: 566 B] ================================================ FILE: vendor/github.com/docker/docker/client/swarm_init.go ================================================ [File too large to display: 497 B] ================================================ FILE: vendor/github.com/docker/docker/client/swarm_inspect.go ================================================ [File too large to display: 487 B] ================================================ FILE: vendor/github.com/docker/docker/client/swarm_join.go ================================================ [File too large to display: 337 B] ================================================ FILE: vendor/github.com/docker/docker/client/swarm_leave.go ================================================ [File too large to display: 362 B] ================================================ FILE: vendor/github.com/docker/docker/client/swarm_unlock.go ================================================ [File too large to display: 350 B] ================================================ FILE: vendor/github.com/docker/docker/client/swarm_update.go ================================================ [File too large to display: 720 B] ================================================ FILE: vendor/github.com/docker/docker/client/task_inspect.go ================================================ [File too large to display: 795 B] ================================================ FILE: vendor/github.com/docker/docker/client/task_list.go ================================================ [File too large to display: 787 B] ================================================ FILE: vendor/github.com/docker/docker/client/task_logs.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker/client/utils.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/docker/docker/client/version.go ================================================ [File too large to display: 523 B] ================================================ FILE: vendor/github.com/docker/docker/client/volume_create.go ================================================ [File too large to display: 545 B] ================================================ FILE: vendor/github.com/docker/docker/client/volume_inspect.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/client/volume_list.go ================================================ [File too large to display: 909 B] ================================================ FILE: vendor/github.com/docker/docker/client/volume_prune.go ================================================ [File too large to display: 948 B] ================================================ FILE: vendor/github.com/docker/docker/client/volume_remove.go ================================================ [File too large to display: 914 B] ================================================ FILE: vendor/github.com/docker/docker/client/volume_update.go ================================================ [File too large to display: 770 B] ================================================ FILE: vendor/github.com/docker/docker/container/archive_windows.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/docker/docker/container/attach_context.go ================================================ [File too large to display: 732 B] ================================================ FILE: vendor/github.com/docker/docker/container/container.go ================================================ [File too large to display: 27.3 KB] ================================================ FILE: vendor/github.com/docker/docker/container/container_unix.go ================================================ [File too large to display: 13.6 KB] ================================================ FILE: vendor/github.com/docker/docker/container/container_windows.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/github.com/docker/docker/container/env.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker/container/exec.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/docker/docker/container/health.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/docker/docker/container/history.go ================================================ [File too large to display: 888 B] ================================================ FILE: vendor/github.com/docker/docker/container/memory_store.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/docker/docker/container/monitor.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/container/mounts_unix.go ================================================ [File too large to display: 589 B] ================================================ FILE: vendor/github.com/docker/docker/container/mounts_windows.go ================================================ [File too large to display: 256 B] ================================================ FILE: vendor/github.com/docker/docker/container/rwlayer.go ================================================ [File too large to display: 534 B] ================================================ FILE: vendor/github.com/docker/docker/container/state.go ================================================ [File too large to display: 12.0 KB] ================================================ FILE: vendor/github.com/docker/docker/container/store.go ================================================ [File too large to display: 1013 B] ================================================ FILE: vendor/github.com/docker/docker/container/stream/attach.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/docker/docker/container/stream/bytespipe/buffer.go ================================================ [File too large to display: 810 B] ================================================ FILE: vendor/github.com/docker/docker/container/stream/bytespipe/bytespipe.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/docker/docker/container/stream/streams.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/docker/docker/container/stream/unbuffered.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker/container/view.go ================================================ [File too large to display: 14.2 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/cluster/provider/network.go ================================================ [File too large to display: 908 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/graphdriver/driver.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/graphdriver/driver_freebsd.go ================================================ [File too large to display: 149 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/graphdriver/driver_linux.go ================================================ [File too large to display: 183 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/graphdriver/driver_unsupported.go ================================================ [File too large to display: 200 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/graphdriver/driver_windows.go ================================================ [File too large to display: 156 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/graphdriver/errors.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/graphdriver/fsdiff.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/graphdriver/utils.go ================================================ [File too large to display: 421 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/adapter.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/copier.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/factory.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go ================================================ [File too large to display: 713 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlogbytes.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go ================================================ [File too large to display: 602 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/jsonfilelog/read.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/local/config.go ================================================ [File too large to display: 802 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/local/doc.go ================================================ [File too large to display: 616 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/local/local.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/local/read.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/log_cache_opts.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/logger.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/logger_error.go ================================================ [File too large to display: 957 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/cache/local_cache.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/cache/validate.go ================================================ [File too large to display: 961 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/file_unix.go ================================================ [File too large to display: 298 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/file_windows.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/follow.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag.go ================================================ [File too large to display: 834 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/logfile.go ================================================ [File too large to display: 24.1 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/queue.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loggerutils/sharedtemp.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/loginfo.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/metrics.go ================================================ [File too large to display: 770 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/plugin.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/plugin_unix.go ================================================ [File too large to display: 795 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/plugin_unsupported.go ================================================ [File too large to display: 246 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/proxy.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/ring.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/logger/templates/templates.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/network/filter.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/docker/docker/daemon/network/network_mode.go ================================================ [File too large to display: 513 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/network/network_mode_unix.go ================================================ [File too large to display: 336 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/network/network_mode_windows.go ================================================ [File too large to display: 265 B] ================================================ FILE: vendor/github.com/docker/docker/daemon/network/settings.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/docker/docker/dockerversion/useragent.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/docker/docker/dockerversion/version_lib.go ================================================ [File too large to display: 415 B] ================================================ FILE: vendor/github.com/docker/docker/errdefs/defs.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/docker/docker/errdefs/doc.go ================================================ [File too large to display: 650 B] ================================================ FILE: vendor/github.com/docker/docker/errdefs/helpers.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/docker/docker/errdefs/http_helpers.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/errdefs/is.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/docker/docker/image/fs.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/docker/docker/image/image.go ================================================ [File too large to display: 8.6 KB] ================================================ FILE: vendor/github.com/docker/docker/image/image_os.go ================================================ [File too large to display: 369 B] ================================================ FILE: vendor/github.com/docker/docker/image/rootfs.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/docker/docker/image/store.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/cleanups/composite.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/lazyregexp/lazyregexp.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/multierror/multierror.go ================================================ [File too large to display: 818 B] ================================================ FILE: vendor/github.com/docker/docker/internal/platform/platform.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/platform/platform_linux.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/platform/platform_unix.go ================================================ [File too large to display: 687 B] ================================================ FILE: vendor/github.com/docker/docker/internal/platform/platform_windows.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/safepath/common.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/safepath/errors.go ================================================ [File too large to display: 975 B] ================================================ FILE: vendor/github.com/docker/docker/internal/safepath/join_linux.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/safepath/join_windows.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/safepath/k8s_safeopen_linux.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/safepath/safepath.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/unix_noeintr/epoll_linux.go ================================================ [File too large to display: 628 B] ================================================ FILE: vendor/github.com/docker/docker/internal/unix_noeintr/fs_unix.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/usergroup/add_linux.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/usergroup/add_unsupported.go ================================================ [File too large to display: 407 B] ================================================ FILE: vendor/github.com/docker/docker/internal/usergroup/const_windows.go ================================================ [File too large to display: 195 B] ================================================ FILE: vendor/github.com/docker/docker/internal/usergroup/lookup_unix.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/docker/docker/internal/usergroup/parser.go ================================================ [File too large to display: 479 B] ================================================ FILE: vendor/github.com/docker/docker/internal/usergroup/utils_unix.go ================================================ [File too large to display: 602 B] ================================================ FILE: vendor/github.com/docker/docker/layer/empty.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/layer/filestore.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/github.com/docker/docker/layer/layer.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/docker/docker/layer/layer_store.go ================================================ [File too large to display: 17.6 KB] ================================================ FILE: vendor/github.com/docker/docker/layer/layer_store_windows.go ================================================ [File too large to display: 299 B] ================================================ FILE: vendor/github.com/docker/docker/layer/layer_unix.go ================================================ [File too large to display: 246 B] ================================================ FILE: vendor/github.com/docker/docker/layer/layer_windows.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/layer/migration.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/docker/docker/layer/mounted_layer.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/docker/docker/layer/ro_layer.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/docker/docker/layer/ro_layer_windows.go ================================================ [File too large to display: 226 B] ================================================ FILE: vendor/github.com/docker/docker/libcontainerd/types/types.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/docker/docker/libcontainerd/types/types_linux.go ================================================ [File too large to display: 901 B] ================================================ FILE: vendor/github.com/docker/docker/libcontainerd/types/types_windows.go ================================================ [File too large to display: 869 B] ================================================ FILE: vendor/github.com/docker/docker/oci/caps/defaults.go ================================================ [File too large to display: 436 B] ================================================ FILE: vendor/github.com/docker/docker/oci/caps/utils.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/docker/docker/oci/caps/utils_linux.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/oci/caps/utils_other.go ================================================ [File too large to display: 130 B] ================================================ FILE: vendor/github.com/docker/docker/oci/defaults.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/docker/docker/oci/devices_linux.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/docker/docker/oci/namespaces.go ================================================ [File too large to display: 767 B] ================================================ FILE: vendor/github.com/docker/docker/oci/oci.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/archive/archive_deprecated.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/archive/changes_deprecated.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/archive/copy_deprecated.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/archive/diff_deprecated.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/archive/path_deprecated.go ================================================ [File too large to display: 348 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/archive/utils.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/archive/whiteouts_deprecated.go ================================================ [File too large to display: 480 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/archive/wrap_deprecated.go ================================================ [File too large to display: 277 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/homedir/homedir.go ================================================ [File too large to display: 756 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/homedir/homedir_linux.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/homedir/homedir_others.go ================================================ [File too large to display: 1023 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/idtools/idtools.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go ================================================ [File too large to display: 298 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/ioutils/fswriters_deprecated.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/ioutils/readers.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/ioutils/writers.go ================================================ [File too large to display: 556 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/longpath/longpath.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/parsers/kernel/kernel.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_darwin.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix.go ================================================ [File too large to display: 883 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_windows.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/parsers/kernel/uname_linux.go ================================================ [File too large to display: 248 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/parsers/kernel/uname_unsupported.go ================================================ [File too large to display: 409 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugingetter/getter.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugins/client.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugins/discovery.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugins/discovery_unix.go ================================================ [File too large to display: 852 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugins/discovery_windows.go ================================================ [File too large to display: 272 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugins/errors.go ================================================ [File too large to display: 662 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugins/plugins.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugins/transport/http.go ================================================ [File too large to display: 1017 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/plugins/transport/mimetype.go ================================================ [File too large to display: 313 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/pools/pools.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/progress/progress.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/progress/progressreader.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/rootless/rootless.go ================================================ [File too large to display: 249 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/streamformatter/streamformatter.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/streamformatter/streamwriter.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/stringid/stringid.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/args_windows.go ================================================ [File too large to display: 389 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/chtimes.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/chtimes_nowindows.go ================================================ [File too large to display: 334 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/chtimes_windows.go ================================================ [File too large to display: 701 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/errors.go ================================================ [File too large to display: 232 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/filesys.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/filesys_unix.go ================================================ [File too large to display: 267 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/filesys_windows.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/init_windows.go ================================================ [File too large to display: 542 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/utimes_unix.go ================================================ [File too large to display: 667 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go ================================================ [File too large to display: 263 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/xattrs.go ================================================ [File too large to display: 475 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/xattrs_linux.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go ================================================ [File too large to display: 411 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/tailfile/tailfile.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/tarsum/builder_context.go ================================================ [File too large to display: 693 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/tarsum/fileinfosums.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/tarsum/tarsum.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/tarsum/tarsum_spec.md ================================================ [File too large to display: 8.8 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/tarsum/versioning.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/docker/docker/pkg/tarsum/writercloser.go ================================================ [File too large to display: 308 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/useragent/README.md ================================================ [File too large to display: 100 B] ================================================ FILE: vendor/github.com/docker/docker/pkg/useragent/useragent.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/docker/docker/restartmanager/restartmanager.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/lcow_parser.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/linux_parser.go ================================================ [File too large to display: 12.7 KB] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/mounts.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/parser.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/validate.go ================================================ [File too large to display: 684 B] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/volume_copy.go ================================================ [File too large to display: 524 B] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/volume_unix.go ================================================ [File too large to display: 401 B] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/volume_windows.go ================================================ [File too large to display: 160 B] ================================================ FILE: vendor/github.com/docker/docker/volume/mounts/windows_parser.go ================================================ [File too large to display: 14.1 KB] ================================================ FILE: vendor/github.com/docker/docker/volume/volume.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/docker/docker-credential-helpers/LICENSE ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/docker/docker-credential-helpers/client/client.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/docker/docker-credential-helpers/client/command.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/docker/docker-credential-helpers/credentials/credentials.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/docker/docker-credential-helpers/credentials/error.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/docker/docker-credential-helpers/credentials/helper.go ================================================ [File too large to display: 509 B] ================================================ FILE: vendor/github.com/docker/docker-credential-helpers/credentials/version.go ================================================ [File too large to display: 399 B] ================================================ FILE: vendor/github.com/docker/go-connections/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/docker/go-connections/nat/nat.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/docker/go-connections/nat/parse.go ================================================ [File too large to display: 748 B] ================================================ FILE: vendor/github.com/docker/go-connections/nat/sort.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/docker/go-connections/sockets/README.md ================================================ ================================================ FILE: vendor/github.com/docker/go-connections/sockets/inmem_socket.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/docker/go-connections/sockets/proxy.go ================================================ [File too large to display: 909 B] ================================================ FILE: vendor/github.com/docker/go-connections/sockets/sockets.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/go-connections/sockets/sockets_unix.go ================================================ [File too large to display: 926 B] ================================================ FILE: vendor/github.com/docker/go-connections/sockets/sockets_windows.go ================================================ [File too large to display: 666 B] ================================================ FILE: vendor/github.com/docker/go-connections/sockets/tcp_socket.go ================================================ [File too large to display: 605 B] ================================================ FILE: vendor/github.com/docker/go-connections/sockets/unix_socket.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/docker/go-connections/tlsconfig/certpool.go ================================================ [File too large to display: 373 B] ================================================ FILE: vendor/github.com/docker/go-connections/tlsconfig/config.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go ================================================ [File too large to display: 460 B] ================================================ FILE: vendor/github.com/docker/go-events/.gitignore ================================================ [File too large to display: 266 B] ================================================ FILE: vendor/github.com/docker/go-events/CONTRIBUTING.md ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/docker/go-events/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/docker/go-events/MAINTAINERS ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/go-events/README.md ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/docker/go-events/SECURITY.md ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/docker/go-events/broadcast.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/docker/go-events/channel.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/docker/go-events/errors.go ================================================ [File too large to display: 272 B] ================================================ FILE: vendor/github.com/docker/go-events/event.go ================================================ [File too large to display: 457 B] ================================================ FILE: vendor/github.com/docker/go-events/filter.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/go-events/queue.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/docker/go-events/retry.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/github.com/docker/go-events/vendor.mod ================================================ [File too large to display: 87 B] ================================================ FILE: vendor/github.com/docker/go-events/vendor.sum ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/CONTRIBUTING.md ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/LICENSE.docs ================================================ [File too large to display: 19.5 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/NOTICE ================================================ [File too large to display: 519 B] ================================================ FILE: vendor/github.com/docker/go-metrics/README.md ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/counter.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/docs.go ================================================ [File too large to display: 171 B] ================================================ FILE: vendor/github.com/docker/go-metrics/gauge.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/handler.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/helpers.go ================================================ [File too large to display: 128 B] ================================================ FILE: vendor/github.com/docker/go-metrics/namespace.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/register.go ================================================ [File too large to display: 388 B] ================================================ FILE: vendor/github.com/docker/go-metrics/timer.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/docker/go-metrics/unit.go ================================================ [File too large to display: 274 B] ================================================ FILE: vendor/github.com/docker/go-units/CONTRIBUTING.md ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/docker/go-units/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/docker/go-units/MAINTAINERS ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/go-units/README.md ================================================ [File too large to display: 513 B] ================================================ FILE: vendor/github.com/docker/go-units/circle.yml ================================================ [File too large to display: 247 B] ================================================ FILE: vendor/github.com/docker/go-units/duration.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/docker/go-units/size.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/docker/go-units/ulimit.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/ePirat/docker-credential-gitlabci/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/ePirat/docker-credential-gitlabci/pkg/credhelper/credhelper.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/LICENSE ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/containers/containers.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/containers/enumerable.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/containers/iterator.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/containers/serialization.go ================================================ [File too large to display: 698 B] ================================================ FILE: vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/lists/lists.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go ================================================ [File too large to display: 898 B] ================================================ FILE: vendor/github.com/emirpasic/gods/trees/trees.go ================================================ [File too large to display: 793 B] ================================================ FILE: vendor/github.com/emirpasic/gods/utils/comparator.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/emirpasic/gods/utils/sort.go ================================================ [File too large to display: 771 B] ================================================ FILE: vendor/github.com/emirpasic/gods/utils/utils.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/certs.pb.go ================================================ [File too large to display: 23.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/certs.pb.validate.go ================================================ [File too large to display: 23.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/certs_vtproto.pb.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/clusters.pb.go ================================================ [File too large to display: 34.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/clusters.pb.validate.go ================================================ [File too large to display: 21.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/clusters_vtproto.pb.go ================================================ [File too large to display: 14.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/config_dump.pb.go ================================================ [File too large to display: 29.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/config_dump.pb.validate.go ================================================ [File too large to display: 24.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/config_dump_shared.pb.go ================================================ [File too large to display: 105.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/config_dump_shared.pb.validate.go ================================================ [File too large to display: 101.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/config_dump_shared_vtproto.pb.go ================================================ [File too large to display: 39.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/config_dump_vtproto.pb.go ================================================ [File too large to display: 10.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/init_dump.pb.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/init_dump.pb.validate.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/init_dump_vtproto.pb.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/listeners.pb.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/listeners.pb.validate.go ================================================ [File too large to display: 8.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/listeners_vtproto.pb.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/memory.pb.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/memory.pb.validate.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/memory_vtproto.pb.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/metrics.pb.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/metrics.pb.validate.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/metrics_vtproto.pb.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/mutex_stats.pb.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/mutex_stats.pb.validate.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/mutex_stats_vtproto.pb.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/server_info.pb.go ================================================ [File too large to display: 43.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/server_info.pb.validate.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/server_info_vtproto.pb.go ================================================ [File too large to display: 14.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/tap.pb.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/tap.pb.validate.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/tap_vtproto.pb.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/deprecation.pb.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/deprecation.pb.validate.go ================================================ [File too large to display: 601 B] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/resource.pb.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/resource.pb.validate.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/resource_vtproto.pb.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/accesslog/v3/accesslog.pb.go ================================================ [File too large to display: 80.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/accesslog/v3/accesslog.pb.validate.go ================================================ [File too large to display: 72.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/accesslog/v3/accesslog_vtproto.pb.go ================================================ [File too large to display: 37.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/bootstrap/v3/bootstrap.pb.go ================================================ [File too large to display: 159.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/bootstrap/v3/bootstrap.pb.validate.go ================================================ [File too large to display: 124.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/bootstrap/v3/bootstrap_vtproto.pb.go ================================================ [File too large to display: 71.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/circuit_breaker.pb.go ================================================ [File too large to display: 25.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/circuit_breaker.pb.validate.go ================================================ [File too large to display: 18.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/circuit_breaker_vtproto.pb.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/cluster.pb.go ================================================ [File too large to display: 245.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/cluster.pb.validate.go ================================================ [File too large to display: 139.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/cluster_vtproto.pb.go ================================================ [File too large to display: 78.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/filter.pb.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/filter.pb.validate.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/filter_vtproto.pb.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/outlier_detection.pb.go ================================================ [File too large to display: 40.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/outlier_detection.pb.validate.go ================================================ [File too large to display: 18.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/outlier_detection_vtproto.pb.go ================================================ [File too large to display: 12.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/common/matcher/v3/matcher.pb.go ================================================ [File too large to display: 78.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/common/matcher/v3/matcher.pb.validate.go ================================================ [File too large to display: 83.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/common/matcher/v3/matcher_vtproto.pb.go ================================================ [File too large to display: 46.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/address.pb.go ================================================ [File too large to display: 46.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/address.pb.validate.go ================================================ [File too large to display: 38.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/address_vtproto.pb.go ================================================ [File too large to display: 19.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/backoff.pb.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/backoff.pb.validate.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/backoff_vtproto.pb.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/base.pb.go ================================================ [File too large to display: 134.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/base.pb.validate.go ================================================ [File too large to display: 112.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/base_vtproto.pb.go ================================================ [File too large to display: 55.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/config_source.pb.go ================================================ [File too large to display: 55.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/config_source.pb.validate.go ================================================ [File too large to display: 35.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/config_source_vtproto.pb.go ================================================ [File too large to display: 18.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/event_service_config.pb.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/event_service_config.pb.validate.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/event_service_config_vtproto.pb.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/extension.pb.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/extension.pb.validate.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/extension_vtproto.pb.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_method_list.pb.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_method_list.pb.validate.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_method_list_vtproto.pb.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_service.pb.go ================================================ [File too large to display: 88.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_service.pb.validate.go ================================================ [File too large to display: 76.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_service_vtproto.pb.go ================================================ [File too large to display: 40.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/health_check.pb.go ================================================ [File too large to display: 83.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/health_check.pb.validate.go ================================================ [File too large to display: 61.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/health_check_vtproto.pb.go ================================================ [File too large to display: 32.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/http_service.pb.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/http_service.pb.validate.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/http_service_vtproto.pb.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/http_uri.pb.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/http_uri.pb.validate.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/http_uri_vtproto.pb.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/protocol.pb.go ================================================ [File too large to display: 132.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/protocol.pb.validate.go ================================================ [File too large to display: 86.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/protocol_vtproto.pb.go ================================================ [File too large to display: 41.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/proxy_protocol.pb.go ================================================ [File too large to display: 15.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/proxy_protocol.pb.validate.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/proxy_protocol_vtproto.pb.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/resolver.pb.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/resolver.pb.validate.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/resolver_vtproto.pb.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/socket_cmsg_headers.pb.go ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/socket_cmsg_headers.pb.validate.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/socket_cmsg_headers_vtproto.pb.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/socket_option.pb.go ================================================ [File too large to display: 23.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/socket_option.pb.validate.go ================================================ [File too large to display: 19.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/socket_option_vtproto.pb.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/substitution_format_string.pb.go ================================================ [File too large to display: 19.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/substitution_format_string.pb.validate.go ================================================ [File too large to display: 11.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/substitution_format_string_vtproto.pb.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/udp_socket_config.pb.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/udp_socket_config.pb.validate.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/udp_socket_config_vtproto.pb.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint.pb.go ================================================ [File too large to display: 25.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint.pb.validate.go ================================================ [File too large to display: 16.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint_components.pb.go ================================================ [File too large to display: 46.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint_components.pb.validate.go ================================================ [File too large to display: 36.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint_components_vtproto.pb.go ================================================ [File too large to display: 20.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint_vtproto.pb.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/load_report.pb.go ================================================ [File too large to display: 47.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/load_report.pb.validate.go ================================================ [File too large to display: 30.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/load_report_vtproto.pb.go ================================================ [File too large to display: 16.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/api_listener.pb.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/api_listener.pb.validate.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/api_listener_vtproto.pb.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener.pb.go ================================================ [File too large to display: 80.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener.pb.validate.go ================================================ [File too large to display: 56.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener_components.pb.go ================================================ [File too large to display: 60.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener_components.pb.validate.go ================================================ [File too large to display: 40.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener_components_vtproto.pb.go ================================================ [File too large to display: 26.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener_vtproto.pb.go ================================================ [File too large to display: 29.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/quic_config.pb.go ================================================ [File too large to display: 25.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/quic_config.pb.validate.go ================================================ [File too large to display: 13.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/quic_config_vtproto.pb.go ================================================ [File too large to display: 10.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/udp_listener_config.pb.go ================================================ [File too large to display: 14.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/udp_listener_config.pb.validate.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/udp_listener_config_vtproto.pb.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/metrics_service.pb.go ================================================ [File too large to display: 15.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/metrics_service.pb.validate.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/metrics_service_vtproto.pb.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/stats.pb.go ================================================ [File too large to display: 46.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/stats.pb.validate.go ================================================ [File too large to display: 35.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/stats_vtproto.pb.go ================================================ [File too large to display: 21.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/overload/v3/overload.pb.go ================================================ [File too large to display: 50.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/overload/v3/overload.pb.validate.go ================================================ [File too large to display: 46.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/overload/v3/overload_vtproto.pb.go ================================================ [File too large to display: 20.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/rbac/v3/rbac.pb.go ================================================ [File too large to display: 84.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/rbac/v3/rbac.pb.validate.go ================================================ [File too large to display: 71.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/rbac/v3/rbac_vtproto.pb.go ================================================ [File too large to display: 50.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route.pb.go ================================================ [File too large to display: 31.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route.pb.validate.go ================================================ [File too large to display: 18.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route_components.pb.go ================================================ [File too large to display: 447.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route_components.pb.validate.go ================================================ [File too large to display: 347.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route_components_vtproto.pb.go ================================================ [File too large to display: 195.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route_vtproto.pb.go ================================================ [File too large to display: 11.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/scoped_route.pb.go ================================================ [File too large to display: 20.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/scoped_route.pb.validate.go ================================================ [File too large to display: 13.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/scoped_route_vtproto.pb.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/tap/v3/common.pb.go ================================================ [File too large to display: 71.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/tap/v3/common.pb.validate.go ================================================ [File too large to display: 64.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/tap/v3/common_vtproto.pb.go ================================================ [File too large to display: 35.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/datadog.pb.go ================================================ [File too large to display: 12.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/datadog.pb.validate.go ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/datadog_vtproto.pb.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/dynamic_ot.pb.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/dynamic_ot.pb.validate.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/dynamic_ot_vtproto.pb.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/http_tracer.pb.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/http_tracer.pb.validate.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/http_tracer_vtproto.pb.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/lightstep.pb.go ================================================ [File too large to display: 13.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/lightstep.pb.validate.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/lightstep_vtproto.pb.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/opentelemetry.pb.go ================================================ [File too large to display: 12.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/opentelemetry.pb.validate.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/opentelemetry_vtproto.pb.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/service.pb.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/service.pb.validate.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/service_vtproto.pb.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/skywalking.pb.go ================================================ [File too large to display: 15.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/skywalking.pb.validate.go ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/skywalking_vtproto.pb.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/trace.pb.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/trace.pb.validate.go ================================================ [File too large to display: 595 B] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/xray.pb.go ================================================ [File too large to display: 13.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/xray.pb.validate.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/xray_vtproto.pb.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/zipkin.pb.go ================================================ [File too large to display: 18.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/zipkin.pb.validate.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/zipkin_vtproto.pb.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/data/accesslog/v3/accesslog.pb.go ================================================ [File too large to display: 131.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/data/accesslog/v3/accesslog.pb.validate.go ================================================ [File too large to display: 63.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/data/accesslog/v3/accesslog_vtproto.pb.go ================================================ [File too large to display: 45.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/aggregate/v3/cluster.pb.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/aggregate/v3/cluster.pb.validate.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/aggregate/v3/cluster_vtproto.pb.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/common/fault/v3/fault.pb.go ================================================ [File too large to display: 26.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/common/fault/v3/fault.pb.validate.go ================================================ [File too large to display: 21.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/common/fault/v3/fault_vtproto.pb.go ================================================ [File too large to display: 10.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/fault/v3/fault.pb.go ================================================ [File too large to display: 32.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/fault/v3/fault.pb.validate.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/fault/v3/fault_vtproto.pb.go ================================================ [File too large to display: 13.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/rbac/v3/rbac.pb.go ================================================ [File too large to display: 16.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/rbac/v3/rbac.pb.validate.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/rbac/v3/rbac_vtproto.pb.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3/router.pb.go ================================================ [File too large to display: 25.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3/router.pb.validate.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3/router_vtproto.pb.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go ================================================ [File too large to display: 243.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go ================================================ [File too large to display: 138.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager_vtproto.pb.go ================================================ [File too large to display: 78.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.pb.go ================================================ [File too large to display: 20.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.pb.validate.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin_vtproto.pb.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/common/v3/common.pb.go ================================================ [File too large to display: 30.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/common/v3/common.pb.validate.go ================================================ [File too large to display: 23.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/common/v3/common_vtproto.pb.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/least_request/v3/least_request.pb.go ================================================ [File too large to display: 21.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/least_request/v3/least_request.pb.validate.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/least_request/v3/least_request_vtproto.pb.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.pb.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.pb.validate.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first_vtproto.pb.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.pb.go ================================================ [File too large to display: 22.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.pb.validate.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash_vtproto.pb.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.pb.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.pb.validate.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality_vtproto.pb.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/rbac/audit_loggers/stream/v3/stream.pb.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/rbac/audit_loggers/stream/v3/stream.pb.validate.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/rbac/audit_loggers/stream/v3/stream_vtproto.pb.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/cert.pb.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/cert.pb.validate.go ================================================ [File too large to display: 612 B] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/common.pb.go ================================================ [File too large to display: 85.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/common.pb.validate.go ================================================ [File too large to display: 46.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/common_vtproto.pb.go ================================================ [File too large to display: 27.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/secret.pb.go ================================================ [File too large to display: 20.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/secret.pb.validate.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/secret_vtproto.pb.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls.pb.go ================================================ [File too large to display: 89.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls.pb.validate.go ================================================ [File too large to display: 55.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.pb.go ================================================ [File too large to display: 15.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.pb.validate.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config_vtproto.pb.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls_vtproto.pb.go ================================================ [File too large to display: 31.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/ads.pb.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/ads.pb.validate.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/ads_grpc.pb.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/ads_vtproto.pb.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/discovery.pb.go ================================================ [File too large to display: 83.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/discovery.pb.validate.go ================================================ [File too large to display: 66.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/discovery_vtproto.pb.go ================================================ [File too large to display: 38.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/load_stats/v3/lrs.pb.go ================================================ [File too large to display: 15.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/load_stats/v3/lrs.pb.validate.go ================================================ [File too large to display: 8.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/load_stats/v3/lrs_grpc.pb.go ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/load_stats/v3/lrs_vtproto.pb.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/status/v3/csds.pb.go ================================================ [File too large to display: 45.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/status/v3/csds.pb.validate.go ================================================ [File too large to display: 28.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/status/v3/csds_grpc.pb.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/service/status/v3/csds_vtproto.pb.go ================================================ [File too large to display: 19.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/cookie.pb.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/cookie.pb.validate.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/cookie_vtproto.pb.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/path_transformation.pb.go ================================================ [File too large to display: 17.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/path_transformation.pb.validate.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/path_transformation_vtproto.pb.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/address.pb.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/address.pb.validate.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/address_vtproto.pb.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/filter_state.pb.go ================================================ [File too large to display: 9.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/filter_state.pb.validate.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/filter_state_vtproto.pb.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/http_inputs.pb.go ================================================ [File too large to display: 17.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/http_inputs.pb.validate.go ================================================ [File too large to display: 17.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/http_inputs_vtproto.pb.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/metadata.pb.go ================================================ [File too large to display: 12.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/metadata.pb.validate.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/metadata_vtproto.pb.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/node.pb.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/node.pb.validate.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/node_vtproto.pb.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/number.pb.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/number.pb.validate.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/number_vtproto.pb.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/path.pb.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/path.pb.validate.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/path_vtproto.pb.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/regex.pb.go ================================================ [File too large to display: 18.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/regex.pb.validate.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/regex_vtproto.pb.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/status_code_input.pb.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/status_code_input.pb.validate.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/status_code_input_vtproto.pb.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/string.pb.go ================================================ [File too large to display: 15.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/string.pb.validate.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/string_vtproto.pb.go ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/struct.pb.go ================================================ [File too large to display: 12.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/struct.pb.validate.go ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/struct_vtproto.pb.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/value.pb.go ================================================ [File too large to display: 21.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/value.pb.validate.go ================================================ [File too large to display: 20.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/value_vtproto.pb.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/metadata/v3/metadata.pb.go ================================================ [File too large to display: 24.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/metadata/v3/metadata.pb.validate.go ================================================ [File too large to display: 26.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/metadata/v3/metadata_vtproto.pb.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/tracing/v3/custom_tag.pb.go ================================================ [File too large to display: 23.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/tracing/v3/custom_tag.pb.validate.go ================================================ [File too large to display: 21.8 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/tracing/v3/custom_tag_vtproto.pb.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/hash_policy.pb.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/hash_policy.pb.validate.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/hash_policy_vtproto.pb.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http.pb.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http.pb.validate.go ================================================ [File too large to display: 585 B] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http_status.pb.go ================================================ [File too large to display: 23.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http_status.pb.validate.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http_status_vtproto.pb.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/percent.pb.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/percent.pb.validate.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/percent_vtproto.pb.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/range.pb.go ================================================ [File too large to display: 10.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/range.pb.validate.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/range_vtproto.pb.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/ratelimit_strategy.pb.go ================================================ [File too large to display: 17.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/ratelimit_strategy.pb.validate.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/ratelimit_strategy_vtproto.pb.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/ratelimit_unit.pb.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/ratelimit_unit.pb.validate.go ================================================ [File too large to display: 595 B] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/semantic_version.pb.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/semantic_version.pb.validate.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/semantic_version_vtproto.pb.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/token_bucket.pb.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/token_bucket.pb.validate.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/token_bucket_vtproto.pb.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/protoc-gen-validate/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/envoyproxy/protoc-gen-validate/validate/BUILD ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/envoyproxy/protoc-gen-validate/validate/validate.h ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/envoyproxy/protoc-gen-validate/validate/validate.pb.go ================================================ [File too large to display: 139.5 KB] ================================================ FILE: vendor/github.com/envoyproxy/protoc-gen-validate/validate/validate.proto ================================================ [File too large to display: 30.5 KB] ================================================ FILE: vendor/github.com/felixge/httpsnoop/.gitignore ================================================ ================================================ FILE: vendor/github.com/felixge/httpsnoop/LICENSE.txt ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/felixge/httpsnoop/Makefile ================================================ [File too large to display: 128 B] ================================================ FILE: vendor/github.com/felixge/httpsnoop/README.md ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/felixge/httpsnoop/capture_metrics.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/felixge/httpsnoop/docs.go ================================================ [File too large to display: 392 B] ================================================ FILE: vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/.cirrus.yml ================================================ [File too large to display: 593 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/.gitignore ================================================ [File too large to display: 125 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/.mailmap ================================================ [File too large to display: 122 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/CHANGELOG.md ================================================ [File too large to display: 22.9 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/LICENSE ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/README.md ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/backend_fen.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/backend_inotify.go ================================================ [File too large to display: 14.7 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/backend_kqueue.go ================================================ [File too large to display: 17.3 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/backend_other.go ================================================ [File too large to display: 830 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/backend_windows.go ================================================ [File too large to display: 16.4 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/fsnotify.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/darwin.go ================================================ [File too large to display: 980 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go ================================================ [File too large to display: 958 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go ================================================ [File too large to display: 591 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_linux.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go ================================================ [File too large to display: 666 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go ================================================ [File too large to display: 790 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_solaris.go ================================================ [File too large to display: 965 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/debug_windows.go ================================================ [File too large to display: 877 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/freebsd.go ================================================ [File too large to display: 756 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/internal.go ================================================ [File too large to display: 60 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/unix.go ================================================ [File too large to display: 782 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/unix2.go ================================================ [File too large to display: 92 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/internal/windows.go ================================================ [File too large to display: 968 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/shared.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/staticcheck.conf ================================================ [File too large to display: 72 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/system_bsd.go ================================================ [File too large to display: 170 B] ================================================ FILE: vendor/github.com/fsnotify/fsnotify/system_darwin.go ================================================ [File too large to display: 163 B] ================================================ FILE: vendor/github.com/go-git/gcfg/.gitignore ================================================ [File too large to display: 13 B] ================================================ FILE: vendor/github.com/go-git/gcfg/LICENSE ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/Makefile ================================================ [File too large to display: 310 B] ================================================ FILE: vendor/github.com/go-git/gcfg/README ================================================ [File too large to display: 153 B] ================================================ FILE: vendor/github.com/go-git/gcfg/doc.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/errors.go ================================================ [File too large to display: 863 B] ================================================ FILE: vendor/github.com/go-git/gcfg/read.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/scanner/errors.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/scanner/scanner.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/set.go ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/token/position.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/token/serialize.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/token/token.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/types/bool.go ================================================ [File too large to display: 574 B] ================================================ FILE: vendor/github.com/go-git/gcfg/types/doc.go ================================================ [File too large to display: 122 B] ================================================ FILE: vendor/github.com/go-git/gcfg/types/enum.go ================================================ [File too large to display: 998 B] ================================================ FILE: vendor/github.com/go-git/gcfg/types/int.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/go-git/gcfg/types/scan.go ================================================ [File too large to display: 623 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/.gitignore ================================================ [File too large to display: 66 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/CODE_OF_CONDUCT.md ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/COMPATIBILITY.md ================================================ [File too large to display: 21.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/CONTRIBUTING.md ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/EXTENDING.md ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/Makefile ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/README.md ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/SECURITY.md ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/blame.go ================================================ [File too large to display: 15.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/common.go ================================================ [File too large to display: 453 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/config/branch.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/config/config.go ================================================ [File too large to display: 16.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/config/modules.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/config/refspec.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/config/url.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/doc.go ================================================ [File too large to display: 480 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/internal/path_util/path_util.go ================================================ [File too large to display: 605 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/internal/revision/parser.go ================================================ [File too large to display: 12.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/internal/revision/scanner.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/internal/revision/token.go ================================================ [File too large to display: 266 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/internal/url/url.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/object_walker.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/options.go ================================================ [File too large to display: 28.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/oss-fuzz.sh ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/cache/buffer_lru.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/cache/common.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/cache/object_lru.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/color/color.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/error.go ================================================ [File too large to display: 589 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/filemode/filemode.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/config/common.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/config/decoder.go ================================================ [File too large to display: 736 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/config/doc.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/config/encoder.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/config/format.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/config/option.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/config/section.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/diff/patch.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/dir.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/doc.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/matcher.go ================================================ [File too large to display: 934 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/gitignore/pattern.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/doc.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/encoder.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/idxfile.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/writer.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/index/doc.go ================================================ [File too large to display: 13.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/index/index.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/index/match.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/doc.go ================================================ [File too large to display: 85 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/reader.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/objfile/writer.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/common.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_index.go ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/delta_selector.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/diff_delta.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/doc.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/encoder.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/error.go ================================================ [File too large to display: 645 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/fsobject.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/object_pack.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/packfile.go ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/parser.go ================================================ [File too large to display: 14.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/patch_delta.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/packfile/scanner.go ================================================ [File too large to display: 10.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/encoder.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/error.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/format/pktline/scanner.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/hash/hash.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha1.go ================================================ [File too large to display: 324 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/hash/hash_sha256.go ================================================ [File too large to display: 324 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/hash.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/memory.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/blob.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/change.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/change_adaptor.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/commit.go ================================================ [File too large to display: 13.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_bfs_filtered.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_ctime.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_limit.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/commit_walker_path.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/difftree.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/file.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/merge_base.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/object.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/patch.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/rename.go ================================================ [File too large to display: 18.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/signature.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/tag.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/tree.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object/treenoder.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/object.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_decode.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/advrefs_encode.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/capability.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability/list.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/common.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/doc.go ================================================ [File too large to display: 26.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/filter.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/gitproto.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/report_status.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/shallowupd.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/common.go ================================================ [File too large to display: 802 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/demux.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/doc.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband/muxer.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/srvresp.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_decode.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/ulreq_encode.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_decode.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/updreq_encode.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackreq.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/protocol/packp/uppackresp.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/reference.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/revision.go ================================================ [File too large to display: 281 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/revlist/revlist.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/storer/doc.go ================================================ [File too large to display: 91 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/storer/index.go ================================================ [File too large to display: 214 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/storer/object.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/storer/reference.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/storer/shallow.go ================================================ [File too large to display: 318 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/storer/storer.go ================================================ [File too large to display: 409 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/client/client.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/common.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/file/client.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/file/server.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/git/common.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/http/common.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/http/receive_pack.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/http/transport.go ================================================ [File too large to display: 831 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/http/upload_pack.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/common.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/mocks.go ================================================ [File too large to display: 870 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/internal/common/server.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/server/loader.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/server/server.go ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/auth_method.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/prune.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/remote.go ================================================ [File too large to display: 36.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/repository.go ================================================ [File too large to display: 47.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/signer.go ================================================ [File too large to display: 828 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/status.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/config.go ================================================ [File too large to display: 812 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/deltaobject.go ================================================ [File too large to display: 620 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit.go ================================================ [File too large to display: 30.5 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/dotgit_setref.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/reader.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/repository_filesystem.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/dotgit/writers.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/index.go ================================================ [File too large to display: 904 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/module.go ================================================ [File too large to display: 424 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/object.go ================================================ [File too large to display: 19.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/reference.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/shallow.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/filesystem/storage.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/memory/storage.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/storage/storer.go ================================================ [File too large to display: 888 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/submodule.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/binary/read.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/binary/write.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/diff/diff.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/ioutil/common.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/change.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/difftree.go ================================================ [File too large to display: 14.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/doc.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/doubleiter.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/filesystem/node.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/index/node.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame/frame.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/iter.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/noder.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/merkletrie/noder/path.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/sync/bufio.go ================================================ [File too large to display: 640 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/sync/bytes.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/sync/zlib.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/utils/trace/trace.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree.go ================================================ [File too large to display: 26.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree_bsd.go ================================================ [File too large to display: 458 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree_commit.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree_js.go ================================================ [File too large to display: 456 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree_linux.go ================================================ [File too large to display: 452 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree_plan9.go ================================================ [File too large to display: 575 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree_status.go ================================================ [File too large to display: 16.7 KB] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree_unix_other.go ================================================ [File too large to display: 457 B] ================================================ FILE: vendor/github.com/go-git/go-git/v5/worktree_windows.go ================================================ [File too large to display: 731 B] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/.gitignore ================================================ [File too large to display: 35 B] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/.golangci.yml ================================================ [File too large to display: 991 B] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/.travis.yml ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/CHANGELOG.md ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/CONTRIBUTING.md ================================================ [File too large to display: 431 B] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/README.md ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/SECURITY.md ================================================ [File too large to display: 682 B] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/asymmetric.go ================================================ [File too large to display: 15.7 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/cipher/cbc_hmac.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/cipher/concat_kdf.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/cipher/ecdh_es.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/cipher/key_wrap.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/crypter.go ================================================ [File too large to display: 16.5 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/doc.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/encoding.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/json/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/json/README.md ================================================ [File too large to display: 632 B] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/json/decode.go ================================================ [File too large to display: 29.5 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/json/encode.go ================================================ [File too large to display: 30.8 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/json/indent.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/json/scanner.go ================================================ [File too large to display: 16.5 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/json/stream.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/json/tags.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/jwe.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/jwk.go ================================================ [File too large to display: 22.6 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/jws.go ================================================ [File too large to display: 15.1 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/opaque.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/shared.go ================================================ [File too large to display: 15.7 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/signing.go ================================================ [File too large to display: 14.8 KB] ================================================ FILE: vendor/github.com/go-jose/go-jose/v4/symmetric.go ================================================ [File too large to display: 12.4 KB] ================================================ FILE: vendor/github.com/go-logr/logr/.golangci.yaml ================================================ [File too large to display: 377 B] ================================================ FILE: vendor/github.com/go-logr/logr/CHANGELOG.md ================================================ [File too large to display: 140 B] ================================================ FILE: vendor/github.com/go-logr/logr/CONTRIBUTING.md ================================================ [File too large to display: 579 B] ================================================ FILE: vendor/github.com/go-logr/logr/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/go-logr/logr/README.md ================================================ [File too large to display: 19.0 KB] ================================================ FILE: vendor/github.com/go-logr/logr/SECURITY.md ================================================ [File too large to display: 727 B] ================================================ FILE: vendor/github.com/go-logr/logr/context.go ================================================ [File too large to display: 1015 B] ================================================ FILE: vendor/github.com/go-logr/logr/context_noslog.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/go-logr/logr/context_slog.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/go-logr/logr/discard.go ================================================ [File too large to display: 833 B] ================================================ FILE: vendor/github.com/go-logr/logr/funcr/funcr.go ================================================ [File too large to display: 26.4 KB] ================================================ FILE: vendor/github.com/go-logr/logr/funcr/slogsink.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/go-logr/logr/logr.go ================================================ [File too large to display: 20.2 KB] ================================================ FILE: vendor/github.com/go-logr/logr/sloghandler.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/go-logr/logr/slogr.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/go-logr/logr/slogsink.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/go-logr/stdr/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/go-logr/stdr/README.md ================================================ [File too large to display: 317 B] ================================================ FILE: vendor/github.com/go-logr/stdr/stdr.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/AUTHORS ================================================ [File too large to display: 562 B] ================================================ FILE: vendor/github.com/gogo/protobuf/CONTRIBUTORS ================================================ [File too large to display: 845 B] ================================================ FILE: vendor/github.com/gogo/protobuf/LICENSE ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/gogoproto/Makefile ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/gogoproto/doc.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go ================================================ [File too large to display: 32.4 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/gogoproto/gogo.proto ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/gogoproto/helper.go ================================================ [File too large to display: 15.6 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/Makefile ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/clone.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/custom_gogo.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/decode.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/deprecated.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/discard.go ================================================ [File too large to display: 9.8 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/duration.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/duration_gogo.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/encode.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/encode_gogo.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/equal.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/extensions.go ================================================ [File too large to display: 17.9 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/extensions_gogo.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/lib.go ================================================ [File too large to display: 26.4 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/lib_gogo.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/message_set.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/pointer_reflect.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/properties.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/properties_gogo.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/skip_gogo.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/table_marshal.go ================================================ [File too large to display: 78.8 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go ================================================ [File too large to display: 10.8 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/table_merge.go ================================================ [File too large to display: 17.5 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/table_unmarshal.go ================================================ [File too large to display: 54.1 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/text.go ================================================ [File too large to display: 22.9 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/text_gogo.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/text_parser.go ================================================ [File too large to display: 25.2 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/timestamp.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/wrappers.go ================================================ [File too large to display: 48.5 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go ================================================ [File too large to display: 114.8 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go ================================================ [File too large to display: 25.3 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/any.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/any.pb.go ================================================ [File too large to display: 17.3 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/api.pb.go ================================================ [File too large to display: 51.1 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/doc.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/duration.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/duration.pb.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/duration_gogo.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/empty.pb.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/field_mask.pb.go ================================================ [File too large to display: 19.0 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/protosize.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/source_context.pb.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/struct.pb.go ================================================ [File too large to display: 51.3 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/timestamp.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/timestamp.pb.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/timestamp_gogo.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/type.pb.go ================================================ [File too large to display: 78.1 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/wrappers.pb.go ================================================ [File too large to display: 59.9 KB] ================================================ FILE: vendor/github.com/gogo/protobuf/types/wrappers_gogo.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/golang/groupcache/LICENSE ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/golang/groupcache/lru/lru.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/golang/mock/AUTHORS ================================================ [File too large to display: 371 B] ================================================ FILE: vendor/github.com/golang/mock/CONTRIBUTORS ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/golang/mock/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/golang/mock/gomock/call.go ================================================ [File too large to display: 14.3 KB] ================================================ FILE: vendor/github.com/golang/mock/gomock/callset.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/golang/mock/gomock/controller.go ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/github.com/golang/mock/gomock/matchers.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/golang/protobuf/AUTHORS ================================================ [File too large to display: 173 B] ================================================ FILE: vendor/github.com/golang/protobuf/CONTRIBUTORS ================================================ [File too large to display: 170 B] ================================================ FILE: vendor/github.com/golang/protobuf/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/buffer.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/defaults.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/deprecated.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/discard.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/extensions.go ================================================ [File too large to display: 10.7 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/properties.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/proto.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/registry.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/text_decode.go ================================================ [File too large to display: 19.6 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/text_encode.go ================================================ [File too large to display: 12.7 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/wire.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/golang/protobuf/proto/wrappers.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/.gitignore ================================================ [File too large to display: 22 B] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md ================================================ [File too large to display: 865 B] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/README.md ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/SECURITY.md ================================================ [File too large to display: 875 B] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/VERSION_HISTORY.md ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/claims.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/doc.go ================================================ [File too large to display: 166 B] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/ecdsa.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/ecdsa_utils.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/ed25519.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/ed25519_utils.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/errors.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/hmac.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/map_claims.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/none.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/parser.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/parser_option.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/rsa.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/rsa_pss.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/rsa_utils.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/signing_method.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/staticcheck.conf ================================================ [File too large to display: 61 B] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/token.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/golang-jwt/jwt/v4/types.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/google/go-cmp/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/compare.go ================================================ [File too large to display: 22.4 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/export.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go ================================================ [File too large to display: 406 B] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go ================================================ [File too large to display: 12.9 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go ================================================ [File too large to display: 311 B] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/internal/function/func.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/internal/value/name.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/internal/value/pointer.go ================================================ [File too large to display: 873 B] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/internal/value/sort.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/options.go ================================================ [File too large to display: 19.1 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/path.go ================================================ [File too large to display: 12.9 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/report.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/report_compare.go ================================================ [File too large to display: 12.9 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/report_references.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/report_reflect.go ================================================ [File too large to display: 12.9 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/report_slices.go ================================================ [File too large to display: 19.9 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/report_text.go ================================================ [File too large to display: 11.5 KB] ================================================ FILE: vendor/github.com/google/go-cmp/cmp/report_value.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/and/and_closer.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/compression/compression.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/estargz/estargz.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/gzip/zip.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/redact/redact.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/retry/retry.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/retry/wait/kubernetes_apimachinery_wait.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/verify/verify.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/internal/zstd/zstd.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/README.md ================================================ [File too large to display: 12.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/anon.go ================================================ [File too large to display: 963 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/auth.go ================================================ [File too large to display: 1007 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/authn.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/basic.go ================================================ [File too large to display: 917 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/bearer.go ================================================ [File too large to display: 894 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/doc.go ================================================ [File too large to display: 723 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/keychain.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/authn/multikeychain.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/compression/compression.go ================================================ [File too large to display: 916 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/logs/logs.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/README.md ================================================ [File too large to display: 166 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/check.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/digest.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/doc.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/errors.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/options.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/ref.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/registry.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/repository.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/name/tag.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/config.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/daemon/README.md ================================================ [File too large to display: 525 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/daemon/doc.go ================================================ [File too large to display: 719 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/daemon/image.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/daemon/options.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/daemon/write.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/doc.go ================================================ [File too large to display: 706 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/empty/README.md ================================================ [File too large to display: 572 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/empty/doc.go ================================================ [File too large to display: 708 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/empty/image.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/empty/index.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/google/README.md ================================================ [File too large to display: 304 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/google/auth.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/google/doc.go ================================================ [File too large to display: 691 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/google/keychain.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/google/list.go ================================================ [File too large to display: 8.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/google/options.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/hash.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/image.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/index.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layer.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/README.md ================================================ [File too large to display: 337 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/blob.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/doc.go ================================================ [File too large to display: 815 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/gc.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/image.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/index.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/layoutpath.go ================================================ [File too large to display: 864 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/options.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/read.go ================================================ [File too large to display: 930 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/layout/write.go ================================================ [File too large to display: 13.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/manifest.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/match/match.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/mutate/README.md ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/mutate/doc.go ================================================ [File too large to display: 697 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.go ================================================ [File too large to display: 14.2 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/mutate/rebase.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/partial/README.md ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/partial/compressed.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/partial/doc.go ================================================ [File too large to display: 755 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/partial/image.go ================================================ [File too large to display: 993 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/partial/index.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/partial/uncompressed.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/platform.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/progress.go ================================================ [File too large to display: 896 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/random/doc.go ================================================ [File too large to display: 700 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/random/image.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/random/index.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/random/options.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/README.md ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/catalog.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/check.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/delete.go ================================================ [File too large to display: 934 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/doc.go ================================================ [File too large to display: 727 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/fetcher.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/layer.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/list.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/mount.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.go ================================================ [File too large to display: 10.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/puller.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/pusher.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/referrers.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/schema1.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/README.md ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/basic.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/bearer.go ================================================ [File too large to display: 11.5 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/doc.go ================================================ [File too large to display: 810 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/logger.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/ping.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/schemer.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/scope.go ================================================ [File too large to display: 865 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/transport.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/useragent.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.go ================================================ [File too large to display: 20.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/stream/README.md ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/tarball/README.md ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/tarball/doc.go ================================================ [File too large to display: 723 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.go ================================================ [File too large to display: 10.8 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.go ================================================ [File too large to display: 9.8 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.go ================================================ [File too large to display: 13.4 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/types/types.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/validate/doc.go ================================================ [File too large to display: 696 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/validate/image.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/validate/index.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/validate/layer.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/validate/options.go ================================================ [File too large to display: 977 B] ================================================ FILE: vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.go ================================================ [File too large to display: 8.6 KB] ================================================ FILE: vendor/github.com/google/go-github/AUTHORS ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/google/go-github/LICENSE ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/activity.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/google/go-github/github/activity_events.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/activity_notifications.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/google/go-github/github/activity_star.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/activity_watching.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/admin.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/admin_stats.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/apps.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/apps_installation.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/google/go-github/github/apps_marketplace.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/google/go-github/github/authorizations.go ================================================ [File too large to display: 14.3 KB] ================================================ FILE: vendor/github.com/google/go-github/github/checks.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/doc.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/event_types.go ================================================ [File too large to display: 33.8 KB] ================================================ FILE: vendor/github.com/google/go-github/github/gists.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/gists_comments.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/google/go-github/github/git.go ================================================ [File too large to display: 362 B] ================================================ FILE: vendor/github.com/google/go-github/github/git_blobs.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/git_commits.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/google/go-github/github/git_refs.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/git_tags.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/git_trees.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-github/github/github-accessors.go ================================================ [File too large to display: 273.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/github.go ================================================ [File too large to display: 33.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/gitignore.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/issues.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/github.com/google/go-github/github/issues_assignees.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-github/github/issues_comments.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/issues_events.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/issues_labels.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/issues_milestones.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/issues_timeline.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/google/go-github/github/licenses.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/google/go-github/github/messages.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/migrations.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/migrations_source_import.go ================================================ [File too large to display: 12.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/migrations_user.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/misc.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/orgs.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/google/go-github/github/orgs_hooks.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/orgs_members.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/github.com/google/go-github/github/orgs_outside_collaborators.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/google/go-github/github/orgs_projects.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/orgs_users_blocking.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/google/go-github/github/projects.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/pulls.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/github.com/google/go-github/github/pulls_comments.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/pulls_reviewers.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/pulls_reviews.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/github.com/google/go-github/github/reactions.go ================================================ [File too large to display: 8.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos.go ================================================ [File too large to display: 40.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_collaborators.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_comments.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_commits.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_community_health.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_contents.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_deployments.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_forks.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_hooks.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_invitations.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_keys.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_merging.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_pages.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_prereceive_hooks.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_projects.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_releases.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_stats.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_statuses.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/repos_traffic.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/search.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/strings.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/google/go-github/github/teams.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/google/go-github/github/teams_discussion_comments.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/teams_discussions.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/google/go-github/github/teams_members.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/google/go-github/github/timestamp.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/google/go-github/github/users.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/google/go-github/github/users_administration.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/go-github/github/users_blocking.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/users_emails.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/google/go-github/github/users_followers.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/google/go-github/github/users_gpg_keys.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/google/go-github/github/users_keys.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/google/go-github/github/with_appengine.go ================================================ [File too large to display: 463 B] ================================================ FILE: vendor/github.com/google/go-github/github/without_appengine.go ================================================ [File too large to display: 418 B] ================================================ FILE: vendor/github.com/google/go-querystring/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/go-querystring/query/encode.go ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/github.com/google/s2a-go/.gitignore ================================================ [File too large to display: 139 B] ================================================ FILE: vendor/github.com/google/s2a-go/CODE_OF_CONDUCT.md ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/google/s2a-go/CONTRIBUTING.md ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/google/s2a-go/LICENSE.md ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/google/s2a-go/README.md ================================================ [File too large to display: 789 B] ================================================ FILE: vendor/github.com/google/s2a-go/fallback/s2a_fallback.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/authinfo/authinfo.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/handshaker/handshaker.go ================================================ [File too large to display: 16.1 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/handshaker/service/service.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/proto/common_go_proto/common.pb.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/proto/s2a_context_go_proto/s2a_context.pb.go ================================================ [File too large to display: 12.0 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/proto/s2a_go_proto/s2a.pb.go ================================================ [File too large to display: 56.0 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/proto/s2a_go_proto/s2a_grpc.pb.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/proto/v2/common_go_proto/common.pb.go ================================================ [File too large to display: 21.1 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/proto/v2/s2a_context_go_proto/s2a_context.pb.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/proto/v2/s2a_go_proto/s2a.pb.go ================================================ [File too large to display: 113.9 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/proto/v2/s2a_go_proto/s2a_grpc.pb.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/aeadcrypter.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/aesgcm.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/chachapoly.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/common.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/internal/halfconn/ciphersuite.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/internal/halfconn/counter.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/internal/halfconn/expander.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/internal/halfconn/halfconn.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/record.go ================================================ [File too large to display: 28.4 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/record/ticketsender.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/tokenmanager/tokenmanager.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/v2/README.md ================================================ [File too large to display: 82 B] ================================================ FILE: vendor/github.com/google/s2a-go/internal/v2/certverifier/certverifier.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/v2/remotesigner/remotesigner.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/v2/s2av2.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/github.com/google/s2a-go/internal/v2/tlsconfigstore/tlsconfigstore.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/github.com/google/s2a-go/retry/retry.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/google/s2a-go/s2a.go ================================================ [File too large to display: 15.6 KB] ================================================ FILE: vendor/github.com/google/s2a-go/s2a_options.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/google/s2a-go/s2a_utils.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/google/s2a-go/stream/s2a_stream.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/google/slowjam/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/google/slowjam/pkg/stacklog/stacklog.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/google/subcommands/CONTRIBUTING ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/subcommands/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/google/subcommands/README.md ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/google/subcommands/subcommands.go ================================================ [File too large to display: 15.1 KB] ================================================ FILE: vendor/github.com/google/uuid/CHANGELOG.md ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/google/uuid/CONTRIBUTING.md ================================================ [File too large to display: 956 B] ================================================ FILE: vendor/github.com/google/uuid/CONTRIBUTORS ================================================ [File too large to display: 105 B] ================================================ FILE: vendor/github.com/google/uuid/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/uuid/README.md ================================================ [File too large to display: 839 B] ================================================ FILE: vendor/github.com/google/uuid/dce.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/uuid/doc.go ================================================ [File too large to display: 407 B] ================================================ FILE: vendor/github.com/google/uuid/hash.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/google/uuid/marshal.go ================================================ [File too large to display: 907 B] ================================================ FILE: vendor/github.com/google/uuid/node.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/google/uuid/node_js.go ================================================ [File too large to display: 498 B] ================================================ FILE: vendor/github.com/google/uuid/node_net.go ================================================ [File too large to display: 949 B] ================================================ FILE: vendor/github.com/google/uuid/null.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/google/uuid/sql.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/google/uuid/time.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/google/uuid/util.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/google/uuid/uuid.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/github.com/google/uuid/version1.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/google/uuid/version4.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/google/uuid/version6.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/google/uuid/version7.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/googleapis/enterprise-certificate-proxy/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/googleapis/enterprise-certificate-proxy/client/client.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/googleapis/enterprise-certificate-proxy/client/util/util.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/.release-please-manifest.json ================================================ [File too large to display: 23 B] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/CHANGES.md ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/apierror/apierror.go ================================================ [File too large to display: 11.8 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/README.md ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/custom_error.pb.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/custom_error.proto ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/error.pb.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/apierror/internal/proto/error.proto ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/call_option.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/callctx/callctx.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/content_type.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/gax.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/header.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/internal/version.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/internallog/grpclog/grpclog.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/internallog/internal/internal.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/internallog/internallog.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/invoke.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/iterator/iterator.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/proto_json_stream.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/googleapis/gax-go/v2/release-please-config.json ================================================ [File too large to display: 191 B] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/.gitignore ================================================ [File too large to display: 266 B] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/CHANGELOG.md ================================================ [File too large to display: 570 B] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/LICENSE ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/README.md ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/edges.go ================================================ [File too large to display: 267 B] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/iradix.go ================================================ [File too large to display: 18.7 KB] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/iter.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/node.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/raw_iter.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/hashicorp/go-immutable-radix/reverse_iter.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/.gitignore ================================================ [File too large to display: 273 B] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/CODEOWNERS ================================================ [File too large to display: 546 B] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/LICENSE ================================================ [File too large to display: 15.6 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/README.md ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/changes.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/filter.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/index.go ================================================ [File too large to display: 25.1 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/memdb.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/schema.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/txn.go ================================================ [File too large to display: 30.8 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/watch.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/hashicorp/go-memdb/watch_few.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/hashicorp/golang-lru/LICENSE ================================================ [File too large to display: 15.6 KB] ================================================ FILE: vendor/github.com/hashicorp/golang-lru/simplelru/lru.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/.gitignore ================================================ [File too large to display: 75 B] ================================================ FILE: vendor/github.com/hashicorp/hcl/.travis.yml ================================================ [File too large to display: 98 B] ================================================ FILE: vendor/github.com/hashicorp/hcl/LICENSE ================================================ [File too large to display: 15.6 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/Makefile ================================================ [File too large to display: 264 B] ================================================ FILE: vendor/github.com/hashicorp/hcl/README.md ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/appveyor.yml ================================================ [File too large to display: 319 B] ================================================ FILE: vendor/github.com/hashicorp/hcl/decoder.go ================================================ [File too large to display: 17.9 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/ast/ast.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/ast/walk.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/parser/error.go ================================================ [File too large to display: 266 B] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/parser/parser.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go ================================================ [File too large to display: 19.3 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/printer/printer.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go ================================================ [File too large to display: 14.4 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/token/position.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl/token/token.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/hcl.go ================================================ [File too large to display: 480 B] ================================================ FILE: vendor/github.com/hashicorp/hcl/json/parser/flatten.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/json/parser/parser.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/json/scanner/scanner.go ================================================ [File too large to display: 10.4 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/json/token/position.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/json/token/token.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/hashicorp/hcl/lex.go ================================================ [File too large to display: 494 B] ================================================ FILE: vendor/github.com/hashicorp/hcl/parse.go ================================================ [File too large to display: 892 B] ================================================ FILE: vendor/github.com/inconshreveable/mousetrap/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/inconshreveable/mousetrap/README.md ================================================ [File too large to display: 848 B] ================================================ FILE: vendor/github.com/inconshreveable/mousetrap/trap_others.go ================================================ [File too large to display: 503 B] ================================================ FILE: vendor/github.com/inconshreveable/mousetrap/trap_windows.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/jbenet/go-context/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/jbenet/go-context/io/ctxio.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/.gitignore ================================================ [File too large to display: 418 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/LICENSE ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/README.md ================================================ [File too large to display: 15.2 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/azure-pipelines.yml ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/bench.sh ================================================ [File too large to display: 321 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/debug_development.go ================================================ [File too large to display: 284 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/debug_release.go ================================================ [File too large to display: 128 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/dirent.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/doc.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/inoWithFileno.go ================================================ [File too large to display: 157 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/inoWithIno.go ================================================ [File too large to display: 151 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/modeType.go ================================================ [File too large to display: 693 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/modeTypeWithType.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/modeTypeWithoutType.go ================================================ [File too large to display: 537 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/nameWithNamlen.go ================================================ [File too large to display: 827 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/nameWithoutNamlen.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/readdir.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/readdir_unix.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/readdir_windows.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/reclenFromNamlen.go ================================================ [File too large to display: 147 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/reclenFromReclen.go ================================================ [File too large to display: 173 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/scandir_unix.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/scandir_windows.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/karrick/godirwalk/scanner.go ================================================ [File too large to display: 953 B] ================================================ FILE: vendor/github.com/karrick/godirwalk/walk.go ================================================ [File too large to display: 14.8 KB] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/.gitattributes ================================================ [File too large to display: 28 B] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/.gitignore ================================================ ================================================ FILE: vendor/github.com/kevinburke/ssh_config/.mailmap ================================================ [File too large to display: 60 B] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/AUTHORS.txt ================================================ [File too large to display: 359 B] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/CHANGELOG.md ================================================ [File too large to display: 567 B] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/LICENSE ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/Makefile ================================================ [File too large to display: 705 B] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/README.md ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/config.go ================================================ [File too large to display: 22.0 KB] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/lexer.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/parser.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/position.go ================================================ [File too large to display: 711 B] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/token.go ================================================ [File too large to display: 847 B] ================================================ FILE: vendor/github.com/kevinburke/ssh_config/validators.go ================================================ [File too large to display: 8.8 KB] ================================================ FILE: vendor/github.com/klauspost/compress/.gitattributes ================================================ [File too large to display: 26 B] ================================================ FILE: vendor/github.com/klauspost/compress/.gitignore ================================================ [File too large to display: 360 B] ================================================ FILE: vendor/github.com/klauspost/compress/.goreleaser.yml ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/klauspost/compress/LICENSE ================================================ [File too large to display: 16.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/README.md ================================================ [File too large to display: 51.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/SECURITY.md ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/klauspost/compress/compressible.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/klauspost/compress/fse/README.md ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/klauspost/compress/fse/bitreader.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/klauspost/compress/fse/bitwriter.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/fse/bytereader.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/fse/compress.go ================================================ [File too large to display: 17.0 KB] ================================================ FILE: vendor/github.com/klauspost/compress/fse/decompress.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/fse/fse.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/klauspost/compress/gen.sh ================================================ [File too large to display: 52 B] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/.gitignore ================================================ [File too large to display: 16 B] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/README.md ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/bitreader.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/bitwriter.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/compress.go ================================================ [File too large to display: 18.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/decompress.go ================================================ [File too large to display: 29.0 KB] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/decompress_amd64.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/decompress_amd64.s ================================================ [File too large to display: 15.0 KB] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/decompress_generic.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/github.com/klauspost/compress/huff0/huff0.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.go ================================================ [File too large to display: 820 B] ================================================ FILE: vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.go ================================================ [File too large to display: 209 B] ================================================ FILE: vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.s ================================================ [File too large to display: 562 B] ================================================ FILE: vendor/github.com/klauspost/compress/internal/le/le.go ================================================ [File too large to display: 117 B] ================================================ FILE: vendor/github.com/klauspost/compress/internal/le/unsafe_disabled.go ================================================ [File too large to display: 935 B] ================================================ FILE: vendor/github.com/klauspost/compress/internal/le/unsafe_enabled.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/klauspost/compress/internal/snapref/LICENSE ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/klauspost/compress/internal/snapref/decode.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/internal/snapref/decode_other.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/internal/snapref/encode.go ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/github.com/klauspost/compress/internal/snapref/encode_other.go ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/internal/snapref/snappy.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/klauspost/compress/s2sx.mod ================================================ [File too large to display: 46 B] ================================================ FILE: vendor/github.com/klauspost/compress/s2sx.sum ================================================ ================================================ FILE: vendor/github.com/klauspost/compress/zstd/README.md ================================================ [File too large to display: 20.9 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/bitreader.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/bitwriter.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/blockdec.go ================================================ [File too large to display: 18.5 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/blockenc.go ================================================ [File too large to display: 23.6 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/blocktype_string.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/bytebuf.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/bytereader.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/decodeheader.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/decoder.go ================================================ [File too large to display: 22.9 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/decoder_options.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/dict.go ================================================ [File too large to display: 12.7 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/enc_base.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/enc_best.go ================================================ [File too large to display: 16.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/enc_better.go ================================================ [File too large to display: 34.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/enc_dfast.go ================================================ [File too large to display: 30.1 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/enc_fast.go ================================================ [File too large to display: 22.7 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/encoder.go ================================================ [File too large to display: 14.9 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/encoder_options.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/framedec.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/frameenc.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/fse_decoder.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/fse_decoder_amd64.s ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/fse_decoder_generic.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/fse_encoder.go ================================================ [File too large to display: 18.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/fse_predefined.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/hash.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/history.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_arm64.s ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_asm.go ================================================ [File too large to display: 328 B] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_safe.go ================================================ [File too large to display: 291 B] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/matchlen_amd64.go ================================================ [File too large to display: 377 B] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/matchlen_amd64.s ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/matchlen_generic.go ================================================ [File too large to display: 684 B] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/seqdec.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/seqdec_amd64.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/seqdec_amd64.s ================================================ [File too large to display: 81.6 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/seqdec_generic.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/seqenc.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/snappy.go ================================================ [File too large to display: 12.8 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/zip.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/klauspost/compress/zstd/zstd.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/magiconair/properties/.gitignore ================================================ [File too large to display: 63 B] ================================================ FILE: vendor/github.com/magiconair/properties/CHANGELOG.md ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/github.com/magiconair/properties/LICENSE.md ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/magiconair/properties/README.md ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/magiconair/properties/decode.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/github.com/magiconair/properties/doc.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/magiconair/properties/integrate.go ================================================ [File too large to display: 787 B] ================================================ FILE: vendor/github.com/magiconair/properties/lex.go ================================================ [File too large to display: 8.6 KB] ================================================ FILE: vendor/github.com/magiconair/properties/load.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/magiconair/properties/parser.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/magiconair/properties/properties.go ================================================ [File too large to display: 22.7 KB] ================================================ FILE: vendor/github.com/magiconair/properties/rangecheck.go ================================================ [File too large to display: 843 B] ================================================ FILE: vendor/github.com/minio/highwayhash/.gitignore ================================================ [File too large to display: 6 B] ================================================ FILE: vendor/github.com/minio/highwayhash/.golangci.yml ================================================ [File too large to display: 628 B] ================================================ FILE: vendor/github.com/minio/highwayhash/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/README.md ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhashAVX2_amd64.s ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhashSVE_arm64.s ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash_amd64.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash_amd64.s ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash_arm64.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash_arm64.s ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash_generic.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash_ppc64le.go ================================================ [File too large to display: 697 B] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash_ppc64le.s ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/minio/highwayhash/highwayhash_ref.go ================================================ [File too large to display: 604 B] ================================================ FILE: vendor/github.com/mitchellh/go-homedir/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/mitchellh/go-homedir/README.md ================================================ [File too large to display: 681 B] ================================================ FILE: vendor/github.com/mitchellh/go-homedir/homedir.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/mitchellh/mapstructure/CHANGELOG.md ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/mitchellh/mapstructure/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/mitchellh/mapstructure/README.md ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/mitchellh/mapstructure/decode_hooks.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/mitchellh/mapstructure/error.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/mitchellh/mapstructure/mapstructure.go ================================================ [File too large to display: 44.0 KB] ================================================ FILE: vendor/github.com/moby/buildkit/AUTHORS ================================================ [File too large to display: 13.0 KB] ================================================ FILE: vendor/github.com/moby/buildkit/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/command/command.go ================================================ [File too large to display: 969 B] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/dockerignore/dockerignore_deprecated.go ================================================ [File too large to display: 275 B] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/bflag.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands_rundevice.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands_runmount.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands_runnetwork.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/commands_runsecurity.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/errors_unix.go ================================================ [File too large to display: 199 B] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/errors_windows.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/exclude_pattern_feature.go ================================================ [File too large to display: 99 B] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/parse.go ================================================ [File too large to display: 22.5 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/parse_parents.go ================================================ [File too large to display: 83 B] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/instructions/support.go ================================================ [File too large to display: 541 B] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/linter/linter.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/linter/ruleset.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/parser/directives.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/parser/errors.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/parser/line_parsers.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/parser/parser.go ================================================ [File too large to display: 16.1 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/parser/split_command.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/shell/envVarTest ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/shell/equal_env_unix.go ================================================ [File too large to display: 492 B] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/shell/equal_env_windows.go ================================================ [File too large to display: 523 B] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/shell/lex.go ================================================ [File too large to display: 17.6 KB] ================================================ FILE: vendor/github.com/moby/buildkit/frontend/dockerfile/shell/wordsTest ================================================ [File too large to display: 915 B] ================================================ FILE: vendor/github.com/moby/buildkit/util/stack/compress.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/moby/buildkit/util/stack/stack.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/moby/buildkit/util/stack/stack.pb.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/github.com/moby/buildkit/util/stack/stack.proto ================================================ [File too large to display: 303 B] ================================================ FILE: vendor/github.com/moby/buildkit/util/stack/stack_vtproto.pb.go ================================================ [File too large to display: 14.1 KB] ================================================ FILE: vendor/github.com/moby/buildkit/util/suggest/error.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/moby/docker-image-spec/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/docker-image-spec/specs-go/v1/image.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/moby/go-archive/.gitattributes ================================================ [File too large to display: 40 B] ================================================ FILE: vendor/github.com/moby/go-archive/.gitignore ================================================ [File too large to display: 14 B] ================================================ FILE: vendor/github.com/moby/go-archive/.golangci.yml ================================================ [File too large to display: 820 B] ================================================ FILE: vendor/github.com/moby/go-archive/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/go-archive/archive.go ================================================ [File too large to display: 36.0 KB] ================================================ FILE: vendor/github.com/moby/go-archive/archive_linux.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/moby/go-archive/archive_other.go ================================================ [File too large to display: 122 B] ================================================ FILE: vendor/github.com/moby/go-archive/archive_unix.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/moby/go-archive/archive_windows.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/moby/go-archive/changes.go ================================================ [File too large to display: 11.8 KB] ================================================ FILE: vendor/github.com/moby/go-archive/changes_linux.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/moby/go-archive/changes_other.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/moby/go-archive/changes_unix.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/moby/go-archive/changes_windows.go ================================================ [File too large to display: 879 B] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/archive.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/archive_linux.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/archive_unix.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/archive_unix_nolinux.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/archive_windows.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/chroot_linux.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/diff.go ================================================ [File too large to display: 830 B] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/diff_unix.go ================================================ [File too large to display: 929 B] ================================================ FILE: vendor/github.com/moby/go-archive/chrootarchive/diff_windows.go ================================================ [File too large to display: 882 B] ================================================ FILE: vendor/github.com/moby/go-archive/compression/compression.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/github.com/moby/go-archive/compression/compression_detect.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/moby/go-archive/copy.go ================================================ [File too large to display: 17.1 KB] ================================================ FILE: vendor/github.com/moby/go-archive/copy_unix.go ================================================ [File too large to display: 141 B] ================================================ FILE: vendor/github.com/moby/go-archive/copy_windows.go ================================================ [File too large to display: 122 B] ================================================ FILE: vendor/github.com/moby/go-archive/dev_freebsd.go ================================================ [File too large to display: 164 B] ================================================ FILE: vendor/github.com/moby/go-archive/dev_unix.go ================================================ [File too large to display: 182 B] ================================================ FILE: vendor/github.com/moby/go-archive/diff.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/moby/go-archive/diff_unix.go ================================================ [File too large to display: 634 B] ================================================ FILE: vendor/github.com/moby/go-archive/diff_windows.go ================================================ [File too large to display: 118 B] ================================================ FILE: vendor/github.com/moby/go-archive/internal/mounttree/switchroot_linux.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/moby/go-archive/internal/unshare/unshare_linux.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/moby/go-archive/path.go ================================================ [File too large to display: 877 B] ================================================ FILE: vendor/github.com/moby/go-archive/path_unix.go ================================================ [File too large to display: 248 B] ================================================ FILE: vendor/github.com/moby/go-archive/path_windows.go ================================================ [File too large to display: 651 B] ================================================ FILE: vendor/github.com/moby/go-archive/tarheader/tarheader.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/moby/go-archive/tarheader/tarheader_unix.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/moby/go-archive/tarheader/tarheader_windows.go ================================================ [File too large to display: 237 B] ================================================ FILE: vendor/github.com/moby/go-archive/time.go ================================================ [File too large to display: 580 B] ================================================ FILE: vendor/github.com/moby/go-archive/time_nonwindows.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/moby/go-archive/time_windows.go ================================================ [File too large to display: 694 B] ================================================ FILE: vendor/github.com/moby/go-archive/whiteouts.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/moby/go-archive/wrap.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/moby/go-archive/xattr_supported.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/moby/go-archive/xattr_supported_linux.go ================================================ [File too large to display: 75 B] ================================================ FILE: vendor/github.com/moby/go-archive/xattr_supported_unix.go ================================================ [File too large to display: 106 B] ================================================ FILE: vendor/github.com/moby/go-archive/xattr_unsupported.go ================================================ [File too large to display: 236 B] ================================================ FILE: vendor/github.com/moby/locker/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/moby/locker/README.md ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/moby/locker/locker.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/moby/patternmatcher/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/moby/patternmatcher/NOTICE ================================================ [File too large to display: 519 B] ================================================ FILE: vendor/github.com/moby/patternmatcher/ignorefile/ignorefile.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/moby/patternmatcher/patternmatcher.go ================================================ [File too large to display: 12.7 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/agent/exec/controller.go ================================================ [File too large to display: 10.9 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/agent/exec/controller_stub.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/agent/exec/errors.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/agent/exec/executor.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/README.md ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/api.pb.txt ================================================ [File too large to display: 250.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/ca.pb.go ================================================ [File too large to display: 65.7 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/ca.proto ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/control.pb.go ================================================ [File too large to display: 705.3 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/control.proto ================================================ [File too large to display: 28.7 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/deepcopy/copy.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/dispatcher.pb.go ================================================ [File too large to display: 135.8 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/dispatcher.proto ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/equality/equality.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/health.pb.go ================================================ [File too large to display: 20.8 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/health.proto ================================================ [File too large to display: 914 B] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/logbroker.pb.go ================================================ [File too large to display: 98.7 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/logbroker.proto ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/objects.pb.go ================================================ [File too large to display: 262.2 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/objects.proto ================================================ [File too large to display: 18.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/raft.pb.go ================================================ [File too large to display: 115.1 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/raft.proto ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/resource.pb.go ================================================ [File too large to display: 33.5 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/resource.proto ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/snapshot.pb.go ================================================ [File too large to display: 40.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/snapshot.proto ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/specs.pb.go ================================================ [File too large to display: 237.9 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/specs.proto ================================================ [File too large to display: 21.6 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/storeobject.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/types.pb.go ================================================ [File too large to display: 690.6 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/types.proto ================================================ [File too large to display: 61.2 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/watch.pb.go ================================================ [File too large to display: 117.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/api/watch.proto ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/log/context.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/log/grpc.go ================================================ [File too large to display: 874 B] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/manager/raftselector/raftselector.go ================================================ [File too large to display: 581 B] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/protobuf/plugin/helpers.go ================================================ [File too large to display: 337 B] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/protobuf/plugin/plugin.pb.go ================================================ [File too large to display: 30.4 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/protobuf/plugin/plugin.proto ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/protobuf/ptypes/doc.go ================================================ [File too large to display: 98 B] ================================================ FILE: vendor/github.com/moby/swarmkit/v2/protobuf/ptypes/timestamp.go ================================================ [File too large to display: 358 B] ================================================ FILE: vendor/github.com/moby/sys/atomicwriter/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/atomicwriter/atomicwriter.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/moby/sys/mount/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/mount/doc.go ================================================ [File too large to display: 187 B] ================================================ FILE: vendor/github.com/moby/sys/mount/flags_bsd.go ================================================ [File too large to display: 990 B] ================================================ FILE: vendor/github.com/moby/sys/mount/flags_linux.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/moby/sys/mount/flags_unix.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/moby/sys/mount/mount_errors.go ================================================ [File too large to display: 935 B] ================================================ FILE: vendor/github.com/moby/sys/mount/mount_unix.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/moby/sys/mount/mounter_freebsd.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/moby/sys/mount/mounter_linux.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/moby/sys/mount/mounter_openbsd.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/moby/sys/mount/mounter_unsupported.go ================================================ [File too large to display: 327 B] ================================================ FILE: vendor/github.com/moby/sys/mount/sharedsubtree_linux.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/doc.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mounted_linux.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mounted_unix.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mountinfo.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mountinfo_bsd.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mountinfo_freebsdlike.go ================================================ [File too large to display: 351 B] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mountinfo_openbsd.go ================================================ [File too large to display: 302 B] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go ================================================ [File too large to display: 426 B] ================================================ FILE: vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go ================================================ [File too large to display: 181 B] ================================================ FILE: vendor/github.com/moby/sys/reexec/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/reexec/reexec.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/moby/sys/reexec/reexec_linux.go ================================================ [File too large to display: 218 B] ================================================ FILE: vendor/github.com/moby/sys/reexec/reexec_other.go ================================================ [File too large to display: 153 B] ================================================ FILE: vendor/github.com/moby/sys/sequential/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/sequential/doc.go ================================================ [File too large to display: 688 B] ================================================ FILE: vendor/github.com/moby/sys/sequential/sequential_unix.go ================================================ [File too large to display: 692 B] ================================================ FILE: vendor/github.com/moby/sys/sequential/sequential_windows.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/moby/sys/signal/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/signal/signal.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/moby/sys/signal/signal_darwin.go ================================================ [File too large to display: 1013 B] ================================================ FILE: vendor/github.com/moby/sys/signal/signal_freebsd.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/moby/sys/signal/signal_linux.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/moby/sys/signal/signal_linux_mipsx.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/moby/sys/signal/signal_unix.go ================================================ [File too large to display: 604 B] ================================================ FILE: vendor/github.com/moby/sys/signal/signal_unsupported.go ================================================ [File too large to display: 246 B] ================================================ FILE: vendor/github.com/moby/sys/signal/signal_windows.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/moby/sys/symlink/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/symlink/LICENSE.APACHE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/moby/sys/symlink/LICENSE.BSD ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/moby/sys/symlink/doc.go ================================================ [File too large to display: 592 B] ================================================ FILE: vendor/github.com/moby/sys/symlink/fs.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/github.com/moby/sys/symlink/fs_unix.go ================================================ [File too large to display: 280 B] ================================================ FILE: vendor/github.com/moby/sys/symlink/fs_windows.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/moby/sys/user/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/user/idtools.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/github.com/moby/sys/user/idtools_unix.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/moby/sys/user/idtools_windows.go ================================================ [File too large to display: 358 B] ================================================ FILE: vendor/github.com/moby/sys/user/lookup_unix.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/moby/sys/user/user.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/github.com/moby/sys/user/user_fuzzer.go ================================================ [File too large to display: 781 B] ================================================ FILE: vendor/github.com/moby/sys/userns/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/moby/sys/userns/userns.go ================================================ [File too large to display: 722 B] ================================================ FILE: vendor/github.com/moby/sys/userns/userns_linux.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/moby/sys/userns/userns_linux_fuzzer.go ================================================ [File too large to display: 129 B] ================================================ FILE: vendor/github.com/moby/sys/userns/userns_unsupported.go ================================================ [File too large to display: 140 B] ================================================ FILE: vendor/github.com/morikuni/aec/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/morikuni/aec/README.md ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/morikuni/aec/aec.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/morikuni/aec/ansi.go ================================================ [File too large to display: 978 B] ================================================ FILE: vendor/github.com/morikuni/aec/builder.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/github.com/morikuni/aec/sgr.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/munnerz/goautoneg/LICENSE ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/munnerz/goautoneg/Makefile ================================================ [File too large to display: 188 B] ================================================ FILE: vendor/github.com/munnerz/goautoneg/README.txt ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/munnerz/goautoneg/autoneg.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/.mailmap ================================================ [File too large to display: 228 B] ================================================ FILE: vendor/github.com/opencontainers/go-digest/.pullapprove.yml ================================================ [File too large to display: 444 B] ================================================ FILE: vendor/github.com/opencontainers/go-digest/.travis.yml ================================================ [File too large to display: 50 B] ================================================ FILE: vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/LICENSE.docs ================================================ [File too large to display: 19.5 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/MAINTAINERS ================================================ [File too large to display: 253 B] ================================================ FILE: vendor/github.com/opencontainers/go-digest/README.md ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/algorithm.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/digest.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/digester.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/digestset/set.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/doc.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/opencontainers/go-digest/verifiers.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/identity/chainid.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/identity/helpers.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/v1/annotations.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/v1/config.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/v1/descriptor.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/v1/index.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/v1/layout.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/v1/manifest.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/v1/mediatype.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/version.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/opencontainers/image-spec/specs-go/versioned.go ================================================ [File too large to display: 938 B] ================================================ FILE: vendor/github.com/opencontainers/runtime-spec/LICENSE ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/opencontainers/runtime-spec/specs-go/config.go ================================================ [File too large to display: 40.1 KB] ================================================ FILE: vendor/github.com/opencontainers/runtime-spec/specs-go/features/features.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/opencontainers/runtime-spec/specs-go/state.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/opencontainers/runtime-spec/specs-go/version.go ================================================ [File too large to display: 532 B] ================================================ FILE: vendor/github.com/opencontainers/selinux/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/opencontainers/selinux/go-selinux/doc.go ================================================ [File too large to display: 304 B] ================================================ FILE: vendor/github.com/opencontainers/selinux/go-selinux/label/label.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/opencontainers/selinux/go-selinux/label/label_linux.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go ================================================ [File too large to display: 950 B] ================================================ FILE: vendor/github.com/opencontainers/selinux/go-selinux/selinux.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go ================================================ [File too large to display: 29.0 KB] ================================================ FILE: vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/opencontainers/selinux/go-selinux/xattrs_linux.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/opencontainers/selinux/pkg/pwalkdir/README.md ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/opencontainers/selinux/pkg/pwalkdir/pwalkdir.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/.dockerignore ================================================ [File too large to display: 38 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/.gitattributes ================================================ [File too large to display: 74 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/.gitignore ================================================ [File too large to display: 114 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/.golangci.toml ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/.goreleaser.yaml ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/CONTRIBUTING.md ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/Dockerfile ================================================ [File too large to display: 113 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/README.md ================================================ [File too large to display: 16.8 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/SECURITY.md ================================================ [File too large to display: 552 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/ci.sh ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/decode.go ================================================ [File too large to display: 12.5 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/doc.go ================================================ [File too large to display: 76 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/errors.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/internal/characters/ascii.go ================================================ [File too large to display: 592 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/internal/characters/utf8.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/internal/danger/danger.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/internal/danger/typeid.go ================================================ [File too large to display: 635 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/internal/tracker/key.go ================================================ [File too large to display: 1002 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/internal/tracker/seen.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/internal/tracker/tracker.go ================================================ [File too large to display: 16 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/localtime.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/marshaler.go ================================================ [File too large to display: 24.4 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/strict.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/toml.abnf ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/types.go ================================================ [File too large to display: 442 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/unmarshaler.go ================================================ [File too large to display: 33.4 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/unstable/ast.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/unstable/builder.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/unstable/doc.go ================================================ [File too large to display: 114 B] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/unstable/kind.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/unstable/parser.go ================================================ [File too large to display: 26.5 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/unstable/scanner.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/pelletier/go-toml/v2/unstable/unmarshaler.go ================================================ [File too large to display: 216 B] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/Dockerfile.arm ================================================ [File too large to display: 563 B] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/Dockerfile.arm64 ================================================ [File too large to display: 598 B] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/Makefile ================================================ [File too large to display: 745 B] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/README.md ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/detection.go ================================================ [File too large to display: 287 B] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/internal/const.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/sha1cd.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/sha1cdblock_amd64.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/sha1cdblock_amd64.s ================================================ [File too large to display: 30.5 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/sha1cdblock_generic.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/sha1cdblock_noasm.go ================================================ [File too large to display: 138 B] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/ubc/const.go ================================================ [File too large to display: 36.0 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/ubc/ubc.go ================================================ [File too large to display: 213 B] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/ubc/ubc_amd64.go ================================================ [File too large to display: 521 B] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/ubc/ubc_amd64.s ================================================ [File too large to display: 42.9 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/ubc/ubc_generic.go ================================================ [File too large to display: 18.1 KB] ================================================ FILE: vendor/github.com/pjbgf/sha1cd/ubc/ubc_noasm.go ================================================ [File too large to display: 477 B] ================================================ FILE: vendor/github.com/pkg/errors/.gitignore ================================================ [File too large to display: 266 B] ================================================ FILE: vendor/github.com/pkg/errors/.travis.yml ================================================ [File too large to display: 120 B] ================================================ FILE: vendor/github.com/pkg/errors/LICENSE ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/pkg/errors/Makefile ================================================ [File too large to display: 871 B] ================================================ FILE: vendor/github.com/pkg/errors/README.md ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/pkg/errors/appveyor.yml ================================================ [File too large to display: 639 B] ================================================ FILE: vendor/github.com/pkg/errors/errors.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/pkg/errors/go113.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/pkg/errors/stack.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/planetscale/vtprotobuf/LICENSE ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/planetscale/vtprotobuf/protohelpers/protohelpers.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/planetscale/vtprotobuf/types/known/anypb/any_vtproto.pb.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/github.com/planetscale/vtprotobuf/types/known/durationpb/duration_vtproto.pb.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/planetscale/vtprotobuf/types/known/emptypb/empty_vtproto.pb.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/planetscale/vtprotobuf/types/known/structpb/struct_vtproto.pb.go ================================================ [File too large to display: 45.0 KB] ================================================ FILE: vendor/github.com/planetscale/vtprotobuf/types/known/timestamppb/timestamp_vtproto.pb.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/planetscale/vtprotobuf/types/known/wrapperspb/wrappers_vtproto.pb.go ================================================ [File too large to display: 44.8 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/NOTICE ================================================ [File too large to display: 631 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/internal/github.com/golang/gddo/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil/header/header.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil/negotiate.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/.gitignore ================================================ [File too large to display: 28 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/README.md ================================================ [File too large to display: 167 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/build_info_collector.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/collector.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/collectorfunc.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/counter.go ================================================ [File too large to display: 12.5 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/desc.go ================================================ [File too large to display: 7.8 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/doc.go ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/fnv.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/gauge.go ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/get_pid.go ================================================ [File too large to display: 780 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/get_pid_gopherjs.go ================================================ [File too large to display: 745 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/go_collector.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go ================================================ [File too large to display: 18.7 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/histogram.go ================================================ [File too large to display: 80.3 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/almost_equal.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go ================================================ [File too large to display: 19.4 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/go_collector_options.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/labels.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/metric.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/num_threads.go ================================================ [File too large to display: 838 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/num_threads_gopherjs.go ================================================ [File too large to display: 769 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/observer.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_darwin.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_cgo_darwin.c ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_cgo_darwin.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_mem_nocgo_darwin.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_not_supported.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_procfsenabled.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go ================================================ [File too large to display: 19.5 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go ================================================ [File too large to display: 18.5 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/internal/compression.go ================================================ [File too large to display: 765 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/registry.go ================================================ [File too large to display: 35.3 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/summary.go ================================================ [File too large to display: 26.5 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/timer.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/untyped.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/value.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/vec.go ================================================ [File too large to display: 21.6 KB] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/vnext.go ================================================ [File too large to display: 987 B] ================================================ FILE: vendor/github.com/prometheus/client_golang/prometheus/wrap.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/github.com/prometheus/client_model/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/prometheus/client_model/NOTICE ================================================ [File too large to display: 167 B] ================================================ FILE: vendor/github.com/prometheus/client_model/go/metrics.pb.go ================================================ [File too large to display: 50.9 KB] ================================================ FILE: vendor/github.com/prometheus/common/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/prometheus/common/NOTICE ================================================ [File too large to display: 178 B] ================================================ FILE: vendor/github.com/prometheus/common/expfmt/decode.go ================================================ [File too large to display: 11.3 KB] ================================================ FILE: vendor/github.com/prometheus/common/expfmt/encode.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/github.com/prometheus/common/expfmt/expfmt.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/github.com/prometheus/common/expfmt/fuzz.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/prometheus/common/expfmt/openmetrics_create.go ================================================ [File too large to display: 19.2 KB] ================================================ FILE: vendor/github.com/prometheus/common/expfmt/text_create.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/github.com/prometheus/common/expfmt/text_parse.go ================================================ [File too large to display: 29.0 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/alert.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/fingerprinting.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/fnv.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/labels.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/labelset.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/labelset_string.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/metadata.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/metric.go ================================================ [File too large to display: 13.4 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/model.go ================================================ [File too large to display: 719 B] ================================================ FILE: vendor/github.com/prometheus/common/model/signature.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/silence.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/time.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/value.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/value_float.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/value_histogram.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/prometheus/common/model/value_type.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/.gitignore ================================================ [File too large to display: 30 B] ================================================ FILE: vendor/github.com/prometheus/procfs/.golangci.yml ================================================ [File too large to display: 792 B] ================================================ FILE: vendor/github.com/prometheus/procfs/CODE_OF_CONDUCT.md ================================================ [File too large to display: 152 B] ================================================ FILE: vendor/github.com/prometheus/procfs/CONTRIBUTING.md ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/MAINTAINERS.md ================================================ [File too large to display: 144 B] ================================================ FILE: vendor/github.com/prometheus/procfs/Makefile ================================================ [File too large to display: 941 B] ================================================ FILE: vendor/github.com/prometheus/procfs/Makefile.common ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/NOTICE ================================================ [File too large to display: 237 B] ================================================ FILE: vendor/github.com/prometheus/procfs/README.md ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/SECURITY.md ================================================ [File too large to display: 172 B] ================================================ FILE: vendor/github.com/prometheus/procfs/arp.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/buddyinfo.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/cmdline.go ================================================ [File too large to display: 915 B] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo_armx.go ================================================ [File too large to display: 716 B] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo_loong64.go ================================================ [File too large to display: 680 B] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo_mipsx.go ================================================ [File too large to display: 759 B] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo_others.go ================================================ [File too large to display: 913 B] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo_ppcx.go ================================================ [File too large to display: 724 B] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go ================================================ [File too large to display: 726 B] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo_s390x.go ================================================ [File too large to display: 680 B] ================================================ FILE: vendor/github.com/prometheus/procfs/cpuinfo_x86.go ================================================ [File too large to display: 716 B] ================================================ FILE: vendor/github.com/prometheus/procfs/crypto.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/doc.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/fs.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/fs_statfs_notype.go ================================================ [File too large to display: 833 B] ================================================ FILE: vendor/github.com/prometheus/procfs/fs_statfs_type.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/fscache.go ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/internal/fs/fs.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/internal/util/parse.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/internal/util/readfile.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go ================================================ [File too large to display: 979 B] ================================================ FILE: vendor/github.com/prometheus/procfs/internal/util/valueparser.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/ipvs.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/kernel_random.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/loadavg.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/mdstat.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/meminfo.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/mountinfo.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/mountstats.go ================================================ [File too large to display: 21.0 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_conntrackstat.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_dev.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_dev_snmp6.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_ip_socket.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_protocols.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_route.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_sockstat.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_softnet.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_tcp.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_tls_stat.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_udp.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_unix.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_wireless.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/net_xfrm.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/netstat.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_cgroup.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_cgroups.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_environ.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_fdinfo.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_interrupts.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_io.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_limits.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_maps.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_netstat.go ================================================ [File too large to display: 14.1 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_ns.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_psi.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_smaps.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_snmp.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_snmp6.go ================================================ [File too large to display: 10.7 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_stat.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_status.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/proc_sys.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/schedstat.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/slab.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/softirqs.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/stat.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/swaps.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/thread.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/ttar ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/vm.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/github.com/prometheus/procfs/zoneinfo.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/.editorconfig ================================================ [File too large to display: 243 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/.envrc ================================================ [File too large to display: 231 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/.gitignore ================================================ [File too large to display: 36 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/README.md ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/attr.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/attr_120.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/flake.nix ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/handler.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/handler_120.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/json_handler.go ================================================ [File too large to display: 603 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/json_handler_120.go ================================================ [File too large to display: 618 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/level.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/level_120.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/logger.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/logger_120.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/record.go ================================================ [File too large to display: 912 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/record_120.go ================================================ [File too large to display: 927 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/text_handler.go ================================================ [File too large to display: 651 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/text_handler_120.go ================================================ [File too large to display: 666 B] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/value.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/sagikazarmark/slog-shim/value_120.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/sergi/go-diff/AUTHORS ================================================ [File too large to display: 940 B] ================================================ FILE: vendor/github.com/sergi/go-diff/CONTRIBUTORS ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/sergi/go-diff/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go ================================================ [File too large to display: 41.4 KB] ================================================ FILE: vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/github.com/sergi/go-diff/diffmatchpatch/match.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/sergi/go-diff/diffmatchpatch/mathutil.go ================================================ [File too large to display: 498 B] ================================================ FILE: vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go ================================================ [File too large to display: 429 B] ================================================ FILE: vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go ================================================ [File too large to display: 17.4 KB] ================================================ FILE: vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/skeema/knownhosts/CONTRIBUTING.md ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/skeema/knownhosts/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/skeema/knownhosts/NOTICE ================================================ [File too large to display: 585 B] ================================================ FILE: vendor/github.com/skeema/knownhosts/README.md ================================================ [File too large to display: 8.8 KB] ================================================ FILE: vendor/github.com/skeema/knownhosts/knownhosts.go ================================================ [File too large to display: 18.0 KB] ================================================ FILE: vendor/github.com/sourcegraph/conc/.golangci.yml ================================================ [File too large to display: 158 B] ================================================ FILE: vendor/github.com/sourcegraph/conc/LICENSE ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/sourcegraph/conc/README.md ================================================ [File too large to display: 13.6 KB] ================================================ FILE: vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go119.go ================================================ [File too large to display: 122 B] ================================================ FILE: vendor/github.com/sourcegraph/conc/internal/multierror/multierror_go120.go ================================================ [File too large to display: 101 B] ================================================ FILE: vendor/github.com/sourcegraph/conc/iter/iter.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/sourcegraph/conc/iter/map.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/sourcegraph/conc/panics/panics.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/sourcegraph/conc/panics/try.go ================================================ [File too large to display: 291 B] ================================================ FILE: vendor/github.com/sourcegraph/conc/waitgroup.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/spf13/afero/.editorconfig ================================================ [File too large to display: 174 B] ================================================ FILE: vendor/github.com/spf13/afero/.gitignore ================================================ [File too large to display: 26 B] ================================================ FILE: vendor/github.com/spf13/afero/.golangci.yaml ================================================ [File too large to display: 309 B] ================================================ FILE: vendor/github.com/spf13/afero/LICENSE.txt ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/github.com/spf13/afero/README.md ================================================ [File too large to display: 15.1 KB] ================================================ FILE: vendor/github.com/spf13/afero/afero.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/spf13/afero/appveyor.yml ================================================ [File too large to display: 276 B] ================================================ FILE: vendor/github.com/spf13/afero/basepath.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/github.com/spf13/afero/cacheOnReadFs.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/spf13/afero/const_bsds.go ================================================ [File too large to display: 806 B] ================================================ FILE: vendor/github.com/spf13/afero/const_win_unix.go ================================================ [File too large to display: 820 B] ================================================ FILE: vendor/github.com/spf13/afero/copyOnWriteFs.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/github.com/spf13/afero/httpFs.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/spf13/afero/internal/common/adapters.go ================================================ [File too large to display: 958 B] ================================================ FILE: vendor/github.com/spf13/afero/iofs.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/github.com/spf13/afero/ioutil.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/spf13/afero/lstater.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/spf13/afero/match.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/github.com/spf13/afero/mem/dir.go ================================================ [File too large to display: 971 B] ================================================ FILE: vendor/github.com/spf13/afero/mem/dirmap.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/spf13/afero/mem/file.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/spf13/afero/memmap.go ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/github.com/spf13/afero/os.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/afero/path.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/afero/readonlyfs.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/github.com/spf13/afero/regexpfs.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/spf13/afero/symlink.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/spf13/afero/unionFile.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/github.com/spf13/afero/util.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/github.com/spf13/cast/.gitignore ================================================ [File too large to display: 268 B] ================================================ FILE: vendor/github.com/spf13/cast/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/spf13/cast/Makefile ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/spf13/cast/README.md ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/spf13/cast/cast.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/spf13/cast/caste.go ================================================ [File too large to display: 32.8 KB] ================================================ FILE: vendor/github.com/spf13/cast/timeformattype_string.go ================================================ [File too large to display: 934 B] ================================================ FILE: vendor/github.com/spf13/cobra/.gitignore ================================================ [File too large to display: 484 B] ================================================ FILE: vendor/github.com/spf13/cobra/.golangci.yml ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/spf13/cobra/.mailmap ================================================ [File too large to display: 172 B] ================================================ FILE: vendor/github.com/spf13/cobra/CONDUCT.md ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/spf13/cobra/CONTRIBUTING.md ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/spf13/cobra/LICENSE.txt ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/github.com/spf13/cobra/MAINTAINERS ================================================ [File too large to display: 137 B] ================================================ FILE: vendor/github.com/spf13/cobra/Makefile ================================================ [File too large to display: 907 B] ================================================ FILE: vendor/github.com/spf13/cobra/README.md ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/spf13/cobra/active_help.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/github.com/spf13/cobra/args.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/spf13/cobra/bash_completions.go ================================================ [File too large to display: 22.5 KB] ================================================ FILE: vendor/github.com/spf13/cobra/bash_completionsV2.go ================================================ [File too large to display: 17.5 KB] ================================================ FILE: vendor/github.com/spf13/cobra/cobra.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/github.com/spf13/cobra/command.go ================================================ [File too large to display: 59.6 KB] ================================================ FILE: vendor/github.com/spf13/cobra/command_notwin.go ================================================ [File too large to display: 689 B] ================================================ FILE: vendor/github.com/spf13/cobra/command_win.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/spf13/cobra/completions.go ================================================ [File too large to display: 37.3 KB] ================================================ FILE: vendor/github.com/spf13/cobra/fish_completions.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/spf13/cobra/flag_groups.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/github.com/spf13/cobra/powershell_completions.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/github.com/spf13/cobra/shell_completions.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/spf13/cobra/zsh_completions.go ================================================ [File too large to display: 10.8 KB] ================================================ FILE: vendor/github.com/spf13/pflag/.editorconfig ================================================ [File too large to display: 174 B] ================================================ FILE: vendor/github.com/spf13/pflag/.gitignore ================================================ [File too large to display: 9 B] ================================================ FILE: vendor/github.com/spf13/pflag/.golangci.yaml ================================================ [File too large to display: 64 B] ================================================ FILE: vendor/github.com/spf13/pflag/.travis.yml ================================================ [File too large to display: 261 B] ================================================ FILE: vendor/github.com/spf13/pflag/LICENSE ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/spf13/pflag/README.md ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/github.com/spf13/pflag/bool.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/bool_slice.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/spf13/pflag/bytes.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/count.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/duration.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/github.com/spf13/pflag/duration_slice.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/flag.go ================================================ [File too large to display: 35.7 KB] ================================================ FILE: vendor/github.com/spf13/pflag/float32.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/spf13/pflag/float32_slice.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/float64.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/float64_slice.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/spf13/pflag/golangflag.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/spf13/pflag/int.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/spf13/pflag/int16.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/int32.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/int32_slice.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/spf13/pflag/int64.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/int64_slice.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/spf13/pflag/int8.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/int_slice.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/spf13/pflag/ip.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/ip_slice.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/github.com/spf13/pflag/ipmask.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/ipnet.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/spf13/pflag/ipnet_slice.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/github.com/spf13/pflag/string.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/string_array.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/github.com/spf13/pflag/string_slice.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/string_to_int.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/github.com/spf13/pflag/string_to_int64.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/string_to_string.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/github.com/spf13/pflag/uint.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/uint16.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/uint32.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/uint64.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/spf13/pflag/uint8.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/github.com/spf13/pflag/uint_slice.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/jwtbundle/bundle.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/jwtbundle/doc.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/jwtbundle/set.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/jwtbundle/source.go ================================================ [File too large to display: 333 B] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/spiffebundle/bundle.go ================================================ [File too large to display: 14.0 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/spiffebundle/doc.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/spiffebundle/set.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/spiffebundle/source.go ================================================ [File too large to display: 331 B] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/x509bundle/bundle.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/x509bundle/doc.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/x509bundle/set.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/bundle/x509bundle/source.go ================================================ [File too large to display: 340 B] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/internal/cryptoutil/keys.go ================================================ [File too large to display: 861 B] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/internal/jwtutil/util.go ================================================ [File too large to display: 732 B] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/internal/pemutil/pem.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/internal/x509util/util.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/spiffeid/charset_backcompat_allow.go ================================================ [File too large to display: 632 B] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/spiffeid/charset_backcompat_deny.go ================================================ [File too large to display: 222 B] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/spiffeid/errors.go ================================================ [File too large to display: 780 B] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/spiffeid/id.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/spiffeid/match.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/spiffeid/path.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/spiffeid/require.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/github.com/spiffe/go-spiffe/v2/spiffeid/trustdomain.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/subosito/gotenv/.gitignore ================================================ [File too large to display: 39 B] ================================================ FILE: vendor/github.com/subosito/gotenv/.golangci.yaml ================================================ [File too large to display: 98 B] ================================================ FILE: vendor/github.com/subosito/gotenv/CHANGELOG.md ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/subosito/gotenv/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/subosito/gotenv/README.md ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/github.com/subosito/gotenv/gotenv.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/github.com/tonistiigi/go-csvvalue/.golangci.yml ================================================ [File too large to display: 410 B] ================================================ FILE: vendor/github.com/tonistiigi/go-csvvalue/.yamllint.yml ================================================ [File too large to display: 151 B] ================================================ FILE: vendor/github.com/tonistiigi/go-csvvalue/Dockerfile ================================================ [File too large to display: 1017 B] ================================================ FILE: vendor/github.com/tonistiigi/go-csvvalue/LICENSE ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/tonistiigi/go-csvvalue/codecov.yml ================================================ [File too large to display: 15 B] ================================================ FILE: vendor/github.com/tonistiigi/go-csvvalue/csvvalue.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/github.com/tonistiigi/go-csvvalue/docker-bake.hcl ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/github.com/tonistiigi/go-csvvalue/readme.md ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/toqueteos/webbrowser/.travis.yml ================================================ [File too large to display: 71 B] ================================================ FILE: vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md ================================================ [File too large to display: 251 B] ================================================ FILE: vendor/github.com/toqueteos/webbrowser/LICENSE.md ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/github.com/toqueteos/webbrowser/README.md ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/toqueteos/webbrowser/webbrowser.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/LICENSE ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/archive/tar/common.go ================================================ [File too large to display: 23.7 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/archive/tar/format.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/archive/tar/reader.go ================================================ [File too large to display: 27.7 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/archive/tar/stat_actime1.go ================================================ [File too large to display: 414 B] ================================================ FILE: vendor/github.com/vbatts/tar-split/archive/tar/stat_actime2.go ================================================ [File too large to display: 414 B] ================================================ FILE: vendor/github.com/vbatts/tar-split/archive/tar/stat_unix.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/archive/tar/strconv.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/archive/tar/writer.go ================================================ [File too large to display: 18.5 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/asm/README.md ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/asm/assemble.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/asm/disassemble.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/asm/doc.go ================================================ [File too large to display: 280 B] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/asm/iterate.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/storage/doc.go ================================================ [File too large to display: 444 B] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/storage/entry.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/storage/getter.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/github.com/vbatts/tar-split/tar/storage/packer.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/github.com/xanzy/ssh-agent/.gitignore ================================================ [File too large to display: 266 B] ================================================ FILE: vendor/github.com/xanzy/ssh-agent/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/github.com/xanzy/ssh-agent/README.md ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/xanzy/ssh-agent/pageant_windows.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/github.com/xanzy/ssh-agent/sshagent.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/github.com/xanzy/ssh-agent/sshagent_windows.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/github.com/zeebo/errs/.gitignore ================================================ [File too large to display: 8 B] ================================================ FILE: vendor/github.com/zeebo/errs/AUTHORS ================================================ [File too large to display: 168 B] ================================================ FILE: vendor/github.com/zeebo/errs/LICENSE ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/github.com/zeebo/errs/README.md ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/github.com/zeebo/errs/errs.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/github.com/zeebo/errs/group.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/github.com/zeebo/errs/is_go1.20.go ================================================ [File too large to display: 176 B] ================================================ FILE: vendor/github.com/zeebo/errs/is_go_other.go ================================================ [File too large to display: 339 B] ================================================ FILE: vendor/go.etcd.io/etcd/raft/v3/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.etcd.io/etcd/raft/v3/raftpb/confchange.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/go.etcd.io/etcd/raft/v3/raftpb/confstate.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/go.etcd.io/etcd/raft/v3/raftpb/raft.pb.go ================================================ [File too large to display: 74.1 KB] ================================================ FILE: vendor/go.etcd.io/etcd/raft/v3/raftpb/raft.proto ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/go.opencensus.io/.gitignore ================================================ [File too large to display: 173 B] ================================================ FILE: vendor/go.opencensus.io/AUTHORS ================================================ [File too large to display: 12 B] ================================================ FILE: vendor/go.opencensus.io/CONTRIBUTING.md ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/go.opencensus.io/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opencensus.io/Makefile ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/go.opencensus.io/README.md ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/go.opencensus.io/appveyor.yml ================================================ [File too large to display: 412 B] ================================================ FILE: vendor/go.opencensus.io/internal/internal.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/go.opencensus.io/internal/sanitize.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/go.opencensus.io/internal/traceinternals.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/go.opencensus.io/opencensus.go ================================================ [File too large to display: 811 B] ================================================ FILE: vendor/go.opencensus.io/trace/basetypes.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/go.opencensus.io/trace/config.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/go.opencensus.io/trace/doc.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/go.opencensus.io/trace/evictedqueue.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/go.opencensus.io/trace/export.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/go.opencensus.io/trace/internal/internal.go ================================================ [File too large to display: 800 B] ================================================ FILE: vendor/go.opencensus.io/trace/lrumap.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/go.opencensus.io/trace/sampling.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/go.opencensus.io/trace/spanbucket.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/go.opencensus.io/trace/spanstore.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/go.opencensus.io/trace/status_codes.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/go.opencensus.io/trace/trace.go ================================================ [File too large to display: 16.8 KB] ================================================ FILE: vendor/go.opencensus.io/trace/trace_api.go ================================================ [File too large to display: 8.8 KB] ================================================ FILE: vendor/go.opencensus.io/trace/trace_go11.go ================================================ [File too large to display: 960 B] ================================================ FILE: vendor/go.opencensus.io/trace/trace_nongo11.go ================================================ [File too large to display: 790 B] ================================================ FILE: vendor/go.opencensus.io/trace/tracestate/tracestate.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md ================================================ [File too large to display: 760 B] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/doc.go ================================================ [File too large to display: 536 B] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go ================================================ [File too large to display: 244 B] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go ================================================ [File too large to display: 16.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/limit.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/span.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/tracer.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/README.md ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/cloud-function.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/cloud-run.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/detector.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/gce.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/gke.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/types.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/detectors/gcp/version.go ================================================ [File too large to display: 500 B] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/config.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/doc.go ================================================ [File too large to display: 428 B] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go ================================================ [File too large to display: 12.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/interceptorinfo.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal/parse.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/metadata_supplier.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/semconv.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/version.go ================================================ [File too large to display: 538 B] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/doc.go ================================================ [File too large to display: 349 B] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/body_wrapper.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/gen.go ================================================ [File too large to display: 764 B] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request/resp_writer_wrapper.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/httpconv.go ================================================ [File too large to display: 14.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/util.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/v1.20.0.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/gen.go ================================================ [File too large to display: 728 B] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/httpconv.go ================================================ [File too large to display: 19.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/netconv.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/labeler.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/start_time_context.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go ================================================ [File too large to display: 528 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/.codespellignore ================================================ [File too large to display: 58 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/.codespellrc ================================================ [File too large to display: 272 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/.gitattributes ================================================ [File too large to display: 89 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/.gitignore ================================================ [File too large to display: 107 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/.golangci.yml ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/.lycheeignore ================================================ [File too large to display: 298 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/.markdownlint.yaml ================================================ [File too large to display: 309 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/CHANGELOG.md ================================================ [File too large to display: 235.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/CODEOWNERS ================================================ [File too large to display: 503 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/CONTRIBUTING.md ================================================ [File too large to display: 22.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/Makefile ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/README.md ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/RELEASING.md ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/VERSIONING.md ================================================ [File too large to display: 10.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/README.md ================================================ [File too large to display: 143 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/doc.go ================================================ [File too large to display: 200 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/encoder.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/filter.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/internal/attribute.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/iterator.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/key.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/kv.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/rawhelpers.go ================================================ [File too large to display: 738 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/set.go ================================================ [File too large to display: 11.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/type_string.go ================================================ [File too large to display: 800 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/attribute/value.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/baggage/README.md ================================================ [File too large to display: 137 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/baggage/baggage.go ================================================ [File too large to display: 24.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/baggage/context.go ================================================ [File too large to display: 936 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/baggage/doc.go ================================================ [File too large to display: 324 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/codes/README.md ================================================ [File too large to display: 131 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/codes/codes.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/codes/doc.go ================================================ [File too large to display: 378 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/dependencies.Dockerfile ================================================ [File too large to display: 391 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/doc.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/error_handler.go ================================================ [File too large to display: 879 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/handler.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/baggage/baggage.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/baggage/context.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/global/handler.go ================================================ [File too large to display: 851 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/global/instruments.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/global/meter.go ================================================ [File too large to display: 15.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/global/propagator.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/global/state.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal/global/trace.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/internal_logging.go ================================================ [File too large to display: 348 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/README.md ================================================ [File too large to display: 138 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/asyncfloat64.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/asyncint64.go ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/config.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/doc.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/embedded/README.md ================================================ [File too large to display: 161 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/embedded/embedded.go ================================================ [File too large to display: 11.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/instrument.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/meter.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/noop/README.md ================================================ [File too large to display: 149 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/noop/noop.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/syncfloat64.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric/syncint64.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/metric.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/propagation/README.md ================================================ [File too large to display: 149 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/propagation/baggage.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/propagation/doc.go ================================================ [File too large to display: 504 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/propagation/propagation.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/propagation/trace_context.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/propagation.go ================================================ [File too large to display: 636 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/renovate.json ================================================ [File too large to display: 844 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/requirements.txt ================================================ [File too large to display: 17 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/README.md ================================================ [File too large to display: 125 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/instrumentation/README.md ================================================ [File too large to display: 173 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/instrumentation/doc.go ================================================ [File too large to display: 653 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/instrumentation/library.go ================================================ [File too large to display: 272 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/instrumentation/scope.go ================================================ [File too large to display: 617 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/internal/x/README.md ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/README.md ================================================ [File too large to display: 146 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/aggregation.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/cache.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/config.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/doc.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/env.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/README.md ================================================ [File too large to display: 174 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/doc.go ================================================ [File too large to display: 286 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/exemplar.go ================================================ [File too large to display: 996 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/filter.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/reservoir.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/value.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exemplar.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/exporter.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/instrument.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/doc.go ================================================ [File too large to display: 369 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/drop.go ================================================ [File too large to display: 853 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exemplar.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go ================================================ [File too large to display: 11.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/reuse_slice.go ================================================ [File too large to display: 497 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/README.md ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/internal/x/x.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/meter.go ================================================ [File too large to display: 25.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/README.md ================================================ [File too large to display: 173 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/data.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality.go ================================================ [File too large to display: 998 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go ================================================ [File too large to display: 745 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/pipeline.go ================================================ [File too large to display: 22.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/provider.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/reader.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/version.go ================================================ [File too large to display: 254 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/metric/view.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/README.md ================================================ [File too large to display: 152 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/auto.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/config.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/container.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/doc.go ================================================ [File too large to display: 933 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/env.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/host_id.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go ================================================ [File too large to display: 374 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/host_id_darwin.go ================================================ [File too large to display: 237 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/host_id_exec.go ================================================ [File too large to display: 425 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go ================================================ [File too large to display: 264 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/host_id_readfile.go ================================================ [File too large to display: 379 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go ================================================ [File too large to display: 767 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go ================================================ [File too large to display: 807 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/os.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/os_release_darwin.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go ================================================ [File too large to display: 668 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/os_windows.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/process.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/resource/resource.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/sdk/version.go ================================================ [File too large to display: 313 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.17.0/README.md ================================================ [File too large to display: 161 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.17.0/doc.go ================================================ [File too large to display: 429 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.17.0/event.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.17.0/exception.go ================================================ [File too large to display: 273 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.17.0/http.go ================================================ [File too large to display: 281 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.17.0/resource.go ================================================ [File too large to display: 76.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.17.0/schema.go ================================================ [File too large to display: 453 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.17.0/trace.go ================================================ [File too large to display: 133.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/README.md ================================================ [File too large to display: 161 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/attribute_group.go ================================================ [File too large to display: 47.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/doc.go ================================================ [File too large to display: 429 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/event.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/exception.go ================================================ [File too large to display: 273 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/http.go ================================================ [File too large to display: 281 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/resource.go ================================================ [File too large to display: 78.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/schema.go ================================================ [File too large to display: 453 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.20.0/trace.go ================================================ [File too large to display: 103.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.21.0/README.md ================================================ [File too large to display: 161 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.21.0/attribute_group.go ================================================ [File too large to display: 72.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.21.0/doc.go ================================================ [File too large to display: 414 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.21.0/event.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.21.0/exception.go ================================================ [File too large to display: 273 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.21.0/resource.go ================================================ [File too large to display: 88.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.21.0/schema.go ================================================ [File too large to display: 453 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.21.0/trace.go ================================================ [File too large to display: 99.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/README.md ================================================ [File too large to display: 161 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/attribute_group.go ================================================ [File too large to display: 170.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/doc.go ================================================ [File too large to display: 414 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/event.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/exception.go ================================================ [File too large to display: 273 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/metric.go ================================================ [File too large to display: 48.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/resource.go ================================================ [File too large to display: 100.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/schema.go ================================================ [File too large to display: 453 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.24.0/trace.go ================================================ [File too large to display: 53.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.26.0/README.md ================================================ [File too large to display: 161 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.26.0/attribute_group.go ================================================ [File too large to display: 359.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.26.0/doc.go ================================================ [File too large to display: 414 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.26.0/exception.go ================================================ [File too large to display: 273 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.26.0/metric.go ================================================ [File too large to display: 58.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/semconv/v1.26.0/schema.go ================================================ [File too large to display: 453 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/README.md ================================================ [File too large to display: 135 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/auto.go ================================================ [File too large to display: 16.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/config.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/context.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/doc.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/embedded/README.md ================================================ [File too large to display: 158 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/embedded/embedded.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/attr.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/doc.go ================================================ [File too large to display: 306 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/id.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/number.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/resource.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/scope.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/span.go ================================================ [File too large to display: 17.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/status.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/traces.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/internal/telemetry/value.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/nonrecording.go ================================================ [File too large to display: 476 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/noop/README.md ================================================ [File too large to display: 146 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/noop/noop.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/noop.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/provider.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/span.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/trace.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/tracer.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace/tracestate.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/trace.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/verify_released_changelog.sh ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/go.opentelemetry.io/otel/version.go ================================================ [File too large to display: 240 B] ================================================ FILE: vendor/go.opentelemetry.io/otel/versions.yaml ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/golang.org/x/crypto/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/PATENTS ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/argon2/argon2.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/argon2/blake2b.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/argon2/blamka_amd64.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/argon2/blamka_amd64.s ================================================ [File too large to display: 53.9 KB] ================================================ FILE: vendor/golang.org/x/crypto/argon2/blamka_generic.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/argon2/blamka_ref.go ================================================ [File too large to display: 389 B] ================================================ FILE: vendor/golang.org/x/crypto/blake2b/blake2b.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go ================================================ [File too large to display: 905 B] ================================================ FILE: vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s ================================================ [File too large to display: 82.8 KB] ================================================ FILE: vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s ================================================ [File too large to display: 29.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/blake2b/blake2b_generic.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/golang.org/x/crypto/blake2b/blake2b_ref.go ================================================ [File too large to display: 328 B] ================================================ FILE: vendor/golang.org/x/crypto/blake2b/blake2x.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/golang.org/x/crypto/blake2b/register.go ================================================ [File too large to display: 594 B] ================================================ FILE: vendor/golang.org/x/crypto/blowfish/block.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/golang.org/x/crypto/blowfish/cipher.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/blowfish/const.go ================================================ [File too large to display: 12.8 KB] ================================================ FILE: vendor/golang.org/x/crypto/cast5/cast5.go ================================================ [File too large to display: 32.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/chacha_arm64.go ================================================ [File too large to display: 441 B] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/chacha_arm64.s ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/chacha_generic.go ================================================ [File too large to display: 13.9 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/chacha_noasm.go ================================================ [File too large to display: 371 B] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/chacha_ppc64x.go ================================================ [File too large to display: 469 B] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/chacha_ppc64x.s ================================================ [File too large to display: 10.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/chacha_s390x.go ================================================ [File too large to display: 743 B] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/chacha_s390x.s ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20/xor.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s ================================================ [File too large to display: 186.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go ================================================ [File too large to display: 534 B] ================================================ FILE: vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/cryptobyte/asn1/asn1.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/cryptobyte/asn1.go ================================================ [File too large to display: 21.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/cryptobyte/builder.go ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/golang.org/x/crypto/cryptobyte/string.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/curve25519/curve25519.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/golang.org/x/crypto/hkdf/hkdf.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/alias/alias.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/alias/alias_purego.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go ================================================ [File too large to display: 290 B] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/poly1305.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/sum_asm.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/sum_loong64.s ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64x.s ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s ================================================ [File too large to display: 17.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/pkcs12/bmp-string.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/pkcs12/crypto.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/golang.org/x/crypto/pkcs12/errors.go ================================================ [File too large to display: 751 B] ================================================ FILE: vendor/golang.org/x/crypto/pkcs12/internal/rc2/rc2.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/pkcs12/mac.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/golang.org/x/crypto/pkcs12/pbkdf.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/pkcs12/pkcs12.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/golang.org/x/crypto/pkcs12/safebags.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/golang.org/x/crypto/sha3/doc.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/sha3/hashes.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/sha3/hashes_noasm.go ================================================ [File too large to display: 409 B] ================================================ FILE: vendor/golang.org/x/crypto/sha3/keccakf.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/sha3/keccakf_amd64.go ================================================ [File too large to display: 309 B] ================================================ FILE: vendor/golang.org/x/crypto/sha3/keccakf_amd64.s ================================================ [File too large to display: 79.8 KB] ================================================ FILE: vendor/golang.org/x/crypto/sha3/sha3.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/sha3/sha3_s390x.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/sha3/sha3_s390x.s ================================================ [File too large to display: 957 B] ================================================ FILE: vendor/golang.org/x/crypto/sha3/shake.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/golang.org/x/crypto/sha3/shake_noasm.go ================================================ [File too large to display: 329 B] ================================================ FILE: vendor/golang.org/x/crypto/ssh/agent/client.go ================================================ [File too large to display: 23.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/agent/forward.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/agent/keyring.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/agent/server.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/buffer.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/certs.go ================================================ [File too large to display: 17.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/channel.go ================================================ [File too large to display: 16.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/cipher.go ================================================ [File too large to display: 21.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/client.go ================================================ [File too large to display: 8.6 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/client_auth.go ================================================ [File too large to display: 23.9 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/common.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/connection.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/doc.go ================================================ [File too large to display: 971 B] ================================================ FILE: vendor/golang.org/x/crypto/ssh/handshake.go ================================================ [File too large to display: 23.0 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/kex.go ================================================ [File too large to display: 22.2 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/keys.go ================================================ [File too large to display: 46.7 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/mac.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/messages.go ================================================ [File too large to display: 20.3 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/mlkem.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/mux.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/server.go ================================================ [File too large to display: 30.8 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/session.go ================================================ [File too large to display: 15.1 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/ssh_gss.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/streamlocal.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/tcpip.go ================================================ [File too large to display: 12.8 KB] ================================================ FILE: vendor/golang.org/x/crypto/ssh/transport.go ================================================ [File too large to display: 9.8 KB] ================================================ FILE: vendor/golang.org/x/exp/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/exp/PATENTS ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/exp/slices/slices.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/golang.org/x/exp/slices/sort.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/attr.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/doc.go ================================================ [File too large to display: 12.0 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/handler.go ================================================ [File too large to display: 16.2 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/internal/buffer/buffer.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/internal/ignorepc.go ================================================ [File too large to display: 338 B] ================================================ FILE: vendor/golang.org/x/exp/slog/json_handler.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/level.go ================================================ [File too large to display: 5.6 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/logger.go ================================================ [File too large to display: 10.6 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/noplog.bench ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/record.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/text_handler.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/value.go ================================================ [File too large to display: 10.9 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/value_119.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/exp/slog/value_120.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/net/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/net/PATENTS ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/net/context/context.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/golang.org/x/net/http/httpguts/guts.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/net/http/httpguts/httplex.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/golang.org/x/net/http2/.gitignore ================================================ [File too large to display: 11 B] ================================================ FILE: vendor/golang.org/x/net/http2/ascii.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/net/http2/ciphers.go ================================================ [File too large to display: 34.4 KB] ================================================ FILE: vendor/golang.org/x/net/http2/client_conn_pool.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/golang.org/x/net/http2/config.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/golang.org/x/net/http2/config_go124.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/golang.org/x/net/http2/config_pre_go124.go ================================================ [File too large to display: 461 B] ================================================ FILE: vendor/golang.org/x/net/http2/databuffer.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/golang.org/x/net/http2/errors.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/golang.org/x/net/http2/flow.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/golang.org/x/net/http2/frame.go ================================================ [File too large to display: 48.8 KB] ================================================ FILE: vendor/golang.org/x/net/http2/gotrack.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/golang.org/x/net/http2/hpack/encode.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/golang.org/x/net/http2/hpack/hpack.go ================================================ [File too large to display: 14.7 KB] ================================================ FILE: vendor/golang.org/x/net/http2/hpack/huffman.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/golang.org/x/net/http2/hpack/static_table.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/golang.org/x/net/http2/hpack/tables.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/golang.org/x/net/http2/http2.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/golang.org/x/net/http2/pipe.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/golang.org/x/net/http2/server.go ================================================ [File too large to display: 104.0 KB] ================================================ FILE: vendor/golang.org/x/net/http2/timer.go ================================================ [File too large to display: 515 B] ================================================ FILE: vendor/golang.org/x/net/http2/transport.go ================================================ [File too large to display: 94.6 KB] ================================================ FILE: vendor/golang.org/x/net/http2/unencrypted.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/net/http2/write.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/golang.org/x/net/http2/writesched.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/golang.org/x/net/http2/writesched_priority.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/golang.org/x/net/http2/writesched_random.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/golang.org/x/net/http2/writesched_roundrobin.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/golang.org/x/net/idna/go118.go ================================================ [File too large to display: 401 B] ================================================ FILE: vendor/golang.org/x/net/idna/idna10.0.0.go ================================================ [File too large to display: 20.9 KB] ================================================ FILE: vendor/golang.org/x/net/idna/idna9.0.0.go ================================================ [File too large to display: 19.2 KB] ================================================ FILE: vendor/golang.org/x/net/idna/pre_go118.go ================================================ [File too large to display: 305 B] ================================================ FILE: vendor/golang.org/x/net/idna/punycode.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/golang.org/x/net/idna/tables10.0.0.go ================================================ [File too large to display: 267.2 KB] ================================================ FILE: vendor/golang.org/x/net/idna/tables11.0.0.go ================================================ [File too large to display: 270.5 KB] ================================================ FILE: vendor/golang.org/x/net/idna/tables12.0.0.go ================================================ [File too large to display: 273.5 KB] ================================================ FILE: vendor/golang.org/x/net/idna/tables13.0.0.go ================================================ [File too large to display: 284.3 KB] ================================================ FILE: vendor/golang.org/x/net/idna/tables15.0.0.go ================================================ [File too large to display: 297.4 KB] ================================================ FILE: vendor/golang.org/x/net/idna/tables9.0.0.go ================================================ [File too large to display: 263.4 KB] ================================================ FILE: vendor/golang.org/x/net/idna/trie.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/net/idna/trie12.0.0.go ================================================ [File too large to display: 852 B] ================================================ FILE: vendor/golang.org/x/net/idna/trie13.0.0.go ================================================ [File too large to display: 872 B] ================================================ FILE: vendor/golang.org/x/net/idna/trieval.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/golang.org/x/net/internal/httpcommon/ascii.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/net/internal/httpcommon/headermap.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/golang.org/x/net/internal/httpcommon/request.go ================================================ [File too large to display: 13.8 KB] ================================================ FILE: vendor/golang.org/x/net/internal/socks/client.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/golang.org/x/net/internal/socks/socks.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/golang.org/x/net/internal/timeseries/timeseries.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/golang.org/x/net/proxy/dial.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/golang.org/x/net/proxy/direct.go ================================================ [File too large to display: 832 B] ================================================ FILE: vendor/golang.org/x/net/proxy/per_host.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/golang.org/x/net/proxy/proxy.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/golang.org/x/net/proxy/socks5.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/net/trace/events.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/golang.org/x/net/trace/histogram.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/golang.org/x/net/trace/trace.go ================================================ [File too large to display: 28.1 KB] ================================================ FILE: vendor/golang.org/x/oauth2/.travis.yml ================================================ [File too large to display: 262 B] ================================================ FILE: vendor/golang.org/x/oauth2/CONTRIBUTING.md ================================================ [File too large to display: 924 B] ================================================ FILE: vendor/golang.org/x/oauth2/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/oauth2/README.md ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/oauth2/authhandler/authhandler.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/golang.org/x/oauth2/deviceauth.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/appengine.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/default.go ================================================ [File too large to display: 12.8 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/doc.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/error.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/externalaccount/aws.go ================================================ [File too large to display: 16.0 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/externalaccount/basecredentials.go ================================================ [File too large to display: 25.5 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/externalaccount/executablecredsource.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/externalaccount/filecredsource.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/externalaccount/header.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/externalaccount/programmaticrefreshcredsource.go ================================================ [File too large to display: 633 B] ================================================ FILE: vendor/golang.org/x/oauth2/google/externalaccount/urlcredsource.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/google.go ================================================ [File too large to display: 10.9 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/internal/externalaccountauthorizeduser/externalaccountauthorizeduser.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/internal/impersonate/impersonate.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/internal/stsexchange/clientauth.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/internal/stsexchange/sts_exchange.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/jwt.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/golang.org/x/oauth2/google/sdk.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/golang.org/x/oauth2/internal/doc.go ================================================ [File too large to display: 250 B] ================================================ FILE: vendor/golang.org/x/oauth2/internal/oauth2.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/golang.org/x/oauth2/internal/token.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/golang.org/x/oauth2/internal/transport.go ================================================ [File too large to display: 769 B] ================================================ FILE: vendor/golang.org/x/oauth2/jws/jws.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/golang.org/x/oauth2/jwt/jwt.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/golang.org/x/oauth2/oauth2.go ================================================ [File too large to display: 13.6 KB] ================================================ FILE: vendor/golang.org/x/oauth2/pkce.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/golang.org/x/oauth2/token.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/golang.org/x/oauth2/transport.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/golang.org/x/sync/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sync/PATENTS ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/sync/errgroup/errgroup.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/golang.org/x/sync/semaphore/semaphore.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/golang.org/x/sync/syncmap/map.go ================================================ [File too large to display: 733 B] ================================================ FILE: vendor/golang.org/x/sys/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/PATENTS ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s ================================================ [File too large to display: 407 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/asm_darwin_x86_gc.s ================================================ [File too large to display: 632 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/byteorder.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_aix.go ================================================ [File too large to display: 605 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_arm.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_arm64.go ================================================ [File too large to display: 4.1 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_arm64.s ================================================ [File too large to display: 937 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_darwin_x86.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go ================================================ [File too large to display: 278 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go ================================================ [File too large to display: 674 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_gc_x86.go ================================================ [File too large to display: 505 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_gc_x86.s ================================================ [File too large to display: 602 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go ================================================ [File too large to display: 299 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go ================================================ [File too large to display: 630 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux.go ================================================ [File too large to display: 322 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux_arm.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux_loong64.go ================================================ [File too large to display: 632 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go ================================================ [File too large to display: 480 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go ================================================ [File too large to display: 306 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go ================================================ [File too large to display: 775 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux_riscv64.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go ================================================ [File too large to display: 890 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_loong64.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_loong64.s ================================================ [File too large to display: 358 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_mips64x.go ================================================ [File too large to display: 320 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_mipsx.go ================================================ [File too large to display: 248 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s ================================================ [File too large to display: 376 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_other_arm.go ================================================ [File too large to display: 218 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_other_arm64.go ================================================ [File too large to display: 241 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go ================================================ [File too large to display: 256 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go ================================================ [File too large to display: 285 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go ================================================ [File too large to display: 243 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_other_x86.go ================================================ [File too large to display: 322 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_ppc64x.go ================================================ [File too large to display: 360 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_riscv64.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_s390x.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_s390x.s ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_wasm.go ================================================ [File too large to display: 439 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_x86.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_zos.go ================================================ [File too large to display: 223 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go ================================================ [File too large to display: 643 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/endian_big.go ================================================ [File too large to display: 397 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/endian_little.go ================================================ [File too large to display: 433 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/hwcap_linux.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/parse.go ================================================ [File too large to display: 1017 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/cpu/runtime_auxv.go ================================================ [File too large to display: 393 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go ================================================ [File too large to display: 357 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go ================================================ [File too large to display: 726 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go ================================================ [File too large to display: 988 B] ================================================ FILE: vendor/golang.org/x/sys/cpu/syscall_darwin_x86_gc.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/golang.org/x/sys/execabs/execabs.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/golang.org/x/sys/execabs/execabs_go118.go ================================================ [File too large to display: 331 B] ================================================ FILE: vendor/golang.org/x/sys/execabs/execabs_go119.go ================================================ [File too large to display: 376 B] ================================================ FILE: vendor/golang.org/x/sys/unix/.gitignore ================================================ [File too large to display: 16 B] ================================================ FILE: vendor/golang.org/x/sys/unix/README.md ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/affinity_linux.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/aliases.go ================================================ [File too large to display: 385 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_aix_ppc64.s ================================================ [File too large to display: 407 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_bsd_386.s ================================================ [File too large to display: 696 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_bsd_amd64.s ================================================ [File too large to display: 722 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_bsd_arm.s ================================================ [File too large to display: 686 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_bsd_arm64.s ================================================ [File too large to display: 709 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s ================================================ [File too large to display: 716 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s ================================================ [File too large to display: 711 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_386.s ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_amd64.s ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_arm.s ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_arm64.s ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_loong64.s ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_mips64x.s ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_mipsx.s ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s ================================================ [File too large to display: 909 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_riscv64.s ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_linux_s390x.s ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s ================================================ [File too large to display: 677 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_solaris_amd64.s ================================================ [File too large to display: 423 B] ================================================ FILE: vendor/golang.org/x/sys/unix/asm_zos_s390x.s ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/auxv.go ================================================ [File too large to display: 1020 B] ================================================ FILE: vendor/golang.org/x/sys/unix/auxv_unsupported.go ================================================ [File too large to display: 370 B] ================================================ FILE: vendor/golang.org/x/sys/unix/bluetooth_linux.go ================================================ [File too large to display: 680 B] ================================================ FILE: vendor/golang.org/x/sys/unix/bpxsvc_zos.go ================================================ [File too large to display: 19.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/bpxsvc_zos.s ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/cap_freebsd.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/constants.go ================================================ [File too large to display: 318 B] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_aix_ppc.go ================================================ [File too large to display: 739 B] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_aix_ppc64.go ================================================ [File too large to display: 858 B] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_darwin.go ================================================ [File too large to display: 747 B] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_dragonfly.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_freebsd.go ================================================ [File too large to display: 1013 B] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_linux.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_netbsd.go ================================================ [File too large to display: 913 B] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_openbsd.go ================================================ [File too large to display: 918 B] ================================================ FILE: vendor/golang.org/x/sys/unix/dev_zos.go ================================================ [File too large to display: 830 B] ================================================ FILE: vendor/golang.org/x/sys/unix/dirent.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/endian_big.go ================================================ [File too large to display: 330 B] ================================================ FILE: vendor/golang.org/x/sys/unix/endian_little.go ================================================ [File too large to display: 358 B] ================================================ FILE: vendor/golang.org/x/sys/unix/env_unix.go ================================================ [File too large to display: 645 B] ================================================ FILE: vendor/golang.org/x/sys/unix/fcntl.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/fcntl_darwin.go ================================================ [File too large to display: 806 B] ================================================ FILE: vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go ================================================ [File too large to display: 436 B] ================================================ FILE: vendor/golang.org/x/sys/unix/fdset.go ================================================ [File too large to display: 781 B] ================================================ FILE: vendor/golang.org/x/sys/unix/gccgo.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/gccgo_c.c ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go ================================================ [File too large to display: 436 B] ================================================ FILE: vendor/golang.org/x/sys/unix/ifreq_linux.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ioctl_linux.go ================================================ [File too large to display: 11.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ioctl_signed.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ioctl_unsigned.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ioctl_zos.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/mkall.sh ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/mkerrors.sh ================================================ [File too large to display: 20.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/mmap_nomremap.go ================================================ [File too large to display: 343 B] ================================================ FILE: vendor/golang.org/x/sys/unix/mremap.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/pagesize_unix.go ================================================ [File too large to display: 396 B] ================================================ FILE: vendor/golang.org/x/sys/unix/pledge_openbsd.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ptrace_darwin.go ================================================ [File too large to display: 315 B] ================================================ FILE: vendor/golang.org/x/sys/unix/ptrace_ios.go ================================================ [File too large to display: 284 B] ================================================ FILE: vendor/golang.org/x/sys/unix/race.go ================================================ [File too large to display: 629 B] ================================================ FILE: vendor/golang.org/x/sys/unix/race0.go ================================================ [File too large to display: 553 B] ================================================ FILE: vendor/golang.org/x/sys/unix/readdirent_getdents.go ================================================ [File too large to display: 401 B] ================================================ FILE: vendor/golang.org/x/sys/unix/readdirent_getdirentries.go ================================================ [File too large to display: 705 B] ================================================ FILE: vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go ================================================ [File too large to display: 544 B] ================================================ FILE: vendor/golang.org/x/sys/unix/sockcmsg_linux.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/sockcmsg_unix.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/sockcmsg_zos.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/symaddr_zos_s390x.s ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_aix.go ================================================ [File too large to display: 16.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_aix_ppc.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_bsd.go ================================================ [File too large to display: 15.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin.go ================================================ [File too large to display: 25.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_dragonfly.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd.go ================================================ [File too large to display: 15.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd_386.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_hurd.go ================================================ [File too large to display: 651 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_hurd_386.go ================================================ [File too large to display: 447 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_illumos.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux.go ================================================ [File too large to display: 79.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_386.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_alarm.go ================================================ [File too large to display: 440 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_amd64.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go ================================================ [File too large to display: 290 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_arm.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_arm64.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_gc.go ================================================ [File too large to display: 495 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go ================================================ [File too large to display: 585 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go ================================================ [File too large to display: 411 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go ================================================ [File too large to display: 986 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go ================================================ [File too large to display: 596 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_loong64.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_ppc.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_s390x.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd_386.go ================================================ [File too large to display: 819 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go ================================================ [File too large to display: 814 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go ================================================ [File too large to display: 819 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go ================================================ [File too large to display: 814 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_386.go ================================================ [File too large to display: 1000 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go ================================================ [File too large to display: 990 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go ================================================ [File too large to display: 1000 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go ================================================ [File too large to display: 990 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go ================================================ [File too large to display: 955 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go ================================================ [File too large to display: 990 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go ================================================ [File too large to display: 994 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_solaris.go ================================================ [File too large to display: 33.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go ================================================ [File too large to display: 593 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_unix.go ================================================ [File too large to display: 16.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_unix_gc.go ================================================ [File too large to display: 640 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go ================================================ [File too large to display: 786 B] ================================================ FILE: vendor/golang.org/x/sys/unix/syscall_zos_s390x.go ================================================ [File too large to display: 86.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/sysvshm_linux.go ================================================ [File too large to display: 521 B] ================================================ FILE: vendor/golang.org/x/sys/unix/sysvshm_unix.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/sysvshm_unix_other.go ================================================ [File too large to display: 407 B] ================================================ FILE: vendor/golang.org/x/sys/unix/timestruct.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/unveil_openbsd.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/vgetrandom_linux.go ================================================ [File too large to display: 345 B] ================================================ FILE: vendor/golang.org/x/sys/unix/vgetrandom_unsupported.go ================================================ [File too large to display: 292 B] ================================================ FILE: vendor/golang.org/x/sys/unix/xattr_bsd.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go ================================================ [File too large to display: 52.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go ================================================ [File too large to display: 52.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go ================================================ [File too large to display: 88.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go ================================================ [File too large to display: 88.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go ================================================ [File too large to display: 70.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go ================================================ [File too large to display: 79.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go ================================================ [File too large to display: 79.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go ================================================ [File too large to display: 79.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go ================================================ [File too large to display: 79.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go ================================================ [File too large to display: 83.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux.go ================================================ [File too large to display: 190.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_386.go ================================================ [File too large to display: 35.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go ================================================ [File too large to display: 35.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_arm.go ================================================ [File too large to display: 35.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go ================================================ [File too large to display: 35.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go ================================================ [File too large to display: 35.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_mips.go ================================================ [File too large to display: 36.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go ================================================ [File too large to display: 36.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go ================================================ [File too large to display: 36.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go ================================================ [File too large to display: 36.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go ================================================ [File too large to display: 38.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go ================================================ [File too large to display: 38.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go ================================================ [File too large to display: 38.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go ================================================ [File too large to display: 35.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go ================================================ [File too large to display: 38.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go ================================================ [File too large to display: 40.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go ================================================ [File too large to display: 72.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go ================================================ [File too large to display: 72.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go ================================================ [File too large to display: 71.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go ================================================ [File too large to display: 72.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go ================================================ [File too large to display: 78.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go ================================================ [File too large to display: 78.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go ================================================ [File too large to display: 78.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go ================================================ [File too large to display: 78.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go ================================================ [File too large to display: 78.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go ================================================ [File too large to display: 78.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go ================================================ [File too large to display: 78.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go ================================================ [File too large to display: 59.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go ================================================ [File too large to display: 39.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go ================================================ [File too large to display: 721 B] ================================================ FILE: vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zptrace_x86_linux.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsymaddr_zos_s390x.s ================================================ [File too large to display: 8.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go ================================================ [File too large to display: 35.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go ================================================ [File too large to display: 30.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go ================================================ [File too large to display: 42.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go ================================================ [File too large to display: 30.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go ================================================ [File too large to display: 71.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s ================================================ [File too large to display: 31.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go ================================================ [File too large to display: 71.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s ================================================ [File too large to display: 31.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go ================================================ [File too large to display: 38.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go ================================================ [File too large to display: 45.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go ================================================ [File too large to display: 44.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go ================================================ [File too large to display: 45.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go ================================================ [File too large to display: 44.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go ================================================ [File too large to display: 44.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux.go ================================================ [File too large to display: 54.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_386.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go ================================================ [File too large to display: 16.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go ================================================ [File too large to display: 15.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go ================================================ [File too large to display: 14.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go ================================================ [File too large to display: 16.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go ================================================ [File too large to display: 16.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go ================================================ [File too large to display: 16.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go ================================================ [File too large to display: 16.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go ================================================ [File too large to display: 16.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go ================================================ [File too large to display: 14.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go ================================================ [File too large to display: 16.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go ================================================ [File too large to display: 44.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go ================================================ [File too large to display: 43.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go ================================================ [File too large to display: 44.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go ================================================ [File too large to display: 43.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go ================================================ [File too large to display: 58.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s ================================================ [File too large to display: 26.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go ================================================ [File too large to display: 58.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s ================================================ [File too large to display: 26.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go ================================================ [File too large to display: 58.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s ================================================ [File too large to display: 26.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go ================================================ [File too large to display: 58.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s ================================================ [File too large to display: 26.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go ================================================ [File too large to display: 58.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s ================================================ [File too large to display: 26.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go ================================================ [File too large to display: 58.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s ================================================ [File too large to display: 27.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go ================================================ [File too large to display: 58.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s ================================================ [File too large to display: 26.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go ================================================ [File too large to display: 63.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go ================================================ [File too large to display: 88.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go ================================================ [File too large to display: 11.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go ================================================ [File too large to display: 12.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go ================================================ [File too large to display: 27.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go ================================================ [File too large to display: 36.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go ================================================ [File too large to display: 36.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go ================================================ [File too large to display: 36.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go ================================================ [File too large to display: 36.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go ================================================ [File too large to display: 36.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_386.go ================================================ [File too large to display: 17.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go ================================================ [File too large to display: 13.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go ================================================ [File too large to display: 16.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go ================================================ [File too large to display: 17.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go ================================================ [File too large to display: 14.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go ================================================ [File too large to display: 14.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go ================================================ [File too large to display: 13.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go ================================================ [File too large to display: 25.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go ================================================ [File too large to display: 25.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go ================================================ [File too large to display: 25.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go ================================================ [File too large to display: 25.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go ================================================ [File too large to display: 17.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go ================================================ [File too large to display: 17.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go ================================================ [File too large to display: 17.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go ================================================ [File too large to display: 18.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go ================================================ [File too large to display: 17.8 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go ================================================ [File too large to display: 146.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go ================================================ [File too large to display: 13.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go ================================================ [File too large to display: 13.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux.go ================================================ [File too large to display: 253.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_386.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go ================================================ [File too large to display: 12.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_arm.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_mips.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go ================================================ [File too large to display: 12.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go ================================================ [File too large to display: 14.9 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go ================================================ [File too large to display: 7.5 KB] ================================================ FILE: vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/aliases.go ================================================ [File too large to display: 281 B] ================================================ FILE: vendor/golang.org/x/sys/windows/dll_windows.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/env_windows.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/eventlog.go ================================================ [File too large to display: 825 B] ================================================ FILE: vendor/golang.org/x/sys/windows/exec_windows.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/memory_windows.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/mkerrors.bash ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/mkknownfolderids.bash ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/mksyscall.go ================================================ [File too large to display: 367 B] ================================================ FILE: vendor/golang.org/x/sys/windows/race.go ================================================ [File too large to display: 591 B] ================================================ FILE: vendor/golang.org/x/sys/windows/race0.go ================================================ [File too large to display: 454 B] ================================================ FILE: vendor/golang.org/x/sys/windows/registry/key.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/registry/mksyscall.go ================================================ [File too large to display: 297 B] ================================================ FILE: vendor/golang.org/x/sys/windows/registry/syscall.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/registry/value.go ================================================ [File too large to display: 11.5 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/security_windows.go ================================================ [File too large to display: 54.5 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/service.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/setupapi_windows.go ================================================ [File too large to display: 67.2 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/str.go ================================================ [File too large to display: 504 B] ================================================ FILE: vendor/golang.org/x/sys/windows/syscall.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/syscall_windows.go ================================================ [File too large to display: 84.7 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/types_windows.go ================================================ [File too large to display: 117.9 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/types_windows_386.go ================================================ [File too large to display: 875 B] ================================================ FILE: vendor/golang.org/x/sys/windows/types_windows_amd64.go ================================================ [File too large to display: 817 B] ================================================ FILE: vendor/golang.org/x/sys/windows/types_windows_arm.go ================================================ [File too large to display: 875 B] ================================================ FILE: vendor/golang.org/x/sys/windows/types_windows_arm64.go ================================================ [File too large to display: 817 B] ================================================ FILE: vendor/golang.org/x/sys/windows/zerrors_windows.go ================================================ [File too large to display: 923.3 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/zknownfolderids_windows.go ================================================ [File too large to display: 18.7 KB] ================================================ FILE: vendor/golang.org/x/sys/windows/zsyscall_windows.go ================================================ [File too large to display: 201.8 KB] ================================================ FILE: vendor/golang.org/x/text/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/text/PATENTS ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/text/encoding/encoding.go ================================================ [File too large to display: 9.5 KB] ================================================ FILE: vendor/golang.org/x/text/encoding/internal/identifier/identifier.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/golang.org/x/text/encoding/internal/identifier/mib.go ================================================ [File too large to display: 49.0 KB] ================================================ FILE: vendor/golang.org/x/text/encoding/internal/internal.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/golang.org/x/text/encoding/unicode/override.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/golang.org/x/text/encoding/unicode/unicode.go ================================================ [File too large to display: 14.7 KB] ================================================ FILE: vendor/golang.org/x/text/internal/utf8internal/utf8internal.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/golang.org/x/text/runes/cond.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/golang.org/x/text/runes/runes.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/golang.org/x/text/secure/bidirule/bidirule.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go ================================================ [File too large to display: 323 B] ================================================ FILE: vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go ================================================ [File too large to display: 358 B] ================================================ FILE: vendor/golang.org/x/text/transform/transform.go ================================================ [File too large to display: 21.7 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/bidi.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/bracket.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/core.go ================================================ [File too large to display: 29.4 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/prop.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go ================================================ [File too large to display: 110.9 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go ================================================ [File too large to display: 116.6 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go ================================================ [File too large to display: 118.9 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go ================================================ [File too large to display: 120.9 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go ================================================ [File too large to display: 127.4 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go ================================================ [File too large to display: 109.2 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/bidi/trieval.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/composition.go ================================================ [File too large to display: 14.1 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/forminfo.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/input.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/iter.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/normalize.go ================================================ [File too large to display: 14.9 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/readwriter.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/tables10.0.0.go ================================================ [File too large to display: 374.3 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/tables11.0.0.go ================================================ [File too large to display: 376.2 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/tables12.0.0.go ================================================ [File too large to display: 376.8 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/tables13.0.0.go ================================================ [File too large to display: 378.6 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/tables15.0.0.go ================================================ [File too large to display: 385.8 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/tables9.0.0.go ================================================ [File too large to display: 372.5 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/transform.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/golang.org/x/text/unicode/norm/trie.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/golang.org/x/time/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/golang.org/x/time/PATENTS ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/golang.org/x/time/rate/rate.go ================================================ [File too large to display: 12.3 KB] ================================================ FILE: vendor/golang.org/x/time/rate/sometimes.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/api/AUTHORS ================================================ [File too large to display: 347 B] ================================================ FILE: vendor/google.golang.org/api/CONTRIBUTORS ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/api/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/api/googleapi/googleapi.go ================================================ [File too large to display: 16.9 KB] ================================================ FILE: vendor/google.golang.org/api/googleapi/transport/apikey.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/api/googleapi/types.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/google.golang.org/api/iamcredentials/v1/iamcredentials-api.json ================================================ [File too large to display: 23.7 KB] ================================================ FILE: vendor/google.golang.org/api/iamcredentials/v1/iamcredentials-gen.go ================================================ [File too large to display: 54.4 KB] ================================================ FILE: vendor/google.golang.org/api/internal/cba.go ================================================ [File too large to display: 11.5 KB] ================================================ FILE: vendor/google.golang.org/api/internal/cert/default_cert.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/google.golang.org/api/internal/cert/enterprise_cert.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/google.golang.org/api/internal/cert/secureconnect_cert.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/google.golang.org/api/internal/conn_pool.go ================================================ [File too large to display: 766 B] ================================================ FILE: vendor/google.golang.org/api/internal/creds.go ================================================ [File too large to display: 9.7 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/buffer.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/doc.go ================================================ [File too large to display: 440 B] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/error.go ================================================ [File too large to display: 673 B] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/json.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/jsonfloat.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/media.go ================================================ [File too large to display: 9.8 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/params.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/resumable.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/retry.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/send.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/google.golang.org/api/internal/gensupport/version.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/google.golang.org/api/internal/impersonate/impersonate.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/google.golang.org/api/internal/s2a.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/google.golang.org/api/internal/settings.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/google.golang.org/api/internal/third_party/uritemplates/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/api/internal/third_party/uritemplates/METADATA ================================================ [File too large to display: 348 B] ================================================ FILE: vendor/google.golang.org/api/internal/third_party/uritemplates/uritemplates.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/google.golang.org/api/internal/third_party/uritemplates/utils.go ================================================ [File too large to display: 637 B] ================================================ FILE: vendor/google.golang.org/api/internal/version.go ================================================ [File too large to display: 257 B] ================================================ FILE: vendor/google.golang.org/api/iterator/iterator.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/google.golang.org/api/option/internaloption/internaloption.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/google.golang.org/api/option/option.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/google.golang.org/api/storage/v1/storage-api.json ================================================ [File too large to display: 263.2 KB] ================================================ FILE: vendor/google.golang.org/api/storage/v1/storage-gen.go ================================================ [File too large to display: 521.2 KB] ================================================ FILE: vendor/google.golang.org/api/transport/dial.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/google.golang.org/api/transport/doc.go ================================================ [File too large to display: 487 B] ================================================ FILE: vendor/google.golang.org/api/transport/grpc/dial.go ================================================ [File too large to display: 18.2 KB] ================================================ FILE: vendor/google.golang.org/api/transport/grpc/dial_socketopt.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/api/transport/grpc/pool.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/google.golang.org/api/transport/http/dial.go ================================================ [File too large to display: 9.8 KB] ================================================ FILE: vendor/google.golang.org/genproto/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go ================================================ [File too large to display: 87.3 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/annotations/field_info.pb.go ================================================ [File too large to display: 15.1 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go ================================================ [File too large to display: 27.8 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go ================================================ [File too large to display: 25.7 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/annotations/routing.pb.go ================================================ [File too large to display: 22.4 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/distribution/distribution.pb.go ================================================ [File too large to display: 35.0 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/checked.pb.go ================================================ [File too large to display: 63.7 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/eval.pb.go ================================================ [File too large to display: 19.9 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/explain.pb.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/syntax.pb.go ================================================ [File too large to display: 77.3 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/expr/v1alpha1/value.pb.go ================================================ [File too large to display: 24.3 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/label/label.pb.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/launch_stage.pb.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/metric/metric.pb.go ================================================ [File too large to display: 37.6 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/api/monitoredres/monitored_resource.pb.go ================================================ [File too large to display: 20.8 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/rpc/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/rpc/code/code.pb.go ================================================ [File too large to display: 13.2 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go ================================================ [File too large to display: 53.5 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/type/calendarperiod/calendar_period.pb.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/type/date/date.pb.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/type/expr/expr.pb.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/google.golang.org/genproto/googleapis/type/timeofday/timeofday.pb.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/AUTHORS ================================================ [File too large to display: 12 B] ================================================ FILE: vendor/google.golang.org/grpc/CODE-OF-CONDUCT.md ================================================ [File too large to display: 138 B] ================================================ FILE: vendor/google.golang.org/grpc/CONTRIBUTING.md ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/GOVERNANCE.md ================================================ [File too large to display: 141 B] ================================================ FILE: vendor/google.golang.org/grpc/LICENSE ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/MAINTAINERS.md ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/Makefile ================================================ [File too large to display: 953 B] ================================================ FILE: vendor/google.golang.org/grpc/NOTICE.txt ================================================ [File too large to display: 554 B] ================================================ FILE: vendor/google.golang.org/grpc/README.md ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/SECURITY.md ================================================ [File too large to display: 200 B] ================================================ FILE: vendor/google.golang.org/grpc/attributes/attributes.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/authz/audit/audit_logger.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/authz/audit/stdout/stdout_logger.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/backoff/backoff.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/backoff.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/balancer.go ================================================ [File too large to display: 15.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/base/balancer.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/base/base.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/conn_state_evaluator.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer.pb.go ================================================ [File too large to display: 34.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/grpclb/grpclb.go ================================================ [File too large to display: 17.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/grpclb/grpclb_config.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/grpclb/grpclb_picker.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/grpclb/grpclb_remote_balancer.go ================================================ [File too large to display: 13.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/grpclb/grpclb_util.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/grpclb/state/state.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/lazy/lazy.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/leastrequest/leastrequest.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go ================================================ [File too large to display: 32.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/balancer.go ================================================ [File too large to display: 25.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/cache.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/child_policy.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/config.go ================================================ [File too large to display: 11.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/control_channel.go ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/internal/adaptive/adaptive.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/internal/adaptive/lookback.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/internal/keys/builder.go ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/rls/picker.go ================================================ [File too large to display: 15.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/subconn.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedroundrobin/balancer.go ================================================ [File too large to display: 21.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedroundrobin/config.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedroundrobin/internal/internal.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedroundrobin/logging.go ================================================ [File too large to display: 965 B] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedroundrobin/scheduler.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedtarget/logging.go ================================================ [File too large to display: 974 B] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedtarget/weightedaggregator/aggregator.go ================================================ [File too large to display: 10.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedtarget/weightedtarget.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer/weightedtarget/weightedtarget_config.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/balancer_wrapper.go ================================================ [File too large to display: 17.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go ================================================ [File too large to display: 41.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/call.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/channelz/channelz.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/clientconn.go ================================================ [File too large to display: 60.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/codec.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/codes/code_string.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/codes/codes.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/connectivity/connectivity.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/alts.go ================================================ [File too large to display: 10.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/authinfo/authinfo.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/common.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcm.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/conn/counter.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go ================================================ [File too large to display: 9.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/conn/utils.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go ================================================ [File too large to display: 55.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/alts/utils.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/credentials.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/google/google.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/google/xds.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/insecure/insecure.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/oauth/oauth.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/tls/certprovider/distributor.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/tls/certprovider/pemfile/builder.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/tls/certprovider/pemfile/watcher.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/tls/certprovider/provider.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/tls/certprovider/store.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/credentials/tls.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/dialoptions.go ================================================ [File too large to display: 27.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/doc.go ================================================ [File too large to display: 794 B] ================================================ FILE: vendor/google.golang.org/grpc/encoding/encoding.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/encoding/encoding_v2.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/encoding/gzip/gzip.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/encoding/proto/proto.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/experimental/opentelemetry/trace_options.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/experimental/stats/metricregistry.go ================================================ [File too large to display: 9.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/experimental/stats/metrics.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/grpclog/component.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/grpclog/grpclog.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/grpclog/internal/grpclog.go ================================================ [File too large to display: 898 B] ================================================ FILE: vendor/google.golang.org/grpc/grpclog/internal/logger.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go ================================================ [File too large to display: 8.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/grpclog/logger.go ================================================ [File too large to display: 1002 B] ================================================ FILE: vendor/google.golang.org/grpc/grpclog/loggerv2.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go ================================================ [File too large to display: 16.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go ================================================ [File too large to display: 11.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/interceptor.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/admin/admin.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/backoff/backoff.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go ================================================ [File too large to display: 14.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/balancer/nop/nop.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/balancer/weight/weight.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/balancergroup/balancergroup.go ================================================ [File too large to display: 21.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/balancergroup/balancerstateaggregator.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/balancerload/load.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/binarylog/binarylog.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/binarylog/env_config.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/binarylog/method_logger.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/binarylog/sink.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/buffer/unbounded.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/cache/timeoutCache.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/channel.go ================================================ [File too large to display: 8.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/channelmap.go ================================================ [File too large to display: 10.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/funcs.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/logging.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/server.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/socket.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/subchannel.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/syscall_linux.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/channelz/trace.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/credentials/credentials.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/credentials/spiffe/spiffe.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/credentials/spiffe.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/credentials/syscallconn.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/credentials/util.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/credentials/xds/handshake_info.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/envconfig/envconfig.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/envconfig/observability.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/envconfig/xds.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/experimental.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/googlecloud/manufacturer.go ================================================ [File too large to display: 740 B] ================================================ FILE: vendor/google.golang.org/grpc/internal/googlecloud/manufacturer_linux.go ================================================ [File too large to display: 783 B] ================================================ FILE: vendor/google.golang.org/grpc/internal/googlecloud/manufacturer_windows.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpclog/prefix_logger.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcsync/event.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcutil/compressor.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcutil/grpcutil.go ================================================ [File too large to display: 699 B] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcutil/metadata.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcutil/method.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/grpcutil/regex.go ================================================ [File too large to display: 910 B] ================================================ FILE: vendor/google.golang.org/grpc/internal/hierarchy/hierarchy.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/idle/idle.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/internal.go ================================================ [File too large to display: 14.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/metadata/metadata.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/pretty/pretty.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/proto/grpc_lookup_v1/rls.pb.go ================================================ [File too large to display: 15.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/proto/grpc_lookup_v1/rls_config.pb.go ================================================ [File too large to display: 38.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/proto/grpc_lookup_v1/rls_grpc.pb.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/resolver/config_selector.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/resolver/unix/unix.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/serviceconfig/duration.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/serviceconfig/serviceconfig.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/stats/labels.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go ================================================ [File too large to display: 3.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/status/status.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/tcp_keepalive_others.go ================================================ [File too large to display: 820 B] ================================================ FILE: vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/client_stream.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/controlbuf.go ================================================ [File too large to display: 28.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/defaults.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/flowcontrol.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/handler_server.go ================================================ [File too large to display: 14.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/http2_client.go ================================================ [File too large to display: 58.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/http2_server.go ================================================ [File too large to display: 45.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/http_util.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/logging.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/networktype/networktype.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/proxy.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/server_stream.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/transport/transport.go ================================================ [File too large to display: 21.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/wrr/edf.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/wrr/random.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/wrr/wrr.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/bootstrap/bootstrap.go ================================================ [File too large to display: 27.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/bootstrap/logging.go ================================================ [File too large to display: 842 B] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/bootstrap/template.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/bootstrap/tlscreds/bundle.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/matcher/matcher_header.go ================================================ [File too large to display: 8.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/matcher/string_matcher.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/rbac/converter.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/rbac/matchers.go ================================================ [File too large to display: 15.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/rbac/rbac_engine.go ================================================ [File too large to display: 10.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/internal/xds/xds.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/keepalive/keepalive.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/mem/buffer_pool.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/mem/buffer_slice.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/mem/buffers.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/metadata/metadata.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/orca/call_metrics.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/orca/internal/internal.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/orca/orca.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/orca/producer.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/orca/server_metrics.go ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/orca/service.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/peer/peer.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/picker_wrapper.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/preloader.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/resolver/manual/manual.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/resolver/map.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/resolver/resolver.go ================================================ [File too large to display: 13.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/resolver/ringhash/attr.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/resolver_wrapper.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/rpc_util.go ================================================ [File too large to display: 32.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/server.go ================================================ [File too large to display: 69.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/service_config.go ================================================ [File too large to display: 10.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/handlers.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/metrics.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/client_metrics.go ================================================ [File too large to display: 11.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/client_tracing.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/grpc_trace_bin_propagator.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/internal/pluginoption.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/internal/tracing/carrier.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/opentelemetry.go ================================================ [File too large to display: 17.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/server_metrics.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/server_tracing.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/opentelemetry/trace.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/stats/stats.go ================================================ [File too large to display: 10.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/status/status.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/stream.go ================================================ [File too large to display: 56.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/stream_interfaces.go ================================================ [File too large to display: 10.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/tap/tap.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/trace.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/trace_notrace.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/trace_withtrace.go ================================================ [File too large to display: 979 B] ================================================ FILE: vendor/google.golang.org/grpc/version.go ================================================ [File too large to display: 683 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/bootstrap/bootstrap.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/bootstrap/credentials.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/csds/csds.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/googledirectpath/googlec2p.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/googledirectpath/utils.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/balancer.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/cdsbalancer/cdsbalancer.go ================================================ [File too large to display: 26.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/cdsbalancer/cluster_watcher.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/cdsbalancer/logging.go ================================================ [File too large to display: 948 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterimpl/clusterimpl.go ================================================ [File too large to display: 16.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterimpl/config.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterimpl/logging.go ================================================ [File too large to display: 969 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterimpl/picker.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clustermanager/balancerstateaggregator.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clustermanager/clustermanager.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clustermanager/config.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clustermanager/picker.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/clusterresolver.go ================================================ [File too large to display: 14.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/config.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/configbuilder.go ================================================ [File too large to display: 12.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/configbuilder_childname.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/logging.go ================================================ [File too large to display: 981 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/resource_resolver.go ================================================ [File too large to display: 10.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/resource_resolver_dns.go ================================================ [File too large to display: 5.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/resource_resolver_eds.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/loadstore/load_store_wrapper.go ================================================ [File too large to display: 3.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/balancer.go ================================================ [File too large to display: 31.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/callcounter.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/config.go ================================================ [File too large to display: 10.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/logging.go ================================================ [File too large to display: 980 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/subconn_wrapper.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/priority/balancer.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/priority/balancer_child.go ================================================ [File too large to display: 5.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/priority/balancer_priority.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/priority/config.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/priority/ignore_resolve_now.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/priority/logging.go ================================================ [File too large to display: 955 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/priority/utils.go ================================================ [File too large to display: 785 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/config.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/logging.go ================================================ [File too large to display: 956 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/picker.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/ring.go ================================================ [File too large to display: 6.6 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/ringhash.go ================================================ [File too large to display: 13.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/util.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/wrrlocality/balancer.go ================================================ [File too large to display: 6.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/balancer/wrrlocality/logging.go ================================================ [File too large to display: 964 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/clusterspecifier/cluster_specifier.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/clusterspecifier/rls/rls.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/httpfilter/fault/fault.go ================================================ [File too large to display: 8.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/httpfilter/httpfilter.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/httpfilter/rbac/rbac.go ================================================ [File too large to display: 7.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/httpfilter/router/router.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/internal.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/resolver/internal/internal.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/resolver/logging.go ================================================ [File too large to display: 951 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/resolver/serviceconfig.go ================================================ [File too large to display: 12.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/resolver/watch_service.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/resolver/xds_resolver.go ================================================ [File too large to display: 22.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/server/conn_wrapper.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/server/listener_wrapper.go ================================================ [File too large to display: 17.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/server/rds_handler.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/attributes.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/authority.go ================================================ [File too large to display: 34.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/channel.go ================================================ [File too large to display: 13.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/client.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/clientimpl.go ================================================ [File too large to display: 18.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/clientimpl_loadreport.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/clientimpl_watchers.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/internal/internal.go ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/load/reporter.go ================================================ [File too large to display: 889 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/load/store.go ================================================ [File too large to display: 11.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/logging.go ================================================ [File too large to display: 995 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/pool.go ================================================ [File too large to display: 9.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/requests_counter.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/transport/ads/ads_stream.go ================================================ [File too large to display: 29.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/transport/grpctransport/grpctransport.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/transport/lrs/lrs_stream.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/transport/transport_interface.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdslbregistry/converter/converter.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdslbregistry/xdslbregistry.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/cluster_resource_type.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/endpoints_resource_type.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/errors.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/filter_chain.go ================================================ [File too large to display: 35.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/listener_resource_type.go ================================================ [File too large to display: 5.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/logging.go ================================================ [File too large to display: 843 B] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/matcher.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/matcher_path.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/name.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/resource_type.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/route_config_resource_type.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type_cds.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type_eds.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type_lds.go ================================================ [File too large to display: 2.7 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type_rds.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/unmarshal_cds.go ================================================ [File too large to display: 31.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/unmarshal_eds.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/unmarshal_lds.go ================================================ [File too large to display: 9.3 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/unmarshal_rds.go ================================================ [File too large to display: 15.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/version/version.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/server.go ================================================ [File too large to display: 11.2 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/server_options.go ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/google.golang.org/grpc/xds/xds.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/LICENSE ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/PATENTS ================================================ [File too large to display: 1.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/protojson/decode.go ================================================ [File too large to display: 17.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/protojson/doc.go ================================================ [File too large to display: 502 B] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/protojson/encode.go ================================================ [File too large to display: 12.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go ================================================ [File too large to display: 25.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/prototext/decode.go ================================================ [File too large to display: 20.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/prototext/doc.go ================================================ [File too large to display: 276 B] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/prototext/encode.go ================================================ [File too large to display: 11.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/encoding/protowire/wire.go ================================================ [File too large to display: 13.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/descfmt/stringer.go ================================================ [File too large to display: 12.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/descopts/options.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/detrand/rand.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/editiondefaults/defaults.go ================================================ [File too large to display: 349 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/editionssupport/editions.go ================================================ [File too large to display: 661 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/defval/default.go ================================================ [File too large to display: 6.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/json/decode.go ================================================ [File too large to display: 8.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go ================================================ [File too large to display: 2.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/json/encode.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go ================================================ [File too large to display: 7.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/text/decode.go ================================================ [File too large to display: 16.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go ================================================ [File too large to display: 4.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/text/doc.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/encoding/text/encode.go ================================================ [File too large to display: 7.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/errors/errors.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filedesc/build.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filedesc/desc.go ================================================ [File too large to display: 27.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go ================================================ [File too large to display: 15.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go ================================================ [File too large to display: 21.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go ================================================ [File too large to display: 14.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go ================================================ [File too large to display: 8.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filedesc/editions.go ================================================ [File too large to display: 5.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go ================================================ [File too large to display: 7.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/filetype/build.go ================================================ [File too large to display: 10.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/flags/flags.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go ================================================ [File too large to display: 249 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go ================================================ [File too large to display: 246 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/any_gen.go ================================================ [File too large to display: 1020 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/api_gen.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go ================================================ [File too large to display: 71.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/doc.go ================================================ [File too large to display: 406 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/duration_gen.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/empty_gen.go ================================================ [File too large to display: 549 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go ================================================ [File too large to display: 901 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go ================================================ [File too large to display: 2.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/goname.go ================================================ [File too large to display: 584 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/map_entry.go ================================================ [File too large to display: 537 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/name.go ================================================ [File too large to display: 319 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go ================================================ [File too large to display: 970 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/struct_gen.go ================================================ [File too large to display: 4.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/type_gen.go ================================================ [File too large to display: 9.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/wrappers.go ================================================ [File too large to display: 438 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go ================================================ [File too large to display: 5.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/api_export.go ================================================ [File too large to display: 4.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/api_export_opaque.go ================================================ [File too large to display: 4.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/bitmap.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/bitmap_race.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/checkinit.go ================================================ [File too large to display: 4.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_extension.go ================================================ [File too large to display: 6.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_field.go ================================================ [File too large to display: 23.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_field_opaque.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_gen.go ================================================ [File too large to display: 162.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_map.go ================================================ [File too large to display: 10.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_message.go ================================================ [File too large to display: 7.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.go ================================================ [File too large to display: 4.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_tables.go ================================================ [File too large to display: 16.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go ================================================ [File too large to display: 455 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/convert.go ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/convert_list.go ================================================ [File too large to display: 3.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/convert_map.go ================================================ [File too large to display: 3.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/decode.go ================================================ [File too large to display: 9.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/encode.go ================================================ [File too large to display: 8.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/enum.go ================================================ [File too large to display: 594 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/equal.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/extension.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/lazy.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go ================================================ [File too large to display: 6.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/legacy_export.go ================================================ [File too large to display: 3.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/legacy_file.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/legacy_message.go ================================================ [File too large to display: 18.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/merge.go ================================================ [File too large to display: 5.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/merge_gen.go ================================================ [File too large to display: 4.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/message.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/message_opaque.go ================================================ [File too large to display: 18.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/message_opaque_gen.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/message_reflect.go ================================================ [File too large to display: 13.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go ================================================ [File too large to display: 11.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/message_reflect_field_gen.go ================================================ [File too large to display: 6.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go ================================================ [File too large to display: 7.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go ================================================ [File too large to display: 7.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe_opaque.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/presence.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/impl/validate.go ================================================ [File too large to display: 14.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/order/order.go ================================================ [File too large to display: 2.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/order/range.go ================================================ [File too large to display: 2.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/pragma/pragma.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/protolazy/bufferreader.go ================================================ [File too large to display: 6.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/protolazy/lazy.go ================================================ [File too large to display: 9.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/protolazy/pointer_unsafe.go ================================================ [File too large to display: 494 B] ================================================ FILE: vendor/google.golang.org/protobuf/internal/set/ints.go ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/strs/strings.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/internal/version/version.go ================================================ [File too large to display: 2.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/checkinit.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/decode.go ================================================ [File too large to display: 8.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/decode_gen.go ================================================ [File too large to display: 14.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/doc.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/encode.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/encode_gen.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/equal.go ================================================ [File too large to display: 2.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/extension.go ================================================ [File too large to display: 6.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/merge.go ================================================ [File too large to display: 4.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/messageset.go ================================================ [File too large to display: 3.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/proto.go ================================================ [File too large to display: 1.4 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/proto_methods.go ================================================ [File too large to display: 523 B] ================================================ FILE: vendor/google.golang.org/protobuf/proto/proto_reflect.go ================================================ [File too large to display: 509 B] ================================================ FILE: vendor/google.golang.org/protobuf/proto/reset.go ================================================ [File too large to display: 1018 B] ================================================ FILE: vendor/google.golang.org/protobuf/proto/size.go ================================================ [File too large to display: 3.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/size_gen.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/wrapperopaque.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/proto/wrappers.go ================================================ [File too large to display: 1.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/protoadapt/convert.go ================================================ [File too large to display: 1.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protodesc/desc.go ================================================ [File too large to display: 10.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go ================================================ [File too large to display: 15.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protodesc/editions.go ================================================ [File too large to display: 6.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protodesc/proto.go ================================================ [File too large to display: 10.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go ================================================ [File too large to display: 16.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/source.go ================================================ [File too large to display: 3.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go ================================================ [File too large to display: 15.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/type.go ================================================ [File too large to display: 25.8 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/value.go ================================================ [File too large to display: 11.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go ================================================ [File too large to display: 4.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go ================================================ [File too large to display: 12.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go ================================================ [File too large to display: 24.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go ================================================ [File too large to display: 321 B] ================================================ FILE: vendor/google.golang.org/protobuf/runtime/protoiface/methods.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go ================================================ [File too large to display: 1.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/runtime/protoimpl/version.go ================================================ [File too large to display: 2.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go ================================================ [File too large to display: 184.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go ================================================ [File too large to display: 11.1 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go ================================================ [File too large to display: 15.9 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go ================================================ [File too large to display: 12.2 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go ================================================ [File too large to display: 5.3 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go ================================================ [File too large to display: 17.6 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go ================================================ [File too large to display: 23.7 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go ================================================ [File too large to display: 13.0 KB] ================================================ FILE: vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go ================================================ [File too large to display: 19.2 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/.editorconfig ================================================ [File too large to display: 183 B] ================================================ FILE: vendor/gopkg.in/ini.v1/.gitignore ================================================ [File too large to display: 115 B] ================================================ FILE: vendor/gopkg.in/ini.v1/.golangci.yml ================================================ [File too large to display: 468 B] ================================================ FILE: vendor/gopkg.in/ini.v1/LICENSE ================================================ [File too large to display: 10.0 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/Makefile ================================================ [File too large to display: 239 B] ================================================ FILE: vendor/gopkg.in/ini.v1/README.md ================================================ [File too large to display: 1.7 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/codecov.yml ================================================ [File too large to display: 245 B] ================================================ FILE: vendor/gopkg.in/ini.v1/data_source.go ================================================ [File too large to display: 1.9 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/deprecated.go ================================================ [File too large to display: 791 B] ================================================ FILE: vendor/gopkg.in/ini.v1/error.go ================================================ [File too large to display: 1.5 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/file.go ================================================ [File too large to display: 13.6 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/helper.go ================================================ [File too large to display: 719 B] ================================================ FILE: vendor/gopkg.in/ini.v1/ini.go ================================================ [File too large to display: 7.9 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/key.go ================================================ [File too large to display: 23.8 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/parser.go ================================================ [File too large to display: 12.8 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/section.go ================================================ [File too large to display: 5.9 KB] ================================================ FILE: vendor/gopkg.in/ini.v1/struct.go ================================================ [File too large to display: 20.7 KB] ================================================ FILE: vendor/gopkg.in/warnings.v0/LICENSE ================================================ [File too large to display: 1.2 KB] ================================================ FILE: vendor/gopkg.in/warnings.v0/README ================================================ [File too large to display: 2.5 KB] ================================================ FILE: vendor/gopkg.in/warnings.v0/warnings.go ================================================ [File too large to display: 5.4 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/LICENSE ================================================ [File too large to display: 2.1 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/NOTICE ================================================ [File too large to display: 560 B] ================================================ FILE: vendor/gopkg.in/yaml.v3/README.md ================================================ [File too large to display: 3.4 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/apic.go ================================================ [File too large to display: 21.5 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/decode.go ================================================ [File too large to display: 24.4 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/emitterc.go ================================================ [File too large to display: 53.9 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/encode.go ================================================ [File too large to display: 14.4 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/parserc.go ================================================ [File too large to display: 39.9 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/readerc.go ================================================ [File too large to display: 13.8 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/resolve.go ================================================ [File too large to display: 8.3 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/scannerc.go ================================================ [File too large to display: 85.9 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/sorter.go ================================================ [File too large to display: 3.3 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/writerc.go ================================================ [File too large to display: 1.8 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/yaml.go ================================================ [File too large to display: 19.6 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/yamlh.go ================================================ [File too large to display: 28.4 KB] ================================================ FILE: vendor/gopkg.in/yaml.v3/yamlprivateh.go ================================================ [File too large to display: 6.0 KB] ================================================ FILE: vendor/modules.txt ================================================ [File too large to display: 63.1 KB]